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.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							89 lines
						
					
					
						
							4.0 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Vishnuraj (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 fields, models, _
							 | 
						|
								from odoo.exceptions import AccessError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class MergePicking(models.TransientModel):
							 | 
						|
								    """
							 | 
						|
								    Class for wizard to show selected pickings to merge
							 | 
						|
								    Method:
							 | 
						|
								        action_merge(self):
							 | 
						|
								            Method to merge the selected pickings
							 | 
						|
								    """
							 | 
						|
								    _name = 'merge.picking'
							 | 
						|
								    _description = "Merge Picking Wizard"
							 | 
						|
								
							 | 
						|
								    merge_picking_ids = fields.Many2many('stock.picking', string='Orders',
							 | 
						|
								                                         help="Selected orders")
							 | 
						|
								    existing_pick_id = fields.Many2one(
							 | 
						|
								        'stock.picking', string="Merge to existing",
							 | 
						|
								        help="Select a pick if you want to merge pickings to a existing picking"
							 | 
						|
								             " else leave it as empty")
							 | 
						|
								
							 | 
						|
								    def action_merge(self):
							 | 
						|
								        """
							 | 
						|
								        Main method to merge selected pickings
							 | 
						|
								        - If checked 'merge to existing' then the selected pickings will be
							 | 
						|
								          merged to last record
							 | 
						|
								        - Else a new record will be created with the existing picking lines
							 | 
						|
								        - The selected pickings will be moved to cancelled state
							 | 
						|
								        - The newly created picking will be in ready state
							 | 
						|
								        """
							 | 
						|
								        # Checking for exceptions if exist raise corresponding messages
							 | 
						|
								        if len(list(set(x.partner_id if x.partner_id else None for x in
							 | 
						|
								                        self.merge_picking_ids))) > 1:
							 | 
						|
								            raise AccessError(_("Merging is not allowed on Different partners,"
							 | 
						|
								                                " please add same partner's orders"))
							 | 
						|
								        if len(list(set(self.merge_picking_ids.mapped('picking_type_id')))) > 1:
							 | 
						|
								            raise AccessError(
							 | 
						|
								                _("Merging is not allowed on Different picking type,"
							 | 
						|
								                  " please choose same type"))
							 | 
						|
								        if any(state in ['done', 'cancel'] for state in
							 | 
						|
								               self.merge_picking_ids.mapped('state')):
							 | 
						|
								            raise AccessError(_('Merging is not allowed on Done/Cancelled '
							 | 
						|
								                                'pickings, so please remove them and continue'))
							 | 
						|
								        if len(list(set(self.merge_picking_ids.mapped('state')))) > 1:
							 | 
						|
								            raise AccessError(_('Merging is not allowed on Different State '
							 | 
						|
								                                'Pickings, please add orders in same State'))
							 | 
						|
								        if len(self.merge_picking_ids) == 1:
							 | 
						|
								            raise AccessError(_('Merging is not allowed on Single picking,'
							 | 
						|
								                                ' please add minimum Two'))
							 | 
						|
								        # If there is no exception, continues with the merging process
							 | 
						|
								        source_document = []
							 | 
						|
								        if self.existing_pick_id:
							 | 
						|
								            main_pick = self.existing_pick_id
							 | 
						|
								            orders = self.merge_picking_ids - main_pick
							 | 
						|
								            moves = main_pick.move_lines
							 | 
						|
								            source_document.append(main_pick.name)
							 | 
						|
								        else:
							 | 
						|
								            orders = self.merge_picking_ids
							 | 
						|
								            moves = self.env['stock.move']
							 | 
						|
								            main_pick = orders[0].copy({'move_lines': None})
							 | 
						|
								        for record in orders:
							 | 
						|
								            for line in record.move_lines:
							 | 
						|
								                moves += line.copy({'picking_id': main_pick.id})
							 | 
						|
								            source_document.append(record.name)
							 | 
						|
								            record.action_cancel()
							 | 
						|
								        main_pick.write(
							 | 
						|
								            {'origin': f"Merged ({(', '.join(source_document))})"})
							 | 
						|
								        main_pick.action_confirm()
							 | 
						|
								
							 |