Browse Source

APR 15: [ADD] Initial Commit 'advanced_fleet_rental'

pull/331/merge
Cybrosys Technologies 2 weeks ago
parent
commit
d719d48d1c
  1. 42
      advanced_fleet_rental/README.rst
  2. 23
      advanced_fleet_rental/__init__.py
  3. 71
      advanced_fleet_rental/__manifest__.py
  4. 16
      advanced_fleet_rental/data/ir_cron_data.xml
  5. 11
      advanced_fleet_rental/data/ir_sequence_data.xml
  6. 49
      advanced_fleet_rental/data/product_product_data.xml
  7. 7
      advanced_fleet_rental/doc/RELEASE_NOTES.md
  8. 31
      advanced_fleet_rental/models/__init__.py
  9. 38
      advanced_fleet_rental/models/account_move.py
  10. 37
      advanced_fleet_rental/models/cancellation_policy.py
  11. 66
      advanced_fleet_rental/models/extra_service.py
  12. 102
      advanced_fleet_rental/models/fleet_dashboard.py
  13. 677
      advanced_fleet_rental/models/fleet_rental_contract.py
  14. 45
      advanced_fleet_rental/models/fleet_vehicle.py
  15. 55
      advanced_fleet_rental/models/insurance_policy.py
  16. 35
      advanced_fleet_rental/models/multi_image.py
  17. 105
      advanced_fleet_rental/models/rental_payment_plan.py
  18. 13
      advanced_fleet_rental/report/fleet_rental_contract_report.xml
  19. 393
      advanced_fleet_rental/report/fleet_rental_contract_template.xml
  20. 8
      advanced_fleet_rental/security/ir.model.access.csv
  21. BIN
      advanced_fleet_rental/static/description/assets/cybro-icon.png
  22. BIN
      advanced_fleet_rental/static/description/assets/cybro-odoo.png
  23. BIN
      advanced_fleet_rental/static/description/assets/h2.png
  24. BIN
      advanced_fleet_rental/static/description/assets/icons/2.png
  25. BIN
      advanced_fleet_rental/static/description/assets/icons/5.png
  26. BIN
      advanced_fleet_rental/static/description/assets/icons/check.png
  27. BIN
      advanced_fleet_rental/static/description/assets/icons/chevron.png
  28. BIN
      advanced_fleet_rental/static/description/assets/icons/cogs.png
  29. BIN
      advanced_fleet_rental/static/description/assets/icons/consultation.png
  30. BIN
      advanced_fleet_rental/static/description/assets/icons/cust.png
  31. 1
      advanced_fleet_rental/static/description/assets/icons/down.svg
  32. BIN
      advanced_fleet_rental/static/description/assets/icons/ecom-black.png
  33. BIN
      advanced_fleet_rental/static/description/assets/icons/education-black.png
  34. BIN
      advanced_fleet_rental/static/description/assets/icons/faq.png
  35. BIN
      advanced_fleet_rental/static/description/assets/icons/feature.png
  36. BIN
      advanced_fleet_rental/static/description/assets/icons/hotel-black.png
  37. BIN
      advanced_fleet_rental/static/description/assets/icons/instance-line.png
  38. BIN
      advanced_fleet_rental/static/description/assets/icons/license.png
  39. BIN
      advanced_fleet_rental/static/description/assets/icons/lifebuoy.png
  40. BIN
      advanced_fleet_rental/static/description/assets/icons/manufacturing-black.png
  41. BIN
      advanced_fleet_rental/static/description/assets/icons/notes.png
  42. BIN
      advanced_fleet_rental/static/description/assets/icons/pos-black.png
  43. BIN
      advanced_fleet_rental/static/description/assets/icons/pro1.png
  44. BIN
      advanced_fleet_rental/static/description/assets/icons/puzzle.png
  45. BIN
      advanced_fleet_rental/static/description/assets/icons/restaurant-black.png
  46. BIN
      advanced_fleet_rental/static/description/assets/icons/screenshot.png
  47. BIN
      advanced_fleet_rental/static/description/assets/icons/service-black.png
  48. BIN
      advanced_fleet_rental/static/description/assets/icons/skype.png
  49. 53
      advanced_fleet_rental/static/description/assets/icons/star-1.svg
  50. 9
      advanced_fleet_rental/static/description/assets/icons/star-2.svg
  51. BIN
      advanced_fleet_rental/static/description/assets/icons/support.png
  52. BIN
      advanced_fleet_rental/static/description/assets/icons/test-1 - Copy.png
  53. BIN
      advanced_fleet_rental/static/description/assets/icons/test-1.png
  54. BIN
      advanced_fleet_rental/static/description/assets/icons/test-2.png
  55. BIN
      advanced_fleet_rental/static/description/assets/icons/trading-black.png
  56. BIN
      advanced_fleet_rental/static/description/assets/icons/training.png
  57. BIN
      advanced_fleet_rental/static/description/assets/icons/update.png
  58. BIN
      advanced_fleet_rental/static/description/assets/icons/user.png
  59. BIN
      advanced_fleet_rental/static/description/assets/icons/video.png
  60. BIN
      advanced_fleet_rental/static/description/assets/icons/whatsapp.png
  61. BIN
      advanced_fleet_rental/static/description/assets/icons/wrench.png
  62. BIN
      advanced_fleet_rental/static/description/assets/modules/1.gif
  63. BIN
      advanced_fleet_rental/static/description/assets/modules/2.jpg
  64. BIN
      advanced_fleet_rental/static/description/assets/modules/3.png
  65. BIN
      advanced_fleet_rental/static/description/assets/modules/4.png
  66. BIN
      advanced_fleet_rental/static/description/assets/modules/5.png
  67. BIN
      advanced_fleet_rental/static/description/assets/modules/6.jpg
  68. BIN
      advanced_fleet_rental/static/description/assets/screenshots.zip
  69. BIN
      advanced_fleet_rental/static/description/assets/screenshots/1.png
  70. BIN
      advanced_fleet_rental/static/description/assets/screenshots/10.png
  71. BIN
      advanced_fleet_rental/static/description/assets/screenshots/11.png
  72. BIN
      advanced_fleet_rental/static/description/assets/screenshots/12.png
  73. BIN
      advanced_fleet_rental/static/description/assets/screenshots/13.png
  74. BIN
      advanced_fleet_rental/static/description/assets/screenshots/14.png
  75. BIN
      advanced_fleet_rental/static/description/assets/screenshots/15.png
  76. BIN
      advanced_fleet_rental/static/description/assets/screenshots/16.png
  77. BIN
      advanced_fleet_rental/static/description/assets/screenshots/17.png
  78. BIN
      advanced_fleet_rental/static/description/assets/screenshots/18.png
  79. BIN
      advanced_fleet_rental/static/description/assets/screenshots/19.png
  80. BIN
      advanced_fleet_rental/static/description/assets/screenshots/2.png
  81. BIN
      advanced_fleet_rental/static/description/assets/screenshots/20.png
  82. BIN
      advanced_fleet_rental/static/description/assets/screenshots/21.png
  83. BIN
      advanced_fleet_rental/static/description/assets/screenshots/22.png
  84. BIN
      advanced_fleet_rental/static/description/assets/screenshots/23.png
  85. BIN
      advanced_fleet_rental/static/description/assets/screenshots/24.png
  86. BIN
      advanced_fleet_rental/static/description/assets/screenshots/3.png
  87. BIN
      advanced_fleet_rental/static/description/assets/screenshots/4.png
  88. BIN
      advanced_fleet_rental/static/description/assets/screenshots/5.png
  89. BIN
      advanced_fleet_rental/static/description/assets/screenshots/6.png
  90. BIN
      advanced_fleet_rental/static/description/assets/screenshots/7.png
  91. BIN
      advanced_fleet_rental/static/description/assets/screenshots/8.png
  92. BIN
      advanced_fleet_rental/static/description/assets/screenshots/9.png
  93. BIN
      advanced_fleet_rental/static/description/assets/screenshots/hero-v17.gif
  94. BIN
      advanced_fleet_rental/static/description/assets/y18.jpg
  95. BIN
      advanced_fleet_rental/static/description/banner.jpg
  96. BIN
      advanced_fleet_rental/static/description/icon.png
  97. 1282
      advanced_fleet_rental/static/description/index.html
  98. 78
      advanced_fleet_rental/static/src/css/xero_dashboard.css
  99. 1
      advanced_fleet_rental/static/src/images/cancelled.svg
  100. 1
      advanced_fleet_rental/static/src/images/car-insurance.svg

42
advanced_fleet_rental/README.rst

