diff --git a/addons/account/account.py b/addons/account/account.py index 7fbab48d436..84e7e0c74c5 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -23,6 +23,7 @@ import time import netsvc from osv import fields, osv +import decimal_precision as dp from tools.misc import currency from tools.translate import _ @@ -53,12 +54,13 @@ class account_payment_term(osv.osv): amount = value result = [] for line in pt.line_ids: + prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account') if line.value == 'fixed': - amt = round(line.value_amount, int(config['price_accuracy'])) + amt = round(line.value_amount, prec) elif line.value == 'procent': - amt = round(value * line.value_amount, int(config['price_accuracy'])) + amt = round(value * line.value_amount, prec) elif line.value == 'balance': - amt = round(amount, int(config['price_accuracy'])) + amt = round(amount, prec) if amt: next_date = datetime.strptime(date_ref, '%y-%m-%d') + relativedelta(days=line.days) if line.days2 < 0: @@ -296,9 +298,9 @@ class account_account(osv.osv): 'child_parent_ids': fields.one2many('account.account','parent_id','Children'), 'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'), 'child_id': fields.function(_get_child_ids, method=True, type='many2many', relation="account.account", string="Child Accounts"), - 'balance': fields.function(__compute, digits=(16, int(config['price_accuracy'])), method=True, string='Balance', multi='balance'), - 'credit': fields.function(__compute, digits=(16, int(config['price_accuracy'])), method=True, string='Credit', multi='balance'), - 'debit': fields.function(__compute, digits=(16, int(config['price_accuracy'])), method=True, string='Debit', multi='balance'), + 'balance': fields.function(__compute, digits_compute=dp.get_precision('Account'), method=True, string='Balance', multi='balance'), + 'credit': fields.function(__compute, digits_compute=dp.get_precision('Account'), method=True, string='Credit', multi='balance'), + 'debit': fields.function(__compute, digits_compute=dp.get_precision('Account'), method=True, string='Debit', multi='balance'), 'reconcile': fields.boolean('Reconcile', help="Check this if the user is allowed to reconcile entries in this account."), 'shortcut': fields.char('Shortcut', size=12), 'tax_ids': fields.many2many('account.tax', 'account_account_tax_default_rel', @@ -817,7 +819,7 @@ class account_move(osv.osv): 'line_id': fields.one2many('account.move.line', 'move_id', 'Entries', states={'posted':[('readonly',True)]}), 'to_check': fields.boolean('To Be Verified'), 'partner_id': fields.related('line_id', 'partner_id', type="many2one", relation="res.partner", string="Partner"), - 'amount': fields.function(_amount_compute, method=True, string='Amount', digits=(16,int(config['price_accuracy'])), type='float', fnct_search=_search_amount), + 'amount': fields.function(_amount_compute, method=True, string='Amount', digits_compute=dp.get_precision('Account'), type='float', fnct_search=_search_amount), 'date': fields.date('Date', required=True), 'type': fields.selection([ ('pay_voucher','Cash Payment'), @@ -1189,7 +1191,7 @@ class account_tax_code(osv.osv): for rec in record.child_ids: amount += _rec_get(rec) * rec.sign return amount - res[record.id] = round(_rec_get(record), int(config['price_accuracy'])) + res[record.id] = round(_rec_get(record), self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) return res def _sum_year(self, cr, uid, ids, name, args, context): @@ -1460,9 +1462,9 @@ class account_tax(osv.osv): total = 0.0 for r in res: if r.get('balance',False): - r['amount'] = round(r['balance'] * quantity, int(config['price_accuracy'])) - total + r['amount'] = round(r['balance'] * quantity, self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) - total else: - r['amount'] = round(r['amount'] * quantity, int(config['price_accuracy'])) + r['amount'] = round(r['amount'] * quantity, self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) total += r['amount'] return res @@ -1556,10 +1558,11 @@ class account_tax(osv.osv): res = self._unit_compute_inv(cr, uid, taxes, price_unit, address_id, product, partner=None) total = 0.0 for r in res: + prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account') if r.get('balance',False): - r['amount'] = round(r['balance'] * quantity, int(config['price_accuracy'])) - total + r['amount'] = round(r['balance'] * quantity, prec) - total else: - r['amount'] = round(r['amount'] * quantity, int(config['price_accuracy'])) + r['amount'] = round(r['amount'] * quantity, prec) total += r['amount'] return res account_tax() @@ -1627,9 +1630,9 @@ class account_model_line(osv.osv): _columns = { 'name': fields.char('Name', size=64, required=True), 'sequence': fields.integer('Sequence', required=True, help="The sequence field is used to order the resources from lower sequences to higher ones"), - 'quantity': fields.float('Quantity', digits=(16, int(config['price_accuracy'])), help="The optional quantity on entries"), - 'debit': fields.float('Debit', digits=(16, int(config['price_accuracy']))), - 'credit': fields.float('Credit', digits=(16, int(config['price_accuracy']))), + 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Account'), help="The optional quantity on entries"), + 'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')), + 'credit': fields.float('Credit', digits_compute=dp.get_precision('Account')), 'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade"), diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index b41ef632477..18f63733ff6 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -20,6 +20,7 @@ ############################################################################## import time +import decimal_precision as dp from osv import fields from osv import osv @@ -85,7 +86,7 @@ class account_analytic_line(osv.osv): }, help="The related account currency if not equal to the company one."), 'company_id': fields.many2one('res.company','Company',required=True), - 'amount_currency': fields.function(_amount_currency, method=True, digits=(16, int(config['price_accuracy'])), string='Amount currency', + 'amount_currency': fields.function(_amount_currency, method=True, digits_compute= dp.get_precision('Account'), string='Amount currency', store={ 'account.analytic.account': (_get_account_line, ['company_id'], 50), 'account.analytic.line': (lambda self,cr,uid,ids,c={}: ids, ['amount','unit_amount'],10), diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 0ab2b5cbe96..0adc85a942e 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -25,7 +25,7 @@ from osv import fields, osv from tools.translate import _ from datetime import datetime - +import decimal_precision as dp import tools class account_move_line(osv.osv): @@ -397,8 +397,8 @@ class account_move_line(osv.osv): 'quantity': fields.float('Quantity', digits=(16,2), help="The optional quantity expressed by this line, eg: number of product sold. The quantity is not a legal requirement but is very useful for some reports."), 'product_uom_id': fields.many2one('product.uom', 'UoM'), 'product_id': fields.many2one('product.product', 'Product'), - 'debit': fields.float('Debit', digits=(16,int(tools.config['price_accuracy']))), - 'credit': fields.float('Credit', digits=(16,int(tools.config['price_accuracy']))), + 'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')), + 'credit': fields.float('Credit', digits_compute=dp.get_precision('Account')), 'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade", domain=[('type','<>','view'), ('type', '<>', 'closed')], select=2), 'move_id': fields.many2one('account.move', 'Move', ondelete="cascade", states={'valid':[('readonly',True)]}, help="The move of this entry line.", select=2), @@ -406,7 +406,7 @@ class account_move_line(osv.osv): 'statement_id': fields.many2one('account.bank.statement', 'Statement', help="The bank statement used for bank reconciliation", select=1), 'reconcile_id': fields.many2one('account.move.reconcile', 'Reconcile', readonly=True, ondelete='set null', select=2), 'reconcile_partial_id': fields.many2one('account.move.reconcile', 'Partial Reconcile', readonly=True, ondelete='set null', select=2), - 'amount_currency': fields.float('Amount Currency', help="The amount expressed in an optional other currency if it is a multi-currency entry.", digits=(16,int(tools.config['price_accuracy']))), + 'amount_currency': fields.float('Amount Currency', help="The amount expressed in an optional other currency if it is a multi-currency entry.", digits_compute=dp.get_precision('Account')), 'currency_id': fields.many2one('res.currency', 'Currency', help="The optional other currency if it is a multi-currency entry."), 'period_id': fields.many2one('account.period', 'Period', required=True, select=2), @@ -426,14 +426,14 @@ class account_move_line(osv.osv): 'state': fields.selection([('draft','Draft'), ('valid','Valid')], 'State', readonly=True, help='When new move line is created the state will be \'Draft\'.\n* When all the payments are done it will be in \'Valid\' state.'), 'tax_code_id': fields.many2one('account.tax.code', 'Tax Account', help="The Account can either be a base tax code or a tax code account."), - 'tax_amount': fields.float('Tax/Base Amount', digits=(16,int(tools.config['price_accuracy'])), select=True, help="If the Tax account is a tax code account, this field will contain the taxed amount.If the tax account is base tax code, "\ + 'tax_amount': fields.float('Tax/Base Amount', digits_compute=dp.get_precision('Account'), select=True, help="If the Tax account is a tax code account, this field will contain the taxed amount.If the tax account is base tax code, "\ "this field will contain the basic amount(without tax)."), 'invoice': fields.function(_invoice, method=True, string='Invoice', type='many2one', relation='account.invoice', fnct_search=_invoice_search), 'account_tax_id':fields.many2one('account.tax', 'Tax'), 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account'), #TODO: remove this - 'amount_taxed':fields.float("Taxed Amount",digits=(16,int(tools.config['price_accuracy']))), + 'amount_taxed':fields.float("Taxed Amount",digits_compute=dp.get_precision('Account')), 'company_id': fields.related('account_id','company_id',type='many2one',relation='res.company',string='Company',store=True) } diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 8b31f99e0c6..47561e57aaf 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -20,6 +20,8 @@ ############################################################################## import time +import decimal_precision as dp + import netsvc from osv import fields, osv import ir @@ -262,21 +264,21 @@ class account_invoice(osv.osv): 'tax_line': fields.one2many('account.invoice.tax', 'invoice_id', 'Tax Lines', readonly=True, states={'draft':[('readonly',False)]}), 'move_id': fields.many2one('account.move', 'Invoice Movement', readonly=True, help="Links to the automatically generated Ledger Postings."), - 'amount_untaxed': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])),string='Untaxed', + 'amount_untaxed': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'),string='Untaxed', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice.tax': (_get_invoice_tax, None, 20), 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20), }, multi='all'), - 'amount_tax': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Tax', + 'amount_tax': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Tax', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice.tax': (_get_invoice_tax, None, 20), 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20), }, multi='all'), - 'amount_total': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Total', + 'amount_total': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Total', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice.tax': (_get_invoice_tax, None, 20), @@ -286,7 +288,7 @@ class account_invoice(osv.osv): 'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'journal_id': fields.many2one('account.journal', 'Journal', required=True,readonly=True, states={'draft':[('readonly',False)]}), 'company_id': fields.many2one('res.company', 'Company', required=True, change_default=True), - 'check_total': fields.float('Total', digits=(16, int(config['price_accuracy'])), states={'open':[('readonly',True)],'close':[('readonly',True)]}), + 'check_total': fields.float('Total', digits_compute=dp.get_precision('Account'), states={'open':[('readonly',True)],'close':[('readonly',True)]}), 'reconciled': fields.function(_reconciled, method=True, string='Paid/Reconciled', type='boolean', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 50), # Check if we can remove ? @@ -296,7 +298,7 @@ class account_invoice(osv.osv): 'partner_bank': fields.many2one('res.partner.bank', 'Bank Account', help='The bank account to pay to or to be paid from'), 'move_lines':fields.function(_get_lines , method=True,type='many2many' , relation='account.move.line',string='Entry Lines'), - 'residual': fields.function(_amount_residual, method=True, digits=(16, int(config['price_accuracy'])),string='Residual', + 'residual': fields.function(_amount_residual, method=True, digits_compute=dp.get_precision('Account'),string='Residual', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 50), 'account.invoice.tax': (_get_invoice_tax, None, 50), @@ -1076,7 +1078,7 @@ class account_invoice(osv.osv): if l.account_id.id==src_account_id: line_ids.append(l.id) total += (l.debit or 0.0) - (l.credit or 0.0) - if (not round(total,int(config['price_accuracy']))) or writeoff_acc_id: + if (not round(total,self.pool.get('decimal.precision').precision_get(cr, uid, 'Account'))) or writeoff_acc_id: self.pool.get('account.move.line').reconcile(cr, uid, line_ids, 'manual', writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context) else: self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context) @@ -1096,7 +1098,7 @@ class account_invoice_line(osv.osv): cur = line.invoice_id.currency_id res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) else: - res[line.id] = round(line.price_unit * line.quantity * (1-(line.discount or 0.0)/100.0),int(config['price_accuracy'])) + res[line.id] = round(line.price_unit * line.quantity * (1-(line.discount or 0.0)/100.0),self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) return res @@ -1127,10 +1129,10 @@ class account_invoice_line(osv.osv): 'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'), 'product_id': fields.many2one('product.product', 'Product', ondelete='set null'), 'account_id': fields.many2one('account.account', 'Account', required=True, domain=[('type','<>','view'), ('type', '<>', 'closed')], help="The income or expense account related to the selected product."), - 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))), - 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',store=True, type="float", digits=(16, int(config['price_accuracy']))), + 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Account')), + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',store=True, type="float", digits_compute= dp.get_precision('Account')), 'quantity': fields.float('Quantity', required=True), - 'discount': fields.float('Discount (%)', digits=(16, int(config['price_accuracy']))), + 'discount': fields.float('Discount (%)', digits_compute= dp.get_precision('Account')), 'invoice_line_tax_id': fields.many2many('account.tax', 'account_invoice_line_tax', 'invoice_line_id', 'tax_id', 'Taxes', domain=[('parent_id','=',False)]), 'note': fields.text('Notes', translate=True), 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), @@ -1355,15 +1357,15 @@ class account_invoice_tax(osv.osv): 'invoice_id': fields.many2one('account.invoice', 'Invoice Line', ondelete='cascade', select=True), 'name': fields.char('Tax Description', size=64, required=True), 'account_id': fields.many2one('account.account', 'Tax Account', required=True, domain=[('type','<>','view'),('type','<>','income'), ('type', '<>', 'closed')]), - 'base': fields.float('Base', digits=(16,int(config['price_accuracy']))), - 'amount': fields.float('Amount', digits=(16,int(config['price_accuracy']))), + 'base': fields.float('Base', digits_compute=dp.get_precision('Account')), + 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')), 'manual': fields.boolean('Manual'), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of invoice tax."), 'base_code_id': fields.many2one('account.tax.code', 'Base Code', help="The account basis of the tax declaration."), - 'base_amount': fields.float('Base Code Amount', digits=(16,int(config['price_accuracy']))), + 'base_amount': fields.float('Base Code Amount', digits_compute=dp.get_precision('Account')), 'tax_code_id': fields.many2one('account.tax.code', 'Tax Code', help="The tax basis of the tax declaration."), - 'tax_amount': fields.float('Tax Code Amount', digits=(16,int(config['price_accuracy']))), + 'tax_amount': fields.float('Tax Code Amount', digits_compute=dp.get_precision('Account')), 'company_id': fields.related('account_id','company_id',type='many2one',relation='res.company',string='Company',store=True), } diff --git a/addons/account/wizard/wizard_pay_invoice.py b/addons/account/wizard/wizard_pay_invoice.py index b8ec568f0f8..f534a72a77f 100644 --- a/addons/account/wizard/wizard_pay_invoice.py +++ b/addons/account/wizard/wizard_pay_invoice.py @@ -25,6 +25,8 @@ import pooler import time from tools.translate import _ import tools +import decimal_precision as dp + pay_form = '''
@@ -37,7 +39,7 @@ pay_form = '''
''' pay_fields = { - 'amount': {'string': 'Amount paid', 'type':'float', 'required':True, 'digits': (16,int(tools.config['price_accuracy']))}, + 'amount': {'string': 'Amount paid', 'type':'float', 'required':True, 'digits': (16,dp.get_precision('Account'))}, 'name': {'string': 'Entry Name', 'type':'char', 'size': 64, 'required':True}, 'date': {'string': 'Payment date', 'type':'date', 'required':True, 'default':lambda *args: time.strftime('%Y-%m-%d')}, 'journal_id': {'string': 'Journal/Payment Mode', 'type': 'many2one', 'relation':'account.journal', 'required':True, 'domain':[('type','=','cash')]}, diff --git a/addons/account_tax_include/invoice_tax_incl.py b/addons/account_tax_include/invoice_tax_incl.py index 94e2871da84..31f3d8a233a 100644 --- a/addons/account_tax_include/invoice_tax_incl.py +++ b/addons/account_tax_include/invoice_tax_incl.py @@ -24,6 +24,7 @@ import netsvc from osv import fields, osv import ir from tools import config +import decimal_precision as dp class account_invoice(osv.osv): _inherit = "account.invoice" @@ -84,7 +85,7 @@ class account_invoice_line(osv.osv): else: res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] for tax in tax_obj.compute_inv(cr, uid, product_taxes, res_init[line.id]/line.quantity, line.quantity): - res[line.id]['price_subtotal'] = res[line.id]['price_subtotal'] - round(tax['amount'], int(config['price_accuracy'])) + res[line.id]['price_subtotal'] = res[line.id]['price_subtotal'] - round(tax['amount'], self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) else: res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] @@ -99,8 +100,8 @@ class account_invoice_line(osv.osv): res[line.id]['price_subtotal'] = res[line.id]['price_subtotal'] - tax['amount'] res[line.id]['data'].append( tax) - res[line.id]['price_subtotal']= round(res[line.id]['price_subtotal'], int(config['price_accuracy'])) - res[line.id]['price_subtotal_incl']= round(res[line.id]['price_subtotal_incl'], int(config['price_accuracy'])) + res[line.id]['price_subtotal']= round(res[line.id]['price_subtotal'], self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) + res[line.id]['price_subtotal_incl']= round(res[line.id]['price_subtotal_incl'], self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')) return res def _price_unit_default(self, cr, uid, context=None): diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py index 54bb501e02c..463dbf67cee 100644 --- a/addons/decimal_precision/decimal_precision.py +++ b/addons/decimal_precision/decimal_precision.py @@ -30,6 +30,11 @@ class decimal_precision(osv.osv): _defaults = { 'digits': lambda *a : 2, } + def precision_get(self, cr, uid, application): + cr.execute('select digits from decimal_precision where name=%s', (application,)) + res = cr.fetchone() + return res and res[0] or 2 + def write(self, cr, uid, ids, data, *args, **argv): res = super(decimal_precision, self).write(cr, uid, ids, data, *args, **argv) for obj in self.pool.obj_list(): @@ -43,7 +48,5 @@ def get_precision(application): def change_digit(cr): cr.execute('select digits from decimal_precision where name=%s', (application,)) res = cr.fetchone() - if res: - return (16,res[0]) - return (16,2) + return (16,res and res[0] or 2) return change_digit diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py index 901e2670f76..29a3003ff52 100644 --- a/addons/delivery/stock.py +++ b/addons/delivery/stock.py @@ -24,6 +24,8 @@ from osv import fields,osv from tools.translate import _ import tools +import decimal_precision as dp + # Overloaded stock_picking to manage carriers : class stock_picking(osv.osv): _name = "stock.picking" @@ -54,7 +56,7 @@ class stock_picking(osv.osv): _columns = { 'carrier_id':fields.many2one("delivery.carrier","Carrier"), 'volume': fields.float('Volume'), - 'weight': fields.function(_cal_weight, method=True, type='float', string='Weight',digits=(16, int(tools.config['price_accuracy'])), + 'weight': fields.function(_cal_weight, method=True, type='float', string='Weight',digits_compute= dp.get_precision('Stock Weight'), store={ 'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20), 'stock.move': (_get_picking_line, ['product_id','product_uos_qty'], 20), diff --git a/addons/membership/membership.py b/addons/membership/membership.py index a364c0caedc..8c15c652335 100644 --- a/addons/membership/membership.py +++ b/addons/membership/membership.py @@ -23,6 +23,9 @@ from osv import fields, osv from tools import config import time +import decimal_precision as dp + + STATE = [ ('none', 'Non Member'), ('canceled', 'Canceled Member'), @@ -415,7 +418,7 @@ Partner() class product_template(osv.osv): _inherit = 'product.template' _columns = { - 'member_price':fields.float('Member Price', digits=(16, int(config['price_accuracy']))), + 'member_price':fields.float('Member Price', digits_compute= dp.get_precision('Sale Price')), } product_template() @@ -753,4 +756,4 @@ class account_invoice_line(osv.osv): return result account_invoice_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index 7ae054c3a16..fc91fe1f9e6 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -26,6 +26,7 @@ import mx.DateTime from mx.DateTime import RelativeDateTime, today, DateTime, localtime from tools import config from tools.translate import _ +import decimal_precision as dp class mrp_repair(osv.osv): _name = 'mrp.repair' @@ -500,8 +501,8 @@ class mrp_repair_line(osv.osv, ProductChangeMixin): 'to_invoice': fields.boolean('To Invoice'), 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok','=',True)], required=True), 'invoiced': fields.boolean('Invoiced',readonly=True), - 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))), - 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',digits=(16, int(config['price_accuracy']))), + 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Sale Price')), + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',digits_compute= dp.get_precision('Sale Price')), 'tax_id': fields.many2many('account.tax', 'repair_operation_line_tax', 'repair_operation_line_id', 'tax_id', 'Taxes'), 'product_uom_qty': fields.float('Quantity (UoM)', digits=(16,2), required=True), 'product_uom': fields.many2one('product.uom', 'Product UoM', required=True), @@ -575,7 +576,7 @@ class mrp_repair_fee(osv.osv, ProductChangeMixin): 'product_uom_qty': fields.float('Quantity', digits=(16,2), required=True), 'price_unit': fields.float('Unit Price', required=True), 'product_uom': fields.many2one('product.uom', 'Product UoM', required=True), - 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',digits=(16, int(config['price_accuracy']))), + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal',digits_compute= dp.get_precision('Sale Price')), 'tax_id': fields.many2many('account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'), 'invoice_line_id': fields.many2one('account.invoice.line', 'Invoice Line', readonly=True), 'to_invoice': fields.boolean('To Invoice'), diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index b2f4194e370..001bee74055 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -27,6 +27,8 @@ import time from tools import config from tools.misc import ustr from tools.translate import _ +import decimal_precision as dp + class price_type(osv.osv): """ @@ -369,18 +371,18 @@ class product_pricelist_item(osv.osv): 'base_pricelist_id': fields.many2one('product.pricelist', 'If Other Pricelist'), 'price_surcharge': fields.float('Price Surcharge', - digits=(16, int(config['price_accuracy']))), + digits_compute= dp.get_precision('Sale Price')), 'price_discount': fields.float('Price Discount', digits=(16,4)), 'price_round': fields.float('Price Rounding', - digits=(16, int(config['price_accuracy'])), + digits_compute= dp.get_precision('Sale Price'), help="Sets the price so that it is a multiple of this value.\n" \ "Rounding is applied after the discount and before the surcharge.\n" \ "To have prices that end in 9.99, set rounding 10, surcharge -0.01" \ ), 'price_min_margin': fields.float('Min. Price Margin', - digits=(16, int(config['price_accuracy']))), + digits_compute= dp.get_precision('Sale Price')), 'price_max_margin': fields.float('Max. Price Margin', - digits=(16, int(config['price_accuracy']))), + digits_compute= dp.get_precision('Sale Price')), 'company_id': fields.related('price_version_id','company_id',type='many2one', readonly=True, relation='res.company', string='Company', store=True) } diff --git a/addons/product/product_data.xml b/addons/product/product_data.xml index 77ee4adb499..4ed27c81d1d 100644 --- a/addons/product/product_data.xml +++ b/addons/product/product_data.xml @@ -124,6 +124,10 @@ parameter) will see those record just disappear. Account 2 + + Stock Weight + 2 + diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 336a37b4fb4..f512406738b 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -31,6 +31,9 @@ import pooler from tools import config from tools.translate import _ +import decimal_precision as dp + + # # Model definition # @@ -177,15 +180,15 @@ class purchase_order(osv.osv): "Manual: no invoice will be pre-generated. The accountant will have to encode manually." ), 'minimum_planned_date':fields.function(_minimum_planned_date, fnct_inv=_set_minimum_planned_date, method=True,store=True, string='Expected Date', type='datetime', help="This is computed as the minimum scheduled date of all purchase order lines' products."), - 'amount_untaxed': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Untaxed Amount', + 'amount_untaxed': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Purchase Price'), string='Untaxed Amount', store={ 'purchase.order.line': (_get_order, None, 10), }, multi="sums"), - 'amount_tax': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Taxes', + 'amount_tax': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Purchase Price'), string='Taxes', store={ 'purchase.order.line': (_get_order, None, 10), }, multi="sums"), - 'amount_total': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Total', + 'amount_total': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Purchase Price'), string='Total', store={ 'purchase.order.line': (_get_order, None, 10), }, multi="sums"), @@ -461,8 +464,8 @@ class purchase_order_line(osv.osv): 'product_id': fields.many2one('product.product', 'Product', domain=[('purchase_ok','=',True)], change_default=True), 'move_ids': fields.one2many('stock.move', 'purchase_line_id', 'Reservation', readonly=True, ondelete='set null'), 'move_dest_id': fields.many2one('stock.move', 'Reservation Destination', ondelete='set null'), - 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))), - 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits=(16, int(config['price_accuracy']))), + 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Purchase Price')), + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute= dp.get_precision('Purchase Price')), 'notes': fields.text('Notes', translate=True), 'order_id': fields.many2one('purchase.order', 'Order Reference', select=True, required=True, ondelete='cascade'), 'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',), diff --git a/addons/purchase/purchase_unit_test.xml b/addons/purchase/purchase_unit_test.xml index aefce270e1c..890062a66b9 100644 --- a/addons/purchase/purchase_unit_test.xml +++ b/addons/purchase/purchase_unit_test.xml @@ -2,26 +2,6 @@ - Test purchase @@ -30,22 +10,6 @@ - - [PC1] Basic PC diff --git a/addons/sale/sale.py b/addons/sale/sale.py index ff0fd1984d8..501d9ac1ea7 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -27,6 +27,8 @@ from dateutil.relativedelta import relativedelta from tools import config from tools.translate import _ +import decimal_precision as dp + class sale_shop(osv.osv): _name = "sale.shop" @@ -233,19 +235,19 @@ class sale_order(osv.osv): fnct_search=_invoiced_search, type='boolean'), 'note': fields.text('Notes', translate=True), - 'amount_untaxed': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Untaxed Amount', + 'amount_untaxed': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Sale Price'), string='Untaxed Amount', store = { 'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), 'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10), }, multi='sums'), - 'amount_tax': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Taxes', + 'amount_tax': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Sale Price'), string='Taxes', store = { 'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), 'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10), }, multi='sums'), - 'amount_total': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Total', + 'amount_total': fields.function(_amount_all, method=True, digits_compute= dp.get_precision('Sale Price'), string='Total', store = { 'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), 'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10), @@ -773,9 +775,9 @@ class sale_order_line(osv.osv): 'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True), 'invoiced': fields.boolean('Invoiced', readonly=True), 'procurement_id': fields.many2one('mrp.procurement', 'Requisition'), - 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy'])), readonly=True, states={'draft':[('readonly',False)]}), - 'price_net': fields.function(_amount_line_net, method=True, string='Net Price', digits=(16, int(config['price_accuracy']))), - 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits=(16, int(config['price_accuracy']))), + 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Sale Price'), readonly=True, states={'draft':[('readonly',False)]}), + 'price_net': fields.function(_amount_line_net, method=True, string='Net Price', digits_compute= dp.get_precision('Sale Price')), + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute= dp.get_precision('Sale Price')), 'tax_id': fields.many2many('account.tax', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes', readonly=True, states={'draft':[('readonly',False)]}), 'type': fields.selection([('make_to_stock', 'from stock'), ('make_to_order', 'on order')], 'Requisition Method', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'property_ids': fields.many2many('mrp.property', 'sale_order_line_property_rel', 'order_id', 'property_id', 'Properties', readonly=True, states={'draft':[('readonly',False)]}), @@ -854,7 +856,7 @@ class sale_order_line(osv.osv): pu = 0.0 if uosqty: pu = round(line.price_unit * line.product_uom_qty / uosqty, - int(config['price_accuracy'])) + self.pool.get('decimal.precision').precision_get(cr, uid, 'Sale Price')) fpos = line.order_id.fiscal_position or False a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a) if not a: diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 21c2c0b1b6b..a403c141be4 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -30,6 +30,8 @@ import netsvc import time import tools +import decimal_precision as dp + #---------------------------------------------------------- # Incoterms @@ -1027,7 +1029,7 @@ class stock_move(osv.osv): help='When the stock move is created it is in the \'Draft\' state.\n After that it is set to \'Confirmed\' state.\n If stock is available state is set to \'Avaiable\'.\n When the picking it done the state is \'Done\'.\ \nThe state is \'Waiting\' if the move is waiting for another one.'), 'price_unit': fields.float('Unit Price', - digits=(16, int(config['price_accuracy']))), + digits_compute= dp.get_precision('Account')), 'company_id': fields.many2one('res.company', 'Company', required=True,select=1), 'partner_id': fields.related('picking_id','address_id','partner_id',type='many2one', relation="res.partner", string="Partner"), 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Orders"),