[IMP] fleet: add future drivers on cars + managers on models
Basically when someone requests a new car, getting that car ready takes some time, this means that during the waiting period, that person is still driving its old car. This commit adds a field future_driver_id on fleet.vehicle to tackle that problem and a boolean plan_to_change_car on the partner to track who wants to change car. + Apply some linting to the files This commit cleans the vehicle form view, the vehicle contract form view, the cost list view and adds a manager_id field on the vehicle.model which is then used as a related on the vehicle. Task: 1930298 closes odoo/odoo#31197 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
This commit is contained in:
committed by
Yannick Tivisse
parent
5b2cf15c05
commit
3c32f9b903
@@ -1,3 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from . import models
|
||||
from . import models
|
||||
|
||||
@@ -399,12 +399,12 @@
|
||||
<record id="type_contract_repairing" model="fleet.service.type">
|
||||
<field name="name">Repairing</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="type_service_refueling" model="fleet.service.type">
|
||||
<field name="name">Refueling</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_junior" model="fleet.vehicle.tag" >
|
||||
<field name="name">Junior</field>
|
||||
@@ -446,6 +446,26 @@
|
||||
<field name="color" eval="8"/>
|
||||
</record>
|
||||
|
||||
<record id="model_astra" model="fleet.vehicle.model">
|
||||
<field name="manager_id" ref="base.user_admin"/>
|
||||
</record>
|
||||
|
||||
<record id="model_corsa" model="fleet.vehicle.model">
|
||||
<field name="manager_id" ref="base.user_admin"/>
|
||||
</record>
|
||||
|
||||
<record id="model_serie1" model="fleet.vehicle.model">
|
||||
<field name="manager_id" ref="base.user_admin"/>
|
||||
</record>
|
||||
|
||||
<record id="model_a1" model="fleet.vehicle.model">
|
||||
<field name="manager_id" ref="base.user_admin"/>
|
||||
</record>
|
||||
|
||||
<record id="model_classa" model="fleet.vehicle.model">
|
||||
<field name="manager_id" ref="base.user_admin"/>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_1" model="fleet.vehicle">
|
||||
<field name="license_plate">1-ACK-205</field>
|
||||
<field name="vin_sn">5454541</field>
|
||||
|
||||
@@ -5,3 +5,4 @@ from . import fleet_vehicle
|
||||
from . import fleet_vehicle_cost
|
||||
from . import fleet_vehicle_model
|
||||
from . import res_config_settings
|
||||
from . import res_partner
|
||||
|
||||
@@ -19,13 +19,16 @@ class FleetVehicle(models.Model):
|
||||
|
||||
name = fields.Char(compute="_compute_vehicle_name", store=True)
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
company_id = fields.Many2one('res.company', 'Company')
|
||||
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env['res.company']._company_default_get())
|
||||
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
|
||||
license_plate = fields.Char(tracking=True,
|
||||
help='License plate number of the vehicle (i = plate number for a car)')
|
||||
vin_sn = fields.Char('Chassis Number', help='Unique number written on the vehicle motor (VIN/SN number)', copy=False)
|
||||
driver_id = fields.Many2one('res.partner', 'Driver', tracking=True, help='Driver of the vehicle', copy=False, auto_join=True)
|
||||
driver_id = fields.Many2one('res.partner', 'Driver', tracking=True, help='Driver of the vehicle', copy=False)
|
||||
future_driver_id = fields.Many2one('res.partner', 'Future Driver', tracking=True, help='Next Driver of the vehicle', copy=False)
|
||||
model_id = fields.Many2one('fleet.vehicle.model', 'Model',
|
||||
tracking=True, required=True, help='Model of the vehicle')
|
||||
manager_id = fields.Many2one('res.users', related='model_id.manager_id')
|
||||
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Brand', related="model_id.brand_id", store=True, readonly=False)
|
||||
log_drivers = fields.One2many('fleet.vehicle.assignation.log', 'vehicle_id', string='Assignation Logs')
|
||||
log_fuel = fields.One2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs')
|
||||
@@ -36,6 +39,8 @@ class FleetVehicle(models.Model):
|
||||
service_count = fields.Integer(compute="_compute_count_all", string='Services')
|
||||
fuel_logs_count = fields.Integer(compute="_compute_count_all", string='Fuel Log Count')
|
||||
odometer_count = fields.Integer(compute="_compute_count_all", string='Odometer')
|
||||
history_count = fields.Integer(compute="_compute_count_all", string="Drivers History Count")
|
||||
next_assignation_date = fields.Date('Assignation Date', help='This is the date at which the car will be available, if not set it means available instantly')
|
||||
acquisition_date = fields.Date('Immatriculation Date', required=False,
|
||||
default=fields.Date.today, help='Date when the vehicle has been immatriculated')
|
||||
first_contract_date = fields.Date(string="First Contract Date", default=fields.Date.today)
|
||||
@@ -46,7 +51,7 @@ class FleetVehicle(models.Model):
|
||||
help='Current state of the vehicle', ondelete="set null")
|
||||
location = fields.Char(help='Location of the vehicle (garage, ...)')
|
||||
seats = fields.Integer('Seats Number', help='Number of seats of the vehicle')
|
||||
model_year = fields.Char('Model Year',help='Year of the model')
|
||||
model_year = fields.Char('Model Year', help='Year of the model')
|
||||
doors = fields.Integer('Doors Number', help='Number of doors of the vehicle', default=5)
|
||||
tag_ids = fields.Many2many('fleet.vehicle.tag', 'fleet_vehicle_vehicle_tag_rel', 'vehicle_tag_id', 'tag_id', 'Tags', copy=False)
|
||||
odometer = fields.Float(compute='_get_odometer', inverse='_set_odometer', string='Last Odometer',
|
||||
@@ -78,7 +83,9 @@ class FleetVehicle(models.Model):
|
||||
contract_renewal_total = fields.Text(compute='_compute_contract_reminder', string='Total of contracts due or overdue minus one',
|
||||
multi='contract_info')
|
||||
car_value = fields.Float(string="Catalog Value (VAT Incl.)", help='Value of the bought vehicle')
|
||||
net_car_value = fields.Float(string="Purchase Value", help="Purchase Value of the car")
|
||||
residual_value = fields.Float()
|
||||
plan_to_change_car = fields.Boolean(related='driver_id.plan_to_change_car', store=True, readonly=False)
|
||||
|
||||
@api.depends('model_id.brand_id.name', 'model_id.name', 'license_plate')
|
||||
def _compute_vehicle_name(self):
|
||||
@@ -111,8 +118,9 @@ class FleetVehicle(models.Model):
|
||||
record.odometer_count = Odometer.search_count([('vehicle_id', '=', record.id)])
|
||||
record.fuel_logs_count = LogFuel.search_count([('vehicle_id', '=', record.id)])
|
||||
record.service_count = LogService.search_count([('vehicle_id', '=', record.id)])
|
||||
record.contract_count = LogContract.search_count([('vehicle_id', '=', record.id),('state','!=','closed')])
|
||||
record.contract_count = LogContract.search_count([('vehicle_id', '=', record.id), ('state', '!=', 'closed')])
|
||||
record.cost_count = Cost.search_count([('vehicle_id', '=', record.id), ('parent_id', '=', False)])
|
||||
record.history_count = self.env['fleet.vehicle.assignation.log'].search_count([('vehicle_id', '=', record.id)])
|
||||
|
||||
@api.depends('log_contracts')
|
||||
def _compute_contract_reminder(self):
|
||||
@@ -207,34 +215,65 @@ class FleetVehicle(models.Model):
|
||||
res = super(FleetVehicle, self).create(vals)
|
||||
if 'driver_id' in vals and vals['driver_id']:
|
||||
res.create_driver_history(vals['driver_id'])
|
||||
if 'future_driver_id' in vals and vals['future_driver_id']:
|
||||
future_driver = self.env['res.partner'].browse(vals['future_driver_id'])
|
||||
future_driver.write({'plan_to_change_car': True})
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
res = super(FleetVehicle, self).write(vals)
|
||||
if 'driver_id' in vals and vals['driver_id']:
|
||||
self.create_driver_history(vals['driver_id'])
|
||||
driver_id = vals['driver_id']
|
||||
self.filtered(lambda v: v.driver_id.id != driver_id).create_driver_history(driver_id)
|
||||
|
||||
if 'future_driver_id' in vals and vals['future_driver_id']:
|
||||
future_driver = self.env['res.partner'].browse(vals['future_driver_id'])
|
||||
future_driver.write({'plan_to_change_car': True})
|
||||
|
||||
res = super(FleetVehicle, self).write(vals)
|
||||
if 'active' in vals and not vals['active']:
|
||||
self.mapped('log_contracts').write({'active': False})
|
||||
return res
|
||||
|
||||
def _close_driver_history(self):
|
||||
self.env['fleet.vehicle.assignation.log'].search([
|
||||
('vehicle_id', 'in', self.ids),
|
||||
('driver_id', 'in', self.mapped('driver_id').ids),
|
||||
('date_end', '=', False)
|
||||
]).write({'date_end': fields.Date.today()})
|
||||
|
||||
def create_driver_history(self, driver_id):
|
||||
for vehicle in self:
|
||||
self.env['fleet.vehicle.assignation.log'].create({
|
||||
'vehicle_id': vehicle.id,
|
||||
'driver_id': driver_id,
|
||||
'date_start': fields.Date.today(),
|
||||
'date_start': fields.Date.today(),
|
||||
})
|
||||
|
||||
def action_accept_driver_change(self):
|
||||
# Find all the vehicles for which the driver is the future_driver_id
|
||||
# remove their driver_id and close their history using current date
|
||||
vehicles = self.search([('driver_id', 'in', self.mapped('future_driver_id').ids)])
|
||||
vehicles.write({'driver_id': False})
|
||||
vehicles._close_driver_history()
|
||||
|
||||
for vehicle in self:
|
||||
vehicle.future_driver_id.write({'plan_to_change_car': False})
|
||||
vehicle.driver_id = vehicle.future_driver_id
|
||||
vehicle.future_driver_id = False
|
||||
|
||||
@api.model
|
||||
def _read_group_stage_ids(self, stages, domain, order):
|
||||
return self.env['fleet.vehicle.state'].search([], order=order)
|
||||
|
||||
@api.model
|
||||
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
|
||||
domain = args or []
|
||||
domain = expression.AND([domain, ['|', ('name', operator, name), ('driver_id.name', operator, name)]])
|
||||
rec = self._search(domain, limit=limit, access_rights_uid=name_get_uid)
|
||||
args = args or []
|
||||
if operator == 'ilike' and not (name or '').strip():
|
||||
domain = []
|
||||
else:
|
||||
domain = ['|', ('name', operator, name), ('driver_id.name', operator, name)]
|
||||
rec = self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
|
||||
return self.browse(rec).name_get()
|
||||
|
||||
@api.multi
|
||||
@@ -347,7 +386,7 @@ class FleetServiceType(models.Model):
|
||||
class FleetVehicleAssignationLog(models.Model):
|
||||
_name = "fleet.vehicle.assignation.log"
|
||||
_description = "Drivers history on a vehicle"
|
||||
_order = "date_start"
|
||||
_order = "create_date desc, date_start desc"
|
||||
|
||||
vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", required=True)
|
||||
driver_id = fields.Many2one('res.partner', string="Driver", required=True)
|
||||
|
||||
@@ -32,6 +32,8 @@ class FleetVehicleCost(models.Model):
|
||||
contract_id = fields.Many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost')
|
||||
auto_generated = fields.Boolean('Automatically Generated', readonly=True)
|
||||
description = fields.Char("Cost Description")
|
||||
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env['res.company']._company_default_get())
|
||||
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
|
||||
|
||||
def _get_odometer(self):
|
||||
for record in self:
|
||||
@@ -135,7 +137,7 @@ class FleetVehicleLogContract(models.Model):
|
||||
# (1) to address fields from inherited table
|
||||
# (2) fields that aren't stored in database
|
||||
cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True, readonly=False)
|
||||
odometer = fields.Float(string='Odometer at creation',
|
||||
odometer = fields.Float(string='Creation Contract Odometer',
|
||||
help='Odometer measure of the vehicle at the moment of the contract creation')
|
||||
|
||||
@api.depends('vehicle_id', 'cost_subtype_id', 'date')
|
||||
|
||||
@@ -10,8 +10,10 @@ class FleetVehicleModel(models.Model):
|
||||
_order = 'name asc'
|
||||
|
||||
name = fields.Char('Model name', required=True)
|
||||
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Make', required=True, help='Make of the vehicle')
|
||||
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Manufacturer', required=True, help='Manufacturer of the vehicle')
|
||||
vendors = fields.Many2many('res.partner', 'fleet_vehicle_model_vendors', 'model_id', 'partner_id', string='Vendors')
|
||||
manager_id = fields.Many2one('res.users', 'Fleet Manager', default=lambda self: self.env.uid,
|
||||
domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)])
|
||||
image = fields.Binary(related='brand_id.image', string="Logo", readonly=False)
|
||||
image_medium = fields.Binary(related='brand_id.image_medium', string="Logo (medium)", readonly=False)
|
||||
image_small = fields.Binary(related='brand_id.image_small', string="Logo (small)", readonly=False)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
plan_to_change_car = fields.Boolean('Plan To Change Car', default=False)
|
||||
@@ -3,7 +3,7 @@ fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,model_fle
|
||||
fleet_vehicle_tag_access_right_user,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,fleet_group_user,1,0,0,0
|
||||
fleet_vehicle_state_access_right_user,fleet_vehicle_state_access_right,model_fleet_vehicle_state,fleet_group_user,1,0,0,0
|
||||
fleet_vehicle_model_brand_access_right_user,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,fleet_group_user,1,0,0,0
|
||||
fleet_vehicle_access_right_user,fleet_vehicle_access_right",model_fleet_vehicle,fleet_group_user,1,1,0,0
|
||||
fleet_vehicle_access_right_user,fleet_vehicle_access_right,model_fleet_vehicle,fleet_group_user,1,1,0,0
|
||||
fleet_vehicle_log_services_access_right_user,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,fleet_group_user,1,0,0,0
|
||||
fleet_vehicle_log_contract_access_right_user,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,fleet_group_user,1,0,0,0
|
||||
fleet_service_type_access_right_user,fleet_service_type_access_right,model_fleet_service_type,fleet_group_user,1,0,0,0
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 59.
|
@@ -6,10 +6,12 @@
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Vehicle Costs">
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="vehicle_id"/>
|
||||
<field name="description"/>
|
||||
<field name="cost_subtype_id"/>
|
||||
<field name="date"/>
|
||||
<field name="amount" sum="Cost" widget="monetary"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -19,6 +21,7 @@
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_mobile">
|
||||
<field name="currency_id"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_global_click">
|
||||
@@ -30,7 +33,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<field name="cost_subtype_id"/>
|
||||
<span class="float-right"><field name="amount"/></span>
|
||||
<span class="float-right"><field name="amount" widget="monetary"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
@@ -117,11 +120,12 @@
|
||||
<field name="arch" type="xml">
|
||||
<form string="Vehicle costs">
|
||||
<sheet>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<group col="2" string="Cost Details">
|
||||
<group>
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_subtype_id"/>
|
||||
<field name="amount"/>
|
||||
<field name="amount" widget="monetary"/>
|
||||
<field name="description"/>
|
||||
</group>
|
||||
<group>
|
||||
@@ -177,24 +181,22 @@
|
||||
<field name="state" widget="statusbar" />
|
||||
</header>
|
||||
<sheet>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<group col="2">
|
||||
<group string="Contract details">
|
||||
<field name="vehicle_id"/>
|
||||
<group string="Contract Informations">
|
||||
<field name="ins_ref"/>
|
||||
<field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
|
||||
<field name="insurer_id" context="{'default_supplier': True}"/>
|
||||
<field name="user_id"/>
|
||||
<field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract"/>
|
||||
<label for="cost_generated"/>
|
||||
<div>
|
||||
<field name="cost_generated" class="oe_inline" attrs="{'invisible': [('cost_frequency','=','no')]}" />
|
||||
<field name="cost_frequency" class="oe_inline" />
|
||||
</div>
|
||||
</group>
|
||||
<group string="Odometer details">
|
||||
<group string="Vehicle Informations">
|
||||
<field name="vehicle_id"/>
|
||||
<field name="purchaser_id"/>
|
||||
<label for="odometer"/>
|
||||
<div class="o_row">
|
||||
<field name="odometer"/>
|
||||
@@ -204,14 +206,17 @@
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="date" string="Invoice Date"/>
|
||||
<field name="start_date"/>
|
||||
<field name="expiration_date" />
|
||||
<field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract" widget="monetary"/>
|
||||
<label for="cost_generated"/>
|
||||
<div class="o_row">
|
||||
<field name="cost_generated" attrs="{'invisible': [('cost_frequency','=','no')]}" widget="monetary"/>
|
||||
<field name="cost_frequency"/>
|
||||
</div>
|
||||
</group>
|
||||
<group>
|
||||
<field name="insurer_id" context="{'default_supplier': True}"/>
|
||||
<field name="purchaser_id" />
|
||||
<field name="ins_ref" />
|
||||
<field name="date" string="Invoice Date"/>
|
||||
<field name="start_date"/>
|
||||
<field name="expiration_date"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
@@ -219,25 +224,22 @@
|
||||
<group>
|
||||
<field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1">
|
||||
<tree editable="bottom">
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
|
||||
<field name="description"/>
|
||||
<field name="amount" sum="Price" string="Indicative Cost" />
|
||||
<field name="amount" sum="Price" string="Indicative Cost" widget="monetary"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
</group>
|
||||
<div class="oe_right">
|
||||
<group>
|
||||
<field name="sum_cost" string="Indicative Costs Total"/>
|
||||
</group>
|
||||
</div>
|
||||
</page>
|
||||
<page string="Generated Recurring Costs">
|
||||
<group>
|
||||
<field name="generated_cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" sum="amount">
|
||||
<tree editable="bottom" >
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="date" />
|
||||
<field name="amount" sum="amount"/>
|
||||
<field name="amount" sum="amount" widget="monetary"/>
|
||||
</tree>
|
||||
|
||||
</field>
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
<field name="brand_id" placeholder="e.g. Tesla"/>
|
||||
</h2>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="manager_id" groups="fleet.fleet_group_manager"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Vendors" name="vendors">
|
||||
<field name="vendors">
|
||||
@@ -143,13 +148,13 @@
|
||||
</record>
|
||||
|
||||
<record id='fleet_vehicle_model_brand_action' model='ir.actions.act_window'>
|
||||
<field name="name">Model make of Vehicle</field>
|
||||
<field name="name">Car Manufacturers</field>
|
||||
<field name="res_model">fleet.vehicle.model.brand</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new make
|
||||
Create a new manufacturer
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -10,13 +10,19 @@
|
||||
<field name="state_id" widget="statusbar" options="{'clickable': '1'}"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="open_assignation_logs" string="Drivers History" type="object" class="oe_stat_button" icon="fa-history"/>
|
||||
<button name="open_assignation_logs"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-history">
|
||||
<field name="history_count" widget="statinfo" string="Drivers History"/>
|
||||
</button>
|
||||
<button name="return_action_to_open"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-book"
|
||||
context="{'xml_id':'fleet_vehicle_log_contract_action', 'search_default_open': 1}"
|
||||
context="{'xml_id':'fleet_vehicle_log_contract_action'}"
|
||||
help="show the contract for this vehicle">
|
||||
<field name="contract_count" widget="statinfo" string="Contracts"/>
|
||||
</button>
|
||||
@@ -69,41 +75,54 @@
|
||||
<label for="tag_ids" class="oe_edit_only"/>
|
||||
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/>
|
||||
</div>
|
||||
<group col="2" string="General Properties">
|
||||
<group >
|
||||
<field name="driver_id" />
|
||||
<field name="location" />
|
||||
<field name="vin_sn" />
|
||||
<field name="model_year"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<group col="2">
|
||||
<group string="Driver">
|
||||
<field name="driver_id"/>
|
||||
<label for="future_driver_id"/>
|
||||
<div class="o_row">
|
||||
<field name="future_driver_id"/>
|
||||
<button string="Apply Change"
|
||||
class="btn btn-primary"
|
||||
type="object"
|
||||
name="action_accept_driver_change"
|
||||
attrs="{'invisible': [('future_driver_id', '=', False)]}"/>
|
||||
</div>
|
||||
<field name="plan_to_change_car" groups="fleet.fleet_group_manager"/>
|
||||
<field name="next_assignation_date"/>
|
||||
<field name="location"/>
|
||||
</group>
|
||||
<group >
|
||||
<group string="Vehicle">
|
||||
<label for="odometer"/>
|
||||
<div class="o_row">
|
||||
<field name="odometer"/>
|
||||
<field name="odometer_unit"/>
|
||||
</div>
|
||||
<field name="acquisition_date" />
|
||||
<field name="acquisition_date"/>
|
||||
<field name="vin_sn"/>
|
||||
<field name="car_value" widget="monetary"/>
|
||||
<field name="net_car_value" widget="monetary"/>
|
||||
<field name="residual_value" widget="monetary"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group string="Contract">
|
||||
<field name="manager_id"/>
|
||||
<field name="first_contract_date"/>
|
||||
<field name="car_value" />
|
||||
<field name="residual_value"/>
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group string="Additional Properties">
|
||||
<field name="seats" />
|
||||
<field name="doors" />
|
||||
<field name="color" />
|
||||
<group string="Model">
|
||||
<field name="seats"/>
|
||||
<field name="doors"/>
|
||||
<field name="color"/>
|
||||
<field name="model_year"/>
|
||||
</group>
|
||||
<group string="Engine Options">
|
||||
<field name="transmission" />
|
||||
<field name="fuel_type" />
|
||||
<group string="Engine">
|
||||
<field name="transmission"/>
|
||||
<field name="fuel_type"/>
|
||||
<label for="co2"/>
|
||||
<div class="o_row" name="co2">
|
||||
<field name="co2"/><span>g/km</span>
|
||||
</div>
|
||||
<field name="horsepower" />
|
||||
<field name="horsepower_tax" />
|
||||
<field name="horsepower"/>
|
||||
<field name="horsepower_tax" widget="monetary"/>
|
||||
<label for="power"/>
|
||||
<div class="o_row">
|
||||
<field name="power"/><span>kW</span>
|
||||
@@ -119,21 +138,23 @@
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id='fleet_vehicle_view_tree' model='ir.ui.view'>
|
||||
<field name="name">fleet.vehicle.tree</field>
|
||||
<field name="model">fleet.vehicle</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Vehicle" decoration-warning="contract_renewal_due_soon and not contract_renewal_overdue" decoration-danger="contract_renewal_overdue">
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="license_plate" />
|
||||
<field name="model_id" />
|
||||
<field name="driver_id" />
|
||||
<field name="license_plate"/>
|
||||
<field name="model_id"/>
|
||||
<field name="driver_id"/>
|
||||
<field name="future_driver_id"/>
|
||||
<field name="log_drivers" invisible="1"/>
|
||||
<field name="vin_sn" />
|
||||
<field name="acquisition_date" />
|
||||
<field name="vin_sn"/>
|
||||
<field name="acquisition_date"/>
|
||||
<field name="state_id"/>
|
||||
<field name="contract_renewal_due_soon" invisible="1"/>
|
||||
<field name="contract_renewal_overdue" invisible="1" />
|
||||
<field name="contract_renewal_overdue" invisible="1"/>
|
||||
<field name="contract_renewal_total" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
@@ -147,9 +168,14 @@
|
||||
<field name="name" filter_domain="['|', ('name','ilike',self), ('license_plate','ilike',self)]" string="Vehicle"/>
|
||||
<field name="log_drivers" filter_domain="[('log_drivers.driver_id.name', 'ilike', self)]" string="Drivers History"/>
|
||||
<field name="driver_id"/>
|
||||
<field name="future_driver_id"/>
|
||||
<field name="tag_ids"/>
|
||||
<field name="location"/>
|
||||
<field name="state_id" />
|
||||
<field name="state_id"/>
|
||||
<filter name="available" string="Is Available"
|
||||
domain="['&', ('future_driver_id', '=', False), '|', ('driver_id', '=', False), ('plan_to_change_car', '=', True)]"/>
|
||||
<filter name="planned" string="Planned for Change" domain="[('plan_to_change_car', '=', True)]"/>
|
||||
<separator/>
|
||||
<filter name="alert_true" domain="['|',('contract_renewal_due_soon','=',True),('contract_renewal_overdue','=',True)]" string="Has Alert(s)"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
|
||||
@@ -180,6 +206,7 @@
|
||||
<field name="license_plate" />
|
||||
<field name="model_id" />
|
||||
<field name="driver_id" />
|
||||
<field name="future_driver_id" />
|
||||
<field name="location" />
|
||||
<field name="state_id" />
|
||||
<field name="id" />
|
||||
@@ -211,6 +238,9 @@
|
||||
<li>
|
||||
<t t-if="record.driver_id.raw_value"><field name="driver_id"/></t>
|
||||
</li>
|
||||
<li>
|
||||
<t t-if="record.future_driver_id.raw_value">Future Driver : <field name="future_driver_id"/></t>
|
||||
</li>
|
||||
<li>
|
||||
<t t-if="record.location.raw_value"><field name="location"/></t>
|
||||
</li>
|
||||
@@ -219,7 +249,7 @@
|
||||
<div class="o_kanban_button">
|
||||
<a t-if="record.contract_count.raw_value>0" data-type="object"
|
||||
data-name="return_action_to_open" href="#" class="oe_kanban_action oe_kanban_action_a"
|
||||
data-context='{"xml_id":"fleet_vehicle_log_contract_action","search_default_open": 1}'>
|
||||
data-context='{"xml_id":"fleet_vehicle_log_contract_action"}'>
|
||||
<field name="contract_count"/>
|
||||
Contract(s)
|
||||
<span t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value"
|
||||
@@ -359,7 +389,7 @@
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_odometer_action" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="fleet_group_user"/>
|
||||
|
||||
|
||||
<record id='fleet_vehicle_service_types_view_tree' model='ir.ui.view'>
|
||||
<field name="name">fleet.service.type.tree</field>
|
||||
<field name="model">fleet.service.type</field>
|
||||
|
||||
Reference in New Issue
Block a user