Skip to content
This repository was archived by the owner on Jan 3, 2024. It is now read-only.

Adiciona suporte a Nuconta #14

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[email protected]
YNAB_PASSWORD=ynab_password
YNAB_BUDGET=budget_name_on_ynab
NUBANK_TOKEN=nubank_token
NUBANK_CERT=nubank_cert_encoded_in_base64
NUBANK_CARD_ACCOUNT=Nubank
NUBANK_NUCONTA_ACCOUNT=Nuconta
STARTING_POINT=2021-01-01

4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@ As credenciais são configuradas por variáveis de ambiente. São elas:
- **YNAB_BUDGET**: Nome do seu orçamento
- **NUBANK_TOKEN**: Seu refresh token [gerado pelo pynubank](https://github.com/andreroggeri/pynubank/blob/master/examples/login-refresh-token.md)
- **NUBANK_CERT**: Seu certificado do Nubank [gerado pelo pynubank](https://github.com/andreroggeri/pynubank/blob/master/examples/login-certificate.md) codificado em base64 (Para gerar no linux: `cat caminho/do/cert.p12 | base64`)
- **NUBANK_CARD_ACCOUNT**: Nome da conta do cartão Nubank no YNAB
- **NUBANK_NUCONTA_ACCOUNT**: Nome da conta Nuconta no YNAB
- **STARTING_POINT**: Data que será considerada para importar os dados do Nubank para o nYNAB,
todas as transações anteriores a essa data serão ignoradas. Idealmente essa data deve ser a data da
ultima transação que você cadastrou no nYNAB, isso serve para que o App não duplique as transações que você já importou.

## Contribua

Se você tem alguma idéia para melhorar esse app, abra sua PR e contribua para esse projeto !
Se você tem alguma idéia para melhorar esse app, abra sua PR e contribua para esse projeto !
32 changes: 30 additions & 2 deletions nubank_sync_ynab/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@ def setup_logging(filename):
YNAB_BUDGET = os.getenv('YNAB_BUDGET')
NUBANK_TOKEN = os.getenv('NUBANK_TOKEN')
NUBANK_CERT = os.getenv('NUBANK_CERT')
NUBANK_CARD_ACCOUNT = os.getenv('NUBANK_CARD_ACCOUNT')
NUBANK_NUCONTA_ACCOUNT = os.getenv('NUBANK_NUCONTA_ACCOUNT')
STARTING_POINT = datetime.datetime.strptime(os.getenv('STARTING_POINT'), '%Y-%m-%d').date()

IN_EVENT = ['TransferInEvent', 'TransferOutReversalEvent']

if __name__ == '__main__':
with open('cert.p12', 'wb') as f:
cert_content = base64.b64decode(NUBANK_CERT)
Expand All @@ -38,16 +42,40 @@ def setup_logging(filename):
ynab = YNAB(YNAB_EMAIL, YNAB_PASSWORD, YNAB_BUDGET)
nu = Nubank()
nu.authenticate_with_refresh_token(NUBANK_TOKEN, './cert.p12')

transactions = filter_transactions(nu.get_card_statements(), STARTING_POINT)

print(f'Found {len(transactions)} transactions')
print(f'Found {len(transactions)} card transactions')
for transaction in transactions:
ynab.add_transaction(
payee=transaction['description'],
date=parse_transaction_date(transaction),
value=-int(transaction['amount']) / 100,
id=transaction['id'],
subcategory=transaction['category'].capitalize()
subcategory=transaction['category'].capitalize(),
account=NUBANK_CARD_ACCOUNT
)

account_transactions = filter_transactions(nu.get_account_statements(), STARTING_POINT)

print(f'Found {len(account_transactions)} account transactions')
for transaction in account_transactions:
print(transaction)
payee = transaction['title']
if not transaction.get('__typename') in IN_EVENT:
transaction['amount'] = transaction['amount'] * -1
if 'destinationAccount' in transaction:
payee = transaction['destinationAccount']['name']
else:
if 'originAccount' in transaction:
payee = transaction['originAccount']['name']
ynab.add_transaction(
payee=payee,
date=parse_transaction_date(transaction),
value=transaction['amount'],
id=transaction['id'],
subcategory='',
account=NUBANK_NUCONTA_ACCOUNT
)

ynab.sync()
6 changes: 5 additions & 1 deletion nubank_sync_ynab/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,8 @@ def transaction_filter(transaction):


def parse_transaction_date(transaction) -> datetime.date:
return datetime.datetime.strptime(transaction['time'][:10], "%Y-%m-%d").date()
if 'time' in transaction:
date_key = 'time'
else:
date_key = 'postDate'
return datetime.datetime.strptime(transaction[date_key][:10], "%Y-%m-%d").date()
14 changes: 7 additions & 7 deletions nubank_sync_ynab/ynab.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,15 @@ def __init__(self, email, password, budget, ynab_connection=nYnabConnection, syn
sync=sync
)
self.delta = 0
self.account = self.get_nubank_account()

def get_nubank_account(self):
def get_account(self, account_name):
try:
logging.info('Searching for Nubank account')
return next(acc for acc in self.client.budget.be_accounts if acc.account_name == 'Nubank')
logging.info('Searching for ' + account_name + ' account')
return next(acc for acc in self.client.budget.be_accounts if acc.account_name == account_name)
except StopIteration:
logging.info('Nubank account not found, creating a new one')
logging.info(account_name + ' account not found, creating a new one')
account = Account()
account.account_name = 'Nubank'
account.account_name = account_name
self.client.budget.be_accounts.append(account)
self.delta += 1
return account
Expand Down Expand Up @@ -63,6 +62,7 @@ def add_transaction(self, **kwargs):
logging.info('Adding transaction')
payee = self.get_payee(kwargs['payee'])
subcategory = self.get_subcategory(kwargs['subcategory'])
account = self.get_account(kwargs['account'])

if not self.has_matching_transaction(kwargs['id']):
logging.info('Creating transaction')
Expand All @@ -75,7 +75,7 @@ def add_transaction(self, **kwargs):
transaction.imported_date = datetime.datetime.now().date()
transaction.source = "Imported"
transaction.amount = kwargs['value']
transaction.entities_account_id = self.account.id
transaction.entities_account_id = account.id
self.client.budget.be_transactions.append(transaction)
self.delta += 1

Expand Down