import { useAuth } from "@/_core/hooks/useAuth"; import { EtatBadge, HebergementBadge, FacturationBadge } from "@/components/EtatBadge"; import SonumLayout from "@/components/SonumLayout"; import ContactModal from "@/components/ContactModal"; import { trpc } from "@/lib/trpc"; import { ArrowLeft, Building2, Eye, Mail, MapPin, Phone, Server, Tag, Users, } from "lucide-react"; import { useEffect, useState } from "react"; import { useLocation } from "wouter"; import { INTEROPERABILITE } from "../../../shared/referentiel"; interface Props { params: { id: string }; } export default function FicheEtablissement({ params }: Props) { const id = Number(params.id); const { user } = useAuth(); const [, navigate] = useLocation(); const [showContact, setShowContact] = useState(false); const etabQuery = trpc.etablissements.byId.useQuery({ id }, { enabled: !!id }); const logicielsQuery = trpc.logiciels.byEtablissement.useQuery({ etablissementId: id }, { enabled: !!id }); const recordConsultation = trpc.tracabilite.enregistrerConsultation.useMutation(); const isGestionnaire = user?.sonumRole === "gestionnaire" || user?.role === "admin"; const isReferent = etabQuery.data?.referentId === user?.id; const canSeeCounter = isReferent || isGestionnaire; const compteurQuery = trpc.tracabilite.compteur.useQuery( { etablissementId: id }, { enabled: !!id && canSeeCounter } ); useEffect(() => { if (id) { recordConsultation.mutate({ etablissementId: id }); } }, [id]); if (etabQuery.isLoading) { return (
); } if (!etabQuery.data) { return (
Établissement introuvable.
); } const etab = etabQuery.data; // Grouper les logiciels par bloc fonctionnel const logicielsByBloc = (logicielsQuery.data ?? []).reduce((acc, l) => { const bloc = l.blocFonctionnelNom ?? "Autres"; if (!acc[bloc]) acc[bloc] = []; acc[bloc].push(l); return acc; }, {} as Record); return (
{/* Retour */} {/* En-tête fiche */}

{etab.nom}

{etab.finess && ( FINESS : {etab.finess} )} {etab.region && ( {etab.region} )} {etab.typeActivite && ( {etab.typeActivite} )} {etab.tailleEffectifs && ( {etab.tailleEffectifs} )}
{/* Compteur de consultation (visible référent + gestionnaire) */} {canSeeCounter && compteurQuery.data !== undefined && (
Consultations : {compteurQuery.data.count}
)} {/* Bouton de contact */} {etab.accepteMiseEnRelation && ( )}
{/* Logiciels par bloc fonctionnel */}

Solutions numériques

{logicielsQuery.isLoading ? (
) : Object.keys(logicielsByBloc).length === 0 ? (

Aucun logiciel renseigné pour cet établissement.

) : (
{Object.entries(logicielsByBloc).map(([bloc, logiciels]) => (
{/* En-tête bloc */}

{bloc} ({logiciels?.length} solution{(logiciels?.length ?? 0) > 1 ? "s" : ""})

{/* Tableau logiciels */}
{logiciels?.map((l) => ( ))}
Solution Éditeur État Hébergement Facturation Interop.
{l.solutionNom}
{l.versionMajeure && (
v{l.versionMajeure}
)} {l.commentaire && (
{l.commentaire}
)}
{l.editeurNom} {l.modeHebergement ? : } {l.modeFacturation ? : } {l.interoperabilite ? ( {INTEROPERABILITE[l.interoperabilite]} ) : }
))}
)}
{showContact && ( setShowContact(false)} /> )} ); }