diff --git a/website_fleet_service/README.rst b/website_fleet_service/README.rst new file mode 100644 index 000000000..b92418961 --- /dev/null +++ b/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 `__ + +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: ``__ diff --git a/website_fleet_service/__init__.py b/website_fleet_service/__init__.py new file mode 100644 index 000000000..c971e47ac --- /dev/null +++ b/website_fleet_service/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +from . import controllers +from . import models diff --git a/website_fleet_service/__manifest__.py b/website_fleet_service/__manifest__.py new file mode 100644 index 000000000..84248e5f2 --- /dev/null +++ b/website_fleet_service/__manifest__.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +{ + "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, +} diff --git a/website_fleet_service/controllers/__init__.py b/website_fleet_service/controllers/__init__.py new file mode 100644 index 000000000..c49a6fd43 --- /dev/null +++ b/website_fleet_service/controllers/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +from . import portal +from . import website_fleet_service diff --git a/website_fleet_service/controllers/portal.py b/website_fleet_service/controllers/portal.py new file mode 100644 index 000000000..718bde417 --- /dev/null +++ b/website_fleet_service/controllers/portal.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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/'], + 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", + }, + ) diff --git a/website_fleet_service/controllers/website_fleet_service.py b/website_fleet_service/controllers/website_fleet_service.py new file mode 100644 index 000000000..fad21df5a --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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, + }, + ) diff --git a/website_fleet_service/data/ir_sequence_data.xml b/website_fleet_service/data/ir_sequence_data.xml new file mode 100644 index 000000000..22f46f7aa --- /dev/null +++ b/website_fleet_service/data/ir_sequence_data.xml @@ -0,0 +1,13 @@ + + + + + + Service Booking Sequence + service.booking + CS + 5 + + + + diff --git a/website_fleet_service/data/service_type_data.xml b/website_fleet_service/data/service_type_data.xml new file mode 100644 index 000000000..8913d727a --- /dev/null +++ b/website_fleet_service/data/service_type_data.xml @@ -0,0 +1,90 @@ + + + + + + Check the engine oil + 10 + + + Oil filter replacement + 20 + + + Fuel filter replacement + 21 + + + Replace the spark plugs + 25 + + + Refill Brake fluid + 30 + + + Refill Clutch fluid + 28 + + + check brake discs / Drums + 30 + + + Verify the Charging systems + 35 + + + Check power steering fluid + 31 + + + Inspect timing belt or timing chain + 45 + + + Check tire Conditions + 47 + + + Change the engine oil + 43 + + + Air filter replacement + 30 + + + Replace the airconfilter + 18 + + + Check brake pades / liners + 20 + + + verify coolant hoses + 26 + + + check the battery + 20 + + + Verify A/M transmission fluid + 39 + + + Grease and lubricate components + 54 + + + Replace timing belt or timing chain + 90 + + + Check lights, Wipers and others + 50 + + + diff --git a/website_fleet_service/data/website_fleet_service_menu_data.xml b/website_fleet_service/data/website_fleet_service_menu_data.xml new file mode 100644 index 000000000..beff1eca2 --- /dev/null +++ b/website_fleet_service/data/website_fleet_service_menu_data.xml @@ -0,0 +1,18 @@ + + + + + + Car Service Booking + /service_booking + + 50 + + + Service Package + /service_package + + 51 + + + diff --git a/website_fleet_service/doc/RELEASE_NOTES.md b/website_fleet_service/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..2e388f680 --- /dev/null +++ b/website_fleet_service/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 23.07.2024 +#### Version 17.0.1.0.0 +#### ADD +- Initial commit for Website Fleet Service diff --git a/website_fleet_service/models/__init__.py b/website_fleet_service/models/__init__.py new file mode 100644 index 000000000..9ae010273 --- /dev/null +++ b/website_fleet_service/models/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +from . import account_move +from . import service_booking +from . import service_line +from . import service_type +from . import service_package +from . import service_worksheet diff --git a/website_fleet_service/models/account_move.py b/website_fleet_service/models/account_move.py new file mode 100644 index 000000000..6b2f4d8ba --- /dev/null +++ b/website_fleet_service/models/account_move.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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 diff --git a/website_fleet_service/models/service_booking.py b/website_fleet_service/models/service_booking.py new file mode 100644 index 000000000..6b9cdd549 --- /dev/null +++ b/website_fleet_service/models/service_booking.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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() diff --git a/website_fleet_service/models/service_line.py b/website_fleet_service/models/service_line.py new file mode 100644 index 000000000..f2be3e04a --- /dev/null +++ b/website_fleet_service/models/service_line.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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.") diff --git a/website_fleet_service/models/service_package.py b/website_fleet_service/models/service_package.py new file mode 100644 index 000000000..3f9127488 --- /dev/null +++ b/website_fleet_service/models/service_package.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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")) diff --git a/website_fleet_service/models/service_type.py b/website_fleet_service/models/service_type.py new file mode 100644 index 000000000..4224aa37a --- /dev/null +++ b/website_fleet_service/models/service_type.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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.", + ) diff --git a/website_fleet_service/models/service_worksheet.py b/website_fleet_service/models/service_worksheet.py new file mode 100644 index 000000000..a08fa023f --- /dev/null +++ b/website_fleet_service/models/service_worksheet.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +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"}) diff --git a/website_fleet_service/security/ir.model.access.csv b/website_fleet_service/security/ir.model.access.csv new file mode 100644 index 000000000..c475ad505 --- /dev/null +++ b/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 diff --git a/website_fleet_service/security/website_fleet_service_security.xml b/website_fleet_service/security/website_fleet_service_security.xml new file mode 100644 index 000000000..38956cb7d --- /dev/null +++ b/website_fleet_service/security/website_fleet_service_security.xml @@ -0,0 +1,22 @@ + + + + + + Service Booking multi company rule + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + + Service Worksheet multi company rule + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + + diff --git a/website_fleet_service/static/description/assets/icons/check.png b/website_fleet_service/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/check.png differ diff --git a/website_fleet_service/static/description/assets/icons/chevron.png b/website_fleet_service/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/chevron.png differ diff --git a/website_fleet_service/static/description/assets/icons/cogs.png b/website_fleet_service/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/cogs.png differ diff --git a/website_fleet_service/static/description/assets/icons/consultation.png b/website_fleet_service/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/consultation.png differ diff --git a/website_fleet_service/static/description/assets/icons/ecom-black.png b/website_fleet_service/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/ecom-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/education-black.png b/website_fleet_service/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/education-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/hotel-black.png b/website_fleet_service/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/hotel-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/license.png b/website_fleet_service/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/license.png differ diff --git a/website_fleet_service/static/description/assets/icons/lifebuoy.png b/website_fleet_service/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/lifebuoy.png differ diff --git a/website_fleet_service/static/description/assets/icons/manufacturing-black.png b/website_fleet_service/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/manufacturing-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/pos-black.png b/website_fleet_service/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/pos-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/puzzle.png b/website_fleet_service/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/puzzle.png differ diff --git a/website_fleet_service/static/description/assets/icons/restaurant-black.png b/website_fleet_service/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/restaurant-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/service-black.png b/website_fleet_service/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/service-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/trading-black.png b/website_fleet_service/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/trading-black.png differ diff --git a/website_fleet_service/static/description/assets/icons/training.png b/website_fleet_service/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/training.png differ diff --git a/website_fleet_service/static/description/assets/icons/update.png b/website_fleet_service/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/update.png differ diff --git a/website_fleet_service/static/description/assets/icons/user.png b/website_fleet_service/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/user.png differ diff --git a/website_fleet_service/static/description/assets/icons/wrench.png b/website_fleet_service/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/website_fleet_service/static/description/assets/icons/wrench.png differ diff --git a/website_fleet_service/static/description/assets/misc/categories.png b/website_fleet_service/static/description/assets/misc/categories.png new file mode 100644 index 000000000..bedf1e0b1 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/categories.png differ diff --git a/website_fleet_service/static/description/assets/misc/check-box.png b/website_fleet_service/static/description/assets/misc/check-box.png new file mode 100644 index 000000000..42caf24b9 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/check-box.png differ diff --git a/website_fleet_service/static/description/assets/misc/compass.png b/website_fleet_service/static/description/assets/misc/compass.png new file mode 100644 index 000000000..d5fed8faa Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/compass.png differ diff --git a/website_fleet_service/static/description/assets/misc/corporate.png b/website_fleet_service/static/description/assets/misc/corporate.png new file mode 100644 index 000000000..2eb13edbf Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/corporate.png differ diff --git a/website_fleet_service/static/description/assets/misc/customer-support.png b/website_fleet_service/static/description/assets/misc/customer-support.png new file mode 100644 index 000000000..79efc72ed Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/customer-support.png differ diff --git a/website_fleet_service/static/description/assets/misc/cybrosys-logo.png b/website_fleet_service/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 000000000..cc3cc0ccf Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/cybrosys-logo.png differ diff --git a/website_fleet_service/static/description/assets/misc/features.png b/website_fleet_service/static/description/assets/misc/features.png new file mode 100644 index 000000000..b41769f77 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/features.png differ diff --git a/website_fleet_service/static/description/assets/misc/logo.png b/website_fleet_service/static/description/assets/misc/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/logo.png differ diff --git a/website_fleet_service/static/description/assets/misc/pictures.png b/website_fleet_service/static/description/assets/misc/pictures.png new file mode 100644 index 000000000..56d255fe9 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/pictures.png differ diff --git a/website_fleet_service/static/description/assets/misc/pie-chart.png b/website_fleet_service/static/description/assets/misc/pie-chart.png new file mode 100644 index 000000000..426e05244 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/pie-chart.png differ diff --git a/website_fleet_service/static/description/assets/misc/right-arrow.png b/website_fleet_service/static/description/assets/misc/right-arrow.png new file mode 100644 index 000000000..730984a06 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/right-arrow.png differ diff --git a/website_fleet_service/static/description/assets/misc/star.png b/website_fleet_service/static/description/assets/misc/star.png new file mode 100644 index 000000000..2eb9ab29f Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/star.png differ diff --git a/website_fleet_service/static/description/assets/misc/support.png b/website_fleet_service/static/description/assets/misc/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/support.png differ diff --git a/website_fleet_service/static/description/assets/misc/whatsapp.png b/website_fleet_service/static/description/assets/misc/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/website_fleet_service/static/description/assets/misc/whatsapp.png differ diff --git a/website_fleet_service/static/description/assets/modules/1.jpg b/website_fleet_service/static/description/assets/modules/1.jpg new file mode 100644 index 000000000..53b053f74 Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/1.jpg differ diff --git a/website_fleet_service/static/description/assets/modules/2.jpg b/website_fleet_service/static/description/assets/modules/2.jpg new file mode 100644 index 000000000..cd62a577c Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/2.jpg differ diff --git a/website_fleet_service/static/description/assets/modules/3.png b/website_fleet_service/static/description/assets/modules/3.png new file mode 100644 index 000000000..2bf2249b2 Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/3.png differ diff --git a/website_fleet_service/static/description/assets/modules/4_1.jpg b/website_fleet_service/static/description/assets/modules/4_1.jpg new file mode 100644 index 000000000..e4a339c56 Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/4_1.jpg differ diff --git a/website_fleet_service/static/description/assets/modules/5.png b/website_fleet_service/static/description/assets/modules/5.png new file mode 100644 index 000000000..6165a8b99 Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/5.png differ diff --git a/website_fleet_service/static/description/assets/modules/6.jpg b/website_fleet_service/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..990e658e6 Binary files /dev/null and b/website_fleet_service/static/description/assets/modules/6.jpg differ diff --git a/website_fleet_service/static/description/assets/screenshots/1.png b/website_fleet_service/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..b79017bae Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/1.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/2.png b/website_fleet_service/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..cfcab349f Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/2.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/3.png b/website_fleet_service/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..940c84e3f Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/3.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/4.png b/website_fleet_service/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..f58b56077 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/4.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/5.1.png b/website_fleet_service/static/description/assets/screenshots/5.1.png new file mode 100644 index 000000000..2337fc213 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/5.1.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/5.png b/website_fleet_service/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..66d466040 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/5.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/7.png b/website_fleet_service/static/description/assets/screenshots/7.png new file mode 100644 index 000000000..9ff55f0d7 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/7.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/8.png b/website_fleet_service/static/description/assets/screenshots/8.png new file mode 100644 index 000000000..61d28238b Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/8.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/9.png b/website_fleet_service/static/description/assets/screenshots/9.png new file mode 100644 index 000000000..afa086e48 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/9.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/S-6.png b/website_fleet_service/static/description/assets/screenshots/S-6.png new file mode 100644 index 000000000..b3e64eeb4 Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/S-6.png differ diff --git a/website_fleet_service/static/description/assets/screenshots/hero.gif b/website_fleet_service/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..205c670fa Binary files /dev/null and b/website_fleet_service/static/description/assets/screenshots/hero.gif differ diff --git a/website_fleet_service/static/description/banner.jpg b/website_fleet_service/static/description/banner.jpg new file mode 100644 index 000000000..15f201125 Binary files /dev/null and b/website_fleet_service/static/description/banner.jpg differ diff --git a/website_fleet_service/static/description/icon.png b/website_fleet_service/static/description/icon.png new file mode 100644 index 000000000..32ee18b7c Binary files /dev/null and b/website_fleet_service/static/description/icon.png differ diff --git a/website_fleet_service/static/description/index.html b/website_fleet_service/static/description/index.html new file mode 100644 index 000000000..819a4f19f --- /dev/null +++ b/website_fleet_service/static/description/index.html @@ -0,0 +1,854 @@ + + + + + + + Website Fleet Service + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+
+
+
+

+ Website Fleet Service

+

+ Online Car Service Booking +

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ User Friendly Interface.

+

Detailed + Website Fleet Service View. +

+
+
+
+
+
+
+ +
+
+

+ Users can Easily Book Car Services.

+
+
+
+
+
+
+ +
+
+

+ Service Packages View. +

+

+ Every service package that is available can be + viewed by users. +

+
+
+
+
+
+
+ +
+
+

+ Customer Portal

+

+ Users can use the portal to see all the bookings + and post comments. +

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+

+ Service Booking & Worksheet Menu

+

+

+ Added a menu to the Car Workshop module to + handle bookings and data on the + corresponding worksheet.

+
+
+
+
+
+
+ +
+
+

+ Add the Service Provided and its Price. +

+
+
+
+
+
+
+ +
+
+

+ Service Package Menu. +

+

+ 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. +

+
+
+
+
+
+
+ +
+
+

+ Service Booking Form View. +

+

+ 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. +

+
+
+
+
+
+
+ +
+
+ +
+
+

+ Service Worksheet

+

+ The service worksheet will automatically generate after confirmation. +

+
+
+
+
+
+
+ +
+
+

+ Online Booking +

+ In Car Service Booking menu, Users can book the service. +

+

+
+
+
+
+
+
+ +
+
+

+ Service Packages View +

+
+
+
+
+
+
+ +
+
+

+ Customer Portal +

+
+
+
+
+
+
+ +
+
+

+ Customer Can View All The Bookings. Also, Customer Can Chat Through Portal. +

+
+
+
+
+ +
+
+
    +
  • + User Friendly + Interface. +
  • +
  • + Users can Easily + Book Car Services. +
  • +
  • + Service Packages + View. +
  • +
  • + Customer Portal. +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:17th July 2024 +
+

+ Initial Commit for Car Workshop.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+

+ Our Services

+
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire + Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo + Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Licensing Consultancy

+
+
+
+
+
+
+

+ Our Industries

+
+
+
+
+
+
+ +

Trading

+

Easily procure and sell your products

+
+
+
+
+ +

POS

+

Easy configuration and convivial experience

+
+
+
+
+ +

+ Education

+

A platform for educational management

+
+
+
+
+ +

+ Manufacturing

+

Plan, track and schedule your operations

+
+
+
+
+ +

E-commerce & + Website

+

Mobile friendly, awe-inspiring product pages

+
+
+
+
+ +

Service + Management

+

Keep track of services and invoice

+
+
+
+
+ +

+ Restaurant

+

Run your bar or restaurant methodically

+
+
+
+
+ +

Hotel + Management

+

An all-inclusive hotel management application

+
+
+
+
+
+
+

+ Support

+
+
+
+
+
+
+
+ +
+ Need + Help? +

Got + questions or need help? Get in touch.

+
odoo@cybrosys.com +
+
+
+
+
+
+
+
+ +
+ WhatsApp +

Say hi to + us on WhatsApp!

+
+91 + 99456767686 +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/website_fleet_service/static/src/css/website_service.css b/website_fleet_service/static/src/css/website_service.css new file mode 100644 index 000000000..edc1bc669 --- /dev/null +++ b/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; +} +} diff --git a/website_fleet_service/static/src/img/car_service.jpg b/website_fleet_service/static/src/img/car_service.jpg new file mode 100644 index 000000000..0e96d6064 Binary files /dev/null and b/website_fleet_service/static/src/img/car_service.jpg differ diff --git a/website_fleet_service/static/src/js/website_service.js b/website_fleet_service/static/src/js/website_service.js new file mode 100644 index 000000000..dc95a6042 --- /dev/null +++ b/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) + }, + }, + }); diff --git a/website_fleet_service/views/service_booking_views.xml b/website_fleet_service/views/service_booking_views.xml new file mode 100644 index 000000000..d1adb2762 --- /dev/null +++ b/website_fleet_service/views/service_booking_views.xml @@ -0,0 +1,127 @@ + + + + + Service Booking + service.booking + tree,form + + + + service.booking.view.search + service.booking + + + + + + + + + + + + + + + + + + + + + + service.booking.view.tree + service.booking + + + + + + + + + + + + + service.booking.view.form + service.booking + +
+
+
+ +
+ + +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + + diff --git a/website_fleet_service/views/service_package_views.xml b/website_fleet_service/views/service_package_views.xml new file mode 100644 index 000000000..622f34785 --- /dev/null +++ b/website_fleet_service/views/service_package_views.xml @@ -0,0 +1,57 @@ + + + + + Service Package + service.package + tree,form + + + + service.package.view.tree + service.package + + + + + + + + + service.package.view.form + service.package + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+
+
+ +
diff --git a/website_fleet_service/views/service_type_views.xml b/website_fleet_service/views/service_type_views.xml new file mode 100644 index 000000000..fd659e8b9 --- /dev/null +++ b/website_fleet_service/views/service_type_views.xml @@ -0,0 +1,43 @@ + + + + + Service Type + service.type + tree + + + + service.type.view.tree + service.type + + + + + + + + + + + + service.type.view.form + service.type + +
+ + + + + + + + + + +
+
+
+ +
diff --git a/website_fleet_service/views/service_worksheet_views.xml b/website_fleet_service/views/service_worksheet_views.xml new file mode 100644 index 000000000..580849fdc --- /dev/null +++ b/website_fleet_service/views/service_worksheet_views.xml @@ -0,0 +1,66 @@ + + + + + Service Worksheet + service.worksheet + tree,form + + + + service.worksheet.view.tree + service.worksheet + + + + + + + + + + + + service.worksheet.view.form + service.worksheet + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + +
+ + + + + + + + + diff --git a/website_fleet_service/views/website_service_booking_portal_templates.xml b/website_fleet_service/views/website_service_booking_portal_templates.xml new file mode 100644 index 000000000..45b10e993 --- /dev/null +++ b/website_fleet_service/views/website_service_booking_portal_templates.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + diff --git a/website_fleet_service/views/website_service_booking_templates.xml b/website_fleet_service/views/website_service_booking_templates.xml new file mode 100644 index 000000000..be2b42b19 --- /dev/null +++ b/website_fleet_service/views/website_service_booking_templates.xml @@ -0,0 +1,114 @@ + + + + + + + diff --git a/website_fleet_service/views/website_service_package_templates.xml b/website_fleet_service/views/website_service_package_templates.xml new file mode 100644 index 000000000..462e5ed51 --- /dev/null +++ b/website_fleet_service/views/website_service_package_templates.xml @@ -0,0 +1,58 @@ + + + + +