From 95b92d4027b6a7e8c7939d9fc86f844c13ce4ce1 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 6 Jan 2025 11:22:48 +0000 Subject: [PATCH] [FIX] sale_stock_usability: fix order of lines in report method --- sale_stock_usability/models/stock_picking.py | 106 ++++++++++--------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/sale_stock_usability/models/stock_picking.py b/sale_stock_usability/models/stock_picking.py index 1c0ccbb..bbcdb8b 100644 --- a/sale_stock_usability/models/stock_picking.py +++ b/sale_stock_usability/models/stock_picking.py @@ -23,58 +23,60 @@ class StockPicking(models.Model): total_amount = 0.0 total_weight_kg = 0.0 lines = [] - for line in self.move_line_ids: - move = line.move_id - uom = line.product_uom_id - if uom.category_id.id == weight_uom_categ_id: - weight_kg_subtotal = uom._compute_quantity(line.qty_done, kg_uom) - else: - qty_product_uom = uom._compute_quantity(line.qty_done, line.product_id.uom_id) - weight_kg_subtotal = qty_product_uom * line.product_id.weight - if ( - move.sale_line_id and - move.sale_line_id.product_id == line.product_id and - move.sale_line_id.product_uom_qty > 0 and - move.sale_line_id.product_uom == uom): - price_unit = currency.round( - line.move_id.sale_line_id.price_subtotal / move.sale_line_id.product_uom_qty) - logger.info( - 'For move line %s, got price %s from sale order line', - line.display_name, price_unit) - else: - # TODO remove tax if tax included - price_unit = partner_pricelist._get_product_price( - line.product_id, line.qty_done, uom=uom, - date=fields.Date.to_date(self.date_done)) - price_unit = currency.round(price_unit) - # Only for very special case where picking is linked to sale order but this line - # is from linked to sale order line, and the partner pricelist is NOT in the same - # currency as the sale order pricelist. Should very rarely happen. - if currency != partner_pricelist.currency_id: - raise UserError(_( - "The pricelist of the related sale order is in currency " - "%(sale_pricelist_currency)s whereas the pricelist " - "%(partner_pricelist_name)s of partner %(partner)s " - "is in currency %(partner_pricelist_currency)s.", - sale_pricelist_currency=self.sale_id.currency_id.name, - partner_pricelist_name=partner_pricelist.name, - partner=self.partner_id.display_name, - partner_pricelist_currency=partner_pricelist.currency_id.name)) - logger.info( - 'For move line %s, got price %s from partner pricelist %s', - line.display_name, price_unit, partner_pricelist.display_name) - price_subtotal = currency.round(price_unit * line.qty_done) - total_amount += price_subtotal - lines.append({ - 'line': line, - 'qty': line.qty_done, - 'uom': uom, - 'product': line.product_id, - 'weight_kg_subtotal': weight_kg_subtotal, - 'price_unit': price_unit, - 'price_subtotal': price_subtotal, - 'lot': line.lot_id and line.lot_id.display_name or (line.lot_name or ''), - }) + # loop on stock.move AND THEN on stock.move.line to keep the order + # of the sale order lines + for move in self.move_ids: + for line in move.move_line_ids: + uom = line.product_uom_id + if uom.category_id.id == weight_uom_categ_id: + weight_kg_subtotal = uom._compute_quantity(line.qty_done, kg_uom) + else: + qty_product_uom = uom._compute_quantity(line.qty_done, line.product_id.uom_id) + weight_kg_subtotal = qty_product_uom * line.product_id.weight + if ( + move.sale_line_id and + move.sale_line_id.product_id == line.product_id and + move.sale_line_id.product_uom_qty > 0 and + move.sale_line_id.product_uom == uom): + price_unit = currency.round( + line.move_id.sale_line_id.price_subtotal / move.sale_line_id.product_uom_qty) + logger.info( + 'For move line %s, got price %s from sale order line', + line.display_name, price_unit) + else: + # TODO remove tax if tax included + price_unit = partner_pricelist._get_product_price( + line.product_id, line.qty_done, uom=uom, + date=fields.Date.to_date(self.date_done)) + price_unit = currency.round(price_unit) + # Only for very special case where picking is linked to sale order but this line + # is from linked to sale order line, and the partner pricelist is NOT in the same + # currency as the sale order pricelist. Should very rarely happen. + if currency != partner_pricelist.currency_id: + raise UserError(_( + "The pricelist of the related sale order is in currency " + "%(sale_pricelist_currency)s whereas the pricelist " + "%(partner_pricelist_name)s of partner %(partner)s " + "is in currency %(partner_pricelist_currency)s.", + sale_pricelist_currency=self.sale_id.currency_id.name, + partner_pricelist_name=partner_pricelist.name, + partner=self.partner_id.display_name, + partner_pricelist_currency=partner_pricelist.currency_id.name)) + logger.info( + 'For move line %s, got price %s from partner pricelist %s', + line.display_name, price_unit, partner_pricelist.display_name) + price_subtotal = currency.round(price_unit * line.qty_done) + total_amount += price_subtotal + lines.append({ + 'line': line, + 'qty': line.qty_done, + 'uom': uom, + 'product': line.product_id, + 'weight_kg_subtotal': weight_kg_subtotal, + 'price_unit': price_unit, + 'price_subtotal': price_subtotal, + 'lot': line.lot_id and line.lot_id.display_name or (line.lot_name or ''), + }) res = { 'lines': lines, 'currency': currency,