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