You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							221 lines
						
					
					
						
							8.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							221 lines
						
					
					
						
							8.5 KiB
						
					
					
				
								# -*- 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()
							 | 
						|
								
							 |