From e513af0bb0c8a21bcc9474bb441cd20e878d1b07 Mon Sep 17 00:00:00 2001
From: Ravi Gadhia <rga@odoo.com>
Date: Wed, 4 May 2016 20:04:16 +0530
Subject: [PATCH] [IMP] fleet: migrate to new api (fleet.py). my eye is paining

---
 addons/fleet/data/fleet_cars_data.xml     |    6 +-
 addons/fleet/data/fleet_data.xml          |    6 +-
 addons/fleet/data/fleet_demo.xml          |    8 +-
 addons/fleet/models/fleet.py              | 1152 +++++++++------------
 addons/fleet/security/fleet_security.xml  |   65 +-
 addons/fleet/security/ir.model.access.csv |   44 +-
 addons/fleet/views/fleet_board_view.xml   |   44 +-
 addons/fleet/views/fleet_view.xml         |  169 ++-
 8 files changed, 671 insertions(+), 823 deletions(-)

diff --git a/addons/fleet/data/fleet_cars_data.xml b/addons/fleet/data/fleet_cars_data.xml
index 1c545fd67dfa..6e6b20817522 100644
--- a/addons/fleet/data/fleet_cars_data.xml
+++ b/addons/fleet/data/fleet_cars_data.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<openerp>
-    <data>
+<odoo>
       <record id="brand_abarth" model="fleet.vehicle.model.brand">
       	<field name="name">Abarth</field>
       	<field name="image" type="base64" file="fleet/static/img/brand_abarth-image.png"/>
@@ -265,5 +264,4 @@
         <field name="name">Suzuki</field>
         <field name="image" type="base64" file="fleet/static/img/brand_suzuki-image.png"/>
       </record>
-    </data>
-</openerp>
+</odoo>
diff --git a/addons/fleet/data/fleet_data.xml b/addons/fleet/data/fleet_data.xml
index 94fcf8f2a220..0d9a4640f2b5 100644
--- a/addons/fleet/data/fleet_data.xml
+++ b/addons/fleet/data/fleet_data.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<openerp>
-    <data noupdate="0">
+<odoo>
       <record forcecreate="True" id="ir_cron_contract_costs_generator" model="ir.cron">
         <field name="name">Generation of contracts costs based on the costs frequency</field>
         <field eval="True" name="active" />
@@ -654,5 +653,4 @@
           <field name="name">SLS</field>
           <field name="brand_id" ref="brand_mercedes" />
       </record>
-     </data>
-</openerp>
+</odoo>
diff --git a/addons/fleet/data/fleet_demo.xml b/addons/fleet/data/fleet_demo.xml
index 0065c6d132f1..cb52c613649f 100644
--- a/addons/fleet/data/fleet_demo.xml
+++ b/addons/fleet/data/fleet_demo.xml
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<openerp>
-    <data>
+<odoo>
       <!--Users-->
       <record id="base.user_demo" model="res.users">
-        <field name="groups_id" eval="[(4, ref('fleet.group_fleet_manager'))]" />
+        <field name="groups_id" eval="[(4, ref('fleet.fleet_group_manager'))]" />
       </record>
 
       <record id="vehicle_state_inshop" model="fleet.vehicle.state">
@@ -942,5 +941,4 @@
         <field name="date">2012-01-01</field>
         <field name="parent_id" ref="log_contract_5_fleet_vehicle_cost" />
       </record>
-    </data>
-</openerp>
+</odoo>
diff --git a/addons/fleet/models/fleet.py b/addons/fleet/models/fleet.py
index 5d72c86a966f..ea40e6f427e3 100644
--- a/addons/fleet/models/fleet.py
+++ b/addons/fleet/models/fleet.py
@@ -1,71 +1,57 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-import time
-import datetime
 from dateutil.relativedelta import relativedelta
 
-import openerp
-from openerp import tools
-from openerp.exceptions import UserError
-from openerp.osv import fields, osv
-from openerp.tools.translate import _
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import UserError
 
-def str_to_datetime(strdate):
-    return datetime.datetime.strptime(strdate, tools.DEFAULT_SERVER_DATE_FORMAT)
 
-class fleet_vehicle_cost(osv.Model):
+class FleetVehicleCost(models.Model):
     _name = 'fleet.vehicle.cost'
     _description = 'Cost related to a vehicle'
     _order = 'date desc, vehicle_id asc'
 
-    def _get_odometer(self, cr, uid, ids, odometer_id, arg, context):
-        res = dict.fromkeys(ids, False)
-        for record in self.browse(cr,uid,ids,context=context):
+    name = fields.Char(related='vehicle_id.name', string='Name', store=True)
+    vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', required=True, help='Vehicle concerned by this log')
+    cost_subtype_id = fields.Many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost')
+    amount = fields.Float('Total Price')
+    cost_type = fields.Selection([('contract', 'Contract'), ('services', 'Services'), ('fuel', 'Fuel'), ('other', 'Other')],
+        'Category of the cost', default="other", help='For internal purpose only', required=True)
+    parent_id = fields.Many2one('fleet.vehicle.cost', 'Parent', help='Parent cost to this current cost')
+    cost_ids = fields.One2many('fleet.vehicle.cost', 'parent_id', 'Included Services')
+    odometer_id = fields.Many2one('fleet.vehicle.odometer', 'Odometer', help='Odometer measure of the vehicle at the moment of this log')
+    odometer = fields.Float(compute="_get_odometer", inverse='_set_odometer', string='Odometer Value', help='Odometer measure of the vehicle at the moment of this log')
+    odometer_unit = fields.Selection(related='vehicle_id.odometer_unit', string="Unit", readonly=True)
+    date = fields.Date(help='Date when the cost has been executed')
+    contract_id = fields.Many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost')
+    auto_generated = fields.Boolean('Automatically Generated', readonly=True)
+
+    def _get_odometer(self):
+        for record in self:
             if record.odometer_id:
-                res[record.id] = record.odometer_id.value
-        return res
-
-    def _set_odometer(self, cr, uid, id, name, value, args=None, context=None):
-        if not value:
-            raise UserError(_('Emptying the odometer value of a vehicle is not allowed.'))
-        date = self.browse(cr, uid, id, context=context).date
-        if not(date):
-            date = fields.date.context_today(self, cr, uid, context=context)
-        vehicle_id = self.browse(cr, uid, id, context=context).vehicle_id
-        data = {'value': value, 'date': date, 'vehicle_id': vehicle_id.id}
-        odometer_id = self.pool.get('fleet.vehicle.odometer').create(cr, uid, data, context=context)
-        return self.write(cr, uid, id, {'odometer_id': odometer_id}, context=context)
-
-    _columns = {
-        'name': fields.related('vehicle_id', 'name', type="char", string='Name', store=True),
-        'vehicle_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True, help='Vehicle concerned by this log'),
-        'cost_subtype_id': fields.many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost'),
-        'amount': fields.float('Total Price'),
-        'cost_type': fields.selection([('contract', 'Contract'), ('services','Services'), ('fuel','Fuel'), ('other','Other')], 'Category of the cost', help='For internal purpose only', required=True),
-        'parent_id': fields.many2one('fleet.vehicle.cost', 'Parent', help='Parent cost to this current cost'),
-        'cost_ids': fields.one2many('fleet.vehicle.cost', 'parent_id', 'Included Services'),
-        'odometer_id': fields.many2one('fleet.vehicle.odometer', 'Odometer', help='Odometer measure of the vehicle at the moment of this log'),
-        'odometer': fields.function(_get_odometer, fnct_inv=_set_odometer, type='float', string='Odometer Value', help='Odometer measure of the vehicle at the moment of this log'),
-        'odometer_unit': fields.related('vehicle_id', 'odometer_unit', type="char", string="Unit", readonly=True),
-        'date' :fields.date('Date',help='Date when the cost has been executed'),
-        'contract_id': fields.many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost'),
-        'auto_generated': fields.boolean('Automatically Generated', readonly=True),
-    }
-
-    _defaults ={
-        'cost_type': 'other',
-    }
-
-    def create(self, cr, uid, data, context=None):
+                record.odometer = record.odometer_id.value
+
+    def _set_odometer(self):
+        for record in self:
+            if not record.odometer:
+                raise UserError(_('Emptying the odometer value of a vehicle is not allowed.'))
+            odometer = self.env['fleet.vehicle.odometer'].create({
+                'value': record.odometer,
+                'date': record.date or fields.Date.context_today(record),
+                'vehicle_id': record.vehicle_id.id
+            })
+            self.odometer_id = odometer
+
+    @api.model
+    def create(self, data):
         #make sure that the data are consistent with values of parent and contract records given
         if 'parent_id' in data and data['parent_id']:
-            parent = self.browse(cr, uid, data['parent_id'], context=context)
+            parent = self.browse(data['parent_id'])
             data['vehicle_id'] = parent.vehicle_id.id
             data['date'] = parent.date
             data['cost_type'] = parent.cost_type
         if 'contract_id' in data and data['contract_id']:
-            contract = self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, data['contract_id'], context=context)
+            contract = self.env['fleet.vehicle.log.contract'].browse(data['contract_id'])
             data['vehicle_id'] = contract.vehicle_id.id
             data['cost_subtype_id'] = contract.cost_subtype_id.id
             data['cost_type'] = contract.cost_type
@@ -73,730 +59,606 @@ class fleet_vehicle_cost(osv.Model):
             #if received value for odometer is 0, then remove it from the data as it would result to the creation of a
             #odometer log with 0, which is to be avoided
             del(data['odometer'])
-        return super(fleet_vehicle_cost, self).create(cr, uid, data, context=context)
+        return super(FleetVehicleCost, self).create(data)
 
-
-class fleet_vehicle_tag(osv.Model):
+class FleetVehicleTag(models.Model):
     _name = 'fleet.vehicle.tag'
-    _columns = {
-        'name': fields.char('Name', required=True),
-        'color': fields.integer('Color Index'),
-    }
-    _sql_constraints = [
-            ('name_uniq', 'unique (name)', "Tag name already exists !"),
-    ]
 
+    name = fields.Char(required=True)
+    color = fields.Integer('Color Index')
+
+    _sql_constraints = [('name_uniq', 'unique (name)', "Tag name already exists !")]
 
-class fleet_vehicle_state(osv.Model):
+class FleetVehicleState(models.Model):
     _name = 'fleet.vehicle.state'
     _order = 'sequence asc'
-    _columns = {
-        'name': fields.char('Name', required=True),
-        'sequence': fields.integer('Sequence', help="Used to order the note stages")
-    }
-    _sql_constraints = [('fleet_state_name_unique','unique(name)', 'State name already exists')]
 
+    name = fields.Char(required=True)
+    sequence = fields.Integer(help="Used to order the note stages")
+
+    _sql_constraints = [('fleet_state_name_unique', 'unique(name)', 'State name already exists')]
 
+class FleetVehicleModel(models.Model):
+    _name = 'fleet.vehicle.model'
+    _description = 'Model of a vehicle'
+    _order = 'name asc'
 
-class fleet_vehicle_model(osv.Model):
+    name = fields.Char('Model name', required=True)
+    brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Make', required=True, help='Make of the vehicle')
+    vendors = fields.Many2many('res.partner', 'fleet_vehicle_model_vendors', 'model_id', 'partner_id', string='Vendors')
+    image = fields.Binary(related='brand_id.image', string="Logo")
+    image_medium = fields.Binary(related='brand_id.image_medium', string="Logo (medium)")
+    image_small = fields.Binary(related='brand_id.image_small', string="Logo (small)")
 
-    def name_get(self, cr, uid, ids, context=None):
+    @api.multi
+    @api.depends('name', 'brand_id')
+    def name_get(self):
         res = []
-        for record in self.browse(cr, uid, ids, context=context):
+        for record in self:
             name = record.name
             if record.brand_id.name:
                 name = record.brand_id.name + '/' + name
             res.append((record.id, name))
         return res
 
-    def on_change_brand(self, cr, uid, ids, model_id, context=None):
-        if not model_id:
-            return {'value': {'image_medium': False}}
-        brand = self.pool.get('fleet.vehicle.model.brand').browse(cr, uid, model_id, context=context)
-        return {
-            'value': {
-                'image_medium': brand.image,
-            }
-        }
-
-    _name = 'fleet.vehicle.model'
-    _description = 'Model of a vehicle'
-    _order = 'name asc'
-
-    _columns = {
-        'name': fields.char('Model name', required=True),
-        'brand_id': fields.many2one('fleet.vehicle.model.brand', 'Make', required=True, help='Make of the vehicle'),
-        'vendors': fields.many2many('res.partner', 'fleet_vehicle_model_vendors', 'model_id', 'partner_id', string='Vendors'),
-        'image': fields.related('brand_id', 'image', type="binary", string="Logo"),
-        'image_medium': fields.related('brand_id', 'image_medium', type="binary", string="Logo (medium)"),
-        'image_small': fields.related('brand_id', 'image_small', type="binary", string="Logo (small)"),
-    }
-
+    @api.onchange('brand_id')
+    def _onchange_brand(self):
+        if self.brand_id:
+            self.image_medium = self.brand_id.image
+        else:
+            self.image_medium = False
 
-class fleet_vehicle_model_brand(osv.Model):
+class FleetVehicleModelBrand(models.Model):
     _name = 'fleet.vehicle.model.brand'
     _description = 'Brand model of the vehicle'
     _order = 'name asc'
 
