Files
fet2020/fet2020/finance/utils.py
2025-07-05 12:07:50 +02:00

83 lines
2.3 KiB
Python

import datetime
import io
from pathlib import Path
from django.core.files import File
from pypdf import PdfReader, PdfWriter
from pypdf.constants import FieldDictionaryAttributes as FA # noqa: N814
from .models import Bill, Wiref
def generate_pdf(wiref):
if wiref is None or wiref.status != Wiref.Status.OPENED:
return False
bills = Bill.objects.filter(wiref=wiref).order_by("date")
# Get data for pdf
data = {}
data_invoice = {} # Own dict for fixing text to multiline
for count, elem in enumerate(bills):
data.update(
{
f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")),
f"VerwendungszweckRow{count + 1}": elem.purpose,
# Replace decimal separator from '.' to ','
f"BetragRow{count + 1}": str(elem.amount).replace(".", ","),
},
)
data_invoice.update(
{
f"RechnungsaustellerinRow{count + 1}": elem.invoice,
},
)
# Get budget year
today = datetime.datetime.now(tz=datetime.UTC).date()
if today.month < 7:
budget_year = f"{today.year - 1}-{today.year}"
else:
budget_year = f"{today.year}-{today.year + 1}"
# Get total of all bills of wiref form
total = 0
for elem in bills:
total += elem.amount
data.update(
{
"Rechnungsnummer": str(wiref.wiref_id),
"Budgetjahr": budget_year,
# Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","),
},
)
# Write data in pdf
pdf_path = Path(Path(__file__).parent) / "static/wiref/Vorlage.pdf"
reader = PdfReader(pdf_path)
writer = PdfWriter()
writer.append(reader)
writer.update_page_form_field_values(
writer.pages[0],
data,
)
# Add invoices and fix text to multiline
writer.update_page_form_field_values(
writer.pages[0],
data_invoice,
flags=FA.FfBits.Multiline,
)
with io.BytesIO() as bytes_stream:
writer.write(bytes_stream)
# Save pdf in wiref
wiref_name = f"Abrechnungsformular-{wiref.wiref_id}.pdf"
wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name))
return True