From 8dbe953b8f5d8882b74f0b21006bfd446a4aea27 Mon Sep 17 00:00:00 2001 From: marination Date: Tue, 15 Feb 2022 12:40:39 +0530 Subject: [PATCH 1/5] fix: Update SO via Work Order made from MR (attached to SO) - Add SO Item reference in WO from MR (that was made from SO) (cherry picked from commit 18731622c43f3b8f7d792d4bb4139eb7cdda39d9) (cherry picked from commit bb119c8e52ea5e58bd1969e6c062706ce1fafa6f) --- erpnext/stock/doctype/material_request/material_request.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index d85970665e1..bdbf5e47f03 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -534,6 +534,7 @@ def raise_work_orders(material_request): "stock_uom": d.stock_uom, "expected_delivery_date": d.schedule_date, "sales_order": d.sales_order, + "sales_order_item": d.get("sales_order_item"), "bom_no": get_item_details(d.item_code).bom_no, "material_request": mr.name, "material_request_item": d.name, From 0e3398c761dd392618ff9bc66c60825e4130f13b Mon Sep 17 00:00:00 2001 From: marination Date: Tue, 15 Feb 2022 13:38:15 +0530 Subject: [PATCH 2/5] test: SO > MR > WO flow (cherry picked from commit f9d52e73469ea298e3a2d39d893f2da5e6baf9aa) (cherry picked from commit 2ce07eff7135af17bc773da08a48e1e37697fa0e) --- .../doctype/sales_order/test_sales_order.py | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index c9d857d951f..41ba1126dea 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -6,7 +6,7 @@ import json import frappe import frappe.permissions from frappe.core.doctype.user_permission.test_user_permission import create_user -from frappe.utils import add_days, flt, getdate, nowdate +from frappe.utils import add_days, flt, getdate, nowdate, today from erpnext.controllers.accounts_controller import update_child_qty_rate from erpnext.manufacturing.doctype.blanket_order.test_blanket_order import make_blanket_order @@ -1295,6 +1295,48 @@ class TestSalesOrder(ERPNextTestCase): so.load_from_db() self.assertEqual(so.billing_status, 'Fully Billed') + def test_so_back_updated_from_wo_via_mr(self): + "SO -> MR (Manufacture) -> WO. Test if WO Qty is updated in SO." + from erpnext.stock.doctype.material_request.material_request import raise_work_orders + from erpnext.manufacturing.doctype.work_order.work_order import ( + make_stock_entry as make_se_from_wo, + ) + + so = make_sales_order(item_list=[{"item_code": "_Test FG Item","qty": 2, "rate":100}]) + + mr = make_material_request(so.name) + mr.material_request_type = "Manufacture" + mr.schedule_date = today() + mr.submit() + + # WO from MR + wo_name = raise_work_orders(mr.name)[0] + wo = frappe.get_doc("Work Order", wo_name) + wo.wip_warehouse = "Work In Progress - _TC" + wo.skip_transfer = True + + self.assertEqual(wo.sales_order, so.name) + self.assertEqual(wo.sales_order_item, so.items[0].name) + + wo.submit() + make_stock_entry(item_code="_Test Item", # Stock RM + target="Work In Progress - _TC", + qty=4, basic_rate=100 + ) + make_stock_entry(item_code="_Test Item Home Desktop 100", # Stock RM + target="Work In Progress - _TC", + qty=4, basic_rate=100 + ) + + se = frappe.get_doc(make_se_from_wo(wo.name, "Manufacture", 2)) + se.submit() # Finish WO + + mr.reload() + wo.reload() + so.reload() + self.assertEqual(so.items[0].work_order_qty, wo.produced_qty) + self.assertEqual(mr.status, "Manufactured") + def automatically_fetch_payment_terms(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") accounts_settings.automatically_fetch_payment_terms = enable From b46bd0d9d129ab9669c1691be5af679dea46d8ee Mon Sep 17 00:00:00 2001 From: marination Date: Tue, 15 Feb 2022 14:20:54 +0530 Subject: [PATCH 3/5] chore: Patch to update SO work_order_qty and Linter fix (cherry picked from commit 0ca58d762715fd10c751c4497f3037908f4dfb20) # Conflicts: # erpnext/patches.txt (cherry picked from commit 98ce6a1c8de11cbde34ced2ac12df0824fa9a034) # Conflicts: # erpnext/patches.txt --- erpnext/patches.txt | 9 +++++ .../v14_0/set_work_order_qty_in_so_from_mr.py | 36 +++++++++++++++++++ .../doctype/sales_order/test_sales_order.py | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index e01cc550616..b03f0df30d3 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -349,4 +349,13 @@ erpnext.patches.v13_0.update_sane_transfer_against erpnext.patches.v13_0.enable_provisional_accounting erpnext.patches.v13_0.update_disbursement_account erpnext.patches.v13_0.update_reserved_qty_closed_wo +<<<<<<< HEAD erpnext.patches.v13_0.amazon_mws_deprecation_warning +======= +<<<<<<< HEAD +erpnext.patches.v13_0.amazon_mws_deprecation_warning +======= +erpnext.patches.v14_0.delete_amazon_mws_doctype +erpnext.patches.v14_0.set_work_order_qty_in_so_from_mr +>>>>>>> 0ca58d7627 (chore: Patch to update SO work_order_qty and Linter fix) +>>>>>>> 98ce6a1c8d (chore: Patch to update SO work_order_qty and Linter fix) diff --git a/erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py b/erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py new file mode 100644 index 00000000000..f097ab9297f --- /dev/null +++ b/erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py @@ -0,0 +1,36 @@ +import frappe + + +def execute(): + """ + 1. Get submitted Work Orders with MR, MR Item and SO set + 2. Get SO Item detail from MR Item detail in WO, and set in WO + 3. Update work_order_qty in SO + """ + work_order = frappe.qb.DocType("Work Order") + query = ( + frappe.qb.from_(work_order) + .select( + work_order.name, work_order.produced_qty, + work_order.material_request, + work_order.material_request_item, + work_order.sales_order + ).where( + (work_order.material_request.isnotnull()) + & (work_order.material_request_item.isnotnull()) + & (work_order.sales_order.isnotnull()) + & (work_order.docstatus == 1) + & (work_order.produced_qty > 0) + ) + ) + results = query.run(as_dict=True) + + for row in results: + so_item = frappe.get_value( + "Material Request Item", row.material_request_item, "sales_order_item" + ) + frappe.db.set_value("Work Order", row.name, "sales_order_item", so_item) + + if so_item: + wo = frappe.get_doc("Work Order", row.name) + wo.update_work_order_qty_in_so() diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 41ba1126dea..788a8350caa 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -1297,10 +1297,10 @@ class TestSalesOrder(ERPNextTestCase): def test_so_back_updated_from_wo_via_mr(self): "SO -> MR (Manufacture) -> WO. Test if WO Qty is updated in SO." - from erpnext.stock.doctype.material_request.material_request import raise_work_orders from erpnext.manufacturing.doctype.work_order.work_order import ( make_stock_entry as make_se_from_wo, ) + from erpnext.stock.doctype.material_request.material_request import raise_work_orders so = make_sales_order(item_list=[{"item_code": "_Test FG Item","qty": 2, "rate":100}]) From 6cf1049495c0c228bedf3b19d0fd63b8f6242160 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 16 Feb 2022 17:40:16 +0530 Subject: [PATCH 4/5] chore: Move patch that updates SO from WO to v13 (cherry picked from commit 94a101662304bedd0914ba53d56889954a1db287) # Conflicts: # erpnext/patches.txt --- erpnext/patches.txt | 5 ++++- .../{v14_0 => v13_0}/set_work_order_qty_in_so_from_mr.py | 0 2 files changed, 4 insertions(+), 1 deletion(-) rename erpnext/patches/{v14_0 => v13_0}/set_work_order_qty_in_so_from_mr.py (100%) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index b03f0df30d3..c7f72ec90e2 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -349,8 +349,8 @@ erpnext.patches.v13_0.update_sane_transfer_against erpnext.patches.v13_0.enable_provisional_accounting erpnext.patches.v13_0.update_disbursement_account erpnext.patches.v13_0.update_reserved_qty_closed_wo -<<<<<<< HEAD erpnext.patches.v13_0.amazon_mws_deprecation_warning +<<<<<<< HEAD ======= <<<<<<< HEAD erpnext.patches.v13_0.amazon_mws_deprecation_warning @@ -359,3 +359,6 @@ erpnext.patches.v14_0.delete_amazon_mws_doctype erpnext.patches.v14_0.set_work_order_qty_in_so_from_mr >>>>>>> 0ca58d7627 (chore: Patch to update SO work_order_qty and Linter fix) >>>>>>> 98ce6a1c8d (chore: Patch to update SO work_order_qty and Linter fix) +======= +erpnext.patches.v13_0.set_work_order_qty_in_so_from_mr +>>>>>>> 94a1016623 (chore: Move patch that updates SO from WO to v13) diff --git a/erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py b/erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py similarity index 100% rename from erpnext/patches/v14_0/set_work_order_qty_in_so_from_mr.py rename to erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py From 104d3e1019df5a4490ef90b4af56cbc7f36d831d Mon Sep 17 00:00:00 2001 From: Marica Date: Fri, 18 Feb 2022 19:27:11 +0530 Subject: [PATCH 5/5] fix: Solve merge conflict in patches.txt --- erpnext/patches.txt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index c7f72ec90e2..6aaf9aa33aa 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -350,15 +350,4 @@ erpnext.patches.v13_0.enable_provisional_accounting erpnext.patches.v13_0.update_disbursement_account erpnext.patches.v13_0.update_reserved_qty_closed_wo erpnext.patches.v13_0.amazon_mws_deprecation_warning -<<<<<<< HEAD -======= -<<<<<<< HEAD -erpnext.patches.v13_0.amazon_mws_deprecation_warning -======= -erpnext.patches.v14_0.delete_amazon_mws_doctype -erpnext.patches.v14_0.set_work_order_qty_in_so_from_mr ->>>>>>> 0ca58d7627 (chore: Patch to update SO work_order_qty and Linter fix) ->>>>>>> 98ce6a1c8d (chore: Patch to update SO work_order_qty and Linter fix) -======= erpnext.patches.v13_0.set_work_order_qty_in_so_from_mr ->>>>>>> 94a1016623 (chore: Move patch that updates SO from WO to v13)