Files
contabilitat/commands/portfolio

73 lines
2.4 KiB
Plaintext
Raw Normal View History

2024-04-27 11:14:15 +02:00
#!/usr/bin/env python3
from beancount import loader
from beancount.query import query
from beancount.parser import printer
import argparse
from tabulate import tabulate
from decimal import Decimal
from beancount.core.amount import Amount, sub, mul, add
from math import floor
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def draw_line():
print('─' * 30)
def print_report(date, positions):
print(f"{bcolors.BOLD}Portfolio (date={date}){bcolors.ENDC}")
draw_line()
print(f"{bcolors.BOLD}Positions{bcolors.ENDC}")
print(tabulate(map(lambda p: [
p.account,
p.volume.average().get_only_position().units.number.__round__(2),
f"{p.volume.average().get_only_position().cost.number.__round__(2)} {p.volume.average().get_only_position().cost.currency}",
f"{p.position.get_only_position().units.number.__round__(2)} {p.position.get_only_position().units.currency}"], positions)
, headers=["Actiu", "Quantitat", "Últim preu", "Valor"]))
total = Amount(Decimal(0), 'EUR')
for p in positions:
total = add(total, p.position.get_only_position().units)
print(tabulate([
["Total", "", "", f"{total.number.__round__(2)} {total.currency}"]
]))
print(f"{bcolors.BOLD}Plusvalias / Minusvalias{bcolors.ENDC}")
print(f"{bcolors.BOLD}Distribució geografica / sectors{bcolors.ENDC}")
print(f"{bcolors.BOLD}Indicadors{bcolors.ENDC}")
print(tabulate([
["Alfa", 1],
["Beta", 1]
]))
def get_positions(entries, options, date):
balance_query = f"SELECT account, sum(position) as volume, convert(sum(position), \"EUR\") as position FROM date <= {date} WHERE account ~ '^Assets:Invest' GROUP BY account"
rtypes, rrows = query.run_query(
entries, options, balance_query)
return rrows
def main():
parser = argparse.ArgumentParser(description='Generate portfolio report')
parser.add_argument('date', metavar='date', type=str, nargs=1,
help='Report date in ISO format (e.g. 1970-01-01)')
args = parser.parse_args()
date = args.date[0]
filename = "ledger/main.beancount"
entries, errors, options = loader.load_file(filename)
if errors:
printer.print_errors(errors)
positions = get_positions(entries, options, date)
print_report(date, positions)
main()