Skip to content

Commit

Permalink
Merge pull request #92 from iledarn/9.0-fleet_booking
Browse files Browse the repository at this point in the history
[WIP] 9.0 fleet booking
  • Loading branch information
Ivan Yelizariev authored Jul 4, 2016
2 parents 04e3637 + 2a3f2e1 commit 42d58ef
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 77 deletions.
58 changes: 1 addition & 57 deletions fleet_booking/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,63 +34,7 @@ Adds partner age restriction (must be 21 or elder) if he is customer (is custome
Vehicle Rental
----------------

The model ``fleet_booking.rental`` is used for working with different types of rental documents.

Each type of the documents has several states.

The types of the documents and their states are
* ``Rent``

* Quotation
* Booked
* Confirmed
* Extended
* Returned
* ``Extended Rent``

* Quotation
* Booked
* Confirmed
* Extended
* Returned
* ``Return``

* Return Draft
* Return Open
* Return Closed

All rental views are grouped under ``Fleet Rental`` top-level menu. There are the following submenu items available for
a user.

* Rent Quotations
* Confirmed Rents
* Draft Return Contracts
* Open Return Contracts
* Closed Return Contracts
* All Records

Under ``Rent Quotations`` are ``Rent`` and ``Extended Rent`` documents with ``Quotation`` or ``Booked`` states.
After confirmation they are available uder the ``Confirmed Rents``.

Buttons ``[Book Only]``, ``[Confirm Rental]`` are available in Rent Quotation.
Buttons ``[Return]``, ``[Extend]`` are available in Confirmed Rents.
A new record with type ``[Extended Rent]`` is created when a user clicks ``[Extend]`` button in Confirmed Rents.
Also a new record with type ``[Return]`` is created when a user clicks ``[Return]`` button.
The ``[Confirm Rental]`` and ``[Book Only]`` buttons change the state of existing records.
``[Confirm Rental]`` is only enabled if all fields related to payment are filled.
``[Print Rental Agreement]`` and ``[Create Invoice]`` buttons become enabled for Confirmed Rents.
When a document has related invoices then ``[Invoices]`` button become visible.
A user can click to it to see all related invoices.

Under ``Draft Return Contracts`` are ``Return`` documents that are not confirmed yet.
After confirmation as closed they are available under ``Closed Return Contracts``.
After confirmation as open they are availbale under ``Open Return Contracts``.

Buttons ``[Confirm Return]`` and ``[Return car and keep contract open]`` are available in Draft Return Contracts.
``[Confirm Return]`` button is only enabled if ``Balance`` is negative or ``Balance`` is positive and ``Paid Ammount`` is equal to ``Customer Shall Pay``.
``[Return Car and Keep Contract Open]`` button shall be enabled only if previous condition is false.


See ``fleet_rental_document`` module documentation.

Further information
-------------------
Expand Down
41 changes: 24 additions & 17 deletions fleet_rental_document/models/fleet_rental_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ class FleetRentalDocument(models.Model):

vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", required=True)

allowed_kilometer_per_day = fields.Integer(string='Allowed kilometer per day', readonly=True, default=0)
rate_per_extra_km = fields.Float(string='Rate per extra km', readonly=True, default=0)
daily_rental_price = fields.Float(string='Daily Rental Price', readonly=True, default=0)
allowed_kilometer_per_day = fields.Integer(string='Allowed kilometer per day', compute="_compute_vehicle_rental", store=True, readonly=True)
rate_per_extra_km = fields.Float(string='Rate per extra km', compute="_compute_vehicle_rental", store=True, readonly=True)
daily_rental_price = fields.Float(string='Daily Rental Price', compute="_compute_vehicle_rental", store=True, readonly=True)
odometer_before = fields.Float(string='Odometer', readonly=True, default=0)

extra_driver_charge_per_day = fields.Float(string='Extra Driver Charge per day', digits_compute=dp.get_precision('Product Price'), default=0)
Expand Down Expand Up @@ -60,15 +60,25 @@ class FleetRentalDocument(models.Model):

png_file = fields.Text('PNG', compute='_compute_png', store=False)

@api.depends('vehicle_id')
def _compute_vehicle_rental(self):
for record in self:
record.allowed_kilometer_per_day = record.vehicle_id.allowed_kilometer_per_day
record.rate_per_extra_km = record.vehicle_id.rate_per_extra_km
record.daily_rental_price = record.vehicle_id.daily_rental_price

@api.onchange('vehicle_id')
def on_change_vehicle_id(self):
self._compute_png()
self.allowed_kilometer_per_day = self.vehicle_id.allowed_kilometer_per_day
self.rate_per_extra_km = self.vehicle_id.rate_per_extra_km
self.daily_rental_price = self.vehicle_id.daily_rental_price

@api.multi
def _compute_png(self):
for rec in self:
f = open('/'.join([os.path.dirname(os.path.realpath(__file__)),
'static/src/img/car-cutout.svg']), 'r')
'../static/src/img/car-cutout.svg']), 'r')
svg_file = f.read()
dom = etree.fromstring(svg_file)
for line in rec.part_line_ids:
Expand Down Expand Up @@ -138,7 +148,16 @@ def _compute_total_rental_period(self):
end = datetime.strptime(record.return_datetime, DTF)
record.total_rental_period = (end - start).days

