mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-01 07:37:04 +00:00
Merge pull request #58009 from mihir-kandoi/require-transfer-before-job-card-start
fix: require material transfer before job card start and completion
This commit is contained in:
@@ -597,8 +597,7 @@ frappe.ui.form.on("Job Card", {
|
|||||||
const has_remaining_qty = doc.for_quantity + doc.process_loss_qty > doc.total_completed_qty;
|
const has_remaining_qty = doc.for_quantity + doc.process_loss_qty > doc.total_completed_qty;
|
||||||
const pending_transfer =
|
const pending_transfer =
|
||||||
has_items && doc.items.some((row) => flt(row.transferred_qty) < flt(row.required_qty));
|
has_items && doc.items.some((row) => flt(row.transferred_qty) < flt(row.required_qty));
|
||||||
const materials_ready =
|
const materials_ready = doc.skip_material_transfer || doc.is_corrective_job_card || !pending_transfer;
|
||||||
doc.skip_material_transfer || !pending_transfer || !doc.finished_good || !has_items;
|
|
||||||
|
|
||||||
let last_row = {};
|
let last_row = {};
|
||||||
const has_sub_ops_or_pending_qty = doc.sub_operations?.length || doc.pending_qty > 0;
|
const has_sub_ops_or_pending_qty = doc.sub_operations?.length || doc.pending_qty > 0;
|
||||||
|
|||||||
@@ -1692,6 +1692,7 @@ class JobCard(Document):
|
|||||||
frappe.has_permission("Job Card", "write", doc=self, throw=True)
|
frappe.has_permission("Job Card", "write", doc=self, throw=True)
|
||||||
|
|
||||||
self.validate_docstatus()
|
self.validate_docstatus()
|
||||||
|
self.validate_transfer_qty()
|
||||||
|
|
||||||
if isinstance(kwargs, dict):
|
if isinstance(kwargs, dict):
|
||||||
kwargs = frappe._dict(kwargs)
|
kwargs = frappe._dict(kwargs)
|
||||||
@@ -1707,6 +1708,7 @@ class JobCard(Document):
|
|||||||
frappe.has_permission("Job Card", "write", doc=self, throw=True)
|
frappe.has_permission("Job Card", "write", doc=self, throw=True)
|
||||||
|
|
||||||
self.validate_docstatus()
|
self.validate_docstatus()
|
||||||
|
self.validate_transfer_qty()
|
||||||
|
|
||||||
if isinstance(kwargs, dict):
|
if isinstance(kwargs, dict):
|
||||||
kwargs = frappe._dict(kwargs)
|
kwargs = frappe._dict(kwargs)
|
||||||
|
|||||||
@@ -383,6 +383,31 @@ class TestJobCard(ERPNextTestSuite):
|
|||||||
# JC is Completed with excess transfer
|
# JC is Completed with excess transfer
|
||||||
self.assertEqual(job_card.status, "Completed")
|
self.assertEqual(job_card.status, "Completed")
|
||||||
|
|
||||||
|
def test_job_card_actions_blocked_until_material_transfer(self):
|
||||||
|
"Start and Complete must wait for the transfer when RMs move against Job Card."
|
||||||
|
self.transfer_material_against = "Job Card"
|
||||||
|
self.source_warehouse = "Stores - _TC"
|
||||||
|
|
||||||
|
self.generate_required_stock(self.work_order)
|
||||||
|
job_card = frappe.get_last_doc("Job Card", {"work_order": self.work_order.name})
|
||||||
|
|
||||||
|
self.assertRaises(frappe.ValidationError, job_card.start_timer, start_time=now())
|
||||||
|
self.assertRaises(frappe.ValidationError, job_card.complete_job_card, qty=2, for_quantity=2)
|
||||||
|
|
||||||
|
transfer_entry = make_stock_entry_from_jc(job_card.name)
|
||||||
|
transfer_entry.insert()
|
||||||
|
transfer_entry.submit()
|
||||||
|
|
||||||
|
job_card.reload()
|
||||||
|
job_card.append("time_logs", {"from_time": "2024-03-01 08:00:00"})
|
||||||
|
job_card.save()
|
||||||
|
job_card.complete_job_card(
|
||||||
|
qty=2, for_quantity=2, pending_qty=0, process_loss_qty=0, end_time="2024-03-01 09:00:00"
|
||||||
|
)
|
||||||
|
|
||||||
|
job_card.reload()
|
||||||
|
self.assertEqual(flt(job_card.total_completed_qty), 2)
|
||||||
|
|
||||||
@ERPNextTestSuite.change_settings("Manufacturing Settings", {"job_card_excess_transfer": 0})
|
@ERPNextTestSuite.change_settings("Manufacturing Settings", {"job_card_excess_transfer": 0})
|
||||||
def test_job_card_excess_material_transfer_block(self):
|
def test_job_card_excess_material_transfer_block(self):
|
||||||
self.transfer_material_against = "Job Card"
|
self.transfer_material_against = "Job Card"
|
||||||
|
|||||||
Reference in New Issue
Block a user