[ADD] hr_equipment: track employees' equipment and manage its allocation

This commit is contained in:
Jitendra Prajapati
2015-05-06 08:32:14 +02:00
committed by Richard Mathot
parent 76082c9d9d
commit f63d2d5135
14 changed files with 1411 additions and 0 deletions
+22
View File
@@ -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
+20
View File
@@ -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>
+4
View File
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
import hr_equipment
import res_config
+350
View File
@@ -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)
+47
View File
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_hr_equipment_user hr.equipment.user model_hr_equipment base.group_hr_user 1 1 1 1
3 access_hr_equipment_emp hr.equipment.emp model_hr_equipment base.group_user 1 0 0 0
4 access_hr_equipment_admin_user hr.equipment.admin.user model_hr_equipment base.group_equipment_manager 1 1 1 1
5 access_hr_maintenance_user hr.equipment.request user model_hr_equipment_request base.group_hr_user 1 1 1 1
6 access_hr_maintenance_system_user hr.equipment.request system user model_hr_equipment_request base.group_user 1 1 1 1
7 access_hr_equipment_category_user hr.equipment.category.user model_hr_equipment_category base.group_hr_user 1 1 1 1
8 access_maintenance_request_stage_user hr.equipment.stage.user model_hr_equipment_stage base.group_hr_user 1 1 1 1
9 access_hr_equipment_category_employee hr.equipment.category.employee model_hr_equipment_category base.group_user 1 0 0 0
10 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

+3
View File
@@ -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="{&quot;no_open&quot;: 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>