@ -0,0 +1,42 @@
.. image:: https://img.shields.io/badge/license-OPL--1-red.svg
:target: https://www.odoo.com/documentation/17.0/legal/licenses.html#odoo-apps
:alt: License: OPL-1
Advanced Fleet Rental Management
==========================
Advanced Fleet Rental Management system is designed to streamline the process of managing a fleet of vehicles for rental businesses
License
-------
Odoo Proprietary License v1.0.
(https://www.odoo.com/documentation/17.0/legal/licenses.html#odoo-apps)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: (V17)Anfas Faisal K, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

23
advanced_fleet_rental/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from . import models
from . import wizard

71
advanced_fleet_rental/__manifest__.py

@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
{
'name': 'Advanced Fleet Rental Management',
'version': '17.0.1.0.0',
'category': "Extra Tools",
'summary': """This module will helps you to give the vehicles for Rent.""",
'description': "This module enhances Odoo’s fleet management "
"functionality for vehicle rentals, including cars, "
"vans, bikes, and jeeps. Key features include:"
"Detailed rental contracts and invoicing."
"Management of daily, hourly, and kilometer-based rental terms."
"Integration with Odoo’s accounting module for automated invoicing and payments."
"Tracking of vehicle status, maintenance, and extra service charges."
"A user-friendly dashboard for monitoring fleet performance and rental contracts.",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['fleet', 'mail', 'sale_management', 'account', ],
'data': [
'security/ir.model.access.csv',
'data/ir_cron_data.xml',
'data/product_product_data.xml',
'data/ir_sequence_data.xml',
'views/fleet_vehicle_views.xml',
'views/fleet_dashboard.xml',
'views/multi_image_views.xml',
'views/fleet_rental_contract_views.xml',
'report/fleet_rental_contract_report.xml',
'report/fleet_rental_contract_template.xml',
'views/res_partner_views.xml',
'views/account_move_views.xml',
'views/rental_payment_plan_views.xml',
'views/cancellation_policy_views.xml',
'views/fleet_dashboard.xml',
'wizard/damage_invoice_views.xml',
],
'assets': {
'web.assets_backend': [
'advanced_fleet_rental/static/src/js/fleet_dashboard.js',
'advanced_fleet_rental/static/src/xml/fleet_dashboard.xml',
'advanced_fleet_rental/static/src/css/xero_dashboard.css',
'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.0/chart.umd.min.js',
]
},
'images': ['static/description/banner.jpg'],
'license': 'OPL-1',
'installable': True,
'auto_install': False,
'application': False,
}

16
advanced_fleet_rental/data/ir_cron_data.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data noupdate="1">
<!-- Schedule action for generating automatic database backup-->
<record id="ir_cron_auto_invoice_create" model="ir.cron">
<field name="name">Fleet : Automatic Invoice Creation</field>
<field name="model_id" ref="model_rental_payment_plan"/>
<field name="state">code</field>
<field name="code">model._schedule_auto_invoice_checker()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
</record>
</data>
</odoo>

11
advanced_fleet_rental/data/ir_sequence_data.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Sequence Number-->
<record id="vehicle_sequence_id" model="ir.sequence">
<field name="name">Vehicle Rental Code</field>
<field name="code">vehicle.sequence</field>
<field name="prefix">VC/%(year)s/%(month)s/%(day)s/</field>
<field name="padding">5</field>
<field name="number_next">1</field>
</record>
</odoo>

49
advanced_fleet_rental/data/product_product_data.xml

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!--Vehicle Rental Charge-->
<record id="product_product_vehicle_rental_charge" model="product.product">
<field name="name">Vehicle Rent Charge</field>
<field name="default_code">VRC</field>
<field name="description">Lets you charge a fixed rate for Vehicle Rental.</field>
<field name="type">service</field>
<field name="sale_ok" eval="True"/>
<field name="purchase_ok" eval="False"/>
<field name="list_price">0.0</field>
<field name="invoice_policy">order</field>
</record>
<!--Extra Charge-->
<record id="product_product_vehicle_extra_rental_charge" model="product.product">
<field name="name">Extra Charges</field>
<field name="default_code">EC</field>
<field name="description">Fixed rate for Extra Charges.</field>
<field name="type">service</field>
<field name="sale_ok" eval="True"/>
<field name="purchase_ok" eval="False"/>
<field name="list_price">0.0</field>
<field name="invoice_policy">order</field>
</record>
<!--Damage Charge-->
<record id="product_product_vehicle_damage_charge" model="product.product">
<field name="name">Damage Charge</field>
<field name="default_code">DC</field>
<field name="description">Fixed rate for Damage Charges.</field>
<field name="type">service</field>
<field name="sale_ok" eval="True"/>
<field name="purchase_ok" eval="False"/>
<field name="list_price">0.0</field>
<field name="invoice_policy">order</field>
</record>
<!--Cancellation Charge-->
<record id="product_product_vehicle_cancel_charge" model="product.product">
<field name="name">Cancellation Charge</field>
<field name="default_code">CC</field>
<field name="description">Fixed rate for Cancellation Charges.</field>
<field name="type">service</field>
<field name="sale_ok" eval="True"/>
<field name="purchase_ok" eval="False"/>
<field name="list_price">0.0</field>
<field name="invoice_policy">order</field>
</record>
</data>
</odoo>

7
advanced_fleet_rental/doc/RELEASE_NOTES.md

@ -0,0 +1,7 @@
## Module <advanced_fleet_rental>
#### 07.04.2025
#### Version 17.0.1.0.0
#### ADD
- Initial commit for Advanced Fleet Rental Management

31
advanced_fleet_rental/models/__init__.py

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from . import account_move
from . import cancellation_policy
from . import extra_service
from . import fleet_dashboard
from . import fleet_rental_contract
from . import fleet_vehicle
from . import insurance_policy
from . import multi_image
from . import rental_payment_plan

38
advanced_fleet_rental/models/account_move.py

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import fields, models
class AccountMove(models.Model):
"""
Inherits the 'account.move' model to add a relationship with the
'fleet.rental.contract' model. This allows linking a vehicle rental
contract to an accounting move.
"""
_inherit = "account.move"
vehicle_rental_id = fields.Many2one('fleet.rental.contract',
string="Vehicle Contract",
readonly=True)

37
advanced_fleet_rental/models/cancellation_policy.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import fields, models
class CancellationPolicy(models.Model):
"""
Model for defining a cancellation policy, including the policy name,
creation date, and detailed terms and conditions.
"""
_name = 'cancellation.policy'
_description = 'Cancellation Policy'
name = fields.Char(string='Policy Name', required=True,
help='Name of the cancellation policy.')
terms_conditions = fields.Text(string='Terms & Conditions',
help='Detailed terms and conditions '
'of the cancellation policy.')

66
advanced_fleet_rental/models/extra_service.py

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import api, fields, models
class ExtraService(models.Model):
"""
Model for defining extra services that can be added to a fleet rental
contract Each service is associated with a product, and the total amount
is computed based on the quantity and unit price of the product.
"""
_name = 'extra.service'
_description = 'Extra Services'
product_id = fields.Many2one('product.product',
string='Product',
required=True,
help='Description of the extra service.')
quantity = fields.Float(string='Quantity', default=1.0,
required=True,
help='Quantity of the extra service.')
unit_price = fields.Float(string='Unit Price',
related='product_id.lst_price', store=True,
readonly=False,
help='Unit price of the extra service.')
amount = fields.Float(string='Amount', compute='_compute_amount',
store=True,
help='Total amount for the extra service.')
description = fields.Char(string='Description',
help='Description of the Product')
contract_id = fields.Many2one('fleet.rental.contract',
string='Contract Rent',
help='Reference to the vehicle rent.')
@api.depends('quantity', 'unit_price')
def _compute_amount(self):
"""
Compute the total amount for the extra service based on the
quantity and unit price. The amount is calculated as
quantity * unit_price and stored in the 'amount' field.
"""
for service in self:
service.amount = service.quantity * service.unit_price

102
advanced_fleet_rental/models/fleet_dashboard.py

@ -0,0 +1,102 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import api, models
from datetime import datetime, timedelta
class FleetDashboard(models.Model):
"""
Model for the Fleet Dashboard, providing various statistics and data
related to the fleet vehicles, contracts, and invoices.
"""
_name = 'fleet.dashboard'
_description = 'Fleet Dashboard'
@api.model
def get_datas(self):
"""
Retrieves overall statistics related to fleet vehicles, contracts,
and invoices.
"""
total_vehicles = self.env['fleet.vehicle'].search_count([])
operational_vehicles = self.env['fleet.vehicle'].search_count(
[('status', '=', 'operational')])
maintenance_vehicles = self.env['fleet.vehicle'].search_count(
[('status', '=', 'undermaintenance')])
all_invoices = self.env['account.move'].search_count(
[('vehicle_rental_id', '!=', False)])
pending_invoices = self.env['account.move'].search_count([
('vehicle_rental_id', '!=', False),
('state', '=', 'posted'),
('payment_state', '!=', 'paid')
])
total_contracts = self.env['fleet.rental.contract'].search_count([])
total_contract_working = self.env[
'fleet.rental.contract'].search_count(
[('state', '=', 'in_progress')])
total_contract_returned = self.env[
'fleet.rental.contract'].search_count(
[('state', '=', 'return')])
total_contract_cancel = self.env['fleet.rental.contract'].search_count(
[('state', '=', 'cancel')])
return {
'total_vehicles': total_vehicles,
'total_contracts': total_contracts,
'total_contract_working': total_contract_working,
'total_contract_return': total_contract_returned,
'total_contract_cancel': total_contract_cancel,
'operational': operational_vehicles,
'under_maintenance': maintenance_vehicles,
'all_customers': self.env['res.partner'].search_count([]),
'all_invoices': all_invoices,
'pending_invoices': pending_invoices,
}
@api.model
def get_monthly_contract_invoices(self):
"""
Retrieves the count of posted invoices for each month of the
current year related to vehicle rentals.
"""
current_year = datetime.now().year
data = []
labels = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November',
'December']
for month in range(1, 13):
start_date = datetime(current_year, month, 1)
end_date = (start_date + timedelta(days=32)).replace(
day=1) - timedelta(days=1)
invoice_count = self.env['account.move'].search_count([
('vehicle_rental_id', '!=', False),
('invoice_date', '>=', start_date),
('invoice_date', '<=', end_date),
('state', '=', 'posted')
])
data.append(invoice_count)
return {
'labels': labels,
'data': data
}

677
advanced_fleet_rental/models/fleet_rental_contract.py

