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