Add more sample reports

Also switch tabs to spaces in existing sample reports
This commit is contained in:
Aaron Lindsay 2017-07-13 21:38:30 -04:00
parent f213e1061c
commit 8f884f7a69
7 changed files with 314 additions and 91 deletions

View File

@ -0,0 +1,42 @@
function generate()
accounts = get_accounts()
securities = get_securities()
default_currency = get_default_currency()
series_map = {}
totals_map = {}
t = tabulation.new(1)
t:title("Current Asset Allocation")
t:label(1, "Assets")
for id, security in pairs(securities) do
totals_map[id] = 0
series_map[id] = t:series(tostring(security))
end
for id, acct in pairs(accounts) do
if acct.type == account.Asset or acct.type == account.Investment or acct.type == account.Bank or acct.type == account.Cash then
balance = acct:balance()
multiplier = 1
if acct.security ~= default_currency and balance.amount ~= 0 then
price = acct.security:closestprice(default_currency, date.now())
if price == nil then
--[[
-- This should contain code to warn the user that their report is missing some information
--]]
multiplier = 0
else
multiplier = price.value
end
end
totals_map[acct.security.SecurityId] = balance.amount * multiplier + totals_map[acct.security.SecurityId]
end
end
for id, series in pairs(series_map) do
series:value(1, totals_map[id])
end
return t
end

View File

@ -1,26 +1,26 @@
function generate()
year = date.now().year
year = date.now().year
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Cash Flow")
series = t:series("Income minus expenses")
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Cash Flow")
series = t:series("Income minus expenses")
for month=1,12 do
begin_date = date.new(year, month, 1)
end_date = date.new(year, month+1, 1)
for month=1,12 do
begin_date = date.new(year, month, 1)
end_date = date.new(year, month+1, 1)
t:label(month, tostring(begin_date))
cash_flow = 0
t:label(month, tostring(begin_date))
cash_flow = 0
for id, acct in pairs(accounts) do
if acct.type == account.Expense or acct.type == account.Income then
balance = acct:balance(begin_date, end_date)
cash_flow = cash_flow - balance.amount
end
end
series:value(month, cash_flow)
end
for id, acct in pairs(accounts) do
if acct.type == account.Expense or acct.type == account.Income then
balance = acct:balance(begin_date, end_date)
cash_flow = cash_flow - balance.amount
end
end
series:value(month, cash_flow)
end
return t
return t
end

View File

@ -1,49 +1,49 @@
function account_series_map(accounts, tabulation)
map = {}
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] = tabulation: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
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] = tabulation: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")
error("Accounts nested (at least) 100 levels deep")
end
function generate()
year = date.now().year
account_type = account.Expense
year = date.now().year
account_type = account.Expense
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Expenses")
series_map = account_series_map(accounts, t)
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Expenses")
series_map = account_series_map(accounts, t)
for month=1,12 do
begin_date = date.new(year, month, 1)
end_date = date.new(year, month+1, 1)
for month=1,12 do
begin_date = date.new(year, month, 1)
end_date = date.new(year, month+1, 1)
t:label(month, tostring(begin_date))
t:label(month, tostring(begin_date))
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(month, balance.amount)
end
end
end
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(month, balance.amount)
end
end
end
return t
return t
end

View File

@ -0,0 +1,60 @@
function account_series_map(accounts, tabulation)
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] = tabulation: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
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Net Worth")
series_map = account_series_map(accounts, t)
default_currency = get_default_currency()
for month=1,12 do
end_date = date.new(year, month+1, 1)
t:label(month, tostring(end_date))
for id, acct in pairs(accounts) do
series = series_map[id]
if acct.type ~= account.Expense and acct.type ~= account.Income and acct.type ~= account.Trading then
balance = acct:balance(end_date)
multiplier = 1
if acct.security ~= default_currency and balance.amount ~= 0 then
price = acct.security:closestprice(default_currency, end_date)
if price == nil then
--[[
-- This should contain code to warn the user that their report is missing some information
--]]
multiplier = 0
else
multiplier = price.value
end
end
series:value(month, balance.amount * multiplier)
end
end
end
return t
end

View File

@ -0,0 +1,61 @@
function account_series_map(accounts, tabulation)
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] = tabulation: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
accounts = get_accounts()
t = tabulation.new(12)
t:title(year .. " Monthly Net Worth")
series_map = account_series_map(accounts, t)
default_currency = get_default_currency()
for month=1,12 do
begin_date = date.new(year, month, 1)
end_date = date.new(year, month+1, 1)
t:label(month, tostring(begin_date))
for id, acct in pairs(accounts) do
series = series_map[id]
if acct.type ~= account.Expense and acct.type ~= account.Income and acct.type ~= account.Trading then
balance = acct:balance(begin_date, end_date)
multiplier = 1
if acct.security ~= default_currency then
price = acct.security:closestprice(default_currency, end_date)
if price == nil then
--[[
-- This should contain code to warn the user that their report is missing some information
--]]
multiplier = 0
else
multiplier = price.value
end
end
series:value(month, balance.amount * multiplier)
end
end
end
return t
end

View File

@ -0,0 +1,60 @@
function account_series_map(accounts, tabulation)
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] = tabulation: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-4
accounts = get_accounts()
t = tabulation.new(20)
t:title(year .. "-" .. date.now().year .. " Quarterly Net Worth")
series_map = account_series_map(accounts, t:series("Net Worth"))
default_currency = get_default_currency()
for month=1,20 do
end_date = date.new(year, month*3-2, 1)
t:label(month, tostring(end_date))
for id, acct in pairs(accounts) do
series = series_map[id]
if acct.type ~= account.Expense and acct.type ~= account.Income and acct.type ~= account.Trading then
balance = acct:balance(end_date)
multiplier = 1
if acct.security ~= default_currency then
price = acct.security:closestprice(default_currency, end_date)
if price == nil then
--[[
-- This should contain code to warn the user that their report is missing some information
--]]
multiplier = 0
else
multiplier = price.value
end
end
series:value(month, balance.amount * multiplier)
end
end
end
return t
end

View File

@ -1,47 +1,47 @@
function account_series_map(accounts, tabulation)
map = {}
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] = tabulation: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
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] = tabulation: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")
error("Accounts nested (at least) 100 levels deep")
end
function generate()
year = date.now().year
account_type = account.Income
year = date.now().year
account_type = account.Income
accounts = get_accounts()
t = tabulation.new(1)
t:title(year .. " Income")
series_map = account_series_map(accounts, t)
accounts = get_accounts()
t = tabulation.new(1)
t:title(year .. " Income")
series_map = account_series_map(accounts, t)
begin_date = date.new(year, 1, 1)
end_date = date.new(year+1, 1, 1)
begin_date = date.new(year, 1, 1)
end_date = date.new(year+1, 1, 1)
t:label(1, year .. " Income")
t: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
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 t
return t
end