@ -0,0 +1,677 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from datetime import date
from odoo import api, fields, models, _
from dateutil.relativedelta import relativedelta
from odoo.exceptions import ValidationError
class FleetRentalContract(models.Model):
"""
Represents a car rental contract, including details about the customer,
vehicle, rental period, charges, and various related information.
"""
_name = 'fleet.rental.contract'
_description = 'Fleet Rental Contract'
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string="Sequence",
default=lambda self: _('New'),
copy=False, readonly=True, tracking=True,
help='Unique contract number for the rental agreement.')
state = fields.Selection(
[('new', 'New'),
('in_progress', 'In Progress'),
('return', 'Return'), ('cancel', 'Cancel')],
string='State', default='new',
help='Contract Progress',
group_expand='_group_expand_states',tracking=True)
customer_id = fields.Many2one(
'res.partner', string='Customer',
help='The customer who is renting the vehicle.',
required=True, tracking=True)
email = fields.Char(string='Email',
related='customer_id.email',
help='Email address of the customer.',
readonly=False)
phone = fields.Char('Phone', related='customer_id.phone',
help="Phone Number of the customer")
pickup_date = fields.Datetime(
string='Pick-up Date',
help='Date and time when the vehicle will be picked up.',
required=True, tracking=True)
dropoff_date = fields.Datetime(
string='Drop-off Date',
help='Date and time when the vehicle will be returned.',
required=True, tracking=True)
pickup_location = fields.Char(
string='Pick-Up Location',
help='Location where the vehicle will be picked up.',
required=True)
dropoff_location = fields.Char(
string='Drop-Off Location',
help='Location where the vehicle will be dropped off.',
required=True)
pickup_street = fields.Char(
string='Pick-Up Street',
help='Street address for the pick-up location.',
required=True)
dropoff_street = fields.Char(
string='Drop-Off Street',
help='Street address for the drop-off location.',
required=True)
pickup_city = fields.Char(
string='Pick-Up City',
help='City where the vehicle will be picked up.',
required=True)
dropoff_city = fields.Char(
string='Drop-Off City',
help='City where the vehicle will be dropped off.',
required=True)
pickup_state_id = fields.Many2one(
'res.country.state',
string='Pick-Up State',
help='State where the vehicle will be picked up.',
required=True)
dropoff_state_id = fields.Many2one(
'res.country.state',
string='Drop-Off State',
help='State where the vehicle will be dropped off.',
required=True)
pickup_zip = fields.Char(
string='Pick-Up ZIP',
help='ZIP code for the pick-up location.',
required=True)
dropoff_zip = fields.Char(string='Drop-Off ZIP',
help='ZIP code for the drop-off location.')
pickup_country_id = fields.Many2one(
'res.country',
string='Pick-Up Country',
help='Country where the vehicle will be picked up.',
required=True)
dropoff_country_id = fields.Many2one(
'res.country',
string='Drop-Off Country',
help='Country where the vehicle will be dropped off.',
required=True)
vehicle_id = fields.Many2one(
'fleet.vehicle', string='Vehicle',
help='The vehicle being rented.',
required=True)
model = fields.Char(related='vehicle_id.model_id.name', string='Model',
help='Model of the rented vehicle.')
transmission = fields.Selection(
[('automatic', 'Automatic'), ('manual', 'Manual')],
string='Transmission', related='vehicle_id.transmission',
help='Transmission type of the rented vehicle.')
fuel_type = fields.Selection(
[
('diesel', 'Diesel'),
('gasoline', 'Gasoline'),
('full_hybrid', 'Full Hybrid'),
('plug_in_hybrid_diesel', 'Plug-in Hybrid Diesel'),
('plug_in_hybrid_gasoline', 'Plug-in Hybrid Gasoline'),
('cng', 'CNG'),
('lpg', 'LPG'),
('hydrogen', 'Hydrogen'),
('electric', 'Electric'),
], string='Fuel Type', related='vehicle_id.fuel_type',
help='Fuel type of the rented vehicle.')
last_odometer = fields.Float(
string='Last Odometer',
related='vehicle_id.odometer',
help='Last recorded odometer reading of the vehicle.')
odometer_unit = fields.Selection(
[('kilometers', 'km'), ('miles', 'mi')],
string='Odometer Unit', default='kilometers',
related='vehicle_id.odometer_unit',
help='Unit of measurement for the odometer reading.')
driver_required = fields.Boolean(
string='Driver Required',
help='Indicates if a driver is required for the rental.')
driver_id = fields.Many2one(
'res.partner', string='Driver',
help='Driver assigned to the rental if required.')
charge_type = fields.Selection(
[('excluding', 'Excluding in rent charge'),
('including', 'Including in rent charge')],
string='Charge Type',
help='Specifies if the driver charge is included in the rental '
'charge or not.')
driver_charge = fields.Float(
string='Driver Charge',
help='Charge for the driver if not included '
'in the rental charge.')
# Rent Details
rent_type = fields.Selection(
[('hours', 'Hours'), ('days', 'Days'),
('kilometers', 'Kilometers')],
string='Rent Type',
default='hours',
help='Type of rent calculation (per day, per kilometer, or per mile).')
rent_per_hour = fields.Float(string='Rent / Hour',
help='Rental charge per hour.',
related='vehicle_id.rent_hour')
total_hours = fields.Float(string='Total Hours ',
help="Total Hours Taken for Rent",
compute='_compute_rental_period', store=True,
readonly=False)
rent_per_day = fields.Float(string='Rent / Day',
help='Rental charge per day.',
related='vehicle_id.rent_day')
total_days = fields.Integer(string='Total Days',
help='Total number of rental days.',
compute='_compute_rental_period', store=True,
readonly=False)
rent_per_km = fields.Float(string='Rent / KM',
help='Rental charge per km.'
, related='vehicle_id.rent_kilometer')
total_km = fields.Integer(string='Total KM',
help='Total Kilometers.')
total_rental_charge = fields.Float(
string='Total Rental Charge',
compute='_compute_total_rental_charge', store=True,
help='Total rental charge for the contract.')
payment_type = fields.Selection(
[('daily', 'Daily'), ('weekly', 'Weekly'),
('monthly', 'Monthly'),
('full', 'Fully')],
string='Payment Type',
help='Payment schedule for the rental charge.',
default='full')
invoice_item_id = fields.Many2one(
'product.product',
string='Invoice Item',
help='Description of the item to be invoiced.',
default=lambda self: self.env.ref(
'advanced_fleet_rental.product_product_vehicle_rental_charge'))
is_extra_charge = fields.Boolean(string='Is any extra charge',
help='Indicates if there are any extra '
'charges applicable.')
extra_per_hour = fields.Float(string='Extra Charges / Hour',
help='Rental charge per hour.',
related='vehicle_id.charge_hour')
total_extra_hours = fields.Integer(string='Total Extra Hours',
help='Total number of rental hours.')
extra_per_day = fields.Float(string='Extra Charges / Day',
help='Rental charge per hour.',
related='vehicle_id.charge_day')
total_extra_days = fields.Integer(string='Total Extra Days',
help='Total number of rental days.')
extra_per_km = fields.Float(string='Extra Charges / KM',
help='Rental charge per hour.',
related='vehicle_id.charge_kilometer')
total_extra_km = fields.Float(string='Total Extra K/M',
help="Total Extra K/M taken")
total_extra_charge = fields.Float(string="Total Extra Charge",
help="Extra Charges per K/M",
compute='_compute_total_extra_charge'
, store=True)
rental_payment_plan_ids = (fields.One2many
('rental.payment.plan',
'contract_id',
string="Vehicle Payment Details",
help="Details of the paymentplans for the"
" vehicle rental."))
extra_service_ids = (fields.One2many
('extra.service',
'contract_id',
string="Extra Services",
help="List of extra services associated with this"
"vehicle rental."
))
is_extra_invoice_created = fields.Boolean(
string='Extra Invoice Created',
help="Indicates whether an extra invoice has been created for the"
" extra services.")
image_ids = fields.One2many(
'multi.image',
'contract_id',
string="Images of the Vehicle",
help="Images related to the Vehicles of vehicle rental."
)
insurance_ids = fields.One2many(
'insurance.policy',
'contract_id',
string="Insurance Policy",
help="Insurance policies associated with the vehicle rental.")
vehicle_to_invoice_count = fields.Integer(
string='Number of vehicle rent to invoice',
compute='_compute_vehicle_to_invoice',
readonly=True,
help="Number of vehicle rental invoices that is created."
)
is_damaged_invoiced = fields.Boolean(
string='Damage Invoice Created',
help="Indicates whether an extra invoice has been created for the"
" extra services.")
cancellation_policy_id = fields.Many2one(
'cancellation.policy', string='Cancellation Policy',
help='Select the cancellation policy applicable for this record. '
'The cancellation charges will be calculated based on the '
'selected policy.')
cancellation_charge = fields.Float(string='Cancellation Charge')
cancellation_terms = fields.Text(
string='Cancellation Terms and Conditions',
related="cancellation_policy_id.terms_conditions",
readonly=False)
is_cancelled_invoiced = fields.Boolean(
string='Cancelled Invoice Created',
help="Indicates whether an cancelled invoice has been created for the"
"Cancellation Policy.")
digital_sign = fields.Binary(string='Signature', help="Binary field to "
"store digital "
"signatures.")
sign_date = fields.Datetime(
string='Sign Date',
help='Date and time of the signature signed.')
currency_id = fields.Many2one(
'res.currency', 'Currency',
default=lambda self: self.env.user.company_id.currency_id.id,
help="if you select this currency bidding will be on that currency "
"itself")
damage_description = fields.Text(string="Damage Description")
damage_amount = fields.Float(string="Damage Amount",
help="Total Amount for the damages")
# Responsible
responsible_id = fields.Many2one(
'res.users', string='Responsible',
help='User responsible for managing the rental contract.',
required=True, tracking=True)
@api.onchange('pickup_state_id')
def _onchange_pickup_state(self):
"""
Automatically updates the 'Pick-Up Country' field based on the selected 'Pick-Up State'.
When a user selects a state for vehicle pick-up, this method fetches the corresponding
country from the selected state and sets it in the 'Pick-Up Country' field.
"""
if self.pickup_state_id:
self.pickup_country_id = self.pickup_state_id.country_id
@api.onchange('dropoff_state_id')
def _onchange_dropoff_state(self):
"""
Automatically updates the 'Drop-Off Country' field based on the selected 'Drop-Off State'.
When a user selects a state for vehicle drop-off, this method fetches the corresponding
country from the selected state and sets it in the 'Drop-Off Country' field.
"""
if self.dropoff_state_id:
self.dropoff_country_id = self.dropoff_state_id.country_id
def _group_expand_states(self, states, domain, order):
"""
Expands the available group states for selection.
"""
return ['new', 'in_progress', 'return', 'cancel']
@api.model
def create(self, vals_list):
"""
Override the create method to set a default sequence number if not
provided.
"""
if vals_list.get('name', 'New') == 'New':
vals_list['name'] = self.env['ir.sequence'].next_by_code(
'vehicle.sequence') or 'New'
return super().create(vals_list)
@api.depends('extra_per_hour', 'total_extra_hours', 'extra_per_day',
'total_extra_days', 'extra_per_km', 'total_extra_km')
def _compute_total_extra_charge(self):
"""
Compute the total extra charge based on the rent type and extra usage
(hours, days, kilometers).
"""
for record in self:
if record.rent_type == 'hours':
record.total_extra_charge = (record.extra_per_hour *
record.total_extra_hours)
elif record.rent_type == 'days':
record.total_extra_charge = (record.extra_per_day *
record.total_extra_days)
elif record.rent_type == 'kilometers':
record.total_extra_charge = (
record.extra_per_km * record.total_extra_km)
else:
record.total_extra_charge = 0
@api.depends(
'rent_type',
'rent_per_hour', 'total_hours',
'rent_per_day', 'total_days',
'rent_per_km', 'total_km',
'driver_charge', 'charge_type',
'driver_required'
)
def _compute_total_rental_charge(self):
"""
Compute the total rental charge based on the rent type and usage
(hours, days, kilometers). Include driver charge if applicable.
"""
for record in self:
if record.rent_type == 'hours':
record.total_rental_charge = (
record.rent_per_hour * record.total_hours)
elif record.rent_type == 'days':
record.total_rental_charge = (
record.rent_per_day * record.total_days)
elif record.rent_type == 'kilometers':
record.total_rental_charge = (
record.rent_per_km * record.total_km)
else:
record.total_rental_charge = 0
if record.charge_type == 'including' and record.driver_required:
record.total_rental_charge += record.driver_charge
def action_create_extra_invoice(self):
"""
Create an invoice for extra charges incurred during the rental period.
"""
product_id = self.env.ref(
'advanced_fleet_rental.product_product_vehicle_extra_rental_charge')
invoice_vals = {
'partner_id': self.customer_id.id,
'move_type': 'out_invoice',
'vehicle_rental_id': self.id,
'invoice_date': date.today(),
'invoice_line_ids': [(0, 0, {
'product_id': product_id.id,
'name': product_id.name,
'quantity': 1,
'price_unit': self.total_extra_charge,
})],
}
invoice = self.env['account.move'].create(invoice_vals)
invoice.action_post()
def action_installment(self):
"""
Generate the rental payment plan based on the selected payment type.
"""
self.ensure_one()
self.rental_payment_plan_ids.unlink()
if self.rent_type == 'kilometers' and self.total_km == 0:
raise ValidationError(
_('If the rent type is "kilometers", the total '
'kilometers cannot be 0.'))
if self.rent_type == 'hours' and self.payment_type != 'full':
raise ValidationError(
_('If the rent type is "hours", the payment type must be '
'"full".'))
if self.rent_type == 'kilometers' and self.payment_type != 'full':
raise ValidationError(
_('If the rent type is "kilometers", the payment type must be '
'"full".'))
if (self.rent_type == 'days' and self.payment_type == 'weekly'
and self.total_days < 7):
raise ValidationError(_(
'The total days are less than a week. '
'Please select a valid payment type.'))
if (self.rent_type == 'days' and self.payment_type == 'monthly'
and self.total_days < 30):
raise ValidationError(_(
'The total days are less than a month. '
'Please select a valid payment type.'))
pick_up = self.pickup_date
drop_date = self.dropoff_date
total_amount = self.total_rental_charge
if self.payment_type == 'full':
self.env['rental.payment.plan'].create({
'contract_id': self.id,
'invoice_item_id': self.invoice_item_id.id,
'payment_date': pick_up,
'payment_amount': total_amount,
'payment_state': 'not_paid',
})
return
# Calculate interval and number of installments based on rent_type
if self.rent_type == 'hours':
amount_per_unit = self.rent_per_hour
base_interval = relativedelta(hours=1)
elif self.rent_type == 'days':
amount_per_unit = self.rent_per_day
base_interval = relativedelta(days=1)
if self.payment_type == 'daily':
payment_interval = relativedelta(days=1)
current_date = pick_up
elif self.payment_type == 'weekly':
payment_interval = relativedelta(weeks=1)
current_date = pick_up
elif self.payment_type == 'monthly':
payment_interval = relativedelta(months=1)
current_date = pick_up + payment_interval
else:
payment_interval = base_interval
while current_date < drop_date:
next_date = min(current_date + payment_interval, drop_date)
# Calculate units in this payment period
if self.rent_type == 'hours':
units_in_period = (
next_date - current_date).total_seconds() / 3600
elif self.rent_type == 'days':
units_in_period = (next_date - current_date).days
installment_amount = units_in_period * amount_per_unit
if installment_amount > 0:
self.env['rental.payment.plan'].create({
'contract_id': self.id,
'invoice_item_id': self.invoice_item_id.id,
'payment_date': current_date,
'payment_amount': installment_amount,
'payment_state': 'not_paid',
})
current_date = next_date
# Handle any remaining amount due to rounding
remaining_amount = total_amount - sum(
self.rental_payment_plan_ids.mapped('payment_amount'))
if remaining_amount > 0:
self.env['rental.payment.plan'].create({
'contract_id': self.id,
'invoice_item_id': self.invoice_item_id.id,
'payment_date': drop_date,
'payment_amount': remaining_amount,
'payment_state': 'not_paid',
})
@api.depends('pickup_date', 'dropoff_date')
def _compute_rental_period(self):
"""
Compute the total rental period in hours and days based on pickup
and drop-off dates.
"""
for record in self:
if record.pickup_date and record.dropoff_date:
pickup = fields.Datetime.from_string(record.pickup_date)
dropoff = fields.Datetime.from_string(record.dropoff_date)
delta = dropoff - pickup
# Calculate total days
total_days = delta.days + 1
record.total_days = total_days
# Calculate total hours
total_hours = delta.total_seconds() / 3600
record.total_hours = total_hours
else:
record.total_days = 0
record.total_hours = 0
@api.constrains('rent_type', 'pickup_date', 'dropoff_date', 'total_hours',
'total_days', )
def _check_rental_period(self):
"""
Ensure the drop-off date is not before the pick-up date.
"""
for record in self:
if record.pickup_date and record.dropoff_date:
pickup = fields.Datetime.from_string(record.pickup_date)
dropoff = fields.Datetime.from_string(record.dropoff_date)
delta = dropoff - pickup
if record.rent_type == 'hours':
total_hours_computed = delta.total_seconds() / 3600
if record.total_hours > total_hours_computed:
raise ValidationError(
f'The total hours ({record.total_hours})'
f' exceed the period between the pickup '
f'and dropoff dates.')
if record.total_hours == 0:
raise ValidationError(
f'The total hours cannot be zero.')
if record.rent_type == 'days':
total_days_computed = delta.days + 1
if record.total_days > total_days_computed:
raise ValidationError(
f'The total days ({record.total_days})'
f' exceed the period between the pickup '
f'and dropoff dates.')
if record.total_days == 0:
raise ValidationError(
f'The total days cannot be zero.')
def action_account_tab(self):
"""View the Invoices in the Smart Tab."""
return {
'type': 'ir.actions.act_window',
'name': 'Invoices',
'res_model': 'account.move',
'target': 'current',
'domain': [('partner_id', '=', self.customer_id.id),
('vehicle_rental_id', '=', self.id)],
'view_mode': 'tree,form',
}
def _compute_vehicle_to_invoice(self):
"""
Computes the number of invoices related to the vehicle rental
contract and updates the 'vehicle_to_invoice_count' field for each record.
"""
for record in self:
record.vehicle_to_invoice_count = self.env[
'account.move'].search_count([
('vehicle_rental_id', '=', record.id)
])
def action_extra_invoice_charge(self):
"""
Creates an invoice for extra services added to the vehicle
rental contract. If there are no extra services, raises a
ValidationError.
"""
if self.extra_service_ids:
invoice_line_vals = [
{
'product_id': line.product_id.id,
'name': line.description or line.product_id.name,
'quantity': line.quantity,
'price_unit': line.amount,
}
for line in self.extra_service_ids
]
invoice_vals = {
'move_type': 'out_invoice',
'partner_id': self.customer_id.id,
'invoice_line_ids': [(0, 0, line) for line in
invoice_line_vals],
'vehicle_rental_id': self.id,
}
invoice = self.env['account.move'].create(invoice_vals)
invoice.action_post()
self.is_extra_invoice_created = True
else:
raise ValidationError(
_('Add Extra Services Products.'))
def action_damage_invoice(self):
"""
This method opens a new window to link invoices and remove invoices
for the current sale order.
"""
return {
"type": "ir.actions.act_window",
"name": "Damage Invoices",
"view_mode": "form",
"res_model": "damage.invoice",
"target": "new",
"context": {
"default_contract_id": self.id,
},
}
def action_cancel(self):
"""
Cancels the rental contract by setting its state to 'cancel'.
"""
self.write({'state': 'cancel'})
def action_cancel_charges(self):
"""
Creates an invoice for the cancellation charges based on the contract's
cancellation policy. The invoice is created using a predefined product
for cancellation charges. If the cancellation policy is not set,
it raises a ValidationError.
"""
if self.cancellation_policy_id:
product_id = self.env.ref(
'advanced_fleet_rental.product_product_vehicle_cancel_charge')
invoice_vals = {
'partner_id': self.customer_id.id,
'move_type': 'out_invoice',
'vehicle_rental_id': self.id,
'invoice_date': date.today(),
'invoice_line_ids': [(0, 0, {
'product_id': product_id.id,
'name': self.cancellation_terms,
'quantity': 1,
'price_unit': self.cancellation_charge,
})],
}
invoice = self.env['account.move'].create(invoice_vals)
self.is_cancelled_invoiced = True
return {
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'view_mode': 'form',
'res_id': invoice.id,
'target': 'current',
}
else:
raise ValidationError(
_("No cancellation policy set on the contract."))

