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 */}
setInputs({ ...inputs, totalProjectListPrice: Number(e.target.value) })} className="w-full p-3 bg-blue-50/10 border border-slate-200 rounded-xl focus:ring-2 focus:ring-blue-500 outline-none font-bold text-blue-900 text-lg transition-all" />

Valor total de Hardware, Software y Servicios de implementación que se facturará al cliente final.

{/* DISCOUNT AND TERM */}
setInputs({ ...inputs, partnerDiscountRate: 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" />

Tu nivel de descuento con Cisco. Afecta tu margen inicial.

Duración del contrato de financiamiento.

{/* FINANCE FACTOR - BLUE BOX */}
setInputs({ ...inputs, ciscoCapitalFinanceFactor: Number(e.target.value) })} className="w-full p-2 text-center font-mono text-2xl font-bold text-blue-900 outline-none bg-transparent" />

FACTOR CRÍTICO: Multiplicador que define la cuota mensual. Un factor menor implica un costo de capital más eficiente.

{/* OPCIÓN FIN DE TÉRMINO */}

{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 */}
setInputs({ ...inputs, managedServicesMRR: 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 font-bold outline-none" />

Tus ingresos propios mensuales por gestión y soporte. Se suman a tu flujo de caja neto.

EFECTO MULTIPLICADOR

Activa el cálculo basado en el multiplicador de Cisco (6.06x) que estima el valor de servicios adicionales desbloqueados.

setInputs({ ...inputs, includeMultiplier: e.target.checked })} className="w-6 h-6 accent-emerald-500 rounded cursor-pointer" />
{/* TASA IMPUESTO Y DSO */}
setInputs({ ...inputs, traditionalDSO: Number(e.target.value) })} className="w-full p-2 bg-slate-50 border border-slate-200 rounded-lg focus:ring-2 focus:ring-blue-500 font-bold" />

Días promedio de cobranza fuera del modelo Dual Pay.

setInputs({ ...inputs, taxRate: Number(e.target.value) })} className="w-full p-2 bg-slate-50 border border-slate-200 rounded-lg focus:ring-2 focus:ring-blue-500 font-bold" />

Impacta directamente en el ahorro fiscal anual al deducir el gasto OPEX.

); }; 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 (
{activeTab === 'simulator' && ( )} {activeTab === 'payback' && ( )} {activeTab === 'fiscal' && ( )}
); }; export default App;