def createInvoice(inv_data, supplier_id, user): groups = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) for c in inv_data: if c.amount > 0: groups[c.product][c.price]['+'].append(c) else: groups[c.product][c.price]['-'].append(c) invoice = Invoice(user=user, sent=(user.id == supplier_id), paid=(user.id == supplier_id), date=datetime.datetime.utcnow(), positions=[], supplier_id=supplier_id) for product, pricedict in groups.items(): for price, consumptions in pricedict.items(): if len(consumptions['+']) > 0: summe = sum((c.price * c.amount) for c in consumptions['+']) amount = sum(c.amount for c in consumptions['+']) p = Position(amount=amount, price=price, sum=summe, invoice=invoice, product=product) invoice.positions.append(p) if len(consumptions['-']) > 0: summe = sum((c.price * c.amount) for c in consumptions['-']) amount = sum(c.amount for c in consumptions['-']) p = Position(amount=amount, price=price, sum=summe, invoice=invoice, product=product) invoice.positions.append(p) for c in inv_data: c.invoice = invoice c.billed = True invsum = float("{0:.2f}".format(sum(p.sum for p in invoice.positions))) invoice.sum = invsum db.session.add(invoice)