Align FSM modules with Odoo instructions requirements

This commit is contained in:
Ruslan Bakiev
2026-02-13 16:44:40 +07:00
parent fa145350ca
commit 86f87ec1c9
38 changed files with 505 additions and 181 deletions

View File

@@ -14,9 +14,14 @@
"dsrpt_repair_materials",
],
"data": [
"security/groups.xml",
"security/ir.model.access.csv",
"data/sequence.xml",
"views/work_order_views.xml",
"views/repair_work_order_view_list.xml",
"views/repair_work_order_view_form.xml",
"views/repair_work_order_view_kanban.xml",
"views/repair_work_order_action_main.xml",
"views/menu.xml",
],
"installable": True,
}

View File

@@ -5,14 +5,14 @@ from odoo.exceptions import ValidationError
class RepairWorkOrder(models.Model):
_name = "repair.work.order"
_description = "Repair Work Order"
_inherit = ["mail.thread"]
_inherit = ["mail.thread", "mail.activity.mixin"]
_order = "id desc"
name = fields.Char(default="New", copy=False, readonly=True, tracking=True)
contact_id = fields.Many2one("dsrpt.contact", required=True, tracking=True)
zone_id = fields.Many2one("repair.fsm.zone", string="FSM Zone", tracking=True)
description = fields.Text()
requested_datetime = fields.Datetime(default=fields.Datetime.now)
description = fields.Text(tracking=True)
requested_datetime = fields.Datetime(default=fields.Datetime.now, tracking=True)
scheduled_datetime = fields.Datetime(tracking=True)
technician_id = fields.Many2one("repair.technician", tracking=True)
assigned_user_id = fields.Many2one("res.users", related="technician_id.user_id", store=True)
@@ -27,6 +27,7 @@ class RepairWorkOrder(models.Model):
],
default="draft",
tracking=True,
group_expand="_group_expand_states",
)
time_line_ids = fields.One2many("repair.work.order.time", "work_order_id", string="Time Logs")
material_line_ids = fields.One2many("repair.work.order.material", "work_order_id", string="Material Logs")
@@ -40,6 +41,9 @@ class RepairWorkOrder(models.Model):
vals["name"] = self.env["ir.sequence"].next_by_code("repair.work.order") or "New"
return super().create(vals_list)
def _group_expand_states(self, states, domain, order):
return [key for key, _label in self._fields["state"].selection]
@api.depends("time_line_ids.hours", "material_line_ids.subtotal")
def _compute_totals(self):
for rec in self:

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="group_dsrpt_repair_work_orders_user" model="res.groups">
<field name="name">Repair Work Orders User</field>
<field name="category_id" ref="base.module_category_services"/>
</record>
<record id="group_dsrpt_repair_work_orders_manager" model="res.groups">
<field name="name">Repair Work Orders Manager</field>
<field name="category_id" ref="base.module_category_services"/>
<field name="implied_ids" eval="[(4, ref('group_dsrpt_repair_work_orders_user'))]"/>
</record>
</odoo>

View File

@@ -1,4 +1,7 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_repair_work_order_user,repair.work.order user,model_repair_work_order,base.group_user,1,1,1,1
access_repair_work_order_time_user,repair.work.order.time user,model_repair_work_order_time,base.group_user,1,1,1,1
access_repair_work_order_material_user,repair.work.order.material user,model_repair_work_order_material,base.group_user,1,1,1,1
access_repair_work_order_user,repair.work.order user,model_repair_work_order,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user,1,1,1,0
access_repair_work_order_manager,repair.work.order manager,model_repair_work_order,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager,1,1,1,1
access_repair_work_order_time_user,repair.work.order.time user,model_repair_work_order_time,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user,1,1,1,0
access_repair_work_order_time_manager,repair.work.order.time manager,model_repair_work_order_time,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager,1,1,1,1
access_repair_work_order_material_user,repair.work.order.material user,model_repair_work_order_material,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user,1,1,1,0
access_repair_work_order_material_manager,repair.work.order.material manager,model_repair_work_order_material,dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_repair_work_order_user repair.work.order user model_repair_work_order base.group_user dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user 1 1 1 1 0
3 access_repair_work_order_time_user access_repair_work_order_manager repair.work.order.time user repair.work.order manager model_repair_work_order_time model_repair_work_order base.group_user dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager 1 1 1 1
4 access_repair_work_order_material_user access_repair_work_order_time_user repair.work.order.material user repair.work.order.time user model_repair_work_order_material model_repair_work_order_time base.group_user dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user 1 1 1 1 0
5 access_repair_work_order_time_manager repair.work.order.time manager model_repair_work_order_time dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager 1 1 1 1
6 access_repair_work_order_material_user repair.work.order.material user model_repair_work_order_material dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_user 1 1 1 0
7 access_repair_work_order_material_manager repair.work.order.material manager model_repair_work_order_material dsrpt_repair_work_orders.group_dsrpt_repair_work_orders_manager 1 1 1 1

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="menu_repair_work_orders" model="ir.ui.menu">
<field name="name">Work Orders</field>
<field name="action" eval="'ir.actions.act_window,%d' % ref('action_repair_work_order')"/>
<field name="sequence">20</field>
<field name="parent_id" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="action_repair_work_order" model="ir.actions.act_window">
<field name="name">Work Orders</field>
<field name="res_model">repair.work.order</field>
<field name="view_mode">list,kanban,form</field>
</record>
</odoo>

