add outflows from investment to cash flow statement report

This commit is contained in:
Roger Oriol
2023-12-27 12:10:09 +01:00
parent c1e103010d
commit fe8e87ad0e
2 changed files with 32 additions and 11 deletions

View File

@@ -5,7 +5,7 @@ from beancount.parser import printer
import argparse
from tabulate import tabulate
from decimal import Decimal
from beancount.core.amount import Amount, sub, mul
from beancount.core.amount import Amount, add, sub, mul
from datetime import date
from dateutil.relativedelta import relativedelta
@@ -55,17 +55,26 @@ def get_total_inflows(income):
else:
return Amount(Decimal(0), "EUR")
def get_total_outflows(expenses):
def get_total_outflows(expenses, total_investments):
sum = 0
for account, balance in expenses.items():
sum = balance if sum == 0 else sum + balance
if sum != 0 and sum.get_only_position() != None:
result = sum.get_only_position().units
return Amount(Decimal(round(result.number, 2)), result.currency)
return add(Amount(Decimal(round(result.number, 2)), result.currency), total_investments)
else:
return total_investments
def get_total_investments(investments):
sum = 0
for inv in investments:
sum = inv.cost_position if sum == 0 else sum + inv.cost_position
if sum != 0 and sum != None:
return Amount(Decimal(round(sum.number, 2)), sum.currency)
else:
return Amount(Decimal(0), "EUR")
def print_report(start_date, period, income, expenses):
def print_report(start_date, period, income, expenses, investments):
print(f"{bcolors.BOLD}Cash Flow Statement (period={period}, start_date={start_date}){bcolors.ENDC}")
draw_line()
print(f"{bcolors.BOLD}Inflows{bcolors.ENDC}")
@@ -95,11 +104,16 @@ def print_report(start_date, period, income, expenses):
draw_line()
print(f"{bcolors.BOLD}Outflows{bcolors.ENDC}")
print_expenses_table(expenses)
print(f"{bcolors.BOLD}Outflows from Investment{bcolors.ENDC}")
total_investments = get_total_investments(investments)
print(tabulate([
["Total Outflows", f"{bcolors.BOLD}{get_total_outflows(expenses).to_string()}{bcolors.ENDC}"]
["Compra de fons i accions", total_investments.to_string()]
]))
print(tabulate([
["Total Outflows", f"{bcolors.BOLD}{get_total_outflows(expenses, total_investments).to_string()}{bcolors.ENDC}"]
]))
draw_line()
net_cash_flow = sub(get_total_inflows(income), get_total_outflows(expenses))
net_cash_flow = sub(get_total_inflows(income), get_total_outflows(expenses, total_investments))
print(tabulate([
["NET CASH FLOW", f"{bcolors.BOLD}{bcolors.OKGREEN if net_cash_flow.number >= 0 else bcolors.FAIL}{net_cash_flow.to_string()}{bcolors.ENDC}"]
]))
@@ -126,6 +140,14 @@ def get_expenses(entries, options, period, start_date):
expenses[row.account] = row.sum_position
return expenses
def get_investments(entries, options, period, start_date):
period_delta = relativedelta(months=1) if period == "monthly" else relativedelta(years=1)
end_date = date.fromisoformat(start_date) + period_delta
expenses_query = f"SELECT account, cost(position), currency, date WHERE account ~ \"Assets:Invest:R4:\" AND NOT currency ~ '^(EUR|USD)' AND date >= {start_date} AND date < {end_date.isoformat()}"
rtypes, rrows = query.run_query(
entries, options, expenses_query)
return rrows
def main():
parser = argparse.ArgumentParser(description='Generate cash flow report')
parser.add_argument('start_date', metavar='start_date', type=str, nargs=1,
@@ -145,6 +167,7 @@ def main():
income = get_income(entries, options, period, start_date)
expenses = get_expenses(entries, options, period, start_date)
print_report(start_date, period, income, expenses)
investments = get_investments(entries, options, period, start_date)
print_report(start_date, period, income, expenses, investments)
main()