-    name = openerp.fields.Char('Make', required=True)
-
-    image = openerp.fields.Binary("Logo", attachment=True,
+    name = fields.Char('Make', required=True)
+    image = fields.Binary("Logo", attachment=True,
         help="This field holds the image used as logo for the brand, limited to 1024x1024px.")
-    image_medium = openerp.fields.Binary("Medium-sized image", attachment=True,
-        help="Medium-sized logo of the brand. It is automatically "\
-             "resized as a 128x128px image, with aspect ratio preserved. "\
+    image_medium = fields.Binary("Medium-sized image", attachment=True,
+        help="Medium-sized logo of the brand. It is automatically "
+             "resized as a 128x128px image, with aspect ratio preserved. "
              "Use this field in form views or some kanban views.")
-    image_small = openerp.fields.Binary("Small-sized image", attachment=True,
-        help="Small-sized logo of the brand. It is automatically "\
-             "resized as a 64x64px image, with aspect ratio preserved. "\
+    image_small = fields.Binary("Small-sized image", attachment=True,
+        help="Small-sized logo of the brand. It is automatically "
+             "resized as a 64x64px image, with aspect ratio preserved. "
              "Use this field anywhere a small image is required.")
 
-    @openerp.api.model
+    @api.model
     def create(self, vals):
         tools.image_resize_images(vals)
-        return super(fleet_vehicle_model_brand, self).create(vals)
+        return super(FleetVehicleModelBrand, self).create(vals)
 
-    @openerp.api.multi
+    @api.multi
     def write(self, vals):
         tools.image_resize_images(vals)
-        return super(fleet_vehicle_model_brand, self).write(vals)
-
-
-class fleet_vehicle(osv.Model):
+        return super(FleetVehicleModelBrand, self).write(vals)
 
+class FleetVehicle(models.Model):
     _inherit = 'mail.thread'
-
-    def _vehicle_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
-        res = {}
-        for record in self.browse(cr, uid, ids, context=context):
-            res[record.id] = record.model_id.brand_id.name + '/' + record.model_id.name + '/' + record.license_plate
-        return res
-
-    def return_action_to_open(self, cr, uid, ids, context=None):
-        """ This opens the xml view specified in xml_id for the current vehicle """
-        if context is None:
-            context = {}
-        if context.get('xml_id'):
-            res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid ,'fleet', context['xml_id'], context=context)
-            res['context'] = context
-            res['context'].update({'default_vehicle_id': ids[0]})
-            res['domain'] = [('vehicle_id','=', ids[0])]
-            return res
-        return False
-
-    def act_show_log_cost(self, cr, uid, ids, context=None):
-        """ This opens log view to view and add new log for this vehicle, groupby default to only show effective costs
-            @return: the costs log view
-        """
-        if context is None:
-            context = {}
-        res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid ,'fleet','fleet_vehicle_costs_act', context=context)
-        res['context'] = context
-        res['context'].update({
-            'default_vehicle_id': ids[0],
-            'search_default_parent_false': True
-        })
-        res['domain'] = [('vehicle_id','=', ids[0])]
-        return res
-
-    def _get_odometer(self, cr, uid, ids, odometer_id, arg, context):
-        res = dict.fromkeys(ids, 0)
-        for record in self.browse(cr,uid,ids,context=context):
-            ids = self.pool.get('fleet.vehicle.odometer').search(cr, uid, [('vehicle_id', '=', record.id)], limit=1, order='value desc')
-            if len(ids) > 0:
-                res[record.id] = self.pool.get('fleet.vehicle.odometer').browse(cr, uid, ids[0], context=context).value
-        return res
-
-    def _set_odometer(self, cr, uid, id, name, value, args=None, context=None):
-        if value:
-            date = fields.date.context_today(self, cr, uid, context=context)
-            data = {'value': value, 'date': date, 'vehicle_id': id}
-            return self.pool.get('fleet.vehicle.odometer').create(cr, uid, data, context=context)
-
-    def _search_get_overdue_contract_reminder(self, cr, uid, obj, name, args, context):
-        res = []
-        for field, operator, value in args:
-            assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
-            if (operator == '=' and value == True) or (operator in ('<>', '!=') and value == False):
-                search_operator = 'in'
-            else:
-                search_operator = 'not in'
-            today = fields.date.context_today(self, cr, uid, context=context)
-            cr.execute('select cost.vehicle_id, count(contract.id) as contract_number FROM fleet_vehicle_cost cost left join fleet_vehicle_log_contract contract on contract.cost_id = cost.id WHERE contract.expiration_date is not null AND contract.expiration_date < %s AND contract.state IN (\'open\', \'toclose\') GROUP BY cost.vehicle_id', (today,))
-            res_ids = [x[0] for x in cr.fetchall()]
-            res.append(('id', search_operator, res_ids))
-        return res
-
-    def _search_contract_renewal_due_soon(self, cr, uid, obj, name, args, context):
-        res = []
-        for field, operator, value in args:
-            assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
-            if (operator == '=' and value == True) or (operator in ('<>', '!=') and value == False):
-                search_operator = 'in'
+    _name = 'fleet.vehicle'
+    _description = 'Information on a vehicle'
+    _order = 'license_plate asc'
+
+    def _get_default_state(self):
+        state = self.env.ref('fleet.vehicle_state_active', raise_if_not_found=False)
+        return state and state.id or False
+
+    name = fields.Char(compute="_compute_vehicle_name", store=True)
+    active = fields.Boolean(default=True)
+    company_id = fields.Many2one('res.company', 'Company')
+    license_plate = fields.Char(required=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', help='Driver of the vehicle')
+    model_id = fields.Many2one('fleet.vehicle.model', 'Model', required=True, help='Model of the vehicle')
+    log_fuel = fields.One2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs')
+    log_services = fields.One2many('fleet.vehicle.log.services', 'vehicle_id', 'Services Logs')
+    log_contracts = fields.One2many('fleet.vehicle.log.contract', 'vehicle_id', 'Contracts')
+    cost_count = fields.Integer(compute="_compute_count_all", string="Costs")
+    contract_count = fields.Integer(compute="_compute_count_all", string='Contracts')
+    service_count = fields.Integer(compute="_compute_count_all", string='Services')
+    fuel_logs_count = fields.Integer(compute="_compute_count_all", string='Fuel Logs')
+    odometer_count = fields.Integer(compute="_compute_count_all", string='Odometer')
+    acquisition_date = fields.Date('Acquisition Date', required=False, help='Date when the vehicle has been bought')
+    color = fields.Char(help='Color of the vehicle')
+    state_id = fields.Many2one('fleet.vehicle.state', 'State', default=_get_default_state, 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')
+    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', help='Odometer measure of the vehicle at the moment of this log')
+    odometer_unit = fields.Selection([('kilometers', 'Kilometers'), ('miles', 'Miles')],
+        'Odometer Unit', default='kilometers', help='Unit of the odometer ', required=True)
+    transmission = fields.Selection([('manual', 'Manual'), ('automatic', 'Automatic')], 'Transmission', help='Transmission Used by the vehicle')
+    fuel_type = fields.Selection([('gasoline', 'Gasoline'), ('diesel', 'Diesel'), ('electric', 'Electric'), ('hybrid', 'Hybrid')], 'Fuel Type', help='Fuel Used by the vehicle')
+    horsepower = fields.Integer()
+    horsepower_tax = fields.Float('Horsepower Taxation')
+    power = fields.Integer('Power', help='Power in kW of the vehicle')
+    co2 = fields.Float('CO2 Emissions', help='CO2 emissions of the vehicle')
+    image = fields.Binary(related='model_id.image', string="Logo")
+    image_medium = fields.Binary(related='model_id.image_medium', string="Logo (medium)")
+    image_small = fields.Binary(related='model_id.image_small', string="Logo (small)")
+    contract_renewal_due_soon = fields.Boolean(compute='_compute_contract_reminder', search='_search_contract_renewal_due_soon', string='Has Contracts to renew', multi='contract_info')
+    contract_renewal_overdue = fields.Boolean(compute='_compute_contract_reminder', search='_search_get_overdue_contract_reminder', string='Has Contracts Overdue', multi='contract_info')
+    contract_renewal_name = fields.Text(compute='_compute_contract_reminder', string='Name of contract to renew soon', multi='contract_info')
+    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(help='Value of the bought vehicle')
+
+    @api.depends('model_id', 'license_plate')
+    def _compute_vehicle_name(self):
+        for record in self:
+            record.name = record.model_id.brand_id.name + '/' + record.model_id.name + '/' + record.license_plate
+
+    def _get_odometer(self):
+        FleetVehicalOdometer = self.env['fleet.vehicle.odometer']
+        for record in self:
+            vehicle_odometer = FleetVehicalOdometer.search([('vehicle_id', '=', record.id)], limit=1, order='value desc')
+            if vehicle_odometer:
+                record.odometer = vehicle_odometer.value
             else:
-                search_operator = 'not in'
-            today = fields.date.context_today(self, cr, uid, context=context)
-            datetime_today = datetime.datetime.strptime(today, tools.DEFAULT_SERVER_DATE_FORMAT)
-            limit_date = str((datetime_today + relativedelta(days=+15)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT))
-            cr.execute('select cost.vehicle_id, count(contract.id) as contract_number FROM fleet_vehicle_cost cost left join fleet_vehicle_log_contract contract on contract.cost_id = cost.id WHERE contract.expiration_date is not null AND contract.expiration_date > %s AND contract.expiration_date < %s AND contract.state IN (\'open\', \'toclose\') GROUP BY cost.vehicle_id', (today, limit_date))
-            res_ids = [x[0] for x in cr.fetchall()]
-            res.append(('id', search_operator, res_ids))
-        return res
-
-    def _get_contract_reminder_fnc(self, cr, uid, ids, field_names, unknow_none, context=None):
-        res= {}
-        for record in self.browse(cr, uid, ids, context=context):
+                record.odometer = 0
+
+    def _set_odometer(self):
+        for record in self:
+            if record.odometer:
+                date = fields.Date.context_today(record)
+                data = {'value': record.odometer, 'date': date, 'vehicle_id': record.id}
+                self.env['fleet.vehicle.odometer'].create(data)
+
+    def _compute_count_all(self):
+        Odometer = self.env['fleet.vehicle.odometer']
+        LogFuel = self.env['fleet.vehicle.log.fuel']
+        LogService = self.env['fleet.vehicle.log.services']
+        LogContract = self.env['fleet.vehicle.log.contract']
+        Cost = self.env['fleet.vehicle.cost']
+        for record in self:
+            record.odometer_count = Odometer.search_count([('vehicle_id', '=', self.id)])
+            record.fuel_logs_count = LogFuel.search_count([('vehicle_id', '=', self.id)])
+            record.service_count = LogService.search_count([('vehicle_id', '=', self.id)])
+            record.contract_count = LogContract.search_count([('vehicle_id', '=', self.id)])
+            record.cost_count = Cost.search_count([('vehicle_id', '=', self.id), ('parent_id', '=', False)])
+
+    @api.depends('log_contracts')
+    def _compute_contract_reminder(self):
+        for record in self:
             overdue = False
             due_soon = False
             total = 0
             name = ''
             for element in record.log_contracts:
                 if element.state in ('open', 'toclose') and element.expiration_date:
-                    current_date_str = fields.date.context_today(self, cr, uid, context=context)
+                    current_date_str = fields.Date.context_today(record)
                     due_time_str = element.expiration_date
-                    current_date = str_to_datetime(current_date_str)
-                    due_time = str_to_datetime(due_time_str)
-                    diff_time = (due_time-current_date).days
+                    current_date = fields.Date.from_string(current_date_str)
+                    due_time = fields.Date.from_string(due_time_str)
+                    diff_time = (due_time - current_date).days
                     if diff_time < 0:
                         overdue = True
                         total += 1
                     if diff_time < 15 and diff_time >= 0:
-                            due_soon = True;
+                            due_soon = True
                             total += 1
                     if overdue or due_soon:
-                        ids = self.pool.get('fleet.vehicle.log.contract').search(cr,uid,[('vehicle_id', '=', record.id), ('state', 'in', ('open', 'toclose'))], limit=1, order='expiration_date asc')
-                        if len(ids) > 0:
+                        log_contract = self.env['fleet.vehicle.log.contract'].search([('vehicle_id', '=', record.id), ('state', 'in', ('open', 'toclose'))],
+                            limit=1, order='expiration_date asc')
+                        if log_contract:
                             #we display only the name of the oldest overdue/due soon contract
-                            name=(self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, ids[0], context=context).cost_subtype_id.name)
+                            name = log_contract.cost_subtype_id.name
 
-            res[record.id] = {
-                'contract_renewal_overdue': overdue,
-                'contract_renewal_due_soon': due_soon,
-                'contract_renewal_total': (total - 1), #we remove 1 from the real total for display purposes
-                'contract_renewal_name': name,
-            }
-        return res
+            record.contract_renewal_overdue = overdue
+            record.contract_renewal_due_soon = due_soon
+            record.contract_renewal_total = total - 1  # we remove 1 from the real total for display purposes
+            record.contract_renewal_name = name
 
-    def _get_default_state(self, cr, uid, context):
-        try:
-            model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'vehicle_state_active')
-        except ValueError:
-            model_id = False
-        return model_id
-    
-    def _count_all(self, cr, uid, ids, field_name, arg, context=None):
-        Odometer = self.pool['fleet.vehicle.odometer']
-        LogFuel = self.pool['fleet.vehicle.log.fuel']
-        LogService = self.pool['fleet.vehicle.log.services']
-        LogContract = self.pool['fleet.vehicle.log.contract']
-        Cost = self.pool['fleet.vehicle.cost']
-        return {
-            vehicle_id: {
-                'odometer_count': Odometer.search_count(cr, uid, [('vehicle_id', '=', vehicle_id)], context=context),
-                'fuel_logs_count': LogFuel.search_count(cr, uid, [('vehicle_id', '=', vehicle_id)], context=context),
-                'service_count': LogService.search_count(cr, uid, [('vehicle_id', '=', vehicle_id)], context=context),
-                'contract_count': LogContract.search_count(cr, uid, [('vehicle_id', '=', vehicle_id)], context=context),
-                'cost_count': Cost.search_count(cr, uid, [('vehicle_id', '=', vehicle_id), ('parent_id', '=', False)], context=context)
-            }
-            for vehicle_id in ids
-        }
+    def _search_contract_renewal_due_soon(self, operator, value):
+        res = []
+        assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
+        if (operator == '=' and value is True) or (operator in ('<>', '!=') and value is False):
+            search_operator = 'in'
+        else:
+            search_operator = 'not in'
+        today = fields.Date.context_today(self)
+        datetime_today = fields.Datetime.from_string(today)
+        limit_date = fields.Datetime.to_string(datetime_today + relativedelta(days=+15))
+        self.env.cr.execute("""SELECT cost.vehicle_id,
+                        count(contract.id) AS contract_number
+                        FROM fleet_vehicle_cost cost
+                        LEFT JOIN fleet_vehicle_log_contract contract ON contract.cost_id = cost.id
+                        WHERE contract.expiration_date IS NOT NULL
+                          AND contract.expiration_date > %s
+                          AND contract.expiration_date < %s
+                          AND contract.state IN ('open', 'toclose')
+                        GROUP BY cost.vehicle_id""", (today, limit_date))
+        res_ids = [x[0] for x in self.env.cr.fetchall()]
+        res.append(('id', search_operator, res_ids))
+        return res
 
-    _name = 'fleet.vehicle'
-    _description = 'Information on a vehicle'
-    _order= 'license_plate asc'
-    _columns = {
-        'name': fields.function(_vehicle_name_get_fnc, type="char", string='Name', store=True),
-        'active': fields.boolean('Active'),
-        'company_id': fields.many2one('res.company', 'Company'),
-        'license_plate': fields.char('License Plate', required=True, help='License plate number of the vehicle (ie: 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', help='Driver of the vehicle'),
-        'model_id': fields.many2one('fleet.vehicle.model', 'Model', required=True, help='Model of the vehicle'),
-        'log_fuel': fields.one2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs'),
-        'log_services': fields.one2many('fleet.vehicle.log.services', 'vehicle_id', 'Services Logs'),
-        'log_contracts': fields.one2many('fleet.vehicle.log.contract', 'vehicle_id', 'Contracts'),
-        'cost_count': fields.function(_count_all, type='integer', string="Costs" , multi=True),
-        'contract_count': fields.function(_count_all, type='integer', string='Contracts', multi=True),
-        'service_count': fields.function(_count_all, type='integer', string='Services', multi=True),
-        'fuel_logs_count': fields.function(_count_all, type='integer', string='Fuel Logs', multi=True),
-        'odometer_count': fields.function(_count_all, type='integer', string='Odometer', multi=True),
-        'acquisition_date': fields.date('Acquisition Date', required=False, help='Date when the vehicle has been bought'),
-        'color': fields.char('Color', help='Color of the vehicle'),
-        'state_id': fields.many2one('fleet.vehicle.state', 'State', help='Current state of the vehicle', ondelete="set null"),
-        'location': fields.char('Location', help='Location of the vehicle (garage, ...)'),
-        'seats': fields.integer('Seats Number', help='Number of seats of the vehicle'),
-        'doors': fields.integer('Doors Number', help='Number of doors of the vehicle'),
-        'tag_ids' :fields.many2many('fleet.vehicle.tag', 'fleet_vehicle_vehicle_tag_rel', 'vehicle_tag_id','tag_id', 'Tags', copy=False),
-        'odometer': fields.function(_get_odometer, fnct_inv=_set_odometer, type='float', string='Last Odometer', help='Odometer measure of the vehicle at the moment of this log'),
-        'odometer_unit': fields.selection([('kilometers', 'Kilometers'),('miles','Miles')], 'Odometer Unit', help='Unit of the odometer ',required=True),
-        'transmission': fields.selection([('manual', 'Manual'), ('automatic', 'Automatic')], 'Transmission', help='Transmission Used by the vehicle'),
-        'fuel_type': fields.selection([('gasoline', 'Gasoline'), ('diesel', 'Diesel'), ('electric', 'Electric'), ('hybrid', 'Hybrid')], 'Fuel Type', help='Fuel Used by the vehicle'),
-        'horsepower': fields.integer('Horsepower'),
-        'horsepower_tax': fields.float('Horsepower Taxation'),
-        'power': fields.integer('Power', help='Power in kW of the vehicle'),
-        'co2': fields.float('CO2 Emissions', help='CO2 emissions of the vehicle'),
-        'image': fields.related('model_id', 'image', type="binary", string="Logo"),
-        'image_medium': fields.related('model_id', 'image_medium', type="binary", string="Logo (medium)"),
-        'image_small': fields.related('model_id', 'image_small', type="binary", string="Logo (small)"),
-        'contract_renewal_due_soon': fields.function(_get_contract_reminder_fnc, fnct_search=_search_contract_renewal_due_soon, type="boolean", string='Has Contracts to renew', multi='contract_info'),
-        'contract_renewal_overdue': fields.function(_get_contract_reminder_fnc, fnct_search=_search_get_overdue_contract_reminder, type="boolean", string='Has Contracts Overdue', multi='contract_info'),
-        'contract_renewal_name': fields.function(_get_contract_reminder_fnc, type="text", string='Name of contract to renew soon', multi='contract_info'),
-        'contract_renewal_total': fields.function(_get_contract_reminder_fnc, type="integer", string='Total of contracts due or overdue minus one', multi='contract_info'),
-        'car_value': fields.float('Car Value', help='Value of the bought vehicle'),
-        }
+    def _search_get_overdue_contract_reminder(self, operator, value):
+        res = []
+        assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
+        if (operator == '=' and value is True) or (operator in ('<>', '!=') and value is False):
+            search_operator = 'in'
+        else:
+            search_operator = 'not in'
+        today = fields.Date.context_today(self)
+        self.env.cr.execute('''SELECT cost.vehicle_id,
+                        count(contract.id) AS contract_number
+                        FROM fleet_vehicle_cost cost
+                        LEFT JOIN fleet_vehicle_log_contract contract ON contract.cost_id = cost.id
+                        WHERE contract.expiration_date IS NOT NULL
+                          AND contract.expiration_date < %s
+                          AND contract.state IN ('open', 'toclose')
+                        GROUP BY cost.vehicle_id ''', (today,))
+        res_ids = [x[0] for x in self.env.cr.fetchall()]
+        res.append(('id', search_operator, res_ids))
+        return res
 
-    _defaults = {
-        'active': True,
-        'doors': 5,
-        'odometer_unit': 'kilometers',
-        'state_id': _get_default_state,
-    }
-
-    def on_change_model(self, cr, uid, ids, model_id, context=None):
-        if not model_id:
-            return {}
-        model = self.pool.get('fleet.vehicle.model').browse(cr, uid, model_id, context=context)
-        return {
-            'value': {
-                'image_medium': model.image,
-            }
-        }
+    @api.onchange('model_id')
+    def _onchange_model(self):
+        if self.model_id:
+            self.image_medium = self.model_id.image
+        else:
+            self.image_medium = False
 
-    def create(self, cr, uid, data, context=None):
-        context = dict(context or {}, mail_create_nolog=True)
-        vehicle_id = super(fleet_vehicle, self).create(cr, uid, data, context=context)
-        vehicle = self.browse(cr, uid, vehicle_id, context=context)
-        self.message_post(cr, uid, [vehicle_id], body=_('%s %s has been added to the fleet!') % (vehicle.model_id.name,vehicle.license_plate), context=context)
-        return vehicle_id
+    @api.model
+    def create(self, data):
+        vehicle = super(FleetVehicle, self.with_context(mail_create_nolog=True)).create(data)
+        vehicle.message_post(body=_('%s %s has been added to the fleet!') % (vehicle.model_id.name, vehicle.license_plate))
+        return vehicle
 
-    def write(self, cr, uid, ids, vals, context=None):
+    @api.multi
+    def write(self, vals):
         """
         This function write an entry in the openchatter whenever we change important information
         on the vehicle like the model, the drive, the state of the vehicle or its license plate
         """
-        for vehicle in self.browse(cr, uid, ids, context):
+        for vehicle in self:
             changes = []
             if 'model_id' in vals and vehicle.model_id.id != vals['model_id']:
-                value = self.pool.get('fleet.vehicle.model').browse(cr,uid,vals['model_id'],context=context).name
+                value = self.env['fleet.vehicle.model'].browse(vals['model_id']).name
                 oldmodel = vehicle.model_id.name or _('None')
-                changes.append(_("Model: from '%s' to '%s'") %(oldmodel, value))
+                changes.append(_("Model: from '%s' to '%s'") % (oldmodel, value))
             if 'driver_id' in vals and vehicle.driver_id.id != vals['driver_id']:
-                value = self.pool.get('res.partner').browse(cr,uid,vals['driver_id'],context=context).name
+                value = self.env['res.partner'].browse(vals['driver_id']).name
                 olddriver = (vehicle.driver_id.name) or _('None')
-                changes.append(_("Driver: from '%s' to '%s'") %(olddriver, value))
+                changes.append(_("Driver: from '%s' to '%s'") % (olddriver, value))
             if 'state_id' in vals and vehicle.state_id.id != vals['state_id']:
-                value = self.pool.get('fleet.vehicle.state').browse(cr,uid,vals['state_id'],context=context).name
+                value = self.env['fleet.vehicle.state'].browse(vals['state_id']).name
                 oldstate = vehicle.state_id.name or _('None')
-                changes.append(_("State: from '%s' to '%s'") %(oldstate, value))
+                changes.append(_("State: from '%s' to '%s'") % (oldstate, value))
             if 'license_plate' in vals and vehicle.license_plate != vals['license_plate']:
                 old_license_plate = vehicle.license_plate or _('None')
-                changes.append(_("License Plate: from '%s' to '%s'") %(old_license_plate, vals['license_plate']))
+                changes.append(_("License Plate: from '%s' to '%s'") % (old_license_plate, vals['license_plate']))
 
             if len(changes) > 0:
-                self.message_post(cr, uid, [vehicle.id], body=", ".join(changes), context=context)
+                self.message_post(body=", ".join(changes))
 
-        vehicle_id = super(fleet_vehicle,self).write(cr, uid, ids, vals, context)
-        return True
+            return super(FleetVehicle, self).write(vals)
 
+    @api.multi
+    def return_action_to_open(self):
+        """ This opens the xml view specified in xml_id for the current vehicle """
+        self.ensure_one()
+        xml_id = self.env.context.get('xml_id')
+        if xml_id:
+            res = self.env['ir.actions.act_window'].for_xml_id('fleet', xml_id)
+            res.update(
+                context=dict(self.env.context, default_vehicle_id=self.id),
+                domain=[('vehicle_id', '=', self.id)]
+            )
+            return res
+        return False
 
-class fleet_vehicle_odometer(osv.Model):
-    _name='fleet.vehicle.odometer'
-    _description='Odometer log for a vehicle'
-    _order='date desc'
+    @api.multi
+    def act_show_log_cost(self):
+        """ This opens log view to view and add new log for this vehicle, groupby default to only show effective costs
+            @return: the costs log view
+        """
+        self.ensure_one()
+        res = self.env['ir.actions.act_window'].for_xml_id('fleet', 'fleet_vehicle_costs_action')
+        res.update(
+            context=dict(self.env.context, default_vehicle_id=self.id, search_default_parent_false=True),
+            domain=[('vehicle_id', '=', self.id)]
+        )
+        return res
 
-    def _vehicle_log_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
-        res = {}
-        for record in self.browse(cr, uid, ids, context=context):
+class FleetVehicleOdometer(models.Model):
+    _name = 'fleet.vehicle.odometer'
+    _description = 'Odometer log for a vehicle'
+    _order = 'date desc'
+
+    name = fields.Char(compute='_compute_vehicle_log_name', store=True)
+    date = fields.Date(default=fields.Date.context_today)
+    value = fields.Float('Odometer Value', group_operator="max")
+    vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', required=True)
+    unit = fields.Selection(related='vehicle_id.odometer_unit', string="Unit", readonly=True)
+
+    @api.depends('vehicle_id', 'date')
+    def _compute_vehicle_log_name(self):
+        for record in self:
             name = record.vehicle_id.name
             if not name:
                 name = record.date
             elif record.date:
-                name += ' / '+ record.date
-            res[record.id] = name
-        return res
+                name += ' / ' + record.date
+            self.name = name
 
-    def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
-        if not vehicle_id:
-            return {}
-        odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
-        return {
-            'value': {
-                'unit': odometer_unit,
-            }
-        }
+    @api.onchange('vehicle_id')
+    def _onchange_vehicle(self):
+        if self.vehicle_id:
+            self.unit = self.vehicle_id.odometer_unit
 
-    _columns = {
-        'name': fields.function(_vehicle_log_name_get_fnc, type="char", string='Name', store=True),
-        'date': fields.date('Date'),
-        'value': fields.float('Odometer Value', group_operator="max"),
-        'vehicle_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True),
-        'unit': fields.related('vehicle_id', 'odometer_unit', type="char", string="Unit", readonly=True),
-    }
-    _defaults = {
-        'date': fields.date.context_today,
-    }
-
-
-class fleet_vehicle_log_fuel(osv.Model):
-
-    def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
-        if not vehicle_id:
-            return {}
-        vehicle = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context)
-        odometer_unit = vehicle.odometer_unit
-        driver = vehicle.driver_id.id
-        return {
-            'value': {
-                'odometer_unit': odometer_unit,
-                'purchaser_id': driver,
-            }
-        }
+class FleetVehicleLogFuel(models.Model):
+    _name = 'fleet.vehicle.log.fuel'
+    _description = 'Fuel log for vehicles'
+    _inherits = {'fleet.vehicle.cost': 'cost_id'}
 
