mirror of
https://github.com/OCA/bank-statement-import.git
synced 2025-01-20 12:37:43 +02:00
[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
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
{
|
{
|
||||||
'name': 'Import QIF Bank Statements',
|
'name': 'Import QIF Bank Statements',
|
||||||
'category': 'Accounting',
|
'category': 'Accounting',
|
||||||
'version': '10.0.1.0.0',
|
'version': '10.0.1.0.1',
|
||||||
'author': 'OpenERP SA,'
|
'author': 'OpenERP SA,'
|
||||||
'Tecnativa,'
|
'Tecnativa,'
|
||||||
'Odoo Community Association (OCA)',
|
'Odoo Community Association (OCA)',
|
||||||
|
|||||||
@@ -12,6 +12,15 @@ from odoo.tools.translate import _
|
|||||||
from odoo import api, models
|
from odoo import api, models
|
||||||
from odoo.exceptions import UserError
|
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):
|
class AccountBankStatementImport(models.TransientModel):
|
||||||
_inherit = "account.bank.statement.import"
|
_inherit = "account.bank.statement.import"
|
||||||
@@ -20,10 +29,21 @@ class AccountBankStatementImport(models.TransientModel):
|
|||||||
def _check_qif(self, data_file):
|
def _check_qif(self, data_file):
|
||||||
return data_file.strip().startswith('!Type:')
|
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):
|
def _parse_file(self, data_file):
|
||||||
if not self._check_qif(data_file):
|
if not self._check_qif(data_file):
|
||||||
return super(AccountBankStatementImport, self)._parse_file(
|
return super(AccountBankStatementImport, self)._parse_file(
|
||||||
data_file)
|
data_file)
|
||||||
|
encoding = self._get_qif_encoding(data_file)
|
||||||
|
data_file = data_file.decode(encoding)
|
||||||
try:
|
try:
|
||||||
file_data = ""
|
file_data = ""
|
||||||
for line in StringIO.StringIO(data_file).readlines():
|
for line in StringIO.StringIO(data_file).readlines():
|
||||||
@@ -39,15 +59,14 @@ class AccountBankStatementImport(models.TransientModel):
|
|||||||
transactions = []
|
transactions = []
|
||||||
vals_line = {}
|
vals_line = {}
|
||||||
total = 0
|
total = 0
|
||||||
if header == "Bank":
|
if header in ("Bank", "CCard"):
|
||||||
vals_bank_statement = {}
|
vals_bank_statement = {}
|
||||||
for line in data_list:
|
for line in data_list:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if not line:
|
if not line:
|
||||||
continue
|
continue
|
||||||
if line[0] == 'D': # date of transaction
|
if line[0] == 'D': # date of transaction
|
||||||
vals_line['date'] = dateutil.parser.parse(
|
vals_line['date'] = self._parse_qif_date(line[1:])
|
||||||
line[1:], fuzzy=True).date()
|
|
||||||
elif line[0] == 'T': # Total amount
|
elif line[0] == 'T': # Total amount
|
||||||
total += float(line[1:].replace(',', ''))
|
total += float(line[1:].replace(',', ''))
|
||||||
vals_line['amount'] = float(line[1:].replace(',', ''))
|
vals_line['amount'] = float(line[1:].replace(',', ''))
|
||||||
|
|||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
chardet
|
||||||
Reference in New Issue
Block a user