add a new Vorlage file, update number of bill to 10 and fix text to multiline
This commit is contained in:
@@ -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)
|
||||
|
||||
Binary file not shown.
BIN
fet2020/finance/static/wiref/Vorlage.pdf
Normal file
BIN
fet2020/finance/static/wiref/Vorlage.pdf
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user