mirror of
				https://github.com/aclindsa/moneygo.git
				synced 2025-11-04 02:23:26 -05:00 
			
		
		
		
	Add more sample reports
Also switch tabs to spaces in existing sample reports
This commit is contained in:
		
							
								
								
									
										42
									
								
								reports/asset_allocation.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								reports/asset_allocation.lua
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										60
									
								
								reports/monthly_net_worth.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								reports/monthly_net_worth.lua
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										61
									
								
								reports/monthly_net_worth_change.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								reports/monthly_net_worth_change.lua
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										60
									
								
								reports/quarterly_net_worth.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								reports/quarterly_net_worth.lua
									
									
									
									
									
										Normal 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
 | 
				
			||||||
		Reference in New Issue
	
	Block a user