feat: validate sales invoice for germany
diff --git a/erpnext/regional/germany/accounts_controller.py b/erpnext/regional/germany/accounts_controller.py
new file mode 100644
index 0000000..193c8e1
--- /dev/null
+++ b/erpnext/regional/germany/accounts_controller.py
@@ -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
+		)
+	)