X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fdeclara.git;a=blobdiff_plain;f=lib%2Fgera.c;h=2628aa7ff1f4154e5b29c2c2906adcd5560585ae;hp=5bc60758d5027f6203b90c2ba6d6fd04784924ae;hb=0e0f6f1266e18e02328daa805cf9e7be377ac664;hpb=982bc1996e2c3cf9e29ad7b75901c69e27db4769 diff --git a/lib/gera.c b/lib/gera.c index 5bc6075..2628aa7 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -33,6 +33,7 @@ #include "totais.h" #include "sistema.h" #include "ano.h" +#include "attr.h" static void gera_header(struct declaracao *dec, FILE *f) { @@ -41,26 +42,31 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, "IRPF "); fprintf(f, "%04d", dec->ano); /* Exercício */ fprintf(f, "%04d", dec->ano - 1); /* Ano base */ - if (dec->ano == 2015) - fprintf(f, "2500"); /* Código */ - else if (dec->ano == 2016) - fprintf(f, "2600"); /* Código */ - else if (dec->ano == 2017) - fprintf(f, "2700"); /* Código */ - else if (dec->ano == 2018) - fprintf(f, "2800"); /* Código */ + + /* Código Receitanet */ + fprintf(f, "%04d", (dec->ano - 1990) * 100); + fprintf(f, "%s", dec->retifica ? "1" : "0"); /* Retificadora */ fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, " "); /* Filler */ fprintf(f, "1"); /* Tipo NI: Pessoa Física (1) */ + + /* Versão IRPF */ if (dec->ano == 2015) - fprintf(f, "130"); /* Versão IRPF */ + fprintf(f, "130"); else if (dec->ano == 2016) - fprintf(f, "110"); /* Versão IRPF */ + fprintf(f, "110"); else if (dec->ano == 2017) - fprintf(f, "110"); /* Versão IRPF */ + fprintf(f, "130"); else if (dec->ano == 2018) - fprintf(f, "100"); /* Versão IRPF */ + fprintf(f, "160"); + else if (dec->ano == 2019) + fprintf(f, "150"); + else if (dec->ano == 2020) + fprintf(f, "180"); + else if (dec->ano == 2021) + fprintf(f, "120"); + fprintf(f, "%-60.60s", dec->nome); fprintf(f, "%-2.2s", dec->contribuinte.uf ?: ""); fprintf(f, "%s", "0000000000"); /* FIXME: hash */ @@ -107,11 +113,12 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, " "); /* RRA4 */ fprintf(f, "%-11.11s", ""); /* CPF RRA4 */ fprintf(f, "0000000000000"); /* TODO: Doacao ECA */ + fprintf(f, "0000000000000"); /* TODO: Doacao Idoso */ fprintf(f, "%-14.14s", rendimento_cnpj_ordenado(dec, 0)); /* CNPJ maior */ fprintf(f, "%-14.14s", rendimento_cnpj_ordenado(dec, 1)); /* CNPJ maior 2 */ fprintf(f, "%-14.14s", rendimento_cnpj_ordenado(dec, 2)); /* CNPJ maior 3 */ fprintf(f, "%-14.14s", rendimento_cnpj_ordenado(dec, 3)); /* CNPJ maior 4 */ - if (dec->ano < 2017) { + if (dec->ano < 2017 || dec->ano >= 2019) { /* CPF e DN de dependentes 1 a 6 */ for (i = 1; i <= 6; i++) { struct dependente *dependente = list_get(dec->dependentes, i - 1); @@ -203,6 +210,9 @@ static void gera_header(struct declaracao *dec, FILE *f) /* Fim das mudanças de 2016 */ + if (dec->ano >= 2020) + fprintf(f, "%-13.13s", dec->contribuinte.titulo_eleitor ?: ""); + fprintf(f, " "); /* Teste PGD, FILLER2 */ } @@ -236,6 +246,9 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) if (dec->ano <= 2017) { fprintf(f, "%-4.4s", dec->contribuinte.ddd ?: ""); fprintf(f, "%-9.9s", dec->contribuinte.telefone ?: ""); + } else if (dec->ano >= 2020) { + fprintf(f, "%-4.4s", dec->contribuinte.ddd ?: ""); + fprintf(f, "%-9.9s", ""); } else { fprintf(f, "%-13.13s", ""); /* FILLER */ } @@ -268,7 +281,9 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) fprintf(f, "%-11.11s", dec->contribuinte.celular ?: ""); /* celular */ fprintf(f, "%s", dec->conjuge.cpf ? "S" : "N"); } - if (dec->ano >= 2018) { + if (dec->ano >= 2020) { + fprintf(f, "%-11.11s", dec->contribuinte.telefone ?: ""); + } else if (dec->ano >= 2018) { fprintf(f, "%-2.2s%-9.9s", dec->contribuinte.ddd ?: "", dec->contribuinte.telefone ?: ""); } } @@ -570,6 +585,16 @@ static void gera_23_poupanca(struct declaracao *dec, FILE *f) gera_isentos2(dec, f, 12, "POUPANCA"); } +static void gera_23_lucrome(struct declaracao *dec, FILE *f) +{ + gera_isentos2(dec, f, 13, "LUCROME"); +} + +static void gera_23_outrosisentos(struct declaracao *dec, FILE *f) +{ + gera_isentos2(dec, f, 26, "OUTROSISENTOS"); +} + static void gera_exclusivos(struct declaracao *dec, FILE *f) { fprintf(f, "24"); @@ -593,10 +618,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) @@ -630,13 +658,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); */ } @@ -647,8 +681,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) @@ -697,8 +733,15 @@ 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 >= 2020) { + fprintf(f, "%-4.4s", dec->contribuinte.ddd ?: ""); + fprintf(f, "%-9.9s", ""); + } else 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 */ @@ -714,7 +757,9 @@ static void gera_recibodetalhe(struct declaracao *dec, FILE *f) fprintf(f, "%-13.13s", dec->contacorrente ? : ""); /* numero conta */ fprintf(f, "%-2.2s", dec->dvconta ? : ""); /* DV conta */ fprintf(f, "%013lld", 0); /* TODO: imposto alienacao moeda estrangeira em especie */ - if (dec->ano >= 2018) { + if (dec->ano >= 2020) { + fprintf(f, "%-11.11s", dec->contribuinte.telefone ?: ""); + } else if (dec->ano >= 2018) { fprintf(f, "%-2.2s%-9.9s", dec->contribuinte.ddd ?: "", dec->contribuinte.telefone ?: ""); } } @@ -825,8 +870,12 @@ 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_lucrome2(struct declaracao *dec, FILE *f) +{ + gera_isento2(dec, f, 13, 13, 84); } static void gera_outrosisentos(struct declaracao *dec, FILE *f) @@ -839,6 +888,14 @@ static void gera_outrosisentos(struct declaracao *dec, FILE *f) fprintf(f, "%-60.60s", i->descricao); } +static void gera_outrosisentos2(struct declaracao *dec, FILE *f) +{ + struct isento *i; + i = dec->ctx; + gera_isento2(dec, f, 26, 26, 86); + fprintf(f, "%-60.60s", i->descricao); +} + static void gera_poupanca(struct declaracao *dec, FILE *f) { gera_isento(dec, f, 98); @@ -846,8 +903,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) @@ -857,8 +913,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) @@ -899,22 +954,22 @@ static void gera_bem(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", b->valor); /* Imóvel */ - fprintf(f, "%-40.40s", b->logradouro ?: ""); - fprintf(f, "%-6.6s", b->numero ?: ""); - fprintf(f, "%-40.40s", b->complemento ?: ""); - fprintf(f, "%-40.40s", b->bairro ?: ""); - fprintf(f, "%-9.9s", b->cep ?: ""); - fprintf(f, "%-2.2s", b->uf ?: ""); - fprintf(f, "%04d", b->cd_municipio); - fprintf(f, "%-40.40s", b->municipio ?: ""); + attr_out(f, b->attr, "logradouro", 40); + attr_out(f, b->attr, "numero", 6); + attr_out(f, b->attr, "complemento", 40); + attr_out(f, b->attr, "bairro", 40); + attr_out(f, b->attr, "cep", 9); + attr_out(f, b->attr, "uf", 2); + attr_out_int(f, b->attr, "cd_municipio", 4); + attr_out(f, b->attr, "municipio", 40); /* FIXME: Registro de imóveis, Nao (0), Sim (1), Vazio (2) */ - fprintf(f, "%d", b->registro ? 1 : 2); - fprintf(f, "%-40.40s", b->matricula ?: ""); - fprintf(f, "%-40.40s", b->registro ?: ""); - fprintf(f, "%011lld", b->area); + fprintf(f, "%d", attr_get(b->attr, "registro") ? 1 : 2); + attr_out(f, b->attr, "matricula", 40); + attr_out(f, b->attr, "registro", 40); + attr_out_int(f, b->attr, "area", 11); /* FIXME: Area, M2 (0), Ha (1), Vazio (2) */ - fprintf(f, "%d", (b->area == 0) ? 2 : 0); - fprintf(f, "%-60.60s", b->cartorio ?: ""); + fprintf(f, "%d", attr_get(b->attr, "area") ? 0 : 2); + attr_out(f, b->attr, "cartorio", 60); /* Número de chave */ fprintf(f, "%05d", dec->linhas[27] + 1); @@ -922,14 +977,29 @@ static void gera_bem(struct declaracao *dec, FILE *f) /* 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, "%-20.20s", ""); /* TODO: IPTU, 2019, filler */ 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 */ + attr_out(f, b->attr, "cnpj", 14); + } + + if (dec->ano >= 2019) { + attr_out(f, b->attr, "iptu", 30); + } + if (dec->ano >= 2020) { + attr_out_int(f, b->attr, "banco", 3); + fprintf(f, "%c", b->dependente ? 'D' : 'T'); + if (b->dependente) { + struct dependente *d; + d = list_get(dec->dependentes, b->dependente - 1); + fprintf(f, "%-11.11s", d ? d->cpf : ""); + } else { + fprintf(f, "%-11.11s", dec->cpf); + } } } @@ -1082,6 +1152,8 @@ static int gera(struct declaracao *dec, char *filename) W(gera_exclusivos); } else { W(gera_23_poupanca); + W(gera_23_lucrome); + W(gera_23_outrosisentos); W(gera_24_decimoterceiro); W(gera_24_aplicacoes); W(gera_24_plr); @@ -1118,12 +1190,14 @@ 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_lucrome2, 13); + IW(gera_outrosisentos2, 26); + IW(gera_aplicacoes2, 6); + //dec->linhas[99] = 0; + IW(gera_plr2, 11); + //dec->linhas[96] = 0; } W(gera_trailler);