void MyMoneyBudgetTest::addMonthlyToMonthByMonth() { MyMoneyBudget::AccountGroup a0, a1; a0.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthByMonth); a1.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthly); MyMoneyBudget::PeriodGroup period; period.setStartDate(QDate(2010, 1, 1)); period.setAmount(MyMoneyMoney(100, 1)); a1.addPeriod(QDate(2010, 1, 1), period); QDate date(2010, 1, 1); for (int i = 0; i < 12; ++i) { period.setAmount(MyMoneyMoney((i + 1) * 100, 1)); a0.addPeriod(date, period); date = date.addMonths(1); period.setStartDate(date); } QVERIFY(a0.getPeriods().count() == 12); QVERIFY(a0.totalBalance() == MyMoneyMoney(7800, 1)); QVERIFY(a1.totalBalance() == MyMoneyMoney(1200, 1)); a0 += a1; QVERIFY(a0.budgetLevel() == MyMoneyBudget::AccountGroup::eMonthByMonth); QVERIFY(a1.budgetLevel() == MyMoneyBudget::AccountGroup::eMonthly); QVERIFY(a0.getPeriods().count() == 12); QVERIFY(a1.getPeriods().count() == 1); QVERIFY(a0.totalBalance() == MyMoneyMoney(9000, 1)); QVERIFY(a1.totalBalance() == MyMoneyMoney(1200, 1)); }
void MyMoneyBudgetTest::addMonthlyToMonthly() { MyMoneyBudget::AccountGroup a0, a1; a0.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthly); a1.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthly); MyMoneyBudget::PeriodGroup period; period.setStartDate(QDate(2010, 1, 1)); period.setAmount(MyMoneyMoney(100, 1)); a0.addPeriod(QDate(2010, 1, 1), period); a1.addPeriod(QDate(2010, 1, 1), period); a0 += a1; QVERIFY(a0.budgetLevel() == MyMoneyBudget::AccountGroup::eMonthly); QVERIFY(a1.budgetLevel() == MyMoneyBudget::AccountGroup::eMonthly); QVERIFY(a0.getPeriods().count() == 1); QVERIFY(a1.getPeriods().count() == 1); QVERIFY(a0.balance() == MyMoneyMoney(200, 1)); QVERIFY(a1.balance() == MyMoneyMoney(100, 1)); }
void MyMoneyForecast::createBudget ( MyMoneyBudget& budget, QDate historyStart, QDate historyEnd, QDate budgetStart, QDate budgetEnd, const bool returnBudget ) { // clear all data except the id and name QString name = budget.name(); budget = MyMoneyBudget(budget.id(), MyMoneyBudget()); budget.setName(name); //check parameters if ( historyStart > historyEnd || budgetStart > budgetEnd || budgetStart <= historyEnd ) { throw new MYMONEYEXCEPTION ( "Illegal parameters when trying to create budget" ); } //get forecast method int fMethod = forecastMethod(); //set start date to 1st of month and end dates to last day of month, since we deal with full months in budget historyStart = QDate ( historyStart.year(), historyStart.month(), 1 ); historyEnd = QDate ( historyEnd.year(), historyEnd.month(), historyEnd.daysInMonth() ); budgetStart = QDate ( budgetStart.year(), budgetStart.month(), 1 ); budgetEnd = QDate ( budgetEnd.year(), budgetEnd.month(), budgetEnd.daysInMonth() ); //set forecast parameters setHistoryStartDate ( historyStart ); setHistoryEndDate ( historyEnd ); setForecastStartDate ( budgetStart ); setForecastEndDate ( budgetEnd ); setForecastDays ( budgetStart.daysTo ( budgetEnd ) + 1 ); if ( budgetStart.daysTo ( budgetEnd ) > historyStart.daysTo ( historyEnd ) ) { //if history period is shorter than budget, use that one as the trend length setAccountsCycle ( historyStart.daysTo ( historyEnd ) ); //we set the accountsCycle to the base timeframe we will use to calculate the average (eg. 180 days, 365, etc) } else { //if one timeframe is larger than the other, but not enough to be 1 time larger, we take the lowest value setAccountsCycle ( budgetStart.daysTo ( budgetEnd ) ); } setForecastCycles ( ( historyStart.daysTo ( historyEnd ) / accountsCycle() ) ); if ( forecastCycles() == 0 ) //the cycles must be at least 1 setForecastCycles ( 1 ); //do not skip opening date setSkipOpeningDate ( false ); //clear and set accounts list we are going to use. Categories, in this case m_nameIdx.clear(); setBudgetAccountList(); //calculate budget according to forecast method switch(fMethod) { case eScheduled: doFutureScheduledForecast(); calculateScheduledMonthlyBalances(); break; case eHistoric: pastTransactions(); //get all transactions for history period calculateAccountTrendList(); calculateHistoricMonthlyBalances(); //add all balances of each month and put at the 1st day of each month break; default: break; } //flag the forecast as done m_forecastDone = true; //only fill the budget if it is going to be used if ( returnBudget ) { //setup the budget itself MyMoneyFile* file = MyMoneyFile::instance(); budget.setBudgetStart ( budgetStart ); //go through all the accounts and add them to budget QMap<QString, QString>::ConstIterator it_nc; for ( it_nc = m_nameIdx.begin(); it_nc != m_nameIdx.end(); ++it_nc ) { MyMoneyAccount acc = file->account ( *it_nc ); MyMoneyBudget::AccountGroup budgetAcc; budgetAcc.setId ( acc.id() ); budgetAcc.setBudgetLevel ( MyMoneyBudget::AccountGroup::eMonthByMonth ); for ( QDate f_date = forecastStartDate(); f_date <= forecastEndDate(); ) { MyMoneyBudget::PeriodGroup period; //add period to budget account period.setStartDate ( f_date ); period.setAmount ( forecastBalance ( acc, f_date ) ); budgetAcc.addPeriod ( f_date, period ); //next month f_date = f_date.addMonths ( 1 ); } //add budget account to budget budget.setAccount ( budgetAcc, acc.id() ); } } }