Alíquota efetiva na declaração completa
[cascardo/declara.git] / lib / gera.c
index 6cf116e..8a2f5d5 100644 (file)
@@ -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 */
@@ -56,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 */
@@ -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,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 */
@@ -219,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);
@@ -251,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)
@@ -277,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", totais_get(dec, "RENDPF")); /* 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", totais_get(dec, "RENDPF")); /* 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 */
@@ -305,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", totais_get(dec, "RENDPF")); /* 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 */
@@ -323,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 */
@@ -338,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 */
@@ -357,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)
@@ -482,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)
@@ -563,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
@@ -570,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) ||
@@ -585,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]);
        }
@@ -635,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)
@@ -798,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)
@@ -863,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;
@@ -905,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"))