bnporc company module

This commit is contained in:
Baptiste Delpey 2015-07-28 16:22:44 +02:00 committed by Romain Bignon
commit 4477c32e9c
3 changed files with 100 additions and 13 deletions

View file

@ -17,8 +17,11 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from datetime import date, timedelta
from weboob.browser import LoginBrowser, URL, need_login from weboob.browser import LoginBrowser, URL, need_login
from weboob.exceptions import BrowserIncorrectPassword from weboob.capabilities.base import find_object
from weboob.capabilities.bank import AccountNotFound
from .pages import LoginPage, AccountsPage, HistoryPage from .pages import LoginPage, AccountsPage, HistoryPage
@ -31,7 +34,7 @@ class BNPCompany(LoginBrowser):
login = URL('/sommaire/jsp/identification.jsp', LoginPage) login = URL('/sommaire/jsp/identification.jsp', LoginPage)
accounts = URL('/NCCPresentationWeb/e10_soldes/liste_soldes.do', AccountsPage) accounts = URL('/NCCPresentationWeb/e10_soldes/liste_soldes.do', AccountsPage)
history = URL('/NCCPresentationWeb/m04_selectionCompteGroupe/init.do?type=compte&identifiant=', HistoryPage) history = URL('/NCCPresentationWeb/e11_releve_op/listeOperations.do', HistoryPage)
def do_login(self): def do_login(self):
assert isinstance(self.username, basestring) assert isinstance(self.username, basestring)
@ -43,8 +46,6 @@ class BNPCompany(LoginBrowser):
self.page.login(self.username, self.password) self.page.login(self.username, self.password)
if self.login.is_here():
raise BrowserIncorrectPassword()
@need_login @need_login
def get_accounts_list(self): def get_accounts_list(self):
@ -53,15 +54,50 @@ class BNPCompany(LoginBrowser):
@need_login @need_login
def get_account(self, _id): def get_account(self, _id):
pass return find_object(self.get_accounts_list(), id=_id, error=AccountNotFound)
def get_transactions(self, id_account, typeReleve, dateMin, dateMax='null'):
self.open('https://secure1.entreprises.bnpparibas.net/NCCPresentationWeb/e11_releve_op/init.do?e10=true')
params = {}
params['identifiant'] = id_account
params['typeSole'] = 'C'
params['typeReleve'] = typeReleve
params['typeDate'] = 'O'
params['ajax'] = 'true'
params['dateMin'] = dateMin
params['dateMax'] = dateMax
self.history.go(params=params)
return self.page.iter_history()
@need_login @need_login
def iter_history(self, account): def iter_history(self, account):
pass return self.get_transactions(account.id,
'Comptable',
(date.today() - timedelta(days=90)).strftime('%Y%m%d'),
date.today().strftime('%Y%m%d'))
@need_login @need_login
def iter_coming_operations(self, account): def iter_coming_operations(self, account):
pass return self.get_transactions(account.id,
'Previsionnel',
(date.today().strftime('%Y%m%d')))
@need_login
def iter_investment(self, account): def iter_investment(self, account):
raise NotImplementedError() raise NotImplementedError()
@need_login
def get_transfer_accounts(self):
raise NotImplementedError()
@need_login
def transfer(self, account, to, amount, reason):
raise NotImplementedError()
@need_login
def iter_threads(self):
raise NotImplementedError()
@need_login
def get_thread(self, thread):
raise NotImplementedError()

View file

