From b8e77aeca4008c5ca4f037c8216272ab00c5c3be Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Mon, 22 Aug 2016 17:19:27 +0200 Subject: [PATCH 1/3] Render line breaks in invoices "Additional text" --- src/pretix/base/services/invoices.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 6fde414665..7e9d4005c2 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -49,7 +49,7 @@ def generate_cancellation(invoice: Invoice): def regenerate_invoice(invoice: Invoice): with language(invoice.locale): invoice.invoice_from = invoice.event.settings.get('invoice_address_from') - invoice.additional_text = invoice.event.settings.get('invoice_additional_text') + invoice.additional_text = invoice.event.settings.get('invoice_additional_text').replace('\n','
') try: addr_template = pgettext("invoice", """{i.company} @@ -105,7 +105,7 @@ def generate_invoice(order: Order): with language(locale): i = Invoice(order=order, event=order.event) i.invoice_from = order.event.settings.get('invoice_address_from') - i.additional_text = order.event.settings.get('invoice_additional_text') + i.additional_text = order.event.settings.get('invoice_additional_text').replace('\n','
') try: addr_template = pgettext("invoice", """{i.company} From 157a16810d27bc0644e9581ea2362ed25abd51ac Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Mon, 22 Aug 2016 17:19:45 +0200 Subject: [PATCH 2/3] Add a net_value column to invoices TODO: localization --- src/pretix/base/models/invoices.py | 4 ++++ src/pretix/base/services/invoices.py | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index 620ca527c0..7148afe78c 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -135,3 +135,7 @@ class InvoiceLine(models.Model): gross_value = models.DecimalField(max_digits=10, decimal_places=2) tax_value = models.DecimalField(max_digits=10, decimal_places=2, default=Decimal('0.00')) tax_rate = models.DecimalField(max_digits=7, decimal_places=2, default=Decimal('0.00')) + + @property + def net_value(self): + return self.gross_value - self.tax_value diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 7e9d4005c2..98f6834bae 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -309,20 +309,26 @@ def _invoice_generate_german(invoice, f): ('LEFTPADDING', (0, 0), (0, -1), 0), ('RIGHTPADDING', (-1, 0), (-1, -1), 0), ] - tdata = [(pgettext('invoice', 'Description'), pgettext('invoice', 'Tax rate'), pgettext('invoice', 'Price'))] + tdata = [( + pgettext('invoice', 'Description'), + pgettext('invoice', 'Tax rate'), + pgettext('invoice', 'Net'), + pgettext('invoice', 'Gross'), + )] total = Decimal('0.00') for line in invoice.lines.all(): tdata.append(( line.description, lformat("%.2f", line.tax_rate) + " %", + lformat("%.2f", line.net_value) + " " + invoice.event.currency, lformat("%.2f", line.gross_value) + " " + invoice.event.currency, )) taxvalue_map[line.tax_rate] += line.tax_value grossvalue_map[line.tax_rate] += line.gross_value total += line.gross_value - tdata.append([pgettext('invoice', 'Invoice total'), '', lformat("%.2f", total) + " " + invoice.event.currency]) - colwidths = [a * doc.width for a in (.60, .20, .20)] + tdata.append([pgettext('invoice', 'Invoice total'), '', '', lformat("%.2f", total) + " " + invoice.event.currency]) + colwidths = [a * doc.width for a in (.55, .15, .15, .15)] table = Table(tdata, colWidths=colwidths, repeatRows=1) table.setStyle(TableStyle(tstyledata)) story.append(table) From 5f401f17d8f49d6b1b152fa75d44cb208809d0c3 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Mon, 22 Aug 2016 19:05:11 +0200 Subject: [PATCH 3/3] Add a footer and a second text field to invoices Also, move to using localized strings for Invoice.additional_text settings for consistency. --- src/pretix/base/models/invoices.py | 6 +++ src/pretix/base/services/invoices.py | 43 ++++++++++++++++--- src/pretix/base/settings.py | 10 ++++- src/pretix/control/forms/event.py | 17 +++++++- .../pretixcontrol/event/invoicing.html | 2 + 5 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index 7148afe78c..13f7e1e8e9 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -39,8 +39,12 @@ class Invoice(models.Model): :type date: date :param locale: The locale in which the invoice should be printed :type locale: str + :param introductory_text: Introductory text for the invoice, e.g. for a greeting + :type introductory_text: str :param additional_text: Additional text for the invoice :type additional_text: str + :param footer_text: A footer text, displayed smaller and centered on every page + :type footer_text: str :param file: The filename of the rendered invoice :type file: File """ @@ -53,7 +57,9 @@ class Invoice(models.Model): invoice_to = models.TextField() date = models.DateField(default=date.today) locale = models.CharField(max_length=50, default='en') + introductory_text = models.TextField(blank=True) additional_text = models.TextField(blank=True) + footer_text = models.TextField(blank=True) file = models.FileField(null=True, blank=True, upload_to=invoice_filename) @staticmethod diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 98f6834bae..bd51fbdb23 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -21,7 +21,7 @@ from reportlab.platypus import ( Table, TableStyle, ) -from pretix.base.i18n import language +from pretix.base.i18n import LazyI18nString, language from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order from pretix.base.signals import register_payment_providers @@ -49,7 +49,14 @@ def generate_cancellation(invoice: Invoice): def regenerate_invoice(invoice: Invoice): with language(invoice.locale): invoice.invoice_from = invoice.event.settings.get('invoice_address_from') - invoice.additional_text = invoice.event.settings.get('invoice_additional_text').replace('\n','
') + + introductory = invoice.event.settings.get('invoice_introductory_text', as_type=LazyI18nString) + additional = invoice.event.settings.get('invoice_additional_text', as_type=LazyI18nString) + footer = invoice.event.settings.get('invoice_footer_text', as_type=LazyI18nString) + + invoice.introductory_text = str(introductory).replace('\n', '
') + invoice.additional_text = str(additional).replace('\n', '
') + + introductory = i.event.settings.get('invoice_introductory_text', as_type=LazyI18nString) + additional = i.event.settings.get('invoice_additional_text', as_type=LazyI18nString) + footer = i.event.settings.get('invoice_footer_text', as_type=LazyI18nString) + + i.introductory_text = str(introductory).replace('\n', '
') + i.additional_text = str(additional).replace('\n', '