X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fpagamento.c;h=7dc0e95ffd6fb7e8c18d891ee49113378237a176;hb=8ea9c1613eb66c3e73e8d17139c070dd6de1ab33;hp=26cb3c0bf5de900d015ad610bdb392ce81431968;hpb=891f35cb2686c8b6135b42621e4aab9ce6e64e53;p=cascardo%2Fdeclara.git diff --git a/lib/pagamento.c b/lib/pagamento.c index 26cb3c0..7dc0e95 100644 --- a/lib/pagamento.c +++ b/lib/pagamento.c @@ -27,6 +27,32 @@ #include "util.h" #include "totais.h" +static int pagamento_totais_update(struct declaracao *dec, struct pagamento *pagamento) +{ + int r; + r = totais_add(dec, "PAGAMENTOS", pagamento->pagamento); + r += totais_add(dec, "REEMBOLSOS", pagamento->reembolso); + if (pagamento->dependente) { + r += totais_add(dec, "PAGAMENTOSDEP", pagamento->pagamento); + r += totais_add(dec, "REEMBOLSOSDEP", pagamento->reembolso); + } else { + r += totais_add(dec, "PAGAMENTOSTIT", pagamento->pagamento); + r += totais_add(dec, "REEMBOLSOSTIT", pagamento->reembolso); + } + switch (pagamento->codigo) { + case 10: + case 12: + case 21: + case 26: + r += totais_add(dec, "MEDICAS", pagamento->pagamento - pagamento->reembolso); + break; + case 36: + r += totais_add(dec, "PREVIDENCIA", pagamento->pagamento - pagamento->reembolso); + break; + } + return r; +} + void pagamento_free(void *pointer) { struct pagamento *pagamento = pointer; @@ -49,23 +75,27 @@ static int pagamento_cmp(void *p1, void *p2) return 0; } -static struct pagamento * pagamento_new(char **args) +static struct pagamento * pagamento_new(char **args, int argc) { struct pagamento *pagamento; int r = 0; pagamento = malloc(sizeof(*pagamento)); - pagamento->cnpj = strdup(args[2]); - pagamento->nome = strdup(args[3]); - /* TODO: consertar set_int para funcionar como set_llong */ - r += set_int(args, 2, &pagamento->codigo); + r += set_int(args[1], &pagamento->codigo); + r += set_string(args[2], &pagamento->cnpj); + r += set_string(args[3], &pagamento->nome); r += set_llong(args[4], &pagamento->pagamento); r += set_llong(args[5], &pagamento->reembolso); - if (!pagamento->cnpj || !pagamento->nome) { + if (r < 0 || pagamento->codigo < 0 || + pagamento->pagamento < 0 || pagamento->reembolso < 0) { pagamento_free(pagamento); return NULL; } - if (r < 0 || pagamento->codigo < 0 || - pagamento->pagamento < 0 || pagamento->reembolso < 0) { + if (argc == 7) { + r = set_int(args[6], &pagamento->dependente); + } else { + pagamento->dependente = 0; + } + if (r < 0 || pagamento->dependente < 0) { pagamento_free(pagamento); return NULL; } @@ -76,18 +106,21 @@ static int run_pagamento(struct declaracao *dec, char **args, int argc) { struct pagamento *pagamento; int r; - if (argc != 6) + if (argc != 6 && argc != 7) return -EINVAL; - pagamento = pagamento_new(args); + pagamento = pagamento_new(args, argc); if (!pagamento) return -ENOMEM; + if (pagamento->dependente > list_size(dec->dependentes)) { + pagamento_free(pagamento); + return -EINVAL; + } r = list_insert_ordered(&dec->pagamentos, pagamento, pagamento_cmp); if (r < 0) { pagamento_free(pagamento); return r; } - r = totais_add(dec, "PAGAMENTOS", pagamento->pagamento); - r += totais_add(dec, "PAGAMENTOSTIT", pagamento->pagamento); + r = pagamento_totais_update(dec, pagamento); if (r) { pagamento_free(pagamento); return r; @@ -100,8 +133,8 @@ void pagamento_salva(struct declaracao *dec, FILE *f) int i; struct pagamento *j; for (i = 0; j = list_get(dec->pagamentos, i); i++) - fprintf(f, "pagamento %d \"%s\" \"%s\" %lld %lld\n", - j->codigo, j->cnpj, j->nome, j->pagamento, j->reembolso); + fprintf(f, "pagamento %d \"%s\" \"%s\" %lld %lld %d\n", + j->codigo, j->cnpj, j->nome, j->pagamento, j->reembolso, j->dependente); } static struct cmd cmd_pagamento = { @@ -115,16 +148,67 @@ int pagamento_cmd_init(void) return 0; } -char * pagamento_cnpj_ordenado(struct declaracao *dec, int codigo, int n) +char * pagamento_cnpj_ordenado_cond(struct declaracao *dec, + int (*cond)(struct pagamento *), int n) { struct pagamento *pagamento; int i; int j = 0; for (i = 0; (pagamento = list_get(dec->pagamentos, i)); i++) { - if (pagamento->codigo == codigo && j++ == n) + if (cond(pagamento) && j++ == n) break; } if (!pagamento) return ""; return pagamento->cnpj; } + +static int always(struct pagamento *pagamento) +{ + return pagamento != NULL; +} + +char * pagamento_cnpj_ordenado(struct declaracao *dec, int n) +{ + return pagamento_cnpj_ordenado_cond(dec, always, n); +} + +static int pagamento_medico(struct pagamento *pagamento) +{ + switch (pagamento->codigo) { + case 10: + case 12: + case 21: + case 26: + return 1; + default: + return 0; + } + return 0; +} + +int pagamento_instrucao(struct pagamento *pagamento) +{ + switch (pagamento->codigo) { + case 1: + return 1; + default: + return 0; + } + return 0; +} + +char * medico_cnpj_ordenado(struct declaracao *dec, int n) +{ + return pagamento_cnpj_ordenado_cond(dec, pagamento_medico, n); +} + +static int pagamento_inss(struct pagamento *pagamento) +{ + return pagamento->codigo == 36; +} + +char *inss_cnpj_ordenado(struct declaracao *dec, int n) +{ + return pagamento_cnpj_ordenado_cond(dec, pagamento_inss, n); +}