38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
#! /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
|
|
from pprint import pprint
|
|
|
|
|
|
@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)
|
|
main_categories = session.query(Category).filter(Category.parent_id == None).all()
|
|
|
|
data = {}
|
|
|
|
for mc in main_categories:
|
|
data[mc.name] = {}
|
|
sub_categories = session.query(Category).filter(Category.parent_id == mc.id).all()
|
|
for sc in sub_categories:
|
|
transactions = session.query(Transaction).filter(Transaction.category_id == sc.id).all()
|
|
data[mc.name][sc.name] = format_amount(sum([x.amount for x in transactions]))
|
|
|
|
context = {"year": year, "data": data}
|
|
|
|
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))
|