View File

@@ -1,35 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_repair_work_order_tree" model="ir.ui.view">
<field name="name">repair.work.order.tree</field>
<field name="model">repair.work.order</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="contact_id"/>
<field name="zone_id"/>
<field name="scheduled_datetime"/>
<field name="technician_id"/>
<field name="state"/>
<field name="total_time_hours"/>
<field name="total_material_cost"/>
</list>
</field>
</record>
<record id="view_repair_work_order_form" model="ir.ui.view">
<field name="name">repair.work.order.form</field>
<field name="model">repair.work.order</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_confirm" type="object" string="Confirm" invisible="state != 'draft'" class="btn-primary"/>
<button name="action_assign_to_me" type="object" string="Assign to me" invisible="state not in ('confirmed','assigned')" class="btn-primary"/>
<button name="action_confirm" type="object" string="Confirm" class="btn-primary" invisible="state != 'draft'"/>
<button name="action_assign_to_me" type="object" string="Assign to me" class="btn-primary" invisible="state not in ('confirmed','assigned')"/>
<button name="action_start" type="object" string="Start" invisible="state != 'assigned'"/>
<button name="action_done" type="object" string="Done" invisible="state not in ('in_progress','assigned')" class="btn-primary"/>
<button name="action_done" type="object" string="Done" class="btn-primary" invisible="state not in ('in_progress','assigned')"/>
<button name="action_cancel" type="object" string="Cancel" invisible="state in ('done','cancelled')"/>
<button name="action_reset_draft" type="object" string="Reset to Draft" invisible="state == 'draft'"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,assigned,in_progress,done,cancelled"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,assigned,in_progress,done,cancelled" options="{'clickable': '1'}"/>
</header>
<sheet>
<group>
@@ -79,22 +62,4 @@
</form>
</field>
</record>
<record id="action_repair_work_order" model="ir.actions.act_window">
<field name="name">Work Orders</field>
<field name="res_model">repair.work.order</field>
<field name="view_mode">list,form</field>
</record>
<record id="menu_repair_work_orders" model="ir.ui.menu">
<field name="name">Work Orders</field>
<field name="action" eval="'ir.actions.act_window,%d' % ref('action_repair_work_order')"/>
<field name="sequence">20</field>
<field name="parent_id" eval="False"/>
</record>
<function model="ir.ui.menu" name="write">
<value model="ir.ui.menu" search="[('id', '=', ref('menu_repair_work_orders'))]"/>
<value eval="{'parent_id': False}"/>
</function>
</odoo>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_repair_work_order_kanban" model="ir.ui.view">
<field name="name">repair.work.order.kanban</field>
<field name="model">repair.work.order</field>
<field name="arch" type="xml">
<kanban default_group_by="state">
<field name="name"/>
<field name="contact_id"/>
<field name="scheduled_datetime"/>
<field name="technician_id"/>
<field name="state"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<div class="o_kanban_record_title">
<strong><field name="name"/></strong>
</div>
<div>
<field name="contact_id"/>
</div>
<div>
<field name="scheduled_datetime"/>
</div>
<div>
<field name="technician_id"/>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_repair_work_order_list" model="ir.ui.view">
<field name="name">repair.work.order.list</field>
<field name="model">repair.work.order</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="contact_id" optional="show"/>
<field name="zone_id" optional="show"/>
<field name="scheduled_datetime" optional="show"/>
<field name="technician_id" optional="show"/>
<field name="state" widget="badge" optional="show"/>
<field name="total_time_hours" optional="show"/>
<field name="total_material_cost" optional="show"/>
<field name="assigned_user_id" optional="hide"/>
<field name="requested_datetime" optional="hide"/>
</list>
</field>
</record>
</odoo>