Funções para lista de pagamentos ordenados.
[cascardo/declara.git] / lib / pagamento.c
index 92ff7ba..1e91115 100644 (file)
 #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, "PAGAMENTOSTIT", pagamento->pagamento);
+       r += totais_add(dec, "REEMBOLSOS", pagamento->reembolso);
+       r += totais_add(dec, "REEMBOLSOSTIT", pagamento->reembolso);
+       switch (pagamento->codigo) {
+       case 10:
+       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;
@@ -86,10 +106,7 @@ static int run_pagamento(struct declaracao *dec, char **args, int argc)
                pagamento_free(pagamento);
                return 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);
+       r = pagamento_totais_update(dec, pagamento);
        if (r) {
                pagamento_free(pagamento);
                return r;
@@ -117,16 +134,55 @@ 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 21:
+       case 26:
+               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);
+}