diff options
| -rw-r--r-- | addons/fleet/__init__.py | 1 | ||||
| -rw-r--r-- | addons/fleet/__manifest__.py | 8 | ||||
| -rw-r--r-- | addons/fleet/data/fleet_data.xml | 15 | ||||
| -rw-r--r-- | addons/fleet/data/fleet_demo.xml | 679 | ||||
| -rw-r--r-- | addons/fleet/models/fleet_vehicle.py | 81 | ||||
| -rw-r--r-- | addons/fleet/models/fleet_vehicle_cost.py | 315 | ||||
| -rw-r--r-- | addons/fleet/models/fleet_vehicle_model.py | 31 | ||||
| -rw-r--r-- | addons/fleet/report/__init__.py | 1 | ||||
| -rw-r--r-- | addons/fleet/report/fleet_report.py | 131 | ||||
| -rw-r--r-- | addons/fleet/security/fleet_security.xml | 30 | ||||
| -rw-r--r-- | addons/fleet/security/ir.model.access.csv | 4 | ||||
| -rw-r--r-- | addons/fleet/views/fleet_board_view.xml | 98 | ||||
| -rw-r--r-- | addons/fleet/views/fleet_vehicle_cost_views.xml | 434 | ||||
| -rw-r--r-- | addons/fleet/views/fleet_vehicle_model_views.xml | 10 | ||||
| -rw-r--r-- | addons/fleet/views/fleet_vehicle_views.xml | 58 |
15 files changed, 479 insertions, 1417 deletions
diff --git a/addons/fleet/__init__.py b/addons/fleet/__init__.py index be9f4fab00a..8484f21c236 100644 --- a/addons/fleet/__init__.py +++ b/addons/fleet/__init__.py @@ -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 diff --git a/addons/fleet/__manifest__.py b/addons/fleet/__manifest__.py index a61d2508b9d..548c08330d3 100644 --- a/addons/fleet/__manifest__.py +++ b/addons/fleet/__manifest__.py @@ -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 """, diff --git a/addons/fleet/data/fleet_data.xml b/addons/fleet/data/fleet_data.xml index 912688a0323..a7d52b59b88 100644 --- a/addons/fleet/data/fleet_data.xml +++ b/addons/fleet/data/fleet_data.xml @@ -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> diff --git a/addons/fleet/data/fleet_demo.xml b/addons/fleet/data/fleet_demo.xml index 24d3e93783f..f18087df910 100644 --- a/addons/fleet/data/fleet_demo.xml +++ b/addons/fleet/data/fleet_demo.xml @@ -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> diff --git a/addons/fleet/models/fleet_vehicle.py b/addons/fleet/models/fleet_vehicle.py index 6f61451c914..389b77a87a0 100644 --- a/addons/fleet/models/fleet_vehicle.py +++ b/addons/fleet/models/fleet_vehicle.py @@ -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): @@ -257,6 +254,12 @@ class FleetVehicle(models.Model): 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 [] if operator == 'ilike' and not (name or '').strip(): @@ -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' diff --git a/addons/fleet/models/fleet_vehicle_cost.py b/addons/fleet/models/fleet_vehicle_cost.py index 69c55dce09a..ab073a6a877 100644 --- a/addons/fleet/models/fleet_vehicle_cost.py +++ b/addons/fleet/models/fleet_vehicle_cost.py @@ -6,78 +6,8 @@ from odoo.exceptions import UserError from dateutil.relativedelta import relativedelta - -class FleetVehicleCost(models.Model): - _name = 'fleet.vehicle.cost' - _description = 'Cost related to a vehicle' - _order = 'date desc, vehicle_id asc' - - 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) - 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') - - def _get_odometer(self): - self.odometer = 0.0 - for record in self: - record.odometer = False - if record.odometer_id: - record.odometer = record.odometer_id.value - - def _set_odometer(self): - for record in self: - if not record.odometer: - raise UserError(_('Emptying the odometer value of a vehicle is not allowed.')) - odometer = self.env['fleet.vehicle.odometer'].create({ - 'value': record.odometer, - 'date': record.date or fields.Date.context_today(record), - 'vehicle_id': record.vehicle_id.id - }) - self.odometer_id = odometer - - @api.model_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' @@ -87,18 +17,13 @@ class FleetVehicleLogContract(models.Model): 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) + 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, @@ -108,13 +33,11 @@ class FleetVehicleLogContract(models.Model): 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) + 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'), - ('diesoon', 'Expiring Soon'), ('expired', 'Expired'), ('closed', 'Closed') ], 'Status', default='open', readonly=True, @@ -122,34 +45,22 @@ class FleetVehicleLogContract(models.Model): 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_generated = fields.Float('Recurring Cost') 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') + ], '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', 'date') + @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 - if record.date: - name += ' / ' + str(record.date) + name = record.cost_subtype_id.name + ' ' + name record.name = name @api.depends('expiration_date', 'state') @@ -160,7 +71,7 @@ class FleetVehicleLogContract(models.Model): 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']: + 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 @@ -168,16 +79,6 @@ class FleetVehicleLogContract(models.Model): 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'): @@ -188,80 +89,14 @@ class FleetVehicleLogContract(models.Model): 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' - 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 @@ -272,7 +107,6 @@ class FleetVehicleLogContract(models.Model): 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, @@ -288,67 +122,12 @@ class FleetVehicleLogContract(models.Model): 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'} + _inherit = ['mail.thread', 'mail.activity.mixin'] + _rec_name = 'service_type_id' _description = 'Services for vehicles' @api.model @@ -357,22 +136,48 @@ class FleetVehicleLogServices(models.Model): 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' + 'service_type_id': service.id if service else None, }) return res - purchaser_id = fields.Many2one('res.partner', 'Purchaser') - inv_ref = fields.Char('Invoice Reference') + 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') + 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') - # 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') + service_type_id = fields.Many2one('fleet.service.type', 'Service Type', required=True) - @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 + def _get_odometer(self): + self.odometer = 0 + for record in self: + if record.odometer_id: + record.odometer = record.odometer_id.value + + def _set_odometer(self): + for record in self: + if not record.odometer: + raise UserError(_('Emptying the odometer value of a vehicle is not allowed.')) + odometer = self.env['fleet.vehicle.odometer'].create({ + 'value': record.odometer, + 'date': record.date or fields.Date.context_today(record), + 'vehicle_id': record.vehicle_id.id + }) + self.odometer_id = odometer + + @api.model_create_multi + def create(self, vals_list): + for data in vals_list: + 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(FleetVehicleLogServices, self).create(vals_list)
\ No newline at end of file diff --git a/addons/fleet/models/fleet_vehicle_model.py b/addons/fleet/models/fleet_vehicle_model.py index ab6981c7600..53bc2759b68 100644 --- a/addons/fleet/models/fleet_vehicle_model.py +++ b/addons/fleet/models/fleet_vehicle_model.py @@ -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 diff --git a/addons/fleet/report/__init__.py b/addons/fleet/report/__init__.py new file mode 100644 index 00000000000..a5b36f4db3f --- /dev/null +++ b/addons/fleet/report/__init__.py @@ -0,0 +1 @@ +from . import fleet_report diff --git a/addons/fleet/report/fleet_report.py b/addons/fleet/report/fleet_report.py new file mode 100644 index 00000000000..6d1fdc56497 --- /dev/null +++ b/addons/fleet/report/fleet_report.py @@ -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))
\ No newline at end of file diff --git a/addons/fleet/security/fleet_security.xml b/addons/fleet/security/fleet_security.xml index aab267a175c..4e8b55c45e0 100644 --- a/addons/fleet/security/fleet_security.xml +++ b/addons/fleet/security/fleet_security.xml @@ -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"/> diff --git a/addons/fleet/security/ir.model.access.csv b/addons/fleet/security/ir.model.access.csv index 127ed636912..6da83f50983 100644 --- a/addons/fleet/security/ir.model.access.csv +++ b/addons/fleet/security/ir.model.access.csv @@ -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
\ No newline at end of file diff --git a/addons/fleet/views/fleet_board_view.xml b/addons/fleet/views/fleet_board_view.xml index 755e2f32956..f577a8063ef 100644 --- a/addons/fleet/views/fleet_board_view.xml +++ b/addons/fleet/views/fleet_board_view.xml @@ -1,42 +1,56 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> - <record id="fleet_costs_reporting_action" model="ir.actions.act_window"> - <field name="name">Costs Analysis</field> - <field name="res_model">fleet.vehicle.cost</field> - <field name="view_mode">graph,pivot</field> - <field name="view_id"></field> <!-- force empty --> - <field name="context">{"search_default_parent_false" : 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 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_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 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_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 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_non_effective_action" model="ir.actions.act_window"> - <field name="name">Indicative Costs Analysis</field> - <field name="res_model">fleet.vehicle.cost</field> + + <record id="fleet_costs_reporting_action" model="ir.actions.act_window"> + <field name="name">Costs Analysis</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_true" : 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 @@ -49,31 +63,11 @@ </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> diff --git a/addons/fleet/views/fleet_vehicle_cost_views.xml b/addons/fleet/views/fleet_vehicle_cost_views.xml index b29646e3a40..df09890c3f8 100644 --- a/addons/fleet/views/fleet_vehicle_cost_views.xml +++ b/addons/fleet/views/fleet_vehicle_cost_views.xml @@ -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"> @@ -602,14 +263,11 @@ </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> diff --git a/addons/fleet/views/fleet_vehicle_model_views.xml b/addons/fleet/views/fleet_vehicle_model_views.xml index 9f69f06f91e..12449915e66 100644 --- a/addons/fleet/views/fleet_vehicle_model_views.xml +++ b/addons/fleet/views/fleet_vehicle_model_views.xml @@ -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> diff --git a/addons/fleet/views/fleet_vehicle_views.xml b/addons/fleet/views/fleet_vehicle_views.xml index 829b75cc22d..49cc2975837 100644 --- a/addons/fleet/views/fleet_vehicle_views.xml +++ b/addons/fleet/views/fleet_vehicle_views.xml @@ -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" @@ -45,14 +37,6 @@ <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" icon="fa-tachometer" context="{'xml_id':'fleet_vehicle_odometer_action'}" help="show the odometer logs for this vehicle" > @@ -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> |
