Ejemplo n.º 1
0
    def setUp(self):
        fTxt = open(self.file_path,'r')

        self.parser = TxtParser(fTxt);
Ejemplo n.º 2
0
class Test(unittest.TestCase):
    file_path = os.path.dirname(os.path.abspath(__file__))+"/exemploFaturaCartao.txt";
    parser = ''

    def setUp(self):
        fTxt = open(self.file_path,'r')

        self.parser = TxtParser(fTxt);

    def testParseTransactionLine(self):
        self.parser.dueDate = datetime.datetime(2011,12,25)
        parsedLine = self.parser.parseTransactionLine('11/08    PGTO DEBITO CONTA 3333 000006037  200  211        -1.000,00        0,00')
        self.assertEquals(parsedLine['date'],'20110811')
        self.assertEquals(parsedLine['fitid'],'201108111000.0PGTODEBITOCONTA3333000006037200')
        self.assertEquals(parsedLine['value'],1000.00)
        self.assertEquals(parsedLine['desc'],'PGTO DEBITO CONTA 3333 000006037  200  ')

    def testParseValueFromTransactionLine(self):
        line = '30/07    NETFLIX.COM            SAO PAULO       BR             16,90        0,00'
        value = self.parser.parseValueFromTransactionLine(line)

        self.assertEquals(value, -16.90)

    def testParseValueFromTransactionLine_ConvertingDollarToReal(self):
        line = '25/07    Atlassian              Sydney          AU              0,00       20,00'
        self.parser.exchangeRate = 2 #force exchangeRate
        value = self.parser.parseValueFromTransactionLine(line)

        self.assertEquals(value, -40.00)

    def testParseDateFromTransactionLine_fromSameYear(self):
        line = '25/02    Atlassian              Sydney          AU              0,00       20,00'
        self.parser.dueDate = datetime.datetime(2011,07,25)

        date = self.parser.parseDateFromTransactionLine(line)
        self.assertEquals(date,'20110225')

    def testParseDateFromTransactionLine_guessingYearBefore(self):
        '''
            mesmo mes do vencimento, sugerindo ano anterior
        '''
        line = '25/07    Atlassian              Sydney          AU              0,00       20,00'
        self.parser.dueDate = datetime.datetime(2011,07,25)

        date = self.parser.parseDateFromTransactionLine(line)
        self.assertEquals(date,'20100725')

    def testParse(self):
        self.parser.parse()
        # print self.parser.items
        self.assertEquals(14, len(self.parser.items) )

    def testParse_ConvertingDollarToReal(self):
        self.parser.parse()
        self.assertEquals(-46.86, self.parser.items[1]['value'])

    def testConvert(self):
        fTxt = open(self.file_path,'r')
        fOfx = open(self.file_path+".ofx",'w')

        convert(fTxt,fOfx)

    def testIsDolarLine(self):
        self.assertEquals(self.parser.parseExchangeRateLine('      0,00 -       0,00 +       0,00 =        0,00   X      0.0 =           0,00'),0.0)
        self.assertEquals(self.parser.parseExchangeRateLine('    871,64 -      21,78 +      69,52 =      823,90   X   1.7627 =       1.452,28'),1.7627)
        self.assertEquals(self.parser.parseExchangeRateLine('  1.172,33 -   1.172,33 +   1.039,98 =    1.039,98 -       0,00 =       1.039,98'),0.0)
        self.assertEquals(self.parser.parseExchangeRateLine('    214,17 -     214,79 +     162,00 =      161,38 -       0,00 =         161,3'),0.0)
        self.assertEquals(self.parser.parseExchangeRateLine('11/08/10 TARIFA SOBRE COMPRAS NO EXTERIOR                       0,00        0,44'),0.0)
        self.assertEquals(self.parser.parseExchangeRateLine(''),0.0)


    def testUpdateInstallmentTransactionLine(self):
        obj = {}
        obj['value'] = 20.0
        obj['date'] = '20110504'
        obj['desc'] = 'ASDASDASDASDA PARC 02/04 FARROUPILHA   BR'
        obj['fitid'] = (obj['date'] + str(obj['value']) + obj['desc']).replace(' ','')

        self.parser.dueDate = datetime.datetime(2011,07,25)
        self.parser.updateDateFromInstallmentTransactionLine(obj)
        self.assertEquals(obj['date'], '20110604')

    def testParseInstallmentTransactionLine(self):
        self.parser.dueDate = datetime.datetime(2011,07,25)
        firstInstallmentTx = self.parser.parseTransactionLine('04/05    ASDASDASDASDA PARC 01/04 FARROUPILHA   BR            141,58        0,00')
        self.assertEquals(firstInstallmentTx['date'], '20110504')
        secondInstallmentTx = self.parser.parseTransactionLine('04/05    ASDASDASDASDA PARC 02/04 FARROUPILHA   BR            141,58        0,00')
        self.assertEquals(secondInstallmentTx['date'], '20110604')
