From: Harry (Open ERP) Date: Fri, 26 Mar 2010 10:15:01 +0000 (+0530) Subject: [IMP] mrp: if cost price of component is changed, also change cost price of main... X-Git-Tag: 6.0.0-rc1-addons~144^2~273 X-Git-Url: http://git.inspyration.org/?a=commitdiff_plain;h=17968f108d4b7acb5bc8301023fc93f63f364047;p=odoo%2Fodoo.git [IMP] mrp: if cost price of component is changed, also change cost price of main product bzr revid: hmo@tinyerp.com-20100326101501-vlreabb9h6ishpqf --- diff --git a/addons/mrp/__init__.py b/addons/mrp/__init__.py index 11d210e..39d97d0 100644 --- a/addons/mrp/__init__.py +++ b/addons/mrp/__init__.py @@ -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 index 0000000..375bd0c --- /dev/null +++ b/addons/mrp/product.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# 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 . +# +############################################################################## + +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()