From 89da818e9788bdbc94395a3fc68a16cf16fb5f2b Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Sat, 26 Mar 2016 00:14:16 -0300 Subject: [PATCH] =?utf8?q?Fun=C3=A7=C3=B5es=20para=20lista=20de=20pagament?= =?utf8?q?os=20ordenados.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Cria uma função para lista de pagamentos independente do código, uma função mais genérica, com um callback de condição, e uma função para pagamentos à previdência pública INSS. --- lib/gera.c | 6 +++--- lib/pagamento.c | 40 ++++++++++++++++++++++++++-------------- lib/pagamento.h | 5 ++++- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/lib/gera.c b/lib/gera.c index 382ec06..eac8b7f 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Thadeu Lima de Souza Cascardo + * Copyright (C) 2015-2016 Thadeu Lima de Souza Cascardo * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -119,9 +119,9 @@ static void gera_header(struct declaracao *dec, FILE *f) fprintf(f, "%03d", dec->obrigatoria); /* criterio obrigatoriedade */ fprintf(f, "%013lld", totais_get(dec, "RENDPJ")); /* Total tributavel */ /* CNPJ previdencia */ - fprintf(f, "%-14.14s", pagamento_cnpj_ordenado(dec, 36, 0)); + fprintf(f, "%-14.14s", inss_cnpj_ordenado(dec, 0)); /* CNPJ previdencia 2 */ - fprintf(f, "%-14.14s", pagamento_cnpj_ordenado(dec, 36, 1)); + fprintf(f, "%-14.14s", inss_cnpj_ordenado(dec, 1)); /* Total isentos */ fprintf(f, "%013lld", totais_get(dec, "ISENTOS")); /* Total exclusivo */ diff --git a/lib/pagamento.c b/lib/pagamento.c index 9f91d14..1e91115 100644 --- a/lib/pagamento.c +++ b/lib/pagamento.c @@ -134,13 +134,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,9 +149,19 @@ 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) { - switch (codigo) { + 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: @@ -163,14 +174,15 @@ static int pagamento_medico(int codigo) char * medico_cnpj_ordenado(struct declaracao *dec, int n) { - 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; - } - if (!pagamento) - return ""; - return pagamento->cnpj; + 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); } diff --git a/lib/pagamento.h b/lib/pagamento.h index a6d1f59..e4ce6bf 100644 --- a/lib/pagamento.h +++ b/lib/pagamento.h @@ -35,7 +35,10 @@ void pagamento_free(void *pointer); int pagamento_cmd_init(void); -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); +char * pagamento_cnpj_ordenado(struct declaracao *dec, int n); char * medico_cnpj_ordenado(struct declaracao *dec, int n); +char * inss_cnpj_ordenado(struct declaracao *dec, int n); #endif -- 2.20.1