Browse Source

Porting to V10

pull/137/head
Andrea 7 years ago
committed by Fekete Mihai
parent
commit
e62c669469
  1. 18
      account_bank_statement_import_mt940_base/README.rst
  2. 4
      account_bank_statement_import_mt940_base/__manifest__.py
  3. 81
      account_bank_statement_import_mt940_base/mt940.py

18
account_bank_statement_import_mt940_base/README.rst

@ -1,6 +1,8 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl
:alt: License: AGPL-3
====================
Bank Statement MT940
====================
@ -10,7 +12,7 @@ interpretation of it, this addon alone won't help you much. It is rather
intended to be used by other addons to implement the dialect specific to a
certain bank.
See bank_statement_parse_nl_ing_mt940 for an example on how to use it.
See account_bank_statement_import_mt940_nl_ing for an example on how to use it.
Known issues / Roadmap
======================
@ -20,11 +22,10 @@ Known issues / Roadmap
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/bank-statement-import/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`here <https://github.com/OCA/bank-statement-import/issues/new?body=module:%20account_bank_statement_import%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/bank-statement-import/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Credits
=======
@ -38,6 +39,7 @@ Contributors
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
@ -48,6 +50,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit http://odoo-community.org.
This module should make it easy to migrate bank statement import
modules written for earlies versions of Odoo/OpenERP.
To contribute to this module, please visit https://odoo-community.org.

4
account_bank_statement_import_mt940_base/__manifest__.py

@ -19,7 +19,7 @@
##############################################################################
{
'name': 'MT940 Bank Statements Import',
'version': '8.0.1.1.1',
'version': '10.0.1.0.0',
'license': 'AGPL-3',
'author': 'Odoo Community Association (OCA), Therp BV',
'website': 'https://github.com/OCA/bank-statement-import',
@ -27,5 +27,5 @@
'depends': [
'account_bank_statement_import',
],
'installable': False
'installable': True
}

81
account_bank_statement_import_mt940_base/mt940.py

@ -22,9 +22,6 @@ import re
import logging
from datetime import datetime
from openerp.addons.account_bank_statement_import.parserlib import (
BankStatement)
def str2amount(sign, amount_str):
"""Convert sign (C or D) and amount in string to signed amount (float)."""
@ -68,13 +65,11 @@ def get_counterpart(transaction, subfield):
if not subfield:
return # subfield is empty
if len(subfield) >= 1 and subfield[0]:
transaction.remote_account = subfield[0]
transaction.update({'account_number': subfield[0]})
if len(subfield) >= 2 and subfield[1]:
transaction.remote_bank_bic = subfield[1]
transaction.update({'account_bic': subfield[1]})
if len(subfield) >= 3 and subfield[2]:
transaction.remote_owner = subfield[2]
if len(subfield) >= 4 and subfield[3]:
transaction.remote_owner_city = subfield[3]
transaction.update({'partner_name': subfield[2]})
def handle_common_subfields(transaction, subfields):
@ -83,11 +78,11 @@ def handle_common_subfields(transaction, subfields):
for counterpart_field in ['CNTP', 'BENM', 'ORDP']:
if counterpart_field in subfields:
get_counterpart(transaction, subfields[counterpart_field])
if not transaction.message:
transaction.message = ''
if not transaction.get('name'):
transaction['name'] = ''
# REMI: Remitter information (text entered by other party on trans.):
if 'REMI' in subfields:
transaction.message += (
transaction['name'] += (
subfields['REMI'][2]
# this might look like
# /REMI/USTD//<remittance info>/
@ -101,10 +96,10 @@ def handle_common_subfields(transaction, subfields):
)
# EREF: End-to-end reference
if 'EREF' in subfields:
transaction.message += '/'.join(filter(bool, subfields['EREF']))
transaction['name'] += '/'.join(filter(bool, subfields['EREF']))
# Get transaction reference subfield (might vary):
if transaction.eref in subfields:
transaction.eref = ''.join(subfields[transaction.eref])
if transaction.get('ref') in subfields:
transaction['ref'] = ''.join(subfields[transaction['ref']])
class MT940(object):
@ -131,6 +126,8 @@ class MT940(object):
self.current_statement = None
self.current_transaction = None
self.statements = []
self.currency_code = None
self.account_number = None
def is_mt940(self, line):
"""determine if a line is the header of a statement"""
@ -170,7 +167,7 @@ class MT940(object):
record_line = ''
self.statements.append(self.current_statement)
self.current_statement = None
return self.statements
return self.currency_code, self.account_number, self.statements
def add_record_line(self, line, record_line):
record_line += line
@ -188,7 +185,13 @@ class MT940(object):
"""skip header lines, create current statement"""
for dummy_i in range(self.header_lines):
iterator.next()
self.current_statement = BankStatement()
self.current_statement = {
'name': None,
'date': None,
'balance_start': 0.0,
'balance_end_real': 0.0,
'transactions': []
}
def handle_footer(self, dummy_line, dummy_iterator):
"""add current statement to list, reset state"""
@ -213,7 +216,7 @@ class MT940(object):
def handle_tag_25(self, data):
"""Handle tag 25: local bank account information."""
data = data.replace('EUR', '').replace('.', '').strip()
self.current_statement.local_account = data
self.account_number = data
def handle_tag_28C(self, data):
"""Sequence number within batch - normally only zeroes."""
@ -224,18 +227,21 @@ class MT940(object):
# For the moment only first 60F record
# The alternative would be to split the file and start a new
# statement for each 20: tag encountered.
stmt = self.current_statement
if not stmt.local_currency:
stmt.local_currency = data[7:10]
stmt.start_balance = str2amount(data[0], data[10:])
if not self.currency_code:
self.currency_code = data[7:10]
self.current_statement['balance_start'] = str2amount(
data[0],
data[10:]
)
def handle_tag_61(self, data):
"""get transaction values"""
transaction = self.current_statement.create_transaction()
self.current_transaction = transaction
transaction.execution_date = datetime.strptime(data[:6], '%y%m%d')
transaction.value_date = datetime.strptime(data[:6], '%y%m%d')
# ...and the rest already is highly bank dependent
self.current_statement['transactions'].append({})
self.current_transaction = self.current_statement['transactions'][-1]
self.current_transaction['date'] = datetime.strptime(
data[:6],
'%y%m%d'
)
def handle_tag_62F(self, data):
"""Get ending balance, statement date and id.
@ -251,19 +257,24 @@ class MT940(object):
Depending on the bank, there might be multiple 62F tags in the import
file. The last one counts.
"""
stmt = self.current_statement
stmt.end_balance = str2amount(data[0], data[10:])
stmt.date = datetime.strptime(data[1:7], '%y%m%d')
self.current_statement['balance_end_real'] = str2amount(
data[0],
data[10:]
)
self.current_statement['date'] = datetime.strptime(data[1:7], '%y%m%d')
# Only replace logically empty (only whitespace or zeroes) id's:
# But do replace statement_id's added before (therefore starting
# with local_account), because we need the date on the last 62F
# record.
test_empty_id = re.sub(r'[\s0]', '', stmt.statement_id)
if ((not test_empty_id) or
(stmt.statement_id.startswith(stmt.local_account))):
stmt.statement_id = '%s-%s' % (
stmt.local_account,
stmt.date.strftime('%Y-%m-%d'),
statement_name = self.current_statement['name'] or ''
test_empty_id = re.sub(r'[\s0]', '', statement_name)
is_account_number = statement_name.startswith(self.account_number)
if ((not test_empty_id) or is_account_number):
self.current_statement['name'] = '%s-%s' % (
self.account_number,
self.current_statement['date'].strftime('%Y-%m-%d'),
)
def handle_tag_64(self, data):

Loading…
Cancel
Save