mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
[IMP] stock_picking_volume: Move _get_volume_for_qty to product.product
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
|
from . import product_product
|
||||||
from . import stock_move
|
from . import stock_move
|
||||||
from . import stock_picking
|
from . import stock_picking
|
||||||
|
|||||||
27
stock_picking_volume/models/product_product.py
Normal file
27
stock_picking_volume/models/product_product.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
|
# Copyright 2023 ACSONE SA/NV
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
from odoo import models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = "product.product"
|
||||||
|
|
||||||
|
def _get_volume_for_qty(self, qty, from_uom=None):
|
||||||
|
"""Return the volume for the given qty.
|
||||||
|
|
||||||
|
This method is meant to be inherited to change the volume
|
||||||
|
computation for a specific product.
|
||||||
|
|
||||||
|
qty: float quantity to compute the volume for.
|
||||||
|
from_uom: uom of given qty
|
||||||
|
|
||||||
|
An override of this method could take into account the packaging
|
||||||
|
of the product to compute the volume. (using the volume information
|
||||||
|
on the packaging provided by the module stock_quant_package_dimension
|
||||||
|
and the method product_qty_by_packaging on the product provided by the
|
||||||
|
module stock_packaging_calculator)
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
qty = from_uom and from_uom._compute_quantity(qty, self.uom_id) or qty
|
||||||
|
return qty * self.volume
|
||||||
@@ -23,27 +23,10 @@ class StockMove(models.Model):
|
|||||||
qty = move.product_uom_qty
|
qty = move.product_uom_qty
|
||||||
if move.state in ("partially_available", "assigned"):
|
if move.state in ("partially_available", "assigned"):
|
||||||
qty = move.reserved_availability
|
qty = move.reserved_availability
|
||||||
new_volume = move._get_volume_for_qty(qty=qty)
|
new_volume = move.product_id._get_volume_for_qty(qty, move.product_uom)
|
||||||
if move.volume != new_volume:
|
if move.volume != new_volume:
|
||||||
move.volume = new_volume
|
move.volume = new_volume
|
||||||
|
|
||||||
def _get_volume_for_qty(self, qty):
|
|
||||||
"""Return the volume for the move.
|
|
||||||
|
|
||||||
This method is meant to be inherited to change the volume
|
|
||||||
computation for a specific move.
|
|
||||||
|
|
||||||
qty: float quantity to compute the volume for.
|
|
||||||
|
|
||||||
An override of this method could take into account the packaging
|
|
||||||
of the product to compute the volume. (using the volume information
|
|
||||||
on the packaging provided by the module stock_quant_package_dimension
|
|
||||||
and the method product_qty_by_packaging on the product provided by the
|
|
||||||
module stock_packaging_calculator)
|
|
||||||
"""
|
|
||||||
self.ensure_one()
|
|
||||||
return qty * self.product_id.volume
|
|
||||||
|
|
||||||
def _compute_volume_uom_name(self):
|
def _compute_volume_uom_name(self):
|
||||||
self.volume_uom_name = self.env[
|
self.volume_uom_name = self.env[
|
||||||
"product.template"
|
"product.template"
|
||||||
|
|||||||
@@ -189,3 +189,10 @@ class TestStockPickingVolume(SavepointCase):
|
|||||||
self.picking.move_lines[1]._action_cancel()
|
self.picking.move_lines[1]._action_cancel()
|
||||||
self.picking.invalidate_cache()
|
self.picking.invalidate_cache()
|
||||||
self.assertEqual(self.picking.volume, 750)
|
self.assertEqual(self.picking.volume, 750)
|
||||||
|
|
||||||
|
def test_product_volume(self):
|
||||||
|
self.assertEqual(self.product._get_volume_for_qty(5), 750)
|
||||||
|
from_uom = self.env.ref("uom.product_uom_dozen")
|
||||||
|
self.assertEqual(
|
||||||
|
self.product._get_volume_for_qty(5 * from_uom.factor, from_uom), 750
|
||||||
|
)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
from . import stock_move
|
from . import product_product
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
# Copyright 2020-2022 Camptocamp SA
|
# Copyright 2020-2022 Camptocamp SA
|
||||||
# Copyright 2023 ACSONE SA/NV
|
# Copyright 2023 ACSONE SA/NV
|
||||||
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models
|
from odoo import models
|
||||||
|
|
||||||
|
|
||||||
class StockMove(models.Model):
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = "product.product"
|
||||||
|
|
||||||
_inherit = "stock.move"
|
def _get_volume_for_qty(self, qty, from_uom=None):
|
||||||
|
|
||||||
def _get_volume_for_qty(self, qty):
|
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
product = self.product_id
|
if not self.packaging_ids.filtered("volume"):
|
||||||
if not product.packaging_ids.filtered("volume"):
|
return super()._get_volume_for_qty(qty, from_uom)
|
||||||
return super()._get_volume_for_qty(qty=qty)
|
qty = from_uom and from_uom._compute_quantity(qty, self.uom_id) or qty
|
||||||
packagings_with_volume = product.with_context(
|
packagings_with_volume = self.with_context(
|
||||||
_packaging_filter=lambda p: p.volume
|
_packaging_filter=lambda p: p.volume
|
||||||
).product_qty_by_packaging(qty)
|
).product_qty_by_packaging(qty)
|
||||||
volume = 0
|
volume = 0
|
||||||
for packaging_info in packagings_with_volume:
|
for packaging_info in packagings_with_volume:
|
||||||
if packaging_info.get("is_unit"):
|
if packaging_info.get("is_unit"):
|
||||||
pack_volume = product.volume
|
pack_volume = self.volume
|
||||||
else:
|
else:
|
||||||
packaging = self.env["product.packaging"].browse(packaging_info["id"])
|
packaging = self.env["product.packaging"].browse(packaging_info["id"])
|
||||||
pack_volume = packaging.volume
|
pack_volume = packaging.volume
|
||||||
@@ -52,7 +52,7 @@ class TestStockMoveVolume(SavepointCase):
|
|||||||
move = self.env["stock.move"].new(
|
move = self.env["stock.move"].new(
|
||||||
{"product_id": self.product, "product_uom_qty": 16}
|
{"product_id": self.product, "product_uom_qty": 16}
|
||||||
)
|
)
|
||||||
self.assertEqual(move._get_volume_for_qty(16), 2400)
|
self.assertEqual(move.product_id._get_volume_for_qty(16), 2400)
|
||||||
|
|
||||||
def test_move_volume_package_with_dimension(self):
|
def test_move_volume_package_with_dimension(self):
|
||||||
"""
|
"""
|
||||||
@@ -88,4 +88,4 @@ class TestStockMoveVolume(SavepointCase):
|
|||||||
{"product_id": self.product, "product_uom_qty": 16}
|
{"product_id": self.product, "product_uom_qty": 16}
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(move._get_volume_for_qty(16), 153)
|
self.assertEqual(move.product_id._get_volume_for_qty(16), 153)
|
||||||
|
|||||||
Reference in New Issue
Block a user