Merge pull request #29618 from frappe/mergify/copy/develop/pr-29603

fix: Multiple WO for a single Production Plan Item (copy #29603)
This commit is contained in:
Ankush Menat 2022-02-03 15:52:54 +05:30 committed by GitHub
commit a7a2b82538
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 1 deletions

View File

@ -385,6 +385,61 @@ class TestProductionPlan(ERPNextTestCase):
# lowest most level of subassembly should be first
self.assertIn("SuperSecret", plan.sub_assembly_items[0].production_item)
def test_multiple_work_order_for_production_plan_item(self):
def create_work_order(item, pln, qty):
# Get Production Items
items_data = pln.get_production_items()
# Update qty
items_data[(item, None, None)]["qty"] = qty
# Create and Submit Work Order for each item in items_data
for key, item in items_data.items():
if pln.sub_assembly_items:
item['use_multi_level_bom'] = 0
wo_name = pln.create_work_order(item)
wo_doc = frappe.get_doc("Work Order", wo_name)
wo_doc.update({
'wip_warehouse': 'Work In Progress - _TC',
'fg_warehouse': 'Finished Goods - _TC'
})
wo_doc.submit()
wo_list.append(wo_name)
item = "Test Production Item 1"
raw_materials = ["Raw Material Item 1", "Raw Material Item 2"]
# Create BOM
bom = make_bom(item=item, raw_materials=raw_materials)
# Create Production Plan
pln = create_production_plan(item_code=bom.item, planned_qty=10)
# All the created Work Orders
wo_list = []
# Create and Submit 1st Work Order for 5 qty
create_work_order(item, pln, 5)
pln.reload()
self.assertEqual(pln.po_items[0].ordered_qty, 5)
# Create and Submit 2nd Work Order for 3 qty
create_work_order(item, pln, 3)
pln.reload()
self.assertEqual(pln.po_items[0].ordered_qty, 8)
# Cancel 1st Work Order
wo1 = frappe.get_doc("Work Order", wo_list[0])
wo1.cancel()
pln.reload()
self.assertEqual(pln.po_items[0].ordered_qty, 3)
# Cancel 2nd Work Order
wo2 = frappe.get_doc("Work Order", wo_list[1])
wo2.cancel()
pln.reload()
self.assertEqual(pln.po_items[0].ordered_qty, 0)
def create_production_plan(**args):
args = frappe._dict(args)

View File

@ -449,7 +449,13 @@ class WorkOrder(Document):
def update_ordered_qty(self):
if self.production_plan and self.production_plan_item:
qty = self.qty if self.docstatus == 1 else 0
qty = frappe.get_value("Production Plan Item", self.production_plan_item, "ordered_qty") or 0.0
if self.docstatus == 1:
qty += self.qty
elif self.docstatus == 2:
qty -= self.qty
frappe.db.set_value('Production Plan Item',
self.production_plan_item, 'ordered_qty', qty)