mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
192 lines
6.8 KiB
Python
192 lines
6.8 KiB
Python
# 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).
|
|
|
|
from odoo.tests.common import SavepointCase
|
|
|
|
|
|
class TestStockPickingVolume(SavepointCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
|
cls.wh = cls.env["stock.warehouse"].create(
|
|
{
|
|
"name": "Base Warehouse",
|
|
"reception_steps": "one_step",
|
|
"delivery_steps": "ship_only",
|
|
"code": "BWH",
|
|
}
|
|
)
|
|
cls.loc_stock = cls.wh.lot_stock_id
|
|
cls.loc_customer = cls.env.ref("stock.stock_location_customers")
|
|
cls.product = cls._create_product("Unittest P1", 10.0, 5.0, 3.0)
|
|
cls.picking_type_out = cls.env.ref("stock.picking_type_out")
|
|
cls.picking = cls.env["stock.picking"].create(
|
|
{
|
|
"picking_type_id": cls.picking_type_out.id,
|
|
"location_id": cls.loc_stock.id,
|
|
"location_dest_id": cls.loc_customer.id,
|
|
"partner_id": cls.env.ref("base.res_partner_1").id,
|
|
"move_lines": [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"name": cls.product.name,
|
|
"product_id": cls.product.id,
|
|
"product_uom": cls.product.uom_id.id,
|
|
"product_uom_qty": 5.0,
|
|
"location_id": cls.loc_stock.id,
|
|
"location_dest_id": cls.loc_customer.id,
|
|
},
|
|
)
|
|
],
|
|
}
|
|
)
|
|
|
|
@classmethod
|
|
def _create_product(cls, name, length, width, height):
|
|
product = cls.env["product.product"].create(
|
|
{
|
|
"name": name,
|
|
"product_length": length,
|
|
"product_width": width,
|
|
"product_height": height,
|
|
"uom_id": cls.env.ref("uom.product_uom_unit").id,
|
|
"dimensional_uom_id": cls.env.ref("uom.product_uom_meter").id,
|
|
"type": "product",
|
|
}
|
|
)
|
|
product.onchange_calculate_volume()
|
|
return product
|
|
|
|
def _set_product_qty(self, product, qty):
|
|
self.env["stock.quant"]._update_available_quantity(product, self.loc_stock, qty)
|
|
|
|
def test_picking_draft_volume(self):
|
|
"""
|
|
Data:
|
|
one picking with one move line with 5 units of product
|
|
Test Case:
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 5 * 10 * 5 * 3 = 750
|
|
The volume is computed from the expected quantity
|
|
"""
|
|
self.assertEqual(self.picking.volume, 750)
|
|
|
|
def test_picking_partially_available_volume(self):
|
|
"""
|
|
Data:
|
|
one picking with one move line with 5 units of product
|
|
Test Case:
|
|
set 1 unit of product as available
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 1 * 10 * 5 * 3 = 150
|
|
The volume is computed from the available quantity
|
|
"""
|
|
self._set_product_qty(self.product, 1)
|
|
self.picking.action_confirm()
|
|
self.picking.action_assign()
|
|
self.picking.invalidate_cache()
|
|
self.assertEqual(self.picking.volume, 150)
|
|
|
|
def test_picking_available_volume(self):
|
|
"""
|
|
Data:
|
|
one picking with one move line with 5 units of product
|
|
Test Case:
|
|
set 5 unit of product as available
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 5 * 10 * 5 * 3 = 750
|
|
The volume is computed from the expected quantity
|
|
"""
|
|
self._set_product_qty(self.product, 5)
|
|
self.picking.action_confirm()
|
|
self.picking.action_assign()
|
|
self.picking.invalidate_cache()
|
|
self.assertEqual(self.picking.volume, 750)
|
|
|
|
def test_picking_done_volume(self):
|
|
"""
|
|
Data:
|
|
one picking with one move line with 5 units of product
|
|
Test Case:
|
|
set 1 unit of product as done
|
|
confirm the picking
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 1 * 10 * 5 * 3 = 150
|
|
The volume is computed from the done quantity
|
|
"""
|
|
self._set_product_qty(self.product, 1)
|
|
self.picking.action_confirm()
|
|
self.picking.action_assign()
|
|
self.picking.move_line_ids.qty_done = 1
|
|
self.picking.button_validate()
|
|
self.assertEqual(self.picking.volume, 150)
|
|
|
|
def test_picking_cancel_volume(self):
|
|
"""
|
|
Data:
|
|
one picking with one move line with 5 units of product
|
|
Test Case:
|
|
set 1 unit of product as done
|
|
confirm the picking
|
|
cancel the picking
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 5 * 10 * 5 * 3 = 750
|
|
The volume is computed from the expected quantity
|
|
"""
|
|
self._set_product_qty(self.product, 1)
|
|
self.picking.action_confirm()
|
|
self.picking.action_assign()
|
|
self.picking.move_line_ids.qty_done = 1
|
|
self.picking.button_validate()
|
|
self.picking.action_cancel()
|
|
self.assertEqual(self.picking.volume, 750)
|
|
|
|
def test_picking_with_canceled_move(self):
|
|
"""
|
|
Data:
|
|
one picking with two move lines with 5 units of product
|
|
Test Case:
|
|
set 5 unit of product as available
|
|
get the volume of the picking
|
|
Expected result:
|
|
volume is 5 * 10 * 5 * 3 = 750
|
|
The volume is computed from the expected quantity
|
|
"""
|
|
product2 = self._create_product("Product2", 10.0, 5.0, 3.0)
|
|
self._set_product_qty(self.product, 5)
|
|
self._set_product_qty(product2, 5)
|
|
self.picking.write(
|
|
{
|
|
"move_lines": [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"name": product2.name,
|
|
"product_id": product2.id,
|
|
"product_uom": product2.uom_id.id,
|
|
"product_uom_qty": 5.0,
|
|
"location_id": self.loc_stock.id,
|
|
"location_dest_id": self.loc_customer.id,
|
|
},
|
|
)
|
|
]
|
|
}
|
|
)
|
|
self.picking.action_confirm()
|
|
self.picking.action_assign()
|
|
self.picking.invalidate_cache()
|
|
self.assertEqual(self.picking.volume, 750 * 2)
|
|
self.picking.move_lines[1]._action_cancel()
|
|
self.picking.invalidate_cache()
|
|
self.assertEqual(self.picking.volume, 750)
|