mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
When the shuttle screen propose a tray based on a tray type and we are in the 'save' step, where we are supposed to physically putaway the good and save, we should still be able to change the tray type to fetch another tray.
177 lines
6.9 KiB
Python
177 lines
6.9 KiB
Python
# Copyright 2019 Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import _
|
|
|
|
from odoo.addons.stock_location_tray.tests import common
|
|
|
|
|
|
class VerticalLiftCase(common.LocationTrayTypeCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.shuttle = cls.env.ref(
|
|
"stock_vertical_lift.stock_vertical_lift_demo_shuttle_1"
|
|
)
|
|
cls.product_socks = cls.env.ref("stock_vertical_lift.product_running_socks")
|
|
cls.product_recovery = cls.env.ref("stock_vertical_lift.product_recovery_socks")
|
|
cls.vertical_lift_loc = cls.env.ref(
|
|
"stock_vertical_lift.stock_location_vertical_lift"
|
|
)
|
|
cls.stock_location = cls.env.ref("stock.stock_location_stock")
|
|
cls.customers_location = cls.env.ref("stock.stock_location_customers")
|
|
cls.location_1a = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1a"
|
|
)
|
|
cls.location_1a_x1y1 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1a_x1y1"
|
|
)
|
|
cls.location_1a_x2y1 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1a_x2y1"
|
|
)
|
|
cls.location_1a_x3y1 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1a_x3y1"
|
|
)
|
|
cls.location_1a_x1y2 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1a_x1y2"
|
|
)
|
|
cls.location_1b = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1b"
|
|
)
|
|
cls.location_1b_x1y1 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1b_x1y1"
|
|
)
|
|
cls.location_1b_x1y2 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_1b_x1y2"
|
|
)
|
|
cls.location_2a = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_2a"
|
|
)
|
|
cls.location_2a_x1y1 = cls.env.ref(
|
|
"stock_vertical_lift." "stock_location_vertical_lift_demo_tray_2a_x1y1"
|
|
)
|
|
|
|
@classmethod
|
|
def _update_qty_in_location(
|
|
cls, location, product, quantity, package=None, lot=None
|
|
):
|
|
quants = cls.env["stock.quant"]._gather(
|
|
product, location, lot_id=lot, package_id=package, strict=True
|
|
)
|
|
# this method adds the quantity to the current quantity, so remove it
|
|
quantity -= sum(quants.mapped("quantity"))
|
|
cls.env["stock.quant"]._update_available_quantity(
|
|
product, location, quantity, package_id=package, lot_id=lot
|
|
)
|
|
|
|
def _open_screen(self, mode, shuttle=None):
|
|
getattr(shuttle or self.shuttle, "switch_{}".format(mode))()
|
|
# opening the screen can do some initialization for the steps
|
|
action = (shuttle or self.shuttle).action_open_screen()
|
|
return self.env[action["res_model"]].browse(action["res_id"])
|
|
|
|
@classmethod
|
|
def _create_simple_picking_out(cls, product, quantity):
|
|
stock_loc = cls.env.ref("stock.stock_location_stock")
|
|
customer_loc = cls.env.ref("stock.stock_location_customers")
|
|
picking_type = cls.env.ref("stock.picking_type_out")
|
|
partner = cls.env.ref("base.res_partner_1")
|
|
return cls.env["stock.picking"].create(
|
|
{
|
|
"picking_type_id": picking_type.id,
|
|
"partner_id": partner.id,
|
|
"location_id": stock_loc.id,
|
|
"location_dest_id": customer_loc.id,
|
|
"move_lines": [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"name": product.name,
|
|
"product_id": product.id,
|
|
"product_uom": product.uom_id.id,
|
|
"product_uom_qty": quantity,
|
|
"picking_type_id": picking_type.id,
|
|
"location_id": stock_loc.id,
|
|
"location_dest_id": customer_loc.id,
|
|
},
|
|
)
|
|
],
|
|
}
|
|
)
|
|
|
|
@classmethod
|
|
def _create_simple_picking_in(cls, product, quantity, dest_location):
|
|
supplier_loc = cls.env.ref("stock.stock_location_suppliers")
|
|
picking_type = cls.env.ref("stock.picking_type_in")
|
|
partner = cls.env.ref("base.res_partner_1")
|
|
return cls.env["stock.picking"].create(
|
|
{
|
|
"picking_type_id": picking_type.id,
|
|
"partner_id": partner.id,
|
|
"location_id": supplier_loc.id,
|
|
"location_dest_id": dest_location.id,
|
|
"move_lines": [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"name": product.name,
|
|
"product_id": product.id,
|
|
"product_uom": product.uom_id.id,
|
|
"product_uom_qty": quantity,
|
|
"picking_type_id": picking_type.id,
|
|
"location_id": supplier_loc.id,
|
|
"location_dest_id": dest_location.id,
|
|
},
|
|
)
|
|
],
|
|
}
|
|
)
|
|
|
|
@classmethod
|
|
def _create_inventory(cls, products):
|
|
"""Create a draft inventory
|
|
|
|
Products is a list of tuples (bin location, product).
|
|
"""
|
|
values = {
|
|
"name": "Test Inventory",
|
|
"line_ids": [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"product_id": product.id,
|
|
"product_uom_id": product.uom_id.id,
|
|
"location_id": location.id,
|
|
},
|
|
)
|
|
for location, product in products
|
|
],
|
|
}
|
|
inventory = cls.env["stock.inventory"].create(values)
|
|
inventory.action_start()
|
|
return inventory
|
|
|
|
def _test_button_release(self, move_line, expected_state):
|
|
# for the test, we'll consider our last line has been delivered
|
|
move_line.qty_done = move_line.product_qty
|
|
move_line.move_id._action_done()
|
|
# release, no further operation in queue
|
|
operation = self.shuttle._operation_for_mode()
|
|
# the release button can be used only in the state... release
|
|
operation.state = "release"
|
|
result = operation.button_release()
|
|
self.assertEqual(operation.state, expected_state)
|
|
self.assertFalse(operation.current_move_line_id)
|
|
expected_result = {
|
|
"effect": {
|
|
"fadeout": "slow",
|
|
"message": _("Congrats, you cleared the queue!"),
|
|
"img_url": "/web/static/src/img/smile.svg",
|
|
"type": "rainbow_man",
|
|
}
|
|
}
|
|
self.assertEqual(result, expected_result)
|