mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
If there is two move lines for the same product in the vertical lift (stored in2 differents trays for instance), the pick scenario was failing when the user was processing the first line. To circumvent this, instead of validating directly the move, we put the line in its own stock move, then we put the stock move in its own transfer and validate this one. Methods used to do that have been copied from the `shopfloor` module, they probably deserves their own module as they are quite generic.
178 lines
7.0 KiB
Python
178 lines
7.0 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_lines, expected_state):
|
|
# for the test, we'll consider all the lines has been delivered
|
|
for move_line in move_lines:
|
|
move_line.qty_done = move_line.product_qty
|
|
move_lines.picking_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)
|