def setUp(self): fTxt = open(self.file_path,'r') self.parser = TxtParser(fTxt);
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')
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')
def setUp(self): fTxt = open(self.file_path, 'r') self.parser = TxtParser(fTxt)
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!")