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.
		
		
		
		
		
			
		
			
				
					
					
						
							110 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							110 lines
						
					
					
						
							5.4 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Muhsina V (<https://www.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 models
							 | 
						|
								from odoo.tools import float_compare, float_is_zero, float_round
							 | 
						|
								from odoo.addons.stock.models.stock_picking import Picking
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class Picking(models.Model):
							 | 
						|
								    """Inheriting the stock picking model to change the package creation method
							 | 
						|
								    based on package category provided inside the product form."""
							 | 
						|
								    _inherit = 'stock.picking'
							 | 
						|
								
							 | 
						|
								    def _put_in_pack(self, move_line_ids, create_package_level=True):
							 | 
						|
								        """For each product in the orderline with the same package category,
							 | 
						|
								        it creates packages and adds the corresponding products into the
							 | 
						|
								        package when validating the delivery"""
							 | 
						|
								        packages = {}
							 | 
						|
								        precision_digits = self.env['decimal.precision'].precision_get(
							 | 
						|
								            'Product Unit of Measure')
							 | 
						|
								        if float_is_zero(move_line_ids[0].qty_done,
							 | 
						|
								                         precision_digits=precision_digits):
							 | 
						|
								            for line in move_line_ids:
							 | 
						|
								                line.qty_done = line.reserved_uom_qty
							 | 
						|
								        for move_line in move_line_ids:
							 | 
						|
								            if float_compare(move_line.qty_done, move_line.reserved_uom_qty,
							 | 
						|
								                             precision_rounding=move_line.product_uom_id.rounding
							 | 
						|
								                             ) >= 0:
							 | 
						|
								                if not move_line.product_id.package_category_id:
							 | 
						|
								                    package_category_value = 'Others'
							 | 
						|
								                    category_name = ""
							 | 
						|
								                else:
							 | 
						|
								                    package_category_value = move_line.product_id.package_category_id.name
							 | 
						|
								                    category_name = '-' + move_line.product_id.package_category_id.name
							 | 
						|
								                if package_category_value not in packages:
							 | 
						|
								                    packages[package_category_value] = self.env[
							 | 
						|
								                        'stock.quant.package'].create({})
							 | 
						|
								                    packages[
							 | 
						|
								                        package_category_value].name += category_name
							 | 
						|
								                move_line.write(
							 | 
						|
								                    {'result_package_id': packages[package_category_value].id})
							 | 
						|
								            else:
							 | 
						|
								                quantity_left_todo = float_round(
							 | 
						|
								                    move_line.reserved_uom_qty - move_line.qty_done,
							 | 
						|
								                    precision_rounding=move_line.product_uom_id.rounding,
							 | 
						|
								                    rounding_method='HALF-UP')
							 | 
						|
								                done_to_keep = move_line.qty_done
							 | 
						|
								                new_move_line = move_line.copy(
							 | 
						|
								                    default={'reserved_uom_qty': 0,
							 | 
						|
								                             'qty_done': move_line.qty_done})
							 | 
						|
								                vals = {'reserved_uom_qty': quantity_left_todo, 'qty_done': 0.0
							 | 
						|
								                        }
							 | 
						|
								                if move_line.picking_id.picking_type_id.code == 'incoming':
							 | 
						|
								                    if move_line.lot_id:
							 | 
						|
								                        vals['lot_id'] = False
							 | 
						|
								                    if move_line.lot_name:
							 | 
						|
								                        vals['lot_name'] = False
							 | 
						|
								                move_line.write(vals)
							 | 
						|
								                new_move_line.write({'reserved_uom_qty': done_to_keep})
							 | 
						|
								                if not move_line.product_id.package_category_id:
							 | 
						|
								                    package_category_value = 'Others'
							 | 
						|
								                    category_name = ""
							 | 
						|
								                else:
							 | 
						|
								                    package_category_value = move_line.product_id.package_category_id.name
							 | 
						|
								                    category_name = '-' + move_line.product_id.package_category_id.name
							 | 
						|
								                if package_category_value not in packages:
							 | 
						|
								                    packages[package_category_value] = self.env[
							 | 
						|
								                        'stock.quant.package'].create({})
							 | 
						|
								                    packages[
							 | 
						|
								                        package_category_value].name += category_name
							 | 
						|
								                new_move_line.write(
							 | 
						|
								                    {'result_package_id': packages[package_category_value].id})
							 | 
						|
								        if create_package_level:
							 | 
						|
								            for package_category_value, package in packages.items():
							 | 
						|
								                grouped_move_lines = move_line_ids.filtered(
							 | 
						|
								                    lambda l: l.product_id.package_category_id.name ==
							 | 
						|
								                              package_category_value)
							 | 
						|
								                if not grouped_move_lines:
							 | 
						|
								                    continue
							 | 
						|
								                self.env['stock.package_level'].create({
							 | 
						|
								                    'package_id': package.id,
							 | 
						|
								                    'picking_id': grouped_move_lines[
							 | 
						|
								                        0].picking_id.id if grouped_move_lines else False,
							 | 
						|
								                    'location_id': False,
							 | 
						|
								                    'location_dest_id': grouped_move_lines.mapped(
							 | 
						|
								                        'location_dest_id').id,
							 | 
						|
								                    'move_line_ids': [(6, 0, grouped_move_lines.ids)],
							 | 
						|
								                    'company_id': grouped_move_lines[0].company_id.id,
							 | 
						|
								                })
							 | 
						|
								        return list(packages.values())
							 | 
						|
								
							 | 
						|
								    Picking._put_in_pack = _put_in_pack
							 | 
						|
								
							 |