[MERGE] forward port of bugfixes made in addons v7 up to revision 9098.
authorQuentin (OpenERP) <qdp-launchpad@openerp.com>
Tue, 14 May 2013 12:03:41 +0000 (14:03 +0200)
committerQuentin (OpenERP) <qdp-launchpad@openerp.com>
Tue, 14 May 2013 12:03:41 +0000 (14:03 +0200)
bzr revid: qdp-launchpad@openerp.com-20130514120341-cvxysuez350hy9s2

1  2 
addons/account/account_view.xml
addons/account_voucher/account_voucher.py
addons/account_voucher/test/case1_usd_usd_payment_rate.yml
addons/account_voucher/test/case2_usd_eur_debtor_in_eur.yml
addons/purchase/purchase.py

Simple merge
@@@ -27,6 -28,24 +27,18 @@@ import openerp.addons.decimal_precisio
  from openerp.tools.translate import _
  from openerp.tools import float_compare
  
+ class res_currency(osv.osv):
+     _inherit = "res.currency"
 -    def _current_rate(self, cr, uid, ids, name, arg, context=None):
++    def _get_current_rate(self, cr, uid, ids, name, arg, context=None):
+         if context is None:
+             context = {}
 -        res = super(res_currency, self)._current_rate(cr, uid, ids, name, arg, context=context)
++        res = super(res_currency, self)._get_current_rate(cr, uid, ids, name, arg, context=context)
+         if context.get('voucher_special_currency') in ids and context.get('voucher_special_currency_rate'):
+             res[context.get('voucher_special_currency')] = context.get('voucher_special_currency_rate')
+         return res
 -    _columns = {
 -        # same definition of rate that in base in order to just overwrite the function
 -        'rate': fields.function(_current_rate, string='Current Rate', digits=(12,6),
 -            help='The rate of the currency to the currency of rate 1.'),
 -    }
 -
  class res_company(osv.osv):
      _inherit = "res.company"
      _columns = {
@@@ -222,7 -243,7 +234,7 @@@ class account_voucher(osv.osv)
      def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_currency, type, context=None):
          context = context or {}
          if not line_dr_ids and not line_cr_ids:
--            return {'value':{'writeoff_amount': 0.0, 'is_multi_currency': False}}
++            return {'value':{'writeoff_amount': 0.0}}
          line_osv = self.pool.get("account.voucher.line")
          line_dr_ids = resolve_o2m_operations(cr, uid, line_osv, line_dr_ids, ['amount'], context)
          line_cr_ids = resolve_o2m_operations(cr, uid, line_osv, line_cr_ids, ['amount'], context)
