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 ""