Implements 2026-04-29-step-library-audit-design.md. Bumps fusion_plating to 19.0.18.7.0, fusion_plating_jobs to 19.0.8.12.0, fusion_plating_reports to 19.0.10.2.0. LIBRARY EXPANSION - 8 new Step Kinds: Receiving, Electroclean, Strike, Salt Spray, Adhesion Test, Hardness Test, Packaging, Tank Replenishment - 4 new input types: photo, multi_point_thickness, bath_chemistry_panel, ph - DEFAULT_INPUTS_BY_KIND rewritten to seed audit-grade prompts on every kind (bath IDs, photos, multi-point thickness, signatures, etc.) - + Common Audit Fields one-click button on the library template form - Default Operator Instructions relabel + alert callout PER-RECIPE CONFIGURABILITY - collect (Boolean) per recipe-step input prompt — opt out without delete - collect_measurements (Boolean) master switch on recipe step — when off, wizard skips entirely - template_input_id (Many2one) traceability link from recipe to library - Recipe-step backend form view exposes the new fields with handle drag, toggle, target range, and library-source column RUNTIME WIRING - Step input wizard filters node.input_ids to step_input AND collect=True; short-circuits on collect_measurements=False - New input types: photo (image widget + ir.attachment), multi-point thickness (5 readings + auto avg, skips empty cells), bath chemistry panel (pH/conc/temp/bath bundle), pH (0-14 numeric) - Composite values JSON-serialized into value_text; photo via attachment CoC REPORT - Filters captured prompts to collect=True only - Renders new input types with appropriate format MIGRATION (post-migrate.py for 19.0.18.7.0) - Backfills collect=True on recipe-step inputs - Backfills collect_measurements=True on recipe steps - Re-runs action_seed_default_inputs on every existing template (idempotent, preserves user edits) - Backfills template_input_id by name-matching against source library template (handles JSONB vs varchar name columns) SEED DATA - 8 example templates (one per new kind) in fp_step_template_data.xml with noupdate=1 BATTLE TEST - bt_step_library_audit.py: 29 assertions all PASS on entech OWL EDITOR EXTENSION DEFERRED - The simple recipe editor's per-step Instructions/Measurements expansions were not implemented in this pass; users configure via the backend recipe-step form. Track follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
# -*- 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
|
|
|
|
from ._fp_uom_selection import FP_UOM_SELECTION
|
|
|
|
|
|
class FpStepTemplateInput(models.Model):
|
|
"""Operation measurement definition on a step library template.
|
|
|
|
Recorded *during* a step (e.g. "Actual Time", "Plating Thickness").
|
|
Distinct from transition_input_ids which fire when leaving the
|
|
step.
|
|
"""
|
|
_name = 'fp.step.template.input'
|
|
_description = 'Fusion Plating — Step Template Input'
|
|
_order = 'sequence, name'
|
|
|
|
name = fields.Char(string='Name', required=True, translate=True)
|
|
template_id = fields.Many2one(
|
|
'fp.step.template', string='Template',
|
|
required=True, ondelete='cascade', index=True,
|
|
)
|
|
input_type = fields.Selection([
|
|
('text', 'Text'),
|
|
('number', 'Number'),
|
|
('boolean', 'Yes/No'),
|
|
('selection', 'Selection'),
|
|
('date', 'Date / Time'),
|
|
('signature', 'Signature'),
|
|
('time_hms', 'Time (HH:MM:SS)'),
|
|
('time_seconds', 'Time (seconds)'),
|
|
('temperature', 'Temperature'),
|
|
('thickness', 'Thickness'),
|
|
('pass_fail', 'Pass / Fail'),
|
|
('photo', 'Photo'),
|
|
('multi_point_thickness', 'Multi-Point Thickness (avg)'),
|
|
('bath_chemistry_panel', 'Bath Chemistry Panel'),
|
|
('ph', 'pH'),
|
|
], string='Input Type', required=True, default='text')
|
|
target_min = fields.Float(string='Target Min',
|
|
help='Lower bound of the acceptable range, expressed in Target Unit.')
|
|
target_max = fields.Float(string='Target Max',
|
|
help='Upper bound of the acceptable range, expressed in Target Unit.')
|
|
target_unit = fields.Selection(FP_UOM_SELECTION, string='Target Unit',
|
|
help='Unit Target Min / Target Max are measured in. Pick from the '
|
|
'curated list to keep readings consistent across templates.')
|
|
required = fields.Boolean(string='Required', default=False,
|
|
help='If True, sign-off is hard-blocked while this input is blank.')
|
|
hint = fields.Char(string='Hint')
|
|
selection_options = fields.Text(string='Selection Options',
|
|
help='Comma-separated when input_type is "selection".')
|
|
sequence = fields.Integer(string='Sequence', default=10)
|