[ADD] hr_equipment: track employees' equipment and manage its allocation
This commit is contained in:
committed by
Richard Mathot
parent
76082c9d9d
commit
f63d2d5135
@@ -0,0 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Odoo (formerly OpenERP), Open Source Management Solution
|
||||
# Copyright (C) 2014-Today Odoo S.A (<https://www.odoo.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import models
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
{
|
||||
'name': 'Track Employees Equipment',
|
||||
'version': '1.0',
|
||||
'description': """
|
||||
Track employees' equipment and manage its allocation """,
|
||||
'author': 'Odoo S.A.',
|
||||
'depends': ['hr'],
|
||||
'data': [
|
||||
'security/hr_equipment.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'data/hr_equipment_data.xml',
|
||||
'views/res_config_views.xml',
|
||||
'views/hr_equipment_views.xml',
|
||||
],
|
||||
'demo': ['data/hr_equipment_demo.xml'],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Standard stages for Maintenance Request -->
|
||||
<record id="stage_0" model="hr.equipment.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">
|
||||
<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">
|
||||
<field name="name">Repaired</field>
|
||||
<field name="sequence" eval="3" />
|
||||
<field name="fold" eval="True" />
|
||||
</record>
|
||||
<record id="stage_4" model="hr.equipment.stage">
|
||||
<field name="name">Scrap</field>
|
||||
<field name="sequence" eval="4" />
|
||||
<field name="fold" eval="True" />
|
||||
</record>
|
||||
<record id="stage_5" model="hr.equipment.stage">
|
||||
<field name="name">Cancelled</field>
|
||||
<field name="sequence" eval="10" />
|
||||
<field name="fold" eval="True" />
|
||||
</record>
|
||||
|
||||
<!-- 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_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="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="default" eval="True"/>
|
||||
<field name="description">Status changed</field>
|
||||
</record>
|
||||
|
||||
<!-- 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="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="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="default" eval="True"/>
|
||||
<field name="parent_id" eval="ref('mt_mat_assign')"/>
|
||||
<field name="relation_field">category_id</field>
|
||||
</record>
|
||||
|
||||
<!-- After installation of the module, open the related menu -->
|
||||
<record id="action_client_hr_menu" model="ir.actions.client">
|
||||
<field name="name">Open HR Menu</field>
|
||||
<field name="tag">reload</field>
|
||||
<field name="params" eval="{'menu_id': ref('hr.menu_hr_root')}"/>
|
||||
</record>
|
||||
<record id="base.open_menu" model="ir.actions.todo">
|
||||
<field name="action_id" ref="action_client_hr_menu"/>
|
||||
<field name="state">open</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -0,0 +1,143 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Equipment categories -->
|
||||
<record id="hr_equipment_computer" model="hr.equipment.category">
|
||||
<field name="name">Computers</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
</record>
|
||||
<record id="hr_equipment_monitor" model="hr.equipment.category">
|
||||
<field name="name">Monitors</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="color">3</field>
|
||||
</record>
|
||||
<record id="hr_equipment_software" model="hr.equipment.category">
|
||||
<field name="name">Softwares</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
</record>
|
||||
<record id="hr_equipment_printer" model="hr.equipment.category">
|
||||
<field name="name">Printers</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
</record>
|
||||
<record id="hr_equipment_phone" model="hr.equipment.category">
|
||||
<field name="name">Phones</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
</record>
|
||||
|
||||
<!-- Equipments -->
|
||||
<record id="hr_equipment_monitor1" model="hr.equipment">
|
||||
<field name="name">Samsung Monitor 15"</field>
|
||||
<field name="category_id" ref="hr_equipment_monitor"/>
|
||||
<field name="employee_id" ref="hr.employee_al"/>
|
||||
<field name="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">
|
||||
<field name="name">Samsung Monitor 15"</field>
|
||||
<field name="category_id" ref="hr_equipment_monitor"/>
|
||||
<field name="employee_id" ref="hr.employee_stw"/>
|
||||
<field name="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">
|
||||
<field name="name">Samsung Monitor 15"</field>
|
||||
<field name="category_id" ref="hr_equipment_monitor"/>
|
||||
<field name="employee_id" ref="hr.employee_qdp"/>
|
||||
<field name="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">
|
||||
<field name="name">Acer Laptop</field>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="employee_id" ref="hr.employee_jve"/>
|
||||
<field name="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">
|
||||
<field name="name">Acer Laptop</field>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="employee_id" ref="hr.employee_jgo"/>
|
||||
<field name="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">
|
||||
<field name="name">HP Laptop</field>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="employee_id" ref="hr.employee_vad"/>
|
||||
<field name="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">
|
||||
<field name="name">HP Laptop</field>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="employee_id" ref="hr.employee_jth"/>
|
||||
<field name="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">
|
||||
<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="serial_no">PR/011/2928191889</field>
|
||||
</record>
|
||||
|
||||
<!--Maintenance Request-->
|
||||
|
||||
<record id="m_request_3" model="hr.equipment.request">
|
||||
<field name="name">Resolution is bad</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field name="employee_id" ref="hr.employee_qdp"/>
|
||||
<field name="equipment_id" ref="hr_equipment_monitor6"/>
|
||||
<field name="category_id" ref="hr_equipment_monitor"/>
|
||||
<field name="color">7</field>
|
||||
<field name="stage_id" ref="stage_3"/>
|
||||
</record>
|
||||
<record id="m_request_4" model="hr.equipment.request">
|
||||
<field name="name">Some keys are not working</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="employee_id" ref="hr.employee_qdp"/>
|
||||
<field name="equipment_id" ref="hr_equipment_computer3"/>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="stage_id" ref="stage_0"/>
|
||||
</record>
|
||||
<record id="m_request_6" model="hr.equipment.request">
|
||||
<field name="name">Motherboard failed</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field name="employee_id" ref="hr.employee_jgo"/>
|
||||
<field name="equipment_id" ref="hr_equipment_computer5"/>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="stage_id" ref="stage_4"/>
|
||||
</record>
|
||||
<record id="m_request_7" model="hr.equipment.request">
|
||||
<field name="name">Battery drains fast</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field name="employee_id" ref="hr.employee_vad"/>
|
||||
<field name="equipment_id" ref="hr_equipment_computer9"/>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="stage_id" ref="stage_1"/>
|
||||
</record>
|
||||
<record id="m_request_8" model="hr.equipment.request">
|
||||
<field name="name">Touchpad not working</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field name="employee_id" ref="hr.employee_jth"/>
|
||||
<field name="equipment_id" ref="hr_equipment_computer11"/>
|
||||
<field name="category_id" ref="hr_equipment_computer"/>
|
||||
<field name="stage_id" ref="stage_1"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -0,0 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import hr_equipment
|
||||
import res_config
|
||||
@@ -0,0 +1,350 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from openerp import api, fields, models, fields
|
||||
from openerp import _, tools
|
||||
from openerp.exceptions import UserError
|
||||
|
||||
|
||||
class HrEquipmentStage(models.Model):
|
||||
""" Model for case stages. This models the main stages of a Maintenance Request management flow. """
|
||||
|
||||
_name = 'hr.equipment.stage'
|
||||
_description = 'Equipment Stage'
|
||||
_order = 'sequence, id'
|
||||
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
sequence = fields.Integer('Sequence', default=20)
|
||||
fold = fields.Boolean('Folded in Kanban View')
|
||||
|
||||
|
||||
class HrEquipmentCategory(models.Model):
|
||||
_name = 'hr.equipment.category'
|
||||
_inherits = {"mail.alias": "alias_id"}
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Equipment Category'
|
||||
|
||||
@api.one
|
||||
@api.depends('equipment_ids')
|
||||
def _compute_fold(self):
|
||||
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)
|
||||
color = fields.Integer('Color Index')
|
||||
note = fields.Text('Comments', translate=True)
|
||||
equipment_ids = fields.One2many('hr.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, domain=[('stage_id.fold', '=', False)])
|
||||
maintenance_count = fields.Integer(string="Maintenance", compute='_compute_maintenance_count')
|
||||
alias_id = fields.Many2one(
|
||||
'mail.alias', 'Alias', ondelete='cascade', required=True,
|
||||
help="Email alias for this equipment category. New emails will automatically "
|
||||
"create new maintenance request for this equipment category.")
|
||||
fold = fields.Boolean(string='Folded in Kanban View', compute='_compute_fold', store=True)
|
||||
|
||||
@api.multi
|
||||
def _compute_equipment_count(self):
|
||||
equipment_data = self.env['hr.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'])
|
||||
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)
|
||||
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):
|
||||
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()
|
||||
return res
|
||||
|
||||
|
||||
class HrEquipment(models.Model):
|
||||
_name = 'hr.equipment'
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Equipment'
|
||||
|
||||
@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 'hr_equipment.mt_mat_assign'
|
||||
return super(HrEquipment, self)._track_subtype(init_values)
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
result = []
|
||||
for record in self:
|
||||
if record.name and record.serial_no:
|
||||
result.append((record.id, record.name + '/' + record.serial_no))
|
||||
if record.name and not record.serial_no:
|
||||
result.append((record.id, record.name))
|
||||
return result
|
||||
|
||||
@api.model
|
||||
def name_search(self, name, args=None, operator='ilike', limit=100):
|
||||
args = args or []
|
||||
recs = self.browse()
|
||||
if name:
|
||||
recs = self.search([('name', '=', name)] + args, limit=limit)
|
||||
if not recs:
|
||||
recs = self.search([('name', operator, name)] + args, limit=limit)
|
||||
return recs.name_get()
|
||||
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
user_id = fields.Many2one('res.users', string='Technician', track_visibility='onchange')
|
||||
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')
|
||||
category_id = fields.Many2one('hr.equipment.category', string='Equipment Category', track_visibility='onchange')
|
||||
partner_id = fields.Many2one('res.partner', string='Supplier', domain="[('supplier', '=', 1)]")
|
||||
model = fields.Char('Model')
|
||||
serial_no = fields.Char('Serial Number', copy=False)
|
||||
assign_date = fields.Date('Assigned Date', track_visibility='onchange')
|
||||
cost = fields.Float('Cost')
|
||||
note = fields.Text('Note')
|
||||
color = fields.Integer('Color Index')
|
||||
scrap_date = fields.Date('Scrap Date')
|
||||
equipment_assign_to = fields.Selection(
|
||||
[('department', 'By Department'), ('employee', 'By Employee')],
|
||||
string='Allocate To',
|
||||
help='By Employee: equipment assigned to individual Employee, By Department: equipment assigned to group of employees in department',
|
||||
required=True,
|
||||
default='employee')
|
||||
maintenance_ids = fields.One2many('hr.equipment.request', 'equipment_id', domain=[('stage_id.fold', '=', False)])
|
||||
maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Maintenance")
|
||||
|
||||
@api.one
|
||||
@api.depends('maintenance_ids')
|
||||
def _compute_maintenance_count(self):
|
||||
self.maintenance_count = len(self.maintenance_ids)
|
||||
|
||||
@api.onchange('equipment_assign_to')
|
||||
def _onchange_equipment_assign_to(self):
|
||||
if self.equipment_assign_to == 'employee':
|
||||
self.department_id = False
|
||||
if self.equipment_assign_to == 'department':
|
||||
self.employee_id = False
|
||||
self.assign_date = fields.Date.context_today(self)
|
||||
|
||||
@api.onchange('category_id')
|
||||
def _onchange_category_id(self):
|
||||
self.user_id = self.category_id.user_id
|
||||
|
||||
_sql_constraints = [
|
||||
('serial_no', 'unique(serial_no)', "The serial number of this equipment must be unique !"),
|
||||
]
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
equipment = super(HrEquipment, 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:
|
||||
user_ids.append(equipment.employee_id.user_id.id)
|
||||
if equipment.department_id and equipment.department_id.manager_id and equipment.department_id.manager_id.user_id:
|
||||
user_ids.append(equipment.department_id.manager_id.user_id.id)
|
||||
if user_ids:
|
||||
equipment.message_subscribe_users(user_ids=user_ids)
|
||||
return equipment
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
user_ids = []
|
||||
# subscribe employee or department manager when equipment assign to employee or department.
|
||||
if vals.get('employee_id'):
|
||||
user_id = self.env['hr.employee'].browse(vals['employee_id'])['user_id']
|
||||
if user_id:
|
||||
user_ids.append(user_id.id)
|
||||
if vals.get('department_id'):
|
||||
department = self.env['hr.department'].browse(vals['department_id'])
|
||||
if department and department.manager_id and department.manager_id.user_id:
|
||||
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)
|
||||
|
||||
@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']
|
||||
order = category_obj._order
|
||||
access_rights_uid = access_rights_uid or self._uid
|
||||
if read_group_order == 'category_id desc':
|
||||
order = '%s desc' % order
|
||||
|
||||
category_ids = category_obj._search([], order=order, access_rights_uid=access_rights_uid)
|
||||
result = [category.name_get()[0] for category in category_obj.browse(category_ids)]
|
||||
# restore order of the search
|
||||
result.sort(lambda x, y: cmp(category_ids.index(x[0]), category_ids.index(y[0])))
|
||||
|
||||
fold = {}
|
||||
for category in category_obj.browse(category_ids):
|
||||
fold[category.id] = category.fold
|
||||
return result, fold
|
||||
|
||||
_group_by_full = {
|
||||
'category_id': _read_group_category_ids
|
||||
}
|
||||
|
||||
|
||||
class HrEquipmentRequest(models.Model):
|
||||
_name = 'hr.equipment.request'
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Equipment Request'
|
||||
|
||||
@api.returns('self')
|
||||
def _default_employee_get(self):
|
||||
return self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
|
||||
|
||||
@api.returns('self')
|
||||
def _default_stage(self):
|
||||
return self.env['hr.equipment.stage'].search([], limit=1)
|
||||
|
||||
@api.multi
|
||||
def _track_subtype(self, init_values):
|
||||
self.ensure_one()
|
||||
if 'stage_id' in init_values and self.stage_id.sequence <= 1:
|
||||
return 'hr_equipment.mt_req_created'
|
||||
elif 'stage_id' in init_values and self.stage_id.sequence > 1:
|
||||
return 'hr_equipment.mt_req_status'
|
||||
return super(HrEquipmentRequest, self)._track_subtype(init_values)
|
||||
|
||||
name = fields.Char('Subjects', required=True)
|
||||
description = fields.Text('Description')
|
||||
request_date = fields.Date('Request Date', track_visibility='onchange', default=fields.Date.context_today)
|
||||
employee_id = fields.Many2one('hr.employee', string='Employee', default=_default_employee_get)
|
||||
department_id = fields.Many2one('hr.department', string='Department')
|
||||
category_id = fields.Many2one('hr.equipment.category', string='Category')
|
||||
equipment_id = fields.Many2one('hr.equipment', string='Equipment', 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)
|
||||
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')
|
||||
|
||||
@api.onchange('employee_id', 'department_id')
|
||||
def onchange_department_or_employee_id(self):
|
||||
domain = []
|
||||
if self.department_id:
|
||||
domain = [('department_id', '=', self.department_id.id)]
|
||||
if self.employee_id and self.department_id:
|
||||
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)
|
||||
if len(equipment) == 1:
|
||||
self.equipment_id = equipment
|
||||
return {'domain': {'equipment_id': domain}}
|
||||
|
||||
@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
|
||||
|
||||
@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
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
# context: no_log, because subtype already handle this
|
||||
self = self.with_context(mail_create_nolog=True)
|
||||
result = super(HrEquipmentRequest, 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 and 'kanban_state' not in vals and 'stage_id' in vals:
|
||||
new_stage = vals.get('stage_id')
|
||||
vals_reset_kstate = dict(vals, kanban_state='normal')
|
||||
for equipment_request in self:
|
||||
write_vals = vals_reset_kstate if equipment_request.stage_id.id != new_stage else vals
|
||||
equipment_request.write(write_vals)
|
||||
if vals.get('employee_id'):
|
||||
user = False
|
||||
employee = self.env['hr.employee'].browse(vals['employee_id'])
|
||||
if employee:
|
||||
user = employee.user
|
||||
if user:
|
||||
self.message_subscribe_users(user_ids=[user.id])
|
||||
return super(HrEquipmentRequest, self).write(vals)
|
||||
|
||||
@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']
|
||||
order = stage_obj._order
|
||||
access_rights_uid = access_rights_uid or self._uid
|
||||
|
||||
if read_group_order == 'stage_id desc':
|
||||
order = '%s desc' % order
|
||||
|
||||
stage_ids = stage_obj._search([], order=order, access_rights_uid=access_rights_uid)
|
||||
result = [stage.name_get()[0] for stage in stage_obj.browse(stage_ids)]
|
||||
|
||||
# restore order of the search
|
||||
result.sort(lambda x, y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
|
||||
|
||||
fold = {}
|
||||
for stage in stage_obj.browse(stage_ids):
|
||||
fold[stage.id] = stage.fold or False
|
||||
return result, fold
|
||||
|
||||
_group_by_full = {
|
||||
'stage_id': _read_group_stage_ids
|
||||
}
|
||||
|
||||
@api.model
|
||||
def get_empty_list_help(self, help):
|
||||
res = super(HrEquipmentRequest, self).get_empty_list_help(help)
|
||||
alias_record = self.env.ref('hr_equipment.mail_alias_equipment')
|
||||
check_alias_manage = self.env['ir.values'].get_default('hr.config.settings', 'alias_manage')
|
||||
if alias_record and alias_record.alias_domain and alias_record.alias_name and res and check_alias_manage:
|
||||
return _("""<p class="oe_view_nocontent_create">
|
||||
Click to add a new maintenance request or send an email to: <a>%(alias_name)s</a>
|
||||
</p>
|
||||
<p>
|
||||
Follow the process of the request and communicate with the collaborator.
|
||||
</p>"""
|
||||
) % {'alias_name': alias_record.alias_name + '@' + alias_record.alias_domain}
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def message_new(self, msg, custom_values=None):
|
||||
""" Overrides mail_thread message_new that is called by the mailgateway
|
||||
through message_process.
|
||||
This override updates the document according to the email.
|
||||
"""
|
||||
if custom_values is None:
|
||||
custom_values = {}
|
||||
email = tools.email_split(msg.get('from')) and tools.email_split(msg.get('from'))[0] or False
|
||||
user = self.env['res.users'].search([('login', '=', email)], limit=1)
|
||||
if user:
|
||||
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)
|
||||
@@ -0,0 +1,47 @@
|
||||
# -*- 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'
|
||||
|
||||
alias_manage = fields.Boolean('Alias Manage')
|
||||
equipment_alias_prefix = fields.Char('Use the following alias to report internal equipment issue')
|
||||
alias_domain = fields.Char("Alias Domain")
|
||||
|
||||
@api.multi
|
||||
def get_default_alias_equipment(self):
|
||||
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.multi
|
||||
def get_default_alias_domain(self):
|
||||
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}
|
||||
|
||||
@api.multi
|
||||
def set_default_alias_manage(self):
|
||||
config_value = self.alias_manage
|
||||
self.env['ir.values'].set_default('hr.config.settings', 'alias_manage', config_value)
|
||||
@@ -0,0 +1,48 @@
|
||||
<?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) -->
|
||||
<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"/>
|
||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||
<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">Employee is allowed to see its 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>
|
||||
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_equipment_rule_user" model="ir.rule">
|
||||
<field name="name">Employee is allowed to see its own equipments</field>
|
||||
<field name="model_id" ref="model_hr_equipment"/>
|
||||
<field name="domain_force">[('employee_id.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">
|
||||
<field name="name">Administrator of maintenance requests</field>
|
||||
<field name="model_id" ref="model_hr_equipment_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">
|
||||
<field name="name">Equipments administrator</field>
|
||||
<field name="model_id" ref="model_hr_equipment"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_equipment_manager'))]"/>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,10 @@
|
||||
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
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import test_hr_equipment
|
||||
@@ -0,0 +1,75 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from openerp.tests.common import TransactionCase
|
||||
import time
|
||||
|
||||
|
||||
class TestHrEquipment(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']
|
||||
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')
|
||||
|
||||
self.hr_user = self.user.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])]
|
||||
))
|
||||
|
||||
self.hr_manager = self.user.create(dict(
|
||||
name="HR Manager",
|
||||
company_id=self.main_company.id,
|
||||
login="hm",
|
||||
password="hm",
|
||||
email="hrmanager@yourcompany.example.com",
|
||||
groups_id=[(6, 0, [res_hr_manager.id])]
|
||||
))
|
||||
|
||||
def test_hr_equipment_request_category(self):
|
||||
|
||||
# Create a new equipment
|
||||
equipment_01 = self.equipment.sudo(self.hr_manager).create({
|
||||
'name': 'Samsung Monitor "15',
|
||||
'category_id': self.ref('hr_equipment.hr_equipment_monitor'),
|
||||
'employee_id': self.ref('hr.employee_al'),
|
||||
'user_id': self.ref('base.user_root'),
|
||||
'assign_date': time.strftime('%Y-%m-%d'),
|
||||
'serial_no': 'MT/127/18291015',
|
||||
'model': 'NP355E5X',
|
||||
'color': 3,
|
||||
})
|
||||
|
||||
# Check that equipment is created or not
|
||||
assert equipment_01, "Equipment not created"
|
||||
|
||||
# Create new maintenance request
|
||||
maintenance_request_01 = self.maintenance_request.sudo(self.hr_user).create({
|
||||
'name': 'Resolution is bad',
|
||||
'user_id': self.hr_user.id,
|
||||
'employee_id': self.ref('hr.employee_qdp'),
|
||||
'equipment_id': equipment_01.id,
|
||||
'category_id': self.ref('hr_equipment.hr_equipment_monitor'),
|
||||
'color': 7,
|
||||
'stage_id': self.ref('hr_equipment.stage_0')
|
||||
})
|
||||
|
||||
# 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'))
|
||||
|
||||
# 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')})
|
||||
|
||||
# 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'))
|
||||
@@ -0,0 +1,566 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- hr.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="arch" type="xml">
|
||||
<search string="maintenance Request Search">
|
||||
<field name="name"/>
|
||||
<field name="category_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="equipment_id"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="stage_id"/>
|
||||
<separator/>
|
||||
<filter string="My Requests" icon="terp-accessories-archiver" domain="['|', ('employee_id.user_id', '=', uid), ('department_id.manager_id.user_id', '=', uid)]"/>
|
||||
<separator/>
|
||||
<filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
|
||||
<group expand='0' string='Group by...'>
|
||||
<filter string='Users' icon="terp-personal" domain="[]" context="{'group_by': 'user_id'}"/>
|
||||
<filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'category_id'}"/>
|
||||
<filter string='Stages' icon="terp-mrp" domain="[]" context="{'group_by' : 'stage_id'}"/>
|
||||
<filter string='Employee' icon="terp-personal" domain="[]" context="{'group_by': 'employee_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<form string="Maintenance Request">
|
||||
<header>
|
||||
<field name="stage_id" widget="statusbar" clickable="true" readonly="1"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<div class="oe_right">
|
||||
<field name="kanban_state" class="oe_inline" widget="kanban_state_selection"/>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only" string="Subject"/>
|
||||
<h1>
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="employee_id" string="Sender"/>
|
||||
<field name="equipment_id" context="{'default_category_id':category_id}"/>
|
||||
<field name="category_id" groups="base.group_hr_manager"/>
|
||||
<field name="request_date" groups="base.group_no_one"/>
|
||||
<field name="close_date" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_id" string="Repair Responsible"/>
|
||||
<field name="priority" widget="priority"/>
|
||||
</group>
|
||||
</group>
|
||||
<field name='description' placeholder="Internal Note ......."/>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<kanban default_group_by="stage_id">
|
||||
<field name="stage_id"/>
|
||||
<field name="color"/>
|
||||
<field name="priority"/>
|
||||
<field name="user_id"/>
|
||||
<field name="category_id"/>
|
||||
<field name="kanban_state"/>
|
||||
<field name="message_summary"/>
|
||||
<templates>
|
||||
<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>
|
||||
</ul>
|
||||
</t>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_semantic_html_override">
|
||||
<div class="oe_dropdown_toggle oe_dropdown_kanban">
|
||||
<i class="fa fa-bars fa-lg" />
|
||||
<ul class="oe_dropdown_menu">
|
||||
<t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t>
|
||||
<t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
|
||||
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="oe_kanban_content" tooltip="kanban-tooltip">
|
||||
<div>
|
||||
<b><field name="name"/></b> <br/>
|
||||
<span t-if="record.employee_id.raw_value"><field name="employee_id"/><br/></span>
|
||||
<span t-if="record.department_id.raw_value"><field name="department_id"/><br/></span>
|
||||
<span class="oe_grey" t-if="record.equipment_id.raw_value"><field name="equipment_id"/><br/></span>
|
||||
</div>
|
||||
<div class="oe_kanban_footer_left" style="margin-top:2px;">
|
||||
<t t-raw="record.message_summary.raw_value"/>
|
||||
<span t-if="record.category_id.raw_value"><field name="category_id"/></span>
|
||||
</div>
|
||||
<div class="oe_kanban_bottom_right">
|
||||
<img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
|
||||
<div class="pull-left" groups="base.group_user">
|
||||
<field name="kanban_state" widget="kanban_state_selection"/>
|
||||
<field name="priority" widget="priority"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_clear"></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<tree string="maintenance Request" fonts="bold:message_unread==True">
|
||||
<field name="message_unread" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="request_date" groups="base.group_no_one"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="category_id" groups="base.group_hr_manager"/>
|
||||
<field name="stage_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="view_id" ref="hr_equipment_request_view_kanban"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new maintenance request.
|
||||
</p><p>
|
||||
Follow the process of the request and communicate with the collaborator.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<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="search_view_id" ref="hr_equipment_request_view_search"/>
|
||||
<field name="view_id" ref="hr_equipment_request_view_kanban"/>
|
||||
<field name="context">{
|
||||
'search_default_category_id': [active_id],
|
||||
'default_category_id': active_id,
|
||||
}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new maintenance request.
|
||||
</p><p>
|
||||
Follow the process of the request and communicate with the collaborator.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<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="context">{
|
||||
'default_equipment_id': active_id,
|
||||
}</field>
|
||||
<field name="domain">[('equipment_id', '=', active_id)]</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="arch" type="xml">
|
||||
<form string="Equipments">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only" string="Name"/>
|
||||
<h1><field name="name" string="Name"/></h1>
|
||||
<label for="serial_no" class="oe_edit_only"/>
|
||||
<field name="serial_no"/>
|
||||
</div>
|
||||
<div class="oe_right oe_button_box" name="buttons">
|
||||
<button name="%(hr_equipment_request_action_from_equipment)d"
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-ticket">
|
||||
<field string="Maintenance" name="maintenance_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="category_id" groups="base.group_equipment_manager" on_change="1" options="{"no_open": True}"/>
|
||||
<field name="equipment_assign_to" on_change="1" widget="radio"/>
|
||||
<field name="employee_id" string="Employee" attrs="{'invisible': ['|', ('equipment_assign_to', '=', 'department'), ('equipment_assign_to', '=', False)]}"/>
|
||||
<field name="department_id" string="Department" attrs="{'invisible': ['|', ('equipment_assign_to', '=', 'employee'), ('equipment_assign_to', '=', False)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
<field name="assign_date" groups="base.group_no_one"/>
|
||||
<field name="scrap_date" groups="base.group_no_one"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Description">
|
||||
<field name="note"/>
|
||||
</page>
|
||||
<page string="Product Information">
|
||||
<group col="4">
|
||||
<field name="partner_id"/>
|
||||
<field name="cost" groups="base.group_hr_user"/>
|
||||
<field name="model"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<kanban default_group_by="category_id">
|
||||
<field name="name"/>
|
||||
<field name="color"/>
|
||||
<field name="user_id"/>
|
||||
<field name="category_id"/>
|
||||
<field name="serial_no"/>
|
||||
<field name="model"/>
|
||||
<field name="message_summary"/>
|
||||
<field name="maintenance_ids"/>
|
||||
<templates>
|
||||
<t t-name="kanban-tooltip">
|
||||
<ul class="oe_kanban_tooltip">
|
||||
<li><b>Serial Number:</b> <field name="serial_no"/></li>
|
||||
<li><b>Model Number:</b> <field name="model"/></li>
|
||||
</ul>
|
||||
</t>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
|
||||
<div class="oe_dropdown_toggle oe_dropdown_kanban">
|
||||
<i class="fa fa-bars fa-lg" />
|
||||
<ul class="oe_dropdown_menu">
|
||||
<t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t>
|
||||
<t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
|
||||
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="oe_kanban_content" tooltip="kanban-tooltip">
|
||||
<div><b><field name="name"/><span t-if="record.category_id.raw_value">(<field name="category_id"/>)</span></b></div>
|
||||
<div>
|
||||
<span t-if="record.employee_id.raw_value"><field name="employee_id"/><br/></span>
|
||||
<span t-if="record.department_id.raw_value"><field name="department_id"/><br/></span>
|
||||
<a t-if="record.maintenance_ids.raw_value" type="action" name="%(hr_equipment_request_action_from_equipment)d" style="margin-right: 5px">
|
||||
<t t-raw="record.maintenance_ids.raw_value.length"/> Maintenance Request
|
||||
</a>
|
||||
<div class="oe_kanban_footer_left" style="margin-top:2px;">
|
||||
<span t-if="record.serial_no.raw_value"><field name="serial_no"/><br/></span>
|
||||
<span t-if="!record.employee_id.raw_value and !record.department_id.raw_value">Unassigned<br/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_kanban_bottom_right">
|
||||
<img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="27" height="27" class="oe_kanban_avatar"/>
|
||||
</div>
|
||||
<div class="oe_kanban_footer_left" style="margin-top:5px;">
|
||||
<t t-raw="record.message_summary.raw_value"/>
|
||||
<span t-if="record.model.raw_value"><field name="model"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_clear"></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<tree string="Assign To Employee" fonts="bold:message_unread==True">
|
||||
<field name="message_unread" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="employee_id" string="Employee"/>
|
||||
<field name="department_id" string="Department"/>
|
||||
<field name="assign_date" groups="base.group_no_one"/>
|
||||
<field name="serial_no"/>
|
||||
<field name="user_id"/>
|
||||
<field name="category_id"/>
|
||||
<field name="partner_id" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<search string="Search">
|
||||
<field name="name"/>
|
||||
<field name="serial_no"/>
|
||||
<field name="category_id"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="department_id"/>
|
||||
<field name="model"/>
|
||||
<filter string="New" help="Unassigned" icon="terp-accessories-archiver" domain="[('employee_id', '=', False), ('department_id', '=', False)]"/>
|
||||
<filter string="To Do" help="Under Maintenance" icon="terp-accessories-archiver" domain="[('maintenance_ids', '!=', False), ('maintenance_ids.stage_id.fold', '=', False)]"/>
|
||||
<filter string="Assigned" icon="terp-accessories-archiver" domain="['|', ('employee_id', '!=', False), ('department_id', '!=', False)]"/>
|
||||
<separator/>
|
||||
<filter string="My Equipments" icon="terp-accessories-archiver" domain="['|', ('employee_id.user_id', '=', uid), ('department_id.manager_id.user_id', '=', uid)]"/>
|
||||
<separator/>
|
||||
<filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
|
||||
<group expand='0' string='Group by...'>
|
||||
<filter string='Users' icon="terp-personal" domain="[]" context="{'group_by': 'user_id'}"/>
|
||||
<filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by': 'category_id'}"/>
|
||||
<filter string='Assigned to' help="Assigned to Employees and Departments" icon="terp-personal" domain="[]" context="{'group_by': 'equipment_assign_to'}"/>
|
||||
<filter string='Department' help="Assigned to Departments" icon="terp-personal" domain="[]" context="{'group_by': 'department_id'}"/>
|
||||
<filter string='Employee' help="Assigned to Employees" icon="terp-personal" domain="[]" context="{'group_by': 'employee_id'}"/>
|
||||
<filter string='Supplier' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by': 'partner_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_equipment_action" model="ir.actions.act_window">
|
||||
<field name="name">Equipments</field>
|
||||
<field name="res_model">hr.equipment</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="view_id" ref="hr_equipment_view_kanban"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new equipment.
|
||||
</p><p>
|
||||
This application helps you to track all equipment allocated to employees.
|
||||
Create some laptop, printer or phone and link each equipment to an employee or departement.
|
||||
You will manage allocations, issues and maintenance of equipment.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="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"/>
|
||||
<field name="context">{
|
||||
'search_default_category_id': [active_id],
|
||||
'default_category_id': active_id,
|
||||
}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Engine.
|
||||
</p><p>
|
||||
This application helps you to track all equipment allocated to employees.
|
||||
Create some laptop, printer or phone and link each equipment to an employee or departement.
|
||||
You will manage allocations, issues and mainteannce of equipment.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="arch" type="xml">
|
||||
<form string="Equipment Categories">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only" string="Category Name"/>
|
||||
<h1>
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="oe_right oe_button_box" name="buttons">
|
||||
<button name="%(hr_equipment_action_from_category_form)d"
|
||||
class="oe_stat_button"
|
||||
icon="fa-laptop"
|
||||
type="action">
|
||||
<field string="Equipment" name="equipment_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="%(hr_equipment_request_action_link)d"
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-ticket">
|
||||
<field string="Maintenance" name="maintenance_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<group>
|
||||
<group col="4">
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<group name="group_alias" attrs="{'invisible': [('alias_domain', '=', False)]}" groups="base.group_no_one">
|
||||
<label for="alias_name" string="Email Alias"/>
|
||||
<div name="alias_def">
|
||||
<field name="alias_id" class="oe_read_only oe_inline" string="Email Alias" required="0"/>
|
||||
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
|
||||
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<field name="note" nolabel="1"/>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<tree string="Assign To Employee">
|
||||
<field name="name" string="Name"/>
|
||||
<field name="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="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' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'user_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="hr_equipment_category_view_tree"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new equipment category.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="arch" type="xml">
|
||||
<search string="Maintenance Request Stages">
|
||||
<field name="name" string="Maintenance Request Stages"/>
|
||||
</search>
|
||||
</field>
|
||||
</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="arch" type="xml">
|
||||
<tree string="Maintenance Request Stage" editable="top">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="fold"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- hr.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="view_mode">tree</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="hr_equipment_stage_view_tree"/>
|
||||
<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"
|
||||
sequence="5"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_equipment_configuration"
|
||||
name="Equipments"
|
||||
parent="base.menu_config"
|
||||
groups="base.group_hr_manager"
|
||||
sequence="41"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_m_request_form"
|
||||
name="Maintenance Requests"
|
||||
parent="menu_equipment_title"
|
||||
action="hr_equipment_request_action"
|
||||
groups="base.group_hr_manager,base.group_hr_user,base.group_user"
|
||||
sequence="1"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_hr_equipment_form"
|
||||
name="Equipments"
|
||||
parent="menu_equipment_title"
|
||||
action="hr_equipment_action"
|
||||
groups="base.group_hr_manager,base.group_hr_user,base.group_user"
|
||||
sequence="2"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_equipment_global_settings"
|
||||
name="Settings"
|
||||
parent="menu_equipment_configuration"
|
||||
action="action_hr_equipment_configuration"
|
||||
sequence="0"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_equipment_cat"
|
||||
name="Equipment Categories"
|
||||
parent="menu_equipment_configuration"
|
||||
action="hr_equipment_category_action"
|
||||
groups="base.group_no_one"
|
||||
sequence="1"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_equipment_stage_configuration"
|
||||
name="Stages"
|
||||
parent="menu_equipment_configuration"
|
||||
action="hr_equipment_stage_action"
|
||||
groups="base.group_no_one"
|
||||
sequence="2" />
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,36 @@
|
||||
<?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"/>
|
||||
or
|
||||
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
|
||||
</header>
|
||||
<separator string="Track Equipments"/>
|
||||
<group name="hr_equipment_grp">
|
||||
<label for="id" string="Requests Alias"/>
|
||||
<div>
|
||||
<field name="alias_manage" class="oe_inline"/>
|
||||
<label for="equipment_alias_prefix" class="oe_inline"/>
|
||||
<div attrs="{'invisible': [('alias_manage', '=', False)]}">
|
||||
<field name="equipment_alias_prefix" class="oe_inline" attrs="{'required': [('alias_manage', '=', True)]}"/>@
|
||||
<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>
|
||||
Reference in New Issue
Block a user