[IMP] fleet: model cleanup, dashboard

Purpose
=======

It is currently difficult to know exactly what is used for costs
and services on the contracts.

Hence it make it difficult to evolve the fleet application
We should clean the models in order to have something that is clearer

Specification
=============

Cleanup of models: removed Fuel and Cost. Contract and Services are no
longer inheriting Cost and are seperate models simplifying the use of
Fleet. A contract now has included services and they are no longer
generating cost.

closes odoo/odoo#34090

Taskid: 1931775
Related: odoo/enterprise#4572
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
This commit is contained in:
Kevin Baptiste
2019-11-27 11:54:51 +00:00
committed by Yannick Tivisse
parent c5398bd4bc
commit 82df1dfccc
15 changed files with 563 additions and 1501 deletions
+1
View File
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import report
+4 -4
View File
@@ -11,16 +11,16 @@
Vehicle, leasing, insurances, cost
==================================
With this module, Odoo helps you managing all your vehicles, the
contracts associated to those vehicle as well as services, fuel log
entries, costs and many other features necessary to the management
of your fleet of vehicle(s)
contracts associated to those vehicle as well as services, costs
and many other features necessary to the management of your fleet
of vehicle(s)
Main Features
-------------
* Add vehicles to your fleet
* Manage contracts for vehicles
* Reminder when a contract reach its expiration date
* Add services, fuel log entry, odometer values for all vehicles
* Add services, odometer values for all vehicles
* Show all costs associated to a vehicle or to a type of service
* Analysis graph for costs
""",
+15
View File
@@ -15,7 +15,22 @@
<record id="fleet_vehicle_state_new_request" model="fleet.vehicle.state">
<field name="name">New Request</field>
<field name="sequence">4</field>
</record>
<record id="fleet_vehicle_state_to_order" model="fleet.vehicle.state">
<field name="name">To Order</field>
<field name="sequence">5</field>
</record>
<record id="fleet_vehicle_state_registered" model="fleet.vehicle.state">
<field name="name">Registered</field>
<field name="sequence">7</field>
</record>
<record id="fleet_vehicle_state_downgraded" model="fleet.vehicle.state">
<field name="name">Downgraded</field>
<field name="sequence">8</field>
</record>
</data>
</odoo>
+73 -606
View File
@@ -1,24 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<odoo noupdate="1">
<!--Users-->
<record id="base.user_demo" model="res.users">
<field name="groups_id" eval="[(4, ref('fleet.fleet_group_manager'))]" />
</record>
<record id="fleet_vehicle_state_ordered" model="fleet.vehicle.state">
<field name="name">Ordered</field>
<field name="sequence">6</field>
</record>
<record id="fleet_vehicle_state_registered" model="fleet.vehicle.state">
<field name="name">Registered</field>
<field name="sequence">7</field>
</record>
<record id="fleet_vehicle_state_downgraded" model="fleet.vehicle.state">
<field name="name">Downgraded</field>
<field name="sequence">8</field>
</record>
<record id="fleet_vehicle_state_ordered" model="fleet.vehicle.state">
<field name="name">Ordered</field>
<field name="sequence">6</field>
</record>
<record id="fleet_vehicle_state_reserve" model="fleet.vehicle.state">
<field name="name">Reserve</field>
@@ -398,7 +388,7 @@
<record id="type_contract_repairing" model="fleet.service.type">
<field name="name">Repairing</field>
<field name="category">service</field>
<field name="category">contract</field>
</record>
<record id="type_service_refueling" model="fleet.service.type">
@@ -474,7 +464,7 @@
<field name="location">Grand-Rosiere</field>
<field name="doors">5</field>
<field name="driver_id" ref="base.user_demo_res_partner" />
<field name="acquisition_date" eval="time.strftime('%Y-%m-%d 2:00:00')" />
<field name="acquisition_date" eval="(DateTime.now() - timedelta(days=336)).strftime('%Y-%m-%d')" />
<field name="state_id" ref="fleet_vehicle_state_registered"/>
<field name="odometer_unit">kilometers</field>
<field name="car_value">20000</field>
@@ -489,7 +479,7 @@
<field name="location">Grand-Rosiere</field>
<field name="doors">5</field>
<field name="driver_id" ref="base.res_partner_address_25" />
<field name="acquisition_date" eval="time.strftime('%Y-%m-%d 2:00:00')" />
<field name="acquisition_date" eval="(DateTime.now() - timedelta(days=233)).strftime('%Y-%m-%d')" />
<field name="state_id" ref="fleet_vehicle_state_downgraded"/>
<field name="odometer_unit">kilometers</field>
<field name="car_value">16000</field>
@@ -543,617 +533,200 @@
<record id="log_odometer_1" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-01-01</field>
<field name="date" eval="(DateTime.now() - timedelta(days=336)).strftime('%Y-%m-%d')" />
<field name="value">0</field>
</record>
<record id="log_fuel_1" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id">6</field>
<field name="date">2012-01-01</field>
<field name="liter">40</field>
<field name="price_per_liter">1.3</field>
<field name="amount">52</field>
<field name="inv_ref">67458</field>
<field name="odometer_id" ref="log_odometer_1" />
<field name="notes">First refueling</field>
</record>
<record id="log_odometer_2" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-02-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=304)).strftime('%Y-%m-%d')" />
<field name="value">658</field>
</record>
<record id="log_fuel_2" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-02-11</field>
<field name="liter">50</field>
<field name="price_per_liter">1.3</field>
<field name="amount">65</field>
<field name="inv_ref">455812</field>
<field name="odometer_id" ref="log_odometer_2" />
<field name="notes">Second refueling of the car</field>
</record>
<record id="log_odometer_3" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-03-23</field>
<field name="date" eval="(DateTime.now() - timedelta(days=289)).strftime('%Y-%m-%d')" />
<field name="value">1360</field>
</record>
<record id="log_fuel_3" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-03-23</field>
<field name="liter">45</field>
<field name="price_per_liter">1.32</field>
<field name="amount">59.4</field>
<field name="inv_ref">45199877</field>
<field name="odometer_id" ref="log_odometer_3" />
<field name="notes">Some notes ...</field>
</record>
<record id="log_odometer_4" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-04-5</field>
<field name="date" eval="(DateTime.now() - timedelta(days=260)).strftime('%Y-%m-%d')" />
<field name="value">2044</field>
</record>
<record id="log_fuel_4" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-04-5</field>
<field name="liter">55</field>
<field name="price_per_liter">1.32</field>
<field name="amount">72.6</field>
<field name="inv_ref">654</field>
<field name="odometer_id" ref="log_odometer_4" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_5" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-04-25</field>
<field name="date" eval="(DateTime.now() - timedelta(days=230)).strftime('%Y-%m-%d')" />
<field name="value">2756</field>
</record>
<record id="log_fuel_5" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-04-25</field>
<field name="liter">40</field>
<field name="price_per_liter">1.35</field>
<field name="amount">54</field>
<field name="inv_ref">55488</field>
<field name="odometer_id" ref="log_odometer_5" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_6" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-05-15</field>
<field name="date" eval="(DateTime.now() - timedelta(days=185)).strftime('%Y-%m-%d')" />
<field name="value">3410</field>
</record>
<record id="log_fuel_6" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-05-15</field>
<field name="liter">55.8</field>
<field name="price_per_liter">1.35</field>
<field name="amount">75.33</field>
<field name="inv_ref">4952</field>
<field name="odometer_id" ref="log_odometer_6" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_7" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-06-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=165)).strftime('%Y-%m-%d')" />
<field name="value">3750</field>
</record>
<record id="log_fuel_7" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-06-11</field>
<field name="liter">55.8</field>
<field name="price_per_liter">1.35</field>
<field name="amount">75.33</field>
<field name="inv_ref">4952</field>
<field name="odometer_id" ref="log_odometer_7" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_8" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-07-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=140)).strftime('%Y-%m-%d')" />
<field name="value">4115</field>
</record>
<record id="log_fuel_8" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-07-02</field>
<field name="liter">47.8</field>
<field name="price_per_liter">1.35</field>
<field name="amount">64.53</field>
<field name="inv_ref">15151</field>
<field name="odometer_id" ref="log_odometer_8" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_9" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-07-28</field>
<field name="date" eval="(DateTime.now() - timedelta(days=120)).strftime('%Y-%m-%d')" />
<field name="value">4750</field>
</record>
<record id="log_fuel_9" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-07-28</field>
<field name="liter">25</field>
<field name="price_per_liter">1.35</field>
<field name="amount">33.75</field>
<field name="inv_ref">874195</field>
<field name="odometer_id" ref="log_odometer_9" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_10" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-08-17</field>
<field name="date" eval="(DateTime.now() - timedelta(days=105)).strftime('%Y-%m-%d')" />
<field name="value">5171</field>
</record>
<record id="log_fuel_10" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-08-17</field>
<field name="liter">51.2</field>
<field name="price_per_liter">1.35</field>
<field name="amount">69.12</field>
<field name="inv_ref">4431</field>
<field name="odometer_id" ref="log_odometer_10" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_11" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-09-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=85)).strftime('%Y-%m-%d')" />
<field name="value">5873</field>
</record>
<record id="log_fuel_11" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-09-11</field>
<field name="liter">45.36</field>
<field name="price_per_liter">1.35</field>
<field name="amount">61.236</field>
<field name="inv_ref">11234</field>
<field name="odometer_id" ref="log_odometer_11" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_12" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-10-06</field>
<field name="date" eval="(DateTime.now() - timedelta(days=55)).strftime('%Y-%m-%d')" />
<field name="value">6571</field>
</record>
<record id="log_fuel_12" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-10-06</field>
<field name="liter">53.4</field>
<field name="price_per_liter">1.37</field>
<field name="amount">73.158</field>
<field name="inv_ref">798846</field>
<field name="odometer_id" ref="log_odometer_12" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_13" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-11-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=32)).strftime('%Y-%m-%d')" />
<field name="value">7954</field>
</record>
<record id="log_fuel_13" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-11-02</field>
<field name="liter">48.5</field>
<field name="price_per_liter">1.37</field>
<field name="amount">66.445</field>
<field name="inv_ref">7954</field>
<field name="odometer_id" ref="log_odometer_13" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_14" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-12-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=2)).strftime('%Y-%m-%d')" />
<field name="value">7981</field>
</record>
<record id="log_fuel_14" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_1" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-12-02</field>
<field name="liter">35</field>
<field name="price_per_liter">1.4</field>
<field name="amount">49</field>
<field name="inv_ref">545</field>
<field name="odometer_id" ref="log_odometer_14" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_15" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-01-01</field>
<field name="date" eval="(DateTime.now() - timedelta(days=233)).strftime('%Y-%m-%d')" />
<field name="value">0</field>
</record>
<record id="log_fuel_15" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-01-01</field>
<field name="liter">45</field>
<field name="price_per_liter">1.27</field>
<field name="amount">57.15</field>
<field name="inv_ref">5881418</field>
<field name="odometer_id" ref="log_odometer_15" />
<field name="notes">First refueling</field>
</record>
<record id="log_odometer_16" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-02-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=233)).strftime('%Y-%m-%d')" />
<field name="value">702</field>
</record>
<record id="log_fuel_16" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-02-11</field>
<field name="liter">30</field>
<field name="price_per_liter">1.3</field>
<field name="amount">39</field>
<field name="inv_ref">884351</field>
<field name="odometer_id" ref="log_odometer_16" />
<field name="notes">Second refueling of the car</field>
</record>
<record id="log_odometer_17" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-03-23</field>
<field name="date" eval="(DateTime.now() - timedelta(days=215)).strftime('%Y-%m-%d')" />
<field name="value">1205.4</field>
</record>
<record id="log_fuel_17" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-03-23</field>
<field name="liter">52</field>
<field name="price_per_liter">1.32</field>
<field name="amount">68.64</field>
<field name="inv_ref">984</field>
<field name="odometer_id" ref="log_odometer_17" />
<field name="notes">Some notes ...</field>
</record>
<record id="log_odometer_18" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-04-5</field>
<field name="date" eval="(DateTime.now() - timedelta(days=200)).strftime('%Y-%m-%d')" />
<field name="value">2122</field>
</record>
<record id="log_fuel_18" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-04-5</field>
<field name="liter">35</field>
<field name="price_per_liter">1.32</field>
<field name="amount">46.2</field>
<field name="inv_ref">777</field>
<field name="odometer_id" ref="log_odometer_18" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_19" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-04-25</field>
<field name="date" eval="(DateTime.now() - timedelta(days=180)).strftime('%Y-%m-%d')" />
<field name="value">2430</field>
</record>
<record id="log_fuel_19" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-04-25</field>
<field name="liter">55</field>
<field name="price_per_liter">1.35</field>
<field name="amount">74.25</field>
<field name="inv_ref">4454112</field>
<field name="odometer_id" ref="log_odometer_19" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_20" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-05-15</field>
<field name="date" eval="(DateTime.now() - timedelta(days=165)).strftime('%Y-%m-%d')" />
<field name="value">3015</field>
</record>
<record id="log_fuel_20" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-05-15</field>
<field name="liter">41.8</field>
<field name="price_per_liter">1.35</field>
<field name="amount">56.43</field>
<field name="inv_ref">98754</field>
<field name="odometer_id" ref="log_odometer_20" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_21" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-06-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=150)).strftime('%Y-%m-%d')" />
<field name="value">3602.1</field>
</record>
<record id="log_fuel_21" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-06-11</field>
<field name="liter">50</field>
<field name="price_per_liter">1.35</field>
<field name="amount">67.5</field>
<field name="inv_ref">4952</field>
<field name="odometer_id" ref="log_odometer_21" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_22" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-07-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=124)).strftime('%Y-%m-%d')" />
<field name="value">4205.5</field>
</record>
<record id="log_fuel_22" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-07-02</field>
<field name="liter">50</field>
<field name="price_per_liter">1.35</field>
<field name="amount">67.5</field>
<field name="inv_ref">8976435</field>
<field name="odometer_id" ref="log_odometer_22" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_23" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-07-28</field>
<field name="date" eval="(DateTime.now() - timedelta(days=96)).strftime('%Y-%m-%d')" />
<field name="value">4935</field>
</record>
<record id="log_fuel_23" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-07-28</field>
<field name="liter">50</field>
<field name="price_per_liter">1.35</field>
<field name="amount">67.5</field>
<field name="inv_ref">9564</field>
<field name="odometer_id" ref="log_odometer_23" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_24" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-08-17</field>
<field name="date" eval="(DateTime.now() - timedelta(days=80)).strftime('%Y-%m-%d')" />
<field name="value">5555</field>
</record>
<record id="log_fuel_24" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-08-17</field>
<field name="liter">20</field>
<field name="price_per_liter">1.35</field>
<field name="amount">27</field>
<field name="inv_ref">975</field>
<field name="odometer_id" ref="log_odometer_24" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_25" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-09-11</field>
<field name="date" eval="(DateTime.now() - timedelta(days=55)).strftime('%Y-%m-%d')" />
<field name="value">5987</field>
</record>
<record id="log_fuel_25" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-09-11</field>
<field name="liter">44.5</field>
<field name="price_per_liter">1.35</field>
<field name="amount">60.075</field>
<field name="inv_ref">9876</field>
<field name="odometer_id" ref="log_odometer_25" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_26" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-10-06</field>
<field name="date" eval="(DateTime.now() - timedelta(days=45)).strftime('%Y-%m-%d')" />
<field name="value">6571</field>
</record>
<record id="log_fuel_26" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-10-06</field>
<field name="liter">48.5</field>
<field name="price_per_liter">1.37</field>
<field name="amount">66.445</field>
<field name="inv_ref">786</field>
<field name="odometer_id" ref="log_odometer_26" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_27" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-11-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=30)).strftime('%Y-%m-%d')" />
<field name="value">7201.5</field>
</record>
<record id="log_fuel_27" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-11-02</field>
<field name="liter">55</field>
<field name="price_per_liter">1.37</field>
<field name="amount">75.35</field>
<field name="inv_ref">895</field>
<field name="odometer_id" ref="log_odometer_27" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_28" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_2" />
<field name="date">2012-12-02</field>
<field name="date" eval="(DateTime.now() - timedelta(days=10)).strftime('%Y-%m-%d')" />
<field name="value">8001.2</field>
</record>
<record id="log_fuel_28" model="fleet.vehicle.log.fuel">
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="vehicle_id" ref="vehicle_2" />
<field name="vendor_id" ref="base.res_partner_12"/>
<field name="date">2012-12-02</field>
<field name="liter">35</field>
<field name="price_per_liter">1.4</field>
<field name="amount">49</field>
<field name="inv_ref">545</field>
<field name="odometer_id" ref="log_odometer_28" />
<field name="notes">Some notes</field>
</record>
<record id="log_odometer_29" model="fleet.vehicle.odometer">
<field name="vehicle_id" ref="vehicle_1" />
<field name="date">2012-10-01</field>
<field name="value">1000</field>
</record>
<record id="log_service_1" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">650</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-09-02</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=60)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">4586</field>
<field name="vendor_id" ref="base.res_partner_2" />
<field name="notes">Usual vehicle repairing</field>
</record>
<record id="services_cost_11" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_7"/>
<field name="date">2012-09-02</field>
<field name="parent_id" ref="log_service_1_fleet_vehicle_cost" />
</record>
<record id="services_cost_12" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_8"/>
<field name="date">2012-09-02</field>
<field name="parent_id" ref="log_service_1_fleet_vehicle_cost" />
</record>
<record id="services_cost_13" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_service_9"/>
<field name="date">2012-09-02</field>
<field name="parent_id" ref="log_service_1_fleet_vehicle_cost" />
</record>
<record id="log_service_2" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">350</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-11-02</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=30)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">4814</field>
<field name="vendor_id" ref="base.res_partner_2" />
<field name="notes">After crash repairing</field>
</record>
<record id="services_cost_21" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_service_10"/>
<field name="date">2012-11-02</field>
<field name="parent_id" ref="log_service_2_fleet_vehicle_cost" />
</record>
<record id="services_cost_22" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">150</field>
<field name="cost_subtype_id" ref="type_service_11"/>
<field name="date">2012-11-02</field>
<field name="parent_id" ref="log_service_2_fleet_vehicle_cost" />
</record>
<record id="services_cost_23" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_service_12"/>
<field name="date">2012-11-02</field>
<field name="parent_id" ref="log_service_2_fleet_vehicle_cost" />
</record>
<record id="log_service_3" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_1" />
<field name="amount">513</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-10-15</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=15)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">124</field>
<field name="vendor_id" ref="base.res_partner_2" />
@@ -1163,8 +736,8 @@
<record id="log_service_4" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_3" />
<field name="amount">412</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-10-08</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=120)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">20984</field>
<field name="vendor_id" ref="base.res_partner_2" />
@@ -1174,8 +747,8 @@
<record id="log_service_5" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_4" />
<field name="amount">275</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-09-25</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=100)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">241</field>
<field name="vendor_id" ref="base.res_partner_2" />
@@ -1185,8 +758,8 @@
<record id="log_service_6" model="fleet.vehicle.log.services" >
<field name="vehicle_id" ref="vehicle_5" />
<field name="amount">302</field>
<field name="cost_subtype_id" ref="type_service_service_8"/>
<field name="date">2012-09-15</field>
<field name="service_type_id" ref="type_service_service_8"/>
<field name="date" eval="(DateTime.now() - timedelta(days=65)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="inv_ref">22513</field>
<field name="vendor_id" ref="base.res_partner_2" />
@@ -1195,196 +768,90 @@
<record id="log_contract_1" model="fleet.vehicle.log.contract" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="cost_subtype_id" ref="type_contract_leasing" />
<field name="amount">0</field>
<field name="name">Daily leasing contract</field>
<field name="cost_generated">20</field>
<field name="cost_frequency">daily</field>
<field name="cost_subtype_id" ref="type_contract_leasing"/>
<field name="date" eval="time.strftime('%Y-01-01')" />
<field name="start_date" eval="time.strftime('%Y-01-01')" />
<field name="expiration_date" eval="(DateTime.now() - timedelta(days=233)).strftime('%Y-%m-%d')" />
<field name="expiration_date" eval="(DateTime.now() + timedelta(5)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="insurer_id" ref="base.res_partner_2" />
<field name="notes">Daily leasing contract</field>
<field name="state">open</field>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="contract_cost_11" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_service_2"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_1_fleet_vehicle_cost" />
</record>
<record id="contract_cost_12" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_service_3"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_1_fleet_vehicle_cost" />
</record>
<record id="contract_cost_13" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_2" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_contract_omnium"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_1_fleet_vehicle_cost" />
<field eval="[(6,0,[ref('fleet.type_contract_omnium'),ref('fleet.type_service_service_3'),ref('fleet.type_service_service_2')])]" name="service_ids"/>
</record>
<record id="log_contract_2" model="fleet.vehicle.log.contract" >
<field name="vehicle_id" ref="vehicle_1" />
<field name="cost_subtype_id" ref="type_contract_leasing" />
<field name="amount">0</field>
<field name="name">Weekly leasing contract</field>
<field name="cost_generated">150</field>
<field name="cost_frequency">weekly</field>
<field name="cost_subtype_id" ref="type_contract_leasing"/>
<field name="date" eval="time.strftime('%Y-01-01')" />
<field name="start_date" eval="time.strftime('%Y-01-01')" />
<field name="start_date" eval="(DateTime.now() - timedelta(days=289)).strftime('%Y-%m-%d')" />
<field name="expiration_date" eval="(DateTime.now() + timedelta(-1)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="insurer_id" ref="base.res_partner_2" />
<field name="notes">Weekly leasing contract</field>
<field name="state">open</field>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="contract_cost_21" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_1" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_service_2"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_2_fleet_vehicle_cost" />
</record>
<record id="contract_cost_22" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_1" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_service_3"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_2_fleet_vehicle_cost" />
</record>
<record id="contract_cost_23" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_1" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_contract_omnium"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_2_fleet_vehicle_cost" />
<field eval="[(6,0,[ref('fleet.type_contract_omnium'),ref('fleet.type_service_service_3'),ref('fleet.type_service_service_2')])]" name="service_ids"/>
</record>
<record id="log_contract_3" model="fleet.vehicle.log.contract" >
<field name="vehicle_id" ref="vehicle_3" />
<field name="cost_subtype_id" ref="type_contract_leasing" />
<field name="amount">0</field>
<field name="name">Monthly leasing</field>
<field name="cost_generated">400</field>
<field name="cost_frequency">monthly</field>
<field name="cost_subtype_id" ref="type_contract_leasing"/>
<field name="date" eval="time.strftime('%Y-01-01')"/>
<field name="start_date" eval="time.strftime('%Y-01-01')" />
<field name="expiration_date" eval="time.strftime('%Y-12-31')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="insurer_id" ref="base.res_partner_2" />
<field name="notes">Monthly leasing contract</field>
<field name="state">open</field>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="contract_cost_31" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_3" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_service_2"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_3_fleet_vehicle_cost" />
</record>
<record id="contract_cost_32" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_3" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_service_3"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_3_fleet_vehicle_cost" />
</record>
<record id="contract_cost_33" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_3" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_contract_omnium"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_3_fleet_vehicle_cost" />
<field eval="[(6,0,[ref('fleet.type_contract_omnium'),ref('fleet.type_service_service_3'),ref('fleet.type_service_service_2')])]" name="service_ids"/>
</record>
<record id="log_contract_4" model="fleet.vehicle.log.contract" >
<field name="vehicle_id" ref="vehicle_4" />
<field name="cost_subtype_id" ref="type_contract_leasing" />
<field name="amount">0</field>
<field name="name">Yearly leasing</field>
<field name="cost_generated">4000</field>
<field name="cost_frequency">yearly</field>
<field name="cost_subtype_id" ref="type_contract_leasing"/>
<field name="date" eval="time.strftime('%Y-01-01')" />
<field name="start_date" eval="time.strftime('%Y-01-01')" />
<field name="expiration_date" eval="time.strftime('%Y-12-31')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="insurer_id" ref="base.res_partner_2" />
<field name="notes">Yearly leasing contract</field>
<field name="state">open</field>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="contract_cost_41" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_4" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_service_2"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_4_fleet_vehicle_cost" />
</record>
<record id="contract_cost_42" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_4" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_service_3"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_4_fleet_vehicle_cost" />
</record>
<record id="contract_cost_43" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_4" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_contract_omnium"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_4_fleet_vehicle_cost" />
<field eval="[(6,0,[ref('fleet.type_contract_omnium'),ref('fleet.type_service_service_3'),ref('fleet.type_service_service_2')])]" name="service_ids"/>
</record>
<record id="log_contract_5" model="fleet.vehicle.log.contract" >
<field name="vehicle_id" ref="vehicle_5" />
<field name="cost_subtype_id" ref="type_contract_leasing" />
<field name="amount">17000</field>
<field name="name">Unique leasing</field>
<field name="cost_generated">0</field>
<field name="cost_frequency">no</field>
<field name="cost_subtype_id" ref="type_contract_leasing"/>
<field name="date" eval="time.strftime('2012-01-01')" />
<field name="start_date" eval="time.strftime('2012-01-01')" />
<field name="expiration_date" eval="time.strftime('2016-12-31')" />
<field name="date" eval="(DateTime.now() - timedelta(days=300)).strftime('%Y-%m-%d')" />
<field name="start_date" eval="(DateTime.now() - timedelta(days=300)).strftime('%Y-%m-%d')" />
<field name="expiration_date" eval="(DateTime.now() + timedelta(-60)).strftime('%Y-%m-%d')" />
<field name="purchaser_id" ref="base.res_partner_address_18" />
<field name="insurer_id" ref="base.res_partner_2" />
<field name="notes">Unique leasing contract</field>
<field name="state">open</field>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="contract_cost_51" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_5" />
<field name="amount">50</field>
<field name="cost_subtype_id" ref="type_service_service_2"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_5_fleet_vehicle_cost" />
</record>
<record id="contract_cost_52" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_5" />
<field name="amount">25</field>
<field name="cost_subtype_id" ref="type_service_service_3"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_5_fleet_vehicle_cost" />
</record>
<record id="contract_cost_53" model="fleet.vehicle.cost" >
<field name="vehicle_id" ref="vehicle_5" />
<field name="amount">100</field>
<field name="cost_subtype_id" ref="type_contract_omnium"/>
<field name="date">2012-01-01</field>
<field name="parent_id" ref="log_contract_5_fleet_vehicle_cost" />
<field eval="[(6,0,[ref('fleet.type_contract_omnium'),ref('fleet.type_service_service_3'),ref('fleet.type_service_service_2')])]" name="service_ids"/>
</record>
</odoo>
+50 -31
View File
@@ -18,6 +18,7 @@ class FleetVehicle(models.Model):
return state if state and state.id else False
name = fields.Char(compute="_compute_vehicle_name", store=True)
description = fields.Text("Vehicle Description")
active = fields.Boolean('Active', default=True, tracking=True)
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company)
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
@@ -28,16 +29,21 @@ class FleetVehicle(models.Model):
future_driver_id = fields.Many2one('res.partner', 'Future Driver', tracking=True, help='Next Driver of the vehicle', copy=False, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
model_id = fields.Many2one('fleet.vehicle.model', 'Model',
tracking=True, required=True, help='Model of the vehicle')
manager_id = fields.Many2one('res.users', related='model_id.manager_id')
manager_id = fields.Many2one('res.users', compute='_compute_manager_id', domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)], store=True, readonly=False)
@api.depends('model_id')
def _compute_manager_id(self):
if self.model_id:
self.manager_id = self.model_id.manager_id
else:
self.manager_id = None
brand_id = fields.Many2one('fleet.vehicle.model.brand', 'Brand', related="model_id.brand_id", store=True, readonly=False)
log_drivers = fields.One2many('fleet.vehicle.assignation.log', 'vehicle_id', string='Assignation Logs')
log_fuel = fields.One2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs')
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='Contract Count')
service_count = fields.Integer(compute="_compute_count_all", string='Services')
fuel_logs_count = fields.Integer(compute="_compute_count_all", string='Fuel Log Count')
odometer_count = fields.Integer(compute="_compute_count_all", string='Odometer')
history_count = fields.Integer(compute="_compute_count_all", string="Drivers History Count")
next_assignation_date = fields.Date('Assignation Date', help='This is the date at which the car will be available, if not set it means available instantly')
@@ -108,16 +114,12 @@ class FleetVehicle(models.Model):
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', '=', record.id)])
record.fuel_logs_count = LogFuel.search_count([('vehicle_id', '=', record.id)])
record.service_count = LogService.search_count([('vehicle_id', '=', record.id)])
record.contract_count = LogContract.search_count([('vehicle_id', '=', record.id), ('state', '!=', 'closed')])
record.cost_count = Cost.search_count([('vehicle_id', '=', record.id), ('parent_id', '=', False)])
record.history_count = self.env['fleet.vehicle.assignation.log'].search_count([('vehicle_id', '=', record.id)])
@api.depends('log_contracts')
@@ -130,7 +132,7 @@ class FleetVehicle(models.Model):
total = 0
name = ''
for element in record.log_contracts:
if element.state in ('open', 'diesoon', 'expired') and element.expiration_date:
if element.state in ('open', 'expired') and element.expiration_date:
current_date_str = fields.Date.context_today(record)
due_time_str = element.expiration_date
current_date = fields.Date.from_string(current_date_str)
@@ -145,11 +147,11 @@ class FleetVehicle(models.Model):
if overdue or due_soon:
log_contract = self.env['fleet.vehicle.log.contract'].search([
('vehicle_id', '=', record.id),
('state', 'in', ('open', 'diesoon', 'expired'))
('state', 'in', ('open', 'expired'))
], limit=1, order='expiration_date asc')
if log_contract:
# we display only the name of the oldest overdue/due soon contract
name = log_contract.cost_subtype_id.name
name = log_contract.name
record.contract_renewal_overdue = overdue
record.contract_renewal_due_soon = due_soon
@@ -168,16 +170,11 @@ class FleetVehicle(models.Model):
today = fields.Date.context_today(self)
datetime_today = fields.Datetime.from_string(today)
limit_date = fields.Datetime.to_string(datetime_today + relativedelta(days=+delay_alert_contract))
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', 'diesoon', 'expired')
GROUP BY cost.vehicle_id""", (today, limit_date))
res_ids = [x[0] for x in self.env.cr.fetchall()]
res_ids = self.env['fleet.vehicle.log.contract'].search([
('expiration_date', '>', today),
('expiration_date', '<', limit_date),
('state', 'in', ['open', 'expired'])
]).mapped('id')
res.append(('id', search_operator, res_ids))
return res
@@ -189,26 +186,26 @@ class FleetVehicle(models.Model):
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', 'diesoon', 'expired')
GROUP BY cost.vehicle_id ''', (today,))
res_ids = [x[0] for x in self.env.cr.fetchall()]
res_ids = self.env['fleet.vehicle.log.contract'].search([
('expiration_date', '!=', False),
('expiration_date', '<', today),
('state', 'in', ['open', 'expired'])
]).mapped('id')
res.append(('id', search_operator, res_ids))
return res
@api.model
def create(self, vals):
res = super(FleetVehicle, self).create(vals)
res = super(FleetVehicle, self.with_context({'odometer_no_chatter': True})).create(vals)
if 'driver_id' in vals and vals['driver_id']:
res.create_driver_history(vals['driver_id'])
if 'future_driver_id' in vals and vals['future_driver_id']:
future_driver = self.env['res.partner'].browse(vals['future_driver_id'])
future_driver.write({'plan_to_change_car': True})
for rec in res:
if rec.odometer:
date = fields.Date.context_today(rec)
rec.message_post(body=_("Odometer on %s: %s %s") % (date, rec.odometer, rec.odometer_unit))
return res
def write(self, vals):
@@ -256,6 +253,12 @@ class FleetVehicle(models.Model):
def _read_group_stage_ids(self, stages, domain, order):
return self.env['fleet.vehicle.state'].search([], order=order)
@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
if 'co2' in fields:
fields.remove('co2')
return super(FleetVehicle, self).read_group(domain, fields, groupby, offset, limit, orderby, lazy)
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
args = args or []
@@ -337,6 +340,22 @@ class FleetVehicleOdometer(models.Model):
if self.vehicle_id:
self.unit = self.vehicle_id.odometer_unit
@api.model
def create(self, vals):
odometers = super(FleetVehicleOdometer, self).create(vals)
for odometer in odometers:
if not self.env.context.get('odometer_no_chatter'):
odometer.vehicle_id.message_post(body=_("Odometer on %s: %s %s") % (odometer.date, odometer.value, odometer.unit))
return odometers
def write(self, vals):
odometers = super(FleetVehicleOdometer, self).write(vals)
if 'value' in vals and not self.env.context.get('odometer_no_chatter'):
for odometer in self:
odometer.vehicle_id.message_post(body=_("Odometer on %s: %s %s") % (odometer.date, odometer.value, odometer.unit))
return odometers
class FleetVehicleState(models.Model):
_name = 'fleet.vehicle.state'
+141 -336
View File
@@ -6,39 +6,158 @@ from odoo.exceptions import UserError
from dateutil.relativedelta import relativedelta
class FleetVehicleLogContract(models.Model):
_inherit = ['mail.thread', 'mail.activity.mixin']
_name = 'fleet.vehicle.log.contract'
_description = 'Contract information on a vehicle'
_order = 'state desc,expiration_date'
class FleetVehicleCost(models.Model):
_name = 'fleet.vehicle.cost'
_description = 'Cost related to a vehicle'
_order = 'date desc, vehicle_id asc'
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)
name = fields.Char(related='vehicle_id.name', string='Name', store=True, readonly=False)
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', copy=True)
vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', default=1, required=True, help='Vehicle concerned by this log')
cost_subtype_id = fields.Many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost', domain=[('category', '=', 'contract')])
amount = fields.Float('Cost')
date = fields.Date(help='Date when the cost has been executed')
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company)
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
name = fields.Char(string='Name', compute='_compute_contract_name', store=True)
active = fields.Boolean(default=True)
user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user, index=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(related='vehicle_id.driver_id', string='Driver')
ins_ref = fields.Char('Reference', size=64, copy=False)
state = fields.Selection([
('futur', 'Incoming'),
('open', 'In Progress'),
('expired', 'Expired'),
('closed', 'Closed')
], 'Status', default='open', readonly=True,
help='Choose whether the contract is still valid or not',
tracking=True,
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')
cost_frequency = fields.Selection([
('no', 'No'),
('daily', 'Daily'),
('weekly', 'Weekly'),
('monthly', 'Monthly'),
('yearly', 'Yearly')
], 'Recurring Cost Frequency', default='monthly', help='Frequency of the recuring cost', required=True)
service_ids = fields.Many2many('fleet.service.type', string="Included Services")
@api.depends('vehicle_id', 'cost_subtype_id')
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 + ' ' + name
record.name = name
@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 in ['open', 'expired']:
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
def write(self, vals):
res = super(FleetVehicleLogContract, self).write(vals)
if vals.get('expiration_date') or vals.get('user_id'):
self.activity_reschedule(['fleet.mail_act_fleet_contract_to_renew'], date_deadline=vals.get('expiration_date'), new_user_id=vals.get('user_id'))
return res
def contract_close(self):
for record in self:
record.state = 'closed'
def contract_draft(self):
for record in self:
record.state = 'futur'
def contract_open(self):
for record in self:
record.state = 'open'
@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
params = self.env['ir.config_parameter'].sudo()
delay_alert_contract = int(params.get_param('hr_fleet.delay_alert_contract', default=30))
date_today = fields.Date.from_string(fields.Date.today())
outdated_days = fields.Date.to_string(date_today + relativedelta(days=+delay_alert_contract))
nearly_expired_contracts = self.search([('state', '=', 'open'), ('expiration_date', '<', outdated_days)])
for contract in nearly_expired_contracts.filtered(lambda contract: contract.user_id):
contract.activity_schedule(
'fleet.mail_act_fleet_contract_to_renew', contract.expiration_date,
user_id=contract.user_id.id)
expired_contracts = self.search([('state', 'not in', ['expired', 'closed']), ('expiration_date', '<',fields.Date.today() )])
expired_contracts.write({'state': 'expired'})
futur_contracts = self.search([('state', 'not in', ['futur', 'closed']), ('start_date', '>', fields.Date.today())])
futur_contracts.write({'state': 'futur'})
now_running_contracts = self.search([('state', '=', 'futur'), ('start_date', '<=', fields.Date.today())])
now_running_contracts.write({'state': 'open'})
def run_scheduler(self):
self.scheduler_manage_contract_expiration()
class FleetVehicleLogServices(models.Model):
_name = 'fleet.vehicle.log.services'
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'service_type_id'
_description = 'Services for vehicles'
@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),
'service_type_id': service.id if service else None,
})
return res
vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', default=1, required=True, help='Vehicle concerned by this log')
amount = fields.Float('Cost')
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)
description = fields.Char("Cost Description")
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company)
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
purchaser_id = fields.Many2one(related='vehicle_id.driver_id', string="Driver")
inv_ref = fields.Char('Vendor Reference')
vendor_id = fields.Many2one('res.partner', 'Vendor')
notes = fields.Text()
service_type_id = fields.Many2one('fleet.service.type', 'Service Type', required=True)
def _get_odometer(self):
self.odometer = 0.0
self.odometer = 0
for record in self:
record.odometer = False
if record.odometer_id:
record.odometer = record.odometer_id.value
@@ -56,323 +175,9 @@ class FleetVehicleCost(models.Model):
@api.model_create_multi
def create(self, vals_list):
for data in vals_list:
# 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(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.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
if 'odometer' in data and not data['odometer']:
# 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(FleetVehicleCost, self).create(vals_list)
class FleetVehicleLogContract(models.Model):
_inherit = ['mail.thread', 'mail.activity.mixin']
_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)
user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user, index=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', 'Driver', 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([
('futur', 'Incoming'),
('open', 'In Progress'),
('diesoon', 'Expiring Soon'),
('expired', 'Expired'),
('closed', 'Closed')
], 'Status', default='open', readonly=True,
help='Choose whether the contract is still valid or not',
tracking=True,
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', tracking=True,
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')
# 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
# (2) fields that aren't stored in database
cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True, readonly=False)
odometer = fields.Float(string='Creation Contract Odometer',
help='Odometer measure of the vehicle at the moment of the contract creation')
@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 += ' / ' + str(record.date)
record.name = name
@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 in ['open', 'diesoon', 'expired']:
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
def write(self, vals):
res = super(FleetVehicleLogContract, self).write(vals)
if vals.get('expiration_date') or vals.get('user_id'):
self.activity_reschedule(['fleet.mail_act_fleet_contract_to_renew'], date_deadline=vals.get('expiration_date'), new_user_id=vals.get('user_id'))
return res
def contract_close(self):
for record in self:
record.state = 'closed'
def contract_open(self):
for record in self:
record.state = 'open'
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,
'res_model': 'fleet.vehicle.log.contract',
'type': 'ir.actions.act_window',
'domain': '[]',
'res_id': newid,
'context': {'active_id': newid},
}
@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
VehicleCost = self.env['fleet.vehicle.cost']
deltas = {
'yearly': relativedelta(years=+1),
'monthly': relativedelta(months=+1),
'weekly': relativedelta(weeks=+1),
'daily': relativedelta(days=+1)
}
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
startdate = contract.start_date
if contract.generated_cost_ids:
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
startdate = last_autogenerated_cost.date
if found:
startdate += deltas.get(contract.cost_frequency)
today = fields.Date.context_today(self)
while (startdate <= today) & (startdate <= contract.expiration_date):
data = {
'amount': contract.cost_generated,
'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
}
self.env['fleet.vehicle.cost'].create(data)
startdate += deltas.get(contract.cost_frequency)
return True
@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
params = self.env['ir.config_parameter'].sudo()
delay_alert_contract = int(params.get_param('hr_fleet.delay_alert_contract', default=30))
date_today = fields.Date.from_string(fields.Date.today())
outdated_days = fields.Date.to_string(date_today + relativedelta(days=+delay_alert_contract))
nearly_expired_contracts = self.search([('state', '=', 'open'), ('expiration_date', '<', outdated_days)])
nearly_expired_contracts.write({'state': 'diesoon'})
for contract in nearly_expired_contracts.filtered(lambda contract: contract.user_id):
contract.activity_schedule(
'fleet.mail_act_fleet_contract_to_renew', contract.expiration_date,
user_id=contract.user_id.id)
expired_contracts = self.search([('state', 'not in', ['expired', 'closed']), ('expiration_date', '<',fields.Date.today() )])
expired_contracts.write({'state': 'expired'})
futur_contracts = self.search([('state', 'not in', ['futur', 'closed']), ('start_date', '>', fields.Date.today())])
futur_contracts.write({'state': 'futur'})
now_running_contracts = self.search([('state', '=', 'futur'), ('start_date', '<=', fields.Date.today())])
now_running_contracts.write({'state': 'open'})
def run_scheduler(self):
self.scheduler_manage_auto_costs()
self.scheduler_manage_contract_expiration()
class FleetVehicleLogFuel(models.Model):
_name = 'fleet.vehicle.log.fuel'
_description = 'Fuel log for vehicles'
_inherits = {'fleet.vehicle.cost': 'cost_id'}
@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')
inv_ref = fields.Char('Invoice Reference', size=64)
vendor_id = fields.Many2one('res.partner', 'Vendor')
notes = fields.Text()
cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
# 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
# (2) fields that aren't stored in database
cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True, readonly=False)
@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
# computation to 2 decimal
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'
@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
purchaser_id = fields.Many2one('res.partner', 'Purchaser')
inv_ref = fields.Char('Invoice Reference')
vendor_id = fields.Many2one('res.partner', 'Vendor')
# 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, readonly=False)
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
return super(FleetVehicleLogServices, self).create(vals_list)
+29 -2
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo import api, fields, models, tools, _
class FleetVehicleModel(models.Model):
@@ -15,6 +15,7 @@ class FleetVehicleModel(models.Model):
manager_id = fields.Many2one('res.users', 'Fleet Manager', default=lambda self: self.env.uid,
domain=lambda self: [('groups_id', 'in', self.env.ref('fleet.fleet_group_manager').id)])
image_128 = fields.Image(related='brand_id.image_128', readonly=False)
active = fields.Boolean(default=True)
@api.depends('name', 'brand_id')
def name_get(self):
@@ -26,11 +27,37 @@ class FleetVehicleModel(models.Model):
res.append((record.id, name))
return res
def write(self, vals):
if 'manager_id' in vals:
old_manager = self.manager_id.id if self.manager_id else None
self.env['fleet.vehicle'].search([('model_id', '=', self.id), ('manager_id', '=', old_manager)]).write({'manager_id': vals['manager_id']})
return super(FleetVehicleModel, self).write(vals)
class FleetVehicleModelBrand(models.Model):
_name = 'fleet.vehicle.model.brand'
_description = 'Brand of the vehicle'
_order = 'name asc'
_order = 'model_count desc, name asc'
name = fields.Char('Make', required=True)
image_128 = fields.Image("Logo", max_width=128, max_height=128)
model_count = fields.Integer(compute="_compute_model_count", string="", store=True)
def _compute_model_count(self):
Model = self.env['fleet.vehicle.model']
for record in self:
record.model_count = Model.search_count([('brand_id', '=', record.id)])
def action_brand_model(self):
self.ensure_one()
view = {
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'res_model': 'fleet.vehicle.model',
'name': 'Models',
'context': {'search_default_brand_id': self.id, 'default_brand_id': self.id}
}
return view
+1
View File
@@ -0,0 +1 @@
from . import fleet_report
+131
View File
@@ -0,0 +1,131 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import tools
from odoo import api, fields, models
class FleetReport(models.Model):
_name = "fleet.vehicle.cost.report"
_description = "Fleet Analysis Report"
_auto = False
_order = 'date_start desc'
company_id = fields.Many2one('res.company', 'Company', readonly=True)
vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', readonly=True)
name = fields.Char('Vehicle Name', readonly=True)
driver_id = fields.Many2one('res.partner', 'Driver', readonly=True)
fuel_type = fields.Char('Fuel', readonly=True)
date_start = fields.Date('Date', readonly=True)
cost = fields.Float('Cost', readonly=True)
cost_type = fields.Selection(string='Cost Type', selection=[
('contract', 'Contract'),
('service', 'Service')
], readonly=True)
def init(self):
query = """
WITH service_costs AS (
SELECT
ve.id AS vehicle_id,
ve.company_id AS company_id,
ve.name AS name,
ve.driver_id AS driver_id,
ve.fuel_type AS fuel_type,
date(date_trunc('month', d)) AS date_start,
COALESCE(sum(se.amount), 0) AS
COST,
'service' AS cost_type
FROM
fleet_vehicle ve
CROSS JOIN generate_series((
SELECT
min(acquisition_date)
FROM fleet_vehicle), CURRENT_DATE, '1 month') d
LEFT JOIN fleet_vehicle_log_services se ON se.vehicle_id = ve.id
AND date_trunc('month', se.date) = date_trunc('month', d)
WHERE
ve.active
GROUP BY
ve.id,
ve.company_id,
ve.name,
date_start,
d
ORDER BY
ve.id,
date_start
),
contract_costs AS (
SELECT
ve.id AS vehicle_id,
ve.company_id AS company_id,
ve.name AS name,
ve.driver_id AS driver_id,
ve.fuel_type AS fuel_type,
date(date_trunc('month', d)) AS date_start,
(COALESCE(sum(co.amount), 0) + COALESCE(sum(cod.cost_generated * extract(day FROM least (date_trunc('month', d) + interval '1 month', cod.expiration_date) - greatest (date_trunc('month', d), cod.start_date))), 0) + COALESCE(sum(com.cost_generated), 0) + COALESCE(sum(coy.cost_generated), 0)) AS
COST,
'contract' AS cost_type
FROM
fleet_vehicle ve
CROSS JOIN generate_series((
SELECT
min(acquisition_date)
FROM fleet_vehicle), CURRENT_DATE, '1 month') d
LEFT JOIN fleet_vehicle_log_contract co ON co.vehicle_id = ve.id
AND date_trunc('month', co.date) = date_trunc('month', d)
LEFT JOIN fleet_vehicle_log_contract cod ON cod.vehicle_id = ve.id
AND date_trunc('month', cod.start_date) <= date_trunc('month', d)
AND date_trunc('month', cod.expiration_date) >= date_trunc('month', d)
AND cod.cost_frequency = 'daily'
LEFT JOIN fleet_vehicle_log_contract com ON com.vehicle_id = ve.id
AND date_trunc('month', com.start_date) <= date_trunc('month', d)
AND date_trunc('month', com.expiration_date) >= date_trunc('month', d)
AND com.cost_frequency = 'monthly'
LEFT JOIN fleet_vehicle_log_contract coy ON coy.vehicle_id = ve.id
AND date_trunc('month', coy.date) = date_trunc('month', d)
AND date_trunc('month', coy.start_date) <= date_trunc('month', d)
AND date_trunc('month', coy.expiration_date) >= date_trunc('month', d)
AND coy.cost_frequency = 'yearly'
WHERE
ve.active
GROUP BY
ve.id,
ve.company_id,
ve.name,
date_start,
d
ORDER BY
ve.id,
date_start
)
SELECT
vehicle_id AS id,
company_id,
vehicle_id,
name,
driver_id,
fuel_type,
date_start,
COST,
cost_type
FROM
service_costs sc
UNION ALL (
SELECT
vehicle_id AS id,
company_id,
vehicle_id,
name,
driver_id,
fuel_type,
date_start,
COST,
cost_type
FROM
contract_costs cc)
"""
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute("""CREATE or REPLACE VIEW %s as (%s)""" % (self._table, query))
-30
View File
@@ -30,16 +30,6 @@
<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_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('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_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"/>
@@ -60,16 +50,6 @@
<field name="perm_unlink" eval="True"/>
<field name="domain_force">[('vehicle_id.driver_id','=',user.partner_id.id)]</field>
</record>
<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('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_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"/>
@@ -85,11 +65,6 @@
<field name="model_id" ref="model_fleet_vehicle_log_contract"/>
<field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
</record>
<record id="fleet_rule_cost_visibility_manager" model="ir.rule">
<field name="name">Administrator has all rights on vehicle's costs</field>
<field name="model_id" ref="model_fleet_vehicle_cost"/>
<field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
</record>
<record id="fleet_rule_service_visibility_manager" model="ir.rule">
<field name="name">Administrator has all rights on vehicle's services</field>
<field name="model_id" ref="model_fleet_vehicle_log_services"/>
@@ -100,11 +75,6 @@
<field name="model_id" ref="model_fleet_vehicle_odometer"/>
<field name="groups" eval="[(4, ref('fleet_group_manager'))]"/>
</record>
<record id="fleet_rule_fuel_log_visibility_manager" model="ir.rule">
<field name="name">Administrator 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('fleet_group_manager'))]"/>
</record>
<record id="fleet_rule_vehicle_visibility_manager" model="ir.rule">
<field name="name">Administrator has all rights on vehicle</field>
<field name="model_id" ref="model_fleet_vehicle"/>
+1 -3
View File
@@ -7,17 +7,15 @@ fleet_vehicle_access_right_user,fleet_vehicle_access_right,model_fleet_vehicle,f
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
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_mail_activity_type_fleet_manager,mail.activity.type.fleet.manager,mail.model_mail_activity_type,fleet.fleet_group_manager,1,1,1,1
access_fleet_vehicle_assignation_log_fleet_group_user,fleet_vehicle_assignation_log fleet_group_user,fleet.model_fleet_vehicle_assignation_log,fleet.fleet_group_user,1,1,1,1
access_fleet_report_manager,fleet_vehicle_cost_report_access_right,model_fleet_vehicle_cost_report,fleet_group_manager,1,1,1,1
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
7 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
8 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
9 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
10 fleet_vehicle_model_access_right fleet_vehicle_model_access_right model_fleet_vehicle_model fleet_group_manager 1 1 1 1
11 fleet_vehicle_tag_access_right fleet_vehicle_tag_access_right model_fleet_vehicle_tag fleet_group_manager 1 1 1 1
12 fleet_vehicle_state_access_right fleet_vehicle_state_access_right model_fleet_vehicle_state fleet_group_manager 1 1 1 1
13 fleet_vehicle_odometer_access_right fleet_vehicle_odometer_access_right model_fleet_vehicle_odometer fleet_group_user 1 1 1 1
14 fleet_vehicle_model_brand_access_right fleet_vehicle_model_brand_access_right model_fleet_vehicle_model_brand fleet_group_manager 1 1 1 1
15 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
16 fleet_vehicle_log_services_access_right fleet_vehicle_log_services_access_right model_fleet_vehicle_log_services fleet_group_manager 1 1 1 1
17 fleet_vehicle_log_contract_access_right fleet_vehicle_log_contract_access_right model_fleet_vehicle_log_contract fleet_group_manager 1 1 1 1
18 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
19 access_mail_activity_type_fleet_manager mail.activity.type.fleet.manager mail.model_mail_activity_type fleet.fleet_group_manager 1 1 1 1
20 access_fleet_vehicle_assignation_log_fleet_group_user fleet_vehicle_assignation_log fleet_group_user fleet.model_fleet_vehicle_assignation_log fleet.fleet_group_user 1 1 1 1
21 access_fleet_report_manager fleet_vehicle_cost_report_access_right model_fleet_vehicle_cost_report fleet_group_manager 1 1 1 1
+49 -55
View File
@@ -1,11 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="fleet_costs_reporting_action" model="ir.actions.act_window">
<record id="fleet_costs_report_view_search" model="ir.ui.view">
<field name="name">fleet.vehicle.cost.view.search</field>
<field name="model">fleet.vehicle.cost.report</field>
<field name="arch" type="xml">
<search string="Fleet Costs Analysis">
<field name="name" filter_domain="[('name', 'ilike', self)]"/>
<field name="driver_id" filter_domain="[('driver_id', 'ilike', self)]"/>
<field name="date_start" />
<filter string="Service" name="service" domain="[('cost_type', '=', 'service')]"/>
<filter string="Contract" name="contract" domain="[('cost_type', '=', 'contract')]"/>
<group expand="1" string="Group By">
<filter string="Vehicle" name="vehicle" context="{'group_by':'vehicle_id'}"/>
<filter string="Driver" name="driver" context="{'group_by':'driver_id'}"/>
</group>
</search>
</field>
</record>
<record id="fleet_costs_report_view_pivot" model="ir.ui.view">
<field name="name">fleet.vehicle.cost.view.pivot</field>
<field name="model">fleet.vehicle.cost.report</field>
<field name="arch" type="xml">
<pivot>
<field name="date_start" type="col" interval="year" />
<field name="cost_type" type="col" />
<field name="vehicle_id" type="row" />
<field name="cost" type="measure" />
</pivot>
</field>
</record>
<record id="fleet_costs_report_view_graph" model="ir.ui.view">
<field name="name">fleet.vehicle.cost.view.graph</field>
<field name="model">fleet.vehicle.cost.report</field>
<field name="arch" type="xml">
<graph string="Fleet Costs Analysis" type="bar">
<field name="date_start" type="row" interval="month"/>
<field name="cost_type" type="row"/>
<field name="cost" type="measure"/>
</graph>
</field>
</record>
<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="res_model">fleet.vehicle.cost.report</field>
<field name="view_mode">graph,pivot</field>
<field name="view_id"></field> <!-- force empty -->
<field name="context">{"search_default_parent_false" : True,}</field>
<field name="view_id"></field>
<field name="context">{ 'time_ranges': {'field':'date_start', 'range':'last_365_days'} }</field>
<field name="search_view_id" ref="fleet.fleet_costs_report_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No data for analysis
@@ -18,62 +63,11 @@
</p>
</field>
</record>
<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_cost_view_pivot"/>
<field name="act_window_id" ref="fleet_costs_reporting_action"/>
</record>
<record id="fleet_reporting_graph_action" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="fleet_vehicle_cost_view_graph"/>
<field name="act_window_id" ref="fleet_costs_reporting_action"/>
</record>
<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_mode">graph,pivot</field>
<field name="view_id"></field> <!-- force empty -->
<field name="context">{"search_default_parent_true" : True,}</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No data for analysis
</p><p>
Odoo helps you managing the costs for your different vehicles
Costs are generally created from services and contract and appears here.
</p><p>
Thanks to the different filters, Odoo can only print the effective
costs, sort them by type and by vehicle.
</p>
</field>
</record>
<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_cost_indicative_view_pivot"/>
<field name="act_window_id" ref="fleet_costs_reporting_non_effective_action"/>
</record>
<record id="view_fleet_non_effective_graph_action" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">graph</field>
<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="Reporting" 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="fleet_costs_reporting_action"
sequence="1"
groups="fleet_group_manager"/>
<menuitem id="menu_fleet_reporting_indicative_costs"
name="Indicative Costs"
parent="menu_fleet_reporting"
action="fleet_costs_reporting_non_effective_action"
sequence="2"
groups="fleet_group_manager"/>
</odoo>
+46 -388
View File
@@ -1,203 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<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">
<tree string="Vehicle Costs">
<field name="currency_id" invisible="1"/>
<field name="vehicle_id"/>
<field name="description"/>
<field name="cost_subtype_id"/>
<field name="date"/>
<field name="amount" sum="Cost" widget="monetary"/>
</tree>
</field>
</record>
<record id='fleet_vehicle_cost_view_kanban' model='ir.ui.view'>
<field name="name">fleet.vehicle.cost.kanban</field>
<field name="model">fleet.vehicle.cost</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div>
<strong>
<field name="vehicle_id"/>
<span class="float-right"><field name="date"/></span>
</strong>
</div>
<div>
<field name="cost_subtype_id"/>
<span class="float-right"><field name="amount" widget="monetary"/></span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<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">
<pivot string="Vehicles costs">
<field name="vehicle_id" type="row"/>
<field name="cost_type" type="row"/>
<field name="date" interval="year" type="col"/>
<field name="amount" type="measure"/>
</pivot>
</field>
</record>
<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">
<graph string="Vehicles costs">
<field name="vehicle_id"/>
<field name="date" interval="year"/>
<field name="amount" type="measure"/>
</graph>
</field>
</record>
<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">
<pivot string="Vehicles costs" >
<field name="vehicle_id" type="row"/>
<field name="cost_type" type="col"/>
<field name="amount" type="measure"/>
</pivot>
</field>
</record>
<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">
<graph string="Vehicles costs">
<field name="parent_id" type="row"/>
<field name="cost_type" type="col"/>
<field name="amount" type="measure"/>
</graph>
</field>
</record>
<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">
<search string="Vehicles costs" >
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="date"/>
<field name="parent_id"/>
<filter name="parent_false" domain="[('parent_id','=',False)]" string="Effective Costs"/>
<filter name="parent_true" domain="[('parent_id','!=',False)]" string="Indicative Costs"/>
<group expand="1" string="Group By">
<filter name="groupby_cost_type" context="{'group_by': 'cost_type'}" string="Cost Type"/>
<filter name="groupby_cost_subtype_id" context="{'group_by': 'cost_subtype_id'}" string="Cost Subtype"/>
<filter name="groupby_vehicle_id" context="{'group_by': 'vehicle_id'}" string="Vehicle"/>
<filter name="groupby_parent_id" context="{'group_by': 'parent_id'}" string="Parent"/>
<separator/>
<filter name="groupby_date" context="{'group_by': 'date:month'}" string="Date" help="Vehicle Costs by Date"/>
</group>
</search>
</field>
</record>
<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">
<form string="Vehicle costs">
<sheet>
<field name="currency_id" invisible="1"/>
<group col="2" string="Cost Details">
<group>
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="amount" widget="monetary"/>
<field name="description"/>
</group>
<group>
<field name="date"/>
<field name="parent_id" groups="base.group_no_one"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<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">
<graph string="Costs Per Month" stacked="True">
<field name="date" type="row"/>
<field name="vehicle_id" type="col"/>
<field name="amount" type="measure"/>
</graph>
</field>
</record>
<record id='fleet_vehicle_costs_action' model='ir.actions.act_window'>
<field name="name">Vehicles Costs</field>
<field name="res_model">fleet.vehicle.cost</field>
<field name="view_mode">tree,kanban,form,graph</field>
<field name="context">{"search_default_parent_false" : True, "search_default_groupby_vehicle_id" : True,}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new cost
</p><p>
Manage the costs for your different vehicles.
Costs are created automatically from services, contracts and fuel logs.
</p>
</field>
</record>
<menuitem action="fleet_vehicle_costs_action" parent="fleet_vehicles" id="fleet_vehicle_costs_menu" groups="fleet_group_manager"/>
<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 name="contract_close" states="open,diesoon,expired,future" type="object" class="oe_highlight" string="Close Contract" groups="fleet.fleet_group_manager"/>
<button 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" attrs="{'invisible': [('state', '=', 'open')]}" 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"/>
<button name="contract_open" states="futur" type="object" string="Start Contract" class="oe_highlight" groups="fleet.fleet_group_manager"/>
<button name="contract_close" states="futur" type="object" string="Cancel" groups="fleet.fleet_group_manager"/>
<button name="contract_close" states="open,expired,future" type="object" class="oe_highlight" string="Close Contract" groups="fleet.fleet_group_manager"/>
<button name="contract_draft" states="closed" type="object" string="Reset To Draft" groups="fleet.fleet_group_manager"/>
<field name="state" widget="statusbar" />
</header>
<sheet>
<field name="active" invisible="1"/>
<widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<field name="currency_id" invisible="1"/>
<div class="oe_title">
<h1><field name="name"/></h1>
</div>
<group col="2">
<group string="Contract Informations">
<field name="active" invisible="1"/>
<field name="ins_ref"/>
<field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
<field name="insurer_id"/>
<field name="user_id"/>
<field name="cost_subtype_id"/>
<field name="insurer_id"/>
<field name="ins_ref"/>
</group>
<group string="Vehicle Informations">
<field name="vehicle_id"/>
<field name="purchaser_id"/>
<label for="odometer"/>
<div class="o_row">
<field name="odometer"/>
<field name="odometer_unit"/>
</div>
</group>
</group>
<group col="2">
@@ -215,33 +46,9 @@
<field name="expiration_date" attrs="{'required': [('cost_frequency', '!=', 'no')]}"/>
</group>
</group>
<notebook>
<page string="Included Services">
<group>
<field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1">
<tree editable="bottom">
<field name="currency_id" invisible="1"/>
<field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
<field name="description"/>
<field name="amount" sum="Price" string="Indicative Cost" widget="monetary"/>
</tree>
</field>
</group>
</page>
<page string="Generated Recurring Costs">
<group>
<field name="generated_cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" sum="amount">
<tree editable="bottom" >
<field name="currency_id" invisible="1"/>
<field name="date" />
<field name="amount" sum="amount" widget="monetary"/>
</tree>
</field>
</group>
</page>
</notebook>
<group string="Included Services">
<field name="service_ids" widget="many2many_tags" nolabel="1"/>
</group>
<group string="Terms and Conditions">
<field name="notes" nolabel="1" placeholder="Write here all other information relative to this contract" />
</group>
@@ -255,26 +62,17 @@
</field>
</record>
<act_window
id="act_renew_contract"
name="Renew Contract"
res_model="fleet.vehicle.log.contract"
binding_model="fleet.vehicle.log.contract"
binding_views="form"
view_mode="form"
/>
<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">
<tree string="Contract logs" decoration-warning="state=='diesoon'" decoration-danger="days_left==0" decoration-muted="state=='closed'">
<tree string="Contract logs" decoration-danger="days_left==0" decoration-muted="state=='closed'" default_order="expiration_date">
<field name="active" invisible="1"/>
<field name="name" />
<field name="start_date" />
<field name="expiration_date" />
<field name="days_left" invisible="1"/>
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="insurer_id" />
<field name="purchaser_id"/>
<field name="cost_generated"/>
@@ -308,7 +106,6 @@
</div>
<div>
<field name="insurer_id"/>
<span class="float-right"><field name="cost_subtype_id"/></span>
</div>
</div>
</t>
@@ -324,7 +121,7 @@
<graph string="Contract Costs Per Month" type="bar" stacked="True">
<field name="date" type="row"/>
<field name="vehicle_id" type="row"/>
<field name="cost_amount" type="measure"/>
<field name="amount" type="measure"/>
</graph>
</field>
</record>
@@ -334,13 +131,12 @@
<field name="model">fleet.vehicle.log.contract</field>
<field name="arch" type="xml">
<search string="Vehicles Contracts">
<field name="vehicle_id" string="Vehicle" filter_domain="[('vehicle_id.name', 'ilike', self)]"/>
<field name="purchaser_id" string="Driver" filter_domain="[('purchaser_id', 'child_of', self)]"/>
<field name="insurer_id" string="Vendor" filter_domain="[('insurer_id', 'child_of', self)]"/>
<field name="cost_subtype_id" string="Service Type" filter_domain="[('cost_ids.cost_subtype_id', 'ilike', self)]"/>
<filter string="In Progress" name="open" domain="[('state', 'in', ['open', 'diesoon'])]"/>
<field name="vehicle_id" string="Vehicle" filter_domain="[('vehicle_id.name','ilike', self)]"/>
<field name="purchaser_id" string="Driver" filter_domain="[('purchaser_id','child_of', self)]"/>
<field name="insurer_id" string="Vendor" filter_domain="[('insurer_id','child_of', self)]"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<filter string="In Progress" name="open" domain="[('state', '=', 'open')]"/>
<filter string="Expired" name="expired" domain="[('state', '=', 'expired')]"/>
<filter string="Expiring Soon" name="expire_soon" domain="[('state', '=', 'diesoon')]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
<separator/>
@@ -369,7 +165,6 @@
<img t-att-src="activity_image('res.partner', 'image_128', record.purchaser_id.raw_value)" t-att-title="record.purchaser_id.value" t-att-alt="record.purchaser_id.value"/>
<div>
<field name="vehicle_id" display="full"/>
<field name="cost_subtype_id" muted="1" display="full"/>
</div>
</div>
</templates>
@@ -378,7 +173,7 @@
</record>
<record id='fleet_vehicle_log_contract_action' model='ir.actions.act_window'>
<field name="name">Vehicles Contracts</field>
<field name="name">Contracts</field>
<field name="res_model">fleet.vehicle.log.contract</field>
<field name="view_mode">tree,kanban,form,graph,activity</field>
<field name="context">{'search_default_open': 1}</field>
@@ -396,149 +191,25 @@
</field>
</record>
<menuitem action="fleet_vehicle_log_contract_action" parent="fleet_vehicles" id="fleet_vehicle_log_contract_menu" groups="fleet_group_user"/>
<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">
<form string="Fuel Logs">
<sheet>
<group>
<group string="Vehicle Details">
<field name="vehicle_id"/>
</group>
<group string="Refueling Details">
<field name="liter"/>
<field name="price_per_liter"/>
<field name="amount"/>
</group>
</group>
<group>
<group string="Odometer Details">
<label for="odometer"/>
<div class="o_row">
<field name="odometer"/>
<field name="odometer_unit"/>
</div>
</group>
<group string="Additional Details">
<field name="date" />
<field name="purchaser_id" />
<field name="inv_ref" />
<field name="vendor_id"/>
</group>
</group>
<field name="notes" placeholder="Write here any other information"/>
</sheet>
</form>
</field>
</record>
<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">
<tree string="Fuel Logs">
<field name="date" />
<field name="vehicle_id" />
<field name="purchaser_id" />
<field name="inv_ref" invisible="1"/>
<field name="vendor_id" invisible="1"/>
<field name="odometer" />
<field name="odometer_unit" />
<field name="liter" />
<field name="price_per_liter" invisible="1"/>
<field name="amount" sum="Price"/>
</tree>
</field>
</record>
<record id='fleet_vehicle_log_fuel_view_kanban' model='ir.ui.view'>
<field name="name">fleet.vehicle.log.fuel.kanban</field>
<field name="model">fleet.vehicle.log.fuel</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div>
<strong>
<field name="vehicle_id"/>
<span class="float-right"><field name="date"/></span>
</strong>
</div>
<div>
<span><field name="purchaser_id"/></span>
</div>
<div>
<span><field name="liter"/> Liter</span>
<span class="float-right"><field name="amount"/></span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<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">
<search string="Vehicles Fuel Logs" >
<field name="vehicle_id" />
<field name="date"/>
<field name="purchaser_id" />
<field name="liter" />
<field name="amount" sum="Price"/>
<group expand="0" string="Group By">
<filter name="groupby_vehicle" context="{'group_by' : 'vehicle_id'}" string="Vehicle"/>
</group>
</search>
</field>
</record>
<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">
<graph string="Fuel Costs Per Month">
<field name="vehicle_id" type="row"/>
<field name="cost_amount" type="measure"/>
</graph>
</field>
</record>
<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_mode">tree,kanban,form,graph</field>
<field name="context">{"search_default_groupby_vehicle" : True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new fuel log
</p><p>
Here you can add refuelling entries for all vehicles.
</p>
</field>
</record>
<menuitem action="fleet_vehicle_log_fuel_action" parent="fleet_vehicles" id="fleet_vehicle_log_fuel_menu" groups="fleet_group_user"/>
<menuitem action="fleet_vehicle_log_contract_action" parent="fleet_vehicles" id="fleet_vehicle_log_contract_menu" groups="fleet_group_user" sequence="2"/>
<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">
<form string="Services Logs">
<field name="currency_id" invisible="1" />
<sheet>
<group col="2">
<group string="Services Details">
<field name="vehicle_id"/>
<field name="cost_subtype_id" string="Service Type" domain="['|',('category','=','service'),('category','=','both')]" required="1"/>
<field name="amount"/>
<group>
<field name="service_type_id" />
<field name="date" />
<field name="amount" widget="monetary"/>
<field name="vendor_id"/>
</group>
<group string="Odometer Details">
<group>
<field name="vehicle_id"/>
<field name="purchaser_id"/>
<label for="odometer"/>
<div class="o_row">
<field name="odometer"/>
@@ -546,26 +217,15 @@
</div>
</group>
</group>
<group col="2">
<group string="Additional Details">
<field name="date" />
<field name="purchaser_id" />
<field name="vendor_id"/>
<field name="inv_ref" />
</group>
</group>
<group string="Included Services">
<field name="cost_ids" nolabel="1">
<tree string="Included Services" editable="bottom">
<field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
<field name="amount" sum="Price" string="Indicative Cost"/>
</tree>
</field>
</group>
<group string="Notes">
<field nolabel="1" name="notes" placeholder="Write here any other information related to the service completed."/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread" options='{"thread_level": 1}'/>
</div>
</form>
</field>
</record>
@@ -576,11 +236,11 @@
<field name="arch" type="xml">
<tree string="Services Logs">
<field name="date" />
<field name="service_type_id" />
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="purchaser_id"/>
<field name="vendor_id" />
<field name="inv_ref" />
<field name="inv_ref" invisible="1" />
<field name="notes" />
<field name="amount" sum="Total"/>
</tree>
@@ -592,6 +252,7 @@
<field name="model">fleet.vehicle.log.services</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
@@ -601,15 +262,12 @@
<span class="float-right"><field name="date"/></span>
</strong>
</div>
<div>
<field name="cost_subtype_id"/>
</div>
<div>
<field name="purchaser_id"/>
</div>
<div>
<span><field name="vendor_id"/></span>
<span class="float-right"><field name="amount"/></span>
<span class="float-right"><field name="amount" widget="monetary"/></span>
</div>
</div>
</t>
@@ -625,7 +283,7 @@
<graph string="Services Costs Per Month" stacked="True">
<field name="date" type="row"/>
<field name="vehicle_id" type="row"/>
<field name="cost_amount" type="measure"/>
<field name="amount" type="measure"/>
</graph>
</field>
</record>
@@ -636,13 +294,13 @@
<field name="arch" type="xml">
<search string="Services Logs" >
<field name="vehicle_id"/>
<field name="cost_subtype_id"/>
<field name="service_type_id"/>
</search>
</field>
</record>
<record id='fleet_vehicle_log_services_action' model='ir.actions.act_window'>
<field name="name">Vehicles Services Logs</field>
<field name="name">Services</field>
<field name="res_model">fleet.vehicle.log.services</field>
<field name="view_mode">tree,kanban,form,graph</field>
<field name="help" type="html">
@@ -655,6 +313,6 @@
</field>
</record>
<menuitem action="fleet_vehicle_log_services_action" parent="fleet_vehicles" id="fleet_vehicle_log_services_menu" groups="fleet_group_user"/>
<menuitem action="fleet_vehicle_log_services_action" parent="fleet_vehicles" id="fleet_vehicle_log_services_menu" groups="fleet_group_user" sequence="3"/>
</odoo>
@@ -6,6 +6,7 @@
<field name="arch" type="xml">
<form string="Model">
<sheet>
<widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<field name="image_128" widget='image' class="oe_avatar"/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
@@ -19,6 +20,7 @@
</div>
<group>
<group>
<field name="active" invisible="1"/>
<field name="manager_id" groups="fleet.fleet_group_manager"/>
</group>
</group>
@@ -144,7 +146,7 @@
<field name="name" />
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_vignette oe_semantic_html_override">
<div class="oe_kanban_vignette oe_semantic_html_override oe_kanban_global_click">
<a type="open" href="#" class="o_kanban_image oe_kanban_action">
<img alt="Open" t-att-src="kanban_image('fleet.vehicle.model.brand', 'image_128', record.id.raw_value)" class="img-fluid" style="width:100px;"/>
</a>
@@ -155,6 +157,12 @@
</a>
</h4>
</div>
<div class="o_kanban_button">
<a type="object" name="action_brand_model" class="oe_kanban_action oe_kanban_action_a">
<field name="model_count"/>
MODELS
</a>
</div>
</div>
</t>
</templates>
+13 -45
View File
@@ -26,14 +26,6 @@
help="show the contract for this vehicle">
<field name="contract_count" widget="statinfo" string="Contracts"/>
</button>
<button name="act_show_log_cost"
type="object"
class="oe_stat_button"
icon="fa-usd"
help="show all the costs for this vehicle"
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"
@@ -42,14 +34,6 @@
help="show the services logs for this vehicle" >
<field name="service_count" widget="statinfo" string="Services"/>
</button>
<button name="return_action_to_open"
type="object"
class="oe_stat_button"
icon="fa-flask"
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>
<button name="return_action_to_open"
type="object"
class="oe_stat_button"
@@ -127,6 +111,9 @@
<field name="power"/><span>kW</span>
</div>
</group>
<group string="Description">
<field name="description" nolabel="1" placeholder="Write here any other information related to this vehicle" />
</group>
</group>
</sheet>
<div class="oe_chatter">
@@ -150,6 +137,7 @@
<field name="future_driver_id"/>
<field name="log_drivers" invisible="1"/>
<field name="vin_sn"/>
<field name="co2"/>
<field name="acquisition_date"/>
<field name="state_id"/>
<field name="company_id" groups="base.group_multi_company"/>
@@ -228,7 +216,7 @@
</div>
<div class="oe_kanban_details">
<strong class="o_kanban_record_title">
<field name="license_plate"/> : <field name="model_id"/>
<t t-if="license_plate"><field name="license_plate"/> :</t> <field name="model_id"/>
</strong>
<div class="o_kanban_tags_section">
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
@@ -292,19 +280,17 @@
<field name="name">Vehicles</field>
<field name="res_model">fleet.vehicle</field>
<field name="view_mode">kanban,tree,form,activity</field>
<field name="context">{'search_default_groupby_status': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new vehicle
</p><p>
Manage your fleet by keeping track of the contracts, services, odometers and fuel logs associated to each vehicle.
Manage your fleet by keeping track of the contracts, services and odometers associated to each vehicle.
</p>
</field>
</record>
<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"/>
<menuitem action="fleet_vehicle_model_action" parent="fleet_vehicles" id="fleet_vehicle_model_menu" sequence="11"/>
<menuitem action="fleet_vehicle_action" parent="fleet_vehicles" id="fleet_vehicle_menu" groups="fleet_group_user" sequence="1"/>
<record id='fleet_vehicle_odometer_view_form' model='ir.ui.view'>
<field name="name">fleet.vehicle.odometer.form</field>
@@ -390,10 +376,10 @@
</record>
<record id='fleet_vehicle_odometer_action' model='ir.actions.act_window'>
<field name="name">Vehicles Odometer</field>
<field name="name">Odometers</field>
<field name="res_model">fleet.vehicle.odometer</field>
<field name="view_mode">tree,kanban,form,graph</field>
<field name="context">{"search_default_groupby_vehicle" : True}</field>
<field name="context"></field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new odometer log
@@ -403,7 +389,7 @@
</field>
</record>
<menuitem action="fleet_vehicle_odometer_action" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="fleet_group_user"/>
<menuitem action="fleet_vehicle_odometer_action" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" groups="fleet_group_user" sequence="10"/>
<record id='fleet_vehicle_service_types_view_tree' model='ir.ui.view'>
<field name="name">fleet.service.type.tree</field>
@@ -411,7 +397,6 @@
<field name="arch" type="xml">
<tree string="Service Types" editable="top">
<field name="name" />
<field name="category" invisible="1"/>
</tree>
</field>
</record>
@@ -420,8 +405,6 @@
<field name="name">Service Types</field>
<field name="res_model">fleet.service.type</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('category','=','service')]</field>
<field name="context">{'default_category':'service'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new type of service
@@ -430,22 +413,7 @@
</p>
</field>
</record>
<menuitem action="fleet_vehicle_service_types_action" parent="fleet_configuration" id="fleet_vehicle_service_types_menu" sequence="3"/>
<record id='fleet_vehicle_contract_types_action' model='ir.actions.act_window'>
<field name="name">Contract Types</field>
<field name="res_model">fleet.service.type</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('category','=','contract')]</field>
<field name="context">{'default_category':'contract'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new type of contract
</p>
</field>
</record>
<menuitem action="fleet_vehicle_contract_types_action" parent="fleet_configuration" id="fleet_vehicle_contract_types_menu" sequence="4"/>
<menuitem action="fleet_vehicle_service_types_action" parent="fleet_configuration" id="fleet_vehicle_service_types_menu" sequence="3" groups="base.group_no_one"/>
<record id='fleet_vehicle_state_view_tree' model='ir.ui.view'>
<field name="name">fleet.vehicle.state.tree</field>
@@ -472,7 +440,7 @@
</field>
</record>
<menuitem action="fleet_vehicle_state_action" parent="fleet_configuration" id="fleet_vehicle_state_menu" groups="fleet_group_manager"/>
<menuitem action="fleet_vehicle_state_action" parent="fleet_configuration" id="fleet_vehicle_state_menu" groups="base.group_no_one"/>
<record id="fleet_vehicle_tag_view_view_form" model="ir.ui.view">
<field name="name">fleet.vehicle.tag.form</field>
@@ -508,7 +476,7 @@
</field>
</record>
<menuitem id="fleet_vehicle_tag_menu" parent="fleet_configuration" action="fleet_vehicle_tag_action" sequence="89"/>
<menuitem id="fleet_vehicle_tag_menu" parent="fleet_configuration" action="fleet_vehicle_tag_action" sequence="89" groups="base.group_no_one"/>
<record id="fleet_vehicle_assignation_log_view_list" model="ir.ui.view">
<field name="name">fleet.vehicle.assignation.log.view.tree</field>