Ejemplo n.º 3
0
class Test(unittest.TestCase):
    file_path = os.path.dirname(
        os.path.abspath(__file__)) + "/exemploFaturaCartao.txt"
    parser = ''

    def setUp(self):
        fTxt = open(self.file_path, 'r')
        self.parser = TxtParser(fTxt)

    def testParseTransactionLine(self):
        self.parser.dueDate = datetime.datetime(2011, 12, 25)
        parsedLine = self.parser.parseTransactionLine(
            '26.12.2017PGTO DEBITO CONTA 1111 000009999  200211           -7.647,81        0,00'
        )
        self.assertEquals(parsedLine['date'], '20171226')
        self.assertEquals(parsedLine['fitid'],
                          "84ef3468ad14d0dc8f62ac93d9e69b67")
        self.assertEquals(parsedLine['value'], 7647.81)
        self.assertEquals(parsedLine['desc'],
                          'PGTO DEBITO CONTA 1111 000009999  200211')

    def testParseValueFromTransactionLine(self):
        line = '30.07.2014NETFLIX.COM            SAO PAULO       BR             16,90        0,00'
        value = self.parser.parseValueFromTransactionLine(line)

        self.assertEquals(value, -16.90)

    def testParseValueFromTransactionLine_ConvertingDollarToReal(self):
        line = '25.07.2014Atlassian              Sydney          AU              0,00       20,00'
        self.parser.exchangeRate = 2  # force exchangeRate
        value = self.parser.parseValueFromTransactionLine(line)
        self.assertEquals(value, -40.00)

    def testParseDateFromTransactionLine_fromSameYear(self):
        line = '25.02.2014Atlassian              Sydney          AU              0,00       20,00'
        self.parser.dueDate = datetime.datetime(2014, 2, 25)
        date = self.parser.parseDateFromTransactionLine(line)
        self.assertEquals(date, '20140225')

    # def testParseDateFromTransactionLine_guessingYearBefore(self):
    #     '''
    #         mesmo mes do vencimento, sugerindo ano anterior
    #     '''
    #     line = '25/07    Atlassian              Sydney          AU              0,00       20,00'
    #     self.parser.dueDate = datetime.datetime(2014,7,25)
    #
    #     date = self.parser.parseDateFromTransactionLine(line)
    #     self.assertEquals(date,'20100725')

    def testParse(self):
        self.parser.parse()
        # print self.parser.items
        self.assertEquals(14, len(self.parser.items))

    def testParse_ConvertingDollarToReal(self):
        self.parser.parse()
        self.assertEquals(-46.86, self.parser.items[1]['value'])

    def testConvert(self):
        fTxt = open(self.file_path, 'r')
        fOfx = open(self.file_path + ".ofx", 'w')

        convert(fTxt, fOfx)

    def testIsDolarLine(self):
        self.assertEquals(
            self.parser.parseExchangeRateLine(
                '      0,00 -       0,00 +       0,00 =        0,00   X      0.0 =           0,00'
            ), 0.0)
        self.assertEquals(
            self.parser.parseExchangeRateLine(
                '    871,64 -      21,78 +      69,52 =      823,90   X   1.7627 =       1.452,28'
            ), 1.7627)
        self.assertEquals(
            self.parser.parseExchangeRateLine(
                '  1.172,33 -   1.172,33 +   1.039,98 =    1.039,98 -       0,00 =       1.039,98'
            ), 0.0)
        self.assertEquals(
            self.parser.parseExchangeRateLine(
                '    214,17 -     214,79 +     162,00 =      161,38 -       0,00 =         161,3'
            ), 0.0)
        self.assertEquals(
            self.parser.parseExchangeRateLine(
                '11/08/10 TARIFA SOBRE COMPRAS NO EXTERIOR                       0,00        0,44'
            ), 0.0)
        self.assertEquals(self.parser.parseExchangeRateLine(''), 0.0)

    def testUpdateInstallmentTransactionLine(self):
        obj = {}
        obj['value'] = 20.0
        obj['date'] = '20110504'
        obj['desc'] = 'ASDASDASDASDA PARC 02/04 FARROUPILHA   BR'
        obj['fitid'] = (obj['date'] + str(obj['value']) + obj['desc']).replace(
            ' ', '')

        self.parser.dueDate = datetime.datetime(2011, 7, 25)
        self.parser.updateDateFromInstallmentTransactionLine(obj)
        self.assertEquals(obj['date'], '20110604')

    def testParseInstallmentTransactionLine(self):
        self.parser.dueDate = datetime.datetime(2011, 7, 25)
        firstInstallmentTx = self.parser.parseTransactionLine(
            '04.05.2011ASDASDASDASDA PARC 01/04 FARROUPILHA   BR            141,58        0,00'
        )
        self.assertEquals(firstInstallmentTx['date'], '20110504')
        secondInstallmentTx = self.parser.parseTransactionLine(
            '04.05.2011ASDASDASDASDA PARC 02/04 FARROUPILHA   BR            141,58        0,00'
        )
        self.assertEquals(secondInstallmentTx['date'], '20110604')
