[IMP] (hr_)fleet: improve Claim Car Report
The "Claim Car Report" action was not working as expected. Now the statbutton "Cars" will show the car history of a specific driver. closes odoo/odoo#76550 Related: odoo/upgrade#2882 Taskid: 2646113 Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
@@ -13,3 +13,13 @@ class FleetVehicleAssignationLog(models.Model):
|
||||
driver_id = fields.Many2one('res.partner', string="Driver", required=True)
|
||||
date_start = fields.Date(string="Start Date")
|
||||
date_end = fields.Date(string="End Date")
|
||||
|
||||
def action_open_vehicle(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'fleet.vehicle',
|
||||
'res_id': self.vehicle_id.id,
|
||||
'view_mode': 'form',
|
||||
'context': dict(self.env.context, create=False),
|
||||
}
|
||||
|
||||
@@ -532,10 +532,11 @@
|
||||
<field name="model">fleet.vehicle.assignation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Assignment Logs" editable="bottom">
|
||||
<field name="vehicle_id" invisible="1"/>
|
||||
<field name="driver_id" widget="many2one_avatar"/>
|
||||
<field name="vehicle_id" />
|
||||
<field name="date_start"/>
|
||||
<field name="date_end"/>
|
||||
<field name="driver_id" widget="many2one_avatar" string="Current Driver" />
|
||||
<button name="action_open_vehicle" type="object" string="Vehicle Details" class="btn-primary" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import main
|
||||
@@ -1,77 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import base64
|
||||
import io
|
||||
|
||||
from PyPDF2 import PdfFileReader, PdfFileWriter
|
||||
from reportlab.pdfgen import canvas
|
||||
|
||||
from odoo import _
|
||||
from odoo.http import request, route, Controller
|
||||
|
||||
|
||||
|
||||
class HrFleet(Controller):
|
||||
@route(["/fleet/print_claim_report/<int:employee_id>"], type='http', auth='user')
|
||||
def get_claim_report_user(self, employee_id, **post):
|
||||
if not request.env.user.has_group('fleet.fleet_group_manager'):
|
||||
return request.not_found()
|
||||
|
||||
employee = request.env['hr.employee'].search([('id', '=', employee_id)], limit=1)
|
||||
partner_ids = (employee.user_id.partner_id | employee.sudo().address_home_id).ids
|
||||
if not employee or not partner_ids:
|
||||
return request.not_found()
|
||||
|
||||
car_assignation_logs = request.env['fleet.vehicle.assignation.log'].search([('driver_id', 'in', partner_ids)])
|
||||
doc_list = request.env['ir.attachment'].search([
|
||||
('res_model', '=', 'fleet.vehicle.assignation.log'),
|
||||
('res_id', 'in', car_assignation_logs.ids)], order='create_date')
|
||||
|
||||
writer = PdfFileWriter()
|
||||
|
||||
font = "Helvetica"
|
||||
normal_font_size = 14
|
||||
|
||||
for document in doc_list:
|
||||
car_line_doc = request.env['fleet.vehicle.assignation.log'].browse(document.res_id)
|
||||
try:
|
||||
reader = PdfFileReader(io.BytesIO(base64.b64decode(document.datas)), strict=False, overwriteWarnings=False)
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
width = float(reader.getPage(0).mediaBox.getUpperRight_x())
|
||||
height = float(reader.getPage(0).mediaBox.getUpperRight_y())
|
||||
|
||||
header = io.BytesIO()
|
||||
can = canvas.Canvas(header)
|
||||
can.setFont(font, normal_font_size)
|
||||
can.setFillColorRGB(1, 0, 0)
|
||||
|
||||
car_name = car_line_doc.vehicle_id.display_name
|
||||
date_start = car_line_doc.date_start
|
||||
date_end = car_line_doc.date_end or '...'
|
||||
|
||||
text_to_print = _(
|
||||
"%(car_name)s (driven from: %(date_start)s to %(date_end)s)",
|
||||
car_name=car_name,
|
||||
date_start=date_start,
|
||||
date_end=date_end
|
||||
)
|
||||
can.drawCentredString(width / 2, height - normal_font_size, text_to_print)
|
||||
can.save()
|
||||
header_pdf = PdfFileReader(header, overwriteWarnings=False)
|
||||
|
||||
for page_number in range(0, reader.getNumPages()):
|
||||
page = reader.getPage(page_number)
|
||||
page.mergePage(header_pdf.getPage(0))
|
||||
writer.addPage(page)
|
||||
|
||||
_buffer = io.BytesIO()
|
||||
writer.write(_buffer)
|
||||
merged_pdf = _buffer.getvalue()
|
||||
_buffer.close()
|
||||
|
||||
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(merged_pdf))]
|
||||
|
||||
return request.make_response(merged_pdf, headers=pdfhttpheaders)
|
||||
@@ -17,29 +17,23 @@ class Employee(models.Model):
|
||||
|
||||
def action_open_employee_cars(self):
|
||||
self.ensure_one()
|
||||
cars = self.env['fleet.vehicle.assignation.log'].search([
|
||||
('driver_id', 'in', (self.user_id.partner_id | self.sudo().address_home_id).ids)]).mapped('vehicle_id')
|
||||
|
||||
return {
|
||||
"type": "ir.actions.act_window",
|
||||
"res_model": "fleet.vehicle",
|
||||
"views": [[False, "kanban"], [False, "form"], [False, "tree"]],
|
||||
"domain": [("id", "in", cars.ids)],
|
||||
"res_model": "fleet.vehicle.assignation.log",
|
||||
"views": [[False, "tree"], [False, "form"]],
|
||||
"domain": [("driver_employee_id", "in", self.ids)],
|
||||
"context": dict(self._context, create=False),
|
||||
"name": "History Employee Cars",
|
||||
}
|
||||
|
||||
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 = len(employee.car_ids)
|
||||
|
||||
def action_get_claim_report(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'name': 'Claim Report',
|
||||
'type': 'ir.actions.act_url',
|
||||
'url': '/fleet/print_claim_report/%(employee_id)s' % {'employee_id': self.id},
|
||||
}
|
||||
employee.employee_cars_count = cars_count.get(employee.id, 0)
|
||||
|
||||
@api.constrains('address_home_id')
|
||||
def _check_address_home_id(self):
|
||||
|
||||
@@ -1,15 +1,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class FleetVehicleAssignationLog(models.Model):
|
||||
_inherit = 'fleet.vehicle.assignation.log'
|
||||
|
||||
driver_employee_id = fields.Many2one(related="vehicle_id.driver_employee_id", string='Driver (Employee)')
|
||||
driver_employee_id = fields.Many2one('hr.employee', string='Driver (Employee)', compute='_compute_driver_employee_id', store=True, readonly=False)
|
||||
attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number')
|
||||
|
||||
@api.depends('driver_id')
|
||||
def _compute_driver_employee_id(self):
|
||||
employees = self.env['hr.employee'].search([('address_home_id', 'in', self.driver_id.ids)])
|
||||
|
||||
for log in self:
|
||||
employee = employees.filtered(lambda e: e.address_home_id.id == log.driver_id.id)
|
||||
log.driver_employee_id = employee and employee[0] or False
|
||||
|
||||
def _compute_attachment_number(self):
|
||||
attachment_data = self.env['ir.attachment'].read_group([
|
||||
('res_model', '=', 'fleet.vehicle.assignation.log'),
|
||||
|
||||
@@ -13,8 +13,5 @@ class User(models.Model):
|
||||
def SELF_READABLE_FIELDS(self):
|
||||
return super().SELF_READABLE_FIELDS + ['employee_cars_count']
|
||||
|
||||
def action_get_claim_report(self):
|
||||
return self.employee_id.action_get_claim_report()
|
||||
|
||||
def action_open_employee_cars(self):
|
||||
return self.employee_id.action_open_employee_cars()
|
||||
|
||||
@@ -6,17 +6,10 @@
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_form" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//header" position="inside">
|
||||
<button name="action_get_claim_report" string="Claim Car Report"
|
||||
class="btn btn-secondary"
|
||||
type="object" groups="fleet.fleet_group_manager"
|
||||
attrs="{'invisible': [('employee_cars_count','=', 0)]}"
|
||||
confirm="This report will contain only PDF files. If you want all documents, please go on vehicle page. Do you want to proceed?"/>
|
||||
</xpath>
|
||||
<div name="button_box" position="inside">
|
||||
<button name="action_open_employee_cars" type="object"
|
||||
class="oe_stat_button" icon="fa-car" groups="fleet.fleet_group_manager"
|
||||
attrs="{'invisible': [('employee_cars_count','=', 0)]}">
|
||||
attrs="{'invisible': [('employee_cars_count', '=', 0)]}">
|
||||
<field name="employee_cars_count" widget="statinfo" />
|
||||
</button>
|
||||
</div>
|
||||
@@ -46,14 +39,6 @@
|
||||
<field name="model">res.users</field>
|
||||
<field name="inherit_id" ref="hr.res_users_view_form_profile" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//header" position="inside">
|
||||
<button name="action_get_claim_report" string="Claim Car Report"
|
||||
class="btn btn-primary"
|
||||
type="object" groups="fleet.fleet_group_manager"
|
||||
invisible="context.get('from_my_profile', False)"
|
||||
attrs="{'invisible': [('employee_cars_count','=', 0)]}"
|
||||
confirm="This report will contain only PDF files. If you want all documents, please go on vehicle page. Do you want to proceed?"/>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="action_open_employee_cars" type="object"
|
||||
class="oe_stat_button" icon="fa-car" groups="fleet.fleet_group_manager"
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
<field name="model">fleet.vehicle.assignation.log</field>
|
||||
<field name="inherit_id" ref="fleet.fleet_vehicle_assignation_log_view_list" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='date_end']" position="after">
|
||||
<field name="attachment_number" string=" "/>
|
||||
<button name="action_get_attachment_view" string="Attachments" type="object" icon="fa-paperclip"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='driver_id']" position="after">
|
||||
<field name="driver_employee_id" widget="many2one_avatar" optional="hide"/>
|
||||
</xpath>
|
||||
|
||||
Reference in New Issue
Block a user