From 4dcf3602321d24c56511d845d5e69967499bb0e1 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Wed, 8 Jul 2015 09:12:42 +0000 Subject: [PATCH] Gera linhas de trailler e de recibos. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Gera as últimas linhas do arquivo de declaração. Alguns valores da linha de detalhes de recibo ainda precisam ser implementados. --- declaracao.h | 1 + gera.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/declaracao.h b/declaracao.h index 4dec655..b424763 100644 --- a/declaracao.h +++ b/declaracao.h @@ -40,6 +40,7 @@ struct declaracao { int tipo; char *recibo; char *retifica; + int linhas[100]; /* Número de linhas escritas de cada tipo. */ }; struct declaracao * declaracao_new(int ano); diff --git a/gera.c b/gera.c index 68ebd7e..e17d9dd 100644 --- a/gera.c +++ b/gera.c @@ -22,9 +22,11 @@ #include "rendimento.h" #include #include +#include static void gera_header(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; fprintf(f, "IRPF "); fprintf(f, "%04d", dec->ano); /* Exercício */ fprintf(f, "%04d", dec->ano - 1); /* Ano base */ @@ -139,6 +141,8 @@ static void gera_header(struct declaracao *dec, FILE *f) static void gera_contribuinte(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; + dec->linhas[16]++; fprintf(f, "16"); fprintf(f, "%s", dec->cpf); fprintf(f, "%-60.60s", dec->nome); @@ -186,6 +190,8 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) static void gera_simples(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; + dec->linhas[17]++; fprintf(f, "17"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%013lld", 0); /* TODO: carnê leão */ @@ -220,6 +226,8 @@ static void gera_simples(struct declaracao *dec, FILE *f) static void gera_totais_simples(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; + dec->linhas[18]++; fprintf(f, "18"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%013lld", 0); /* TODO: rendimentos tributáveis */ @@ -282,6 +290,8 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) static void gera_completa(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; + dec->linhas[19]++; fprintf(f, "19"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%-14.14s", ""); /* TODO: CNPJ maior */ @@ -292,6 +302,8 @@ static void gera_completa(struct declaracao *dec, FILE *f) static void gera_totais_completa(struct declaracao *dec, FILE *f) { + dec->linhas[0]++; + dec->linhas[20]++; fprintf(f, "20"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ /* FIXME: completar campos */ @@ -299,12 +311,89 @@ static void gera_totais_completa(struct declaracao *dec, FILE *f) fprintf(f, "\r\n"); } +static void gera_trailler(struct declaracao *dec, FILE *f) +{ + int i; + fprintf(f, "T9"); + fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ + fprintf(f, "%06d", dec->linhas[0]); + for (i = 16; i < 100; i++) + if (i == 44) + fprintf(f, "%-5.5s", "0"); /* FILLER */ + else if (i == 49 || i == 57 || i == 64 || i == 79) + ; + else + fprintf(f, "%05d", dec->linhas[i]); + fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ + fprintf(f, "\r\n"); +} + +static void gera_reciboheader(struct declaracao *dec, FILE *f) +{ + fprintf(f, "HR"); + fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ + fprintf(f, "%-3.3s", ""); /* FILLER */ + fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ + fprintf(f, "\r\n"); +} + +static void gera_recibodetalhe(struct declaracao *dec, FILE *f) +{ + fprintf(f, "DR"); + fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ + fprintf(f, "%-3.3s", ""); /* FILLER */ + fprintf(f, "%s", dec->tipo == COMPLETA ? "S" : "N"); + fprintf(f, "%-60.60s", dec->nome); + fprintf(f, "%-15.15s", dec->contribuinte.tipo_logradouro); + fprintf(f, "%-40.40s", dec->contribuinte.logradouro); + fprintf(f, "%-6.6s", dec->contribuinte.numero); + fprintf(f, "%-21.21s", dec->contribuinte.complemento); + fprintf(f, "%-19.19s", dec->contribuinte.bairro); + fprintf(f, "%-9.9s", dec->contribuinte.cep); + fprintf(f, "%04d", dec->contribuinte.cd_municipio); + fprintf(f, "%-40.40s", dec->contribuinte.municipio); + fprintf(f, "%-2.2s", dec->contribuinte.uf); + fprintf(f, "%-100.100s", ""); /* FILLER */ + fprintf(f, "%-4.4s", ""); /* FILLER */ + fprintf(f, "%-8.8s", ""); /* FILLER */ + fprintf(f, "%-4.4s", dec->contribuinte.ddd); + fprintf(f, "%-9.9s", dec->contribuinte.telefone); + fprintf(f, "%s", dec->retifica ? "S" : "N"); /* Retificadora */ + fprintf(f, "%013lld", dec->totalrendimento); /* Total tributavel */ + fprintf(f, "%013lld", 0); /* TODO: Imposto devido */ + fprintf(f, "%013lld", 0); /* TODO: Imposto a restituir */ + fprintf(f, "%013lld", 0); /* TODO: Imposto a pagar */ + fprintf(f, "%d", 0); /* TODO: quotas */ + fprintf(f, "%013lld", 0); /* TODO: valor quota */ + fprintf(f, "%03d", 0); /* TODO: numero banco */ + fprintf(f, "%04d", 0); /* TODO: numero agencia */ + fprintf(f, " "); /* FILLER */ + fprintf(f, "%d", 0); /* TODO: debito primeira quota */ + fprintf(f, "%013lld", 0); /* TODO: imposto pago ganho de capital */ + fprintf(f, "%-13.13s", ""); /* TODO: numero conta */ + fprintf(f, "%-2.2s", ""); /* TODO: DV conta */ + fprintf(f, "%013lld", 0); /* TODO: imposto alienacao moeda estrangeira em especie */ + fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ + fprintf(f, "\r\n"); +} + +static void gera_recibotrailler(struct declaracao *dec, FILE *f) +{ + fprintf(f, "R9"); + fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ + fprintf(f, "%-3.3s", ""); /* FILLER */ + fprintf(f, "%-10.10s", "0000000000"); /* FIXME: hash */ + fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ + fprintf(f, "\r\n"); +} + static int gera(struct declaracao *dec, char *filename) { FILE *f; f = fopen(filename, "w"); if (!f) return -errno; + memset(dec->linhas, 0, sizeof(dec->linhas)); gera_header(dec, f); gera_contribuinte(dec, f); if (dec->tipo == COMPLETA) { @@ -314,6 +403,10 @@ static int gera(struct declaracao *dec, char *filename) gera_simples(dec, f); gera_totais_simples(dec, f); } + gera_trailler(dec, f); + gera_reciboheader(dec, f); + gera_recibodetalhe(dec, f); + gera_recibotrailler(dec, f); fclose(f); return 0; } -- 2.20.1