PEP8 on account_banking_fi_patu

This commit is contained in:
Sandy Carter
2014-08-21 14:02:50 -04:00
parent 024d12454e
commit 2bf58e25bf
4 changed files with 159 additions and 132 deletions

View File

@@ -12,8 +12,8 @@
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@@ -25,6 +25,5 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import patu
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
from . import patu

View File

@@ -11,8 +11,8 @@
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@@ -24,6 +24,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Account Banking PATU module',
'version': '0.62',

View File

@@ -1,7 +1,9 @@
#!/usr/bin/env python
# encoding: utf-8
"""Parser for PATU format files"""
import re, datetime
import re
import datetime
def fixchars(line):
"""Fix the characters mangled in the input
@@ -20,107 +22,120 @@ def fixchars(line):
class PatuParser(object):
"""Parse PATU lines in to structs"""
def __init__( self ):
def __init__(self):
""" Initialize PATU parser """
recparse = dict()
recparse["00"] = "T(?P<recordid>00)(?P<record_len>\d{3})" \
+ "(?P<version>\d{3})(?P<accountnr>\d{14})" \
+ "(?P<statementnr>\d{3})(?P<startdate>\d{6})" \
+ "(?P<enddate>\d{6})" \
+ "(?P<creationdate>\d{6})(?P<creationtime>\d{4})" \
+ "(?P<customerid>.{17})(?P<balancedate>\d{6})" \
+ "(?P<startingbalance>.{19})" \
+ "(?P<itemcount>\d{6})(?P<currency>.{3})" \
+ "(?P<accountname>.{30})"\
+ "(?P<accountlimit>\d{18})(?P<accountowner>.{35})" \
+ "(?P<bankcontact1>.{40})(?P<bankcontact2>.{40})" \
+ "(?P<bankcontact3>.{30})(?P<ibanswift>.{30})"
recparse["10"] = "T(?P<recordid>[18]0)(?P<record_len>\d{3})" \
+ "(?P<eventid>\d{6})" \
+ "(?P<archivalnr>.{18})(?P<recorddate>\d{6})" \
+ "(?P<valuedate>\d{6})" \
+ "(?P<paymentdate>\d{6})(?P<eventtype>\d)" \
+ "(?P<eventcode>.{3})(?P<eventdesc>.{35})" \
+ "(?P<amount>.{19})(?P<receiptcode>.)(?P<creationmethod>.)" \
+ "(?P<recipientname>.{35})(?P<recipientsource>.)" \
+ "(?P<recipientaccount>.{14})(?P<recipientaccountchanged>.)" \
+ "(?P<refnr>.{20})" \
+ "(?P<formnr>.{8})(?P<eventlevel>.)"
recparse["11"] = "T(?P<recordid>[18]1)(?P<record_len>\d{3})" \
+ "(?P<infotype>.{2})" \
+ "(?:(?# Match specific info)" \
+ "(?<=00)(?P<message>.{35})+" \
+ "|" \
+ "(?<=01)(?P<transactioncount>\d{8})" \
+ "|" \
+ "(?<=02)(?P<customerid>.{10})\s(?P<invoicenr>.{15})\s" \
+ "(?P<invoicedate>\d{6})" \
+ "|" \
+ "(?<=03)(?P<cardnumber>.{19})\s(?P<storereference>.{14})" \
+ "|" \
+ "(?<=04)(?P<origarchiveid>.{18})" \
+ "|" \
+ "(?<=05)(?P<destinationamount>.{19})\s(?P<currency>.{3})\s" \
+ "(?P<exchangerate>.{11})(?P<rateref>.{6})" \
+ "|" \
+ "(?<=06)(?P<principalinfo1>.{35})(?P<principalinfo2>.{35})" \
+ "|" \
+ "(?<=07)(?P<bankinfo1>.{35})" \
+ "(?P<bankinfo2>.{35})?" \
+ "(?P<bankinfo3>.{35})?" \
+ "(?P<bankinfo4>.{35})?" \
+ "(?P<bankinfo5>.{35})?" \
+ "(?P<bankinfo6>.{35})?" \
+ "(?P<bankinfo7>.{35})?" \
+ "(?P<bankinfo8>.{35})?" \
+ "(?P<bankinfo9>.{35})?" \
+ "(?P<bankinfo10>.{35})?" \
+ "(?P<bankinfo11>.{35})?" \
+ "(?P<bankinfo12>.{35})?" \
+ "|" \
+ "(?<=08)(?P<paymentcode>\d{3})\s(?P<paymentdesc>.{31})" \
+ "|" \
+ "(?<=09)(?P<recipientname2>.{35})" \
+ "|" \
+ "(?<=11)(?P<reference>.{35})(?P<recipientiban>.{35})" \
+ "(?P<recipientbic>.{35})(?P<recipientnameiban>.{70})" \
+ "(?P<sendername>.{70})(?P<senderid>.{35})" \
+ "(?P<archivalid>.{70})" \
+ ")"
recparse["40"] = "T(?P<recordid>40)(?P<record_len>\d{3})" \
+ "(?P<recorddate>\d{6})(?P<balance>.{19})" \
+ "(?P<availablefunds>.{19})"
recparse["50"] = "T(?P<recordid>50)(?P<record_len>\d{3})" \
+ "(?P<period>\d)(?P<perioddate>\d{6})" \
+ "(?P<depositcount>\d{8})(?P<depositsum>.{19})" \
+ "(?P<withdrawcount>\d{8})(?P<withdrawsum>.{19})"
recparse["60"] = "T(?P<recordid>60)(?P<record_len>\d{3})" \
+ "(?P<bankid>.{3})(?P<specialid>01)" \
+ "(?P<interestperiodstart>\d{6})-" \
+ "(?P<interestperiodend>\d{6})" \
+ "(?P<avgbalanceinfo>.)(?P<avgbalance>.{19})" \
+ "(?P<interestinfo>.)(?P<interestrate>\d{7})" \
+ "(?P<limitbalanceinfo>.)(?P<avglimitbalance>.{19})" \
+ "(?P<limitinterestinfo>.)(?P<limitinterestrate>\d{7})" \
+ "(?P<limitusageinfo>.)(?P<limitusage>\d{7})" \
+ "(?P<permanentbalanceinfo>.)(?P<permanentbalance>.{19})" \
+ "(?P<refinterestinfo>.)(?P<refinterestname>.{35})" \
+ "(?P<refinterestrate>\d{7})" \
+ "(?P<refcreditinfo>.)(?P<refcreditname>.{35})" \
+ "(?P<refcreditrate>\d{7})"
recparse["70"] = "T(?P<recordid>70)(?P<record_len>\d{3})" \
+ "(?P<bankid>\d{3})" \
+ "(?P<infoline1>.{80})" \
+ "(?P<infoline2>.{80})?" \
+ "(?P<infoline3>.{80})?" \
+ "(?P<infoline4>.{80})?" \
+ "(?P<infoline5>.{80})?" \
+ "(?P<infoline6>.{80})?"
recparse["00"] = (
"T(?P<recordid>00)(?P<record_len>\d{3})"
"(?P<version>\d{3})(?P<accountnr>\d{14})"
"(?P<statementnr>\d{3})(?P<startdate>\d{6})"
"(?P<enddate>\d{6})"
"(?P<creationdate>\d{6})(?P<creationtime>\d{4})"
"(?P<customerid>.{17})(?P<balancedate>\d{6})"
"(?P<startingbalance>.{19})"
"(?P<itemcount>\d{6})(?P<currency>.{3})"
"(?P<accountname>.{30})"
"(?P<accountlimit>\d{18})(?P<accountowner>.{35})"
"(?P<bankcontact1>.{40})(?P<bankcontact2>.{40})"
"(?P<bankcontact3>.{30})(?P<ibanswift>.{30})"
)
recparse["10"] = (
"T(?P<recordid>[18]0)(?P<record_len>\d{3})"
"(?P<eventid>\d{6})"
"(?P<archivalnr>.{18})(?P<recorddate>\d{6})"
"(?P<valuedate>\d{6})"
"(?P<paymentdate>\d{6})(?P<eventtype>\d)"
"(?P<eventcode>.{3})(?P<eventdesc>.{35})"
"(?P<amount>.{19})(?P<receiptcode>.)(?P<creationmethod>.)"
"(?P<recipientname>.{35})(?P<recipientsource>.)"
"(?P<recipientaccount>.{14})(?P<recipientaccountchanged>.)"
"(?P<refnr>.{20})"
"(?P<formnr>.{8})(?P<eventlevel>.)"
)
recparse["11"] = (
"T(?P<recordid>[18]1)(?P<record_len>\d{3})"
"(?P<infotype>.{2})"
"(?:(?# Match specific info)"
"(?<=00)(?P<message>.{35})+"
"|"
"(?<=01)(?P<transactioncount>\d{8})"
"|"
"(?<=02)(?P<customerid>.{10})\s(?P<invoicenr>.{15})\s"
"(?P<invoicedate>\d{6})"
"|"
"(?<=03)(?P<cardnumber>.{19})\s(?P<storereference>.{14})"
"|"
"(?<=04)(?P<origarchiveid>.{18})"
"|"
"(?<=05)(?P<destinationamount>.{19})\s(?P<currency>.{3})\s"
"(?P<exchangerate>.{11})(?P<rateref>.{6})"
"|"
"(?<=06)(?P<principalinfo1>.{35})(?P<principalinfo2>.{35})"
"|"
"(?<=07)(?P<bankinfo1>.{35})"
"(?P<bankinfo2>.{35})?"
"(?P<bankinfo3>.{35})?"
"(?P<bankinfo4>.{35})?"
"(?P<bankinfo5>.{35})?"
"(?P<bankinfo6>.{35})?"
"(?P<bankinfo7>.{35})?"
"(?P<bankinfo8>.{35})?"
"(?P<bankinfo9>.{35})?"
"(?P<bankinfo10>.{35})?"
"(?P<bankinfo11>.{35})?"
"(?P<bankinfo12>.{35})?"
"|"
"(?<=08)(?P<paymentcode>\d{3})\s(?P<paymentdesc>.{31})"
"|"
"(?<=09)(?P<recipientname2>.{35})"
"|"
"(?<=11)(?P<reference>.{35})(?P<recipientiban>.{35})"
"(?P<recipientbic>.{35})(?P<recipientnameiban>.{70})"
"(?P<sendername>.{70})(?P<senderid>.{35})"
"(?P<archivalid>.{70})"
")"
)
recparse["40"] = (
"T(?P<recordid>40)(?P<record_len>\d{3})"
"(?P<recorddate>\d{6})(?P<balance>.{19})"
"(?P<availablefunds>.{19})"
)
recparse["50"] = (
"T(?P<recordid>50)(?P<record_len>\d{3})"
"(?P<period>\d)(?P<perioddate>\d{6})"
"(?P<depositcount>\d{8})(?P<depositsum>.{19})"
"(?P<withdrawcount>\d{8})(?P<withdrawsum>.{19})"
)
recparse["60"] = (
"T(?P<recordid>60)(?P<record_len>\d{3})"
"(?P<bankid>.{3})(?P<specialid>01)"
"(?P<interestperiodstart>\d{6})-"
"(?P<interestperiodend>\d{6})"
"(?P<avgbalanceinfo>.)(?P<avgbalance>.{19})"
"(?P<interestinfo>.)(?P<interestrate>\d{7})"
"(?P<limitbalanceinfo>.)(?P<avglimitbalance>.{19})"
"(?P<limitinterestinfo>.)(?P<limitinterestrate>\d{7})"
"(?P<limitusageinfo>.)(?P<limitusage>\d{7})"
"(?P<permanentbalanceinfo>.)(?P<permanentbalance>.{19})"
"(?P<refinterestinfo>.)(?P<refinterestname>.{35})"
"(?P<refinterestrate>\d{7})"
"(?P<refcreditinfo>.)(?P<refcreditname>.{35})"
"(?P<refcreditrate>\d{7})"
)
recparse["70"] = (
"T(?P<recordid>70)(?P<record_len>\d{3})"
"(?P<bankid>\d{3})"
"(?P<infoline1>.{80})"
"(?P<infoline2>.{80})?"
"(?P<infoline3>.{80})?"
"(?P<infoline4>.{80})?"
"(?P<infoline5>.{80})?"
"(?P<infoline6>.{80})?"
)
for record in recparse:
recparse[record] = re.compile(recparse[record])
self.recparse = recparse
def parse_record(self, line):
"""Docstring for parse_perus
@@ -135,7 +150,7 @@ class PatuParser(object):
if matchobj:
break
if not matchobj:
print " **** failed to match line '%s'" % (line)
print(" **** failed to match line '%s'" % (line))
return
# Strip strings
matchdict = matchobj.groupdict()
@@ -146,7 +161,8 @@ class PatuParser(object):
del matchdict[field]
matchkeys = set(matchdict.keys())
needstrip = set(["bankcontact1", "bankcontact2", "bankcontact3",
needstrip = set([
"bankcontact1", "bankcontact2", "bankcontact3",
"customerid", "accountowner", "accountname", "refnr", "formnr",
"recipientname", "eventdesc", "recipientaccount", "message",
"principalinfo1", "bankinfo1", "bankinfo2", "bankinfo3",
@@ -158,30 +174,35 @@ class PatuParser(object):
for field in matchkeys & needstrip:
matchdict[field] = matchdict[field].strip()
# Convert to int
needsint = set(["itemcount", "eventid", "record_len",
needsint = set([
"itemcount", "eventid", "record_len",
"depositcount", "withdrawcount"])
for field in matchkeys & needsint:
matchdict[field] = float(matchdict[field])
# Convert to float
needsfloat = set(["startingbalance", "accountlimit", "amount",
needsfloat = set([
"startingbalance", "accountlimit", "amount",
"destinationamount", "balance", "availablefunds", "depositsum",
"withdrawsum", "avgbalance", "avglimitbalance",
"permanentbalance"])
for field in matchkeys & needsfloat:
matchdict[field] = float(matchdict[field])
# convert sents to euros
needseur = set(["startingbalance", "accountlimit", "amount",
needseur = set([
"startingbalance", "accountlimit", "amount",
"destinationamount", "balance", "availablefunds", "depositsum",
"withdrawsum", "avgbalance", "permanentbalance"])
for field in matchkeys & needseur:
matchdict[field] = matchdict[field] / 100
# convert ibanswift to separate fields
if matchdict.has_key("ibanswift"):
matchdict["iban"], matchdict["swift"] = \
matchdict["ibanswift"].strip().split()
if "ibanswift" in matchdict:
matchdict["iban"], matchdict["swift"] = (
matchdict["ibanswift"].strip().split()
)
# Convert date fields
needdate = set(["startdate", "enddate", "creationdate", "balancedate",
needdate = set([
"startdate", "enddate", "creationdate", "balancedate",
"valuedate", "paymentdate", "recorddate", "perioddate"])
for field in matchkeys & needdate:
# Base all dates on the year 2000, since it's unlikely that this
@@ -191,17 +212,20 @@ class PatuParser(object):
matchdict[field] = None
continue
matchdict[field] = datetime.date(int("20" + datestring[0:2]),
int(datestring[2:4]), int(datestring[4:6]))
matchdict[field] = datetime.date(
int("20" + datestring[0:2]),
int(datestring[2:4]), int(datestring[4:6]))
# convert time fields
needtime = set(["creationtime"])
for field in matchkeys & needtime:
timestring = matchdict[field]
matchdict[field] = datetime.time(int(timestring[0:2]),
int(timestring[2:4]))
matchdict[field] = datetime.time(
int(timestring[0:2]),
int(timestring[2:4]))
return matchdict
def parse_file(filename):
"""Parse file with PATU format inside
@@ -214,6 +238,7 @@ def parse_file(filename):
for line in patufile:
parser.parse_record(line)
def main():
"""The main function, currently just calls a dummy filename
@@ -223,5 +248,3 @@ def main():
if __name__ == '__main__':
main()

View File

@@ -6,8 +6,8 @@
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@@ -30,20 +30,23 @@ from account_banking_fi_patu.parser import PatuParser
__all__ = ['parser']
class transaction(models.mem_bank_transaction):
'''
Implementation of transaction communication class for account_banking.
'''
mapping = {
"remote_account": "recipientaccount",
"remote_currency": "currency",
"transferred_amount": "amount",
"execution_date": "recorddate",
"value_date": "paymentdate",
"transfer_type": "eventtype",
"reference": "refnr",
"eventcode": "eventcode",
"message": "message"}
"remote_account": "recipientaccount",
"remote_currency": "currency",
"transferred_amount": "amount",
"execution_date": "recorddate",
"value_date": "paymentdate",
"transfer_type": "eventtype",
"reference": "refnr",
"eventcode": "eventcode",
"message": "message"
}
def __init__(self, record, *args, **kwargs):
'''
Initialize own dict with read values.
@@ -63,19 +66,19 @@ class transaction(models.mem_bank_transaction):
If eventcode is 730, the transaction was initiated by the bank and
doesn't have a destination account.
'''
if self.eventcode and (self.eventcode == "720" or self.eventcode ==
"710"):
if self.eventcode in ["720", "710"]:
# Withdrawal from and deposit to the account
return (self.execution_date and self.transferred_amount and True) \
or False
or False
if self.eventcode and self.eventcode == "730":
# The transaction is bank initiated, no remote account is present
return (self.execution_date and self.transferred_amount and True) \
or False
or False
return super(transaction, self).is_valid()
class statement(models.mem_bank_statement):
'''
Implementation of bank_statement communication class of account_banking
@@ -110,6 +113,7 @@ class statement(models.mem_bank_statement):
return
self.transactions.append(transaction(record))
class parser(models.parser):
code = 'FIPATU'
name = _('PATU statement sheet')