159 lines
7.2 KiB
Python
159 lines
7.2 KiB
Python
# -*- coding:utf-8 -*-
|
|
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
|
|
|
import babel.dates
|
|
|
|
from flectra import api, fields, models
|
|
|
|
from flectra.fields import Datetime
|
|
|
|
|
|
class FleetVehicle(models.Model):
|
|
_inherit = 'fleet.vehicle'
|
|
|
|
co2_fee = fields.Float(compute='_compute_co2_fee', string="CO2 Fee")
|
|
total_depreciated_cost = fields.Float(compute='_compute_total_depreciated_cost',
|
|
string="Total Cost (Depreciated)", track_visibility="onchange",
|
|
help="This includes all the depreciated costs and the CO2 fee")
|
|
total_cost = fields.Float(compute='_compute_total_cost', string="Total Cost", help="This include all the costs and the CO2 fee")
|
|
fuel_type = fields.Selection(required=True, default='diesel')
|
|
atn = fields.Float(compute='_compute_car_atn', string="ATN")
|
|
acquisition_date = fields.Date(required=True)
|
|
|
|
@api.depends('co2_fee', 'log_contracts', 'log_contracts.state', 'log_contracts.recurring_cost_amount_depreciated')
|
|
def _compute_total_depreciated_cost(self):
|
|
for car in self:
|
|
car.total_depreciated_cost = car.co2_fee + \
|
|
sum(car.log_contracts.filtered(
|
|
lambda contract: contract.state == 'open'
|
|
).mapped('recurring_cost_amount_depreciated'))
|
|
|
|
@api.depends('co2_fee', 'log_contracts', 'log_contracts.state', 'log_contracts.cost_generated')
|
|
def _compute_total_cost(self):
|
|
for car in self:
|
|
car.total_cost = car.co2_fee
|
|
contracts = car.log_contracts.filtered(
|
|
lambda contract: contract.state == 'open' and contract.cost_frequency != 'no'
|
|
)
|
|
for contract in contracts:
|
|
if contract.cost_frequency == "daily":
|
|
car.total_cost += contract.cost_generated * 30.0
|
|
elif contract.cost_frequency == "weekly":
|
|
car.total_cost += contract.cost_generated * 4.0
|
|
elif contract.cost_frequency == "monthly":
|
|
car.total_cost += contract.cost_generated
|
|
elif contract.cost_frequency == "yearly":
|
|
car.total_cost += contract.cost_generated / 12.0
|
|
|
|
def _get_co2_fee(self, co2):
|
|
return max((((co2 * 9.0) - 600.0) * 1.2488) / 12.0, 0.0)
|
|
|
|
@api.depends('co2')
|
|
def _compute_co2_fee(self):
|
|
for car in self:
|
|
car.co2_fee = self._get_co2_fee(car.co2)
|
|
|
|
@api.depends('fuel_type', 'car_value', 'acquisition_date')
|
|
def _compute_car_atn(self):
|
|
for car in self:
|
|
car.atn = car._get_car_atn(car.acquisition_date, car.car_value, car.fuel_type, car.co2)
|
|
|
|
@api.depends('model_id', 'license_plate', 'log_contracts', 'acquisition_date',
|
|
'co2_fee', 'log_contracts', 'log_contracts.state', 'log_contracts.recurring_cost_amount_depreciated')
|
|
def _compute_vehicle_name(self):
|
|
super(FleetVehicle, self)._compute_vehicle_name()
|
|
for vehicle in self:
|
|
acquisition_date = vehicle._get_acquisition_date()
|
|
vehicle.name += u" \u2022 " + str(round(vehicle.total_depreciated_cost, 2)) + u" \u2022 " + acquisition_date
|
|
|
|
def _get_acquisition_date(self):
|
|
self.ensure_one()
|
|
return babel.dates.format_date(
|
|
date=Datetime.from_string(self.acquisition_date),
|
|
format='MMMM y',
|
|
locale=self._context.get('lang') or 'en_US'
|
|
)
|
|
|
|
def _get_car_atn(self, acquisition_date, car_value, fuel_type, co2):
|
|
# Compute the correction coefficient from the age of the car
|
|
now = Datetime.from_string(Datetime.now())
|
|
start = Datetime.from_string(acquisition_date)
|
|
if start:
|
|
number_of_month = (now.year - start.year) * 12.0 + now.month - start.month + int(bool(now.day - start.day + 1))
|
|
if number_of_month <= 12:
|
|
age_coefficient = 1.00
|
|
elif number_of_month <= 24:
|
|
age_coefficient = 0.94
|
|
elif number_of_month <= 36:
|
|
age_coefficient = 0.88
|
|
elif number_of_month <= 48:
|
|
age_coefficient = 0.82
|
|
elif number_of_month <= 60:
|
|
age_coefficient = 0.76
|
|
else:
|
|
age_coefficient = 0.70
|
|
car_value = car_value * age_coefficient
|
|
# Compute atn value from corrected car_value
|
|
magic_coeff = 6.0 / 7.0 # Don't ask me why
|
|
if fuel_type == 'electric':
|
|
atn = 0.0
|
|
else:
|
|
if fuel_type in ['diesel', 'hybrid']:
|
|
reference = 87.0
|
|
else:
|
|
reference = 105.0
|
|
|
|
if co2 <= reference:
|
|
atn = car_value * max(0.04, (0.055 - 0.001 * (reference - co2))) * magic_coeff
|
|
else:
|
|
atn = car_value * min(0.18, (0.055 + 0.001 * (co2 - reference))) * magic_coeff
|
|
return max(1280, atn) / 12.0
|
|
|
|
|
|
class FleetVehicleLogContract(models.Model):
|
|
_inherit = 'fleet.vehicle.log.contract'
|
|
|
|
recurring_cost_amount_depreciated = fields.Float("Recurring Cost Amount (depreciated)")
|
|
|
|
class FleetVehicleModel(models.Model):
|
|
_inherit = 'fleet.vehicle.model'
|
|
|
|
default_recurring_cost_amount_depreciated = fields.Float(string="Cost (Depreciated)",
|
|
help="Default recurring cost amount that should be applied to a new car from this model")
|
|
default_co2 = fields.Float(string="CO2 emissions")
|
|
default_fuel_type = fields.Selection([('gasoline', 'Gasoline'), ('diesel', 'Diesel'), ('electric', 'Electric'), ('hybrid', 'Hybrid')], 'Fuel Type', help='Fuel Used by the vehicle')
|
|
default_car_value = fields.Float(string="Catalog Value (VAT Incl.)")
|
|
can_be_requested = fields.Boolean(string="Can be requested", help="Can be requested on a contract as a new car")
|
|
default_atn = fields.Float(compute='_compute_atn', string="ATN")
|
|
default_total_depreciated_cost = fields.Float(compute='_compute_default_total_depreciated_cost', string="Total Cost (Depreciated)")
|
|
co2_fee = fields.Float(compute='_compute_co2_fee', string="CO2 fee")
|
|
|
|
@api.depends('default_car_value', 'default_co2', 'default_fuel_type')
|
|
def _compute_atn(self):
|
|
now = Datetime.now()
|
|
for model in self:
|
|
model.default_atn = self.env['fleet.vehicle']._get_car_atn(now, model.default_car_value, model.default_fuel_type, model.default_co2)
|
|
|
|
@api.depends('co2_fee', 'default_recurring_cost_amount_depreciated')
|
|
def _compute_default_total_depreciated_cost(self):
|
|
for model in self:
|
|
model.default_total_depreciated_cost = model.co2_fee + model.default_recurring_cost_amount_depreciated
|
|
|
|
@api.multi
|
|
@api.depends('name', 'brand_id', 'default_total_depreciated_cost')
|
|
def name_get(self):
|
|
res = super(FleetVehicleModel, self).name_get()
|
|
new_res = []
|
|
for res_item in res:
|
|
model = self.browse(res_item[0])
|
|
if model.default_total_depreciated_cost != 0.0:
|
|
new_res.append((res_item[0], res_item[1] + u" \u2022 " + str(round(model.default_total_depreciated_cost, 2))))
|
|
else:
|
|
new_res.append(res_item)
|
|
return new_res
|
|
|
|
@api.depends('default_co2')
|
|
def _compute_co2_fee(self):
|
|
for model in self:
|
|
model.co2_fee = self.env['fleet.vehicle']._get_co2_fee(model.default_co2)
|