@api.depends('total_rental_period')
@api.onchange('exit_datetime', 'return_datetime')
def _onchange_dates(self):
if self.exit_datetime and self.return_datetime:
start = datetime.strptime(self.exit_datetime, DTF)
end = datetime.strptime(self.return_datetime, DTF)
self.total_rental_period = (end - start).days
self.period_rent_price = self.total_rental_period * self.daily_rental_price

@api.multi
@api.depends('vehicle_id', 'total_rental_period')
def _compute_period_rent_price(self):
for record in self:
if record.total_rental_period:
Expand Down Expand Up @@ -170,18 +189,6 @@ def _compute_balance(self):
for record in self:
record.balance = record.total_rent_price - record.advanced_deposit

@api.model
def create(self, vals):
vehicle_obj = self.env['fleet.vehicle']
vehicle = vehicle_obj.browse(vals.get('vehicle_id', []))
if len(vehicle) == 1:
vals.update({'allowed_kilometer_per_day': vehicle.allowed_kilometer_per_day,
'rate_per_extra_km': vehicle.rate_per_extra_km,
'daily_rental_price': vehicle.daily_rental_price,
'odometer_before': vehicle.odometer,
})
return super(FleetRentalDocument, self).create(vals)


class AccountInvoiceLine(models.Model):
_inherit = 'account.invoice.line'
Expand Down
22 changes: 22 additions & 0 deletions fleet_rental_document/models/fleet_rental_document_rent.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
import openerp
from openerp import models, fields, api
from datetime import datetime, date, timedelta
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DTF


class FleetRentalDocumentRent(models.Model):
Expand All @@ -27,6 +29,26 @@ class FleetRentalDocumentRent(models.Model):

document_return_id = fields.Many2one('fleet_rental.document_return')

@api.onchange('vehicle_id')
def on_change_vehicle_id(self):
self.mapped('document_id')._compute_png()
self.allowed_kilometer_per_day = self.vehicle_id.allowed_kilometer_per_day
self.rate_per_extra_km = self.vehicle_id.rate_per_extra_km
self.daily_rental_price = self.vehicle_id.daily_rental_price
self.period_rent_price = self.total_rental_period * self.daily_rental_price

@api.onchange('exit_datetime', 'return_datetime')
def _onchange_dates(self):
if self.exit_datetime and self.return_datetime:
start = datetime.strptime(self.exit_datetime, DTF)
end = datetime.strptime(self.return_datetime, DTF)
self.total_rental_period = (end - start).days
self.period_rent_price = self.total_rental_period * self.daily_rental_price

@api.onchange('period_rent_price', 'extra_driver_charge', 'other_extra_charges')
def _onchange_charges(self):
self.total_rent_price = self.period_rent_price + self.extra_driver_charge + self.other_extra_charges

@api.multi
def action_view_invoice(self):
return self.mapped('document_id').action_view_invoice()
Expand Down
46 changes: 43 additions & 3 deletions fleet_rental_document/models/fleet_rental_document_return.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,21 @@ class FleetRentalDocumentReturn(models.Model):

discount = fields.Float(string='Discount', digits_compute=dp.get_precision('Product Price'), default=0)
penalties = fields.Float(string='Penalties', digits_compute=dp.get_precision('Product Price'), default=0)
extra_hours_charge = fields.Float(string='Extra Hours Charge', digits_compute=dp.get_precision('Product Price'), compute="_compute_extra_hours", store=True, readonly=True, default=0)
extra_kilos_charge = fields.Float(string='Extra Kilos Charge', digits_compute=dp.get_precision('Product Price'), compute="_compute_extra_kilometers", store=True, readonly=True, default=0)
price_after_discount = fields.Float(string='Price After Discount', compute="_compute_price_after_discount", store=True, digits_compute=dp.get_precision('Product Price'), readonly=True)