-    def on_change_liter(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
-        #need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
-        #make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
-        #liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
-        #of 3.0/2=1.5)
-        #If there is no change in the result, we return an empty dict to prevent an infinite loop due to the 3 intertwine
-        #onchange. And in order to verify that there is no change in the result, we have to limit the precision of the 
-        #computation to 2 decimal
-        liter = float(liter)
-        price_per_liter = float(price_per_liter)
-        amount = float(amount)
-        if liter > 0 and price_per_liter > 0 and round(liter*price_per_liter,2) != amount:
-            return {'value' : {'amount' : round(liter * price_per_liter,2),}}
-        elif amount > 0 and liter > 0 and round(amount/liter,2) != price_per_liter:
-            return {'value' : {'price_per_liter' : round(amount / liter,2),}}
-        elif amount > 0 and price_per_liter > 0 and round(amount/price_per_liter,2) != liter:
-            return {'value' : {'liter' : round(amount / price_per_liter,2),}}
-        else :
-            return {}
-
-    def on_change_price_per_liter(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
-        #need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
-        #make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
-        #liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
-        #of 3.0/2=1.5)
-        #If there is no change in the result, we return an empty dict to prevent an infinite loop due to the 3 intertwine
-        #onchange. And in order to verify that there is no change in the result, we have to limit the precision of the 
-        #computation to 2 decimal
-        liter = float(liter)
-        price_per_liter = float(price_per_liter)
-        amount = float(amount)
-        if liter > 0 and price_per_liter > 0 and round(liter*price_per_liter,2) != amount:
-            return {'value' : {'amount' : round(liter * price_per_liter,2),}}
-        elif amount > 0 and price_per_liter > 0 and round(amount/price_per_liter,2) != liter:
-            return {'value' : {'liter' : round(amount / price_per_liter,2),}}
-        elif amount > 0 and liter > 0 and round(amount/liter,2) != price_per_liter:
-            return {'value' : {'price_per_liter' : round(amount / liter,2),}}
-        else :
-            return {}
-
-    def on_change_amount(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
+    @api.model
+    def default_get(self, default_fields):
+        res = super(FleetVehicleLogFuel, self).default_get(default_fields)
+        service = self.env.ref('fleet.type_service_refueling', raise_if_not_found=False)
+        res.update({
+            'date': fields.Date.context_today(self),
+            'cost_subtype_id': service and service.id or False,
+            'cost_type': 'fuel'
+        })
+        return res
+
+    liter = fields.Float()
+    price_per_liter = fields.Float()
+    purchaser_id = fields.Many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]")
+    inv_ref = fields.Char('Invoice Reference', size=64)
+    vendor_id = fields.Many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]")
+    notes = fields.Text()
+    cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
+    cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True)  # we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
+
+    @api.onchange('vehicle_id')
+    def _onchange_vehicle(self):
+        if self.vehicle_id:
+            self.odometer_unit = self.vehicle_id.odometer_unit
+            self.purchaser_id = self.vehicle_id.driver_id.id
+
+    @api.onchange('liter', 'price_per_liter', 'amount')
+    def _onchange_liter_price_amount(self):
         #need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
         #make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
         #liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
         #of 3.0/2=1.5)
         #If there is no change in the result, we return an empty dict to prevent an infinite loop due to the 3 intertwine
