Skip to content

Commit 6c59111

Browse files
[IMP] shopfloor_reception_docks: add scan document by dock
1 parent 1870c45 commit 6c59111

8 files changed

Lines changed: 154 additions & 0 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import actions
2+
from . import services
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
from . import data
22
from . import schema
3+
from . import search
4+
from . import message
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Copyright 2026 ACSONE SA/NV
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
from odoo import _
4+
5+
from odoo.addons.component.core import Component
6+
7+
8+
class MessageAction(Component):
9+
_inherit = "shopfloor.message.action"
10+
11+
def dock_no_assigned_picking(self, dock):
12+
return {
13+
"message_type": "error",
14+
"body": _(
15+
"No assigned transfers found for Dock: '%(dock_name)s'",
16+
dock_name=dock.name,
17+
),
18+
}
19+
20+
def dock_pickings_filtered(self, dock):
21+
return {
22+
"message_type": "info",
23+
"body": _(
24+
"Transfers filtered by Dock: '%(dock_name)s'",
25+
dock_name=dock.name,
26+
),
27+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright 2026 ACSONE SA/NV
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
3+
from odoo.addons.component.core import Component
4+
5+
6+
class SearchAction(Component):
7+
_inherit = "shopfloor.search.action"
8+
9+
@property
10+
def _barcode_type_handler(self):
11+
res = super(SearchAction, self)._barcode_type_handler
12+
res["dock"] = self.dock_from_scan
13+
return res
14+
15+
def dock_from_scan(self, barcode):
16+
model = self.env["stock.dock"]
17+
if not barcode:
18+
return model.browse()
19+
return model.search([("barcode", "=", barcode)], limit=1)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import reception
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright 2026 ACSONE SA/NV
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
3+
from odoo.addons.component.core import Component
4+
5+
6+
class Reception(Component):
7+
_inherit = "shopfloor.reception"
8+
9+
def _scan_document__get_handlers_by_type(self):
10+
res = super()._scan_document__get_handlers_by_type()
11+
res["dock"] = self._scan_document__by_dock
12+
return res
13+
14+
def _scan_document__by_dock(self, dock, barcode):
15+
if not dock:
16+
return None
17+
18+
pickings = self.env["stock.picking"].search(
19+
[
20+
*self._domain_stock_picking(),
21+
("dock_ids", "in", dock.ids),
22+
],
23+
order=self._order_stock_picking(),
24+
)
25+
26+
if not pickings:
27+
return self._response_for_select_document(
28+
message=self.msg_store.dock_no_assigned_picking(dock)
29+
)
30+
31+
if len(pickings) == 1:
32+
return self._select_picking(pickings)
33+
34+
return self._response_for_select_document(
35+
pickings=pickings, message=self.msg_store.dock_pickings_filtered(dock)
36+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_scan_document
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Copyright 2026 ACSONE SA/NV
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from odoo import Command
5+
6+
from odoo.addons.shopfloor_reception.tests.common import CommonCase
7+
8+
9+
class TestScanDocument(CommonCase):
10+
@classmethod
11+
def setUpClass(cls):
12+
super().setUpClass()
13+
cls.dock_0, cls.dock_1, cls.dock_2 = (
14+
cls.env["stock.dock"]
15+
.sudo()
16+
.create(
17+
[
18+
{"name": "Dock 00", "barcode": "TEST-DOCK00"},
19+
{"name": "Dock 01", "barcode": "TEST-DOCK01"},
20+
{"name": "Dock 02", "barcode": "TEST-DOCK02"},
21+
]
22+
)
23+
)
24+
25+
cls.pick_1 = cls._create_picking()
26+
cls.pick_2_a = cls._create_picking()
27+
cls.pick_2_b = cls._create_picking()
28+
29+
cls.pick_1.dock_ids = [Command.set(cls.dock_1.ids)]
30+
cls.pick_2_a.dock_ids = [Command.set(cls.dock_2.ids)]
31+
cls.pick_2_b.dock_ids = [Command.set(cls.dock_2.ids)]
32+
33+
def test_scan_document_by_dock_no_picking(self):
34+
response = self.service.dispatch(
35+
"scan_document", params={"barcode": self.dock_0.barcode}
36+
)
37+
self.assert_response(
38+
response,
39+
next_state="select_document",
40+
data={
41+
"pickings": self._data_for_pickings(
42+
self.pick_1 | self.pick_2_a | self.pick_2_b
43+
)
44+
},
45+
message=self.msg_store.dock_no_assigned_picking(self.dock_0),
46+
)
47+
48+
def test_scan_document_by_dock_one_picking(self):
49+
response = self.service.dispatch(
50+
"scan_document", params={"barcode": self.dock_1.barcode}
51+
)
52+
self.assert_response(
53+
response,
54+
next_state="select_move",
55+
data={"picking": self._data_for_picking_with_moves(self.pick_1)},
56+
)
57+
58+
def test_scan_document_by_dock_multiple_pickings(self):
59+
response = self.service.dispatch(
60+
"scan_document", params={"barcode": self.dock_2.barcode}
61+
)
62+
self.assert_response(
63+
response,
64+
next_state="select_document",
65+
message=self.msg_store.dock_pickings_filtered(self.dock_2),
66+
data={"pickings": self._data_for_pickings(self.pick_2_a | self.pick_2_b)},
67+
)

0 commit comments

Comments
 (0)