diff options
| author | Josse Colpart <jco@odoo.com> | 2015-11-12 09:44:58 +0100 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2016-07-04 16:22:37 +0200 |
| commit | 9a20c6556f4d52cccd0a0ba4a36a2e51c239d7f4 (patch) | |
| tree | 2c71ad623ce14b4c56658d75dc43881da50a58a0 /addons | |
| parent | e7ef6e069c7eaba82cc62170b6c7ca05007512b7 (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')
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="{"no_open": True}"/> - <label for="serial_no" class="oe_edit_only"/> - <field name="serial_no"/> </div> <group> <group> + <field name="category_id" options="{"no_open": 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> |
