Spaces:
Sleeping
Sleeping
| 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, | |
| }; | |
| } | |