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