Files
Odoo-Modules/fusion_plating/fusion_plating/data/fp_step_kind_data.xml
gsinghpal ac1db177e1 feat(step-kinds): curate to 11 + mandatory + admin-only creation
Operator-reported foot-gun: Step Kind dropdown had 24 options, most
of which were visual-only (cleaning, electroclean, etch, rinse,
strike, dry, wbf_test, hardness_test, adhesion_test, salt_spray,
packaging, etc.) and didn't drive any gate or milestone. Picking the
wrong one meant nothing happened; picking Generic (left default)
meant nothing happened. Authors couldn't tell which choice mattered.

Curation: 24 → 11 active kinds. Each remaining kind has a concrete
downstream behaviour (gate, portal milestone, hardware tie-in, or
"explicitly no behaviour" for Other):

  other            Other (catch-all, default — no special behaviour)
  receiving        Received portal milestone
  contract_review  QA-005 form gate + button_finish lock
  racking          Rack-assignment dialog + button_finish lock
  mask             Visual mask kind (covers Masking + De-Masking)
  wet_process      Visual wet kind (NEW, covers cleaning, rinse,
                   etch, strike, dry, electroclean, wbf_test)
  plate            Plated portal milestone (last plate step closes)
  bake             Bake-window state machine + Baked milestone
  inspect          Intermediate inspection milestone
  final_inspect    Inspected (terminal) portal milestone
  ship             Shipped milestone (back-compat; delivery-state
                   driven is preferred)

Retired kinds (active=False, hidden from dropdown): cleaning,
electroclean, etch, rinse, strike, dry, wbf_test, demask, derack,
replenishment, hardness_test, adhesion_test, salt_spray, packaging,
gating. Kept in DB for audit / history but not selectable.

Mandatory enforcement:
- fp.step.kind_id on fusion.plating.process.node and fp.step.template
  is now required=True with ondelete='restrict' and a default that
  resolves to the 'other' kind. Existing NULL rows are backfilled by
  the pre-migrate before the NOT NULL constraint hits the schema.
- Dropdown no longer offers a blank / "Generic" option. New steps
  land on 'other' instead of NULL.

