X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fgera.c;h=2f7ada34321623530a17b0005bc2c5fd3c11197c;hb=4962c64926ade1426d44eb182ba28e361ff17ff9;hp=583dda5e9a53984f5a96f13697fdc1da82bd78f6;hpb=25f8b7cc2a2898456eed4d45e7125272b376a8be;p=cascardo%2Fdeclara.git diff --git a/lib/gera.c b/lib/gera.c index 583dda5..2f7ada3 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -49,6 +49,8 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, "2700"); /* Código */ else if (dec->ano == 2018) fprintf(f, "2800"); /* Código */ + else if (dec->ano == 2019) + fprintf(f, "2900"); /* Código */ fprintf(f, "%s", dec->retifica ? "1" : "0"); /* Retificadora */ fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, " "); /* Filler */ @@ -60,7 +62,9 @@ static void gera_header(struct declaracao *dec, FILE *f) else if (dec->ano == 2017) fprintf(f, "110"); /* Versão IRPF */ else if (dec->ano == 2018) - fprintf(f, "100"); /* Versão IRPF */ + fprintf(f, "160"); /* Versão IRPF */ + else if (dec->ano == 2019) + fprintf(f, "150"); /* Versão IRPF */ fprintf(f, "%-60.60s", dec->nome); fprintf(f, "%-2.2s", dec->contribuinte.uf ?: ""); fprintf(f, "%s", "0000000000"); /* FIXME: hash */ @@ -556,10 +560,13 @@ static void gera_isentos(struct declaracao *dec, FILE *f) static void gera_isentos2(struct declaracao *dec, FILE *f, int codigo, char *nome) { + long long total = totais_get(dec, nome); + if (total == 0) + return; fprintf(f, "23"); fprintf(f, "%-11.11s", dec->cpf); fprintf(f, "%04d", codigo); - fprintf(f, "%013lld", totais_get(dec, nome)); /* TODO: retistuição imposto anos anteriores */ + fprintf(f, "%013lld", total); } static void gera_23_poupanca(struct declaracao *dec, FILE *f) @@ -590,10 +597,13 @@ static void gera_exclusivos(struct declaracao *dec, FILE *f) static void gera_exclusivos2(struct declaracao *dec, FILE *f, int codigo, char *nome) { + long long total = totais_get(dec, nome); + if (total == 0) + return; fprintf(f, "24"); fprintf(f, "%-11.11s", dec->cpf); fprintf(f, "%04d", codigo); - fprintf(f, "%013lld", totais_get(dec, nome)); /* TODO: retistuição imposto anos anteriores */ + fprintf(f, "%013lld", total); /* TODO: retistuição imposto anos anteriores */ } static void gera_24_decimoterceiro(struct declaracao *dec, FILE *f) @@ -627,13 +637,19 @@ static void gera_conjuge(struct declaracao *dec, FILE *f) static int is_trailler_filler(int ano, int i) { - if (ano >= 2018) { + if (ano == 2018) { return i == 29 || i == 31 || i == 33 || i == 36 || i == 37 || i == 44 || i == 82; } - return i == 44; +#if 0 + if (ano == 2019) { + return i == 57 || (i >= 76 && i <= 79); + } +#endif + return (ano <= 2018 && i == 44); /* Ano 2016, linha 29 é um FILLER, mas preenchida com múltiplos * 0s. Como esta linha não é gerada na declaração de 2016, não * deve constar aqui, e será contabilizada como 0. */ + /* O mesmo vale para as linhas de 2019 comentadas acima. */ /* || (ano == 2016 && i == 29); */ } @@ -644,8 +660,10 @@ static int is_trailler_spaces(int ano, int i) static int is_trailler_empty(int ano, int i) { - return (i == 57 || i == 64 || i == 79) || - (ano == 2015 && i == 49); + return + (ano == 2015 && i == 49) || + (ano <= 2018 && + (i == 57 || i == 64 || i == 79)); } static void gera_trailler(struct declaracao *dec, FILE *f) @@ -694,8 +712,12 @@ static void gera_recibodetalhe(struct declaracao *dec, FILE *f) 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 ?: ""); + if (dec->ano >= 2018) { + fprintf(f, "%-13.13s", ""); + } else { + 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", totais_get(dec, "RENDTRIB")); /* Total tributavel */ fprintf(f, "%013lld", dec->devido); /* Imposto devido */ @@ -787,7 +809,7 @@ static void gera_isento2(struct declaracao *dec, FILE *f, int codigo, int subcodigo, int codigoreal) { struct isento *i; - i = isento_get(dec, codigo, dec->linhas[codigo]); + i = dec->ctx; fprintf(f, "%02d", codigoreal); fprintf(f, "%-11.11s", dec->cpf); /* Titular */ /* Titular (T), Dependente (D), Alimentando (A), FIXME Alimentando */ @@ -822,8 +844,7 @@ static void gera_plr(struct declaracao *dec, FILE *f) static void gera_plr2(struct declaracao *dec, FILE *f) { - gera_isento2(dec, f, 96, 11, 88); - dec->linhas[96]++; + gera_isento2(dec, f, 11, 11, 88); } static void gera_outrosisentos(struct declaracao *dec, FILE *f) @@ -843,8 +864,7 @@ static void gera_poupanca(struct declaracao *dec, FILE *f) static void gera_poupanca2(struct declaracao *dec, FILE *f) { - gera_isento2(dec, f, 98, 12, 84); - dec->linhas[98]++; + gera_isento2(dec, f, 12, 12, 84); } static void gera_aplicacoes(struct declaracao *dec, FILE *f) @@ -854,8 +874,7 @@ static void gera_aplicacoes(struct declaracao *dec, FILE *f) static void gera_aplicacoes2(struct declaracao *dec, FILE *f) { - gera_isento2(dec, f, 99, 6, 88); - dec->linhas[99]++; + gera_isento2(dec, f, 6, 6, 88); } static void gera_dependente(struct declaracao *dec, FILE *f) @@ -905,16 +924,29 @@ static void gera_bem(struct declaracao *dec, FILE *f) fprintf(f, "%04d", b->cd_municipio); fprintf(f, "%-40.40s", b->municipio ?: ""); /* FIXME: Registro de imóveis, Nao (0), Sim (1), Vazio (2) */ - fprintf(f, "%d", b->registro ? 1 : 0); + fprintf(f, "%d", b->registro ? 1 : 2); fprintf(f, "%-40.40s", b->matricula ?: ""); fprintf(f, "%-40.40s", b->registro ?: ""); fprintf(f, "%011lld", b->area); /* FIXME: Area, M2 (0), Ha (1), Vazio (2) */ - fprintf(f, "%d", 0); + fprintf(f, "%d", (b->area == 0) ? 2 : 0); fprintf(f, "%-60.60s", b->cartorio ?: ""); /* Número de chave */ fprintf(f, "%05d", dec->linhas[27] + 1); + + /* Mudanças 2018 */ + if (dec->ano >= 2018) { + fprintf(f, "%-8.8s", "00000000"); /* TODO: Data de aquisição */ + fprintf(f, "%-20.20s", ""); /* TODO: IPTU */ + fprintf(f, "%-8.8s", "00000000"); /* TODO: NIRF */ + fprintf(f, "%-30.30s", ""); /* TODO: RENAVAN */ + fprintf(f, "%-30.30s", ""); /* TODO: Registro aviação civil */ + fprintf(f, "%-30.30s", ""); /* TODO: Registro Capitania dos Portos */ + fprintf(f, "%04d", 0); /* TODO: Agência bancária */ + fprintf(f, "%-15.15s", ""); /* TODO: Conta bancária e dígito verificador */ + fprintf(f, "%-14.14s", ""); /* TODO: CPF ou CNPJ */ + } } static void gera_carne(struct declaracao *dec, FILE *f) @@ -972,8 +1004,12 @@ static int wrap(gera_linha fn, struct declaracao *dec, struct list *l) return -errno; } fn(dec, m); - dec->linhas[0]++; fflush(m); + if (bsize == 0) { + fclose(m); + return 0; + } + dec->linhas[0]++; /* Calcula CRC32 para campo de controle dos registros. */ c = crc32(c, buf, bsize); @@ -1087,6 +1123,7 @@ static int gera(struct declaracao *dec, char *filename) isento = isento_get(dec, codigo, i); \ if (!isento) \ break; \ + dec->ctx = isento; \ W(fn); \ } if (dec->ano <= 2017) { @@ -1097,12 +1134,12 @@ static int gera(struct declaracao *dec, char *filename) IW(gera_poupanca, 98); IW(gera_aplicacoes, 99); } else { - IW(gera_poupanca2, 98); - dec->linhas[98] = 0; - IW(gera_aplicacoes2, 99); - dec->linhas[99] = 0; - IW(gera_plr2, 96); - dec->linhas[96] = 0; + IW(gera_poupanca2, 12); + //dec->linhas[12] = 0; + IW(gera_aplicacoes2, 6); + //dec->linhas[99] = 0; + IW(gera_plr2, 11); + //dec->linhas[96] = 0; } W(gera_trailler);