[IMP] configurable digits in floats per application

bzr revid: fp@tinyerp.com-20100306205219-pg1r78deq76t2jg2
This commit is contained in:
Fabien Pinckaers 2010-03-06 21:52:19 +01:00
parent 88eecd2f79
commit 1091830208
16 changed files with 97 additions and 102 deletions

View File

@ -23,6 +23,7 @@ import time
import netsvc import netsvc
from osv import fields, osv from osv import fields, osv
import decimal_precision as dp
from tools.misc import currency from tools.misc import currency
from tools.translate import _ from tools.translate import _
@ -53,12 +54,13 @@ class account_payment_term(osv.osv):
amount = value amount = value
result = [] result = []
for line in pt.line_ids: for line in pt.line_ids:
prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')
if line.value == 'fixed': if line.value == 'fixed':
amt = round(line.value_amount, int(config['price_accuracy'])) amt = round(line.value_amount, prec)
elif line.value == 'procent': 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': elif line.value == 'balance':
amt = round(amount, int(config['price_accuracy'])) amt = round(amount, prec)
if amt: if amt:
next_date = datetime.strptime(date_ref, '%y-%m-%d') + relativedelta(days=line.days) next_date = datetime.strptime(date_ref, '%y-%m-%d') + relativedelta(days=line.days)
if line.days2 < 0: if line.days2 < 0:
@ -296,9 +298,9 @@ class account_account(osv.osv):
'child_parent_ids': fields.one2many('account.account','parent_id','Children'), '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_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"), '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'), 'balance': fields.function(__compute, digits_compute=dp.get_precision('Account'), method=True, string='Balance', multi='balance'),
'credit': fields.function(__compute, digits=(16, int(config['price_accuracy'])), method=True, string='Credit', multi='balance'), 'credit': fields.function(__compute, digits_compute=dp.get_precision('Account'), method=True, string='Credit', multi='balance'),
'debit': fields.function(__compute, digits=(16, int(config['price_accuracy'])), method=True, string='Debit', 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."), 'reconcile': fields.boolean('Reconcile', help="Check this if the user is allowed to reconcile entries in this account."),
'shortcut': fields.char('Shortcut', size=12), 'shortcut': fields.char('Shortcut', size=12),
'tax_ids': fields.many2many('account.tax', 'account_account_tax_default_rel', '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)]}), 'line_id': fields.one2many('account.move.line', 'move_id', 'Entries', states={'posted':[('readonly',True)]}),
'to_check': fields.boolean('To Be Verified'), 'to_check': fields.boolean('To Be Verified'),
'partner_id': fields.related('line_id', 'partner_id', type="many2one", relation="res.partner", string="Partner"), '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), 'date': fields.date('Date', required=True),
'type': fields.selection([ 'type': fields.selection([
('pay_voucher','Cash Payment'), ('pay_voucher','Cash Payment'),
@ -1189,7 +1191,7 @@ class account_tax_code(osv.osv):
for rec in record.child_ids: for rec in record.child_ids:
amount += _rec_get(rec) * rec.sign amount += _rec_get(rec) * rec.sign
return amount 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 return res
def _sum_year(self, cr, uid, ids, name, args, context): def _sum_year(self, cr, uid, ids, name, args, context):
@ -1460,9 +1462,9 @@ class account_tax(osv.osv):
total = 0.0 total = 0.0
for r in res: for r in res:
if r.get('balance',False): 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: 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'] total += r['amount']
return res 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) res = self._unit_compute_inv(cr, uid, taxes, price_unit, address_id, product, partner=None)
total = 0.0 total = 0.0
for r in res: for r in res:
prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')
if r.get('balance',False): 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: else:
r['amount'] = round(r['amount'] * quantity, int(config['price_accuracy'])) r['amount'] = round(r['amount'] * quantity, prec)
total += r['amount'] total += r['amount']
return res return res
account_tax() account_tax()
@ -1627,9 +1630,9 @@ class account_model_line(osv.osv):
_columns = { _columns = {
'name': fields.char('Name', size=64, required=True), '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"), '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"), 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Account'), help="The optional quantity on entries"),
'debit': fields.float('Debit', digits=(16, int(config['price_accuracy']))), 'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')),
'credit': fields.float('Credit', digits=(16, int(config['price_accuracy']))), 'credit': fields.float('Credit', digits_compute=dp.get_precision('Account')),
'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade"), 'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade"),

View File

@ -20,6 +20,7 @@
############################################################################## ##############################################################################
import time import time
import decimal_precision as dp
from osv import fields from osv import fields
from osv import osv 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."), help="The related account currency if not equal to the company one."),
'company_id': fields.many2one('res.company','Company',required=True), '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={ store={
'account.analytic.account': (_get_account_line, ['company_id'], 50), 'account.analytic.account': (_get_account_line, ['company_id'], 50),
'account.analytic.line': (lambda self,cr,uid,ids,c={}: ids, ['amount','unit_amount'],10), 'account.analytic.line': (lambda self,cr,uid,ids,c={}: ids, ['amount','unit_amount'],10),

View File

@ -25,7 +25,7 @@ from osv import fields, osv
from tools.translate import _ from tools.translate import _
from datetime import datetime from datetime import datetime
import decimal_precision as dp
import tools import tools
class account_move_line(osv.osv): 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."), '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_uom_id': fields.many2one('product.uom', 'UoM'),
'product_id': fields.many2one('product.product', 'Product'), 'product_id': fields.many2one('product.product', 'Product'),
'debit': fields.float('Debit', digits=(16,int(tools.config['price_accuracy']))), 'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')),
'credit': fields.float('Credit', digits=(16,int(tools.config['price_accuracy']))), '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), '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), '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), '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_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), '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."), '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), '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, '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.'), 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_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)."), "this field will contain the basic amount(without tax)."),
'invoice': fields.function(_invoice, method=True, string='Invoice', 'invoice': fields.function(_invoice, method=True, string='Invoice',
type='many2one', relation='account.invoice', fnct_search=_invoice_search), type='many2one', relation='account.invoice', fnct_search=_invoice_search),
'account_tax_id':fields.many2one('account.tax', 'Tax'), 'account_tax_id':fields.many2one('account.tax', 'Tax'),
'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account'), 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account'),
#TODO: remove this #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) 'company_id': fields.related('account_id','company_id',type='many2one',relation='res.company',string='Company',store=True)
} }

