diff --git a/fusion_plating/fusion_plating/__manifest__.py b/fusion_plating/fusion_plating/__manifest__.py index 0b3116b7..09a96c4a 100644 --- a/fusion_plating/fusion_plating/__manifest__.py +++ b/fusion_plating/fusion_plating/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating', - 'version': '19.0.8.3.0', + 'version': '19.0.8.3.1', 'category': 'Manufacturing/Plating', 'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.', 'description': """ diff --git a/fusion_plating/fusion_plating/models/fp_job.py b/fusion_plating/fusion_plating/models/fp_job.py index 54efbc38..5c917f45 100644 --- a/fusion_plating/fusion_plating/models/fp_job.py +++ b/fusion_plating/fusion_plating/models/fp_job.py @@ -122,6 +122,7 @@ class FpJob(models.Model): # ------------------------------------------------------------------ currency_id = fields.Many2one( 'res.currency', + required=True, default=lambda self: self.env.company.currency_id, ) quoted_revenue = fields.Monetary( @@ -141,9 +142,13 @@ class FpJob(models.Model): ) @api.depends('quoted_revenue') - # NOTE: when fp.job.step lands in Task 1.5, this dependency expands - # to include 'step_ids.cost_total'. For now actual_cost is always 0. def _compute_costs(self): + """Cost rollup for the job header. + + TODO(Task 1.5): when fp.job.step lands, expand @api.depends to + include 'step_ids.cost_total' so actual_cost rolls up + step time × work_centre.cost_per_hour automatically. + """ for job in self: job.actual_cost = 0.0 job.margin = job.quoted_revenue - job.actual_cost diff --git a/fusion_plating/fusion_plating/tests/test_fp_job_state_machine.py b/fusion_plating/fusion_plating/tests/test_fp_job_state_machine.py index 4c06d7b2..a2f750ea 100644 --- a/fusion_plating/fusion_plating/tests/test_fp_job_state_machine.py +++ b/fusion_plating/fusion_plating/tests/test_fp_job_state_machine.py @@ -86,3 +86,9 @@ class TestFpJobStateMachine(TransactionCase): self.assertEqual(job.actual_cost, 0.0) self.assertEqual(job.margin, 1000.0) self.assertEqual(job.margin_pct, 100.0) + + def test_current_location_for_confirmed(self): + job = self._make_job() + job.action_confirm() + # Forces compute via field read; expect title-cased state + self.assertEqual(job.current_location, 'Confirmed')