X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fgera.c;h=8a2f5d589e90596abea203e48c0c9f4b7363047c;hb=b3253e1db05b865a52b663d7d457743844508f47;hp=bfd1aa1e861c72a886fe36720562e672247567bc;hpb=fc14d2cc2ffe888bcfebcd44d00ca9f0a25c9e6d;p=cascardo%2Fdeclara.git diff --git a/lib/gera.c b/lib/gera.c index bfd1aa1..8a2f5d5 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -25,6 +25,7 @@ #include "declaracao.h" #include "cmd.h" #include "rendimento.h" +#include "carne.h" #include "isento.h" #include "pagamento.h" #include "bem.h" @@ -46,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 */ @@ -55,6 +58,8 @@ static void gera_header(struct declaracao *dec, FILE *f) else if (dec->ano == 2016) 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 ?: ""); @@ -80,7 +85,8 @@ static void gera_header(struct declaracao *dec, FILE *f) * anterior, se não 1. */ fprintf(f, "%d", dec->retifica ? 0 : (dec->recibo ? 2 : 1)); /* Indicador imposto pago, TODO: carnê leão e Lei 11.033. */ - fprintf(f, "%02d", dec->retido ? 1 : 0); + fprintf(f, "%02d", totais_get(dec, "CARNE") > 0 ? 7 : + (dec->retido ? 1 : 0)); /* Indicador imposto antecipado, TODO: carnê leão, Lei 11.033, * outros. */ fprintf(f, "%d", dec->retido ? 1 : 0); @@ -105,19 +111,23 @@ static void gera_header(struct declaracao *dec, FILE *f) 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 */ - /* CPF e DN de dependentes 1 a 6 */ - for (i = 1; i <= 6; i++) { - struct dependente *dependente = list_get(dec->dependentes, i - 1); - if (dependente && dependente->cpf && dependente->cpf[0]) { - fprintf(f, "%-11.11s", dependente->cpf); - } else { - fprintf(f, "%-11.11s", ""); - } - if (dependente && dependente->dn && dependente->dn[0]) { - fprintf(f, "%-8.8s", dependente->dn); - } else { - fprintf(f, "%-8.8s", ""); + if (dec->ano < 2017) { + /* CPF e DN de dependentes 1 a 6 */ + for (i = 1; i <= 6; i++) { + struct dependente *dependente = list_get(dec->dependentes, i - 1); + if (dependente && dependente->cpf && dependente->cpf[0]) { + fprintf(f, "%-11.11s", dependente->cpf); + } else { + fprintf(f, "%-11.11s", ""); + } + if (dependente && dependente->dn && dependente->dn[0]) { + fprintf(f, "%-8.8s", dependente->dn); + } else { + fprintf(f, "%-8.8s", ""); + } } + } else { + fprintf(f, "%-114.114s", ""); } /* medico maior, TODO: outros códigos */ fprintf(f, "%-14.14s", medico_cnpj_ordenado(dec, 0)); @@ -127,12 +137,15 @@ 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); - fprintf(f, "%-11.11s", ""); /* CPF empregada */ + if (dec->ano >= 2017) + fprintf(f, "%010u ", crc32(0, dec->cpf, 11)); /* hash CPF */ + else + fprintf(f, "%-11.11s", ""); /* CPF empregada, FILLER */ fprintf(f, "%-12.12s", sistema_get_mac(dec)); fprintf(f, "%08d", 0); /* Data saída */ fprintf(f, "%-11.11s", ""); /* CPF procurador */ fprintf(f, "%03d", dec->obrigatoria); /* criterio obrigatoriedade */ - fprintf(f, "%013lld", totais_get(dec, "RENDPJ")); /* Total tributavel */ + fprintf(f, "%013lld", totais_get(dec, "RENDTRIB")); /* Total tributavel */ /* CNPJ previdencia */ fprintf(f, "%-14.14s", inss_cnpj_ordenado(dec, 0)); /* CNPJ previdencia 2 */ @@ -216,12 +229,16 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) } else if (dec->ano >= 2016) { fprintf(f, "%-90.90s", ""); /* FILLER3 */ /* TODO: NIT/PIS/PASEP de Pessoa Física no exterior */ - fprintf(f, "%-11.11s", ""); + fprintf(f, "%-11.11s", dec->contribuinte.nit ?: ""); /* 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); @@ -248,9 +265,12 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) if (dec->ano >= 2016) fprintf(f, "%-20.20s", ""); /* TODO: registro profissional */ if (dec->ano >= 2017) { - fprintf(f, "%-11.11s", ""); /* TODO: celular */ + 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) @@ -274,12 +294,17 @@ static void gera_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", totais_get(dec, "EXCLUSIVOSDEP")); /* exclusivos dependentes */ fprintf(f, "%-13.13s", ""); /* FILLER */ fprintf(f, "%-13.13s", ""); /* FILLER */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF dependentes */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF ext. depend. */ - fprintf(f, "%013lld", 0); /* TODO: carnê-leão PF? */ - fprintf(f, "%013lld", 0); /* TODO: carnê-leão dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT")); /* rendimentos PF titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFDEP")); /* rendimentos PF dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDEXTTIT")); /* FIXME: rendimentos PF exterior titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDEXTDEP")); /* FIXME: rendimentos PF ext. depend. */ + + /* FIXME: um teste demonstra que não há valor quando existem rendimentos de PF para o titular */ + /* totais_get(dec, "RENDPF")); */ + /* TODO: carnê-leão PF? */ + fprintf(f, "%013lld", totais_get(dec, "CARNETIT")); + + fprintf(f, "%013lld", totais_get(dec, "CARNEDEP")); /* carnê-leão dependentes */ fprintf(f, "%013lld", totais_get(dec, "DEPENDENTES")); /* dedução dependentes */ fprintf(f, "%013lld", 0); /* TODO: previdência RRA */ fprintf(f, "%013lld", 0); /* TODO: previdência RRA dependentes */ @@ -294,7 +319,7 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) { fprintf(f, "18"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ - fprintf(f, "%013lld", totais_get(dec, "RENDPJ")); /* TODO: rendimentos tributáveis */ + fprintf(f, "%013lld", totais_get(dec, "RENDTRIB")); /* rendimentos tributáveis */ /* desconto simplificado */ fprintf(f, "%013lld", totais_get(dec, "DESCONTO")); /* base de cálculo */ @@ -302,7 +327,7 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", dec->devido); /* imposto devido */ fprintf(f, "%013lld", dec->retido); /* imposto retido */ fprintf(f, "%013lld", 0); /* TODO: imposto complementar */ - fprintf(f, "%013lld", 0); /* TODO: carnê-leão */ + fprintf(f, "%013lld", totais_get(dec, "CARNE")); /* TODO: imposto pago carnê-leão */ fprintf(f, "%013lld", 0); /* TODO: imposto retido Lei 11.033 */ fprintf(f, "%013lld", dec->restituicao); /* imposto a restituir */ fprintf(f, "%013lld", dec->pagar); /* imposto pagar */ @@ -320,7 +345,7 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto ganhos de capital */ fprintf(f, "%013lld", totais_get(dec, "RENDPJTIT")); /* rendimento tributável PJ titular */ fprintf(f, "%013lld", 0); /* TODO: total rural */ - fprintf(f, "%013lld", dec->retido); /* imposto retido titular */ + fprintf(f, "%013lld", dec->retido); /* FIXME: imposto retido titular */ fprintf(f, "%013lld", totais_get(dec, "BENSANTERIOR")); /* total bens ano anterior */ fprintf(f, "%013lld", totais_get(dec, "BENS")); /* total bens ano base */ fprintf(f, "%013lld", totais_get(dec, "ISENTOSTIT")); /* rendimentos isentos titular */ @@ -335,8 +360,8 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: tributação exclusiva, transportado */ fprintf(f, "%013lld", 0); /* TODO: ganhos líquidos renda variável */ fprintf(f, "%013lld", 0); /* TODO: parcela isenta ganhos capital */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior titular */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT") + totais_get(dec, "RENDEXTTIT")); /* TODO: rendimentos PF + exterior titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFDEP") + totais_get(dec, "RENDEXTDEP")); /* TODO: rendimentos PF exterior dependentes */ fprintf(f, "%013lld", 0); /* TODO: doações campanha */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exigibilidade suspensa titular */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exigibilidade suspensa dependentes */ @@ -354,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) @@ -380,7 +408,7 @@ static void gera_completa(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: 13o dependente */ fprintf(f, "%05d", totais_get(dec, "DEPSINSTRUCAO")); /* dependentes com instrucao */ fprintf(f, "%05d", 0); /* TODO: alimentandos com instrucao */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT")); /* TODO: rendimentos PF titular */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF dependente */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior titular */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior dependente */ @@ -401,10 +429,10 @@ static void gera_totais_completa(struct declaracao *dec, FILE *f) fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ /* FIXME: completar campos */ fprintf(f, "%013lld", totais_get(dec, "RENDPJTIT")); /* rendimentos PJ titular */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT")); /* TODO: rendimentos PF titular */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF dependente */ fprintf(f, "%013lld", 0); /* TODO: resultado atividade rural */ - fprintf(f, "%013lld", totais_get(dec, "RENDPJ")); /* TODO: total rendimentos tributáveis */ + fprintf(f, "%013lld", totais_get(dec, "RENDTRIB")); /* total rendimentos tributáveis */ /* TODO (2016): somar FUNPRESP até o limite */ fprintf(f, "%013lld", totais_get(dec, "INSS")); /* previdencia oficial */ /* TODO (2016): somar FUNPRESP acima do limite */ @@ -424,7 +452,7 @@ static void gera_totais_completa(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", dec->devido); /* TODO: imposto devido menos patronal */ fprintf(f, "%013lld", dec->devido); /* TODO: imposto devido mais RRA */ fprintf(f, "%013lld", dec->retido); /* imposto na fonte */ - fprintf(f, "%013lld", 0); /* TODO: carne leao */ + fprintf(f, "%013lld", totais_get(dec, "RENDPF")); /* TODO: carne leao */ fprintf(f, "%013lld", 0); /* TODO: imposto complementar */ fprintf(f, "%013lld", 0); /* TODO: imposto pago exterior */ @@ -479,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) @@ -560,6 +591,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 @@ -567,6 +601,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) || @@ -582,8 +621,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]); } @@ -618,7 +661,7 @@ static void gera_recibodetalhe(struct declaracao *dec, FILE *f) 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, "RENDPJ")); /* Total tributavel */ + fprintf(f, "%013lld", totais_get(dec, "RENDTRIB")); /* Total tributavel */ fprintf(f, "%013lld", dec->devido); /* Imposto devido */ fprintf(f, "%013lld", dec->restituicao); /* Imposto a restituir */ fprintf(f, "%013lld", dec->pagar); /* Imposto a pagar */ @@ -632,6 +675,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) @@ -716,6 +762,16 @@ static void gera_plr(struct declaracao *dec, FILE *f) gera_isento(dec, f, 96); } +static void gera_outrosisentos(struct declaracao *dec, FILE *f) +{ + struct isento *i; + int codigo = 97; + i = isento_get(dec, codigo, dec->linhas[codigo]); + gera_isento(dec, f, codigo); + fprintf(f, "%d", i->exclusivo == 0 ? 1 : 2); + fprintf(f, "%-60.60s", i->descricao); +} + static void gera_poupanca(struct declaracao *dec, FILE *f) { gera_isento(dec, f, 98); @@ -785,6 +841,32 @@ static void gera_bem(struct declaracao *dec, FILE *f) fprintf(f, "%05d", dec->linhas[27] + 1); } +static void gera_carne(struct declaracao *dec, FILE *f) +{ + struct carne *carne; + carne = list_get(dec->carne, dec->linhas[22]); + fprintf(f, "22"); + fprintf(f, "%-11.11s", dec->cpf); /* Titular */ + if (carne->dependente) { + struct dependente *d; + d = list_get(dec->dependentes, carne->dependente - 1); + fprintf(f, "S%-11.11s", d ? d->cpf : ""); /* CPF dependente. */ + } else { + fprintf(f, "N%-11.11s", ""); /* Não é dependente. */ + } + fprintf(f, "%02d", carne->mes); + fprintf(f, "%013lld", carne->rendimento); + fprintf(f, "%013lld", carne->alugueis); /* Aluguéis. */ + fprintf(f, "%013lld", carne->outros); /* Outros. */ + fprintf(f, "%013lld", carne->exterior); /* Exterior. */ + fprintf(f, "%013lld", carne->caixa); /* Livro-caixa. */ + fprintf(f, "%013lld", carne->alimentos); /* Pensão alimentícia. */ + fprintf(f, "%013lld", carne->dependentes); /* Dedução com dependentes. */ + fprintf(f, "%013lld", carne->previdencia); /* Previdência. */ + fprintf(f, "%013lld", carne->base); /* Base cálculo. */ + fprintf(f, "%013lld", carne->imposto); /* Imposto pago. */ +} + typedef void (gera_linha)(struct declaracao *dec, FILE *f); static void update_hash(struct declaracao *dec, char *buf, size_t len) @@ -850,6 +932,7 @@ static int gera(struct declaracao *dec, char *filename) int r = 0; int i; struct rendimento *rendimento; + struct carne *carne; struct isento *isento; struct pagamento *pagamento; struct bem *bem; @@ -892,6 +975,10 @@ static int gera(struct declaracao *dec, char *filename) W(gera_rendimento); } + for (i = 0; (carne = list_get(dec->carne, i)); i++) { + W(gera_carne); + } + if (totais_get(dec, "ISENTOS")) W(gera_isentos); if (totais_get(dec, "EXCLUSIVOS")) @@ -922,6 +1009,7 @@ static int gera(struct declaracao *dec, char *filename) IW(gera_doacao, 82); IW(gera_indenizacoes, 93); IW(gera_plr, 96); + IW(gera_outrosisentos, 97); IW(gera_poupanca, 98); IW(gera_aplicacoes, 99);