X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fisento.c;h=fd8f9259b06dcc3e56dbd556a61d9110650f7b1a;hb=dd00f87d72820e15332e947df6256db5cda4aa91;hp=af3700e26f25efd1b69e090afe722d33e0960c6a;hpb=cdf0b367d0d48286bccd4c873a3c2de4554b77d3;p=cascardo%2Fdeclara.git diff --git a/lib/isento.c b/lib/isento.c index af3700e..fd8f925 100644 --- a/lib/isento.c +++ b/lib/isento.c @@ -32,41 +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); 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; } @@ -78,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); } @@ -85,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; @@ -98,22 +103,22 @@ static struct isento * isento_new(char **args, int argc) struct isento *isento; int r = 0; isento = malloc(sizeof(*isento)); - isento->cnpj = strdup(args[2]); - isento->nome = strdup(args[3]); - /* TODO: consertar set_int para funcionar como set_llong */ - r += set_int(args, 2, &isento->codigo); - r += set_llong(args[4], &isento->valor); - if (!isento->cnpj || !isento->nome) { - isento_free(isento); - return NULL; + + 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); + r += set_llong(args[4], &isento->valor); if (r < 0 || isento->codigo < 0 || isento->valor < 0) { isento_free(isento); return NULL; } if (argc == 6) { - r = set_int(&args[4], 2, &isento->dependente); + r = set_int(args[5], &isento->dependente); } else { isento->dependente = 0; } @@ -121,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; } @@ -128,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) @@ -137,13 +151,13 @@ static int run_isento(struct declaracao *dec, char **args, int argc) isento_free(isento); return -EINVAL; } - r = list_insert_ordered(&dec->isentos, isento, isento_cmp); - if (r < 0) { + r = isento_totais_update(dec, isento); + if (r) { isento_free(isento); return r; } - r = isento_totais_update(dec, isento); - if (r) { + r = list_insert_ordered(&dec->isentos, isento, isento_cmp); + if (r < 0) { isento_free(isento); return r; } @@ -154,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 = { @@ -164,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; }