-        #onchange. And in order to verify that there is no change in the result, we have to limit the precision of the 
+        #onchange. And in order to verify that there is no change in the result, we have to limit the precision of the
         #computation to 2 decimal
-        liter = float(liter)
-        price_per_liter = float(price_per_liter)
-        amount = float(amount)
-        if amount > 0 and liter > 0 and round(amount/liter,2) != price_per_liter:
-            return {'value': {'price_per_liter': round(amount / liter,2),}}
-        elif amount > 0 and price_per_liter > 0 and round(amount/price_per_liter,2) != liter:
-            return {'value': {'liter': round(amount / price_per_liter,2),}}
-        elif liter > 0 and price_per_liter > 0 and round(liter*price_per_liter,2) != amount:
-            return {'value': {'amount': round(liter * price_per_liter,2),}}
-        else :
-            return {}
-
-    def _get_default_service_type(self, cr, uid, context):
-        try:
-            model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_service_refueling')
-        except ValueError:
-            model_id = False
-        return model_id
-
-    _name = 'fleet.vehicle.log.fuel'
-    _description = 'Fuel log for vehicles'
+        liter = float(self.liter)
+        price_per_liter = float(self.price_per_liter)
+        amount = float(self.amount)
+        if liter > 0 and price_per_liter > 0 and round(liter * price_per_liter, 2) != amount:
+            self.amount = round(liter * price_per_liter, 2)
+        elif amount > 0 and liter > 0 and round(amount / liter, 2) != price_per_liter:
+            self.price_per_liter = round(amount / liter, 2)
+        elif amount > 0 and price_per_liter > 0 and round(amount / price_per_liter, 2) != liter:
+            self.liter = round(amount / price_per_liter, 2)
+
+class FleetVehicleLogServices(models.Model):
+    _name = 'fleet.vehicle.log.services'
     _inherits = {'fleet.vehicle.cost': 'cost_id'}
+    _description = 'Services for vehicles'
 
-    _columns = {
-        'liter': fields.float('Liter'),
-        'price_per_liter': fields.float('Price Per Liter'),
-        'purchaser_id': fields.many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]"),
-        'inv_ref': fields.char('Invoice Reference', size=64),
-        'vendor_id': fields.many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]"),
-        'notes': fields.text('Notes'),
-        'cost_id': fields.many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade'),
-        'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
-    }
-    _defaults = {
-        'date': fields.date.context_today,
-        'cost_subtype_id': _get_default_service_type,
-        'cost_type': 'fuel',
-    }
-
-
-class fleet_vehicle_log_services(osv.Model):
-
-    def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
-        if not vehicle_id:
-            return {}
-        vehicle = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context)
-        odometer_unit = vehicle.odometer_unit
-        driver = vehicle.driver_id.id
-        return {
-            'value': {
-                'odometer_unit': odometer_unit,
-                'purchaser_id': driver,
-            }
-        }
-
-    def _get_default_service_type(self, cr, uid, context):
-        try:
-            model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_service_service_8')
-        except ValueError:
-            model_id = False
-        return model_id
+    @api.model
+    def default_get(self, default_fields):
+        res = super(FleetVehicleLogServices, self).default_get(default_fields)
+        service = self.env.ref('fleet.type_service_service_8', raise_if_not_found=False)
+        res.update({
+            'date': fields.Date.context_today(self),
+            'cost_subtype_id': service and service.id or False,
+            'cost_type': 'services'
+        })
+        return res
 
-    _inherits = {'fleet.vehicle.cost': 'cost_id'}
-    _name = 'fleet.vehicle.log.services'
-    _description = 'Services for vehicles'
-    _columns = {
-        'purchaser_id': fields.many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]"),
-        'inv_ref': fields.char('Invoice Reference'),
-        'vendor_id': fields.many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]"),
-        'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
-        'notes': fields.text('Notes'),
-        'cost_id': fields.many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade'),
-    }
-    _defaults = {
-        'date': fields.date.context_today,
-        'cost_subtype_id': _get_default_service_type,
-        'cost_type': 'services'
-    }
-
-
-class fleet_service_type(osv.Model):
+    purchaser_id = fields.Many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]")
+    inv_ref = fields.Char('Invoice Reference')
+    vendor_id = fields.Many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]")
+    # we need to keep this field as a related with store=True because the graph view doesn't support
+    # (1) to address fields from inherited table and (2) fields that aren't stored in database
+    cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True)
+    notes = fields.Text()
+    cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
+
+    @api.onchange('vehicle_id')
+    def _onchange_vehicle(self):
+        if self.vehicle_id:
+            self.odometer_unit = self.vehicle_id.odometer_unit
+            self.purchaser_id = self.vehicle_id.driver_id.id
+
+class FleetServiceType(models.Model):
     _name = 'fleet.service.type'
     _description = 'Type of services available on a vehicle'
-    _columns = {
-        'name': fields.char('Name', required=True, translate=True),
-        'category': fields.selection([('contract', 'Contract'), ('service', 'Service'), ('both', 'Both')], 'Category', required=True, help='Choose wheter the service refer to contracts, vehicle services or both'),
-    }
 
