From bb702cb8172740e88a9c44eb3f734d6412ebcda9 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Thu, 7 May 2015 16:08:05 +0200 Subject: [PATCH] parse transaction labels, and fix account's coming --- modules/bnporc/pp/pages.py | 49 ++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/modules/bnporc/pp/pages.py b/modules/bnporc/pp/pages.py index 6a683c8e..780bb68c 100644 --- a/modules/bnporc/pp/pages.py +++ b/modules/bnporc/pp/pages.py @@ -18,6 +18,7 @@ # along with weboob. If not, see . +import re from cStringIO import StringIO from random import randint from decimal import Decimal @@ -25,7 +26,7 @@ from decimal import Decimal from weboob.browser.pages import JsonPage, LoggedPage from weboob.tools.captcha.virtkeyboard import GridVirtKeyboard from weboob.capabilities.bank import Account -from weboob.tools.capabilities.bank.transactions import FrenchTransaction as Transaction +from weboob.tools.capabilities.bank.transactions import FrenchTransaction from weboob.exceptions import BrowserIncorrectPassword from weboob.tools.json import json from weboob.tools.date import parse_french_date as Date @@ -143,7 +144,7 @@ class AccountsPage(BNPPage): 'currency': a.get('devise'), 'type': self.FAMILY_TO_TYPE.get(f.get('idFamilleCompte')) or Account.TYPE_UNKNOWN, 'balance': a.get('soldeDispo'), - 'coming': a.get('soldeDispo') + a.get('soldeAVenir'), + 'coming': a.get('soldeAVenir'), 'iban': ibans.get(a.get('key')) or a.get('value') }) @@ -153,6 +154,30 @@ class AccountsIBANPage(BNPPage): return dict((a.get('ibanCrypte'), a.get('iban')) for a in self.path('listeRib.*.infoCompte')) +class Transaction(FrenchTransaction): + PATTERNS = [(re.compile(u'^(?PCHEQUE)(?P.*)'), FrenchTransaction.TYPE_CHECK), + (re.compile('^(?PFACTURE CARTE) DU (?P
\d{2})(?P\d{2})(?P\d{2}) (?P.*?)( CA?R?T?E? ?\d*X*\d*)?$'), + FrenchTransaction.TYPE_CARD), + (re.compile('^(?P(PRELEVEMENT|TELEREGLEMENT|TIP)) (?P.*)'), + FrenchTransaction.TYPE_ORDER), + (re.compile('^(?PPRLV( EUROPEEN)? SEPA) (?P.*?)( MDT/.*?)?( ECH/\d+)?( ID .*)?$'), + FrenchTransaction.TYPE_ORDER), + (re.compile('^(?PECHEANCEPRET)(?P.*)'), FrenchTransaction.TYPE_LOAN_PAYMENT), + (re.compile('^(?PRETRAIT DAB) (?P
\d{2})/(?P\d{2})/(?P\d{2})( (?P\d+)H(?P\d+))?( \d+)? (?P.*)'), + FrenchTransaction.TYPE_WITHDRAWAL), + (re.compile('^(?PVIR(EMEN)?T? (RECU |FAVEUR )?(TIERS )?)\w+ \d+/\d+ \d+H\d+ \w+ (?P.*)$'), + FrenchTransaction.TYPE_TRANSFER), + (re.compile('^(?PVIR(EMEN)?T? (EUROPEEN )?(SEPA )?(RECU |FAVEUR |EMIS )?(TIERS )?)(/FRM |/DE |/MOTIF |/BEN )?(?P.*?)(/.+)?$'), + FrenchTransaction.TYPE_TRANSFER), + (re.compile('^(?PREMBOURST) CB DU (?P
\d{2})(?P\d{2})(?P\d{2}) (?P.*)'), + FrenchTransaction.TYPE_PAYBACK), + (re.compile('^(?PREMBOURST)(?P.*)'), FrenchTransaction.TYPE_PAYBACK), + (re.compile('^(?PCOMMISSIONS)(?P.*)'), FrenchTransaction.TYPE_BANK), + (re.compile('^(?P(?PREMUNERATION).*)'), FrenchTransaction.TYPE_BANK), + (re.compile('^(?PREMISE CHEQUES)(?P.*)'), FrenchTransaction.TYPE_DEPOSIT), + ] + + class HistoryPage(BNPPage): CODE_TO_TYPE = { 1: Transaction.TYPE_CHECK, # Chèque émis @@ -189,27 +214,27 @@ class HistoryPage(BNPPage): def iter_history(self): for op in self.get('data.listerOperations.compte.operationPassee') or []: codeFamille = cast(self.one('operationType.codeFamille', op), int) - yield Transaction.from_dict({ + tr = Transaction.from_dict({ 'id': op.get('idOperation'), - 'date': Date(op.get('dateOperation')), - 'rdate': Date(self.one('montant.executionDate', op)), - 'vdate': Date(self.one('montant.valueDate', op)), 'type': self.CODE_TO_TYPE.get(codeFamille) or Transaction.TYPE_UNKNOWN, - 'raw': op.get('libelleOperation'), 'category': op.get('categorie'), 'amount': self.one('montant.montant', op), }) + tr.parse(raw=op.get('libelleOperation'), + date=Date(op.get('dateOperation')), + vdate=Date(self.one('montant.valueDate', op))) + yield tr def iter_coming(self): for op in self.path('data.listerOperations.compte.operationAvenir.*.operation.*'): codeOperation = cast(op.get('codeOperation'), int, 0) - yield Transaction.from_dict({ + tr = Transaction.from_dict({ 'id': op.get('idOperation'), - 'date': Date(op.get('dateOperation')), - 'rdate': Date(op.get('executionDate')), - 'vdate': Date(op.get('valueDate')), 'type': self.COMING_TYPE_TO_TYPE.get(codeOperation) or Transaction.TYPE_UNKNOWN, - 'raw': op.get('libelle'), 'amount': op.get('montant'), 'card': op.get('numeroPorteurCarte'), }) + tr.parse(date=Date(op.get('dateOperation')), + vdate=Date(op.get('valueDate')), + raw=op.get('libelle')) + yield tr