mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
161 lines
6.7 KiB
Python
161 lines
6.7 KiB
Python
# Copyright 2019 Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
from .common import VerticalLiftCase
|
|
|
|
|
|
class TestPut(VerticalLiftCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.picking_in = cls.env.ref(
|
|
"stock_vertical_lift.stock_picking_in_demo_vertical_lift_1"
|
|
)
|
|
cls.picking_in.action_confirm()
|
|
cls.in_move_line = cls.picking_in.move_line_ids
|
|
cls.in_move_line.location_dest_id = cls.shuttle.location_id
|
|
|
|
def test_put_action_open_screen(self):
|
|
self.shuttle.switch_put()
|
|
action = self.shuttle.action_open_screen()
|
|
operation = self.shuttle._operation_for_mode()
|
|
self.assertEqual(action["type"], "ir.actions.act_window")
|
|
self.assertEqual(action["res_model"], "vertical.lift.operation.put")
|
|
self.assertEqual(action["res_id"], operation.id)
|
|
|
|
def test_switch_put(self):
|
|
self.shuttle.switch_put()
|
|
self.assertEqual(self.shuttle.mode, "put")
|
|
self.assertEqual(
|
|
self.shuttle._operation_for_mode().current_move_line_id,
|
|
self.env["stock.move.line"].browse(),
|
|
)
|
|
|
|
def test_put_count_move_lines(self):
|
|
# If stock_picking_cancel_confirm is installed, we need to explicitly
|
|
# confirm the cancellation.
|
|
try:
|
|
self.picking_in.cancel_confirm = True
|
|
except AttributeError:
|
|
pass
|
|
self.picking_in.action_cancel()
|
|
put1 = self._create_simple_picking_in(
|
|
self.product_socks, 10, self.location_1a_x1y1
|
|
)
|
|
put1.action_confirm()
|
|
put2 = self._create_simple_picking_in(
|
|
self.product_recovery, 10, self.vertical_lift_loc
|
|
)
|
|
put2.action_confirm()
|
|
put3 = self._create_simple_picking_in(
|
|
self.product_recovery, 10, self.vertical_lift_loc
|
|
)
|
|
put3.action_confirm()
|
|
operation = self._open_screen("put")
|
|
shuttle2 = self.env.ref(
|
|
"stock_vertical_lift.stock_vertical_lift_demo_shuttle_2"
|
|
)
|
|
operation2 = self._open_screen("put", shuttle=shuttle2)
|
|
|
|
# we don't really care about the "number_of_ops" for the
|
|
# put-away, as the move lines are supposed to have the whole
|
|
# whole shuttle view as destination
|
|
self.assertEqual(operation.number_of_ops, 1)
|
|
self.assertEqual(operation.number_of_ops_all, 3)
|
|
self.assertEqual(operation2.number_of_ops, 0)
|
|
self.assertEqual(operation2.number_of_ops_all, 3)
|
|
|
|
def test_transition_start(self):
|
|
operation = self._open_screen("put")
|
|
# we begin with an empty screen, user has to scan a package, product,
|
|
# or lot
|
|
self.assertEqual(operation.state, "scan_source")
|
|
|
|
def test_transition_scan_source_to_scan_tray_type(self):
|
|
operation = self._open_screen("put")
|
|
self.assertEqual(operation.state, "scan_source")
|
|
# wrong barcode, nothing happens
|
|
operation.on_barcode_scanned("foo")
|
|
self.assertEqual(operation.state, "scan_source")
|
|
# product scanned, move to next step
|
|
operation.on_barcode_scanned(self.product_socks.barcode)
|
|
self.assertEqual(operation.state, "scan_tray_type")
|
|
self.assertEqual(operation.current_move_line_id, self.in_move_line)
|
|
|
|
def test_transition_scan_tray_type_to_save(self):
|
|
operation = self._open_screen("put")
|
|
# assume we already scanned the product
|
|
operation.state = "scan_tray_type"
|
|
operation.current_move_line_id = self.in_move_line
|
|
# wrong barcode, nothing happens
|
|
operation.on_barcode_scanned("foo")
|
|
# tray type scanned, move to next step
|
|
operation.on_barcode_scanned(self.location_1a.tray_type_id.code)
|
|
self.assertEqual(operation.state, "save")
|
|
# a cell has been set
|
|
self.assertTrue(
|
|
self.in_move_line.location_dest_id in self.location_1a.child_ids
|
|
)
|
|
|
|
def test_change_tray_type_on_save(self):
|
|
operation = self._open_screen("put")
|
|
move_line = self.in_move_line
|
|
# assume we already scanned the product and the tray type
|
|
# and the assigned location was location_1a_x1y1
|
|
operation.current_move_line_id = move_line
|
|
move_line.location_dest_id = self.location_1a_x1y1
|
|
operation.state = "save"
|
|
# we want to use another tray with a different type though,
|
|
# so we scan again
|
|
operation.on_barcode_scanned(self.location_1b.tray_type_id.code)
|
|
self.assertTrue(
|
|
self.in_move_line.location_dest_id
|
|
in self.shuttle.location_id.child_ids.child_ids
|
|
)
|
|
# we are still in save
|
|
self.assertEqual(operation.state, "save")
|
|
# a cell has been set in the other tray
|
|
self.assertTrue(move_line.location_dest_id in self.location_1b.child_ids)
|
|
|
|
def test_transition_scan_tray_type_no_empty_cell(self):
|
|
operation = self._open_screen("put")
|
|
# assume we already scanned the product
|
|
operation.state = "scan_tray_type"
|
|
operation.current_move_line_id = self.in_move_line
|
|
# create a tray type without location, which is the same as if all the
|
|
# locations of a tray type were full
|
|
new_tray_type = self.env["stock.location.tray.type"].create(
|
|
{"name": "new tray type", "code": "test", "rows": 1, "cols": 1}
|
|
)
|
|
operation.on_barcode_scanned(new_tray_type.code)
|
|
# should stay the same state
|
|
self.assertEqual(operation.state, "scan_tray_type")
|
|
# destination not changed
|
|
self.assertEqual(self.in_move_line.location_dest_id, self.shuttle.location_id)
|
|
|
|
def test_transition_save(self):
|
|
operation = self._open_screen("put")
|
|
# first steps of the workflow are done
|
|
operation.current_move_line_id = self.in_move_line
|
|
operation.current_move_line_id.location_dest_id = self.location_1a_x1y1
|
|
operation.state = "save"
|
|
qty_to_process = self.in_move_line.product_qty
|
|
operation.button_save()
|
|
self.assertEqual(self.in_move_line.state, "done")
|
|
self.assertEqual(self.in_move_line.qty_done, qty_to_process)
|
|
|
|
def test_transition_button_release(self):
|
|
operation = self._open_screen("put")
|
|
move_line = self.in_move_line
|
|
# first steps of the workflow are done
|
|
operation.current_move_line_id = move_line
|
|
operation.current_move_line_id.location_dest_id = self.location_1a_x1y1
|
|
# 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()
|
|
|
|
operation = self._open_screen("put")
|
|
operation.button_release()
|
|
self.assertEqual(operation.state, "scan_source")
|
|
self.assertFalse(operation.current_move_line_id)
|