From b5645d23868b58b09aa6f2758f8e4952c139baa0 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 4 Nov 2013 17:49:39 +0100 Subject: [PATCH] [FIX] stock_account, purchase: the standard price of a product may not be compatible with the decimal precision 'Account' or the coinage of the main currency, so we need to take care of that when creating the stock valuation entries bzr revid: qdp-launchpad@openerp.com-20131104164939-jupkxy1zrqqq3lpq --- addons/purchase/purchase.py | 3 ++- addons/stock_account/stock_account.py | 17 ++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 142f13997c4..d37e826fdeb 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -662,7 +662,8 @@ class purchase_order(osv.osv): if order_line.product_uom.id != order_line.product_id.uom_id.id: price_unit *= order_line.product_uom.factor if order.currency_id.id != order.company_id.currency_id.id: - price_unit = self.pool.get('res.currency').compute(cr, uid, order.currency_id.id, order.company_id.currency_id.id, price_unit, context=context) + #we don't round the price_unit, as we may want to store the standard price with more digits than allowed by the currency + price_unit = self.pool.get('res.currency').compute(cr, uid, order.currency_id.id, order.company_id.currency_id.id, price_unit, round=False, context=context) return { 'name': order_line.name or '', diff --git a/addons/stock_account/stock_account.py b/addons/stock_account/stock_account.py index cacef475eff..c2cc2799a38 100644 --- a/addons/stock_account/stock_account.py +++ b/addons/stock_account/stock_account.py @@ -172,10 +172,14 @@ class stock_quant(osv.osv): """ if context is None: context = {} + currency_obj = self.pool.get('res.currency') if context.get('force_valuation_amount'): valuation_amount = context.get('force_valuation_amount') else: valuation_amount = quant.product_id.cost_method == 'real' and quant.cost or quant.product_id.standard_price + #the standard_price of the product may be in another decimal precision, or not compatible with the coinage of + #the company currency... so we need to use round() before creating the accounting entries. + valuation_amount = currency_obj.round(cr, uid, quant.company_id.currency_id, valuation_amount * quant.qty) partner_id = (move.picking_id.partner_id and self.pool.get('res.partner')._find_accounting_partner(move.picking_id.partner_id).id) or False debit_line_vals = { 'name': move.name, @@ -185,8 +189,8 @@ class stock_quant(osv.osv): 'ref': move.picking_id and move.picking_id.name or False, 'date': time.strftime('%Y-%m-%d'), 'partner_id': partner_id, - 'debit': valuation_amount > 0 and valuation_amount * quant.qty or 0, - 'credit': valuation_amount < 0 and -valuation_amount * quant.qty or 0, + 'debit': valuation_amount > 0 and valuation_amount or 0, + 'credit': valuation_amount < 0 and -valuation_amount or 0, 'account_id': debit_account_id, } credit_line_vals = { @@ -197,12 +201,11 @@ class stock_quant(osv.osv): 'ref': move.picking_id and move.picking_id.name or False, 'date': time.strftime('%Y-%m-%d'), 'partner_id': partner_id, - 'credit': valuation_amount > 0 and valuation_amount * quant.qty or 0, - 'debit': valuation_amount < 0 and -valuation_amount * quant.qty or 0, + 'credit': valuation_amount > 0 and valuation_amount or 0, + 'debit': valuation_amount < 0 and -valuation_amount or 0, 'account_id': credit_account_id, } - res = [(0, 0, debit_line_vals), (0, 0, credit_line_vals)] - return res + return [(0, 0, debit_line_vals), (0, 0, credit_line_vals)] def _create_account_move_line(self, cr, uid, quant, move, credit_account_id, debit_account_id, journal_id, context=None): move_obj = self.pool.get('account.move') @@ -260,7 +263,7 @@ class stock_move(osv.osv): new_std_price = move.price_unit else: # Get the standard price - amount_unit = product.price_get('standard_price', context=ctx)[product.id] + amount_unit = product.standard_price new_std_price = ((amount_unit * product_avail) + (move.price_unit * move.product_qty)) / (product_avail + move.product_qty) # Write the standard price, as SUPERUSER_ID because a warehouse manager may not have the right to write on products product_obj.write(cr, SUPERUSER_ID, [product.id], {'standard_price': new_std_price}, context=context)