index 0000000,92c2e46..037fc14
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,249 +1,247 @@@
+ -
+   In order to check the Account_voucher module with multi-currency in OpenERP, 
+   I create 2 Invoices in USD and make 1 Payment in USD based on the currency rating given by the bank which is slightly different that the one encoded in OpenERP
+ -
+   I set the income and expense currency accounts on the main company
+ -
+   !python {model: res.company}: |
+     from datetime import datetime
+     vals = {
+       'income_currency_exchange_account_id': ref('account.o_expense'),
+       'expense_currency_exchange_account_id': ref('account.o_expense')}
+     self.write(cr, uid, ref('base.main_company'), vals)
+ -
+   I create currency USD in OpenERP for January of 1.333333 Rate
+ -
+   !python {model: res.currency.rate}: |
+     from datetime import datetime
+     curr_id = self.pool.get('res.currency').search(cr, uid, [('name', '=', 'USD')])[0]
+     date = '%s-01-01' %(datetime.now().year)
+     ids = self.search(cr, uid, [('currency_id','=',curr_id), ('name', '=', date)])
+     self.write(cr, uid, ids, {'rate': 1.333333})
+ -
+   I create currency USD in OpenERP for February of 1.250000 Rate
+ -
+   !record {model: res.currency.rate, id: feb_usd}:
+     currency_id: base.USD
+     name: !eval "'%s-02-01' %(datetime.now().year)"
+     rate: 1.250000
+ -
+   I create currency USD in OpenERP for March of 1.111111 Rate
+ -
+   !record {model: res.currency.rate, id: mar_usd}:
+     currency_id: base.USD
+     name: !eval "'%s-03-01' %(datetime.now().year)"
+     rate: 1.111111
+ -
+   I create currency USD in OpenERP for April of 1.052632 Rate
+ -
+   !record {model: res.currency.rate, id: apr_usd}:
+     currency_id: base.USD
+     name: !eval "'%s-04-01' %(datetime.now().year)"
+     rate: 1.052632
+ -
+   I create a cash account with currency USD
+ -
+   !record {model: account.account, id: account_cash_usd_id}:
+     currency_id: base.USD
+     name: "cash account in usd"
+     code: "Xcash usd"
+     type: 'liquidity'
+     user_type: "account.data_account_type_cash"
+ -
+   I create a bank journal with USD as currency
+ -
+   !record {model: account.journal, id: bank_journal_USD}:
+     name: Bank Journal(USD)
+     code: BUSD
+     type: bank
+     analytic_journal_id: account.sit
+     sequence_id: account.sequence_bank_journal
+     default_debit_account_id: account_cash_usd_id
+     default_credit_account_id: account_cash_usd_id
+     currency: base.USD
+     company_id: base.main_company
+ -
+   I create a new partner Kate Mc Kay
+ -
+   !record {model: res.partner, id: res_partner_mc_kay}:
+     name: "Mc Kay Kate"
+     property_account_receivable: account.a_recv
+     property_account_payable: account.a_pay
+ -
+   I create the first invoice on 1st January  for 200 USD
+ -
+   !record {model: account.invoice, id: account_invoice_jan_payment_rate}:
+     account_id: account.a_recv
+     company_id: base.main_company
+     currency_id: base.USD
+     date_invoice: !eval "'%s-01-01' %(datetime.now().year)"
+     period_id: account.period_1
+     invoice_line:
+       - account_id: account.a_sale
+         name: '[PCSC234] PC Assemble SC234'
+         price_unit: 200.0
+         quantity: 1.0
+         product_id: product.product_product_3
+         uos_id: product.product_uom_unit
+     journal_id: account.sales_journal
+     partner_id: res_partner_mc_kay
+     reference_type: none
+ -
+   I Validate invoice by clicking on Validate button
+ -
+   !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_jan_payment_rate}
+ -
+   I check that first invoice move is correct for debtor account (debit - credit == 150.0)
+ -
+   !python {model: account.invoice}: |
+     invoice_id = self.browse(cr, uid, ref("account_invoice_jan_payment_rate"))
+     assert invoice_id.move_id, "Move not created for open invoice"
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)])
+     move_line = move_line_obj.browse(cr, uid, move_lines[0])
+     assert (move_line.debit - move_line.credit == 150.0), "Invoice move is not correct for debtors account"
+ -
+   I create the second invoice on 1st February for 100 USD
+ -
+   !record {model: account.invoice, id: account_invoice_feb_payment_rate}:
+     account_id: account.a_recv
+     company_id: base.main_company
+     currency_id: base.USD
+     date_invoice: !eval "'%s-02-01' %(datetime.now().year)"
+     period_id: account.period_2
+     invoice_line:
+       - account_id: account.a_sale
+         name: '[PCSC234] PC Assemble SC234'
+         price_unit: 100.0
+         quantity: 1.0
+         product_id: product.product_product_3
+         uos_id: product.product_uom_unit
+     journal_id: account.sales_journal
+     partner_id: res_partner_mc_kay
+     reference_type: none
+ -
+   I Validate invoice by clicking on Validate button
+ -
+   !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_feb_payment_rate}
+ -
+   I check that second invoice move is correct for debtor account (debit - credit == 80)
+ -
+   !python {model: account.invoice}: |
+     invoice_id = self.browse(cr, uid, ref("account_invoice_feb_payment_rate"))
+     assert invoice_id.move_id, "Move not created for open invoice"
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)])
+     move_line = move_line_obj.browse(cr, uid, move_lines[0])
+     assert (move_line.debit - move_line.credit == 80), "Invoice move is not correct for debtors account"
+ -
+   I set the context that will be used for the encoding of all the vouchers of this file
+ -
+   !context
+     'type': 'receipt'
+ -
+   On the first March, I create the first voucher of payment with values 240 USD, journal USD, and specifying that $1 = 0.8€
+ -
+   !record {model: account.voucher, id: account_voucher_1_case1_payment_rate, view: view_vendor_receipt_form}:
+     account_id: account.cash
+     amount: 240.0
+     company_id: base.main_company
+     journal_id: bank_journal_USD
+     name: 'Payment: Case 1 USD/USD payment rate'
+     partner_id: res_partner_mc_kay
+     period_id: account.period_3
+     date: !eval time.strftime("%Y-03-01")
+     payment_option: 'with_writeoff'
+     writeoff_acc_id: account.a_expense
+     comment: 'Write Off'
+     payment_rate: 0.8
+     payment_rate_currency_id: base.EUR
+ -
+   I fill amounts 180 for the invoice of 200$ and 70 for the invoice of 100$>
+ -
+   !python {model: account.voucher}: |
 -    import netsvc, time
