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.
 
 
 
 
 

165 lines
6.0 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, fields, _
from odoo.exceptions import UserError
class SaleOrder(models.Model):
"""Inheriting the sale order model to add the fields
and revise quotation button"""
_inherit = "sale.order"
is_revised = fields.Boolean(
string="Is Revised", copy=False, help="Is Order Revised"
)
org_sale_id = fields.Many2one(
"sale.order", string="Origin", copy=False, help="Revised Order Origin"
)
rev_sale_ids = fields.One2many(
"sale.order",
"org_sale_id",
string="Sales Revisions",
copy=False,
help="Revised Sale Orders",
)
rev_ord_count = fields.Integer(
string="Revised Orders",
help="Revised order count",
compute="compute_rev_ord_count",
)
rev_confirm = fields.Boolean(
string="Revised Confirm", copy=False, help="Is Revised Confirm"
)
def action_revise_quotation(self):
"""Revise the current quotation."""
revise_name = str(self.name) + "/R" + str(len(self.rev_sale_ids) + 1)
vals = {"name": revise_name, "org_sale_id": self.id}
revise_quote = self.copy(default=vals)
self.is_revised = True
return {
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "sale.order",
"views": [(False, "form")],
"res_id": revise_quote.id,
}
def compute_rev_ord_count(self):
"""Compute the number of revised order of the current order."""
for record in self:
record.rev_ord_count = len(record.rev_sale_ids)
def get_revised_orders(self):
"""Action to open the revised order of the current order."""
self.ensure_one()
return {
"type": "ir.actions.act_window",
"name": "Revised Order",
"view_mode": "tree,form",
"res_model": "sale.order",
"domain": [("org_sale_id", "=", self.id)],
"context": "{'create': False}",
}
def unlink(self):
"""Override the unlink method to restrict deletion of
original sale order."""
for order in self:
if order.is_revised and order.rev_ord_count > 0:
raise UserError(
"Cannot delete a sale order with revised orders."
" Please delete the revised orders first."
)
return super(SaleOrder, self).unlink()
def action_confirm(self):
"""Override the action_confirm method to handle revised orders."""
for order in self:
if not order.rev_confirm:
related_orders = order.get_related_orders(order)
if related_orders:
# Exclude the original sale order from the list
related_orders -= order
wizard = self.env["sale.order.confirm.wizard"].create(
{
"order_id": order.id,
"sale_orders_ids": [(6, 0, related_orders.ids)],
}
)
return {
"name": "Confirm Related Sale Orders",
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "sale.order.confirm.wizard",
"res_id": wizard.id,
"target": "new",
}
super(SaleOrder, order).action_confirm()
def get_related_orders(self, order):
"""Get related sale orders."""
related_orders = order.rev_sale_ids.filtered(
lambda r: r.state not in ["cancel", "sale"]
)
if order.org_sale_id:
if order.org_sale_id.state not in ["cancel", "sale"]:
related_orders += order.org_sale_id
# Add related sale orders of order.org_sale_id
org_related_orders = order.org_sale_id.rev_sale_ids.filtered(
lambda r: r.state not in ["cancel", "sale"]
)
related_orders += org_related_orders
return related_orders
class SaleOrderConfirmWizard(models.TransientModel):
_name = "sale.order.confirm.wizard"
_description = "Confirm Sale Order Wizard"
order_id = fields.Many2one(
"sale.order",
string="Sale Orders to Confirm",
help="Select the sale orders to be conform.",
)
sale_orders_ids = fields.Many2many(
"sale.order",
string="Sale Orders to Cancel",
help="Select the sale orders to be canceled.",
)
def action_rev_cancel_orders(self):
"""Method to confirm or cancel selected sale orders."""
for wizard in self:
wizard.order_id.rev_confirm = True
wizard.order_id.action_confirm()
for order in wizard.sale_orders_ids:
order._action_cancel()
return {"type": "ir.actions.act_window_close"}
def action_rev_keep_orders(self):
"""Method to keep related sale orders."""
for wizard in self:
wizard.order_id.rev_confirm = True
wizard.order_id.action_confirm()
return {"type": "ir.actions.act_window_close"}