"use client"; import { useState, useEffect } from "react"; import { employeeService } from "@/services/employee.service"; import { Ticket } from "@/types"; import toast from "react-hot-toast"; import { StatusBadge, StatCard } from "@/components/ui"; import { Search, CheckCircle, XCircle, RefreshCw, Users, Clock, BarChart3, } from "lucide-react"; export default function EmployeeVerificationPage() { const [tickets, setTickets] = useState([]); const [loading, setLoading] = useState(true); const [searchCode, setSearchCode] = useState(""); const [selectedTicket, setSelectedTicket] = useState(null); const [showModal, setShowModal] = useState(false); const [validating, setValidating] = useState(false); const [rejectReason, setRejectReason] = useState(""); const [showRejectInput, setShowRejectInput] = useState(false); useEffect(() => { loadPendingTickets(); }, []); const loadPendingTickets = async () => { try { setLoading(true); const data = await employeeService.getPendingTickets(); // Trier par date décroissante (plus récent en premier) const sortedData = data.sort((a: Ticket, b: Ticket) => { const dateA = a.playedAt ? new Date(a.playedAt).getTime() : 0; const dateB = b.playedAt ? new Date(b.playedAt).getTime() : 0; return dateB - dateA; }); setTickets(sortedData); } catch (error: any) { console.error("Error loading tickets:", error); toast.error("Erreur lors du chargement des tickets"); } finally { setLoading(false); } }; const handleSearch = () => { if (!searchCode.trim()) { toast.error("Veuillez entrer un code de ticket"); return; } const ticket = tickets.find( (t) => t.code.toLowerCase() === searchCode.toLowerCase() ); if (ticket) { setSelectedTicket(ticket); setShowModal(true); setSearchCode(""); } else { toast.error("Ticket non trouvé ou déjà traité"); } }; const handleValidate = async () => { if (!selectedTicket) return; setValidating(true); try { await employeeService.validateTicket(selectedTicket.id, "APPROVE"); toast.success("✅ Ticket validé ! Le lot peut être remis au client."); setShowModal(false); setSelectedTicket(null); loadPendingTickets(); } catch (error: any) { toast.error(error.message || "Erreur lors de la validation"); } finally { setValidating(false); } }; const handleReject = async () => { if (!selectedTicket) return; if (!rejectReason.trim()) { toast.error("Veuillez indiquer la raison du rejet"); return; } setValidating(true); try { await employeeService.validateTicket( selectedTicket.id, "REJECT", rejectReason ); toast.success("Ticket rejeté"); setShowModal(false); setSelectedTicket(null); setShowRejectInput(false); setRejectReason(""); loadPendingTickets(); } catch (error: any) { toast.error(error.message || "Erreur lors du rejet"); } finally { setValidating(false); } }; if (loading) { return (
); } return (
{/* Header */}

Validation des Tickets

Scannez ou recherchez un code pour valider les lots gagnés

{/* Search Section */}

Rechercher un ticket

setSearchCode(e.target.value.toUpperCase())} onKeyPress={(e) => e.key === "Enter" && handleSearch()} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent font-mono text-lg" maxLength={10} />
{/* Lots en attente de remise */}

Lots en attente de remise

{tickets.length === 0 ? (

Aucun lot en attente

Tous les lots ont été remis !

) : ( {tickets.map((ticket) => ( ))}
Client Lot Gagné Date Action
{ticket.user ? `${ticket.user.firstName} ${ticket.user.lastName}` : 'N/A'}
{ticket.user?.email || 'N/A'}
{ticket.prize?.name || 'N/A'}
Code: {ticket.code}
{ticket.playedAt ? new Date(ticket.playedAt).toLocaleDateString('fr-FR') : 'N/A'}
)}
{/* Modal de validation */} {showModal && selectedTicket && (

Détails du Ticket

{/* Ticket Code */}

Code du ticket

{selectedTicket.code}

{/* Client Info */}

Informations du Client

Nom complet

{selectedTicket.user ? `${selectedTicket.user.firstName} ${selectedTicket.user.lastName}` : 'N/A'}

Email

{selectedTicket.user?.email || 'N/A'}

{selectedTicket.user?.phone && (

Téléphone

{selectedTicket.user.phone}

)}
{/* Prize Info */}

Lot Gagné

{selectedTicket.prize?.name || 'N/A'}

{selectedTicket.prize?.description || 'Description non disponible'}

{selectedTicket.prize?.value && (

Valeur

{selectedTicket.prize.value}€

)} {selectedTicket.playedAt && (

Date de gain

{new Date(selectedTicket.playedAt).toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' })}

)}
{/* Reject Reason Input */} {showRejectInput && (