From 2e5ae188d65a865db9c7973e05e6ad926fd05757 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 11 Aug 2026 13:41:57 +0530 Subject: [PATCH] fix: require material transfer before job card time logs v15 adaptation of the develop fix: the timer flow here runs through add_time_log via make_time_log, so gate that instead of the start_timer/complete_job_card methods that only exist on develop, and hide Start Job while transfer is pending. Corrective job cards and job cards without items (transfer against Work Order) stay exempt, matching validate_transfer_qty on submit. --- erpnext/manufacturing/doctype/job_card/job_card.js | 9 +++++++++ erpnext/manufacturing/doctype/job_card/job_card.py | 2 ++ 2 files changed, 11 insertions(+) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.js b/erpnext/manufacturing/doctype/job_card/job_card.js index cc8bdf04176..52423c600d9 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.js +++ b/erpnext/manufacturing/doctype/job_card/job_card.js @@ -296,7 +296,16 @@ frappe.ui.form.on("Job Card", { prepare_timer_buttons: function (frm) { frm.trigger("make_dashboard"); + const transfer_pending = + !frm.doc.is_corrective_job_card && + (frm.doc.items || []).length && + flt(frm.doc.transferred_qty) < flt(frm.doc.for_quantity); + if (!frm.doc.started_time && !frm.doc.current_time) { + if (transfer_pending) { + return; + } + frm.add_custom_button(__("Start Job"), () => { if ((frm.doc.employee && !frm.doc.employee.length) || !frm.doc.employee) { frappe.prompt( diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 9fddeda3e96..b1854088975 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -513,6 +513,8 @@ class JobCard(Document): ) def add_time_log(self, args): + self.validate_transfer_qty() + last_row = [] employees = args.employees if isinstance(employees, str):