Cálculo de despesas com instrução.
[cascardo/declara.git] / lib / calcula.c
index d222f96..e9fe3d8 100644 (file)
 #include "totais.h"
 #include "util.h"
 #include "ano.h"
+#include "dependente.h"
+#include "pagamento.h"
 
 static const long long dependente[ANO(MAX_ANOS)] = {
        [ANO(2015)] = 215652,
        [ANO(2016)] = 227508,
 };
 
+static const long long instrucao[ANO(MAX_ANOS)] = {
+       [ANO(2015)] = 337583,
+       [ANO(2016)] = 356150,
+};
+
 long long deducao_dependente(struct declaracao *dec)
 {
        if (ANO_VALIDO(dec->ano))
@@ -38,21 +45,65 @@ long long deducao_dependente(struct declaracao *dec)
        return 0;
 }
 
+static void calculo_instrucao(struct declaracao *dec)
+{
+       int i, j;
+       struct dependente *d;
+       struct pagamento *p;
+       long long instrucao_titular = 0;
+       /* Instrução do titular */
+       for (i = 0; (p = list_get(dec->pagamentos, i)); i++) {
+               if (p->dependente == 0 && pagamento_instrucao(p)) {
+                       instrucao_titular += (p->pagamento - p->reembolso);
+               }
+       }
+       if (instrucao_titular > instrucao[ANO(dec->ano)]) {
+               totais_add(dec, "INSTRUCAO", instrucao[ANO(dec->ano)]);
+       } else {
+               totais_add(dec, "INSTRUCAO", instrucao_titular);
+       }
+       /* Dependentes com instrução */
+       for (i = 0; (d = list_get(dec->dependentes, i)); i++) {
+               long long instrucao_dependente = 0;
+               for (j = 0; (p = list_get(dec->pagamentos, j)); j++) {
+                       if (p->dependente == (i + 1) && pagamento_instrucao(p)) {
+                               instrucao_dependente += (p->pagamento - p->reembolso);
+                       }
+               }
+               if (instrucao_dependente) {
+                       totais_add(dec, "DEPSINSTRUCAO", 1);
+                       if (dec->verbose) {
+                               printf("Dependente %s (%d) tem instrução\n", d->nome, i);
+                       }
+               }
+               if (instrucao_dependente > instrucao[ANO(dec->ano)]) {
+                       totais_add(dec, "INSTRUCAO", instrucao[ANO(dec->ano)]);
+               } else {
+                       totais_add(dec, "INSTRUCAO", instrucao_dependente);
+               }
+       }
+}
+
 /* Alguns totais precisam ser limitados. Portanto, um total de decuções
  * precisa ser ajustado para tais limites. Esta função considerará tais
  * limites no futuro. */
 static long long total_deducao(struct declaracao *dec)
 {
        int i;
+
+       calculo_instrucao(dec);
+
        if (dec->verbose) {
                printf("Dedução:\n");
                printf("\tDependentes: "FMT_R"\n", R(totais_get(dec, "DEPENDENTES")));
                printf("\tINSS: "FMT_R"\n", R(totais_get(dec, "INSS")));
+               printf("\tInstrução: "FMT_R"\n", R(totais_get(dec, "INSTRUCAO")));
                printf("\tPagamentos: "FMT_R"\n", R(totais_get(dec, "PAGAMENTOS")));
                printf("\tReembolsos: -"FMT_R"\n", R(totais_get(dec, "REEMBOLSOS")));
        }
        return totais_get(dec, "DEPENDENTES") +
               totais_get(dec, "INSS") +
+              totais_get(dec, "INSTRUCAO") +
               totais_get(dec, "MEDICAS") +
               totais_get(dec, "PREVIDENCIA");
 }