import { useState, useEffect } from 'react' import { Info } from 'lucide-react' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Slider } from '@/components/ui/slider' import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import { ScrollArea } from '@/components/ui/scroll-area' import { Separator } from '@/components/ui/separator' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { useProcessStore } from '@/store/process-store' import { formatPercent } from '@/lib/format' const CURRENCIES = [ { code: 'USD', label: 'USD — Dólar estadounidense' }, { code: 'PYG', label: 'PYG — Guaraní paraguayo' }, { code: 'BRL', label: 'BRL — Real brasileño' }, { code: 'ARS', label: 'ARS — Peso argentino' }, { code: 'EUR', label: 'EUR — Euro' }, { code: 'COP', label: 'COP — Peso colombiano' }, { code: 'MXN', label: 'MXN — Peso mexicano' }, { code: 'CLP', label: 'CLP — Peso chileno' }, ] export function GlobalSettingsPanel() { const { currentProcess, updateProcess } = useProcessStore() const [localName, setLocalName] = useState('') const [localClient, setLocalClient] = useState('') const [localCurrency, setLocalCurrency] = useState('USD') const [localOverhead, setLocalOverhead] = useState(20) const [localFrequency, setLocalFrequency] = useState(1000) const [localHorizon, setLocalHorizon] = useState(3) const [localInvestment, setLocalInvestment] = useState(0) const [isDirty, setIsDirty] = useState(false) useEffect(() => { if (!currentProcess) return setLocalName(currentProcess.name) setLocalClient(currentProcess.clientName) setLocalCurrency(currentProcess.currency) setLocalOverhead(Math.round(currentProcess.overheadPercentage * 100)) setLocalFrequency(currentProcess.annualFrequency) setLocalHorizon(currentProcess.analysisHorizonYears) setLocalInvestment(currentProcess.automationInvestment) setIsDirty(false) }, [currentProcess]) function markDirty() { setIsDirty(true) } async function handleSave() { const clampedHorizon = Math.min(10, Math.max(1, localHorizon)) await updateProcess({ name: localName.trim() || 'Proceso sin nombre', clientName: localClient.trim(), currency: localCurrency, overheadPercentage: localOverhead / 100, annualFrequency: Math.max(1, localFrequency), analysisHorizonYears: clampedHorizon, automationInvestment: Math.max(0, localInvestment), }) setLocalHorizon(clampedHorizon) setIsDirty(false) } if (!currentProcess) return null return (
{/* Nombre del proceso */}
{ setLocalName(e.target.value); markDirty() }} placeholder="ej. Proceso de ventas" className="h-8 text-sm" />
{/* Cliente */}
{ setLocalClient(e.target.value); markDirty() }} placeholder="ej. Empresa ABC" className="h-8 text-sm" />
{/* Moneda */}
{/* Overhead */}
Porcentaje adicional sobre los costos directos que representa los costos indirectos: alquiler, administración, infraestructura general.
{ setLocalOverhead(v); markDirty() }} className="flex-1" /> {formatPercent(localOverhead, 0)}

Típicamente entre 15% y 40% para empresas de servicios

{/* ── Sección: Análisis de Impacto ──────────────────────────────── */}

Análisis de Impacto

{/* Frecuencia anual */}
Cantidad de veces que se ejecuta el proceso completo por año. Se usa para anualizar los costos y calcular el ahorro.
{ setLocalFrequency(Math.max(1, parseInt(e.target.value) || 1)); markDirty() }} className="font-mono h-8 text-sm" placeholder="1000" />

Ejemplos: 12 (mensual) · 52 (semanal) · 250 (diario laboral) · 8760 (cada hora)

{/* Horizonte de análisis */}
Años hasta los que se proyecta el ahorro acumulado. Determina el eje X del gráfico de ROI.
{localHorizon} {localHorizon === 1 ? 'año' : 'años'}
{ setLocalHorizon(v); markDirty() }} />
{/* Inversión en automatización */}
Costo único total del proyecto: desarrollo, licencias, implementación, capacitación. No incluir costos recurrentes.
{ setLocalInvestment(Math.max(0, parseFloat(e.target.value) || 0)); markDirty() }} className="font-mono h-8 text-sm" placeholder="0" />
{/* Guardar */}
) }