Do not rely on unique link between request and purchase or sale lines

The purchase request can be grouped into a single purchase lines.
And nothing prevent a custom module to merge request between different sale lines.

issue9075
review315271002
This commit is contained in:
Cédric Krier
2020-04-23 21:39:31 +02:00
parent 5b4359ae43
commit 220ceb03ed
+14 -11
View File
@@ -507,26 +507,29 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView):
requests += PurchaseRequest.search([
('purchase_line', 'in', list(sub_lines)),
])
pline2request = {r.purchase_line: r for r in requests}
pline2requests = defaultdict(list)
for request in requests:
pline2requests[request.purchase_line].append(request)
sale_lines = SaleLine.search([
('purchase_request', 'in', [r.id for r in requests]),
])
request2sline = {sl.purchase_request: sl for sl in sale_lines}
request2slines = defaultdict(list)
for sale_line in sale_lines:
request2slines[sale_line.purchase_request].append(sale_line)
to_save = []
for shipment in shipments:
for move in shipment.supplier_moves:
if not move.origin:
continue
sale_line = request2sline.get(pline2request.get(move.origin))
if not sale_line:
continue
for move in sale_line.moves:
if (move.state not in ('cancel', 'done')
and not move.shipment
and move.from_location.type == 'drop'):
move.shipment = shipment
to_save.append(move)
for request in pline2requests[move.origin]:
for sale_line in request2slines[request]:
for move in sale_line.moves:
if (move.state not in ('cancel', 'done')
and not move.shipment
and move.from_location.type == 'drop'):
move.shipment = shipment
to_save.append(move)
Move.save(to_save)
cls._synchronize_moves(shipments)