Funções para lista de pagamentos ordenados.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 26 Mar 2016 03:14:16 +0000 (00:14 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 26 Mar 2016 03:14:16 +0000 (00:14 -0300)
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
lib/pagamento.c
lib/pagamento.h

index 382ec06..eac8b7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2015  Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
+ *  Copyright (C) 2015-2016  Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
  *
  *  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 */
index 9f91d14..1e91115 100644 (file)
@@ -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);
 }
index a6d1f59..e4ce6bf 100644 (file)
@@ -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