Merge pull request #58467 from frappe/mergify/bp/version-16-hotfix/pr-58466

fix(manufacturing): account for pending job card qty (backport #58466)
This commit is contained in:
Sudharsanan Ashok
2026-08-27 16:13:54 +05:30
committed by GitHub
2 changed files with 32 additions and 15 deletions

View File

@@ -246,15 +246,16 @@ class JobCard(Document):
wo_qty = wo_qty + (wo_qty * over_production_percentage / 100)
job_card_qty = frappe.get_all(
"Job Card",
fields=[{"SUM": "for_quantity"}],
filters={
"work_order": self.work_order,
"operation_id": self.operation_id,
"docstatus": ["!=", 2],
},
as_list=1,
job_card = frappe.qb.DocType("Job Card")
job_card_qty = (
frappe.qb.from_(job_card)
.select(Sum(job_card.for_quantity - IfNull(job_card.pending_qty, 0)))
.where(
(job_card.work_order == self.work_order)
& (job_card.operation_id == self.operation_id)
& (job_card.docstatus != 2)
)
.run()
)
job_card_qty = flt(job_card_qty[0][0]) if job_card_qty else 0

View File

@@ -20,7 +20,7 @@ from erpnext.manufacturing.doctype.job_card.job_card import (
make_stock_entry as make_stock_entry_from_jc,
)
from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
from erpnext.manufacturing.doctype.work_order.work_order import WorkOrder, make_work_order
from erpnext.manufacturing.doctype.work_order.work_order import WorkOrder, make_job_card, make_work_order
from erpnext.manufacturing.doctype.workstation.test_workstation import make_workstation
from erpnext.patches.v16_0.set_stock_uom_in_job_card import execute as set_stock_uom_in_job_card
from erpnext.stock.doctype.item.test_item import create_item
@@ -1822,16 +1822,16 @@ class TestJobCard(ERPNextTestSuite):
job_card.save()
job_card.complete_job_card(
qty=3,
qty=2,
for_quantity=5,
pending_qty=2,
pending_qty=3,
process_loss_qty=0,
end_time="2024-04-01 09:00:00",
)
job_card.reload()
self.assertEqual(flt(job_card.for_quantity), 5)
self.assertEqual(flt(job_card.pending_qty), 2)
self.assertEqual(flt(job_card.pending_qty), 3)
self.assertEqual(flt(job_card.process_loss_qty), 0)
job_card.submit()
@@ -1839,13 +1839,29 @@ class TestJobCard(ERPNextTestSuite):
manufacturing_entry = frappe.get_doc(job_card.make_stock_entry_for_semi_fg_item())
finished_item = next(row for row in manufacturing_entry.items if row.is_finished_item)
self.assertEqual(flt(finished_item.qty), 3)
self.assertEqual(flt(finished_item.qty), 2)
manufacturing_entry.submit()
job_card.reload()
self.assertEqual(flt(job_card.manufactured_qty), 3)
self.assertEqual(flt(job_card.manufactured_qty), 2)
self.assertEqual(job_card.status, "Completed")
make_job_card(
work_order.name,
[
{
"name": work_order.operations[0].name,
"operation": "Pending Qty Op A",
"qty": 3,
"pending_qty": 3,
}
],
)
follow_up_job_card = frappe.get_last_doc(
"Job Card", {"work_order": work_order.name, "operation_id": work_order.operations[0].name}
)
self.assertEqual(flt(follow_up_job_card.for_quantity), 3)
def test_semi_fg_sequence_needs_previous_operations_manufactured(self):
from erpnext.manufacturing.doctype.operation.test_operation import make_operation
from erpnext.stock.doctype.item.test_item import make_item