diff --git a/erpnext/manufacturing/doctype/job_card/test_job_card.py b/erpnext/manufacturing/doctype/job_card/test_job_card.py index 1d58ebb5bce..c12710318bd 100644 --- a/erpnext/manufacturing/doctype/job_card/test_job_card.py +++ b/erpnext/manufacturing/doctype/job_card/test_job_card.py @@ -361,6 +361,31 @@ class TestJobCard(ERPNextTestSuite): # JC is Completed with excess transfer 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}) def test_job_card_excess_material_transfer_block(self): self.transfer_material_against = "Job Card"