From: Thadeu Lima de Souza Cascardo Date: Thu, 2 Mar 2017 10:27:59 +0000 (-0300) Subject: Outros rendimentos isentos exclusivos. X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fdeclara.git;a=commitdiff_plain;h=b54c34909faed757dfcce4346d4124daf1177cc6 Outros rendimentos isentos exclusivos. 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. --- diff --git a/lib/gera.c b/lib/gera.c index 96574ce..298c1aa 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -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); diff --git a/lib/isento.c b/lib/isento.c index 9e99154..25512f1 100644 --- a/lib/isento.c +++ b/lib/isento.c @@ -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; } diff --git a/lib/isento.h b/lib/isento.h index 0cecf21..d5c68a5 100644 --- a/lib/isento.h +++ b/lib/isento.h @@ -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);