From 3d6b792c344e6a396eb14d10fb0865cc113cef15 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Tue, 22 May 2012 18:31:25 +0200 Subject: [PATCH] use FrenchTransaction and detect type of transactions --- modules/lcl/pages.py | 58 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/modules/lcl/pages.py b/modules/lcl/pages.py index e892a455..d6d4e2b5 100644 --- a/modules/lcl/pages.py +++ b/modules/lcl/pages.py @@ -17,20 +17,24 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . +import re import base64 -from datetime import date from decimal import Decimal - -from weboob.capabilities.bank import Transaction -from weboob.capabilities.bank import Account -from weboob.tools.browser import BasePage, BrowserUnavailable -from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError from logging import error import tempfile import math import random +from weboob.capabilities.bank import Account +from weboob.tools.browser import BasePage, BrowserUnavailable +from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError +from weboob.tools.capabilities.bank.transactions import FrenchTransaction + + +__all__ = ['SkipPage', 'LoginPage', 'AccountsPage', 'AccountHistoryPage'] + + class LCLVirtKeyboard(MappedVirtKeyboard): symbols={'0': '9da2724133f2221482013151735f033c', '1': '873ab0087447610841ae1332221be37b', @@ -155,10 +159,31 @@ class AccountsPage(BasePage): if '-' in balance: balance='-'+balance.replace('-', '') account.balance=Decimal(balance) + self.logger.debug('%s Type: %s' % (account.label, account._type)) l.append(account) return l +class Transaction(FrenchTransaction): + PATTERNS = [(re.compile('^(?PCB) (?PRETRAIT) DU (?P
\d+)/(?P\d+)'), + FrenchTransaction.TYPE_WITHDRAWAL), + (re.compile('^(?PPRLV) (?P.*)'), + FrenchTransaction.TYPE_ORDER), + (re.compile('^(?PCHQ\.) (?P.*)'), + FrenchTransaction.TYPE_CHECK), + (re.compile('^(?PRELEVE CB) AU (?P
\d+)/(?P\d+)/(?P\d+)'), + FrenchTransaction.TYPE_CARD), + (re.compile('^(?P(PRELEVEMENT|TELEREGLEMENT|TIP)) (?P.*)'), + FrenchTransaction.TYPE_ORDER), + (re.compile('^(?PECHEANCEPRET)(?P.*)'), FrenchTransaction.TYPE_LOAN_PAYMENT), + (re.compile('^(?PVIR(EMEN)?T? ((RECU|FAVEUR) TIERS|SEPA RECU)?)( /FRM)?(?P.*)'), + FrenchTransaction.TYPE_TRANSFER), + (re.compile('^(?PREMBOURST)(?P.*)'), FrenchTransaction.TYPE_PAYBACK), + (re.compile('^(?PCOMMISSIONS)(?P.*)'), FrenchTransaction.TYPE_BANK), + (re.compile('^(?P(?PREMUNERATION).*)'), FrenchTransaction.TYPE_BANK), + (re.compile('^(?PREM CHQ) (?P.*)'), FrenchTransaction.TYPE_DEPOSIT), + ] + class AccountHistoryPage(BasePage): def get_operations(self,account): operations = [] @@ -188,26 +213,33 @@ class AccountHistoryPage(BasePage): if len(tr.findall("th"))!=0 or\ len(tr.findall("td"))<=1: continue - operation=Transaction(len(operations)) mntColumn=0 + + date = None + raw = None + credit = '' + debit = '' for td in tr.iter('td'): value=td.attrib.get('id') if value is None: value=td.attrib.get('class'); if value.startswith("date"): # some transaction are included in a tag - value=u''.join([txt.strip() for txt in td.itertext()]) - operation.date=date(*reversed([int(x) for x in value.split('/')])) + date=u''.join([txt.strip() for txt in td.itertext()]) elif value.startswith("lib") or value.startswith("opLib"): # misclosed A tag requires to grab text from td - operation.raw=u''.join([txt.strip() for txt in td.itertext()]) + raw=u''.join([txt.strip() for txt in td.itertext()]) elif value.startswith("solde") or value.startswith("mnt"): mntColumn+=1 amount=u''.join([txt.strip() for txt in td.itertext()]) if amount != "": - amount = Decimal(amount.replace('.','').replace(',','.').replace(u"\u00A0",'').replace(' ','')) if value.startswith("soldeDeb") or mntColumn==1: - amount=-amount - operation.amount=amount + debit = amount + else: + credit = amount + + operation=Transaction(len(operations)) + operation.parse(date, raw) + operation.set_amount(credit, debit) operations.append(operation) return operations