From 71412f6877b558a84f5e8a60ba9822a89147d6f0 Mon Sep 17 00:00:00 2001 From: Vishal Date: Wed, 9 Nov 2022 12:47:34 +0530 Subject: [PATCH 1/7] fix: Internal Transfer Material Request cycle and tracking fixed till purchase receipt --- .../doctype/sales_invoice/sales_invoice.py | 2 ++ .../sales_order_item/sales_order_item.json | 15 ++++++++++++++- .../stock/doctype/delivery_note/delivery_note.py | 2 ++ .../delivery_note/delivery_note_dashboard.py | 3 +++ .../delivery_note_item/delivery_note_item.json | 15 ++++++++++++++- .../material_request_dashboard.py | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 62cf0dcfeb..c276be2b00 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2165,6 +2165,8 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): if source.doctype == "Purchase Order Item" and target.doctype == "Sales Order Item": target.purchase_order = source.parent target.purchase_order_item = source.name + target.material_request = source.material_request + target.material_request_item = source.material_request_item if ( source.get("purchase_order") diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 8c7c5520a4..5b0b3958da 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -95,8 +95,10 @@ "item_tax_rate", "transaction_date", "inter_transfer_reference_section", + "material_request", "purchase_order", "column_break_89", + "material_request_item", "purchase_order_item" ], "fields": [ @@ -847,7 +849,18 @@ "label": "quotation_item", "no_copy": 1, "read_only": 1 - } + }, + { + "fieldname": "material_request", + "fieldtype": "Link", + "label": "Material Request", + "options": "Material Request" + }, + { + "fieldname": "material_request_item", + "fieldtype": "Data", + "label": "Material Request Item" + } ], "idx": 1, "istable": 1, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 9dd28dc60b..a1df764ea9 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -902,6 +902,8 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): "serial_no": "serial_no", "purchase_order": "purchase_order", "purchase_order_item": "purchase_order_item", + "material_request": "material_request", + "Material_request_item": "material_request_item", }, "field_no_map": ["warehouse"], }, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py index fd44e9cee5..ba816cef9b 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py @@ -11,11 +11,14 @@ def get_data(): }, "internal_links": { "Sales Order": ["items", "against_sales_order"], + "Material Request": ["items", "material_request"], + "Purchase Order": ["items", "purchase_order"] }, "transactions": [ {"label": _("Related"), "items": ["Sales Invoice", "Packing Slip", "Delivery Trip"]}, {"label": _("Reference"), "items": ["Sales Order", "Shipment", "Quality Inspection"]}, {"label": _("Returns"), "items": ["Stock Entry"]}, {"label": _("Subscription"), "items": ["Auto Repeat"]}, + {"label": _("Internal Transfer"), "items": ["Material Request", "Purchase Order"]} ], } diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json index 3229463070..916ab2a05b 100644 --- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json +++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -88,9 +88,11 @@ "allow_zero_valuation_rate", "column_break_71", "internal_transfer_section", + "material_request", "purchase_order", "column_break_82", "purchase_order_item", + "material_request_item", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -818,13 +820,24 @@ "fieldtype": "Check", "label": "Has Item Scanned", "read_only": 1 + }, + { + "fieldname": "material_request", + "fieldtype": "Link", + "label": "Material Request", + "options": "Material Request" + }, + { + "fieldname": "material_request_item", + "fieldtype": "Data", + "label": "Material Request Item" } ], "idx": 1, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2022-11-02 12:54:07.225623", + "modified": "2022-11-09 12:17:50.850142", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Item", diff --git a/erpnext/stock/doctype/material_request/material_request_dashboard.py b/erpnext/stock/doctype/material_request/material_request_dashboard.py index 691a8b39b1..2bba52a4e2 100644 --- a/erpnext/stock/doctype/material_request/material_request_dashboard.py +++ b/erpnext/stock/doctype/material_request/material_request_dashboard.py @@ -14,5 +14,6 @@ def get_data(): }, {"label": _("Stock"), "items": ["Stock Entry", "Purchase Receipt", "Pick List"]}, {"label": _("Manufacturing"), "items": ["Work Order"]}, + {"label": _("Internal Transfer"), "items": ["Sales Order"]}, ], } From d86afddb60357c2f1a31c5bf204bacf5c74979f4 Mon Sep 17 00:00:00 2001 From: Vishal Date: Wed, 9 Nov 2022 13:03:04 +0530 Subject: [PATCH 2/7] fix: minor issue fixed --- .../stock/doctype/delivery_note/delivery_note_dashboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py index ba816cef9b..b6b5ff4296 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py @@ -12,13 +12,13 @@ def get_data(): "internal_links": { "Sales Order": ["items", "against_sales_order"], "Material Request": ["items", "material_request"], - "Purchase Order": ["items", "purchase_order"] + "Purchase Order": ["items", "purchase_order"], }, "transactions": [ {"label": _("Related"), "items": ["Sales Invoice", "Packing Slip", "Delivery Trip"]}, {"label": _("Reference"), "items": ["Sales Order", "Shipment", "Quality Inspection"]}, {"label": _("Returns"), "items": ["Stock Entry"]}, {"label": _("Subscription"), "items": ["Auto Repeat"]}, - {"label": _("Internal Transfer"), "items": ["Material Request", "Purchase Order"]} + {"label": _("Internal Transfer"), "items": ["Material Request", "Purchase Order"]}, ], } From 89aabdaaaa5009a94cfa14ae2bdd50c036afd670 Mon Sep 17 00:00:00 2001 From: Vishal Date: Tue, 15 Nov 2022 17:41:14 +0530 Subject: [PATCH 3/7] fix: test case added for MR internal Transfer --- .../purchase_order/test_purchase_order.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 5a96131157..e7c2db8574 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -879,6 +879,50 @@ class TestPurchaseOrder(FrappeTestCase): po.load_from_db() self.assertEqual(po.status, "Completed") + def test_internal_transfer_flow_with_mr(self): + from erpnext.selling.doctype.sales_order.sales_order import ( + make_delivery_note, + ) + from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt + + frappe.db.set_value("Selling Settings", None, "maintain_same_sales_rate", 1) + frappe.db.set_value("Buying Settings", None, "maintain_same_rate", 1) + + supplier = "_Test Internal Supplier 2" + + mr = make_material_request(qty=2, company="_Test Company with perpetual inventory", warehouse="Stores - TCP1") + po = make_purchase_order(mr.name) + po.supplier = supplier + po.from_warehouse="_Test Internal Warehouse New 1 - TCP1", + po.rate=1, + po.save() + po.submit() + + so = make_inter_company_sales_order(po.name) + so.items[0].delivery_date = today() + self.assertEqual(so.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1") + self.assertTrue(so.items[0].material_request) + self.assertTrue(so.items[0].material_request_item) + so.submit() + + dn = make_delivery_note(so.name) + dn.items[0].target_warehouse = "_Test Internal Warehouse GIT - TCP1" + self.assertEqual(dn.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1") + self.assertTrue(dn.items[0].material_request) + self.assertTrue(dn.items[0].material_request_item) + + self.assertEqual(mr.items[0].name, dn.items[0].material_request_item) + dn.submit() + + pr = make_inter_company_purchase_receipt(dn.name) + self.assertEqual(pr.items[0].warehouse, "Stores - TCP1") + self.assertTrue(pr.items[0].material_request) + self.assertTrue(pr.items[0].material_request_item) + self.assertEqual(mr.items[0].name, pr.items[0].material_request_item) + pr.submit() + + po.load_from_db() + self.assertEqual(mr.status, "Received") def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier From 343b414b402d3feede1f6e1fb3a3262a763ea329 Mon Sep 17 00:00:00 2001 From: Vishal Date: Wed, 16 Nov 2022 13:52:07 +0530 Subject: [PATCH 4/7] fix: test case updated for mr --- .../purchase_order/test_purchase_order.py | 53 ++++--------------- 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index e7c2db8574..af687a0066 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -833,6 +833,10 @@ class TestPurchaseOrder(FrappeTestCase): prepare_data_for_internal_transfer() supplier = "_Test Internal Supplier 2" + mr = make_material_request( + qty=2, company="_Test Company with perpetual inventory", warehouse="Stores - TCP1" + ) + po = create_purchase_order( company="_Test Company with perpetual inventory", supplier=supplier, @@ -840,6 +844,8 @@ class TestPurchaseOrder(FrappeTestCase): from_warehouse="_Test Internal Warehouse New 1 - TCP1", qty=2, rate=1, + material_request = mr.name, + material_request_item = mr.items[0].name, ) so = make_inter_company_sales_order(po.name) @@ -875,53 +881,10 @@ class TestPurchaseOrder(FrappeTestCase): self.assertTrue(pi.items[0].purchase_order) self.assertTrue(pi.items[0].po_detail) pi.submit() + mr.reload() po.load_from_db() self.assertEqual(po.status, "Completed") - - def test_internal_transfer_flow_with_mr(self): - from erpnext.selling.doctype.sales_order.sales_order import ( - make_delivery_note, - ) - from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt - - frappe.db.set_value("Selling Settings", None, "maintain_same_sales_rate", 1) - frappe.db.set_value("Buying Settings", None, "maintain_same_rate", 1) - - supplier = "_Test Internal Supplier 2" - - mr = make_material_request(qty=2, company="_Test Company with perpetual inventory", warehouse="Stores - TCP1") - po = make_purchase_order(mr.name) - po.supplier = supplier - po.from_warehouse="_Test Internal Warehouse New 1 - TCP1", - po.rate=1, - po.save() - po.submit() - - so = make_inter_company_sales_order(po.name) - so.items[0].delivery_date = today() - self.assertEqual(so.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1") - self.assertTrue(so.items[0].material_request) - self.assertTrue(so.items[0].material_request_item) - so.submit() - - dn = make_delivery_note(so.name) - dn.items[0].target_warehouse = "_Test Internal Warehouse GIT - TCP1" - self.assertEqual(dn.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1") - self.assertTrue(dn.items[0].material_request) - self.assertTrue(dn.items[0].material_request_item) - - self.assertEqual(mr.items[0].name, dn.items[0].material_request_item) - dn.submit() - - pr = make_inter_company_purchase_receipt(dn.name) - self.assertEqual(pr.items[0].warehouse, "Stores - TCP1") - self.assertTrue(pr.items[0].material_request) - self.assertTrue(pr.items[0].material_request_item) - self.assertEqual(mr.items[0].name, pr.items[0].material_request_item) - pr.submit() - - po.load_from_db() self.assertEqual(mr.status, "Received") def prepare_data_for_internal_transfer(): @@ -1023,6 +986,8 @@ def create_purchase_order(**args): "schedule_date": add_days(nowdate(), 1), "include_exploded_items": args.get("include_exploded_items", 1), "against_blanket_order": args.against_blanket_order, + "material_request": args.material_request, + "material_request_item": args.material_request_item, }, ) From ba6189d054cf6e6b1bf53c995e86366bafe92ecf Mon Sep 17 00:00:00 2001 From: Vishal Date: Wed, 16 Nov 2022 13:58:29 +0530 Subject: [PATCH 5/7] fix: minor change --- erpnext/buying/doctype/purchase_order/test_purchase_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index af687a0066..97c862c066 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -844,8 +844,8 @@ class TestPurchaseOrder(FrappeTestCase): from_warehouse="_Test Internal Warehouse New 1 - TCP1", qty=2, rate=1, - material_request = mr.name, - material_request_item = mr.items[0].name, + material_request=mr.name, + material_request_item=mr.items[0].name, ) so = make_inter_company_sales_order(po.name) From e5dfd53e6f8a73c81c682f8d2a7a872eb5b8445f Mon Sep 17 00:00:00 2001 From: Vishal Date: Wed, 16 Nov 2022 14:25:35 +0530 Subject: [PATCH 6/7] chore: minor fix --- erpnext/buying/doctype/purchase_order/test_purchase_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 97c862c066..5206a428c4 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -887,6 +887,7 @@ class TestPurchaseOrder(FrappeTestCase): self.assertEqual(po.status, "Completed") self.assertEqual(mr.status, "Received") + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier from erpnext.selling.doctype.customer.test_customer import create_internal_customer From 12d7b7e9c2cd59e2393c1647f5030415d6560af2 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Fri, 18 Nov 2022 11:40:53 +0530 Subject: [PATCH 7/7] chore: linters --- .../sales_order_item/sales_order_item.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 5b0b3958da..b801de314c 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -851,21 +851,21 @@ "read_only": 1 }, { - "fieldname": "material_request", - "fieldtype": "Link", - "label": "Material Request", - "options": "Material Request" - }, - { - "fieldname": "material_request_item", - "fieldtype": "Data", - "label": "Material Request Item" - } + "fieldname": "material_request", + "fieldtype": "Link", + "label": "Material Request", + "options": "Material Request" + }, + { + "fieldname": "material_request_item", + "fieldtype": "Data", + "label": "Material Request Item" + } ], "idx": 1, "istable": 1, "links": [], - "modified": "2022-11-10 18:20:30.137455", + "modified": "2022-11-18 11:39:01.741665", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item",