X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fpagamento.c;h=b37390de900c60929b383bf2e897c1cfd1e1f957;hb=refs%2Fheads%2Ftest;hp=7dc0e95ffd6fb7e8c18d891ee49113378237a176;hpb=97a7dfaa1da2b161c52039ab85feafe0d9ad3cd2;p=cascardo%2Fdeclara.git diff --git a/lib/pagamento.c b/lib/pagamento.c index 7dc0e95..b37390d 100644 --- a/lib/pagamento.c +++ b/lib/pagamento.c @@ -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; }