Ejemplo n.º 4
0
 def setUp(self):
     fTxt = open(self.file_path, 'r')
     self.parser = TxtParser(fTxt)
Ejemplo n.º 5
0
def convert(fileTxt, fileOfx, closeOfxFile=True):
    """
        fileTxt: python file para o arquivo txt disponibilizado pelo banco do brasil
        fileOfx: python file com o caminho para o ofx que sera gerado
        closeOfxFile: se false nao fecha fileOfx (workaroud a classe para usar StringIO ao inves da classe file do python)

        Em um arquivo OFX temos um banco, que possui contas (neste caso apenas uma) que por sua vez possuem transacoes.
        Os itens retornados pelo parser do txt, representam transacoes de uma conta

        Para cada transacao o parametro FITID eh composto dos hash md5 dos valores %(date)%(value)%(desc) ,
        este item eh preenchido para que o gnucash possa defirnir se o item jah foi importado ou nao
    """
    parser = TxtParser(fileTxt)
    parser.parse()
    items = parser.items
    cardTitle = parser.cardTitle
    cardNumber = parser.cardNumber
    #
    today = datetime.now().strftime('%Y%m%d')
    #
    # output
    out = fileOfx
    out.write(
        """OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NON

<OFX>
    <SIGNONMSGSRSV1>
        <SONRS>
            <STATUS>
                <CODE>0</CODE>
                <SEVERITY>INFO</SEVERITY>
            </STATUS>
            <DTSERVER>%(DTSERVER)s</DTSERVER>
            <LANGUAGE>POR</LANGUAGE>
            <FI>
                <ORG>Banco do Brasil</ORG>
                <FID>1</FID>
            </FI>
        </SONRS>
    </SIGNONMSGSRSV1>
    <BANKMSGSRSV1>
        <STMTTRNRS>
            <TRNUID>1</TRNUID>
            <STATUS>
                <CODE>0</CODE>
                <SEVERITY>INFO</SEVERITY>
            </STATUS>
            <STMTRS>
                <CURDEF>BRL</CURDEF>
                <BANKACCTFROM>
                   <BANKID>%(BANKID)s</BANKID>
                   <ACCTID>%(ACCTID)s</ACCTID>
                   <ACCTTYPE>CHECKING</ACCTTYPE>
                </BANKACCTFROM>
                <BANKTRANLIST>
                    <DTSTART>%(DTSERVER)s</DTSTART>
                    <DTEND>%(DTSERVER)s</DTEND>
        """ % {
            'DTSERVER': today,
            'BANKID': cardTitle.replace(' ', ''),
            'ACCTID': cardNumber
        })
    #
    for item in items:
        out.write("""
                <STMTTRN>
                    <TRNTYPE>OTHER</TRNTYPE>
                    <DTPOSTED>%(date)s</DTPOSTED>
                    <TRNAMT>%(value)s</TRNAMT>
                    <FITID>%(fitid)s</FITID>
                    <MEMO>%(desc)s</MEMO>
                </STMTTRN>""" % item)
    #
    out.write("""
                </BANKTRANLIST>
                <LEDGERBAL>
                    <BALAMT>0</BALAMT>
                    <DTASOF>%s</DTASOF>
                </LEDGERBAL>
            </STMTRS>
        </STMTTRNRS>
    </BANKMSGSRSV1>
</OFX>
        """ % today)
    #
    if closeOfxFile:
        out.close()
    print("Success!")