From bbcb65894b4d957e45b03bb7d170a71e021c967c Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Sun, 30 Apr 2023 08:04:02 +0530 Subject: [PATCH] refactor: use `get_product_bundle_list()` to get all product bundle at once --- .../doctype/delivery_note/delivery_note.py | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 2a3f9fcc0b..ce33d26faf 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -308,11 +308,19 @@ class DeliveryNote(SellingController): def validate_packed_qty(self): """Validate that if packed qty exists, it should be equal to qty""" - for item in self.items + self.packed_items: - if item.packed_qty and item.packed_qty != item.qty: - frappe.throw( - _("Row {0}: Packed Qty must be equal to {1} Qty.").format(item.idx, frappe.bold(item.doctype)) - ) + if frappe.db.exists("Packing Slip", {"docstatus": 1, "delivery_note": self.name}): + product_bundle_list = self.get_product_bundle_list() + for item in self.items + self.packed_items: + if ( + item.item_code not in product_bundle_list + and flt(item.packed_qty) + and flt(item.packed_qty) != flt(item.qty) + ): + frappe.throw( + _("Row {0}: Packed Qty must be equal to {1} Qty.").format( + item.idx, frappe.bold(item.doctype) + ) + ) def update_pick_list_status(self): from erpnext.stock.doctype.pick_list.pick_list import update_pick_list_status @@ -391,19 +399,22 @@ class DeliveryNote(SellingController): ) def has_unpacked_items(self): - for item in self.items: - if ( - not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}) - and item.packed_qty < item.qty - ): - return True + product_bundle_list = self.get_product_bundle_list() - for item in self.packed_items: - if item.packed_qty < item.qty: + for item in self.items + self.packed_items: + if item.item_code not in product_bundle_list and flt(item.packed_qty) < flt(item.qty): return True return False + def get_product_bundle_list(self): + items_list = [item.item_code for item in self.items] + return frappe.db.get_all( + "Product Bundle", + filters={"new_item_code": ["in", items_list]}, + pluck="name", + ) + def update_billed_amount_based_on_so(so_detail, update_modified=True): from frappe.query_builder.functions import Sum @@ -724,7 +735,7 @@ def make_packing_slip(source_name, target_doc=None): "postprocess": update_item, "condition": lambda item: ( not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}) - and item.packed_qty < item.qty + and flt(item.packed_qty) < flt(item.qty) ), }, "Packed Item": { @@ -738,7 +749,7 @@ def make_packing_slip(source_name, target_doc=None): "name": "pi_detail", }, "postprocess": update_item, - "condition": lambda item: (item.packed_qty < item.qty), + "condition": lambda item: (flt(item.packed_qty) < flt(item.qty)), }, }, target_doc,