From ec8b26f8c8ea6c630cc5eaad1a24533d6e459d07 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 12 Apr 2026 19:42:33 -0400 Subject: [PATCH] feat(certificates): module scaffold + fp.thickness.reading model Co-Authored-By: Claude Opus 4.6 (1M context) --- .../fusion_plating_certificates/__init__.py | 6 ++ .../__manifest__.py | 40 ++++++++++++ .../data/fp_certificate_sequence_data.xml | 10 +++ .../models/__init__.py | 7 ++ .../models/fp_certificate.py | 6 ++ .../models/fp_thickness_reading.py | 61 ++++++++++++++++++ .../security/ir.model.access.csv | 7 ++ .../static/description/icon.png | Bin 0 -> 26098 bytes .../views/fp_certificate_views.xml | 2 + .../views/fp_certificates_menu.xml | 2 + 10 files changed, 141 insertions(+) create mode 100644 fusion-plating/fusion_plating_certificates/__init__.py create mode 100644 fusion-plating/fusion_plating_certificates/__manifest__.py create mode 100644 fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml create mode 100644 fusion-plating/fusion_plating_certificates/models/__init__.py create mode 100644 fusion-plating/fusion_plating_certificates/models/fp_certificate.py create mode 100644 fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py create mode 100644 fusion-plating/fusion_plating_certificates/security/ir.model.access.csv create mode 100644 fusion-plating/fusion_plating_certificates/static/description/icon.png create mode 100644 fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml create mode 100644 fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml diff --git a/fusion-plating/fusion_plating_certificates/__init__.py b/fusion-plating/fusion_plating_certificates/__init__.py new file mode 100644 index 00000000..3c90fa80 --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from . import models diff --git a/fusion-plating/fusion_plating_certificates/__manifest__.py b/fusion-plating/fusion_plating_certificates/__manifest__.py new file mode 100644 index 00000000..7244aa4a --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/__manifest__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +{ + 'name': 'Fusion Plating — Certificates', + 'version': '19.0.1.0.0', + 'category': 'Manufacturing/Plating', + 'summary': 'Certificate registry for CoC, thickness reports, and quality documents.', + 'description': """ +Fusion Plating — Certificates +=============================== + +Unified certificate registry tracking all quality documents issued to customers. +Includes Fischerscope thickness measurement data capture. +""", + 'author': 'Nexa Systems Inc.', + 'website': 'https://www.nexasystems.ca', + 'maintainer': 'Nexa Systems Inc.', + 'support': 'support@nexasystems.ca', + 'license': 'OPL-1', + 'price': 0.00, + 'currency': 'CAD', + 'depends': [ + 'fusion_plating', + 'fusion_plating_portal', + 'mrp', + 'sale_management', + ], + 'data': [ + 'security/ir.model.access.csv', + 'data/fp_certificate_sequence_data.xml', + 'views/fp_certificate_views.xml', + 'views/fp_certificates_menu.xml', + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml b/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml new file mode 100644 index 00000000..4e4c4211 --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml @@ -0,0 +1,10 @@ + + + + Fusion Plating: Certificate + fp.certificate + CERT- + 5 + + + diff --git a/fusion-plating/fusion_plating_certificates/models/__init__.py b/fusion-plating/fusion_plating_certificates/models/__init__.py new file mode 100644 index 00000000..0881ff43 --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from . import fp_thickness_reading +from . import fp_certificate diff --git a/fusion-plating/fusion_plating_certificates/models/fp_certificate.py b/fusion-plating/fusion_plating_certificates/models/fp_certificate.py new file mode 100644 index 00000000..8c2367be --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/models/fp_certificate.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +# Placeholder — fp.certificate model will be implemented in a subsequent task. diff --git a/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py b/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py new file mode 100644 index 00000000..ee43b393 --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from odoo import fields, models + + +class FpThicknessReading(models.Model): + """Fischerscope thickness measurement data. + + Captures individual XRF readings from equipment like the + Fischerscope XDAL 600. Linked to certificates and/or MOs. + Data is manually entered for now; future: CSV import from equipment. + """ + _name = 'fp.thickness.reading' + _description = 'Fusion Plating — Thickness Reading' + _order = 'reading_number' + + certificate_id = fields.Many2one( + 'fp.certificate', string='Certificate', ondelete='cascade', + ) + production_id = fields.Many2one( + 'mrp.production', string='Manufacturing Order', + ) + reading_number = fields.Integer( + string='Reading #', default=1, help='Sequence number (n=1, n=2, n=3).', + ) + nip_mils = fields.Float( + string='NiP (mils)', digits=(10, 4), help='NiP thickness in mils.', + ) + ni_percent = fields.Float( + string='Ni %', digits=(6, 3), help='Nickel content percentage.', + ) + p_percent = fields.Float( + string='P %', digits=(6, 4), help='Phosphorus content percentage.', + ) + position_label = fields.Char( + string='Position', help='Where on the part this reading was taken.', + ) + equipment_model = fields.Char( + string='Equipment', default='Fischerscope XDAL 600', + ) + product_ref = fields.Char( + string='Product Ref', help='e.g. "2805031 / NiP/Al-alloys 2805030"', + ) + calibration_std_ref = fields.Char( + string='Calibration Std', help='e.g. "NiP/Al STD SET SN 100174568"', + ) + microscope_image_id = fields.Many2one( + 'ir.attachment', string='Microscope Image', + ) + operator_id = fields.Many2one( + 'res.users', string='Operator', default=lambda self: self.env.user, + ) + reading_datetime = fields.Datetime( + string='Reading Date/Time', default=fields.Datetime.now, + ) + measuring_time_seconds = fields.Integer( + string='Measuring Time (sec)', default=120, + ) diff --git a/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv b/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv new file mode 100644 index 00000000..0ebe99ce --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_fp_certificate_operator,fp.certificate.operator,model_fp_certificate,fusion_plating.group_fusion_plating_operator,1,0,0,0 +access_fp_certificate_supervisor,fp.certificate.supervisor,model_fp_certificate,fusion_plating.group_fusion_plating_supervisor,1,1,1,0 +access_fp_certificate_manager,fp.certificate.manager,model_fp_certificate,fusion_plating.group_fusion_plating_manager,1,1,1,1 +access_fp_thickness_reading_operator,fp.thickness.reading.operator,model_fp_thickness_reading,fusion_plating.group_fusion_plating_operator,1,0,0,0 +access_fp_thickness_reading_supervisor,fp.thickness.reading.supervisor,model_fp_thickness_reading,fusion_plating.group_fusion_plating_supervisor,1,1,1,0 +access_fp_thickness_reading_manager,fp.thickness.reading.manager,model_fp_thickness_reading,fusion_plating.group_fusion_plating_manager,1,1,1,1 diff --git a/fusion-plating/fusion_plating_certificates/static/description/icon.png b/fusion-plating/fusion_plating_certificates/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a61b43b754b5fb731a00ff8a06813e810c73f0dc GIT binary patch literal 26098 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 B49x%l literal 0 HcmV?d00001 diff --git a/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml b/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml b/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml @@ -0,0 +1,2 @@ + +