From d4e680c109838280d0c58ee9c083f5dd97c9abb0 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 1 Jul 2023 11:30:46 +0530 Subject: [PATCH 1/2] fix: reposting has not changed valuation rate (cherry picked from commit c0c693d8b0faf42089314cf43f4fc117f45de4b4) # Conflicts: # erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py --- .../purchase_receipt/test_purchase_receipt.py | 164 ++++++++++++++++++ erpnext/stock/stock_ledger.py | 6 + 2 files changed, 170 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 197d4278e94..464773122d9 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -1849,6 +1849,170 @@ class TestPurchaseReceipt(FrappeTestCase): pr.items[0].delivery_note_item = delivery_note_item pr.save() +<<<<<<< HEAD +======= + def test_purchase_return_valuation_with_rejected_qty(self): + item_code = "_Test Item Return Valuation" + create_item(item_code) + + warehouse = create_warehouse("_Test Warehouse Return Valuation") + rejected_warehouse = create_warehouse("_Test Rejected Warehouse Return Valuation") + + # Step 1: Create Purchase Receipt with valuation rate 100 + make_purchase_receipt( + item_code=item_code, + warehouse=warehouse, + qty=10, + rate=100, + rejected_qty=2, + rejected_warehouse=rejected_warehouse, + ) + + # Step 2: Create One more Purchase Receipt with valuation rate 200 + pr = make_purchase_receipt( + item_code=item_code, + warehouse=warehouse, + qty=10, + rate=200, + rejected_qty=2, + rejected_warehouse=rejected_warehouse, + ) + + # Step 3: Create Purchase Return for 2 qty + from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_return + + pr_return = make_purchase_return(pr.name) + pr_return.items[0].qty = 2 * -1 + pr_return.items[0].received_qty = 2 * -1 + pr_return.items[0].rejected_qty = 0 + pr_return.items[0].rejected_warehouse = "" + pr_return.save() + pr_return.submit() + + data = frappe.get_all( + "Stock Ledger Entry", + filters={"voucher_no": pr_return.name, "docstatus": 1}, + fields=["SUM(stock_value_difference) as stock_value_difference"], + )[0] + + self.assertEqual(abs(data["stock_value_difference"]), 400.00) + + def test_purchase_receipt_with_backdated_landed_cost_voucher(self): + from erpnext.controllers.sales_and_purchase_return import make_return_doc + from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import ( + create_landed_cost_voucher, + ) + from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry + + item_code = "_Test Purchase Item With Landed Cost" + create_item(item_code) + + warehouse = create_warehouse("_Test Purchase Warehouse With Landed Cost") + warehouse1 = create_warehouse("_Test Purchase Warehouse With Landed Cost 1") + warehouse2 = create_warehouse("_Test Purchase Warehouse With Landed Cost 2") + warehouse3 = create_warehouse("_Test Purchase Warehouse With Landed Cost 3") + + pr = make_purchase_receipt( + item_code=item_code, + warehouse=warehouse, + posting_date=add_days(today(), -10), + posting_time="10:59:59", + qty=100, + rate=275.00, + ) + + pr_return = make_return_doc("Purchase Receipt", pr.name) + pr_return.posting_date = add_days(today(), -9) + pr_return.items[0].qty = 2 * -1 + pr_return.items[0].received_qty = 2 * -1 + pr_return.submit() + + ste1 = make_stock_entry( + purpose="Material Transfer", + posting_date=add_days(today(), -8), + source=warehouse, + target=warehouse1, + item_code=item_code, + qty=20, + company=pr.company, + ) + + ste1.reload() + self.assertEqual(ste1.items[0].valuation_rate, 275.00) + + ste2 = make_stock_entry( + purpose="Material Transfer", + posting_date=add_days(today(), -7), + source=warehouse, + target=warehouse2, + item_code=item_code, + qty=20, + company=pr.company, + ) + + ste2.reload() + self.assertEqual(ste2.items[0].valuation_rate, 275.00) + + ste3 = make_stock_entry( + purpose="Material Transfer", + posting_date=add_days(today(), -6), + source=warehouse, + target=warehouse3, + item_code=item_code, + qty=20, + company=pr.company, + ) + + ste3.reload() + self.assertEqual(ste3.items[0].valuation_rate, 275.00) + + ste4 = make_stock_entry( + purpose="Material Transfer", + posting_date=add_days(today(), -5), + source=warehouse1, + target=warehouse, + item_code=item_code, + qty=20, + company=pr.company, + ) + + ste4.reload() + self.assertEqual(ste4.items[0].valuation_rate, 275.00) + + ste5 = make_stock_entry( + purpose="Material Transfer", + posting_date=add_days(today(), -4), + source=warehouse, + target=warehouse1, + item_code=item_code, + qty=20, + company=pr.company, + ) + + ste5.reload() + self.assertEqual(ste5.items[0].valuation_rate, 275.00) + + create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company, charges=2500 * -1) + + pr.reload() + valuation_rate = pr.items[0].valuation_rate + + ste1.reload() + self.assertEqual(ste1.items[0].valuation_rate, valuation_rate) + + ste2.reload() + self.assertEqual(ste2.items[0].valuation_rate, valuation_rate) + + ste3.reload() + self.assertEqual(ste3.items[0].valuation_rate, valuation_rate) + + ste4.reload() + self.assertEqual(ste4.items[0].valuation_rate, valuation_rate) + + ste5.reload() + self.assertEqual(ste5.items[0].valuation_rate, valuation_rate) + +>>>>>>> c0c693d8b0 (fix: reposting has not changed valuation rate) def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 2f876cddac8..3ca513a4644 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -502,6 +502,7 @@ class update_entries_after(object): def update_distinct_item_warehouses(self, dependant_sle): key = (dependant_sle.item_code, dependant_sle.warehouse) val = frappe._dict({"sle": dependant_sle}) + if key not in self.distinct_item_warehouses: self.distinct_item_warehouses[key] = val self.new_items_found = True @@ -513,6 +514,9 @@ class update_entries_after(object): val.sle_changed = True self.distinct_item_warehouses[key] = val self.new_items_found = True + elif self.distinct_item_warehouses[key].get("reposting_status"): + self.distinct_item_warehouses[key] = val + self.new_items_found = True def process_sle(self, sle): from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos @@ -1154,6 +1158,8 @@ def get_sle_by_voucher_detail_no(voucher_detail_no, excluded_sle=None): [ "item_code", "warehouse", + "actual_qty", + "qty_after_transaction", "posting_date", "posting_time", "timestamp(posting_date, posting_time) as timestamp", From b9833db7bd537f3adc44e8858ca3a150b9c61a9b Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 3 Jul 2023 09:53:16 +0530 Subject: [PATCH 2/2] fix: conflicts --- .../purchase_receipt/test_purchase_receipt.py | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 464773122d9..ba28b6302f3 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -1849,54 +1849,6 @@ class TestPurchaseReceipt(FrappeTestCase): pr.items[0].delivery_note_item = delivery_note_item pr.save() -<<<<<<< HEAD -======= - def test_purchase_return_valuation_with_rejected_qty(self): - item_code = "_Test Item Return Valuation" - create_item(item_code) - - warehouse = create_warehouse("_Test Warehouse Return Valuation") - rejected_warehouse = create_warehouse("_Test Rejected Warehouse Return Valuation") - - # Step 1: Create Purchase Receipt with valuation rate 100 - make_purchase_receipt( - item_code=item_code, - warehouse=warehouse, - qty=10, - rate=100, - rejected_qty=2, - rejected_warehouse=rejected_warehouse, - ) - - # Step 2: Create One more Purchase Receipt with valuation rate 200 - pr = make_purchase_receipt( - item_code=item_code, - warehouse=warehouse, - qty=10, - rate=200, - rejected_qty=2, - rejected_warehouse=rejected_warehouse, - ) - - # Step 3: Create Purchase Return for 2 qty - from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_return - - pr_return = make_purchase_return(pr.name) - pr_return.items[0].qty = 2 * -1 - pr_return.items[0].received_qty = 2 * -1 - pr_return.items[0].rejected_qty = 0 - pr_return.items[0].rejected_warehouse = "" - pr_return.save() - pr_return.submit() - - data = frappe.get_all( - "Stock Ledger Entry", - filters={"voucher_no": pr_return.name, "docstatus": 1}, - fields=["SUM(stock_value_difference) as stock_value_difference"], - )[0] - - self.assertEqual(abs(data["stock_value_difference"]), 400.00) - def test_purchase_receipt_with_backdated_landed_cost_voucher(self): from erpnext.controllers.sales_and_purchase_return import make_return_doc from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import ( @@ -2012,7 +1964,6 @@ class TestPurchaseReceipt(FrappeTestCase): ste5.reload() self.assertEqual(ste5.items[0].valuation_rate, valuation_rate) ->>>>>>> c0c693d8b0 (fix: reposting has not changed valuation rate) def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier