feat(fusion_plating): kind.area_kind drives Shop Floor column routing

Add required area_kind Selection to fp.step.kind so each kind
self-declares which plant-view column its steps belong in. Replaces
the hardcoded _STEP_KIND_TO_AREA dict (removed in fp_job_step.py
in the follow-up commit).

- New `blast` kind for the Blasting column (sequence=35)
- 26 existing kind records seeded with area_kind in XML
- Pre-migrate 19.0.21.2.0 seeds existing rows BEFORE NOT NULL hits
  the schema; also activates derack/demask/gating that were
  deactivated in 19.0.20.6.0 but are needed for the full taxonomy
- Step Kind form + list views surface area_kind (badge + chip)
- Step Kind search adds Group By Shop Floor Column
- Simple Editor kind picker shows "Masking — Masking column"
  suffix so authors see the routing at pick time
- Add Hot Water Porosity Test (A-15) + Final Inspection / Packaging
  templates (used by 7+3 recipe nodes that previously had no
  library entry)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-24 17:02:02 -04:00
parent c75d2bde5a
commit 7b90f210b9
8 changed files with 223 additions and 10 deletions

View File

@@ -34,6 +34,32 @@ class FpStepKind(models.Model):
string='Icon',
default='fa-cog',
)
# 2026-05-24 — Shop Floor live-step fix.
# Each kind self-declares which plant-view column its steps land in.
# Replaces the hardcoded _STEP_KIND_TO_AREA dict (removed from
# fusion_plating_jobs/models/fp_job_step.py). Pre-migrate
# 19.0.21.2.0 seeds existing rows before NOT NULL hits the schema.
area_kind = fields.Selection(
[
('receiving', 'Receiving'),
('masking', 'Masking'),
('blasting', 'Blasting'),
('racking', 'Racking'),
('plating', 'Plating'),
('baking', 'Baking'),
('de_racking', 'De-Racking'),
('inspection', 'Final Inspection'),
('shipping', 'Shipping'),
],
string='Shop Floor Column',
required=True,
index=True,
tracking=True,
help='Determines which column on the Shop Floor plant kanban shows '
'cards whose active step uses this kind. Step kinds drive '
'routing automatically — picking a kind tells the system both '
'what gates fire AND where the card lives.',
)
company_id = fields.Many2one(
'res.company', string='Company',
default=lambda self: self.env.company,