import React, { useState, useMemo } from 'react';
import {
ShieldCheck,
LayoutDashboard,
Wallet,
Percent,
Calculator,
HelpCircle,
Info,
TrendingUp,
DollarSign,
Clock,
Zap,
BarChart3
} from 'lucide-react';
import {
LineChart,
Line,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
ResponsiveContainer,
AreaChart,
Area,
BarChart,
Bar,
Cell
} from 'recharts';
// --- CONFIGURACIÓN Y DATOS MOCK ---
const defaultInputs = {
totalProjectListPrice: 100000,
partnerDiscountRate: 35,
partnerServicesMarginRate: 20,
contractTermMonths: 36,
ciscoCapitalFinanceFactor: 0.0315,
endOfTermOption: 'RETURN',
fixedResidualValue: 10000,
managedServicesMRR: 500,
bankAnnualRate: 12,
bankFees: 500,
servicesMultiplier: 6.06,
includeMultiplier: false,
clientDiscountRate: 8,
traditionalDSO: 60,
taxRate: 27
};
// --- SUB-COMPONENTES ---
const InputPanel = ({ inputs, setInputs }) => {
return (
Parámetros del Proyecto
{/* TOTAL PROJECT */}
{/* DISCOUNT AND TERM */}
TERM (MESES)
setInputs({ ...inputs, contractTermMonths: Number(e.target.value) })}
className="w-full p-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-blue-500 outline-none font-bold"
>
36
48
60
Duración del contrato de financiamiento.
{/* FINANCE FACTOR - BLUE BOX */}
{/* OPCIÓN FIN DE TÉRMINO */}
OPCIÓN FIN DE TÉRMINO
setInputs({ ...inputs, endOfTermOption: 'RETURN' })}
className={`flex-1 py-3 px-2 text-[10px] rounded-lg border font-bold transition-all uppercase ${inputs.endOfTermOption === 'RETURN' ? 'bg-blue-600 text-white border-blue-600 shadow-md' : 'bg-white text-slate-500 border-slate-200'}`}
>
DEVOLVER (REFRESH)
setInputs({ ...inputs, endOfTermOption: 'OWN' })}
className={`flex-1 py-3 px-2 text-[10px] rounded-lg border font-bold transition-all uppercase ${inputs.endOfTermOption === 'OWN' ? 'bg-blue-600 text-white border-blue-600 shadow-md' : 'bg-white text-slate-500 border-slate-200'}`}
>
COMPRAR (PROPIEDAD)
{inputs.endOfTermOption === 'RETURN'
? 'El cliente devuelve el equipo a costo $0. Ideal para incentivar el recambio tecnológico en 3 años.'
: 'El cliente paga un residual fijo para ser dueño definitivo de los activos.'}
{/* MSP */}
{/* TASA IMPUESTO Y DSO */}
);
};
const SimulatorView = ({ inputs, setInputs, derived, monthlyData, formatCurrency }) => {
return (
{/* HEADER BANNER */}
Simulador de Caso de Negocio Dual Pay
LATAM Financial Engineering — Herramienta de Modelado para Partners
PARTNER RISK = 0% | CURRENCY RISK = 0%
{/* TOP CARDS */}
MARGEN PARTNER DÍA 1
{formatCurrency(derived.partnerGrossMarginDay1)}
Origen: Diferencia entre el precio de venta al cliente y tu costo con descuento. Cisco Capital te transfiere el 100% de este monto al activarse el contrato.
CASH INMEDIATO SIN RIESGO
PAGO MENSUAL CLIENTE
{formatCurrency(derived.monthlyPaymentDualPay)}
Origen: Cálculo del Total del Proyecto por el Finance Factor. Este monto es el que el cliente paga directamente a Cisco Capital bajo una estructura de arrendamiento/OPEX.
FACTURADO COMO OPEX
DSO / RIESGO COBRO
0 Días
Origen: Bajo el modelo Dual Pay, Cisco Capital asume el riesgo crediticio y la gestión de cobranza. El Partner no espera el pago del cliente para realizar su margen.
TRANSFERIDO A CISCO CAP
{/* MAIN CHART */}
Flujo de Caja Acumulado (Partner vs Cliente)
ANÁLISIS MULTIDIMENSIONAL
`$${v / 1000}k`} />
formatCurrency(v)}
contentStyle={{ borderRadius: '16px', border: 'none', boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1)' }}
/>
{v === 'cumPartner' ? 'Partner (Ganancia Acumulada)' : 'Cliente (Salida de Efectivo)'} }
/>
El salto inicial en el flujo del Partner representa el pago del 100% del margen por parte de Cisco Capital en el Día 1.
{/* BOTTOM DARK BANNER */}
Beneficio Neto para el Partner
MARGEN INMEDIATO
{formatCurrency(derived.partnerGrossMarginDay1)}
INGRESO MRR (TOTAL)
{formatCurrency(inputs.managedServicesMRR * inputs.contractTermMonths)}
MARGEN TOTAL DEL NEGOCIO
{formatCurrency(derived.partnerGrossMarginDay1 + (inputs.managedServicesMRR * inputs.contractTermMonths))}
100% LIBRE DE RIESGO CREDITICIO
);
};
const PaybackView = ({ inputs, setInputs, monthlyData, formatCurrency }) => {
return (
Payback Partner: Mes 0
Dual Pay libera tu flujo de caja instantáneamente al recibir el pago del financiamiento el Día 1.
Comparativa de Retorno (Cash Flow Neto)
`$${v / 1000}k`} />
formatCurrency(v)} />
);
};
const FiscalView = ({ inputs, setInputs, derived, formatCurrency }) => {
const fiscalChartData = [
{ name: 'Ahorro Fiscal OPEX (Dual Pay)', monto: derived.taxSavingsOPEX },
{ name: 'Ahorro Fiscal CAPEX (Compra)', monto: derived.taxSavingsCAPEX },
];
return (
AHORRO FISCAL INCREMENTAL (ANUAL)
{formatCurrency(derived.fiscalBenefitDelta)}
Diferencia de ahorro al deducir el 100% de la cuota como gasto vs depreciación lenta en CAPEX.
IMPACTO NETO REAL
{formatCurrency(derived.monthlyPaymentDualPay - (derived.taxSavingsOPEX / 12))}
COSTO EFECTIVO DE LA CUOTA MENSUAL DESPUÉS DE APLICAR EL BENEFICIO TRIBUTARIO.
Análisis del Escudo Tributario (Anual)
`$${v/1000}k`} />
formatCurrency(v)}
contentStyle={{ borderRadius: '16px', border: 'none', boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1)' }}
/>
{fiscalChartData.map((entry, index) => (
|
))}
Argumento para el CFO: La compra directa obliga a depreciar a 5 años. Dual Pay permite llevar el 100% del pago a gastos operativos (OPEX), acelerando la deducción fiscal y mejorando el flujo de caja neto.
);
};
// --- APP PRINCIPAL ---
const App = () => {
const [activeTab, setActiveTab] = useState('simulator');
const [inputs, setInputs] = useState(defaultInputs);
const derived = useMemo(() => {
const customerFixedPrice = inputs.totalProjectListPrice;
const partnerCostFromCisco = customerFixedPrice * (1 - (inputs.partnerDiscountRate / 100));
const partnerGrossMarginDay1 = customerFixedPrice - partnerCostFromCisco;
const monthlyPaymentDualPay = customerFixedPrice * inputs.ciscoCapitalFinanceFactor;
const annualPaymentUSD = monthlyPaymentDualPay * 12;
const taxSavingsOPEX = annualPaymentUSD * (inputs.taxRate / 100);
const annualDepreciationCAPEX = customerFixedPrice / 5;
const taxSavingsCAPEX = annualDepreciationCAPEX * (inputs.taxRate / 100);
const fiscalBenefitDelta = taxSavingsOPEX - taxSavingsCAPEX;
return {
customerFixedPrice,
partnerCostFromCisco,
partnerGrossMarginDay1,
monthlyPaymentDualPay,
taxSavingsOPEX,
taxSavingsCAPEX,
fiscalBenefitDelta,
};
}, [inputs]);
const monthlyData = useMemo(() => {
let data = [];
let cumPartner = 0;
let cumClient = 0;
let cumPartnerTraditional = 0;
const monthDSO = Math.ceil(inputs.traditionalDSO / 30);
for (let m = 0; m <= inputs.contractTermMonths; m++) {
let cfPartner = m === 0 ? derived.partnerGrossMarginDay1 : inputs.managedServicesMRR;
let cfClient = m === 0 ? 0 : -derived.monthlyPaymentDualPay;
if (m === inputs.contractTermMonths && inputs.endOfTermOption === 'OWN') {
cfClient -= inputs.fixedResidualValue;
}
let cfTrad = 0;
if (m === 0) cfTrad = -derived.partnerCostFromCisco;
else if (m === monthDSO) cfTrad = derived.customerFixedPrice;
else cfTrad = inputs.managedServicesMRR;
cumPartner += cfPartner;
cumClient += cfClient;
cumPartnerTraditional += cfTrad;
data.push({
month: m, partner: cfPartner, client: cfClient,
cumPartner, cumClient, cumPartnerTraditional, zeroLine: 0
});
}
return data;
}, [inputs, derived]);
const formatCurrency = (val) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(val);
return (
setActiveTab('simulator')}
className={`flex items-center gap-2 px-5 py-2.5 rounded-xl text-[11px] font-bold transition-all duration-300 ${activeTab === 'simulator' ? 'bg-white text-blue-600 shadow-md border border-slate-200/50' : 'text-slate-500 hover:text-slate-800'}`}
>
Simulador de Oferta
setActiveTab('payback')}
className={`flex items-center gap-2 px-5 py-2.5 rounded-xl text-[11px] font-bold transition-all duration-300 ${activeTab === 'payback' ? 'bg-white text-blue-600 shadow-md border border-slate-200/50' : 'text-slate-500 hover:text-blue-800'}`}
>
Análisis de Payback
setActiveTab('fiscal')}
className={`flex items-center gap-2 px-5 py-2.5 rounded-xl text-[11px] font-bold transition-all duration-300 ${activeTab === 'fiscal' ? 'bg-white text-blue-600 shadow-md border border-slate-200/50' : 'text-slate-500 hover:text-blue-800'}`}
>
Fiscal & ROI
{activeTab === 'simulator' && (
)}
{activeTab === 'payback' && (
)}
{activeTab === 'fiscal' && (
)}
© 2024 Cisco Capital LATAM Financial Engineering Tool. Basado en modelos de estructuración Dual Pay. Los factores y residuales son referenciales.
);
};
export default App;