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, }; }