From cbc52f80eb0424a6bc2947d10d150dd3833d0100 Mon Sep 17 00:00:00 2001 From: qdp-odoo Date: Fri, 29 Aug 2014 19:13:41 +0200 Subject: [PATCH] [FIX] account: fixes of bank statement reconciliation widget. Add of a partner_name field to hold the name of the counterparty in case it is not detected instead of merging it to the communication. Structured communication goes in the same communication field, while reference field holds the reference of the transaction (for whatever that means)" --- addons/account/account_bank_statement.py | 25 ++++++++++++------- .../account/demo/account_bank_statement.xml | 4 +-- .../account/static/src/js/account_widgets.js | 2 +- .../account_bank_statement_reconciliation.xml | 5 ++-- .../wizard/account_coda_import.py | 23 +++++++---------- 5 files changed, 31 insertions(+), 28 deletions(-) diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 0301d64db11..a6edaff4967 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -439,6 +439,15 @@ class account_bank_statement(osv.osv): class account_bank_statement_line(osv.osv): + def unlink(self, cr, uid, ids, context=None): + for item in self.browse(cr, uid, ids, context=context): + if item.journal_entry_id: + raise osv.except_osv( + _('Invalid Action!'), + _('In order to delete a bank statement line, you must first cancel it to delete related journal items.') + ) + return super(account_bank_statement_line, self).unlink(cr, uid, ids, context=context) + def cancel(self, cr, uid, ids, context=None): account_move_obj = self.pool.get('account.move') move_ids = [] @@ -522,7 +531,7 @@ class account_bank_statement_line(osv.osv): 'statement_id': line.statement_id.id, 'account_code': line.journal_id.default_debit_account_id.code, 'account_name': line.journal_id.default_debit_account_id.name, - 'partner_name': line.partner_id.name, + 'partner_name': line.partner_id and line.partner_id.name or line.partner_name, 'amount_currency_str': amount_currency_str, 'has_no_partner': not line.partner_id.id, } @@ -533,9 +542,7 @@ class account_bank_statement_line(osv.osv): return data def search_structured_com(self, cr, uid, st_line, context=None): - if not st_line.ref: - return - domain = [('ref', '=', st_line.ref)] + domain = [('ref', '=', st_line.name.replace('/', ''))] if st_line.partner_id: domain += [('partner_id', '=', st_line.partner_id.id)] ids = self.pool.get('account.move.line').search(cr, uid, domain, limit=1, context=context) @@ -600,14 +607,13 @@ class account_bank_statement_line(osv.osv): """ mv_line_pool = self.pool.get('account.move.line') - domain = additional_domain + [('reconcile_id', '=', False),('state', '=', 'valid')] + domain = additional_domain + [('reconcile_id', '=', False), ('state', '=', 'valid')] if st_line.partner_id.id: domain += [('partner_id', '=', st_line.partner_id.id), '|', ('account_id.type', '=', 'receivable'), ('account_id.type', '=', 'payable')] else: - domain += [('account_id.reconcile', '=', True)] - #domain += [('account_id.reconcile', '=', True), ('account_id.type', '=', 'other')] + domain += [('account_id.reconcile', '=', True), ('account_id.type', '=', 'other')] if excluded_ids: domain.append(('id', 'not in', excluded_ids)) line_ids = mv_line_pool.search(cr, uid, domain, order="date_maturity asc, id asc", context=context) @@ -829,7 +835,7 @@ class account_bank_statement_line(osv.osv): _description = "Bank Statement Line" _inherit = ['ir.needaction_mixin'] _columns = { - 'name': fields.char('Description', required=True), + 'name': fields.char('Communication', required=True), 'date': fields.date('Date', required=True), 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')), 'partner_id': fields.many2one('res.partner', 'Partner'), @@ -837,7 +843,8 @@ class account_bank_statement_line(osv.osv): 'account_id': fields.many2one('account.account', 'Account', help="This technical field can be used at the statement line creation/import time in order to avoid the reconciliation process on it later on. The statement line will simply create a counterpart on this account"), 'statement_id': fields.many2one('account.bank.statement', 'Statement', select=True, required=True, ondelete='cascade'), 'journal_id': fields.related('statement_id', 'journal_id', type='many2one', relation='account.journal', string='Journal', store=True, readonly=True), - 'ref': fields.char('Structured Communication'), + 'partner_name': fields.char('Partner Name', help="This field is used to record the third party name when importing bank statement in electronic format, when the partner doesn't exist yet in the database (or cannot be found)."), + 'ref': fields.char('Reference'), 'note': fields.text('Notes'), 'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of bank statement lines."), 'company_id': fields.related('statement_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True), diff --git a/addons/account/demo/account_bank_statement.xml b/addons/account/demo/account_bank_statement.xml index b79d8b95cd6..aec70da0097 100644 --- a/addons/account/demo/account_bank_statement.xml +++ b/addons/account/demo/account_bank_statement.xml @@ -26,11 +26,11 @@ - SAJ2014002 + - SAJ/2014/002 + SAJ2014002 diff --git a/addons/account/static/src/js/account_widgets.js b/addons/account/static/src/js/account_widgets.js index c9bdaac7071..889538cedb4 100644 --- a/addons/account/static/src/js/account_widgets.js +++ b/addons/account/static/src/js/account_widgets.js @@ -768,10 +768,10 @@ openerp.account = function (instance) { line.q_amount = (line.debit !== 0 ? "- "+line.q_debit : "") + (line.credit !== 0 ? line.q_credit : ""); line.q_popover = QWeb.render("bank_statement_reconciliation_move_line_details", {line: line}); line.q_label = line.name; + if (line.has_no_partner){ line.q_label = line.partner_name + ': ' +line.q_label; } - // WARNING : pretty much of a ugly hack // The value of account_move.ref is either the move's communication or it's name without the slashes if (line.ref && line.ref !== line.name.replace(/\//g,'')) diff --git a/addons/account/static/src/xml/account_bank_statement_reconciliation.xml b/addons/account/static/src/xml/account_bank_statement_reconciliation.xml index 2c410404a4d..83680f005e3 100644 --- a/addons/account/static/src/xml/account_bank_statement_reconciliation.xml +++ b/addons/account/static/src/xml/account_bank_statement_reconciliation.xml @@ -53,7 +53,7 @@ @@ -61,7 +61,8 @@ - diff --git a/addons/l10n_be_coda/wizard/account_coda_import.py b/addons/l10n_be_coda/wizard/account_coda_import.py index ad21a780611..929179873d7 100644 --- a/addons/l10n_be_coda/wizard/account_coda_import.py +++ b/addons/l10n_be_coda/wizard/account_coda_import.py @@ -59,6 +59,7 @@ class account_coda_import(osv.osv_memory): return {} recordlist = unicode(base64.decodestring(codafile), 'windows-1252', 'strict').split('\n') statements = [] + globalisation_comm = {} for line in recordlist: if not line: pass @@ -69,7 +70,6 @@ class account_coda_import(osv.osv_memory): statement['version'] = line[127] if statement['version'] not in ['1', '2']: raise osv.except_osv(_('Error') + ' R001', _('CODA V%s statements are not supported, please contact your bank') % statement['version']) - statement['globalisation_stack'] = [] statement['lines'] = [] statement['date'] = time.strftime(tools.DEFAULT_SERVER_DATE_FORMAT, time.strptime(rmspaces(line[5:11]), '%d%m%y')) statement['separateApplication'] = rmspaces(line[83:88]) @@ -154,16 +154,11 @@ class account_coda_import(osv.osv_memory): statementLine['entryDate'] = time.strftime(tools.DEFAULT_SERVER_DATE_FORMAT, time.strptime(rmspaces(line[115:121]), '%d%m%y')) statementLine['type'] = 'normal' statementLine['globalisation'] = int(line[124]) - if len(statement['globalisation_stack']) > 0 and statementLine['communication'] != '': - statementLine['communication'] = "\n".join([statement['globalisation_stack'][-1]['communication'], statementLine['communication']]) if statementLine['globalisation'] > 0: - if len(statement['globalisation_stack']) > 0 and statement['globalisation_stack'][-1]['globalisation'] == statementLine['globalisation']: - # Destack - statement['globalisation_stack'].pop() - else: - #Stack - statementLine['type'] = 'globalisation' - statement['globalisation_stack'].append(statementLine) + statementLine['type'] = 'globalisation' + globalisation_comm[statementLine['ref_move']] = statementLine['communication'] + if not statementLine.get('communication'): + statementLine['communication'] = globalisation_comm.get(statementLine['ref_move'], '') statement['lines'].append(statementLine) elif line[1] == '2': if statement['lines'][-1]['ref'][0:4] != line[2:6]: @@ -290,7 +285,6 @@ class account_coda_import(osv.osv_memory): if 'counterpartyAddress' in line and line['counterpartyAddress'] != '': note.append(_('Counter Party Address') + ': ' + line['counterpartyAddress']) - line['name'] = "\n".join(filter(None, [line['counterpartyName'], line['communication']])) partner_id = None structured_com = "" bank_account_id = False @@ -311,16 +305,17 @@ class account_coda_import(osv.osv_memory): except ValueError: bank_code = 'bank' bank_account_id = self.pool.get('res.partner.bank').create(cr, uid, {'acc_number': str(line['counterpartyNumber']), 'state': bank_code}, context=context) - if 'communication' in line and line['communication'] != '': + if line.get('communication', ''): note.append(_('Communication') + ': ' + line['communication']) data = { - 'name': line['name'], + 'name': structured_com or line['communication'], 'note': "\n".join(note), 'date': line['entryDate'], 'amount': line['amount'], 'partner_id': partner_id, + 'partner_name': line['counterpartyName'], 'statement_id': statement['id'], - 'ref': structured_com, + 'ref': line['ref'], 'sequence': line['sequence'], 'bank_account_id': bank_account_id, }
- +
+ : + ()