fix: incorrect logic for "Reserved Qty for Production" (#28880)
* fix: reservation for production incorrect
The query uses case to decide what fields to compute reservation on,
this case is outermost case hence the very first Work order's "Skip
transfer" is considered for ALL work orders.
Solution: move the case inside Sum.
Steps to reproduce:
1. Make work order for more than 1 qty (with | without skip transfer)
2. Create manufacture and transfer entries.
3. Keep checking reserved quantities during this process.
* test: use default warehouse for testing reservation
diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py
index 1e74b6d..4e83b65 100644
--- a/erpnext/manufacturing/doctype/work_order/test_work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py
@@ -95,7 +95,7 @@
def test_reserved_qty_for_partial_completion(self):
item = "_Test Item"
- warehouse = create_warehouse("Test Warehouse for reserved_qty - _TC")
+ warehouse = "_Test Warehouse - _TC"
bin1_at_start = get_bin(item, warehouse)
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index a33134b..37b5411 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -43,9 +43,9 @@
frappe.qb
.from_(wo)
.from_(wo_item)
- .select(Case()
- .when(wo.skip_transfer == 0, Sum(wo_item.required_qty - wo_item.transferred_qty))
- .else_(Sum(wo_item.required_qty - wo_item.consumed_qty))
+ .select(Sum(Case()
+ .when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
+ .else_(wo_item.required_qty - wo_item.consumed_qty))
)
.where(
(wo_item.item_code == self.item_code)