[IMP] account_voucher: multi currency handling
authorQuentin (OpenERP) <qdp-launchpad@openerp.com>
Tue, 22 Nov 2011 16:55:37 +0000 (17:55 +0100)
committerQuentin (OpenERP) <qdp-launchpad@openerp.com>
Tue, 22 Nov 2011 16:55:37 +0000 (17:55 +0100)
bzr revid: qdp-launchpad@openerp.com-20111122165537-2c8a9ov2qjklq2wj

addons/account_voucher/account_voucher.py
addons/account_voucher/test/account_voucher.yml
addons/account_voucher/test/sales_receipt.yml
addons/account_voucher/voucher_payment_receipt_view.xml

index fd6dac9..4b099ee 100644 (file)
@@ -90,6 +90,17 @@ class account_voucher(osv.osv):
             return tax_id
         return False
 
+    def _get_payment_rate_currency(self, cr, uid, context=None):
+        if context is None: context = {}
+        journal_pool = self.pool.get('account.journal')
+        journal_id = context.get('journal_id', False)
+        if journal_id:
+            journal = journal_pool.browse(cr, uid, journal_id, context=context)
+            if journal.currency:
+                return journal.currency.id
+        #no journal given in the context, use company currency as default
+        return self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.currency_id.id
+
     def _get_currency(self, cr, uid, context=None):
         if context is None: context = {}
         journal_pool = self.pool.get('account.journal')
@@ -143,11 +154,21 @@ class account_voucher(osv.osv):
 
         res = super(account_voucher, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
         doc = etree.XML(res['arch'])
-        nodes = doc.xpath("//field[@name='partner_id']")
+
+        # replace the label of the field payment_rate
+        currency_obj = self.pool.get('res.currency')
+        base_currency_id = currency_obj.search(cr, uid, [('rate','=',1.0),('rate_ids','=',1.0)], context=context)
+        symbol = base_currency_id and currency_obj.name_get(cr, uid, base_currency_id, context=context)[0][1]
+        string = _("Rate for this operation: 1 %s is") % symbol
+        payment_rate_field = doc.xpath("//field[@name='payment_rate']")
+        for field in payment_rate_field:
+            field.set('string', string)
+
         if context.get('type', 'sale') in ('purchase', 'payment'):
+            nodes = doc.xpath("//field[@name='partner_id']")
             for node in nodes:
                 node.set('domain', "[('supplier', '=', True)]")
-            res['arch'] = etree.tostring(doc)
+        res['arch'] = etree.tostring(doc)
         return res
 
     def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount):
@@ -184,7 +205,10 @@ class account_voucher(osv.osv):
         res = {}
         debit = credit = 0.0
         for voucher in self.browse(cr, uid, ids, context=context):
-            res[voucher.id] =  voucher.amount / voucher.payment_rate
+            rate = voucher.currency_id.rate or voucher.company_id.currency_id.rate
+            if voucher.currency_id == voucher.payment_rate_currency_id:
+                rate =  voucher.payment_rate
+            res[voucher.id] =  voucher.amount / rate * voucher.company_id.currency_id.rate
         return res
 
     _name = 'account.voucher'
@@ -247,8 +271,9 @@ class account_voucher(osv.osv):
         'comment': fields.char('Counterpart Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
         'analytic_id': fields.many2one('account.analytic.account','Write-Off Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
         'writeoff_amount': fields.function(_get_writeoff_amount, string='Reconcile Amount', type='float', readonly=True),
+        'payment_rate_currency_id': fields.many2one('res.currency', 'Payment Rate Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
         'payment_rate': fields.float('Payment Rate', digits=(12,6), required=True, readonly=True, states={'draft': [('readonly', False)]},
-            help='The rate between the journal currency and the company currency for this particular payment.'),
+            help='The specific rate that will be used for this voucher for the selected currency.'),
         'paid_amount_in_company_currency': fields.function(_paid_amount_in_company_currency, string='Paid Amount in Company Currency', type='float', readonly=True),
     }
     _defaults = {
@@ -269,6 +294,7 @@ class account_voucher(osv.osv):
         'payment_option': 'without_writeoff',
         'comment': _('Write-Off'),
         'payment_rate': 1.0,
+        'payment_rate_currency_id': _get_payment_rate_currency,
     }
 
     def compute_tax(self, cr, uid, ids, context=None):
@@ -374,7 +400,7 @@ class account_voucher(osv.osv):
             })
         return {'value':default}
 
