Stage 2026
Stage — Gestion des clés des Andelys
Application Web interne pour tracer les remises et retours de clés, avec scan de codes, historique, dashboard et parcours mobile.
Compétences mobilisées — Bloc 1
Support et mise à disposition de services informatiques
C1
Gérer le patrimoine informatique
- C1.1 Recenser et identifier les ressources numériques
- C1.6 Vérifier le respect des règles d'utilisation des ressources numériques
C2
Répondre aux incidents et aux demandes d'assistance et d'évolution
- C2.3 Traiter des demandes concernant les applications
C3
Développer la présence en ligne de l'organisation
- C3.3 Participer a l'évolution d'un site Web exploitant les données de l'organisation
C4
Travailler en mode projet
- C4.1 Analyser les objectifs et les modalites d'organisation d'un projet
- C4.2 Planifier les activités
C5
Mettre a disposition des utilisateurs un service informatique
- C5.2 Déployer un service
- C5.3 Accompagner les utilisateurs dans la mise en place d'un service
Contexte
Le projet répond au besoin de la Mairie des Andelys de fiabiliser la remise de clés aux agents, prestataires et intervenants exterieurs. L'application remplace un suivi manuel par un parcours de scan ou de saisie, puis conservé la cle, l'emprunteur, les dates et le retour dans un historique.
Une interface mobile permet de réaliser les actions rapides au guichet. Le projet prend aussi en compte la protection des données : les informations de l'emprunteur restent dans les operations d'emprunt et ne sont pas gérées comme un annuaire de personnes.
Environnement technologique
React TanStack Start TanStack Router Prisma PostgreSQL Docker Code-barres / QR PWA mobile
Preuves
Captures et documents
obligatoiresecteurs -> clés -> emprunts
Emprunt : cle, emprunteur, date_emprunt, date_retour, statut
Historique conservé après le retour Détails techniques
Scan ou saisie manuelle
-> resolution de la cle / du trousseau
-> vérification de la disponibilité
-> enregistrement de la remise ou du retour
-> mise à jour du dashboard const agent = (input.agent ?? '').trim().slice(0, 120) || 'Agent non identifie'
await client.auditLog.create({
data: {
action: input.action,
entite: input.entite,
cible: input.cible.slice(0, 200),
détails: input.détails?.slice(0, 500) || null,
agent,
},
})