<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Boa tarde Danilo, tudo bem?</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Também sou uma usuário assidua do Nubank <span id="💜">💜</span> !!  Atualmente estou fazendo os lançamentos manualmente e tenho muito interesse um usar e contribuir com seu código. Que tal colocar no Github?
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Programo em python há 3 anos, acho que vou poder contribuir bastante! <span id="😄">
😄</span><br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Att,<br>
</div>
<div id="Signature">
<div></div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<p style="margin-top:0px; margin-bottom:0px">--<br>
</p>
<p style="margin-top:0px; margin-bottom:0px"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px">Yulli Dias</span><br>
</p>
<p id="geom_inter_1579370087395_98_10" style="margin-top:0px; margin-bottom:0px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px">Graduanda
 em Engenharia de Computação - CEFET-MG</span></span></p>
<p style="margin-top:0px; margin-bottom:0px"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px"><a href="mailto:yulli.dias@hotmail.com" title="mailto:yulli.dias@hotmail.com"><span style="font-family:wf_segoe-ui_normal,"segoe ui","segoe wp",tahoma,arial,sans-serif,serif,emojifont; font-size:11.25pt; color:rgb(0,111,201); background-color:rgba(0,0,0,0)">yulli.dias@hotmail.com</span></a><br>
</span></span></p>
<p id="geom_inter_1579370160447_51_19" style="margin-top:0px; margin-bottom:0px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:15px"><a href="https://www.linkedin.com/in/yullidias/" class="OWAAutoLink"><span style="color:rgb(0,111,201)">LinkedIn</span></a>
  <a href="https://github.com/yullidias" class="OWAAutoLink"><span style="color:rgb(0,111,201)"><span style="color:rgb(0,111,201)">G</span><span style="color:rgb(0,111,201)">i</span><span style="color:rgb(0,111,201)">t</span><span style="color:rgb(0,111,201)">H</span><span style="color:rgb(0,111,201)">u</span><span style="color:rgb(0,111,201)">b</span></span></a><span style="color:rgb(0,111,201)"> 
</span><a href="http://lattes.cnpq.br/4604197134660281" class="OWAAutoLink"><span style="color:rgb(0,111,201)">Lattes
</span></a><br>
</span></span></p>
<p style="margin-top:0px; margin-bottom:0px"></p>
</div>
</div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>De:</b> gnucash-br <gnucash-br-bounces+yulli.dias=hotmail.com@gnucash.org> em nome de gnucash-br-request@gnucash.org <gnucash-br-request@gnucash.org><br>
<b>Enviado:</b> sábado, 22 de fevereiro de 2020 14:00<br>
<b>Para:</b> gnucash-br@gnucash.org <gnucash-br@gnucash.org><br>
<b>Assunto:</b> Digest gnucash-br, volume 122, assunto 3</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">Enviar submissões para a lista de discussão gnucash-br para
<br>
        gnucash-br@gnucash.org<br>
<br>
Para se cadastrar ou descadastrar via WWW, visite o endereço<br>
        <a href="https://lists.gnucash.org/mailman/listinfo/gnucash-br">https://lists.gnucash.org/mailman/listinfo/gnucash-br</a><br>
ou, via email, envie uma mensagem com a palavra 'help' no assunto ou<br>
corpo da mensagem para <br>
        gnucash-br-request@gnucash.org<br>
<br>
Você poderá entrar em contato com a pessoa que gerencia a lista pelo<br>
endereço<br>
        gnucash-br-owner@gnucash.org<br>
<br>
Quando responder, por favor edite sua linha Assunto assim ela será<br>
mais específica que "Re: Contents of gnucash-br digest..."<br>
<br>
<br>
Tópicos de Hoje:<br>
<br>
   1. Exportar CVS da Fatura do Nubank (usando pynubank)<br>
      (Danilo Freitas da Costa)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Sat, 22 Feb 2020 02:02:34 -0300<br>
From: Danilo Freitas da Costa <danfcosta@gmail.com><br>
To: Lista Gnucash-br <gnucash-br@gnucash.org><br>
Subject: [gnucash-br] Exportar CVS da Fatura do Nubank (usando<br>
        pynubank)<br>
Message-ID:<br>
        <CAEvrNQV1pOqrT+1aSMKN8iv85bnEoCCMVU0rMRe-FS4dC-cd_Q@mail.gmail.com><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Pessoal,<br>
