From d87b74891c8609d97c12f4fd02cf10d7dee1ba00 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 23 Jan 2015 22:50:24 +0100 Subject: [PATCH] New backport from odoo/master Fix bug #5 --- .../__openerp__.py | 3 +- .../account_bank_statement_import_ofx.py | 71 ++++++++---------- .../static/description/icon.png | Bin 0 -> 6282 bytes .../tests/__init__.py | 4 - .../tests/test_import_bank_statement.py | 7 +- 5 files changed, 36 insertions(+), 49 deletions(-) create mode 100644 account_bank_statement_import_ofx/static/description/icon.png diff --git a/account_bank_statement_import_ofx/__openerp__.py b/account_bank_statement_import_ofx/__openerp__.py index 25056dd..8d2d4ee 100644 --- a/account_bank_statement_import_ofx/__openerp__.py +++ b/account_bank_statement_import_ofx/__openerp__.py @@ -3,6 +3,7 @@ # flake8: noqa { 'name': 'Import OFX Bank Statement', + 'category' : 'Accounting & Finance', 'version': '1.0', 'author': 'OpenERP SA', 'depends': ['account_bank_statement_import'], @@ -28,5 +29,3 @@ create periods for the year 2013. 'auto_install': False, 'installable': True, } - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/account_bank_statement_import_ofx/account_bank_statement_import_ofx.py b/account_bank_statement_import_ofx/account_bank_statement_import_ofx.py index 6f690a7..cf0eb8a 100644 --- a/account_bank_statement_import_ofx/account_bank_statement_import_ofx.py +++ b/account_bank_statement_import_ofx/account_bank_statement_import_ofx.py @@ -3,74 +3,67 @@ # flake8: noqa import logging -import base64 -import os +import StringIO from openerp.osv import osv from openerp.tools.translate import _ +from openerp.exceptions import Warning _logger = logging.getLogger(__name__) -from openerp.addons.account_bank_statement_import import account_bank_statement_import as ibs -ibs.add_file_type(('ofx', 'OFX')) - try: from ofxparse import OfxParser as ofxparser except ImportError: - _logger.warning("OFX parser unavailable because the `ofxparse` Python library cannot be found." + _logger.error("OFX parser unavailable because the `ofxparse` Python library cannot be found." "It can be downloaded and installed from `https://pypi.python.org/pypi/ofxparse`.") ofxparser = None class account_bank_statement_import(osv.TransientModel): _inherit = 'account.bank.statement.import' - def process_ofx(self, cr, uid, data_file, journal_id=False, context=None): - """ Import a file in the .OFX format""" + def _check_ofx(self, cr, uid, file, context=None): if ofxparser is None: - raise osv.except_osv(_("Error"), _("OFX parser unavailable because the `ofxparse` Python library cannot be found." - "It can be downloaded and installed from `https://pypi.python.org/pypi/ofxparse`.")) + return False try: - tempfile = open("temp.ofx", "w+") - tempfile.write(base64.decodestring(data_file)) - tempfile.read() - pathname = os.path.dirname('temp.ofx') - path = os.path.join(os.path.abspath(pathname), 'temp.ofx') - ofx = ofxparser.parse(file(path)) + ofx = ofxparser.parse(file) except: - raise osv.except_osv(_('Import Error!'), _('Please check OFX file format is proper or not.')) - line_ids = [] + return False + return ofx + + def _parse_file(self, cr, uid, data_file, context=None): + ofx = self._check_ofx(cr, uid, StringIO.StringIO(data_file), context=context) + if not ofx: + return super(account_bank_statement_import, self)._parse_file(cr, uid, data_file, context=context) + + transactions = [] total_amt = 0.00 try: for transaction in ofx.account.statement.transactions: - bank_account_id, partner_id = self._detect_partner(cr, uid, transaction.payee, identifying_field='owner_name', context=context) + # Since ofxparse doesn't provide account numbers, we'll have to find res.partner and res.partner.bank here + # (normal behavious is to provide 'account_number', which the generic module uses to find partner/bank) + bank_account_id = partner_id = False + ids = self.pool.get('res.partner.bank').search(cr, uid, [('owner_name', '=', transaction.payee)], context=context) + if ids: + bank_account_id = bank_account_id = ids[0] + partner_id = self.pool.get('res.partner.bank').browse(cr, uid, bank_account_id, context=context).partner_id.id vals_line = { 'date': transaction.date, - 'name': transaction.payee + ': ' + transaction.memo, + 'name': transaction.payee + (transaction.memo and ': ' + transaction.memo or ''), 'ref': transaction.id, 'amount': transaction.amount, - 'partner_id': partner_id, + 'unique_import_id': transaction.id, 'bank_account_id': bank_account_id, + 'partner_id': partner_id, } total_amt += float(transaction.amount) - line_ids.append((0, 0, vals_line)) + transactions.append(vals_line) except Exception, e: - raise osv.except_osv(_('Error!'), _("Following problem has been occurred while importing your file, Please verify the file is proper or not.\n\n %s" % e.message)) - st_start_date = ofx.account.statement.start_date or False - st_end_date = ofx.account.statement.end_date or False - period_obj = self.pool.get('account.period') - if st_end_date: - period_ids = period_obj.find(cr, uid, st_end_date, context=context) - else: - period_ids = period_obj.find(cr, uid, st_start_date, context=context) + raise Warning(_("The following problem occurred during import. The file might not be valid.\n\n %s" % e.message)) + vals_bank_statement = { 'name': ofx.account.routing_number, - 'balance_start': ofx.account.statement.balance, - 'balance_end_real': float(ofx.account.statement.balance) + total_amt, - 'period_id': period_ids and period_ids[0] or False, - 'journal_id': journal_id + 'transactions': transactions, + 'balance_start': float(ofx.account.statement.balance) - total_amt, + 'balance_end_real': float(ofx.account.statement.balance), } - vals_bank_statement.update({'line_ids': line_ids}) - os.remove(path) - return [vals_bank_statement] - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + return ofx.account.statement.currency, ofx.account.number, [vals_bank_statement] diff --git a/account_bank_statement_import_ofx/static/description/icon.png b/account_bank_statement_import_ofx/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c630877c1c5f76912c1e9197d3e688eb2f0e65d4 GIT binary patch literal 6282 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