Browse Source

[MIG] migrate account_bank_statement_import_ofx to V11

- add #136 patch
pull/200/head
Nicolas JEUDY 7 years ago
committed by Benjamin
parent
commit
f8255d469f
  1. 3
      account_bank_statement_import_ofx/README.rst
  2. 1
      account_bank_statement_import_ofx/__init__.py
  3. 4
      account_bank_statement_import_ofx/__manifest__.py
  4. 1
      account_bank_statement_import_ofx/tests/__init__.py
  5. 46
      account_bank_statement_import_ofx/tests/test_import_bank_statement.py
  6. 101
      account_bank_statement_import_ofx/tests/test_ofx_file/test_ofx_iban.ofx
  7. 100
      account_bank_statement_import_ofx/tests/test_ofx_file/test_ofx_wrong.ofx
  8. 1
      account_bank_statement_import_ofx/wizard/__init__.py
  9. 26
      account_bank_statement_import_ofx/wizard/account_bank_statement_import.py

3
account_bank_statement_import_ofx/README.rst

@ -22,7 +22,7 @@ Usage
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot :alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/174/10.0
:target: https://runbot.odoo-community.org/runbot/174/11.0
Known issues / Roadmap Known issues / Roadmap
====================== ======================
@ -48,6 +48,7 @@ Contributors
* Laurent Mignon <laurent.mignon@acsone.eu> * Laurent Mignon <laurent.mignon@acsone.eu>
* Ronald Portier <rportier@therp.nl> * Ronald Portier <rportier@therp.nl>
* Sylvain LE GAL <https://twitter.com/legalsylvain> * Sylvain LE GAL <https://twitter.com/legalsylvain>
* Nicolas JEUDY <https://github.com/njeudy>
Maintainer Maintainer
---------- ----------

1
account_bank_statement_import_ofx/__init__.py

@ -1,2 +1 @@
# -*- coding: utf-8 -*-
from . import wizard from . import wizard

4
account_bank_statement_import_ofx/__manifest__.py

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*-
{ {
'name': 'Import OFX Bank Statement', 'name': 'Import OFX Bank Statement',
'category': 'Banking addons', 'category': 'Banking addons',
'version': '10.0.1.0.0',
'version': '11.0.1.0.0',
'license': 'AGPL-3', 'license': 'AGPL-3',
'author': 'Odoo SA,' 'author': 'Odoo SA,'
'Akretion,' 'Akretion,'
'La Louve,' 'La Louve,'
'GRAP,' 'GRAP,'
'Nicolas JEUDY,'
'Odoo Community Association (OCA)', 'Odoo Community Association (OCA)',
'website': 'https://odoo-community.org/', 'website': 'https://odoo-community.org/',
'depends': [ 'depends': [

1
account_bank_statement_import_ofx/tests/__init__.py

@ -1,2 +1 @@
# -*- coding: utf-8 -*-
from . import test_import_bank_statement from . import test_import_bank_statement

46
account_bank_statement_import_ofx/tests/test_import_bank_statement.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from odoo.modules.module import get_module_resource from odoo.modules.module import get_module_resource
import base64
class TestOfxFile(TransactionCase): class TestOfxFile(TransactionCase):
@ -12,6 +12,7 @@ class TestOfxFile(TransactionCase):
super(TestOfxFile, self).setUp() super(TestOfxFile, self).setUp()
self.absi_model = self.env['account.bank.statement.import'] self.absi_model = self.env['account.bank.statement.import']
self.abs_model = self.env['account.bank.statement'] self.abs_model = self.env['account.bank.statement']
self.j_model = self.env['account.journal']
self.absl_model = self.env['account.bank.statement.line'] self.absl_model = self.env['account.bank.statement.line']
cur = self.env.ref('base.USD') cur = self.env.ref('base.USD')
self.env.ref('base.main_company').currency_id = cur.id self.env.ref('base.main_company').currency_id = cur.id
@ -28,21 +29,58 @@ class TestOfxFile(TransactionCase):
'bank_account_id': bank.id, 'bank_account_id': bank.id,
}) })
bank_iban_ofx = self.env['res.partner.bank'].create({
'acc_number': 'FR7630001007941234567890185',
'partner_id': self.env.ref('base.main_partner').id,
'company_id': self.env.ref('base.main_company').id,
'bank_id': self.env.ref('base.res_bank_1').id,
})
self.env['account.journal'].create({
'name': 'FR7630001007941234567890185',
'code': 'BNK13',
'type': 'bank',
'bank_account_id': bank_iban_ofx.id,
})
def test_wrong_ofx_file_import(self):
ofx_file_path = get_module_resource(
'account_bank_statement_import_ofx',
'tests/test_ofx_file/', 'test_ofx_wrong.ofx')
ofx_file_wrong = base64.b64encode(open(ofx_file_path, 'rb').read())
bank_statement = self.absi_model.create(
dict(data_file=ofx_file_wrong))
self.assertFalse(bank_statement._check_ofx(data_file=ofx_file_wrong))
def test_ofx_file_import(self): def test_ofx_file_import(self):
ofx_file_path = get_module_resource( ofx_file_path = get_module_resource(
'account_bank_statement_import_ofx', 'account_bank_statement_import_ofx',
'tests/test_ofx_file/', 'test_ofx.ofx') 'tests/test_ofx_file/', 'test_ofx.ofx')
ofx_file = open(ofx_file_path, 'rb').read().encode('base64')
ofx_file = base64.b64encode(open(ofx_file_path, 'rb').read())
bank_statement = self.absi_model.create( bank_statement = self.absi_model.create(
dict(data_file=ofx_file)) dict(data_file=ofx_file))
bank_statement.import_file() bank_statement.import_file()
bank_st_record = self.abs_model.search( bank_st_record = self.abs_model.search(
[('name', 'like', '123456')])[0] [('name', 'like', '123456')])[0]
self.assertEquals(bank_st_record.balance_start, 2516.56)
self.assertEquals(bank_st_record.balance_end_real, 2156.56)
self.assertEqual(bank_st_record.balance_start, 2516.56)
self.assertEqual(bank_st_record.balance_end_real, 2156.56)
line = self.absl_model.search([ line = self.absl_model.search([
('name', '=', 'Agrolait'), ('name', '=', 'Agrolait'),
('statement_id', '=', bank_st_record.id)])[0] ('statement_id', '=', bank_st_record.id)])[0]
self.assertEquals(line.ref, '219378') self.assertEquals(line.ref, '219378')
self.assertEquals(line.date, '2013-08-24') self.assertEquals(line.date, '2013-08-24')
def test_check_journal_bank_account(self):
ofx_file_path = get_module_resource(
'account_bank_statement_import_ofx',
'tests/test_ofx_file/', 'test_ofx_iban.ofx')
ofx_file = base64.b64encode(open(ofx_file_path, 'rb').read())
bank_st = self.absi_model.create(
dict(data_file=ofx_file))
journal_iban_ofx = self.j_model.search([
('name', '=', 'FR7630001007941234567890185')])
res = bank_st._check_journal_bank_account(journal_iban_ofx,
'12345678901')
self.assertTrue(res)
bank_st.with_context(journal_id=journal_iban_ofx.id).import_file()

