Não tenho mantido muito controle das minhas contas mas resolvi tentar me organizar.
O Aurélio lançou a nova versão do Moneylog e eu resolvi testar. Estou achando muito interessante.
O esquema de tags é ótimo para ver gastos específicos. Tem busca, expressões regulares, relatórios. O falecido Microsoft Money deve estar com vergonha.
Para facilitar as coisas, escrevi um conversor de extratos da Caixa Econômica e resolvi publicar, pois pode ser útil para mais alguém.
Por simplicidade, a saída vai para o console, então é só direcionar para um arquivo de saída:
python caixalog.py caixa-2009.02-txt > moneylog-2009-02.txt
Vou passar o arquivo para o Aurélio. Se for útil para você, ou se tiver alguma sugestão, deixe um comentário aqui!
Como o WordPress não permite a publicação de arquivos que não sejam de vídeo, imagem ou som, vou colocar o código aqui mesmo. Para usar é preciso colar em um arquivo “caixalog.py” e ter o python instalado.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
caixalog.py
===========
Conversor de extratos em texto da Caixa Econômica para o formato do
moneylog (http://aurelio.net/moneylog).
Autor: Enrico Batista da Luz
Blog: http://ricobl.wordpress.com/
Criado: 2009-08-15
Exemplo de formato de entrada exportado do site da Caixa:
"Conta";"Data_Mov";"Nr_Doc";"Historico";"Valor";"Deb_Cred"
"0000000000000000";"20090105";"000000";"CP MAESTRO";"15.00";"D"
Uso:
python caixalog.py arq1.txt [arq2.txt, arq3.txt] > arq_saida.txt
Exemplos:
# Saída no console
python caixalog.py extrato-2009-fev.txt
# Um arquivo apenas
python caixalog.py extrato-2009-fev.txt > moneylog-2009-fev.txt
# Vários arquivos
python caixalog.py extrato-2009-*.txt > moneylog-2009.txt
* ATENÇÃO:
O segundo e terceiro comandos acima irão substituir os arquivos
de saída, é recomendável fazer um backup dos seus arquivos antes
de rodar o script.
"""
import csv
import os
import sys
# Formato das linhas para o arquivo de saída:
# DATASINALVALORTAGS E DESCRIÇÃO
output_format = '%(Data_Mov)s\t%(Deb_Cred)s%(Valor)s\t%(Historico)s'
# Mapeamento de descrição para tags padrão
tag_map = {
'PAG BLOQTO': 'boleto',
'CP MAESTRO': 'debito',
'CVPREV': 'previd,invest',
'PAG FONE': 'cel,boleto',
'SAQ LOTER': 'saque,lot',
'CAIXA24H': 'saque,atm',
'TRX CT INV': 'invest',
'CP PREPAGO': 'cel,recarga',
'SAQ CARTAO': 'saque,caixa',
}
def add_tags(desc):
"""
Adiciona tags à descrição se houver um mapeamento.
"""
tags = tag_map.get(desc, None)
if tags:
return '%s | %s' % (tags, desc)
return desc
def format_date(d):
"""
Converte a data no formato yyyymmdd para yyyy-mm-dd.
"""
return '-'.join((d[:4], d[4:6], d[6:]))
def process_file(file_path):
"""
Processa um extrato da Caixa e converte para o formato do Moneylog.
"""
# Verifica se o arquivo existe
if not os.path.isfile(file_path):
raise SystemExit('Arquivo %s não encontrado!' % file_path)
# Abre o arquivo para leitura e cria o leitor de CSV
input = open(input_file, 'rb')
reader = csv.reader(input, delimiter=';')
# Lê a primeira linha com os nomes das colunas
headers = reader.next()
# Processa cada linha, criando um dicionário dos valores
# de acordo com as nomes das colunas
for row in reader:
# Cria o dicionário
data = dict(zip(headers, row))
# Formata a data
data['Data_Mov'] = format_date(data['Data_Mov'])
# Ajusta o sinal (vazio para crédito ou '-' para débito)
data['Deb_Cred'] = (data['Deb_Cred'] == 'D') and '-' or ''
# Troca pontos por vírgulas no valor
data['Valor'] = data['Valor'].replace('.', ',')
# Adiciona tags ao histórico
data['Historico'] = add_tags(data['Historico'])
# Imprime a linha formatada
print output_format % data
# Fecha o arquivo de entrada
input.close()
if __name__ == '__main__':
# Captura os parâmetros da linha de comando.
# O primeiro é o próprio script, os seguintes
# são os arquivos a serem processados.
input_files = sys.argv[1:]
# Verifica se algum arquivo foi passado
if len(input_files) < 1:
raise SystemExit('Parâmetros inválidos')
# Processa cada arquivo
for input_file in input_files:
process_file(input_file)