+    name = fields.Char(required=True, translate=True)
+    category = fields.Selection([('contract', 'Contract'), ('service', 'Service'), ('both', 'Both')], 'Category',
+        required=True, help='Choose wheter the service refer to contracts, vehicle services or both')
+
+class FleetVehicleLogContract(models.Model):
+
+    _inherits = {'fleet.vehicle.cost': 'cost_id'}
+    _name = 'fleet.vehicle.log.contract'
+    _description = 'Contract information on a vehicle'
+    _order = 'state desc,expiration_date'
+
+    def compute_next_year_date(self, strdate):
+        oneyear = relativedelta(years=1)
+        start_date = fields.Date.from_string(strdate)
+        return fields.Date.to_string(start_date + oneyear)
+
+    @api.model
+    def default_get(self, default_fields):
+        res = super(FleetVehicleLogContract, self).default_get(default_fields)
+        contract = self.env.ref('fleet.type_contract_leasing', raise_if_not_found=False)
+        res.update({
+            'date': fields.Date.context_today(self),
+            'cost_subtype_id': contract and contract.id or False,
+            'cost_type': 'contract'
+        })
+        return res
+
+    name = fields.Text(compute='_compute_contract_name', store=True)
+    active = fields.Boolean(default=True)
+    start_date = fields.Date('Contract Start Date', default=fields.Date.context_today, help='Date when the coverage of the contract begins')
+    expiration_date = fields.Date('Contract Expiration Date', default=lambda self: self.compute_next_year_date(fields.Date.context_today(self)),
+        help='Date when the coverage of the contract expirates (by default, one year after begin date)')
+    days_left = fields.Integer(compute='_compute_days_left', string='Warning Date')
+    insurer_id = fields.Many2one('res.partner', 'Vendor')
+    purchaser_id = fields.Many2one('res.partner', 'Contractor', default=lambda self: self.env.user.partner_id.id, help='Person to which the contract is signed for')
+    ins_ref = fields.Char('Contract Reference', size=64, copy=False)
+    state = fields.Selection([('open', 'In Progress'), ('toclose', 'To Close'), ('closed', 'Terminated')],
+                              'Status', default='open', readonly=True, help='Choose wheter the contract is still valid or not',
+                              copy=False)
+    notes = fields.Text('Terms and Conditions', help='Write here all supplementary information relative to this contract', copy=False)
+    cost_generated = fields.Float('Recurring Cost Amount', help="Costs paid at regular intervals, depending on the cost frequency."
+        "If the cost frequency is set to unique, the cost will be logged at the start date")
+    cost_frequency = fields.Selection([('no', 'No'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')], 'Recurring Cost Frequency',
+        default='no', help='Frequency of the recuring cost', required=True)
+    generated_cost_ids = fields.One2many('fleet.vehicle.cost', 'contract_id', 'Generated Costs')
+    sum_cost = fields.Float(compute='_compute_sum_cost', string='Indicative Costs Total')
+    cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
+    cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True)  # we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
+
+    @api.depends('vehicle_id', 'cost_subtype_id', 'date')
+    def _compute_contract_name(self):
+        for record in self:
+            name = record.vehicle_id.name
+            if record.cost_subtype_id.name:
+                name += ' / ' + record.cost_subtype_id.name
+            if record.date:
+                name += ' / ' + record.date
+            record.name = name
 
-class fleet_vehicle_log_contract(osv.Model):
+    @api.depends('expiration_date', 'state')
+    def _compute_days_left(self):
+        """return a dict with as value for each contract an integer
+        if contract is in an open state and is overdue, return 0
+        if contract is in a closed state, return -1
+        otherwise return the number of days before the contract expires
+        """
+        for record in self:
+            if (record.expiration_date and (record.state == 'open' or record.state == 'toclose')):
+                today = fields.Date.from_string(fields.Date.today())
+                renew_date = fields.Date.from_string(record.expiration_date)
+                diff_time = (renew_date - today).days
+                record.days_left = diff_time > 0 and diff_time or 0
+            else:
+                record.days_left = -1
+
+    @api.depends('cost_ids.amount')
+    def _compute_sum_cost(self):
+        for contract in self:
+            contract.sum_cost = sum(contract.cost_ids.mapped('amount'))
+
+    @api.onchange('vehicle_id')
+    def _onchange_vehicle(self):
+        if self.vehicle_id:
+            self.odometer_unit = self.vehicle_id.odometer_unit
+
+    @api.multi
+    def contract_close(self):
+        for record in self:
+            record.state = 'closed'
+
+    @api.multi
+    def contract_open(self):
+        for record in self:
+            record.state = 'open'
+
+    @api.multi
+    def act_renew_contract(self):
+        assert len(self.ids) == 1, "This operation should only be done for 1 single contract at a time, as it it suppose to open a window as result"
+        for element in self:
+            #compute end date
+            startdate = fields.Date.from_string(element.start_date)
+            enddate = fields.Date.from_string(element.expiration_date)
+            diffdate = (enddate - startdate)
+            default = {
+                'date': fields.Date.context_today(self),
+                'start_date': fields.Date.to_string(fields.Date.from_string(element.expiration_date) + relativedelta(days=1)),
+                'expiration_date': fields.Date.to_string(enddate + diffdate),
+            }
+            newid = element.copy(default).id
+        return {
+            'name': _("Renew Contract"),
+            'view_mode': 'form',
+            'view_id': self.env.ref('fleet.fleet_vehicle_log_contract_view_form').id,
+            'view_type': 'tree,form',
+            'res_model': 'fleet.vehicle.log.contract',
+            'type': 'ir.actions.act_window',
+            'domain': '[]',
+            'res_id': newid,
+            'context': {'active_id': newid},
+        }
 
-    def scheduler_manage_auto_costs(self, cr, uid, context=None):
+    @api.model
+    def scheduler_manage_auto_costs(self):
         #This method is called by a cron task
         #It creates costs for contracts having the "recurring cost" field setted, depending on their frequency
         #For example, if a contract has a reccuring cost of 200 with a weekly frequency, this method creates a cost of 200 on the first day of each week, from the date of the last recurring costs in the database to today
         #If the contract has not yet any recurring costs in the database, the method generates the recurring costs from the start_date to today
         #The created costs are associated to a contract thanks to the many2one field contract_id
         #If the contract has no start_date, no cost will be created, even if the contract has recurring costs
-        vehicle_cost_obj = self.pool.get('fleet.vehicle.cost')
-        d = datetime.datetime.strptime(fields.date.context_today(self, cr, uid, context=context), tools.DEFAULT_SERVER_DATE_FORMAT).date()
-        contract_ids = self.pool.get('fleet.vehicle.log.contract').search(cr, uid, [('state','!=','closed')], offset=0, limit=None, order=None,context=None, count=False)
+        VehicleCost = self.env['fleet.vehicle.cost']
         deltas = {'yearly': relativedelta(years=+1), 'monthly': relativedelta(months=+1), 'weekly': relativedelta(weeks=+1), 'daily': relativedelta(days=+1)}
-        for contract in self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, contract_ids, context=context):
+        contracts = self.env['fleet.vehicle.log.contract'].search([('state', '!=', 'closed')], offset=0, limit=None, order=None)
+        for contract in contracts:
             if not contract.start_date or contract.cost_frequency == 'no':
                 continue
             found = False
             last_cost_date = contract.start_date
             if contract.generated_cost_ids:
-                last_autogenerated_cost_id = vehicle_cost_obj.search(cr, uid, ['&', ('contract_id','=',contract.id), ('auto_generated','=',True)], offset=0, limit=1, order='date desc',context=context, count=False)
-                if last_autogenerated_cost_id:
+                last_autogenerated_cost = VehicleCost.search([('contract_id', '=', contract.id), ('auto_generated', '=', True)], offset=0, limit=1, order='date desc')
+                if last_autogenerated_cost:
                     found = True
-                    last_cost_date = vehicle_cost_obj.browse(cr, uid, last_autogenerated_cost_id[0], context=context).date
-            startdate = datetime.datetime.strptime(last_cost_date, tools.DEFAULT_SERVER_DATE_FORMAT).date()
+                    last_cost_date = last_autogenerated_cost.date
+            startdate = fields.Date.from_string(last_cost_date)
             if found:
                 startdate += deltas.get(contract.cost_frequency)
-            while (startdate <= d) & (startdate <= datetime.datetime.strptime(contract.expiration_date, tools.DEFAULT_SERVER_DATE_FORMAT).date()):
+            today = fields.Date.from_string(fields.Date.context_today(self))
+            while (startdate <= today) & (startdate <= fields.Date.from_string(contract.expiration_date)):
                 data = {
                     'amount': contract.cost_generated,
-                    'date': startdate.strftime(tools.DEFAULT_SERVER_DATE_FORMAT),
+                    'date': fields.Date.context_today(self),
                     'vehicle_id': contract.vehicle_id.id,
                     'cost_subtype_id': contract.cost_subtype_id.id,
                     'contract_id': contract.id,
                     'auto_generated': True
                 }
-                cost_id = self.pool.get('fleet.vehicle.cost').create(cr, uid, data, context=context)
+                self.env['fleet.vehicle.cost'].create(data)
                 startdate += deltas.get(contract.cost_frequency)
         return True
 
-    def scheduler_manage_contract_expiration(self, cr, uid, context=None):
+    @api.model
+    def scheduler_manage_contract_expiration(self):
         #This method is called by a cron task
         #It manages the state of a contract, possibly by posting a message on the vehicle concerned and updating its status
-        datetime_today = datetime.datetime.strptime(fields.date.context_today(self, cr, uid, context=context), tools.DEFAULT_SERVER_DATE_FORMAT)
-        limit_date = (datetime_today + relativedelta(days=+15)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
-        ids = self.search(cr, uid, ['&', ('state', '=', 'open'), ('expiration_date', '<', limit_date)], offset=0, limit=None, order=None, context=context, count=False)
+        date_today = fields.Date.from_string(fields.Date.context_today(self))
+        limit_date = fields.Date.to_string(date_today + relativedelta(days=+15))
+        contracts = self.search([('state', '=', 'open'), ('expiration_date', '<', limit_date)])
         res = {}
-        for contract in self.browse(cr, uid, ids, context=context):
+        for contract in contracts:
             if contract.vehicle_id.id in res:
                 res[contract.vehicle_id.id] += 1
             else:
                 res[contract.vehicle_id.id] = 1
 
+        Vehicle = self.env['fleet.vehicle']
         for vehicle, value in res.items():
-            self.pool.get('fleet.vehicle').message_post(cr, uid, vehicle, body=_('%s contract(s) need(s) to be renewed and/or closed!') % (str(value)), context=context)
-        return self.write(cr, uid, ids, {'state': 'toclose'}, context=context)
-
-    def run_scheduler(self, cr, uid, context=None):
-        self.scheduler_manage_auto_costs(cr, uid, context=context)
-        self.scheduler_manage_contract_expiration(cr, uid, context=context)
-        return True
-
-    def _vehicle_contract_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
-        res = {}
-        for record in self.browse(cr, uid, ids, context=context):
-            name = record.vehicle_id.name
-            if record.cost_subtype_id.name:
-                name += ' / '+ record.cost_subtype_id.name
-            if record.date:
-                name += ' / '+ record.date
-            res[record.id] = name
-        return res
-
-    def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
-        if not vehicle_id:
-            return {}
-        odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
-        return {
-            'value': {
-                'odometer_unit': odometer_unit,
-            }
-        }
-
-    def compute_next_year_date(self, strdate):
-        oneyear = datetime.timedelta(days=365)
-        curdate = str_to_datetime(strdate)
-        return datetime.datetime.strftime(curdate + oneyear, tools.DEFAULT_SERVER_DATE_FORMAT)
-
-    def on_change_start_date(self, cr, uid, ids, strdate, enddate, context=None):
-        if (strdate):
-            return {'value': {'expiration_date': self.compute_next_year_date(strdate),}}
-        return {}
-
-    def get_days_left(self, cr, uid, ids, prop, unknow_none, context=None):
-        """return a dict with as value for each contract an integer
-        if contract is in an open state and is overdue, return 0
-        if contract is in a closed state, return -1
-        otherwise return the number of days before the contract expires
-        """
-        res = {}
-        for record in self.browse(cr, uid, ids, context=context):
-            if (record.expiration_date and (record.state == 'open' or record.state == 'toclose')):
-                today = str_to_datetime(time.strftime(tools.DEFAULT_SERVER_DATE_FORMAT))
-                renew_date = str_to_datetime(record.expiration_date)
-                diff_time = (renew_date-today).days
-                res[record.id] = diff_time > 0 and diff_time or 0
-            else:
-                res[record.id] = -1
-        return res
-
-    def act_renew_contract(self, cr, uid, ids, context=None):
-        assert len(ids) == 1, "This operation should only be done for 1 single contract at a time, as it it suppose to open a window as result"
-        for element in self.browse(cr, uid, ids, context=context):
-            #compute end date
-            startdate = str_to_datetime(element.start_date)
-            enddate = str_to_datetime(element.expiration_date)
-            diffdate = (enddate - startdate)
-            default = {
-                'date': fields.date.context_today(self, cr, uid, context=context),
-                'start_date': datetime.datetime.strftime(str_to_datetime(element.expiration_date) + datetime.timedelta(days=1), tools.DEFAULT_SERVER_DATE_FORMAT),
-                'expiration_date': datetime.datetime.strftime(enddate + diffdate, tools.DEFAULT_SERVER_DATE_FORMAT),
-            }
-            newid = super(fleet_vehicle_log_contract, self).copy(cr, uid, element.id, default, context=context)
-        mod, modid = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'fleet_vehicle_log_contract_form')
-        return {
-            'name':_("Renew Contract"),
-            'view_mode': 'form',
-            'view_id': modid,
-            'view_type': 'tree,form',
-            'res_model': 'fleet.vehicle.log.contract',
-            'type': 'ir.actions.act_window',
-            'domain': '[]',
-            'res_id': newid,
-            'context': {'active_id':newid}, 
-        }
-
-    def _get_default_contract_type(self, cr, uid, context=None):
-        try:
-            model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_contract_leasing')
-        except ValueError:
-            model_id = False
-        return model_id
-
-    def on_change_indic_cost(self, cr, uid, ids, cost_ids, context=None):
-        totalsum = 0.0
-        for element in cost_ids:
-            if element and len(element) == 3 and isinstance(element[2], dict):
-                totalsum += element[2].get('amount', 0.0)
-        return {
-            'value': {
-                'sum_cost': totalsum,
-            }
-        }
+            Vehicle.browse(vehicle).message_post(body=_('%s contract(s) need(s) to be renewed and/or closed!') % value)
+        return contracts.write({'state': 'toclose'})
 
-    def _get_sum_cost(self, cr, uid, ids, field_name, arg, context=None):
-        res = {}
-        for contract in self.browse(cr, uid, ids, context=context):
-            totalsum = 0
-            for cost in contract.cost_ids:
-                totalsum += cost.amount
-            res[contract.id] = totalsum
-        return res
+    @api.model
+    def run_scheduler(self):
+        self.scheduler_manage_auto_costs()
+        self.scheduler_manage_contract_expiration()
 
-    _inherits = {'fleet.vehicle.cost': 'cost_id'}
-    _name = 'fleet.vehicle.log.contract'
-    _description = 'Contract information on a vehicle'
-    _order='state desc,expiration_date'
-    _columns = {
-        'name': fields.function(_vehicle_contract_name_get_fnc, type="text", string='Name', store=True),
-        'active': fields.boolean('Active'),
-        'start_date': fields.date('Contract Start Date', help='Date when the coverage of the contract begins'),
-        'expiration_date': fields.date('Contract Expiration Date', help='Date when the coverage of the contract expirates (by default, one year after begin date)'),
-        'days_left': fields.function(get_days_left, type='integer', string='Warning Date'),
-        'insurer_id' :fields.many2one('res.partner', 'Vendor'),
-        'purchaser_id': fields.many2one('res.partner', 'Contractor', help='Person to which the contract is signed for'),
-        'ins_ref': fields.char('Contract Reference', size=64, copy=False),
-        'state': fields.selection([('open', 'In Progress'), ('toclose','To Close'), ('closed', 'Terminated')],
-                                  'Status', readonly=True, help='Choose wheter the contract is still valid or not',
-                                  copy=False),
-        'notes': fields.text('Terms and Conditions', help='Write here all supplementary information relative to this contract', copy=False),
-        'cost_generated': fields.float('Recurring Cost Amount', help="Costs paid at regular intervals, depending on the cost frequency. If the cost frequency is set to unique, the cost will be logged at the start date"),
-        'cost_frequency': fields.selection([('no','No'), ('daily', 'Daily'), ('weekly','Weekly'), ('monthly','Monthly'), ('yearly','Yearly')], 'Recurring Cost Frequency', help='Frequency of the recuring cost', required=True),
-        'generated_cost_ids': fields.one2many('fleet.vehicle.cost', 'contract_id', 'Generated Costs'),
-        'sum_cost': fields.function(_get_sum_cost, type='float', string='Indicative Costs Total'),
-        'cost_id': fields.many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade'),
-        'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
-    }
-    _defaults = {
-        'active': True,
-        'purchaser_id': lambda self, cr, uid, ctx: self.pool.get('res.users').browse(cr, uid, uid, context=ctx).partner_id.id or False,
-        'date': fields.date.context_today,
-        'start_date': fields.date.context_today,
-        'state':'open',
-        'expiration_date': lambda self, cr, uid, ctx: self.compute_next_year_date(fields.date.context_today(self, cr, uid, context=ctx)),
-        'cost_frequency': 'no',
-        'cost_subtype_id': _get_default_contract_type,
-        'cost_type': 'contract',
-    }
-
-    def contract_close(self, cr, uid, ids, context=None):
-        return self.write(cr, uid, ids, {'state': 'closed'}, context=context)
-
-    def contract_open(self, cr, uid, ids, context=None):
-        return self.write(cr, uid, ids, {'state': 'open'}, context=context)
-
-class fleet_contract_state(osv.Model):
+class FleetContractState(models.Model):
     _name = 'fleet.contract.state'
     _description = 'Contains the different possible status of a leasing contract'
 
