Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save fabiolimace/43f6a48af5d9e034f4f07cf22d551dc7 to your computer and use it in GitHub Desktop.

Select an option

Save fabiolimace/43f6a48af5d9e034f4f07cf22d551dc7 to your computer and use it in GitHub Desktop.
Ferramentas para detectar entradas de fatura e expandir parcelas de cartão de crédito da CAIXA para importação no GnuCash
#!/usr/bin/mawk -f
#
# Transforma um extrato exportado da Caixa no formato TXT para uma arquivo mais simples.
#
# O arquivo exportado eh na verdade um CSV com um ponto e vírgula separando colunas.
#
# O arquivo de saida gerado por este script eh um TSV com data e valor reformatados.
#
# Aceita entradas de extrato neste formato (4 colunas):
#
# "Conta";"Data_Mov";"Nr_Doc";"Historico";"Valor";"Deb_Cred"
# "0146912880007618094030";"20250322";"000000";"REM BASICA";"0.01";"C"
#
# Transforma cada entrada processada em uma lista de entradas neste formato:
#
# Data_Mov Nr_Doc Historico Valor
# 2025-03-22 000000 REM BASICA 0.01
#
# Colunas esperadas na entrada e produzidas na saída:
# 1. A data no formato AAAA-DD-MM;
# 2. O número da transação, que pode estar no formato DDHHMM (dia, hora, minuto);
# 3. A descrição da transação, num formato padronizado pela Caixa;
# 4. O valor da transação, com um ponto separando os centavos, sendo negativo se for débito.
#
# A lista de entradas gerada poderá ser importada para o GnuCash.
#
# Modo de usar:
#
# ./gnucash-caixa-conta-transformar-extrato-txt.awk extrato.txt > extrato.tsv
#
function error(msg) {
print msg; exit 1;
}
function formatar_valor(valor, sinal) {
if (valor !~ padrao_valor || sinal !~ padrao_sinal) error("Valor invalido: " valor " " sinal);
sub(/\./, ",", valor);
return (sinal == "D" ? "-" : "") valor;
}
function formatar_data(data) {
if (data !~ padrao_data) error("Data invalida: " data);
return substr(data, 1, 4) "-" substr(data, 5, 2) "-" substr(data, 7, 2);
}
BEGIN {
FS=";"
OFS="\t"
padrao_sinal="^[CD]$";
padrao_data="^.{8}$";
padrao_valor="^[0-9]+[.][0-9]{2}$";
}
{
gsub("\"", "");
}
$4 ~ /SALDO DIA/ {
next;
}
NF == 6 {
if (NR == 1) {
$1 = $2;
$2 = $3;
$3 = $4;
$4 = $5;
$5 = null;
$6 = null;
print;
next;
}
$1 = formatar_data($2);
$2 = $3;
$3 = $4;
$4 = formatar_valor($5, $6);
$5 = null;
$6 = null;
print;
}
#!/usr/bin/mawk -f
#
# Detecta as colunas das entradas de extrato de cartão de crédito da CAIXA.
#
# Útil para extrair as entradas de extrato das faturas no formato de arquivo PDF, pois ao se copiar e colar as entradas de arquivos PDF, as divisões em colunas se perdem.
#
# No visualizador de PDF do Firefox, as colunas são separadas por espaços. Já no visualizador de PDF do Gnome, as colunas não são separadas por nada.
#
# Aceita linhas neste formato (com espaços simples entre as colunas):
#
# 07/02 AJUSTE CREDITO PARC. LOJISTAA 0,04C
# 25/01 NETFLIX.COM SAO PAULO 44,90D
#
# Ou neste formato (sem espaço nenhum entre as colunas):
#
# 07/02AJUSTE CREDITO PARC. LOJISTAA0,04C
# 25/01NETFLIX.COM SAO PAULO44,90D
#
# Transforma cada entrada processada nisto (4 colunas separadas por tabulação):
#
# 07/02 AJUSTE CREDITO PARC. LOJISTAA 0,04
# 25/01 NETFLIX.COM SAO PAULO 44,90
#
# Colunas esperadas pela entrada:
# 1. A data no formato DD/MM, detectado no início da linha;
# 2. A descrição, sendo um texto qualquer entre as colunas detectadas 1 e 3;
# 3. O valor a ser creditado ou debitado, acompanhado da letra C (crédito) ou D (débito), detectado no final da linha;
#
# NOTA: A especificação acima das colunas esperadas é baseada no texto extraído das faturas de cartão de crédito em formato PDF.
#
# Colunas produzidas pela saída:
# 1. A data no formato DD/MM;
# 2. A descrição, podendo conter o número da parcela no formato XX YY ou XX DE YY;
# 3. O valor a ser creditado, que diminui a dívida com o cartão de crédito;
# 4. O valor a ser debitado, que aumenta a dívida com o cartão de crédito.
#
# NOTA: A especificação acima das colunas produzidas é baseada no texto extraído das faturas de cartão de crédito em formato HTML, visualizadas no site do internet banking da CAIXA.
#
# O nome do local pode ser removido com a ajuda do parametro CIDADES, que é uma lista de nomes de cidades separados por vírgula. O conteúdo padrão do parâmetro é este: BARUERI,CURITIBA,FORTALEZA,FRANCA,MARANGUAPE,OSASCO,RIO DE JANEIRO,SAO PAULO. As localidades que restarem no texto da descrição podem ser excluídas manualmente.
#
# A lista de entradas gerada poderá ser importada para o GnuCash.
#
# Modo de usar:
#
# # usar o script para detectar colunas
# ./gnucash-caixa-visa-detectar-colunas.awk arquivo.txt
#
# # usar o script para detectar colunas em conjunto com o script que expande as parcelas
# ./gnucash-caixa-visa-detectar-colunas.awk arquivo.txt | ./gnucash-caixa-visa-expandir-parcelas.awk
#
# NOTA: este script pressupõe `LANG=pt_BR.UTF-8`.
#
BEGIN {
FS="\t"
OFS="\t"
if (!CIDADES) {
CIDADES="BARUERI,CURITIBA,FORTALEZA,FRANCA,MARANGUAPE,OSASCO,RIO DE JANEIRO,SAO PAULO";
}
}
/^[0-9]{2}\/[0-9]{2}[ ]?/ && /[ ]?([0-9]+\.)?[0-9]+,[0-9]{2}[DC]$/ {
# Acrescentar 3 colunas: Data, Descrição e Crédito.
sub(/^[0-9]{2}\/[0-9]{2}[ ]?/, "&\t");
sub(/[ ]?([0-9]+\.)?[0-9]+,[0-9]{2}[DC]$/, "\t&");
# Mover os débitos para a 4a coluna: Débito.
if ($NF ~ /D$/ ) {
$NF = "\t" $NF;
}
# Remover espacos dos valores.
sub(/[ ]+/, "", $1);
sub(/[ ]+/, "", $NF);
# Remover C e D dos valores.
sub(/[CD]$/, "", $NF);
}
CIDADES {
CIDADES=toupper(CIDADES);
split(CIDADES, cidades, ",");
for (i in cidades) {
# Remove a cidade da descricao
cidades[i] = substr(cidades[i], 1, 12);
posicao = index(toupper($2), cidades[i]);
if (posicao) { $2 = substr($2, 1, posicao-1); };
}
}
{
print $0;
}
END {
}
#!/usr/bin/mawk -f
#
# Expande as parcelas de entradas de extrato de cartão de crédito da CAIXA.
#
# Aceita entradas de extrato neste formato (4 colunas):
#
# 05/11 AMAZON 01 05 52,50
#
# Ou neste formato (4 colunas e com a preposição DE na descrição):
#
# 05/11 AMAZON 01 DE 05 52,50
#
# Transforma cada entrada processada em uma lista de entradas neste formato:
#
# 05/11 05/11/2024 - AMAZON - 5 x 52,50 262,50
# 05/11 05/11/2024 - AMAZON - 01 de 05 52,50
# 05/12 05/11/2024 - AMAZON - 02 de 05 52,50
# 05/01 05/11/2024 - AMAZON - 03 de 05 52,50
# 05/02 05/11/2024 - AMAZON - 04 de 05 52,50
# 05/03 05/11/2024 - AMAZON - 05 de 05 52,50
#
# NOTA: apenas os parcelamentos que estiverem na primeira parcela serao expandidos, para evitar gerar entradas duplicadas no GnuCash.
#
# Colunas esperadas na entrada e produzidas na saída:
# 1. A data no formato DD/MM;
# 2. A descrição, podendo conter o número da parcela no formato XX YY ou XX DE YY;
# 3. O valor a ser creditado, que diminui a dívida com o cartão de crédito;
# 4. O valor a ser debitado, que aumenta a dívida com o cartão de crédito.
#
# NOTA: A especificação acima das colunas esperadas e produzidas é baseada no texto extraído das faturas de cartão de crédito em formato HTML, visualizadas no site do internet banking da CAIXA.
#
# A lista de entradas gerada poderá ser importada para o GnuCash.
#
# Modo de usar:
#
# ./gnucash-caixa-visa-expandir-parcelas.awk arquivo.txt
#
# NOTA: este script pressupõe `LANG=pt_BR.UTF-8`.
#
function completar_data(dia, mes) {
ano = strftime("%Y");
hoje = systime();
data = mktime(ano " " mes " " dia " 00 00 00");
if (data > hoje) {
ano = ano - 1; # a compra foi no ano passado
data = mktime(ano " " mes " " dia " 00 00 00");
}
return strftime("%d/%m/%Y", data);
}
function normalizar_espacos() {
for (i = 1; i <= NF; i++) {
sub(/^[ ]+/,"",$i); # sobrando na esquerda
sub(/[ ]+$/,"",$i); # sobrando na direita
gsub(/[ ]+/," ",$i); # duplicados no meio
}
}
BEGIN {
FS="\t"
OFS="\t"
padrao_data="^[0-9]{2}\/[0-9]{2}$";
padrao_valor="^([0-9]+[.,])?[0-9]+[,.][0-9]{2}$";
padrao_parcelamento="[ ][0-9]{2} (DE )?[0-9]{2}$";
}
{
gsub(/[*]/, " ", $2);
normalizar_espacos();
}
NF == 4 && $1 ~ padrao_data && $2 ~ padrao_parcelamento && $4 ~ padrao_valor {
dia = substr($1, 1, 2);
mes = substr($1, 4, 2);
data = completar_data(dia, mes);
texto = $2;
valor = $4;
parcelamento=substr($2, match($2, padrao_parcelamento));
parcela = substr(parcelamento, 2, 3) + 0;
vezes = substr(parcelamento, length(parcelamento)-2) + 0;
sub(/\./, "", valor); # remover separador de milhar
sub(parcelamento, "", texto); # remover trecho do parcelamento
normalizar_espacos();
if (parcela == 1) {
printf ("\n%02d/%02d\t%s - %s - %d x %0.2f\t%0.2f\t\n", dia, mes, data, texto, vezes, valor, vezes * valor);
for (i = 1; i <= vezes; i++) {
if (i > 1 && dia > 28) dia = 28;
if (i > 1) mes = ((mes + 1) % 12);
if (mes == 0) mes = 12;
printf ("%02d/%02d\t%s - %s - %02d de %02d\t\t%0.2f\n", dia, mes, data, texto, i, vezes, valor);
}
next;
}
}
{
print ""
print $0;
}
END {
}
@fabiolimace
Copy link
Copy Markdown
Author

