Files
odoo_source/addons/hr_fleet/models/employee.py
T
Philippe Wauthy d5472861ef [IMP] hr(_fleet): add private car plate
Not all employees have a company car. This commit adds a private license plate field on hr.employee.
The field allows the HR Officer and HR Administrator to search for emloyees based on their license plates.
If fleet and hr apps are installed, the search is based on both the company car and private car license plates.

task-2936873

closes odoo/odoo#101146

Related: odoo/enterprise#31796
Signed-off-by: Kevin Baptiste <kba@odoo.com>
2022-09-26 16:55:11 +02:00

82 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class Employee(models.Model):
_inherit = 'hr.employee'
employee_cars_count = fields.Integer(compute="_compute_employee_cars_count", string="Cars", groups="fleet.fleet_group_manager")
car_ids = fields.One2many(
'fleet.vehicle', 'driver_employee_id', string='Vehicles (private)',
groups="fleet.fleet_group_manager,hr.group_hr_user",
)
license_plate = fields.Char(compute="_compute_license_plate", search="_search_license_plate")
mobility_card = fields.Char(groups="fleet.fleet_group_user")
def action_open_employee_cars(self):
self.ensure_one()
return {
"type": "ir.actions.act_window",
"res_model": "fleet.vehicle.assignation.log",
"views": [[self.env.ref("hr_fleet.fleet_vehicle_assignation_log_employee_view_list").id, "tree"], [False, "form"]],
"domain": [("driver_employee_id", "in", self.ids)],
"context": dict(self._context, default_driver_id=self.user_id.partner_id.id, default_driver_employee_id=self.id),
"name": "History Employee Cars",
}
@api.depends('private_car_plate', 'car_ids.license_plate')
def _compute_license_plate(self):
for employee in self:
if employee.private_car_plate and employee.car_ids.license_plate:
employee.license_plate = ' '.join([employee.car_ids.license_plate, employee.private_car_plate])
else:
employee.license_plate = employee.car_ids.license_plate or employee.private_car_plate
def _search_license_plate(self, operator, value):
employees = self.env['hr.employee'].search(['|', ('car_ids.license_plate', operator, value), ('private_car_plate', operator, value)])
return [('id', 'in', employees.ids)]
def _compute_employee_cars_count(self):
rg = self.env['fleet.vehicle.assignation.log']._read_group([
('driver_employee_id', 'in', self.ids),
], ['driver_employee_id'], ['driver_employee_id'])
cars_count = {r['driver_employee_id'][0]: r['driver_employee_id_count'] for r in rg}
for employee in self:
employee.employee_cars_count = cars_count.get(employee.id, 0)
@api.constrains('address_home_id')
def _check_address_home_id(self):
no_address = self.filtered(lambda r: not r.address_home_id)
car_ids = self.env['fleet.vehicle'].sudo().search([
('driver_employee_id', 'in', no_address.ids),
])
# Prevent from removing employee address when linked to a car
if car_ids:
raise ValidationError(_('Cannot remove address from employees with linked cars.'))
def write(self, vals):
res = super().write(vals)
#Update car partner when it is changed on the employee
if 'address_home_id' in vals:
car_ids = self.env['fleet.vehicle'].sudo().search([
('driver_employee_id', 'in', self.ids),
('driver_id', 'in', self.mapped('address_home_id').ids),
])
if car_ids:
car_ids.write({'driver_id': vals['address_home_id']})
if 'mobility_card' in vals:
#NOTE: keeping it as a search on driver_id but we might be able to use driver_employee_id in the future
vehicles = self.env['fleet.vehicle'].search([('driver_id', 'in', (self.user_id.partner_id | self.sudo().address_home_id).ids)])
vehicles._compute_mobility_card()
return res
class EmployeePublic(models.Model):
_inherit = 'hr.employee.public'
mobility_card = fields.Char(readonly=True)