45
advanced_fleet_rental/models/fleet_vehicle.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import fields, models
class FleetVehicle(models.Model):
"""
Inherits from 'fleet.vehicle' to add additional fields and functionality.
"""
_inherit = 'fleet.vehicle'
status = fields.Selection([
('operational', 'Operational'),
('undermaintenance', 'Under Maintenance'),
], default='operational')
rent_hour = fields.Float(string='Rent / Hour', help="Rent per hour")
rent_day = fields.Float(string='Rent / Day', help="Rent per day")
rent_kilometer = fields.Float(string='Rent / Kilometer',
help="Rent per kilometer")
charge_hour = fields.Float(string='Extra Charge / Hour',
help="Extra charge per hour")
charge_day = fields.Float(string='Extra Charge / Day',
help="Extra charge per day")
charge_kilometer = fields.Float(string='Extra Charge / Kilometer',
help="Extra charge per kilometer")

55
advanced_fleet_rental/models/insurance_policy.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import fields, models
class InsurancePolicy(models.Model):
"""
Model for managing insurance policies related to fleet rental contracts.
"""
_name = 'insurance.policy'
_description = 'Insurance Policy'
policy_number = fields.Char(
string='Policy Number',
required=True,
help='Unique identifier for the insurance policy.')
name = fields.Char(
string='Name',
required=True,
help='Name of the insurance policy.')
description = fields.Char(
string='Description',
help='Brief description of the insurance policy.')
document = fields.Binary(
string='Document',
help='Upload the document related to the insurance policy.')
file_name = fields.Char(
string="File Name",
help='File Name of the Document')
policy_amount = fields.Float(
string='Policy Amount',
help='Total amount covered by the insurance policy.')
contract_id = fields.Many2one('fleet.rental.contract',
string='Contract Rent',
help='Reference to the vehicle rent.')

35
advanced_fleet_rental/models/multi_image.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import fields, models
class MultiImage(models.Model):
"""
Model for storing multiple images related to a fleet rental contract.
"""
_name = 'multi.image'
_description = 'Multi Image'
image = fields.Binary(string="Image", help="Upload the Images")
contract_id = fields.Many2one(
'fleet.rental.contract', string='Rental Contract',
ondelete='cascade', readonly=True)

105
advanced_fleet_rental/models/rental_payment_plan.py

@ -0,0 +1,105 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from datetime import date
from odoo import api, fields, models
class RentalPaymentPlan(models.Model):
"""
Model for managing rental payment plans associated with fleet rental
contracts.
"""
_name = 'rental.payment.plan'
_description = 'Rental Payment Plan'
contract_id = fields.Many2one(
'fleet.rental.contract', string='Rental Contract',
ondelete='cascade')
invoice_item_id = fields.Many2one('product.product',
string='Invoice Item', )
payment_date = fields.Date(string='Payment Date' )
payment_amount = fields.Float(
string='Payment Amount',
help='Amount to be paid based on the invoice item.')
invoice_id = fields.Many2one('account.move', string='Invoice',
readonly=True)
payment_state = fields.Selection(
[
('not_paid', 'Not Paid'),
('in_payment', 'In Payment'),
('paid', 'Paid'),
('partial', 'Partially Paid'),
('reversed', 'Reversed'),
('invoicing_legacy', 'Invoicing App Legacy'),
], compute='_compute_payment_state',
string='Payment State')
is_invoiced = fields.Boolean(string="Invoice Button", help="Invoiced")
@api.depends('invoice_id.payment_state')
def _compute_payment_state(self):
"""
Computes the payment state based on the associated invoice's
payment state.
"""
for record in self:
if record.invoice_id:
record.payment_state = record.invoice_id.payment_state
else:
record.payment_state = 'not_paid'
def action_create_invoice(self):
"""
Creates an invoice for the payment plan.
"""
self.ensure_one()
invoice_vals = {
'partner_id': self.contract_id.customer_id.id,
'move_type': 'out_invoice',
'invoice_date': self.payment_date,
'vehicle_rental_id': self.contract_id.id,
'invoice_line_ids': [(0, 0, {
'product_id': self.invoice_item_id.id,
'name': self.invoice_item_id.name,
'quantity': 1,
'price_unit': self.payment_amount,
})],
}
invoice = self.env['account.move'].create(invoice_vals)
invoice.action_post()
self.invoice_id = invoice.id
self.is_invoiced = True
return invoice
@api.model
def _schedule_auto_invoice_checker(self):
"""
Scheduled action to automatically generate invoices for rental payment
plans where the payment date is today. Searches for payment plans with
today's date and no associated invoice, and generates invoices for them.
"""
today = date.today()
payment_plans = self.search([
('payment_date', '=', today),
('invoice_id', '=', False)
])
for plan in payment_plans:
plan.action_create_invoice()

13
advanced_fleet_rental/report/fleet_rental_contract_report.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<!-- Report Function inside Contract Form-->
<record id="vehicle_contract_report" model="ir.actions.report">
<field name="name">Vehicle Rental Report</field>
<field name="model">fleet.rental.contract</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">advanced_fleet_rental.report_fleet_rental_contract</field>
<field name="report_file">advanced_fleet_rental.report_fleet_rental_contract</field>
<field name="binding_model_id" ref="model_fleet_rental_contract"/>
<field name="binding_type">report</field>
</record>
</odoo>

393
advanced_fleet_rental/report/fleet_rental_contract_template.xml

@ -0,0 +1,393 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Report Template-->
<template id="report_fleet_rental_contract">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="data">
<t t-call="web.external_layout">
<div class="page" style="font-size: 12pt;">
<h2 style="text-align: center;">Vehicle Contract
Details
</h2>
<p>Reference Number:
<span t-field="data.name"/>
</p>
<table class="table table-sm"
style="border: 1px solid transparent; border-collapse: collapse; width: 100%;">
<tr>
<td colspan="2">
<strong>Customer Details</strong>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span>Customer:</span>
<span t-field="data.customer_id.name"/>
</td>
<td style="width: 50%; text-align: right;">
<span>Phone:</span>
<span t-field="data.customer_id.phone"/>
<br/>
<span>Email:</span>
<span t-field="data.email"/>
</td>
</tr>
</table>
<table class="table table-sm"
style="border: 1px solid transparent; width: 100%; margin-top: 10px;">
<tr>
<td colspan="2">
<strong>Pick-Up &amp; Drop-Off Details
</strong>
</td>
</tr>
<tr>
<td style="width: 50%; vertical-align: top;">
<span>Pick-up Date:</span>
<span t-field="data.pickup_date"/>
<br/>
<span>Pick-Up Location:</span>
<span t-field="data.pickup_location"/>
<br/>
<span t-field="data.pickup_street"/>
<br/>
<span t-field="data.pickup_city"/>,
<span t-field="data.pickup_state_id.name"/>
<span t-field="data.pickup_zip"/>
<br/>
<span t-field="data.pickup_country_id.name"/>
</td>
<td style="width: 50%; vertical-align: top;">
<span>Drop-off Date:</span>
<span t-field="data.dropoff_date"/>
<br/>
<span>Drop-Off Location:</span>
<span t-field="data.dropoff_location"/>
<br/>
<span t-field="data.dropoff_street"/>
<br/>
<span t-field="data.dropoff_city"/>,
<span t-field="data.dropoff_state_id.name"/>
<span t-field="data.dropoff_zip"/>
<br/>
<span t-field="data.dropoff_country_id.name"/>
</td>
</tr>
</table>
<!--Vehicle Deatils-->
<table class="table table-sm"
style="border: 1px solid transparent; width: 100%; margin-top: 10px;">
<tr>
<td colspan="2">
<strong>Vehicle Details</strong>
</td>
</tr>
<tr>
<td style="width: 50%; vertical-align: top;">
<span>Vehicle:</span>
<span t-field="data.vehicle_id.name"/>
<br/>
<span>Model:</span>
<span t-field="data.model"/>
<br/>
<span>Transmission:</span>
<span t-field="data.transmission"/>
<br/>
<span>Fuel Type:</span>
<span t-field="data.fuel_type"/>
<br/>
<span>Last Odometer:</span>
<span t-field="data.last_odometer"/>
<span t-field="data.odometer_unit"/>
</td>
<td style="width: 50%; vertical-align: top;">
<t t-if="data.driver_required">
<span>Driver:</span>
<span t-field="data.driver_id.name"/>
<br/>
<span>Driver Charge Type:</span>
<span t-field="data.charge_type"/>
<br/>
<span>Driver Charge:</span>
<span t-field="data.driver_charge"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</t>
</td>
</tr>
</table>
<table class="table table-sm"
style="border: 1px solid transparent; width: 100%; margin-top: 10px;">
<tr>
<td style="width: 50%; vertical-align: top;">
<strong>Rent Details</strong>
<br/>
<span>Rent Type:</span>
<span t-field="data.rent_type"/>
<br/>
<span>Rent /</span>
<span t-field="data.rent_type"/>
<span>:</span>
<span t-field="data.rent_per_hour"
t-if="data.rent_type == 'hours'"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
<span t-field="data.rent_per_day"
t-if="data.rent_type == 'days'"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
<span t-field="data.rent_per_km"
t-if="data.rent_type == 'kilometers'"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
<br/>
<span>Total</span>
<span t-field="data.rent_type"/>
<span>:</span>
<span t-field="data.total_hours"
t-if="data.rent_type == 'hours'"/>
<span t-field="data.total_days"
t-if="data.rent_type == 'days'"/>
<span t-field="data.total_km"
t-if="data.rent_type == 'kilometers'"/>
<br/>
<span>Total:</span>
<span t-field="data.total_rental_charge"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</td>
<td style="width: 50%; vertical-align: top;">
<strong>Payment Details</strong>
<br/>
<span>Payment Type:</span>
<span t-field="data.payment_type"/>
<br/>
<span>Invoice Item:</span>
<span t-field="data.invoice_item_id"/>
<br/>
</td>
</tr>
</table>
<!-- Extra Charges Details-->
<table class="table table-sm"
style="border: 1px solid transparent; width: 100%; margin-top: 10px;">
<tr>
<td style="width: 50%; vertical-align: top;">
<strong>Extra Charges Details</strong>
<br/>
<span>Is any extra charges:</span>
<span t-field="data.is_extra_charge"/>
<br/>
<span>Total Extra:</span>
<span t-field="data.rent_type"/>
:
<span t-field="data.total_extra_hours"
t-if="data.rent_type == 'hours'"/>
<span t-field="data.total_extra_days"
t-if="data.rent_type == 'days'"/>
<span t-field="data.total_extra_km"
t-if="data.rent_type == 'kilometers'"/>
<br/>
<span>Extra Charge /</span>
<span t-field="data.rent_type"/>
<span t-field="data.extra_per_hour"
t-if="data.rent_type == 'hours'"/>
<span t-field="data.extra_per_day"
t-if="data.rent_type == 'days'"/>
<span t-field="data.extra_per_km"
t-if="data.rent_type == 'kilometers'"/>
<br/>
<span>Total Extra Charges:</span>
<span t-field="data.total_extra_charge"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</td>
<td style="width: 50%; vertical-align: top;">
<strong>Responsible Details</strong>
<br/>
<span>Responsible:</span>
<span t-field="data.responsible_id.name"/>
</td>
</tr>
</table>
<!--Vehicle Payment Option-->
<h4 style="margin-top: 20px;">Vehicle Payment Option
</h4>
<table class="table table-sm"
style="border: 1px solid black; border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f2f2f2;">
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Invoice Item
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Payment Date
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Payment Amount Invoice
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Payment State
</th>
</tr>
</thead>
<tbody>
<tr t-foreach="data.rental_payment_plan_ids"
t-as="payment">
<td style="border: 1px solid black; padding: 5px;">
<span t-field="payment.invoice_item_id"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="payment.payment_date"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="payment.payment_amount"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
<t t-if="payment.invoice_id">
<span t-field="payment.invoice_id.name"/>
</t>
<t t-else="">
Draft Invoice
</t>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="payment.payment_state"/>
</td>
</tr>
</tbody>
</table>
<!-- Insurance Policy-->
<h4 style="margin-top: 20px;">Insurance Policy</h4>
<table class="table table-sm"
style="border: 1px solid black; border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f2f2f2;">
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Policy Number
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Name
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Description
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Policy Amount
</th>
</tr>
</thead>
<tbody>
<tr t-foreach="data.insurance_ids"
t-as="insurance">
<td style="border: 1px solid black; padding: 5px;">
<span t-field="insurance.policy_number"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="insurance.name"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="insurance.description"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="insurance.policy_amount"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</td>
</tr>
</tbody>
</table>
<!--Extra Services-->
<h4 style="margin-top: 20px;">Extra Services</h4>
<table class="table table-sm"
style="border: 1px solid black; border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f2f2f2;">
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Product
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Qty
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Description
</th>
<th style="border: 1px solid black; padding: 5px; text-align: left;">
Amount
</th>
</tr>
</thead>
<tbody>
<tr t-foreach="data.extra_service_ids"
t-as="service">
<td style="border: 1px solid black; padding: 5px;">
<span t-field="service.product_id"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="service.quantity"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="service.description"/>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="service.amount"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</td>
</tr>
</tbody>
</table>
<!-- Damage Details Tab -->
<h4 style="margin-top: 20px;">Vehicle Damages</h4>
<table class="table table-sm"
style="border: 1px solid black; border-collapse: collapse; width: 100%;">
<tr>
<td style="border: 1px solid black; padding: 5px;">
<strong>Total Damage Amount:</strong>
</td>
<td style="border: 1px solid black; padding: 5px;">
<span t-field="data.damage_amount"
t-options="{'widget': 'monetary', 'display_currency': data.currency_id}"/>
</td>
</tr>
</table>
<p style="margin-top: 10px;">
<strong>Descriptions</strong>
</p>
<p t-field="data.damage_description"/>
<!-- Vehicle Images -->
<h4 style="margin-top: 20px;">Vehicle Images</h4>
<div class="vehicle-images"
style="text-align: center;">
<t t-foreach="data.image_ids" t-as="image_record">
<img t-if="image_record.image"
t-att-src="image_record.image and ('data:image/png;base64,%s' % image_record.image.decode('utf-8'))"
alt="Vehicle Image"
style="max-width: 200px; margin: 10px;"/>
</t>
</div>
<!-- Signature Section -->
<div class="signature-section"
style="margin-top: 30px; text-align: right;">
<p>Signature Date:
<span t-field="data.sign_date"/>
</p>
<p>
<strong>Signature</strong>
<img t-if="data.digital_sign"
class="mobile-hide"
t-attf-src="data:image/png;base64,{{data.digital_sign}}"
style="width:125px; margin-top:8px;margin-bottom:-25px;"
alt="Signature"/>
</p>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

