diff options
Diffstat (limited to 'fracture/invoice.py')
-rw-r--r-- | fracture/invoice.py | 44 |
1 files changed, 17 insertions, 27 deletions
diff --git a/fracture/invoice.py b/fracture/invoice.py index d795340..295b7a8 100644 --- a/fracture/invoice.py +++ b/fracture/invoice.py @@ -1,5 +1,6 @@ import json import sqlite3 +from itertools import groupby from datetime import date, datetime, timedelta from configparser import ConfigParser from collections import OrderedDict @@ -386,41 +387,30 @@ class Invoice: def to_row(self): row = OrderedDict( - type = self.type, - id = self.id, - date = self.date.strftime("%Y-%m-%d"), - customer_id = self.customer.id, - customer_name = self.customer.name, + type = self.type, + id = self.id, + date = self.date.strftime("%Y-%m-%d"), + customer_id = self.customer.id, + customer_name = self.customer.name, + base_imp_total = Conf.round(self.base), + total = Conf.round(self.total), ) - total_base = 0 - total_charged = 0 - vats = sorted(Product.VATS) - to_base_key = lambda v: "base("+str(v*100)+"%)" - to_vat_key = lambda v: "VAT("+str(v*100)+"%)" - for vat in vats: - ps = filter(lambda p: p.vat == vat, self.products) + to_base_key = lambda v: "base("+str(v*100)+"%)" + to_vat_key = lambda v: "VAT("+str(v*100)+"%)" + pvat = lambda p: p.vat - vat_base = 0 - charged_vat = 0 - for product in ps: - vat_base += product.base - charged_vat += product.charged_vat - row[to_base_key(vat)] = round(vat_base, Conf.CURRENCY_DECIMAL) - row[to_vat_key(vat)] = round(charged_vat, Conf.CURRENCY_DECIMAL) + vs = groupby(sorted(self.products, key=pvat), key=pvat) - total_base += vat_base - total_charged += vat_base + charged_vat + for vat, ps in vs: + ps = tuple(ps) + row[to_base_key(vat)] = Conf.round(sum(p.base for p in ps)) + row[to_vat_key(vat)] = Conf.round(sum(p.charged_vat for p in ps)) - row["base(TOTAL)"] = round(total_base, Conf.CURRENCY_DECIMAL) to_tax_key = lambda tax: tax.name + "("+ str(tax.ratio*100) +"%)" for i in self.taxes: - tax_amount = i.ratio * total_base + tax_amount = i.ratio * self.base row[to_tax_key(i)] = round(tax_amount, Conf.CURRENCY_DECIMAL) - total_charged += tax_amount - - row["TOTAL"] = round(total_charged, Conf.CURRENCY_DECIMAL) - return row |