Skip to content

Commit

Permalink
fix: production plan reserved qty incorrect calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
rohitwaghchaure committed Oct 9, 2023
1 parent 411be58 commit b0edf71
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 19 deletions.
12 changes: 6 additions & 6 deletions erpnext/manufacturing/doctype/production_plan/production_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -1618,7 +1618,7 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
table = frappe.qb.DocType("Production Plan")
child = frappe.qb.DocType("Material Request Plan Item")

completed_production_plans = get_completed_production_plans()
non_completed_production_plans = get_non_completed_production_plans()

case = Case()
query = (
Expand All @@ -1641,8 +1641,8 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
)
)

if completed_production_plans:
query = query.where(table.name.notin(completed_production_plans))
if non_completed_production_plans:
query = query.where(table.name.isin(non_completed_production_plans))

query = query.run()

Expand All @@ -1653,7 +1653,7 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):

reserved_qty_for_production = flt(
get_reserved_qty_for_production(
item_code, warehouse, completed_production_plans, check_production_plan=True
item_code, warehouse, non_completed_production_plans, check_production_plan=True
)
)

Expand All @@ -1663,7 +1663,7 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
return reserved_qty_for_production_plan - reserved_qty_for_production


def get_completed_production_plans():
def get_non_completed_production_plans():
table = frappe.qb.DocType("Production Plan")
child = frappe.qb.DocType("Production Plan Item")

Expand All @@ -1675,7 +1675,7 @@ def get_completed_production_plans():
.where(
(table.docstatus == 1)
& (table.status.notin(["Completed", "Closed"]))
& (child.ordered_qty >= child.planned_qty)
& (child.planned_qty > child.ordered_qty)
)
).run(as_dict=True)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

from erpnext.controllers.item_variant import create_variant
from erpnext.manufacturing.doctype.production_plan.production_plan import (
get_completed_production_plans,
get_items_for_material_requests,
get_non_completed_production_plans,
get_sales_orders,
get_warehouse_list,
)
Expand Down Expand Up @@ -1143,9 +1143,9 @@ def test_resered_qty_for_production_plan_for_less_rm_qty(self):

self.assertEqual(after_qty, before_qty)

completed_plans = get_completed_production_plans()
completed_plans = get_non_completed_production_plans()
for plan in plans:
self.assertTrue(plan in completed_plans)
self.assertFalse(plan in completed_plans)

def test_resered_qty_for_production_plan_for_material_requests_with_multi_UOM(self):
from erpnext.stock.utils import get_or_make_bin
Expand Down
25 changes: 15 additions & 10 deletions erpnext/manufacturing/doctype/work_order/work_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -1515,17 +1515,19 @@ def update_item_quantity(source, target, source_parent):
def get_reserved_qty_for_production(
item_code: str,
warehouse: str,
completed_production_plans: list = None,
non_completed_production_plans: list = None,
check_production_plan: bool = False,
) -> float:
"""Get total reserved quantity for any item in specified warehouse"""
wo = frappe.qb.DocType("Work Order")
wo_item = frappe.qb.DocType("Work Order Item")

qty_field = Case()
if check_production_plan:
qty_field = wo_item.required_qty
qty_field = qty_field.when(wo.consumed_qty > 0, wo.consumed_qty)
qty_field = qty_field.when(wo.transferred_qty > 0, wo.transferred_qty)
qty_field = qty_field.else_(wo_item.required_qty)
else:
qty_field = Case()
qty_field = qty_field.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
qty_field = qty_field.else_(wo_item.required_qty - wo_item.consumed_qty)

Expand All @@ -1538,19 +1540,22 @@ def get_reserved_qty_for_production(
& (wo_item.parent == wo.name)
& (wo.docstatus == 1)
& (wo_item.source_warehouse == warehouse)
& (wo.status.notin(["Stopped", "Completed", "Closed"]))
& (
(wo_item.required_qty > wo_item.transferred_qty)
| (wo_item.required_qty > wo_item.consumed_qty)
)
)
)

if check_production_plan:
query = query.where(wo.production_plan.isnotnull())
else:
query = query.where(
(wo.status.notin(["Stopped", "Completed", "Closed"]))
& (
(wo_item.required_qty > wo_item.transferred_qty)
| (wo_item.required_qty > wo_item.consumed_qty)
)
)

if completed_production_plans:
query = query.where(wo.production_plan.notin(completed_production_plans))
if non_completed_production_plans:
query = query.where(wo.production_plan.isin(non_completed_production_plans))

return query.run()[0][0] or 0.0

Expand Down

0 comments on commit b0edf71

Please sign in to comment.