@api.multi
@api.depends('period_rent_price', 'extra_driver_charge', 'other_extra_charges')
def _compute_total_rent_price(self):
for record in self:
record.total_rent_price = record.period_rent_price + record.extra_driver_charge + record.other_extra_charges

@api.onchange('period_rent_price', 'extra_driver_charge', 'other_extra_charges', 'extra_hours_charge', 'extra_kilos_charge', 'penalties')
def _onchange_total_price_fields(self):
self.total_rent_price = self.period_rent_price + self.extra_driver_charge + self.other_extra_charges + \
self.extra_hours_charge + self.extra_kilos_charge + self.penalties

@api.model
def create(self, vals):
if vals.get('name', 'New') == 'New':
Expand All @@ -51,18 +64,45 @@ def _compute_extra_hours(self):
if record.exit_datetime and record.return_datetime:
start = datetime.strptime(record.exit_datetime, DTF)
end = datetime.strptime(record.return_datetime, DTF)
extra_hours = (end - start).seconds // 3600
record.extra_hours = (end - start).seconds // 3600
record.extra_hours_charge = (record.daily_rental_price / 24) * extra_hours

@api.multi
@api.depends('vehicle_id.odometer', 'document_id.total_rental_period')
@api.depends('vehicle_id.odometer', 'document_id.total_rental_period', 'odometer_after')
def _compute_extra_kilometers(self):
for record in self:
if record.odometer_after and record.total_rental_period and record.allowed_kilometer_per_day:
kilometers_diff = record.odometer_after - record.odometer_before - (record.total_rental_period * record.allowed_kilometer_per_day)
record.extra_kilometers = kilometers_diff if kilometers_diff > 0 else 0
extra_kilometers = kilometers_diff if kilometers_diff > 0 else 0
record.extra_kilometers = extra_kilometers
record.extra_kilos_charge = extra_kilometers * record.rate_per_extra_km

@api.multi
@api.depends('document_id.total_rent_price', 'discount')
@api.depends('total_rent_price', 'discount')
def _compute_price_after_discount(self):
for record in self:
record.price_after_discount = record.total_rent_price - record.discount

@api.multi
@api.depends('price_after_discount', 'advanced_deposit')
def _compute_balance(self):
for record in self:
record.balance = record.price_after_discount - record.advanced_deposit

@api.onchange('price_after_discount')
def _onchange_price_after_discount(self):
self.balance = self.price_after_discount - self.advanced_deposit

@api.onchange('return_datetime')
def _onchange_return_datetime(self):
if self.exit_datetime and self.return_datetime:
start = datetime.strptime(self.exit_datetime, DTF)
end = datetime.strptime(self.return_datetime, DTF)
self.total_rental_period = (end - start).days
self.period_rent_price = self.total_rental_period * self.daily_rental_price

@api.onchange('odometer_before', 'odometer_after', 'total_rental_period')
def _onchange_period_or_odometer(self):
kilometers_diff = self.odometer_after - self.odometer_before - (self.total_rental_period * self.allowed_kilometer_per_day)
self.extra_kilometers = kilometers_diff if kilometers_diff > 0 else 0
1 change: 1 addition & 0 deletions fleet_rental_document/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ fleet_rental_item_to_check_model_access_right_user,fleet_rental_item_to_check_mo
fleet_rental_item_to_check_model_access_right,fleet_rental_item_to_check_model_access_right,model_fleet_rental_item_to_check,base.group_configuration,1,1,1,1
fleet_rental_check_line_model_access_right,fleet_rental_check_rental_model_access_right,model_fleet_rental_check_line,base.group_sale_salesman,1,1,1,1
fleet_rental_svg_vehicle_part_model_access_right_user,fleet_rental_svg_vehicle_part_model_access_right,model_fleet_rental_svg_vehicle_part,base.group_sale_salesman,1,0,0,0
access_fleet_rental_svg_vehicle_part_line,access_fleet_rental_svg_vehicle_part_line,model_fleet_rental_svg_vehicle_part_line,,1,0,0,0
2 changes: 2 additions & 0 deletions fleet_rental_document/views/fleet_rental_document_return.xml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@
<field name="extra_driver_charge" class="oe_inline"/>
<field name="other_extra_charges" class="oe_inline"/>
<field name="penalties" class="oe_inline"/>
<field name="extra_hours_charge" class="oe_inline"/>
<field name="extra_kilos_charge" class="oe_inline"/>
<field name="total_rent_price" class="oe_inline"/>
<field name="discount" class="oe_inline"/>
<field name="price_after_discount" class="oe_inline"/>
Expand Down

0 comments on commit 42d58ef

Please sign in to comment.