add a new Vorlage file, update number of bill to 10 and fix text to multiline

This commit is contained in:
2025-01-26 22:06:16 +01:00
parent 9b05663cf5
commit f999a98d7c
4 changed files with 60 additions and 47 deletions

View File

@@ -398,8 +398,8 @@ class BillAdminForm(forms.ModelForm):
self.fields["bill_creator"].widget.can_change_related = False self.fields["bill_creator"].widget.can_change_related = False
self.fields["bill_creator"].widget.can_delete_related = False self.fields["bill_creator"].widget.can_delete_related = False
# delete wiref id from list if there are already 8 bills in wiref form. # Delete wiref id from list if there are already 10 bills in wiref form.
qs = self.fields["wiref"].queryset.annotate(num_bills=Count("bill")).filter(num_bills__lt=8) qs = self.fields["wiref"].queryset.annotate(num_bills=Count("bill")).filter(num_bills__lt=10)
# delete wiref id from if status is not opened. # delete wiref id from if status is not opened.
qs = qs.filter(status=Wiref.Status.OPENED) qs = qs.filter(status=Wiref.Status.OPENED)

Binary file not shown.

Binary file not shown.

View File

@@ -4,24 +4,32 @@ import os
from django.core.files import File from django.core.files import File
from pypdf import PdfReader, PdfWriter from pypdf import PdfReader, PdfWriter
from pypdf.constants import FieldDictionaryAttributes as FA
from .models import Bill, Wiref from .models import Bill, Wiref
def generate_pdf(wiref): def generate_pdf(wiref):
if wiref is not None and wiref.status == Wiref.Status.OPENED: if wiref is None or wiref.status != Wiref.Status.OPENED:
return False
bills = Bill.objects.filter(wiref=wiref).order_by("date") bills = Bill.objects.filter(wiref=wiref).order_by("date")
# Get data for pdf # Get data for pdf
data = {} data = {}
data_invoice = {} # Own dict for fixing text to multiline
for count, elem in enumerate(bills): for count, elem in enumerate(bills):
data.update( data.update(
{ {
f"Datum.{count}": str(elem.date.strftime("%d.%m.%Y")), f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")),
f"Aussteller.{count}": elem.invoice, f"VerwendungszweckRow{count + 1}": elem.purpose,
f"Verwendungszweck.{count}": elem.purpose,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
f"Betrag.{count}": str(elem.amount).replace(".", ","), f"BetragRow{count + 1}": str(elem.amount).replace(".", ","),
}
)
data_invoice.update(
{
f"RechnungsaustellerinRow{count + 1}": elem.invoice,
} }
) )
@@ -39,7 +47,7 @@ def generate_pdf(wiref):
data.update( data.update(
{ {
"Laufende Nummer": str(wiref.wiref_id), "Rechnungsnummer": str(wiref.wiref_id),
"Budgetjahr": budget_year, "Budgetjahr": budget_year,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","), "Summe": str(total).replace(".", ","),
@@ -47,7 +55,7 @@ def generate_pdf(wiref):
) )
# Write data in pdf # Write data in pdf
pdf_path = os.path.join(os.path.dirname(__file__), "static/Vorlage.pdf") pdf_path = os.path.join(os.path.dirname(__file__), "static/wiref/Vorlage.pdf")
reader = PdfReader(pdf_path) reader = PdfReader(pdf_path)
writer = PdfWriter() writer = PdfWriter()
writer.append(reader) writer.append(reader)
@@ -57,6 +65,13 @@ def generate_pdf(wiref):
data, 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: with io.BytesIO() as bytes_stream:
writer.write(bytes_stream) writer.write(bytes_stream)
@@ -65,5 +80,3 @@ def generate_pdf(wiref):
wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name)) wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name))
return True return True
return False