Se total de rendimentos é zero, não gera linha.
[cascardo/declara.git] / lib / gera.c
index 6cf444f..5bc6075 100644 (file)
@@ -556,10 +556,13 @@ static void gera_isentos(struct declaracao *dec, FILE *f)
 
 static void gera_isentos2(struct declaracao *dec, FILE *f, int codigo, char *nome)
 {
+       long long total = totais_get(dec, nome);
+       if (total == 0)
+               return;
        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 */
+       fprintf(f, "%013lld", total);
 }
 
 static void gera_23_poupanca(struct declaracao *dec, FILE *f)
@@ -787,7 +790,7 @@ static void gera_isento2(struct declaracao *dec, FILE *f, int codigo,
                        int subcodigo, int codigoreal)
 {
        struct isento *i;
-       i = isento_get(dec, codigo, dec->linhas[codigo]);
+       i = dec->ctx;
        fprintf(f, "%02d", codigoreal);
        fprintf(f, "%-11.11s", dec->cpf); /* Titular */
        /* Titular (T), Dependente (D), Alimentando (A), FIXME Alimentando */
@@ -905,12 +908,12 @@ 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 */
@@ -985,8 +988,12 @@ static int wrap(gera_linha fn, struct declaracao *dec, struct list *l)
                return -errno;
        }
        fn(dec, m);
-       dec->linhas[0]++;
        fflush(m);
+       if (bsize == 0) {
+               fclose(m);
+               return 0;
+       }
+       dec->linhas[0]++;
 
        /* Calcula CRC32 para campo de controle dos registros. */
        c = crc32(c, buf, bsize);
@@ -1100,6 +1107,7 @@ static int gera(struct declaracao *dec, char *filename)
                isento = isento_get(dec, codigo, i); \
                if (!isento) \
                        break; \
+               dec->ctx = isento; \
                W(fn); \
        }
        if (dec->ano <= 2017) {