fabiolimace commented Dec 28, 2024

Teste de gnucash-caixa-visa-detectar-colunas.awk

Conteudo do arquivo.txt:

07/02AJUSTE CREDITO PARC. LOJISTAA0,04C
25/01NETFLIX.COM SAO PAULO44,90D
03/02Amazon Kindle Unltd SAO PAULO19,90D

Detectar as colunas no arquivo.txt usando o script:

./gnucash-caixa-visa-detectar-colunas.awk arquivo.txt

07/02	AJUSTE CREDITO PARC. LOJISTAA	0,04
25/01	NETFLIX.COM 		44,90
03/02	Amazon Kindle Unltd 		19,90

Note que SAO PAULO foi removido da descrição, por ser uma das cidades listadas por padrao no parametro CIDADES.

Teste de gnucash-caixa-visa-expandir-parcelas.awk

Conteudo do arquivo.txt:

05/11 	AMAZON MARKETPL 03 05 		52,50
23/11 	AMAZON MARKETPL 02 09 		50,96
26/11 	AMAZON BR 02 02 		22,45
13/12 	AMAZON DIGITAL BR 		9,90
14/12 	AMAZON DIGITAL BR 		5,02
23/12 	AJUSTE CRED PARC S JUROS 	0,03 	
23/12 	AJUSTE CRED PARC S JUROS 	0,01 	

