Suporta carnê leão
[cascardo/declara.git] / lib / gera.c
index c4bc17f..9d8aaf0 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"
@@ -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);
@@ -281,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 */
@@ -309,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 */
@@ -327,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 */
@@ -342,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 */
@@ -802,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)
@@ -867,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;
@@ -909,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"))