Browse Source
[RFR] Move backported bank import modules from bank-payment
[RFR] Move backported bank import modules from bank-payment
to bank-statement-import repository.pull/142/head
Ronald Portier (Therp BV)
10 years ago
committed by
Nicolas JEUDY
6 changed files with 240 additions and 0 deletions
-
5account_bank_statement_import_ofx/__init__.py
-
26account_bank_statement_import_ofx/__openerp__.py
-
74account_bank_statement_import_ofx/account_bank_statement_import_ofx.py
-
100account_bank_statement_import_ofx/test_ofx_file/test_ofx.ofx
-
5account_bank_statement_import_ofx/tests/__init__.py
-
30account_bank_statement_import_ofx/tests/test_import_bank_statement.py
@ -0,0 +1,5 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
|
||||
|
import account_bank_statement_import_ofx |
||||
|
|
||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
@ -0,0 +1,26 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
{ |
||||
|
'name': 'Import OFX Bank Statement', |
||||
|
'version': '1.0', |
||||
|
'author': 'OpenERP SA', |
||||
|
'depends': ['account_bank_statement_import'], |
||||
|
'demo': [], |
||||
|
'description' : """ |
||||
|
Module to import OFX bank statements. |
||||
|
====================================== |
||||
|
|
||||
|
This module allows you to import the machine readable OFX Files in Odoo: they are parsed and stored in human readable format in |
||||
|
Accounting \ Bank and Cash \ Bank Statements. |
||||
|
|
||||
|
Bank Statements may be generated containing a subset of the OFX information (only those transaction lines that are required for the |
||||
|
creation of the Financial Accounting records). |
||||
|
|
||||
|
Backported from Odoo 9.0 |
||||
|
""", |
||||
|
'data' : [], |
||||
|
'demo': [], |
||||
|
'auto_install': False, |
||||
|
'installable': True, |
||||
|
} |
||||
|
|
||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
@ -0,0 +1,74 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import logging |
||||
|
import base64 |
||||
|
import os |
||||
|
|
||||
|
from openerp.osv import osv |
||||
|
from openerp.tools.translate import _ |
||||
|
|
||||
|
_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." |
||||
|
"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""" |
||||
|
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`.")) |
||||
|
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)) |
||||
|
except: |
||||
|
raise osv.except_osv(_('Import Error!'), _('Please check OFX file format is proper or not.')) |
||||
|
line_ids = [] |
||||
|
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) |
||||
|
vals_line = { |
||||
|
'date': transaction.date, |
||||
|
'name': transaction.payee + ': ' + transaction.memo, |
||||
|
'ref': transaction.id, |
||||
|
'amount': transaction.amount, |
||||
|
'partner_id': partner_id, |
||||
|
'bank_account_id': bank_account_id, |
||||
|
} |
||||
|
total_amt += float(transaction.amount) |
||||
|
line_ids.append((0, 0, 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) |
||||
|
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 |
||||
|
} |
||||
|
vals_bank_statement.update({'line_ids': line_ids}) |
||||
|
os.remove(path) |
||||
|
return [vals_bank_statement] |
||||
|
|
||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
@ -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> |
@ -0,0 +1,5 @@ |
|||||
|
from . import test_import_bank_statement |
||||
|
|
||||
|
checks = [ |
||||
|
test_import_bank_statement |
||||
|
] |
@ -0,0 +1,30 @@ |
|||||
|
from openerp.tests.common import TransactionCase |
||||
|
from openerp.modules.module import get_module_resource |
||||
|
|
||||
|
class TestOfxFile(TransactionCase): |
||||
|
"""Tests for import bank statement ofx file format (account.bank.statement.import) |
||||
|
""" |
||||
|
|
||||
|
def setUp(self): |
||||
|
super(TestOfxFile, self).setUp() |
||||
|
self.statement_import_model = self.registry('account.bank.statement.import') |
||||
|
self.bank_statement_model = self.registry('account.bank.statement') |
||||
|
|
||||
|
def test_ofx_file_import(self): |
||||
|
try: |
||||
|
from ofxparse import OfxParser as ofxparser |
||||
|
except ImportError: |
||||
|
#the Python library isn't installed on the server, the OFX import is unavailable and the test cannot be run |
||||
|
return True |
||||
|
cr, uid = self.cr, self.uid |
||||
|
ofx_file_path = get_module_resource('account_bank_statement_import_ofx', 'test_ofx_file', 'test_ofx.ofx') |
||||
|
ofx_file = open(ofx_file_path, 'rb').read().encode('base64') |
||||
|
bank_statement_id = self.statement_import_model.create(cr, uid, dict( |
||||
|
file_type='ofx', |
||||
|
data_file=ofx_file, |
||||
|
)) |
||||
|
self.statement_import_model.parse_file(cr, uid, [bank_statement_id]) |
||||
|
statement_id = self.bank_statement_model.search(cr, uid, [('name', '=', '000000123')])[0] |
||||
|
bank_st_record = self.bank_statement_model.browse(cr, uid, statement_id) |
||||
|
self.assertEquals(bank_st_record.balance_start, 2156.56) |
||||
|
self.assertEquals(bank_st_record.balance_end_real, 1796.56) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue