From a4187960fd1b380310ae167ac7d9f4ef85d29d52 Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 12:07:52 +0530 Subject: [PATCH 1/6] test: validate pr and sr stock after cancel stock reco with fifo item --- .../purchase_receipt/test_purchase_receipt.py | 95 ++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index c9a2ed22b0ea..06786323e9d1 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4000,6 +4000,94 @@ def test_direct_create_purchase_receipt_and_cancel_TC_SCK_53(self): self.assertEqual(sh_gle[0], sh_gle[1]) self.assertEqual(srbnb_gle[0], srbnb_gle[1]) + def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): + from erpnext.stock.doctype.material_request.test_material_request import get_gle + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + fields = {"is_stock_item": 1, "valuation_method": "FIFO"} + frappe.db.set_value("Company", "_Test Company", "enable_perpetual_inventory", 1) + frappe.db.set_value( + "Company", "_Test Company", "stock_received_but_not_billed", "Stock Received But Not Billed - _TC" + ) + if frappe.db.has_column("Item", "gst_hsn_code"): + fields["gst_hsn_code"] = "01011010" + + item = make_item("_Test Item For FIFO", properties=fields).name + warehouse = "_Test Warehouse - _TC" + pr = make_purchase_receipt(item_code=item, qty=10, rate=500) + + sl_entries = get_sl_entries("Purchase Receipt", pr.name) + + expected_sle = {"_Test Warehouse - _TC": [10, "[[10.0, 500.0]]"]} + + # Validate sle for PR 1 + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + + pr1 = make_purchase_receipt(item_code=item, qty=10, rate=600) + + sl_entries = get_sl_entries("Purchase Receipt", pr1.name) + + expected_sle = {"_Test Warehouse - _TC": [10, "[[10.0, 500.0], [10.0, 600.0]]"]} + + # Validate sle for PR 2 + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + + # Create Stock Reco + sr = create_stock_reconciliation( + item_code=item, + qty=20, + rate=700, + warehouse=warehouse, + expense_account="Stock Adjustment - _TC", + ) + sl_entries = get_sl_entries("Stock Reconciliation", sr.name) + + expected_sle = {"_Test Warehouse - _TC": [20, 3000, 700, "[[20.0, 700.0]]"]} + + # Validate sle stock reco + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.qty_after_transaction) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_value_difference) + self.assertEqual(expected_sle[sle.warehouse][2], sle.valuation_rate) + self.assertEqual(expected_sle[sle.warehouse][3], sle.stock_queue) + + gl_entries = get_gl_entries("Stock Reconciliation", sr.name) + + self.assertTrue(gl_entries) + stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") + + expected_values = { + stock_in_hand_account: [3000.0, 0.0], + "Stock Adjustment - _TC": [0.0, 3000.0], + } + + for gle in gl_entries: + self.assertEqual(expected_values[gle.account][0], gle.debit) + self.assertEqual(expected_values[gle.account][1], gle.credit) + + # Cancel Stock Reco and check SLE and GL + sr.cancel() + + sl_entry_cancelled = frappe.db.get_all( + "Stock Ledger Entry", + {"voucher_type": "Stock Reconciliation", "voucher_no": sr.name}, + ["qty_after_transaction", "stock_value_difference"], + order_by="creation", + ) + self.assertEqual(len(sl_entry_cancelled), 2) + self.assertEqual(sl_entry_cancelled[1].qty_after_transaction, 20) + self.assertEqual(sl_entry_cancelled[1].stock_value_difference, -3000) + + sa_gle = get_gle(sr.company, sr.name, "Stock Adjustment - _TC") + self.assertEqual(sa_gle[0], sa_gle[1]) + + 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 @@ -4037,7 +4125,12 @@ def prepare_data_for_internal_transfer(): def get_sl_entries(voucher_type, voucher_no): return frappe.db.sql( - """ select actual_qty, warehouse, stock_value_difference + """ select actual_qty, + warehouse, + stock_value_difference, + qty_after_transaction, + valuation_rate, + stock_queue from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s order by posting_time desc""", (voucher_type, voucher_no), From 55289cf0cd8871bd74a848ba7b60e8eb5c27020b Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 12:24:17 +0530 Subject: [PATCH 2/6] test: validate pr and sr stock after cancel stock reco with moveavg item --- .../purchase_receipt/test_purchase_receipt.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 06786323e9d1..204999582756 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4087,6 +4087,93 @@ def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): sa_gle = get_gle(sr.company, sr.name, "Stock Adjustment - _TC") self.assertEqual(sa_gle[0], sa_gle[1]) + def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): + from erpnext.stock.doctype.material_request.test_material_request import get_gle + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + fields = {"is_stock_item": 1, "valuation_method": "Moving Average"} + frappe.db.set_value("Company", "_Test Company", "enable_perpetual_inventory", 1) + frappe.db.set_value( + "Company", "_Test Company", "stock_received_but_not_billed", "Stock Received But Not Billed - _TC" + ) + if frappe.db.has_column("Item", "gst_hsn_code"): + fields["gst_hsn_code"] = "01011010" + + item = make_item("_Test Item For Moving Average", properties=fields).name + warehouse = "_Test Warehouse - _TC" + pr = make_purchase_receipt(item_code=item, qty=10, rate=5000) + + sl_entries = get_sl_entries("Purchase Receipt", pr.name) + + expected_sle = {"_Test Warehouse - _TC": [10, "[]"]} + + # Validate sle for PR 1 + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + + pr1 = make_purchase_receipt(item_code=item, qty=10, rate=6000) + + sl_entries = get_sl_entries("Purchase Receipt", pr1.name) + + expected_sle = {"_Test Warehouse - _TC": [10, "[]"]} + + # Validate sle for PR 2 + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + + # Create Stock Reco + sr = create_stock_reconciliation( + item_code=item, + qty=20, + rate=7000, + warehouse=warehouse, + expense_account="Stock Adjustment - _TC", + ) + sl_entries = get_sl_entries("Stock Reconciliation", sr.name) + + expected_sle = {"_Test Warehouse - _TC": [20, 30000, 7000, "[]"]} + + # Validate sle stock reco + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.qty_after_transaction) + self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_value_difference) + self.assertEqual(expected_sle[sle.warehouse][2], sle.valuation_rate) + self.assertEqual(expected_sle[sle.warehouse][3], sle.stock_queue) + + gl_entries = get_gl_entries("Stock Reconciliation", sr.name) + + self.assertTrue(gl_entries) + stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") + + expected_values = { + stock_in_hand_account: [30000.0, 0.0], + "Stock Adjustment - _TC": [0.0, 30000.0], + } + + for gle in gl_entries: + self.assertEqual(expected_values[gle.account][0], gle.debit) + self.assertEqual(expected_values[gle.account][1], gle.credit) + + # Cancel Stock Reco and check SLE and GL + sr.cancel() + + sl_entry_cancelled = frappe.db.get_all( + "Stock Ledger Entry", + {"voucher_type": "Stock Reconciliation", "voucher_no": sr.name}, + ["qty_after_transaction", "stock_value_difference"], + order_by="creation", + ) + self.assertEqual(len(sl_entry_cancelled), 2) + self.assertEqual(sl_entry_cancelled[1].qty_after_transaction, 20) + self.assertEqual(sl_entry_cancelled[1].stock_value_difference, -30000) + + sa_gle = get_gle(sr.company, sr.name, "Stock Adjustment - _TC") + self.assertEqual(sa_gle[0], sa_gle[1]) + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier From 5dc1fd346a61be9a9ef2c4a75daa910d940019a1 Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 13:19:35 +0530 Subject: [PATCH 3/6] refactor: in validate pr and sr stock after cancel stock reco --- .../purchase_receipt/test_purchase_receipt.py | 126 +++++++----------- 1 file changed, 46 insertions(+), 80 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 204999582756..252327fe428a 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4018,25 +4018,15 @@ def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): warehouse = "_Test Warehouse - _TC" pr = make_purchase_receipt(item_code=item, qty=10, rate=500) - sl_entries = get_sl_entries("Purchase Receipt", pr.name) - - expected_sle = {"_Test Warehouse - _TC": [10, "[[10.0, 500.0]]"]} - # Validate sle for PR 1 - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + expected_sle = {"_Test Warehouse - _TC": [10, 10, 5000, 500, "[[10.0, 500.0]]"]} + self.val_method_sl_entry(pr, expected_sle) pr1 = make_purchase_receipt(item_code=item, qty=10, rate=600) - sl_entries = get_sl_entries("Purchase Receipt", pr1.name) - - expected_sle = {"_Test Warehouse - _TC": [10, "[[10.0, 500.0], [10.0, 600.0]]"]} - # Validate sle for PR 2 - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + expected_sle = {"_Test Warehouse - _TC": [10, 20, 6000, 550, "[[10.0, 500.0], [10.0, 600.0]]"]} + self.val_method_sl_entry(pr1, expected_sle) # Create Stock Reco sr = create_stock_reconciliation( @@ -4046,49 +4036,23 @@ def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): warehouse=warehouse, expense_account="Stock Adjustment - _TC", ) - sl_entries = get_sl_entries("Stock Reconciliation", sr.name) - - expected_sle = {"_Test Warehouse - _TC": [20, 3000, 700, "[[20.0, 700.0]]"]} - - # Validate sle stock reco - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.qty_after_transaction) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_value_difference) - self.assertEqual(expected_sle[sle.warehouse][2], sle.valuation_rate) - self.assertEqual(expected_sle[sle.warehouse][3], sle.stock_queue) - gl_entries = get_gl_entries("Stock Reconciliation", sr.name) - - self.assertTrue(gl_entries) stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") - - expected_values = { + expected_sle = {"_Test Warehouse - _TC": [0, 20, 3000, 700, "[[20.0, 700.0]]"]} + expected_gl = { stock_in_hand_account: [3000.0, 0.0], "Stock Adjustment - _TC": [0.0, 3000.0], } - for gle in gl_entries: - self.assertEqual(expected_values[gle.account][0], gle.debit) - self.assertEqual(expected_values[gle.account][1], gle.credit) + # Validate sle and gl stock reco + self.val_method_sl_entry(sr, expected_sle) + self.check_gl_entry(sr, expected_gl) # Cancel Stock Reco and check SLE and GL sr.cancel() - - sl_entry_cancelled = frappe.db.get_all( - "Stock Ledger Entry", - {"voucher_type": "Stock Reconciliation", "voucher_no": sr.name}, - ["qty_after_transaction", "stock_value_difference"], - order_by="creation", - ) - self.assertEqual(len(sl_entry_cancelled), 2) - self.assertEqual(sl_entry_cancelled[1].qty_after_transaction, 20) - self.assertEqual(sl_entry_cancelled[1].stock_value_difference, -3000) - - sa_gle = get_gle(sr.company, sr.name, "Stock Adjustment - _TC") - self.assertEqual(sa_gle[0], sa_gle[1]) + self.check_cancel_stock_gl_sle(sr, 20, -3000.0) def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): - from erpnext.stock.doctype.material_request.test_material_request import get_gle from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( create_stock_reconciliation, ) @@ -4105,25 +4069,17 @@ def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): warehouse = "_Test Warehouse - _TC" pr = make_purchase_receipt(item_code=item, qty=10, rate=5000) - sl_entries = get_sl_entries("Purchase Receipt", pr.name) - - expected_sle = {"_Test Warehouse - _TC": [10, "[]"]} + expected_sle = {"_Test Warehouse - _TC": [10, 10, 50000, 5000, "[]"]} # Validate sle for PR 1 - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + self.val_method_sl_entry(pr, expected_sle) pr1 = make_purchase_receipt(item_code=item, qty=10, rate=6000) - sl_entries = get_sl_entries("Purchase Receipt", pr1.name) - - expected_sle = {"_Test Warehouse - _TC": [10, "[]"]} + expected_sle = {"_Test Warehouse - _TC": [10, 20, 60000, 5500, "[]"]} # Validate sle for PR 2 - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_queue) + self.val_method_sl_entry(pr1, expected_sle) # Create Stock Reco sr = create_stock_reconciliation( @@ -4133,46 +4089,56 @@ def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): warehouse=warehouse, expense_account="Stock Adjustment - _TC", ) - sl_entries = get_sl_entries("Stock Reconciliation", sr.name) - expected_sle = {"_Test Warehouse - _TC": [20, 30000, 7000, "[]"]} - - # Validate sle stock reco - for sle in sl_entries: - self.assertEqual(expected_sle[sle.warehouse][0], sle.qty_after_transaction) - self.assertEqual(expected_sle[sle.warehouse][1], sle.stock_value_difference) - self.assertEqual(expected_sle[sle.warehouse][2], sle.valuation_rate) - self.assertEqual(expected_sle[sle.warehouse][3], sle.stock_queue) - - gl_entries = get_gl_entries("Stock Reconciliation", sr.name) - - self.assertTrue(gl_entries) stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") - - expected_values = { + expected_sle = {"_Test Warehouse - _TC": [0, 20, 30000, 7000, "[]"]} + expected_gl = { stock_in_hand_account: [30000.0, 0.0], "Stock Adjustment - _TC": [0.0, 30000.0], } - for gle in gl_entries: - self.assertEqual(expected_values[gle.account][0], gle.debit) - self.assertEqual(expected_values[gle.account][1], gle.credit) + # Validate sle and gl stock reco + self.val_method_sl_entry(sr, expected_sle) + self.check_gl_entry(sr, expected_gl) # Cancel Stock Reco and check SLE and GL sr.cancel() + self.check_cancel_stock_gl_sle(sr, 20, -30000.0) + + def check_cancel_stock_gl_sle(self, doc, exp_qty, exp_amt): + from erpnext.stock.doctype.material_request.test_material_request import get_gle sl_entry_cancelled = frappe.db.get_all( "Stock Ledger Entry", - {"voucher_type": "Stock Reconciliation", "voucher_no": sr.name}, + {"voucher_type": doc.doctype, "voucher_no": doc.name}, ["qty_after_transaction", "stock_value_difference"], order_by="creation", ) self.assertEqual(len(sl_entry_cancelled), 2) - self.assertEqual(sl_entry_cancelled[1].qty_after_transaction, 20) - self.assertEqual(sl_entry_cancelled[1].stock_value_difference, -30000) + self.assertEqual(sl_entry_cancelled[1].qty_after_transaction, exp_qty) + self.assertEqual(sl_entry_cancelled[1].stock_value_difference, exp_amt) - sa_gle = get_gle(sr.company, sr.name, "Stock Adjustment - _TC") + sa_gle = get_gle(doc.company, doc.name, "Stock Adjustment - _TC") self.assertEqual(sa_gle[0], sa_gle[1]) + + def val_method_sl_entry(self, doc, expected_sle): + sl_entries = get_sl_entries(doc.doctype, doc.name) + + for sle in sl_entries: + self.assertEqual(expected_sle[sle.warehouse][0], sle.actual_qty) + self.assertEqual(expected_sle[sle.warehouse][1], sle.qty_after_transaction) + self.assertEqual(expected_sle[sle.warehouse][2], sle.stock_value_difference) + self.assertEqual(expected_sle[sle.warehouse][3], sle.valuation_rate) + self.assertEqual(expected_sle[sle.warehouse][4], sle.stock_queue) + + def check_gl_entry(self, doc, expected_values): + gl_entries = get_gl_entries(doc.doctype, doc.name) + + self.assertTrue(gl_entries) + + for gle in gl_entries: + self.assertEqual(expected_values[gle.account][0], gle.debit) + self.assertEqual(expected_values[gle.account][1], gle.credit) def prepare_data_for_internal_transfer(): From 3b76a727990708d6f5dd8884f7e49608c204de0e Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 15:24:31 +0530 Subject: [PATCH 4/6] test: validate pr and stock reco with moveavg item --- .../purchase_receipt/test_purchase_receipt.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 252327fe428a..5bf5d3471327 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4000,6 +4000,54 @@ def test_direct_create_purchase_receipt_and_cancel_TC_SCK_53(self): self.assertEqual(sh_gle[0], sh_gle[1]) self.assertEqual(srbnb_gle[0], srbnb_gle[1]) + def test_create_2pr_with_item_fifo_and_sr_TC_SCK_14(self): + from erpnext.stock.doctype.material_request.test_material_request import get_gle + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + fields = {"is_stock_item": 1, "valuation_method": "FIFO"} + frappe.db.set_value("Company", "_Test Company", "enable_perpetual_inventory", 1) + frappe.db.set_value( + "Company", "_Test Company", "stock_received_but_not_billed", "Stock Received But Not Billed - _TC" + ) + if frappe.db.has_column("Item", "gst_hsn_code"): + fields["gst_hsn_code"] = "01011010" + + item = make_item("_Test Item For FIFO", properties=fields).name + warehouse = "_Test Warehouse - _TC" + pr = make_purchase_receipt(item_code=item, qty=10, rate=500) + + # Validate sle for PR 1 + expected_sle = {"_Test Warehouse - _TC": [10, 10, 5000, 500, "[[10.0, 500.0]]"]} + self.val_method_sl_entry(pr, expected_sle) + + pr1 = make_purchase_receipt(item_code=item, qty=10, rate=600) + + # Validate sle for PR 2 + expected_sle = {"_Test Warehouse - _TC": [10, 20, 6000, 550, "[[10.0, 500.0], [10.0, 600.0]]"]} + self.val_method_sl_entry(pr1, expected_sle) + + # Create Stock Reco + sr = create_stock_reconciliation( + item_code=item, + qty=20, + rate=700, + warehouse=warehouse, + expense_account="Stock Adjustment - _TC", + ) + + stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") + expected_sle = {"_Test Warehouse - _TC": [0, 20, 3000, 700, "[[20.0, 700.0]]"]} + expected_gl = { + stock_in_hand_account: [3000.0, 0.0], + "Stock Adjustment - _TC": [0.0, 3000.0], + } + + # Validate sle and gl stock reco + self.val_method_sl_entry(sr, expected_sle) + self.check_gl_entry(sr, expected_gl) + def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): from erpnext.stock.doctype.material_request.test_material_request import get_gle from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( From 6e00dffe05848a8f927464bf46d8b6bcb9250cca Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 15:33:35 +0530 Subject: [PATCH 5/6] refactor: pr and sr stock before and after cancel stock reco with fifo item --- .../purchase_receipt/test_purchase_receipt.py | 61 +++---------------- 1 file changed, 10 insertions(+), 51 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 5bf5d3471327..7026046105a3 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4001,55 +4001,16 @@ def test_direct_create_purchase_receipt_and_cancel_TC_SCK_53(self): self.assertEqual(srbnb_gle[0], srbnb_gle[1]) def test_create_2pr_with_item_fifo_and_sr_TC_SCK_14(self): - from erpnext.stock.doctype.material_request.test_material_request import get_gle - from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( - create_stock_reconciliation, - ) - - fields = {"is_stock_item": 1, "valuation_method": "FIFO"} - frappe.db.set_value("Company", "_Test Company", "enable_perpetual_inventory", 1) - frappe.db.set_value( - "Company", "_Test Company", "stock_received_but_not_billed", "Stock Received But Not Billed - _TC" - ) - if frappe.db.has_column("Item", "gst_hsn_code"): - fields["gst_hsn_code"] = "01011010" - - item = make_item("_Test Item For FIFO", properties=fields).name - warehouse = "_Test Warehouse - _TC" - pr = make_purchase_receipt(item_code=item, qty=10, rate=500) - - # Validate sle for PR 1 - expected_sle = {"_Test Warehouse - _TC": [10, 10, 5000, 500, "[[10.0, 500.0]]"]} - self.val_method_sl_entry(pr, expected_sle) - - pr1 = make_purchase_receipt(item_code=item, qty=10, rate=600) - - # Validate sle for PR 2 - expected_sle = {"_Test Warehouse - _TC": [10, 20, 6000, 550, "[[10.0, 500.0], [10.0, 600.0]]"]} - self.val_method_sl_entry(pr1, expected_sle) - - # Create Stock Reco - sr = create_stock_reconciliation( - item_code=item, - qty=20, - rate=700, - warehouse=warehouse, - expense_account="Stock Adjustment - _TC", - ) - - stock_in_hand_account = get_inventory_account(pr.company, "_Test Warehouse - _TC") - expected_sle = {"_Test Warehouse - _TC": [0, 20, 3000, 700, "[[20.0, 700.0]]"]} - expected_gl = { - stock_in_hand_account: [3000.0, 0.0], - "Stock Adjustment - _TC": [0.0, 3000.0], - } - - # Validate sle and gl stock reco - self.val_method_sl_entry(sr, expected_sle) - self.check_gl_entry(sr, expected_gl) + self._test_create_2pr_with_item_fifo_and_sr() def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): - from erpnext.stock.doctype.material_request.test_material_request import get_gle + sr = self._test_create_2pr_with_item_fifo_and_sr() + + # Cancel Stock Reco and check SLE and GL + sr.cancel() + self.check_cancel_stock_gl_sle(sr, 20, -3000.0) + + def _test_create_2pr_with_item_fifo_and_sr(self): from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( create_stock_reconciliation, ) @@ -4094,11 +4055,9 @@ def test_create_2pr_with_item_fifo_and_sr_and_cancel_TC_SCK_59(self): # Validate sle and gl stock reco self.val_method_sl_entry(sr, expected_sle) - self.check_gl_entry(sr, expected_gl) + self.check_gl_entry(sr, expected_gl) - # Cancel Stock Reco and check SLE and GL - sr.cancel() - self.check_cancel_stock_gl_sle(sr, 20, -3000.0) + return sr def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( From 47635c0437c22f1980bdcd018550caa70a930eae Mon Sep 17 00:00:00 2001 From: sibikumarkuppusamy Date: Fri, 10 Jan 2025 15:41:03 +0530 Subject: [PATCH 6/6] refactor: pr and sr stock before and after cancel stock reco with moving avg item --- .../purchase_receipt/test_purchase_receipt.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 7026046105a3..bef99cd2f9d9 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4059,7 +4059,17 @@ def _test_create_2pr_with_item_fifo_and_sr(self): return sr - def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): + def test_create_2pr_with_item_mov_avg_and_sr_TC_SCK_15(self): + self._test_create_2pr_with_item_mov_avg_and_sr() + + def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): + sr = self._test_create_2pr_with_item_mov_avg_and_sr() + + # Cancel Stock Reco and check SLE and GL + sr.cancel() + self.check_cancel_stock_gl_sle(sr, 20, -30000.0) + + def _test_create_2pr_with_item_mov_avg_and_sr(self): from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( create_stock_reconciliation, ) @@ -4106,11 +4116,9 @@ def test_create_2pr_with_item_mov_avg_and_sr_and_cancel_TC_SCK_60(self): # Validate sle and gl stock reco self.val_method_sl_entry(sr, expected_sle) - self.check_gl_entry(sr, expected_gl) + self.check_gl_entry(sr, expected_gl) - # Cancel Stock Reco and check SLE and GL - sr.cancel() - self.check_cancel_stock_gl_sle(sr, 20, -30000.0) + return sr def check_cancel_stock_gl_sle(self, doc, exp_qty, exp_amt): from erpnext.stock.doctype.material_request.test_material_request import get_gle