-    def onchange_journal_voucher(self, cr, uid, ids, line_ids=False, tax_id=False, price=0.0, partner_id=False, journal_id=False, ttype=False, context=None):
+    def onchange_journal_voucher(self, cr, uid, ids, line_ids=False, tax_id=False, price=0.0, partner_id=False, journal_id=False, ttype=False, company_id=False, context=None):
         """price
         Returns a dict that contains new values and context
 
@@ -413,20 +439,25 @@ class account_voucher(osv.osv):
         default['value']['account_id'] = account_id
         default['value']['type'] = ttype or tr_type
 
-        vals = self.onchange_journal(cr, uid, ids, journal_id, line_ids, tax_id, partner_id, context)
+        vals = self.onchange_journal(cr, uid, ids, journal_id, line_ids, tax_id, partner_id, company_id, context)
         default['value'].update(vals.get('value'))
 
         return default
 
-    def onchange_rate(self, cr, uid, ids, rate, amount, context=None):
-        res =  {'value': {'paid_amount_in_company_currency': 0.0}}
-        if rate and amount:
-            res['value']['paid_amount_in_company_currency'] = amount / rate
+    def onchange_rate(self, cr, uid, ids, rate, amount, currency_id, payment_rate_currency_id, company_id, context=None):
+        res =  {'value': {}}
+        if rate and amount and currency_id and currency_id == payment_rate_currency_id:
+            company_rate = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id.rate 
+            res['value']['paid_amount_in_company_currency'] = amount / rate * company_rate
         return res
 
-    def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, context=None):
+    def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=None):
+        if context is None:
+            context = {}
         res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context=context)
-        vals = self.onchange_rate(cr, uid, ids, rate, amount, context=context)
+        ctx = context.copy()
+        ctx.update({'date': date})
+        vals = self.onchange_rate(cr, uid, ids, rate, amount, currency_id, payment_rate_currency_id, company_id, context=ctx)
         for key in vals.keys():
             res[key].update(vals[key])
         return res
@@ -582,7 +613,22 @@ class account_voucher(osv.osv):
             default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price)
         return default
 
-    def onchange_date(self, cr, uid, ids, date, currency_id, amount, context=None):
+    def onchange_payment_rate_currency(self, cr, uid, ids, currency_id, payment_rate_currency_id, date, amount, company_id, context=None):
+        if context is None:
+            context = {}
+        res = {'value': {}}
+        #set the default payment rate of the voucher and compute the paid amount in company currency
+        if currency_id and currency_id == payment_rate_currency_id:
+            ctx = context.copy()
+            ctx.update({'date': date})
+            payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context=ctx).rate
+            res['value'].update({'payment_rate': payment_rate})
+            vals = self.onchange_rate(cr, uid, ids, payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context=ctx)
+            for key in vals.keys():
+                res[key].update(vals[key])
+        return res
+
+    def onchange_date(self, cr, uid, ids, date, currency_id, payment_rate_currency_id, amount, company_id, context=None):
         """
         @param date: latest value from user input for field date
         @param args: other arguments