-    _columns = {
-        'name':fields.char('Contract Status', required=True),
-    }
+    name = fields.Char('Contract Status', required=True)
diff --git a/addons/fleet/security/fleet_security.xml b/addons/fleet/security/fleet_security.xml
index 190a85729a45..3b3ea7f5b3fb 100644
--- a/addons/fleet/security/fleet_security.xml
+++ b/addons/fleet/security/fleet_security.xml
@@ -1,116 +1,113 @@
 <?xml version="1.0" ?>
-<openerp>
-    <data noupdate="0">
-        <record model="ir.module.category" id="module_fleet_category">
+<odoo>
+        <record id="module_fleet_category" model="ir.module.category">
             <field name="name">Fleet</field>
             <field name="sequence">17</field>
         </record>
-        <record id="group_fleet_user" model="res.groups">
+        <record id="fleet_group_user" model="res.groups">
             <field name="name">User</field>
             <field name="category_id" ref="module_fleet_category"/>
         </record>
-        <record id="group_fleet_manager" model="res.groups">
+        <record id="fleet_group_manager" model="res.groups">
             <field name="name">Manager</field>
-            <field name="implied_ids" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="implied_ids" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="category_id" ref="module_fleet_category"/>
             <field name="users" eval="[(4, ref('base.user_root'))]"/>
         </record>
         <record id="base.default_user" model="res.users">
-            <field name="groups_id" eval="[(4,ref('fleet.group_fleet_manager'))]"/>
+            <field name="groups_id" eval="[(4,ref('fleet.fleet_group_manager'))]"/>
         </record>
-    </data>
 
     <data noupdate="1">