Admin-only catalog:
- /fp/simple_recipe/kinds/create endpoint now refuses requests from
  non-managers (group_fusion_plating_manager). Returns a clear
  message explaining why ("each kind drives gates / milestones /
  routing — pick Other if none fits, or ask a manager to wire up a
  new kind").
- "+ Add a new kind…" sentinel option in the library form is hidden
  unless state.recipe.user_is_manager. Backend gate is the authority;
  the UI hide is just to stop showing a button that will error.
- The Step Type dropdown in the inline step-edit panel switched from
  a 24-line hard-coded XML option list to a t-foreach over
  state.kindOptions (the same kinds/list endpoint payload). One
  source of truth — retire / add a kind in the catalog and every
  picker reflects the change.

Migration impact (entech): 5 templates + 579 nodes backfilled via
name-match heuristic. 15 kinds flipped to active=False. Distribution
of the 579 backfilled nodes:
  racking 105, other 97, bake 91, wet_process 90, mask 74,
  inspect 44, plate 32, final_inspect 25, receiving 10,
  contract_review 9, ship 2.

Drive-by:
- Migration uses _ensure_kind() that also registers ir.model.data
  for the new xmlids so the subsequent data XML load doesn't create
  duplicate kind records.
- Stored related default_kind on fusion.plating.process.node /
  fp.step.template is written alongside kind_id in every SQL UPDATE
  so legacy `node.default_kind == 'foo'` comparisons stay accurate
  (the ORM doesn't recompute stored related fields after direct
  SQL writes).

Module: fusion_plating 19.0.20.5.0 → 19.0.20.6.0.
15 existing tests still green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 08:08:31 -04:00

960 lines
47 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Step Kind catalog.
noupdate=1 so user edits to defaults survive `-u`.
2026-05-20 curation (19.0.20.6.0):
- Cut from 24 → 12 active kinds. The dropped ones
(cleaning, electroclean, etch, rinse, strike, dry,
wbf_test, demask, derack, replenishment, hardness_test,
adhesion_test, salt_spray, packaging, gating) are kept
in this XML for history but flipped active=False by the
migration script so they no longer appear in the
dropdown — and bulk-remapped onto the new `other` /
`wet_process` kinds.
- New: `other` (catch-all, default) and `wet_process`
(covers all bath-based steps).
- `mask` covers Masking + De-Masking, `racking` covers
Racking + De-Racking — operators differentiate by the
step name. -->
<!-- ============================================================ -->
<!-- ACTIVE KINDS — visible in dropdown -->
<!-- ============================================================ -->
<record id="step_kind_other" model="fp.step.kind">
<field name="code">other</field>
<field name="name">Other</field>
<field name="sequence">5</field>
<field name="icon">fa-circle-o</field>
</record>
<record id="step_kind_wet_process" model="fp.step.kind">
<field name="code">wet_process</field>
<field name="name">Wet Process (Clean / Rinse / Etch / Dry / etc.)</field>
<field name="sequence">55</field>
<field name="icon">fa-tint</field>
</record>
<record id="step_kind_receiving" model="fp.step.kind">
<field name="code">receiving</field>
<field name="name">Receiving / Incoming Inspection</field>
<field name="sequence">10</field>
<field name="icon">fa-truck</field>
</record>
<record id="step_kind_contract_review" model="fp.step.kind">
<field name="code">contract_review</field>
<field name="name">Contract Review (QA-005)</field>
<field name="sequence">20</field>
<field name="icon">fa-file-text-o</field>
</record>
<record id="step_kind_racking" model="fp.step.kind">
<field name="code">racking</field>
<field name="name">Racking</field>
<field name="sequence">30</field>
<field name="icon">fa-server</field>
</record>
<record id="step_kind_mask" model="fp.step.kind">
<field name="code">mask</field>
<field name="name">Masking</field>
<field name="sequence">40</field>
<field name="icon">fa-eye-slash</field>
</record>
<record id="step_kind_cleaning" model="fp.step.kind">
<field name="code">cleaning</field>
<field name="name">Cleaning</field>
<field name="sequence">50</field>
<field name="icon">fa-tint</field>
</record>
<record id="step_kind_electroclean" model="fp.step.kind">
<field name="code">electroclean</field>
<field name="name">Electroclean</field>
<field name="sequence">60</field>
<field name="icon">fa-bolt</field>
</record>
<record id="step_kind_etch" model="fp.step.kind">
<field name="code">etch</field>
<field name="name">Etch / Activation</field>
<field name="sequence">70</field>
<field name="icon">fa-flask</field>
</record>
<record id="step_kind_rinse" model="fp.step.kind">
<field name="code">rinse</field>
<field name="name">Rinse</field>
<field name="sequence">80</field>
<field name="icon">fa-tint</field>
</record>
<record id="step_kind_strike" model="fp.step.kind">
<field name="code">strike</field>
<field name="name">Strike (Wood's Nickel / Activation)</field>
<field name="sequence">90</field>
<field name="icon">fa-bolt</field>
</record>
<record id="step_kind_plate" model="fp.step.kind">
<field name="code">plate</field>
<field name="name">Plating</field>
<field name="sequence">100</field>
<field name="icon">fa-shield</field>
</record>
<record id="step_kind_replenishment" model="fp.step.kind">
<field name="code">replenishment</field>
<field name="name">Tank Replenishment</field>
<field name="sequence">110</field>
<field name="icon">fa-plus-circle</field>
</record>
<record id="step_kind_wbf_test" model="fp.step.kind">
<field name="code">wbf_test</field>
<field name="name">Water Break Free Test</field>
<field name="sequence">120</field>
<field name="icon">fa-check-square-o</field>
</record>
<record id="step_kind_dry" model="fp.step.kind">
<field name="code">dry</field>
<field name="name">Drying</field>
<field name="sequence">130</field>
<field name="icon">fa-sun-o</field>
</record>
<record id="step_kind_bake" model="fp.step.kind">
<field name="code">bake</field>
<field name="name">Bake (HE Relief / Stress Relief)</field>
<field name="sequence">140</field>
<field name="icon">fa-fire</field>
</record>
<record id="step_kind_demask" model="fp.step.kind">
<field name="code">demask</field>
<field name="name">De-Masking</field>
<field name="sequence">150</field>
<field name="icon">fa-eye</field>
</record>
<record id="step_kind_derack" model="fp.step.kind">
<field name="code">derack</field>
<field name="name">De-Racking</field>
<field name="sequence">160</field>
<field name="icon">fa-server</field>
</record>
<record id="step_kind_inspect" model="fp.step.kind">
<field name="code">inspect</field>
<field name="name">Inspection</field>
<field name="sequence">170</field>
<field name="icon">fa-search</field>
</record>
<record id="step_kind_hardness_test" model="fp.step.kind">
<field name="code">hardness_test</field>
<field name="name">Hardness Test (HV / HK / HRC)</field>
<field name="sequence">180</field>
<field name="icon">fa-tachometer</field>
</record>
<record id="step_kind_adhesion_test" model="fp.step.kind">
<field name="code">adhesion_test</field>
<field name="name">Adhesion Test</field>
<field name="sequence">190</field>
<field name="icon">fa-link</field>
</record>
<record id="step_kind_salt_spray" model="fp.step.kind">
<field name="code">salt_spray</field>
<field name="name">Salt Spray / Corrosion Test</field>
<field name="sequence">200</field>
<field name="icon">fa-cloud</field>
</record>
<record id="step_kind_final_inspect" model="fp.step.kind">
<field name="code">final_inspect</field>
<field name="name">Final Inspection</field>
<field name="sequence">210</field>
<field name="icon">fa-check-circle</field>
</record>
<record id="step_kind_packaging" model="fp.step.kind">
<field name="code">packaging</field>
<field name="name">Packaging / Pre-Ship</field>
<field name="sequence">220</field>
<field name="icon">fa-archive</field>
</record>
<record id="step_kind_ship" model="fp.step.kind">
<field name="code">ship</field>
<field name="name">Shipping</field>
<field name="sequence">230</field>
<field name="icon">fa-paper-plane</field>
</record>
<record id="step_kind_gating" model="fp.step.kind">
<field name="code">gating</field>
<field name="name">Gating</field>
<field name="sequence">240</field>
<field name="icon">fa-pause-circle</field>
</record>
<!-- ============================================================
Default inputs per kind — 1:1 port of DEFAULT_INPUTS_BY_KIND
============================================================ -->
<!-- receiving -->
<record id="step_kind_input_receiving_qty_received" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Qty Received</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_receiving_qty_rejected" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Qty Rejected</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_receiving_po_verified" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Customer PO# Verified</field>
<field name="input_type">boolean</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_receiving_packing_slip" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Packing Slip #</field>
<field name="input_type">text</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_receiving_condition" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Condition Notes</field>
<field name="input_type">text</field>
<field name="sequence">50</field>
</record>
<record id="step_kind_input_receiving_damage_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Damage Photo</field>
<field name="input_type">photo</field>
<field name="sequence">60</field>
</record>
<record id="step_kind_input_receiving_inspector_init" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_receiving"/>
<field name="name">Inspector Initials</field>
<field name="input_type">signature</field>
<field name="sequence">70</field>
<field name="required">True</field>
</record>
<!-- cleaning -->
<record id="step_kind_input_cleaning_actual_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_cleaning"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_cleaning_actual_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_cleaning"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_cleaning_bath_id" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_cleaning"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_cleaning_us_on" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_cleaning"/>
<field name="name">Ultrasonic On</field>
<field name="input_type">boolean</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_cleaning_titration" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_cleaning"/>
<field name="name">Titration Done</field>
<field name="input_type">boolean</field>
<field name="sequence">50</field>
</record>
<!-- electroclean -->
<record id="step_kind_input_eclean_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_eclean_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_eclean_amp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Amperage</field>
<field name="input_type">number</field>
<field name="hint">A</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_eclean_volt" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Voltage</field>
<field name="input_type">number</field>
<field name="hint">V</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_eclean_cd" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Current Density</field>
<field name="input_type">number</field>
<field name="hint">ASF (A per sq ft)</field>
<field name="sequence">50</field>
</record>
<record id="step_kind_input_eclean_pol" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Polarity</field>
<field name="input_type">selection</field>
<field name="selection_options">anodic,cathodic,periodic</field>
<field name="sequence">60</field>
</record>
<record id="step_kind_input_eclean_bath" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_electroclean"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">70</field>
</record>
<!-- etch -->
<record id="step_kind_input_etch_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_etch"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_etch_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_etch"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_etch_acid" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_etch"/>
<field name="name">Acid Concentration</field>
<field name="input_type">number</field>
<field name="hint">% or g/L</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_etch_bath" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_etch"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_etch_he" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_etch"/>
<field name="name">HE Risk Flag</field>
<field name="input_type">boolean</field>
<field name="hint">Hydrogen Embrittlement risk for high-strength steel</field>
<field name="sequence">50</field>
</record>
<!-- rinse -->
<record id="step_kind_input_rinse_type" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_rinse"/>
<field name="name">Rinse Type</field>
<field name="input_type">selection</field>
<field name="selection_options">cascade,spray,DI,city</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_rinse_cond" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_rinse"/>
<field name="name">Conductivity</field>
<field name="input_type">number</field>
<field name="hint">µS/cm — required for DI rinses</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_rinse_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_rinse"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">30</field>
</record>
<!-- strike -->
<record id="step_kind_input_strike_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_strike_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_strike_amp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Amperage</field>
<field name="input_type">number</field>
<field name="hint">A</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_strike_volt" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Voltage</field>
<field name="input_type">number</field>
<field name="hint">V</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_strike_cd" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Current Density</field>
<field name="input_type">number</field>
<field name="hint">ASF</field>
<field name="sequence">50</field>
</record>
<record id="step_kind_input_strike_bath" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_strike"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">60</field>
</record>
<!-- plate -->
<record id="step_kind_input_plate_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Actual Time</field>
<field name="input_type">time_hms</field>
<field name="target_unit">min</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_plate_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_plate_bath" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_plate_ph" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">pH</field>
<field name="input_type">ph</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_plate_conc" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Bath Concentration</field>
<field name="input_type">number</field>
<field name="hint">g/L</field>
<field name="sequence">50</field>
</record>
<record id="step_kind_input_plate_cd" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Current Density</field>
<field name="input_type">number</field>
<field name="hint">ASF — electroplate only</field>
<field name="sequence">60</field>
</record>
<record id="step_kind_input_plate_thick" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_plate"/>
<field name="name">Plating Thickness</field>
<field name="input_type">multi_point_thickness</field>
<field name="target_unit">in</field>
<field name="sequence">70</field>
</record>
<!-- replenishment -->
<record id="step_kind_input_replen_bath" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">Bath ID</field>
<field name="input_type">text</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_replen_chem" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">Chemistry Added</field>
<field name="input_type">text</field>
<field name="hint">name + amount, e.g. "Nickel sulfamate 500mL"</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_replen_ph_b" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">pH Before</field>
<field name="input_type">ph</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_replen_ph_a" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">pH After</field>
<field name="input_type">ph</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_replen_conc_b" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">Concentration Before</field>
<field name="input_type">number</field>
<field name="sequence">50</field>
</record>
<record id="step_kind_input_replen_conc_a" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">Concentration After</field>
<field name="input_type">number</field>
<field name="sequence">60</field>
</record>
<record id="step_kind_input_replen_op" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_replenishment"/>
<field name="name">Operator Initials</field>
<field name="input_type">signature</field>
<field name="sequence">70</field>
<field name="required">True</field>
</record>
<!-- wbf_test -->
<record id="step_kind_input_wbf_result" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_wbf_test"/>
<field name="name">Result</field>
<field name="input_type">pass_fail</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_wbf_retest" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_wbf_test"/>
<field name="name">Retest Count</field>
<field name="input_type">number</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_wbf_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_wbf_test"/>
<field name="name">Photo on FAIL</field>
<field name="input_type">photo</field>
<field name="sequence">30</field>
</record>
<!-- dry -->
<record id="step_kind_input_dry_method" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_dry"/>
<field name="name">Dry Method</field>
<field name="input_type">selection</field>
<field name="selection_options">hot air,oven,spin</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_dry_time" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_dry"/>
<field name="name">Actual Time</field>
<field name="input_type">time_seconds</field>
<field name="target_unit">s</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_dry_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_dry"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">30</field>
</record>
<!-- bake -->
<record id="step_kind_input_bake_in" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_bake"/>
<field name="name">Time In</field>
<field name="input_type">date</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_bake_out" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_bake"/>
<field name="name">Time Out</field>
<field name="input_type">date</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_bake_temp" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_bake"/>
<field name="name">Actual Temperature</field>
<field name="input_type">temperature</field>
<field name="target_unit">f</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_bake_oven" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_bake"/>
<field name="name">Oven ID</field>
<field name="input_type">text</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_bake_chart" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_bake"/>
<field name="name">Chart Recorder File</field>
<field name="input_type">photo</field>
<field name="hint">Attach AMS-2759 chart-recorder file</field>
<field name="sequence">50</field>
</record>
<!-- racking -->
<record id="step_kind_input_racking_qty" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_racking"/>
<field name="name">Actual Qty</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_racking_rack" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_racking"/>
<field name="name">Rack ID</field>
<field name="input_type">text</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_racking_mask" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_racking"/>
<field name="name">Masking Applied</field>
<field name="input_type">boolean</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_racking_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_racking"/>
<field name="name">Photo of Racked Load</field>
<field name="input_type">photo</field>
<field name="sequence">40</field>
</record>
<!-- derack -->
<record id="step_kind_input_derack_qty" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_derack"/>
<field name="name">Actual Qty</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_derack_method" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_derack"/>
<field name="name">Mask Removal Method</field>
<field name="input_type">selection</field>
<field name="selection_options">mechanical,solvent,thermal,not applicable</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_derack_residue" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_derack"/>
<field name="name">Residue Check</field>
<field name="input_type">pass_fail</field>
<field name="sequence">30</field>
</record>
<!-- mask -->
<record id="step_kind_input_mask_qty" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_mask"/>
<field name="name">Actual Qty</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_mask_material" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_mask"/>
<field name="name">Mask Material</field>
<field name="input_type">selection</field>
<field name="selection_options">Microshield,latex tape,vinyl plugs,wax,other</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_mask_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_mask"/>
<field name="name">Photo of Masked Parts</field>
<field name="input_type">photo</field>
<field name="sequence">30</field>
</record>
<!-- demask -->
<record id="step_kind_input_demask_residue" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_demask"/>
<field name="name">Residue Check</field>
<field name="input_type">pass_fail</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_demask_surface" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_demask"/>
<field name="name">Surface Condition</field>
<field name="input_type">selection</field>
<field name="selection_options">clean,marks,needs rework</field>
<field name="sequence">20</field>
</record>
<!-- inspect -->
<record id="step_kind_input_inspect_result" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_inspect"/>
<field name="name">Result</field>
<field name="input_type">pass_fail</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_inspect_defect" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_inspect"/>
<field name="name">Defect Type</field>
<field name="input_type">selection</field>
<field name="selection_options">pitting,burn,blister,peel,missing coverage,none</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_inspect_thick" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_inspect"/>
<field name="name">Thickness Sample</field>
<field name="input_type">thickness</field>
<field name="target_unit">in</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_inspect_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_inspect"/>
<field name="name">Photo</field>
<field name="input_type">photo</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_inspect_sig" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_inspect"/>
<field name="name">Inspector Signature</field>
<field name="input_type">signature</field>
<field name="sequence">50</field>
</record>
<!-- hardness_test -->
<record id="step_kind_input_hard_load" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_hardness_test"/>
<field name="name">Test Load</field>
<field name="input_type">number</field>
<field name="hint">gf</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_hard_readings" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_hardness_test"/>
<field name="name">Readings (HV/HK/HRC)</field>
<field name="input_type">multi_point_thickness</field>
<field name="hint">Three indents minimum</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_hard_eq" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_hardness_test"/>
<field name="name">Equipment ID</field>
<field name="input_type">text</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_hard_cal" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_hardness_test"/>
<field name="name">Last Calibration Date</field>
<field name="input_type">date</field>
<field name="sequence">40</field>
</record>
<!-- adhesion_test -->
<record id="step_kind_input_adh_method" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_adhesion_test"/>
<field name="name">Test Method</field>
<field name="input_type">selection</field>
<field name="selection_options">bend,tape,burnish,file</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_adh_result" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_adhesion_test"/>
<field name="name">Result</field>
<field name="input_type">pass_fail</field>
<field name="sequence">20</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_adh_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_adhesion_test"/>
<field name="name">Photo of Coupon</field>
<field name="input_type">photo</field>
<field name="sequence">30</field>
</record>
<!-- salt_spray -->
<record id="step_kind_input_salt_dur" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_salt_spray"/>
<field name="name">Test Duration</field>
<field name="input_type">number</field>
<field name="hint">hours</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_salt_result" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_salt_spray"/>
<field name="name">Result</field>
<field name="input_type">pass_fail</field>
<field name="sequence">20</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_salt_red" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_salt_spray"/>
<field name="name">Red Rust %</field>
<field name="input_type">number</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_salt_white" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_salt_spray"/>
<field name="name">White Corrosion %</field>
<field name="input_type">number</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_salt_lab" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_salt_spray"/>
<field name="name">Lab Report</field>
<field name="input_type">photo</field>
<field name="hint">Attach scanned lab report</field>
<field name="sequence">50</field>
</record>
<!-- final_inspect -->
<record id="step_kind_input_fin_count" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Outgoing Part Count Verified</field>
<field name="input_type">boolean</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_fin_qty_acc" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Qty Accepted</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_fin_qty_rej" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Qty Rejected</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_fin_defect" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Defect Categorization</field>
<field name="input_type">selection</field>
<field name="selection_options">pitting,burn,blister,peel,missing coverage,dimensional,none</field>
<field name="sequence">35</field>
</record>
<record id="step_kind_input_fin_thick" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Actual Coating Thickness</field>
<field name="input_type">multi_point_thickness</field>
<field name="target_unit">in</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_fin_dim" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Dimensional Verification</field>
<field name="input_type">pass_fail</field>
<field name="sequence">45</field>
</record>
<record id="step_kind_input_fin_ra" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Surface Finish (Ra)</field>
<field name="input_type">number</field>
<field name="hint">µin</field>
<field name="sequence">47</field>
</record>
<record id="step_kind_input_fin_pass" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Pass/Fail</field>
<field name="input_type">pass_fail</field>
<field name="sequence">50</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_fin_sig" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_final_inspect"/>
<field name="name">Inspector Signature</field>
<field name="input_type">signature</field>
<field name="sequence">60</field>
</record>
<!-- packaging -->
<record id="step_kind_input_pkg_type" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_packaging"/>
<field name="name">Packaging Type</field>
<field name="input_type">selection</field>
<field name="selection_options">VCI bag,bubble wrap,separator paper,custom crate,other</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_pkg_qty" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_packaging"/>
<field name="name">Qty Per Package</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_pkg_count" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_packaging"/>
<field name="name">Package Count</field>
<field name="input_type">number</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_pkg_cert" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_packaging"/>
<field name="name">Cert Package Included</field>
<field name="input_type">boolean</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_pkg_cust" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_packaging"/>
<field name="name">Customer-Supplied Packaging</field>
<field name="input_type">boolean</field>
<field name="sequence">50</field>
</record>
<!-- ship -->
<record id="step_kind_input_ship_qty" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_ship"/>
<field name="name">Outgoing Qty</field>
<field name="input_type">number</field>
<field name="target_unit">each</field>
<field name="sequence">10</field>
<field name="required">True</field>
</record>
<record id="step_kind_input_ship_carrier" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_ship"/>
<field name="name">Carrier</field>
<field name="input_type">selection</field>
<field name="selection_options">UPS,FedEx,Purolator,Customer Pickup,Other</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_ship_track" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_ship"/>
<field name="name">Tracking #</field>
<field name="input_type">text</field>
<field name="sequence">30</field>
</record>
<record id="step_kind_input_ship_bol" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_ship"/>
<field name="name">BoL #</field>
<field name="input_type">text</field>
<field name="sequence">40</field>
</record>
<record id="step_kind_input_ship_photo" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_ship"/>
<field name="name">Photo of Sealed Shipment</field>
<field name="input_type">photo</field>
<field name="sequence">50</field>
</record>
<!-- contract_review -->
<record id="step_kind_input_cr_init" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_contract_review"/>
<field name="name">Reviewer Initials</field>
<field name="input_type">signature</field>
<field name="sequence">10</field>
</record>
<record id="step_kind_input_cr_date" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_contract_review"/>
<field name="name">Date Reviewed</field>
<field name="input_type">date</field>
<field name="sequence">20</field>
</record>
<record id="step_kind_input_cr_qa" model="fp.step.kind.default.input">
<field name="kind_id" ref="step_kind_contract_review"/>
<field name="name">QA-005 Approved</field>
<field name="input_type">pass_fail</field>
<field name="sequence">30</field>
</record>
<!-- gating: intentionally no default inputs -->
</data>
</odoo>