Tenta ordernar pagamentos
[cascardo/declara.git] / lib / pagamento.c
index 959a02c..b37390d 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);
@@ -74,23 +80,18 @@ 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) {
-               pagamento_free(pagamento);
-               return NULL;
-       }
        if (r < 0 || pagamento->codigo < 0 ||
            pagamento->pagamento < 0 || pagamento->reembolso < 0) {
                pagamento_free(pagamento);
                return NULL;
        }
        if (argc == 7) {
-               r = set_int(&args[5], 2, &pagamento->dependente);
+               r = set_int(args[6], &pagamento->dependente);
        } else {
                pagamento->dependente = 0;
        }
@@ -147,13 +148,64 @@ int pagamento_cmd_init(void)
        return 0;
 }
 
+static struct pagamento * novo_pagamento_cnpj(struct pagamento *pagamento)
+{
+       struct pagamento *cnpj;
+       cnpj = malloc(sizeof(*pagamento));
+       cnpj->codigo = pagamento->codigo;
+       cnpj->cnpj = strdup(pagamento->cnpj);
+       cnpj->nome = strdup(pagamento->nome);
+       cnpj->pagamento = 0;
+       return cnpj;
+}
+
+static struct pagamento * procura_pagamento_cnpj(struct declaracao *dec, char *cnpj)
+{
+       int i;
+       struct pagamento *pagamento;
+       for (i = 0; (pagamento = list_get(dec->pagamentos_cnpj, i)); i++) {
+               if (!strcmp(pagamento->cnpj, cnpj)) {
+                       return pagamento;
+               }
+       }
+       return NULL;
+}
+
+static void agrupa_ordena_pagamentos(struct declaracao *dec)
+{
+       int i;
+       struct pagamento *pagamento;
+       struct pagamento *cnpj;
+       struct pagamento *j;
+       dec->pagamentos_cnpj = list_new();
+       for (i = 0; (pagamento = list_get(dec->pagamentos, i)); i++) {
+               cnpj = procura_pagamento_cnpj(dec, pagamento->cnpj);
+               if (!cnpj) {
+                       cnpj = novo_pagamento_cnpj(pagamento);
+                       cnpj->pagamento = (pagamento->pagamento);
+                       list_add(&dec->pagamentos_cnpj, cnpj);
+               } else {
+                       cnpj->pagamento += (pagamento->pagamento);
+               }
+       }
+       list_sort(dec->pagamentos_cnpj, pagamento_cmp);
+       for (i = 0; (j = list_get(dec->pagamentos_cnpj, i)); i++) {
+               if (dec->verbose)
+                       printf("pagamento %d \"%s\" \"%s\" %lld\n",
+                               j->codigo, j->cnpj, j->nome, j->pagamento);
+       }
+}
+
 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 (!dec->pagamentos_cnpj) {
+               agrupa_ordena_pagamentos(dec);
+       }
+       for (i = 0; (pagamento = list_get(dec->pagamentos_cnpj, i)); i++) {
                if (cond(pagamento) && j++ == n)
                        break;
        }
@@ -176,6 +228,7 @@ static int pagamento_medico(struct pagamento *pagamento)
 {
        switch (pagamento->codigo) {
        case 10:
+       case 12:
        case 21:
        case 26:
                return 1;