diff --git a/fet2020/finance/forms.py b/fet2020/finance/forms.py index 47f856d3..8613aca1 100644 --- a/fet2020/finance/forms.py +++ b/fet2020/finance/forms.py @@ -398,8 +398,8 @@ class BillAdminForm(forms.ModelForm): self.fields["bill_creator"].widget.can_change_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. - qs = self.fields["wiref"].queryset.annotate(num_bills=Count("bill")).filter(num_bills__lt=8) + # 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=10) # delete wiref id from if status is not opened. qs = qs.filter(status=Wiref.Status.OPENED) diff --git a/fet2020/finance/static/Vorlage.pdf b/fet2020/finance/static/Vorlage.pdf deleted file mode 100644 index 0a61b2c3..00000000 Binary files a/fet2020/finance/static/Vorlage.pdf and /dev/null differ diff --git a/fet2020/finance/static/wiref/Vorlage.pdf b/fet2020/finance/static/wiref/Vorlage.pdf new file mode 100644 index 00000000..9a1c488a Binary files /dev/null and b/fet2020/finance/static/wiref/Vorlage.pdf differ diff --git a/fet2020/finance/utils.py b/fet2020/finance/utils.py index b3b64b7e..35fab641 100644 --- a/fet2020/finance/utils.py +++ b/fet2020/finance/utils.py @@ -4,66 +4,79 @@ import os from django.core.files import File from pypdf import PdfReader, PdfWriter +from pypdf.constants import FieldDictionaryAttributes as FA from .models import Bill, Wiref def generate_pdf(wiref): - if wiref is not None and wiref.status == Wiref.Status.OPENED: - bills = Bill.objects.filter(wiref=wiref).order_by("date") + if wiref is None or wiref.status != Wiref.Status.OPENED: + return False - # Get data for pdf - 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 + 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( { - "Laufende Nummer": str(wiref.wiref_id), - "Budgetjahr": budget_year, + f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")), + f"VerwendungszweckRow{count + 1}": elem.purpose, # 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 - pdf_path = os.path.join(os.path.dirname(__file__), "static/Vorlage.pdf") - reader = PdfReader(pdf_path) - writer = PdfWriter() - writer.append(reader) + # 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}" - writer.update_page_form_field_values( - writer.pages[0], - data, - ) + # Get total of all bills of wiref form + total = 0 + for elem in bills: + total += elem.amount - with io.BytesIO() as bytes_stream: - writer.write(bytes_stream) + data.update( + { + "Rechnungsnummer": str(wiref.wiref_id), + "Budgetjahr": budget_year, + # Replace decimal separator from '.' to ',' + "Summe": str(total).replace(".", ","), + } + ) - # Save pdf in wiref - wiref_name = f"Abrechnungsformular-{wiref.wiref_id}.pdf" - wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name)) + # Write data in pdf + pdf_path = os.path.join(os.path.dirname(__file__), "static/wiref/Vorlage.pdf") + reader = PdfReader(pdf_path) + writer = PdfWriter() + writer.append(reader) - return True + 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, + ) - return False + 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