diff --git a/reports/monthly_expenses.lua b/reports/monthly_expenses.lua index dfd24f1..50b1968 100644 --- a/reports/monthly_expenses.lua +++ b/reports/monthly_expenses.lua @@ -18,7 +18,7 @@ function account_series_map(accounts, report) end end - error("Accounts nested more than 100 levels deep") + error("Accounts nested (at least) 100 levels deep") end function generate() @@ -31,7 +31,6 @@ function generate() series_map = account_series_map(accounts, r) for month=1,12 do - balance = nil begin_date = date.new(year, month, 1) end_date = date.new(year, month+1, 1) diff --git a/reports/years_income.lua b/reports/years_income.lua new file mode 100644 index 0000000..cd60373 --- /dev/null +++ b/reports/years_income.lua @@ -0,0 +1,47 @@ +function account_series_map(accounts, report) + map = {} + + for i=1,100 do -- we're not messing with accounts more than 100 levels deep + all_handled = true + for id, acct in pairs(accounts) do + if not map[id] then + all_handled = false + if not acct.parent then + map[id] = report:series(acct.name) + elseif map[acct.parent.accountid] then + map[id] = map[acct.parent.accountid]:series(acct.name) + end + end + end + if all_handled then + return map + end + end + + error("Accounts nested (at least) 100 levels deep") +end + +function generate() + year = date.now().year + account_type = account.Income + + accounts = get_accounts() + r = report.new(1) + r:title(year .. " Income") + series_map = account_series_map(accounts, r) + + begin_date = date.new(year, 1, 1) + end_date = date.new(year+1, 1, 1) + + r:label(1, year .. " Income") + + for id, acct in pairs(accounts) do + series = series_map[id] + if acct.type == account_type then + balance = acct:balance(begin_date, end_date) + series:value(1, balance.amount) + end + end + + return r +end