View File

@ -20,6 +20,8 @@
############################################################################## ##############################################################################
import time import time
import decimal_precision as dp
import netsvc import netsvc
from osv import fields, osv from osv import fields, osv
import ir 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)]}), '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."), '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={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 20), 'account.invoice.tax': (_get_invoice_tax, None, 20),
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20), 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
}, },
multi='all'), 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={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 20), 'account.invoice.tax': (_get_invoice_tax, None, 20),
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20), 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
}, },
multi='all'), 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={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 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)]}), '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)]}), '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), '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', 'reconciled': fields.function(_reconciled, method=True, string='Paid/Reconciled', type='boolean',
store={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 50), # Check if we can remove ? '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', 'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',
help='The bank account to pay to or to be paid from'), 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'), '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={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 50), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 50),
'account.invoice.tax': (_get_invoice_tax, None, 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: if l.account_id.id==src_account_id:
line_ids.append(l.id) line_ids.append(l.id)
total += (l.debit or 0.0) - (l.credit or 0.0) 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) self.pool.get('account.move.line').reconcile(cr, uid, line_ids, 'manual', writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context)
else: else:
self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context) 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 cur = line.invoice_id.currency_id
res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) res[line.id] = cur_obj.round(cr, uid, cur, res[line.id])
else: 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 return res
@ -1127,10 +1129,10 @@ class account_invoice_line(osv.osv):
'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'), 'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'),
'product_id': fields.many2one('product.product', 'Product', 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."), '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_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=(16, int(config['price_accuracy']))), '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), '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)]), '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), 'note': fields.text('Notes', translate=True),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), '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), 'invoice_id': fields.many2one('account.invoice', 'Invoice Line', ondelete='cascade', select=True),
'name': fields.char('Tax Description', size=64, required=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')]), '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']))), 'base': fields.float('Base', digits_compute=dp.get_precision('Account')),
'amount': fields.float('Amount', digits=(16,int(config['price_accuracy']))), 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')),
'manual': fields.boolean('Manual'), 'manual': fields.boolean('Manual'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of invoice tax."), '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_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_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), 'company_id': fields.related('account_id','company_id',type='many2one',relation='res.company',string='Company',store=True),
} }

View File

@ -25,6 +25,8 @@ import pooler
import time import time
from tools.translate import _ from tools.translate import _
import tools import tools
import decimal_precision as dp
pay_form = '''<?xml version="1.0"?> pay_form = '''<?xml version="1.0"?>
<form string="Pay invoice"> <form string="Pay invoice">
@ -37,7 +39,7 @@ pay_form = '''<?xml version="1.0"?>
</form>''' </form>'''
pay_fields = { 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}, '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')}, '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')]}, 'journal_id': {'string': 'Journal/Payment Mode', 'type': 'many2one', 'relation':'account.journal', 'required':True, 'domain':[('type','=','cash')]},

View File

@ -24,6 +24,7 @@ import netsvc
from osv import fields, osv from osv import fields, osv
import ir import ir
from tools import config from tools import config
import decimal_precision as dp
class account_invoice(osv.osv): class account_invoice(osv.osv):
_inherit = "account.invoice" _inherit = "account.invoice"
@ -84,7 +85,7 @@ class account_invoice_line(osv.osv):
else: else:
res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] 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): 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: else:
res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] 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]['price_subtotal'] = res[line.id]['price_subtotal'] - tax['amount']
res[line.id]['data'].append( tax) 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']= 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'], int(config['price_accuracy'])) 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 return res
def _price_unit_default(self, cr, uid, context=None): def _price_unit_default(self, cr, uid, context=None):

View File

@ -30,6 +30,11 @@ class decimal_precision(osv.osv):
_defaults = { _defaults = {
'digits': lambda *a : 2, '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): def write(self, cr, uid, ids, data, *args, **argv):
res = super(decimal_precision, self).write(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(): for obj in self.pool.obj_list():
@ -43,7 +48,5 @@ def get_precision(application):
def change_digit(cr): def change_digit(cr):
cr.execute('select digits from decimal_precision where name=%s', (application,)) cr.execute('select digits from decimal_precision where name=%s', (application,))
res = cr.fetchone() res = cr.fetchone()
if res: return (16,res and res[0] or 2)
return (16,res[0])
return (16,2)
return change_digit return change_digit

View File

@ -24,6 +24,8 @@ from osv import fields,osv
from tools.translate import _ from tools.translate import _
import tools import tools
import decimal_precision as dp
# Overloaded stock_picking to manage carriers : # Overloaded stock_picking to manage carriers :
class stock_picking(osv.osv): class stock_picking(osv.osv):
_name = "stock.picking" _name = "stock.picking"
@ -54,7 +56,7 @@ class stock_picking(osv.osv):
_columns = { _columns = {
'carrier_id':fields.many2one("delivery.carrier","Carrier"), 'carrier_id':fields.many2one("delivery.carrier","Carrier"),
'volume': fields.float('Volume'), '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={ store={
'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20), 'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
'stock.move': (_get_picking_line, ['product_id','product_uos_qty'], 20), 'stock.move': (_get_picking_line, ['product_id','product_uos_qty'], 20),

View File

@ -23,6 +23,9 @@ from osv import fields, osv
from tools import config from tools import config
import time import time
import decimal_precision as dp
STATE = [ STATE = [
('none', 'Non Member'), ('none', 'Non Member'),
('canceled', 'Canceled Member'), ('canceled', 'Canceled Member'),
@ -415,7 +418,7 @@ Partner()
class product_template(osv.osv): class product_template(osv.osv):
_inherit = 'product.template' _inherit = 'product.template'
_columns = { _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() product_template()
@ -753,4 +756,4 @@ class account_invoice_line(osv.osv):
return result return result
account_invoice_line() account_invoice_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -26,6 +26,7 @@ import mx.DateTime
from mx.DateTime import RelativeDateTime, today, DateTime, localtime from mx.DateTime import RelativeDateTime, today, DateTime, localtime
from tools import config from tools import config
from tools.translate import _ from tools.translate import _
import decimal_precision as dp
class mrp_repair(osv.osv): class mrp_repair(osv.osv):
_name = 'mrp.repair' _name = 'mrp.repair'
@ -500,8 +501,8 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
'to_invoice': fields.boolean('To Invoice'), 'to_invoice': fields.boolean('To Invoice'),
'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok','=',True)], required=True), 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok','=',True)], required=True),
'invoiced': fields.boolean('Invoiced',readonly=True), 'invoiced': fields.boolean('Invoiced',readonly=True),
'price_unit': fields.float('Unit Price', required=True, 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=(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_operation_line_tax', 'repair_operation_line_id', 'tax_id', 'Taxes'), '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_qty': fields.float('Quantity (UoM)', digits=(16,2), required=True),
'product_uom': fields.many2one('product.uom', 'Product UoM', 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), 'product_uom_qty': fields.float('Quantity', digits=(16,2), required=True),
'price_unit': fields.float('Unit Price', required=True), 'price_unit': fields.float('Unit Price', required=True),
'product_uom': fields.many2one('product.uom', 'Product UoM', 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'), '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), 'invoice_line_id': fields.many2one('account.invoice.line', 'Invoice Line', readonly=True),
'to_invoice': fields.boolean('To Invoice'), 'to_invoice': fields.boolean('To Invoice'),

View File

@ -27,6 +27,8 @@ import time
from tools import config from tools import config
from tools.misc import ustr from tools.misc import ustr
from tools.translate import _ from tools.translate import _
import decimal_precision as dp
class price_type(osv.osv): 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'), 'base_pricelist_id': fields.many2one('product.pricelist', 'If Other Pricelist'),
'price_surcharge': fields.float('Price Surcharge', '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_discount': fields.float('Price Discount', digits=(16,4)),
'price_round': fields.float('Price Rounding', '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" \ 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" \ "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" \ "To have prices that end in 9.99, set rounding 10, surcharge -0.01" \
), ),
'price_min_margin': fields.float('Min. Price Margin', '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', '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', 'company_id': fields.related('price_version_id','company_id',type='many2one',
readonly=True, relation='res.company', string='Company', store=True) readonly=True, relation='res.company', string='Company', store=True)
} }

View File

@ -124,6 +124,10 @@ parameter) will see those record just disappear.
<field name="name">Account</field> <field name="name">Account</field>
<field name="digits">2</field> <field name="digits">2</field>
</record> </record>
<record forcecreate="True" id="decimal_stock_weight" model="decimal.precision">
<field name="name">Stock Weight</field>
<field name="digits">2</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -31,6 +31,9 @@ import pooler
from tools import config from tools import config
from tools.translate import _ from tools.translate import _
import decimal_precision as dp
# #
# Model definition # 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." "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."), '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={ store={
'purchase.order.line': (_get_order, None, 10), 'purchase.order.line': (_get_order, None, 10),
}, multi="sums"), }, 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={ store={
'purchase.order.line': (_get_order, None, 10), 'purchase.order.line': (_get_order, None, 10),
}, multi="sums"), }, 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={ store={
'purchase.order.line': (_get_order, None, 10), 'purchase.order.line': (_get_order, None, 10),
}, multi="sums"), }, 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), '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_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'), '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_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=(16, int(config['price_accuracy']))), 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute= dp.get_precision('Purchase Price')),
'notes': fields.text('Notes', translate=True), 'notes': fields.text('Notes', translate=True),
'order_id': fields.many2one('purchase.order', 'Order Reference', select=True, required=True, ondelete='cascade'), 'order_id': fields.many2one('purchase.order', 'Order Reference', select=True, required=True, ondelete='cascade'),
'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',), 'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',),

View File

@ -2,26 +2,6 @@
<openerp> <openerp>
<data> <data>
<!-- Resource: purchase.order --> <!-- Resource: purchase.order -->
<!--
Optional fields:
'name': fields.char('Order Description', size=64, required=True, select=True),
'origin': fields.char('Origin', size=64),
'ref': fields.char('Order Reference', size=64),
'partner_ref': fields.char('Partner Reference', size=64),
'dest_address_id':fields.many2one('res.partner.address', 'Destination Address', states={'posted':[('readonly',True)]}),
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', states={'posted':[('readonly',True)]}),
'invoice_method': fields.selection([('manual','Manual'),('order','From order'),('picking','From picking')], 'Invoicing method', required=True),
Mandatory fields:
'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}),
'partner_id':fields.many2one('res.partner', 'Partner', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}, change_default=True),
'partner_address_id':fields.many2one('res.partner.address', 'Address', required=True, states={'posted':[('readonly',True)]}),
'location_id': fields.many2one('stock.location', 'Delivery destination', required=True),
*2many relationships:
'order_line': fields.one2many('purchase.order.line', 'order_id', 'Order State', states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}),
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
-->
<record model="purchase.order" id="test_purchase_1"> <record model="purchase.order" id="test_purchase_1">
<field name="name">Test purchase</field> <field name="name">Test purchase</field>
<field name="dest_address_id" search="[]" model="res.partner.address"/> <field name="dest_address_id" search="[]" model="res.partner.address"/>
@ -30,22 +10,6 @@
<field name="partner_address_id" search="[]" model="res.partner.address"/> <field name="partner_address_id" search="[]" model="res.partner.address"/>
<field name="location_id" search="[]" model="stock.location"/> <field name="location_id" search="[]" model="stock.location"/>
</record> </record>
<!-- Resource: purchase.order.line -->
<!--
Optinal fields:
'name': fields.char('Description', size=64, required=True),
'product_qty': fields.float('Quantity', required=True, digits=(16,2)),
'taxes_id': fields.many2many('account.tax', 'purchase_order_taxe', 'ord_id', 'tax_id', 'Taxes'),
'product_uom': fields.many2one('product.uom', 'Product UOM', required=True),
'notes': fields.text('Notes'),
'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',),
Mandatory fields:
'date_planned': fields.date('Date Promised', required=True),
'product_id': fields.many2one('product.product', 'Product', domain=[('purchase_ok','=',True)], change_default=True),
'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))),
'order_id': fields.many2one('purchase.order', 'Order Ref', select=True, required=True, ondelete='cascade'),
-->
<record model="purchase.order.line" id="test_purchase_1_line_1"> <record model="purchase.order.line" id="test_purchase_1_line_1">
<field name="order_id" ref="test_purchase_1"/> <field name="order_id" ref="test_purchase_1"/>
<field name="name">[PC1] Basic PC</field> <field name="name">[PC1] Basic PC</field>

View File

@ -27,6 +27,8 @@ from dateutil.relativedelta import relativedelta
from tools import config from tools import config
from tools.translate import _ from tools.translate import _
import decimal_precision as dp
class sale_shop(osv.osv): class sale_shop(osv.osv):
_name = "sale.shop" _name = "sale.shop"
@ -233,19 +235,19 @@ class sale_order(osv.osv):
fnct_search=_invoiced_search, type='boolean'), fnct_search=_invoiced_search, type='boolean'),
'note': fields.text('Notes', translate=True), '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 = { store = {
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), '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), 'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
}, },
multi='sums'), 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 = { store = {
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), '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), 'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
}, },
multi='sums'), 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 = { store = {
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10), '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), '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), '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), 'invoiced': fields.boolean('Invoiced', readonly=True),
'procurement_id': fields.many2one('mrp.procurement', 'Requisition'), '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_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=(16, int(config['price_accuracy']))), '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=(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', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes', readonly=True, states={'draft':[('readonly',False)]}), '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)]}), '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)]}), '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 pu = 0.0
if uosqty: if uosqty:
pu = round(line.price_unit * line.product_uom_qty / 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 fpos = line.order_id.fiscal_position or False
a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a) a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a)
if not a: if not a:

View File

@ -30,6 +30,8 @@ import netsvc
import time import time
import tools import tools
import decimal_precision as dp
#---------------------------------------------------------- #----------------------------------------------------------
# Incoterms # 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\'.\ 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.'), \nThe state is \'Waiting\' if the move is waiting for another one.'),
'price_unit': fields.float('Unit Price', '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), '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"), '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"), 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Orders"),