summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorJosse Colpart <jco@odoo.com>2015-11-12 09:44:58 +0100
committerThibault Delavallée <tde@openerp.com>2016-07-04 16:22:37 +0200
commit9a20c6556f4d52cccd0a0ba4a36a2e51c239d7f4 (patch)
tree2c71ad623ce14b4c56658d75dc43881da50a58a0 /addons
parente7ef6e069c7eaba82cc62170b6c7ca05007512b7 (diff)
[REF] (hr_)maintenance
- rename models from hr.equipment.something to maintenance.something - add concept of maintenance team and dashboard - remove generic alias for maintenance
Diffstat (limited to 'addons')
-rw-r--r--addons/hr_maintenance/__openerp__.py1
-rw-r--r--addons/hr_maintenance/models/equipment.py44
-rw-r--r--addons/hr_maintenance/security/equipment.xml8
-rw-r--r--addons/hr_maintenance/views/maintenance_views.xml46
-rw-r--r--addons/maintenance/__openerp__.py4
-rw-r--r--addons/maintenance/data/maintenance_cron.xml13
-rw-r--r--addons/maintenance/data/maintenance_data.xml42
-rw-r--r--addons/maintenance/data/maintenance_demo.xml98
-rw-r--r--addons/maintenance/models/__init__.py1
-rw-r--r--addons/maintenance/models/maintenance.py191
-rw-r--r--addons/maintenance/models/maintenance_config_settings.py42
-rw-r--r--addons/maintenance/security/ir.model.access.csv17
-rw-r--r--addons/maintenance/security/maintenance.xml34
-rw-r--r--addons/maintenance/static/src/less/maintenance_team_dashboard.less8
-rw-r--r--addons/maintenance/tests/test_maintenance.py53
-rw-r--r--addons/maintenance/views/maintenance_config_settings_views.xml34
-rw-r--r--addons/maintenance/views/maintenance_templates.xml8
-rw-r--r--addons/maintenance/views/maintenance_views.xml513
18 files changed, 760 insertions, 397 deletions
diff --git a/addons/hr_maintenance/__openerp__.py b/addons/hr_maintenance/__openerp__.py
index 8f736028d31..5c1e83e2345 100644
--- a/addons/hr_maintenance/__openerp__.py
+++ b/addons/hr_maintenance/__openerp__.py
@@ -9,6 +9,7 @@
'depends': ['hr', 'maintenance'],
'summary': 'Equipments, Assets, Internal Hardware, Allocation Tracking',
'data': [
+ 'security/equipment.xml',
'views/maintenance_views.xml',
],
'demo': [],
diff --git a/addons/hr_maintenance/models/equipment.py b/addons/hr_maintenance/models/equipment.py
index 31c84064bf6..66757b26331 100644
--- a/addons/hr_maintenance/models/equipment.py
+++ b/addons/hr_maintenance/models/equipment.py
@@ -3,16 +3,26 @@
from odoo import api, fields, models, tools
-class HrEquipment(models.Model):
- _inherit = 'hr.equipment'
+class MaintenanceEquipment(models.Model):
+ _inherit = 'maintenance.equipment'
employee_id = fields.Many2one('hr.employee', string='Assigned to Employee', track_visibility='onchange')
department_id = fields.Many2one('hr.department', string='Assigned to Department', track_visibility='onchange')
equipment_assign_to = fields.Selection(
- [('department', 'Department'), ('employee', 'Employee')],
+ [('department', 'Department'), ('employee', 'Employee') ,('other', 'Other')],
string='Used By',
required=True,
default='employee')
+ owner_user_id = fields.Many2one(compute='_compute_owner')
+
+ @api.one
+ @api.depends('employee_id', 'department_id', 'equipment_assign_to')
+ def _compute_owner(self):
+ self.owner_user_id = self.env.user.id
+ if self.equipment_assign_to == 'employee':
+ self.owner_user_id = self.employee_id.user_id.id
+ elif self.equipment_assign_to == 'department':
+ self.owner_user_id = self.department_id.manager_id.user_id.id
@api.onchange('equipment_assign_to')
def _onchange_equipment_assign_to(self):
@@ -24,7 +34,7 @@ class HrEquipment(models.Model):
@api.model
def create(self, vals):
- equipment = super(HrEquipment, self).create(vals)
+ equipment = super(MaintenanceEquipment, self).create(vals)
# subscribe employee or department manager when equipment assign to him.
user_ids = []
if equipment.employee_id and equipment.employee_id.user_id:
@@ -49,18 +59,18 @@ class HrEquipment(models.Model):
user_ids.append(department.manager_id.user_id.id)
if user_ids:
self.message_subscribe_users(user_ids=user_ids)
- return super(HrEquipment, self).write(vals)
+ return super(MaintenanceEquipment, self).write(vals)
@api.multi
def _track_subtype(self, init_values):
self.ensure_one()
if ('employee_id' in init_values and self.employee_id) or ('department_id' in init_values and self.department_id):
return 'maintenance.mt_mat_assign'
- return super(HrEquipment, self)._track_subtype(init_values)
+ return super(MaintenanceEquipment, self)._track_subtype(init_values)
-class HrEquipmentRequest(models.Model):
- _inherit = 'hr.equipment.request'
+class MaintenanceRequest(models.Model):
+ _inherit = 'maintenance.request'
@api.returns('self')
def _default_employee_get(self):
@@ -68,6 +78,14 @@ class HrEquipmentRequest(models.Model):
employee_id = fields.Many2one('hr.employee', string='Employee', default=_default_employee_get)
department_id = fields.Many2one('hr.department', string='Department')
+ owner_user_id = fields.Many2one(compute='_compute_owner', store=True)
+
+ @api.depends('employee_id', 'department_id')
+ def _compute_owner(self):
+ if self.equipment_id.equipment_assign_to == 'employee':
+ self.owner_user_id = self.employee_id.user_id.id
+ elif self.equipment_id.equipment_assign_to == 'department':
+ self.owner_user_id = self.department_id.manager_id.user_id.id
@api.onchange('employee_id', 'department_id')
def onchange_department_or_employee_id(self):
@@ -78,27 +96,25 @@ class HrEquipmentRequest(models.Model):
domain = ['|'] + domain
if self.employee_id:
domain = domain + ['|', ('employee_id', '=', self.employee_id.id), ('employee_id', '=', None)]
- equipment = self.env['hr.equipment'].search(domain, limit=2)
+ equipment = self.env['maintenance.equipment'].search(domain, limit=2)
if len(equipment) == 1:
self.equipment_id = equipment
return {'domain': {'equipment_id': domain}}
@api.model
def create(self, vals):
- result = super(HrEquipmentRequest, self).create(vals)
+ result = super(MaintenanceRequest, self).create(vals)
if result.employee_id.user_id:
result.message_subscribe_users(user_ids=[result.employee_id.user_id.id])
return result
@api.multi
def write(self, vals):
- # Overridden to reset the kanban_state to normal whenever
- # the stage (stage_id) of the Maintenance Request changes.
if vals.get('employee_id'):
employee = self.env['hr.employee'].browse(vals['employee_id'])
if employee and employee.user_id:
self.message_subscribe_users(user_ids=[employee.user_id.id])
- return super(HrEquipmentRequest, self).write(vals)
+ return super(MaintenanceRequest, self).write(vals)
@api.model
def message_new(self, msg, custom_values=None):
@@ -114,4 +130,4 @@ class HrEquipmentRequest(models.Model):
employee = self.env['hr.employee'].search([('user_id', '=', user.id)], limit=1)
if employee:
custom_values['employee_id'] = employee and employee[0].id
- return super(HrEquipmentRequest, self).message_new(msg, custom_values=custom_values)
+ return super(MaintenanceRequest, self).message_new(msg, custom_values=custom_values)
diff --git a/addons/hr_maintenance/security/equipment.xml b/addons/hr_maintenance/security/equipment.xml
new file mode 100644
index 00000000000..1c5d4470b55
--- /dev/null
+++ b/addons/hr_maintenance/security/equipment.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- HR officers and HR managers are allowed to manage equipments -->
+ <record id="base.group_hr_user" model="res.groups">
+ <field name="implied_ids" eval="[(4, ref('base.group_equipment_manager'))]"/>
+ </record>
+
+</odoo>
diff --git a/addons/hr_maintenance/views/maintenance_views.xml b/addons/hr_maintenance/views/maintenance_views.xml
index 07c19cc9e4b..58dec50bc2f 100644
--- a/addons/hr_maintenance/views/maintenance_views.xml
+++ b/addons/hr_maintenance/views/maintenance_views.xml
@@ -2,12 +2,12 @@
<odoo>
<!-- equiment.request : views -->
- <record id="hr_equipment_request_view_search_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.request.view.search.inherit.hr</field>
- <field name="model">hr.equipment.request</field>
+ <record id="maintenance_request_view_search_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.request.view.search.inherit.hr</field>
+ <field name="model">maintenance.request</field>
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_search"/>
<field name="arch" type="xml">
- <xpath expr="field[@name='user_id']" position="after">
+ <xpath expr="field[@name='technician_user_id']" position="after">
<field name="employee_id"/>
</xpath>
<xpath expr="//filter[@name='my_requests']" position="replace">
@@ -19,9 +19,9 @@
</field>
</record>
- <record id="hr_equipment_request_view_form_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.request.view.form.inherit.hr</field>
- <field name="model">hr.equipment.request</field>
+ <record id="maintenance_request_view_form_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.request.view.form.inherit.hr</field>
+ <field name="model">maintenance.request</field>
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='owner_user_id']" position="replace">
@@ -30,9 +30,9 @@
</field>
</record>
- <record id="hr_equipment_request_view_kanban_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.request.view.kanban.inherit.hr</field>
- <field name="model">hr.equipment.request</field>
+ <record id="maintenance_request_view_kanban_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.request.view.kanban.inherit.hr</field>
+ <field name="model">maintenance.request</field>
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//span[@name='owner_user_id']" position="replace">
@@ -42,9 +42,9 @@
</field>
</record>
- <record id="hr_equipment_request_view_tree_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.request.view.tree.inherit.hr</field>
- <field name="model">hr.equipment.request</field>
+ <record id="maintenance_request_view_tree_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.request.view.tree.inherit.hr</field>
+ <field name="model">maintenance.request</field>
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='owner_user_id']" position="replace">
@@ -54,9 +54,9 @@
</record>
<!-- equiment : views -->
- <record id="hr_equipment_view_form_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.view.form.inherit.hr</field>
- <field name="model">hr.equipment</field>
+ <record id="maintenance_equipment_view_form_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.equipment.view.form.inherit.hr</field>
+ <field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='owner_user_id']" position="replace">
@@ -67,12 +67,12 @@
</field>
</record>
- <record id="hr_equipment_view_kanban_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.view.kanban.inherit.hr</field>
- <field name="model">hr.equipment</field>
+ <record id="maintenance_equipment_view_kanban_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.equipment.view.kanban.inherit.hr</field>
+ <field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_kanban"/>
<field name="arch" type="xml">
- <xpath expr="//field[@name='user_id']" position="after">
+ <xpath expr="//field[@name='technician_user_id']" position="after">
<field name="employee_id"/>
<field name="department_id"/>
</xpath>
@@ -82,9 +82,9 @@
</field>
</record>
- <record id="hr_equipment_view_tree_inherit_hr" model="ir.ui.view">
- <field name="name">hr.equipment.view.tree.inherit.hr</field>
- <field name="model">hr.equipment</field>
+ <record id="maintenance_equipment_view_tree_inherit_hr" model="ir.ui.view">
+ <field name="name">maintenance.equipment.view.tree.inherit.hr</field>
+ <field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='owner_user_id']" position="replace">
diff --git a/addons/maintenance/__openerp__.py b/addons/maintenance/__openerp__.py
index f2c12cc3302..b30f3bd2d73 100644
--- a/addons/maintenance/__openerp__.py
+++ b/addons/maintenance/__openerp__.py
@@ -6,15 +6,15 @@
'sequence': 125,
'category': 'Human Resources',
'description': """
- Track employees' equipment and manage maintenance requests.""",
+ Track equipment and manage maintenance requests.""",
'depends': ['mail'],
'summary': 'Equipments, Assets, Internal Hardware, Allocation Tracking',
'data': [
'security/maintenance.xml',
'security/ir.model.access.csv',
'data/maintenance_data.xml',
- 'views/maintenance_config_settings_views.xml',
'views/maintenance_views.xml',
+ 'views/maintenance_templates.xml',
],
'demo': ['data/maintenance_demo.xml'],
'installable': True,
diff --git a/addons/maintenance/data/maintenance_cron.xml b/addons/maintenance/data/maintenance_cron.xml
new file mode 100644
index 00000000000..141ae9757c3
--- /dev/null
+++ b/addons/maintenance/data/maintenance_cron.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding='UTF-8'?>
+<odoo>
+ <record model="ir.cron" id="maintenance_requests_cron">
+ <field name="name">Generate preventive maintenance requests</field>
+ <field name="interval_number">1</field>
+ <field name="interval_type">days</field>
+ <field name="numbercall">-1</field>
+ <field name="doall" eval="False"/>
+ <field name="model" eval="'maintenance.equipment'"/>
+ <field name="function" eval="'_cron_generate_requests'"/>
+ <field name="args" eval="'()'" />
+ </record>
+</odoo> \ No newline at end of file
diff --git a/addons/maintenance/data/maintenance_data.xml b/addons/maintenance/data/maintenance_data.xml
index 4048e864a90..70a40c84a96 100644
--- a/addons/maintenance/data/maintenance_data.xml
+++ b/addons/maintenance/data/maintenance_data.xml
@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
-<data noupdate="1">
+<data>
<!-- Standard stages for Maintenance Request -->
- <record id="stage_0" model="hr.equipment.stage">
+ <record id="stage_0" model="maintenance.stage">
<field name="name">New Request</field>
<field name="sequence" eval="1" />
<field name="fold" eval="False" />
</record>
- <record id="stage_1" model="hr.equipment.stage">
+ <record id="stage_1" model="maintenance.stage">
<field name="name">In Progress</field>
<field name="sequence" eval="2" />
<field name="fold" eval="False" />
</record>
- <record id="stage_3" model="hr.equipment.stage">
+ <record id="stage_3" model="maintenance.stage">
<field name="name">Repaired</field>
<field name="sequence" eval="3" />
<field name="fold" eval="True" />
<field name="done" eval="True" />
</record>
- <record id="stage_4" model="hr.equipment.stage">
+ <record id="stage_4" model="maintenance.stage">
<field name="name">Scrap</field>
<field name="sequence" eval="4" />
<field name="fold" eval="True" />
@@ -29,20 +29,20 @@
<!-- email alias for maintenance requests -->
<record id="mail_alias_equipment" model="mail.alias">
<field name="alias_name">helpdesk</field>
- <field name="alias_model_id" ref="model_hr_equipment_request"/>
+ <field name="alias_model_id" ref="model_maintenance_request"/>
<field name="alias_user_id" ref="base.user_root"/>
</record>
<!-- Maintenance Request-related subtypes for messaging / Chatter -->
<record id="mt_req_created" model="mail.message.subtype">
<field name="name">Request Created</field>
- <field name="res_model">hr.equipment.request</field>
+ <field name="res_model">equipment.request</field>
<field name="hidden" eval="True"/>
<field name="description">Maintenance Request created</field>
</record>
<record id="mt_req_status" model="mail.message.subtype">
<field name="name">Status Changed</field>
- <field name="res_model">hr.equipment.request</field>
+ <field name="res_model">maintenance.request</field>
<field name="default" eval="True"/>
<field name="description">Status changed</field>
</record>
@@ -50,35 +50,49 @@
<!-- Equipment-related subtypes for messaging / Chatter -->
<record id="mt_mat_assign" model="mail.message.subtype">
<field name="name">Equipment Assigned</field>
- <field name="res_model">hr.equipment</field>
+ <field name="res_model">maintenance.equipment</field>
<field name="description">Equipment Assigned</field>
</record>
<!-- Equipment Category-related subtypes for messaging / Chatter -->
<record id="mt_cat_req_created" model="mail.message.subtype">
<field name="name">Maintenance Request Created</field>
- <field name="res_model">hr.equipment.category</field>
+ <field name="res_model">maintenance.equipment.category</field>
<field name="default" eval="True"/>
<field name="parent_id" eval="ref('mt_req_created')"/>
<field name="relation_field">category_id</field>
</record>
<record id="mt_cat_mat_assign" model="mail.message.subtype">
<field name="name">Equipment Assigned</field>
- <field name="res_model">hr.equipment.category</field>
+ <field name="res_model">maintenance.equipment.category</field>
<field name="default" eval="True"/>
<field name="parent_id" eval="ref('mt_mat_assign')"/>
<field name="relation_field">category_id</field>
</record>
- <record id="hr_equipment_computer" model="hr.equipment.category">
+ <record id="equipment_computer" model="maintenance.equipment.category">
<field name="name">Computers</field>
+ <field name="alias_id" ref="mail_alias_equipment"/>
</record>
- <record id="hr_equipment_software" model="hr.equipment.category">
+ <record id="equipment_software" model="maintenance.equipment.category">
<field name="name">Software</field>
+ <field name="alias_id" ref="mail_alias_equipment"/>
</record>
- <record id="hr_equipment_printer" model="hr.equipment.category">
+ <record id="equipment_printer" model="maintenance.equipment.category">
<field name="name">Printers</field>
+ <field name="alias_id" ref="mail_alias_equipment"/>
</record>
+ <record id="equipment_team_maintenance" model="maintenance.team">
+ <field name="name">Internal Maintenance</field>
+ </record>
+
+ <record id="equipment_team_metrology" model="maintenance.team">
+ <field name="name">Metrology</field>
+ </record>
+
+ <record id="equipment_team_subcontractor" model="maintenance.team">
+ <field name="name">Subcontractor</field>
+ </record>
</data>
</odoo>
diff --git a/addons/maintenance/data/maintenance_demo.xml b/addons/maintenance/data/maintenance_demo.xml
index 915cc979982..1abdeb31c83 100644
--- a/addons/maintenance/data/maintenance_demo.xml
+++ b/addons/maintenance/data/maintenance_demo.xml
@@ -3,129 +3,131 @@
<data noupdate="1">
<!-- Equipment categories -->
- <record id="hr_equipment_monitor" model="hr.equipment.category">
+ <record id="equipment_monitor" model="maintenance.equipment.category">
<field name="name">Monitors</field>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
<field name="color">3</field>
+ <field name="alias_id" ref="mail_alias_equipment"/>
</record>
- <record id="hr_equipment_phone" model="hr.equipment.category">
+ <record id="equipment_phone" model="maintenance.equipment.category">
<field name="name">Phones</field>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
+ <field name="alias_id" ref="mail_alias_equipment"/>
</record>
<!-- Equipments -->
- <record id="hr_equipment_monitor1" model="hr.equipment">
+ <record id="equipment_monitor1" model="maintenance.equipment">
<field name="name">Samsung Monitor 15"</field>
- <field name="category_id" ref="hr_equipment_monitor"/>
+ <field name="category_id" ref="equipment_monitor"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
<field name="assign_date" eval="time.strftime('%Y-%m-10')"/>
<field name="serial_no">MT/122/11112222</field>
<field name="model">NP300E5X</field>
</record>
- <record id="hr_equipment_monitor4" model="hr.equipment">
+ <record id="equipment_monitor4" model="maintenance.equipment">
<field name="name">Samsung Monitor 15"</field>
- <field name="category_id" ref="hr_equipment_monitor"/>
+ <field name="category_id" ref="equipment_monitor"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
<field name="assign_date" eval="time.strftime('%Y-01-01')"/>
<field name="serial_no">MT/125/22778837</field>
<field name="model">NP355E5X</field>
</record>
- <record id="hr_equipment_monitor6" model="hr.equipment">
+ <record id="equipment_monitor6" model="maintenance.equipment">
<field name="name">Samsung Monitor 15"</field>
- <field name="category_id" ref="hr_equipment_monitor"/>
+ <field name="category_id" ref="equipment_monitor"/>
<field name="owner_user_id" ref="base.user_demo"/>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="assign_date" eval="time.strftime('%Y-02-01')"/>
<field name="serial_no">MT/127/18291018</field>
<field name="model">NP355E5X</field>
<field name="color">3</field>
</record>
- <record id="hr_equipment_computer3" model="hr.equipment">
+ <record id="equipment_computer3" model="maintenance.equipment">
<field name="name">Acer Laptop</field>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="category_id" ref="equipment_computer"/>
<field name="owner_user_id" ref="base.user_demo"/>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
<field name="assign_date" eval="time.strftime('%Y-03-08')"/>
<field name="serial_no">LP/203/19281928</field>
<field name="model">NE56R</field>
</record>
- <record id="hr_equipment_computer5" model="hr.equipment">
+ <record id="equipment_computer5" model="maintenance.equipment">
<field name="name">Acer Laptop</field>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="category_id" ref="equipment_computer"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="assign_date" eval="time.strftime('%Y-04-08')"/>
<field name="serial_no">LP/205/12928291</field>
<field name="model">V5131</field>
</record>
- <record id="hr_equipment_computer9" model="hr.equipment">
+ <record id="equipment_computer9" model="maintenance.equipment">
<field name="name">HP Laptop</field>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="category_id" ref="equipment_computer"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="assign_date" eval="time.strftime('%Y-%m-11')"/>
<field name="serial_no">LP/303/28292090</field>
<field name="model">17-j059nr</field>
</record>
- <record id="hr_equipment_computer11" model="hr.equipment">
+ <record id="equipment_computer11" model="maintenance.equipment">
<field name="name">HP Laptop</field>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="category_id" ref="equipment_computer"/>
<field name="owner_user_id" ref="base.user_demo"/>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="assign_date" eval="time.strftime('%Y-05-01')"/>
<field name="serial_no">LP/305/17281718</field>
</record>
- <record id="hr_equipment_printer1" model="hr.equipment">
+ <record id="equipment_printer1" model="maintenance.equipment">
<field name="name">HP Inkjet printer</field>
- <field name="category_id" ref="hr_equipment_printer"/>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="category_id" ref="equipment_printer"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="serial_no">PR/011/2928191889</field>
</record>
<!--Maintenance Request-->
- <record id="m_request_3" model="hr.equipment.request">
+ <record id="m_request_3" model="maintenance.request">
<field name="name">Resolution is bad</field>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="equipment_id" ref="hr_equipment_monitor6"/>
- <field name="category_id" ref="hr_equipment_monitor"/>
+ <field name="equipment_id" ref="equipment_monitor6"/>
<field name="color">7</field>
<field name="stage_id" ref="stage_3"/>
+ <field name="maintenance_team_id" ref="equipment_team_maintenance"/>
</record>
- <record id="m_request_4" model="hr.equipment.request">
+ <record id="m_request_4" model="maintenance.request">
<field name="name">Some keys are not working</field>
- <field name="user_id" ref="base.user_root"/>
+ <field name="technician_user_id" ref="base.user_root"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="equipment_id" ref="hr_equipment_computer3"/>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="equipment_id" ref="equipment_computer3"/>
<field name="stage_id" ref="stage_0"/>
+ <field name="maintenance_team_id" ref="equipment_team_maintenance"/>
</record>
- <record id="m_request_6" model="hr.equipment.request">
+ <record id="m_request_6" model="maintenance.request">
<field name="name">Motherboard failed</field>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="owner_user_id" ref="base.user_root"/>
- <field name="equipment_id" ref="hr_equipment_computer5"/>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="equipment_id" ref="equipment_computer5"/>
<field name="stage_id" ref="stage_4"/>
+ <field name="maintenance_team_id" ref="equipment_team_maintenance"/>
</record>
- <record id="m_request_7" model="hr.equipment.request">
+ <record id="m_request_7" model="maintenance.request">
<field name="name">Battery drains fast</field>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="owner_user_id" ref="base.user_demo"/>
- <field name="equipment_id" ref="hr_equipment_computer9"/>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="equipment_id" ref="equipment_computer9"/>
<field name="stage_id" ref="stage_1"/>
+ <field name="maintenance_team_id" ref="equipment_team_maintenance"/>
</record>
- <record id="m_request_8" model="hr.equipment.request">
+ <record id="m_request_8" model="maintenance.request">
<field name="name">Touchpad not working</field>
- <field name="user_id" ref="base.user_demo"/>
+ <field name="technician_user_id" ref="base.user_demo"/>
<field name="owner_user_id" ref="base.user_demo"/>
- <field name="equipment_id" ref="hr_equipment_computer11"/>
- <field name="category_id" ref="hr_equipment_computer"/>
+ <field name="equipment_id" ref="equipment_computer11"/>
<field name="stage_id" ref="stage_1"/>
+ <field name="maintenance_team_id" ref="equipment_team_maintenance"/>
</record>
</data>
</odoo>
diff --git a/addons/maintenance/models/__init__.py b/addons/maintenance/models/__init__.py
index 427d3df6a82..3641d220dbc 100644
--- a/addons/maintenance/models/__init__.py
+++ b/addons/maintenance/models/__init__.py
@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
import maintenance
-import maintenance_config_settings
diff --git a/addons/maintenance/models/maintenance.py b/addons/maintenance/models/maintenance.py
index 52eb6321d5e..007a67a1f9f 100644
--- a/addons/maintenance/models/maintenance.py
+++ b/addons/maintenance/models/maintenance.py
@@ -1,27 +1,28 @@
# -*- coding: utf-8 -*-
-from openerp import api, fields, models, fields
-from openerp import _, tools
-from openerp.exceptions import UserError
+from datetime import date, datetime, timedelta
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
-class HrEquipmentStage(models.Model):
+
+class MaintenanceStage(models.Model):
""" Model for case stages. This models the main stages of a Maintenance Request management flow. """
- _name = 'hr.equipment.stage'
+ _name = 'maintenance.stage'
_description = 'Maintenance Stage'
_order = 'sequence, id'
name = fields.Char('Name', required=True, translate=True)
sequence = fields.Integer('Sequence', default=20)
- fold = fields.Boolean('Folded in Recruitment Pipe')
+ fold = fields.Boolean('Folded in Maintenance Pipe')
done = fields.Boolean('Request Done')
-class HrEquipmentCategory(models.Model):
- _name = 'hr.equipment.category'
- _inherits = {"mail.alias": "alias_id"}
- _inherit = ['mail.thread']
+class MaintenanceEquipmentCategory(models.Model):
+ _name = 'maintenance.equipment.category'
+ _inherit = ['mail.alias.mixin', 'mail.thread']
_description = 'Asset Category'
@api.one
@@ -30,12 +31,12 @@ class HrEquipmentCategory(models.Model):
self.fold = False if self.equipment_count else True
name = fields.Char('Category Name', required=True, translate=True)
- user_id = fields.Many2one('res.users', 'Responsible', track_visibility='onchange', default=lambda self: self.env.uid)
+ technician_user_id = fields.Many2one('res.users', 'Responsible', track_visibility='onchange', default=lambda self: self.env.uid, oldname='user_id')
color = fields.Integer('Color Index')
note = fields.Text('Comments', translate=True)
- equipment_ids = fields.One2many('hr.equipment', 'category_id', string='Equipments', copy=False)
+ equipment_ids = fields.One2many('maintenance.equipment', 'category_id', string='Equipments', copy=False)
equipment_count = fields.Integer(string="Equipment", compute='_compute_equipment_count')
- maintenance_ids = fields.One2many('hr.equipment.request', 'category_id', copy=False)
+ maintenance_ids = fields.One2many('maintenance.request', 'category_id', copy=False)
maintenance_count = fields.Integer(string="Maintenance", compute='_compute_maintenance_count')
alias_id = fields.Many2one(
'mail.alias', 'Alias', ondelete='cascade', required=True,
@@ -45,36 +46,49 @@ class HrEquipmentCategory(models.Model):
@api.multi
def _compute_equipment_count(self):
- equipment_data = self.env['hr.equipment'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
+ equipment_data = self.env['maintenance.equipment'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
mapped_data = dict([(m['category_id'][0], m['category_id_count']) for m in equipment_data])
for category in self:
category.equipment_count = mapped_data.get(category.id, 0)
@api.multi
def _compute_maintenance_count(self):
- maintenance_data = self.env['hr.equipment.request'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
+ maintenance_data = self.env['maintenance.request'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
mapped_data = dict([(m['category_id'][0], m['category_id_count']) for m in maintenance_data])
for category in self:
category.maintenance_count = mapped_data.get(category.id, 0)
@api.model
def create(self, vals):
- self = self.with_context(alias_model_name='hr.equipment.request', alias_parent_model_name=self._name)
- category_id = super(HrEquipmentCategory, self).create(vals)
+ self = self.with_context(alias_model_name='maintenance.request', alias_parent_model_name=self._name)
+ if not vals.get('alias_name'):
+ vals['alias_name'] = vals.get('name')
+ category_id = super(MaintenanceEquipmentCategory, self).create(vals)
category_id.alias_id.write({'alias_parent_thread_id': category_id.id, 'alias_defaults': {'category_id': category_id.id}})
return category_id
@api.multi
def unlink(self):
+ MailAlias = self.env['mail.alias']
for category in self:
if category.equipment_ids or category.maintenance_ids:
raise UserError(_("You cannot delete an equipment category containing equipments or maintenance requests."))
- res = super(HrEquipmentCategory, self).unlink()
+ MailAlias += category.alias_id
+ res = super(MaintenanceEquipmentCategory, self).unlink()
+ MailAlias.unlink()
return res
+ def get_alias_model_name(self, vals):
+ return vals.get('alias_model', 'maintenance.equipment')
+
+ def get_alias_values(self):
+ values = super(MaintenanceEquipmentCategory, self).get_alias_values()
+ values['alias_defaults'] = {'category_id': self.id}
+ return values
-class HrEquipment(models.Model):
- _name = 'hr.equipment'
+
+class MaintenanceEquipment(models.Model):
+ _name = 'maintenance.equipment'
_inherit = ['mail.thread']
_description = 'Equipment'
@@ -83,7 +97,7 @@ class HrEquipment(models.Model):
self.ensure_one()
if 'owner_user_id' in init_values and self.owner_user_id:
return 'maintenance.mt_mat_assign'
- return super(HrEquipment, self)._track_subtype(init_values)
+ return super(MaintenanceEquipment, self)._track_subtype(init_values)
@api.multi
def name_get(self):
@@ -105,11 +119,11 @@ class HrEquipment(models.Model):
recs = self.search([('name', operator, name)] + args, limit=limit)
return recs.name_get()
- name = fields.Char('Asset Name', required=True, translate=True)
+ name = fields.Char('Equipment Name', required=True, translate=True)
active = fields.Boolean(default=True)
- user_id = fields.Many2one('res.users', string='Technician', track_visibility='onchange')
+ technician_user_id = fields.Many2one('res.users', string='Technician', track_visibility='onchange', oldname='user_id')
owner_user_id = fields.Many2one('res.users', string='Owner', track_visibility='onchange')
- category_id = fields.Many2one('hr.equipment.category', string='Asset Category', track_visibility='onchange')
+ category_id = fields.Many2one('maintenance.equipment.category', string='Equipment Category', track_visibility='onchange')
partner_id = fields.Many2one('res.partner', string='Vendor', domain="[('supplier', '=', 1)]")
partner_ref = fields.Char('Vendor Reference')
location = fields.Char('Location')
@@ -121,9 +135,24 @@ class HrEquipment(models.Model):
warranty = fields.Date('Warranty')
color = fields.Integer('Color Index')
scrap_date = fields.Date('Scrap Date')
- maintenance_ids = fields.One2many('hr.equipment.request', 'equipment_id')
+ maintenance_ids = fields.One2many('maintenance.request', 'equipment_id')
maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Maintenance", store=True)
maintenance_open_count = fields.Integer(compute='_compute_maintenance_count', string="Current Maintenance", store=True)
+ period = fields.Integer('Days between each preventive maintenance')
+ next_action_date = fields.Date(compute='_compute_next_maintenance', string='Date of the next preventive maintenance', store=True)
+ maintenance_team_id = fields.Many2one('maintenance.team', string='Maintenance Team')
+ maintenance_duration = fields.Float(help="Maintenance Duration in minutes and seconds.")
+
+ @api.depends('period', 'maintenance_open_count', 'maintenance_ids.request_date')
+ def _compute_next_maintenance(self):
+ for equipment in self:
+ create_date = equipment.create_date and datetime.strptime(equipment.create_date, DEFAULT_SERVER_DATETIME_FORMAT)
+ if equipment.period:
+ next_date = create_date
+ if equipment.maintenance_ids:
+ maintenance = equipment.maintenance_ids.sorted(lambda x: x.request_date)[0]
+ next_date = maintenance.request_date and datetime.strptime(maintenance.request_date, DEFAULT_SERVER_DATE_FORMAT) or create_date
+ equipment.next_action_date = next_date and (next_date + timedelta(days=equipment.period)).strftime(DEFAULT_SERVER_DATE_FORMAT)
@api.one
@api.depends('maintenance_ids.stage_id.done')
@@ -133,7 +162,7 @@ class HrEquipment(models.Model):
@api.onchange('category_id')
def _onchange_category_id(self):
- self.user_id = self.category_id.user_id
+ self.technician_user_id = self.category_id.technician_user_id
_sql_constraints = [
('serial_no', 'unique(serial_no)', "Another asset already exists with this serial number!"),
@@ -141,23 +170,23 @@ class HrEquipment(models.Model):
@api.model
def create(self, vals):
- equipment = super(HrEquipment, self).create(vals)
+ equipment = super(MaintenanceEquipment, self).create(vals)
if equipment.owner_user_id:
- equipment.message_subscribe_users(user_ids=equipment.owner_user_id.id)
+ equipment.message_subscribe_users(user_ids=[equipment.owner_user_id.id])
return equipment
@api.multi
def write(self, vals):
if vals.get('owner_user_id'):
self.message_subscribe_users(user_ids=[vals['owner_user_id']])
- return super(HrEquipment, self).write(vals)
+ return super(MaintenanceEquipment, self).write(vals)
@api.multi
def _read_group_category_ids(self, domain, read_group_order=None, access_rights_uid=None):
""" Read group customization in order to display all the category in the
kanban view, even if they are empty
"""
- category_obj = self.env['hr.equipment.category']
+ category_obj = self.env['maintenance.equipment.category']
order = category_obj._order
access_rights_uid = access_rights_uid or self._uid
if read_group_order == 'category_id desc':
@@ -173,20 +202,32 @@ class HrEquipment(models.Model):
fold[category.id] = category.fold
return result, fold
+ @api.model
+ def _cron_generate_requests(self):
+ for equipment in self.search([]):
+ if equipment.period and equipment.next_action_date == date.today().strftime(DEFAULT_SERVER_DATE_FORMAT):
+ self.env['maintenance.request'].create({
+ 'name': _('Preventive Maintenance - %s' % equipment.next_action_date),
+ 'request_date': equipment.next_action_date,
+ 'category_id': equipment.category_id.id,
+ 'equipment_id': equipment.id,
+ 'maintenance_type': 'preventive',
+ })
+
_group_by_full = {
'category_id': _read_group_category_ids
}
-class HrEquipmentRequest(models.Model):
- _name = 'hr.equipment.request'
+class MaintenanceRequest(models.Model):
+ _name = 'maintenance.request'
_inherit = ['mail.thread']
_description = 'Maintenance Requests'
_order = "id desc"
@api.returns('self')
def _default_stage(self):
- return self.env['hr.equipment.stage'].search([], limit=1)
+ return self.env['maintenance.stage'].search([], limit=1)
@api.multi
def _track_subtype(self, init_values):
@@ -195,50 +236,65 @@ class HrEquipmentRequest(models.Model):
return 'maintenance.mt_req_created'
elif 'stage_id' in init_values and self.stage_id.sequence > 1:
return 'maintenance.mt_req_status'
- return super(HrEquipmentRequest, self)._track_subtype(init_values)
+ return super(MaintenanceRequest, self)._track_subtype(init_values)
+
+ def _get_default_team_id(self):
+ return self.env.ref('maintenance.equipment_team_maintenance', raise_if_not_found=False)
name = fields.Char('Subjects', required=True)
description = fields.Text('Description')
request_date = fields.Date('Request Date', track_visibility='onchange', default=fields.Date.context_today)
+
owner_user_id = fields.Many2one('res.users', string='Created by', default=lambda s: s.env.uid)
- category_id = fields.Many2one('hr.equipment.category', string='Category')
- equipment_id = fields.Many2one('hr.equipment', string='Asset', select=True)
- user_id = fields.Many2one('res.users', string='Assigned to', track_visibility='onchange')
- stage_id = fields.Many2one('hr.equipment.stage', string='Stage', track_visibility='onchange', default=_default_stage)
+ category_id = fields.Many2one('maintenance.equipment.category', related='equipment_id.category_id', string='Category', store=True, readonly=True)
+ equipment_id = fields.Many2one('maintenance.equipment', string='Equipment', select=True)
+ technician_user_id = fields.Many2one('res.users', string='Owner', track_visibility='onchange', oldname='user_id')
+ stage_id = fields.Many2one('maintenance.stage', string='Stage', track_visibility='onchange', default=_default_stage)
priority = fields.Selection([('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')], string='Priority')
color = fields.Integer('Color Index')
close_date = fields.Date('Close Date')
kanban_state = fields.Selection([('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')],
string='Kanban State', required=True, default='normal', track_visibility='onchange')
- active = fields.Boolean(default=True, help="Set active to false to hide the maintenance request without deleting it.")
+ # active = fields.Boolean(default=True, help="Set active to false to hide the maintenance request without deleting it.")
+ archive = fields.Boolean(default=False, help="Set archive to true to hide the maintenance request without deleting it.")
+ maintenance_type = fields.Selection([('corrective', 'Corrective'), ('preventive', 'Preventive')], string='Maintenance Type', default="corrective")
+ schedule_date = fields.Datetime('Scheduled Date')
+ maintenance_team_id = fields.Many2one('maintenance.team', string='Team', required=True, default=_get_default_team_id)
+ duration = fields.Float(help="Duration in minutes and seconds.")
@api.multi
def archive_equipment_request(self):
- self.write({'active': False})
+ self.write({'archive': True})
@api.multi
def reset_equipment_request(self):
- """ Reinsert the equipment request into the maintenance pipe in the first stage"""
- first_stage_obj = self.env['hr.equipment.stage'].search([], order="sequence asc", limit=1)
- self.write({'active': True, 'stage_id': first_stage_obj.id})
+ """ Reinsert the maintenance request into the maintenance pipe in the first stage"""
+ first_stage_obj = self.env['maintenance.stage'].search([], order="sequence asc", limit=1)
+ # self.write({'active': True, 'stage_id': first_stage_obj.id})
+ self.write({'archive': False, 'stage_id': first_stage_obj.id})
@api.onchange('equipment_id')
def onchange_equipment_id(self):
- self.user_id = self.equipment_id.user_id if self.equipment_id.user_id else self.equipment_id.category_id.user_id
- self.category_id = self.equipment_id.category_id
+ if self.equipment_id:
+ self.technician_user_id = self.equipment_id.technician_user_id if self.equipment_id.technician_user_id else self.equipment_id.category_id.technician_user_id
+ self.category_id = self.equipment_id.category_id
+ if self.equipment_id.maintenance_team_id:
+ self.maintenance_team_id = self.equipment_id.maintenance_team_id.id
@api.onchange('category_id')
def onchange_category_id(self):
- if not self.user_id or not self.equipment_id or (self.user_id and not self.equipment_id.user_id):
- self.user_id = self.category_id.user_id
+ if not self.technician_user_id or not self.equipment_id or (self.technician_user_id and not self.equipment_id.technician_user_id):
+ self.technician_user_id = self.category_id.technician_user_id
@api.model
def create(self, vals):
# context: no_log, because subtype already handle this
self = self.with_context(mail_create_nolog=True)
- request = super(HrEquipmentRequest, self).create(vals)
+ request = super(MaintenanceRequest, self).create(vals)
if request.owner_user_id:
request.message_subscribe_users(user_ids=[request.owner_user_id.id])
+ if request.equipment_id and not request.maintenance_team_id:
+ request.maintenance_team_id = request.equipment_id.maintenance_team_id
return request
@api.multi
@@ -249,14 +305,17 @@ class HrEquipmentRequest(models.Model):
vals['kanban_state'] = 'normal'
if vals.get('owner_user_id'):
self.message_subscribe_users(user_ids=[vals['owner_user_id']])
- return super(HrEquipmentRequest, self).write(vals)
+ res = super(MaintenanceRequest, self).write(vals)
+ if self.stage_id.done and 'stage_id' in vals:
+ self.write({'close_date': fields.Date.today()})
+ return res
@api.multi
def _read_group_stage_ids(self, domain, read_group_order=None, access_rights_uid=None):
""" Read group customization in order to display all the stages in the
kanban view, even if they are empty
"""
- stage_obj = self.env['hr.equipment.stage']
+ stage_obj = self.env['maintenance.stage']
order = stage_obj._order
access_rights_uid = access_rights_uid or self._uid
@@ -277,3 +336,35 @@ class HrEquipmentRequest(models.Model):
_group_by_full = {
'stage_id': _read_group_stage_ids
}
+
+
+class MaintenanceTeam(models.Model):
+ _name = 'maintenance.team'
+ _description = 'Maintenance Teams'
+
+ name = fields.Char(required=True)
+ partner_id = fields.Many2one('res.partner', string='Subcontracting Partner')
+ color = fields.Integer(default=0)
+ request_ids = fields.One2many('maintenance.request', 'maintenance_team_id', copy=False)
+ equipment_ids = fields.One2many('maintenance.equipment', 'maintenance_team_id', copy=False)
+
+ # For the dashboard only
+ todo_request_ids = fields.One2many('maintenance.request', copy=False, compute='_compute_todo_requests')
+ todo_request_count = fields.Integer(compute='_compute_todo_requests')
+ todo_request_count_date = fields.Integer(compute='_compute_todo_requests')
+ todo_request_count_high_priority = fields.Integer(compute='_compute_todo_requests')
+ todo_request_count_block = fields.Integer(compute='_compute_todo_requests')
+
+ @api.one
+ @api.depends('todo_request_ids.stage_id.done')
+ def _compute_todo_requests(self):
+ self.todo_request_ids = self.request_ids.filtered(lambda e: e.stage_id.done==False)
+ self.todo_request_count = len(self.todo_request_ids)
+ self.todo_request_count_date = len(self.todo_request_ids.filtered(lambda e: e.schedule_date != False))
+ self.todo_request_count_high_priority = len(self.todo_request_ids.filtered(lambda e: e.priority == '3'))
+ self.todo_request_count_block = len(self.todo_request_ids.filtered(lambda e: e.kanban_state == 'blocked'))
+
+ @api.one
+ @api.depends('equipment_ids')
+ def _compute_equipment(self):
+ self.equipment_count = len(self.equipment_ids)
diff --git a/addons/maintenance/models/maintenance_config_settings.py b/addons/maintenance/models/maintenance_config_settings.py
deleted file mode 100644
index a029e45eab7..00000000000
--- a/addons/maintenance/models/maintenance_config_settings.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from urlparse import urlsplit
-from openerp import api, fields, models
-
-
-class HrEquipmentConfigSettings(models.TransientModel):
- _name = 'hr.equipment.config.settings'
- _inherit = 'res.config.settings'
-
- equipment_alias_prefix = fields.Char('Use the following alias to report internal equipment issue')
- alias_domain = fields.Char("Alias Domain")
-
- @api.model
- def get_default_alias_equipment(self, fields):
- alias_name = False
- alias_id = self.env.ref('hr_equipment.mail_alias_equipment')
- if alias_id:
- alias_name = alias_id.alias_name
- return {'equipment_alias_prefix': alias_name}
-
- @api.multi
- def set_default_alias_equipment(self):
- for record in self:
- default_equipment_alias_prefix = record.get_default_alias_equipment()['equipment_alias_prefix']
- if record.equipment_alias_prefix != default_equipment_alias_prefix:
- alias_id = self.env.ref('hr_equipment.mail_alias_equipment')
- if alias_id:
- alias_id.write({'alias_name': record.equipment_alias_prefix})
- return True
-
- @api.model
- def get_default_alias_domain(self, fields):
- alias_domain = self.env['ir.config_parameter'].get_param("mail.catchall.domain")
- if not alias_domain:
- domain = self.env["ir.config_parameter"].get_param("web.base.url")
- try:
- alias_domain = urlsplit(domain).netloc.split(':')[0]
- except Exception:
- pass
- return {'alias_domain': alias_domain}
-
diff --git a/addons/maintenance/security/ir.model.access.csv b/addons/maintenance/security/ir.model.access.csv
index 3748c9f79bb..8788384fa4f 100644
--- a/addons/maintenance/security/ir.model.access.csv
+++ b/addons/maintenance/security/ir.model.access.csv
@@ -1,10 +1,9 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_hr_equipment_user,hr.equipment.user,model_hr_equipment,base.group_hr_user,1,1,1,1
-access_hr_equipment_emp,hr.equipment.emp,model_hr_equipment,base.group_user,1,0,0,0
-access_hr_equipment_admin_user,hr.equipment.admin.user,model_hr_equipment,base.group_equipment_manager,1,1,1,1
-access_hr_maintenance_user,hr.equipment.request user,model_hr_equipment_request,base.group_hr_user,1,1,1,1
-access_hr_maintenance_system_user,hr.equipment.request system user,model_hr_equipment_request,base.group_user,1,1,1,1
-access_hr_equipment_category_user,hr.equipment.category.user,model_hr_equipment_category,base.group_hr_user,1,1,1,1
-access_maintenance_request_stage_user,hr.equipment.stage.user,model_hr_equipment_stage,base.group_hr_user,1,1,1,1
-access_hr_equipment_category_employee,hr.equipment.category.employee,model_hr_equipment_category,base.group_user,1,0,0,0
-access_maintenance_request_stage_employee,hr.equipment.stage.employee,model_hr_equipment_stage,base.group_user,1,0,0,0
+access_equipment_user,equipment.user,model_maintenance_equipment,base.group_user,1,0,0,0
+access_equipment_admin_user,equipment.admin.user,model_maintenance_equipment,base.group_equipment_manager,1,1,1,1
+access_maintenance_system_user,equipment.request system user,model_maintenance_request,base.group_user,1,1,1,1
+access_equipment_category_user,equipment.category.user,model_maintenance_equipment_category,base.group_user,1,0,0,0
+access_equipment_category_admin_user,equipment.category system user,model_maintenance_equipment_category,base.group_equipment_manager,1,1,1,1
+access_maintenance_stage_user,maintenance.stage.user,model_maintenance_stage,base.group_user,1,0,0,0
+access_maintenance_stage_admin_user,equipment.request.stage system user,model_maintenance_stage,base.group_equipment_manager,1,1,1,1
+access_maintenance_team_user,maintenance.team.user,model_maintenance_team,base.group_user,1,0,0,0 \ No newline at end of file
diff --git a/addons/maintenance/security/maintenance.xml b/addons/maintenance/security/maintenance.xml
index b52aebd5346..313548b8a17 100644
--- a/addons/maintenance/security/maintenance.xml
+++ b/addons/maintenance/security/maintenance.xml
@@ -1,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
- <!-- This group is the lowest level of HR management: the Equipment manager
- is only allowed to deal with equipment registration and maintenance
-
- HR Officers/Managers are Equipment Managers (see next group) -->
+ <!-- This group is only allowed to deal with equipment registration and maintenance -->
<record id="base.group_equipment_manager" model="res.groups">
<field name="name">Equipment Manager</field>
<field name="category_id" ref="base.module_category_human_resources"/>
@@ -11,36 +8,31 @@
<field name="comment">The user will be able to manage equipments.</field>
</record>
- <!-- HR officers and HR managers are allowed to manage equipments -->
- <record id="base.group_hr_user" model="res.groups">
- <field name="implied_ids" eval="[(4, ref('base.group_equipment_manager'))]"/>
- </record>
-
<!-- Rules -->
- <record id="hr_equipment_request_rule_user" model="ir.rule">
- <field name="name">Employees are allowed to access their own maintenance requests</field>
- <field name="model_id" ref="model_hr_equipment_request"/>
- <field name="domain_force">['|', ('user_id.id', '=', user.id), ('employee_id.user_id.id', '=', user.id)]</field>
+ <record id="equipment_request_rule_user" model="ir.rule">
+ <field name="name">Users are allowed to access their own maintenance requests</field>
+ <field name="model_id" ref="model_maintenance_request"/>
+ <field name="domain_force">['|', ('owner_user_id.id', '=', user.id), ('technician_user_id.id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
- <record id="hr_equipment_rule_user" model="ir.rule">
- <field name="name">Employees are allowed to access their own equipments</field>
- <field name="model_id" ref="model_hr_equipment"/>
- <field name="domain_force">[('employee_id.user_id.id', '=', user.id)]</field>
+ <record id="equipment_rule_user" model="ir.rule">
+ <field name="name">Users are allowed to access their own equipments</field>
+ <field name="model_id" ref="model_maintenance_equipment"/>
+ <field name="domain_force">[('owner_user_id.id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
- <record id="hr_equipment_request_rule_admin_user" model="ir.rule">
+ <record id="equipment_request_rule_admin_user" model="ir.rule">
<field name="name">Administrator of maintenance requests</field>
- <field name="model_id" ref="model_hr_equipment_request"/>
+ <field name="model_id" ref="model_maintenance_request"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_equipment_manager'))]"/>
</record>
- <record id="hr_equipment_rule_admin_user" model="ir.rule">
+ <record id="equipment_rule_admin_user" model="ir.rule">
<field name="name">Equipments administrator</field>
- <field name="model_id" ref="model_hr_equipment"/>
+ <field name="model_id" ref="model_maintenance_equipment"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_equipment_manager'))]"/>
</record>
diff --git a/addons/maintenance/static/src/less/maintenance_team_dashboard.less b/addons/maintenance/static/src/less/maintenance_team_dashboard.less
new file mode 100644
index 00000000000..36ce517166f
--- /dev/null
+++ b/addons/maintenance/static/src/less/maintenance_team_dashboard.less
@@ -0,0 +1,8 @@
+.o_kanban_view.o_kanban_dashboard.o_maintenance_team_kanban {
+ .o_kanban_record {
+ min-height: 250px;
+ @media (min-width: @screen-sm-min) {
+ min-width: 420px;
+ }
+ }
+} \ No newline at end of file
diff --git a/addons/maintenance/tests/test_maintenance.py b/addons/maintenance/tests/test_maintenance.py
index 6660260ac90..5935b012996 100644
--- a/addons/maintenance/tests/test_maintenance.py
+++ b/addons/maintenance/tests/test_maintenance.py
@@ -4,45 +4,44 @@ from openerp.tests.common import TransactionCase
import time
-class TestHrEquipment(TransactionCase):
+class TestEquipment(TransactionCase):
""" Test used to check that when doing equipment/maintenance_request/equipment_category creation."""
def setUp(self):
- super(TestHrEquipment, self).setUp()
- self.equipment = self.env['hr.equipment']
- self.maintenance_request = self.env['hr.equipment.request']
- self.user = self.env['res.users']
+ super(TestEquipment, self).setUp()
+ self.equipment = self.env['maintenance.equipment']
+ self.maintenance_request = self.env['maintenance.request']
+ self.res_users = self.env['res.users']
self.main_company = self.env.ref('base.main_company')
- res_hr_user = self.env.ref('base.group_user')
- res_hr_manager = self.env.ref('base.group_hr_manager')
+ res_user = self.env.ref('base.group_user')
+ res_manager = self.env.ref('base.group_equipment_manager')
- self.hr_user = self.user.create(dict(
+ self.user = self.res_users.create(dict(
name="Normal User/Employee",
company_id=self.main_company.id,
login="emp",
password="emp",
email="empuser@yourcompany.example.com",
- groups_id=[(6, 0, [res_hr_user.id])]
+ groups_id=[(6, 0, [res_user.id])]
))
- self.env.ref('hr.employee_qdp').write({'user_id': self.hr_user.id})
- self.hr_manager = self.user.create(dict(
- name="HR Manager",
+ self.manager = self.res_users.create(dict(
+ name="Equipment Manager",
company_id=self.main_company.id,
login="hm",
password="hm",
- email="hrmanager@yourcompany.example.com",
- groups_id=[(6, 0, [res_hr_manager.id])]
+ email="eqmanager@yourcompany.example.com",
+ groups_id=[(6, 0, [res_manager.id])]
))
- def test_hr_equipment_request_category(self):
+ def test_equipment_request_category(self):
# Create a new equipment
- equipment_01 = self.equipment.sudo(self.hr_manager).create({
+ equipment_01 = self.equipment.sudo(self.manager).create({
'name': 'Samsung Monitor "15',
- 'category_id': self.ref('hr_equipment.hr_equipment_monitor'),
- 'employee_id': self.ref('hr.employee_qdp'),
- 'user_id': self.ref('base.user_root'),
+ 'category_id': self.ref('maintenance.equipment_monitor'),
+ 'technician_user_id': self.ref('base.user_root'),
+ 'owner_user_id': self.user.id,
'assign_date': time.strftime('%Y-%m-%d'),
'serial_no': 'MT/127/18291015',
'model': 'NP355E5X',
@@ -53,24 +52,24 @@ class TestHrEquipment(TransactionCase):
assert equipment_01, "Equipment not created"
# Create new maintenance request
- maintenance_request_01 = self.maintenance_request.sudo(self.hr_user).create({
+ maintenance_request_01 = self.maintenance_request.sudo(self.user).create({
'name': 'Resolution is bad',
- 'user_id': self.hr_user.id,
- 'employee_id': self.ref('hr.employee_qdp'),
+ 'technician_user_id': self.user.id,
+ 'owner_user_id': self.user.id,
'equipment_id': equipment_01.id,
- 'category_id': self.ref('hr_equipment.hr_equipment_monitor'),
'color': 7,
- 'stage_id': self.ref('hr_equipment.stage_0')
+ 'stage_id': self.ref('maintenance.stage_0'),
+ 'maintenance_team_id': self.ref('maintenance.equipment_team_maintenance')
})
# I check that maintenance_request is created or not
assert maintenance_request_01, "Maintenance Request not created"
# I check that Initially maintenance request is in the "New Request" stage
- self.assertEquals(maintenance_request_01.stage_id.id, self.ref('hr_equipment.stage_0'))
+ self.assertEquals(maintenance_request_01.stage_id.id, self.ref('maintenance.stage_0'))
# I check that change the maintenance_request stage on click statusbar
- maintenance_request_01.sudo(self.hr_user).write({'stage_id': self.ref('hr_equipment.stage_1')})
+ maintenance_request_01.sudo(self.user).write({'stage_id': self.ref('maintenance.stage_1')})
# I check that maintenance request is in the "In Progress" stage
- self.assertEquals(maintenance_request_01.stage_id.id, self.ref('hr_equipment.stage_1'))
+ self.assertEquals(maintenance_request_01.stage_id.id, self.ref('maintenance.stage_1'))
diff --git a/addons/maintenance/views/maintenance_config_settings_views.xml b/addons/maintenance/views/maintenance_config_settings_views.xml
deleted file mode 100644
index 5b61b8b536d..00000000000
--- a/addons/maintenance/views/maintenance_config_settings_views.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<odoo>
- <record id="hr_equipment_config_settings_view_form" model="ir.ui.view">
- <field name="name">hr.equipment.config.settings</field>
- <field name="model">hr.equipment.config.settings</field>
- <field name="arch" type="xml">
- <form string="Configure Equipments Settings" class="oe_form_configuration">
- <header>
- <button string="Apply" type="object" name="execute" class="oe_highlight"/>
- <button string="Cancel" type="object" name="cancel" class="oe_link"/>
- </header>
- <group string="Track Equipments" name="hr_equipment_grp">
- <label for="id" string="Requests Alias"/>
- <div>
- <label for="equipment_alias_prefix" class="oe_inline"/>
- <div>
- <label for="id" id="the following alias to report internal equipment issue"/>
- <field name="equipment_alias_prefix" class="oe_inline"/>@
- <field name="alias_domain" class="oe_inline" readonly="1"/>
- </div>
- </div>
- </group>
- </form>
- </field>
- </record>
-
- <record id="action_hr_equipment_configuration" model="ir.actions.act_window">
- <field name="name">Configure Equipments</field>
- <field name="res_model">hr.equipment.config.settings</field>
- <field name="view_id" ref="hr_equipment_config_settings_view_form"/>
- <field name="view_mode">form</field>
- <field name="target">inline</field>
- </record>
-</odoo>
diff --git a/addons/maintenance/views/maintenance_templates.xml b/addons/maintenance/views/maintenance_templates.xml
new file mode 100644
index 00000000000..09b86b5af4e
--- /dev/null
+++ b/addons/maintenance/views/maintenance_templates.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="assets_backend" name="maintenance assets" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <link rel="stylesheet" href="/maintenance/static/src/less/maintenance_team_dashboard.less"/>
+ </xpath>
+ </template>
+</odoo>
diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml
index f4b8adb4498..26071d62091 100644
--- a/addons/maintenance/views/maintenance_views.xml
+++ b/addons/maintenance/views/maintenance_views.xml
@@ -1,18 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
- <!-- hr.equiment.request : views -->
+ <!-- equiment.request : views -->
<record id="hr_equipment_request_view_search" model="ir.ui.view">
- <field name="name">hr.equipment.request.search</field>
- <field name="model">hr.equipment.request</field>
+ <field name="name">equipment.request.search</field>
+ <field name="model">maintenance.request</field>
<field name="arch" type="xml">
<search string="maintenance Request Search">
<field name="name"/>
<field name="category_id"/>
- <field name="user_id"/>
+ <field name="technician_user_id"/>
<field name="equipment_id"/>
<field name="owner_user_id"/>
<field name="stage_id"/>
+ <field name="maintenance_team_id"/>
+ <separator/>
+ <filter string="To do" domain="[('stage_id.done', '=', False)]" name="todo"/>
+ <filter string="Blocked" name="kanban_state_block" domain="[('kanban_state', '=', 'blocked')]"/>
+ <filter string="In Progress" name="progress" domain="[('kanban_state', '=', 'normal')]"/>
+ <filter string="Done" name="done" domain="[('kanban_state', '=', 'done')]"/>
+ <filter string="Top Priorities" name="top_priority" domain="[('priority', '=', '3')]"/>
+ <separator/>
+ <filter string="Unscheduled Maintenance" domain="[('schedule_date', '=', False)]" name="unscheduled"/>
<separator/>
<filter string="My Requests" name="my_requests" domain="[('owner_user_id', '=', uid)]"/>
<separator/>
@@ -20,7 +29,7 @@
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group expand='0' string='Group by...'>
- <filter string='Users' domain="[]" context="{'group_by': 'user_id'}"/>
+ <filter string='Assigned' domain="[]" context="{'group_by': 'technician_user_id'}"/>
<filter string='Category' domain="[]" context="{'group_by' : 'category_id'}"/>
<filter string='Stages' domain="[]" context="{'group_by' : 'stage_id'}"/>
<filter string='Created By' name='created_by' domain="[]" context="{'group_by': 'owner_user_id'}"/>
@@ -30,22 +39,22 @@
</record>
<record id="hr_equipment_request_view_form" model="ir.ui.view">
- <field name="name">hr.equipment.request.form</field>
- <field name="model">hr.equipment.request</field>
+ <field name="name">equipment.request.form</field>
+ <field name="model">maintenance.request</field>
<field name="arch" type="xml">
<form string="Maintenance Request">
<header>
- <button string="Cancel" name="archive_equipment_request" type="object" attrs="{'invisible': [('active', '=', False)]}"/>
- <button string="Reset Request" name="reset_equipment_request" type="object" attrs="{'invisible': [('active', '=', True)]}"/>
- <field name="stage_id" widget="statusbar" clickable="true" readonly="1"/>
+ <button string="Cancel" name="archive_equipment_request" type="object" attrs="{'invisible': [('archive', '=', True)]}"/>
+ <button string="Reopen Request" name="reset_equipment_request" type="object" attrs="{'invisible': [('archive', '=', False)]}"/>
+ <field name="stage_id" widget="statusbar" clickable="true" readonly="1" attrs="{'invisible': [('archive', '=', True)]}"/>
</header>
<sheet>
- <div class="oe_button_box" name="button_box">
- <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
- <field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
- </button>
+ <div attrs="{'invisible': [('archive', '=', False)]}">
+ <span class="label label-warning pull-right">Canceled</span>
+ </div>
+ <div class="oe_right">
+ <field name="kanban_state" class="oe_inline" widget="kanban_state_selection"/>
</div>
- <field name="kanban_state" widget="kanban_state_selection"/>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Subject"/>
<h1>
@@ -56,12 +65,21 @@
<group>
<field name="owner_user_id" string="Requested By"/>
<field name="equipment_id" context="{'default_category_id':category_id}"/>
- <field name="category_id" groups="base.group_hr_manager"/>
+ <field name="category_id" groups="base.group_equipment_manager"/>
<field name="request_date" groups="base.group_no_one"/>
<field name="close_date" groups="base.group_no_one"/>
+ <field name="archive" invisible="1"/>
+ <field name="maintenance_type" widget="radio"/>
</group>
<group>
- <field name="user_id" string="Repair Responsible"/>
+ <field name="maintenance_team_id"/>
+ <field name="technician_user_id" string="Responsible"/>
+ <label for="schedule_date"/>
+ <div class="o_row">
+ <field name="schedule_date"/>
+ <label string="for"/>
+ <field name="duration" class="oe_inline"/> hours
+ </div>
<field name="priority" widget="priority"/>
</group>
</group>
@@ -76,15 +94,15 @@
</record>
<record id="hr_equipment_request_view_kanban" model="ir.ui.view">
- <field name="name">hr.equipment.request.kanban</field>
- <field name="model">hr.equipment.request</field>
+ <field name="name">equipment.request.kanban</field>
+ <field name="model">maintenance.request</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id">
<field name="stage_id"/>
<field name="color"/>
<field name="priority"/>
<field name="equipment_id"/>
- <field name="user_id"/>
+ <field name="technician_user_id"/>
<field name="owner_user_id"/>
<field name="category_id"/>
<field name="kanban_state"/>
@@ -93,7 +111,7 @@
<t t-name="kanban-tooltip">
<ul class="oe_kanban_tooltip">
<li><b>Category:</b> <field name="category_id"/></li>
- <li><b>Request to:</b> <field name="user_id"/></li>
+ <li><b>Request to:</b> <field name="technician_user_id"/></li>
</ul>
</t>
<t t-name="kanban-box">
@@ -138,28 +156,62 @@
</record>
<record id="hr_equipment_request_view_tree" model="ir.ui.view">
- <field name="name">hr.equipment.request.tree</field>
- <field name="model">hr.equipment.request</field>
+ <field name="name">equipment.request.tree</field>
+ <field name="model">maintenance.request</field>
<field name="arch" type="xml">
<tree string="maintenance Request" decoration-bf="message_needaction==True">
<field name="message_needaction" invisible="1"/>
<field name="name"/>
- <field name="active" invisible="1"/>
<field name="request_date" groups="base.group_no_one"/>
<field name="owner_user_id"/>
- <field name="user_id"/>
- <field name="category_id" groups="base.group_hr_manager"/>
+ <field name="technician_user_id"/>
+ <field name="category_id" groups="base.group_equipment_manager"/>
<field name="stage_id"/>
</tree>
</field>
</record>
- <!-- hr.equiment.request : actions -->
+ <record id="hr_equipment_request_view_graph" model="ir.ui.view">
+ <field name="name">equipment.request.graph</field>
+ <field name="model">maintenance.request</field>
+ <field name="arch" type="xml">
+ <graph string="maintenance Request">
+ <field name="technician_user_id"/>
+ <field name="stage_id"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="hr_equipment_request_view_pivot" model="ir.ui.view">
+ <field name="name">equipment.request.pivot</field>
+ <field name="model">maintenance.request</field>
+ <field name="arch" type="xml">
+ <pivot string="maintenance Request">
+ <field name="technician_user_id"/>
+ <field name="stage_id"/>
+ </pivot>
+ </field>
+ </record>
+
+
+ <record id="hr_equipment_view_calendar" model="ir.ui.view">
+ <field name="name">equipment.request.calendar</field>
+ <field name="model">maintenance.request</field>
+ <field name="arch" type="xml">
+ <calendar date_start="schedule_date" color="technician_user_id">
+ <field name="name"/>
+ <field name="technician_user_id"/>
+ </calendar>
+ </field>
+ </record>
+
+ <!-- equiment.request : actions -->
<record id="hr_equipment_request_action" model="ir.actions.act_window">
<field name="name">Maintenance Requests</field>
- <field name="res_model">hr.equipment.request</field>
- <field name="view_mode">kanban,tree,form</field>
+ <field name="res_model">maintenance.request</field>
+ <field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="view_id" ref="hr_equipment_request_view_kanban"/>
+ <field name="context">{'default_technician_user_id': uid}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a new maintenance request.
@@ -171,8 +223,8 @@
<record id="hr_equipment_request_action_link" model="ir.actions.act_window">
<field name="name">Maintenance Requests</field>
- <field name="res_model">hr.equipment.request</field>
- <field name="view_mode">kanban,tree,form</field>
+ <field name="res_model">maintenance.request</field>
+ <field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="search_view_id" ref="hr_equipment_request_view_search"/>
<field name="view_id" ref="hr_equipment_request_view_kanban"/>
<field name="context">{
@@ -190,26 +242,40 @@
<record id="hr_equipment_request_action_from_equipment" model="ir.actions.act_window">
<field name="name">Maintenance Requests</field>
- <field name="res_model">hr.equipment.request</field>
- <field name="src_model">hr.equipment</field>
- <field name="view_mode">kanban,tree,form</field>
+ <field name="res_model">maintenance.request</field>
+ <field name="src_model">maintenance.equipment</field>
+ <field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="context">{
'default_equipment_id': active_id,
}</field>
<field name="domain">[('equipment_id', '=', active_id)]</field>
</record>
- <!-- hr.equiment : views -->
+ <record id="hr_equipment_todo_request_action_from_dashboard" model="ir.actions.act_window">
+ <field name="name">Maintenance Requests</field>
+ <field name="res_model">maintenance.request</field>
+ <field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
+ <field name="context">{
+ 'default_maintenance_team_id': active_id,
+ }</field>
+ <field name="domain">[('maintenance_team_id', '=', active_id), ('maintenance_type', 'in', context.get('maintenance_type', ['preventive', 'corrective']))]</field>
+ </record>
+
+ <record id="hr_equipment_request_action_cal" model="ir.actions.act_window">
+ <field name="name">Maintenance Requests</field>
+ <field name="res_model">maintenance.request</field>
+ <field name="view_mode">calendar,kanban,tree,form,pivot,graph</field>
+ <field name="view_id" ref="hr_equipment_view_calendar"/>
+ </record>
+
+ <!-- equiment : views -->
<record id="hr_equipment_view_form" model="ir.ui.view">
- <field name="name">hr.equipment.form</field>
- <field name="model">hr.equipment</field>
+ <field name="name">equipment.form</field>
+ <field name="model">maintenance.equipment</field>
<field name="arch" type="xml">
<form string="Equipments">
<sheet>
<div class="oe_button_box" name="button_box">
- <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
- <field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
- </button>
<button name="%(hr_equipment_request_action_from_equipment)d"
type="action"
class="oe_stat_button"
@@ -220,19 +286,18 @@
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name" string="Name" placeholder="Equipment Name"/></h1>
- <label for="category_id" class="oe_edit_only"/>
- <field name="category_id" options="{&quot;no_open&quot;: True}"/>
- <label for="serial_no" class="oe_edit_only"/>
- <field name="serial_no"/>
</div>
<group>
<group>
+ <field name="category_id" options="{&quot;no_open&quot;: True}"/>
<field name="owner_user_id" string="Owner"/>
</group>
<group>
- <field name="user_id"/>
+ <field name="maintenance_team_id"/>
+ <field name="technician_user_id"/>
<field name="assign_date" groups="base.group_no_one"/>
<field name="scrap_date" groups="base.group_no_one"/>
+ <field name="location" string="Used in location"/>
</group>
</group>
<notebook>
@@ -245,10 +310,25 @@
<field name="partner_id"/>
<field name="partner_ref"/>
<field name="model"/>
+ <field name="serial_no"/>
</group><group>
- <field name="cost" groups="base.group_hr_user"/>
+ <field name="cost" groups="base.group_equipment_manager"/>
<field name="warranty"/>
- <field name="location"/>
+ </group>
+ </group>
+ </page>
+ <page string="Maintenance">
+ <group>
+ <group name="maintenance">
+ <field name="next_action_date" class="oe_read_only" string="Next Preventive Maintenance"/>
+ <label for="period" string="Preventive Maintenance Frequency"/>
+ <div class="o_row">
+ <field name="period"/> days
+ </div>
+ <label for="maintenance_duration" string="Maintenance Duration"/>
+ <div class="o_row">
+ <field name="maintenance_duration"/> hours
+ </div>
</group>
</group>
</page>
@@ -263,19 +343,21 @@
</record>
<record id="hr_equipment_view_kanban" model="ir.ui.view">
- <field name="name">hr.equipment.kanban</field>
- <field name="model">hr.equipment</field>
+ <field name="name">equipment.kanban</field>
+ <field name="model">maintenance.equipment</field>
<field name="arch" type="xml">
- <kanban default_group_by="category_id">
+ <kanban>
<field name="name"/>
<field name="color"/>
- <field name="user_id"/>
+ <field name="technician_user_id"/>
<field name="owner_user_id"/>
<field name="category_id"/>
<field name="serial_no"/>
<field name="model"/>
<field name="maintenance_ids"/>
<field name="maintenance_open_count"/>
+ <field name="next_action_date"/>
+ <field name="technician_user_id"/>
<templates>
<t t-name="kanban-tooltip">
<ul class="oe_kanban_tooltip">
@@ -309,6 +391,9 @@
<div class="oe_kanban_footer_left mt4 label label-danger" t-if="record.maintenance_open_count.raw_value" >
<t t-raw="record.maintenance_open_count.raw_value"/> Request
</div>
+ <div class="oe_kanban_footer_left mt4 label label-default" t-if="record.maintenance_open_count.raw_value == 0 and record.next_action_date.raw_value" >
+ <t t-raw="moment(record.next_action_date.raw_value).format('MMMM Do')"/>
+ </div>
</div>
<div class="oe_clear"></div>
</div>
@@ -319,17 +404,17 @@
</record>
<record id="hr_equipment_view_tree" model="ir.ui.view">
- <field name="name">hr.equipment.tree</field>
- <field name="model">hr.equipment</field>
+ <field name="name">equipment.tree</field>
+ <field name="model">maintenance.equipment</field>
<field name="arch" type="xml">
- <tree string="Assign To Employee" decoration-bf="message_needaction==True">
+ <tree string="Assign To User" decoration-bf="message_needaction==True">
<field name="message_needaction" invisible="1"/>
<field name="name"/>
- <field name="active" invisible="1"/>
+ <!-- <field name="active" invisible="1"/> -->
<field name="owner_user_id" string="Owner"/>
<field name="assign_date" groups="base.group_no_one"/>
<field name="serial_no"/>
- <field name="user_id"/>
+ <field name="technician_user_id"/>
<field name="category_id"/>
<field name="partner_id" invisible="1"/>
</tree>
@@ -337,8 +422,8 @@
</record>
<record id="hr_equipment_view_search" model="ir.ui.view">
- <field name="name">hr.equipment.search</field>
- <field name="model">hr.equipment</field>
+ <field name="name">equipment.search</field>
+ <field name="model">maintenance.equipment</field>
<field name="arch" type="xml">
<search string="Search">
<field name="name" filter_domain="['|','|','|',('name','ilike',self),('model','ilike',self),('serial_no','ilike',self),('partner_ref', 'ilike', self)]"/>
@@ -353,9 +438,9 @@
<separator/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<separator/>
- <filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
+ <!-- <filter string="Archived" name="inactive" domain="[('active','=',False)]"/> -->
<group expand='0' string='Group by...'>
- <filter string='Users' domain="[]" context="{'group_by': 'user_id'}"/>
+ <filter string='Technicians' domain="[]" context="{'group_by': 'technician_user_id'}"/>
<filter string='Category' domain="[]" context="{'group_by': 'category_id'}"/>
<filter string='Owner' domain="[]" context="{'group_by': 'owner_user_id'}"/>
<filter string='Vendor' domain="[]" context="{'group_by': 'partner_id'}"/>
@@ -366,7 +451,7 @@
<record id="hr_equipment_action" model="ir.actions.act_window">
<field name="name">Equipments</field>
- <field name="res_model">hr.equipment</field>
+ <field name="res_model">maintenance.equipment</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="hr_equipment_view_kanban"/>
<field name="help" type="html">
@@ -381,10 +466,10 @@
</field>
</record>
- <!-- hr.equiment : actions -->
+ <!-- equiment : actions -->
<record id="hr_equipment_action_from_category_form" model="ir.actions.act_window">
<field name="name">Equipments</field>
- <field name="res_model">hr.equipment</field>
+ <field name="res_model">maintenance.equipment</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="hr_equipment_view_search"/>
<field name="view_id" ref="hr_equipment_view_kanban"/>
@@ -403,10 +488,10 @@
</field>
</record>
- <!-- hr.equipment.category : views -->
+ <!-- equipment.category : views -->
<record id="hr_equipment_category_view_form" model="ir.ui.view">
- <field name="name">hr.equipment.category.form</field>
- <field name="model">hr.equipment.category</field>
+ <field name="name">equipment.category.form</field>
+ <field name="model">maintenance.equipment.category</field>
<field name="arch" type="xml">
<form string="Equipment Categories">
<sheet>
@@ -432,7 +517,7 @@
</div>
<group>
<group col="4">
- <field name="user_id"/>
+ <field name="technician_user_id"/>
</group>
<group name="group_alias" attrs="{'invisible': [('alias_domain', '=', False)]}" groups="base.group_no_one">
<label for="alias_name" string="Email Alias"/>
@@ -455,33 +540,33 @@
</record>
<record id="hr_equipment_category_view_tree" model="ir.ui.view">
- <field name="name">hr.equipment.category.tree</field>
- <field name="model">hr.equipment.category</field>
+ <field name="name">equipment.category.tree</field>
+ <field name="model">maintenance.equipment.category</field>
<field name="arch" type="xml">
- <tree string="Assign To Employee">
+ <tree string="Assign To User">
<field name="name" string="Name"/>
- <field name="user_id"/>
+ <field name="technician_user_id"/>
</tree>
</field>
</record>
<record id="hr_equipment_category_view_search" model="ir.ui.view">
- <field name="name">hr.equipment.category.search</field>
- <field name="model">hr.equipment.category</field>
+ <field name="name">equipment.category.search</field>
+ <field name="model">maintenance.equipment.category</field>
<field name="arch" type="xml">
<search string="Search">
<field name="name" string="Category Name" filter_domain="[('name','ilike',self)]"/>
<group expand='0' string='Group by...'>
- <filter string='Responsible' domain="[]" context="{'group_by' : 'user_id'}"/>
+ <filter string='Responsible' domain="[]" context="{'group_by' : 'technician_user_id'}"/>
</group>
</search>
</field>
</record>
- <!-- hr.equipment.category : actions -->
+ <!-- equipment.category : actions -->
<record id="hr_equipment_category_action" model="ir.actions.act_window">
<field name="name">Equipment Categories</field>
- <field name="res_model">hr.equipment.category</field>
+ <field name="res_model">maintenance.equipment.category</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="hr_equipment_category_view_tree"/>
<field name="help" type="html">
@@ -491,10 +576,10 @@
</field>
</record>
- <!-- hr.equipment.stage : views -->
+ <!-- equipment.stage : views -->
<record id="hr_equipment_stage_view_search" model="ir.ui.view">
- <field name="name">hr.equipment.stage.search</field>
- <field name="model">hr.equipment.stage</field>
+ <field name="name">equipment.stage.search</field>
+ <field name="model">maintenance.stage</field>
<field name="arch" type="xml">
<search string="Maintenance Request Stages">
<field name="name" string="Maintenance Request Stages"/>
@@ -503,8 +588,8 @@
</record>
<record id="hr_equipment_stage_view_tree" model="ir.ui.view">
- <field name="name">hr.equipment.stage.tree</field>
- <field name="model">hr.equipment.stage</field>
+ <field name="name">equipment.stage.tree</field>
+ <field name="model">maintenance.stage</field>
<field name="arch" type="xml">
<tree string="Maintenance Request Stage" editable="top">
<field name="sequence" widget="handle"/>
@@ -515,10 +600,10 @@
</field>
</record>
- <!-- hr.equipment.stages : actions -->
+ <!-- equipment.stages : actions -->
<record id="hr_equipment_stage_action" model="ir.actions.act_window">
<field name="name">Stages</field>
- <field name="res_model">hr.equipment.stage</field>
+ <field name="res_model">maintenance.stage</field>
<field name="view_mode">tree</field>
<field name="view_type">form</field>
<field name="view_id" ref="hr_equipment_stage_view_tree"/>
@@ -529,59 +614,263 @@
</field>
</record>
+ <!-- maitenance.team: views -->
+ <record id="maintenance_team_view_form" model="ir.ui.view">
+ <field name="name">maintenance.team.form</field>
+ <field name="model">maintenance.team</field>
+ <field name="arch" type="xml">
+ <form string="Maintenance Team">
+ <sheet>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only" string="Category Name"/>
+ <h1>
+ <field name="name"/>
+ </h1>
+ </div>
+ <field name="partner_id"/>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="maintenance_team_view_tree" model="ir.ui.view">
+ <field name="name">maintenance.team.tree</field>
+ <field name="model">maintenance.team</field>
+ <field name="arch" type="xml">
+ <tree string="Maintenance Team" editable="top">
+ <field name="name"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="maintenance_team_kanban" model="ir.ui.view">
+ <field name="name">maintenance.team.kanban</field>
+ <field name="model">maintenance.team</field>
+ <field name="arch" type="xml">
+ <kanban class="oe_background_grey o_kanban_dashboard o_maintenance_team_kanban" create="0">
+ <field name="name"/>
+ <field name="color"/>
+ <field name="todo_request_ids"/>
+ <field name="todo_request_count"/>
+ <field name="todo_request_count_date"/>
+ <field name="todo_request_count_high_priority"/>
+ <field name="todo_request_count_block"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="#{kanban_color(record.color.raw_value)}">
+ <div class="o_kanban_card_header">
+ <div class="o_kanban_card_header_title">
+ <div class="o_primary"><field name="name"/></div>
+ </div>
+ <div class="o_kanban_manage_button_section">
+ <a class="o_kanban_manage_toggle_button" href="#">More <i class="fa fa-caret-down"/></a>
+ </div>
+ </div>
+ <div class="container o_kanban_card_content o_visible">
+ <div class="row">
+ <div class="col-xs-6 o_kanban_primary_left">
+ <button class="btn btn-primary" name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action">
+ <t t-esc="record.todo_request_count.value"/> To Do
+ </button>
+ </div>
+ <div class="col-xs-6 o_kanban_primary_right">
+ <div class="row">
+ <div class="col-xs-9">
+ <a name="%(hr_equipment_request_action_cal)d" type="action" domain="[('maintenance_team_id', '=', active_id)]">
+ Scheduled
+ </a>
+ </div>
+ <div class="col-xs-3">
+ <t t-esc="record.todo_request_count_date.value"/>
+ </div>
+ <div class="col-xs-9">
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_top_priority': 1}">
+ Top Priorities
+ </a>
+ </div>
+ <div class="col-xs-3">
+ <t t-esc="record.todo_request_count_high_priority.value"/>
+ </div>
+ <div class="col-xs-9">
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_kanban_state_block': 1}">
+ Blocked
+ </a>
+ </div>
+ <div class="col-xs-3">
+ <t t-esc="record.todo_request_count_block.value"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div><div class="container o_kanban_card_manage_pane o_invisible">
+ <div class="row">
+ <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view">
+ <div class="o_kanban_card_manage_title">
+ <span>View</span>
+ </div>
+ <div>
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action">
+ All
+ </a>
+ </div>
+ <div>
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_todo': 1}">
+ To Do
+ </a>
+ </div>
+ <div>
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_progress': 1}">
+ In Progress
+ </a>
+ </div>
+ <div>
+ <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_done': 1}">
+ Done
+ </a>
+ </div>
+ </div>
+ <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
+ <div class="o_kanban_card_manage_title">
+ <span>Reports</span>
+ </div>
+ </div>
+ </div>
+ <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
+ <div class="col-xs-8">
+ <ul class="oe_kanban_colorpicker" data-field="color"/>
+ </div>
+ <div class="col-xs-4 text-right">
+ <a type="edit">Settings</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <!-- equipment.team : actions -->
+ <record id="maintenance_team_action_settings" model="ir.actions.act_window">
+ <field name="name">Teams</field>
+ <field name="res_model">maintenance.team</field>
+ <field name="view_mode">tree</field>
+ <field name="view_type">form</field>
+ <field name="view_id" ref="maintenance_team_view_tree"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to add a team in the maintenance request.
+ </p>
+ </field>
+ </record>
+
+ <record id="maintenance_dashboard_action" model="ir.actions.act_window">
+ <field name="name">Maintenance Teams</field>
+ <field name="res_model">maintenance.team</field>
+ <field name="view_mode">kanban,form</field>
+ <field name="view_type">form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to add a stage in the maintenance request.
+ </p>
+ </field>
+ </record>
+
<!-- Menu items hierachy -->
<menuitem
- id="menu_equipment_title"
- name="Equipments"
- web_icon="hr_equipment,static/description/icon.png"
- groups="base.group_hr_user,base.group_equipment_manager"
+ id="menu_maintenance_title"
+ name="Maintenance"
+ web_icon="maintenance,static/description/icon.png"
sequence="110"/>
<menuitem
- id="menu_equipment_configuration"
- name="Configuration"
- parent="menu_equipment_title"
- groups="base.group_hr_manager"
- sequence="100"/>
+ id="menu_m_dashboard"
+ name="Dashboard"
+ parent="menu_maintenance_title"
+ groups="base.group_equipment_manager,base.group_user"
+ action="maintenance_dashboard_action"
+ sequence="0"/>
+
+ <menuitem
+ id="menu_m_request"
+ name="Maintenance"
+ parent="menu_maintenance_title"
+ groups="base.group_equipment_manager,base.group_user"
+ sequence="1"/>
<menuitem
id="menu_m_request_form"
name="Maintenance Requests"
- parent="menu_equipment_title"
+ parent="menu_m_request"
action="hr_equipment_request_action"
- groups="base.group_hr_manager,base.group_hr_user,base.group_user"
+ groups="base.group_equipment_manager,base.group_user"
+ sequence="1"/>
+
+ <menuitem
+ id="menu_m_request_calendar"
+ name="Maintenance Calendar"
+ parent="menu_m_request"
+ action="hr_equipment_request_action_cal"
+ groups="base.group_equipment_manager,base.group_user"
sequence="2"/>
<menuitem
- id="menu_hr_equipment_form"
+ id="menu_equipment_form"
name="Equipments"
- parent="menu_equipment_title"
+ parent="menu_maintenance_title"
action="hr_equipment_action"
- groups="base.group_hr_manager,base.group_hr_user,base.group_user"
+ groups="base.group_equipment_manager,base.group_user"
+ sequence="2"/>
+
+ <menuitem
+ id="menu_m_reports"
+ name="Reporting"
+ parent="menu_maintenance_title"
+ groups="base.group_equipment_manager,base.group_user"
+ sequence="3"/>
+
+ <menuitem
+ id="menu_m_reports_oee"
+ name="Overall Equipment Effectiveness (OEE)"
+ parent="menu_m_reports"
+ groups="base.group_equipment_manager,base.group_user"
sequence="1"/>
<menuitem
- id="menu_equipment_global_settings"
- name="Settings"
- parent="menu_equipment_configuration"
- action="action_hr_equipment_configuration"
- sequence="0"
- groups="base.group_system"/>
+ id="menu_m_reports_losses"
+ name="Losses Analysis"
+ parent="menu_m_reports"
+ groups="base.group_equipment_manager,base.group_user"
+ sequence="2"/>
<menuitem
- id="menu_equipment_cat"
+ id="menu_maintenance_configuration"
+ name="Configuration"
+ parent="menu_maintenance_title"
+ groups="base.group_equipment_manager"
+ sequence="100"/>
+
+ <menuitem
+ id="menu_maintenance_teams"
+ name="Maintenance Teams"
+ parent="menu_maintenance_configuration"
+ action="maintenance_team_action_settings"
+ groups="base.group_equipment_manager"
+ sequence="1"/>
+
+ <menuitem
+ id="menu_maintenance_cat"
name="Equipment Categories"
- parent="menu_equipment_configuration"
+ parent="menu_maintenance_configuration"
action="hr_equipment_category_action"
- groups="base.group_no_one"
- sequence="1"/>
+ sequence="2"/>
<menuitem
- id="menu_equipment_stage_configuration"
- name="Stages"
- parent="menu_equipment_configuration"
+ id="menu_maintenance_stage_configuration"
+ name="Maintenance Stages"
+ parent="menu_maintenance_configuration"
action="hr_equipment_stage_action"
- groups="base.group_no_one"
- sequence="2" />
+ sequence="3" />
</odoo>