X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fgera.c;h=a07319d6917ae4500e1473c613c49d93f7b61dd7;hb=a99b09340e6b9c46268dfe2685d6997dd751212e;hp=75fbbcc4371f38cf2688ecf85d508640026421c1;hpb=745c85642649db5b92e26cde382c25df116f2f85;p=cascardo%2Fdeclara.git diff --git a/lib/gera.c b/lib/gera.c index 75fbbcc..a07319d 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -47,6 +47,8 @@ static void gera_header(struct declaracao *dec, FILE *f) 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 */ fprintf(f, "%s", dec->retifica ? "1" : "0"); /* Retificadora */ fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, " "); /* Filler */ @@ -57,6 +59,8 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, "110"); /* Versão IRPF */ else if (dec->ano == 2017) fprintf(f, "110"); /* Versão IRPF */ + else if (dec->ano == 2018) + fprintf(f, "100"); /* Versão IRPF */ fprintf(f, "%-60.60s", dec->nome); fprintf(f, "%-2.2s", dec->contribuinte.uf ?: ""); fprintf(f, "%s", "0000000000"); /* FIXME: hash */ @@ -133,7 +137,7 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, "%-11.11s", ""); /* CPF inventariante */ fprintf(f, "%-40.40s", dec->contribuinte.municipio); fprintf(f, "%-60.60s", dec->nome); - if (dec->ano == 2017) + if (dec->ano >= 2017) fprintf(f, "%010u ", crc32(0, dec->cpf, 11)); /* hash CPF */ else fprintf(f, "%-11.11s", ""); /* CPF empregada, FILLER */ @@ -229,8 +233,12 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) /* CPF do cônjuge */ fprintf(f, "%-11.11s", dec->conjuge.cpf ?: ""); } - fprintf(f, "%-4.4s", dec->contribuinte.ddd ?: ""); - fprintf(f, "%-9.9s", dec->contribuinte.telefone ?: ""); + if (dec->ano <= 2017) { + fprintf(f, "%-4.4s", dec->contribuinte.ddd ?: ""); + fprintf(f, "%-9.9s", dec->contribuinte.telefone ?: ""); + } else { + fprintf(f, "%-13.13s", ""); /* FILLER */ + } fprintf(f, "%-8.8s", dec->contribuinte.dn); fprintf(f, "%-13.13s", dec->contribuinte.titulo_eleitor ?: ""); fprintf(f, "%03d", dec->contribuinte.ocupacao_principal); @@ -260,6 +268,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) { + fprintf(f, "%-2.2s%-9.9s", dec->contribuinte.ddd ?: "", dec->contribuinte.telefone ?: ""); + } } static void gera_simples(struct declaracao *dec, FILE *f) @@ -368,6 +379,9 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto ganho líquido renda variável */ fprintf(f, "%013lld", 0); /* TODO: imposto devido ganho capital moeda estrangeira */ fprintf(f, "%013lld", 0); /* TODO: imposto pago exterior */ + if (dec->ano >= 2018) { + fprintf(f, "%05lld", dec->aliquota_efetiva); + } } static void gera_completa(struct declaracao *dec, FILE *f) @@ -493,6 +507,9 @@ static void gera_totais_completa(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto devido ganho capital */ fprintf(f, "%013lld", 0); /* TODO: imposto ganho líquido renda variável */ fprintf(f, "%013lld", 0); /* TODO: imposto devido ganho capital moeda estrangeira */ + if (dec->ano >= 2018) { + fprintf(f, "%05lld", dec->aliquota_efetiva); + } } static void gera_isentos(struct declaracao *dec, FILE *f) @@ -537,6 +554,19 @@ static void gera_isentos(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: retistuição imposto anos anteriores */ } +static void gera_isentos2(struct declaracao *dec, FILE *f, int codigo, char *nome) +{ + 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 */ +} + +static void gera_23_poupanca(struct declaracao *dec, FILE *f) +{ + gera_isentos2(dec, f, 12, "POUPANCA"); +} + static void gera_exclusivos(struct declaracao *dec, FILE *f) { fprintf(f, "24"); @@ -558,6 +588,29 @@ static void gera_exclusivos(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", totais_get(dec, "PLR")); } +static void gera_exclusivos2(struct declaracao *dec, FILE *f, int codigo, char *nome) +{ + 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 */ +} + +static void gera_24_decimoterceiro(struct declaracao *dec, FILE *f) +{ + gera_exclusivos2(dec, f, 1, "DECIMOTERCEIRO"); +} + +static void gera_24_aplicacoes(struct declaracao *dec, FILE *f) +{ + gera_exclusivos2(dec, f, 6, "APLICACOES"); +} + +static void gera_24_plr(struct declaracao *dec, FILE *f) +{ + gera_exclusivos2(dec, f, 11, "PLR"); +} + static void gera_conjuge(struct declaracao *dec, FILE *f) { fprintf(f, "29"); @@ -574,6 +627,9 @@ static void gera_conjuge(struct declaracao *dec, FILE *f) static int is_trailler_filler(int ano, int i) { + if (ano >= 2018) { + return i == 29 || i == 31 || i == 33 || i == 36 || i == 37 || i == 44 || i == 82; + } return 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 @@ -581,6 +637,11 @@ static int is_trailler_filler(int ano, int i) /* || (ano == 2016 && i == 29); */ } +static int is_trailler_spaces(int ano, int i) +{ + return (ano == 2018 && i > 92); +} + static int is_trailler_empty(int ano, int i) { return (i == 57 || i == 64 || i == 79) || @@ -596,8 +657,12 @@ static void gera_trailler(struct declaracao *dec, FILE *f) for (i = 16; i < 100; i++) { if (is_trailler_filler(dec->ano, i)) fprintf(f, "%-5.5s", "0"); /* FILLER */ + else if (is_trailler_spaces(dec->ano, i)) + fprintf(f, "%-5.5s", ""); else if (is_trailler_empty(dec->ano, i)) ; + else if (dec->ano == 2018 && i == 92) + fprintf(f, "%-5s", "0"); else fprintf(f, "%05d", dec->linhas[i]); } @@ -646,6 +711,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) { + fprintf(f, "%-2.2s%-9.9s", dec->contribuinte.ddd ?: "", dec->contribuinte.telefone ?: ""); + } } static void gera_recibotrailler(struct declaracao *dec, FILE *f) @@ -715,6 +783,28 @@ static void gera_isento(struct declaracao *dec, FILE *f, int codigo) } } +static void gera_isento2(struct declaracao *dec, FILE *f, int codigo, + int subcodigo, int codigoreal) +{ + struct isento *i; + i = dec->ctx; + fprintf(f, "%02d", codigoreal); + fprintf(f, "%-11.11s", dec->cpf); /* Titular */ + /* Titular (T), Dependente (D), Alimentando (A), FIXME Alimentando */ + fprintf(f, "%c", i->dependente ? 'D' : 'T'); + if (i->dependente) { + struct dependente *d; + d = list_get(dec->dependentes, i->dependente - 1); + fprintf(f, "%-11.11s", d ? d->cpf : ""); + } else { + fprintf(f, "%-11.11s", dec->cpf); + } + fprintf(f, "%04d", subcodigo); + fprintf(f, "%-14.14s", i->cnpj); + fprintf(f, "%-60.60s", i->nome); + fprintf(f, "%013lld", i->valor); +} + static void gera_doacao(struct declaracao *dec, FILE *f) { gera_isento(dec, f, 82); @@ -730,6 +820,12 @@ static void gera_plr(struct declaracao *dec, FILE *f) gera_isento(dec, f, 96); } +static void gera_plr2(struct declaracao *dec, FILE *f) +{ + gera_isento2(dec, f, 96, 11, 88); + dec->linhas[96]++; +} + static void gera_outrosisentos(struct declaracao *dec, FILE *f) { struct isento *i; @@ -745,11 +841,23 @@ static void gera_poupanca(struct declaracao *dec, FILE *f) gera_isento(dec, f, 98); } +static void gera_poupanca2(struct declaracao *dec, FILE *f) +{ + gera_isento2(dec, f, 98, 12, 84); + dec->linhas[98]++; +} + static void gera_aplicacoes(struct declaracao *dec, FILE *f) { gera_isento(dec, f, 99); } +static void gera_aplicacoes2(struct declaracao *dec, FILE *f) +{ + gera_isento2(dec, f, 99, 6, 88); + dec->linhas[99]++; +} + static void gera_dependente(struct declaracao *dec, FILE *f) { struct dependente *d; @@ -797,16 +905,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) @@ -947,10 +1068,17 @@ static int gera(struct declaracao *dec, char *filename) W(gera_carne); } - if (totais_get(dec, "ISENTOS")) - W(gera_isentos); - if (totais_get(dec, "EXCLUSIVOS")) - W(gera_exclusivos); + if (dec->ano <= 2017) { + if (totais_get(dec, "ISENTOS")) + W(gera_isentos); + if (totais_get(dec, "EXCLUSIVOS")) + W(gera_exclusivos); + } else { + W(gera_23_poupanca); + W(gera_24_decimoterceiro); + W(gera_24_aplicacoes); + W(gera_24_plr); + } for (i = 0; (dependente = list_get(dec->dependentes, i)); i++) { W(gera_dependente); @@ -972,14 +1100,24 @@ static int gera(struct declaracao *dec, char *filename) isento = isento_get(dec, codigo, i); \ if (!isento) \ break; \ + dec->ctx = isento; \ W(fn); \ } - IW(gera_doacao, 82); - IW(gera_indenizacoes, 93); - IW(gera_plr, 96); - IW(gera_outrosisentos, 97); - IW(gera_poupanca, 98); - IW(gera_aplicacoes, 99); + if (dec->ano <= 2017) { + IW(gera_doacao, 82); + IW(gera_indenizacoes, 93); + IW(gera_plr, 96); + IW(gera_outrosisentos, 97); + 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; + } W(gera_trailler); W(gera_reciboheader);