-        <record id="fleet_user_contract_visibility" model="ir.rule">
+        <record id="fleet_rule_contract_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her contracts</field>
             <field name="model_id" ref="model_fleet_vehicle_log_contract"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="False"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_unlink" eval="False"/>
             <field name="domain_force">[('cost_id.vehicle_id.driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_cost_visibility" model="ir.rule">
+        <record id="fleet_rule_cost_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her costs</field>
             <field name="model_id" ref="model_fleet_vehicle_cost"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="True"/>
             <field name="perm_create" eval="True"/>
             <field name="perm_unlink" eval="False"/>
             <field name="domain_force">[('vehicle_id.driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_service_visibility" model="ir.rule">
+        <record id="fleet_rule_service_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her vehicle's services</field>
             <field name="model_id" ref="model_fleet_vehicle_log_services"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="False"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_unlink" eval="False"/>
             <field name="domain_force">[('cost_id.vehicle_id.driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_odometer_visibility" model="ir.rule">
+        <record id="fleet_rule_odometer_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her vehicle's odometer</field>
             <field name="model_id" ref="model_fleet_vehicle_odometer"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="True"/>
             <field name="perm_create" eval="True"/>
             <field name="perm_unlink" eval="True"/>
             <field name="domain_force">[('vehicle_id.driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_fuel_log_visibility" model="ir.rule">
+        <record id="fleet_rule_fuel_log_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her vehicle's fuel log</field>
             <field name="model_id" ref="model_fleet_vehicle_log_fuel"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="True"/>
             <field name="perm_create" eval="True"/>
             <field name="perm_unlink" eval="True"/>
             <field name="domain_force">[('cost_id.vehicle_id.driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_vehicle_visibility" model="ir.rule">
+        <record id="fleet_rule_vehicle_visibility_user" model="ir.rule">
             <field name="name">User can only see his/her vehicle</field>
             <field name="model_id" ref="model_fleet_vehicle"/>
-            <field name="groups" eval="[(4, ref('group_fleet_user'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_user'))]"/>
             <field name="perm_read" eval="True"/>
             <field name="perm_write" eval="True"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_unlink" eval="False"/>
             <field name="domain_force">[('driver_id','=',user.partner_id.id)]</field>
         </record>
-        <record id="fleet_user_contract_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_contract_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle's contracts</field>
             <field name="model_id" ref="model_fleet_vehicle_log_contract"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-        <record id="fleet_user_cost_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_cost_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle's costs</field>
             <field name="model_id" ref="model_fleet_vehicle_cost"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-        <record id="fleet_user_service_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_service_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle's services</field>
             <field name="model_id" ref="model_fleet_vehicle_log_services"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-        <record id="fleet_user_odometer_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_odometer_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle's vehicle's odometer</field>
             <field name="model_id" ref="model_fleet_vehicle_odometer"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-        <record id="fleet_user_fuel_log_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_fuel_log_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle's fuel log</field>
             <field name="model_id" ref="model_fleet_vehicle_log_fuel"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-        <record id="fleet_user_vehicle_visibility_manager" model="ir.rule">
+        <record id="fleet_rule_vehicle_visibility_manager" model="ir.rule">
             <field name="name">Manager has all rights on vehicle</field>
             <field name="model_id" ref="model_fleet_vehicle"/>
-            <field name="groups" eval="[(4, ref('group_fleet_manager'))]"/>
+            <field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
         </record>
-
     </data>
-</openerp>
+</odoo>
diff --git a/addons/fleet/security/ir.model.access.csv b/addons/fleet/security/ir.model.access.csv
index ecb8ec307b4c..e3f410928d33 100644
--- a/addons/fleet/security/ir.model.access.csv
+++ b/addons/fleet/security/ir.model.access.csv
@@ -1,23 +1,23 @@
 id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
-fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,model_fleet_vehicle_model,group_fleet_user,1,0,0,0
-fleet_vehicle_tag_access_right_user,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,group_fleet_user,1,0,0,0
-fleet_vehicle_state_access_right_user,fleet_vehicle_state_access_right,model_fleet_vehicle_state,group_fleet_user,1,0,0,0
-fleet_vehicle_model_brand_access_right_user,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,group_fleet_user,1,0,0,0
-fleet_vehicle_access_right_user,fleet_vehicle_access_right",model_fleet_vehicle,group_fleet_user,1,1,0,0
-fleet_vehicle_log_services_access_right_user,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,group_fleet_user,1,0,0,0
-fleet_vehicle_log_contract_access_right_user,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,group_fleet_user,1,0,0,0
-fleet_service_type_access_right_user,fleet_service_type_access_right,model_fleet_service_type,group_fleet_user,1,0,0,0
-access_fleet_vehicle_cost_user,access_fleet_vehicle_cost,model_fleet_vehicle_cost,group_fleet_user,1,1,1,0
-access_fleet_contract_state_user,access_fleet_contract_state,model_fleet_contract_state,group_fleet_user,1,0,0,0
-fleet_vehicle_model_access_right,fleet_vehicle_model_access_right,model_fleet_vehicle_model,group_fleet_manager,1,1,1,1
-fleet_vehicle_tag_access_right,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,group_fleet_manager,1,1,1,1
-fleet_vehicle_state_access_right,fleet_vehicle_state_access_right,model_fleet_vehicle_state,group_fleet_manager,1,1,1,1
-fleet_vehicle_odometer_access_right,fleet_vehicle_odometer_access_right,model_fleet_vehicle_odometer,group_fleet_user,1,1,1,1
-fleet_vehicle_model_brand_access_right,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,group_fleet_manager,1,1,1,1
-fleet_vehicle_access_right,fleet_vehicle_access_right,model_fleet_vehicle,group_fleet_manager,1,1,1,1
-fleet_vehicle_log_fuel_access_right,fleet_vehicle_log_fuel_access_right,model_fleet_vehicle_log_fuel,group_fleet_user,1,1,1,1
-fleet_vehicle_log_services_access_right,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,group_fleet_manager,1,1,1,1
-fleet_vehicle_log_contract_access_right,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,group_fleet_manager,1,1,1,1
-fleet_service_type_access_right,fleet_service_type_access_right,model_fleet_service_type,group_fleet_manager,1,1,1,1
-access_fleet_vehicle_cost,access_fleet_vehicle_cost,model_fleet_vehicle_cost,group_fleet_manager,1,1,1,1
-access_fleet_contract_state,access_fleet_contract_state,model_fleet_contract_state,group_fleet_manager,1,1,1,1
\ No newline at end of file
+fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,model_fleet_vehicle_model,fleet_group_user,1,0,0,0
+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_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
+access_fleet_vehicle_cost_user,access_fleet_vehicle_cost,model_fleet_vehicle_cost,fleet_group_user,1,1,1,0
+access_fleet_contract_state_user,access_fleet_contract_state,model_fleet_contract_state,fleet_group_user,1,0,0,0
+fleet_vehicle_model_access_right,fleet_vehicle_model_access_right,model_fleet_vehicle_model,fleet_group_manager,1,1,1,1
+fleet_vehicle_tag_access_right,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,fleet_group_manager,1,1,1,1
+fleet_vehicle_state_access_right,fleet_vehicle_state_access_right,model_fleet_vehicle_state,fleet_group_manager,1,1,1,1
+fleet_vehicle_odometer_access_right,fleet_vehicle_odometer_access_right,model_fleet_vehicle_odometer,fleet_group_user,1,1,1,1
+fleet_vehicle_model_brand_access_right,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,fleet_group_manager,1,1,1,1
+fleet_vehicle_access_right,fleet_vehicle_access_right,model_fleet_vehicle,fleet_group_manager,1,1,1,1
+fleet_vehicle_log_fuel_access_right,fleet_vehicle_log_fuel_access_right,model_fleet_vehicle_log_fuel,fleet_group_user,1,1,1,1
+fleet_vehicle_log_services_access_right,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,fleet_group_manager,1,1,1,1
+fleet_vehicle_log_contract_access_right,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,fleet_group_manager,1,1,1,1
+fleet_service_type_access_right,fleet_service_type_access_right,model_fleet_service_type,fleet_group_manager,1,1,1,1
+access_fleet_vehicle_cost,access_fleet_vehicle_cost,model_fleet_vehicle_cost,fleet_group_manager,1,1,1,1
+access_fleet_contract_state,access_fleet_contract_state,model_fleet_contract_state,fleet_group_manager,1,1,1,1
\ No newline at end of file
diff --git a/addons/fleet/views/fleet_board_view.xml b/addons/fleet/views/fleet_board_view.xml
index dd97066325bd..c1482eafbd88 100644
--- a/addons/fleet/views/fleet_board_view.xml
+++ b/addons/fleet/views/fleet_board_view.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<openerp>
-<data>
-    <record model="ir.actions.act_window" id="action_fleet_reporting_costs">
+<odoo>
+    <record id="fleet_costs_reporting_action" model="ir.actions.act_window">
       <field name="name">Costs Analysis</field>
       <field name="res_model">fleet.vehicle.cost</field>
       <field name="view_type">form</field>
@@ -19,20 +18,20 @@
         </p>
       </field>
     </record>
-    <record model="ir.actions.act_window.view" id="action_view_fleet_reporting_pivot">
+    <record id="fleet_reporting_pivot_action" model="ir.actions.act_window.view">
         <field name="sequence" eval="2"/>
         <field name="view_mode">pivot</field>
-        <field name="view_id" ref="fleet_vehicle_effective_costs_report_pivot"/>
-        <field name="act_window_id" ref="action_fleet_reporting_costs"/>
+        <field name="view_id" ref="fleet_vehicle_cost_view_pivot"/>
+        <field name="act_window_id" ref="fleet_costs_reporting_action"/>
     </record>
-    <record model="ir.actions.act_window.view" id="action_view_fleet_reporting_graph">
+    <record id="fleet_reporting_graph_action" model="ir.actions.act_window.view">
         <field name="sequence" eval="2"/>
         <field name="view_mode">graph</field>
-        <field name="view_id" ref="fleet_vehicle_effective_costs_report"/>
-        <field name="act_window_id" ref="action_fleet_reporting_costs"/>
+        <field name="view_id" ref="fleet_vehicle_cost_view_graph"/>
+        <field name="act_window_id" ref="fleet_costs_reporting_action"/>
     </record>
 
-    <record model="ir.actions.act_window" id="action_fleet_reporting_costs_non_effective">
+    <record id="fleet_costs_reporting_non_effective_action" model="ir.actions.act_window">
       <field name="name">Indicative Costs Analysis</field>
       <field name="res_model">fleet.vehicle.cost</field>
       <field name="view_type">form</field>
@@ -50,33 +49,32 @@
         </p>
       </field>
     </record>
-    <record model="ir.actions.act_window.view" id="action_view_fleet_non_effective_pivot">
+    <record id="view_fleet_non_effective_pivot_action" model="ir.actions.act_window.view">
         <field name="sequence" eval="2"/>
         <field name="view_mode">pivot</field>
-        <field name="view_id" ref="fleet_vehicle_indicative_costs_report_pivot"/>
-        <field name="act_window_id" ref="action_fleet_reporting_costs_non_effective"/>
+        <field name="view_id" ref="fleet_vehicle_cost_indicative_view_pivot"/>
+        <field name="act_window_id" ref="fleet_costs_reporting_non_effective_action"/>
     </record>
     
-    <record model="ir.actions.act_window.view" id="action_view_fleet_non_effective_graph">
+    <record id="view_fleet_non_effective_graph_action" model="ir.actions.act_window.view">
         <field name="sequence" eval="2"/>
         <field name="view_mode">graph</field>
-        <field name="view_id" ref="fleet_vehicle_indicative_costs_report"/>
-        <field name="act_window_id" ref="action_fleet_reporting_costs_non_effective"/>
+        <field name="view_id" ref="fleet_vehicle_cost_indicative_view_graph"/>
+        <field name="act_window_id" ref="fleet_costs_reporting_non_effective_action"/>
     </record>
     
-    <menuitem name="Reports" parent="menu_root" id="menu_fleet_reporting" sequence="99" groups="group_fleet_manager"/>
+    <menuitem name="Reports" parent="menu_root" id="menu_fleet_reporting" sequence="99" groups="fleet_group_manager"/>
 
     <menuitem id="menu_fleet_reporting_costs"
               name="Costs"
               parent="menu_fleet_reporting"
-              action="action_fleet_reporting_costs"
+              action="fleet_costs_reporting_action"
               sequence="1"
-              groups="group_fleet_manager"/>
+              groups="fleet_group_manager"/>
     <menuitem id="menu_fleet_reporting_indicative_costs"
               name="Indicative Costs"
               parent="menu_fleet_reporting"
-              action="action_fleet_reporting_costs_non_effective"
+              action="fleet_costs_reporting_non_effective_action"
               sequence="2"
-              groups="group_fleet_manager"/>
-</data>
-</openerp>
+              groups="fleet_group_manager"/>
+</odoo>
diff --git a/addons/fleet/views/fleet_view.xml b/addons/fleet/views/fleet_view.xml
index bc2ce383a9ad..97a068967aaf 100644
--- a/addons/fleet/views/fleet_view.xml
+++ b/addons/fleet/views/fleet_view.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<openerp>
-    <data>
-        <record model='ir.ui.view' id='fleet_vehicle_model_form'>
+<odoo>
+        <record id='fleet_vehicle_model_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.form</field>
             <field name="model">fleet.vehicle.model</field>
             <field name="arch" type="xml">
@@ -14,7 +13,7 @@
                         </h1>
                         <label for="brand_id" class="oe_edit_only"/>
                         <h2>
-                            <field name="brand_id" on_change="on_change_brand(brand_id)" placeholder="e.g. Tesla"/>
+                            <field name="brand_id" placeholder="e.g. Tesla"/>
                         </h2>
                     </div>
                     <notebook>
@@ -42,7 +41,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_model_tree'>
+        <record id='fleet_vehicle_model_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.tree</field>
             <field name="model">fleet.vehicle.model</field>
             <field name="arch" type="xml">
@@ -53,7 +52,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_model_search'>
+        <record id='fleet_vehicle_model_view_search' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.search</field>
             <field name="model">fleet.vehicle.model</field>
             <field name="arch" type="xml">
@@ -66,7 +65,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_model_act'>
+        <record id='fleet_vehicle_model_action' model='ir.actions.act_window'>
             <field name="name">Vehicle Model</field>
             <field name="res_model">fleet.vehicle.model</field>
             <field name="view_type">form</field>
@@ -81,7 +80,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_model_brand_tree'>
+        <record id='fleet_vehicle_model_brand_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.brand.tree</field>
             <field name="model">fleet.vehicle.model.brand</field>
             <field name="arch" type="xml">
@@ -91,7 +90,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_model_brand_form'>
+        <record id='fleet_vehicle_model_brand_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.brand.form</field>
             <field name="model">fleet.vehicle.model.brand</field>
             <field name="arch" type="xml">
@@ -109,7 +108,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_model_brand_kanban'>
+        <record id='fleet_vehicle_model_brand_view_kanban' model='ir.ui.view'>
             <field name="name">fleet.vehicle.model.brandkanban</field>
             <field name="model">fleet.vehicle.model.brand</field>
             <field name="arch" type="xml">
@@ -136,7 +135,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_model_brand_act'>
+        <record id='fleet_vehicle_model_brand_action' model='ir.actions.act_window'>
             <field name="name">Model make of Vehicle</field>
             <field name="res_model">fleet.vehicle.model.brand</field>
             <field name="view_type">form</field>
@@ -148,7 +147,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_state_tree'>
+        <record id='fleet_vehicle_state_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.state.tree</field>
             <field name="model">fleet.vehicle.state</field>
             <field name="arch" type="xml">
@@ -160,7 +159,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_state_act'>
+        <record id='fleet_vehicle_state_action' model='ir.actions.act_window'>
             <field name="name">Vehicle Status</field>
             <field name="res_model">fleet.vehicle.state</field>
             <field name="view_type">form</field>
@@ -175,13 +174,13 @@
             </field>
         </record>
 
-        <menuitem name="Fleet" id="menu_root" sequence="115" groups="group_fleet_user" icon="fa-car" web_icon="fleet,static/description/icon.png"/>
-        <menuitem name="Configuration" parent="menu_root" id="fleet_configuration" sequence="100" groups="group_fleet_manager"/>
-        <menuitem action="fleet_vehicle_model_act" parent="fleet_configuration" id="fleet_vehicle_model_menu" groups="base.group_no_one"/>
-        <menuitem action="fleet_vehicle_model_brand_act" parent="fleet_configuration" id="fleet_vehicle_model_brand_menu" groups="base.group_no_one"/>
-        <menuitem action="fleet_vehicle_state_act" parent="fleet_configuration" id="fleet_vehicle_state_menu" groups="group_fleet_manager"/>
+        <menuitem name="Fleet" id="menu_root" sequence="115" groups="fleet_group_user" icon="fa-car" web_icon="fleet,static/description/icon.png"/>
+        <menuitem name="Configuration" parent="menu_root" id="fleet_configuration" sequence="100" groups="fleet_group_manager"/>
+        <menuitem action="fleet_vehicle_model_action" parent="fleet_configuration" id="fleet_vehicle_model_menu" groups="base.group_no_one"/>
+        <menuitem action="fleet_vehicle_model_brand_action" parent="fleet_configuration" id="fleet_vehicle_model_brand_menu" groups="base.group_no_one"/>
+        <menuitem action="fleet_vehicle_state_action" parent="fleet_configuration" id="fleet_vehicle_state_menu" groups="fleet_group_manager"/>
 
-        <record model='ir.ui.view' id='fleet_vehicle_form'>
+        <record id='fleet_vehicle_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.form</field>
             <field name="model">fleet.vehicle</field>
             <field name="arch" type="xml">
@@ -198,7 +197,7 @@
                                 type="object"
                                 class="oe_stat_button"
                                 icon="fa-book"
-                                context="{'xml_id':'fleet_vehicle_log_contract_act'}"
+                                context="{'xml_id':'fleet_vehicle_log_contract_action'}"
                                 help="show the contract for this vehicle">
                                 <field name="contract_count" widget="statinfo" string="Contracts"/>
                             </button>
@@ -207,14 +206,14 @@
                                 class="oe_stat_button"
                                 icon="fa-usd"
                                 help="show all the costs for this vehicle"
-                                groups="fleet.group_fleet_manager">
+                                groups="fleet.fleet_group_manager">
                                 <field name="cost_count" widget="statinfo" string="Costs"/>
                             </button>
                             <button name="return_action_to_open"
                                 type="object"
                                 class="oe_stat_button"
                                 icon="fa-wrench"
-                                context="{'xml_id':'fleet_vehicle_log_services_act'}"
+                                context="{'xml_id':'fleet_vehicle_log_services_action'}"
                                 help="show the services logs for this vehicle" >
                                 <field name="service_count" widget="statinfo" string="Services"/>
                             </button>
@@ -222,7 +221,7 @@
                                 type="object"
                                 class="oe_stat_button"
                                 icon="fa-flask"
-                                context="{'xml_id':'fleet_vehicle_log_fuel_act'}"
+                                context="{'xml_id':'fleet_vehicle_log_fuel_action'}"
                                 help="show the fuel logs for this vehicle" >
                                 <field name="fuel_logs_count" widget="statinfo" string="Fuel"/>
                             </button>
@@ -230,7 +229,7 @@
                                 type="object"
                                 class="oe_stat_button"
                                 icon="fa-tachometer"
-                                context="{'xml_id':'fleet_vehicle_odometer_act'}"
+                                context="{'xml_id':'fleet_vehicle_odometer_action'}"
                                 help="show the odometer logs for this vehicle" >
                                 <field name="odometer_count" widget="statinfo" string="Odometer"/>
                             </button>
@@ -239,7 +238,7 @@
                         <div class="oe_title">
                             <label for="model_id" class="oe_edit_only"/>
                             <h1>
-                                <field name="model_id" on_change="on_change_model(model_id)" placeholder="e.g. Model S"/>
+                                <field name="model_id" placeholder="e.g. Model S"/>
                             </h1>
                             <label for="license_plate" class="oe_edit_only"/>
                             <h2>
@@ -294,7 +293,7 @@
                 </form>
             </field>
         </record>
-        <record model='ir.ui.view' id='fleet_vehicle_tree'>
+        <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">
@@ -315,7 +314,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_search">
+        <record id="fleet_vehicle_view_search" model="ir.ui.view">
             <field name="name">fleet.vehicle.search</field>
             <field name="model">fleet.vehicle</field>
             <field name="arch" type="xml">
@@ -337,7 +336,7 @@
         </record>
 
 
-        <record model='ir.ui.view' id='fleet_vehicle_kanban'>
+        <record id='fleet_vehicle_view_kanban' model='ir.ui.view'>
             <field name="name">fleet.vehicle.kanban</field>
             <field name="model">fleet.vehicle</field>
             <field name="arch" type="xml">
@@ -377,10 +376,10 @@
                                         </li>
                                     </ul>
                                     <div class="o_kanban_button">
-                                        <a t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value" data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action btn btn-sm btn-warning" data-context='{"xml_id":"fleet_vehicle_log_contract_act"}'>
+                                        <a t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value" data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action btn btn-sm btn-warning" data-context='{"xml_id":"fleet_vehicle_log_contract_action"}'>
                                             <field name="contract_renewal_name"/> <t t-if="record.contract_renewal_total.raw_value > 0"> and <field name="contract_renewal_total" /> other(s)</t>
                                         </a>
-                                        <a t-if="record.contract_renewal_overdue.raw_value" data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action btn btn-sm btn-danger" data-context='{"xml_id":"fleet_vehicle_log_contract_act"}'>
+                                        <a t-if="record.contract_renewal_overdue.raw_value" data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action btn btn-sm btn-danger" data-context='{"xml_id":"fleet_vehicle_log_contract_action"}'>
                                             <field name="contract_renewal_name"/> <t t-if="record.contract_renewal_total.raw_value > 0"> and <field name="contract_renewal_total" /> other(s)</t>
                                         </a>
                                     </div>
@@ -393,7 +392,7 @@
         </record>
 
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_act'>
+        <record id='fleet_vehicle_action' model='ir.actions.act_window'>
             <field name="name">Vehicles</field>
             <field name="res_model">fleet.vehicle</field>
             <field name="view_type">form</field>
@@ -412,21 +411,21 @@
             </field>
         </record>
 
-        <menuitem name="Vehicles" parent="menu_root" id="fleet_vehicles" sequence="2" groups="group_fleet_user"/>
-        <menuitem action="fleet_vehicle_act" parent="fleet_vehicles" id="fleet_vehicle_menu" groups="group_fleet_user"/>
+        <menuitem name="Vehicles" parent="menu_root" id="fleet_vehicles" sequence="2" groups="fleet_group_user"/>
+        <menuitem action="fleet_vehicle_action" parent="fleet_vehicles" id="fleet_vehicle_menu" groups="fleet_group_user"/>
 
 
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_contract_form'>
+        <record id='fleet_vehicle_log_contract_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log_contract.form</field>
             <field name="model">fleet.vehicle.log.contract</field>
             <field name="arch" type="xml">
                 <form string="Contract logs">
                     <header>
-                        <button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="open" type="object" class="oe_highlight" string="Terminate Contract" groups="fleet.group_fleet_manager"/>
-                        <button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="toclose" type="object" class="oe_highlight" string="Terminate Contract" groups="fleet.group_fleet_manager"/>
-                        <button modifiers="{'invisible': [['state', 'not in', ['closed']]]}" name="contract_open" states="closed" type="object" class="oe_highlight" string="Set Contract In Progress" groups="fleet.group_fleet_manager"/>
-                        <button class="oe_highlight" name="act_renew_contract" type="object" string="Renew Contract" help="Create a new contract automatically with all the same informations except for the date that will start at the end of current contract" groups="fleet.group_fleet_manager"/>
+                        <button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="open" type="object" class="oe_highlight" string="Terminate Contract" groups="fleet.fleet_group_manager"/>
+                        <button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="toclose" type="object" class="oe_highlight" string="Terminate Contract" groups="fleet.fleet_group_manager"/>
+                        <button modifiers="{'invisible': [['state', 'not in', ['closed']]]}" name="contract_open" states="closed" type="object" class="oe_highlight" string="Set Contract In Progress" groups="fleet.fleet_group_manager"/>
+                        <button class="oe_highlight" name="act_renew_contract" type="object" string="Renew Contract" help="Create a new contract automatically with all the same informations except for the date that will start at the end of current contract" groups="fleet.fleet_group_manager"/>
                         <field name="state" widget="statusbar" />
                     </header>
                     <sheet>
@@ -437,7 +436,7 @@
                         </div>
                         <group col="2">
                             <group string="Contract details">
-                                <field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
+                                <field name="vehicle_id"/>
                                 <field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
                                 <field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract"/>
                                 <label for="cost_generated"/>
@@ -469,7 +468,7 @@
                         <notebook>
                             <page string="Included Services">
                                 <group>
-                                    <field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" on_change="on_change_indic_cost(cost_ids)">
+                                    <field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1">
                                         <tree editable="bottom">
                                             <field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
                                             <field name="amount" sum="Price" string="Indicative Cost" />
@@ -500,7 +499,6 @@
         </record>
 
         <act_window
-
             id="act_renew_contract"
             name="Renew Contract"
             res_model="fleet.vehicle.log.contract"
@@ -510,7 +508,7 @@
             />
 
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_contract_tree'>
+        <record id='fleet_vehicle_log_contract_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.contract.tree</field>
             <field name="model">fleet.vehicle.log.contract</field>
             <field name="arch" type="xml">
@@ -530,7 +528,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_log_contract_graph">
+        <record id="fleet_vehicle_log_contract_view_graph" model="ir.ui.view">
            <field name="name">fleet.vehicle.log.contract.graph</field>
            <field name="model">fleet.vehicle.log.contract</field>
            <field name="arch" type="xml">
@@ -552,7 +550,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_log_contract_act'>
+        <record id='fleet_vehicle_log_contract_action' model='ir.actions.act_window'>
             <field name="name">Vehicles Contracts</field>
             <field name="res_model">fleet.vehicle.log.contract</field>
             <field name="view_type">form</field>
@@ -571,16 +569,16 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_log_contract_act" parent="fleet_vehicles" id="fleet_vehicle_log_contract_menu" groups="group_fleet_user"/>
+        <menuitem action="fleet_vehicle_log_contract_action" parent="fleet_vehicles" id="fleet_vehicle_log_contract_menu" groups="fleet_group_user"/>
 
-       <record model='ir.ui.view' id='fleet_vehicle_odometer_form'>
+       <record id='fleet_vehicle_odometer_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.odometer.form</field>
             <field name="model">fleet.vehicle.odometer</field>
             <field name="arch" type="xml">
                 <form string="Odometer Logs">
                     <sheet>
                         <group>
-                            <field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
+                            <field name="vehicle_id"/>
                                 <div>
                                     <field name="value" class="oe_inline"/>
                                     <field name="unit" class="oe_inline"/>
@@ -592,20 +590,20 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_odometer_tree'>
+        <record id='fleet_vehicle_odometer_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.odometer.tree</field>
             <field name="model">fleet.vehicle.odometer</field>
             <field name="arch" type="xml">
                 <tree string="Odometer Logs" editable="top">
                     <field name="date" />
-                    <field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
+                    <field name="vehicle_id"/>
                     <field name="value" />
                     <field name="unit" />
                 </tree>
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_odometer_search'>
+        <record id='fleet_vehicle_odometer_view_search' model='ir.ui.view'>
             <field name="name">fleet.vehicle.odometer.search</field>
             <field name="model">fleet.vehicle.odometer</field>
             <field name="arch" type="xml">
@@ -621,7 +619,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_odometer_graph">
+        <record id="fleet_vehicle_odometer_view_graph" model="ir.ui.view">
            <field name="name">fleet.vehicle.odometer.graph</field>
            <field name="model">fleet.vehicle.odometer</field>
            <field name="arch" type="xml">
@@ -632,7 +630,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_odometer_act'>
+        <record id='fleet_vehicle_odometer_action' model='ir.actions.act_window'>
             <field name="name">Vehicles Odometer</field>
             <field name="res_model">fleet.vehicle.odometer</field>
             <field name="view_type">form</field>
@@ -650,9 +648,9 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_odometer_act" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="group_fleet_user"/>
+        <menuitem action="fleet_vehicle_odometer_action" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="fleet_group_user"/>
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_fuel_form'>
+        <record id='fleet_vehicle_log_fuel_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.fuel.form</field>
             <field name="model">fleet.vehicle.log.fuel</field>
             <field name="arch" type="xml">
@@ -660,12 +658,12 @@
                     <sheet>
                         <group>
                             <group string="Vehicle Details">
-                                <field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
+                                <field name="vehicle_id"/>
                             </group>
                             <group string="Refueling Details">
-                                <field name="liter" on_change="on_change_liter(liter,price_per_liter,amount)"/>
-                                <field name="price_per_liter" on_change="on_change_price_per_liter(liter,price_per_liter,amount)" />
-                                <field name="amount" on_change="on_change_amount(liter,price_per_liter,amount)"/>
+                                <field name="liter"/>
+                                <field name="price_per_liter"/>
+                                <field name="amount"/>
                             </group>
                         </group>
                         <group>
@@ -689,7 +687,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_fuel_tree'>
+        <record id='fleet_vehicle_log_fuel_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.fuel.tree</field>
             <field name="model">fleet.vehicle.log.fuel</field>
             <field name="arch" type="xml">
@@ -708,7 +706,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_fuel_search'>
+        <record id='fleet_vehicle_log_fuel_view_search' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.fuel.search</field>
             <field name="model">fleet.vehicle.log.fuel</field>
             <field name="arch" type="xml">
@@ -725,7 +723,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_log_fuel_graph">
+        <record id="fleet_vehicle_log_fuel_view_graph" model="ir.ui.view">
            <field name="name">fleet.vehicle.log.fuel.graph</field>
            <field name="model">fleet.vehicle.log.fuel</field>
            <field name="arch" type="xml">
@@ -736,7 +734,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_log_fuel_act'>
+        <record id='fleet_vehicle_log_fuel_action' model='ir.actions.act_window'>
             <field name="name">Vehicles Fuel Logs</field>
             <field name="res_model">fleet.vehicle.log.fuel</field>
             <field name="view_type">form</field>
@@ -753,10 +751,10 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_log_fuel_act" parent="fleet_vehicles" id="fleet_vehicle_log_fuel_menu" groups="group_fleet_user"/>
+        <menuitem action="fleet_vehicle_log_fuel_action" parent="fleet_vehicles" id="fleet_vehicle_log_fuel_menu" groups="fleet_group_user"/>
 
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_services_form'>
+        <record id='fleet_vehicle_log_services_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.services.form</field>
             <field name="model">fleet.vehicle.log.services</field>
             <field name="arch" type="xml">
@@ -764,7 +762,7 @@
                     <sheet>
                         <group col="2">
                             <group string="Services Details">
-                                <field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
+                                <field name="vehicle_id"/>
                                 <field name="cost_subtype_id" string="Service Type" domain="['|',('category','=','service'),('category','=','both')]" required="1"/>
                                 <field name="amount"/>
                             </group>
@@ -800,7 +798,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_services_tree'>
+        <record id='fleet_vehicle_log_services_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.services.tree</field>
             <field name="model">fleet.vehicle.log.services</field>
             <field name="arch" type="xml">
@@ -817,7 +815,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_log_services_graph">
+        <record id="fleet_vehicle_log_services_view_graph" model="ir.ui.view">
            <field name="name">fleet.vehicle.log.services.graph</field>
            <field name="model">fleet.vehicle.log.services</field>
            <field name="arch" type="xml">
@@ -829,7 +827,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_log_services_search'>
+        <record id='fleet_vehicle_log_services_view_search' model='ir.ui.view'>
             <field name="name">fleet.vehicle.log.services.search</field>
             <field name="model">fleet.vehicle.log.services</field>
             <field name="arch" type="xml">
@@ -840,7 +838,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_log_services_act'>
+        <record id='fleet_vehicle_log_services_action' model='ir.actions.act_window'>
             <field name="name">Vehicles Services Logs</field>
             <field name="res_model">fleet.vehicle.log.services</field>
             <field name="view_type">form</field>
@@ -856,9 +854,9 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_log_services_act" parent="fleet_vehicles" id="fleet_vehicle_log_services_menu" groups="group_fleet_user"/>
+        <menuitem action="fleet_vehicle_log_services_action" parent="fleet_vehicles" id="fleet_vehicle_log_services_menu" groups="fleet_group_user"/>
 
-        <record id="fleet_vehicle_tag_view_form" model="ir.ui.view">
+        <record id="fleet_vehicle_tag_view_view_form" model="ir.ui.view">
             <field name="name">fleet.vehicle.tag.form</field>
             <field name="model">fleet.vehicle.tag</field>
             <field name="arch" type="xml">
@@ -883,7 +881,7 @@
 
         <menuitem id="fleet_vehicle_tag_menu" parent="fleet_configuration" action="fleet_vehicle_tag_action" sequence="112" groups="base.group_no_one"/>
 
-        <record model='ir.ui.view' id='fleet_vehicle_service_types_tree'>
+        <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>
             <field name="arch" type="xml">
@@ -897,7 +895,7 @@
         <!--
             fleet.vehicle.cost
             -->
-        <record model='ir.actions.act_window' id='fleet_vehicle_service_types_act'>
+        <record id='fleet_vehicle_service_types_action' model='ir.actions.act_window'>
             <field name="name">Service Types</field>
             <field name="res_model">fleet.service.type</field>
             <field name="view_type">form</field>
@@ -911,9 +909,9 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_service_types_act" parent="fleet_configuration" id="fleet_vehicle_service_types_menu" groups="base.group_no_one"/>
+        <menuitem action="fleet_vehicle_service_types_action" parent="fleet_configuration" id="fleet_vehicle_service_types_menu" groups="base.group_no_one"/>
 
-        <record model='ir.ui.view' id='fleet_vehicle_cost_tree'>
+        <record id='fleet_vehicle_cost_view_tree' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.tree</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -925,7 +923,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_effective_costs_report_pivot'>
+        <record id='fleet_vehicle_cost_view_pivot' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.pivot</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -938,7 +936,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_effective_costs_report'>
+        <record id='fleet_vehicle_cost_view_graph' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.graph</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -950,7 +948,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_indicative_costs_report_pivot'>
+        <record id='fleet_vehicle_cost_indicative_view_pivot' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.pivot</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -962,7 +960,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_indicative_costs_report'>
+        <record id='fleet_vehicle_cost_indicative_view_graph' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.graph</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -974,7 +972,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_costs_search'>
+        <record id='fleet_vehicle_costs_view_search' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.search</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -998,7 +996,7 @@
             </field>
         </record>
 
-        <record model='ir.ui.view' id='fleet_vehicle_costs_form'>
+        <record id='fleet_vehicle_costs_view_form' model='ir.ui.view'>
             <field name="name">fleet.vehicle.cost.form</field>
             <field name="model">fleet.vehicle.cost</field>
             <field name="arch" type="xml">
@@ -1020,7 +1018,7 @@
             </field>
         </record>
 
-        <record model="ir.ui.view" id="fleet_vehicle_costs_graph">
+        <record id="fleet_vehicle_costs_view_graph" model="ir.ui.view">
            <field name="name">fleet.vehicle.cost.graph</field>
            <field name="model">fleet.vehicle.cost</field>
            <field name="arch" type="xml">
@@ -1032,7 +1030,7 @@
             </field>
         </record>
 
-        <record model='ir.actions.act_window' id='fleet_vehicle_costs_act'>
+        <record id='fleet_vehicle_costs_action' model='ir.actions.act_window'>
             <field name="name">Vehicle Costs</field>
             <field name="res_model">fleet.vehicle.cost</field>
             <field name="view_type">form</field>
@@ -1049,6 +1047,5 @@
             </field>
         </record>
 
-        <menuitem action="fleet_vehicle_costs_act" parent="fleet_vehicles" id="fleet_vehicle_costs_menu" groups="group_fleet_manager"/>
-    </data>
-</openerp>
+        <menuitem action="fleet_vehicle_costs_action" parent="fleet_vehicles" id="fleet_vehicle_costs_menu" groups="fleet_group_manager"/>
+</odoo>
-- 
GitLab