feat(step-library): full plating workflow coverage + per-recipe configurability + audit
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>
This commit is contained in:
@@ -103,6 +103,15 @@ class FpProcessNode(models.Model):
|
||||
string='Description',
|
||||
help='Rich text instructions for this step.',
|
||||
)
|
||||
# Sub 12d — master switch for runtime data collection. When False the
|
||||
# operator wizard skips this step entirely (no input prompts shown).
|
||||
collect_measurements = fields.Boolean(
|
||||
string='Collect Measurements at Runtime',
|
||||
default=True,
|
||||
help='Master switch. When off, the operator wizard skips this step '
|
||||
'entirely (no input prompts shown). Use for housekeeping steps '
|
||||
'or when no measurement is needed for this recipe.',
|
||||
)
|
||||
notes = fields.Text(
|
||||
string='Internal Notes',
|
||||
help='Internal notes (not shown to customers).',
|
||||
@@ -633,6 +642,10 @@ class FpProcessNodeInput(models.Model):
|
||||
('signature', 'Signature'),
|
||||
('location_picker', 'Location Picker'),
|
||||
('customer_wo', 'Customer WO #'),
|
||||
('photo', 'Photo'),
|
||||
('multi_point_thickness', 'Multi-Point Thickness (avg)'),
|
||||
('bath_chemistry_panel', 'Bath Chemistry Panel'),
|
||||
('ph', 'pH'),
|
||||
],
|
||||
string='Input Type',
|
||||
required=True,
|
||||
@@ -695,3 +708,21 @@ class FpProcessNodeInput(models.Model):
|
||||
],
|
||||
string='Compliance Tag', default='none',
|
||||
)
|
||||
|
||||
# ===== Sub 12d — per-recipe configurability =============================
|
||||
collect = fields.Boolean(
|
||||
string='Collect This Measurement',
|
||||
default=True,
|
||||
help='Toggle off to skip this prompt at runtime without deleting '
|
||||
'it. Recipe authors use this to opt out of library-seeded '
|
||||
'prompts without affecting the library itself.',
|
||||
)
|
||||
template_input_id = fields.Many2one(
|
||||
'fp.step.template.input',
|
||||
string='Source Library Prompt',
|
||||
ondelete='set null',
|
||||
help='Set when this row was snapshot-copied from a library template '
|
||||
'prompt. Powers "Reset to Library Defaults" — rows where this '
|
||||
'is False are treated as recipe-only custom prompts and survive '
|
||||
'the reset.',
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user