From 09efe4a68a254d99df362ad0c2ac47ab4b0a07a1 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:27:17 +0200 Subject: [PATCH] feat: Beitragsabrechnung (LAN-844) (#267) --- .../landa_item_sales_summary/__init__.py | 0 .../landa_item_sales_summary.json | 80 ++++++++ .../landa_item_sales_summary.py | 9 + .../doctype/landa_payment_row/__init__.py | 0 .../landa_payment_row/landa_payment_row.json | 56 ++++++ .../landa_payment_row/landa_payment_row.py | 9 + .../__init__.py | 0 .../statement_of_fees_and_payments.js | 65 +++++++ .../statement_of_fees_and_payments.json | 174 ++++++++++++++++++ .../statement_of_fees_and_payments.py | 79 ++++++++ .../test_statement_of_fees_and_payments.py | 9 + .../beitragsabrechnung/__init__.py | 0 .../beitragsabrechnung.json | 33 ++++ .../print_format/markenabrechnung/__init__.py | 0 landa/translations/de.csv | 8 + 15 files changed, 522 insertions(+) create mode 100644 landa/landa_sales/doctype/landa_item_sales_summary/__init__.py create mode 100644 landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.json create mode 100644 landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.py create mode 100644 landa/landa_sales/doctype/landa_payment_row/__init__.py create mode 100644 landa/landa_sales/doctype/landa_payment_row/landa_payment_row.json create mode 100644 landa/landa_sales/doctype/landa_payment_row/landa_payment_row.py create mode 100644 landa/landa_sales/doctype/statement_of_fees_and_payments/__init__.py create mode 100644 landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.js create mode 100644 landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.json create mode 100644 landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.py create mode 100644 landa/landa_sales/doctype/statement_of_fees_and_payments/test_statement_of_fees_and_payments.py create mode 100644 landa/landa_sales/print_format/beitragsabrechnung/__init__.py create mode 100644 landa/landa_sales/print_format/beitragsabrechnung/beitragsabrechnung.json create mode 100644 landa/landa_sales/print_format/markenabrechnung/__init__.py diff --git a/landa/landa_sales/doctype/landa_item_sales_summary/__init__.py b/landa/landa_sales/doctype/landa_item_sales_summary/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.json b/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.json new file mode 100644 index 00000000..250a9bff --- /dev/null +++ b/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.json @@ -0,0 +1,80 @@ +{ + "actions": [], + "creation": "2024-07-11 19:13:40.115388", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "item_code", + "item_name", + "billed", + "credited", + "net_billed", + "rate", + "amount" + ], + "fields": [ + { + "fieldname": "item_code", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Item Code", + "options": "Item" + }, + { + "fieldname": "item_name", + "fieldtype": "Data", + "label": "Item Name", + "read_only": 1 + }, + { + "columns": 1, + "fieldname": "rate", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Rate", + "options": "Company:company:default_currency" + }, + { + "columns": 2, + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "options": "Company:company:default_currency" + }, + { + "columns": 1, + "fieldname": "billed", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Billed" + }, + { + "columns": 1, + "fieldname": "credited", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Credited" + }, + { + "columns": 1, + "fieldname": "net_billed", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Net Billed" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2024-08-30 20:01:57.750315", + "modified_by": "Administrator", + "module": "LANDA Sales", + "name": "LANDA Item Sales Summary", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.py b/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.py new file mode 100644 index 00000000..b4f4d68f --- /dev/null +++ b/landa/landa_sales/doctype/landa_item_sales_summary/landa_item_sales_summary.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, ALYF GmbH and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class LANDAItemSalesSummary(Document): + pass diff --git a/landa/landa_sales/doctype/landa_payment_row/__init__.py b/landa/landa_sales/doctype/landa_payment_row/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.json b/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.json new file mode 100644 index 00000000..541c0eb1 --- /dev/null +++ b/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.json @@ -0,0 +1,56 @@ +{ + "actions": [], + "creation": "2024-07-11 17:31:34.524661", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "payment_entry", + "payment_type", + "reference_date", + "amount" + ], + "fields": [ + { + "fetch_from": "payment_entry.reference_date", + "fieldname": "reference_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Reference Date" + }, + { + "fieldname": "payment_entry", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Payment Entry", + "options": "Payment Entry" + }, + { + "fieldname": "payment_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Payment Type", + "options": "Receive\nPay" + }, + { + "fetch_from": "payment_entry.base_paid_amount", + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "options": "Company:company:default_currency" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2024-07-11 17:56:13.983731", + "modified_by": "Administrator", + "module": "LANDA Sales", + "name": "LANDA Payment Row", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.py b/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.py new file mode 100644 index 00000000..d38b56d8 --- /dev/null +++ b/landa/landa_sales/doctype/landa_payment_row/landa_payment_row.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, ALYF GmbH and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class LANDAPaymentRow(Document): + pass diff --git a/landa/landa_sales/doctype/statement_of_fees_and_payments/__init__.py b/landa/landa_sales/doctype/statement_of_fees_and_payments/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.js b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.js new file mode 100644 index 00000000..95a6e08a --- /dev/null +++ b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.js @@ -0,0 +1,65 @@ +// Copyright (c) 2024, ALYF GmbH and contributors +// For license information, please see license.txt + +frappe.ui.form.on("Statement of Fees and Payments", { + setup(frm) { + frm.set_query("customer_address", (doc) => { + return { + filters: [ + ["Dynamic Link", "link_doctype", "=", "Customer"], + ["Dynamic Link", "link_name", "=", doc.customer], + ], + }; + }); + + frm.set_query("company_address", (doc) => { + return { + filters: [ + ["Dynamic Link", "link_doctype", "=", "Company"], + ["Dynamic Link", "link_name", "=", doc.company], + ], + }; + }); + + frm.set_query("payment_entry", "payments", (doc) => { + return { + filters: { + company: doc.company, + year_of_settlement: doc.year_of_settlement, + party_type: "Customer", + party: doc.customer, + docstatus: 1, + }, + }; + }); + }, + + refresh(frm) { + if (frm.is_new() && !frm.doc.year_of_settlement) { + frm.set_value("year_of_settlement", new Date().getFullYear() - 1); + } + }, + + async company(frm) { + if (frm.doc.company) { + const default_address = await frappe.xcall( + "erpnext.setup.doctype.company.company.get_default_company_address", + { name: frm.doc.company, existing_address: frm.doc.company_address || "" } + ); + + if (default_address) { + frm.set_value("company_address", default_address); + } else { + frm.set_value("company_address", ""); + } + } + }, + + customer_address(frm) { + erpnext.utils.get_address_display(frm, "customer_address", "customer_address_display"); + }, + + company_address(frm) { + erpnext.utils.get_address_display(frm, "company_address", "company_address_display"); + }, +}); \ No newline at end of file diff --git a/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.json b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.json new file mode 100644 index 00000000..b92fcde1 --- /dev/null +++ b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.json @@ -0,0 +1,174 @@ +{ + "actions": [], + "creation": "2024-07-11 17:03:37.016034", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "company", + "customer", + "customer_name", + "column_break_ur9om", + "year_of_settlement", + "section_break_ksfci", + "customer_address", + "customer_address_display", + "column_break_v93mr", + "company_address", + "company_address_display", + "section_break_rmhy9", + "sales", + "sum_of_sales", + "section_break_onqf8", + "payments", + "sum_of_payments", + "amended_from" + ], + "fields": [ + { + "fieldname": "company", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Company", + "options": "Company", + "reqd": 1 + }, + { + "fieldname": "customer", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Customer", + "options": "Customer", + "reqd": 1 + }, + { + "fieldname": "year_of_settlement", + "fieldtype": "Int", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Year of Settlement", + "reqd": 1 + }, + { + "fieldname": "amended_from", + "fieldtype": "Link", + "label": "Amended From", + "no_copy": 1, + "options": "Statement of Fees and Payments", + "print_hide": 1, + "read_only": 1, + "search_index": 1 + }, + { + "fieldname": "section_break_ksfci", + "fieldtype": "Section Break" + }, + { + "fetch_from": "customer.default_billing_address", + "fetch_if_empty": 1, + "fieldname": "customer_address", + "fieldtype": "Link", + "label": "Customer Address", + "options": "Address" + }, + { + "fieldname": "customer_address_display", + "fieldtype": "Small Text", + "label": "Customer Address Display", + "read_only": 1 + }, + { + "fieldname": "column_break_v93mr", + "fieldtype": "Column Break" + }, + { + "fieldname": "company_address", + "fieldtype": "Link", + "label": "Company Address", + "options": "Address" + }, + { + "fieldname": "company_address_display", + "fieldtype": "Small Text", + "label": "Company Address Display", + "read_only": 1 + }, + { + "fieldname": "section_break_rmhy9", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_ur9om", + "fieldtype": "Column Break" + }, + { + "fetch_from": "customer.customer_name", + "fieldname": "customer_name", + "fieldtype": "Data", + "label": "Customer Name", + "read_only": 1 + }, + { + "fieldname": "payments", + "fieldtype": "Table", + "label": "Payments", + "options": "LANDA Payment Row", + "read_only": 1 + }, + { + "fieldname": "sales", + "fieldtype": "Table", + "label": "Sales", + "options": "LANDA Item Sales Summary", + "read_only": 1 + }, + { + "fieldname": "section_break_onqf8", + "fieldtype": "Section Break" + }, + { + "fieldname": "sum_of_sales", + "fieldtype": "Currency", + "label": "Sum of Sales", + "options": "Company:company:default_currency", + "read_only": 1 + }, + { + "fieldname": "sum_of_payments", + "fieldtype": "Currency", + "label": "Sum of Payments", + "options": "Company:company:default_currency", + "read_only": 1 + } + ], + "index_web_pages_for_search": 1, + "is_submittable": 1, + "links": [], + "modified": "2024-07-11 19:26:28.449367", + "modified_by": "Administrator", + "module": "LANDA Sales", + "name": "Statement of Fees and Payments", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "title_field": "customer_name", + "track_changes": 1 +} \ No newline at end of file diff --git a/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.py b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.py new file mode 100644 index 00000000..a1569c38 --- /dev/null +++ b/landa/landa_sales/doctype/statement_of_fees_and_payments/statement_of_fees_and_payments.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024, ALYF GmbH and contributors +# For license information, please see license.txt + +import frappe +from frappe.model.docstatus import DocStatus +from frappe.model.document import Document +from pandas import DataFrame as df + + +class StatementofFeesandPayments(Document): + def before_save(self): + self.fetch_payments() + self.fetch_sales() + self.calculate_totals() + + def fetch_payments(self): + self.payments = [] + for pe in frappe.get_list( + "Payment Entry", + filters={ + "company": self.company, + "party_type": "Customer", + "party": self.customer, + "docstatus": DocStatus.submitted(), + "year_of_settlement": self.year_of_settlement, + }, + fields=[ + "name", + "reference_date", + "payment_type", + "base_paid_amount", + ], + ): + self.append( + "payments", + { + "payment_entry": pe.name, + "payment_type": pe.payment_type, + "reference_date": pe.reference_date, + "amount": pe.base_paid_amount if pe.payment_type == "Receive" else -pe.base_paid_amount, + }, + ) + + def fetch_sales(self): + invoice_rows = frappe.get_list( + "Sales Invoice", + filters={ + "company": self.company, + "customer": self.customer, + "docstatus": DocStatus.submitted(), + "year_of_settlement": self.year_of_settlement, + }, + fields=[ + "`tabSales Invoice Item`.item_code as item_code", + "`tabSales Invoice Item`.item_name as item_name", + "`tabSales Invoice Item`.qty as qty", + "`tabSales Invoice Item`.base_amount as amount", + ], + ) + + if not invoice_rows: + return + + rows_df = df.from_records(invoice_rows) + + rows_df["billed"] = rows_df["qty"].clip(lower=0) + rows_df["credited"] = -1 * rows_df["qty"].clip(upper=0) + rows_df["net_billed"] = rows_df["billed"] - rows_df["credited"] + rows_df["rate"] = rows_df["amount"] / rows_df["net_billed"] + + rows_df.drop(columns="qty", inplace=True) + rows_df = rows_df.groupby(["item_code", "item_name"]).sum().reset_index() + + self.sales = [] + self.extend("sales", rows_df.to_dict(orient="records")) + + def calculate_totals(self): + self.sum_of_payments = sum(p.amount for p in self.payments) + self.sum_of_sales = sum(s.amount for s in self.sales) diff --git a/landa/landa_sales/doctype/statement_of_fees_and_payments/test_statement_of_fees_and_payments.py b/landa/landa_sales/doctype/statement_of_fees_and_payments/test_statement_of_fees_and_payments.py new file mode 100644 index 00000000..fd9cd098 --- /dev/null +++ b/landa/landa_sales/doctype/statement_of_fees_and_payments/test_statement_of_fees_and_payments.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, ALYF GmbH and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestStatementofFeesandPayments(FrappeTestCase): + pass diff --git a/landa/landa_sales/print_format/beitragsabrechnung/__init__.py b/landa/landa_sales/print_format/beitragsabrechnung/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/landa/landa_sales/print_format/beitragsabrechnung/beitragsabrechnung.json b/landa/landa_sales/print_format/beitragsabrechnung/beitragsabrechnung.json new file mode 100644 index 00000000..2d261e33 --- /dev/null +++ b/landa/landa_sales/print_format/beitragsabrechnung/beitragsabrechnung.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2024-08-30 20:24:47.826648", + "css": ".print-format{padding:0;position:relative}.print-format #header{text-align:right;width:100%;height:35mm;margin-top:-10mm;overflow:hidden;position:relative}.print-format #logo{display:block;height:20mm;margin:0;padding:0;position:absolute;bottom:0;right:20mm}.print-format .contact-row{position:relative;overflow:hidden;left:20mm;height:45mm;width:170mm}.print-format #sender{position:relative;font-size:50%;height:17.7mm}.print-format #sender p{position:absolute;width:85mm;top:3mm}.print-format #address{float:left;width:85mm;padding-left:5mm}.print-format #contact{float:right;width:75mm;margin-top:9mm}.print-format #contact>table{width:100%}.print-format #contact tr td:first-child{font-weight:bold}.print-format #contact td{padding:1pt !important;font-size:8pt !important;text-align:right}.print-format #subject{margin-bottom:2em;height:5mm;font-weight:bold;font-size:12pt}.print-format .din-mark{width:3mm;height:1pt;background-color:#000;position:absolute;left:10mm}.print-format #fold-mark-1{top:95mm}.print-format #punch-mark{top:138.5mm}.print-format #fold-mark-2{top:200mm}.print-format #text{margin-top:8.46mm;margin-left:25mm;margin-right:20mm}.print-format #text .invoice table td,.print-format #text .invoice table th{font-size:9pt}.print-format .text-right{text-align:right}.print-format .text-small{font-size:10px}.print-format .black-border{border-top:solid #000 1px;border-bottom:solid #000 1px}.print-format .w-100{width:100%}.print-format table{page-break-inside:auto}.print-format table tr{page-break-inside:avoid;page-break-after:auto}.print-format table thead{display:table-header-group}.print-format table tfoot{display:table-footer-group}.print-format .epilogue{text-align:justify}.print-format .epilogue .salutation{page-break-inside:avoid}.print-format .ql-editor{font-family:inherit;color:inherit;line-height:inherit}.print-format .ql-editor p{margin-top:5pt}.print-format-footer{margin-left:25mm;padding-right:20mm}#pagenum{text-align:right;margin-right:20mm;margin-top:4.23mm;margin-bottom:4.23mm}body,html{padding:0;margin:0;width:100%;height:100%}/*# sourceMappingURL=sales_order.css.map */\n", + "custom_format": 1, + "default_print_language": "de", + "disabled": 0, + "doc_type": "Statement of Fees and Payments", + "docstatus": 0, + "doctype": "Print Format", + "font": "Default", + "font_size": 14, + "html": "\n\n{% set company = frappe.get_doc(\"Company\", doc.company) %}\n{% set customer = frappe.get_doc(\"Customer\", doc.customer) %}\n{% set company_address = frappe.get_doc(\"Address\", doc.company_address) if doc.company_address else None %}\n{% set pay_addr = frappe.get_doc(\"Address\", doc.customer_address) if doc.customer_address else None %}\n\n{% if doc.contact_person %}\n {% set contact = frappe.get_doc(\"Contact\", doc.contact_person) %}\n{% endif %}\n\n\n
\n {% if company.company_logo %}\n \n {% endif %}\n
\n\n
\n
\n
\n

{{ company.name }}
\n {% if company_address %}\n {{ company_address.address_line1 }} ·\n {% if company_address.address_line2 %}{{ company_address.address_line2 }}
{% endif %}\n {{ company_address.pincode }} {{ company_address.city }}\n {% if company_address.country and company_address.country != pay_addr.country -%}\n · {{ company_address.country.upper() }}\n {%- endif %}\n {% else %}\n {{ _(\"Address not set!\") }}\n {% endif %}\n

\n
\n {% if contact %}\n {{ contact.first_name }}{% if contact.last_name %} {{ contact.last_name }}{% endif %}
\n {{ doc.customer_name }}
\n {% else %}\n {{ doc.customer_name }}
\n {% endif %}\n {{ doc.customer_address_display if doc.customer_address_display else \"\" + _(\"Address not set!\") + \"\" }}\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ _(\"Phone\") }}:{{ company.phone_no }}
{{ _(\"Email\") }}:{{ company.email }}
{{ _(\"Organization ID\") }}:{{ customer.organization }}
\n
\n
\n\n
\n
\n
\n\n\n
\n\t
\n\t\t{{ _(\"Statement of Fees and Payments\") }} - {{ doc.year_of_settlement }} - {{ doc.customer_name }}\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n {% for n in doc.sales %}\n \n \n \n \n \n \n \n \n \n {% endfor %}\n \n \n \n \n \n \n \n \n \n \n \n
{{ _(\"Sr\") }}{{ _(\"Item\") }}{{ _(\"Billed\") }}{{ _(\"Credited\") }}{{ _(\"Net Billed\") }}{{ _(\"Price\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n {{ _(n.item_name) }}\n {{ n.billed }}{{ n.credited }}{{ n.net_billed }}{{ n.get_formatted(\"rate\") }}{{ n.get_formatted(\"amount\") }}
{{ _(\"Total\") }}{{ doc.get_formatted(\"sum_of_sales\") }}
\n
\n \n \n \n \n \n \n \n \n \n \n {% for n in doc.payments %}\n \n \n \n \n \n \n {% endfor %}\n \n \n \n \n \n \n \n \n \n
{{ _(\"Sr\") }}{{ _(\"Payment Type\") }}{{ _(\"Reference Date\") }}{{ _(\"Amount\") }}
{{ loop.index }}{{ _(n.payment_type) }}{{ n.get_formatted(\"reference_date\") }}{{ n.get_formatted(\"amount\") }}
{{ _(\"Total\") }}{{ doc.get_formatted(\"sum_of_payments\") }}
\n
\n
\n\n\n
\n

\n {{ _(\"Page {0} of {1}\").format('', '') }}\n

\n
\n {{ footer }}\n
\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2024-08-30 20:50:25.740619", + "modified_by": "Administrator", + "module": "LANDA Sales", + "name": "Beitragsabrechnung", + "owner": "Administrator", + "page_number": "Hide", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} \ No newline at end of file diff --git a/landa/landa_sales/print_format/markenabrechnung/__init__.py b/landa/landa_sales/print_format/markenabrechnung/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/landa/translations/de.csv b/landa/translations/de.csv index 46e961ec..7b5da86e 100644 --- a/landa/translations/de.csv +++ b/landa/translations/de.csv @@ -95,3 +95,11 @@ Delivery Note List,Lieferungen & Retouren, Payment Entry List,Zahlungen, Sales Invoice,Rechnung, LANDA Member {0} has been created or updated.,Mitglied {0} wurde erstellt bzw. aktualisiert., +Customer Address Display,Vorschau Kundenadresse, +Company Address Display,Vorschau RV-Adresse, +Billed,Abgerechnet, +Credited,Gutgeschrieben, +Net Billed,Netto abgerechnet, +Sum of Sales,Rechnungssumme, +Sum of Payments,Zahlungssumme, +Statement of Fees and Payments,Beitragsabrechnung,