8
advanced_fleet_rental/security/ir.model.access.csv

@ -0,0 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_fleet_rental_contract,access.fleet.rental.contract.user,model_fleet_rental_contract,base.group_user,1,1,1,1
access_rental_payment_plan,access.rental.payment.plan.user,model_rental_payment_plan,base.group_user,1,1,1,1
access_extra_service,access.extra.service.user,model_extra_service,base.group_user,1,1,1,1
access_insurance_policy,access.insurance.policy.user,model_insurance_policy,base.group_user,1,1,1,1
access_multi_image,access.multi.image.user,model_multi_image,base.group_user,1,1,1,1
access_damage_invoice,access.damage.invoice.user,model_damage_invoice,base.group_user,1,1,1,1
access_cancellation_policy,access.cancellation.policy.user,model_cancellation_policy,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_fleet_rental_contract access.fleet.rental.contract.user model_fleet_rental_contract base.group_user 1 1 1 1
3 access_rental_payment_plan access.rental.payment.plan.user model_rental_payment_plan base.group_user 1 1 1 1
4 access_extra_service access.extra.service.user model_extra_service base.group_user 1 1 1 1
5 access_insurance_policy access.insurance.policy.user model_insurance_policy base.group_user 1 1 1 1
6 access_multi_image access.multi.image.user model_multi_image base.group_user 1 1 1 1
7 access_damage_invoice access.damage.invoice.user model_damage_invoice base.group_user 1 1 1 1
8 access_cancellation_policy access.cancellation.policy.user model_cancellation_policy base.group_user 1 1 1 1

BIN
advanced_fleet_rental/static/description/assets/cybro-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
advanced_fleet_rental/static/description/assets/cybro-odoo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
advanced_fleet_rental/static/description/assets/h2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
advanced_fleet_rental/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/cust.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

1
advanced_fleet_rental/static/description/assets/icons/down.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" width="512" height="512" x="0" y="0" viewBox="0 0 24 24" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g id="Layer_2" data-name="Layer 2"><path d="m12 1a11 11 0 1 0 11 11 11.013 11.013 0 0 0 -11-11zm5.707 9.707-5 5a1 1 0 0 1 -1.414 0l-5-5a1 1 0 0 1 1.414-1.414l4.293 4.293 4.293-4.293a1 1 0 0 1 1.414 1.414z" fill="#781d96" data-original="#000000" class=""></path></g></g></svg>

After

Width:  |  Height:  |  Size: 542 B

BIN
advanced_fleet_rental/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
advanced_fleet_rental/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
advanced_fleet_rental/static/description/assets/icons/faq.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/feature.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
advanced_fleet_rental/static/description/assets/icons/instance-line.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
advanced_fleet_rental/static/description/assets/icons/notes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
advanced_fleet_rental/static/description/assets/icons/pro1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
advanced_fleet_rental/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
advanced_fleet_rental/static/description/assets/icons/screenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
advanced_fleet_rental/static/description/assets/icons/skype.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

