Merge pull request #23453 from frappe/validate_regional_germany
feat: validate Sales Invoice for Germany
This commit is contained in:
commit
b3aeba1a1b
@ -19,6 +19,7 @@
|
||||
"is_return",
|
||||
"column_break1",
|
||||
"company",
|
||||
"company_tax_id",
|
||||
"posting_date",
|
||||
"posting_time",
|
||||
"set_posting_time",
|
||||
@ -1941,6 +1942,13 @@
|
||||
"hide_seconds": 1,
|
||||
"label": "Is Internal Customer",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fetch_from": "company.tax_id",
|
||||
"fieldname": "company_tax_id",
|
||||
"fieldtype": "Data",
|
||||
"label": "Company Tax ID",
|
||||
"read_only": 1
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-file-text",
|
||||
|
@ -392,6 +392,9 @@ regional_overrides = {
|
||||
'Italy': {
|
||||
'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.italy.utils.update_itemised_tax_data',
|
||||
'erpnext.controllers.accounts_controller.validate_regional': 'erpnext.regional.italy.utils.sales_invoice_validate',
|
||||
},
|
||||
'Germany': {
|
||||
'erpnext.controllers.accounts_controller.validate_regional': 'erpnext.regional.germany.accounts_controller.validate_regional',
|
||||
}
|
||||
}
|
||||
user_privacy_documents = [
|
||||
|
57
erpnext/regional/germany/accounts_controller.py
Normal file
57
erpnext/regional/germany/accounts_controller.py
Normal file
@ -0,0 +1,57 @@
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe import msgprint
|
||||
|
||||
|
||||
REQUIRED_FIELDS = {
|
||||
"Sales Invoice": [
|
||||
{
|
||||
"field_name": "company_address",
|
||||
"regulation": "§ 14 Abs. 4 Nr. 1 UStG"
|
||||
},
|
||||
{
|
||||
"field_name": "company_tax_id",
|
||||
"regulation": "§ 14 Abs. 4 Nr. 2 UStG"
|
||||
},
|
||||
{
|
||||
"field_name": "taxes",
|
||||
"regulation": "§ 14 Abs. 4 Nr. 8 UStG",
|
||||
"condition": "not exempt_from_sales_tax"
|
||||
},
|
||||
{
|
||||
"field_name": "customer_address",
|
||||
"regulation": "§ 14 Abs. 4 Nr. 1 UStG",
|
||||
"condition": "base_grand_total > 250"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
def validate_regional(doc):
|
||||
"""Check if required fields for this document are present."""
|
||||
required_fields = REQUIRED_FIELDS.get(doc.doctype)
|
||||
if not required_fields:
|
||||
return
|
||||
|
||||
meta = frappe.get_meta(doc.doctype)
|
||||
field_map = {field.fieldname: field.label for field in meta.fields}
|
||||
|
||||
for field in required_fields:
|
||||
condition = field.get("condition")
|
||||
if condition and not frappe.safe_eval(condition, doc.as_dict()):
|
||||
continue
|
||||
|
||||
field_name = field.get("field_name")
|
||||
regulation = field.get("regulation")
|
||||
if field_name and not doc.get(field_name):
|
||||
missing(field_map.get(field_name), regulation)
|
||||
|
||||
|
||||
def missing(field_label, regulation):
|
||||
"""Notify the user that a required field is missing."""
|
||||
context = 'Specific for Germany. Example: Remember to set Company Tax ID. It is required by § 14 Abs. 4 Nr. 2 UStG.'
|
||||
msgprint(_('Remember to set {field_label}. It is required by {regulation}.', context=context).format(
|
||||
field_label=frappe.bold(_(field_label)),
|
||||
regulation=regulation
|
||||
)
|
||||
)
|
Loading…
Reference in New Issue
Block a user