Pagamento de psicólogo é despesa médica.
[cascardo/declara.git] / lib / pagamento.c
index 9f91d14..7dc0e95 100644 (file)
@@ -31,11 +31,17 @@ static int pagamento_totais_update(struct declaracao *dec, struct pagamento *pag
 {
        int r;
        r = totais_add(dec, "PAGAMENTOS", pagamento->pagamento);
-       r += totais_add(dec, "PAGAMENTOSTIT", pagamento->pagamento);
        r += totais_add(dec, "REEMBOLSOS", pagamento->reembolso);
-       r += totais_add(dec, "REEMBOLSOSTIT", 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);
@@ -69,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;
        }
@@ -96,11 +106,15 @@ 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);
@@ -119,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 = {
@@ -134,13 +148,14 @@ 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)
@@ -148,10 +163,21 @@ char * pagamento_cnpj_ordenado(struct declaracao *dec, int codigo, int n)
        return pagamento->cnpj;
 }
 
-static int pagamento_medico(int codigo)
+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 (codigo) {
+       switch (pagamento->codigo) {
        case 10:
+       case 12:
        case 21:
        case 26:
                return 1;
@@ -161,16 +187,28 @@ static int pagamento_medico(int codigo)
        return 0;
 }
 
-char * medico_cnpj_ordenado(struct declaracao *dec, int n)
+int pagamento_instrucao(struct pagamento *pagamento)
 {
-       struct pagamento *pagamento;
-       int i;
-       int j = 0;
-       for (i = 0; (pagamento = list_get(dec->pagamentos, i)); i++) {
-               if (pagamento_medico(pagamento->codigo) && j++ == n)
-                       break;
+       switch (pagamento->codigo) {
+       case 1:
+               return 1;
+       default:
+               return 0;
        }
-       if (!pagamento)
-               return "";
-       return pagamento->cnpj;
+       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);
 }