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
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"}
|
|
|