PV-Phase3 of the plant-view redesign.
- /fp/landing/plant_kanban JSONRPC endpoint returns {kpis, columns,
cards} in one payload. One card per fp.job; cards denormalized so
the OWL component doesn't fan out RPCs. Server-side filter handling
for All / Mine / Running / Blocked / Overdue / FAIR. Within-column
sort by (overdue, _SORT_PRIORITY[card_state], due_date).
- fusion_plating_shopfloor.action_fp_plant_kanban client action
registered alongside the existing fp_shopfloor_landing action.
- fp_landing_data.xml resolver extended to read the layout flag and
dispatch to v2 when x_fc_shopfloor_layout='v2' (default still legacy).
Card payload (23 fields): WO, customer, PN+rev, qty, PO, recipe, spec,
tags, current step + work centre, state chip, mini_timeline, operator,
icons (signoff / bake / tracking / etc.), progress.
State-chip mapping per spec §6.1 — one map keyed by card_state with
running-time elapsed, idle-hours, and operator-name interpolation.
Verified live — card payload sample on WO-30036 (contract_review state)
produces all expected keys + 9-element mini_timeline.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
2.9 KiB
XML
72 lines
2.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!--
|
|
Copyright 2026 Nexa Systems Inc.
|
|
License OPL-1 (Odoo Proprietary License v1.0)
|
|
Part of the Fusion Plating product family.
|
|
|
|
Phase 1 — Plating landing-page resolver.
|
|
|
|
The Plating app's root menu (menu_fp_root) calls this server action
|
|
on click. It resolves which window action to open in this priority
|
|
order:
|
|
1. user.x_fc_plating_landing_action_id (per-user override)
|
|
2. company.x_fc_default_landing_action_id (company default)
|
|
3. action_fp_sale_orders (hardcoded fallback)
|
|
|
|
Falls back to Sale Orders so that pre-Sub-12d users who haven't
|
|
set a preference still land on the Sale-Orders default we shipped
|
|
earlier in the session.
|
|
-->
|
|
<odoo noupdate="0">
|
|
|
|
<record id="action_fp_resolve_plating_landing" model="ir.actions.server">
|
|
<field name="name">Plating — Open Landing Page</field>
|
|
<field name="model_id" ref="base.model_res_users"/>
|
|
<field name="state">code</field>
|
|
<field name="code"><![CDATA[
|
|
# Resolve in priority order:
|
|
# 1. user.x_fc_plating_landing_action_id (per-user override)
|
|
# 2. company.x_fc_default_landing_action_id (company default)
|
|
# 3. Shop Floor plant-view kanban (when x_fc_shopfloor_layout='v2')
|
|
# 4. Sale Orders (when v2 flag unset / legacy)
|
|
# 5. Process recipes (configurator absent)
|
|
user = env.user
|
|
target = False
|
|
if 'x_fc_plating_landing_action_id' in user._fields and user.x_fc_plating_landing_action_id:
|
|
target = user.x_fc_plating_landing_action_id.sudo()
|
|
elif 'x_fc_default_landing_action_id' in env.company._fields and env.company.x_fc_default_landing_action_id:
|
|
target = env.company.x_fc_default_landing_action_id.sudo()
|
|
|
|
if not target:
|
|
# 2026-05-23 — plant-view dispatch. Read the layout flag and pick the
|
|
# appropriate Shop Floor action. Falls through to Sale Orders if no
|
|
# client action is registered (e.g. shopfloor module not installed).
|
|
layout = env['ir.config_parameter'].sudo().get_param(
|
|
'fusion_plating_shopfloor.layout', default='legacy',
|
|
)
|
|
if layout == 'v2':
|
|
target = env.ref(
|
|
'fusion_plating_shopfloor.action_fp_plant_kanban',
|
|
raise_if_not_found=False,
|
|
)
|
|
# Legacy or v2-missing → fall through to Sale Orders
|
|
if not target:
|
|
target = env.ref(
|
|
'fusion_plating_configurator.action_fp_sale_orders',
|
|
raise_if_not_found=False,
|
|
)
|
|
|
|
if target:
|
|
action = target.sudo().read()[0]
|
|
# Strip ids that confuse the act_window dispatcher.
|
|
action.pop('id', None)
|
|
else:
|
|
# Last-ditch — open the Plating app's process recipes if even
|
|
# the Sale Orders action is missing (e.g. configurator not installed).
|
|
action = env.ref('fusion_plating.action_fp_process_recipe').sudo().read()[0]
|
|
action.pop('id', None)
|
|
]]></field>
|
|
</record>
|
|
|
|
</odoo>
|