From 34df6e39dcca685b6b107c5f0631721d7156768c Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Sat, 17 Aug 2024 02:27:36 +0200
Subject: [PATCH 1/2] fix(Delivery Note): translatability of validation errors
---
.../doctype/delivery_note/delivery_note.py | 70 ++++++++-----------
1 file changed, 30 insertions(+), 40 deletions(-)
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index c3622d7a0b0..6ca4c36151f 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -361,52 +361,42 @@ class DeliveryNote(SellingController):
self.validate_sales_invoice_references()
def validate_sales_order_references(self):
- err_msg = ""
+ errors = []
for item in self.items:
- if (item.against_sales_order and not item.so_detail) or (
- not item.against_sales_order and item.so_detail
- ):
- if not item.against_sales_order:
- err_msg += (
- _("'Sales Order' reference ({1}) is missing in row {0}").format(
- frappe.bold(item.idx), frappe.bold("against_sales_order")
- )
- + "
"
- )
- else:
- err_msg += (
- _("'Sales Order Item' reference ({1}) is missing in row {0}").format(
- frappe.bold(item.idx), frappe.bold("so_detail")
- )
- + "
"
- )
+ missing_label = None
+ if item.against_sales_order and not item.so_detail:
+ missing_label = item.meta.get_label("so_detail")
+ elif item.so_detail and not item.against_sales_order:
+ missing_label = item.meta.get_label("against_sales_order")
- if err_msg:
- frappe.throw(err_msg, title=_("References to Sales Orders are Incomplete"))
+ if missing_label and missing_label != "No Label":
+ errors.append(
+ _("The field {0} in row {1} is not set").format(
+ frappe.bold(_(missing_label)), frappe.bold(item.idx)
+ )
+ )
+
+ if errors:
+ frappe.throw("
".join(errors), title=_("References to Sales Orders are Incomplete"))
def validate_sales_invoice_references(self):
- err_msg = ""
+ errors = []
for item in self.items:
- if (item.against_sales_invoice and not item.si_detail) or (
- not item.against_sales_invoice and item.si_detail
- ):
- if not item.against_sales_invoice:
- err_msg += (
- _("'Sales Invoice' reference ({1}) is missing in row {0}").format(
- frappe.bold(item.idx), frappe.bold("against_sales_invoice")
- )
- + "
"
- )
- else:
- err_msg += (
- _("'Sales Invoice Item' reference ({1}) is missing in row {0}").format(
- frappe.bold(item.idx), frappe.bold("si_detail")
- )
- + "
"
- )
+ missing_label = None
+ if item.against_sales_invoice and not item.si_detail:
+ missing_label = item.meta.get_label("si_detail")
+ elif item.si_detail and not item.against_sales_invoice:
+ missing_label = item.meta.get_label("against_sales_invoice")
- if err_msg:
- frappe.throw(err_msg, title=_("References to Sales Invoices are Incomplete"))
+ if missing_label and missing_label != "No Label":
+ errors.append(
+ _("The field {0} in row {1} is not set").format(
+ frappe.bold(_(missing_label)), frappe.bold(item.idx)
+ )
+ )
+
+ if errors:
+ frappe.throw("
".join(errors), title=_("References to Sales Invoices are Incomplete"))
def validate_proj_cust(self):
"""check for does customer belong to same project as entered.."""
From 08646b7ab7605aa76b1defe691c97070dc54c317 Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Sat, 17 Aug 2024 02:36:16 +0200
Subject: [PATCH 2/2] refactor: extract common validation method
---
.../doctype/delivery_note/delivery_note.py | 35 +++++++------------
1 file changed, 13 insertions(+), 22 deletions(-)
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 6ca4c36151f..16934ca53e2 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -361,32 +361,23 @@ class DeliveryNote(SellingController):
self.validate_sales_invoice_references()
def validate_sales_order_references(self):
- errors = []
- for item in self.items:
- missing_label = None
- if item.against_sales_order and not item.so_detail:
- missing_label = item.meta.get_label("so_detail")
- elif item.so_detail and not item.against_sales_order:
- missing_label = item.meta.get_label("against_sales_order")
-
- if missing_label and missing_label != "No Label":
- errors.append(
- _("The field {0} in row {1} is not set").format(
- frappe.bold(_(missing_label)), frappe.bold(item.idx)
- )
- )
-
- if errors:
- frappe.throw("
".join(errors), title=_("References to Sales Orders are Incomplete"))
+ self._validate_dependent_item_fields(
+ "against_sales_order", "so_detail", _("References to Sales Orders are Incomplete")
+ )
def validate_sales_invoice_references(self):
+ self._validate_dependent_item_fields(
+ "against_sales_invoice", "si_detail", _("References to Sales Invoices are Incomplete")
+ )
+
+ def _validate_dependent_item_fields(self, field_a: str, field_b: str, error_title: str):
errors = []
for item in self.items:
missing_label = None
- if item.against_sales_invoice and not item.si_detail:
- missing_label = item.meta.get_label("si_detail")
- elif item.si_detail and not item.against_sales_invoice:
- missing_label = item.meta.get_label("against_sales_invoice")
+ if item.get(field_a) and not item.get(field_b):
+ missing_label = item.meta.get_label(field_b)
+ elif item.get(field_b) and not item.get(field_a):
+ missing_label = item.meta.get_label(field_a)
if missing_label and missing_label != "No Label":
errors.append(
@@ -396,7 +387,7 @@ class DeliveryNote(SellingController):
)
if errors:
- frappe.throw("
".join(errors), title=_("References to Sales Invoices are Incomplete"))
+ frappe.throw("
".join(errors), title=error_title)
def validate_proj_cust(self):
"""check for does customer belong to same project as entered.."""