feat(portal): per-stage timestamps on fp.portal.job

Adds received_at, in_progress_started_at, qc_started_at,
ready_to_ship_at, shipped_at - snapshotted on state change via
write() override using super().write() to avoid recursion. Required
for the vertical-timeline rendering on the job detail page (Phase 3).

Idempotent: re-transitioning to a state already-stamped does not
overwrite the original timestamp.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-17 02:47:08 -04:00
parent 06df9745a0
commit 9d58f5f61e
2 changed files with 75 additions and 0 deletions

View File

@@ -57,3 +57,20 @@ class TestPortalDashboard(TransactionCase):
self.assertEqual(active, 2)
self.assertEqual(awaiting_review, 1)
self.assertEqual(ready_to_ship, 1)
def test_state_change_snapshots_timestamp(self):
"""write({'state': 'in_progress'}) sets in_progress_started_at."""
from odoo import fields as odoo_fields
Job = self.env['fusion.plating.portal.job']
job = Job.create({
'name': 'WO-TS-001',
'partner_id': self.partner.id,
'state': 'received',
})
self.assertTrue(job.received_at, 'received_at set on create')
before = odoo_fields.Datetime.now()
job.state = 'in_progress'
self.assertTrue(job.in_progress_started_at, 'in_progress_started_at set')
self.assertGreaterEqual(job.in_progress_started_at, before)
# received_at must not be overwritten when state advances
self.assertTrue(job.received_at)