From 0757ae25abdade0f0f354da3975e549a7c78b510 Mon Sep 17 00:00:00 2001 From: sebastien beau Date: Wed, 6 Jul 2011 02:26:24 +0200 Subject: [PATCH 01/99] [REF] refactor the methode make_po in order to make easier the overwritting bzr revid: sebastien.beau@akretion.com.br-20110706002624-8ag88jv5a5i979iy --- addons/purchase/purchase.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 6ec558acc97..1b3d0eeb839 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -761,6 +761,10 @@ class procurement_order(osv.osv): res = res.values() return len(res) and res[0] or 0 #TO CHECK: why workflow is generated error if return not integer value + def create_procurement_purchase_order(self, cr, uid, procurement, po_vals, line, context=None): + po_vals.update({'order_line': [(0,0,line)]}) + return self.pool.get('purchase.order').create(cr, uid, po_vals, context=context) + def make_po(self, cr, uid, ids, context=None): """ Make purchase order from procurement @return: New created Purchase Orders procurement wise @@ -774,7 +778,6 @@ class procurement_order(osv.osv): pricelist_obj = self.pool.get('product.pricelist') prod_obj = self.pool.get('product.product') acc_pos_obj = self.pool.get('account.fiscal.position') - po_obj = self.pool.get('purchase.order') for procurement in self.browse(cr, uid, ids, context=context): res_id = procurement.move_id.id partner = procurement.product_id.seller_id # Taken Main Supplier of Product of Procurement. @@ -799,6 +802,8 @@ class procurement_order(osv.osv): context.update({'lang': partner.lang, 'partner_id': partner_id}) product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context) + taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id + taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids) line = { 'name': product.partner_ref, @@ -809,25 +814,20 @@ class procurement_order(osv.osv): 'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'), 'move_dest_id': res_id, 'notes': product.description_purchase, + 'taxes_id': [(6,0,taxes)], } - - taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id - taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids) - line.update({ - 'taxes_id': [(6,0,taxes)] - }) - purchase_id = po_obj.create(cr, uid, { + + po_vals = { 'origin': procurement.origin, 'partner_id': partner_id, 'partner_address_id': address_id, 'location_id': procurement.location_id.id, 'pricelist_id': pricelist_id, - 'order_line': [(0,0,line)], 'company_id': procurement.company_id.id, 'fiscal_position': partner.property_account_position and partner.property_account_position.id or False - }) - res[procurement.id] = purchase_id - self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': purchase_id}) + } + res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line, context=context) + self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]}) return res procurement_order() From 9cbccd3f0e94788bba2467597a0d6691632b5816 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 13 Jul 2011 16:05:24 +0200 Subject: [PATCH 02/99] [IMP] account_voucher: added property fields on res.company for auto exchange rate account bzr revid: qdp-launchpad@openerp.com-20110713140524-j1uylbsryd1j0go0 --- addons/account_voucher/__init__.py | 3 +- addons/account_voucher/__openerp__.py | 1 + addons/account_voucher/company.py | 45 +++++++++++++++++++++++++ addons/account_voucher/company_view.xml | 18 ++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 addons/account_voucher/company.py create mode 100644 addons/account_voucher/company_view.xml diff --git a/addons/account_voucher/__init__.py b/addons/account_voucher/__init__.py index 9796f81d5e5..098d82ea361 100644 --- a/addons/account_voucher/__init__.py +++ b/addons/account_voucher/__init__.py @@ -20,8 +20,9 @@ ############################################################################## import account_voucher +import company import invoice import report import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index ef93be397a0..039d3e067af 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -47,6 +47,7 @@ Account Voucher module includes all the basic requirements of Voucher Entries fo "wizard/account_voucher_unreconcile_view.xml", "wizard/account_statement_from_invoice_view.xml", "account_voucher_view.xml", + "company_view.xml", "voucher_payment_receipt_view.xml", "voucher_sales_purchase_view.xml", "account_voucher_wizard.xml", diff --git a/addons/account_voucher/company.py b/addons/account_voucher/company.py new file mode 100644 index 00000000000..d8f0409a710 --- /dev/null +++ b/addons/account_voucher/company.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import fields, osv + +class res_company(osv.osv): + _inherit = "res.company" + _columns = { + 'property_income_currency_exchange': fields.property( + 'account.account', + type='many2one', + relation='account.account', + string="Income Currency Exchange", + view_load=True, + domain="[('type', '=', 'other')]", + 'property_expense_currency_exchange': fields.property( + 'account.account', + type='many2one', + relation='account.account', + string="Expense Currency Exchange", + view_load=True, + domain="[('type', '=', 'other')]", + } + +res_company() + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/company_view.xml b/addons/account_voucher/company_view.xml new file mode 100644 index 00000000000..97d6edc31b7 --- /dev/null +++ b/addons/account_voucher/company_view.xml @@ -0,0 +1,18 @@ + + + + + res.company.form.inherit + + res.company + form + + + + + + + + + + From bbee50ce0164e36fc0ef46723320efbf4bf7cf93 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 13 Jul 2011 16:06:18 +0200 Subject: [PATCH 03/99] [IMP] account_voucher: imp in customer payment form view bzr revid: qdp-launchpad@openerp.com-20110713140618-kcd3vii57bibsk4g --- .../voucher_payment_receipt_view.xml | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 7be6022c474..88d84a7c7f0 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -288,27 +288,29 @@ form
- - - + + - - - - - + + + + + + + - - + + @@ -356,7 +358,6 @@ - From 7039769b08fe90d70fd0c1b091a3e00bf135dd5d Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 13 Jul 2011 16:59:29 +0200 Subject: [PATCH 04/99] [FIX] account_voucher: syntax error fixed bzr revid: qdp-launchpad@openerp.com-20110713145929-4eheevdmmijncrc4 --- addons/account_voucher/company.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account_voucher/company.py b/addons/account_voucher/company.py index d8f0409a710..8c877c8b635 100644 --- a/addons/account_voucher/company.py +++ b/addons/account_voucher/company.py @@ -30,14 +30,14 @@ class res_company(osv.osv): relation='account.account', string="Income Currency Exchange", view_load=True, - domain="[('type', '=', 'other')]", + domain="[('type', '=', 'other')]",), 'property_expense_currency_exchange': fields.property( 'account.account', type='many2one', relation='account.account', string="Expense Currency Exchange", view_load=True, - domain="[('type', '=', 'other')]", + domain="[('type', '=', 'other')]",), } res_company() From f2fc1fcd179ec1158490c4e59dd7e8cc5be34c7e Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 14 Jul 2011 15:44:21 +0200 Subject: [PATCH 05/99] [IMP] account_voucher: lots of improvements (part 1) bzr revid: qdp-launchpad@openerp.com-20110714134421-q453j1z6upq03ter --- addons/account_voucher/account_voucher.py | 252 +++++++++++------- .../voucher_payment_receipt_view.xml | 10 +- 2 files changed, 162 insertions(+), 100 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 0e85904dcd7..5b8be1d8a8b 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -142,33 +142,56 @@ class account_voucher(osv.osv): res['arch'] = etree.tostring(doc) return res - def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount): - debit = credit = 0.0 + def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, context=None): + if context is None: + context = {} + ctx = context.copy() + debit = credit = currency_rate_diff = 0.0 + #import pdb;pdb.set_trace() for l in line_dr_ids: + ctx.update({'date': l['date_original']}) + currency_rate_diff += 'amount_in_company_currency' in l and l['amount_in_company_currency'] or self.pool.get('res.currency').compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount_original'], context=ctx) debit += l['amount'] for l in line_cr_ids: + ctx.update({'date': l['date_original']}) + currency_rate_diff -= 'amount_in_company_currency' in l and l['amount_in_company_currency'] or self.pool.get('res.currency').compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount_original'], context=ctx) credit += l['amount'] - return abs(amount - abs(credit - debit)) + return abs(amount - abs(credit - debit)), currency_rate_diff def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, context=None): - context = context or {} if not line_dr_ids and not line_cr_ids: return {'value':{}} 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) - return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount)}} + currency_pool = self.pool.get('res.currency') + writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, context=context) + return {'value': {'writeoff_amount': writeoff_amount,}}# 'currency_rate_difference': currency_rate_diff}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): if not ids: return {} - res = {} - debit = credit = 0.0 + if context is None: + context = {} + res = {}.fromkeys(ids,{}) + counter_for_writeoff = counter_for_currency_diff = real_amount = expected_amount = 0.0 + currency_pool = self.pool.get('res.currency') for voucher in self.browse(cr, uid, ids, context=context): + ctx = context.copy() for l in voucher.line_dr_ids: - debit += l.amount + real_amount -= l.amount_in_company_currency + ctx.update({'date': l.date_original}) + counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) + ctx.update({'date': voucher.date}) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) for l in voucher.line_cr_ids: - credit += l.amount - res[voucher.id] = abs(voucher.amount - abs(credit - debit)) + real_amount += l.amount_in_company_currency + ctx.update({'date': l.date_original}) + counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) + ctx.update({'date': voucher.date}) + counter_for_currency_diff += l.amount and currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + writeoff_amount = voucher.amount - counter_for_writeoff + res[voucher.id]['writeoff_amount'] = writeoff_amount + res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff return res _name = 'account.voucher' @@ -193,8 +216,8 @@ class account_voucher(osv.osv): domain=[('type','=','dr')], context={'default_type':'dr'}, readonly=True, states={'draft':[('readonly',False)]}), 'period_id': fields.many2one('account.period', 'Period', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'narration':fields.text('Notes', readonly=True, states={'draft':[('readonly',False)]}), - 'currency_id':fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), -# 'currency_id': fields.related('journal_id','currency', type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, states={'draft':[('readonly',False)]}), + #'currency_id':fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), + 'currency_id': fields.related('journal_id','currency', type='many2one', relation='res.currency', string='Currency', store=True, readonly=True), 'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'state':fields.selection( [('draft','Draft'), @@ -228,7 +251,8 @@ class account_voucher(osv.osv): 'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account', readonly=True, states={'draft': [('readonly', False)]}), 'comment': fields.char('Write-Off 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='Write-Off Amount', type='float', readonly=True), + 'writeoff_amount': fields.function(_get_writeoff_amount, string='Write-Off Amount', type='float', readonly=True, multi="writeoff"), + 'currency_rate_difference': fields.function(_get_writeoff_amount, string="Currency Rate Difference", type='float', multi="writeoff"), } _defaults = { 'period_id': _get_period, @@ -491,27 +515,30 @@ class account_voucher(osv.osv): if line.debit and line.reconcile_partial_id and ttype == 'payment': continue original_amount = line.credit or line.debit or 0.0 - amount_unreconciled = currency_pool.compute(cr, uid, line.currency_id and line.currency_id.id or company_currency, currency_id, abs(line.amount_residual_currency), context=context_multi_currency) + amount_original, amount_unreconciled = line_pool._get_amounts(cr, uid, line, context=context) + currency_id = line.currency_id and line.currency_id.id or line.company_id.currency_id.id rs = { 'name':line.move_id.name, 'type': line.credit and 'dr' or 'cr', 'move_line_id':line.id, 'account_id':line.account_id.id, - 'amount_original': currency_pool.compute(cr, uid, line.currency_id and line.currency_id.id or company_currency, currency_id, line.currency_id and abs(line.amount_currency) or original_amount, context=context_multi_currency), + 'amount_original': amount_original, + 'amount': 0.0, + 'currency_id': currency_id, 'date_original':line.date, + 'company_currency_id': line.company_id.currency_id.id, 'date_due':line.date_maturity, 'amount_unreconciled': amount_unreconciled, - } - if line.credit: - amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_debit), context=context_multi_currency)) - rs['amount'] = amount - total_debit -= amount - else: - amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_credit), context=context_multi_currency)) - rs['amount'] = amount - total_credit -= amount + #if line.credit: + # amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_debit), context=context_multi_currency)) + # rs['amount'] = amount + # total_debit -= amount + #else: + # amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_credit), context=context_multi_currency)) + # rs['amount'] = amount + # total_credit -= amount default['value']['line_ids'].append(rs) if rs['type'] == 'cr': @@ -523,7 +550,7 @@ class account_voucher(osv.osv): default['value']['pre_line'] = 1 elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0: default['value']['pre_line'] = 1 - default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price) + default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, context=context) return default def onchange_date(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): @@ -636,44 +663,42 @@ class account_voucher(osv.osv): currency_pool = self.pool.get('res.currency') tax_obj = self.pool.get('account.tax') seq_obj = self.pool.get('ir.sequence') - for inv in self.browse(cr, uid, ids, context=context): - if inv.move_id: + for voucher in self.browse(cr, uid, ids, context=context): + if voucher.move_id: continue context_multi_currency = context.copy() - context_multi_currency.update({'date': inv.date}) + context_multi_currency.update({'date': voucher.date}) - if inv.number: - name = inv.number - elif inv.journal_id.sequence_id: - name = seq_obj.get_id(cr, uid, inv.journal_id.sequence_id.id) + if voucher.number: + name = voucher.number else: - raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !')) - if not inv.reference: + name = seq_obj.get_id(cr, uid, voucher.journal_id.sequence_id.id) + if not voucher.reference: ref = name.replace('/','') else: - ref = inv.reference + ref = voucher.reference move = { 'name': name, - 'journal_id': inv.journal_id.id, - 'narration': inv.narration, - 'date': inv.date, + 'journal_id': voucher.journal_id.id, + 'narration': voucher.narration, + 'date': voucher.date, 'ref': ref, - 'period_id': inv.period_id and inv.period_id.id or False + 'period_id': voucher.period_id and voucher.period_id.id or False } move_id = move_pool.create(cr, uid, move) #create the first line manually - company_currency = inv.journal_id.company_id.currency_id.id - current_currency = inv.currency_id.id + company_currency = voucher.journal_id.company_id.currency_id.id + current_currency = voucher.currency_id.id debit = 0.0 credit = 0.0 # TODO: is there any other alternative then the voucher type ?? # -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 inv.type in ('purchase', 'payment'): - credit = currency_pool.compute(cr, uid, current_currency, company_currency, inv.amount, context=context_multi_currency) - elif inv.type in ('sale', 'receipt'): - debit = currency_pool.compute(cr, uid, current_currency, company_currency, inv.amount, context=context_multi_currency) + if voucher.type in ('purchase', 'payment'): + credit = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.amount, context=context_multi_currency) + elif voucher.type in ('sale', 'receipt'): + debit = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.amount, context=context_multi_currency) if debit < 0: credit = -debit debit = 0.0 @@ -683,28 +708,28 @@ class account_voucher(osv.osv): sign = debit - credit < 0 and -1 or 1 #create the first line of the voucher move_line = { - 'name': inv.name or '/', + 'name': voucher.name or '/', 'debit': debit, 'credit': credit, - 'account_id': inv.account_id.id, + 'account_id': voucher.account_id.id, 'move_id': move_id, - 'journal_id': inv.journal_id.id, - 'period_id': inv.period_id.id, - 'partner_id': inv.partner_id.id, + 'journal_id': voucher.journal_id.id, + 'period_id': voucher.period_id.id, + 'partner_id': voucher.partner_id.id, 'currency_id': company_currency <> current_currency and current_currency or False, - 'amount_currency': company_currency <> current_currency and sign * inv.amount or 0.0, - 'date': inv.date, - 'date_maturity': inv.date_due + 'amount_currency': company_currency <> current_currency and sign * voucher.amount or 0.0, + 'date': voucher.date, + 'date_maturity': voucher.date_due } move_line_pool.create(cr, uid, move_line) rec_list_ids = [] line_total = debit - credit - if inv.type == 'sale': - line_total = line_total - currency_pool.compute(cr, uid, inv.currency_id.id, company_currency, inv.tax_amount, context=context_multi_currency) - elif inv.type == 'purchase': - line_total = line_total + currency_pool.compute(cr, uid, inv.currency_id.id, company_currency, inv.tax_amount, context=context_multi_currency) + if voucher.type == 'sale': + line_total = line_total - currency_pool.compute(cr, uid, voucher.currency_id.id, company_currency, voucher.tax_amount, context=context_multi_currency) + elif voucher.type == 'purchase': + line_total = line_total + currency_pool.compute(cr, uid, voucher.currency_id.id, company_currency, voucher.tax_amount, context=context_multi_currency) - for line in inv.line_ids: + for line in voucher.line_ids: #create one move line per voucher line where amount is not 0.0 if not line.amount: continue @@ -712,21 +737,26 @@ class account_voucher(osv.osv): if line.amount == line.amount_unreconciled: amount = line.move_line_id.amount_residual #residual amount in company currency else: - amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=context_multi_currency) + ctx = context_multi_currency.copy() + ctx.update({'date': line.date_original}) + amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=ctx) move_line = { - 'journal_id': inv.journal_id.id, - 'period_id': inv.period_id.id, + 'journal_id': voucher.journal_id.id, + 'period_id': voucher.period_id.id, 'name': line.name or '/', 'account_id': line.account_id.id, 'move_id': move_id, - 'partner_id': inv.partner_id.id, + 'partner_id': voucher.partner_id.id, 'currency_id': company_currency <> current_currency and current_currency or False, 'analytic_account_id': line.account_analytic_id and line.account_analytic_id.id or False, 'quantity': 1, 'credit': 0.0, 'debit': 0.0, - 'date': inv.date + 'date': voucher.date } + #TODO: assigner le montant de la diff de change sur le bon compte et pas debtor + #TODO: mettre le montant de company currency en onchange + readonly + computed + #TODO: mettre un champ difference de change sur le voucher if amount < 0: amount = -amount if line.type == 'dr': @@ -740,9 +770,9 @@ class account_voucher(osv.osv): line_total -= amount move_line['credit'] = amount - if inv.tax_id and inv.type in ('sale', 'purchase'): + if voucher.tax_id and voucher.type in ('sale', 'purchase'): move_line.update({ - 'account_tax_id': inv.tax_id.id, + 'account_tax_id': voucher.tax_id.id, }) if move_line.get('account_tax_id', False): tax_data = tax_obj.browse(cr, uid, [move_line['account_tax_id']], context=context)[0] @@ -755,35 +785,35 @@ class account_voucher(osv.osv): rec_ids = [voucher_line, line.move_line_id.id] rec_list_ids.append(rec_ids) - if not currency_pool.is_zero(cr, uid, inv.currency_id, line_total): + if not currency_pool.is_zero(cr, uid, voucher.currency_id, line_total): diff = line_total account_id = False write_off_name = '' - if inv.payment_option == 'with_writeoff': - account_id = inv.writeoff_acc_id.id - write_off_name = inv.comment - elif inv.type in ('sale', 'receipt'): - account_id = inv.partner_id.property_account_receivable.id + if voucher.payment_option == 'with_writeoff': + account_id = voucher.writeoff_acc_id.id + write_off_name = voucher.comment + elif voucher.type in ('sale', 'receipt'): + account_id = voucher.partner_id.property_account_receivable.id else: - account_id = inv.partner_id.property_account_payable.id + account_id = voucher.partner_id.property_account_payable.id move_line = { 'name': write_off_name or name, 'account_id': account_id, 'move_id': move_id, - 'partner_id': inv.partner_id.id, - 'date': inv.date, + 'partner_id': voucher.partner_id.id, + 'date': voucher.date, 'credit': diff > 0 and diff or 0.0, 'debit': diff < 0 and -diff or 0.0, #'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1, context=context_multi_currency) or 0.0, #'currency_id': company_currency <> current_currency and current_currency or False, } move_line_pool.create(cr, uid, move_line) - self.write(cr, uid, [inv.id], { + self.write(cr, uid, [voucher.id], { 'move_id': move_id, 'state': 'posted', 'number': name, }) - if inv.journal_id.entry_posted: + if voucher.journal_id.entry_posted: move_pool.post(cr, uid, [move_id], context={}) for rec_ids in rec_list_ids: if len(rec_ids) >= 2: @@ -810,43 +840,71 @@ class account_voucher_line(osv.osv): _description = 'Voucher Lines' _order = "move_line_id" + def _currency_id(self, cr, uid, ids, name, args, context=None): + res = {} + for line in self.browse(cr, uid, ids, context=context): + move_line = line.move_line_id + res[line.id] = move_line.currency_id and move_line.currency_id.id or move_line.company_id.currency_id.id + return res + + def _get_amounts(self, cr, uid, line_browse_rec, context=None): + if line_browse_rec.currency_id: + amount_original = line_browse_rec.amount_currency or 0.0 + amount_unreconciled = line_browse_rec.amount_residual_currency + elif line_browse_rec.credit > 0: + amount_original = line_browse_rec.credit or 0.0 + amount_unreconciled = line_browse_rec.amount_residual + else: + amount_original = line_browse_rec.debit or 0.0 + amount_unreconciled = line_browse_rec.amount_residual + return amount_original, amount_unreconciled + def _compute_balance(self, cr, uid, ids, name, args, context=None): currency_pool = self.pool.get('res.currency') - rs_data = {} + res = {} for line in self.browse(cr, uid, ids, context=context): - ctx = context.copy() - ctx.update({'date': line.voucher_id.date}) - res = {} - company_currency = line.voucher_id.journal_id.company_id.currency_id.id - voucher_currency = line.voucher_id.currency_id.id - move_line = line.move_line_id or False + amount_original, amount_unreconciled = self._get_amounts(cr, uid, line.move_line_id, context) + res[line.id] = { + 'amount_original': amount_original, + 'amount_unreconciled': amount_unreconciled, + } - if not move_line: - res['amount_original'] = 0.0 - res['amount_unreconciled'] = 0.0 + return res - elif move_line.currency_id: - res['amount_original'] = currency_pool.compute(cr, uid, move_line.currency_id.id, voucher_currency, move_line.amount_currency, context=ctx) - elif move_line and move_line.credit > 0: - res['amount_original'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, move_line.credit, context=ctx) - else: - res['amount_original'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, move_line.debit, context=ctx) + def __company_currency_amount(self, cr, uid, line, amount, context=None): + if context is None: + context = {} + ctx = context.copy() + ctx.update({'date': line.date_original}) + currency_pool = self.pool.get('res.currency') + return currency_pool.compute(cr, uid, line.currency_id.id, line.company_currency_id.id, amount, context=ctx) - if move_line: - res['amount_unreconciled'] = currency_pool.compute(cr, uid, move_line.currency_id and move_line.currency_id.id or company_currency, voucher_currency, abs(move_line.amount_residual_currency), context=ctx) - rs_data[line.id] = res - return rs_data + def onchange_amount(self, cr, uid, ids, amount, context=None): + if not amount: + return {'value':{'amount_in_company_currency': 0.0}} + for line in self.browse(cr, uid, ids, context=context): + amount = self.__company_currency_amount(cr, uid, line, amount, context=context) + return {'value': {'amount_in_company_currency': amount}} + + def _get_amount_in_company_currency(self, cr, uid, ids, name, args, context=None): + res = {} + for line in self.browse(cr, uid, ids, context=context): + res[line.id] = self.__company_currency_amount(cr, uid, line, line.amount, context=context) + return res _columns = { 'voucher_id':fields.many2one('account.voucher', 'Voucher', required=1, ondelete='cascade'), 'name':fields.char('Description', size=256), 'account_id':fields.many2one('account.account','Account', required=True), 'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'), + 'currency_id': fields.function(_currency_id, string='Currency', type='many2one', relation='res.currency'), 'untax_amount':fields.float('Untax Amount'), 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), - 'move_line_id': fields.many2one('account.move.line', 'Journal Item'), + 'move_line_id': fields.many2one('account.move.line', 'Journal Item', required=True), + 'company_currency_id': fields.related('move_line_id','company_id','currency_id', type='many2one', relation='res.currency', string="Company Currency"), + 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account')), 'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1), 'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1), 'amount_original': fields.function(_compute_balance, multi='dc', type='float', string='Original Amount', store=True), diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 88d84a7c7f0..85dfc8f12c0 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -283,7 +283,7 @@ id="menu_action_vendor_payment" parent="account.menu_finance_payables"/> - account.voucher.receipt.form + voucher.form.customer.payment account.voucher form @@ -320,12 +320,15 @@ on_change="onchange_move_line_id(move_line_id)" domain="[('account_id.type','in',('receivable','payable')), ('reconcile_id','=', False), ('partner_id','=',parent.partner_id)]" /> - + - + + + + @@ -359,6 +362,7 @@ + From bb605efd941ff6aa4cad9a445a8c9074e5fec408 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 14 Jul 2011 17:48:22 +0200 Subject: [PATCH 06/99] [IMP] account_voucher: multi currency and usability changes (part 2) bzr revid: qdp-launchpad@openerp.com-20110714154822-s5mbl0et1jdw7jty --- addons/account_voucher/account_voucher.py | 77 ++++++++++++------- addons/account_voucher/company.py | 4 +- .../voucher_payment_receipt_view.xml | 4 +- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 5b8be1d8a8b..b3eaa36db21 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -142,30 +142,35 @@ class account_voucher(osv.osv): res['arch'] = etree.tostring(doc) return res - def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, context=None): + def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=None): if context is None: context = {} + currency_pool = self.pool.get('res.currency') ctx = context.copy() - debit = credit = currency_rate_diff = 0.0 - #import pdb;pdb.set_trace() + counter_for_writeoff = counter_for_currency_diff = real_amount = 0.0 for l in line_dr_ids: + real_amount -= l.get('amount_in_company_currency', 0.0) ctx.update({'date': l['date_original']}) - currency_rate_diff += 'amount_in_company_currency' in l and l['amount_in_company_currency'] or self.pool.get('res.currency').compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount_original'], context=ctx) - debit += l['amount'] + counter_for_writeoff -= currency_pool.compute(cr, uid, l['company_currency_id'], voucher_currency_id, l.get('amount_in_company_currency',0.0), context=ctx) + ctx.update({'date': voucher_date}) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) for l in line_cr_ids: + real_amount += l.get('amount_in_company_currency', 0.0) ctx.update({'date': l['date_original']}) - currency_rate_diff -= 'amount_in_company_currency' in l and l['amount_in_company_currency'] or self.pool.get('res.currency').compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount_original'], context=ctx) - credit += l['amount'] - return abs(amount - abs(credit - debit)), currency_rate_diff + counter_for_writeoff += currency_pool.compute(cr, uid, l['company_currency_id'], voucher_currency_id, l.get('amount_in_company_currency',0.0), context=ctx) + ctx.update({'date': voucher_date}) + counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + writeoff_amount = amount - counter_for_writeoff + currency_rate_difference = real_amount - counter_for_currency_diff + return writeoff_amount, currency_rate_difference - def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, context=None): + def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=None): if not line_dr_ids and not line_cr_ids: return {'value':{}} 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) - currency_pool = self.pool.get('res.currency') - writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, context=context) + writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=context) return {'value': {'writeoff_amount': writeoff_amount,}}# 'currency_rate_difference': currency_rate_diff}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): @@ -173,7 +178,7 @@ class account_voucher(osv.osv): if context is None: context = {} res = {}.fromkeys(ids,{}) - counter_for_writeoff = counter_for_currency_diff = real_amount = expected_amount = 0.0 + counter_for_writeoff = counter_for_currency_diff = real_amount = 0.0 currency_pool = self.pool.get('res.currency') for voucher in self.browse(cr, uid, ids, context=context): ctx = context.copy() @@ -188,7 +193,7 @@ class account_voucher(osv.osv): ctx.update({'date': l.date_original}) counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) ctx.update({'date': voucher.date}) - counter_for_currency_diff += l.amount and currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) writeoff_amount = voucher.amount - counter_for_writeoff res[voucher.id]['writeoff_amount'] = writeoff_amount res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff @@ -550,7 +555,7 @@ class account_voucher(osv.osv): default['value']['pre_line'] = 1 elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0: default['value']['pre_line'] = 1 - default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, context=context) + default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, date, currency_id, context=context) return default def onchange_date(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): @@ -722,12 +727,33 @@ class account_voucher(osv.osv): 'date_maturity': voucher.date_due } move_line_pool.create(cr, uid, move_line) + + #create the move line for the currency difference + if voucher.currency_rate_difference: + if voucher.currency_rate_difference > 0: + account_id = voucher.company_id.property_income_currency_exchange + if not account_id: + raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Income Currency Rate' on the company! ")) + else: + account_id = voucher.company_id.property_expense_currency_exchange + if not account_id: + raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! ")) + + currency_diff_line = { + 'name': _('Currency Difference'), + 'debit': voucher.currency_rate_difference > 0 and voucher.currency_rate_difference or 0.0, + 'credit': voucher.currency_rate_difference < 0 and -voucher.currency_rate_difference or 0.0, + 'account_id': account_id.id, + 'move_id': move_id, + 'journal_id': voucher.journal_id.id, + 'period_id': voucher.period_id.id, + 'partner_id': voucher.partner_id.id, + 'date': voucher.date, + 'date_maturity': voucher.date_due + } + + move_line_pool.create(cr, uid, currency_diff_line, context=context) rec_list_ids = [] - line_total = debit - credit - if voucher.type == 'sale': - line_total = line_total - currency_pool.compute(cr, uid, voucher.currency_id.id, company_currency, voucher.tax_amount, context=context_multi_currency) - elif voucher.type == 'purchase': - line_total = line_total + currency_pool.compute(cr, uid, voucher.currency_id.id, company_currency, voucher.tax_amount, context=context_multi_currency) for line in voucher.line_ids: #create one move line per voucher line where amount is not 0.0 @@ -754,9 +780,6 @@ class account_voucher(osv.osv): 'debit': 0.0, 'date': voucher.date } - #TODO: assigner le montant de la diff de change sur le bon compte et pas debtor - #TODO: mettre le montant de company currency en onchange + readonly + computed - #TODO: mettre un champ difference de change sur le voucher if amount < 0: amount = -amount if line.type == 'dr': @@ -764,10 +787,8 @@ class account_voucher(osv.osv): else: line.type = 'dr' if (line.type=='dr'): - line_total += amount move_line['debit'] = amount else: - line_total -= amount move_line['credit'] = amount if voucher.tax_id and voucher.type in ('sale', 'purchase'): @@ -785,8 +806,8 @@ class account_voucher(osv.osv): rec_ids = [voucher_line, line.move_line_id.id] rec_list_ids.append(rec_ids) - if not currency_pool.is_zero(cr, uid, voucher.currency_id, line_total): - diff = line_total + if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): + diff = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) account_id = False write_off_name = '' if voucher.payment_option == 'with_writeoff': @@ -804,8 +825,8 @@ class account_voucher(osv.osv): 'date': voucher.date, 'credit': diff > 0 and diff or 0.0, 'debit': diff < 0 and -diff or 0.0, - #'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1, context=context_multi_currency) or 0.0, - #'currency_id': company_currency <> current_currency and current_currency or False, + 'amount_currency': voucher.writeoff_amount, + 'currency_id': company_currency <> current_currency and current_currency or False, } move_line_pool.create(cr, uid, move_line) self.write(cr, uid, [voucher.id], { diff --git a/addons/account_voucher/company.py b/addons/account_voucher/company.py index 8c877c8b635..5a5b5d040d7 100644 --- a/addons/account_voucher/company.py +++ b/addons/account_voucher/company.py @@ -28,14 +28,14 @@ class res_company(osv.osv): 'account.account', type='many2one', relation='account.account', - string="Income Currency Exchange", + string="Income Currency Rate", view_load=True, domain="[('type', '=', 'other')]",), 'property_expense_currency_exchange': fields.property( 'account.account', type='many2one', relation='account.account', - string="Expense Currency Exchange", + string="Expense Currency Rate", view_load=True, domain="[('type', '=', 'other')]",), } diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 85dfc8f12c0..1d6e2f19ddc 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -314,7 +314,7 @@ - + - + From 9aa1760fcfa9c03dd48b4a45ae3b0536e352eece Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jul 2011 10:26:43 +0200 Subject: [PATCH 07/99] [IMP] account_voucher: multi-currency improvements (part 3) bzr revid: qdp-launchpad@openerp.com-20110715082643-0bxv6u0z80wkqozi --- addons/account_voucher/account_voucher.py | 124 ++++++++++-------- .../voucher_payment_receipt_view.xml | 31 +++-- 2 files changed, 92 insertions(+), 63 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index b3eaa36db21..dd3af1139f4 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -142,35 +142,32 @@ class account_voucher(osv.osv): res['arch'] = etree.tostring(doc) return res - def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=None): + def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=None): if context is None: context = {} currency_pool = self.pool.get('res.currency') ctx = context.copy() counter_for_writeoff = counter_for_currency_diff = real_amount = 0.0 + ctx.update({'date': voucher_date}) for l in line_dr_ids: real_amount -= l.get('amount_in_company_currency', 0.0) - ctx.update({'date': l['date_original']}) - counter_for_writeoff -= currency_pool.compute(cr, uid, l['company_currency_id'], voucher_currency_id, l.get('amount_in_company_currency',0.0), context=ctx) - ctx.update({'date': voucher_date}) + counter_for_writeoff -= currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) for l in line_cr_ids: real_amount += l.get('amount_in_company_currency', 0.0) - ctx.update({'date': l['date_original']}) - counter_for_writeoff += currency_pool.compute(cr, uid, l['company_currency_id'], voucher_currency_id, l.get('amount_in_company_currency',0.0), context=ctx) - ctx.update({'date': voucher_date}) + counter_for_writeoff += currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) writeoff_amount = amount - counter_for_writeoff currency_rate_difference = real_amount - counter_for_currency_diff return writeoff_amount, currency_rate_difference - def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=None): + def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_date, context=None): if not line_dr_ids and not line_cr_ids: return {'value':{}} 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) - writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, voucher_currency_id, context=context) + writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) return {'value': {'writeoff_amount': writeoff_amount,}}# 'currency_rate_difference': currency_rate_diff}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): @@ -182,27 +179,34 @@ class account_voucher(osv.osv): currency_pool = self.pool.get('res.currency') for voucher in self.browse(cr, uid, ids, context=context): ctx = context.copy() + ctx.update({'date': voucher.date}) for l in voucher.line_dr_ids: real_amount -= l.amount_in_company_currency - ctx.update({'date': l.date_original}) - counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - ctx.update({'date': voucher.date}) + counter_for_writeoff -= l.amount_in_voucher_currency + #ctx.update({'date': l.date_original}) + #counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) for l in voucher.line_cr_ids: real_amount += l.amount_in_company_currency - ctx.update({'date': l.date_original}) - counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - ctx.update({'date': voucher.date}) + counter_for_writeoff += l.amount_in_voucher_currency + #ctx.update({'date': l.date_original}) + #counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) writeoff_amount = voucher.amount - counter_for_writeoff res[voucher.id]['writeoff_amount'] = writeoff_amount res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff return res + def _currency_id(self, cr, uid, ids, name, args, context=None): + res = {} + for voucher in self.browse(cr, uid, ids, context=context): + currency = voucher.journal_id.currency and voucher.journal_id.currency.id or voucher.company_id.currency_id.id + res[voucher.id] = {'currency_id': currency, 'currency_id2': currency} + return res + _name = 'account.voucher' _description = 'Accounting Voucher' _order = "date desc, id desc" -# _rec_name = 'number' _columns = { 'type':fields.selection([ ('sale','Sale'), @@ -221,8 +225,9 @@ class account_voucher(osv.osv): domain=[('type','=','dr')], context={'default_type':'dr'}, readonly=True, states={'draft':[('readonly',False)]}), 'period_id': fields.many2one('account.period', 'Period', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'narration':fields.text('Notes', readonly=True, states={'draft':[('readonly',False)]}), - #'currency_id':fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), - 'currency_id': fields.related('journal_id','currency', type='many2one', relation='res.currency', string='Currency', store=True, readonly=True), + 'currency_id': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), + #duplicated field for display purposes + 'currency_id2': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), 'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'state':fields.selection( [('draft','Draft'), @@ -425,7 +430,7 @@ class account_voucher(osv.osv): return default - def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): + def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, price, voucher_currency_id, ttype, date, context=None): """price Returns a dict that contains new values and context @@ -455,9 +460,9 @@ class account_voucher(osv.osv): vals = self.onchange_journal(cr, uid, ids, journal_id, [], False, partner_id, context) vals = vals.get('value') - currency_id = vals.get('currency_id', currency_id) + voucher_currency_id = vals.get('currency_id', voucher_currency_id) default = { - 'value':{'line_ids':[], 'line_dr_ids':[], 'line_cr_ids':[], 'pre_line': False, 'currency_id':currency_id}, + 'value':{'line_ids':[], 'line_dr_ids':[], 'line_cr_ids':[], 'pre_line': False, 'currency_id': voucher_currency_id}, } if not partner_id: @@ -502,10 +507,10 @@ class account_voucher(osv.osv): moves = move_line_pool.browse(cr, uid, ids, context=context) company_currency = journal.company_id.currency_id.id - if company_currency != currency_id and ttype == 'payment': - total_debit = currency_pool.compute(cr, uid, currency_id, company_currency, total_debit, context=context_multi_currency) - elif company_currency != currency_id and ttype == 'receipt': - total_credit = currency_pool.compute(cr, uid, currency_id, company_currency, total_credit, context=context_multi_currency) + if company_currency != voucher_currency_id and ttype == 'payment': + total_debit = currency_pool.compute(cr, uid, voucher_currency_id, company_currency, total_debit, context=context_multi_currency) + elif company_currency != voucher_currency_id and ttype == 'receipt': + total_credit = currency_pool.compute(cr, uid, voucher_currency_id, company_currency, total_credit, context=context_multi_currency) for line in moves: if line.credit and line.reconcile_partial_id and ttype == 'receipt': @@ -530,10 +535,12 @@ class account_voucher(osv.osv): 'amount_original': amount_original, 'amount': 0.0, 'currency_id': currency_id, + 'voucher_currency_id': voucher_currency_id, 'date_original':line.date, 'company_currency_id': line.company_id.currency_id.id, 'date_due':line.date_maturity, 'amount_unreconciled': amount_unreconciled, + 'amount_in_company_currency': 0.0, } #if line.credit: @@ -555,7 +562,7 @@ class account_voucher(osv.osv): default['value']['pre_line'] = 1 elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0: default['value']['pre_line'] = 1 - default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, date, currency_id, context=context) + default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, date, context=context) return default def onchange_date(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): @@ -695,15 +702,15 @@ class account_voucher(osv.osv): #create the first line manually company_currency = voucher.journal_id.company_id.currency_id.id - current_currency = voucher.currency_id.id + voucher_currency = voucher.currency_id.id debit = 0.0 credit = 0.0 # TODO: is there any other alternative then the voucher type ?? # -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.type in ('purchase', 'payment'): - credit = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.amount, context=context_multi_currency) + credit = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.amount, context=context_multi_currency) elif voucher.type in ('sale', 'receipt'): - debit = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.amount, context=context_multi_currency) + debit = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.amount, context=context_multi_currency) if debit < 0: credit = -debit debit = 0.0 @@ -721,8 +728,8 @@ class account_voucher(osv.osv): 'journal_id': voucher.journal_id.id, 'period_id': voucher.period_id.id, 'partner_id': voucher.partner_id.id, - 'currency_id': company_currency <> current_currency and current_currency or False, - 'amount_currency': company_currency <> current_currency and sign * voucher.amount or 0.0, + 'currency_id': company_currency <> voucher_currency and voucher_currency or False, + 'amount_currency': company_currency <> voucher_currency and sign * voucher.amount or 0.0, 'date': voucher.date, 'date_maturity': voucher.date_due } @@ -763,9 +770,10 @@ class account_voucher(osv.osv): if line.amount == line.amount_unreconciled: amount = line.move_line_id.amount_residual #residual amount in company currency else: - ctx = context_multi_currency.copy() - ctx.update({'date': line.date_original}) - amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=ctx) + #ctx = context_multi_currency.copy() + #ctx.update({'date': line.date_original}) + #amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=ctx) + amount = line.amount_in_company_currency move_line = { 'journal_id': voucher.journal_id.id, 'period_id': voucher.period_id.id, @@ -773,7 +781,7 @@ class account_voucher(osv.osv): 'account_id': line.account_id.id, 'move_id': move_id, 'partner_id': voucher.partner_id.id, - 'currency_id': company_currency <> current_currency and current_currency or False, + 'currency_id': company_currency <> line.currency_id.id and line.currency_id.id or False, 'analytic_account_id': line.account_analytic_id and line.account_analytic_id.id or False, 'quantity': 1, 'credit': 0.0, @@ -800,14 +808,14 @@ class account_voucher(osv.osv): if not (tax_data.base_code_id and tax_data.tax_code_id): raise osv.except_osv(_('No Account Base Code and Account Tax Code!'),_("You have to configure account base code and account tax code on the '%s' tax!") % (tax_data.name)) sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1 - move_line['amount_currency'] = company_currency <> current_currency and sign * line.amount or 0.0 + move_line['amount_currency'] = company_currency <> line.currency_id.id and sign * line.amount or 0.0 voucher_line = move_line_pool.create(cr, uid, move_line) if line.move_line_id.id: rec_ids = [voucher_line, line.move_line_id.id] rec_list_ids.append(rec_ids) if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): - diff = currency_pool.compute(cr, uid, current_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) + diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) account_id = False write_off_name = '' if voucher.payment_option == 'with_writeoff': @@ -825,8 +833,8 @@ class account_voucher(osv.osv): 'date': voucher.date, 'credit': diff > 0 and diff or 0.0, 'debit': diff < 0 and -diff or 0.0, - 'amount_currency': voucher.writeoff_amount, - 'currency_id': company_currency <> current_currency and current_currency or False, + 'amount_currency': company_currency <> voucher_currency and voucher.writeoff_amount or 0.0, + 'currency_id': company_currency <> voucher_currency and voucher_currency or False, } move_line_pool.create(cr, uid, move_line) self.write(cr, uid, [voucher.id], { @@ -898,34 +906,46 @@ class account_voucher_line(osv.osv): ctx = context.copy() ctx.update({'date': line.date_original}) currency_pool = self.pool.get('res.currency') - return currency_pool.compute(cr, uid, line.currency_id.id, line.company_currency_id.id, amount, context=ctx) + amount_company_cur = currency_pool.compute(cr, uid, line.currency_id.id, line.company_currency_id.id, amount, context=ctx) + ctx.update({'date': line.voucher_id.date}) + amount_voucher_cur = currency_pool.compute(cr, uid, line.currency_id.id, line.voucher_currency_id.id, amount, context=ctx) + return amount_company_cur, amount_voucher_cur def onchange_amount(self, cr, uid, ids, amount, context=None): - if not amount: - return {'value':{'amount_in_company_currency': 0.0}} + if not amount or not ids: + return {'value':{'amount_in_company_currency': 0.0, 'amount_in_voucher_currency': 0.0}} for line in self.browse(cr, uid, ids, context=context): - amount = self.__company_currency_amount(cr, uid, line, amount, context=context) - return {'value': {'amount_in_company_currency': amount}} + amount_company_cur, amount_voucher_cur = self.__company_currency_amount(cr, uid, line, amount, context=context) + return {'value': {'amount_in_company_currency': amount_company_cur, 'amount_in_voucher_currency': amount_voucher_cur}} def _get_amount_in_company_currency(self, cr, uid, ids, name, args, context=None): res = {} for line in self.browse(cr, uid, ids, context=context): - res[line.id] = self.__company_currency_amount(cr, uid, line, line.amount, context=context) + amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) + res[line.id] = { + 'amount_in_company_currency': amount_in_company_currency, + 'amount_in_voucher_currency': amount_in_voucher_currency, + } return res _columns = { 'voucher_id':fields.many2one('account.voucher', 'Voucher', required=1, ondelete='cascade'), + 'move_line_id': fields.many2one('account.move.line', 'Journal Item', required=True), + 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), 'name':fields.char('Description', size=256), 'account_id':fields.many2one('account.account','Account', required=True), - 'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'), - 'currency_id': fields.function(_currency_id, string='Currency', type='many2one', relation='res.currency'), - 'untax_amount':fields.float('Untax Amount'), - 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), - 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), - 'move_line_id': fields.many2one('account.move.line', 'Journal Item', required=True), + 'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'), + 'untax_amount':fields.float('Untax Amount'), + + 'currency_id': fields.function(_currency_id, string='Currency', type='many2one', relation='res.currency'), 'company_currency_id': fields.related('move_line_id','company_id','currency_id', type='many2one', relation='res.currency', string="Company Currency"), - 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account')), + 'voucher_currency_id': fields.related('voucher_id', 'currency_id', type='many2one', relation='res.currency', string="Voucher Currency"), + + 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), + 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1), 'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1), 'amount_original': fields.function(_compute_balance, multi='dc', type='float', string='Original Amount', store=True), diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 1d6e2f19ddc..b4e249a0d33 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -301,7 +301,7 @@ invisible="context.get('line_type', False)" string="Paid Amount" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date)"/> - + @@ -314,7 +314,7 @@ - + - + + + - + - + + + + + + + @@ -345,19 +353,20 @@ - - - + + + + + domain="[('type','=','other')]" colspan="4"/> + attrs="{'invisible':[('payment_option','!=','with_writeoff')]}" colspan="4"/> + groups="analytic.group_analytic_accounting" colspan="4"/> From 69e5946d0f285e23735ac82f2088c006177533c2 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jul 2011 14:44:33 +0200 Subject: [PATCH 08/99] [IMP] account: display currency in name get of journals also for the ones in company currency bzr revid: qdp-launchpad@openerp.com-20110715124433-f61h47m09l83c07d --- addons/account/account.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/account/account.py b/addons/account/account.py index 03a9b628922..ad7b60ada4d 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -711,6 +711,8 @@ class account_journal(osv.osv): name = rs.name if rs.currency: name = "%s (%s)" % (rs.name, rs.currency.name) + else: + name = "%s (%s)" % (rs.name, rs.company_id.currency_id.name) res += [(rs.id, name)] return res From 3ff98eff3648564be8cbf6a5479498e524dc7a21 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jul 2011 14:47:12 +0200 Subject: [PATCH 09/99] [IMP] account: added move_id in tree view of payment in invoices form view, to allow the 'click and relate' feature to see the move line bzr revid: qdp-launchpad@openerp.com-20110715124712-8nnptyr3yy30nlse --- addons/account/account_invoice_view.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index be431c9b2e7..99a82e38485 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -238,6 +238,7 @@ + @@ -336,6 +337,7 @@ + From 930def9cfc58d3b8b5ad775fa642e4905df55b89 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jul 2011 14:47:38 +0200 Subject: [PATCH 10/99] [IMP] account_voucher: multi currency improvements (part 4) bzr revid: qdp-launchpad@openerp.com-20110715124738-q64m7ev5yk0denge --- addons/account_voucher/account_voucher.py | 56 ++++++++----------- .../voucher_payment_receipt_view.xml | 47 +++++++++------- 2 files changed, 49 insertions(+), 54 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index dd3af1139f4..a409092ed16 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -182,13 +182,13 @@ class account_voucher(osv.osv): ctx.update({'date': voucher.date}) for l in voucher.line_dr_ids: real_amount -= l.amount_in_company_currency - counter_for_writeoff -= l.amount_in_voucher_currency + counter_for_writeoff -= (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) for l in voucher.line_cr_ids: real_amount += l.amount_in_company_currency - counter_for_writeoff += l.amount_in_voucher_currency + counter_for_writeoff += (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) @@ -216,7 +216,7 @@ class account_voucher(osv.osv): ],'Default Type', readonly=True, states={'draft':[('readonly',False)]}), 'name':fields.char('Memo', size=256, readonly=True, states={'draft':[('readonly',False)]}), 'date':fields.date('Date', readonly=True, select=True, states={'draft':[('readonly',False)]}, help="Effective date for accounting entries"), - '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)]}, change_default=1), 'account_id':fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'line_ids':fields.one2many('account.voucher.line','voucher_id','Voucher Lines', readonly=True, states={'draft':[('readonly',False)]}), 'line_cr_ids':fields.one2many('account.voucher.line','voucher_id','Credits', @@ -229,6 +229,7 @@ class account_voucher(osv.osv): #duplicated field for display purposes 'currency_id2': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), 'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft':[('readonly',False)]}), + 'company_currency': fields.related('company_id','currency_id', type='many2one', relation='res.currency', string='Currency', readonly=True), 'state':fields.selection( [('draft','Draft'), ('proforma','Pro-forma'), @@ -256,7 +257,7 @@ class account_voucher(osv.osv): 'date_due': fields.date('Due Date', readonly=True, select=True, states={'draft':[('readonly',False)]}), 'payment_option':fields.selection([ ('without_writeoff', 'Keep Open'), - ('with_writeoff', 'Reconcile with Write-Off'), + ('with_writeoff', 'Reconcile'), ], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}), 'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account', readonly=True, states={'draft': [('readonly', False)]}), 'comment': fields.char('Write-Off Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}), @@ -440,38 +441,33 @@ class account_voucher(osv.osv): @return: Returns a dict which contains new values, and context """ - if context is None: - context = {} if not journal_id: return {} + if context is None: + context = {} context_multi_currency = context.copy() if date: context_multi_currency.update({'date': date}) - line_pool = self.pool.get('account.voucher.line') - line_ids = ids and line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) or False - if line_ids: - line_pool.unlink(cr, uid, line_ids) - currency_pool = self.pool.get('res.currency') move_line_pool = self.pool.get('account.move.line') partner_pool = self.pool.get('res.partner') journal_pool = self.pool.get('account.journal') - - vals = self.onchange_journal(cr, uid, ids, journal_id, [], False, partner_id, context) - vals = vals.get('value') + line_pool = self.pool.get('account.voucher.line') + #get default values + vals = self.onchange_journal(cr, uid, ids, journal_id, [], False, partner_id, context=context) + vals = vals.get('value',{}) voucher_currency_id = vals.get('currency_id', voucher_currency_id) default = { 'value':{'line_ids':[], 'line_dr_ids':[], 'line_cr_ids':[], 'pre_line': False, 'currency_id': voucher_currency_id}, } - if not partner_id: - return default + #drop existing lines + line_ids = ids and line_pool.search(cr, uid, [('voucher_id', 'in', ids)]) or [] + if line_ids: + line_pool.unlink(cr, uid, line_ids, context=context) - if not partner_id and ids: - line_ids = line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) - if line_ids: - line_pool.unlink(cr, uid, line_ids) + if not partner_id: return default journal = journal_pool.browse(cr, uid, journal_id, context=context) @@ -583,7 +579,7 @@ class account_voucher(osv.osv): def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, context=None): if not journal_id: - return False + return {} journal_pool = self.pool.get('account.journal') journal = journal_pool.browse(cr, uid, journal_id, context=context) account_id = journal.default_credit_account_id or journal.default_debit_account_id @@ -640,7 +636,6 @@ class account_voucher(osv.osv): raise osv.except_osv(_('Invalid action !'), _('Cannot delete Voucher(s) which are already opened or paid !')) return super(account_voucher, self).unlink(cr, uid, ids, context=context) - # TODO: may be we can remove this method if not used anyware def onchange_payment(self, cr, uid, ids, pay_now, journal_id, partner_id, ttype='sale'): res = {} if not partner_id: @@ -705,8 +700,6 @@ class account_voucher(osv.osv): voucher_currency = voucher.currency_id.id debit = 0.0 credit = 0.0 - # TODO: is there any other alternative then the voucher type ?? - # -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.type in ('purchase', 'payment'): credit = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.amount, context=context_multi_currency) elif voucher.type in ('sale', 'receipt'): @@ -738,11 +731,11 @@ class account_voucher(osv.osv): #create the move line for the currency difference if voucher.currency_rate_difference: if voucher.currency_rate_difference > 0: - account_id = voucher.company_id.property_income_currency_exchange + account_id = voucher.company_id.property_expense_currency_exchange if not account_id: raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Income Currency Rate' on the company! ")) else: - account_id = voucher.company_id.property_expense_currency_exchange + account_id = voucher.company_id.property_income_currency_exchange if not account_id: raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! ")) @@ -758,10 +751,9 @@ class account_voucher(osv.osv): 'date': voucher.date, 'date_maturity': voucher.date_due } - move_line_pool.create(cr, uid, currency_diff_line, context=context) - rec_list_ids = [] + rec_list_ids = [] for line in voucher.line_ids: #create one move line per voucher line where amount is not 0.0 if not line.amount: @@ -770,9 +762,6 @@ class account_voucher(osv.osv): if line.amount == line.amount_unreconciled: amount = line.move_line_id.amount_residual #residual amount in company currency else: - #ctx = context_multi_currency.copy() - #ctx.update({'date': line.date_original}) - #amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=ctx) amount = line.amount_in_company_currency move_line = { 'journal_id': voucher.journal_id.id, @@ -815,6 +804,7 @@ class account_voucher(osv.osv): rec_list_ids.append(rec_ids) if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): + #create one line for the write off if needed diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) account_id = False write_off_name = '' @@ -831,9 +821,9 @@ class account_voucher(osv.osv): 'move_id': move_id, 'partner_id': voucher.partner_id.id, 'date': voucher.date, - 'credit': diff > 0 and diff or 0.0, 'debit': diff < 0 and -diff or 0.0, - 'amount_currency': company_currency <> voucher_currency and voucher.writeoff_amount or 0.0, + 'credit': diff > 0 and diff or 0.0, + 'amount_currency': company_currency <> voucher_currency and -voucher.writeoff_amount or 0.0, 'currency_id': company_currency <> voucher_currency and voucher_currency or False, } move_line_pool.create(cr, uid, move_line) diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index b4e249a0d33..c2344d681c1 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -301,7 +301,7 @@ invisible="context.get('line_type', False)" string="Paid Amount" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date)"/> - + @@ -320,32 +320,36 @@ on_change="onchange_move_line_id(move_line_id)" domain="[('account_id.type','in',('receivable','payable')), ('reconcile_id','=', False), ('partner_id','=',parent.partner_id)]" /> - + - - - - - - - + + + + + + + - - - - - - + + + + - - - - + + + + + + + @@ -356,9 +360,11 @@ + + - + @@ -371,7 +377,6 @@ - From db61756ea7069646b61cd83d854284978c4ad816 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jul 2011 16:41:26 +0200 Subject: [PATCH 11/99] [IMP] account_voucher: onchange of the amount must assign it correctly if the same amount is found in move line list. If not, it must split it only on the lines with the same curerncy (not working yet). (improvements part 5) bzr revid: qdp-launchpad@openerp.com-20110715144126-6mq2dhkchwcxh51j --- addons/account_voucher/account_voucher.py | 52 +++++++++++++++++------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index a409092ed16..17940aa6f25 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -499,22 +499,38 @@ class account_voucher(osv.osv): ids = move_line_pool.search(cr, uid, [('state','=','valid'), ('account_id.type', '=', account_type), ('reconcile_id', '=', False), ('partner_id', '=', partner_id)], context=context) else: ids = context['move_line_ids'] + #order the lines by most old first ids.reverse() - moves = move_line_pool.browse(cr, uid, ids, context=context) + moves = move_line_pool.browse(cr, uid, ids, context=context) company_currency = journal.company_id.currency_id.id if company_currency != voucher_currency_id and ttype == 'payment': total_debit = currency_pool.compute(cr, uid, voucher_currency_id, company_currency, total_debit, context=context_multi_currency) elif company_currency != voucher_currency_id and ttype == 'receipt': total_credit = currency_pool.compute(cr, uid, voucher_currency_id, company_currency, total_credit, context=context_multi_currency) + invoice_id = context.get('invoice_id', False) + move_line_found = False for line in moves: if line.credit and line.reconcile_partial_id and ttype == 'receipt': continue if line.debit and line.reconcile_partial_id and ttype == 'payment': continue - total_credit += line.credit or 0.0 - total_debit += line.debit or 0.0 + if invoice_id and line.move_id.invoice_id.id == invoice_id: + move_line_found = line.id + break + if voucher_currency_id == company_currency: + if line.amount_residual == price: + move_line_found = line.id + break + total_credit += line.credit or 0.0 + total_debit += line.debit or 0.0 + elif voucher_currency_id == line.currency_id.id: + if line.amount_residual_currency == price: + move_line_found = line.id + break + total_credit += line.amount_currency or 0.0 + total_debit += line.amount_currency or 0.0 for line in moves: if line.credit and line.reconcile_partial_id and ttype == 'receipt': continue @@ -529,7 +545,7 @@ class account_voucher(osv.osv): 'move_line_id':line.id, 'account_id':line.account_id.id, 'amount_original': amount_original, - 'amount': 0.0, + 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, 'currency_id': currency_id, 'voucher_currency_id': voucher_currency_id, 'date_original':line.date, @@ -539,14 +555,26 @@ class account_voucher(osv.osv): 'amount_in_company_currency': 0.0, } - #if line.credit: - # amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_debit), context=context_multi_currency)) - # rs['amount'] = amount - # total_debit -= amount - #else: - # amount = min(amount_unreconciled, currency_pool.compute(cr, uid, company_currency, currency_id, abs(total_credit), context=context_multi_currency)) - # rs['amount'] = amount - # total_credit -= amount + if not move_line_found: + #TODO: this part isn't working really: we should assign the voucher amount on only lines that are or the same currency + if company_currency == voucher_currency_id: + if line.credit: + amount = min(amount_unreconciled, abs(total_debit)) + rs['amount'] = amount + total_debit -= amount + else: + amount = min(amount_unreconciled, abs(total_credit)) + rs['amount'] = amount + total_credit -= amount + elif voucher_currency_id == line.currency_id.id: + if line.credit: + amount = min(amount_unreconciled, abs(total_debit)) + rs['amount'] = amount + total_debit -= amount + else: + amount = min(amount_unreconciled, abs(total_credit)) + rs['amount'] = amount + total_credit -= amount default['value']['line_ids'].append(rs) if rs['type'] == 'cr': From 0e614785f9d10c65e2b9cc8479d8a5fe4762f0bb Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Thu, 21 Jul 2011 14:31:17 +0530 Subject: [PATCH 12/99] [FIX] Account voucher: payment date refused when check date not in the period is checked lp bug: https://launchpad.net/bugs/808751 fixed bzr revid: mra@mra-laptop-20110721090117-n3uhdgxvyrkmii7d --- addons/account_voucher/account_voucher.py | 30 +++++++++---------- .../wizard/account_statement_from_invoice.py | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 17940aa6f25..56f1c719624 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -152,11 +152,11 @@ class account_voucher(osv.osv): for l in line_dr_ids: real_amount -= l.get('amount_in_company_currency', 0.0) counter_for_writeoff -= currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) - counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) for l in line_cr_ids: real_amount += l.get('amount_in_company_currency', 0.0) counter_for_writeoff += currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) - counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) writeoff_amount = amount - counter_for_writeoff currency_rate_difference = real_amount - counter_for_currency_diff return writeoff_amount, currency_rate_difference @@ -167,7 +167,7 @@ class account_voucher(osv.osv): 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) - writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) + writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) return {'value': {'writeoff_amount': writeoff_amount,}}# 'currency_rate_difference': currency_rate_diff}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): @@ -185,15 +185,15 @@ class account_voucher(osv.osv): counter_for_writeoff -= (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) for l in voucher.line_cr_ids: real_amount += l.amount_in_company_currency counter_for_writeoff += (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) writeoff_amount = voucher.amount - counter_for_writeoff - res[voucher.id]['writeoff_amount'] = writeoff_amount + res[voucher.id]['writeoff_amount'] = writeoff_amount res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff return res @@ -545,9 +545,9 @@ class account_voucher(osv.osv): 'move_line_id':line.id, 'account_id':line.account_id.id, 'amount_original': amount_original, - 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, + 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, 'currency_id': currency_id, - 'voucher_currency_id': voucher_currency_id, + 'voucher_currency_id': voucher_currency_id, 'date_original':line.date, 'company_currency_id': line.company_id.currency_id.id, 'date_due':line.date_maturity, @@ -766,7 +766,7 @@ class account_voucher(osv.osv): account_id = voucher.company_id.property_income_currency_exchange if not account_id: raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! ")) - + currency_diff_line = { 'name': _('Currency Difference'), 'debit': voucher.currency_rate_difference > 0 and voucher.currency_rate_difference or 0.0, @@ -833,7 +833,7 @@ class account_voucher(osv.osv): if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): #create one line for the write off if needed - diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) + diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) account_id = False write_off_name = '' if voucher.payment_option == 'with_writeoff': @@ -939,7 +939,7 @@ class account_voucher_line(osv.osv): def _get_amount_in_company_currency(self, cr, uid, ids, name, args, context=None): res = {} for line in self.browse(cr, uid, ids, context=context): - amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) + amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) res[line.id] = { 'amount_in_company_currency': amount_in_company_currency, 'amount_in_voucher_currency': amount_in_voucher_currency, @@ -961,8 +961,8 @@ class account_voucher_line(osv.osv): 'voucher_currency_id': fields.related('voucher_id', 'currency_id', type='many2one', relation='res.currency', string="Voucher Currency"), 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), - 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), - 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), 'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1), 'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1), @@ -1062,7 +1062,7 @@ class account_bank_statement(osv.osv): bank_st_line_obj = self.pool.get('account.bank.statement.line') st_line = bank_st_line_obj.browse(cr, uid, st_line_id, context=context) if st_line.voucher_id: - voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number}, context=context) + voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number, 'date': st_line.date}, context=context) if st_line.voucher_id.state == 'cancel': voucher_obj.action_cancel_draft(cr, uid, [st_line.voucher_id.id], context=context) wf_service.trg_validate(uid, 'account.voucher', st_line.voucher_id.id, 'proforma_voucher', cr) @@ -1072,7 +1072,7 @@ class account_bank_statement(osv.osv): 'move_ids': [(4, v.move_id.id, False)] }) - return move_line_obj.write(cr, uid, [x.id for x in v.move_ids], {'statement_id': st_line.statement_id.id}, context=context) + return move_line_obj.write(cr, uid, [x.id for x in v.move_ids], {'statement_id': st_line.statement_id.id, 'date': st_line.date}, update_check=False, context=context) return super(account_bank_statement, self).create_move_from_st_line(cr, uid, st_line.id, company_currency_id, next_number, context=context) account_bank_statement() diff --git a/addons/account_voucher/wizard/account_statement_from_invoice.py b/addons/account_voucher/wizard/account_statement_from_invoice.py index e4d728c8867..3509ac846b5 100644 --- a/addons/account_voucher/wizard/account_statement_from_invoice.py +++ b/addons/account_voucher/wizard/account_statement_from_invoice.py @@ -75,7 +75,7 @@ class account_statement_from_invoice_lines(osv.osv_memory): statement.currency.id, amount, context=ctx) context.update({'move_line_ids': [line.id]}) - result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), currency_id= statement.currency.id, ttype=(amount < 0 and 'payment' or 'receipt'), date=line_date, context=context) + result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), voucher_currency_id= statement.currency.id, ttype=(amount < 0 and 'payment' or 'receipt'), date=line_date, context=context) voucher_res = { 'type':(amount < 0 and 'payment' or 'receipt'), 'name': line.name, 'partner_id': line.partner_id.id, From 0465909c92d248e0a434dd85f8d78e7ff0be2c7a Mon Sep 17 00:00:00 2001 From: mtr Date: Mon, 1 Aug 2011 18:31:43 +0530 Subject: [PATCH 13/99] [ADD] account_voucher: added yaml for multicurrency i.e. USD-EUR, EUR-EUR, CAD-CHF bzr revid: mtr@mtr-20110801130143-wygzy83cztuqw3ub --- addons/account_voucher/__openerp__.py | 5 +- addons/account_voucher/test/case2_usd_eur.yml | 360 ++++++++++++++++++ addons/account_voucher/test/case3_eur_eur.yml | 331 ++++++++++++++++ addons/account_voucher/test/case4_cad_chf.yml | 181 +++++++++ 4 files changed, 876 insertions(+), 1 deletion(-) create mode 100644 addons/account_voucher/test/case2_usd_eur.yml create mode 100644 addons/account_voucher/test/case3_eur_eur.yml create mode 100644 addons/account_voucher/test/case4_cad_chf.yml diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index 039d3e067af..d4331a81923 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -59,7 +59,10 @@ Account Voucher module includes all the basic requirements of Voucher Entries fo "test/account_voucher.yml", "test/sales_receipt.yml", "test/sales_payment.yml", - "test/account_voucher_report.yml" + "test/account_voucher_report.yml", + "test/case2_usd_eur.yml", + "test/case3_eur_eur.yml", + "test/case4_cad_chf.yml", ], 'certificate': '0037580727101', "active": False, diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml new file mode 100644 index 00000000000..39b0eb0edbb --- /dev/null +++ b/addons/account_voucher/test/case2_usd_eur.yml @@ -0,0 +1,360 @@ +- + I create a currency rate for USD for january of 1.333333 +- + !record {model: res.currency.rate, id: janu_usd}: + currency_id: base.USD + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.333333 +- + I create a currency rate for USD for february of 1.250000 +- + !record {model: res.currency.rate, id: febr_usd}: + currency_id: base.USD + name: !eval "'%s-02-01' %(datetime.now().year)" + rate: 1.250000 +- + I create a currency rate for USD for march of 1.111111 +- + !record {model: res.currency.rate, id: marc_usd}: + currency_id: base.USD + name: !eval "'%s-03-01' %(datetime.now().year)" + rate: 1.111111 +- + I create a currency rate for USD for april of 1.052632 +- + !record {model: res.currency.rate, id: apri_usd}: + currency_id: base.USD + name: !eval "'%s-04-01' %(datetime.now().year)" + rate: 1.052632 +- + I create a bank journal with EUR as currency +- + !record {model: account.journal, id: bank_journal_EUR}: + name: Bank Journal(EUR) + code: BEUR + type: bank + analytic_journal_id: account.sit + sequence_id: account.sequence_bank_journal + default_debit_account_id: account.cash + default_credit_account_id: account.cash + currency: base.EUR + company_id: base.main_company + view_id: account.account_journal_bank_view +- + 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 + default_credit_account_id: account.cash + currency: base.USD + company_id: base.main_company + view_id: account.account_journal_bank_view +- + I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' +- + !record {model: res.company, id: base.main_company}: + property_expense_currency_exchange: account.o_expense + property_income_currency_exchange: account.o_income +- + I create a new partner Michael Geller +- + !record {model: res.partner, id: res_partner_michael0}: + address: + - city: paris + country_id: base.fr + name: Michael + street: 1 rue Rockfeller + type: invoice + zip: '75016' + name: Mr.Michael Geller +- + I create the first invoice on 1st January for 200 USD +- + !record {model: account.invoice, id: account_first_invoice_jan}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + 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: '[PC1] Basic PC' + price_unit: 200.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_michael0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan} +- + I check that first invoice move is correct +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) + 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.00), "Invoice move is incorrect for debtors account" +- + I create the second invoice on 1st February for 100 USD +- + !record {model: account.invoice, id: account_second_invoice_feb}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + 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: '[PC1] Basic PC' + price_unit: 100.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_michael0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb} +- + 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_second_invoice_feb")) + 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 incorrect for debtors account" +- + I create the first voucher of payment with values 240 EUR, journal EUR, and fill amount 180 for the invoice of 200$ and 70 for the 100$ invoice. +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_EUR'), 240.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 240.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.EUR'), + 'journal_id': ref('bank_journal_EUR'), + 'partner_id': ref('res_partner_michael0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-03-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'First payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 200: + item['amount'] = 180 + else: + item['amount'] = 70 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is 15 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == 15), "writeoff amount is not 15" +- + I check that currency rate difference is -34 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.currency_rate_difference == -34), "currency rate difference is not -34" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + 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 their credit columns are respectively 135 and 56 and currency is USD($). +- + I check that my Currency Difference entry is created with a credit of 34, amount currency as 0.0 +- + I check that my write-off entry is created with a credit of 15.00 and amount currency as 0.0 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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: + assert move_line.credit == 135, "Debtor account has wrong entry." + if move_line.amount_currency == -70: + assert move_line.credit == 56.00, "Debtor account has wrong entry." + if move_line.credit == 34: + assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." + if move_line.credit == 15.00: + assert move_line.credit == 0.00, "Writeoff amount is wrong." +- + I check the residual amount of Invoice1, should be 20 in residual currency and 15 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount 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_second_invoice_feb")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" +- + I create the second voucher of payment with values, 45 USD, journal USD, and fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$ +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_EUR'), 45.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 45.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.USD'), + 'journal_id': ref('bank_journal_USD'), + 'partner_id': ref('res_partner_michael0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-04-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'Second payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 20: + item['amount'] = 20 + else: + item['amount'] = 30 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is -5 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == -5), "writeoff amount is not -5" +- + I check that currency rate difference is -8.50 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + curr_diff = voucher_id.currency_rate_difference + assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not -8.50" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + I check that my debtor account is correct +- + I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). +- + I check that my Currency Difference entry is created with a credit of 8.5 +- + I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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): + d + if move_line.amount_currency == -20: + assert move_line.credit == 15, "Debtor account has wrong entry." + if move_line.amount_currency == -30: + assert move_line.credit == 24, "Debtor account has wrong entry." + if move_line.credit == 8.5: + assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." + if move_line.credit == 5: + assert move_line.credit == 4.75, "Writeoff amount is wrong." +- + I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" +- + I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml new file mode 100644 index 00000000000..bce4feb5a3d --- /dev/null +++ b/addons/account_voucher/test/case3_eur_eur.yml @@ -0,0 +1,331 @@ +- + I create a currency rate for EUR for january of 1.000000 +- + !record {model: res.currency.rate, id: jan_eur}: + currency_id: base.EUR + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.000000 +- + I create a currency rate for EUR for february of 1.000000 +- + !record {model: res.currency.rate, id: feb_eur}: + currency_id: base.EUR + name: !eval "'%s-02-01' %(datetime.now().year)" + rate: 1.000000 +- + I create a currency rate for EUR for march of 1.000000 +- + !record {model: res.currency.rate, id: mar_eur}: + currency_id: base.EUR + name: !eval "'%s-03-01' %(datetime.now().year)" + rate: 1.000000 +- + I create a currency rate for EUR for april of 1.000000 +- + !record {model: res.currency.rate, id: apr_eur}: + currency_id: base.EUR + name: !eval "'%s-04-01' %(datetime.now().year)" + rate: 1.000000 +- + I create a bank journal with EUR as currency +- + !record {model: account.journal, id: bank_journal_EUR}: + name: Bank Journal(EUR) + code: BEUR + type: bank + analytic_journal_id: account.sit + sequence_id: account.sequence_bank_journal + default_debit_account_id: account.cash + default_credit_account_id: account.cash + currency: base.EUR + company_id: base.main_company + view_id: account.account_journal_bank_view +- + I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' +- + !record {model: res.company, id: base.main_company}: + property_expense_currency_exchange: account.o_expense + property_income_currency_exchange: account.o_income +- + I create a new partner Peter Lawson. +- + !record {model: res.partner, id: res_partner_peter0}: + address: + - city: paris + country_id: base.fr + name: Peter + street: 1 rue Rockfeller + type: invoice + zip: '75016' + name: Mr.Peter Lawson +- + I create the first invoice on 1st January for 150 EUR +- + !record {model: account.invoice, id: account_first_invoice_jan_eur}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + company_id: base.main_company + currency_id: base.EUR + date_invoice: !eval "'%s-01-01' %(datetime.now().year)" + period_id: account.period_1 + invoice_line: + - account_id: account.a_sale + name: '[PC1] Basic PC' + price_unit: 150.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_peter0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_eur} +- + I check that first invoice move is correct +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) + 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.00), "Invoice move is incorrect for debtors account" +- + I create the first invoice on 1st February for 80 EUR +- + !record {model: account.invoice, id: account_second_invoice_feb_eur}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + company_id: base.main_company + currency_id: base.EUR + date_invoice: !eval "'%s-02-01' %(datetime.now().year)" + period_id: account.period_1 + invoice_line: + - account_id: account.a_sale + name: '[PC1] Basic PC' + price_unit: 80.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_peter0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb_eur} +- + I check that second invoice move is correct +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) + 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.00), "Invoice move is incorrect for debtors account" +- + I create the first voucher of payment with values 120 EUR, journal EUR, and fill amounts 100 for the invoice of 150 and 20 for the 80 EUR invoice. +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 120.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.EUR'), + 'journal_id': ref('bank_journal_EUR'), + 'partner_id': ref('res_partner_peter0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-03-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'First payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 150: + item['amount'] = 100 + else: + item['amount'] = 20 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is 0 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == 0), "writeoff amount is not 0" +- + I check that currency rate difference is 0.00 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.currency_rate_difference == 0.00), "currency rate difference is not 0.00" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + I check that my debtor account is correct +- + I check that the debtor account has 2 new lines with 0.00 and 0.00 as amount_currency columns and their credit are 20 and 100 respectively +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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.credit == 20: + assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." + if move_line.credit == 100: + assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." +- + I check the residual amount of Invoice1 is 50 +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" +- + I check the residual amuont of Invoice2 is 60 +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" +- + I create the second voucher of payment and check to let open the debtor overpaid amount. +- + I create the second voucher of payment with Paid Amount as 120, journal EUR, and fill amount 50 for the residual amount 50 for the invoice of 150 and 70 for the residual amount 60 for the invoice of 80 +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 120.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.EUR'), + 'journal_id': ref('bank_journal_EUR'), + 'partner_id': ref('res_partner_peter0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-04-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'Second payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 50.00: + item['amount'] = 50.00 + elif item['amount_unreconciled'] == 60.00: + item['amount'] = 70.00 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is 0.00 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'),('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == 0.00), "writeoff amount is not 0" +- + I check that currency rate difference is 0.00 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + curr_diff = voucher_id.currency_rate_difference + assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not 0" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + I check that my debtor account is correct +- + I check that the debtor account has 2 new lines with 0.00 and 0.00 as amount_currency columns and their credit are 70 and 50 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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.credit == 70.00: + assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." + if move_line.credit == 50.00: + assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." +- + I check the residual amount of Invoice1 is 0 +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" +- + I check the residual amuont of Invoice2 is -10 +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml new file mode 100644 index 00000000000..2156ec813ff --- /dev/null +++ b/addons/account_voucher/test/case4_cad_chf.yml @@ -0,0 +1,181 @@ +- + I create a currency rate for CAD for january of 1.338800 +- + !record {model: res.currency.rate, id: jan_cad}: + currency_id: base.CAD + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.338800 +- + I create a currency rate for CAD for march of 0.500000 +- + !record {model: res.currency.rate, id: mar_cad}: + currency_id: base.CAD + name: !eval "'%s-03-01' %(datetime.now().year)" + rate: 0.500000 +- + I create a currency rate for CHF for january of 1.308600 +- + !record {model: res.currency.rate, id: jan_chf}: + currency_id: base.CHF + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.308600 +- + I create a bank journal with CHF as currency +- + !record {model: account.journal, id: bank_journal_CHF}: + name: Bank Journal(CHF) + code: BCHF + type: bank + analytic_journal_id: account.sit + sequence_id: account.sequence_bank_journal + default_debit_account_id: account.cash + default_credit_account_id: account.cash + currency: base.CHF + company_id: base.main_company + view_id: account.account_journal_bank_view +- + I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' +- + !record {model: res.company, id: base.main_company}: + property_expense_currency_exchange: account.o_expense + property_income_currency_exchange: account.o_income +- + I create a new partner John Armani. +- + !record {model: res.partner, id: res_partner_john0}: + address: + - city: paris + country_id: base.fr + name: John + street: 1 rue Rockfeller + type: invoice + zip: '75016' + name: Mr.John Armani +- + I create the first invoice on 1st January for 200 CAD +- + !record {model: account.invoice, id: account_first_invoice_jan_cad}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + company_id: base.main_company + currency_id: base.CAD + date_invoice: !eval "'%s-01-01' %(datetime.now().year)" + period_id: account.period_1 + invoice_line: + - account_id: account.a_sale + name: '[PC1] Basic PC' + price_unit: 200.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_john0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_cad} +- + I check that accounting move for first invoice is correct +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_cad")) + 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 == 149.39), "Invoice move is incorrect for debtors account" +- + I create the first voucher of payment with Paid amount as 300, journal CHF, and fill amounts 200 for the invoice of 200. +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 300.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 120.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.CHF'), + 'journal_id': ref('bank_journal_CHF'), + 'partner_id': ref('res_partner_john0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-03-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'First payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 200: + item['amount'] = 200 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is 175 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == 175), "writeoff amount is not 175" +- + I check that currency rate difference is 49.39 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.currency_rate_difference == 49.39), "currency rate difference is not 0.00" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + I check that my debtor account is correct +- + I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). +- + I check that my Currency Difference entry is created with a credit of 8.5 +- + I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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 == -200: + assert move_line.credit == 149.39, "Debtor account has wrong entry." + if move_line.credit == 49.39: + assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." + if move_line.credit == -140.00: + assert move_line.credit == -175, "Writeoff amount is wrong." +- + I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) + 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]) + residual_curr = move_line.amount_residual_currency + residual = move_line.amount_residual + assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" +- \ No newline at end of file From 97e4c6efb0457103ba9495890eca6ffcdbebe945 Mon Sep 17 00:00:00 2001 From: "psi(OpenERP),mtr(OpenERP)" <> Date: Tue, 2 Aug 2011 11:49:50 +0530 Subject: [PATCH 14/99] [ADD] account_voucher: added yaml for multi-currency i.e. USD-USD bzr revid: mtr@mtr-20110802061950-t0eah4pcj1vs1yp6 --- addons/account_voucher/__openerp__.py | 1 + addons/account_voucher/test/case1_usd_usd.yml | 345 ++++++++++++++++++ 2 files changed, 346 insertions(+) create mode 100755 addons/account_voucher/test/case1_usd_usd.yml diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index d4331a81923..dc7747fb593 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -60,6 +60,7 @@ Account Voucher module includes all the basic requirements of Voucher Entries fo "test/sales_receipt.yml", "test/sales_payment.yml", "test/account_voucher_report.yml", + "test/case1_usd_usd.yml", "test/case2_usd_eur.yml", "test/case3_eur_eur.yml", "test/case4_cad_chf.yml", diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml new file mode 100755 index 00000000000..7751849120e --- /dev/null +++ b/addons/account_voucher/test/case1_usd_usd.yml @@ -0,0 +1,345 @@ +- + I create a currency rate for USD for january of 1.333333 +- + !record {model: res.currency.rate, id: jan_usd}: + currency_id: base.USD + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.333333 + +- + I create a currency rate for USD for february of 1.250000 +- + !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 a currency rate for USD for march of 1.111111 +- + !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 a currency rate for USD for april of 1.052632 +- + !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 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 + default_credit_account_id: account.cash + currency: base.USD + company_id: base.main_company + view_id: account.account_journal_bank_view + +- + I set up some accounts for currency rate expense/income in my company +- + !record {model: res.company, id: base.main_company}: + property_expense_currency_exchange: account.o_expense + property_income_currency_exchange: account.o_income +- + I'm creating new partner "Mr. strauss". +- + !record {model: res.partner, id: res_partner_strauss0}: + address: + - city: paris + country_id: base.fr + name: Mark Strauss + street: 1 rue Rockfeller + type: invoice + zip: '75016' + name: Mr. Mark Strauss +- + I create the first invoice on 1st January for 200 USD +- + !record {model: account.invoice, id: account_invoice_jan}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + 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: '[PC1] Basic PC' + price_unit: 200.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_strauss0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_jan} +- + 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")) + 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 correct for debtors account" +- + I create the second invoice on 1st February for 100 USD +- + !record {model: account.invoice, id: account_invoice_feb}: + account_id: account.a_recv + address_contact_id: base.res_partner_address_3000 + address_invoice_id: base.res_partner_address_3000 + 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: '[PC1] Basic PC' + price_unit: 100.0 + quantity: 1.0 + product_id: product.product_product_pc1 + uos_id: product.product_uom_unit + journal_id: account.sales_journal + partner_id: res_partner_strauss0 + reference_type: none +- + I Validate invoice by clicking on Validate button +- + !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_feb} +- + 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")) + 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 correct for debtors account" + +- + I create the first voucher of payment + +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 240.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 240.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.USD'), + 'journal_id': ref('bank_journal_USD'), + 'partner_id': ref('res_partner_strauss0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-03-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'First payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 200: + item['amount'] = 180 + else: + item['amount'] = 70 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is -10 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == -10), "writeoff amount is not -10" +- + I check that currency rate difference is -34 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.currency_rate_difference == -34), "currency rate difference is not -34" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher is valid +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher is not balanced" + +- + 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 135 and 56 +- + I check that my currency rate difference is correct. 34 in credit with no amount_currency +- + I check that my write-off is correct. 9 debit and 10 amount_currency +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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: + assert move_line.credit == 135.00, "Debtor account has wrong entry." + if move_line.amount_currency == -70: + assert move_line.credit == 56.00, "Debtor account has wrong entry." + if move_line.credit == 34.00: + assert move_line.amount_currency == 0, "Incorrect currency rate difference." + if move_line.amount_currency == 10: + assert move_line.debit == 9.0, "Writeoff amount is wrong." +- + I check the residual amount of Invoice1, should be 20 in amount_currency and 15 in company currency +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) + 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_currency == 20.0 and move_line.amount_residual == 15.0) , "Residual amount 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")) + 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_currency == 30.0 and move_line.amount_residual == 24.0) , "Residual amount is not correct for first Invoice" +- + I create the second voucher of payment with Paid Amount as 45 USD, journal USD, and fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$ +- + !python {model: account.voucher}: | + import netsvc, time + vals = {} + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 45.0, 2, ttype='receipt', date=False) + vals = { + 'account_id': ref('account.cash'), + 'amount': 45.0, + 'company_id': ref('base.main_company'), + 'currency_id': ref('base.USD'), + 'journal_id': ref('bank_journal_USD'), + 'partner_id': ref('res_partner_strauss0'), + 'period_id': ref('account.period_3'), + 'type': 'receipt', + 'date': time.strftime("%Y-04-01"), + 'payment_option': 'with_writeoff', + 'writeoff_acc_id': ref('account.a_expense'), + 'comment': 'Write Off', + 'name': 'Second payment', + } + if not res['value']['line_cr_ids']: + res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] + for item in res['value']['line_cr_ids']: + if item['amount_unreconciled'] == 20: + item['amount'] = 20 + else: + item['amount'] = 30 + vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] + id = self.create(cr, uid, vals) + voucher_id = self.browse(cr, uid, id) + assert (voucher_id.state=='draft'), "Voucher is not in draft state" +- + I check that writeoff amount computed is -5 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert (voucher_id.writeoff_amount == -5), "writeoff amount is not -5" +- + I check that currency rate difference is -8.50 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + curr_diff = voucher_id.currency_rate_difference + assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not -8.50" +- + I confirm the voucher +- + !python {model: account.voucher}: | + import netsvc + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) +- + I check that my voucher state is posted +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + assert voucher_id.state == 'posted', "Voucher state is not posted" +- + I check that my debtor account is correct +- + I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). +- + I check that my Currency Difference entry is created with a credit of 8.5 +- + I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 +- + !python {model: account.voucher}: | + voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) + voucher_id = self.browse(cr, uid, voucher[0]) + 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 == -20: + assert move_line.credit == 15, "Debtor account has wrong entry." + if move_line.amount_currency == -30: + assert move_line.credit == 24, "Debtor account has wrong entry." + if move_line.credit == 8.5: + assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." + if move_line.credit == 5: + assert move_line.credit == 4.75, "Writeoff amount is wrong." +- + I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) + 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" +- + I check the residual amuont of Invoice2, should be 0 in residual currency and 0 in amount_residual +- + !python {model: account.invoice}: | + invoice_id = self.browse(cr, uid, ref("account_invoice_feb")) + 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file From 437c84191e4b16681177f62cb6f5ac1c47ca1ece Mon Sep 17 00:00:00 2001 From: mtr Date: Tue, 2 Aug 2011 12:23:44 +0530 Subject: [PATCH 15/99] [IMP] account_voucher: minor changes in yaml bzr revid: mtr@mtr-20110802065344-ewaqf3etl687gjlg --- addons/account_voucher/test/case2_usd_eur.yml | 18 +++++------------- addons/account_voucher/test/case3_eur_eur.yml | 16 ++++------------ addons/account_voucher/test/case4_cad_chf.yml | 6 ++---- 3 files changed, 11 insertions(+), 29 deletions(-) diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml index 39b0eb0edbb..25d69a95bb1 100644 --- a/addons/account_voucher/test/case2_usd_eur.yml +++ b/addons/account_voucher/test/case2_usd_eur.yml @@ -214,7 +214,7 @@ I check that my write-off entry is created with a credit of 15.00 and amount currency as 0.0 - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) move_line_obj = self.pool.get('account.move.line') move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) @@ -235,9 +235,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15) , "Residual amount is not correct for first Invoice" - I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual - @@ -246,9 +244,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" + assert (move_line.amount_residual_currency == 30 and move_line.amount_residual == 24) , "Residual amount is not correct for second Invoice" - I create the second voucher of payment with values, 45 USD, journal USD, and fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$ - @@ -344,9 +340,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" - I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual - @@ -355,6 +349,4 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" \ No newline at end of file + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml index bce4feb5a3d..d1b5de784a9 100644 --- a/addons/account_voucher/test/case3_eur_eur.yml +++ b/addons/account_voucher/test/case3_eur_eur.yml @@ -213,9 +213,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 50.0 and move_line.amount_residual == 50.0) , "Residual amount is not correct for first Invoice" - I check the residual amuont of Invoice2 is 60 - @@ -224,9 +222,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" + assert (move_line.amount_residual_currency == 60.0 and move_line.amount_residual == 60.0) , "Residual amount is not correct for second Invoice" - I create the second voucher of payment and check to let open the debtor overpaid amount. - @@ -315,9 +311,7 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0 and move_line.amount_residual == 0) , "Residual amount is not correct for first Invoice" - I check the residual amuont of Invoice2 is -10 - @@ -326,6 +320,4 @@ 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for second Invoice" \ No newline at end of file + assert (move_line.amount_residual_currency == -10.0 and move_line.amount_residual == -10.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml index 2156ec813ff..6ba92f6c8f3 100644 --- a/addons/account_voucher/test/case4_cad_chf.yml +++ b/addons/account_voucher/test/case4_cad_chf.yml @@ -168,14 +168,12 @@ if move_line.credit == -140.00: assert move_line.credit == -175, "Writeoff amount is wrong." - - I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual + I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) 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]) - residual_curr = move_line.amount_residual_currency - residual = move_line.amount_residual - assert (move_line.amount_residual_currency == residual_curr and move_line.amount_residual == residual) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" - \ No newline at end of file From 1a3ac2facc5fd1304adeeccae4dffa02e0f4ff23 Mon Sep 17 00:00:00 2001 From: mtr Date: Wed, 3 Aug 2011 15:36:33 +0530 Subject: [PATCH 16/99] [IMP] account_voucher: improved string/sentence and code in yml bzr revid: mtr@mtr-20110803100633-xsh3olpk5bhc00at --- addons/account_voucher/test/case1_usd_usd.yml | 57 +++++++++++-------- addons/account_voucher/test/case2_usd_eur.yml | 57 ++++++++++--------- addons/account_voucher/test/case3_eur_eur.yml | 38 +++++++------ addons/account_voucher/test/case4_cad_chf.yml | 44 ++++++++------ 4 files changed, 112 insertions(+), 84 deletions(-) diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml index 7751849120e..a4e59ccc4b3 100755 --- a/addons/account_voucher/test/case1_usd_usd.yml +++ b/addons/account_voucher/test/case1_usd_usd.yml @@ -52,7 +52,7 @@ property_expense_currency_exchange: account.o_expense property_income_currency_exchange: account.o_income - - I'm creating new partner "Mr. strauss". + I create new partner Mark Strauss. - !record {model: res.partner, id: res_partner_strauss0}: address: @@ -97,7 +97,7 @@ 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 correct for debtors account" + 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 - @@ -132,7 +132,7 @@ 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 correct for debtors account" + assert (move_line.debit - move_line.credit == 80), "Invoice move is not correct for debtors account" - I create the first voucher of payment @@ -191,13 +191,15 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher is valid + I check that the move of my first voucher is valid - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher is not balanced" - + 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 - @@ -215,11 +217,11 @@ for move_line in move_line_obj.browse(cr, uid, move_lines): if move_line.amount_currency == -180: assert move_line.credit == 135.00, "Debtor account has wrong entry." - if move_line.amount_currency == -70: + elif move_line.amount_currency == -70: assert move_line.credit == 56.00, "Debtor account has wrong entry." - if move_line.credit == 34.00: + elif move_line.credit == 34.00: assert move_line.amount_currency == 0, "Incorrect currency rate difference." - if move_line.amount_currency == 10: + elif move_line.amount_currency == 10: assert move_line.debit == 9.0, "Writeoff amount is wrong." - I check the residual amount of Invoice1, should be 20 in amount_currency and 15 in company currency @@ -231,7 +233,7 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15.0) , "Residual amount is not correct for first Invoice" - - I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual + 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")) @@ -240,7 +242,9 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.amount_residual_currency == 30.0 and move_line.amount_residual == 24.0) , "Residual amount is not correct for first Invoice" - - I create the second voucher of payment with Paid Amount as 45 USD, journal USD, and fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$ + I create the second voucher of payment + + - !python {model: account.voucher}: | import netsvc, time @@ -296,20 +300,23 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher state is posted + I check that the move of my second voucher is valid - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" + 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 -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). + I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24. - - I check that my Currency Difference entry is created with a credit of 8.5 + I check that my currency rate difference is correct. 8.5 in credit with no amount_currency - - I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 + I check that my writeoff is correct. 4.75 debit and 5 amount_currency - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) @@ -319,27 +326,27 @@ for move_line in move_line_obj.browse(cr, uid, move_lines): if move_line.amount_currency == -20: assert move_line.credit == 15, "Debtor account has wrong entry." - if move_line.amount_currency == -30: + elif move_line.amount_currency == -30: assert move_line.credit == 24, "Debtor account has wrong entry." - if move_line.credit == 8.5: + elif move_line.credit == 8.5: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - if move_line.credit == 5: - assert move_line.credit == 4.75, "Writeoff amount is wrong." + elif move_line.amount_currency == 5: + assert move_line.debit == 4.75, "Writeoff amount is wrong." - - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual + I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" - - I check the residual amuont of Invoice2, should be 0 in residual currency and 0 in amount_residual + I check the residual amuont of Invoice2, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_invoice_feb")) 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml index 25d69a95bb1..35e0bf86231 100644 --- a/addons/account_voucher/test/case2_usd_eur.yml +++ b/addons/account_voucher/test/case2_usd_eur.yml @@ -55,7 +55,7 @@ company_id: base.main_company view_id: account.account_journal_bank_view - - I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' + I set up some accounts for currency rate expense/income in my company - !record {model: res.company, id: base.main_company}: property_expense_currency_exchange: account.o_expense @@ -98,7 +98,7 @@ - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan} - - I check that first invoice move is correct + I check that first invoice move is correct for debtor account(debit - credit == 150) - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) @@ -143,7 +143,8 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.debit - move_line.credit == 80), "Invoice move is incorrect for debtors account" - - I create the first voucher of payment with values 240 EUR, journal EUR, and fill amount 180 for the invoice of 200$ and 70 for the 100$ invoice. + I create the first voucher of payment + - !python {model: account.voucher}: | import netsvc, time @@ -198,20 +199,23 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher state is posted + I check that the move of my voucher is valid - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" + 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 their credit columns are respectively 135 and 56 and currency is USD($). + I check that the debtor account has 2 new lines with -180 and -70 in amount_currency columns and their credit columns are respectively 135 and 56 and currency is USD($). - - I check that my Currency Difference entry is created with a credit of 34, amount currency as 0.0 + I check that my currency rate difference is correct. 34 in credit with no amount_currency - - I check that my write-off entry is created with a credit of 15.00 and amount currency as 0.0 + I check that my writeoff is correct. 15 in credit with no amount_currency - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) @@ -221,12 +225,12 @@ for move_line in move_line_obj.browse(cr, uid, move_lines): if move_line.amount_currency == -180: assert move_line.credit == 135, "Debtor account has wrong entry." - if move_line.amount_currency == -70: + elif move_line.amount_currency == -70: assert move_line.credit == 56.00, "Debtor account has wrong entry." - if move_line.credit == 34: + elif move_line.credit == 34: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - if move_line.credit == 15.00: - assert move_line.credit == 0.00, "Writeoff amount is wrong." + elif move_line.credit == 15.00: + assert move_line.amount_currency == 0.00, "Writeoff amount is wrong." - I check the residual amount of Invoice1, should be 20 in residual currency and 15 in amount_residual - @@ -246,7 +250,8 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.amount_residual_currency == 30 and move_line.amount_residual == 24) , "Residual amount is not correct for second Invoice" - - I create the second voucher of payment with values, 45 USD, journal USD, and fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$ + I create the second voucher of payment + - !python {model: account.voucher}: | import netsvc, time @@ -291,8 +296,7 @@ !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - curr_diff = voucher_id.currency_rate_difference - assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not -8.50" + assert (voucher_id.currency_rate_difference == -8.50), "currency rate difference is not -8.50" - I confirm the voucher - @@ -311,11 +315,11 @@ - I check that my debtor account is correct - - I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). + I check that the debtor account has 2 new lines with -20 and -30 in amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). - - I check that my Currency Difference entry is created with a credit of 8.5 + I check that my currency rate difference is correct. 8.50 in credit with no amount_currency - - I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 + I check that my writeoff is correct. 4.75 in debit and 5 in amount_currency - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) @@ -323,30 +327,29 @@ 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): - d if move_line.amount_currency == -20: assert move_line.credit == 15, "Debtor account has wrong entry." - if move_line.amount_currency == -30: + elif move_line.amount_currency == -30: assert move_line.credit == 24, "Debtor account has wrong entry." - if move_line.credit == 8.5: + elif move_line.credit == 8.5: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - if move_line.credit == 5: - assert move_line.credit == 4.75, "Writeoff amount is wrong." + elif move_line.amount_currency == 5: + assert move_line.debit == 4.75, "Writeoff amount is wrong." - - I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual + I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" - - I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual + I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb")) 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml index d1b5de784a9..5779028641e 100644 --- a/addons/account_voucher/test/case3_eur_eur.yml +++ b/addons/account_voucher/test/case3_eur_eur.yml @@ -41,7 +41,7 @@ company_id: base.main_company view_id: account.account_journal_bank_view - - I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' + I set up some accounts for currency rate expense/income in my company - !record {model: res.company, id: base.main_company}: property_expense_currency_exchange: account.o_expense @@ -84,7 +84,7 @@ - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_eur} - - I check that first invoice move is correct + I check that first invoice move is correct for debtor account(debit - credit == 150) - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) @@ -94,7 +94,7 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.debit - move_line.credit == 150.00), "Invoice move is incorrect for debtors account" - - I create the first invoice on 1st February for 80 EUR + I create the second invoice on 1st February for 80 EUR - !record {model: account.invoice, id: account_second_invoice_feb_eur}: account_id: account.a_recv @@ -119,7 +119,7 @@ - !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb_eur} - - I check that second invoice move is correct + 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_second_invoice_feb_eur")) @@ -129,7 +129,8 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.debit - move_line.credit == 80.00), "Invoice move is incorrect for debtors account" - - I create the first voucher of payment with values 120 EUR, journal EUR, and fill amounts 100 for the invoice of 150 and 20 for the 80 EUR invoice. + I create the first voucher of payment + - !python {model: account.voucher}: | import netsvc, time @@ -162,7 +163,7 @@ voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is 0 + I check that writeoff amount computed is 0.00 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) @@ -184,16 +185,19 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher state is posted + I check that the move of my first voucher is valid - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" + 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 0.00 and 0.00 as amount_currency columns and their credit are 20 and 100 respectively + I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 20 and 100 respectively - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) @@ -203,7 +207,7 @@ for move_line in move_line_obj.browse(cr, uid, move_lines): if move_line.credit == 20: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - if move_line.credit == 100: + elif move_line.credit == 100: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - I check the residual amount of Invoice1 is 50 @@ -225,8 +229,7 @@ assert (move_line.amount_residual_currency == 60.0 and move_line.amount_residual == 60.0) , "Residual amount is not correct for second Invoice" - I create the second voucher of payment and check to let open the debtor overpaid amount. -- - I create the second voucher of payment with Paid Amount as 120, journal EUR, and fill amount 50 for the residual amount 50 for the invoice of 150 and 70 for the residual amount 60 for the invoice of 80 + - !python {model: account.voucher}: | import netsvc, time @@ -282,16 +285,19 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher state is posted + I check that the move of my second voucher is valid - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" + 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 0.00 and 0.00 as amount_currency columns and their credit are 70 and 50 + I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 70 and 50 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) @@ -301,7 +307,7 @@ for move_line in move_line_obj.browse(cr, uid, move_lines): if move_line.credit == 70.00: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - if move_line.credit == 50.00: + elif move_line.credit == 50.00: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - I check the residual amount of Invoice1 is 0 diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml index 6ba92f6c8f3..3d989eaee7a 100644 --- a/addons/account_voucher/test/case4_cad_chf.yml +++ b/addons/account_voucher/test/case4_cad_chf.yml @@ -6,7 +6,7 @@ name: !eval "'%s-01-01' %(datetime.now().year)" rate: 1.338800 - - I create a currency rate for CAD for march of 0.500000 + I create a currency rate for CAD for march of 2.000000 - !record {model: res.currency.rate, id: mar_cad}: currency_id: base.CAD @@ -19,6 +19,13 @@ currency_id: base.CHF name: !eval "'%s-01-01' %(datetime.now().year)" rate: 1.308600 +- + I create a currency rate for CHF for march of 1.250000 +- + !record {model: res.currency.rate, id: jan_chf}: + currency_id: base.CHF + name: !eval "'%s-01-01' %(datetime.now().year)" + rate: 1.250000 - I create a bank journal with CHF as currency - @@ -34,7 +41,7 @@ company_id: base.main_company view_id: account.account_journal_bank_view - - I assign accounts for 'Income Curreny Rate' and 'Expense Currency Rate' + I set up some accounts for currency rate expense/income in my company - !record {model: res.company, id: base.main_company}: property_expense_currency_exchange: account.o_expense @@ -77,7 +84,7 @@ - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_cad} - - I check that accounting move for first invoice is correct + I check that first invoice move is correct for debtor account (debit - credit == 149.39) - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_cad")) @@ -87,7 +94,8 @@ move_line = move_line_obj.browse(cr, uid, move_lines[0]) assert (move_line.debit - move_line.credit == 149.39), "Invoice move is incorrect for debtors account" - - I create the first voucher of payment with Paid amount as 300, journal CHF, and fill amounts 200 for the invoice of 200. + I create the first voucher of payment + - !python {model: account.voucher}: | import netsvc, time @@ -95,7 +103,7 @@ res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 300.0, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 120.0, + 'amount': 300.0, 'company_id': ref('base.main_company'), 'currency_id': ref('base.CHF'), 'journal_id': ref('bank_journal_CHF'), @@ -130,7 +138,7 @@ !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment')]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 49.39), "currency rate difference is not 0.00" + assert (voucher_id.currency_rate_difference == 49.39), "currency rate difference is not 49.39" - I confirm the voucher - @@ -140,40 +148,44 @@ wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - - I check that my voucher state is posted + I check that the move of my voucher is valid - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment')]) voucher_id = self.browse(cr, uid, voucher[0]) + 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" assert voucher_id.state == 'posted', "Voucher state is not posted" - I check that my debtor account is correct - - I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). + I check that the debtor account has 1 new line with -200 as amount_currency columns and 149.39 of credit and currency is CAD($). - - I check that my Currency Difference entry is created with a credit of 8.5 + I check that my currency rate difference is correct. 49.39 in debit with no amount_currency - - I check that my write-off entry is created with a debit of 4.75 and amount currency as 0.0 + I check that my writeoff is correct. 140 credit and -175 amount_currency - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment')]) voucher_id = self.browse(cr, uid, voucher[0]) 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 == -200: assert move_line.credit == 149.39, "Debtor account has wrong entry." - if move_line.credit == 49.39: + elif move_line.debit == 49.39: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - if move_line.credit == -140.00: - assert move_line.credit == -175, "Writeoff amount is wrong." + elif move_line.credit == 140.00: + assert move_line.amount_currency == -175, "Writeoff amount is wrong." - - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual + I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) 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_currency == 0.0 and move_line.amount_residual == 0.0) , "Residual amount is not correct for first Invoice" + assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" - \ No newline at end of file From 1f4c3d2fbba83515f07d68193f67a2492bb0a3a7 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Thu, 4 Aug 2011 15:25:50 +0530 Subject: [PATCH 17/99] [IMP] improve find method of account period and make comapny_id as related on account voucher bzr revid: ara@tinyerp.com-20110804095550-xu04lz4wkfhusvg0 --- addons/account/account.py | 9 ++++++++- addons/account_voucher/account_voucher.py | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index ad7b60ada4d..0c825b40b60 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -918,10 +918,17 @@ class account_period(osv.osv): return False def find(self, cr, uid, dt=None, context=None): + if context is None: context = {} if not dt: dt = time.strftime('%Y-%m-%d') #CHECKME: shouldn't we check the state of the period? - ids = self.search(cr, uid, [('date_start','<=',dt),('date_stop','>=',dt)]) + args = [('date_start', '<=' ,dt), ('date_stop', '>=', dt)] + if context.get('company_id', False): + args.append(('company_id', '=', context['company_id'])) + else: + company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id + args.append(('company_id', '=', company_id)) + ids = self.search(cr, uid, args, context=context) if not ids: raise osv.except_osv(_('Error !'), _('No period defined for this date: %s !\nPlease create one.')%dt) return ids diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 17940aa6f25..49972b25233 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -39,7 +39,10 @@ class account_voucher(osv.osv): if context is None: context = {} if context.get('period_id', False): return context.get('period_id') - periods = self.pool.get('account.period').find(cr, uid) + if context.get('invoice_id', False): + company_id = self.pool.get('account.invoice').browse(cr, uid, context['invoice_id'], context=context).company_id.id + context.update({'company_id': company_id}) + periods = self.pool.get('account.period').find(cr, uid, context=context) return periods and periods[0] or False def _get_journal(self, cr, uid, context=None): @@ -228,7 +231,7 @@ class account_voucher(osv.osv): 'currency_id': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), #duplicated field for display purposes 'currency_id2': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), - 'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft':[('readonly',False)]}), + 'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True), 'company_currency': fields.related('company_id','currency_id', type='many2one', relation='res.currency', string='Currency', readonly=True), 'state':fields.selection( [('draft','Draft'), @@ -596,9 +599,13 @@ class account_voucher(osv.osv): @param context: context arguments, like lang, time zone @return: Returns a dict which contains new values, and context """ + if context is None: context = {} period_pool = self.pool.get('account.period') res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=context) - pids = period_pool.search(cr, uid, [('date_start', '<=', date), ('date_stop', '>=', date)]) + if context.get('invoice_id', False): + company_id = self.pool.get('account.invoice').browse(cr, uid, context['invoice_id'], context=context).company_id.id + context.update({'company_id': company_id}) + pids = period_pool.find(cr, uid, date, context=context) if pids: if not 'value' in res: res['value'] = {} @@ -606,6 +613,7 @@ class account_voucher(osv.osv): return res def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, context=None): + if context is None: context = {} if not journal_id: return {} journal_pool = self.pool.get('account.journal') @@ -621,6 +629,9 @@ class account_voucher(osv.osv): if journal.currency: currency_id = journal.currency.id vals['value'].update({'currency_id':currency_id}) + context.update({'company_id': journal.company_id.id}) + periods = self.pool.get('account.period').find(cr, uid, context=context) + vals['value'].update({'period_id':periods[0]}) return vals def proforma_voucher(self, cr, uid, ids, context=None): From effaa191dcb673293bcb1c80a0ce2a07cf3dabd5 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Thu, 4 Aug 2011 15:34:57 +0530 Subject: [PATCH 18/99] [IMP] make move_line_id as required in account_voucher bzr revid: ara@tinyerp.com-20110804100457-50i5xn7dynpo1clg --- addons/account_voucher/account_voucher.py | 28 +++++++++---------- .../voucher_payment_receipt_view.xml | 14 +++++----- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 49972b25233..f30f04406a3 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -155,11 +155,11 @@ class account_voucher(osv.osv): for l in line_dr_ids: real_amount -= l.get('amount_in_company_currency', 0.0) counter_for_writeoff -= currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) - counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) for l in line_cr_ids: real_amount += l.get('amount_in_company_currency', 0.0) counter_for_writeoff += currency_pool.compute(cr, uid, l['company_currency_id'], l['voucher_currency_id'], l.get('amount_in_company_currency',0.0), context=ctx) - counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) writeoff_amount = amount - counter_for_writeoff currency_rate_difference = real_amount - counter_for_currency_diff return writeoff_amount, currency_rate_difference @@ -170,7 +170,7 @@ class account_voucher(osv.osv): 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) - writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) + writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) return {'value': {'writeoff_amount': writeoff_amount,}}# 'currency_rate_difference': currency_rate_diff}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): @@ -188,15 +188,15 @@ class account_voucher(osv.osv): counter_for_writeoff -= (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff -= currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) for l in voucher.line_cr_ids: real_amount += l.amount_in_company_currency counter_for_writeoff += (l.voucher_currency_id.id == l.company_currency_id.id) and l.amount_in_company_currency or l.amount_in_voucher_currency #ctx.update({'date': l.date_original}) #counter_for_writeoff += currency_pool.compute(cr, uid, voucher.company_id.currency_id.id, voucher.currency_id.id, l.amount_in_company_currency, context=ctx) - counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) + counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) writeoff_amount = voucher.amount - counter_for_writeoff - res[voucher.id]['writeoff_amount'] = writeoff_amount + res[voucher.id]['writeoff_amount'] = writeoff_amount res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff return res @@ -548,9 +548,9 @@ class account_voucher(osv.osv): 'move_line_id':line.id, 'account_id':line.account_id.id, 'amount_original': amount_original, - 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, + 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, 'currency_id': currency_id, - 'voucher_currency_id': voucher_currency_id, + 'voucher_currency_id': voucher_currency_id, 'date_original':line.date, 'company_currency_id': line.company_id.currency_id.id, 'date_due':line.date_maturity, @@ -777,7 +777,7 @@ class account_voucher(osv.osv): account_id = voucher.company_id.property_income_currency_exchange if not account_id: raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! ")) - + currency_diff_line = { 'name': _('Currency Difference'), 'debit': voucher.currency_rate_difference > 0 and voucher.currency_rate_difference or 0.0, @@ -844,7 +844,7 @@ class account_voucher(osv.osv): if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): #create one line for the write off if needed - diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) + diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) account_id = False write_off_name = '' if voucher.payment_option == 'with_writeoff': @@ -950,7 +950,7 @@ class account_voucher_line(osv.osv): def _get_amount_in_company_currency(self, cr, uid, ids, name, args, context=None): res = {} for line in self.browse(cr, uid, ids, context=context): - amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) + amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) res[line.id] = { 'amount_in_company_currency': amount_in_company_currency, 'amount_in_voucher_currency': amount_in_voucher_currency, @@ -959,7 +959,7 @@ class account_voucher_line(osv.osv): _columns = { 'voucher_id':fields.many2one('account.voucher', 'Voucher', required=1, ondelete='cascade'), - 'move_line_id': fields.many2one('account.move.line', 'Journal Item', required=True), + 'move_line_id': fields.many2one('account.move.line', 'Journal Item'), 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), 'name':fields.char('Description', size=256), 'account_id':fields.many2one('account.account','Account', required=True), @@ -972,8 +972,8 @@ class account_voucher_line(osv.osv): 'voucher_currency_id': fields.related('voucher_id', 'currency_id', type='many2one', relation='res.currency', string="Voucher Currency"), 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), - 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), - 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), + 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), 'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1), 'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1), diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index c2344d681c1..0e2ac917153 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -108,7 +108,7 @@ - @@ -122,7 +122,7 @@ - + @@ -173,7 +173,7 @@ - @@ -187,7 +187,7 @@ - + @@ -306,7 +306,7 @@ - @@ -316,7 +316,7 @@ - @@ -335,7 +335,7 @@ - From b505b056e81c20589eb386a1c4053e032be48883 Mon Sep 17 00:00:00 2001 From: mtr Date: Thu, 4 Aug 2011 17:18:57 +0530 Subject: [PATCH 19/99] [IMP] account_voucher: corrected values and currency rate records so that demo data rates doesn't over shadow it bzr revid: mtr@mtr-20110804114857-zditm8vsx2hxr348 --- addons/account_voucher/test/case1_usd_usd.yml | 68 +++++++++---------- addons/account_voucher/test/case2_usd_eur.yml | 56 +++++++-------- addons/account_voucher/test/case3_eur_eur.yml | 25 ++++--- addons/account_voucher/test/case4_cad_chf.yml | 34 +++++----- 4 files changed, 92 insertions(+), 91 deletions(-) diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml index a4e59ccc4b3..123a4463172 100755 --- a/addons/account_voucher/test/case1_usd_usd.yml +++ b/addons/account_voucher/test/case1_usd_usd.yml @@ -1,11 +1,12 @@ - I create a currency rate for USD for january of 1.333333 - - !record {model: res.currency.rate, id: jan_usd}: - currency_id: base.USD - name: !eval "'%s-01-01' %(datetime.now().year)" - rate: 1.333333 - + !python {model: res.currency.rate}: | + from datetime import datetime + curr_id = self.pool.get('res.currency').search(cr, uid, [('name', '=', 'USD')]) + 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 a currency rate for USD for february of 1.250000 - @@ -141,10 +142,10 @@ !python {model: account.voucher}: | import netsvc, time vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 240.0, 2, ttype='receipt', date=False) + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 240.00, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 240.0, + 'amount': 240.00, 'company_id': ref('base.main_company'), 'currency_id': ref('base.USD'), 'journal_id': ref('bank_journal_USD'), @@ -160,28 +161,28 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200: - item['amount'] = 180 + if item['amount_unreconciled'] == 200.00: + item['amount'] = 180.00 else: - item['amount'] = 70 + item['amount'] = 70.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is -10 + I check that writeoff amount computed is -10.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -10), "writeoff amount is not -10" + assert (voucher_id.writeoff_amount == -10.0), "Writeoff amount is not -10.0" - - I check that currency rate difference is -34 + I check that currency rate difference is -34.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -34), "currency rate difference is not -34" + assert (voucher_id.currency_rate_difference == -34.0), "Currency rate difference is not -34.0" - I confirm the voucher - @@ -215,14 +216,14 @@ 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: + if move_line.amount_currency == -180.00: assert move_line.credit == 135.00, "Debtor account has wrong entry." - elif move_line.amount_currency == -70: + elif move_line.amount_currency == -70.00: assert move_line.credit == 56.00, "Debtor account has wrong entry." elif move_line.credit == 34.00: - assert move_line.amount_currency == 0, "Incorrect currency rate difference." - elif move_line.amount_currency == 10: - assert move_line.debit == 9.0, "Writeoff amount is wrong." + assert move_line.amount_currency == 0.00, "Incorrect currency rate difference." + elif move_line.amount_currency == 10.00: + assert move_line.debit == 9.00, "Writeoff amount is wrong." - I check the residual amount of Invoice1, should be 20 in amount_currency and 15 in company currency - @@ -249,10 +250,10 @@ !python {model: account.voucher}: | import netsvc, time vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 45.0, 2, ttype='receipt', date=False) + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 45.00, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 45.0, + 'amount': 45.00, 'company_id': ref('base.main_company'), 'currency_id': ref('base.USD'), 'journal_id': ref('bank_journal_USD'), @@ -268,29 +269,28 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 20: - item['amount'] = 20 + if item['amount_unreconciled'] == 20.00: + item['amount'] = 20.00 else: - item['amount'] = 30 + item['amount'] = 30.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is -5 + I check that writeoff amount computed is -5.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -5), "writeoff amount is not -5" + assert (voucher_id.writeoff_amount == -5.0), "Writeoff amount is not -5.0" - I check that currency rate difference is -8.50 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - curr_diff = voucher_id.currency_rate_difference - assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not -8.50" + assert (voucher_id.currency_rate_difference == -8.50), "Currency rate difference is not -8.50" - I confirm the voucher - @@ -324,13 +324,13 @@ 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 == -20: - assert move_line.credit == 15, "Debtor account has wrong entry." - elif move_line.amount_currency == -30: - assert move_line.credit == 24, "Debtor account has wrong entry." - elif move_line.credit == 8.5: + if move_line.amount_currency == -20.00: + assert move_line.credit == 15.00, "Debtor account has wrong entry." + elif move_line.amount_currency == -30.00: + assert move_line.credit == 24.00, "Debtor account has wrong entry." + elif move_line.credit == 8.50: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.amount_currency == 5: + elif move_line.amount_currency == 5.00: assert move_line.debit == 4.75, "Writeoff amount is wrong." - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml index 35e0bf86231..e6d24fb5a1b 100644 --- a/addons/account_voucher/test/case2_usd_eur.yml +++ b/addons/account_voucher/test/case2_usd_eur.yml @@ -1,10 +1,12 @@ - I create a currency rate for USD for january of 1.333333 - - !record {model: res.currency.rate, id: janu_usd}: - currency_id: base.USD - name: !eval "'%s-01-01' %(datetime.now().year)" - rate: 1.333333 + !python {model: res.currency.rate}: | + from datetime import datetime + curr_id = self.pool.get('res.currency').search(cr, uid, [('name', '=', 'USD')]) + 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 a currency rate for USD for february of 1.250000 - @@ -168,28 +170,28 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200: - item['amount'] = 180 + if item['amount_unreconciled'] == 200.00: + item['amount'] = 180.00 else: - item['amount'] = 70 + item['amount'] = 70.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is 15 + I check that writeoff amount computed is 15.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 15), "writeoff amount is not 15" + assert (voucher_id.writeoff_amount == 15.0), "Writeoff amount is not 15.0" - - I check that currency rate difference is -34 + I check that currency rate difference is -34.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -34), "currency rate difference is not -34" + assert (voucher_id.currency_rate_difference == -34.0), "Currency rate difference is not -34.0" - I confirm the voucher - @@ -223,11 +225,11 @@ 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: - assert move_line.credit == 135, "Debtor account has wrong entry." - elif move_line.amount_currency == -70: + if move_line.amount_currency == -180.00: + assert move_line.credit == 135.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.credit == 34: + elif move_line.credit == 34.00: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." elif move_line.credit == 15.00: assert move_line.amount_currency == 0.00, "Writeoff amount is wrong." @@ -275,28 +277,28 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 20: - item['amount'] = 20 + if item['amount_unreconciled'] == 20.00: + item['amount'] = 20.00 else: - item['amount'] = 30 + item['amount'] = 30.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is -5 + I check that writeoff amount computed is -5.0 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -5), "writeoff amount is not -5" + assert (voucher_id.writeoff_amount == -5.0), "Writeoff amount is not -5.0" - I check that currency rate difference is -8.50 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -8.50), "currency rate difference is not -8.50" + assert (voucher_id.currency_rate_difference == -8.50), "Currency rate difference is not -8.50" - I confirm the voucher - @@ -327,13 +329,13 @@ 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 == -20: - assert move_line.credit == 15, "Debtor account has wrong entry." - elif move_line.amount_currency == -30: - assert move_line.credit == 24, "Debtor account has wrong entry." - elif move_line.credit == 8.5: + if move_line.amount_currency == -20.00: + assert move_line.credit == 15.00, "Debtor account has wrong entry." + elif move_line.amount_currency == -30.00: + assert move_line.credit == 24.00, "Debtor account has wrong entry." + elif move_line.credit == 8.50: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.amount_currency == 5: + elif move_line.amount_currency == 5.00: assert move_line.debit == 4.75, "Writeoff amount is wrong." - I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual and paid diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml index 5779028641e..904abb7f0db 100644 --- a/addons/account_voucher/test/case3_eur_eur.yml +++ b/addons/account_voucher/test/case3_eur_eur.yml @@ -138,7 +138,7 @@ res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 120.0, + 'amount': 120.00, 'company_id': ref('base.main_company'), 'currency_id': ref('base.EUR'), 'journal_id': ref('bank_journal_EUR'), @@ -154,10 +154,10 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 150: - item['amount'] = 100 + if item['amount_unreconciled'] == 150.00: + item['amount'] = 100.00 else: - item['amount'] = 20 + item['amount'] = 20.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) @@ -168,14 +168,14 @@ !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 0), "writeoff amount is not 0" + assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0.00" - I check that currency rate difference is 0.00 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 0.00), "currency rate difference is not 0.00" + assert (voucher_id.currency_rate_difference == 0.00), "Currency rate difference is not 0.00" - I confirm the voucher - @@ -205,9 +205,9 @@ 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.credit == 20: + if move_line.credit == 20.00: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - elif move_line.credit == 100: + elif move_line.credit == 100.00: assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - I check the residual amount of Invoice1 is 50 @@ -234,10 +234,10 @@ !python {model: account.voucher}: | import netsvc, time vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.0, 2, ttype='receipt', date=False) + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 120.0, + 'amount': 120.00, 'company_id': ref('base.main_company'), 'currency_id': ref('base.EUR'), 'journal_id': ref('bank_journal_EUR'), @@ -267,15 +267,14 @@ !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'),('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 0.00), "writeoff amount is not 0" + assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0" - I check that currency rate difference is 0.00 - !python {model: account.voucher}: | voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - curr_diff = voucher_id.currency_rate_difference - assert (voucher_id.currency_rate_difference == curr_diff), "currency rate difference is not 0" + assert (voucher_id.currency_rate_difference == 0.00), "Currency rate difference is not 0" - I confirm the voucher - diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml index 3d989eaee7a..56795fa127a 100644 --- a/addons/account_voucher/test/case4_cad_chf.yml +++ b/addons/account_voucher/test/case4_cad_chf.yml @@ -11,7 +11,7 @@ !record {model: res.currency.rate, id: mar_cad}: currency_id: base.CAD name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 0.500000 + rate: 2.000000 - I create a currency rate for CHF for january of 1.308600 - @@ -24,7 +24,7 @@ - !record {model: res.currency.rate, id: jan_chf}: currency_id: base.CHF - name: !eval "'%s-01-01' %(datetime.now().year)" + name: !eval "'%s-03-01' %(datetime.now().year)" rate: 1.250000 - I create a bank journal with CHF as currency @@ -100,10 +100,10 @@ !python {model: account.voucher}: | import netsvc, time vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 300.0, 2, ttype='receipt', date=False) + res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 300.00, 2, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), - 'amount': 300.0, + 'amount': 300.00, 'company_id': ref('base.main_company'), 'currency_id': ref('base.CHF'), 'journal_id': ref('bank_journal_CHF'), @@ -119,39 +119,40 @@ if not res['value']['line_cr_ids']: res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200: - item['amount'] = 200 + if item['amount_unreconciled'] == 200.00: + item['amount'] = 200.00 vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) assert (voucher_id.state=='draft'), "Voucher is not in draft state" - - I check that writeoff amount computed is 175 + I check that writeoff amount computed is 175.0 - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 175), "writeoff amount is not 175" + assert (voucher_id.writeoff_amount == 175.0), "Writeoff amount is not 175.0" - I check that currency rate difference is 49.39 - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 49.39), "currency rate difference is not 49.39" + curr_diff = float(str(voucher_id.currency_rate_difference)) + assert (curr_diff == 49.39), "Currency rate difference is not 49.39" - I confirm the voucher - !python {model: account.voucher}: | import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) - I check that the move of my voucher is valid - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) voucher_id = self.browse(cr, uid, voucher[0]) move_line_obj = self.pool.get('account.move.line') move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) @@ -168,7 +169,7 @@ I check that my writeoff is correct. 140 credit and -175 amount_currency - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment')]) + voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) voucher_id = self.browse(cr, uid, voucher[0]) move_line_obj = self.pool.get('account.move.line') move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) @@ -178,14 +179,13 @@ elif move_line.debit == 49.39: assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." elif move_line.credit == 140.00: - assert move_line.amount_currency == -175, "Writeoff amount is wrong." + assert move_line.amount_currency == -175.00, "Writeoff amount is wrong." - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) + invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_cad")) 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_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" -- \ No newline at end of file From b752dde2870db8f2ff13135a4298cb11acaecf7c Mon Sep 17 00:00:00 2001 From: mtr Date: Fri, 5 Aug 2011 14:28:29 +0530 Subject: [PATCH 20/99] [IMP] account_voucher:improved strings bzr revid: mtr@mtr-20110805085829-m6qhtwu26fky7y9h --- addons/account_voucher/test/case1_usd_usd.yml | 11 +++++++---- addons/account_voucher/test/case2_usd_eur.yml | 11 +++++++---- addons/account_voucher/test/case3_eur_eur.yml | 11 +++++++---- addons/account_voucher/test/case4_cad_chf.yml | 13 ++++++++----- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml index 123a4463172..dc7654ab9c3 100755 --- a/addons/account_voucher/test/case1_usd_usd.yml +++ b/addons/account_voucher/test/case1_usd_usd.yml @@ -1,5 +1,8 @@ - - I create a currency rate for USD for january of 1.333333 + In order to check the Account_voucher module with multi-currency in OpenERP, + I create 2 Invoices in USD and make 2 Payments in USD based on the currency rating on that particular date +- + I create currency USD in OpenERP for January of 1.333333 Rate - !python {model: res.currency.rate}: | from datetime import datetime @@ -8,7 +11,7 @@ ids = self.search(cr, uid, [('currency_id','=',curr_id), ('name', '=', date)]) self.write(cr, uid, ids, {'rate': 1.333333}) - - I create a currency rate for USD for february of 1.250000 + I create currency USD in OpenERP for February of 1.250000 Rate - !record {model: res.currency.rate, id: feb_usd}: currency_id: base.USD @@ -16,7 +19,7 @@ rate: 1.250000 - - I create a currency rate for USD for march of 1.111111 + I create currency USD in OpenERP for March of 1.111111 Rate - !record {model: res.currency.rate, id: mar_usd}: currency_id: base.USD @@ -24,7 +27,7 @@ rate: 1.111111 - - I create a currency rate for USD for april of 1.052632 + I create currency USD in OpenERP for April of 1.052632 Rate - !record {model: res.currency.rate, id: apr_usd}: currency_id: base.USD diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml index e6d24fb5a1b..ded95095e5a 100644 --- a/addons/account_voucher/test/case2_usd_eur.yml +++ b/addons/account_voucher/test/case2_usd_eur.yml @@ -1,5 +1,8 @@ - - I create a currency rate for USD for january of 1.333333 + In order to check the Account_voucher module with multi-currency in OpenERP, + I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date +- + I create currency USD in OpenERP for January of 1.333333 Rate - !python {model: res.currency.rate}: | from datetime import datetime @@ -8,21 +11,21 @@ ids = self.search(cr, uid, [('currency_id', '=', curr_id), ('name', '=', date)]) self.write(cr, uid, ids, {'rate': 1.333333}) - - I create a currency rate for USD for february of 1.250000 + I create currency USD in OpenERP for February of 1.250000 Rate - !record {model: res.currency.rate, id: febr_usd}: currency_id: base.USD name: !eval "'%s-02-01' %(datetime.now().year)" rate: 1.250000 - - I create a currency rate for USD for march of 1.111111 + I create currency USD in OpenERP for March of 1.111111 Rate - !record {model: res.currency.rate, id: marc_usd}: currency_id: base.USD name: !eval "'%s-03-01' %(datetime.now().year)" rate: 1.111111 - - I create a currency rate for USD for april of 1.052632 + I create currency USD in OpenERP for April of 1.052632 Rate - !record {model: res.currency.rate, id: apri_usd}: currency_id: base.USD diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml index 904abb7f0db..b35daf49402 100644 --- a/addons/account_voucher/test/case3_eur_eur.yml +++ b/addons/account_voucher/test/case3_eur_eur.yml @@ -1,26 +1,29 @@ - - I create a currency rate for EUR for january of 1.000000 + In order to check the Account_voucher module with multi-currency in OpenERP, + I create 2 Invoices in EUR and make 2 Payments in EUR based on the currency rating on that particular date. +- + I create currency EUR in OpenERP for January of 1.000000 Rate - !record {model: res.currency.rate, id: jan_eur}: currency_id: base.EUR name: !eval "'%s-01-01' %(datetime.now().year)" rate: 1.000000 - - I create a currency rate for EUR for february of 1.000000 + I create currency EUR in OpenERP for February of 1.000000 Rate - !record {model: res.currency.rate, id: feb_eur}: currency_id: base.EUR name: !eval "'%s-02-01' %(datetime.now().year)" rate: 1.000000 - - I create a currency rate for EUR for march of 1.000000 + I create currency EUR in OpenERP for March of 1.000000 Rate - !record {model: res.currency.rate, id: mar_eur}: currency_id: base.EUR name: !eval "'%s-03-01' %(datetime.now().year)" rate: 1.000000 - - I create a currency rate for EUR for april of 1.000000 + I create currency EUR in OpenERP for April of 1.000000 Rate - !record {model: res.currency.rate, id: apr_eur}: currency_id: base.EUR diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml index 56795fa127a..b6ed790dffb 100644 --- a/addons/account_voucher/test/case4_cad_chf.yml +++ b/addons/account_voucher/test/case4_cad_chf.yml @@ -1,28 +1,31 @@ - - I create a currency rate for CAD for january of 1.338800 + In order to check the Account_voucher module with multi-currency in OpenERP, + I create an invoice in CAD and make its Payment in CHF based on the currency rating on that particular date. +- + I create currency CAD in OpenERP for January of 1.338800 Rate - !record {model: res.currency.rate, id: jan_cad}: currency_id: base.CAD name: !eval "'%s-01-01' %(datetime.now().year)" rate: 1.338800 - - I create a currency rate for CAD for march of 2.000000 + I create currency CAD in OpenERP for March of 2.000000 Rate - !record {model: res.currency.rate, id: mar_cad}: currency_id: base.CAD name: !eval "'%s-03-01' %(datetime.now().year)" rate: 2.000000 - - I create a currency rate for CHF for january of 1.308600 + I create currency CHF in OpenERP for January of 1.308600 Rate - !record {model: res.currency.rate, id: jan_chf}: currency_id: base.CHF name: !eval "'%s-01-01' %(datetime.now().year)" rate: 1.308600 - - I create a currency rate for CHF for march of 1.250000 + I create currency CHF in OpenERP for March of 1.250000 Rate - - !record {model: res.currency.rate, id: jan_chf}: + !record {model: res.currency.rate, id: mar_chf}: currency_id: base.CHF name: !eval "'%s-03-01' %(datetime.now().year)" rate: 1.250000 From d852a2a828371f02522677de5f5c2e5e7cde3903 Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Mon, 8 Aug 2011 18:38:57 +0530 Subject: [PATCH 21/99] [IMP]account,hr_timesheet_sheet,mrp,pad,point_of_sale,purchase:Improvement is done in company view bzr revid: mma@tinyerp.com-20110808130857-fyxra4gte3nsp60u --- addons/account/company.py | 6 +++--- .../hr_timesheet_sheet/hr_timesheet_sheet_view.xml | 13 ++++++++----- addons/mrp/company_view.xml | 6 +++--- addons/pad/company_pad.xml | 9 ++++++--- addons/point_of_sale/point_of_sale_view.xml | 13 ++++++++----- addons/procurement/company_view.xml | 10 +++++----- addons/project/project_view.xml | 9 ++++++--- addons/purchase/company_view.xml | 6 +++--- addons/sale/company_view.xml | 6 +++--- 9 files changed, 45 insertions(+), 33 deletions(-) diff --git a/addons/account/company.py b/addons/account/company.py index c7836e0128b..82a60beb461 100644 --- a/addons/account/company.py +++ b/addons/account/company.py @@ -36,9 +36,9 @@ class res_company(osv.osv): } _defaults = { - 'overdue_msg': 'Please note that the following payments are now due. If your payment \ - has been sent, kindly forward your payment details. If payment will be \ - delayed further, please contact us to discuss. \ + 'overdue_msg': 'Please note that the following payments are now due.\ + \nIf your payment has been sent, kindly forward your payment details.\ + \nIf payment will be delayed further, please contact us to discuss.\ \nWould your payment have been carried out after this mail was sent, please consider the present one as void.' } diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 321e4c2addd..be6c4509557 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -202,14 +202,17 @@ res.company.sheet res.company form + 18 - - - - + + + + + - + + diff --git a/addons/mrp/company_view.xml b/addons/mrp/company_view.xml index f5f06518565..3c33a332977 100644 --- a/addons/mrp/company_view.xml +++ b/addons/mrp/company_view.xml @@ -6,12 +6,12 @@ res.company.mrp.config res.company form - 22 + 24 - + - + diff --git a/addons/pad/company_pad.xml b/addons/pad/company_pad.xml index 754776715d7..0ee80937d18 100644 --- a/addons/pad/company_pad.xml +++ b/addons/pad/company_pad.xml @@ -6,9 +6,12 @@ form - - - + + + + + + diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 1435f6cc2b6..8bf7155096c 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -637,13 +637,16 @@ view.company.form.pos res.company form + 25 - - - - - + + + + + + + diff --git a/addons/procurement/company_view.xml b/addons/procurement/company_view.xml index 4d14f69edde..a5319c43640 100644 --- a/addons/procurement/company_view.xml +++ b/addons/procurement/company_view.xml @@ -6,14 +6,14 @@ res.company.mrp.config res.company form - 17 + 25 - + - - - + + + diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 85cde448c6d..cafe538e12a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -528,13 +528,16 @@ res.company.task.config res.company form + 22 - - + + + - + + diff --git a/addons/purchase/company_view.xml b/addons/purchase/company_view.xml index d9d2fb9f9ee..04e48af29d9 100644 --- a/addons/purchase/company_view.xml +++ b/addons/purchase/company_view.xml @@ -6,12 +6,12 @@ res.company.mrp.config res.company form - 19 + 22 - + - + diff --git a/addons/sale/company_view.xml b/addons/sale/company_view.xml index 96ff91e8e90..567bf50948f 100644 --- a/addons/sale/company_view.xml +++ b/addons/sale/company_view.xml @@ -5,12 +5,12 @@ res.company.mrp.config res.company form - 24 + 20 - + - + From 3008bf4b02f89e9659f433d7333942551fd14e78 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Tue, 9 Aug 2011 14:25:04 +0530 Subject: [PATCH 22/99] [IMP] improve period of account_voucher bzr revid: ara@tinyerp.com-20110809085504-d9clu2tbry1vagt8 --- addons/account_voucher/account_voucher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index f30f04406a3..e42bf519b3d 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -631,7 +631,8 @@ class account_voucher(osv.osv): vals['value'].update({'currency_id':currency_id}) context.update({'company_id': journal.company_id.id}) periods = self.pool.get('account.period').find(cr, uid, context=context) - vals['value'].update({'period_id':periods[0]}) + if periods: + vals['value'].update({'period_id':periods[0]}) return vals def proforma_voucher(self, cr, uid, ids, context=None): From de2cb73d3add5e7c06bfceb229946865353e71cb Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Wed, 10 Aug 2011 11:34:26 +0530 Subject: [PATCH 23/99] [IMP]l10n_ch: rml_footer2 Replace with account_number2 bzr revid: mma@tinyerp.com-20110810060426-3y4ea0reolawrz42 --- addons/l10n_ch/company_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_ch/company_view.xml b/addons/l10n_ch/company_view.xml index df49cf123be..9a9b1464f8d 100644 --- a/addons/l10n_ch/company_view.xml +++ b/addons/l10n_ch/company_view.xml @@ -7,7 +7,7 @@ form - + From ddd53dc30ea3b1edeaf4c9506a1405002107a420 Mon Sep 17 00:00:00 2001 From: "Tejas (OpenERP)" Date: Tue, 16 Aug 2011 17:51:44 +0530 Subject: [PATCH 24/99] [Usability] Changed meni location of the -job position bzr revid: tta@openerp.com-20110816122144-4hjrj4qyk848hkma --- addons/hr/hr_view.xml | 2 +- addons/hr_recruitment/hr_recruitment_menu.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index 64580a7dbe1..c463cf436e0 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -377,7 +377,7 @@ - + diff --git a/addons/hr_recruitment/hr_recruitment_menu.xml b/addons/hr_recruitment/hr_recruitment_menu.xml index 2e941877b65..9883e311fba 100644 --- a/addons/hr_recruitment/hr_recruitment_menu.xml +++ b/addons/hr_recruitment/hr_recruitment_menu.xml @@ -46,6 +46,9 @@ name="Applicants" parent="base.menu_crm_case_job_req_main" id="menu_crm_case_categ0_act_job" action="crm_case_categ0_act_job" sequence="1"/> + + + From 90569c64cac1ff269e6734a1a481d7b949ecb8cf Mon Sep 17 00:00:00 2001 From: "Tejas (OpenERP)" Date: Tue, 16 Aug 2011 18:20:51 +0530 Subject: [PATCH 25/99] [Usability] Product : Lable changed ,Real Stock and Virtual Stock respectively Quanity On Hand and Quantity On Order. bzr revid: tta@openerp.com-20110816125051-4lgrd1x567v2ea0k --- addons/product/product.py | 4 ++-- addons/stock/product.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/product/product.py b/addons/product/product.py index 8e6e132296d..5eb4247fd29 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -469,8 +469,8 @@ class product_product(osv.osv): _inherits = {'product.template': 'product_tmpl_id'} _order = 'default_code,name_template' _columns = { - 'qty_available': fields.function(_product_qty_available, type='float', string='Real Stock'), - 'virtual_available': fields.function(_product_virtual_available, type='float', string='Virtual Stock'), + 'qty_available': fields.function(_product_qty_available, type='float', string='Quantity On Hand'), + 'virtual_available': fields.function(_product_virtual_available, type='float', string='Quantity On Order'), 'incoming_qty': fields.function(_product_incoming_qty, type='float', string='Incoming'), 'outgoing_qty': fields.function(_product_outgoing_qty, type='float', string='Outgoing'), 'price': fields.function(_product_price, type='float', string='Pricelist', digits_compute=dp.get_precision('Sale Price')), diff --git a/addons/stock/product.py b/addons/stock/product.py index 70925a82d10..46a5dec759d 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -330,8 +330,8 @@ class product_product(osv.osv): return res _columns = { - 'qty_available': fields.function(_product_available, type='float', string='Real Stock', help="Current quantities of products in selected locations or all internal if none have been selected.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), - 'virtual_available': fields.function(_product_available, type='float', string='Virtual Stock', help="Future stock for this product according to the selected locations or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), + 'qty_available': fields.function(_product_available, type='float', string='Quantity On Hand', help="Current quantities of products in selected locations or all internal if none have been selected.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), + 'virtual_available': fields.function(_product_available, type='float', string='Quantity On Order', help="Future stock for this product according to the selected locations or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), 'incoming_qty': fields.function(_product_available, type='float', string='Incoming', help="Quantities of products that are planned to arrive in selected locations or all internal if none have been selected.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), 'outgoing_qty': fields.function(_product_available, type='float', string='Outgoing', help="Quantities of products that are planned to leave in selected locations or all internal if none have been selected.", multi='qty_available', digits_compute=dp.get_precision('Product UoM')), 'track_production': fields.boolean('Track Manufacturing Lots' , help="Forces to specify a Production Lot for all moves containing this product and generated by a Manufacturing Order"), From 170ee9bf72132b553dfd856cb5476b0c00d9419d Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 16 Aug 2011 19:03:53 +0530 Subject: [PATCH 26/99] [IMP]: remove stage type in lead and opportunity bzr revid: ksa@tinyerp.co.in-20110816133353-kfgzeotfuwoe0jle --- addons/crm/crm_lead.py | 2 +- addons/crm/crm_lead_view.xml | 2 +- addons/crm/crm_opportunity.py | 2 +- addons/crm/crm_opportunity_view.xml | 2 +- addons/crm/report/crm_lead_report.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 294c5dfbf56..7644bf08042 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -155,7 +155,7 @@ class crm_lead(crm_case, osv.osv): ],'Type', help="Type is used to separate Leads and Opportunities"), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 'date_closed': fields.datetime('Closed', readonly=True), - 'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','lead')]"), + 'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[(section_ids', '=', section_id)]"), 'user_id': fields.many2one('res.users', 'Salesman'), 'referred': fields.char('Referred By', size=64), 'date_open': fields.datetime('Opened', readonly=True), diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index cc0297c16f4..812ba11b623 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -74,7 +74,7 @@ - +