const { useState, useMemo, useEffect } = React; const DEFAULTS = { nombre: "Departamento en preventa", ubicacion: "CDMX", precio: 4500000, engPct: 10, mensPct: 30, numMensualidades: 24, entregaPct: 60, escrituraPct: 7, // ROI tarifaProm: 2400, ocupacion: 70, comisionPct: 15, adminPct: 5, gastosFijos: 4500, plusvalia: 10, inflacionRenta: 5, horizonte: 10, usarCredito: true, tasaCredito: 11.5, plazoCredito: 20, }; function App() { const { calcular, fmtMXN, fmtPct, fmtNum } = window.CalcLogic; const [tweaks, setTweaksLocal] = useState({ accent: "bronce", modoVista: "analisis" }); useEffect(() => { window.__appSetTweak = (k, v) => setTweaksLocal((s) => ({ ...s, [k]: v })); return () => { delete window.__appSetTweak; }; }, []); useEffect(() => { const accents = { bronce: "oklch(0.55 0.08 95)", indigo: "oklch(0.45 0.10 260)", bosque: "oklch(0.45 0.07 150)", vino: "oklch(0.45 0.10 25)", }; document.documentElement.style.setProperty("--accent", accents[tweaks.accent] || accents.bronce); }, [tweaks.accent]); const [inputs, setInputs] = useState(DEFAULTS); const set = (k) => (v) => setInputs((s) => ({ ...s, [k]: v })); const setNum = (k) => (v) => setInputs((s) => ({ ...s, [k]: v === "" ? 0 : +v })); const r = useMemo(() => calcular(inputs), [inputs]); const roi = useMemo(() => window.CalcLogic.calcularROI( r.precio, r.contraEntrega, r.escrituracion, r.totalAPagar, inputs ), [r, inputs]); // Auto-balancear: si suma != 100, calcula faltante para sugerir const faltante = 100 - (inputs.engPct + inputs.mensPct + inputs.entregaPct); const setTweak = (k, v) => { setTweaksLocal((s) => ({ ...s, [k]: v })); window.parent.postMessage({ type: '__edit_mode_set_keys', edits: { [k]: v } }, '*'); }; const presentMode = tweaks.modoVista === "presentacion"; return (
Este documento es una simulación de carácter informativo y meramente ilustrativo. Las cifras aquí presentadas son estimaciones basadas en los datos proporcionados y las condiciones actuales del mercado. Los valores reales, tasas de interés, gastos notariales y rendimientos finales pueden variar al momento de la operación formal. AZ Real Estate no se hace responsable por variaciones en los resultados finales de la inversión.
Incluye notario, ISAI, avalúo y RPP. No forma parte del precio del depa.
Sobre {fmtMXN(r.precio)} de precio del inmueble más {fmtMXN(r.escrituracion)} de gastos de escrituración ({fmtPct(inputs.escrituraPct, 1)}). {!r.balanceadoOk && ( {" "}⚠ El esquema {faltante > 0 ? "no llega" : "excede"} el 100% por {fmtPct(Math.abs(faltante), 1)}. )}
| Pagos del inmueble | ||
| Enganche | {fmtPct(inputs.engPct, 1)} | {fmtMXN(r.enganche)} |
| Mensualidades · {r.numMensualidades} pagos de {fmtMXN(r.mensualidad)} | {fmtPct(inputs.mensPct, 1)} | {fmtMXN(r.totalMensualidades)} |
| Saldo contra entrega | {fmtPct(inputs.entregaPct, 1)} | {fmtMXN(r.contraEntrega)} |
| Subtotal precio | {fmtPct(inputs.engPct + inputs.mensPct + inputs.entregaPct, 1)} | {fmtMXN(r.totalSinEscritura)} |
| Gastos adicionales | ||
| Escrituración | {fmtPct(inputs.escrituraPct, 1)} | {fmtMXN(r.escrituracion)} |
| Total a desembolsar | {fmtMXN(r.totalAPagar)} | |
| Mes | Concepto | % del precio | Pago | Acumulado | % Acum. |
|---|---|---|---|---|---|
| {p.mes === 0 ? "Firma" : `M${p.mes}`} |
{p.concepto}
{p.detalle}
|
{fmtPct(p.porcentaje, 2)} | {fmtMXN(p.pago)} | {fmtMXN(p.acumulado)} | {fmtPct(p.porcentajeAcum, 1)} |
Configura los supuestos de renta vacacional para proyectar el ROI
El crédito se calcula sobre el saldo contra entrega ({fmtMXN(inputs.precio * (inputs.entregaPct / 100))}).
Con tarifa promedio de {fmtMXN(roi.tarifaProm)} por noche al{" "} {fmtPct(roi.ocupacion, 0)} de ocupación, plusvalía anual de{" "} {fmtPct(roi.plusvalia, 1)} {roi.usarCredito && (<>{" "}y crédito a {fmtPct(roi.tasaCredito, 1)} por {roi.plazoCredito} años>)}.
El banco aporta el saldo contra entrega. Tu rendimiento se dispara porque controlas un activo grande con poco capital propio — pero el flujo mensual puede ser negativo.
Pagas todo de contado. El flujo es positivo desde el día 1, pero el ROI es menor porque tu capital invertido es mucho mayor.
| Ingreso bruto · {fmtNum(roi.noches, 1)} noches × {fmtMXN(roi.tarifaProm)} | 100% | {fmtMXN(roi.ingresoBruto)} |
| Comisión plataforma | −{fmtPct(inputs.comisionPct, 0)} | −{fmtMXN(roi.comision)} |
| Administración | −{fmtPct(inputs.adminPct, 0)} | −{fmtMXN(roi.admin)} |
| Gastos fijos | −{fmtMXN(roi.gastosFijos)} | |
| Renta neta operativa | {fmtMXN(roi.ingresoNetoOp)} | |
| Pago hipoteca · {fmtPct(roi.tasaCredito, 1)} × {roi.plazoCredito} años | −{fmtMXN(roi.pagoMensualHip)} | |
| Flujo neto al inversionista | {fmtMXN(roi.flujoNetoMensual)} |
| Año | Ingreso operativo | {roi.usarCredito &&Pago hipoteca | }Flujo del año | Flujo acumulado | Valor del depa | {roi.usarCredito &&Saldo crédito | }Equity |
|---|---|---|---|---|---|---|---|
| Año {p.anio} | {fmtMXN(p.ingresoOp)} | {roi.usarCredito &&−{fmtMXN(p.pagoHip)} | }= 0 ? "num--strong" : "num--neg")}>{fmtMXN(p.flujoNeto)} | {fmtMXN(p.flujoAcumulado)} | {fmtMXN(p.valor)} | {roi.usarCredito &&{fmtMXN(p.saldo)} | }{fmtMXN(p.equity)} |