senal88's picture
chore: deploy web_comercial from monorepo
933fa00 verified
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,
};
}