From 9d88c25136993fb7a2fd7742de2df2e5e9e0db72 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Mon, 27 Apr 2026 21:42:03 -0400 Subject: [PATCH] feat(sub12c): chronological CoC body + body_style opt-in router (Task 3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New template: fusion_plating_reports.coc_body_chronological. Walks fp.job.step.move records in time order (chain-of-custody). Per-move heading 'Step Name (Tank Code)' with 'Moved By / Time / Qty' meta line + a 5-column measurement sub-table (Name / Description / Target / Actual / Recorded By) when the destination step has captured inputs. Heading-only when there are no inputs (gating moves). New router template: coc_body_router. Picks chronological vs classic based on fp.certificate.body_style. Existing certs default to 'classic' so no regressions. Both English + French CoC templates rerouted. fp.certificate.body_style ('classic' | 'chronological') exposed on the cert form alongside certified_by_id. Operator picks per cert. Sign-off block reuses the existing owner_user_id signature pattern + x_fc_coc_signature_override fallback. Cert statement boilerplate is inline (Sub 12d will move it to a configurable per-customer field). The Actual column in the measurement sub-table is rendered blank because Sub 12a/12b runtime captures step_input values via the operator's per-step input form which lives in a model not yet wired into this template — Sub 12d follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../models/fp_certificate.py | 12 + .../views/fp_certificate_views.xml | 1 + .../report/report_coc.xml | 6 +- .../report/report_coc_chronological.xml | 211 ++++++++++++++++++ 4 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 fusion_plating/fusion_plating_reports/report/report_coc_chronological.xml diff --git a/fusion_plating/fusion_plating_certificates/models/fp_certificate.py b/fusion_plating/fusion_plating_certificates/models/fp_certificate.py index e0bd68b4..13e2edf7 100644 --- a/fusion_plating/fusion_plating_certificates/models/fp_certificate.py +++ b/fusion_plating/fusion_plating_certificates/models/fp_certificate.py @@ -70,6 +70,18 @@ class FpCertificate(models.Model): certified_by_id = fields.Many2one( 'res.users', string='Certified By', help='Signing authority (e.g. Quality Manager).', ) + + # ===== Sub 12c — chronological CoC opt-in =============================== + body_style = fields.Selection( + [ + ('classic', 'Classic (recipe-order)'), + ('chronological', 'Chronological (chain-of-custody)'), + ], + string='CoC Body Style', default='classic', + help='Chronological walks fp.job.step.move records in time order ' + 'with measurement sub-tables per move, matching Steelhead\'s ' + 'CoC PDF layout. Classic uses the existing recipe-order body.', + ) issue_date = fields.Date(string='Issue Date', default=fields.Date.today, tracking=True) attachment_id = fields.Many2one('ir.attachment', string='Certificate PDF') thickness_reading_ids = fields.One2many( diff --git a/fusion_plating/fusion_plating_certificates/views/fp_certificate_views.xml b/fusion_plating/fusion_plating_certificates/views/fp_certificate_views.xml index 02d12422..7cac6fc8 100644 --- a/fusion_plating/fusion_plating_certificates/views/fp_certificate_views.xml +++ b/fusion_plating/fusion_plating_certificates/views/fp_certificate_views.xml @@ -93,6 +93,7 @@ + diff --git a/fusion_plating/fusion_plating_reports/report/report_coc.xml b/fusion_plating/fusion_plating_reports/report/report_coc.xml index 94eaa42b..41ac16b4 100644 --- a/fusion_plating/fusion_plating_reports/report/report_coc.xml +++ b/fusion_plating/fusion_plating_reports/report/report_coc.xml @@ -307,7 +307,8 @@
- + +
@@ -324,7 +325,8 @@
- + +
diff --git a/fusion_plating/fusion_plating_reports/report/report_coc_chronological.xml b/fusion_plating/fusion_plating_reports/report/report_coc_chronological.xml new file mode 100644 index 00000000..bc40666a --- /dev/null +++ b/fusion_plating/fusion_plating_reports/report/report_coc_chronological.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + +