diff --git a/purchase.py b/purchase.py index 145992f53c..9b9b9f1811 100644 --- a/purchase.py +++ b/purchase.py @@ -42,16 +42,17 @@ class Purchase(OSV): domain=[('type', '=', 'warehouse')], required=True, states=_STATES) currency = fields.Many2One('currency.currency', 'Currency', required=True, states=_STATES) + currency_digits = fields.Function('get_currency_digits', type='integer', + string='Currency Digits', on_change_with=['currency']) lines = fields.One2Many('purchase.line', 'purchase', 'Lines', states=_STATES) comment = fields.Text('Comment') - #TODO digits must depend of currency untaxed_amount = fields.Function('get_untaxed_amount', type='numeric', - digits=(16, 2), string='Untaxed') + digits="(16, currency_digits)", string='Untaxed') tax_amount = fields.Function('get_tax_amount', type='numeric', - digits=(16, 2), string='Tax') + digits="(16, currency_digits)", string='Tax') total_amount = fields.Function('get_total_amount', type='numeric', - digits=(16, 2), string='Total') + digits="(16, currency_digits)", string='Total') invoice_method = fields.Selection([ ('manual', 'Manual'), ('order', 'From Order'), @@ -160,6 +161,21 @@ class Purchase(OSV): res['payment_term'], context=context)[0] return res + def on_change_with_currency_digits(self, cursor, user, ids, vals, + context=None): + currency_obj = self.pool.get('currency.currency') + if vals.get('currency'): + currency = currency_obj.browse(cursor, user, vals['currency'], + context=context) + return currency.digits + return 2 + + def get_currency_digits(self, cursor, user, ids, name, arg, context=None): + res = {} + for purchase in self.browse(cursor, user, ids, context=context): + res[purchase.id] = purchase.currency.digits + return res + def get_untaxed_amount(self, cursor, user, ids, name, arg, context=None): currency_obj = self.pool.get('currency.currency') res = {} @@ -457,9 +473,11 @@ class PurchaseLine(OSV): 'required': "type == 'line'", }) amount = fields.Function('get_amount', type='numeric', string='Amount', + digits="(16, parent.currency_digits)", states={ 'invisible': "type not in ('line', 'subtotal')", - }, on_change_with=['type', 'quantity', 'unit_price']) + }, on_change_with=['type', 'quantity', 'unit_price', + 'parent.currency']) description = fields.Char('Description', size=None, required=True) comment = fields.Text('Comment', states={ @@ -589,10 +607,16 @@ class PurchaseLine(OSV): return res def on_change_with_amount(self, cursor, user, ids, vals, context=None): + currency_obj = self.pool.get('currency.currency') if vals.get('type') == 'line': - #TODO add rounding - return Decimal(str(vals.get('quantity') or '0.0')) * \ - (vals.get('unit_price') or Decimal('0.0')) + if isinstance(vals.get('parent.currency'), (int, long)): + currency = currency_obj.browse(cursor, user, + vals['parent.currency'], context=context) + else: + currency = vals['parent.currency'] + return currency_obj.round(cursor, user, currency, + Decimal(str(vals.get('quantity') or '0.0')) * \ + (vals.get('unit_price') or Decimal('0.0'))) return Decimal('0.0') def get_amount(self, cursor, user, ids, name, arg, context=None): diff --git a/purchase.xml b/purchase.xml index f312d46f18..34507a7181 100644 --- a/purchase.xml +++ b/purchase.xml @@ -99,6 +99,7 @@ + ]]> @@ -120,6 +121,7 @@ + ]]>