From 8ec3f6215e2be57847692ae8fa7d2633d93d49ae Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Sun, 26 Mar 2023 20:24:52 +0200 Subject: [PATCH 01/25] feat: check_vat_approx --- erpnext_germany/api.py | 19 +++++++++-------- erpnext_germany/utils/eu_vat.py | 38 +++++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/erpnext_germany/api.py b/erpnext_germany/api.py index eb07091..61535d5 100644 --- a/erpnext_germany/api.py +++ b/erpnext_germany/api.py @@ -1,20 +1,21 @@ import frappe +from .utils.eu_vat import check_vat, parse_vat_id @frappe.whitelist() def validate_vat_id(vat_id: str) -> bool: """Use the EU VAT checker to validate a VAT ID.""" - from .utils.eu_vat import is_valid_eu_vat_id - - result = frappe.cache().hget("eu_vat_validation", vat_id, shared=True) - if result is not None: - return result + is_valid = frappe.cache().hget("eu_vat_validation", vat_id, shared=True) + if is_valid is not None: + return is_valid try: - result = is_valid_eu_vat_id(vat_id) - frappe.cache().hset("eu_vat_validation", vat_id, result, shared=True) + country_code, vat_number = parse_vat_id(vat_id) + result = check_vat(country_code, vat_number) + is_valid = result.valid + frappe.cache().hset("eu_vat_validation", vat_id, is_valid, shared=True) except Exception: frappe.response["status_code"] = 501 - result = None + is_valid = None - return result + return is_valid diff --git a/erpnext_germany/utils/eu_vat.py b/erpnext_germany/utils/eu_vat.py index 097f793..2899525 100644 --- a/erpnext_germany/utils/eu_vat.py +++ b/erpnext_germany/utils/eu_vat.py @@ -1,12 +1,38 @@ -import zeep +from zeep import Client +import re +WSDL_URL = "https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl" +COUNTRY_CODE_REGEX = r"^[A-Z]{2}$" +VAT_NUMBER_REGEX = r"^[0-9A-Za-z\+\*\.]{2,12}$" -def is_valid_eu_vat_id(vat_id) -> bool: - """Use the EU VAT checker to validate a VAT ID.""" + +def parse_vat_id(vat_id: str) -> tuple[str, str]: country_code = vat_id[:2].upper() vat_number = vat_id[2:].replace(" ", "") - client = zeep.Client("https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl") - result = client.service.checkVat(vatNumber=vat_number, countryCode=country_code) + # check vat_number and country_code with regex + if not re.match(COUNTRY_CODE_REGEX, country_code): + raise ValueError("Invalid country code") + + if not re.match(VAT_NUMBER_REGEX, vat_number): + raise ValueError("Invalid VAT number") + + return country_code, vat_number + + +def check_vat(country_code: str, vat_number: str): + """Use the EU VAT checker to validate a VAT ID.""" + return Client(WSDL_URL).service.checkVat( + vatNumber=vat_number, countryCode=country_code + ) + - return result.valid +def check_vat_approx( + country_code, vat_number, requester_country_code=None, requester_vat_number=None +): + return Client(WSDL_URL).service.checkVatApprox( + countryCode=country_code, + vatNumber=vat_number, + requesterCountryCode=requester_country_code, + requesterVatNumber=requester_vat_number, + ) From d2d4ec1b9fe306f08bdabcf06f6cf1557d39f068 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Sun, 26 Mar 2023 20:28:23 +0200 Subject: [PATCH 02/25] feat: doctype VAT ID Check --- .../doctype/vat_id_check/__init__.py | 0 .../doctype/vat_id_check/test_vat_id_check.py | 9 ++ .../doctype/vat_id_check/vat_id_check.js | 8 + .../doctype/vat_id_check/vat_id_check.json | 149 ++++++++++++++++++ .../doctype/vat_id_check/vat_id_check.py | 21 +++ 5 files changed, 187 insertions(+) create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/__init__.py create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/test_vat_id_check.py create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.js create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/__init__.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/test_vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/test_vat_id_check.py new file mode 100644 index 0000000..a5b4e4a --- /dev/null +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/test_vat_id_check.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, ALYF GmbH and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestVATIDCheck(FrappeTestCase): + pass diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.js b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.js new file mode 100644 index 0000000..1c272d6 --- /dev/null +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.js @@ -0,0 +1,8 @@ +// Copyright (c) 2023, ALYF GmbH and contributors +// For license information, please see license.txt + +frappe.ui.form.on('VAT ID Check', { + // refresh: function(frm) { + + // } +}); diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json new file mode 100644 index 0000000..54802a5 --- /dev/null +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -0,0 +1,149 @@ +{ + "actions": [], + "creation": "2023-03-26 18:28:14.770174", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "customer", + "column_break_hmgxr", + "tax_id", + "section_break_xljfy", + "company", + "column_break_scjlu", + "company_tax_id", + "section_break_dowxn", + "is_valid", + "column_break_c4uco", + "request_id" + ], + "fields": [ + { + "fieldname": "customer", + "fieldtype": "Link", + "label": "Customer", + "options": "Customer", + "reqd": 1, + "set_only_once": 1 + }, + { + "fieldname": "column_break_hmgxr", + "fieldtype": "Column Break" + }, + { + "fieldname": "request_id", + "fieldtype": "Data", + "label": "Request ID", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "is_valid", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Is Valid", + "read_only": 1 + }, + { + "fetch_from": "customer.tax_id", + "fieldname": "tax_id", + "fieldtype": "Data", + "label": "Tax ID", + "read_only": 1, + "set_only_once": 1 + }, + { + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", + "set_only_once": 1 + }, + { + "fetch_from": "company.tax_id", + "fetch_if_empty": 1, + "fieldname": "company_tax_id", + "fieldtype": "Data", + "label": "Company Tax ID", + "read_only": 1 + }, + { + "fieldname": "section_break_xljfy", + "fieldtype": "Section Break", + "label": "Requester" + }, + { + "fieldname": "column_break_scjlu", + "fieldtype": "Column Break" + }, + { + "depends_on": "eval:!doc.__islocal", + "fieldname": "section_break_dowxn", + "fieldtype": "Section Break", + "label": "Result" + }, + { + "fieldname": "column_break_c4uco", + "fieldtype": "Column Break" + } + ], + "links": [], + "modified": "2023-03-26 20:16:06.439169", + "modified_by": "Administrator", + "module": "ERPNext Germany", + "name": "VAT ID Check", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Master Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User", + "write": 1 + } + ], + "sort_field": "creation", + "sort_order": "DESC", + "states": [], + "title_field": "customer" +} \ No newline at end of file diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py new file mode 100644 index 0000000..f298b18 --- /dev/null +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -0,0 +1,21 @@ +# Copyright (c) 2023, ALYF GmbH and contributors +# For license information, please see license.txt + +from frappe.model.document import Document +from erpnext_germany.utils.eu_vat import check_vat_approx, parse_vat_id + + +class VATIDCheck(Document): + def before_insert(self): + requester_country_code, requester_vat_number = None, None + if self.company_tax_id: + requester_country_code, requester_vat_number = parse_vat_id(self.company_tax_id) + + country_code, vat_number = parse_vat_id(self.tax_id) + result = check_vat_approx( + country_code, vat_number, requester_country_code, requester_vat_number + ) + self.country_code = result.countryCode + self.vat_number = result.vatNumber + self.is_valid = result.valid + self.request_id = result.requestIdentifier From 25285a3a09e5e4857fbddeaa5888bf1eeb78e7ef Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Sun, 26 Mar 2023 20:28:49 +0200 Subject: [PATCH 03/25] feat: cronjob for checking VAT IDs --- erpnext_germany/hooks.py | 10 +++---- erpnext_germany/tasks.py | 64 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 erpnext_germany/tasks.py diff --git a/erpnext_germany/hooks.py b/erpnext_germany/hooks.py index fc23d57..1e80c13 100644 --- a/erpnext_germany/hooks.py +++ b/erpnext_germany/hooks.py @@ -125,10 +125,10 @@ # Scheduled Tasks # --------------- -# scheduler_events = { -# "all": [ -# "erpnext_germany.tasks.all" -# ], +scheduler_events = { + "all": [ + "erpnext_germany.tasks.all" + ], # "daily": [ # "erpnext_germany.tasks.daily" # ], @@ -141,7 +141,7 @@ # "monthly": [ # "erpnext_germany.tasks.monthly" # ], -# } +} # Testing # ------- diff --git a/erpnext_germany/tasks.py b/erpnext_germany/tasks.py new file mode 100644 index 0000000..4470a54 --- /dev/null +++ b/erpnext_germany/tasks.py @@ -0,0 +1,64 @@ +from erpnext import get_default_company +import frappe + + +def all(): + check_some_customers() + + +def create_vat_id_check( + customer: str, tax_id: str, company: str, company_tax_id: str +) -> str: + """Create a VAT ID check document and return its name.""" + doc = frappe.new_doc("VAT ID Check") + doc.customer = customer + doc.tax_id = tax_id + doc.company = company + doc.company_tax_id = company_tax_id + doc.insert(ignore_permissions=True) + + return doc.name + + +def get_customers(n=4): + """Return a list of n customers who didn't have their VAT ID checked in the last 3 months.""" + from pypika import functions as fn, Interval + from frappe.query_builder import DocType + + customers = DocType("Customer") + vat_id_checks = DocType("VAT ID Check") + last_check = ( + frappe.qb.from_(vat_id_checks) + .select( + vat_id_checks.customer, + fn.Max(vat_id_checks.creation).as_("creation"), + ) + .groupby(vat_id_checks.customer) + ) + + return ( + frappe.qb.from_(customers) + .left_join(last_check) + .on(customers.name == last_check.customer) + .select(customers.name, customers.tax_id) + .where( + customers.tax_id.notnull() + & (customers.disabled == 0) + & ( + last_check.creation.isnull() + | (last_check.creation < fn.Now() - Interval(months=3)) + ) + ) + .limit(n) + .run() + ) + + +def check_some_customers(): + """Check VAT IDs of customers who didn't have their VAT ID checked in the last 3 months.""" + company_tax_id = None + if company := get_default_company(): + company_tax_id = frappe.get_cached_value("Company", company, "tax_id") + + for customer, tax_id in get_customers(): + create_vat_id_check(customer, tax_id, company_tax_id) From ae4ed1d7f4afec54f699bc840c1dbea271e9e565 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:45:12 +0200 Subject: [PATCH 04/25] feat(VAT ID Check): add status formatter --- .../doctype/vat_id_check/vat_id_check_list.js | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js new file mode 100644 index 0000000..cd98831 --- /dev/null +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js @@ -0,0 +1,9 @@ +frappe.listview_settings["VAT ID Check"] = { + add_fields: ["is_valid"], + hide_name_column: true, + get_indicator: function (doc) { + return doc.is_valid === 1 + ? [__("Valid"), "green", "is_valid,=,Yes"] + : [__("Invalid"), "red", "is_valid,=,No"]; + }, +}; From 716d731d6273750c43ffb7b72d779ab52f7687d0 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:45:30 +0200 Subject: [PATCH 05/25] fix(VAT ID Check): list view fields --- .../doctype/vat_id_check/vat_id_check.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 54802a5..6b5b52e 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -22,6 +22,7 @@ { "fieldname": "customer", "fieldtype": "Link", + "in_list_view": 1, "label": "Customer", "options": "Customer", "reqd": 1, @@ -34,6 +35,7 @@ { "fieldname": "request_id", "fieldtype": "Data", + "in_list_view": 1, "label": "Request ID", "read_only": 1 }, @@ -41,16 +43,17 @@ "default": "0", "fieldname": "is_valid", "fieldtype": "Check", - "in_list_view": 1, "label": "Is Valid", "read_only": 1 }, { "fetch_from": "customer.tax_id", + "fetch_if_empty": 1, "fieldname": "tax_id", "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Tax ID", - "read_only": 1, "set_only_once": 1 }, { @@ -65,8 +68,7 @@ "fetch_if_empty": 1, "fieldname": "company_tax_id", "fieldtype": "Data", - "label": "Company Tax ID", - "read_only": 1 + "label": "Company Tax ID" }, { "fieldname": "section_break_xljfy", @@ -89,7 +91,7 @@ } ], "links": [], - "modified": "2023-03-26 20:16:06.439169", + "modified": "2023-06-12 12:44:24.099383", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", From c4b6d61715b8013d213dfef51253d2ddf7a2165f Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:46:07 +0200 Subject: [PATCH 06/25] fix(VAT ID Check): store formatted VAT id --- .../erpnext_germany/doctype/vat_id_check/vat_id_check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index f298b18..e8df6da 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -10,12 +10,12 @@ def before_insert(self): requester_country_code, requester_vat_number = None, None if self.company_tax_id: requester_country_code, requester_vat_number = parse_vat_id(self.company_tax_id) + self.company_tax_id = f"{requester_country_code}{requester_vat_number}" country_code, vat_number = parse_vat_id(self.tax_id) + self.tax_id = f"{country_code}{vat_number}" result = check_vat_approx( country_code, vat_number, requester_country_code, requester_vat_number ) - self.country_code = result.countryCode - self.vat_number = result.vatNumber self.is_valid = result.valid self.request_id = result.requestIdentifier From ed0803dd3b4e2cd1d063b4a5a2c6921286573f77 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 13:48:34 +0200 Subject: [PATCH 07/25] feat(VAT ID Check): add to customer connections --- erpnext_germany/hooks.py | 13 +++++++++++++ erpnext_germany/install.py | 13 +++++++++++++ erpnext_germany/patches.txt | 1 + 3 files changed, 27 insertions(+) diff --git a/erpnext_germany/hooks.py b/erpnext_germany/hooks.py index 1dc5e8e..1703aa9 100644 --- a/erpnext_germany/hooks.py +++ b/erpnext_germany/hooks.py @@ -354,3 +354,16 @@ def get_register_fields(insert_after: str): ("current_accommodation_type", "hidden", 1, "Check"), ], } + +germany_custom_records = [ + { + "doctype": "DocType Link", + "parent": "Customer", + "parentfield": "links", + "parenttype": "Customize Form", + "group": "Pre Sales", + "link_doctype": "VAT ID Check", + "link_fieldname": "customer", + "custom": 1, + }, +] diff --git a/erpnext_germany/install.py b/erpnext_germany/install.py index f1af710..2c24cfb 100644 --- a/erpnext_germany/install.py +++ b/erpnext_germany/install.py @@ -10,6 +10,7 @@ def after_install(): create_custom_fields(custom_fields) make_property_setters() import_data() + insert_custom_records() def import_data(): @@ -46,3 +47,15 @@ def make_property_setters(): for property_setter in property_setters: for_doctype = True if not property_setter[0] else False make_property_setter(doctype, *property_setter, for_doctype) + + +def insert_custom_records(): + for custom_record in frappe.get_hooks("germany_custom_records"): + filters = custom_record.copy() + # Clean up filters. They need to be a plain dict without nested dicts or lists. + for key, value in custom_record.items(): + if isinstance(value, (list, dict)): + del filters[key] + + if not frappe.db.exists(filters): + frappe.get_doc(custom_record).insert(ignore_if_duplicate=True) diff --git a/erpnext_germany/patches.txt b/erpnext_germany/patches.txt index 3469a5f..7d0cb17 100644 --- a/erpnext_germany/patches.txt +++ b/erpnext_germany/patches.txt @@ -1 +1,2 @@ execute:from erpnext_germany.install import after_install; after_install() # 7 +execute:from erpnext_germany.install import insert_custom_records; insert_custom_records() From 4c270d5d7df24165acbd897eaabf66e971081c5e Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 13:49:20 +0200 Subject: [PATCH 08/25] feat(VAT ID Check): add translations --- erpnext_germany/translations/de.csv | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/erpnext_germany/translations/de.csv b/erpnext_germany/translations/de.csv index a481c28..5e64476 100644 --- a/erpnext_germany/translations/de.csv +++ b/erpnext_germany/translations/de.csv @@ -15,3 +15,12 @@ Religious Denomination,Konfession Has Children,Hat Kinder Highest School Qualification,Höchster Schulabschluss Has Other Employments,Hat Nebenbeschäftigungen +VAT ID Check,Ust-IdNr. Prüfung +Request ID,Anfrage ID +Is Valid,Ist gültig +Valid,Gültig +Invalid,Ungültig +Company Tax ID,Ust-IdNr. des Unternehmens +Customer Tax ID,Ust-IdNr. des Kunden +Result,Ergebnis +Requester,Anfragender From 7f4ef217a96cb7a499856307f8f5a2cbc906cbe6 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 13:56:49 +0200 Subject: [PATCH 09/25] feat!: remove VAT check button in Cust and Supp --- erpnext_germany/hooks.py | 7 +-- erpnext_germany/public/js/customer.js | 5 -- erpnext_germany/public/js/supplier.js | 5 -- erpnext_germany/public/js/validate_vat_id.js | 51 -------------------- 4 files changed, 2 insertions(+), 66 deletions(-) delete mode 100644 erpnext_germany/public/js/customer.js delete mode 100644 erpnext_germany/public/js/supplier.js delete mode 100644 erpnext_germany/public/js/validate_vat_id.js diff --git a/erpnext_germany/hooks.py b/erpnext_germany/hooks.py index 1703aa9..203862c 100644 --- a/erpnext_germany/hooks.py +++ b/erpnext_germany/hooks.py @@ -16,7 +16,7 @@ # include js, css files in header of desk.html # app_include_css = "/assets/erpnext_germany/css/erpnext_germany.css" -app_include_js = "/assets/erpnext_germany/js/validate_vat_id.js" +# app_include_js = "/assets/erpnext_germany/js/erpnext_germany.js" # include js, css files in header of web template # web_include_css = "/assets/erpnext_germany/css/erpnext_germany.css" @@ -33,10 +33,7 @@ # page_js = {"page" : "public/js/file.js"} # include js in doctype views -doctype_js = { - "Customer": "public/js/customer.js", - "Supplier": "public/js/supplier.js", -} +# doctype_js = {} # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} diff --git a/erpnext_germany/public/js/customer.js b/erpnext_germany/public/js/customer.js deleted file mode 100644 index 5a903a9..0000000 --- a/erpnext_germany/public/js/customer.js +++ /dev/null @@ -1,5 +0,0 @@ -frappe.ui.form.on("Customer", { - setup: function (frm) { - erpnext_germany.utils.setup_vat_id_validation_button(frm); - } -}); \ No newline at end of file diff --git a/erpnext_germany/public/js/supplier.js b/erpnext_germany/public/js/supplier.js deleted file mode 100644 index 9f77d6d..0000000 --- a/erpnext_germany/public/js/supplier.js +++ /dev/null @@ -1,5 +0,0 @@ -frappe.ui.form.on("Supplier", { - setup: function (frm) { - erpnext_germany.utils.setup_vat_id_validation_button(frm); - } -}); \ No newline at end of file diff --git a/erpnext_germany/public/js/validate_vat_id.js b/erpnext_germany/public/js/validate_vat_id.js deleted file mode 100644 index 6930dde..0000000 --- a/erpnext_germany/public/js/validate_vat_id.js +++ /dev/null @@ -1,51 +0,0 @@ - -frappe.provide("erpnext_germany.utils"); - -erpnext_germany.utils.setup_vat_id_validation_button = function (frm) { - const $wrapper = $(frm.fields_dict.tax_id.input_area); - const $link_button = $( - ` - - ${frappe.utils.icon("search", "sm")} - - ` - ); - - $($wrapper).append($link_button); - $link_button.toggle(true); - $link_button.on("click", "a", () => { - const vat_id = frm.doc.tax_id; - erpnext_germany.utils.check_vat_id(vat_id) - .then((is_valid) => { - if (is_valid === true) { - frappe.show_alert({ - message: __("Tax ID is a valid EU VAT ID"), - indicator: "green", - }); - } else if (is_valid === false) { - frappe.show_alert({ - message: __("Tax ID is not a valid EU VAT ID"), - indicator: "red", - }); - } else { - frappe.show_alert({ - message: __("Tax ID could not be validated"), - indicator: "grey", - }); - } - }); - }); -}; - -erpnext_germany.utils.check_vat_id = function (vat_id) { - return frappe.xcall( - "erpnext_germany.api.validate_vat_id", - { vat_id: vat_id }, - ); -}; From ca85a78b5669f311be184db37d02a1271cfa30ab Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:08:09 +0200 Subject: [PATCH 10/25] fix(VAT ID Check): naming and translations --- .../doctype/vat_id_check/vat_id_check.json | 41 ++++++++++--------- .../doctype/vat_id_check/vat_id_check.py | 10 ++--- erpnext_germany/translations/de.csv | 6 +-- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 6b5b52e..cc907ac 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -8,11 +8,11 @@ "field_order": [ "customer", "column_break_hmgxr", - "tax_id", + "customer_vat_id", "section_break_xljfy", "company", "column_break_scjlu", - "company_tax_id", + "requester_vat_id", "section_break_dowxn", "is_valid", "column_break_c4uco", @@ -46,16 +46,6 @@ "label": "Is Valid", "read_only": 1 }, - { - "fetch_from": "customer.tax_id", - "fetch_if_empty": 1, - "fieldname": "tax_id", - "fieldtype": "Data", - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Tax ID", - "set_only_once": 1 - }, { "fieldname": "company", "fieldtype": "Link", @@ -63,13 +53,6 @@ "options": "Company", "set_only_once": 1 }, - { - "fetch_from": "company.tax_id", - "fetch_if_empty": 1, - "fieldname": "company_tax_id", - "fieldtype": "Data", - "label": "Company Tax ID" - }, { "fieldname": "section_break_xljfy", "fieldtype": "Section Break", @@ -88,10 +71,28 @@ { "fieldname": "column_break_c4uco", "fieldtype": "Column Break" + }, + { + "fetch_from": "customer.tax_id", + "fetch_if_empty": 1, + "fieldname": "customer_vat_id", + "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Customer VAT ID", + "set_only_once": 1 + }, + { + "fetch_from": "company.tax_id", + "fetch_if_empty": 1, + "fieldname": "requester_vat_id", + "fieldtype": "Data", + "label": "Requester VAT ID", + "set_only_once": 1 } ], "links": [], - "modified": "2023-06-12 12:44:24.099383", + "modified": "2023-06-12 14:05:24.036098", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index e8df6da..6b26a54 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -8,12 +8,12 @@ class VATIDCheck(Document): def before_insert(self): requester_country_code, requester_vat_number = None, None - if self.company_tax_id: - requester_country_code, requester_vat_number = parse_vat_id(self.company_tax_id) - self.company_tax_id = f"{requester_country_code}{requester_vat_number}" + if self.requester_vat_id: + requester_country_code, requester_vat_number = parse_vat_id(self.requester_vat_id) + self.requester_vat_id = f"{requester_country_code}{requester_vat_number}" - country_code, vat_number = parse_vat_id(self.tax_id) - self.tax_id = f"{country_code}{vat_number}" + country_code, vat_number = parse_vat_id(self.customer_vat_id) + self.customer_vat_id = f"{country_code}{vat_number}" result = check_vat_approx( country_code, vat_number, requester_country_code, requester_vat_number ) diff --git a/erpnext_germany/translations/de.csv b/erpnext_germany/translations/de.csv index 5e64476..82a2a3d 100644 --- a/erpnext_germany/translations/de.csv +++ b/erpnext_germany/translations/de.csv @@ -15,12 +15,12 @@ Religious Denomination,Konfession Has Children,Hat Kinder Highest School Qualification,Höchster Schulabschluss Has Other Employments,Hat Nebenbeschäftigungen -VAT ID Check,Ust-IdNr. Prüfung +VAT ID Check,USt-IdNr Prüfung Request ID,Anfrage ID Is Valid,Ist gültig Valid,Gültig Invalid,Ungültig -Company Tax ID,Ust-IdNr. des Unternehmens -Customer Tax ID,Ust-IdNr. des Kunden +Requester VAT ID,USt-IdNr. des Anfragenden +Customer VAT ID,USt-IdNr. des Kunden Result,Ergebnis Requester,Anfragender From 93e0ec35fbca02e833ececa272042f48293c799a Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:19:06 +0200 Subject: [PATCH 11/25] docs: new VAT ID Check --- README.md | 4 +++- docs/validate_vat_id.gif | Bin 81618 -> 0 bytes docs/vat_check.png | Bin 0 -> 59023 bytes 3 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 docs/validate_vat_id.gif create mode 100644 docs/vat_check.png diff --git a/README.md b/README.md index d406c90..7dd29da 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ App to hold regional code for Germany, built on top of ERPNext. - Validation of EU VAT IDs - ![Validate EU VAT ID](docs/validate_vat_id.gif) + Automatically checks the validity of EU VAT IDs of all your customers every three months, or manually whenever you want. + + ![Validate EU VAT ID](docs/vat_check.png) ### HR diff --git a/docs/validate_vat_id.gif b/docs/validate_vat_id.gif deleted file mode 100644 index 278ac712241797c1c6ea5947e9afa074dd76b8ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81618 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 o1`QGCqegA|pCqmdM9WkR80r=)Gt_{=wni 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 literal 0 HcmV?d00001 From 75a65737703626e87fdf7a37a828ecf976bf81f3 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 13 Jun 2023 18:09:21 +0200 Subject: [PATCH 12/25] fix(VAT ID Check): make Customer VAT ID mandatory --- .../erpnext_germany/doctype/vat_id_check/vat_id_check.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index cc907ac..49a009c 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -25,7 +25,6 @@ "in_list_view": 1, "label": "Customer", "options": "Customer", - "reqd": 1, "set_only_once": 1 }, { @@ -80,6 +79,7 @@ "in_list_view": 1, "in_standard_filter": 1, "label": "Customer VAT ID", + "reqd": 1, "set_only_once": 1 }, { @@ -92,7 +92,7 @@ } ], "links": [], - "modified": "2023-06-12 14:05:24.036098", + "modified": "2023-06-13 18:08:25.520189", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", From d1d660c491b5eb94c7736b0d2db7030d4cec7773 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 13 Jun 2023 19:01:11 +0200 Subject: [PATCH 13/25] feat: retry request --- erpnext_germany/utils/eu_vat.py | 21 ++++++++++++++++++++- requirements.txt | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/erpnext_germany/utils/eu_vat.py b/erpnext_germany/utils/eu_vat.py index 2899525..7162112 100644 --- a/erpnext_germany/utils/eu_vat.py +++ b/erpnext_germany/utils/eu_vat.py @@ -1,6 +1,14 @@ -from zeep import Client import re +from tenacity import ( + retry, + retry_any, + retry_if_exception_message, + stop_after_attempt, + wait_exponential, +) +from zeep import Client + WSDL_URL = "https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl" COUNTRY_CODE_REGEX = r"^[A-Z]{2}$" VAT_NUMBER_REGEX = r"^[0-9A-Za-z\+\*\.]{2,12}$" @@ -27,6 +35,17 @@ def check_vat(country_code: str, vat_number: str): ) +@retry( + retry=retry_any( + retry_if_exception_message(message="GLOBAL_MAX_CONCURRENT_REQ"), + retry_if_exception_message(message="MS_MAX_CONCURRENT_REQ"), + retry_if_exception_message(message="SERVICE_UNAVAILABLE"), + retry_if_exception_message(message="MS_UNAVAILABLE"), + retry_if_exception_message(message="TIMEOUT"), + ), + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=2, max=8), +) def check_vat_approx( country_code, vat_number, requester_country_code=None, requester_vat_number=None ): diff --git a/requirements.txt b/requirements.txt index 1243fdf..b4bb2db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ # frappe -- https://github.com/frappe/frappe is installed via 'bench init' -zeep \ No newline at end of file +zeep +tenacity From 753046459aaba4280c97b566b3704d06d6166a73 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 13 Jun 2023 19:36:02 +0200 Subject: [PATCH 14/25] feat(VAT ID Check): run async --- .../doctype/vat_id_check/vat_id_check.json | 11 +++++- .../doctype/vat_id_check/vat_id_check.py | 37 ++++++++++++++++--- .../doctype/vat_id_check/vat_id_check_list.js | 8 +++- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 49a009c..60192ee 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -7,6 +7,7 @@ "engine": "InnoDB", "field_order": [ "customer", + "status", "column_break_hmgxr", "customer_vat_id", "section_break_xljfy", @@ -89,10 +90,18 @@ "fieldtype": "Data", "label": "Requester VAT ID", "set_only_once": 1 + }, + { + "default": "Planned", + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "Planned\nRunning\nCompleted", + "read_only": 1 } ], "links": [], - "modified": "2023-06-13 18:08:25.520189", + "modified": "2023-06-13 19:08:12.049107", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index 6b26a54..6a43506 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -1,21 +1,46 @@ # Copyright (c) 2023, ALYF GmbH and contributors # For license information, please see license.txt +import frappe from frappe.model.document import Document from erpnext_germany.utils.eu_vat import check_vat_approx, parse_vat_id class VATIDCheck(Document): def before_insert(self): - requester_country_code, requester_vat_number = None, None if self.requester_vat_id: - requester_country_code, requester_vat_number = parse_vat_id(self.requester_vat_id) + requester_country_code, requester_vat_number = parse_vat_id( + self.requester_vat_id + ) self.requester_vat_id = f"{requester_country_code}{requester_vat_number}" country_code, vat_number = parse_vat_id(self.customer_vat_id) self.customer_vat_id = f"{country_code}{vat_number}" - result = check_vat_approx( - country_code, vat_number, requester_country_code, requester_vat_number + + def after_insert(self): + frappe.enqueue( + run_check, + doc=self, + queue="long", + now=frappe.conf.developer_mode or frappe.flags.in_test, ) - self.is_valid = result.valid - self.request_id = result.requestIdentifier + + +def run_check(doc: VATIDCheck): + doc.db_set("status", "Running", notify=True) + requester_country_code, requester_vat_number = None, None + if doc.requester_vat_id: + requester_country_code, requester_vat_number = parse_vat_id(doc.requester_vat_id) + + country_code, vat_number = parse_vat_id(doc.customer_vat_id) + result = check_vat_approx( + country_code, vat_number, requester_country_code, requester_vat_number + ) + doc.db_set( + { + "status": "Completed", + "is_valid": result.valid, + "request_id": result.requestIdentifier, + }, + notify=True, + ) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js index cd98831..bcb4e92 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js @@ -2,8 +2,14 @@ frappe.listview_settings["VAT ID Check"] = { add_fields: ["is_valid"], hide_name_column: true, get_indicator: function (doc) { - return doc.is_valid === 1 + if (doc.status === "Completed") { + return doc.is_valid === 1 ? [__("Valid"), "green", "is_valid,=,Yes"] : [__("Invalid"), "red", "is_valid,=,No"]; + } else if (doc.status === "Planned") { + return [__("Planned"), "blue", "status,=,Planned"]; + } else if (doc.status === "Running") { + return [__("Running"), "yellow", "status,=,Running"]; + } }, }; From 9237c9198001f1ac89ce9eddcc742cad0b465dc9 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Tue, 13 Jun 2023 19:42:58 +0200 Subject: [PATCH 15/25] fix: increase max retry wait Try for about two minutes before giving up --- erpnext_germany/utils/eu_vat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext_germany/utils/eu_vat.py b/erpnext_germany/utils/eu_vat.py index 7162112..00a9014 100644 --- a/erpnext_germany/utils/eu_vat.py +++ b/erpnext_germany/utils/eu_vat.py @@ -44,7 +44,7 @@ def check_vat(country_code: str, vat_number: str): retry_if_exception_message(message="TIMEOUT"), ), stop=stop_after_attempt(3), - wait=wait_exponential(multiplier=1, min=2, max=8), + wait=wait_exponential(multiplier=1, min=2, max=64), ) def check_vat_approx( country_code, vat_number, requester_country_code=None, requester_vat_number=None From 91e77903993ddbe9a444326a61e03f921291a10a Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 11 Jul 2023 00:26:54 +0200 Subject: [PATCH 16/25] feat: check trader name and address --- .../doctype/vat_id_check/vat_id_check.json | 73 ++++++++++++++++++- .../doctype/vat_id_check/vat_id_check.py | 13 +++- erpnext_germany/tasks.py | 41 ++++++----- erpnext_germany/utils/eu_vat.py | 13 +++- 4 files changed, 116 insertions(+), 24 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 60192ee..9d6d1b7 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -7,15 +7,24 @@ "engine": "InnoDB", "field_order": [ "customer", - "status", - "column_break_hmgxr", "customer_vat_id", + "trader_name", + "customer_address", + "trader_street", + "trader_postcode", + "trader_city", + "column_break_hmgxr", + "status", "section_break_xljfy", "company", "column_break_scjlu", "requester_vat_id", "section_break_dowxn", "is_valid", + "trader_name_match", + "trader_street_match", + "trader_postcode_match", + "trader_city_match", "column_break_c4uco", "request_id" ], @@ -98,10 +107,68 @@ "label": "Status", "options": "Planned\nRunning\nCompleted", "read_only": 1 + }, + { + "fieldname": "customer_address", + "fieldtype": "Link", + "label": "Customer Address", + "options": "Address" + }, + { + "fetch_from": "customer.customer_name", + "fetch_if_empty": 1, + "fieldname": "trader_name", + "fieldtype": "Data", + "label": "Trader Name" + }, + { + "fetch_from": "customer_address.address_line1", + "fetch_if_empty": 1, + "fieldname": "trader_street", + "fieldtype": "Data", + "label": "Trader Street" + }, + { + "fetch_from": "customer_address.pincode", + "fetch_if_empty": 1, + "fieldname": "trader_postcode", + "fieldtype": "Data", + "label": "Trader Postcode" + }, + { + "fetch_from": "customer_address.city", + "fetch_if_empty": 1, + "fieldname": "trader_city", + "fieldtype": "Data", + "label": "Trader City" + }, + { + "default": "0", + "fieldname": "trader_name_match", + "fieldtype": "Check", + "label": "Trader Name Match" + }, + { + "default": "0", + "fieldname": "trader_street_match", + "fieldtype": "Check", + "label": "Trader Street Match" + }, + { + "default": "0", + "fieldname": "trader_postcode_match", + "fieldtype": "Check", + "label": "Trader Postcode Match" + }, + { + "default": "0", + "fieldname": "trader_city_match", + "fieldtype": "Check", + "label": "Trader City Match" } ], "links": [], - "modified": "2023-06-13 19:08:12.049107", + "modified": "2023-07-10 23:59:04.133772", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index 6a43506..470ac37 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -34,13 +34,24 @@ def run_check(doc: VATIDCheck): country_code, vat_number = parse_vat_id(doc.customer_vat_id) result = check_vat_approx( - country_code, vat_number, requester_country_code, requester_vat_number + country_code=country_code, + vat_number=vat_number, + trader_name=doc.trader_name, + trader_street=doc.trader_street, + trader_postcode=doc.trader_postcode, + trader_city=doc.trader_city, + requester_country_code=requester_country_code, + requester_vat_number=requester_vat_number ) doc.db_set( { "status": "Completed", "is_valid": result.valid, "request_id": result.requestIdentifier, + "trader_name_match": result.traderNameMatch, + "trader_street_match": result.traderStreetMatch, + "trader_postcode_match": result.traderPostcodeMatch, + "trader_city_match": result.traderCityMatch, }, notify=True, ) diff --git a/erpnext_germany/tasks.py b/erpnext_germany/tasks.py index 4470a54..3393f65 100644 --- a/erpnext_germany/tasks.py +++ b/erpnext_germany/tasks.py @@ -6,20 +6,6 @@ def all(): check_some_customers() -def create_vat_id_check( - customer: str, tax_id: str, company: str, company_tax_id: str -) -> str: - """Create a VAT ID check document and return its name.""" - doc = frappe.new_doc("VAT ID Check") - doc.customer = customer - doc.tax_id = tax_id - doc.company = company - doc.company_tax_id = company_tax_id - doc.insert(ignore_permissions=True) - - return doc.name - - def get_customers(n=4): """Return a list of n customers who didn't have their VAT ID checked in the last 3 months.""" from pypika import functions as fn, Interval @@ -40,7 +26,12 @@ def get_customers(n=4): frappe.qb.from_(customers) .left_join(last_check) .on(customers.name == last_check.customer) - .select(customers.name, customers.tax_id) + .select( + customers.name, + customers.customer_name, + customers.customer_primary_address, + customers.tax_id + ) .where( customers.tax_id.notnull() & (customers.disabled == 0) @@ -56,9 +47,21 @@ def get_customers(n=4): def check_some_customers(): """Check VAT IDs of customers who didn't have their VAT ID checked in the last 3 months.""" - company_tax_id = None + requester_vat_id = None if company := get_default_company(): - company_tax_id = frappe.get_cached_value("Company", company, "tax_id") + requester_vat_id = frappe.get_cached_value("Company", company, "tax_id") + + for customer, customer_name, primary_address, vat_id in get_customers(): + doc = frappe.new_doc("VAT ID Check") + doc.customer = customer + doc.trader_name = customer_name + doc.customer_vat_id = vat_id + doc.company = company + doc.requester_vat_id = requester_vat_id + if primary_address: + address = frappe.get_doc("Address", primary_address) + doc.trader_street = address.address_line1 + doc.trader_postcode = address.pincode + doc.trader_city = address.city - for customer, tax_id in get_customers(): - create_vat_id_check(customer, tax_id, company_tax_id) + doc.insert(ignore_permissions=True) diff --git a/erpnext_germany/utils/eu_vat.py b/erpnext_germany/utils/eu_vat.py index 00a9014..6e8e5a3 100644 --- a/erpnext_germany/utils/eu_vat.py +++ b/erpnext_germany/utils/eu_vat.py @@ -47,11 +47,22 @@ def check_vat(country_code: str, vat_number: str): wait=wait_exponential(multiplier=1, min=2, max=64), ) def check_vat_approx( - country_code, vat_number, requester_country_code=None, requester_vat_number=None + country_code: str, + vat_number: str, + trader_name: str | None = None, + trader_street: str | None = None, + trader_postcode: str | None = None, + trader_city: str | None = None, + requester_country_code: str | None = None, + requester_vat_number: str | None = None, ): return Client(WSDL_URL).service.checkVatApprox( countryCode=country_code, vatNumber=vat_number, + traderName=trader_name, + traderStreet=trader_street, + traderPostcode=trader_postcode, + traderCity=trader_city, requesterCountryCode=requester_country_code, requesterVatNumber=requester_vat_number, ) From 6320e318d4e43c16bed3bbdc559ed3b98457366b Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 11 Jul 2023 00:37:57 +0200 Subject: [PATCH 17/25] fix: handle RetryError --- .../doctype/vat_id_check/vat_id_check.json | 4 +-- .../doctype/vat_id_check/vat_id_check.py | 27 ++++++++++++------- .../doctype/vat_id_check/vat_id_check_list.js | 2 ++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 9d6d1b7..f2a3981 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -105,7 +105,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Planned\nRunning\nCompleted", + "options": "Planned\nRunning\nCompleted\nUnavailable", "read_only": 1 }, { @@ -168,7 +168,7 @@ } ], "links": [], - "modified": "2023-07-10 23:59:04.133772", + "modified": "2023-07-11 00:31:49.194157", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index 470ac37..d4fdef7 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -5,6 +5,8 @@ from frappe.model.document import Document from erpnext_germany.utils.eu_vat import check_vat_approx, parse_vat_id +from tenacity import RetryError + class VATIDCheck(Document): def before_insert(self): @@ -33,16 +35,21 @@ def run_check(doc: VATIDCheck): requester_country_code, requester_vat_number = parse_vat_id(doc.requester_vat_id) country_code, vat_number = parse_vat_id(doc.customer_vat_id) - result = check_vat_approx( - country_code=country_code, - vat_number=vat_number, - trader_name=doc.trader_name, - trader_street=doc.trader_street, - trader_postcode=doc.trader_postcode, - trader_city=doc.trader_city, - requester_country_code=requester_country_code, - requester_vat_number=requester_vat_number - ) + try: + result = check_vat_approx( + country_code=country_code, + vat_number=vat_number, + trader_name=doc.trader_name, + trader_street=doc.trader_street, + trader_postcode=doc.trader_postcode, + trader_city=doc.trader_city, + requester_country_code=requester_country_code, + requester_vat_number=requester_vat_number + ) + except RetryError: + doc.db_set("status", "Service Unavailable", notify=True) + return + doc.db_set( { "status": "Completed", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js index bcb4e92..d3baf59 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js @@ -10,6 +10,8 @@ frappe.listview_settings["VAT ID Check"] = { return [__("Planned"), "blue", "status,=,Planned"]; } else if (doc.status === "Running") { return [__("Running"), "yellow", "status,=,Running"]; + } else if (doc.status === "Service Unavailable") { + return [__("Service Unavailable"), "gray", "status,=,Service Unavailable"]; } }, }; From 823a590fb6033bd7ff042fca0dd0a32a8dcaf6d7 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 11 Jul 2023 15:35:52 +0200 Subject: [PATCH 18/25] feat: improve trader address and name matching --- .../doctype/vat_id_check/vat_id_check.json | 45 ++++++++++++++----- .../doctype/vat_id_check/vat_id_check.py | 20 +++++++-- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index f2a3981..20f5bfb 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -26,7 +26,9 @@ "trader_postcode_match", "trader_city_match", "column_break_c4uco", - "request_id" + "request_id", + "actual_trader_name", + "actual_trader_address" ], "fields": [ { @@ -112,63 +114,84 @@ "fieldname": "customer_address", "fieldtype": "Link", "label": "Customer Address", - "options": "Address" + "options": "Address", + "set_only_once": 1 }, { "fetch_from": "customer.customer_name", "fetch_if_empty": 1, "fieldname": "trader_name", "fieldtype": "Data", - "label": "Trader Name" + "label": "Trader Name", + "set_only_once": 1 }, { "fetch_from": "customer_address.address_line1", "fetch_if_empty": 1, "fieldname": "trader_street", "fieldtype": "Data", - "label": "Trader Street" + "label": "Trader Street", + "set_only_once": 1 }, { "fetch_from": "customer_address.pincode", "fetch_if_empty": 1, "fieldname": "trader_postcode", "fieldtype": "Data", - "label": "Trader Postcode" + "label": "Trader Postcode", + "set_only_once": 1 }, { "fetch_from": "customer_address.city", "fetch_if_empty": 1, "fieldname": "trader_city", "fieldtype": "Data", - "label": "Trader City" + "label": "Trader City", + "set_only_once": 1 }, { "default": "0", "fieldname": "trader_name_match", "fieldtype": "Check", - "label": "Trader Name Match" + "label": "Trader Name Match", + "read_only": 1 }, { "default": "0", "fieldname": "trader_street_match", "fieldtype": "Check", - "label": "Trader Street Match" + "label": "Trader Street Match", + "read_only": 1 }, { "default": "0", "fieldname": "trader_postcode_match", "fieldtype": "Check", - "label": "Trader Postcode Match" + "label": "Trader Postcode Match", + "read_only": 1 }, { "default": "0", "fieldname": "trader_city_match", "fieldtype": "Check", - "label": "Trader City Match" + "label": "Trader City Match", + "read_only": 1 + }, + { + "fieldname": "actual_trader_name", + "fieldtype": "Data", + "label": "Actual Trader Name", + "read_only": 1 + }, + { + "fieldname": "actual_trader_address", + "fieldtype": "Small Text", + "label": "Actual Trader Address", + "read_only": 1 } ], "links": [], - "modified": "2023-07-11 00:31:49.194157", + "modified": "2023-07-11 15:26:16.264105", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index d4fdef7..b305ff3 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -54,11 +54,23 @@ def run_check(doc: VATIDCheck): { "status": "Completed", "is_valid": result.valid, + "trader_name_match": is_match(result.traderNameMatch, result.traderName, doc.trader_name, exact=True), + "trader_street_match": is_match(result.traderStreetMatch, result.traderAddress, doc.trader_street), + "trader_postcode_match": is_match(result.traderPostcodeMatch, result.traderAddress, doc.trader_postcode), + "trader_city_match": is_match(result.traderCityMatch, result.traderAddress, doc.trader_city), "request_id": result.requestIdentifier, - "trader_name_match": result.traderNameMatch, - "trader_street_match": result.traderStreetMatch, - "trader_postcode_match": result.traderPostcodeMatch, - "trader_city_match": result.traderCityMatch, + "actual_trader_name": result.traderName, + "actual_trader_address": result.traderAddress, }, notify=True, ) + + +def is_match(match, theirs, ours, exact=False): + if match is not None: + return bool(match) + + if exact: + return ours.lower() == theirs.lower() + + return ours.lower() in theirs.lower() From 9a0cf1dc35477625ac97be099b224c5dee73d969 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 11 Jul 2023 15:46:42 +0200 Subject: [PATCH 19/25] feat: handle invalid input, improve list view --- .../doctype/vat_id_check/vat_id_check.json | 17 +++++++++++++---- .../doctype/vat_id_check/vat_id_check.py | 5 +++++ .../doctype/vat_id_check/vat_id_check_list.js | 6 +++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 20f5bfb..e14b12d 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -34,7 +34,7 @@ { "fieldname": "customer", "fieldtype": "Link", - "in_list_view": 1, + "in_standard_filter": 1, "label": "Customer", "options": "Customer", "set_only_once": 1 @@ -48,6 +48,7 @@ "fieldtype": "Data", "in_list_view": 1, "label": "Request ID", + "no_copy": 1, "read_only": 1 }, { @@ -55,6 +56,7 @@ "fieldname": "is_valid", "fieldtype": "Check", "label": "Is Valid", + "no_copy": 1, "read_only": 1 }, { @@ -107,7 +109,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Planned\nRunning\nCompleted\nUnavailable", + "options": "Planned\nRunning\nCompleted\nUnavailable\nInvalid Input", "read_only": 1 }, { @@ -122,6 +124,7 @@ "fetch_if_empty": 1, "fieldname": "trader_name", "fieldtype": "Data", + "in_list_view": 1, "label": "Trader Name", "set_only_once": 1 }, @@ -154,6 +157,7 @@ "fieldname": "trader_name_match", "fieldtype": "Check", "label": "Trader Name Match", + "no_copy": 1, "read_only": 1 }, { @@ -161,6 +165,7 @@ "fieldname": "trader_street_match", "fieldtype": "Check", "label": "Trader Street Match", + "no_copy": 1, "read_only": 1 }, { @@ -168,6 +173,7 @@ "fieldname": "trader_postcode_match", "fieldtype": "Check", "label": "Trader Postcode Match", + "no_copy": 1, "read_only": 1 }, { @@ -175,23 +181,26 @@ "fieldname": "trader_city_match", "fieldtype": "Check", "label": "Trader City Match", + "no_copy": 1, "read_only": 1 }, { "fieldname": "actual_trader_name", "fieldtype": "Data", "label": "Actual Trader Name", + "no_copy": 1, "read_only": 1 }, { "fieldname": "actual_trader_address", "fieldtype": "Small Text", "label": "Actual Trader Address", + "no_copy": 1, "read_only": 1 } ], "links": [], - "modified": "2023-07-11 15:26:16.264105", + "modified": "2023-07-11 15:44:25.409571", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", @@ -247,5 +256,5 @@ "sort_field": "creation", "sort_order": "DESC", "states": [], - "title_field": "customer" + "title_field": "customer_vat_id" } \ No newline at end of file diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index b305ff3..9324b38 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -49,6 +49,11 @@ def run_check(doc: VATIDCheck): except RetryError: doc.db_set("status", "Service Unavailable", notify=True) return + except Exception as e: + if e.message.upper() == "INVALID_INPUT": + doc.db_set({"status": "Invalid Input", "is_valid": False}, notify=True) + return + raise e doc.db_set( { diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js index d3baf59..8a5ef26 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check_list.js @@ -1,6 +1,6 @@ frappe.listview_settings["VAT ID Check"] = { add_fields: ["is_valid"], - hide_name_column: true, + hide_name_column: true, get_indicator: function (doc) { if (doc.status === "Completed") { return doc.is_valid === 1 @@ -10,8 +10,8 @@ frappe.listview_settings["VAT ID Check"] = { return [__("Planned"), "blue", "status,=,Planned"]; } else if (doc.status === "Running") { return [__("Running"), "yellow", "status,=,Running"]; - } else if (doc.status === "Service Unavailable") { - return [__("Service Unavailable"), "gray", "status,=,Service Unavailable"]; + } else if (["Service Unavailable", "Invalid Input"].includes(doc.status)) { + return [__(doc.status), "gray", `status,=,${doc.status}`]; } }, }; From 287d28cfab4ef56f42cd5d98172d40d55994dee9 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 18:47:18 +0200 Subject: [PATCH 20/25] refactor: better parameter name Co-authored-by: Marica --- erpnext_germany/tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext_germany/tasks.py b/erpnext_germany/tasks.py index 3393f65..db9341a 100644 --- a/erpnext_germany/tasks.py +++ b/erpnext_germany/tasks.py @@ -6,7 +6,7 @@ def all(): check_some_customers() -def get_customers(n=4): +def get_customers(batch_size=4): """Return a list of n customers who didn't have their VAT ID checked in the last 3 months.""" from pypika import functions as fn, Interval from frappe.query_builder import DocType @@ -40,7 +40,7 @@ def get_customers(n=4): | (last_check.creation < fn.Now() - Interval(months=3)) ) ) - .limit(n) + .limit(batch_size) .run() ) From e9ee9134bf873e09a85363347a16797d14314ba4 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 18:53:28 +0200 Subject: [PATCH 21/25] fix: log other errors --- .../erpnext_germany/doctype/vat_id_check/vat_id_check.json | 4 ++-- .../erpnext_germany/doctype/vat_id_check/vat_id_check.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index e14b12d..6f05e04 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -109,7 +109,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Planned\nRunning\nCompleted\nUnavailable\nInvalid Input", + "options": "Planned\nRunning\nCompleted\nService Unavailable\nInvalid Input\nError", "read_only": 1 }, { @@ -200,7 +200,7 @@ } ], "links": [], - "modified": "2023-07-11 15:44:25.409571", + "modified": "2023-07-14 18:51:09.693063", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index 9324b38..ed6aaf5 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -52,8 +52,11 @@ def run_check(doc: VATIDCheck): except Exception as e: if e.message.upper() == "INVALID_INPUT": doc.db_set({"status": "Invalid Input", "is_valid": False}, notify=True) - return - raise e + else: + doc.db_set({"status": "Error"}, notify=True) + frappe.log_error("VAT ID Check Error", frappe.get_traceback()) + + return doc.db_set( { From de809c5681d0da2b3a62e32833e42ae494f22eba Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 18:56:19 +0200 Subject: [PATCH 22/25] fix: handle ValueError --- .../doctype/vat_id_check/vat_id_check.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index ed6aaf5..04b559e 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -32,9 +32,18 @@ def run_check(doc: VATIDCheck): doc.db_set("status", "Running", notify=True) requester_country_code, requester_vat_number = None, None if doc.requester_vat_id: - requester_country_code, requester_vat_number = parse_vat_id(doc.requester_vat_id) + try: + requester_country_code, requester_vat_number = parse_vat_id(doc.requester_vat_id) + except ValueError: + doc.db_set({"status": "Invalid Input", "is_valid": False}, notify=True) + return + + try: + country_code, vat_number = parse_vat_id(doc.customer_vat_id) + except ValueError: + doc.db_set({"status": "Invalid Input", "is_valid": False}, notify=True) + return - country_code, vat_number = parse_vat_id(doc.customer_vat_id) try: result = check_vat_approx( country_code=country_code, From aaf7dd326f80e50fe770d97f83d2d513a4f6ee1c Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 19:28:18 +0200 Subject: [PATCH 23/25] feat: better doctype layout --- .../doctype/vat_id_check/vat_id_check.json | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json index 6f05e04..242c164 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.json @@ -8,27 +8,29 @@ "field_order": [ "customer", "customer_vat_id", - "trader_name", "customer_address", + "column_break_hmgxr", + "status", + "section_break_6ctcl", + "trader_name", "trader_street", "trader_postcode", "trader_city", - "column_break_hmgxr", - "status", + "column_break_cxvts", + "trader_name_match", + "trader_street_match", + "trader_postcode_match", + "trader_city_match", + "column_break_cjvyk", + "actual_trader_name", + "actual_trader_address", "section_break_xljfy", "company", "column_break_scjlu", "requester_vat_id", "section_break_dowxn", "is_valid", - "trader_name_match", - "trader_street_match", - "trader_postcode_match", - "trader_city_match", - "column_break_c4uco", - "request_id", - "actual_trader_name", - "actual_trader_address" + "request_id" ], "fields": [ { @@ -81,10 +83,6 @@ "fieldtype": "Section Break", "label": "Result" }, - { - "fieldname": "column_break_c4uco", - "fieldtype": "Column Break" - }, { "fetch_from": "customer.tax_id", "fetch_if_empty": 1, @@ -197,10 +195,22 @@ "label": "Actual Trader Address", "no_copy": 1, "read_only": 1 + }, + { + "fieldname": "section_break_6ctcl", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_cxvts", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_cjvyk", + "fieldtype": "Column Break" } ], "links": [], - "modified": "2023-07-14 18:51:09.693063", + "modified": "2023-07-14 19:27:17.103880", "modified_by": "Administrator", "module": "ERPNext Germany", "name": "VAT ID Check", From 9a6b1d4512495234d9d92d91e5c47629e8678052 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 19:29:30 +0200 Subject: [PATCH 24/25] feat: do less magic --- .../doctype/vat_id_check/vat_id_check.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py index 04b559e..17822f8 100644 --- a/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py +++ b/erpnext_germany/erpnext_germany/doctype/vat_id_check/vat_id_check.py @@ -71,23 +71,13 @@ def run_check(doc: VATIDCheck): { "status": "Completed", "is_valid": result.valid, - "trader_name_match": is_match(result.traderNameMatch, result.traderName, doc.trader_name, exact=True), - "trader_street_match": is_match(result.traderStreetMatch, result.traderAddress, doc.trader_street), - "trader_postcode_match": is_match(result.traderPostcodeMatch, result.traderAddress, doc.trader_postcode), - "trader_city_match": is_match(result.traderCityMatch, result.traderAddress, doc.trader_city), + "trader_name_match": bool(result.traderNameMatch), + "trader_street_match": bool(result.traderStreetMatch), + "trader_postcode_match": bool(result.traderPostcodeMatch), + "trader_city_match": bool(result.traderCityMatch), "request_id": result.requestIdentifier, "actual_trader_name": result.traderName, "actual_trader_address": result.traderAddress, }, notify=True, ) - - -def is_match(match, theirs, ours, exact=False): - if match is not None: - return bool(match) - - if exact: - return ours.lower() == theirs.lower() - - return ours.lower() in theirs.lower() From cbff07ef4485ffc331d0d8df711b7ca4097b17fd Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 14 Jul 2023 19:35:57 +0200 Subject: [PATCH 25/25] feat: remove custom records on uninstall --- erpnext_germany/uninstall.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext_germany/uninstall.py b/erpnext_germany/uninstall.py index dbbe8eb..6ba5a73 100644 --- a/erpnext_germany/uninstall.py +++ b/erpnext_germany/uninstall.py @@ -4,6 +4,7 @@ def before_uninstall(): remove_custom_fields() remove_property_setters() + remove_custom_records() def remove_custom_fields(): @@ -35,3 +36,10 @@ def remove_property_setters(): "value": ps[-2] } ) + + +def remove_custom_records(): + print("* removing custom records...") + for record in frappe.get_hooks("germany_custom_records"): + doctype = record.pop("doctype") + frappe.db.delete(doctype, record)