'use client'; import { useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Header } from '@/components/layouts/header'; import { Card, CardContent, CardHeader, CardTitle } from '@horux/shared-ui'; import { useAuthStore } from '@/stores/auth-store'; import { isGlobalAdminRfc } from '@horux/shared'; import { useQuery } from '@tanstack/react-query'; import { apiClient } from '@/lib/api/client'; import { CheckCircle, AlertCircle, Clock, XCircle, Building, Sparkles, } from 'lucide-react'; // ============================================================================ // Helpers // ============================================================================ const statusConfig: Record = { authorized: { label: 'Activa', color: 'text-green-700', bgColor: 'bg-green-50 border-green-200', icon: CheckCircle }, trial: { label: 'Prueba gratis', color: 'text-blue-700', bgColor: 'bg-blue-50 border-blue-200', icon: Sparkles }, trial_expired: { label: 'Prueba vencida', color: 'text-red-700', bgColor: 'bg-red-50 border-red-200', icon: XCircle }, trial_converted: { label: 'Prueba convertida', color: 'text-green-700', bgColor: 'bg-green-50 border-green-200', icon: CheckCircle }, pending: { label: 'Pendiente de pago', color: 'text-yellow-700', bgColor: 'bg-yellow-50 border-yellow-200', icon: Clock }, paused: { label: 'Pausada', color: 'text-orange-700', bgColor: 'bg-orange-50 border-orange-200', icon: AlertCircle }, cancelled: { label: 'Cancelada', color: 'text-red-700', bgColor: 'bg-red-50 border-red-200', icon: XCircle }, }; // ============================================================================ // Admin global: vista de todas las suscripciones // ============================================================================ // Edición de precios de planes movida a /configuracion/precios-suscripcion. // Vista self-serve para clientes movida a /configuracion/planes-despacho. function AdminGlobalSubscriptions() { const { data: subscriptions, isLoading } = useQuery({ queryKey: ['all-subscriptions'], queryFn: () => apiClient.get('/subscriptions').then(r => r.data), }); if (isLoading) return
Cargando...
; const subs = (subscriptions || []) as any[]; const activas = subs.filter((s: any) => s.status === 'authorized' || s.status === 'active'); const pendientes = subs.filter((s: any) => s.status === 'pending'); const canceladas = subs.filter((s: any) => s.status === 'cancelled' || s.status === 'paused'); return (

{subs.length}

Total

{activas.length}

Activas

{pendientes.length}

Pendientes

{canceladas.length}

Canceladas

Todas las Suscripciones {subs.length === 0 ? (

No hay suscripciones

) : (
{subs.map((s: any) => { const st = statusConfig[s.status] || statusConfig.pending; const StIcon = st.icon; return ( ); })}
ClienteRFCPlanEstadoMontoFrecuenciaSiguiente pagoCreada
{s.tenant?.nombre || '—'} {s.tenant?.rfc || '—'} {s.plan} {st.label} ${Number(s.amount).toLocaleString('es-MX', { minimumFractionDigits: 2 })} {s.frequency} {s.currentPeriodEnd ? new Date(s.currentPeriodEnd).toLocaleDateString('es-MX') : '—'} {new Date(s.createdAt).toLocaleDateString('es-MX')}
)}
); } // ============================================================================ // Frequency Toggle // ============================================================================ function FrequencyToggle({ value, onChange }: { value: 'monthly' | 'annual'; onChange: (v: 'monthly' | 'annual') => void }) { return (
); } // ============================================================================ // Main Page // ============================================================================ export default function SuscripcionPage() { const { user } = useAuthStore(); const router = useRouter(); const isAdmin = isGlobalAdminRfc(user?.tenantRfc, user?.role, user?.platformRoles); // Para clientes la gestión de suscripción vive en /configuracion/planes-despacho. // Esta página queda como panel agregado del admin global (ver TODAS las suscripciones). // Si por algún link viejo cae un cliente regular, lo enviamos a Planes. useEffect(() => { if (!isAdmin) router.replace('/configuracion/planes-despacho'); }, [isAdmin, router]); if (!isAdmin) { return (
Redirigiendo a Planes…
); } // Admin global: vista agregada de todas las suscripciones de la plataforma. return ( <>
); }