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(stock): don't reserve qty on sales return. #31017

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
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
32 changes: 32 additions & 0 deletions erpnext/stock/doctype/delivery_note/test_delivery_note.py
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,38 @@ def test_internal_transfer_with_valuation_only(self):

self.assertEqual(dn.items[0].rate, rate)

def test_reserved_qty(self):
from erpnext.controllers.sales_and_purchase_return import make_return_doc
from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
from erpnext.stock.stock_balance import get_reserved_qty

item = make_item().name
warehouse = "_Test Warehouse - _TC"
qty_to_reserve = 5

so = make_sales_order(item_code=item, qty=qty_to_reserve)

# Make qty avl for test.
make_stock_entry(item_code=item, to_warehouse=warehouse, qty=10, basic_rate=100)

# Test that item qty has been reserved on submit of sales order.
self.assertEqual(get_reserved_qty(item, warehouse), qty_to_reserve)

dn = make_delivery_note(so.name)
dn.save().submit()

# Test that item qty is no longer reserved since qty has been delivered.
self.assertEqual(get_reserved_qty(item, warehouse), 0)

dn_return = make_return_doc("Delivery Note", dn.name)
dn_return.save().submit()

returned = frappe.get_doc("Delivery Note", dn_return.name)
returned.update_prevdoc_status()

# Test that item qty is not reserved on sales return.
self.assertEqual(get_reserved_qty(item, warehouse), 0)


def create_delivery_note(**args):
dn = frappe.new_doc("Delivery Note")
Expand Down
10 changes: 8 additions & 2 deletions erpnext/stock/stock_balance.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def get_reserved_qty(item_code, warehouse):
reserved_qty = frappe.db.sql(
"""
select
sum(dnpi_qty * ((so_item_qty - so_item_delivered_qty) / so_item_qty))
sum(dnpi_qty * ((so_item_qty - so_item_delivered_qty - so_item_returned_qty) / so_item_qty))
from
(
(select
Expand All @@ -112,6 +112,11 @@ def get_reserved_qty(item_code, warehouse):
where name = dnpi.parent_detail_docname
and delivered_by_supplier = 0
) as so_item_delivered_qty,
(
select returned_qty from `tabSales Order Item`
where name = dnpi.parent_detail_docname
and delivered_by_supplier = 0
) as so_item_returned_qty,
parent, name
from
(
Expand All @@ -125,7 +130,8 @@ def get_reserved_qty(item_code, warehouse):
) dnpi)
union
(select stock_qty as dnpi_qty, qty as so_item_qty,
delivered_qty as so_item_delivered_qty, parent, name
delivered_qty as so_item_delivered_qty,
returned_qty as so_item_returned_qty, parent, name
from `tabSales Order Item` so_item
where item_code = %s and warehouse = %s
and (so_item.delivered_by_supplier is null or so_item.delivered_by_supplier = 0)
Expand Down