```mermaid
classDiagram

    class Campus {
        +int id
        +String nom
        +String adresse
        +String ville
        +String codePostal
        +Boolean actif
    }

    class SallePret {
        +int id
        +String nom
        +String localisation
        +Boolean actif
    }

    class PosteEmprunt {
        +int id
        +String nom
        +String identifiantPoste
        +Boolean actif
    }

    class Utilisateur {
        +int id
        +String microsoftId
        +String nom
        +String prenom
        +String email
        +String classe
        +Boolean actif
    }

    class Role {
        +int id
        +String code
        +String libelle
        +String description
    }

    class CarteEtudiante {
        +int id
        +String qrCode
        +DateTime dateActivation
        +DateTime dateExpiration
        +Boolean actif
    }

    class CategorieMateriel {
        +int id
        +String nom
        +String description
        +Boolean actif
    }

    class Materiel {
        +int id
        +String nom
        +String marque
        +String modele
        +String reference
        +String numeroInventaire
        +String numeroSerie
        +StatutMateriel statut
        +String etatGeneral
        +Boolean actif
        +verifierDisponibilite()
        +changerStatut()
    }

    class Accessoire {
        +int id
        +String nom
        +String description
        +Boolean actif
    }

    class MaterielAccessoire {
        +int id
        +int materielId
        +int accessoireId
        +int quantiteAttendue
        +Boolean obligatoire
    }

    class Emprunt {
        +int id
        +DateTime dateEmprunt
        +DateTime dateRetourPrevue
        +DateTime dateRetourReelle
        +StatutEmprunt statut
        +ModeIdentification modeIdentificationEmprunt
        +ModeIdentification modeIdentificationRetour
        +String commentaireDepart
        +String commentaireRetour
        +creer()
        +enregistrerRetour()
        +cloturer()
        +marquerEnRetard()
    }

    class Checklist {
        +int id
        +TypeChecklist type
        +DateTime dateVerification
        +String commentaire
        +valider()
    }

    class ChecklistElement {
        +int id
        +String nomElement
        +EtatChecklistElement etat
        +int quantiteConstatee
        +String commentaire
    }

    class Anomalie {
        +int id
        +String type
        +String description
        +StatutAnomalie statut
        +Boolean detecteeAutomatiquement
        +String observation
        +DateTime dateDetection
        +DateTime dateResolution
        +ajouterObservation()
        +changerStatut()
        +cloturer()
    }

    class Historique {
        +int id
        +String action
        +String description
        +DateTime dateAction
    }

    class Notification {
        +int id
        +String titre
        +String message
        +String type
        +Boolean lu
        +DateTime dateCreation
        +marquerCommeLue()
    }

    class StatutMateriel {
        <<enumeration>>
        DISPONIBLE
        EMPRUNTE
        NON_CONFORME
        DETERIORE
        MAINTENANCE
        INDISPONIBLE
    }

    class StatutEmprunt {
        <<enumeration>>
        EN_COURS
        EN_RETARD
        CLOTURE
        RETOUR_NON_CONFORME
        ANNULE
    }

    class TypeChecklist {
        <<enumeration>>
        DEPART
        RETOUR
    }

    class EtatChecklistElement {
        <<enumeration>>
        PRESENT
        ABSENT
        DETERIORE
    }

    class StatutAnomalie {
        <<enumeration>>
        DETECTEE
        EN_COURS_TRAITEMENT
        RESOLUE
        CLOTUREE
    }

    class ModeIdentification {
        <<enumeration>>
        QR_CODE
        MAIL_ENSUP
    }

    Campus "1" --> "0..*" SallePret : contient
    Campus "1" --> "0..*" Utilisateur : rattache
    Campus "1" --> "0..*" Materiel : possede
    Campus "1" --> "0..*" Emprunt : localise
    Campus "0..1" --> "0..*" Historique : concerne_campus

    SallePret "1" --> "0..*" PosteEmprunt : possede
    SallePret "1" --> "0..*" Emprunt : concerne
    SallePret "0..1" --> "0..*" Historique : localise

    PosteEmprunt "1" --> "0..*" Emprunt : enregistre
    PosteEmprunt "0..1" --> "0..*" Historique : trace

    Role "1" --> "0..*" Utilisateur : attribue
    Utilisateur "1" --> "0..*" CarteEtudiante : possede

    Utilisateur "1" --> "0..*" Emprunt : effectue
    Utilisateur "1" --> "0..*" Checklist : renseigne
    Utilisateur "1" --> "0..*" Historique : declenche
    Utilisateur "1" --> "0..*" Notification : recoit

    CategorieMateriel "1" --> "0..*" Materiel : classe

    Materiel "1" --> "0..*" MaterielAccessoire : possede
    Accessoire "1" --> "0..*" MaterielAccessoire : compose

    Materiel "1" --> "0..*" Emprunt : concerne

    Emprunt "1" --> "1..2" Checklist : possede
    Checklist "1" --> "1..*" ChecklistElement : contient
    Accessoire "0..1" --> "0..*" ChecklistElement : verifie

    Emprunt "1" --> "0..*" Anomalie : genere
    Materiel "1" --> "0..*" Anomalie : concerne
    Utilisateur "1" --> "0..*" Anomalie : concerne_etudiant
    Utilisateur "0..1" --> "0..*" Anomalie : traitee_par_responsable

    Emprunt "0..1" --> "0..*" Historique : trace
    Materiel "0..1" --> "0..*" Historique : concerne

    Anomalie "0..1" --> "0..*" Notification : genere

```