[FIX] delivery: group by products when creating commodities

Before this commit, if you made a product to be tracked by unique
serial number and then make a sale order with hundreds of units
of the same product, each unit will make a separate line with qty = 1.

The issue is each serial makes a different `stock.move.line` and
`_get_commodities_from_stock_move_lines` groups by move lines, which
leads to the issue.

To solve the problem we need to group the move lines by product.

opw-3212809

closes odoo/odoo#116882

X-original-commit: 3c4a12bac1302c8e39dc2a1c617e6536c2d07d3d
Signed-off-by: Arnold Moyaux (arm) <arm@odoo.com>
Signed-off-by: Khanalizadeh Ahmad (khah) <khah@odoo.com>
This commit is contained in:
Ahmad Khanalizadeh
2023-03-29 10:37:22 +02:00
parent f8071dc521
commit 10c90e3515
@@ -4,6 +4,7 @@ from odoo import _, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.tools.float_utils import float_round
from odoo.tools.misc import groupby
from .delivery_request_objects import DeliveryCommodity, DeliveryPackage
@@ -199,18 +200,19 @@ class DeliveryCarrier(models.Model):
def _get_commodities_from_stock_move_lines(self, move_lines):
commodities = []
for line in move_lines.filtered(lambda line: line.product_id.type in ['product', 'consu']):
qty = line.qty_done if line.state == 'done' else line.reserved_uom_qty
unit_quantity = line.product_uom_id._compute_quantity(qty, line.product_id.uom_id)
product_lines = move_lines.filtered(lambda line: line.product_id.type in ['product', 'consu'])
for product, lines in groupby(product_lines, lambda x: x.product_id):
unit_quantity = sum(
line.product_uom_id._compute_quantity(
line.qty_done if line.state == 'done' else line.reserved_uom_qty,
product.uom_id)
for line in lines)
rounded_qty = max(1, float_round(unit_quantity, precision_digits=0))
country_of_origin = line.product_id.country_of_origin.code or \
line.picking_id.picking_type_id.warehouse_id.partner_id.country_id.code
commodities.append(DeliveryCommodity(
line.product_id,
amount=rounded_qty,
monetary_value=line.sale_price,
country_of_origin=country_of_origin
))
country_of_origin = product.country_of_origin.code or lines[0].picking_id.picking_type_id.warehouse_id.partner_id.country_id.code
sale_price = sum(line.sale_price for line in lines)
commodities.append(DeliveryCommodity(product, amount=rounded_qty, monetary_value=sale_price, country_of_origin=country_of_origin))
return commodities
def _product_price_to_company_currency(self, quantity, product, company):