101
account_bank_statement_import_ofx/tests/test_ofx_file/test_ofx_iban.ofx

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="ASCII"?>
<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
<OFX>
<SIGNONMSGSRSV1>
<SONRS>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<DTSERVER>20130831165153.000[-8:PST]</DTSERVER>
<LANGUAGE>ENG</LANGUAGE>
</SONRS>
</SIGNONMSGSRSV1>
<BANKMSGSRSV1>
<STMTTRNRS>
<TRNUID>0</TRNUID>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<STMTRS>
<CURDEF>USD</CURDEF>
<BANKACCTFROM>
<BANKID>30001</BANKID>
<BRANCHID>00794</BRANCHID>
<ACCTID>12345678901</ACCTID>
<ACCTTYPE>CHECKING</ACCTTYPE>
</BANKACCTFROM>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-80</TRNAMT>
<FITID>219378</FITID>
<NAME>Agrolait</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-90</TRNAMT>
<FITID>219379</FITID>
<NAME>China Export</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-100</TRNAMT>
<FITID>219380</FITID>
<NAME>Axelor Scuba</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-90</TRNAMT>
<FITID>219381</FITID>
<NAME>China Scuba</NAME>
</STMTTRN>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>2156.56</BALAMT>
<DTASOF>20130831165153</DTASOF>
</LEDGERBAL>
</STMTRS>
</STMTTRNRS>
</BANKMSGSRSV1>
<CREDITCARDMSGSRSV1>
<CCSTMTTRNRS>
<TRNUID>0</TRNUID>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<CCSTMTRS>
<CURDEF>USD</CURDEF>
<CCACCTFROM>
<ACCTID>123412341234</ACCTID>
</CCACCTFROM>
<BANKTRANLIST>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>-562.00</BALAMT>
<DTASOF>20130831165153</DTASOF>
</LEDGERBAL>
</CCSTMTRS>
</CCSTMTTRNRS>
</CREDITCARDMSGSRSV1>
</OFX>

