<commit_before># -*- coding: utf-8 -*-

# Copyright(C) 2011       <NAME>
# Copyright(C) 2009-2011  <NAME>
#
# This file is part of weboob.
#
# weboob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.


from urlparse import urlparse
from datetime import date
import re

from weboob.tools.browser import BasePage
from weboob.tools.capabilities.bank.transactions import FrenchTransaction


__all__ = ['AccountHistory']


class Transaction(FrenchTransaction):
    PATTERNS = [(re.compile(u'^CHQ\. (?P<text>.*)'),        FrenchTransaction.TYPE_CHECK),
                (re.compile('^(ACHAT|PAIEMENT) CARTE (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_CARD),
                (re.compile('^(PRLV|TIP) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_ORDER),
                (re.compile('^RETRAIT DAB (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_WITHDRAWAL),
                (re.compile('^VIR( SEPA)? (?P<text>.*)'), FrenchTransaction.TYPE_TRANSFER),
                (re.compile('^AVOIR (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),   FrenchTransaction.TYPE_PAYBACK),
                (re.compile('^REM CHQ (?P<text>.*)'), FrenchTransaction.TYPE_DEPOSIT),
               ]


class AccountHistory(BasePage):

    def on_loaded(self):
        self.operations = []

        for form in self.document.getiterator('form'):
            if form.attrib.get('name', '') == 'marques':
                for tr in form.getiterator('tr'):
                    tds = tr.findall('td')
                    if len(tds) != 6:
                        continue
                    # tds[0]: operation
                    # tds[1]: valeur
                    d = date(*reversed([int(x) for x in tds[1].text.split('/')]))
                    labeldiv = tds[2].find('div')
                    inputid = tds[5].find('input[@type="hidden"]')
                    label = u''
                    label += labeldiv.text
                    if labeldiv.find('a') is not None:
                        label += labeldiv.find('a').text
                    label = label.strip(u' \n\t')

                    category = labeldiv.attrib.get('title', '')
                    useless, sep, category = [part.strip() for part in category.partition(':')]

                    debit = tds[3].text or ""
                    credit = tds[4].text or ""

                    operation = Transaction(inputid.attrib['id'].split('_')[1])
                    operation.parse(date=d, raw=label)
                    operation.set_amount(credit, debit)
                    operation.category = category

                    self.operations.append(operation)

    def get_operations(self):
        return self.operations

    def get_next_url(self):
        items = self.document.getroot().cssselect('ul.menu-lvl-0 li')

        current = False
        for li in reversed(items):
            if li.attrib.get('class', '') == 'active':
                current = True
            elif current:
                a = li.find('a')
                if 'year' in a.attrib.get('href', ''):
                    url = urlparse(self.url)
                    return url.path + a.attrib['href']
                else:
                    return None<commit_msg>Add PEL history support<commit_after># -*- coding: utf-8 -*-

# Copyright(C) 2011       <NAME>
# Copyright(C) 2009-2011  <NAME>
#
# This file is part of weboob.
#
# weboob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.


from urlparse import urlparse
from datetime import date
import re

from weboob.tools.browser import BasePage
from weboob.tools.capabilities.bank.transactions import FrenchTransaction


__all__ = ['AccountHistory']


class Transaction(FrenchTransaction):
    PATTERNS = [(re.compile(u'^CHQ\. (?P<text>.*)'),        FrenchTransaction.TYPE_CHECK),
                (re.compile('^(ACHAT|PAIEMENT) CARTE (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_CARD),
                (re.compile('^(PRLV|TIP) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_ORDER),
                (re.compile('^RETRAIT DAB (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),
                                                            FrenchTransaction.TYPE_WITHDRAWAL),
                (re.compile('^VIR( SEPA)? (?P<text>.*)'), FrenchTransaction.TYPE_TRANSFER),
                (re.compile('^AVOIR (?P<dd>\d{2})(?P<mm>\d{2})(?P<yy>\d{2}) (?P<text>.*)'),   FrenchTransaction.TYPE_PAYBACK),
                (re.compile('^REM CHQ (?P<text>.*)'), FrenchTransaction.TYPE_DEPOSIT),
               ]


class AccountHistory(BasePage):

    def on_loaded(self):
        self.operations = []

        for form in self.document.getiterator('form'):
            if form.attrib.get('name', '') == 'marques':
                for tr in form.getiterator('tr'):
                    tds = tr.findall('td')
                    if len(tds) < 5:
                        continue
                    # tds[0]: operation
                    # tds[1]: valeur
                    d = date(*reversed([int(x) for x in tds[1].text.split('/')]))
                    labeldiv = tds[2].find('div')
                    if len(tds) == 6:
                        inputid = tds[5].find('input[@type="hidden"]')
                        operation = Transaction(inputid.attrib['id'].split('_')[1])
                    else:
                        operation = Transaction(0)
                    label = u''
                    label += labeldiv.text
                    if labeldiv.find('a') is not None:
                        label += labeldiv.find('a').text
                    label = label.strip(u' \n\t')

                    category = labeldiv.attrib.get('title', '')
                    useless, sep, category = [part.strip() for part in category.partition(':')]

                    debit = tds[3].text or ""
                    credit = tds[4].text or ""

                    operation.parse(date=d, raw=label)
                    operation.set_amount(credit, debit)
                    operation.category = category

                    self.operations.append(operation)

    def get_operations(self):
        return self.operations

    def get_next_url(self):
        items = self.document.getroot().cssselect('ul.menu-lvl-0 li')

        current = False
        for li in reversed(items):
            if li.attrib.get('class', '') == 'active':
                current = True
            elif current:
                a = li.find('a')
                if 'year' in a.attrib.get('href', ''):
                    url = urlparse(self.url)
                    return url.path + a.attrib['href']
                else:
                    return None
{'fraction_non_alphanumeric': 0.13611793611793613, 'fraction_numerical': 0.008353808353808353, 'mean_word_length': 1.7318791946308725, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6877785', 'n_tokens_mistral': 2372, 'n_tokens_neox': 2205, 'n_words': 560}