From 433f3f49a9bf2a614a48fb73e251bca20b275431 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:03:52 +0100 Subject: [PATCH] feat(E Invoice Import): link or view existing Purchase Invoice --- .../e_invoice_import/e_invoice_import.js | 29 ++++++++++--- .../e_invoice_import/e_invoice_import.py | 35 ++++++++++++++++ eu_einvoice/locale/de.po | 42 +++++++++++++------ eu_einvoice/locale/main.pot | 40 ++++++++++++------ 4 files changed, 115 insertions(+), 31 deletions(-) diff --git a/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js b/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js index 8bbf10e..ec334fa 100644 --- a/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js +++ b/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js @@ -59,16 +59,33 @@ frappe.ui.form.on("E Invoice Import", { }; if (frm.doc.docstatus === 1) { - frm.add_custom_button( - __("Purchase Invoice"), - function () { + const { linked_invoice, unlinked_invoice } = frm.doc.__onload; + if (linked_invoice && frappe.model.can_read("Purchase Invoice")) { + frm.add_custom_button(__("View {0}", [linked_invoice]), function () { + frappe.set_route("Form", "Purchase Invoice", linked_invoice); + }); + } else if (unlinked_invoice && frappe.model.can_write("Purchase Invoice")) { + frm.add_custom_button(__("Link to {0}", [unlinked_invoice]), function () { + frappe + .xcall( + "eu_einvoice.european_e_invoice.doctype.e_invoice_import.e_invoice_import.link_to_purchase_invoice", + { + einvoice: frm.doc.name, + purchase_invoice: unlinked_invoice, + } + ) + .then(() => { + frm.reload_doc(); + }); + }); + } else if (frappe.model.can_create("Purchase Invoice")) { + frm.add_custom_button(__("Create Purchase Invoice"), function () { frappe.model.open_mapped_doc({ method: "eu_einvoice.european_e_invoice.doctype.e_invoice_import.e_invoice_import.create_purchase_invoice", frm: frm, }); - }, - __("Create") - ); + }); + } } }, create_supplier: function (frm) { diff --git a/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py b/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py index 5736e16..ce64eb6 100644 --- a/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py +++ b/eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py @@ -103,6 +103,23 @@ def before_submit(self): def on_submit(self): self.add_seller_product_ids_to_items() + def onload(self): + if self.docstatus == 0: + return + + invoices = frappe.get_list( + "Purchase Invoice", + filters={"bill_no": self.id, "supplier": self.supplier, "company": self.company}, + fields=["name", "e_invoice_import"], + ) + linked_invoice = next( + (invoice.name for invoice in invoices if invoice.e_invoice_import == self.name), None + ) + unlinked_invoice = next((invoice.name for invoice in invoices if not invoice.e_invoice_import), None) + + self.set_onload("linked_invoice", linked_invoice) + self.set_onload("unlinked_invoice", unlinked_invoice) + def get_xml_bytes(self) -> bytes: return get_xml_bytes(Path(get_site_path(self.einvoice.lstrip("/"))).resolve()) @@ -460,3 +477,21 @@ def create_einvoice_from_po(source_name, target_doc=None): }, target_doc, ) + + +@frappe.whitelist() +def link_to_purchase_invoice(einvoice: str, purchase_invoice: str): + """Link an existing E Invoice Import to an existing Purchase Invoice.""" + pi = frappe.get_doc("Purchase Invoice", purchase_invoice) + pi.check_permission("write") + if pi.e_invoice_import: + frappe.throw( + _("Purchase Invoice {0} is already linked to E Invoice Import {1}").format( + purchase_invoice, pi.e_invoice_import + ) + ) + + if not frappe.db.get_list("E Invoice Import", filters={"name": einvoice}, limit=1): + frappe.throw(_("E Invoice Import {0} does not exist").format(einvoice)) + + pi.db_set("e_invoice_import", einvoice) diff --git a/eu_einvoice/locale/de.po b/eu_einvoice/locale/de.po index 9cc2cad..a43911f 100644 --- a/eu_einvoice/locale/de.po +++ b/eu_einvoice/locale/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: European e-Invoice VERSION\n" "Report-Msgid-Bugs-To: hallo@alyf.de\n" -"POT-Creation-Date: 2024-11-25 18:57+0053\n" +"POT-Creation-Date: 2024-11-30 21:02+0053\n" "PO-Revision-Date: 2024-11-25 18:57+0053\n" "Last-Translator: hallo@alyf.de\n" "Language: de\n" @@ -128,7 +128,6 @@ msgid "Correct German Federal Administration Invoice" msgstr "Korrekte XRechnung" #: eu_einvoice/european_e_invoice/custom/purchase_order.js:12 -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:70 msgid "Create" msgstr "Erstellen" @@ -137,6 +136,10 @@ msgstr "Erstellen" msgid "Create Item" msgstr "Artikel erstellen" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:82 +msgid "Create Purchase Invoice" +msgstr "Eingangsrechnung erstellen" + #. Label of the create_supplier (Button) field in DocType 'E Invoice Import' #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json msgid "Create Supplier" @@ -193,6 +196,10 @@ msgstr "Fälligkeitsdatum" msgid "E Invoice Import" msgstr "E-Rechnungs-Import" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:495 +msgid "E Invoice Import {0} does not exist" +msgstr "E-Rechnungs-Import {0} existiert nicht" + #. Name of a DocType #: eu_einvoice/european_e_invoice/doctype/e_invoice_item/e_invoice_item.json msgid "E Invoice Item" @@ -213,7 +220,7 @@ msgstr "E-Rechnungs-Steuer" msgid "E-Invoice" msgstr "E-Rechnung" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:114 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:167 msgid "European Invoice" msgstr "Europäische Rechnung" @@ -223,7 +230,7 @@ msgstr "Europäische Rechnung" msgid "File Section" msgstr "Datei-Abschnitt" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:115 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:175 msgid "German Federal Administration Invoice" msgstr "Deutsche Bundesverwaltung" @@ -254,12 +261,16 @@ msgstr "Artikel" msgid "Items" msgstr "Positionen" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:68 +msgid "Link to {0}" +msgstr "Mit {0} verknüpfen" + #. Label of the net_rate (Currency) field in DocType 'E Invoice Item' #: eu_einvoice/european_e_invoice/doctype/e_invoice_item/e_invoice_item.json msgid "Net Rate" msgstr "Nettopreis" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:283 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:312 msgid "No XML data found in PDF file." msgstr "Keine XML-Daten in der PDF-Datei gefunden." @@ -303,9 +314,9 @@ msgstr "Produktbeschreibung" msgid "Product Name" msgstr "Produktname" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:63 -msgid "Purchase Invoice" -msgstr "Eingangsrechnung" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:489 +msgid "Purchase Invoice {0} is already linked to E Invoice Import {1}" +msgstr "Eingangsrechnung {0} ist bereits mit E-Rechnungs-Import {1} verknüpft" #. Name of a role #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json @@ -429,7 +440,7 @@ msgstr "Einheit" msgid "Unit Code" msgstr "Einheits-Code" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:287 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:316 msgid "Unsupported file format '{0}'" msgstr "Nicht unterstütztes Dateiformat '{0}'" @@ -438,17 +449,22 @@ msgstr "Nicht unterstütztes Dateiformat '{0}'" msgid "Upload the .xml or .pdf file provided by your supplier." msgstr "Laden Sie die von Ihrem Lieferanten bereitgestellte .xml- oder .pdf-Datei hoch." -#. Label of the validation_tab (Tab Break) field in DocType 'E Invoice Import' +#. Label of the validation_details_section (Section Break) field in DocType 'E +#. Invoice Import' #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json -msgid "Validation" -msgstr "Validierung" +msgid "Validation Details" +msgstr "Validierungsdetails" #. Label of the validation_errors (Text) field in DocType 'E Invoice Import' #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json msgid "Validation Errors" msgstr "Validierungsfehler" -#: eu_einvoice/european_e_invoice/custom/sales_invoice.py:362 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:64 +msgid "View {0}" +msgstr "{0} ansehen" + +#: eu_einvoice/european_e_invoice/custom/sales_invoice.py:476 msgid "{0} row #{1}: Type '{2}' is not supported in e-invoice" msgstr "{0} Zeile #{1}: Typ '{2}' wird in der E-Rechnung nicht unterstützt" diff --git a/eu_einvoice/locale/main.pot b/eu_einvoice/locale/main.pot index 0bd37b3..4517e57 100644 --- a/eu_einvoice/locale/main.pot +++ b/eu_einvoice/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: European e-Invoice VERSION\n" "Report-Msgid-Bugs-To: hallo@alyf.de\n" -"POT-Creation-Date: 2024-11-25 18:57+0053\n" -"PO-Revision-Date: 2024-11-25 18:57+0053\n" +"POT-Creation-Date: 2024-11-30 21:02+0053\n" +"PO-Revision-Date: 2024-11-30 21:02+0053\n" "Last-Translator: hallo@alyf.de\n" "Language-Team: hallo@alyf.de\n" "MIME-Version: 1.0\n" @@ -126,7 +126,6 @@ msgid "Correct German Federal Administration Invoice" msgstr "" #: eu_einvoice/european_e_invoice/custom/purchase_order.js:12 -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:70 msgid "Create" msgstr "" @@ -135,6 +134,10 @@ msgstr "" msgid "Create Item" msgstr "" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:82 +msgid "Create Purchase Invoice" +msgstr "" + #. Label of the create_supplier (Button) field in DocType 'E Invoice Import' #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json msgid "Create Supplier" @@ -191,6 +194,10 @@ msgstr "" msgid "E Invoice Import" msgstr "" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:495 +msgid "E Invoice Import {0} does not exist" +msgstr "" + #. Name of a DocType #: eu_einvoice/european_e_invoice/doctype/e_invoice_item/e_invoice_item.json msgid "E Invoice Item" @@ -211,7 +218,7 @@ msgstr "" msgid "E-Invoice" msgstr "" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:114 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:167 msgid "European Invoice" msgstr "" @@ -221,7 +228,7 @@ msgstr "" msgid "File Section" msgstr "" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:115 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:175 msgid "German Federal Administration Invoice" msgstr "" @@ -252,12 +259,16 @@ msgstr "" msgid "Items" msgstr "" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:68 +msgid "Link to {0}" +msgstr "" + #. Label of the net_rate (Currency) field in DocType 'E Invoice Item' #: eu_einvoice/european_e_invoice/doctype/e_invoice_item/e_invoice_item.json msgid "Net Rate" msgstr "" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:283 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:312 msgid "No XML data found in PDF file." msgstr "" @@ -301,8 +312,8 @@ msgstr "" msgid "Product Name" msgstr "" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:63 -msgid "Purchase Invoice" +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:489 +msgid "Purchase Invoice {0} is already linked to E Invoice Import {1}" msgstr "" #. Name of a role @@ -427,7 +438,7 @@ msgstr "" msgid "Unit Code" msgstr "" -#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:287 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.py:316 msgid "Unsupported file format '{0}'" msgstr "" @@ -436,9 +447,10 @@ msgstr "" msgid "Upload the .xml or .pdf file provided by your supplier." msgstr "" -#. Label of the validation_tab (Tab Break) field in DocType 'E Invoice Import' +#. Label of the validation_details_section (Section Break) field in DocType 'E +#. Invoice Import' #: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.json -msgid "Validation" +msgid "Validation Details" msgstr "" #. Label of the validation_errors (Text) field in DocType 'E Invoice Import' @@ -446,7 +458,11 @@ msgstr "" msgid "Validation Errors" msgstr "" -#: eu_einvoice/european_e_invoice/custom/sales_invoice.py:362 +#: eu_einvoice/european_e_invoice/doctype/e_invoice_import/e_invoice_import.js:64 +msgid "View {0}" +msgstr "" + +#: eu_einvoice/european_e_invoice/custom/sales_invoice.py:476 msgid "{0} row #{1}: Type '{2}' is not supported in e-invoice" msgstr ""