From 162163cf64e6948a14e8c2eba077961bb92a7534 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 11 Nov 2011 17:14:38 +0530 Subject: [PATCH 1/3] [FIX]: purchase: Fixed demo of purchase order, it was finding for any uom and assigns first one to product which leads to uom categories mismatch if we use --test-commit option bzr revid: rpa@tinyerp.com-20111111114438-420wk4z067kwlzkc --- addons/purchase/purchase_demo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/purchase/purchase_demo.xml b/addons/purchase/purchase_demo.xml index 6aa98f8cf6c..a8b02c3ebd1 100644 --- a/addons/purchase/purchase_demo.xml +++ b/addons/purchase/purchase_demo.xml @@ -56,7 +56,7 @@ New server config + material - + 150 5 From fa17823d70671464c68c43119e2b0e46dea15b67 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 11 Nov 2011 17:18:07 +0530 Subject: [PATCH 2/3] [FIX,REF]: mrp: Cleaned logic of consume products, removed too many looping and simplified logic, also added checks for over consumption and production than qty of MO lp bug: https://launchpad.net/bugs/787950 fixed bzr revid: rpa@tinyerp.com-20111111114807-xgfroo9gjauklnkw --- addons/mrp/mrp.py | 69 ++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index aeacf4a71a2..f5f59c43591 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -705,42 +705,49 @@ class mrp_production(osv.osv): 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) + consumed_data = {} - for consumed_product in production.move_lines2: - consumed = consumed_product.product_qty - if consumed_product.scrapped: + # Calculate already consumed qtys + for consumed in production.move_lines2: + if consumed.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 + 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 - 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) + # 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 @@ class mrp_production(osv.osv): 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) From 4b9dd9558372d7ae7a5cc3b194f6b97e7007eb63 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 11 Nov 2011 17:18:32 +0530 Subject: [PATCH 3/3] [FIX]: mrp: fixed yml bzr revid: rpa@tinyerp.com-20111111114832-ehpyru3nhdiprct8 --- addons/mrp/test/mrp_procurement.yml | 2 +- addons/mrp/test/mrp_production_order.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/mrp/test/mrp_procurement.yml b/addons/mrp/test/mrp_procurement.yml index 4aaf1560432..f5bcf4f767a 100644 --- a/addons/mrp/test/mrp_procurement.yml +++ b/addons/mrp/test/mrp_procurement.yml @@ -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. diff --git a/addons/mrp/test/mrp_production_order.yml b/addons/mrp/test/mrp_production_order.yml index c765809af1e..57d75e1c1a5 100644 --- a/addons/mrp/test/mrp_production_order.yml +++ b/addons/mrp/test/mrp_production_order.yml @@ -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.