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,66 +4,79 @@ 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:
bills = Bill.objects.filter(wiref=wiref).order_by("date") return False
# Get data for pdf bills = Bill.objects.filter(wiref=wiref).order_by("date")
data = {}
for count, elem in enumerate(bills):
data.update(
{
f"Datum.{count}": str(elem.date.strftime("%d.%m.%Y")),
f"Aussteller.{count}": elem.invoice,
f"Verwendungszweck.{count}": elem.purpose,
# Replace decimal separator from '.' to ','
f"Betrag.{count}": str(elem.amount).replace(".", ","),
}
)
# Get budget year
today = datetime.date.today()
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
# Get data for pdf
data = {}
data_invoice = {} # Own dict for fixing text to multiline
for count, elem in enumerate(bills):
data.update( data.update(
{ {
"Laufende Nummer": str(wiref.wiref_id), f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")),
"Budgetjahr": budget_year, f"VerwendungszweckRow{count + 1}": elem.purpose,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","), f"BetragRow{count + 1}": str(elem.amount).replace(".", ","),
}
)
data_invoice.update(
{
f"RechnungsaustellerinRow{count + 1}": elem.invoice,
} }
) )
# Write data in pdf # Get budget year
pdf_path = os.path.join(os.path.dirname(__file__), "static/Vorlage.pdf") today = datetime.date.today()
reader = PdfReader(pdf_path) if today.month < 7:
writer = PdfWriter() budget_year = f"{today.year - 1}-{today.year}"
writer.append(reader) else:
budget_year = f"{today.year}-{today.year + 1}"
writer.update_page_form_field_values( # Get total of all bills of wiref form
writer.pages[0], total = 0
data, for elem in bills:
) total += elem.amount
with io.BytesIO() as bytes_stream: data.update(
writer.write(bytes_stream) {
"Rechnungsnummer": str(wiref.wiref_id),
"Budgetjahr": budget_year,
# Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","),
}
)
# Save pdf in wiref # Write data in pdf
wiref_name = f"Abrechnungsformular-{wiref.wiref_id}.pdf" pdf_path = os.path.join(os.path.dirname(__file__), "static/wiref/Vorlage.pdf")
wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name)) reader = PdfReader(pdf_path)
writer = PdfWriter()
writer.append(reader)
return True writer.update_page_form_field_values(
writer.pages[0],
data,
)
return False # 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