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