- I1: Lock time_log_ids list inside step Audit tab to read-only (no create/edit/delete on the nested list). Audit timelog rows are produced exclusively by button_start / button_finish; if a manager could hand-edit them, cost_total rollups would silently drift. - I2: Add explicit list view (decoration on state) and search view (filters by state/kind, group_by state/work_centre/job) for fp.job.step. The Steps (Admin) menu was using Odoo's default auto-list with no filter, which would be unusable after a few weeks of step accumulation. Action now references the search view explicitly. Manifest 19.0.8.7.0 -> 19.0.8.7.1. Part of: native job model migration (spec 2026-04-25) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
136 lines
6.5 KiB
XML
136 lines
6.5 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<odoo>
|
|
<record id="view_fp_job_step_list" model="ir.ui.view">
|
|
<field name="name">fp.job.step.list</field>
|
|
<field name="model">fp.job.step</field>
|
|
<field name="arch" type="xml">
|
|
<list decoration-info="state in ('ready', 'in_progress')"
|
|
decoration-success="state == 'done'"
|
|
decoration-muted="state in ('skipped', 'cancelled')">
|
|
<field name="job_id"/>
|
|
<field name="sequence"/>
|
|
<field name="name"/>
|
|
<field name="work_centre_id"/>
|
|
<field name="kind"/>
|
|
<field name="state"/>
|
|
<field name="assigned_user_id"/>
|
|
<field name="duration_actual"/>
|
|
</list>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="view_fp_job_step_search" model="ir.ui.view">
|
|
<field name="name">fp.job.step.search</field>
|
|
<field name="model">fp.job.step</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<field name="name"/>
|
|
<field name="job_id"/>
|
|
<field name="work_centre_id"/>
|
|
<field name="assigned_user_id"/>
|
|
<separator/>
|
|
<filter name="state_pending" string="Pending" domain="[('state','=','pending')]"/>
|
|
<filter name="state_ready" string="Ready" domain="[('state','=','ready')]"/>
|
|
<filter name="state_in_progress" string="In Progress" domain="[('state','=','in_progress')]"/>
|
|
<filter name="state_done" string="Done" domain="[('state','=','done')]"/>
|
|
<separator/>
|
|
<filter name="kind_wet" string="Wet" domain="[('kind','=','wet')]"/>
|
|
<filter name="kind_bake" string="Bake" domain="[('kind','=','bake')]"/>
|
|
<filter name="kind_inspect" string="Inspect" domain="[('kind','=','inspect')]"/>
|
|
<group>
|
|
<filter name="group_state" string="Status" context="{'group_by': 'state'}"/>
|
|
<filter name="group_work_centre" string="Work Centre" context="{'group_by': 'work_centre_id'}"/>
|
|
<filter name="group_job" string="Job" context="{'group_by': 'job_id'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="view_fp_job_step_form" model="ir.ui.view">
|
|
<field name="name">fp.job.step.form</field>
|
|
<field name="model">fp.job.step</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<header>
|
|
<button name="button_start" type="object"
|
|
string="Start" class="btn-primary"
|
|
invisible="state not in ('ready', 'paused')"/>
|
|
<button name="button_finish" type="object"
|
|
string="Finish" class="btn-success"
|
|
invisible="state != 'in_progress'"/>
|
|
<field name="state" widget="statusbar"/>
|
|
</header>
|
|
<sheet>
|
|
<div class="oe_title">
|
|
<h1><field name="name"/></h1>
|
|
</div>
|
|
<group>
|
|
<group>
|
|
<field name="job_id"/>
|
|
<field name="sequence"/>
|
|
<field name="work_centre_id"/>
|
|
<field name="kind"/>
|
|
<field name="recipe_node_id"/>
|
|
<field name="assigned_user_id"/>
|
|
</group>
|
|
<group>
|
|
<field name="duration_expected"/>
|
|
<field name="duration_actual" readonly="1"/>
|
|
<field name="cost_per_hour"/>
|
|
<field name="cost_total"/>
|
|
<field name="currency_id" invisible="1"/>
|
|
</group>
|
|
</group>
|
|
<notebook>
|
|
<page string="Equipment" name="equipment">
|
|
<group>
|
|
<field name="bath_id"/>
|
|
<field name="tank_id"/>
|
|
<field name="rack_id"/>
|
|
</group>
|
|
</page>
|
|
<page string="Plating Spec" name="spec">
|
|
<group>
|
|
<field name="thickness_target"/>
|
|
<field name="thickness_uom"/>
|
|
<field name="dwell_time_minutes"/>
|
|
<field name="bake_setpoint_temp"/>
|
|
<field name="bake_actual_duration"/>
|
|
<field name="bake_chart_recorder_ref"/>
|
|
</group>
|
|
</page>
|
|
<page string="Audit" name="audit">
|
|
<group>
|
|
<field name="started_by_user_id" readonly="1"/>
|
|
<field name="date_started" readonly="1"/>
|
|
<field name="finished_by_user_id" readonly="1"/>
|
|
<field name="date_finished" readonly="1"/>
|
|
<field name="signoff_user_id" readonly="1"/>
|
|
</group>
|
|
<field name="time_log_ids" readonly="1">
|
|
<list create="false" edit="false" delete="false">
|
|
<field name="user_id"/>
|
|
<field name="date_started"/>
|
|
<field name="date_finished"/>
|
|
<field name="duration_minutes"/>
|
|
</list>
|
|
</field>
|
|
</page>
|
|
<page string="Instructions" name="instructions">
|
|
<field name="instructions" nolabel="1"/>
|
|
</page>
|
|
</notebook>
|
|
</sheet>
|
|
<chatter/>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="action_fp_job_step" model="ir.actions.act_window">
|
|
<field name="name">Job Steps</field>
|
|
<field name="res_model">fp.job.step</field>
|
|
<field name="view_mode">list,form</field>
|
|
<field name="search_view_id" ref="view_fp_job_step_search"/>
|
|
</record>
|
|
</odoo>
|