From 1a4d7ad9376bc790c0479c1eac6b8d0877da9867 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 20 Feb 2026 20:09:18 +0530 Subject: [PATCH] fix: correct ordered_qty and requested_qty for Sales Order Item through a patch --- erpnext/patches.txt | 3 +- ...ty_and_requested_qty_based_on_mr_and_po.py | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index bbb33de29db..9a7697d74ff 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -467,4 +467,5 @@ erpnext.patches.v16_0.update_company_custom_field_in_bin erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v16_0.migrate_asset_type_checkboxes_to_select erpnext.patches.v15_0.delete_quotation_lost_record_detail -erpnext.patches.v16_0.add_portal_redirects \ No newline at end of file +erpnext.patches.v16_0.add_portal_redirects +erpnext.patches.v16_0.update_order_qty_and_requested_qty_based_on_mr_and_po \ No newline at end of file diff --git a/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py new file mode 100644 index 00000000000..47bb94dcc88 --- /dev/null +++ b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py @@ -0,0 +1,39 @@ +import frappe +from frappe.query_builder import DocType +from frappe.query_builder.functions import Sum + + +def execute(): + PurchaseOrderItem = DocType("Purchase Order Item") + MaterialRequestItem = DocType("Material Request Item") + + poi_query = ( + frappe.qb.from_(PurchaseOrderItem) + .select(PurchaseOrderItem.sales_order_item, Sum(PurchaseOrderItem.qty)) + .where(PurchaseOrderItem.sales_order_item.isnotnull() & PurchaseOrderItem.docstatus != 2) + .groupby(PurchaseOrderItem.sales_order_item) + ) + + mri_query = ( + frappe.qb.from_(MaterialRequestItem) + .select(MaterialRequestItem.sales_order_item, Sum(MaterialRequestItem.qty)) + .where(MaterialRequestItem.sales_order_item.isnotnull() & MaterialRequestItem.docstatus != 2) + .groupby(MaterialRequestItem.sales_order_item) + ) + + poi_data = poi_query.run() + mri_data = mri_query.run() + + updates_against_poi = {} + updates_against_mri = {} + + for data in poi_data: + updates_against_poi[data[0]] = {"ordered_qty": data[1]} + + for data in mri_data: + updates_against_mri[data[0]] = {"requested_qty": data[1], "ordered_qty": 0} + + frappe.db.auto_commit_on_many_writes = 1 + frappe.db.bulk_update("Sales Order Item", updates_against_mri) + frappe.db.bulk_update("Sales Order Item", updates_against_poi) + frappe.db.auto_commit_on_many_writes = 0