@@ -590,22 +636,19 @@ class account_voucher(osv.osv):
         @return: Returns a dict which contains new values, and context
         """
         res = {'value': {}}
+        #FIXME: use find() hereunder
+
         #set the period of the voucher
         period_pool = self.pool.get('account.period')
         pids = period_pool.search(cr, uid, [('date_start', '<=', date), ('date_stop', '>=', date)])
         if pids:
             res['value'].update({'period_id':pids[0]})
-        #set the default payment rate of the voucher and compute the paid amount in company currency
-        payment_rate = 1.0
-        if currency_id:
-            payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context={'date': date}).rate
-        res['value'].update({'payment_rate': payment_rate})
-        vals = self.onchange_rate(cr, uid, ids, payment_rate, amount, context=context)
+        vals = self.onchange_payment_rate_currency(cr, uid, ids, currency_id, payment_rate_currency_id, date, amount, company_id, context=context)
         for key in vals.keys():
             res[key].update(vals[key])
         return res
 
-    def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, date, amount, ttype, context=None):
+    def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, date, amount, ttype, company_id, context=None):
         if not journal_id:
             return False
         journal_pool = self.pool.get('account.journal')
@@ -620,12 +663,16 @@ class account_voucher(osv.osv):
         currency_id = False
         if journal.currency:
             currency_id = journal.currency.id
-            payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context={'date': date}).rate
+            ctx = context.copy()
+            ctx.update({'date': date})
+            payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context=ctx).rate
             vals['value'].update({'payment_rate': payment_rate})
-            res = self.onchange_rate(cr, uid, ids, payment_rate, amount, context=context)
+            res = self.onchange_rate(cr, uid, ids, payment_rate, amount, currency_id, currency_id, company_id, context=ctx)
             for key in res.keys():
                 vals[key].update(res[key])
-        vals['value'].update({'currency_id': currency_id})
+        if currency_id:
+            vals['value'].update({'currency_id': currency_id})
+            vals['value'].update({'payment_rate_currency_id': currency_id})
         res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context)
         for key in res.keys():
             vals[key].update(res[key])
@@ -730,9 +777,9 @@ class account_voucher(osv.osv):
         # TODO: Make this logic available.
         # -for sale, purchase we have but for the payment and receipt we do not have as based on the bank/cash journal we can not know its payment or receipt
         if voucher_brw.type in ('purchase', 'payment'):
-            credit = voucher_brw.amount / voucher_brw.payment_rate
+            credit = voucher_brw.paid_amount_in_company_currency#voucher_brw.amount / voucher_brw.payment_rate * voucher_brw.company_id.currency_id.rate
         elif voucher_brw.type in ('sale', 'receipt'):
-            debit = voucher_brw.amount / voucher_brw.payment_rate
+            debit = voucher_brw.paid_amount_in_company_currency#amount / voucher_brw.payment_rate * voucher_brw.company_id.currency_id.rate
         if debit < 0: credit = -debit; debit = 0.0
         if credit < 0: debit = -credit; credit = 0.0
         sign = debit - credit < 0 and -1 or 1
@@ -831,6 +878,24 @@ class account_voucher(osv.osv):
         }
         return (move_line, move_line_counterpart)
 
+    def _convert_amount(self, cr, uid, amount, voucher_id, context=None):
+        #TODO: doccument me
+        currency_obj = self.pool.get('res.currency')
+        voucher = self.browse(cr, uid, voucher_id, context=context)
+        res = amount
+        if voucher.payment_rate_currency_id.id == voucher.company_id.currency_id.id:
+            rate_between_voucher_and_base = voucher.currency_id.rate or 1.0
+            rate_between_base_and_company = voucher.payment_rate or 1.0
+            res = amount / rate_between_voucher_and_base * rate_between_base_and_company
+        elif voucher.payment_rate_currency_id.id == voucher.currency_id.id:
+            rate_between_base_and_company = voucher.company_id.currency_id.rate or 1.0
+            rate_between_voucher_and_base = voucher.payment_rate or 1.0
+            res = amount / rate_between_voucher_and_base * rate_between_base_and_company
+        else:
+            res = currency_obj.compute(cr, uid, voucher.currency_id.id, voucher.company_id.currency_id.id, amount, context=ctx)
+        print 'res', res
+        return res
+
     def voucher_move_line_create(self, cr, uid, voucher_id, line_total, move_id, company_currency, current_currency, context=None):
         '''
         Create one account move line, on the given account move, per voucher line where amount is not 0.0.
@@ -843,24 +908,32 @@ class account_voucher(osv.osv):
         :param company_currency: id of currency of the company to which the voucher belong
         :param current_currency: id of currency of the voucher
         :return: Tuple build as (remaining amount not allocated on voucher lines, list of account_move_line created in this method)
-        :rtype: tuple(int, list of int)
+        :rtype: tuple(float, list of int)
         '''
+        if context is None:
+            context = {}
         move_line_obj = self.pool.get('account.move.line')
         currency_obj = self.pool.get('res.currency')
         tot_line = line_total
         rec_lst_ids = []
 
-        voucher_brw = self.pool.get('account.voucher').browse(cr,uid,voucher_id,context)
+        voucher_brw = self.pool.get('account.voucher').browse(cr, uid, voucher_id, context)
+        ctx = context.copy()
+        ctx.update({'date': voucher_brw.date})
         for line in voucher_brw.line_ids:
             #create one move line per voucher line where amount is not 0.0
             if not line.amount:
                 continue
-            #we check if the voucher line is fully paid or not and create a move line to balance the payment and initial invoice if needed
+            #TODO: comment me
+            amount = self._convert_amount(cr, uid, line.untax_amount or line.amount, voucher_brw.id, context=ctx)
+            #residual amount in company currency
+            #amount_residual = line.move_line_id.amount_residual - amount
+            #TODO: remove me
             if line.amount == line.amount_unreconciled:
-                amount = (line.untax_amount or line.amount) / voucher_brw.payment_rate
+            #    amount = (line.untax_amount or line.amount) / voucher_brw.payment_rate 
                 amount_residual = line.move_line_id.amount_residual - amount #residual amount in company currency
             else:
-                amount = (line.untax_amount or line.amount)  / voucher_brw.payment_rate
+            #    amount = (line.untax_amount or line.amount)  / voucher_brw.payment_rate
                 amount_residual = 0.0
             move_line = {
                 'journal_id': voucher_brw.journal_id.id,
@@ -997,6 +1070,9 @@ class account_voucher(osv.osv):
         for voucher in self.browse(cr, uid, ids, context=context):
             if voucher.move_id:
                 continue
+            #TODO: -need to check- Can't we just use the context returned by _sel_context?
+            ctx = context.copy()
+            ctx.update({'date': voucher.date})
             company_currency = self._get_company_currency(cr, uid, voucher.id, context)
             current_currency = self._get_current_currency(cr, uid, voucher.id, context)
             context = self._sel_context(cr, uid, voucher.id, context)
@@ -1010,9 +1086,9 @@ class account_voucher(osv.osv):
             line_total = move_line_brw.debit - move_line_brw.credit
             rec_list_ids = []
             if voucher.type == 'sale':
-                line_total = line_total - (voucher.tax_amount / voucher.payment_rate)
+                line_total = line_total - self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
             elif voucher.type == 'purchase':
-                line_total = line_total + (voucher.tax_amount / voucher.payment_rate)
+                line_total = line_total + self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
             #create one move line per voucher line where amount is not 0.0
             line_total, rec_list_ids = self.voucher_move_line_create(cr, uid, voucher.id, line_total, move_id, company_currency, current_currency, context)
 
index 33ae609..7e5482a 100644 (file)
@@ -5,7 +5,6 @@
     account_id: account.cash
     amount: 1000.0
     company_id: base.main_company
-    currency_id: base.EUR
     journal_id: account.bank_journal
     name: Voucher for Axelor
     narration: Basic Pc
index d3fd720..7ea4f7d 100644 (file)
@@ -5,7 +5,6 @@
     account_id: account.a_recv
     amount: 30000.0
     company_id: base.main_company
-    currency_id: base.EUR
     journal_id: account.sales_journal
     line_cr_ids:
       - account_id: account.a_sale
index 46720b2..4adebed 100644 (file)
                 <form string="Bill Payment">
                     <group col="6" colspan="4">
                         <field name="partner_id" required="1" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" context="{'invoice_currency':currency_id}" string="Supplier"/>
-                        <field name="amount" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, context)"/>
+                        <field name="amount" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
                         <field name="journal_id"
                             domain="[('type','in',['bank', 'cash'])]"
                             widget="selection" select="1"
-                            on_change="onchange_journal(journal_id, line_dr_ids, False, partner_id, date, amount, type, context)"
+                            on_change="onchange_journal(journal_id, line_dr_ids, False, partner_id, date, amount, type, company_id, context)"
                             string="Payment Method"/>
-                        <field name="date" select="1" on_change="onchange_date(date, currency_id, amount, context)"/>
+                        <field name="date" select="1" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id, context)"/>
                         <field name="reference" select="1" string="Payment Ref"/>
                         <field name="name" colspan="2"/>
                         <field name="account_id"
                                 <separator string="Internal Notes" colspan="2"/>
                                 <field name="narration" colspan="2" nolabel="1"/>
                             </group>
-                            <group col="2" colspan="1">
-                                <separator string="Other Information" colspan="2"/>
-                                <field name="currency_id"/>
-                                <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, context)" groups='base.group_extended'/>
-                                <field name="paid_amount_in_company_currency" groups='base.group_extended'/>
-                                <field name="number"/>
+                            <group col="4" colspan="1">
+                                <separator string="Other Information" colspan="4"/>
+                                <field name="currency_id" colspan="4"/>
+                                <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" groups='base.group_extended' colspan="3"/>
+                                <field name="payment_rate_currency_id" groups='base.group_extended' colspan="1" nolabel="1"/>
+                                <field name="paid_amount_in_company_currency" groups='base.group_extended' colspan="4" on_change="onchange_payment_rate_currency(currency_id, payment_rate_currency_id, date, amount, company_id, context)"/>
+                                <field name="number" colspan="4"/>
                             </group>
                         </page>
                     </notebook>
                 <form string="Bill Payment">
                     <group col="6" colspan="4">
                         <field name="partner_id" domain="[('supplier','=',True)]" required="1" invisible="context.get('line_type', False)" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" context="{'invoice_currency':currency_id}" string="Supplier"/>
-                        <field name="amount" invisible="context.get('line_type', False)" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, context)"/>
+                        <field name="amount" invisible="context.get('line_type', False)" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
                         <field name="journal_id"
                             domain="[('type','in',['bank', 'cash'])]"
                             invisible="context.get('line_type', False)"
                             widget="selection" select="1"
-                            on_change="onchange_journal(journal_id, line_dr_ids, False, partner_id, date, amount, type, context)"
+                            on_change="onchange_journal(journal_id, line_dr_ids, False, partner_id, date, amount, type, company_id, context)"
                             string="Payment Method"/>
-                        <field name="date" select="1" invisible="context.get('line_type', False)" on_change="onchange_date(date, currency_id, amount, context)"/>
+                        <field name="date" select="1" invisible="context.get('line_type', False)" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id, context)"/>
                         <field name="reference" select="1" invisible="context.get('line_type', False)" string="Payment Ref"/>
                         <field name="name" colspan="2" invisible="context.get('line_type', False)"/>
                         <field name="company_id" widget="selection" groups="base.group_multi_company"/>
                                 <field name="narration" colspan="2" nolabel="1"/>
                             </group>
                             <group col="2" colspan="1">
-                                <group col="2" colspan="1" attrs="{'invisible':[('currency_id','=',False)]}">
-                                    <separator string="Currency Options" colspan="2"/>
+                                <group col="4" colspan="1" attrs="{'invisible':[('currency_id','=',False)]}">
+                                    <separator string="Currency Options" colspan="4"/>
                                     <field name="exchange_acc_id"
-                                           domain="[('type','=','other')]"/>
-                                    <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, context)" groups='base.group_extended'/>
-                                    <field name="paid_amount_in_company_currency" groups='base.group_extended'/>
+                                           domain="[('type','=','other')]" colspan="4"/>
+                                    <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" groups='base.group_extended' colspan="3"/>
+                                    <field name="payment_rate_currency_id" groups='base.group_extended' colspan="1" nolabel="1"/>
+                                    <field name="paid_amount_in_company_currency" groups='base.group_extended' colspan="4" on_change="onchange_payment_rate_currency(currency_id, payment_rate_currency_id, date, amount, company_id, context)"/>
                                 </group>
                                 <group col="2" colspan="1">
                                     <separator string="Payment Options" colspan="2"/>
                         <field name="amount"
                             invisible="context.get('line_type', False)"
                             string="Paid Amount"
-                            on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, context)"/>
+                            on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
                         <field name="journal_id"
                             domain="[('type','in',['bank', 'cash'])]"
                             invisible="context.get('line_type', False)"
                             widget="selection" select="1"
-                            on_change="onchange_journal(journal_id, line_cr_ids, False, partner_id, date, amount, type, context)"
+                            on_change="onchange_journal(journal_id, line_cr_ids, False, partner_id, date, amount, type, company_id, context)"
                             string="Payment Method"/>
-                        <field name="date" select="1" invisible="context.get('line_type', False)" on_change="onchange_date(date, currency_id, amount, context)"/>
+                        <field name="date" select="1" invisible="context.get('line_type', False)" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id, context)"/>
                         <field name="reference" select="1" invisible="context.get('line_type', False)" string="Payment Ref"/>
                         <field name="name" colspan="2" invisible="context.get('line_type', False)"/>
                         <field name="company_id" widget="selection" groups="base.group_multi_company"/>
                                 <field name="narration" colspan="2" nolabel="1"/>
                             </group>
                             <group col="2" colspan="1">
-                                <group col="2" colspan="1" attrs="{'invisible':[('currency_id','=',False)]}">
-                                    <separator string="Currency Options" colspan="2"/>
+                                <group col="4" colspan="1" attrs="{'invisible':[('currency_id','=',False)]}">
+                                    <separator string="Currency Options" colspan="4"/>
                                     <field name="exchange_acc_id"
-                                           domain="[('type','=','other')]"/>
-                                    <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, context)" groups='base.group_extended'/>
-                                    <field name="paid_amount_in_company_currency" groups='base.group_extended'/>
+                                           domain="[('type','=','other')]" colspan="4"/>
+                                    <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" groups='base.group_extended' colspan="3"/>
+                                    <field name="payment_rate_currency_id" groups='base.group_extended' colspan="1" nolabel="1"/>
+                                    <field name="paid_amount_in_company_currency" groups='base.group_extended' colspan="4" on_change="onchange_payment_rate_currency(currency_id, payment_rate_currency_id, date, amount, company_id, context)"/>
                                 </group>
                                 <group col="2" colspan="1">
                                     <separator string="Payment Options" colspan="2"/>