53
advanced_fleet_rental/static/description/assets/icons/star-1.svg

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1024px" height="1024px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.968" fill="#6802dd" d="M 872.5,351.5 C 869.316,353.414 865.649,354.08 861.5,353.5C 861.068,352.29 860.401,351.29 859.5,350.5C 855.884,340.601 851.217,331.268 845.5,322.5C 841.319,314.792 836.652,307.458 831.5,300.5C 825.654,289.989 818.654,280.322 810.5,271.5C 804.551,263.217 797.884,255.55 790.5,248.5C 783.833,241.167 776.833,234.167 769.5,227.5C 763.245,221.369 756.578,215.702 749.5,210.5C 738.906,201.529 727.572,193.529 715.5,186.5C 706.018,180.041 696.018,174.374 685.5,169.5C 673.375,162.774 660.708,157.107 647.5,152.5C 631.495,146.499 615.162,141.499 598.5,137.5C 507.572,117.423 420.572,128.089 337.5,169.5C 326.51,174.993 315.843,180.993 305.5,187.5C 296.223,193.444 287.223,199.778 278.5,206.5C 269.849,213.154 261.516,220.154 253.5,227.5C 246.167,234.167 239.167,241.167 232.5,248.5C 225.116,255.55 218.449,263.217 212.5,271.5C 204.346,280.322 197.346,289.989 191.5,300.5C 186.348,307.458 181.681,314.792 177.5,322.5C 171.798,331.237 167.132,340.57 163.5,350.5C 162.599,351.29 161.932,352.29 161.5,353.5C 157.351,354.08 153.684,353.414 150.5,351.5C 183.041,278.449 233.041,220.282 300.5,177C 398.817,117.525 503.817,101.859 615.5,130C 722.993,161.19 804.16,225.357 859,322.5C 864.059,331.948 868.559,341.615 872.5,351.5 Z"/></g>
<g><path style="opacity:1" fill="#b779fc" d="M 598.5,137.5 C 615.162,141.499 631.495,146.499 647.5,152.5C 640.391,154.014 633.058,154.847 625.5,155C 625.957,155.414 626.291,155.914 626.5,156.5C 616.183,157.332 605.849,157.832 595.5,158C 595.957,158.414 596.291,158.914 596.5,159.5C 591.533,160.329 586.533,160.829 581.5,161C 581.957,161.414 582.291,161.914 582.5,162.5C 572.833,163.167 563.167,163.833 553.5,164.5C 554.624,165.914 555.624,167.414 556.5,169C 540.819,169.345 525.152,170.011 509.5,171C 510.167,171.667 510.833,172.333 511.5,173C 501.5,173.333 491.5,173.667 481.5,174C 482.167,175 482.833,176 483.5,177C 474.176,177.744 464.843,178.244 455.5,178.5C 419.098,172.35 382.431,169.683 345.5,170.5C 358.362,169.511 371.362,168.344 384.5,167C 383.833,166 383.167,165 382.5,164C 401.944,162.442 421.944,161.109 442.5,160C 441.833,159.333 441.167,158.667 440.5,158C 445.833,157.667 451.167,157.333 456.5,157C 455.833,156.333 455.167,155.667 454.5,155C 473.944,153.442 493.944,152.109 514.5,151C 513.833,150 513.167,149 512.5,148C 517.533,147.829 522.533,147.329 527.5,146.5C 527.291,145.914 526.957,145.414 526.5,145C 536.849,144.832 547.183,144.332 557.5,143.5C 557.291,142.914 556.957,142.414 556.5,142C 566.184,141.832 575.851,141.332 585.5,140.5C 585.291,139.914 584.957,139.414 584.5,139C 589.351,138.826 594.018,138.326 598.5,137.5 Z"/></g>
<g><path style="opacity:1" fill="#ba7efd" d="M 598.5,137.5 C 594.018,138.326 589.351,138.826 584.5,139C 584.957,139.414 585.291,139.914 585.5,140.5C 575.851,141.332 566.184,141.832 556.5,142C 556.957,142.414 557.291,142.914 557.5,143.5C 547.183,144.332 536.849,144.832 526.5,145C 526.957,145.414 527.291,145.914 527.5,146.5C 522.533,147.329 517.533,147.829 512.5,148C 513.167,149 513.833,150 514.5,151C 493.944,152.109 473.944,153.442 454.5,155C 455.167,155.667 455.833,156.333 456.5,157C 451.167,157.333 445.833,157.667 440.5,158C 441.167,158.667 441.833,159.333 442.5,160C 421.944,161.109 401.944,162.442 382.5,164C 383.167,165 383.833,166 384.5,167C 371.362,168.344 358.362,169.511 345.5,170.5C 342.615,170.806 339.948,170.473 337.5,169.5C 420.572,128.089 507.572,117.423 598.5,137.5 Z"/></g>
<g><path style="opacity:1" fill="#b373fb" d="M 647.5,152.5 C 660.708,157.107 673.375,162.774 685.5,169.5C 678.679,170.329 671.679,170.829 664.5,171C 664.957,171.414 665.291,171.914 665.5,172.5C 655.851,173.332 646.184,173.832 636.5,174C 637.167,175 637.833,176 638.5,177C 633.467,177.171 628.467,177.671 623.5,178.5C 623.709,179.086 624.043,179.586 624.5,180C 603.944,181.109 583.944,182.442 564.5,184C 565.357,184.689 566.023,185.522 566.5,186.5C 561.5,187.167 556.5,187.833 551.5,188.5C 551.709,189.086 552.043,189.586 552.5,190C 542.167,190.333 531.833,190.667 521.5,191C 521.957,191.414 522.291,191.914 522.5,192.5C 519.914,193.48 517.247,193.813 514.5,193.5C 508.102,192.033 501.768,190.366 495.5,188.5C 482.32,184.531 468.987,181.198 455.5,178.5C 464.843,178.244 474.176,177.744 483.5,177C 482.833,176 482.167,175 481.5,174C 491.5,173.667 501.5,173.333 511.5,173C 510.833,172.333 510.167,171.667 509.5,171C 525.152,170.011 540.819,169.345 556.5,169C 555.624,167.414 554.624,165.914 553.5,164.5C 563.167,163.833 572.833,163.167 582.5,162.5C 582.291,161.914 581.957,161.414 581.5,161C 586.533,160.829 591.533,160.329 596.5,159.5C 596.291,158.914 595.957,158.414 595.5,158C 605.849,157.832 616.183,157.332 626.5,156.5C 626.291,155.914 625.957,155.414 625.5,155C 633.058,154.847 640.391,154.014 647.5,152.5 Z"/></g>
<g><path style="opacity:1" fill="#b06dfa" d="M 685.5,169.5 C 696.018,174.374 706.018,180.041 715.5,186.5C 712.642,187.166 709.642,187.833 706.5,188.5C 706.709,189.086 707.043,189.586 707.5,190C 697.151,190.168 686.817,190.668 676.5,191.5C 676.709,192.086 677.043,192.586 677.5,193C 662.518,194.032 647.518,194.698 632.5,195C 643.515,195.168 654.515,195.668 665.5,196.5C 645.225,197.916 624.892,199.416 604.5,201C 605.167,202 605.833,203 606.5,204C 601.833,204.333 597.167,204.667 592.5,205C 592.957,205.414 593.291,205.914 593.5,206.5C 583.183,207.332 572.849,207.832 562.5,208C 565.194,210.552 564.527,211.719 560.5,211.5C 557.166,210.166 553.833,208.833 550.5,207.5C 538.736,202.245 526.736,197.578 514.5,193.5C 517.247,193.813 519.914,193.48 522.5,192.5C 522.291,191.914 521.957,191.414 521.5,191C 531.833,190.667 542.167,190.333 552.5,190C 552.043,189.586 551.709,189.086 551.5,188.5C 556.5,187.833 561.5,187.167 566.5,186.5C 566.023,185.522 565.357,184.689 564.5,184C 583.944,182.442 603.944,181.109 624.5,180C 624.043,179.586 623.709,179.086 623.5,178.5C 628.467,177.671 633.467,177.171 638.5,177C 637.833,176 637.167,175 636.5,174C 646.184,173.832 655.851,173.332 665.5,172.5C 665.291,171.914 664.957,171.414 664.5,171C 671.679,170.829 678.679,170.329 685.5,169.5 Z"/></g>
<g><path style="opacity:1" fill="#af6bfb" d="M 337.5,169.5 C 339.948,170.473 342.615,170.806 345.5,170.5C 382.431,169.683 419.098,172.35 455.5,178.5C 468.987,181.198 482.32,184.531 495.5,188.5C 431.998,188.832 368.664,188.499 305.5,187.5C 315.843,180.993 326.51,174.993 337.5,169.5 Z"/></g>
<g><path style="opacity:1" fill="#ac66fa" d="M 305.5,187.5 C 368.664,188.499 431.998,188.832 495.5,188.5C 501.768,190.366 508.102,192.033 514.5,193.5C 526.736,197.578 538.736,202.245 550.5,207.5C 459.665,207.833 368.998,207.499 278.5,206.5C 287.223,199.778 296.223,193.444 305.5,187.5 Z"/></g>
<g><path style="opacity:1" fill="#ac66f9" d="M 715.5,186.5 C 727.572,193.529 738.906,201.529 749.5,210.5C 739.992,211.167 730.325,211.833 720.5,212.5C 720.709,213.086 721.043,213.586 721.5,214C 711.151,214.168 700.817,214.668 690.5,215.5C 690.833,216.167 691.167,216.833 691.5,217.5C 687.167,218.167 682.833,218.833 678.5,219.5C 678.709,220.086 679.043,220.586 679.5,221C 669.151,221.168 658.817,221.668 648.5,222.5C 648.977,223.478 649.643,224.311 650.5,225C 645.167,225.333 639.833,225.667 634.5,226C 635.167,226.667 635.833,227.333 636.5,228C 626.5,228.333 616.5,228.667 606.5,229C 609.145,232.164 608.145,233.331 603.5,232.5C 600.848,230.418 597.848,229.085 594.5,228.5C 583.446,222.306 572.112,216.639 560.5,211.5C 564.527,211.719 565.194,210.552 562.5,208C 572.849,207.832 583.183,207.332 593.5,206.5C 593.291,205.914 592.957,205.414 592.5,205C 597.167,204.667 601.833,204.333 606.5,204C 605.833,203 605.167,202 604.5,201C 624.892,199.416 645.225,197.916 665.5,196.5C 654.515,195.668 643.515,195.168 632.5,195C 647.518,194.698 662.518,194.032 677.5,193C 677.043,192.586 676.709,192.086 676.5,191.5C 686.817,190.668 697.151,190.168 707.5,190C 707.043,189.586 706.709,189.086 706.5,188.5C 709.642,187.833 712.642,187.166 715.5,186.5 Z"/></g>
<g><path style="opacity:1" fill="#a85ff8" d="M 278.5,206.5 C 368.998,207.499 459.665,207.833 550.5,207.5C 553.833,208.833 557.166,210.166 560.5,211.5C 572.112,216.639 583.446,222.306 594.5,228.5C 480.665,228.833 366.999,228.5 253.5,227.5C 261.516,220.154 269.849,213.154 278.5,206.5 Z"/></g>
<g><path style="opacity:1" fill="#a760f7" d="M 749.5,210.5 C 756.578,215.702 763.245,221.369 769.5,227.5C 767.031,228.317 764.365,228.817 761.5,229C 762.167,230 762.833,231 763.5,232C 753.151,232.168 742.817,232.668 732.5,233.5C 732.709,234.086 733.043,234.586 733.5,235C 728.467,235.171 723.467,235.671 718.5,236.5C 718.833,237.167 719.167,237.833 719.5,238.5C 709.833,239.167 700.167,239.833 690.5,240.5C 690.977,241.478 691.643,242.311 692.5,243C 687.167,243.333 681.833,243.667 676.5,244C 677.167,244.667 677.833,245.333 678.5,246C 668.151,246.168 657.817,246.668 647.5,247.5C 647.833,248.167 648.167,248.833 648.5,249.5C 643.208,250.495 637.875,250.828 632.5,250.5C 632.158,249.662 631.492,249.328 630.5,249.5C 621.669,243.583 612.669,237.917 603.5,232.5C 608.145,233.331 609.145,232.164 606.5,229C 616.5,228.667 626.5,228.333 636.5,228C 635.833,227.333 635.167,226.667 634.5,226C 639.833,225.667 645.167,225.333 650.5,225C 649.643,224.311 648.977,223.478 648.5,222.5C 658.817,221.668 669.151,221.168 679.5,221C 679.043,220.586 678.709,220.086 678.5,219.5C 682.833,218.833 687.167,218.167 691.5,217.5C 691.167,216.833 690.833,216.167 690.5,215.5C 700.817,214.668 711.151,214.168 721.5,214C 721.043,213.586 720.709,213.086 720.5,212.5C 730.325,211.833 739.992,211.167 749.5,210.5 Z"/></g>
<g><path style="opacity:1" fill="#a45af7" d="M 253.5,227.5 C 366.999,228.5 480.665,228.833 594.5,228.5C 597.848,229.085 600.848,230.418 603.5,232.5C 612.669,237.917 621.669,243.583 630.5,249.5C 592.663,249.168 554.996,249.502 517.5,250.5C 515.511,246.904 513.511,243.237 511.5,239.5C 509.203,243.1 507.203,246.767 505.5,250.5C 414.5,249.833 323.5,249.167 232.5,248.5C 239.167,241.167 246.167,234.167 253.5,227.5 Z"/></g>
<g><path style="opacity:1" fill="#a45af6" d="M 769.5,227.5 C 776.833,234.167 783.833,241.167 790.5,248.5C 779.674,249.33 768.674,249.83 757.5,250C 757.957,250.414 758.291,250.914 758.5,251.5C 764.167,252.167 769.833,252.833 775.5,253.5C 761.379,256.056 746.379,257.556 730.5,258C 731.167,259 731.833,260 732.5,261C 718.167,262.667 703.833,264.333 689.5,266C 690.293,267.085 690.96,268.252 691.5,269.5C 680.849,270.666 670.182,270.832 659.5,270C 650.433,263.478 641.433,256.978 632.5,250.5C 637.875,250.828 643.208,250.495 648.5,249.5C 648.167,248.833 647.833,248.167 647.5,247.5C 657.817,246.668 668.151,246.168 678.5,246C 677.833,245.333 677.167,244.667 676.5,244C 681.833,243.667 687.167,243.333 692.5,243C 691.643,242.311 690.977,241.478 690.5,240.5C 700.167,239.833 709.833,239.167 719.5,238.5C 719.167,237.833 718.833,237.167 718.5,236.5C 723.467,235.671 728.467,235.171 733.5,235C 733.043,234.586 732.709,234.086 732.5,233.5C 742.817,232.668 753.151,232.168 763.5,232C 762.833,231 762.167,230 761.5,229C 764.365,228.817 767.031,228.317 769.5,227.5 Z"/></g>
<g><path style="opacity:1" fill="#fefefe" d="M 517.5,250.5 C 520.659,258.151 524.325,265.484 528.5,272.5C 532.659,282.151 537.325,291.484 542.5,300.5C 546.263,309.024 550.263,317.358 554.5,325.5C 558.325,334.484 562.659,343.151 567.5,351.5C 571.325,360.484 575.659,369.151 580.5,377.5C 584.105,385.875 588.105,394.042 592.5,402C 615.123,405.491 637.79,408.658 660.5,411.5C 697.139,417.139 733.806,422.639 770.5,428C 766.296,432.036 762.296,436.202 758.5,440.5C 746.473,452.194 734.473,463.861 722.5,475.5C 708.807,488.861 695.14,502.194 681.5,515.5C 668.506,528.327 655.339,540.994 642,553.5C 641.26,554.749 641.427,555.749 642.5,556.5C 643.974,570.68 646.308,584.68 649.5,598.5C 652.98,621.718 656.98,644.718 661.5,667.5C 664.668,688.343 668.001,709.176 671.5,730C 671.167,730.833 670.833,731.667 670.5,732.5C 617.658,704.245 564.658,676.245 511.5,648.5C 458.5,676.5 405.5,704.5 352.5,732.5C 352.167,731.667 351.833,730.833 351.5,730C 354.999,709.176 358.332,688.343 361.5,667.5C 366.02,644.718 370.02,621.718 373.5,598.5C 376.692,584.68 379.026,570.68 380.5,556.5C 381.573,555.749 381.74,554.749 381,553.5C 366.327,539.66 351.827,525.66 337.5,511.5C 324.527,498.861 311.527,486.194 298.5,473.5C 287.193,462.527 275.86,451.527 264.5,440.5C 260.704,436.202 256.704,432.036 252.5,428C 289.455,422.173 326.455,416.673 363.5,411.5C 386.197,408.256 408.863,404.756 431.5,401C 433.974,395.886 436.307,390.72 438.5,385.5C 444.675,374.484 450.341,363.151 455.5,351.5C 460.341,343.151 464.675,334.484 468.5,325.5C 472.737,317.358 476.737,309.024 480.5,300.5C 485.675,291.484 490.341,282.151 494.5,272.5C 498.675,265.484 502.341,258.151 505.5,250.5C 507.203,246.767 509.203,243.1 511.5,239.5C 513.511,243.237 515.511,246.904 517.5,250.5 Z"/></g>
<g><path style="opacity:1" fill="#a054f5" d="M 232.5,248.5 C 323.5,249.167 414.5,249.833 505.5,250.5C 502.341,258.151 498.675,265.484 494.5,272.5C 400.332,272.833 306.332,272.499 212.5,271.5C 218.449,263.217 225.116,255.55 232.5,248.5 Z"/></g>
<g><path style="opacity:1" fill="#a054f5" d="M 790.5,248.5 C 797.884,255.55 804.551,263.217 810.5,271.5C 802.677,272.329 794.677,272.829 786.5,273C 787.357,273.689 788.023,274.522 788.5,275.5C 778.183,276.332 767.849,276.832 757.5,277C 758.167,278 758.833,279 759.5,280C 754.467,280.171 749.467,280.671 744.5,281.5C 744.833,282.167 745.167,282.833 745.5,283.5C 735.833,284.167 726.167,284.833 716.5,285.5C 716.977,286.478 717.643,287.311 718.5,288C 713.167,288.333 707.833,288.667 702.5,289C 703.357,289.689 704.023,290.522 704.5,291.5C 699.147,292.211 693.814,292.878 688.5,293.5C 680.015,286.426 671.348,279.592 662.5,273C 617.835,272.5 573.168,272.333 528.5,272.5C 524.325,265.484 520.659,258.151 517.5,250.5C 554.996,249.502 592.663,249.168 630.5,249.5C 631.492,249.328 632.158,249.662 632.5,250.5C 641.433,256.978 650.433,263.478 659.5,270C 670.182,270.832 680.849,270.666 691.5,269.5C 690.96,268.252 690.293,267.085 689.5,266C 703.833,264.333 718.167,262.667 732.5,261C 731.833,260 731.167,259 730.5,258C 746.379,257.556 761.379,256.056 775.5,253.5C 769.833,252.833 764.167,252.167 758.5,251.5C 758.291,250.914 757.957,250.414 757.5,250C 768.674,249.83 779.674,249.33 790.5,248.5 Z"/></g>
<g><path style="opacity:1" fill="#9c4df4" d="M 212.5,271.5 C 306.332,272.499 400.332,272.833 494.5,272.5C 490.341,282.151 485.675,291.484 480.5,300.5C 384.167,300.5 287.833,300.5 191.5,300.5C 197.346,289.989 204.346,280.322 212.5,271.5 Z"/></g>
<g><path style="opacity:1" fill="#9b4df3" d="M 810.5,271.5 C 818.654,280.322 825.654,289.989 831.5,300.5C 822.143,300.168 812.81,300.502 803.5,301.5C 803.833,302.167 804.167,302.833 804.5,303.5C 794.183,304.332 783.849,304.832 773.5,305C 774.167,306 774.833,307 775.5,308C 770.467,308.171 765.467,308.671 760.5,309.5C 760.833,310.167 761.167,310.833 761.5,311.5C 756.533,312.329 751.533,312.829 746.5,313C 747.167,314 747.833,315 748.5,316C 738.816,316.168 729.149,316.668 719.5,317.5C 721.167,319.167 720.833,320.167 718.5,320.5C 710.578,314.916 703.245,308.583 696.5,301.5C 645.171,300.5 593.838,300.167 542.5,300.5C 537.325,291.484 532.659,282.151 528.5,272.5C 573.168,272.333 617.835,272.5 662.5,273C 671.348,279.592 680.015,286.426 688.5,293.5C 693.814,292.878 699.147,292.211 704.5,291.5C 704.023,290.522 703.357,289.689 702.5,289C 707.833,288.667 713.167,288.333 718.5,288C 717.643,287.311 716.977,286.478 716.5,285.5C 726.167,284.833 735.833,284.167 745.5,283.5C 745.167,282.833 744.833,282.167 744.5,281.5C 749.467,280.671 754.467,280.171 759.5,280C 758.833,279 758.167,278 757.5,277C 767.849,276.832 778.183,276.332 788.5,275.5C 788.023,274.522 787.357,273.689 786.5,273C 794.677,272.829 802.677,272.329 810.5,271.5 Z"/></g>
<g><path style="opacity:1" fill="#9847f2" d="M 191.5,300.5 C 287.833,300.5 384.167,300.5 480.5,300.5C 476.737,309.024 472.737,317.358 468.5,325.5C 371.329,325.166 274.329,324.166 177.5,322.5C 181.681,314.792 186.348,307.458 191.5,300.5 Z"/></g>
<g><path style="opacity:1" fill="#9847f2" d="M 542.5,300.5 C 593.838,300.167 645.171,300.5 696.5,301.5C 703.245,308.583 710.578,314.916 718.5,320.5C 720.833,320.167 721.167,319.167 719.5,317.5C 729.149,316.668 738.816,316.168 748.5,316C 747.833,315 747.167,314 746.5,313C 751.533,312.829 756.533,312.329 761.5,311.5C 761.167,310.833 760.833,310.167 760.5,309.5C 765.467,308.671 770.467,308.171 775.5,308C 774.833,307 774.167,306 773.5,305C 783.849,304.832 794.183,304.332 804.5,303.5C 804.167,302.833 803.833,302.167 803.5,301.5C 812.81,300.502 822.143,300.168 831.5,300.5C 836.652,307.458 841.319,314.792 845.5,322.5C 836.219,324.312 826.552,325.145 816.5,325C 817.357,325.689 818.023,326.522 818.5,327.5C 808.183,328.332 797.849,328.832 787.5,329C 788.293,330.085 788.96,331.252 789.5,332.5C 784.533,333.329 779.533,333.829 774.5,334C 775.916,336.835 777.583,339.502 779.5,342C 769.5,342.333 759.5,342.667 749.5,343C 750.357,343.689 751.023,344.522 751.5,345.5C 747.541,346.66 743.541,346.827 739.5,346C 733.171,338.671 726.504,331.671 719.5,325C 664.332,324.168 609.332,324.335 554.5,325.5C 550.263,317.358 546.263,309.024 542.5,300.5 Z"/></g>
<g><path style="opacity:1" fill="#9441f0" d="M 177.5,322.5 C 274.329,324.166 371.329,325.166 468.5,325.5C 464.675,334.484 460.341,343.151 455.5,351.5C 358.335,350.501 261.001,350.167 163.5,350.5C 167.132,340.57 171.798,331.237 177.5,322.5 Z"/></g>
<g><path style="opacity:1" fill="#9441f0" d="M 845.5,322.5 C 851.217,331.268 855.884,340.601 859.5,350.5C 850.161,350.334 840.827,350.5 831.5,351C 832.357,351.689 833.023,352.522 833.5,353.5C 828.5,354.167 823.5,354.833 818.5,355.5C 819.167,356.5 819.833,357.5 820.5,358.5C 810.183,359.332 799.849,359.832 789.5,360C 790.167,361 790.833,362 791.5,363C 786.467,363.171 781.467,363.671 776.5,364.5C 777.04,365.748 777.707,366.915 778.5,368C 773.833,368.333 769.167,368.667 764.5,369C 767.388,371.296 766.888,372.462 763,372.5C 761.564,372.441 760.231,372.108 759,371.5C 754.259,364.088 748.759,357.255 742.5,351C 683.999,350.168 625.665,350.335 567.5,351.5C 562.659,343.151 558.325,334.484 554.5,325.5C 609.332,324.335 664.332,324.168 719.5,325C 726.504,331.671 733.171,338.671 739.5,346C 743.541,346.827 747.541,346.66 751.5,345.5C 751.023,344.522 750.357,343.689 749.5,343C 759.5,342.667 769.5,342.333 779.5,342C 777.583,339.502 775.916,336.835 774.5,334C 779.533,333.829 784.533,333.329 789.5,332.5C 788.96,331.252 788.293,330.085 787.5,329C 797.849,328.832 808.183,328.332 818.5,327.5C 818.023,326.522 817.357,325.689 816.5,325C 826.552,325.145 836.219,324.312 845.5,322.5 Z"/></g>
<g><path style="opacity:1" fill="#8f3bee" d="M 859.5,350.5 C 860.401,351.29 861.068,352.29 861.5,353.5C 865.09,360.937 868.09,368.603 870.5,376.5C 863.011,377.329 855.344,377.829 847.5,378C 848.167,379 848.833,380 849.5,381C 844.167,381.333 838.833,381.667 833.5,382C 834.743,383.154 835.743,384.488 836.5,386C 826.151,386.168 815.817,386.668 805.5,387.5C 806.167,388.5 806.833,389.5 807.5,390.5C 802.5,391.167 797.5,391.833 792.5,392.5C 792.977,393.478 793.643,394.311 794.5,395C 789.833,395.333 785.167,395.667 780.5,396C 782.631,397.888 782.631,399.388 780.5,400.5C 774.249,393.525 768.582,386.025 763.5,378C 702.501,377.5 641.501,377.333 580.5,377.5C 575.659,369.151 571.325,360.484 567.5,351.5C 625.665,350.335 683.999,350.168 742.5,351C 748.759,357.255 754.259,364.088 759,371.5C 760.231,372.108 761.564,372.441 763,372.5C 766.888,372.462 767.388,371.296 764.5,369C 769.167,368.667 773.833,368.333 778.5,368C 777.707,366.915 777.04,365.748 776.5,364.5C 781.467,363.671 786.467,363.171 791.5,363C 790.833,362 790.167,361 789.5,360C 799.849,359.832 810.183,359.332 820.5,358.5C 819.833,357.5 819.167,356.5 818.5,355.5C 823.5,354.833 828.5,354.167 833.5,353.5C 833.023,352.522 832.357,351.689 831.5,351C 840.827,350.5 850.161,350.334 859.5,350.5 Z"/></g>
<g><path style="opacity:1" fill="#8f39ee" d="M 163.5,350.5 C 261.001,350.167 358.335,350.501 455.5,351.5C 450.341,363.151 444.675,374.484 438.5,385.5C 341.999,385.833 245.665,385.499 149.5,384.5C 152.713,373.859 156.713,363.526 161.5,353.5C 161.932,352.29 162.599,351.29 163.5,350.5 Z"/></g>
<g><path style="opacity:1" fill="#8b34ec" d="M 149.5,384.5 C 245.665,385.499 341.999,385.833 438.5,385.5C 436.307,390.72 433.974,395.886 431.5,401C 408.863,404.756 386.197,408.256 363.5,411.5C 289.5,410.833 215.5,410.167 141.5,409.5C 143.393,400.825 146.059,392.492 149.5,384.5 Z"/></g>
<g><path style="opacity:1" fill="#8c35ec" d="M 870.5,376.5 C 875.138,387.079 878.804,398.079 881.5,409.5C 871.145,409.168 860.812,409.501 850.5,410.5C 851.248,412.332 852.248,413.999 853.5,415.5C 843.183,416.332 832.849,416.832 822.5,417C 833.358,418.147 844.358,418.98 855.5,419.5C 845.183,420.332 834.849,420.832 824.5,421C 825.357,421.689 826.023,422.522 826.5,423.5C 816.833,424.167 807.167,424.833 797.5,425.5C 797.709,426.086 798.043,426.586 798.5,427C 803.5,427.333 808.5,427.667 813.5,428C 808.833,428.333 804.167,428.667 799.5,429C 800.627,430.753 801.627,432.587 802.5,434.5C 801.167,435.833 799.833,435.833 798.5,434.5C 794.43,426.275 789.764,418.441 784.5,411C 742.998,410.169 701.665,410.335 660.5,411.5C 637.79,408.658 615.123,405.491 592.5,402C 588.105,394.042 584.105,385.875 580.5,377.5C 641.501,377.333 702.501,377.5 763.5,378C 768.582,386.025 774.249,393.525 780.5,400.5C 782.631,399.388 782.631,397.888 780.5,396C 785.167,395.667 789.833,395.333 794.5,395C 793.643,394.311 792.977,393.478 792.5,392.5C 797.5,391.833 802.5,391.167 807.5,390.5C 806.833,389.5 806.167,388.5 805.5,387.5C 815.817,386.668 826.151,386.168 836.5,386C 835.743,384.488 834.743,383.154 833.5,382C 838.833,381.667 844.167,381.333 849.5,381C 848.833,380 848.167,379 847.5,378C 855.344,377.829 863.011,377.329 870.5,376.5 Z"/></g>
<g><path style="opacity:1" fill="#872fea" d="M 141.5,409.5 C 215.5,410.167 289.5,410.833 363.5,411.5C 326.455,416.673 289.455,422.173 252.5,428C 256.704,432.036 260.704,436.202 264.5,440.5C 220.997,440.832 177.663,440.499 134.5,439.5C 135.915,429.179 138.249,419.179 141.5,409.5 Z"/></g>
<g><path style="opacity:1" fill="#8830ea" d="M 881.5,409.5 C 884.57,419.55 886.904,429.883 888.5,440.5C 886.801,440.34 885.134,440.506 883.5,441C 884.743,442.154 885.743,443.488 886.5,445C 881.167,445.333 875.833,445.667 870.5,446C 871.872,447.242 872.872,448.742 873.5,450.5C 868.533,451.329 863.533,451.829 858.5,452C 859.293,453.085 859.96,454.252 860.5,455.5C 850.183,456.332 839.849,456.832 829.5,457C 830.872,458.242 831.872,459.742 832.5,461.5C 828.167,462.167 823.833,462.833 819.5,463.5C 820.04,464.748 820.707,465.915 821.5,467C 818.773,467.818 816.106,467.652 813.5,466.5C 809.805,457.61 805.472,449.11 800.5,441C 786.504,440.5 772.504,440.333 758.5,440.5C 762.296,436.202 766.296,432.036 770.5,428C 733.806,422.639 697.139,417.139 660.5,411.5C 701.665,410.335 742.998,410.169 784.5,411C 789.764,418.441 794.43,426.275 798.5,434.5C 799.833,435.833 801.167,435.833 802.5,434.5C 801.627,432.587 800.627,430.753 799.5,429C 804.167,428.667 808.833,428.333 813.5,428C 808.5,427.667 803.5,427.333 798.5,427C 798.043,426.586 797.709,426.086 797.5,425.5C 807.167,424.833 816.833,424.167 826.5,423.5C 826.023,422.522 825.357,421.689 824.5,421C 834.849,420.832 845.183,420.332 855.5,419.5C 844.358,418.98 833.358,418.147 822.5,417C 832.849,416.832 843.183,416.332 853.5,415.5C 852.248,413.999 851.248,412.332 850.5,410.5C 860.812,409.501 871.145,409.168 881.5,409.5 Z"/></g>
<g><path style="opacity:1" fill="#8328e8" d="M 134.5,439.5 C 177.663,440.499 220.997,440.832 264.5,440.5C 275.86,451.527 287.193,462.527 298.5,473.5C 242.167,473.5 185.833,473.5 129.5,473.5C 130.162,461.889 131.829,450.556 134.5,439.5 Z"/></g>
<g><path style="opacity:1" fill="#8228e8" d="M 758.5,440.5 C 772.504,440.333 786.504,440.5 800.5,441C 805.472,449.11 809.805,457.61 813.5,466.5C 816.106,467.652 818.773,467.818 821.5,467C 820.707,465.915 820.04,464.748 819.5,463.5C 823.833,462.833 828.167,462.167 832.5,461.5C 831.872,459.742 830.872,458.242 829.5,457C 839.849,456.832 850.183,456.332 860.5,455.5C 859.96,454.252 859.293,453.085 858.5,452C 863.533,451.829 868.533,451.329 873.5,450.5C 872.872,448.742 871.872,447.242 870.5,446C 875.833,445.667 881.167,445.333 886.5,445C 885.743,443.488 884.743,442.154 883.5,441C 885.134,440.506 886.801,440.34 888.5,440.5C 891.55,452.608 893.217,464.941 893.5,477.5C 892.391,478.29 891.058,478.79 889.5,479C 890.872,480.242 891.872,481.742 892.5,483.5C 887.533,484.329 882.533,484.829 877.5,485C 878.5,486.667 879.5,488.333 880.5,490C 870.167,490.333 859.833,490.667 849.5,491C 850.5,492.667 851.5,494.333 852.5,496C 847.833,496.333 843.167,496.667 838.5,497C 842.659,501.511 841.325,503.344 834.5,502.5C 831.911,502.473 829.411,502.139 827,501.5C 823.905,492.814 820.405,484.314 816.5,476C 785.168,475.5 753.835,475.333 722.5,475.5C 734.473,463.861 746.473,452.194 758.5,440.5 Z"/></g>
<g><path style="opacity:0.967" fill="#6000cd" d="M 150.5,351.5 C 153.684,353.414 157.351,354.08 161.5,353.5C 156.713,363.526 152.713,373.859 149.5,384.5C 146.059,392.492 143.393,400.825 141.5,409.5C 138.249,419.179 135.915,429.179 134.5,439.5C 131.829,450.556 130.162,461.889 129.5,473.5C 127.987,486.116 127.32,498.782 127.5,511.5C 127.225,525.978 128.225,540.311 130.5,554.5C 131.184,565.251 132.517,575.917 134.5,586.5C 130.498,586.036 126.831,586.702 123.5,588.5C 109.33,512.205 116.163,437.872 144,365.5C 145.942,360.623 148.108,355.956 150.5,351.5 Z"/></g>
<g><path style="opacity:0.968" fill="#6000cd" d="M 872.5,351.5 C 905.029,424.884 914.362,501.217 900.5,580.5C 896.936,581.423 893.269,581.756 889.5,581.5C 892.521,561.606 894.521,541.606 895.5,521.5C 895.817,506.633 895.15,491.966 893.5,477.5C 893.217,464.941 891.55,452.608 888.5,440.5C 886.904,429.883 884.57,419.55 881.5,409.5C 878.804,398.079 875.138,387.079 870.5,376.5C 868.09,368.603 865.09,360.937 861.5,353.5C 865.649,354.08 869.316,353.414 872.5,351.5 Z"/></g>
<g><path style="opacity:1" fill="#7e22e6" d="M 129.5,473.5 C 185.833,473.5 242.167,473.5 298.5,473.5C 311.527,486.194 324.527,498.861 337.5,511.5C 267.5,511.5 197.5,511.5 127.5,511.5C 127.32,498.782 127.987,486.116 129.5,473.5 Z"/></g>
<g><path style="opacity:1" fill="#7e22e5" d="M 722.5,475.5 C 753.835,475.333 785.168,475.5 816.5,476C 820.405,484.314 823.905,492.814 827,501.5C 829.411,502.139 831.911,502.473 834.5,502.5C 841.325,503.344 842.659,501.511 838.5,497C 843.167,496.667 847.833,496.333 852.5,496C 851.5,494.333 850.5,492.667 849.5,491C 859.833,490.667 870.167,490.333 880.5,490C 879.5,488.333 878.5,486.667 877.5,485C 882.533,484.829 887.533,484.329 892.5,483.5C 891.872,481.742 890.872,480.242 889.5,479C 891.058,478.79 892.391,478.29 893.5,477.5C 895.15,491.966 895.817,506.633 895.5,521.5C 894.532,523.607 894.198,525.941 894.5,528.5C 892.076,528.192 889.743,528.526 887.5,529.5C 888.167,530.5 888.833,531.5 889.5,532.5C 884.5,533.167 879.5,533.833 874.5,534.5C 874.709,535.086 875.043,535.586 875.5,536C 870.833,536.333 866.167,536.667 861.5,537C 866.689,538.121 872.022,538.955 877.5,539.5C 867.833,540.167 858.167,540.833 848.5,541.5C 850.043,544.086 851.709,546.586 853.5,549C 849.179,549.499 844.846,549.666 840.5,549.5C 837.496,538.149 834.496,526.816 831.5,515.5C 781.5,515.5 731.5,515.5 681.5,515.5C 695.14,502.194 708.807,488.861 722.5,475.5 Z"/></g>
<g><path style="opacity:1" fill="#7a1be3" d="M 127.5,511.5 C 197.5,511.5 267.5,511.5 337.5,511.5C 351.827,525.66 366.327,539.66 381,553.5C 381.74,554.749 381.573,555.749 380.5,556.5C 297.507,554.503 214.173,553.836 130.5,554.5C 128.225,540.311 127.225,525.978 127.5,511.5 Z"/></g>
<g><path style="opacity:1" fill="#791be2" d="M 681.5,515.5 C 731.5,515.5 781.5,515.5 831.5,515.5C 834.496,526.816 837.496,538.149 840.5,549.5C 844.846,549.666 849.179,549.499 853.5,549C 851.709,546.586 850.043,544.086 848.5,541.5C 858.167,540.833 867.833,540.167 877.5,539.5C 872.022,538.955 866.689,538.121 861.5,537C 866.167,536.667 870.833,536.333 875.5,536C 875.043,535.586 874.709,535.086 874.5,534.5C 879.5,533.833 884.5,533.167 889.5,532.5C 888.833,531.5 888.167,530.5 887.5,529.5C 889.743,528.526 892.076,528.192 894.5,528.5C 894.198,525.941 894.532,523.607 895.5,521.5C 894.521,541.606 892.521,561.606 889.5,581.5C 888.393,585.142 887.393,588.809 886.5,592.5C 873.816,592.832 861.149,592.499 848.5,591.5C 846.274,579.147 843.941,566.813 841.5,554.5C 774.825,553.837 708.492,554.503 642.5,556.5C 641.427,555.749 641.26,554.749 642,553.5C 655.339,540.994 668.506,528.327 681.5,515.5 Z"/></g>
<g><path style="opacity:1" fill="#7414e0" d="M 130.5,554.5 C 214.173,553.836 297.507,554.503 380.5,556.5C 379.026,570.68 376.692,584.68 373.5,598.5C 294.833,598.5 216.167,598.5 137.5,598.5C 136.688,594.552 135.688,590.552 134.5,586.5C 132.517,575.917 131.184,565.251 130.5,554.5 Z"/></g>
<g><path style="opacity:1" fill="#7415df" d="M 886.5,592.5 C 879.597,626.622 867.931,658.955 851.5,689.5C 852.099,681.514 852.432,673.514 852.5,665.5C 853.102,643.007 851.769,620.674 848.5,598.5C 782.167,598.5 715.833,598.5 649.5,598.5C 646.308,584.68 643.974,570.68 642.5,556.5C 708.492,554.503 774.825,553.837 841.5,554.5C 843.941,566.813 846.274,579.147 848.5,591.5C 861.149,592.499 873.816,592.832 886.5,592.5 Z"/></g>
<g><path style="opacity:1" fill="#6f0edc" d="M 137.5,598.5 C 216.167,598.5 294.833,598.5 373.5,598.5C 370.02,621.718 366.02,644.718 361.5,667.5C 294.508,665.503 227.175,664.837 159.5,665.5C 150.164,643.824 142.83,621.491 137.5,598.5 Z"/></g>
<g><path style="opacity:1" fill="#6f0edc" d="M 649.5,598.5 C 715.833,598.5 782.167,598.5 848.5,598.5C 851.769,620.674 853.102,643.007 852.5,665.5C 788.491,664.837 724.825,665.504 661.5,667.5C 656.98,644.718 652.98,621.718 649.5,598.5 Z"/></g>
<g><path style="opacity:0.969" fill="#5a00c0" d="M 134.5,586.5 C 135.688,590.552 136.688,594.552 137.5,598.5C 142.83,621.491 150.164,643.824 159.5,665.5C 173.814,698.423 192.481,728.423 215.5,755.5C 226.153,768.485 237.487,780.819 249.5,792.5C 244.637,792.181 239.97,792.514 235.5,793.5C 177.143,737.155 139.81,668.821 123.5,588.5C 126.831,586.702 130.498,586.036 134.5,586.5 Z"/></g>
<g><path style="opacity:0.971" fill="#5a00c0" d="M 900.5,580.5 C 885.439,663.639 848.106,734.639 788.5,793.5C 783.695,792.513 778.695,792.179 773.5,792.5C 785.57,780.767 796.903,768.433 807.5,755.5C 824.905,735.409 839.572,713.409 851.5,689.5C 867.931,658.955 879.597,626.622 886.5,592.5C 887.393,588.809 888.393,585.142 889.5,581.5C 893.269,581.756 896.936,581.423 900.5,580.5 Z"/></g>
<g><path style="opacity:1" fill="#6907d6" d="M 661.5,667.5 C 724.825,665.504 788.491,664.837 852.5,665.5C 852.432,673.514 852.099,681.514 851.5,689.5C 839.572,713.409 824.905,735.409 807.5,755.5C 610.167,755.5 412.833,755.5 215.5,755.5C 192.481,728.423 173.814,698.423 159.5,665.5C 227.175,664.837 294.508,665.503 361.5,667.5C 358.332,688.343 354.999,709.176 351.5,730C 351.833,730.833 352.167,731.667 352.5,732.5C 405.5,704.5 458.5,676.5 511.5,648.5C 564.658,676.245 617.658,704.245 670.5,732.5C 670.833,731.667 671.167,730.833 671.5,730C 668.001,709.176 664.668,688.343 661.5,667.5 Z"/></g>
<g><path style="opacity:1" fill="#6503d2" d="M 215.5,755.5 C 412.833,755.5 610.167,755.5 807.5,755.5C 796.903,768.433 785.57,780.767 773.5,792.5C 745.16,818.852 713.494,840.518 678.5,857.5C 677.893,857.376 677.56,857.043 677.5,856.5C 682.671,851.159 686.004,844.825 687.5,837.5C 688.648,833.019 688.815,828.352 688,823.5C 686.688,818.884 684.855,814.551 682.5,810.5C 669.58,795.183 653.58,784.016 634.5,777C 628.5,775 622.5,773 616.5,771C 546.5,770.333 476.5,770.333 406.5,771C 385.378,776.727 366.378,786.394 349.5,800C 346.137,803.252 343.137,806.752 340.5,810.5C 338.145,814.551 336.312,818.884 335,823.5C 334.185,828.352 334.352,833.019 335.5,837.5C 336.996,844.825 340.329,851.159 345.5,856.5C 345.44,857.043 345.107,857.376 344.5,857.5C 309.796,840.106 278.13,818.439 249.5,792.5C 237.487,780.819 226.153,768.485 215.5,755.5 Z"/></g>
<g><path style="opacity:1" fill="#6709d1" d="M 682.5,810.5 C 568.5,810.5 454.5,810.5 340.5,810.5C 343.137,806.752 346.137,803.252 349.5,800C 366.378,786.394 385.378,776.727 406.5,771C 476.5,770.333 546.5,770.333 616.5,771C 622.5,773 628.5,775 634.5,777C 653.58,784.016 669.58,795.183 682.5,810.5 Z"/></g>
<g><path style="opacity:1" fill="#5b05bc" d="M 249.5,792.5 C 278.13,818.439 309.796,840.106 344.5,857.5C 345.107,857.376 345.44,857.043 345.5,856.5C 456.167,855.167 566.833,855.167 677.5,856.5C 677.56,857.043 677.893,857.376 678.5,857.5C 713.494,840.518 745.16,818.852 773.5,792.5C 778.695,792.179 783.695,792.513 788.5,793.5C 735.361,845.249 672.361,879.582 599.5,896.5C 619.323,891.277 638.323,883.777 656.5,874C 662.736,870.433 668.403,866.1 673.5,861C 673,860.833 672.5,860.667 672,860.5C 659.298,865.938 646.465,870.938 633.5,875.5C 552.167,875.5 470.833,875.5 389.5,875.5C 375.525,870.833 361.858,865.666 348.5,860C 363.482,872.998 380.482,882.664 399.5,889C 410.834,892.498 422.168,895.664 433.5,898.5C 356.558,883.372 290.558,848.372 235.5,793.5C 239.97,792.514 244.637,792.181 249.5,792.5 Z"/></g>
<g><path style="opacity:1" fill="#6209c4" d="M 687.5,837.5 C 686.004,844.825 682.671,851.159 677.5,856.5C 566.833,855.167 456.167,855.167 345.5,856.5C 340.329,851.159 336.996,844.825 335.5,837.5C 452.833,836.167 570.167,836.167 687.5,837.5 Z"/></g>
<g><path style="opacity:1" fill="#650acb" d="M 340.5,810.5 C 454.5,810.5 568.5,810.5 682.5,810.5C 684.855,814.551 686.688,818.884 688,823.5C 688.815,828.352 688.648,833.019 687.5,837.5C 570.167,836.167 452.833,836.167 335.5,837.5C 334.352,833.019 334.185,828.352 335,823.5C 336.312,818.884 338.145,814.551 340.5,810.5 Z"/></g>
<g><path style="opacity:1" fill="#4d03a0" d="M 389.5,875.5 C 470.821,902.166 552.155,902.166 633.5,875.5C 646.465,870.938 659.298,865.938 672,860.5C 672.5,860.667 673,860.833 673.5,861C 668.403,866.1 662.736,870.433 656.5,874C 638.323,883.777 619.323,891.277 599.5,896.5C 555.413,906.717 510.747,909.217 465.5,904C 454.57,902.901 443.903,901.068 433.5,898.5C 422.168,895.664 410.834,892.498 399.5,889C 380.482,882.664 363.482,872.998 348.5,860C 361.858,865.666 375.525,870.833 389.5,875.5 Z"/></g>
<g><path style="opacity:1" fill="#5805b5" d="M 389.5,875.5 C 470.833,875.5 552.167,875.5 633.5,875.5C 552.155,902.166 470.821,902.166 389.5,875.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