+     vals = {}
+     voucher_id = self.browse(cr, uid, ref('account_voucher_1_case1_payment_rate'))
+     data = []
+     for item in voucher_id.line_cr_ids:
+         if item.amount_unreconciled == 200.00:
+             data += [(item.id, 180.0)]
+         else:
+             data += [(item.id, 70.0)]
+     for line_id, amount in data:
+         self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
+     assert (voucher_id.state=='draft'), "Voucher is not in draft state"
+ -
+   I check that writeoff amount computed is -10.0
+ -
+   !python {model: account.voucher}: |
+     voucher = ref('account_voucher_1_case1_payment_rate') 
+     voucher_id = self.browse(cr, uid, voucher)
+     assert (voucher_id.writeoff_amount == -10.0), "Writeoff amount is not -10.0"
+ -
+   I confirm the voucher
+ -
+   !python {model: account.voucher}: |
 -    import netsvc
 -    wf_service = netsvc.LocalService("workflow")
 -    wf_service.trg_validate(uid, 'account.voucher', ref('account_voucher_1_case1_payment_rate'), 'proforma_voucher', cr)
++    voucher = ref('account_voucher_1_case1_payment_rate') 
++    self.signal_proforma_voucher(cr, uid, [voucher])
+ -
+   I check that the move of my first voucher is valid
+ -
+   !python {model: account.voucher}: |
+     voucher = ref('account_voucher_1_case1_payment_rate') 
+     voucher_id = self.browse(cr, uid, voucher)
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
+     for move_line in move_line_obj.browse(cr, uid, move_lines):
+         assert move_line.state == 'valid', "Voucher move is not valid"
+ -
+   I check that my debtor account is correct
+ -
+   I check that the debtor account has 2 new lines with -180 and -70 as amount_currency columns and that their credit columns are respectively 144 and 56
+ -
+   I check that my write-off is correct. 8 debit and 10 amount_currency
+ -
+   !python {model: account.voucher}: |
+     voucher = ref('account_voucher_1_case1_payment_rate') 
+     voucher_id = self.browse(cr, uid, voucher)
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
+     for move_line in move_line_obj.browse(cr, uid, move_lines):
+         if move_line.amount_currency == -180.00:
+             assert move_line.credit == 144.00, "Debtor account has wrong entry."
+         elif move_line.amount_currency == -70.00:
+             assert move_line.credit == 56.00, "Debtor account has wrong entry."
+         elif move_line.amount_currency == 10.00:
+             assert move_line.debit == 8.00, "Writeoff amount is wrong: Got a debit of %s (expected 8,00€)" % (move_line.debit)
+         elif move_line.amount_currency == 240.00:
+             assert move_line.debit == 192.00, "Bank entry is wrong."
+         else:
+             assert False, "Unrecognized journal entry"
+ -
+   I check the residual amount of Invoice1, should be 20 in amount_currency and 6 in amount_residual
+ -
+   !python {model: account.invoice}: |
+     invoice_id = self.browse(cr, uid, ref("account_invoice_jan_payment_rate"))
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
+     move_line = move_line_obj.browse(cr, uid, move_lines[0])
+     assert (move_line.amount_residual == 6.0) , "Residual amount is not correct for first Invoice"
+     assert (move_line.amount_residual_currency == 20.0) , "Residual amount in currency is not correct for first Invoice"
+ -
+   I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual
+ -
+   !python {model: account.invoice}: |
+     invoice_id = self.browse(cr, uid, ref("account_invoice_feb_payment_rate"))
+     move_line_obj = self.pool.get('account.move.line')
+     move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
+     move_line = move_line_obj.browse(cr, uid, move_lines[0])
+     assert (move_line.amount_residual == 24.0) , "Residual amount is not correct for second Invoice"
+     assert (move_line.amount_residual_currency == 30.0) , "Residual amount in currency is not correct for second Invoice"
Simple merge