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()
|
|
|