File size: 2,989 Bytes
933fa00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
function ensurePositiveNumber(name, value) {
  if (typeof value !== "number" || Number.isNaN(value) || value <= 0) {
    throw new Error(`${name} deve ser um numero maior que zero`);
  }
}

function ensureNonNegativeNumber(name, value) {
  if (typeof value !== "number" || Number.isNaN(value) || value < 0) {
    throw new Error(`${name} deve ser um numero nao negativo`);
  }
}

function validateInput(input) {
  if (!input || typeof input !== "object") {
    throw new Error("input invalido");
  }

  ensurePositiveNumber("credito_desejado", input.credito_desejado);

  if (!input.parametros || typeof input.parametros !== "object") {
    throw new Error("parametros invalidos");
  }

  const p = input.parametros;

  ensurePositiveNumber("prazo_meses", p.prazo_meses);
  ensureNonNegativeNumber("taxa_administracao_total", p.taxa_administracao_total);
  ensureNonNegativeNumber("fundo_reserva_mensal", p.fundo_reserva_mensal);
  ensureNonNegativeNumber("seguro_prestamista", p.seguro_prestamista);

  if (input.tem_lance && input.lance_percentual !== undefined) {
    ensureNonNegativeNumber("lance_percentual", input.lance_percentual);
  }
}

export function calcularSimulacao(input) {
  validateInput(input);

  const { credito_desejado, parametros, tem_lance, lance_percentual } = input;
  const {
    prazo_meses,
    taxa_administracao_total,
    fundo_reserva_mensal,
    seguro_prestamista,
  } = parametros;

  const fcMensal = 1.0 / prazo_meses;
  const taMensal = taxa_administracao_total / prazo_meses;

  const valorFC = credito_desejado * fcMensal;
  const valorTA = credito_desejado * taMensal;
  const valorFR = credito_desejado * fundo_reserva_mensal;

  const valorBaseSeguro =
    credito_desejado + credito_desejado * taxa_administracao_total;
  const taxaSeguroMensal = seguro_prestamista / prazo_meses;
  const valorSeguro = valorBaseSeguro * taxaSeguroMensal;

  const parcelaIntegral = {
    fundo_comum: valorFC,
    taxa_administracao: valorTA,
    fundo_reserva: valorFR,
    seguro: valorSeguro,
    total: valorFC + valorTA + valorFR + valorSeguro,
  };

  const fatorReducao = 0.7;
  const valorFCReduzido = valorFC * fatorReducao;

  const parcelaReduzida = {
    fundo_comum: valorFCReduzido,
    taxa_administracao: valorTA,
    fundo_reserva: valorFR,
    seguro: valorSeguro,
    total: valorFCReduzido + valorTA + valorFR + valorSeguro,
  };

  let valorLance = 0;
  let prazoAposLance = prazo_meses;

  if (tem_lance && lance_percentual && lance_percentual > 0) {
    valorLance = credito_desejado * lance_percentual;
    const numeroParcelasAntecipadas = Math.floor(valorLance / parcelaIntegral.total);
    prazoAposLance = Math.max(1, prazo_meses - numeroParcelasAntecipadas);
  }

  return {
    credito: credito_desejado,
    prazo: prazo_meses,
    parcela_integral: parcelaIntegral,
    parcela_reduzida: parcelaReduzida,
    valor_lance: tem_lance ? valorLance : undefined,
    prazo_apos_lance: tem_lance ? prazoAposLance : undefined,
  };
}