'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useQueryClient } from '@tanstack/react-query'; import { Header } from '@/components/layouts/header'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useTenants, useCreateTenant, useUpdateTenant, useDeleteTenant } from '@/lib/hooks/use-tenants'; import { useTenantViewStore } from '@/stores/tenant-view-store'; import { useAuthStore } from '@/stores/auth-store'; import { Building, Plus, Users, Eye, Calendar, Pencil, Trash2, X } from 'lucide-react'; import type { Tenant } from '@/lib/api/tenants'; type PlanType = 'starter' | 'business' | 'professional' | 'enterprise'; export default function ClientesPage() { const { user } = useAuthStore(); const { data: tenants, isLoading } = useTenants(); const createTenant = useCreateTenant(); const updateTenant = useUpdateTenant(); const deleteTenant = useDeleteTenant(); const { setViewingTenant } = useTenantViewStore(); const router = useRouter(); const queryClient = useQueryClient(); const [showForm, setShowForm] = useState(false); const [editingTenant, setEditingTenant] = useState(null); const [formData, setFormData] = useState<{ nombre: string; rfc: string; plan: PlanType; }>({ nombre: '', rfc: '', plan: 'starter', }); // Only admins can access this page if (user?.role !== 'admin') { return ( <>

No tienes permisos para ver esta página.

); } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { if (editingTenant) { await updateTenant.mutateAsync({ id: editingTenant.id, data: formData }); setEditingTenant(null); } else { await createTenant.mutateAsync(formData); } setFormData({ nombre: '', rfc: '', plan: 'starter' }); setShowForm(false); } catch (error) { console.error('Error:', error); } }; const handleEdit = (tenant: Tenant) => { setEditingTenant(tenant); setFormData({ nombre: tenant.nombre, rfc: tenant.rfc, plan: tenant.plan as PlanType, }); setShowForm(true); }; const handleDelete = async (tenant: Tenant) => { if (confirm(`¿Eliminar el cliente "${tenant.nombre}"? Esta acción desactivará el cliente.`)) { try { await deleteTenant.mutateAsync(tenant.id); } catch (error) { console.error('Error deleting tenant:', error); } } }; const handleCancelForm = () => { setShowForm(false); setEditingTenant(null); setFormData({ nombre: '', rfc: '', plan: 'starter' }); }; const handleViewClient = (tenantId: string, tenantName: string) => { setViewingTenant(tenantId, tenantName); queryClient.invalidateQueries(); router.push('/dashboard'); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('es-MX', { year: 'numeric', month: 'short', day: 'numeric', }); }; const planLabels: Record = { starter: 'Starter', business: 'Business', professional: 'Professional', enterprise: 'Enterprise', }; const planColors: Record = { starter: 'bg-muted text-muted-foreground', business: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-100', professional: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-100', enterprise: 'bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-100', }; return ( <>
{/* Stats */}

{tenants?.length || 0}

Total Clientes

{tenants?.reduce((acc, t) => acc + (t._count?.users || 0), 0) || 0}

Total Usuarios

{/* Add/Edit Client Form */} {showForm && (
{editingTenant ? 'Editar Cliente' : 'Nuevo Cliente'} {editingTenant ? 'Modifica los datos del cliente' : 'Registra un nuevo cliente para gestionar su facturación'}
setFormData({ ...formData, nombre: e.target.value })} placeholder="Empresa SA de CV" required />
setFormData({ ...formData, rfc: e.target.value.toUpperCase() })} placeholder="XAXX010101000" maxLength={13} required disabled={!!editingTenant} // Can't change RFC after creation />
)} {/* Clients List */} Lista de Clientes {isLoading ? (
Cargando...
) : tenants && tenants.length > 0 ? (
{tenants.map((tenant) => (
{tenant.nombre.substring(0, 2).toUpperCase()}

{tenant.nombre}

{tenant.rfc} {planLabels[tenant.plan]}
{tenant._count?.users || 0} usuarios
{formatDate(tenant.createdAt)}
))}
) : (
No hay clientes registrados
)}
); }