Browse Source

Jan 31 : [ADD] Initial Commit 'website_fleet_service'

pull/267/merge
RisvanaCybro 1 year ago
parent
commit
e3223feba9
  1. 44
      website_fleet_service/README.rst
  2. 22
      website_fleet_service/__init__.py
  3. 58
      website_fleet_service/__manifest__.py
  4. 22
      website_fleet_service/controllers/__init__.py
  5. 76
      website_fleet_service/controllers/portal.py
  6. 77
      website_fleet_service/controllers/website_fleet_service.py
  7. 13
      website_fleet_service/data/ir_sequence_data.xml
  8. 90
      website_fleet_service/data/service_type_data.xml
  9. 18
      website_fleet_service/data/website_fleet_service_menu_data.xml
  10. 6
      website_fleet_service/doc/RELEASE_NOTES.md
  11. 25
      website_fleet_service/models/__init__.py
  12. 81
      website_fleet_service/models/account_move.py
  13. 234
      website_fleet_service/models/service_booking.py
  14. 96
      website_fleet_service/models/service_package.py
  15. 46
      website_fleet_service/models/service_type.py
  16. 73
      website_fleet_service/models/service_worksheet.py
  17. 11
      website_fleet_service/security/ir.model.access.csv
  18. 22
      website_fleet_service/security/website_fleet_service_security.xml
  19. BIN
      website_fleet_service/static/description/assets/icons/check.png
  20. BIN
      website_fleet_service/static/description/assets/icons/chevron.png
  21. BIN
      website_fleet_service/static/description/assets/icons/cogs.png
  22. BIN
      website_fleet_service/static/description/assets/icons/consultation.png
  23. BIN
      website_fleet_service/static/description/assets/icons/ecom-black.png
  24. BIN
      website_fleet_service/static/description/assets/icons/education-black.png
  25. BIN
      website_fleet_service/static/description/assets/icons/hotel-black.png
  26. BIN
      website_fleet_service/static/description/assets/icons/license.png
  27. BIN
      website_fleet_service/static/description/assets/icons/lifebuoy.png
  28. BIN
      website_fleet_service/static/description/assets/icons/manufacturing-black.png
  29. BIN
      website_fleet_service/static/description/assets/icons/pos-black.png
  30. BIN
      website_fleet_service/static/description/assets/icons/puzzle.png
  31. BIN
      website_fleet_service/static/description/assets/icons/restaurant-black.png
  32. BIN
      website_fleet_service/static/description/assets/icons/service-black.png
  33. BIN
      website_fleet_service/static/description/assets/icons/trading-black.png
  34. BIN
      website_fleet_service/static/description/assets/icons/training.png
  35. BIN
      website_fleet_service/static/description/assets/icons/update.png
  36. BIN
      website_fleet_service/static/description/assets/icons/user.png
  37. BIN
      website_fleet_service/static/description/assets/icons/wrench.png
  38. BIN
      website_fleet_service/static/description/assets/misc/categories.png
  39. BIN
      website_fleet_service/static/description/assets/misc/check-box.png
  40. BIN
      website_fleet_service/static/description/assets/misc/compass.png
  41. BIN
      website_fleet_service/static/description/assets/misc/corporate.png
  42. BIN
      website_fleet_service/static/description/assets/misc/customer-support.png
  43. BIN
      website_fleet_service/static/description/assets/misc/cybrosys-logo.png
  44. BIN
      website_fleet_service/static/description/assets/misc/features.png
  45. BIN
      website_fleet_service/static/description/assets/misc/logo.png
  46. BIN
      website_fleet_service/static/description/assets/misc/pictures.png
  47. BIN
      website_fleet_service/static/description/assets/misc/pie-chart.png
  48. BIN
      website_fleet_service/static/description/assets/misc/right-arrow.png
  49. BIN
      website_fleet_service/static/description/assets/misc/star.png
  50. BIN
      website_fleet_service/static/description/assets/misc/support.png
  51. BIN
      website_fleet_service/static/description/assets/misc/whatsapp.png
  52. BIN
      website_fleet_service/static/description/assets/modules/1.png
  53. BIN
      website_fleet_service/static/description/assets/modules/2.png
  54. BIN
      website_fleet_service/static/description/assets/modules/3.png
  55. BIN
      website_fleet_service/static/description/assets/modules/4.png
  56. BIN
      website_fleet_service/static/description/assets/modules/5.png
  57. BIN
      website_fleet_service/static/description/assets/modules/6.png
  58. BIN
      website_fleet_service/static/description/assets/screenshots/1.png
  59. BIN
      website_fleet_service/static/description/assets/screenshots/10.png
  60. BIN
      website_fleet_service/static/description/assets/screenshots/11.png
  61. BIN
      website_fleet_service/static/description/assets/screenshots/12.png
  62. BIN
      website_fleet_service/static/description/assets/screenshots/13.png
  63. BIN
      website_fleet_service/static/description/assets/screenshots/2.png
  64. BIN
      website_fleet_service/static/description/assets/screenshots/3.png
  65. BIN
      website_fleet_service/static/description/assets/screenshots/4.png
  66. BIN
      website_fleet_service/static/description/assets/screenshots/5.png
  67. BIN
      website_fleet_service/static/description/assets/screenshots/7.png
  68. BIN
      website_fleet_service/static/description/assets/screenshots/8.png
  69. BIN
      website_fleet_service/static/description/assets/screenshots/9.png
  70. BIN
      website_fleet_service/static/description/assets/screenshots/hero.gif
  71. BIN
      website_fleet_service/static/description/banner.png
  72. BIN
      website_fleet_service/static/description/icon.png
  73. 595
      website_fleet_service/static/description/index.html
  74. 90
      website_fleet_service/static/src/css/website_service.css
  75. BIN
      website_fleet_service/static/src/img/car_service.jpg
  76. 14
      website_fleet_service/static/src/js/website_service.js
  77. 128
      website_fleet_service/views/service_booking_views.xml
  78. 57
      website_fleet_service/views/service_package_views.xml
  79. 43
      website_fleet_service/views/service_type_views.xml
  80. 65
      website_fleet_service/views/service_worksheet_views.xml
  81. 180
      website_fleet_service/views/website_service_booking_portal_templates.xml
  82. 114
      website_fleet_service/views/website_service_booking_templates.xml
  83. 58
      website_fleet_service/views/website_service_package_templates.xml

