Outros rendimentos isentos exclusivos.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 2 Mar 2017 10:27:59 +0000 (07:27 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 2 Mar 2017 10:27:59 +0000 (07:27 -0300)
Outros rendimentos exigem uma descrição, e a discriminação se são
isentos ou exclusivos.

Até então, rendimentos exclusivos utilizavam o comando isento e eram
distintos pelo seu código. O comando exclusivo utiliza o mesmo código,
mas permite a distinção pelo primeiro argumento, quando o código não o
permitir.

lib/gera.c
lib/isento.c
lib/isento.h

index 96574ce..298c1aa 100644 (file)
@@ -719,6 +719,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);
@@ -925,6 +935,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);
 
index 9e99154..25512f1 100644 (file)
@@ -32,50 +32,42 @@ static int isento_totais_update(struct declaracao *dec, struct isento *isento)
        int r = 0;
        switch (isento->codigo) {
        case 82:
+               isento->exclusivo = 0;
                r = totais_add(dec, "DOACOES", isento->valor);
-               r += totais_add(dec, "ISENTOS", isento->valor);
-               if (isento->dependente) {
-                       r += totais_add(dec, "ISENTOSDEP", isento->valor);
-               } else {
-                       r += totais_add(dec, "ISENTOSTIT", isento->valor);
-               }
                break;
        case 93:
+               isento->exclusivo = 0;
                r = totais_add(dec, "INDENIZACOES", isento->valor);
-               r += totais_add(dec, "ISENTOS", isento->valor);
-               if (isento->dependente) {
-                       r += totais_add(dec, "ISENTOSDEP", isento->valor);
-               } else {
-                       r += totais_add(dec, "ISENTOSTIT", isento->valor);
-               }
                break;
        case 96:
+               isento->exclusivo = 1;
                r = totais_add(dec, "PLR", isento->valor);
-               r += totais_add(dec, "EXCLUSIVOS", isento->valor);
-               if (isento->dependente) {
-                       r += totais_add(dec, "EXCLUSIVOSDEP", isento->valor);
-               } else {
-                       r += totais_add(dec, "EXCLUSIVOSTIT", isento->valor);
-               }
+               break;
+       case 97:
                break;
        case 98:
+               isento->exclusivo = 0;
                r = totais_add(dec, "POUPANCA", isento->valor);
-               r += totais_add(dec, "ISENTOS", isento->valor);
-               if (isento->dependente) {
-                       r += totais_add(dec, "ISENTOSDEP", isento->valor);
-               } else {
-                       r += totais_add(dec, "ISENTOSTIT", isento->valor);
-               }
                break;
        case 99:
+               isento->exclusivo = 1;
                r = totais_add(dec, "APLICACOES", isento->valor);
+               break;
+       }
+       if (isento->exclusivo) {
                r += totais_add(dec, "EXCLUSIVOS", isento->valor);
                if (isento->dependente) {
                        r += totais_add(dec, "EXCLUSIVOSDEP", isento->valor);
                } else {
                        r += totais_add(dec, "EXCLUSIVOSTIT", isento->valor);
                }
-               break;
+       } else {
+               r += totais_add(dec, "ISENTOS", isento->valor);
+               if (isento->dependente) {
+                       r += totais_add(dec, "ISENTOSDEP", isento->valor);
+               } else {
+                       r += totais_add(dec, "ISENTOSTIT", isento->valor);
+               }
        }
        return r;
 }
@@ -87,6 +79,8 @@ void isento_free(void *pointer)
                free(isento->cnpj);
        if (isento->nome)
                free(isento->nome);
+       if (isento->descricao)
+               free(isento->descricao);
        free(isento);
 }
 
@@ -94,6 +88,8 @@ static int isento_cmp(void *p1, void *p2)
 {
        struct isento *r1 = p1;
        struct isento *r2 = p2;
+       if (r1->exclusivo != r2->exclusivo)
+               return r2->exclusivo - r1->exclusivo;
        /* O rendimento maior vem primeiro. */
        if (r1->valor > r2->valor)
                return -1;
@@ -108,6 +104,10 @@ static struct isento * isento_new(char **args, int argc)
        int r = 0;
        isento = malloc(sizeof(*isento));
 
+       if (!strcmp(args[0], "exclusivo")) {
+               isento->exclusivo = 1;
+       }
+
        r += set_int(args[1], &isento->codigo);
        r += set_string(args[2], &isento->cnpj);
        r += set_string(args[3], &isento->nome);
@@ -126,6 +126,15 @@ static struct isento * isento_new(char **args, int argc)
                isento_free(isento);
                return NULL;
        }
+       if (argc == 7) {
+               r = set_string(args[6], &isento->descricao);
+               if (r < 0) {
+                       isento_free(isento);
+                       return NULL;
+               }
+       } else {
+               isento->descricao = NULL;
+       }
        return isento;
 }
 
@@ -133,7 +142,7 @@ static int run_isento(struct declaracao *dec, char **args, int argc)
 {
        struct isento *isento;
        int r;
-       if (argc != 5 && argc != 6)
+       if (argc < 5 || argc > 7)
                return -EINVAL;
        isento = isento_new(args, argc);
        if (!isento)
@@ -159,9 +168,17 @@ void isento_salva(struct declaracao *dec, FILE *f)
 {
        int i;
        struct isento *j;
-       for (i = 0; j = list_get(dec->isentos, i); i++)
-               fprintf(f, "isento %d \"%s\" \"%s\" %lld %d\n",
+       for (i = 0; j = list_get(dec->isentos, i); i++) {
+               if (j->codigo == 97 && j->exclusivo)
+                       fprintf(f, "exclusivo ");
+               else
+                       fprintf(f, "isento ");
+               fprintf(f, "%d \"%s\" \"%s\" %lld %d",
                        j->codigo, j->cnpj, j->nome, j->valor, j->dependente);
+               if (j->descricao)
+                       fprintf(f, " \"%s\"", j->descricao);
+               fprintf(f, "\n");
+       }
 }
 
 static struct cmd cmd_isento = {
@@ -169,9 +186,15 @@ static struct cmd cmd_isento = {
        .run = run_isento,
 };
 
+static struct cmd cmd_exclusivo = {
+       .name = "exclusivo",
+       .run = run_isento,
+};
+
 int isento_cmd_init(void)
 {
        cmd_add(&cmd_isento);
+       cmd_add(&cmd_exclusivo);
        return 0;
 }
 
index 0cecf21..d5c68a5 100644 (file)
@@ -28,6 +28,8 @@ struct isento {
        char *nome;
        long long valor;
        int dependente;
+       int exclusivo;
+       char *descricao;
 };
 
 void isento_salva(struct declaracao *dec, FILE *f);