diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 7e68ec1fcb..3a59d3c8b2 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -333,3 +333,4 @@ erpnext.patches.v14_0.migrate_gl_to_payment_ledger execute:frappe.delete_doc_if_exists("Report", "Tax Detail") erpnext.patches.v15_0.enable_all_leads erpnext.patches.v14_0.update_company_in_ldc +erpnext.patches.v14_0.set_packed_qty_in_draft_delivery_notes diff --git a/erpnext/patches/v14_0/set_packed_qty_in_draft_delivery_notes.py b/erpnext/patches/v14_0/set_packed_qty_in_draft_delivery_notes.py new file mode 100644 index 0000000000..1aeb2e6cc3 --- /dev/null +++ b/erpnext/patches/v14_0/set_packed_qty_in_draft_delivery_notes.py @@ -0,0 +1,60 @@ +# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +import frappe +from frappe.query_builder.functions import Sum + + +def execute(): + ps = frappe.qb.DocType("Packing Slip") + dn = frappe.qb.DocType("Delivery Note") + ps_item = frappe.qb.DocType("Packing Slip Item") + + ps_details = ( + frappe.qb.from_(ps) + .join(ps_item) + .on(ps.name == ps_item.parent) + .join(dn) + .on(ps.delivery_note == dn.name) + .select( + dn.name.as_("delivery_note"), + ps_item.item_code.as_("item_code"), + Sum(ps_item.qty).as_("packed_qty"), + ) + .where((ps.docstatus == 1) & (dn.docstatus == 0)) + .groupby(dn.name, ps_item.item_code) + ).run(as_dict=True) + + if ps_details: + dn_list = set() + item_code_list = set() + for ps_detail in ps_details: + dn_list.add(ps_detail.delivery_note) + item_code_list.add(ps_detail.item_code) + + dn_item = frappe.qb.DocType("Delivery Note Item") + dn_item_query = ( + frappe.qb.from_(dn_item) + .select( + dn.parent.as_("delivery_note"), + dn_item.name, + dn_item.item_code, + dn_item.qty, + ) + .where((dn_item.parent.isin(dn_list)) & (dn_item.item_code.isin(item_code_list))) + ) + + dn_details = frappe._dict() + for r in dn_item_query.run(as_dict=True): + dn_details.setdefault((r.delivery_note, r.item_code), frappe._dict()).setdefault(r.name, r.qty) + + for ps_detail in ps_details: + dn_items = dn_details.get((ps_detail.delivery_note, ps_detail.item_code)) + + if dn_items: + remaining_qty = ps_detail.packed_qty + for name, qty in dn_items.items(): + if remaining_qty > 0: + row_packed_qty = min(qty, remaining_qty) + frappe.db.set_value("Delivery Note Item", name, "packed_qty", row_packed_qty) + remaining_qty -= row_packed_qty