@ -20,11 +20,13 @@
from StringIO import StringIO from StringIO import StringIO
import hashlib import hashlib
from decimal import Decimal from decimal import Decimal
from datetime import datetime
from weboob.capabilities.bank import Account from weboob.capabilities.bank import Account
from weboob.exceptions import BrowserIncorrectPassword
from weboob.tools.capabilities.bank.transactions import FrenchTransaction
from weboob.browser.pages import HTMLPage, JsonPage, LoggedPage from weboob.browser.pages import HTMLPage, JsonPage, LoggedPage
from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError
from weboob.tools.json import json
class BNPVirtKeyboard(MappedVirtKeyboard): class BNPVirtKeyboard(MappedVirtKeyboard):
@ -89,20 +91,71 @@ class LoginPage(HTMLPage):
form['gridpass_hidden_input'] = vk.get_string_code(password) form['gridpass_hidden_input'] = vk.get_string_code(password)
form.submit() form.submit()
def on_load(self):
if self.doc.xpath('//p[contains(text(), "Your identification is wrong.")]'):
raise BrowserIncorrectPassword("Your identification is wrong.")
class AccountsPage(JsonPage, LoggedPage): class AccountsPage(LoggedPage, JsonPage):
FAMILY_TO_TYPE = {
u"Compte chèque": Account.TYPE_CHECKING,
}
def iter_accounts(self): def iter_accounts(self):
for f in self.path('tableauSoldes.listeGroupes'): for f in self.path('tableauSoldes.listeGroupes'):
for g in f: for g in f:
for a in g.get('listeComptes'): for a in g.get('listeComptes'):
yield Account.from_dict({ yield Account.from_dict({
'id': a.get('numeroCompte'), 'id': a.get('numeroCompte'),
'type': self.FAMILY_TO_TYPE.get(a.get('libelleType')) or Account.TYPE_UNKNOWN,
'label': '%s %s' % (a.get('libelleType'), a.get('libelleTitulaire')), 'label': '%s %s' % (a.get('libelleType'), a.get('libelleTitulaire')),
'currency': a.get('deviseTenue'), 'currency': a.get('deviseTenue'),
'balance': Decimal(a.get('soldeComptable')) / 100, 'balance': Decimal(a.get('soldeComptable')) / 100,
'coming': Decimal(a.get('soldePrevisionnel')) / 100, 'coming': Decimal(a.get('soldePrevisionnel')) / 100,
}) })
class HistoryPage(JsonPage, LoggedPage):
pass class HistoryPage(LoggedPage, JsonPage):
CODE_TO_TYPE = {
"AUTOP": FrenchTransaction.TYPE_UNKNOWN, # Autres opérations,
"BOURS": FrenchTransaction.TYPE_BANK, # Bourse / Titres,
"CARTE": FrenchTransaction.TYPE_CARD, # Cartes,
"CHEQU": FrenchTransaction.TYPE_CHECK, # Chèques,
"CREDD": FrenchTransaction.TYPE_UNKNOWN, # Crédits documentaires,
"CREDI": FrenchTransaction.TYPE_UNKNOWN, # Crédits,
"EFFET": FrenchTransaction.TYPE_UNKNOWN, # Effets,
"ESPEC": FrenchTransaction.TYPE_UNKNOWN, # Espèces,
"FACCB": FrenchTransaction.TYPE_UNKNOWN, # Factures / Retraits cartes,
"ICHEQ": FrenchTransaction.TYPE_UNKNOWN, # Impayés chèques,
"IEFFE": FrenchTransaction.TYPE_UNKNOWN, # Impayés et incidents effets,
"IMPAY": FrenchTransaction.TYPE_UNKNOWN, # Impayés et rejets,
"IPRLV": FrenchTransaction.TYPE_UNKNOWN, # Impayés prélèvements, TIP et télérèglements,
"PRLVT": FrenchTransaction.TYPE_UNKNOWN, # Prélèvements, TIP et télérèglements,
"REMCB": FrenchTransaction.TYPE_UNKNOWN, # Remises cartes,
"RJVIR": FrenchTransaction.TYPE_ORDER, # Rejets de virements,
"VIREM": FrenchTransaction.TYPE_ORDER, # Virements,
"VIRIT": FrenchTransaction.TYPE_ORDER, # Virements internationaux,
"VIRSP": FrenchTransaction.TYPE_ORDER, # Virements européens,
"VIRTR": FrenchTransaction.TYPE_ORDER, # Virements de trésorerie,
"VIRXX": FrenchTransaction.TYPE_ORDER, # Autres virements
}
def one(self, path, context=None):
try:
return list(self.path(path, context))[0]
except IndexError:
return None
def iter_history(self):
for op in self.get('mouvementsBDDF'):
codeFamille = self.one('nature.codefamille', op)
tr = FrenchTransaction.from_dict({
'id': op.get('id'),
'type': self.CODE_TO_TYPE.get(codeFamille) or FrenchTransaction.TYPE_UNKNOWN,
'category': self.one('nature.libelle', op),
'raw': ' '.join(op.get('libelle').split()) or op.get('nature')['libelle'],
'date': datetime.fromtimestamp(op.get('dateOperation') / 1000),
'vdate': datetime.fromtimestamp(op.get('dateValeur') / 1000),
'amount': Decimal(self.one('montant.montant', op)) / 100,
})
yield tr

View file

@ -74,8 +74,6 @@ class BNPorcModule(Module, CapBank, CapMessages):
yield account yield account
def get_account(self, _id): def get_account(self, _id):
if not _id.isdigit():
raise AccountNotFound()
account = self.browser.get_account(_id) account = self.browser.get_account(_id)
if account: if account:
return account return account