cic: correctly get the accounting amount and support coming transactions
This commit is contained in:
parent
1495017546
commit
19ffa9ab59
2 changed files with 65 additions and 7 deletions
|
|
@ -25,8 +25,8 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword
|
||||||
from weboob.capabilities.bank import Transfer, TransferError
|
from weboob.capabilities.bank import Transfer, TransferError
|
||||||
|
|
||||||
from .pages import LoginPage, LoginErrorPage, AccountsPage, UserSpacePage, EmptyPage, \
|
from .pages import LoginPage, LoginErrorPage, AccountsPage, UserSpacePage, EmptyPage, \
|
||||||
OperationsPage, CardPage, NoOperationsPage, InfoPage, TransfertPage, \
|
OperationsPage, CardPage, ComingPage, NoOperationsPage, InfoPage, \
|
||||||
ChangePasswordPage, VerifCodePage
|
TransfertPage, ChangePasswordPage, VerifCodePage
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['CICBrowser']
|
__all__ = ['CICBrowser']
|
||||||
|
|
@ -44,6 +44,7 @@ class CICBrowser(BaseBrowser):
|
||||||
'https://www.cic.fr/.*/fr/banque/situation_financiere.cgi': AccountsPage,
|
'https://www.cic.fr/.*/fr/banque/situation_financiere.cgi': AccountsPage,
|
||||||
'https://www.cic.fr/.*/fr/banque/espace_personnel.aspx': UserSpacePage,
|
'https://www.cic.fr/.*/fr/banque/espace_personnel.aspx': UserSpacePage,
|
||||||
'https://www.cic.fr/.*/fr/banque/mouvements.cgi.*': OperationsPage,
|
'https://www.cic.fr/.*/fr/banque/mouvements.cgi.*': OperationsPage,
|
||||||
|
'https://www.cic.fr/.*/fr/banque/mvts_instance.cgi.*': ComingPage,
|
||||||
'https://www.cic.fr/.*/fr/banque/nr/nr_devbooster.aspx.*': OperationsPage,
|
'https://www.cic.fr/.*/fr/banque/nr/nr_devbooster.aspx.*': OperationsPage,
|
||||||
'https://www.cic.fr/.*/fr/banque/operations_carte\.cgi.*': CardPage,
|
'https://www.cic.fr/.*/fr/banque/operations_carte\.cgi.*': CardPage,
|
||||||
'https://www.cic.fr/.*/fr/banque/CR/arrivee\.asp.*': NoOperationsPage,
|
'https://www.cic.fr/.*/fr/banque/CR/arrivee\.asp.*': NoOperationsPage,
|
||||||
|
|
@ -126,6 +127,11 @@ class CICBrowser(BaseBrowser):
|
||||||
elif last_debit is None:
|
elif last_debit is None:
|
||||||
last_debit = (tr.date - timedelta(days=10)).month
|
last_debit = (tr.date - timedelta(days=10)).month
|
||||||
|
|
||||||
|
coming_link = self.page.get_coming_link()
|
||||||
|
if coming_link is not None:
|
||||||
|
for tr in self.list_operations(coming_link):
|
||||||
|
transactions.append(tr)
|
||||||
|
|
||||||
month = 0
|
month = 0
|
||||||
for card_link in account._card_links:
|
for card_link in account._card_links:
|
||||||
v = urlsplit(card_link)
|
v = urlsplit(card_link)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ from urlparse import urlparse, parse_qs
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from weboob.tools.browser import BasePage, BrowserIncorrectPassword
|
from weboob.tools.browser import BasePage, BrowserIncorrectPassword, BrokenPageError
|
||||||
from weboob.tools.ordereddict import OrderedDict
|
from weboob.tools.ordereddict import OrderedDict
|
||||||
from weboob.capabilities.bank import Account
|
from weboob.capabilities.bank import Account
|
||||||
from weboob.tools.capabilities.bank.transactions import FrenchTransaction
|
from weboob.tools.capabilities.bank.transactions import FrenchTransaction
|
||||||
|
|
@ -106,6 +106,19 @@ class AccountsPage(BasePage):
|
||||||
account._link_id = link
|
account._link_id = link
|
||||||
account._card_links = []
|
account._card_links = []
|
||||||
|
|
||||||
|
# Find accounting amount
|
||||||
|
page = self.browser.get_document(self.browser.openurl(link))
|
||||||
|
coming = self.find_amount(page, u"Opérations à venir")
|
||||||
|
accounting = self.find_amount(page, u"Solde comptable")
|
||||||
|
|
||||||
|
if account is not None and accounting + (coming or Decimal('0')) != balance:
|
||||||
|
self.logger.warning('%s + %s != %s' % (accounting, coming, balance))
|
||||||
|
|
||||||
|
if accounting is not None:
|
||||||
|
balance = accounting
|
||||||
|
|
||||||
|
if coming is not None:
|
||||||
|
account.coming = coming
|
||||||
account.balance = balance
|
account.balance = balance
|
||||||
account.currency = currency
|
account.currency = currency
|
||||||
|
|
||||||
|
|
@ -113,6 +126,14 @@ class AccountsPage(BasePage):
|
||||||
|
|
||||||
return accounts.itervalues()
|
return accounts.itervalues()
|
||||||
|
|
||||||
|
def find_amount(self, page, title):
|
||||||
|
try:
|
||||||
|
td = page.xpath(u'//th[contains(text(), "%s")]/../td' % title)[0]
|
||||||
|
except IndexError:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return Decimal(FrenchTransaction.clean_amount(td.text))
|
||||||
|
|
||||||
|
|
||||||
class Transaction(FrenchTransaction):
|
class Transaction(FrenchTransaction):
|
||||||
PATTERNS = [(re.compile('^VIR(EMENT)? (?P<text>.*)'), FrenchTransaction.TYPE_TRANSFER),
|
PATTERNS = [(re.compile('^VIR(EMENT)? (?P<text>.*)'), FrenchTransaction.TYPE_TRANSFER),
|
||||||
|
|
@ -156,11 +177,14 @@ class OperationsPage(BasePage):
|
||||||
if parts[0].startswith('PAIEMENT CB'):
|
if parts[0].startswith('PAIEMENT CB'):
|
||||||
parts.reverse()
|
parts.reverse()
|
||||||
|
|
||||||
operation.parse(date=tds[0].text,
|
date = tds[0].text
|
||||||
raw=u' '.join(parts))
|
vdate = tds[1].text if len(tds) >= 5 else None
|
||||||
|
raw = u' '.join(parts)
|
||||||
|
|
||||||
credit = u''.join([txt.strip() for txt in tds[-1].itertext()])
|
operation.parse(date=date, vdate=vdate, raw=raw)
|
||||||
debit = u''.join([txt.strip() for txt in tds[-2].itertext()])
|
|
||||||
|
credit = self.parser.tocleanstring(tds[-1])
|
||||||
|
debit = self.parser.tocleanstring(tds[-2])
|
||||||
operation.set_amount(credit, debit)
|
operation.set_amount(credit, debit)
|
||||||
yield operation
|
yield operation
|
||||||
|
|
||||||
|
|
@ -194,6 +218,34 @@ class OperationsPage(BasePage):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def get_coming_link(self):
|
||||||
|
try:
|
||||||
|
a = self.parser.select(self.document, u'//a[contains(text(), "Opérations à venir")]', 1, 'xpath')
|
||||||
|
except BrokenPageError:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return a.attrib['href']
|
||||||
|
|
||||||
|
|
||||||
|
class ComingPage(OperationsPage):
|
||||||
|
def get_history(self):
|
||||||
|
index = 0
|
||||||
|
for tr in self.document.xpath('//table[@class="liste"]/tbody/tr'):
|
||||||
|
tds = tr.findall('td')
|
||||||
|
if len(tds) < 3:
|
||||||
|
continue
|
||||||
|
|
||||||
|
tr = Transaction(index)
|
||||||
|
|
||||||
|
date = self.parser.tocleanstring(tds[0])
|
||||||
|
raw = self.parser.tocleanstring(tds[1])
|
||||||
|
amount = self.parser.tocleanstring(tds[-1])
|
||||||
|
|
||||||
|
tr.parse(date=date, raw=raw)
|
||||||
|
tr.set_amount(amount)
|
||||||
|
tr._is_coming = True
|
||||||
|
yield tr
|
||||||
|
|
||||||
|
|
||||||
class CardPage(OperationsPage):
|
class CardPage(OperationsPage):
|
||||||
def get_history(self):
|
def get_history(self):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue