import React, { useState, useEffect } from "react"; import { Card, CardHeader, CardTitle, CardContent, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; import { Users, Search, Trash2, Pencil, Eye, PlusCircle, ClipboardList } from "lucide-react"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { api } from "@/services/api"; export default function ClientsPage() { const [activeTab, setActiveTab] = useState("control"); const [clients, setClients] = useState([]); const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const loadData = async () => { try { setLoading(true); const clientsData = await api.clients.getAll(); const ordersData = await api.orders.getAll(); setClients(clientsData); setOrders(ordersData); } catch (error) { toast.error("Error al cargar datos", { description: error.message || "Por favor, intente nuevamente." }); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); // Estados del formulario (Alta / Edición) const [editingId, setEditingId] = useState(null); const [clientName, setClientName] = useState(""); const [clientDni, setClientDni] = useState(""); const [clientPhone, setClientPhone] = useState(""); const [clientEmail, setClientEmail] = useState(""); // Modal de visualización de órdenes const [selectedClientForOrders, setSelectedClientForOrders] = useState(null); const [showOrdersModal, setShowOrdersModal] = useState(false); // Modal de confirmación de borrado const [clientToDelete, setClientToDelete] = useState(null); const [showDeleteAlert, setShowDeleteAlert] = useState(false); // Registrar o editar cliente const handleRegisterClient = async (e) => { e.preventDefault(); try { if (editingId) { // Editar cliente await api.clients.update(editingId, { name: clientName, dni: clientDni, phone: clientPhone, email: clientEmail }); toast.success("¡Ficha de Cliente Actualizada!", { description: `Los datos de ${clientName} fueron actualizados.` }); setEditingId(null); } else { // Alta de cliente // Validar DNI único localmente antes de enviar (opcional, pero ayuda) const exists = clients.some(c => c.dni.replace(/\./g, "").trim() === clientDni.replace(/\./g, "").trim()); if (exists) { toast.error("El DNI ingresado ya pertenece a un cliente registrado."); return; } const data = await api.clients.create({ name: clientName, dni: clientDni, phone: clientPhone, email: clientEmail }); toast.success("¡Cliente Registrado!", { description: `${clientName} fue dado de alta.` }); } // Resetear formulario setClientName(""); setClientDni(""); setClientPhone(""); setClientEmail(""); setActiveTab("control"); loadData(); } catch (error) { toast.error("Error al registrar cliente", { description: error.message || "Por favor, intente nuevamente." }); } }; // Activar modo edición const handleEditClick = (client) => { setEditingId(client._id); setClientName(client.name); setClientDni(client.dni); setClientPhone(client.phone); setClientEmail(client.email); setActiveTab("registro"); }; // Cancelar edición const handleCancelEdit = () => { setEditingId(null); setClientName(""); setClientDni(""); setClientPhone(""); setClientEmail(""); setActiveTab("control"); }; // Solicitar borrado de cliente const handleDeleteRequest = (client) => { setClientToDelete(client); setShowDeleteAlert(true); }; // Confirmar borrado (borra cliente y todas sus órdenes asociadas) const confirmDeleteClient = async () => { if (!clientToDelete) return; try { await api.clients.delete(clientToDelete._id); toast.error("Cliente eliminado", { description: `${clientToDelete.name} y su historial de órdenes asociadas fueron eliminados.` }); setClientToDelete(null); setShowDeleteAlert(false); loadData(); } catch (error) { toast.error("Error al eliminar cliente", { description: error.message || "Por favor, intente nuevamente." }); } }; // Abrir modal con las órdenes de un cliente const handleViewOrders = (client) => { setSelectedClientForOrders(client); setShowOrdersModal(true); }; // Filtrado de clientes const filteredClients = clients.filter(c => { const term = searchQuery.toLowerCase().trim(); const cId = c._id || ""; return ( cId.toLowerCase().includes(term) || c.name.toLowerCase().includes(term) || c.dni.replace(/\./g, "").includes(term.replace(/\./g, "")) || (c.email && c.email.toLowerCase().includes(term)) || (c.phone && c.phone.includes(term)) ); }); return (
Gestión de fichas de clientes y acceso a su historial de reparaciones técnico.
| ID Cliente | Nombre | Identificación (DNI) | Contacto | Órdenes | Acción |
|---|---|---|---|---|---|
| {client._id.substring(client._id.length - 6).toUpperCase()} | {client.name} | {client.dni} |
{client.phone}
{client.email}
|
|
|
{o.issue}