mirror of
https://github.com/almet/copanier.git
synced 2025-04-28 19:42:37 +02:00
113 lines
No EOL
3.4 KiB
Python
113 lines
No EOL
3.4 KiB
Python
from dataclasses import fields as get_fields
|
|
|
|
from openpyxl import Workbook
|
|
from openpyxl.writer.excel import save_virtual_workbook
|
|
|
|
from .models import Product, Producer
|
|
|
|
def summary_for_products(wb, title, delivery, total=None, products=None):
|
|
if products == None:
|
|
products = delivery.products
|
|
if total == None:
|
|
total = delivery.total
|
|
|
|
ws = wb.create_sheet(title)
|
|
ws.append([
|
|
"ref",
|
|
"produit",
|
|
"prix unitaire",
|
|
"quantité commandée",
|
|
"unité",
|
|
"total",
|
|
])
|
|
for product in products:
|
|
wanted = delivery.product_wanted(product)
|
|
if not wanted:
|
|
continue
|
|
ws.append([
|
|
product.ref,
|
|
str(product),
|
|
product.price,
|
|
wanted,
|
|
product.unit,
|
|
round(product.price * wanted, 2),
|
|
])
|
|
ws.append(["", "", "", "", "Total", total])
|
|
|
|
|
|
|
|
def summary(delivery):
|
|
wb = Workbook()
|
|
wb.remove(wb.active)
|
|
if delivery.has_multiple_producers:
|
|
for producer in delivery.producers:
|
|
summary_for_products(
|
|
wb,
|
|
producer,
|
|
delivery,
|
|
total=delivery.total_for_producer(producer),
|
|
products=delivery.get_products_by(producer)
|
|
)
|
|
else:
|
|
summary_for_products(wb, f"{delivery.name} {delivery.from_date.date()}", delivery)
|
|
|
|
return save_virtual_workbook(wb)
|
|
|
|
|
|
def full(delivery):
|
|
wb = Workbook()
|
|
ws = wb.active
|
|
ws.title = f"{delivery.name} {delivery.from_date.date()}"
|
|
headers = ["ref", "produit", "prix"] + [e for e in delivery.orders] + ["total"]
|
|
if delivery.has_multiple_producers:
|
|
headers.insert(1, "producer")
|
|
ws.append(headers)
|
|
for product in delivery.products:
|
|
row = [product.ref, str(product), product.price]
|
|
if delivery.has_multiple_producers:
|
|
row.insert(1, product.producer)
|
|
for order in delivery.orders.values():
|
|
wanted = order.products.get(product.ref)
|
|
row.append(wanted.quantity if wanted else 0)
|
|
row.append(delivery.product_wanted(product))
|
|
ws.append(row)
|
|
footer = (
|
|
["Total", "", ""]
|
|
+ [round(o.total(delivery.products),2) for o in delivery.orders.values()]
|
|
+ [round(delivery.total, 2)]
|
|
)
|
|
if delivery.has_multiple_producers:
|
|
footer.insert(1, "")
|
|
|
|
ws.append(footer)
|
|
return save_virtual_workbook(wb)
|
|
|
|
|
|
def products(delivery):
|
|
wb = Workbook()
|
|
ws = wb.active
|
|
ws.title = f"{delivery.name} produits"
|
|
product_fields = [f.name for f in get_fields(Product)]
|
|
ws.append(product_fields)
|
|
for product in delivery.products:
|
|
ws.append([getattr(product, field) for field in product_fields])
|
|
|
|
producer_sheet = wb.create_sheet(f"producteur⋅ice⋅s et référent⋅e⋅s")
|
|
producer_fields = [f.name for f in get_fields(Producer)]
|
|
producer_sheet.append(producer_fields)
|
|
for producer in delivery.producers.values():
|
|
producer_sheet.append([getattr(producer, field) for field in producer_fields])
|
|
|
|
return save_virtual_workbook(wb)
|
|
|
|
|
|
def balance(delivery):
|
|
wb = Workbook()
|
|
ws = wb.active
|
|
ws.title = f"Solde {delivery.name}"
|
|
ws.append(["Adhérent", "Montant", "Payé"])
|
|
for email, order in delivery.orders.items():
|
|
ws.append(
|
|
[email, order.total(delivery.products), "oui" if order.paid else "non"]
|
|
)
|
|
return save_virtual_workbook(wb) |