feat(plating-jobs): state-aware sort + default Open filter on Plating Jobs
The Plating Jobs list was sorted priority-desc, deadline-asc, id-desc — which mixed Done (closed) jobs in with Confirmed (open) jobs and made the list look chaotic to managers. Done jobs from weeks ago surfaced above active work. Two changes: 1. New stored compute fp.job.state_priority (Integer, indexed) ranks states by managerial relevance: in_progress=0, confirmed=1, draft=2, on_hold=3, done=4, cancelled=5. _order now leads with state_priority asc, then priority desc, then date_deadline asc, then id desc. Active work bubbles to the top automatically. 2. Plating Jobs action defaults to a new 'Open' filter (state not in done, cancelled). Managers see only active work by default; they untick the filter to see history. Added On Hold + Cancelled filters too for full state coverage. Verified on entech: top 10 jobs are now all in_progress, sorted by deadline ascending. Existing 26-row list goes from chaotic to focused. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating',
|
||||
'version': '19.0.18.7.3',
|
||||
'version': '19.0.18.7.4',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
|
||||
'description': """
|
||||
|
||||
@@ -52,7 +52,11 @@ class FpJob(models.Model):
|
||||
return dt.astimezone(tz).strftime(fmt)
|
||||
_description = 'Plating Job'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'priority desc, date_deadline asc, id desc'
|
||||
# Sub 12d — state-aware sort. Active work bubbles to the top
|
||||
# (in_progress → confirmed/draft → on_hold → done → cancelled),
|
||||
# then high-priority first within each state, then nearest deadline.
|
||||
# state_priority is a small stored compute below.
|
||||
_order = 'state_priority asc, priority desc, date_deadline asc, id desc'
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(
|
||||
@@ -76,6 +80,29 @@ class FpJob(models.Model):
|
||||
tracking=True,
|
||||
index=True,
|
||||
)
|
||||
# Sub 12d — drives the default sort so active jobs surface above
|
||||
# closed jobs. Lower number = sorted earlier. Stored + indexed so
|
||||
# SQL ORDER BY hits an index and doesn't recompute per row.
|
||||
state_priority = fields.Integer(
|
||||
string='State Priority',
|
||||
compute='_compute_state_priority',
|
||||
store=True,
|
||||
index=True,
|
||||
)
|
||||
|
||||
_STATE_SORT_RANK = {
|
||||
'in_progress': 0,
|
||||
'confirmed': 1,
|
||||
'draft': 2,
|
||||
'on_hold': 3,
|
||||
'done': 4,
|
||||
'cancelled': 5,
|
||||
}
|
||||
|
||||
@api.depends('state')
|
||||
def _compute_state_priority(self):
|
||||
for rec in self:
|
||||
rec.state_priority = self._STATE_SORT_RANK.get(rec.state, 9)
|
||||
priority = fields.Selection(
|
||||
[
|
||||
('low', 'Low'),
|
||||
|
||||
@@ -100,10 +100,18 @@
|
||||
<field name="name"/>
|
||||
<field name="partner_id"/>
|
||||
<separator/>
|
||||
<!-- Sub 12d — "Open" is the default surface managers want.
|
||||
Hides Done + Cancelled jobs out of the box; the
|
||||
other state filters below let them be re-included. -->
|
||||
<filter name="open_jobs" string="Open"
|
||||
domain="[('state','not in',('done','cancelled'))]"/>
|
||||
<separator/>
|
||||
<filter name="state_draft" string="Draft" domain="[('state','=','draft')]"/>
|
||||
<filter name="state_confirmed" string="Confirmed" domain="[('state','=','confirmed')]"/>
|
||||
<filter name="state_in_progress" string="In Progress" domain="[('state','=','in_progress')]"/>
|
||||
<filter name="state_on_hold" string="On Hold" domain="[('state','=','on_hold')]"/>
|
||||
<filter name="state_done" string="Done" domain="[('state','=','done')]"/>
|
||||
<filter name="state_cancelled" string="Cancelled" domain="[('state','=','cancelled')]"/>
|
||||
<separator/>
|
||||
<filter name="rush" string="Rush" domain="[('priority','=','rush')]"/>
|
||||
<group>
|
||||
@@ -120,5 +128,8 @@
|
||||
<field name="res_model">fp.job</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="search_view_id" ref="view_fp_job_search"/>
|
||||
<!-- Default to the Open filter so Done jobs don't clutter the
|
||||
managerial surface. Users can untick to see history. -->
|
||||
<field name="context">{'search_default_open_jobs': 1}</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
Reference in New Issue
Block a user