Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: unsupported operand type(s) for serial and batch bundle in POS Invoice (backport #37721) #37731

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix: unsupported operand type(s) for serial and batch bundle in POS I…
…nvoice (#37721)

(cherry picked from commit fd78f86)
  • Loading branch information
rohitwaghchaure authored and mergify[bot] committed Oct 27, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 7f5d8d2b15af56235bb52aec8850ed6a02dd14d2
36 changes: 31 additions & 5 deletions erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py
Original file line number Diff line number Diff line change
@@ -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):
Original file line number Diff line number Diff line change
@@ -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,
}
)