|
@ -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( |
|
|
|
|
|
line[1:], fuzzy=True).date() |
|
|
|
|
|
|
|
|
vals_line['date'] = self._parse_qif_date(line[1:]) |
|
|
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(',', '')) |
|
|