From 3a549cce9027222db366e4b31ed07129de8b388b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 21 Nov 2017 12:40:08 +0100 Subject: [PATCH] [FIX] fix issue with encoding, as encoding may change depending of your provider try to guess it automatically, Also add support of AMEX qif by adding header CCARD, and extract a function to parse the date so you can hack it in a custom module --- .../__manifest__.py | 2 +- .../account_bank_statement_import_qif.py | 25 ++++++++++++++++--- requirements.txt | 1 + 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 requirements.txt diff --git a/account_bank_statement_import_qif/__manifest__.py b/account_bank_statement_import_qif/__manifest__.py index 35f3e42..dc67e56 100644 --- a/account_bank_statement_import_qif/__manifest__.py +++ b/account_bank_statement_import_qif/__manifest__.py @@ -8,7 +8,7 @@ { 'name': 'Import QIF Bank Statements', 'category': 'Accounting', - 'version': '10.0.1.0.0', + 'version': '10.0.1.0.1', 'author': 'OpenERP SA,' 'Tecnativa,' 'Odoo Community Association (OCA)', diff --git a/account_bank_statement_import_qif/wizards/account_bank_statement_import_qif.py b/account_bank_statement_import_qif/wizards/account_bank_statement_import_qif.py index 4eb7058..3237096 100644 --- a/account_bank_statement_import_qif/wizards/account_bank_statement_import_qif.py +++ b/account_bank_statement_import_qif/wizards/account_bank_statement_import_qif.py @@ -12,6 +12,15 @@ from odoo.tools.translate import _ from odoo import api, models from odoo.exceptions import UserError +import logging +_logger = logging.getLogger(__name__) + +try: + import chardet +except (ImportError, IOError) as err: + chardet = False + _logger.debug(err) + class AccountBankStatementImport(models.TransientModel): _inherit = "account.bank.statement.import" @@ -20,10 +29,21 @@ class AccountBankStatementImport(models.TransientModel): def _check_qif(self, data_file): return data_file.strip().startswith('!Type:') + def _get_qif_encoding(self, data_file): + if chardet: + return chardet.detect(data_file)['encoding'] + else: + return u'utf-8' + + def _parse_qif_date(self, date_str): + return dateutil.parser.parse(date_str, fuzzy=True).date() + def _parse_file(self, data_file): if not self._check_qif(data_file): return super(AccountBankStatementImport, self)._parse_file( data_file) + encoding = self._get_qif_encoding(data_file) + data_file = data_file.decode(encoding) try: file_data = "" for line in StringIO.StringIO(data_file).readlines(): @@ -39,15 +59,14 @@ class AccountBankStatementImport(models.TransientModel): transactions = [] vals_line = {} total = 0 - if header == "Bank": + if header in ("Bank", "CCard"): vals_bank_statement = {} for line in data_list: line = line.strip() if not line: continue if line[0] == 'D': # date of transaction - vals_line['date'] = dateutil.parser.parse( - line[1:], fuzzy=True).date() + vals_line['date'] = self._parse_qif_date(line[1:]) elif line[0] == 'T': # Total amount total += float(line[1:].replace(',', '')) vals_line['amount'] = float(line[1:].replace(',', '')) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +chardet