Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 30 additions & 19 deletions shopfloor/actions/move_line_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ def _sort_key_custom_code_eval_context(self, line):
def _search_move_lines_domain(
self,
locations=None,
picking_type=None,
package=None,
product=None,
lot=None,
pickings=None,
picking_types=None,
packages=None,
products=None,
lots=None,
match_user=False,
picking_ready=True,
# When True, adds the package in the domain even if the package is False
Expand All @@ -84,18 +85,26 @@ def _search_move_lines_domain(
("qty_done", "=", 0),
("state", "in", ("assigned", "partially_available")),
]
picking_types = picking_type if picking_type is not None else self.picking_types
if pickings:
domain += [("picking_id", "in", pickings.ids)]
picking_types = (
picking_types if picking_types is not None else self.picking_types
)
if picking_types:
domain += [("picking_id.picking_type_id", "in", picking_types.ids)]
locations = locations or picking_types.default_location_src_id
if locations:
domain += [("location_id", "child_of", locations.ids)]
if package or package is not None and enforce_empty_package:
domain += [("package_id", "=", package.id if package else False)]
if product:
domain += [("product_id", "=", product.id)]
if lot:
domain += [("lot_id", "=", lot.id)]
if packages or packages is not None and enforce_empty_package:
domain += (
[("package_id", "in", packages.ids)]
if packages
else [("package_id", "=", False)]
)
if products:
domain += [("product_id", "in", products.ids)]
if lots:
domain += [("lot_id", "in", lots.ids)]
if match_user:
# we only want to see the lines assigned to the current user
domain += [
Expand All @@ -112,10 +121,11 @@ def _search_move_lines_domain(
def search_move_lines(
self,
locations=None,
picking_type=None,
package=None,
product=None,
lot=None,
pickings=None,
picking_types=None,
packages=None,
products=None,
lots=None,
order=None,
match_user=False,
sort_keys_func=None,
Expand All @@ -126,10 +136,11 @@ def search_move_lines(
move_lines = self.env["stock.move.line"].search(
self._search_move_lines_domain(
locations,
picking_type,
package,
product,
lot,
pickings,
picking_types,
packages,
products,
lots,
match_user=match_user,
picking_ready=picking_ready,
enforce_empty_package=enforce_empty_package,
Expand Down
2 changes: 1 addition & 1 deletion shopfloor/services/location_content_transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ def scan_location(self, barcode): # noqa: C901
move_lines = self.search_move_line.search_move_lines(
locations=location,
match_user=True,
picking_type=self.env[
picking_types=self.env[
"stock.picking.type"
], # disable filtering on picking types
)
Expand Down
12 changes: 6 additions & 6 deletions shopfloor/services/zone_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ def _counters_for_zone_lines(self, zone_lines):

def _picking_type_zone_lines(self, zone_location, picking_type):
return self.search_move_line.search_move_lines(
zone_location, picking_type=picking_type
locations=zone_location, picking_types=picking_type
)

def _data_for_move_line(
Expand Down Expand Up @@ -437,12 +437,12 @@ def _find_location_move_lines(
):
"""Find lines that potentially need work in given locations."""
return self.search_move_line.search_move_lines(
locations or self.zone_location,
picking_type=picking_type or self.picking_type,
locations=locations or self.zone_location,
picking_types=picking_type or self.picking_type,
order=self.lines_order,
package=package,
product=product,
lot=lot,
packages=package,
products=product,
lots=lot,
match_user=match_user,
enforce_empty_package=enforce_empty_package,
)
Expand Down
62 changes: 16 additions & 46 deletions shopfloor_reception/services/reception.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,6 @@ def _move_line_needs_lot(self, move_line):
move_line.product_id.tracking in ("lot", "serial") and not move_line.lot_id
)

def _move_line_by_product(self, product):
return self.env["stock.move.line"].search(
self._domain_move_line_by_product(product)
)

def _move_line_by_packaging(self, packaging):
return self.env["stock.move.line"].search(
self._domain_move_line_by_packaging(packaging)
)

def _move_line_by_lot(self, lot):
return self.env["stock.move.line"].search(self._domain_move_line_by_lot(lot))

def _scheduled_date_today_domain(self):
domain = []
today_start, today_end = self._get_today_start_end_datetime_utc()
Expand Down Expand Up @@ -136,32 +123,6 @@ def filter_today_scheduled_pickings(self):

# DOMAIN METHODS

def _domain_move_line_by_packaging(self, packaging):
return [
("move_id.picking_id.picking_type_id", "in", self.picking_types.ids),
("move_id.picking_id.state", "=", "assigned"),
("move_id.picking_id.user_id", "in", [False, self.env.uid]),
("package_id.product_packaging_id", "=", packaging.id),
]

def _domain_move_line_by_product(self, product):
return [
("move_id.picking_id.picking_type_id", "in", self.picking_types.ids),
("move_id.picking_id.state", "=", "assigned"),
("move_id.picking_id.user_id", "in", [False, self.env.uid]),
("product_id", "=", product.id),
]

def _domain_move_line_by_lot(self, lot):
return [
("move_id.picking_id.picking_type_id", "in", self.picking_types.ids),
("move_id.picking_id.state", "=", "assigned"),
("move_id.picking_id.user_id", "=", False),
"|",
("lot_id.name", "=", lot),
("lot_name", "=", lot),
]

def _domain_stock_picking(self, today_only=False):
domain = [
("state", "=", "assigned"),
Expand Down Expand Up @@ -215,8 +176,8 @@ def _select_document_from_product(self, product):
- set_lot: a single picking has been found for this packaging
- select_document: A single or no pickings has been found for this packaging
"""
move_lines = self._move_line_by_product(product).filtered(
lambda l: l.picking_id.picking_type_id.id in self.picking_types.ids
move_lines = self.search_move_line.search_move_lines(
products=product, picking_types=self.picking_types, match_user=True
)
pickings = move_lines.move_id.picking_id
if pickings:
Expand All @@ -240,10 +201,11 @@ def _select_document_from_packaging(self, packaging):
- set_lot: a single picking has been found for this packaging
- select_document: A single or no pickings has been found for this packaging
"""
move_lines = self._move_line_by_packaging(packaging).filtered(
lambda l: l.picking_id.picking_type_id.id in self.picking_types.ids
move_lines = self.env["stock.move.line"].search(
self.search_move_line._search_move_lines_domain()
+ [("package_id.product_packaging_id", "=", packaging.id)]
)
pickings = move_lines.move_id.picking_id
pickings = move_lines.picking_id
if pickings:
return self._response_for_select_document(
pickings=pickings,
Expand All @@ -261,7 +223,9 @@ def _select_document_from_lot(self, lot):
- set_lot: a single picking has been found for this packaging
- select_document: A single or no pickings has been found for this packaging
"""
move_lines = self._move_line_by_lot(lot)
move_lines = self.self.search_move_line.search_move_lines(
lots=lot, picking_types=self.picking_types, match_user=True
)
if not move_lines:
return
pickings = move_lines.move_id.picking_id
Expand Down Expand Up @@ -364,7 +328,13 @@ def _order_stock_picking(self):
return "scheduled_date ASC, id ASC"

def _scan_document__by_picking(self, pickings, barcode):
picking_filter_result = pickings
picking_filter_result = self.search_move_line.search_move_lines(
pickings=pickings,
picking_types=self.env[
"stock.picking.type"
], # disable filtering on picking types
).picking_id

reception_pickings = picking_filter_result.filtered(
lambda p: p.picking_type_id.id in self.picking_types.ids
)
Expand Down
14 changes: 14 additions & 0 deletions shopfloor_reception/tests/test_return_scan_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,17 @@ def test_scan_partial_delivered_order(self):
next_state="select_move",
data={"picking": self._data_for_picking_with_moves(return_picking)},
)

def test_scan_picking_respects_move_line_search_additional_domain(self):
pick = self._create_picking()

self.menu.sudo().move_line_search_additional_domain = (
f'[("picking_id.id", "!=", {pick.id})]'
)
response = self.service.dispatch("scan_document", params={"barcode": pick.name})
self.assert_response(
response,
next_state="select_document",
data={"pickings": []},
message=self.msg_store.barcode_not_found(),
)
Loading