Tenta ordernar pagamentos test
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 3 May 2018 18:55:26 +0000 (15:55 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 3 May 2018 18:55:26 +0000 (15:55 -0300)
lib/declaracao.h
lib/list.c
lib/list.h
lib/pagamento.c

index 0dc2c17..8a27e9c 100644 (file)
@@ -39,6 +39,7 @@ struct declaracao {
        struct list *carne;
        struct list *isentos;
        struct list *pagamentos;
+       struct list *pagamentos_cnpj;
        struct list *bens;
        struct list *dependentes;
        struct contribuinte contribuinte;
index 8cba3f3..57d24ba 100644 (file)
@@ -128,3 +128,22 @@ int list_size(struct list *list)
 {
        return list->len;
 }
+
+/* Selection sort */
+int list_sort(struct list *l, sort_function_t *fn)
+{
+       int i, j;
+       for (i = 0; i < l->len; i++) {
+               int max = i;
+               void *tmp;
+               /* Find index of max value */
+               for (j = i; j < l->len; j++) {
+                       if (fn(l->items[j].val, l->items[max].val) < 0)
+                               max = j;
+               }
+               /* Swap items */
+               tmp = l->items[max].val;
+               l->items[max].val = l->items[i].val;
+               l->items[i].val = tmp;
+       }
+}
index 8521518..eb34475 100644 (file)
@@ -30,5 +30,6 @@ int list_insert_ordered(struct list **list, void *val, sort_function_t *fn);
 void * list_get(struct list *list, int pos);
 void list_free(struct list *list, free_function_t *ifree);
 int list_size(struct list *list);
+int list_sort(struct list *list, sort_function_t *fn);
 
 #endif
index 7dc0e95..b37390d 100644 (file)
@@ -148,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;
        }