diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 8faf759d2c7..c83bcd1acb3 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -737,21 +737,42 @@ class mrp_production(osv.osv):
# we already have more qtys consumed than we need
continue
- qty_remained = 0
- qty_tobe_consumed = qty
+ consumed = 0
+
+ # search for exact quantity
for consume_line in raw_product:
- if consume_line.prodlot_id and consume_line.product_id.id==scheduled.product_id.id:
- if qty_remained:
- qty = qty_remained
- if consume_line.product_qty >= qty:
- consume_line.action_consume(qty, consume_line.location_id.id, context=context)
- break
- else:
- qty_tobe_consumed += consume_line.product_qty
- consume_line.action_consume(qty_tobe_consumed, consume_line.location_id.id, context=context)
- qty_remained = qty - consume_line.product_qty
- else:
+ if consume_line.product_qty == qty:
+ # consume this line
consume_line.action_consume(qty, consume_line.location_id.id, context=context)
+ consumed = qty
+ break
+
+ # using the quick sort algorithm
+ def _sort_quantity(raw_product):
+ if len(raw_product) <= 1:
+ return raw_product
+ pivot = raw_product[0]
+ smaller = _sort_quantity([x for x in raw_product[1:] if x.product_qty < pivot.product_qty])
+ bigger = _sort_quantity([x for x in raw_product[1:] if x.product_qty >= pivot.product_qty])
+ return smaller + [pivot] + bigger
+
+ # sort the list by quantity if we have not consumed yet
+ if consumed < qty:
+ raw_product = _sort_quantity(raw_product)
+
+ index = 0
+ # consume the smallest quantity while we have not consumed enough
+ while consumed < qty and index < len(raw_product):
+ consume_line = raw_product[index]
+ # we don't need to split
+ if consume_line.product_qty <= (qty - consumed):
+ consume_line.action_consume(consume_line.product_qty, consume_line.location_id.id, context=context)
+ consumed += consume_line.product_qty
+ # we need to split
+ else:
+ consume_line.action_consume(qty - consumed, consume_line.location_id.id, context=context)
+ consumed += qty - consumed
+ index += 1
if production_mode == 'consume_produce':
# To produce remaining qty of final product
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 25b9ca020e7..c76658684fd 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -685,7 +685,7 @@
-
+