Permite pagamento para despesa com dependente.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sun, 10 Apr 2016 15:24:53 +0000 (12:24 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sun, 10 Apr 2016 15:30:58 +0000 (12:30 -0300)
O dependente deve ser especificado numericamente, indexado a partir de
1. Este é o mesmo código a ser utilizado ao gerar a linha de dependente
e que será utilizado na linha de pagamento.

A opção foi feita por utilizar o índice, pois nem todos os dependentes
possuem CPF, e no raro caso de existirem dependentes homônimos, o nome
não poderia ser utilizado tampouco.

A utilização do índice exige que o dependente seja adicionado
anteriormente ao pagamento. Se o dependente for omitido ou tiver o
índice zero, considera-se a despesa com o titular.

A linha de pagamento também passa a ser gerada com a informação correta
sobre o dependente.

lib/gera.c
lib/pagamento.c
lib/pagamento.h

index 56950ed..69c4311 100644 (file)
@@ -655,7 +655,7 @@ static void gera_pagamento(struct declaracao *dec, FILE *f)
        fprintf(f, "26");
        fprintf(f, "%s", dec->cpf);
        fprintf(f, "%02d", p->codigo);
-       fprintf(f, "%05d", 0); /* TODO: chave dependente */
+       fprintf(f, "%05d", p->dependente);
        fprintf(f, "%-14.14s", p->cnpj);
        fprintf(f, "%-60.60s", p->nome);
        fprintf(f, "%-11.11s", ""); /* TODO: NIT */
@@ -666,8 +666,8 @@ static void gera_pagamento(struct declaracao *dec, FILE *f)
                fprintf(f, "%013lld", 0);
        }
        fprintf(f, "%d", strlen(p->cnpj) == 11 ? 1 : 2);
-       /* Titular (T), Dependente (D), Alimentando (A), FIXME */
-       fprintf(f, "T");
+       /* Titular (T), Dependente (D), Alimentando (A), FIXME Alimentando */
+       fprintf(f, "%c", p->dependente ? 'D' : 'T');
 }
 
 static void gera_isento(struct declaracao *dec, FILE *f, int codigo)
index 1e91115..821a3f1 100644 (file)
@@ -69,7 +69,7 @@ static int pagamento_cmp(void *p1, void *p2)
        return 0;
 }
 
-static struct pagamento * pagamento_new(char **args)
+static struct pagamento * pagamento_new(char **args, int argc)
 {
        struct pagamento *pagamento;
        int r = 0;
@@ -89,6 +89,15 @@ static struct pagamento * pagamento_new(char **args)
                pagamento_free(pagamento);
                return NULL;
        }
+       if (argc == 7) {
+               r = set_int(&args[5], 2, &pagamento->dependente);
+       } else {
+               pagamento->dependente = 0;
+       }
+       if (r < 0 || pagamento->dependente < 0) {
+               pagamento_free(pagamento);
+               return NULL;
+       }
        return pagamento;
 }
 
@@ -96,11 +105,15 @@ static int run_pagamento(struct declaracao *dec, char **args, int argc)
 {
        struct pagamento *pagamento;
        int r;
-       if (argc != 6)
+       if (argc != 6 && argc != 7)
                return -EINVAL;
-       pagamento = pagamento_new(args);
+       pagamento = pagamento_new(args, argc);
        if (!pagamento)
                return -ENOMEM;
+       if (pagamento->dependente > list_size(dec->dependentes)) {
+               pagamento_free(pagamento);
+               return -EINVAL;
+       }
        r = list_insert_ordered(&dec->pagamentos, pagamento, pagamento_cmp);
        if (r < 0) {
                pagamento_free(pagamento);
@@ -119,8 +132,8 @@ void pagamento_salva(struct declaracao *dec, FILE *f)
        int i;
        struct pagamento *j;
        for (i = 0; j = list_get(dec->pagamentos, i); i++)
-               fprintf(f, "pagamento %d \"%s\" \"%s\" %lld %lld\n",
-                       j->codigo, j->cnpj, j->nome, j->pagamento, j->reembolso);
+               fprintf(f, "pagamento %d \"%s\" \"%s\" %lld %lld %d\n",
+                       j->codigo, j->cnpj, j->nome, j->pagamento, j->reembolso, j->dependente);
 }
 
 static struct cmd cmd_pagamento = {
index e4ce6bf..adf105f 100644 (file)
@@ -28,6 +28,7 @@ struct pagamento {
        char *nome;
        long long pagamento;
        long long reembolso;
+       int dependente;
 };
 
 void pagamento_salva(struct declaracao *dec, FILE *f);