44
website_fleet_service/README.rst

@ -0,0 +1,44 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Website Fleet Service
==================
* Website Fleet Service module for Odoo 16.
Configuration
============
No additional Configuration.
License
-------
General Public License, Version 3 (AGPL v3).
https://www.gnu.org/licenses/agpl-3.0-standalone.html
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: (V16) Afra MP, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@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>`__

22
website_fleet_service/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import controllers
from . import models

58
website_fleet_service/__manifest__.py

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
{
"name": "Website Fleet Service",
"version": "16.0.1.0.0",
"category": "Industries, Website",
"summary": """Car service through Website""",
"description": """This module helps Users to book the Car services through
online.""",
"author": "Cybrosys Techno Solutions",
"company": "Cybrosys Techno Solutions",
"maintainer": "Cybrosys Techno Solutions",
"website": "https://www.cybrosys.com",
"depends": ["website", "fleet_car_workshop", "account"],
"data": [
"security/website_fleet_service_security.xml",
"security/ir.model.access.csv",
"data/ir_sequence_data.xml",
"data/service_type_data.xml",
"data/website_fleet_service_menu_data.xml",
"views/service_booking_views.xml",
"views/service_package_views.xml",
"views/service_type_views.xml",
"views/service_worksheet_views.xml",
"views/website_service_booking_templates.xml",
"views/website_service_package_templates.xml",
"views/website_service_booking_portal_templates.xml",
],
"assets": {
"web.assets_frontend": [
"website_fleet_service/static/src/css/website_service.css",
"website_fleet_service/static/src/js/website_service.js",
],
},
"images": ["static/description/banner.png"],
"license": "AGPL-3",
"installable": True,
"auto_install": False,
"application": True,
}

22
website_fleet_service/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import portal
from . import website_fleet_service

76
website_fleet_service/controllers/portal.py

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers import portal
class CustomerPortal(portal.CustomerPortal):
"""Class to count total number of service created"""
def _prepare_home_portal_values(self, counters):
"""Function to add total service created by the current user"""
values = super()._prepare_home_portal_values(counters)
if "contact_count" in counters:
values["contact_count"] = (
request.env["service.booking"]
.sudo()
.search_count(
[("partner_id.id", "=", request.env.user.commercial_partner_id.id)]
)
)
return values
@http.route(["/service_portal"], type="http", auth="public", website=True)
def car_service_portal(self):
"""function to create the tree view car service"""
service_booking = (
request.env["service.booking"]
.sudo()
.search([("partner_id.id", "=", request.env.user.commercial_partner_id.id)])
)
return request.render(
"website_fleet_service.portal_car_service",
{"car_service_portal": service_booking, "page_name": "car_service_booking"},
)
@http.route(
['/service_portal/<model("service.booking"):contract>'],
type="http",
auth="public",
website=True,
)
def service_portal(self, contract):
"""function to add form view of the car service"""
car_service_ids = request.env["service.booking"].sudo().browse(contract.id)
service_worksheet_ids = (
request.env["service.worksheet"]
.sudo()
.search([("service_booking_id", "=", contract.id)])
)
return http.request.render(
"website_fleet_service.portal_car_service_details",
{
"car_service_ids": car_service_ids,
"service_worksheet_ids": service_worksheet_ids,
"page_name": "service_portal",
},
)

77
website_fleet_service/controllers/website_fleet_service.py

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import http
from odoo.http import request
class WebsiteFleetService(http.Controller):
"""class to add car service booking menu in website"""
@http.route("/service_booking", type="http", auth="public", website=True)
def service_booking(self):
"""function to render car service booking values to XML"""
vehicle_ids = (
request.env["fleet.vehicle.model"]
.sudo()
.search([("vehicle_type", "=", "car")])
)
service_type_ids = request.env["service.package"].sudo().search([])
return http.request.render(
"website_fleet_service.car_service_booking_page",
{"vehicle_ids": vehicle_ids, "service_type_ids": service_type_ids},
)
@http.route("/service_booking/submit", type="http", auth="public", website=True)
def success_page(self, **post):
"""function to create booking and return to success page"""
booking_id = (
request.env["service.booking"]
.sudo()
.create(
{
"partner_id": request.env.user.partner_id.id,
"model_id": post.get("vehicle_model"),
"vehicle_no": post.get("vehicle_no"),
"service_package_id": post.get("service_type"),
"date": post.get("date"),
"location": post.get("location"),
"number": post.get("number"),
"special_instruction": post.get("instruction"),
}
)
)
return request.render(
"website_fleet_service.car_service_booking_success_page",
{"booking_id": booking_id},
)
@http.route("/service_package", type="http", auth="public", website=True)
def service_package_details(self):
"""function to render values to XML"""
service_package_ids = request.env["service.package"].sudo().search([])
service_line_ids = request.env["service.line"].sudo().search([])
return http.request.render(
"website_fleet_service.service_package_page",
{
"service_package_ids": service_package_ids,
"service_line_ids": service_line_ids,
},
)

13
website_fleet_service/data/ir_sequence_data.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Truck booking sequence number generation-->
<odoo>
<data noupdate="1">
<record id="service_booking_sequence" model="ir.sequence">
<field name="name">Service Booking Sequence</field>
<field name="code">service.booking</field>
<field name="prefix">CS</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>

90
website_fleet_service/data/service_type_data.xml

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--Data for service type-->
<odoo>
<data noupdate="1">
<record id="service_type_data1" model="service.type">
<field name="name">check the engine oil</field>
<field name="amount">10</field>
</record>
<record id="service_type_data2" model="service.type">
<field name="name">Oil filter replacement</field>
<field name="amount">20</field>
</record>
<record id="service_type_data3" model="service.type">
<field name="name">Fuel filter replacement</field>
<field name="amount">21</field>
</record>
<record id="service_type_data4" model="service.type">
<field name="name">Replace the spark plugs</field>
<field name="amount">25</field>
</record>
<record id="service_type_data5" model="service.type">
<field name="name">Refill Brake fluid</field>
<field name="amount">30</field>
</record>
<record id="service_type_data6" model="service.type">
<field name="name">Refill Clutch fluid</field>
<field name="amount">28</field>
</record>
<record id="service_type_data8" model="service.type">
<field name="name">check brake discs / Drums</field>
<field name="amount">30</field>
</record>
<record id="service_type_data9" model="service.type">
<field name="name">Verify the Charging systems</field>
<field name="amount">35</field>
</record>
<record id="service_type_data10" model="service.type">
<field name="name">Check power steering fluid</field>
<field name="amount">31</field>
</record>
<record id="service_type_data11" model="service.type">
<field name="name">Inspect timing belt or timing chain</field>
<field name="amount">45</field>
</record>
<record id="service_type_data12" model="service.type">
<field name="name">Check tire Conditions</field>
<field name="amount">47</field>
</record>
<record id="service_type_data13" model="service.type">
<field name="name">Change the engine oil</field>
<field name="amount">43</field>
</record>
<record id="service_type_data14" model="service.type">
<field name="name">Air filter replacement</field>
<field name="amount">30</field>
</record>
<record id="service_type_data15" model="service.type">
<field name="name">Replace the airconfilter</field>
<field name="amount">18</field>
</record>
<record id="service_type_data16" model="service.type">
<field name="name">Check brake pades / liners</field>
<field name="amount">20</field>
</record>
<record id="service_type_data17" model="service.type">
<field name="name">verify coolant hoses</field>
<field name="amount">26</field>
</record>
<record id="service_type_data18" model="service.type">
<field name="name">check the battery</field>
<field name="amount">20</field>
</record>
<record id="service_type_data19" model="service.type">
<field name="name">Verify A/M transmission fluid</field>
<field name="amount">39</field>
</record>
<record id="service_type_data20" model="service.type">
<field name="name">Grease and lubricate components</field>
<field name="amount">54</field>
</record>
<record id="service_type_data21" model="service.type">
<field name="name">Replace timing belt or timing chain</field>
<field name="amount">90</field>
</record>
<record id="service_type_data22" model="service.type">
<field name="name">Check lights, Wipers and others</field>
<field name="amount">50</field>
</record>
</data>
</odoo>

18
website_fleet_service/data/website_fleet_service_menu_data.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Website fleet service website menu -->
<odoo>
<data noupdate="1">
<record id="menu_car_service" model="website.menu">
<field name="name">Car Service Booking</field>
<field name="url">/service_booking</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">50</field>
</record>
<record id="menu_service_package" model="website.menu">
<field name="name">Service Package</field>
<field name="url">/service_package</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">51</field>
</record>
</data>
</odoo>

6
website_fleet_service/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <website_fleet_service>
#### 27.11.2023
#### Version 16.0.1.0.0
#### ADD
- Initial commit for Website Fleet Service

25
website_fleet_service/models/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import account_move
from . import service_booking
from . import service_type
from . import service_package
from . import service_worksheet

81
website_fleet_service/models/account_move.py

@ -0,0 +1,81 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import models
class AccountMove(models.Model):
"""inherit the class account_move"""
_inherit = "account.move"
def action_post(self):
"""super the action_post() to change service_booking state into
invoice"""
res = super(AccountMove, self).action_post()
if self:
if self.invoice_origin in self.env["service.booking"].search([]).mapped(
"reference_no"
):
booking_id = self.env["service.booking"].search(
[("reference_no", "=", self.invoice_origin)]
)
amount = sum(
self.search(
[
("invoice_origin", "=", booking_id.reference_no),
("state", "!=", "cancel"),
]
).mapped("amount_untaxed_signed")
)
if booking_id.service_package_price == amount:
booking_id.write({"state": "invoice"})
return res
def button_cancel(self):
"""Inherit the 'button_cancel' method to update related service
bookings' states when an invoice is canceled."""
result = super(AccountMove, self).button_cancel()
if self.invoice_origin in self.env["service.booking"].search([]).mapped(
"reference_no"
):
booking_id = self.env["service.booking"].search(
[("reference_no", "=", self.invoice_origin)]
)
booking_id.write({"state": "confirm"})
return result
def button_draft(self):
"""Inherit the 'button_draft' method to set related 'service.booking'
records to 'to_invoice' state.This method first calls the super method
to revert the invoice to 'draft' state.It then checks if the invoice is
linked to any 'service.booking' records.
If so, it sets the 'state' of those records to 'to_invoice' to indicate
that they need to be invoiced.
:return: Result of the 'button_draft' method"""
result = super(AccountMove, self).button_draft()
if self.invoice_origin in self.env["service.booking"].search([]).mapped(
"reference_no"
):
booking_id = self.env["service.booking"].search(
[("reference_no", "=", self.invoice_origin)]
)
booking_id.write({"state": "to_invoice"})
return result

234
website_fleet_service/models/service_booking.py

@ -0,0 +1,234 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ServiceBooking(models.Model):
"""Class to add car service booking"""
_name = "service.booking"
_inherit = "mail.thread", "mail.activity.mixin"
_description = "Service Booking"
_rec_name = "reference_no"
reference_no = fields.Char(
string="Order Reference",
readonly=True,
copy=False,
default=lambda self: _("New"),
help="This field represents the reference number of the order.",
)
vehicle_no = fields.Char(string="Vehicle Number", help="Enter vehicle number")
partner_id = fields.Many2one(
"res.partner", string="Customer", required=True, help="Select Customer name"
)
number = fields.Char(string="Mobile No", help="Enter your Mobile Number")
model_id = fields.Many2one(
comodel_name="fleet.vehicle.model",
string="Vehicle Model",
domain=[("vehicle_type", "=", "car")],
required=True,
help="Select your Car Model",
)
date = fields.Date(string="Date", required=True, help="Service Date")
service_package_id = fields.Many2one(
"service.package",
string="Service Package",
required=True,
help="Select service Package",
)
service_package_price = fields.Monetary(
string="Amount",
related="service_package_id.total",
help="Service type total amount",
)
location = fields.Char(string="Location", help="Enter your Current location")
special_instruction = fields.Text(
string="Any Special Instructions",
help="If you have any special " "instruction add",
)
task_count = fields.Integer(
string="Task",
compute="compute_task_count",
help="This field represents the number of tasks associated with this "
"record.",
)
service_worksheet_ids = fields.One2many(
"service.worksheet",
"service_booking_id",
string="Worksheet",
help="Service worksheets related to this service booking.",
)
invoice_count = fields.Integer(
string="Invoice Count",
compute="compute_invoice_count",
help="Number of invoices associated with " "this record.",
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.user.company_id.id,
help="Select the company to which this record " "belongs.",
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
related="company_id.currency_id",
help="The currency used by the company.",
)
state = fields.Selection(
selection=[
("draft", "Draft"),
("confirm", "Confirm"),
("to_invoice", "To Invoice"),
("invoice", "Invoice"),
],
string="State",
default="draft",
help="State of the record: Draft, Confirm, or " "Invoice.",
)
def compute_task_count(self):
"""Function to calculate task count"""
for vehicle in self:
vehicle.task_count = vehicle.env["service.worksheet"].search_count(
[("service_booking_id", "=", self.id)]
)
def action_view_worksheet(self):
"""smart button to view the corresponding worksheet of service
booking"""
return {
"type": "ir.actions.act_window",
"name": "Worksheet",
"view_mode": "tree,form",
"res_model": "service.worksheet",
"target": "current",
"domain": [("service_booking_id", "=", self.id)],
"context": {"create": False},
}
@api.model
def create(self, vals):
"""function to create sequence"""
if vals.get("reference_no", _("New")) == _("New"):
vals["reference_no"] = self.env["ir.sequence"].next_by_code(
"service.booking"
) or _("New")
return super(ServiceBooking, self).create(vals)
def action_confirm(self):
"""function to create worksheet for the service"""
self.write({"state": "confirm"})
for service_type_id in self.service_package_id.service_ids.service_type_id:
self.env["service.worksheet"].create(
{
"model_id": self.model_id.id,
"service_type_id": service_type_id.id,
"service_booking_id": self.id,
"user_id": self.env.user.id,
}
)
def action_create_invoice(self):
"""Function to create invoice"""
self.write({"state": "to_invoice"})
invoiced_amount = sum(
self.env["account.move"]
.search(
[("invoice_origin", "=", self.reference_no), ("state", "!=", "cancel")]
)
.mapped("amount_untaxed_signed")
)
invoice = self.env["account.move"].create(
[
{
"move_type": "out_invoice",
"partner_id": self.partner_id.id,
"invoice_origin": self.reference_no,
"invoice_line_ids": [
(
0,
0,
{
"name": "{} / {} / Service Package: {}".format(
self.model_id.name,
self.vehicle_no,
self.service_package_id.name,
),
"quantity": 1,
"price_unit": self.service_package_price
- invoiced_amount,
"price_subtotal": self.service_package_price
- invoiced_amount,
},
)
],
}
]
)
return {
"name": "invoice",
"view_mode": "form",
"res_id": invoice.id,
"res_model": "account.move",
"type": "ir.actions.act_window",
"target": "current",
}
def compute_invoice_count(self):
"""function to count invoice"""
for record in self:
record.invoice_count = self.env["account.move"].search_count(
[("invoice_origin", "=", self.reference_no)]
)
def action_view_invoice(self):
"""Action method to view invoices related to the current record.
:return: Action dictionary"""
return {
"type": "ir.actions.act_window",
"name": "Invoice",
"view_mode": "tree,form",
"res_model": "account.move",
"target": "current",
"domain": [("invoice_origin", "=", self.reference_no)],
"context": {"create": False},
}
def unlink(self):
"""Inherit the 'unlink' method to prevent the deletion of confirmed or
invoiced records.
This method ensures that records in the 'confirmed' or 'invoiced' state
cannot be deleted.
If any of the selected records are in these states, it raises a user
error to prevent deletion.
:raises UserError: If any record is in the 'confirmed' or 'invoiced'
state, preventing deletion.
:return: Result of the 'unlink' method"""
for rec in self:
if rec.state != "draft":
raise UserError(
_("You can not delete a confirmed or a Invoiced service booking.")
)
return super().unlink()

96
website_fleet_service/models/service_package.py

@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import api, fields, models
class ServicePackage(models.Model):
"""Class to add car service package"""
_name = "service.package"
_description = "Service Package"
name = fields.Char(
string="Service Name", required=True, help="Enter service package name"
)
service_ids = fields.One2many(
"service.line",
"service_package_id",
string="Service Line",
help="Select the services associated with " "this record.",
)
total = fields.Monetary(
string="Total",
compute="compute_total",
store=True,
help="Service package total amount",
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.user.company_id.id,
help="Select the company to which this record " "belongs.",
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
related="company_id.currency_id",
help="The currency used by the company.",
)
@api.depends("service_ids.price")
def compute_total(self):
"""Function to calculate total of service line"""
for record in self:
record.total = sum(self.service_ids.mapped("price"))
class ServiceLine(models.Model):
"""Class to add related field"""
_name = "service.line"
_description = "Service Line"
service_package_id = fields.Many2one(
"service.package", string="service Package", help="Select service package"
)
service_type_id = fields.Many2one(
"service.type",
string="Service Type",
help="Add service type include " "in this package",
required=True,
)
price = fields.Monetary(
string="Price", related="service_type_id.amount", help="Service type price"
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.user.company_id.id,
help="Select the company to which this record belongs.",
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
related="company_id.currency_id",
help="The currency used by the company.",
)

46
website_fleet_service/models/service_type.py

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import fields, models
class ServiceType(models.Model):
"""Class to add service types"""
_name = "service.type"
_description = "Service Type"
name = fields.Char(
string="Service Type", help="Enter name of the service", required=True
)
amount = fields.Monetary(string="Amount", required=True, help="Service amount")
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.user.company_id.id,
help="Select the company to which this record " "belongs.",
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
related="company_id.currency_id",
help="The currency used by the company.",
)

73
website_fleet_service/models/service_worksheet.py

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Afra MP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import fields, models
class ServiceWorksheet(models.Model):
"""Class to add car service worksheet"""
_name = "service.worksheet"
_description = "Service Worksheet"
_rec_name = "model_id"
service_type_id = fields.Many2one(
"service.type",
string="Service Type",
required=True,
help="select the service package",
)
model_id = fields.Many2one(
"fleet.vehicle.model",
string="Vehicle Model",
domain=[("vehicle_type", "=", "car")],
help="Select the Car model",
)
user_id = fields.Many2one(
"res.users", string="Assigned to", help="Work assigned person"
)
tag_ids = fields.Many2many(
"worksheet.tags", string="Tags", ondelete="cascade", help="Select tags"
)
description = fields.Html(
string="Description", help="Add any description of the service"
)
service_booking_id = fields.Many2one(
"service.booking",
string="Service Booking",
help="Select the service booking " "associated with this record.",
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.user.company_id.id,
help="Select the company to which this record " "belongs.",
)
state = fields.Selection(
selection=[("draft", "Draft"), ("done", "Done")],
default="draft",
string="State",
help="The current state of the record.",
)
def action_done(self):
"""Function to change state to done"""
self.write({"state": "done"})

11
website_fleet_service/security/ir.model.access.csv

@ -0,0 +1,11 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_service_booking,access.service.booking,model_service_booking,fleet.fleet_group_user,1,0,0,0
access_service_package,access.service.package,model_service_package,fleet.fleet_group_user,1,0,0,0
access_service_type,access.service.type,model_service_type,fleet.fleet_group_user,1,0,0,0
access_service_line,access.service.line,model_service_line,fleet.fleet_group_user,1,0,0,0
access_service_worksheet,access.service.worksheet,model_service_worksheet,fleet.fleet_group_user,1,0,0,0
access_service_booking,access.service.booking,model_service_booking,fleet.fleet_group_manager,1,1,1,1
access_service_package,access.service.package,model_service_package,fleet.fleet_group_manager,1,1,1,1
access_service_type,access.service.type,model_service_type,fleet.fleet_group_manager,1,1,1,1
access_service_line,access.service.line,model_service_line,fleet.fleet_group_manager,1,1,1,1
access_service_worksheet,access.service.worksheet,model_service_worksheet,fleet.fleet_group_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_service_booking access.service.booking model_service_booking fleet.fleet_group_user 1 0 0 0
3 access_service_package access.service.package model_service_package fleet.fleet_group_user 1 0 0 0
4 access_service_type access.service.type model_service_type fleet.fleet_group_user 1 0 0 0
5 access_service_line access.service.line model_service_line fleet.fleet_group_user 1 0 0 0
6 access_service_worksheet access.service.worksheet model_service_worksheet fleet.fleet_group_user 1 0 0 0
7 access_service_booking access.service.booking model_service_booking fleet.fleet_group_manager 1 1 1 1
8 access_service_package access.service.package model_service_package fleet.fleet_group_manager 1 1 1 1
9 access_service_type access.service.type model_service_type fleet.fleet_group_manager 1 1 1 1
10 access_service_line access.service.line model_service_line fleet.fleet_group_manager 1 1 1 1
11 access_service_worksheet access.service.worksheet model_service_worksheet fleet.fleet_group_manager 1 1 1 1

22
website_fleet_service/security/website_fleet_service_security.xml

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--This XML file contains the configuration for multi-company rules in Odoo.
It defines ir.rule records for the Service Booking and Service Worksheet
models,enforcing the domain based on company_id. -->
<odoo>
<data noupdate="1">
<record id="service_booking_comp_rule" model="ir.rule">
<field name="name">Service Booking multi company rule</field>
<field name="model_id" ref="model_service_booking"/>
<field name="domain_force">
['|',('company_id','=',False),('company_id', 'in', company_ids)]
</field>
</record>
<record id="service_worksheet_comp_rule" model="ir.rule">
<field name="name">Service Worksheet multi company rule</field>
<field name="model_id" ref="model_service_worksheet"/>
<field name="domain_force">
['|',('company_id','=',False),('company_id', 'in', company_ids)]
</field>
</record>
</data>
</odoo>

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_fleet_service/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
website_fleet_service/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_fleet_service/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website_fleet_service/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_fleet_service/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website_fleet_service/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
website_fleet_service/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
website_fleet_service/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
website_fleet_service/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
website_fleet_service/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
website_fleet_service/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
website_fleet_service/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
website_fleet_service/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
website_fleet_service/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
website_fleet_service/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
website_fleet_service/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
website_fleet_service/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
website_fleet_service/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

BIN
website_fleet_service/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
website_fleet_service/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

595
website_fleet_service/static/description/index.html

@ -0,0 +1,595 @@
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;"/>
<div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Website Fleet Service</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Detailed Website Fleet Service View.</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;"/>
</div>
</div>
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View features of this module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
The Website Fleet Service module helps Users to book Car services online.
The users have a portal view of the booking. chatterbox is added in the
portal view so that users can easily communicate. This module is available
in desktop and mobile view and also supports odoo 16 community and enterprise.
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Dedicated Website Views for Users.</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Users can Easily Book Car Services.</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Available in Odoo 16.0 Community and Enterprise.</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Service Package Menu in Website.</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Portal view for the user.</span>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Desktop and Mobile view.</span>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Created Menu and Submenus.
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Created new service menu and added two submenus service booking and service worksheet.And also
create 2 submenu under configuration.</p>
<img src="assets/screenshots/1.png" class="img-thumbnail">
<img src="assets/screenshots/2.png" class="img-thumbnail">
</div>
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Add Services Provide and it's Price.
</h3>
<div style="display: block; margin: 30px auto;">
<img src="assets/screenshots/3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Service Package Menu.
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In service package menu add the package name and add service type provide in that package.
then it will automatically calculate the service package total amount.
</p>
<img src="assets/screenshots/4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Service Booking Form View.
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Add the Customer name, the Vehicle model and service package, then automatically calculate the
amount. set the date, car number, current location and mobile number.Then click Confirm button.</p>
<img src="assets/screenshots/5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Task Smart Button.
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
The service worksheet will automatically create.
</p>
<img src="assets/screenshots/7.png" class="img-thumbnail">
<img src="assets/screenshots/8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Created Two Menu in Website.
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">In Car Service Booking menu, Users can book the service.</p>
<img src="assets/screenshots/9.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Service Package Menu.
</h3>
<img src="assets/screenshots/10.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Customer Portal.
</h3>
<img src="assets/screenshots/11.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Customer Can View All The Bookings. Also, Customer Can Chat Through Portal.
</h3>
<img src="assets/screenshots/12.png" class="img-thumbnail">
<img src="assets/screenshots/13.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="row">
<div class="col-sm-12 col-md-12-col-lg-2">
<h2 style="font-weight: bold; color: #3D3D4E;">Related Modules</h2>
<p style="color: #777783;">Explore our related modules</p>
<hr />
</div>
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/fleet_car_workshop/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/packers_and_movers_management/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/website_product_attachments/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/employee_vehicle_request/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/sale_discount_total/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/fleet_rental/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

90
website_fleet_service/static/src/css/website_service.css

@ -0,0 +1,90 @@
.image{
background-image:url("/website_fleet_service/static/src/img/car_service.jpg");
background-size:cover;
height:415px;
width:600px;
margin-left:-20px;
}
h1{
color:gray;
font-family:"Lucida consol","Courier Nem",monospace;
}
.head{
margin-top:25px;
margin-left:60px;
}
.body{
margin-top:-475px;
margin-left:875px;
margin-bottom:10px;
}
.link-style{
width:500px;
height:50px;
border-color:#407ccc;
}
.button{
width:500px;
height:50px;
background-color:#407ccc;
color:white;
border-color:#407ccc;
}
.form-group{
padding-bottom:10px;
padding-top:10px;
}
.success{
font-size:20px;
color:white;
text-align:center;
background-color:#407ccc;
height:75px;
padding:15px;
margin-bottom:10px;
}
.link{
color:#407ccc;
}
table{
border-collapse:collapse;
width:100%;
}
th,td{
text_align:left;
padding:8px;
border: 1px solid white;
}
thead{
background-color:#407ccc;
color:white;
}
tr:nth-child(even){
background-color:#dcdcdc;
}
.wrap{
overflow-y: auto;
}
@media(max-width:790px){
.head{
margin-top:15px;
margin-left:11px;
}
.image{
height:242px;
width:337px;
margin-left:-21px;
margin-top: -45px;
}
.body{
margin-top:25px;
margin-left:2px;
}
.button{
width:332px;
}
.link-style{
width:332px;
}
}

BIN
website_fleet_service/static/src/img/car_service.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

14
website_fleet_service/static/src/js/website_service.js

@ -0,0 +1,14 @@
odoo.define('website_fleet_service.website_service', function(require) {
"use strict";
var publicWidget = require('web.public.widget');
var rpc = require('web.rpc');
publicWidget.registry.WebsiteFleetServiceWidget = publicWidget.Widget.extend({//Extend public widget to add the total amount for te service
selector: '.website_fleet_service_widget',
events: {
'change #service_type': function(ev) {
this.$('#amount').val($(ev.target.options[ev.target.selectedIndex]).getAttributes().amount)
},
},
});
return publicWidget.registry.WebsiteFleetServiceWidget;
});

128
website_fleet_service/views/service_booking_views.xml

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Action specified for the Service Booking-->
<record id="service_booking_action" model="ir.actions.act_window">
<field name="name">Service Booking</field>
<field name="res_model">service.booking</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Search view records used in the Service Booking -->
<record id='service_booking_view_search' model='ir.ui.view'>
<field name="name">service.booking.view.search</field>
<field name="model">service.booking</field>
<field name="arch" type="xml">
<search string="Service Booking">
<field name="reference_no"/>
<field name="partner_id"/>
<field name="service_package_id"/>
<field name="state"/>
<separator/>
<filter string="Confirm" name="confirm"
domain="[('state', '=', 'confirm')]"/>
<filter string="Invoiced" name="invoiced"
domain="[('state', '=', 'invoice')]"/>
<filter string="Draft" name="draft"
domain="[('state', '=', 'draft')]"/>
<group expand="1" string="Group By">
<filter string="Customer" name="groupby_partner_id"
context="{'group_by': 'partner_id'}"/>
<filter string="Car Model" name="groupby_model_id"
context="{'group_by': 'model_id'}"/>
<filter string="Service Type"
name="groupby_service_package_id"
context="{'group_by': 'service_package_id'}"/>
<filter string="State" name="groupby_state"
context="{'group_by': 'state'}"/>
</group>
</search>
</field>
</record>
<!-- Tree view of the Service Booking -->
<record id="service_booking_view_tree" model="ir.ui.view">
<field name="name">service.booking.view.tree</field>
<field name="model">service.booking</field>
<field name="arch" type="xml">
<tree string="service.booking">
<field name="reference_no"/>
<field name="partner_id"/>
<field name="location"/>
<field name="service_package_id"/>
<field name="state"/>
</tree>
</field>
</record>
<!-- form view of the Service booking -->
<record id="service_booking_view_form" model="ir.ui.view">
<field name="name">service.booking.view.form</field>
<field name="model">service.booking</field>
<field name="arch" type="xml">
<form string="service_booking">
<header>
<button name="action_confirm" string='Confirm'
class="btn-primary" states="draft"
type="object"/>
<button name="action_create_invoice" string='Create Invoice'
class="btn-primary" states="confirm"
type="object"/>
<field name="state" widget="statusbar" string="Status"
statusbar_visible="draft,confirm,invoice"/>
</header>
<sheet>
<div name="button_box" position="inside">
<button class="oe_stat_button" type="object"
name="action_view_invoice"
icon="fa-pencil-square-o"
attrs="{'invisible': [('state', '=', 'draft')]}">
<field string="Invoice" name="invoice_count"
widget="statinfo"/>
</button>
<button class="oe_stat_button" type="object"
name="action_view_worksheet"
icon="fa-tasks"
attrs="{'invisible': [('state', '=', 'draft')]}">
<field string="Tasks" name="task_count"
widget="statinfo"/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="reference_no"/>
</h1>
</div>
<group>
<group>
<field name="partner_id"/>
<field name="number"/>
<field name="model_id"/>
<field name="vehicle_no"/>
<field name="location"/>
</group>
<group>
<field name="service_package_id"/>
<field name="company_id" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="service_package_price"/>
<field name="date"/>
</group>
</group>
<notebook>
<page name="description_page"
string="Any Special Instructions">
<field name="special_instruction" type="text"/>
<div class="oe_clear"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
<field name="activity_ids"/>
</div>
</form>
</field>
</record>
<menuitem id="service_menu" name="Service"
parent="fleet_car_workshop.main_workshop_menu" sequence='2'/>
<menuitem id="service_booking_menu" action="service_booking_action"
parent="service_menu" sequence='1'/>
</odoo>

57
website_fleet_service/views/service_package_views.xml

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Action specified for the Service Package-->
<record id="service_package_action" model="ir.actions.act_window">
<field name="name">Service Package</field>
<field name="res_model">service.package</field>
<field name="view_mode">tree,form</field>
</record>
<!--Tree view of the Service Package-->
<record id="service_package_view_tree" model="ir.ui.view">
<field name="name">service.package.view.tree</field>
<field name="model">service.package</field>
<field name="arch" type="xml">
<tree string="service.package">
<field name="name"/>
</tree>
</field>
</record>
<!--Form view of the Service Package-->
<record id="service_package_view_form" model="ir.ui.view">
<field name="name">service.package.view.form</field>
<field name="model">service.package</field>
<field name="arch" type="xml">
<form string="service_package">
<sheet>
<group>
<group>
<field name="name"/>
</group>
</group>
<notebook>
<page string="Service Line">
<field name="service_ids">
<tree editable="bottom">
<field name="service_type_id"/>
<field name="company_id" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="price"/>
</tree>
</field>
</page>
</notebook>
<div>
<group>
<group class="oe_subtotal_footer oe_right">
<field name="currency_id" invisible="1"/>
<field name="total"/>
</group>
</group>
</div>
</sheet>
</form>
</field>
</record>
<menuitem id="service_package_menu" action="service_package_action"
parent="fleet_car_workshop.menu_worksheet_config"/>
</odoo>

43
website_fleet_service/views/service_type_views.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Action specified for the Service Type-->
<record id="service_type_action" model="ir.actions.act_window">
<field name="name">Service Type</field>
<field name="res_model">service.type</field>
<field name="view_mode">tree</field>
</record>
<!--Tree view of the Service type-->
<record id="service_type_view_tree" model="ir.ui.view">
<field name="name">service.type.view.tree</field>
<field name="model">service.type</field>
<field name="arch" type="xml">
<tree string="service.type" editable="bottom">
<field name="name"/>
<field name="amount"/>
<field name="company_id" invisible="1"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
</record>
<!--Form view of the Service type-->
<record id="service_type_view_form" model="ir.ui.view">
<field name="name">service.type.view.form</field>
<field name="model">service.type</field>
<field name="arch" type="xml">
<form string="service_type">
<sheet>
<group>
<group>
<field name="name"/>
<field name="company_id" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="amount"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<menuitem id="service_type_menu" action="service_type_action"
parent="fleet_car_workshop.menu_worksheet_config"/>
</odoo>

65
website_fleet_service/views/service_worksheet_views.xml

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Action specified for the Service Worksheet-->
<record id="service_worksheet_action" model="ir.actions.act_window">
<field name="name">Service Worksheet</field>
<field name="res_model">service.worksheet</field>
<field name="view_mode">tree,form</field>
</record>
<!--Tree view of the Service Worksheet-->
<record id="service_worksheet_view_tree" model="ir.ui.view">
<field name="name">service.worksheet.view.tree</field>
<field name="model">service.worksheet</field>
<field name="arch" type="xml">
<tree string="service.worksheet">
<field name="model_id"/>
<field name="service_type_id"/>
<field name="user_id"/>
<field name="state"/>
</tree>
</field>
</record>
<!--Form view of the Service Worksheet-->
<record id="service_worksheet_view_form" model="ir.ui.view">
<field name="name">service.worksheet.view.form</field>
<field name="model">service.worksheet</field>
<field name="arch" type="xml">
<form string="service_worksheet">
<header>
<button name="action_done" string='Done' class="btn-primary"
states="draft"
type="object"/>
<field name="state" widget="statusbar" string="Status"
options="{'clickable': '1'}"/>
</header>
<sheet>
<div class="oe_title">
<h1>
<field name="model_id"/>
</h1>
</div>
<group>
<group>
<field name="service_type_id"/>
<field name="user_id"/>
<field name="company_id" invisible="1"/>
<field name="service_booking_id" invisible="1"/>
</group>
<group>
<field name="tag_ids" widget="many2many_tags"
options="{'color_field': 'color'}"/>
</group>
</group>
<notebook>
<page name="description_page" string="Description">
<field name="description" type="html"/>
<div class="oe_clear"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<menuitem id="service_worksheet_menu" action="service_worksheet_action"
parent="service_menu" sequence='2'/>
</odoo>

180
website_fleet_service/views/website_service_booking_portal_templates.xml

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Template to give breadcrumb on the bases of page name-->
<template id="portal_my_home_menu_service"
name="Portal layout : car service menu entries"
inherit_id="portal.portal_breadcrumbs" priority="60">
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li t-if="page_name == 'service_portal'"
class="breadcrumb-item active">
<a t-attf-href="/service_portal" aria-label="Home"
title="CarService">
<span>Car Service</span>
</a>
<span>/
<em t-out="car_service_id.reference_no"/>
</span>
</li>
<li t-if="page_name == 'car_service_booking'"
class="breadcrumb-item active">
<span>Car Service</span>
</li>
</xpath>
</template>
<!-- Template to view count of service bookings-->
<template id="portal_my_home_car_service" name="Show Car Service"
customize_show="True"
inherit_id="portal.portal_my_home"
priority="100">
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">Car Service</t>
<t t-set="url" t-value="'/service_portal'"/>
<t t-set="placeholder_count" t-value="'contact_count'"/>
</t>
</xpath>
</template>
<!-- Template to view list of services-->
<template id="portal_car_service" name="My Car Service">
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
<t t-call="portal.portal_searchbar">
<t t-set="title">Car Service</t>
</t>
<t t-if="car_service_portal" t-call="portal.portal_table">
<thead>
<tr class="active">
<th>Order Reference</th>
<th class="text-end">Service Type</th>
<th class="text-end">Date</th>
<input type="hidden" name="csrf_token"
t-att-value="request.csrf_token()"/>
<th class="text-end">State</th>
</tr>
</thead>
<t t-foreach="car_service_portal" t-as="contract">
<tr>
<td>
<a t-attf-href="/service_portal/#{contract.id}">
<t t-out="contract.reference_no"/>
</a>
</td>
<td class="text-end">
<span t-field="contract.service_package_id"/>
</td>
<td class="text-end">
<span t-field="contract.date"/>
</td>
<td class="text-end">
<span t-field="contract.state"/>
</td>
</tr>
</t>
</t>
</t>
</template>
<!-- Template for portal form view of the car service-->
<template id="portal_car_service_details"
name="Car Service Portal Template">
<t t-call="portal.portal_layout">
<div class="card pb-5">
<div>
<t t-foreach="car_service_ids" t-as="car_service_id">
<!-- Intro -->
<div class="pb-2 pt-3 card-header bg-white">
<h2 class="my-0">
<em t-out="car_service_id.reference_no"/>
</h2>
</div>
<!-- Informations -->
<div id="informations">
<div class="pb-2 pt-3 card-header bg-white">
<div class="row" id="ls_date">
<div class="mb-3 col-4"
style="margin-left: 125px;">
<span>
<b>Name:</b>
</span>
<span t-field="car_service_id.partner_id.name"/>
<br/>
<span>
<b>Location:</b>
</span>
<span t-field="car_service_id.location"/>
<br/>
<span>
<b>Number:</b>
</span>
<span t-field="car_service_id.number"/>
<br/>
</div>
<div class="mb-3 col-4">
<strong>Date:</strong>
<span t-field="car_service_id.date"
t-options='{"widget": "date"}'/>
</div>
<div class="mb-3 col-4"
style="margin-left: 125px;">
<strong>Service Package:</strong>
<span t-field="car_service_id.service_package_id.name"/>
<br/>
<strong>Service Amount:</strong>
<span t-field="car_service_id.service_package_id.total"/>
</div>
<div class="mb-3 col-4">
<strong>State:</strong>
<span t-field="car_service_id.state"/>
</div>
</div>
<section id="car_service_section">
<t t-if="car_service_id.state != 'draft'">
<h5 id="details">
<b>Services</b>
</h5>
<table t-att-data-order-id="car_service_id.id"
class="table table-sm"
id="service_table">
<thead class="bg-100">
<th class="text-center"
id="product_name_header">
S.NO
</th>
<th>Service Types</th>
<th>Assigned Person</th>
<th>Amount</th>
</thead>
<t t-foreach="service_worksheet_ids"
t-as="line">
<tr>
<td class="text-center">
<span t-esc="line_index + 1"/>
</td>
<td>
<span t-field="line.service_type_id.name"/>
</td>
<td>
<span t-field="line.user_id.name"/>
</td>
<td>
<span t-field="line.service_type_id.amount"/>
</td>
</tr>
</t>
</table>
</t>
</section>
</div>
</div>
</t>
</div>
</div>
<div id="service_order_communication" class="mt-4">
<h2>History</h2>
<t t-call="portal.message_thread">
<t t-set="object" t-value="car_service_ids"/>
</t>
</div>
</t>
</template>
</odoo>

114
website_fleet_service/views/website_service_booking_templates.xml

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Template for the Service booking page -->
<template id="car_service_booking_page" name="Service">
<t t-call="website.layout">
<div id="wrap" class="wrap website_fleet_service_widget">
<div class="container">
<div class="col-md-6">
<h1 class="head">
<b>Car Service Booking</b>
</h1>
<div class="image"/>
</div>
<div class="col-md-6 body">
<form action="/service_booking/submit">
<div id="vehicle">
<div class="form-group">
<label>Vehicle Model</label>
<select name="vehicle_model"
class="form-control link-style"
required="true">
<t t-foreach="vehicle_ids"
t-as="vehicle_id">
<option t-esc="vehicle_id.name"
t-att-value="vehicle_id.id"/>
</t>
</select>
</div>
<div class="form-group">
<label>Vehicle Number</label>
<input type="text"
placeholder='Enter Your Vehicle Number'
name="vehicle_no"
class="form-control link-style"
required="true"/>
</div>
<div class="form-group">
<label>Service Package</label>
<select name="service_type"
id="service_type"
class="form-control link-style"
required="true">
<option value="">Select Service
Package
</option>
<t t-foreach="service_type_ids"
t-as="service_type_id">
<option t-esc="service_type_id.name"
t-att-value="service_type_id.id"
t-att-amount="service_type_id.total"/>
</t>
</select>
<div class="form-group">
<label>Service Amount</label>
<input type="text" name="amount"
id="amount"
class=" form-control link-style"
required="true" readonly="1"/>
</div>
</div>
<div class="form-group">
<label>Any Special Instructions</label>
<input type="textarea"
placeholder='Any Special Instructions'
name="instruction"
class=" form-control link-style"/>
</div>
<div class="form-group">
<label>Location</label>
<input type="text"
placeholder='Enter Your Location'
name="location"
class=" form-control link-style"
required="true"/>
</div>
<div class="form-group">
<label>Mobile No</label>
<input type="text"
placeholder='Enter Your Mobile Number'
name="number"
class=" form-control link-style"
required="true"/>
</div>
<div class="form-group">
<label>Date</label>
<input type="date" name="date"
class="form-control link-style"
required="true"/>
</div>
<button type="submit" class="button">Confirm
</button>
</div>
</form>
</div>
</div>
</div>
</t>
</template>
<!-- Template used to redirect the booking page into success -->
<template id="car_service_booking_success_page" name="ServiceBooking">
<t t-call="website.layout">
<div id="wrap">
<div class="container">
<div class="col-md-12">
<div class="success">
Booking have been Created Successfully.
</div>
</div>
<a href="/service_booking" class="link">Back to Booking</a>
</div>
</div>
</t>
</template>
</odoo>

58
website_fleet_service/views/website_service_package_templates.xml

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Template for showing the Service package details -->
<template id="service_package_page" name="ServicePackage">
<t t-call="website.layout">
<div id="wrap">
<h1 align='center'>Service Packages</h1>
<div class="container">
<div class="col-md-12">
<div class="row">
<t t-foreach='service_package_ids'
t-as="service_package_id">
<strong style="color: gray;"><t
t-esc="service_package_id_index + 1"/>.
<t t-esc="service_package_id.name"/>(
<t t-esc="service_package_id.currency_id.symbol"/>
<t t-esc="service_package_id.total"/>)
</strong>
<table class="table">
<thead>
<tr>
<th>
S.NO
</th>
<th>
Service Type
</th>
<th>
Amount
</th>
</tr>
</thead>
<t t-foreach='service_line_ids'
t-as="service_line_id">
<t t-if="service_package_id.id == service_line_id.service_package_id.id">
<tr>
<td>
<t t-esc="service_line_id_index + 1"/>
</td>
<td>
<t t-esc="service_line_id.service_type_id.name"/>
</td>
<td>
<t t-esc="service_line_id.currency_id.symbol"/>
<t t-esc="service_line_id.service_type_id.amount"/>
</td>
</tr>
</t>
</t>
</table>
</t>
</div>
</div>
</div>
</div>
</t>
</template>
</odoo>
Loading…
Cancel
Save