100
account_bank_statement_import_ofx/tests/test_ofx_file/test_ofx_wrong.ofx

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="ASCII"?>
<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
<OFX>
<SIGNONMSGSRSV1>
<SONRS>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<DTSERVER>20130831165153.000[-8:PST]</DTSERVER>
<LANGUAGE>ENG</LANGUAGE>
</SONRS>
</SIGNONMSGSRSV1>
<BANKMSGSRSV1>
<STMTTRNRS>
<TRNUID>0</TRNUID>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<STMTRS>
<!-- <CURDEF>USD</CURDEF>
<BANKACCTFROM>
<BANKID>000000123</BANKID>
<ACCTID>123456</ACCTID>
<ACCTTYPE>CHECKING</ACCTTYPE>
</BANKACCTFROM> -->
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-80</TRNAMT>
<FITID>219378</FITID>
<NAME>Agrolait</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<!-- <DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-90</TRNAMT>
<FITID>219379</FITID> -->
<NAME>China Export</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-100</TRNAMT>
<FITID>219380</FITID>
<NAME>Axelor Scuba</NAME>
</STMTTRN>
</BANKTRANLIST>
<BANKTRANLIST>
<DTSTART>20130801</DTSTART>
<DTEND>20130831165153.000[-8:PST]</DTEND>
<STMTTRN>
<TRNTYPE>POS</TRNTYPE>
<DTPOSTED>20130824080000</DTPOSTED>
<TRNAMT>-90</TRNAMT>
<FITID>219381</FITID>
<NAME>China Scuba</NAME>
</STMTTRN>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>2156.56</BALAMT>
<DTASOF>20130831165153</DTASOF>
</LEDGERBAL>
</STMTRS>
</STMTTRNRS>
</BANKMSGSRSV1>
<CREDITCARDMSGSRSV1>
<CCSTMTTRNRS>
<TRNUID>0</TRNUID>
<STATUS>
<CODE>0</CODE>
<SEVERITY>INFO</SEVERITY>
</STATUS>
<CCSTMTRS>
<CURDEF>USD</CURDEF>
<CCACCTFROM>
<ACCTID>123412341234</ACCTID>
</CCACCTFROM>
<BANKTRANLIST>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>-562.00</BALAMT>
<DTASOF>20130831165153</DTASOF>
</LEDGERBAL>
</CCSTMTRS>
</CCSTMTTRNRS>
</CREDITCARDMSGSRSV1>
</OFX>

1
account_bank_statement_import_ofx/wizard/__init__.py

@ -1,2 +1 @@
# -*- coding: utf-8 -*-
from . import account_bank_statement_import from . import account_bank_statement_import

26
account_bank_statement_import_ofx/wizard/account_bank_statement_import.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
import logging import logging
import StringIO
import io
from odoo import api, models, _ from odoo import api, models, _
from odoo.exceptions import UserError from odoo.exceptions import UserError
from odoo.addons.base_iban.models.res_partner_bank import _map_iban_template
from odoo.addons.base_iban.models.res_partner_bank import validate_iban
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -18,12 +18,28 @@ except ImportError:
class AccountBankStatementImport(models.TransientModel): class AccountBankStatementImport(models.TransientModel):
_inherit = 'account.bank.statement.import' _inherit = 'account.bank.statement.import'
def _check_journal_bank_account(self, journal, account_number):
res = super(
AccountBankStatementImport, self
)._check_journal_bank_account(journal, account_number)
if not res:
e_acc_num = journal.bank_account_id.sanitized_acc_number
e_acc_num = e_acc_num.replace(" ", "")
validate_iban(e_acc_num)
country_code = e_acc_num[:2].lower()
iban_template = _map_iban_template[country_code].replace(
" ", "")
e_acc_num = "".join(
[c for c, t in zip(e_acc_num, iban_template) if t == "C"])
res = (e_acc_num == account_number)
return res
@api.model @api.model
def _check_ofx(self, data_file): def _check_ofx(self, data_file):
if not OfxParser: if not OfxParser:
return False return False
try: try:
ofx = OfxParser.parse(StringIO.StringIO(data_file))
ofx = OfxParser.parse(io.StringIO(data_file.decode('utf-8')))
except Exception as e: except Exception as e:
_logger.debug(e) _logger.debug(e)
return False return False
@ -61,7 +77,7 @@ class AccountBankStatementImport(models.TransientModel):
if vals: if vals:
transactions.append(vals) transactions.append(vals)
total_amt += vals['amount'] total_amt += vals['amount']
except Exception, e:
except Exception as e:
raise UserError(_( raise UserError(_(
"The following problem occurred during import. " "The following problem occurred during import. "
"The file might not be valid.\n\n %s") % e.message) "The file might not be valid.\n\n %s") % e.message)

Loading…
Cancel
Save