9
advanced_fleet_rental/static/description/assets/icons/star-2.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/test-1 - Copy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/test-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/test-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
advanced_fleet_rental/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
advanced_fleet_rental/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
advanced_fleet_rental/static/description/assets/icons/video.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
advanced_fleet_rental/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/1.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
advanced_fleet_rental/static/description/assets/modules/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots.zip

Binary file not shown.

BIN
advanced_fleet_rental/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/20.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/21.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/22.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/23.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
advanced_fleet_rental/static/description/assets/screenshots/hero-v17.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

BIN
advanced_fleet_rental/static/description/assets/y18.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 KiB

BIN
advanced_fleet_rental/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
advanced_fleet_rental/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

1282
advanced_fleet_rental/static/description/index.html

File diff suppressed because it is too large

78
advanced_fleet_rental/static/src/css/xero_dashboard.css

@ -0,0 +1,78 @@
.components{
margin: 40px !important;
border-radius: 17px;
padding-bottom: 25px;
}
.heading{
margin-top:15px;
margin-bottom:8px;
}
.tile{
height: 125px;
border-radius: 30px;
display: flex;
justify-content: center;
flex-direction: column;
}
.tile:hover{
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
}
.card:hover{
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
}
.chart{
margin: 40px !important;
}
.row_table{
margin: 40px !important;
padding-bottom: 40px;
}
/* Basic styling for the header */
.contracts-header {
font-family: 'Poppins', 'Open Sans', sans-serif;
font-size: 1.5rem;
font-weight: 600;
color: #333;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
position: relative;
}
/* Option 1: With subtle text shadow */
.contracts-header-shadow {
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
}
/* Option 2: With gradient text color */
.contracts-header-gradient {
background: linear-gradient(90deg, #3498db, #2980b9);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
/* Option 3: With icon prefix */
.contracts-header-icon::before {
content: "📄 ";
margin-right: 8px;
}
/* Option 4: With subtle background */
.contracts-header-background {
background-color: #f5f9ff;
padding: 10px 15px;
border-radius: 6px;
border-bottom: none;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
/* Option 5: Uppercase with letter spacing */
.contracts-header-uppercase {
text-transform: uppercase;
letter-spacing: 1.5px;
font-size: 1.2rem;
}

1
advanced_fleet_rental/static/src/images/cancelled.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.0 KiB

1
advanced_fleet_rental/static/src/images/car-insurance.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save