<br>
Eu sou um usuário assíduo do Nubank há vários anos, desde o "primeiro lote"<br>
de clientes.<br>
<br>
E nesse tempo todo eu faço sempre um trabalho manual de estruturar os<br>
registros para importar para o GnuCash. Eu faço esse trabalho sacal pelos<br>
seguintes motivos:<br>
<br>
1) A cada fatura a data que aparece em uma compra, nem sempre é a dada do<br>
dia que ela realmente aconteceu. Numa compra a vista, aparece ou a data do<br>
mesmo dia ou do dia seguinte.<br>
2) Quando a compra é parcelada, ele mostra a data em que foi processado<br>
naquele mês. Ou seja olhando para a fatura, você não faz ideia qual foi a<br>
data da compra.<br>
3) Eu sempre formato o descritivo da compra para mostrar a Data +<br>
Descritivo + Parcela. Exemplo: 2020-02-08 - Estabelecimento XPTO (1/3)<br>
<br>
Então resolvi criar um script em python para fazer esse trabalho por mim e<br>
gerar um CSV.<br>
<br>
OBS: Tem muito tempo que não programo (pelo menos a lógica ainda está<br>
fresca). Meu conhecimento em Python tende a ZERO.<br>
<br>
Compartilho com vocês o script abaixo. Para os entendidos de python, favor<br>
não me esculhambar (ver OBS acima).<br>
Fiquem à vontade para incrementar e fazer os devidos tratamentos de erro<br>
(nem me preocupei com isso). Foco no MVP!<br>
Próximos passos, se eu tiver vontade (e saco), gerar OFX.<br>
<br>
# Monta arquivo CSV com extrato de fatura em formato CSV<br>
#<br>
# Cada linha do CSV possui<br>
# DATA = data da fatura, no formato YYYY-MM-DD<br>
# DESCRICAO = <DATA DA COMPRA> - <DESCRICAO> <(X/Y)>, onde:<br>
# <DATA DA COMPRA> = data original em que foi feita a compra<br>
# <DESCRICAO> = descritivo que vem na fatura (transacao)<br>
# <(X/Y)> = se a compra for parcelada, X é a parcela corrente e Y é o total<br>
de parcelas<br>
# Exemplo: 2020-02-08 - Estabelecimento XPTO (1/3)<br>
# VALOR = valor do item na fatura<br>
#<br>
# Exemplo de linha no CSV:<br>
# 2020-03-05;2020-02-08 - Estabelecimento XPTO (1/3);50,00<br>
#<br>
# Forma de uso<br>
# python extrato.py <CPF> <SENHA> <DATA NO FORMATO YYYY-MM-DD><br>
#<br>
# Dependência do pynubank (versao 1.0.1 que dá suporte ao QRCode)<br>
# <a href="https://github.com/andreroggeri/pynubank/tree/1.0.1">https://github.com/andreroggeri/pynubank/tree/1.0.1</a><br>
<br>
from pynubank.nubank import Nubank<br>
<br>
import sys<br>
import locale<br>
locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')<br>
<br>
cpf = sys.argv[1]<br>
pwd = sys.argv[2]<br>
bill_date = sys.argv[3]<br>
output_file_path = 'COLOCAR O CAMINHO DO ARQUIVO CSV AQUI'<br>
<br>
#busca fatura com base em uma data<br>
def get_bill_by_date(bills, date):<br>
for b in bills:<br>
if b['summary']['due_date'] == date:<br>
return b<br>
return None<br>
<br>
#busca transacao com base no id (href)<br>
def get_transaction_by_id(transactions, id):<br>
for t in transactions:<br>
if t['href'] == id:<br>
return t<br>
return None<br>
<br>
#formata a descricao da transacao<br>
def get_formated_description(bill_item, transaction):<br>
description = '{} - {}'.format(transaction['time'][:10], bill_item['title'])<br>
if bi['charges'] > 1:<br>
description = description + ' ({}/{})'.format(bi['index'] + 1, bi['charges'<br>
])<br>
return description<br>
<br>
nu = Nubank()<br>
uuid, qr_code = nu.get_qr_code()<br>
qr_code.print_ascii(invert=True)<br>
input('Após escanear o QRCode pressione enter para continuar')<br>
<br>
# Somente após escanear o QRCode você pode chamar a linha abaixo<br>
nu.authenticate_with_qr_code(cpf, pwd, uuid)<br>
<br>
#recupera as transacoes<br>
nubank_transactions = nu.get_card_statements()<br>
<br>
#recupera as faturas<br>
nubank_bills = nu.get_bills()<br>
<br>
#busca fatura com base em uma data<br>
nubank_bill = get_bill_by_date(nubank_bills, bill_date)<br>
<br>
#recupera os detalhes da fatura<br>
nubank_bill_details = nu.get_bill_details(nubank_bill)<br>
<br>
csv_output = open(output_file_path,'w')<br>
csv_output.write('DATA;DESCRICAO;VALOR')<br>
<br>
for bi in nubank_bill_details['bill']['line_items']:<br>
if 'href' in bi:<br>
t = get_transaction_by_id(nubank_transactions, bi['href'])<br>
row = '\n' + bill_date + ';'<br>
row += get_formated_description(bi, t) + ';'<br>
row += locale.currency(bi['amount'] / 100, grouping=True, symbol=None)<br>
csv_output.write(row)<br>
<br>
csv_output.close()<br>
<br>
Atenciosamente,<br>
<br>
*Danilo Freitas da Costa*<br>
-------------- Próxima Parte ----------<br>
Um anexo em HTML foi limpo...<br>
URL: <<a href="http://lists.gnucash.org/pipermail/gnucash-br/attachments/20200222/286bbb27/attachment-0001.html">http://lists.gnucash.org/pipermail/gnucash-br/attachments/20200222/286bbb27/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Subject: Legenda do Digest<br>
<br>
_______________________________________________<br>
gnucash-br mailing list<br>
gnucash-br@gnucash.org<br>
<a href="https://lists.gnucash.org/mailman/listinfo/gnucash-br">https://lists.gnucash.org/mailman/listinfo/gnucash-br</a><br>
<br>
<br>
------------------------------<br>
<br>
Fim da Digest gnucash-br, volume 122, assunto 3<br>
***********************************************<br>
</div>
</span></font></div>
</body>
</html>