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

# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Vishnuraj P(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_ids
source_document.append(main_pick.name)
else:
orders = self.merge_picking_ids
moves = self.env['stock.move']
main_pick = orders[0].copy({'move_ids': None})
for record in orders:
for line in record.move_ids:
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()