From c4222369a0409e95070e44fed0722fc2daea6c61 Mon Sep 17 00:00:00 2001 From: Bertrand Chenal Date: Mon, 6 Oct 2008 12:19:50 +0200 Subject: [PATCH] Add assing_try and pick_product on product class and use it in customer packing --- packing.py | 105 +---------------------------------------------------- product.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 103 deletions(-) diff --git a/packing.py b/packing.py index dd1bee6510..e6bdec2e6d 100644 --- a/packing.py +++ b/packing.py @@ -589,27 +589,6 @@ class PackingOut(OSV): return super(PackingOut, self).create(cursor, user, values, context=context) - def pick_product(self, cursor, user, needed_qty, location_quantities, - move=None, location_index=None, context=None): - """ - Pick the product across the location. Naive (fast) - implementation. Product is a browse record and location_index - is the index of the browse record of all the locations. - """ - to_pick = [] - for location, available_qty in location_quantities.iteritems(): - if needed_qty <= available_qty: - to_pick.append((location, needed_qty)) - return to_pick - else: - to_pick.append((location, available_qty)) - needed_qty -= available_qty - # Force assignation for consumables: - if move.product.type == "consumable": - to_pick.append((move.from_location.id, needed_qty)) - return to_pick - return None - def _location_amount(self, cursor, user, target_uom, qty_uom, uom_index, context=None): """ @@ -626,90 +605,10 @@ class PackingOut(OSV): def assign_try(self, cursor, user, packing_id, context=None): - location_obj = self.pool.get('stock.location') - move_obj = self.pool.get('stock.move') product_obj = self.pool.get('product.product') - uom_obj = self.pool.get('product.uom') - - if context is None: - context = {} - - cursor.execute('LOCK TABLE stock_move') - packing = self.browse(cursor, user, packing_id, context=context) - parent_to_locations = {} - location_ids = [] - inventory_moves = [] - - location_index = {} - # Fetch child_of for each location - for move in packing.inventory_moves: - if move.state != 'draft': - continue - inventory_moves.append(move) - location_index[move.from_location.id] = move.from_location - if move.from_location.id in parent_to_locations: - continue - child_ids = location_obj.search(cursor, user, [ - ('parent', 'child_of', [move.from_location.id]), - ], context=context) - parent_to_locations[move.from_location.id] = child_ids - location_ids.append(move.from_location.id) - - pbl = product_obj.products_by_location(cursor, user, - location_ids=location_ids, - product_ids=[move.product.id for move in inventory_moves], - context=context) - - success = True - for move in inventory_moves: - locations = parent_to_locations[move.from_location.id] - location_qties = {} - for location in locations: - if (location, move.product.id) in pbl: - location_qties[location] = uom_obj.compute_qty( - cursor, user, move.product.default_uom, - pbl[(location, move.product.id)], move.uom, - context=context) - - to_pick = self.pick_product( - cursor, user, move.quantity, location_qties, - move=move, location_index=location_index, - context=context) - if to_pick is None: - success = False - continue - - first = True - for location, qty in to_pick: - to_location = packing.warehouse.output_location.id - values = { - 'from_location': location, - 'to_location': to_location, - 'product': move.product.id, - 'uom': move.uom.id, - 'quantity': qty, - 'packing_out': packing.id, - 'state': 'assigned', - 'company': move.company.id, - } - if first: - move_obj.write(cursor, user, move.id, values, - context=context) - first = False - else: - move_obj.create(cursor, user, values, context=context) - - qty_defaut_uom = uom_obj.compute_qty( - cursor, user, move.uom, qty, move.product.default_uom, - context=context) - - pbl[(location, move.product.id)] = \ - pbl.get((location, move.product.id), 0.0) + qty_defaut_uom - pbl[(packing.warehouse.output_location.id, move.product.id)]= \ - pbl.get((to_location, move.product.id), 0.0) - qty_defaut_uom - - return success + return product_obj.assign_try( + cursor, user, packing.inventory_moves, context=context) def assign_force(self, cursor, user, packing_id, context=None): packing = self.browse(cursor, user, packing_id, context=context) diff --git a/product.py b/product.py index 1686d9d39d..eed1504824 100644 --- a/product.py +++ b/product.py @@ -321,6 +321,97 @@ class Product(OSV): context=context) return value + " (" + ",".join([l.name for l in locations]) + ")" + def pick_product(self, cursor, user, move, location_quantities, context=None): + """ + Pick the product across the location. Naive (fast) + implementation. + :param move is a browse record with the product and the quantity to pick. + : param location_quantities a list of tupel (location, available_qty) + where location is a browse record. + """ + to_pick = [] + needed_qty = move.quantity + for location, available_qty in location_quantities.iteritems(): + if needed_qty <= available_qty: + to_pick.append((location, needed_qty)) + return to_pick + else: + to_pick.append((location, available_qty)) + needed_qty -= available_qty + # Force assignation for consumables: + if move.product.type == "consumable": + to_pick.append((move.from_location.id, needed_qty)) + return to_pick + return None + + def assign_try(self, cursor, user, moves, context=None): + move_obj = self.pool.get('stock.move') + product_obj = self.pool.get('product.product') + uom_obj = self.pool.get('product.uom') + + if context is None: + context = {} + + cursor.execute('LOCK TABLE stock_move') + + local_ctx = context and context.copy() or {} + local_ctx['stock_date_end'] = datetime.date.today() + pbl = product_obj.products_by_location(cursor, user, + location_ids=[m.from_location.id for m in moves], + product_ids=[m.product.id for m in moves], + context=local_ctx) + + success = True + for move in moves: + location_qties = {} + childs = [m for m in move.from_location.childs] + [move.from_location] + for location in childs: + if (location.id, move.product.id) in pbl: + location_qties[location] = uom_obj.compute_qty( + cursor, user, move.product.default_uom, + pbl[(location.id, move.product.id)], move.uom, + context=context) + + to_pick = self.pick_product( + cursor, user, move, location_qties, context=context) + + if to_pick is None: + success = False + continue + first = True + for from_location, qty in to_pick: + to_location = move.to_location + values = { + 'from_location': from_location.id, + 'to_location': to_location.id, + 'product': move.product.id, + 'uom': move.uom.id, + 'quantity': qty, + 'state': 'assigned', + 'company': move.company.id, + } + for field in ('packing_out', 'packing_in', 'packing_internal'): + if move[field]: + values.update({field: move[field].id}) + break + + if first: + move_obj.write(cursor, user, move.id, values, + context=context) + first = False + else: + move_obj.create(cursor, user, values, context=context) + + qty_defaut_uom = uom_obj.compute_qty( + cursor, user, move.uom, qty, move.product.default_uom, + context=context) + + pbl[(from_location.id, move.product.id)] = \ + pbl.get((location, move.product.id), 0.0) + qty_defaut_uom + pbl[(to_location.id, move.product.id)]= \ + pbl.get((to_location.id, move.product.id), 0.0) - qty_defaut_uom + return success + Product()