[IMP] mrp: if cost price of component is changed, also change cost price of main...
authorHarry (Open ERP) <hmo@tinyerp.com>
Fri, 26 Mar 2010 10:15:01 +0000 (15:45 +0530)
committerHarry (Open ERP) <hmo@tinyerp.com>
Fri, 26 Mar 2010 10:15:01 +0000 (15:45 +0530)
bzr revid: hmo@tinyerp.com-20100326101501-vlreabb9h6ishpqf

addons/mrp/__init__.py
addons/mrp/product.py [new file with mode: 0644]

index 11d210e..39d97d0 100644 (file)
@@ -21,6 +21,7 @@
 
 import mrp
 import stock
+import product
 import installer
 import wizard
 import report
diff --git a/addons/mrp/product.py b/addons/mrp/product.py
new file mode 100644 (file)
index 0000000..375bd0c
--- /dev/null
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+from tools.translate import _
+
+
+class product_product(osv.osv):
+    _inherit = "product.product"    
+
+    def do_change_standard_price(self, cr, uid, ids, datas, context={}):
+        #TODO : TO Check 
+        res = super(product_product, self).do_change_standard_price(cr, uid, ids, datas, context=context)
+        bom_obj = self.pool.get('mrp.bom')
+        product_uom_obj = self.pool.get('product.uom')
+
+        def _compute_price(bom):            
+            price = 0
+            if bom.bom_lines:
+                for sbom in bom.bom_lines:
+                    price += _compute_price(sbom) * sbom.product_qty                    
+            else:
+                
+                no_child_bom = bom_obj.search(cr, uid, [('product_id', '=', bom.product_id.id), ('bom_id', '=', False)])
+                if no_child_bom and bom.id not in no_child_bom:
+                    other_bom = bom_obj.browse(cr, uid, no_child_bom)[0]
+                    if not other_bom.product_id.calculate_price:
+                        price += _compute_price(other_bom) * other_bom.product_qty
+                    else:
+                        price += other_bom.product_id.standard_price
+                else:
+                    price += bom.product_id.standard_price
+
+            if bom.routing_id:
+                for wline in bom.routing_id.workcenter_lines:
+                    wc = wline.workcenter_id
+                    cycle = wline.cycle_nbr
+                    hour = (wc.time_start + wc.time_stop + cycle * wc.time_cycle) *  (wc.time_efficiency or 1.0)
+                    price += wc.costs_cycle * cycle + wc.costs_hour * hour
+                    price = product_uom_obj._compute_price(cr, uid, bom.product_uom.id, price, bom.product_id.uom_id.id)
+            if bom.bom_lines:
+                self.write(cr, uid, [bom.product_id.id], {'standard_price' : price/bom.product_qty})
+            if bom.product_uom.id != bom.product_id.uom_id.id:
+                price = product_uom_obj._compute_price(cr, uid, bom.product_uom.id, price, bom.product_id.uom_id.id)
+            return price
+
+        
+        bom_ids = bom_obj.search(cr, uid, [('product_id', 'in', ids)])
+        for bom in bom_obj.browse(cr, uid, bom_ids):
+            _compute_price(bom)
+        return res    
+product_product()