From b03c65f21da0a583acbe4f33913d4f818978b6b8 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 28 Oct 2023 11:10:46 +0530 Subject: [PATCH] fix: unsupported operand type(s) for serial and batch bundle in POS Invoice (backport #37721) (#37731) fix: unsupported operand type(s) for serial and batch bundle in POS Invoice (#37721) (cherry picked from commit fd78f868e1aed2bdb3baa47927f37b239e16a174) Co-authored-by: rohitwaghchaure --- .../doctype/pos_invoice/test_pos_invoice.py | 36 ++++++++++++++++--- .../serial_and_batch_bundle.py | 9 +++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py index 00c402f97b69..200b82a447b7 100644 --- a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py @@ -776,19 +776,45 @@ def test_pos_batch_reservation(self): ) create_batch_item_with_batch("_BATCH ITEM Test For Reserve", "TestBatch-RS 02") - make_stock_entry( + se = make_stock_entry( target="_Test Warehouse - _TC", item_code="_BATCH ITEM Test For Reserve", - qty=20, + qty=30, basic_rate=100, - batch_no="TestBatch-RS 02", ) + se.reload() + + batch_no = get_batch_from_bundle(se.items[0].serial_and_batch_bundle) + + # POS Invoice 1, for the batch without bundle pos_inv1 = create_pos_invoice( - item="_BATCH ITEM Test For Reserve", rate=300, qty=15, batch_no="TestBatch-RS 02" + item="_BATCH ITEM Test For Reserve", rate=300, qty=15, do_not_save=1 ) + + pos_inv1.items[0].batch_no = batch_no pos_inv1.save() pos_inv1.submit() + pos_inv1.reload() + + self.assertFalse(pos_inv1.items[0].serial_and_batch_bundle) + + batches = get_auto_batch_nos( + frappe._dict( + {"item_code": "_BATCH ITEM Test For Reserve", "warehouse": "_Test Warehouse - _TC"} + ) + ) + + for batch in batches: + if batch.batch_no == batch_no and batch.warehouse == "_Test Warehouse - _TC": + self.assertEqual(batch.qty, 15) + + # POS Invoice 2, for the batch with bundle + pos_inv2 = create_pos_invoice( + item="_BATCH ITEM Test For Reserve", rate=300, qty=10, batch_no=batch_no + ) + pos_inv2.reload() + self.assertTrue(pos_inv2.items[0].serial_and_batch_bundle) batches = get_auto_batch_nos( frappe._dict( @@ -797,7 +823,7 @@ def test_pos_batch_reservation(self): ) for batch in batches: - if batch.batch_no == "TestBatch-RS 02" and batch.warehouse == "_Test Warehouse - _TC": + if batch.batch_no == batch_no and batch.warehouse == "_Test Warehouse - _TC": self.assertEqual(batch.qty, 5) def test_pos_batch_item_qty_validation(self): diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index 96e4a556306c..8142ba59275e 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -1301,6 +1301,7 @@ def get_reserved_batches_for_pos(kwargs) -> dict: "POS Invoice", fields=[ "`tabPOS Invoice Item`.batch_no", + "`tabPOS Invoice Item`.qty", "`tabPOS Invoice`.is_return", "`tabPOS Invoice Item`.warehouse", "`tabPOS Invoice Item`.name as child_docname", @@ -1321,9 +1322,6 @@ def get_reserved_batches_for_pos(kwargs) -> dict: if pos_invoice.serial_and_batch_bundle ] - if not ids: - return {} - if ids: for d in get_serial_batch_ledgers(kwargs.item_code, docstatus=1, name=ids): key = (d.batch_no, d.warehouse) @@ -1337,6 +1335,7 @@ def get_reserved_batches_for_pos(kwargs) -> dict: else: pos_batches[key].qty += d.qty + # POS invoices having batch without bundle (to handle old POS invoices) for row in pos_invoices: if not row.batch_no: continue @@ -1346,11 +1345,11 @@ def get_reserved_batches_for_pos(kwargs) -> dict: key = (row.batch_no, row.warehouse) if key in pos_batches: - pos_batches[key] -= row.qty * -1 if row.is_return else row.qty + pos_batches[key]["qty"] -= row.qty * -1 if row.is_return else row.qty else: pos_batches[key] = frappe._dict( { - "qty": (row.qty * -1 if row.is_return else row.qty), + "qty": (row.qty * -1 if not row.is_return else row.qty), "warehouse": row.warehouse, } )