Skip to content

Commit 53747e7

Browse files
committed
stock_reception_screen_measuring_device: measure smaller packages
When goods are received, triggers measurements also for smaller packagings that weren't ordered or received. This behavior is not triggered when received packagings are not the same as ordered packagings.
1 parent c114af4 commit 53747e7

File tree

6 files changed

+450
-14
lines changed

6 files changed

+450
-14
lines changed

Diff for: stock_reception_screen_measuring_device/models/stock_reception_screen.py

+71-12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ class StockReceptionScreen(models.Model):
1818
store=True,
1919
help="Indicates if the package have any measurement missing.",
2020
)
21+
smaller_package_has_missing_dimensions = fields.Boolean(
22+
"Smaller Package Requires Measures?",
23+
compute="_compute_smaller_package_has_missing_dimensions",
24+
store=True,
25+
help="Indicates if any smaller package have any measurement missing.",
26+
)
2127
display_package_dimensions = fields.Char(
2228
string="Dimensions (lxhxw)",
2329
compute="_compute_package_dimensions",
@@ -30,13 +36,18 @@ class StockReceptionScreen(models.Model):
3036
store=True,
3137
)
3238

33-
@api.depends("product_packaging_id", "product_packaging_id.measuring_device_id")
39+
@api.depends(
40+
"current_move_product_id.packaging_ids.measuring_device_id",
41+
)
3442
def _compute_scan_requested(self):
3543
for record in self:
36-
record.scan_requested = (
37-
record.product_packaging_id
38-
and record.product_packaging_id.measuring_device_id
39-
)
44+
# TODO
45+
all_product_packagings = record.current_move_product_id.packaging_ids
46+
record.scan_requested = False
47+
for packaging in all_product_packagings:
48+
if packaging.measuring_device_id:
49+
record.scan_requested = True
50+
break
4051

4152
@api.depends(
4253
"product_packaging_id.packaging_length",
@@ -54,6 +65,20 @@ def _compute_package_dimensions(self):
5465
else:
5566
record.display_package_dimensions = False
5667

68+
@api.depends(
69+
"product_packaging_id",
70+
"product_packaging_id.qty",
71+
"current_move_product_id.packaging_ids.max_weight",
72+
"current_move_product_id.packaging_ids.packaging_length",
73+
"current_move_product_id.packaging_ids.width",
74+
"current_move_product_id.packaging_ids.height",
75+
)
76+
def _compute_smaller_package_has_missing_dimensions(self):
77+
for record in self:
78+
record.smaller_package_has_missing_dimensions = bool(
79+
record._get_smaller_package_without_dimensions()
80+
)
81+
5782
@api.depends(
5883
"product_packaging_id.max_weight",
5984
"product_packaging_id.packaging_length",
@@ -71,29 +96,63 @@ def _compute_package_has_missing_dimensions(self):
7196
else:
7297
record.package_has_missing_dimensions = False
7398

74-
def measure_current_packaging(self):
75-
self.ensure_one()
99+
@api.model
100+
def _measure_packaging(self, packaging):
76101
device = self.env["measuring.device"].search(
77102
[("is_default", "=", True)], limit=1
78103
)
79104
if not device:
80105
error_msg = _("No default device set, please configure one.")
81106
_logger.error(error_msg)
82107
self._notify(error_msg)
83-
return UserError(error_msg)
108+
raise UserError(error_msg)
84109
if device._is_being_used():
85110
error_msg = _("Measurement machine already in use.")
86111
_logger.error(error_msg)
87112
self._notify(error_msg)
88-
return UserError(error_msg)
113+
raise UserError(error_msg)
89114

90-
self.product_packaging_id._measuring_device_assign(device)
115+
packaging._measuring_device_assign(device)
91116
return True
92117

118+
def measure_current_packaging(self):
119+
self.ensure_one()
120+
return self._measure_packaging(self.product_packaging_id)
121+
122+
def _get_smaller_package_without_dimensions_domain(self):
123+
self.ensure_one()
124+
# TODO ordered package
125+
return [
126+
("product_id", "=", self.current_move_product_id.id),
127+
("qty", "<", self.product_packaging_id.qty),
128+
"|",
129+
"|",
130+
"|",
131+
("packaging_length", "=", False),
132+
("width", "=", False),
133+
("height", "=", False),
134+
("max_weight", "=", False),
135+
]
136+
137+
def _get_smaller_package_without_dimensions(self):
138+
self.ensure_one()
139+
domain = self._get_smaller_package_without_dimensions_domain()
140+
return self.env["product.packaging"].search(domain, order="qty desc", limit=1)
141+
142+
def measure_smaller_packaging(self):
143+
self.ensure_one()
144+
pack_without_dimensions = self._get_smaller_package_without_dimensions()
145+
if not pack_without_dimensions:
146+
error_msg = _("No available packaging without measurements.")
147+
raise UserError(error_msg)
148+
return self._measure_packaging(pack_without_dimensions)
149+
93150
def cancel_measure_current_packaging(self):
94151
self.ensure_one()
95-
self.product_packaging_id._measuring_device_release()
96-
return True
152+
assigned_packaging = self.current_move_product_id.packaging_ids.filtered(
153+
lambda p: p.measuring_device_id
154+
)
155+
assigned_packaging._measuring_device_release()
97156

98157
def _notify(self, message):
99158
"""Show a gentle notification on the wizard"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_reception_screen_measurement
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
3+
4+
from odoo.addons.component.core import Component
5+
6+
7+
class FakeDevice(Component):
8+
_name = "device.component.fake"
9+
_inherit = "measuring.device.base"
10+
_usage = "fake"
11+
12+
def post_update_packaging_measures(self, measures, packaging, wizard_line):
13+
# Unassign measuring device when measuring is done
14+
packaging._measuring_device_release()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
3+
4+
from odoo import fields, models
5+
6+
7+
class FakeMeasuringDevice(models.Model):
8+
_inherit = "measuring.device"
9+
10+
device_type = fields.Selection(selection_add=[("fake", "FAKE")])
11+
12+
def mocked_measure(self, measurements):
13+
self.ensure_one()
14+
self._update_packaging_measures(measurements)

0 commit comments

Comments
 (0)