From 1f20eb3d2ae7a5fe98676376d40a87ce574ffdcd Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Tue, 19 May 2026 15:15:50 -0400 Subject: [PATCH] feat(claims): add x_fc_pages_11_12_in_original + computed gate New boolean on sale.order tracks whether pages 11 & 12 are bundled inside the original application PDF. Computed helper x_fc_has_signed_pages_11_12 ORs bundled flag with separate-file and remote-signing presence so downstream gates can read one field. Co-Authored-By: Claude Opus 4.7 (1M context) --- fusion_claims/models/sale_order.py | 33 +++++++++- fusion_claims/tests/__init__.py | 3 + fusion_claims/tests/test_signed_pages_gate.py | 60 +++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 fusion_claims/tests/__init__.py create mode 100644 fusion_claims/tests/test_signed_pages_gate.py diff --git a/fusion_claims/models/sale_order.py b/fusion_claims/models/sale_order.py index 332977c2..d4b1a41c 100644 --- a/fusion_claims/models/sale_order.py +++ b/fusion_claims/models/sale_order.py @@ -2909,7 +2909,38 @@ class SaleOrder(models.Model): x_fc_signed_pages_filename = fields.Char( string='Signed Pages Filename', ) - + + x_fc_pages_11_12_in_original = fields.Boolean( + string='Pages 11 & 12 in Original Application', + default=False, + tracking=True, + copy=False, + help='True when the original application PDF already contains the signed pages 11 & 12.', + ) + + x_fc_has_signed_pages_11_12 = fields.Boolean( + string='Has Signed Pages 11 & 12', + compute='_compute_has_signed_pages_11_12', + store=True, + help=( + 'True if pages 11 & 12 are satisfied — either bundled in the original ' + 'application, uploaded as a separate file, or signed via remote signing.' + ), + ) + + @api.depends( + 'x_fc_signed_pages_11_12', + 'x_fc_pages_11_12_in_original', + 'page11_sign_request_ids.state', + ) + def _compute_has_signed_pages_11_12(self): + for order in self: + order.x_fc_has_signed_pages_11_12 = bool( + order.x_fc_pages_11_12_in_original + or order.x_fc_signed_pages_11_12 + or order.page11_sign_request_ids.filtered(lambda r: r.state == 'signed') + ) + # ========================================================================== # PAGE 11 SIGNATURE TRACKING (Client/Agent Signature) # Page 11 must be signed by: Client, Spouse, Parent, Legal Guardian, POA, or Public Trustee diff --git a/fusion_claims/tests/__init__.py b/fusion_claims/tests/__init__.py new file mode 100644 index 00000000..6ed155d2 --- /dev/null +++ b/fusion_claims/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_signed_pages_gate diff --git a/fusion_claims/tests/test_signed_pages_gate.py b/fusion_claims/tests/test_signed_pages_gate.py new file mode 100644 index 00000000..f796699d --- /dev/null +++ b/fusion_claims/tests/test_signed_pages_gate.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +import base64 + +from odoo.tests.common import TransactionCase, tagged + + +PDF_MAGIC = b'%PDF-1.4\n%fake pdf for tests' + + +def _b64_pdf(): + return base64.b64encode(PDF_MAGIC) + + +@tagged('-at_install', 'post_install', 'fusion_claims') +class TestSignedPagesGate(TransactionCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env['res.partner'].create({'name': 'Test Client'}) + cls.order = cls.env['sale.order'].create({ + 'partner_id': cls.partner.id, + 'x_fc_adp_application_status': 'waiting_for_application', + }) + + def test_pages_11_12_in_original_defaults_false(self): + self.assertFalse(self.order.x_fc_pages_11_12_in_original) + + def test_has_signed_pages_false_when_nothing_set(self): + self.assertFalse(self.order.x_fc_has_signed_pages_11_12) + + def test_has_signed_pages_true_when_bundled_flag_set(self): + self.order.x_fc_pages_11_12_in_original = True + self.order.flush_recordset() + self.assertTrue(self.order.x_fc_has_signed_pages_11_12) + + def test_has_signed_pages_true_when_separate_file_uploaded(self): + self.order.x_fc_signed_pages_11_12 = _b64_pdf() + self.order.flush_recordset() + self.assertTrue(self.order.x_fc_has_signed_pages_11_12) + + def test_has_signed_pages_true_when_remote_request_signed(self): + self.env['fusion.page11.sign.request'].create({ + 'sale_order_id': self.order.id, + 'signer_email': 'test@example.com', + 'signer_type': 'client', + 'state': 'signed', + }) + self.order.invalidate_recordset() + self.assertTrue(self.order.x_fc_has_signed_pages_11_12) + + def test_has_signed_pages_false_when_remote_request_only_sent(self): + self.env['fusion.page11.sign.request'].create({ + 'sale_order_id': self.order.id, + 'signer_email': 'test@example.com', + 'signer_type': 'client', + 'state': 'sent', + }) + self.order.invalidate_recordset() + self.assertFalse(self.order.x_fc_has_signed_pages_11_12)