Rucha (Open ERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-bug-787950-rpa into 
lp:openobject-addons.

Requested reviews:
  qdp (OpenERP) (qdp)
Related bugs:
  Bug #787950 in OpenERP Addons: "overdelivery in MO not possible"
  https://bugs.launchpad.net/openobject-addons/+bug/787950

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-787950-rpa/+merge/81967

Added warning on over production/consumption of MO. cleaned code,
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-787950-rpa/+merge/81967
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-bug-787950-rpa.
=== modified file 'mrp/mrp.py'
--- mrp/mrp.py	2011-11-10 22:58:02 +0000
+++ mrp/mrp.py	2011-11-11 11:54:41 +0000
@@ -705,42 +705,49 @@
         production = self.browse(cr, uid, production_id, context=context)
 
         produced_qty = 0
-        if production_mode == 'consume_produce':
-            produced_qty = production_qty
-
         for produced_product in production.move_created_ids2:
-            if (produced_product.scrapped) or (produced_product.product_id.id<>production.product_id.id):
+            if (produced_product.scrapped) or (produced_product.product_id.id <> production.product_id.id):
                 continue
             produced_qty += produced_product.product_qty
 
         if production_mode in ['consume','consume_produce']:
-            consumed_products = {}
-            check = {}
-            scrapped = map(lambda x:x.scrapped,production.move_lines2).count(True)
-
-            for consumed_product in production.move_lines2:
-                consumed = consumed_product.product_qty
-                if consumed_product.scrapped:
-                    continue
-                if not consumed_products.get(consumed_product.product_id.id, False):
-                    consumed_products[consumed_product.product_id.id] = consumed_product.product_qty
-                    check[consumed_product.product_id.id] = 0
-                for f in production.product_lines:
-                    if f.product_id.id == consumed_product.product_id.id:
-                        if (len(production.move_lines2) - scrapped) > len(production.product_lines):
-                            check[consumed_product.product_id.id] += consumed_product.product_qty
-                            consumed = check[consumed_product.product_id.id]
-                        rest_consumed = produced_qty * f.product_qty / production.product_qty - consumed
-                        consumed_products[consumed_product.product_id.id] = rest_consumed
-
-            for raw_product in production.move_lines:
-                for f in production.product_lines:
-                    if f.product_id.id == raw_product.product_id.id:
-                        consumed_qty = consumed_products.get(raw_product.product_id.id, 0)
-                        if consumed_qty == 0:
-                            consumed_qty = production_qty * f.product_qty / production.product_qty
-                        if consumed_qty > 0:
-                            stock_mov_obj.action_consume(cr, uid, [raw_product.id], consumed_qty, raw_product.location_id.id, context=context)
+            consumed_data = {}
+
+            # Calculate already consumed qtys
+            for consumed in production.move_lines2:
+                if consumed.scrapped:
+                    continue
+                if not consumed_data.get(consumed.product_id.id, False):
+                    consumed_data[consumed.product_id.id] = 0
+                consumed_data[consumed.product_id.id] += consumed.product_qty
+
+            # Find product qty to be consumed and consume it
+            for scheduled in production.product_lines:
+
+                # total qty of consumed product we need after this consumption
+                total_consume = ((production_qty + produced_qty) * scheduled.product_qty / production.product_qty)
+
+                # qty available for consume and produce
+                qty_avail = scheduled.product_qty - consumed_data.get(scheduled.product_id.id, 0.0)
+
+                if qty_avail <= 0.0:
+                    # there will be nothing to consume for this raw material
+                    continue
+
+                raw_product = [move for move in production.move_lines if move.product_id.id==scheduled.product_id.id]
+                if raw_product:
+                    # qtys we have to consume
+                    qty = total_consume - consumed_data.get(scheduled.product_id.id, 0.0)
+
+                    if qty > qty_avail:
+                        # if qtys we have to consume is more than qtys available to consume
+                        prod_name = scheduled.product_id.name_get()[0][1]
+                        raise osv.except_osv(_('Warning!'), _('You are going to consume total %s quantities of "%s".\nBut you can consume upto total %s quantities.' % (qty, prod_name, qty_avail)))
+                    if qty < 0.0:
+                        # we already have more qtys consumed than we need 
+                        continue
+
+                    raw_product[0].action_consume(qty, raw_product[0].location_id.id, context=context)
 
         if production_mode == 'consume_produce':
             # To produce remaining qty of final product
@@ -760,8 +767,10 @@
                 produced_qty = produced_products.get(produce_product.product_id.id, 0)
                 subproduct_factor = self._get_subproduct_factor(cr, uid, production.id, produce_product.id, context=context)
                 rest_qty = (subproduct_factor * production.product_qty) - produced_qty
-                if rest_qty <= production_qty:
-                    production_qty = rest_qty
+
+                if rest_qty < production_qty:
+                    prod_name = produce_product.product_id.name_get()[0][1]
+                    raise osv.except_osv(_('Warning!'), _('You are going to produce total %s quantities of "%s".\nBut you can produce upto total %s quantities.' % (production_qty, prod_name, rest_qty)))
                 if rest_qty > 0 :
                     stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), context=context)
 

=== modified file 'mrp/test/mrp_procurement.yml'
--- mrp/test/mrp_procurement.yml	2011-10-16 01:28:00 +0000
+++ mrp/test/mrp_procurement.yml	2011-11-11 11:54:41 +0000
@@ -243,7 +243,7 @@
   I create record for producing products with quantity 5.00.
 -
   !record {model: mrp.product.produce, id: mrp_product_produce0}:
-    product_qty: 5.00
+    product_qty: 2.00
     mode: 'consume_produce'
 -
   I produce 2 products with 5.00 quantities each.

=== modified file 'mrp/test/mrp_production_order.yml'
--- mrp/test/mrp_production_order.yml	2011-10-16 01:28:00 +0000
+++ mrp/test/mrp_production_order.yml	2011-11-11 11:54:41 +0000
@@ -76,10 +76,10 @@
     for order in order_ids:
         wf_service.trg_validate(uid, 'mrp.production', order, 'button_produce', cr)
 -
-  I create record for producing products with quantity 6.00.
+  I create record for producing products with quantity 1.00.
 -
   !record {model: mrp.product.produce, id: mrp_product_produce0}:
-    product_qty: 6.00
+    product_qty: 1.00
     mode: 'consume_produce'
 -
   I produce the product.

=== modified file 'purchase/purchase_demo.xml'
--- purchase/purchase_demo.xml	2011-07-22 11:31:47 +0000
+++ purchase/purchase_demo.xml	2011-11-11 11:54:41 +0000
@@ -56,7 +56,7 @@
             <field name="date_planned" eval="time.strftime('%Y/%m/%d')"/>
             <field name="name">New server config + material</field>
             <field model="product.product" name="product_id" search="[]"/>
-            <field model="product.uom" name="product_uom" search="[]"/>
+            <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="price_unit">150</field>
             <field name="product_qty">5</field>
         </record>

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : openerp-dev-gtk@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to