#! /usr/bin/env python3 from models import Category, Transaction from helper import get_session import sys import click from bottle import template from sqlalchemy import func from weasyprint import HTML from datetime import date from helper import format_amount @click.command(name="report") @click.option("--profile", "-p") @click.option("--year", "-y") def command(profile, year): if not year: year = date.today().year session = get_session(profile) result = ( session.query( Transaction.category_id, Category.name, func.sum(Transaction.amount).label("total"), ) .group_by(Transaction.category_id) .join(Category, Transaction.category_id == Category.id) .all() ) sum_of_categories = [] for r in result: tmp = {} tmp["name"] = r.name tmp["total"] = r.total tmp["total_formatted"] = format_amount(r.total) tmp["full_name"] = session.query(Category).get(r.category_id).full_name() sum_of_categories.append(tmp) categories = sorted(sum_of_categories, key=lambda i: i["name"]) einnahmen = [c for c in categories if c["total"] > 0] ausgaben = [c for c in categories if c["total"] < 0] sum_einnahmen = sum(c["total"] for c in einnahmen) sum_ausgaben = sum(c["total"] for c in ausgaben) total = { "einnahmen": format_amount(sum_einnahmen), "ausgaben": format_amount(sum_ausgaben), "total": format_amount(sum_einnahmen + sum_ausgaben), } context = { "einnahmen": einnahmen, "ausgaben": ausgaben, "year": year, "total": total, } tpl = template("views/report.tpl", context) filename = "output/report_{}_{}.pdf".format(profile, year) HTML(string=tpl).write_pdf(filename) print("Report saved to {}".format(filename))