Browse Source

July 25: [ADD] Initital Commits 'website_fleet_service'

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

46
website_fleet_service/README.rst

@ -0,0 +1,46 @@
.. 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
=====================
* It facilitates online car service booking for users.
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
-------
* Developers: (V17) Raneesha MK,
(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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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": "17.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"],
"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": False,
}

22
website_fleet_service/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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",
},
)

75
website_fleet_service/controllers/website_fleet_service.py

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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>
#### 23.07.2024
#### Version 17.0.1.0.0
#### ADD
- Initial commit for Website Fleet Service

26
website_fleet_service/models/__init__.py

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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_line
from . import service_type
from . import service_package
from . import service_worksheet

70
website_fleet_service/models/account_move.py

@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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

221
website_fleet_service/models/service_booking.py

@ -0,0 +1,221 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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", required=True,
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()

51
website_fleet_service/models/service_line.py

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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 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.")

57
website_fleet_service/models/service_package.py

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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"))

45
website_fleet_service/models/service_type.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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.",
)

72
website_fleet_service/models/service_worksheet.py

@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Raneesha MK (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.tag", 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_user,access.service.booking.user,model_service_booking,fleet.fleet_group_user,1,0,0,0
access_service_package_user,access.service.package.user,model_service_package,fleet.fleet_group_user,1,0,0,0
access_service_type_user,access.service.type.user,model_service_type,fleet.fleet_group_user,1,0,0,0
access_service_line_user,access.service.line.user,model_service_line,fleet.fleet_group_user,1,0,0,0
access_service_worksheet_user,access.service.worksheet.user,model_service_worksheet,fleet.fleet_group_user,1,0,0,0
access_service_booking_manager,access.service.booking.manager,model_service_booking,fleet.fleet_group_manager,1,1,1,1
access_service_package_manager,access.service.package.manager,model_service_package,fleet.fleet_group_manager,1,1,1,1
access_service_type_manager,access.service.type.manager,model_service_type,fleet.fleet_group_manager,1,1,1,1
access_service_line_manager,access.service.line.manager,model_service_line,fleet.fleet_group_manager,1,1,1,1
access_service_worksheet_manager,access.service.worksheet.manager,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_user access.service.booking.user model_service_booking fleet.fleet_group_user 1 0 0 0
3 access_service_package_user access.service.package.user model_service_package fleet.fleet_group_user 1 0 0 0
4 access_service_type_user access.service.type.user model_service_type fleet.fleet_group_user 1 0 0 0
5 access_service_line_user access.service.line.user model_service_line fleet.fleet_group_user 1 0 0 0
6 access_service_worksheet_user access.service.worksheet.user model_service_worksheet fleet.fleet_group_user 1 0 0 0
7 access_service_booking_manager access.service.booking.manager model_service_booking fleet.fleet_group_manager 1 1 1 1
8 access_service_package_manager access.service.package.manager model_service_package fleet.fleet_group_manager 1 1 1 1
9 access_service_type_manager access.service.type.manager model_service_type fleet.fleet_group_manager 1 1 1 1
10 access_service_line_manager access.service.line.manager model_service_line fleet.fleet_group_manager 1 1 1 1
11 access_service_worksheet_manager access.service.worksheet.manager 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.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
website_fleet_service/static/description/assets/modules/4_1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
website_fleet_service/static/description/assets/screenshots/S-6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

BIN
website_fleet_service/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
website_fleet_service/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

854
website_fleet_service/static/description/index.html

@ -0,0 +1,854 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Website Fleet Service</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body>
<section>
<div class="container"
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center"
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)">
<div class="my-3">
<img src="assets/misc/cybrosys-logo.png"
style="width:auto !important; height:40px !important">
</div>
<div class="my-3 d-flex align-items-center">
<div class="text-center"
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Community
</div>
<div class="text-center"
style="background-color:#875A7B !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;">
Enterprise
</div>
<div class="text-center"
style="background-color:#7C7BAD !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Odoo.sh
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column"
style="margin: 80px 0px !important;">
<h1 style="font-size: 2.8rem;font-weight: 700; color:
#1A202C;">
Website Fleet Service</h1>
<p class="my-3 mb-4"
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;">
Online Car Service Booking
</p>
<div style="width: 80%; margin-top: 3rem;">
<img src="assets/screenshots/hero.gif"
class="img-responsive" width="100%" height="auto">
</div>
</div>
</div>
<div class="container mt-5 mb-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#714b67 !important">
Key Highlights
</p>
</div>
<div class="row py-4">
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
User Friendly Interface.</p>
<p class="m-0" style="color:#718096">Detailed
Website Fleet Service View.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Users can Easily Book Car Services.</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Service Packages View.
</p>
<p class="m-0" style="color:#718096">
Every service package that is available can be
viewed by users.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0; ">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Customer Portal</p>
<p class="m-0" style="color:#718096">
Users can use the portal to see all the bookings
and post comments.
</p>
</div>
</div>
</div>
</div>
</div>
<div class="container rounded">
<ul class="nav nav-tabs d-flex"
style="width: fit-content;margin: 0 auto;gap: 1rem;">
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
class="active show" data-toggle="tab" href="#tab1"
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;">
<i class="fa-regular fa-image pr-2"
style="color: #fff;"></i>
Screenshots</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab2"
style="color: #fff;font-weight: 500; text-decoration: none;"><i
class="fa-solid fa-star pr-2"
style="color: #fff;"></i>Features</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab3"
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i
class="fa-solid fa-book-open pr-2"
style="color: #fff;"></i>Released Notes</a></li>
</ul>
<div class="tab-content"
style="background-color: rgba(121, 113, 119, 0.04);">
<div id="tab1" class="tab-pane fade in active show">
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Service Booking & Worksheet Menu</h4>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Added a menu to the Car Workshop module to
handle bookings and data on the
corresponding worksheet.</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/2.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Add the Service Provided and its Price.
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/3.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Service Package Menu.
</h4>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In the service package menu, add the package
name and the service type provided in that
package. then the total expense of the
service package will be automatically
calculated.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/4.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Service Booking Form View.
</h4>
<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 update
the amount. Set the date, car number,
current location and mobile number.Then
click Confirm button.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/5.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/5.1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Service Worksheet</h4>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
The service worksheet will automatically generate after confirmation.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/S-6.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Online Booking
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In Car Service Booking menu, Users can book the service.
</p>
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/7.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Service Packages View
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/8.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Customer Portal
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/9.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Customer Can View All The Bookings. Also, Customer Can Chat Through Portal.
</h4>
</div>
</div>
</div>
</div>
<!-- Features -->
<div id="tab2" class="tab-pane fade">
<div class="col-mg-12" style="padding: 1rem 4rem;">
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;">
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>User Friendly
Interface.
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Users can Easily
Book Car Services.
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Service Packages
View.
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Customer Portal.
</li>
</ul>
</div>
</div>
<div id="tab3" class="tab-pane fade">
<div class="col-mg-12 active" style="padding: 1rem 4rem;">
<div class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="d-flex mb-3"
style="font-size: 0.8rem; font-weight: 500;"><span>Version
17.0.1.0.0</span><span
class="px-2">|</span><span
style="color: #714B67;font-weight: 600;">Released on:17th July 2024</span>
</div>
<p class="m-0"
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;">
Initial Commit for Car Workshop.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Related Products</p>
</div>
</div>
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/fleet_vehicle_inspection_management"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/1.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Vehicle Inspection Management in Fleet</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/odoo_parking_management/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/2.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Parking Management</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/front_office_management/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/3.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Front Office Management</p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/packers_and_movers_management/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/4_1.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Packers & Movers Management</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/freight_management_system/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/5.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Freight Management</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/event_management/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/6.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Event Management
</p>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#myCarousel"
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="#myCarousel"
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 class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Services</p>
</div>
</div>
<div class="container my-5">
<div class="row py-3">
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/cogs.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Customization</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/wrench.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/lifebuoy.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Support</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/user.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Hire
Odoo Developer</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/puzzle.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Integration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/update.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Migration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/consultation.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Consultancy</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/training.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/license.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Licensing Consultancy</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Industries</p>
</div>
</div>
<div class="container">
<div class="row my-5 py-4">
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100 "
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/trading-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Trading</p>
<p>Easily procure and sell your products</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/pos-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">POS</p>
<p>Easy configuration and convivial experience</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)">
<img src="assets/icons/education-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Education</p>
<p>A platform for educational management</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/manufacturing-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Manufacturing</p>
<p>Plan, track and schedule your operations</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/ecom-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">E-commerce &
Website</p>
<p>Mobile friendly, awe-inspiring product pages</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/service-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Service
Management</p>
<p>Keep track of services and invoice</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/restaurant-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Restaurant</p>
<p>Run your bar or restaurant methodically</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/hotel-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Hotel
Management</p>
<p>An all-inclusive hotel management application</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Support</p>
</div>
</div>
<div class="container my-5">
<div class="row" style="background-color: #FFFAFE;">
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"
style="border-right: 1px solid #D9D9D9;">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/support (1) 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div style="padding: 0px 8px;">
<span
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need
Help?</span>
<p class="m-0" style="color:#718096;">Got
questions or need help? Get in touch.</p>
<div style="font-weight: 400;"><span><img
src="assets/misc/support-email.svg"
alt=""
width="18px"
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/whatsapp 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div>
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span>
<p class="m-0" style="color:#718096;">Say hi to
us on WhatsApp!</p>
<div style="font-weight: 400; font-size: 16px;"><span><img
src="assets/misc/phone.svg"
alt="" width="14px"
style="filter: invert(1); margin-right: 0.8rem;"></span>+91
99456767686
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

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

12
website_fleet_service/static/src/js/website_service.js

@ -0,0 +1,12 @@
/** @odoo-module **/
import publicWidget from "@web/legacy/js/public/public_widget";
//Extend public widget to add the total amount for te service
publicWidget.registry.WebsiteFleetServiceWidget = publicWidget.Widget.extend({
selector: '.website_fleet_service_widget',
events: {
'change #service_type': function(ev) {
this.$('#amount').val($(ev.target.options[ev.target.selectedIndex]).getAttributes().amount)
},
},
});

127
website_fleet_service/views/service_booking_views.xml

@ -0,0 +1,127 @@
<?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" invisible="state != 'draft'"
type="object"/>
<button name="action_create_invoice" string='Create Invoice'
class="btn-primary" invisible="state != '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"
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" 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.menu_fleet_car_workshop_root" 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_config_settings"/>
</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_config_settings"/>
</odoo>

66
website_fleet_service/views/service_worksheet_views.xml

@ -0,0 +1,66 @@
<?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"
invisible="state != '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_service_portalportal'"
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="text">Follow, view or chat your bookings. </t>
<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