Implementa celular.
[cascardo/declara.git] / lib / gera.c
index 298c1aa..75fbbcc 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"
@@ -55,7 +56,7 @@ 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, "100"); /* Versão IRPF */
+               fprintf(f, "110"); /* Versão IRPF */
        fprintf(f, "%-60.60s", dec->nome);
        fprintf(f, "%-2.2s", dec->contribuinte.uf ?: "");
        fprintf(f, "%s", "0000000000"); /* FIXME: hash */
@@ -80,7 +81,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 +107,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));
@@ -219,7 +225,7 @@ 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 ?: "");
        }
@@ -251,7 +257,7 @@ 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");
        }
 }
@@ -277,12 +283,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 +316,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 +334,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 +349,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 */
@@ -798,6 +809,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 +900,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 +943,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"))