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