Expandir as parcelas no arquivo.txt usando o script:

./gnucash-caixa-visa-expandir-parcelas.awk arquivo.txt

05/11	05/11/2024 - AMAZON MARKETPL - 5 x 52,50		262,50
05/11	05/11/2024 - AMAZON MARKETPL - 01 de 05	52,50	
05/12	05/11/2024 - AMAZON MARKETPL - 02 de 05	52,50	
05/01	05/11/2024 - AMAZON MARKETPL - 03 de 05	52,50	
05/02	05/11/2024 - AMAZON MARKETPL - 04 de 05	52,50	
05/03	05/11/2024 - AMAZON MARKETPL - 05 de 05	52,50	

23/11	23/11/2024 - AMAZON MARKETPL - 9 x 50,96		458,64
23/11	23/11/2024 - AMAZON MARKETPL - 01 de 09	50,96	
23/12	23/11/2024 - AMAZON MARKETPL - 02 de 09	50,96	
23/01	23/11/2024 - AMAZON MARKETPL - 03 de 09	50,96	
23/02	23/11/2024 - AMAZON MARKETPL - 04 de 09	50,96	
23/03	23/11/2024 - AMAZON MARKETPL - 05 de 09	50,96	
23/04	23/11/2024 - AMAZON MARKETPL - 06 de 09	50,96	
23/05	23/11/2024 - AMAZON MARKETPL - 07 de 09	50,96	
23/06	23/11/2024 - AMAZON MARKETPL - 08 de 09	50,96	
23/07	23/11/2024 - AMAZON MARKETPL - 09 de 09	50,96	

26/11	26/11/2024 - AMAZON BR - 2 x 22,45		44,90
26/11	26/11/2024 - AMAZON BR - 01 de 02	22,45	
26/12	26/11/2024 - AMAZON BR - 02 de 02	22,45	

13/12	AMAZON DIGITAL BR		9,90

14/12	AMAZON DIGITAL BR		5,02

23/12	AJUSTE CRED PARC S JUROS	0,03	

23/12	AJUSTE CRED PARC S JUROS	0,01	

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment