From 86c0e230a1257bed83331bf4ee69265c080e4680 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Mon, 27 Apr 2026 21:01:49 -0400 Subject: [PATCH] =?UTF-8?q?feat(sub12b):=20fp.rack.tag=20=E2=80=94=20rack-?= =?UTF-8?q?label=20registry=20+=204=20starter=20tags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M2M tag registry: Rush / Hold for QC / Damaged / Customer Sample. Each rack can carry many tags; tags surface as coloured chips on the plant-overview rack rows + Move Rack dialog (Task 13). Plating → Configuration → Rack Tags menu (sequence 48). post_init_hook seeds 4 starters — idempotent (no-op if any exist). Co-Authored-By: Claude Opus 4.7 (1M context) --- fusion_plating/fusion_plating/__init__.py | 20 +++++++++++ .../fusion_plating/models/__init__.py | 3 ++ .../fusion_plating/models/fp_rack_tag.py | 33 ++++++++++++++++++ .../security/ir.model.access.csv | 3 ++ .../views/fp_rack_tag_views.xml | 34 +++++++++++++++++++ 5 files changed, 93 insertions(+) create mode 100644 fusion_plating/fusion_plating/models/fp_rack_tag.py create mode 100644 fusion_plating/fusion_plating/views/fp_rack_tag_views.xml diff --git a/fusion_plating/fusion_plating/__init__.py b/fusion_plating/fusion_plating/__init__.py index e27b75b8..6729e338 100644 --- a/fusion_plating/fusion_plating/__init__.py +++ b/fusion_plating/fusion_plating/__init__.py @@ -22,10 +22,12 @@ def post_init_hook(env): `kind` field. 3. Sub 12a — seed fp.step.template with starter library entries derived from ENP-ALUM-BASIC if the library is currently empty. + 4. Sub 12b — seed 4 starter rack tags if the registry is empty. """ _seed_default_timezone(env) _backfill_node_input_kind(env) _seed_step_library_if_empty(env) + _seed_rack_tags_if_empty(env) def _seed_default_timezone(env): @@ -185,3 +187,21 @@ def _seed_minimal_library(env): 'Fusion Plating: seeded minimal step library (%s entries)', len(minimal), ) + + +def _seed_rack_tags_if_empty(env): + """Sub 12b — seed 4 starter rack tags.""" + Tag = env['fp.rack.tag'] + if Tag.search_count([]): + return + starters = [ + ('Rush', 1), + ('Hold for QC', 3), + ('Damaged', 9), + ('Customer Sample', 5), + ] + for name, color in starters: + Tag.create({'name': name, 'color': color}) + _logger.info( + 'Fusion Plating: seeded %s starter rack tags', len(starters), + ) diff --git a/fusion_plating/fusion_plating/models/__init__.py b/fusion_plating/fusion_plating/models/__init__.py index 4d6e6036..bf11a616 100644 --- a/fusion_plating/fusion_plating/models/__init__.py +++ b/fusion_plating/fusion_plating/models/__init__.py @@ -37,3 +37,6 @@ from . import fp_process_node_inherit from . import fp_step_template from . import fp_step_template_input from . import fp_step_template_transition_input + +# Sub 12b — Rack-aware moves + persistent labor reconciliation +from . import fp_rack_tag diff --git a/fusion_plating/fusion_plating/models/fp_rack_tag.py b/fusion_plating/fusion_plating/models/fp_rack_tag.py new file mode 100644 index 00000000..0eeb3c4e --- /dev/null +++ b/fusion_plating/fusion_plating/models/fp_rack_tag.py @@ -0,0 +1,33 @@ +# -*- 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 FpRackTag(models.Model): + """Operator-visible labels applied to physical racks. + + "Rush" / "Hold for QC" / "Customer-Amphenol" / "Damaged" — the + coloured tag chips that appear in the Move Rack dialog and on the + plant-overview rack rows. M2M; one rack can carry many tags. + """ + _name = 'fp.rack.tag' + _description = 'Fusion Plating — Rack Tag' + _order = 'sequence, name' + + name = fields.Char(string='Tag', required=True, translate=True) + color = fields.Integer(string='Color') + sequence = fields.Integer(string='Sequence', default=10) + active = fields.Boolean(string='Active', default=True) + company_id = fields.Many2one( + 'res.company', string='Company', + default=lambda self: self.env.company, + ) + + _sql_constraints = [ + ('fp_rack_tag_name_company_uniq', + 'unique(name, company_id)', + 'Rack tag name must be unique within a company.'), + ] diff --git a/fusion_plating/fusion_plating/security/ir.model.access.csv b/fusion_plating/fusion_plating/security/ir.model.access.csv index 47eefb75..a94c186d 100644 --- a/fusion_plating/fusion_plating/security/ir.model.access.csv +++ b/fusion_plating/fusion_plating/security/ir.model.access.csv @@ -70,3 +70,6 @@ access_fp_step_template_input_manager,fp.step.template.input.manager,model_fp_st access_fp_step_template_transition_input_operator,fp.step.template.transition.input.operator,model_fp_step_template_transition_input,group_fusion_plating_operator,1,0,0,0 access_fp_step_template_transition_input_supervisor,fp.step.template.transition.input.supervisor,model_fp_step_template_transition_input,group_fusion_plating_supervisor,1,1,1,1 access_fp_step_template_transition_input_manager,fp.step.template.transition.input.manager,model_fp_step_template_transition_input,group_fusion_plating_manager,1,1,1,1 +access_fp_rack_tag_operator,fp.rack.tag.operator,model_fp_rack_tag,group_fusion_plating_operator,1,0,0,0 +access_fp_rack_tag_supervisor,fp.rack.tag.supervisor,model_fp_rack_tag,group_fusion_plating_supervisor,1,1,1,1 +access_fp_rack_tag_manager,fp.rack.tag.manager,model_fp_rack_tag,group_fusion_plating_manager,1,1,1,1 diff --git a/fusion_plating/fusion_plating/views/fp_rack_tag_views.xml b/fusion_plating/fusion_plating/views/fp_rack_tag_views.xml new file mode 100644 index 00000000..10cf051e --- /dev/null +++ b/fusion_plating/fusion_plating/views/fp_rack_tag_views.xml @@ -0,0 +1,34 @@ + + + + + + fp.rack.tag.list + fp.rack.tag + + + + + + + + + + + + Rack Tags + fp.rack.tag + list + + + + +