From c1819a4b21f09b1775cb20c79a8683c734961ec3 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 3 Aug 2023 12:19:25 +0530 Subject: [PATCH] fix: serial no not able to reject for the internal transfer (#36467) --- erpnext/controllers/buying_controller.py | 21 +++++- .../purchase_receipt/test_purchase_receipt.py | 64 +++++++++++++++++++ erpnext/stock/stock_ledger.py | 2 + 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index fa94a4a88d4..1de39967730 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -475,6 +475,10 @@ class BuyingController(SubcontractingController): if d.item_code not in stock_items: continue + rejected_qty = 0.0 + if flt(d.rejected_qty) != 0: + rejected_qty = flt(flt(d.rejected_qty) * flt(d.conversion_factor), d.precision("stock_qty")) + if d.warehouse: pr_qty = flt(flt(d.qty) * flt(d.conversion_factor), d.precision("stock_qty")) @@ -495,6 +499,11 @@ class BuyingController(SubcontractingController): }, ) + if flt(rejected_qty) != 0: + from_warehouse_sle["actual_qty"] += -1 * rejected_qty + if d.rejected_serial_no: + from_warehouse_sle["serial_no"] += "\n" + cstr(d.rejected_serial_no).strip() + sl_entries.append(from_warehouse_sle) sle = self.get_sl_entries( @@ -520,6 +529,7 @@ class BuyingController(SubcontractingController): else 0, } ) + sl_entries.append(sle) if d.from_warehouse and ( @@ -530,23 +540,30 @@ class BuyingController(SubcontractingController): d, {"actual_qty": -1 * pr_qty, "warehouse": d.from_warehouse, "recalculate_rate": 1} ) + if flt(rejected_qty) != 0: + from_warehouse_sle["actual_qty"] += -1 * rejected_qty + if d.rejected_serial_no: + from_warehouse_sle["serial_no"] += "\n" + cstr(d.rejected_serial_no).strip() + sl_entries.append(from_warehouse_sle) - if flt(d.rejected_qty) != 0: + if flt(rejected_qty) != 0: sl_entries.append( self.get_sl_entries( d, { "warehouse": d.rejected_warehouse, - "actual_qty": flt(flt(d.rejected_qty) * flt(d.conversion_factor), d.precision("stock_qty")), + "actual_qty": rejected_qty, "serial_no": cstr(d.rejected_serial_no).strip(), "incoming_rate": 0.0, + "allow_zero_valuation_rate": True, }, ) ) if self.get("is_old_subcontracting_flow"): self.make_sl_entries_for_supplier_warehouse(sl_entries) + self.make_sl_entries( sl_entries, allow_negative_stock=allow_negative_stock, diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 585871cf391..c9433cf5106 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -1258,6 +1258,70 @@ class TestPurchaseReceipt(FrappeTestCase): self.assertEqual(query[0].value, 0) + def test_rejected_qty_for_internal_transfer(self): + from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt + from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note + + prepare_data_for_internal_transfer() + customer = "_Test Internal Customer 2" + company = "_Test Company with perpetual inventory" + + from_warehouse = create_warehouse("_Test Internal From Warehouse New", company=company) + to_warehouse = create_warehouse("_Test Internal To Warehouse New", company=company) + rejected_warehouse = create_warehouse( + "_Test Rejected Internal To Warehouse New", company=company + ) + item_doc = make_item( + "Test Internal Transfer Item DS", + { + "is_purchase_item": 1, + "is_stock_item": 1, + "has_serial_no": 1, + "serial_no_series": "SBNS.#####", + }, + ) + + target_warehouse = create_warehouse("_Test Internal GIT Warehouse New", company=company) + + pr = make_purchase_receipt( + item_code=item_doc.name, + company=company, + posting_date=add_days(today(), -1), + warehouse=from_warehouse, + qty=2, + rate=100, + ) + + dn1 = create_delivery_note( + item_code=item_doc.name, + company=company, + customer=customer, + serial_no=pr.items[0].serial_no, + cost_center="Main - TCP1", + expense_account="Cost of Goods Sold - TCP1", + qty=2, + rate=500, + warehouse=from_warehouse, + target_warehouse=target_warehouse, + ) + + sns = get_serial_nos(dn1.items[0].serial_no) + + self.assertEqual(len(sns), 2) + + pr1 = make_inter_company_purchase_receipt(dn1.name) + pr1.items[0].qty = 1.0 + pr1.items[0].rejected_qty = 1.0 + pr1.items[0].serial_no = sns[0] + pr1.items[0].rejected_serial_no = sns[1] + pr1.items[0].warehouse = to_warehouse + pr1.items[0].rejected_warehouse = rejected_warehouse + pr1.submit() + + rejected_serial_no_wh = frappe.get_cached_value("Serial No", sns[1], "warehouse") + + self.assertEqual(rejected_warehouse, rejected_serial_no_wh) + def test_backdated_transaction_for_internal_transfer_in_trasit_warehouse_for_purchase_receipt( self, ): diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 3a419195353..d52d59a0d18 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -74,6 +74,7 @@ def make_sl_entries(sl_entries, allow_negative_stock=False, via_landed_cost_vouc sle_doc = make_entry(sle, allow_negative_stock, via_landed_cost_voucher) args = sle_doc.as_dict() + args["allow_zero_valuation_rate"] = sle.get("allow_zero_valuation_rate") or False if sle.get("voucher_type") == "Stock Reconciliation": # preserve previous_qty_after_transaction for qty reposting @@ -109,6 +110,7 @@ def repost_current_voucher(args, allow_negative_stock=False, via_landed_cost_vou "sle_id": args.get("name"), "creation": args.get("creation"), }, + allow_zero_rate=args.get("allow_zero_valuation_rate") or False, allow_negative_stock=allow_negative_stock, via_landed_cost_voucher=via_landed_cost_voucher, )