Aller au contenu
FUTUR BTS FuturBTS
SLAM · chapitre 1 Chapitre offert

Analyser le besoin et le modéliser

Ce que tu sauras faire : Recueillir et formaliser le besoin d'un client (acteurs, besoins fonctionnels et non fonctionnels, règles de gestion, récits utilisateur et critères d'acceptation), le modéliser en UML (cas d'utilisation et descriptions, classes d'analyse, séquence, activité), maquetter une interface ergonomique et accessible, proposer une architecture, chiffrer la solution et faire valider le modèle par le client.

2 h 15 de cours 10 exercices corrigés 10 questions de quiz
FUTUR BTS

Cherche d’abord au brouillon, puis ouvre le corrigé. Les exercices vont du plus simple au plus exigeant : les points indiquent leur difficulté. Compare ta démarche, pas seulement ton résultat.

Sauf indication contraire, les exercices se situent chez Vellacor Services Numériques (entreprise de services du numérique à Niort), qui développe et maintient KerMaint, l’application de gestion des interventions de maintenance de son client Kervanet Hôtels & Résidences (7 hôtels et résidences sur la côte atlantique). Le module de maintenance préventive étudié dans le cours sert de point de départ ; ses règles de gestion RG1 à RG9 et ses récits US1 à US6 sont ceux du cours. Prix de journée de Vellacor : cheffe de projet ou responsable technique 680 € HT, technicien ou développeur 560 € HT, alternant 400 € HT. Les diagrammes UML demandés se dessinent au brouillon ou dans un outil de modélisation, en respectant la notation UML 2.5.1.

Exercice 1

Trier les éléments du besoin

Application

Voici des phrases relevées par Sarah Cherif dans ses notes d’entretien avec Franck Guillou, responsable technique des bâtiments de Kervanet.

  1. « Le technicien doit pouvoir joindre une photo au contrôle. »
  2. « L’écran doit rester lisible en plein soleil sur la terrasse. »
  3. « Un plan désactivé ne génère plus d’intervention. »
  4. « Je veux voir, pour chaque établissement, les contrôles en retard. »
  5. « Le nom du technicien qui a validé un contrôle est une donnée personnelle ; il ne faut pas le garder indéfiniment. »
  6. « La liste des contrôles d’un établissement doit s’ouvrir en moins de 2 secondes. »
  7. « Un point de contrôle appartient à un seul plan. »
  8. « Le module doit fonctionner sur nos tablettes Android actuelles. »
  1. Classe chaque phrase dans une seule catégorie : besoin fonctionnel, exigence non fonctionnelle (précise alors la caractéristique de la norme ISO/IEC 25010:2023), règle de gestion ou contrainte juridique.

  2. Parmi ces exigences non fonctionnelles, laquelle n’est pas mesurable telle qu’elle est écrite ? Réécris-la de façon mesurable.

  3. Dans la liste suivante, indique qui ou quoi est un acteur du module, et justifie chaque refus : Mathis Le Goff ; Gwenaëlle Le Bihan, directrice administrative et financière, qui signe le devis ; la tâche planifiée qui génère les interventions chaque nuit ; l’assureur de Kervanet, qui reçoit le registre en PDF par courriel ; la messagerie qui envoie les notifications ; la base MariaDB de KerMaint.

Voir le corrigé détaillé
Phrase Catégorie Justification
1. Joindre une photo besoin fonctionnel une action que l’utilisateur doit pouvoir faire
2. Lisible en plein soleil exigence non fonctionnelle — capacité d’interaction qualité d’usage, pas une fonction
3. Plan désactivé → plus d’intervention règle de gestion règle du métier appliquée par le traitement (complète RG4)
4. Voir les contrôles en retard par établissement besoin fonctionnel consultation demandée par l’utilisateur (US2, RG7)
5. Nom du technicien, durée de conservation contrainte juridique règle de protection des données personnelles (CEJMA-08) qui deviendra une exigence
6. Liste en moins de 2 secondes exigence non fonctionnelle — efficacité de performance mesurable
7. Un point appartient à un seul plan règle de gestion contrainte sur les données (la composition du modèle)
8. Tablettes Android actuelles exigence non fonctionnelle — compatibilité environnement d’exécution imposé
  1. La phrase 2 n’est pas mesurable : « lisible en plein soleil » ne dit pas comment vérifier. Réécriture possible : « les textes et les boutons ont un contraste d’au moins 4,5 pour 1 avec leur fond, et un test de saisie d’un contrôle sur la terrasse, en plein jour, est réussi par 3 techniciens sur 3 ».

Candidat Acteur ? Raison
Mathis Le Goff non tel quel c’est une personne ; l’acteur est le rôle Technicien, qu’il joue
Gwenaëlle Le Bihan non elle décide et signe (maîtrise d’ouvrage) mais n’utilise pas le module
Tâche planifiée nocturne oui (Planificateur, acteur principal) système extérieur au module qui déclenche un cas
Assureur non il reçoit un PDF par courriel, sans interagir avec l’application ; c’est le responsable technique qui exporte
Messagerie oui (acteur secondaire) système extérieur sollicité par le module
Base MariaDB de KerMaint non elle fait partie de la solution (à l’intérieur du sujet), ce n’est pas un utilisateur extérieur
Piège

Un acteur est toujours à l’extérieur du système modélisé. Les composants de la solution (base, serveur, framework) n’en sont jamais.

Exercice 2

Lire les diagrammes UML

Application

Réponds en t’appuyant sur le diagramme de cas d’utilisation et sur le diagramme de classes d’analyse du cours.

  1. Vrai ou faux ? Justifie chaque réponse.
  1. La flèche «include» part du cas « Rechercher un équipement ».
  2. Le cas « Créer une intervention corrective » se déroule à chaque enregistrement d’un contrôle.
  3. Un responsable technique peut enregistrer un contrôle.
  4. La Messagerie déclenche la génération des interventions préventives.
  5. Le cas « Enregistrer un contrôle » est complet même sans le cas « Créer une intervention corrective ».
  1. Lis les multiplicités du diagramme de classes et réponds par une phrase :
  1. Combien de techniciens au plus peuvent réaliser une intervention ? Et au moins ?
  2. Un plan préventif peut-il n’avoir aucun point de contrôle ?
  3. Combien d’équipements un établissement peut-il contenir ?
  4. Une intervention ordinaire (corrective) peut-elle exister sans avoir été déclenchée par une intervention préventive ?
  1. Le nom de la classe Intervention n’est pas en italique. Qu’en déduis-tu ? Peut-on créer un objet Intervention qui ne soit pas une intervention préventive, et que représente-t-il ?

  2. Que signifie le losange plein entre PlanPreventif et PointControle ? Que se passe-t-il pour les points de contrôle quand un plan est supprimé ?

Voir le corrigé détaillé
  1. Faux : «include» part du cas de base (« Gérer les plans préventifs », « Enregistrer un contrôle ») et pointe vers le cas inclus « Rechercher un équipement ».
  2. Faux : c’est une extension («extend»), qui ne se déroule que si la condition est vraie (un point non conforme).
  3. Vrai : le Responsable technique est une spécialisation de Technicien (triangle creux sur Technicien) ; il hérite de ses cas.
  4. Faux : c’est le Planificateur qui déclenche la génération ; la Messagerie est un acteur secondaire, sollicitée pour notifier.
  5. Vrai : le cas étendu est complet par lui-même ; l’extension n’ajoute un comportement que sous condition.
  1. 0..1 du côté de Technicien : au plus un technicien, et aucun au minimum (intervention pas encore affectée).
  2. Non : 1..* du côté de PointControle, un plan comprend au moins un point.
  3. 0..* du côté d’Equipement : zéro, un ou plusieurs équipements.
  4. Oui : 0..1 du côté d’InterventionPreventive dans l’association « déclenche » : une intervention peut n’être déclenchée par aucune intervention préventive (une panne signalée par la réception, par exemple).
  1. Un nom en italique signalerait une classe abstraite, sans objets directs. Ici, Intervention est une classe concrète : on peut créer un objet Intervention qui n’est pas une intervention préventive ; il représente une intervention ordinaire, dite corrective (panne signalée par la réception, ou intervention créée par RG6 après un contrôle non conforme). Seule l’intervention préventive a une sous-classe, car elle seule ajoute des informations (échéance prévue, résultat).

  2. Le losange plein est une composition : un point de contrôle fait partie d’un seul plan et n’existe pas sans lui. Supprimer le plan supprime ses points de contrôle.

Exercice 3

Améliorer des récits utilisateur

Application

Pendant l’atelier du 7 octobre 2026, quatre récits ont été proposés pour le backlog produit de KerMaint.

  • R1 : « En tant que développeur, je veux ajouter une colonne actif dans la table des plans. »
  • R2 : « En tant que responsable technique, je veux gérer toute la maintenance des sept établissements. »
  • R3 : « En tant que technicien, je veux voir mes contrôles des 7 prochains jours. »
  • R4 : « En tant que responsable technique, je veux suspendre un plan pendant la fermeture d’un établissement afin de ne pas générer d’interventions inutiles. »
  1. Pour chaque récit, indique le critère INVEST qui n’est pas respecté (ou « aucun »), puis réécris les récits défectueux (R2 peut donner plusieurs récits).

  2. Rédige les critères d’acceptation de R4 au format Étant donné / Quand / Alors : un scénario nominal, un scénario de réactivation du plan et un scénario d’échec (un technicien essaie de suspendre un plan). Appuie-toi sur RG4 et RG8.

  3. Rédige un scénario d’acceptation pour la règle RG7 (échéance en retard), avec des dates précises.

Voir le corrigé détaillé
Récit Critère INVEST non respecté Réécriture
R1 Valeur (et ce n’est pas un récit utilisateur) : tâche technique, sans bénéfice visible à rattacher comme tâche au récit R4 dans le backlog du sprint
R2 Small et Estimable : beaucoup trop large, impossible à estimer ni à terminer en un sprint ; pas de « afin de » découper : « En tant que responsable technique, je veux créer un plan préventif pour un équipement afin de ne plus dépendre du tableur » ; « … je veux voir les contrôles en retard de chaque établissement afin de relancer les techniciens » ; « … je veux exporter le registre afin de le présenter à l’assureur »
R3 Valeur mal exprimée : le bénéfice manque (le récit reste testable) « En tant que technicien, je veux voir mes contrôles des 7 prochains jours afin d’organiser ma semaine »
R4 aucun —
  1. Critères d’acceptation de R4 :

Scénario 1 — suspendre un plan Étant donné le plan « Climatisation de la salle de séminaire – semestriel » du Phare de Royan, actif, d’échéance le 13/11/2026, quand Franck Guillou (profil Responsable) le suspend le 2 novembre, alors le plan devient inactif et, lors de la génération du 9 novembre à 5 h, aucune intervention préventive n’est créée pour ce plan.

Scénario 2 — réactiver le plan Étant donné ce plan inactif, quand Franck Guillou le réactive, alors le plan redevient actif et, si son échéance est dans les 7 jours, une intervention préventive est créée à la génération suivante.

Scénario 3 — droit insuffisant (RG8) Étant donné un utilisateur connecté avec le profil Technicien, quand il ouvre le plan, alors la commande « Suspendre » n’est pas proposée, et une tentative directe (adresse de la page saisie à la main) est refusée et tracée.

Astuce

Le scénario 2 pose une question au client : à la réactivation, l’échéance dépassée pendant la fermeture doit-elle être reportée ? C’est en écrivant les critères d’acceptation qu’on découvre ces trous dans les règles.

  1. Scénario pour RG7 : Étant donné le plan « Ascenseur A – contrôle mensuel » de la Corderie, d’échéance le 31/10/2026, dont l’intervention préventive est encore « ouverte », quand un utilisateur affiche la liste des échéances de la Corderie le 02/11/2026, alors cette échéance apparaît en orange avec la mention « en retard de 2 jours ». Un second scénario vérifie la limite : le 31/10/2026, la même échéance n’est pas en retard (la date du jour ne la dépasse pas).
Exercice 4

Retrouver le modèle d’une base existante

Analyse

Romain Daguet doit faire évoluer l’API KerResa (réservations), peu documentée. Il te transmet un extrait simplifié de sa base (données fictives).

CREATE TABLE client (
  id_client      INTEGER PRIMARY KEY,
  nom            VARCHAR(40) NOT NULL,
  prenom         VARCHAR(40) NOT NULL,
  email          VARCHAR(80) NOT NULL,
  telephone      VARCHAR(20),
  dernier_sejour DATE,
  fidelite       INTEGER NOT NULL DEFAULT 0 CHECK (fidelite IN (0,1))
);
CREATE TABLE reservation (
  id_resa      INTEGER PRIMARY KEY,
  id_client    INTEGER REFERENCES client(id_client) ON DELETE SET NULL,
  code_site    CHAR(3) NOT NULL,
  date_arrivee DATE NOT NULL,
  date_depart  DATE NOT NULL,
  canal        VARCHAR(12) NOT NULL
               CHECK (canal IN ('site','app','plateforme','reception'))
);
CREATE TABLE fiche_police (
  id_fiche       INTEGER PRIMARY KEY,
  id_resa        INTEGER NOT NULL REFERENCES reservation(id_resa),
  nom            VARCHAR(40) NOT NULL,
  date_naissance DATE NOT NULL,
  nationalite    VARCHAR(30) NOT NULL
);
  1. Déduis-en les classes d’analyse, avec leurs attributs typés (Texte, Entier, Date, Booléen) et leurs multiplicités d’attribut quand une valeur peut manquer. Ne reprends pas les clés étrangères comme attributs.

  2. Déduis-en les associations et leurs multiplicités, en justifiant chacune par la colonne qui la porte. Que traduit ON DELETE SET NULL dans le modèle ?

  3. Repère dans le schéma deux règles de gestion écrites sous forme de contraintes, et un lien caché que le schéma ne protège pas. Que proposes-tu ?

  4. L’attribut dernier_sejour pourrait se déduire des réservations. Comment l’indique-t-on en UML, et quel risque présente cette colonne recopiée ?

Voir le corrigé détaillé
  1. Classes d’analyse (une par table métier, sans clés étrangères) :
Classe Attributs
Client nom : Texte ; prenom : Texte ; email : Texte ; telephone : Texte [0..1] ; /dernierSejour : Date [0..1] ; fidelite : Booléen
Reservation codeSite : Texte ; dateArrivee : Date ; dateDepart : Date ; canal : Texte
FichePolice nom : Texte ; dateNaissance : Date ; nationalite : Texte

Les identifiants techniques (id_client…) ne sont pas des attributs métier en analyse ; fidelite, codé 0 ou 1, est un Booléen ; telephone peut être vide, d’où [0..1].

  1. Associations :
Association Multiplicités Justification
Client — Reservation (« effectue ») 0..1 côté Client ; 0..* côté Reservation reservation.id_client est facultatif (pas de NOT NULL) → une réservation a 0 ou 1 client ; un client a de 0 à plusieurs réservations
Reservation — FichePolice (« concerne ») 1 côté Reservation ; 0..* côté FichePolice fiche_police.id_resa est NOT NULL → une fiche concerne exactement 1 réservation ; une réservation a de 0 à plusieurs fiches (une par voyageur)

ON DELETE SET NULL traduit une règle : si un client est supprimé (par exemple à l’expiration de sa durée de conservation), ses réservations sont conservées sans lui (pour les statistiques et la comptabilité). C’est ce qui justifie la multiplicité 0..1 côté Client.

  1. Deux règles de gestion écrites en contraintes : canal IN ('site','app','plateforme','reception') (RG : une réservation provient d’un de ces quatre canaux) et fidelite IN (0,1) (adhésion au programme : oui ou non). On peut aussi citer les NOT NULL (une réservation a toujours des dates d’arrivée et de départ).

Lien caché : code_site CHAR(3) désigne un établissement (PNF, COR, ROY…), mais aucune clé étrangère ne le protège : rien n’empêche d’enregistrer « XYZ ». Dans le modèle, on fait apparaître une classe Etablissement et une association Reservation 0..* — 1 Etablissement ; dans la base, on propose une table de référence et une clé étrangère (SLAM-03). Une autre règle manque : rien n’impose date_depart > date_arrivee.

  1. Un attribut qui se calcule à partir d’autres informations est dérivé : on le note avec une barre oblique, /dernierSejour. Le risque d’une colonne recopiée est l’incohérence : si une réservation est modifiée ou annulée sans mettre à jour dernier_sejour, les deux informations divergent. Il faut soit la calculer à la demande, soit la maintenir par un traitement fiable (déclencheur, SLAM-05).
Exercice 5

Construire un diagramme de cas d’utilisation

Analyse

Kervanet envisage un second module de KerMaint : la gestion des pièces détachées. Extrait du compte rendu d’entretien avec Franck Guillou :

« Chaque établissement a une petite réserve de pièces : filtres, courroies, ampoules, joints. Aujourd’hui personne ne sait ce qu’il reste. Je voudrais que le technicien, quand il clôture une intervention, indique les pièces qu’il a utilisées et en quelle quantité ; il doit pouvoir retrouver une pièce par sa référence ou son libellé. C’est moi qui tiens le catalogue des pièces et qui fixe, par établissement, un seuil d’alerte. Quand le stock d’une pièce passe sous ce seuil après une sortie, je veux recevoir un courriel. Une fois par mois, je fais l’inventaire de chaque réserve et je corrige les quantités ; la recherche de pièce me sert aussi là. Sabrina Morel, la comptable, veut pouvoir consulter la valeur du stock par établissement à la fin de chaque mois. Les commandes aux fournisseurs, on continuera à les faire par téléphone. »

  1. Liste les acteurs (principaux et secondaires) et les cas d’utilisation, nommés selon les règles du cours.

  2. Repère une relation «include» et une relation «extend» ; pour l’extension, donne le point d’extension et la condition.

  3. Dessine le diagramme de cas d’utilisation complet (sujet, acteurs, associations, relations).

  4. Qu’est-ce qui est exclu du périmètre ? Comment le fais-tu apparaître dans les spécifications ?

  5. Rédige la description textuelle du cas « Déclarer les pièces utilisées » : acteurs, préconditions, scénario nominal, un scénario alternatif, une exception, postconditions.

Voir le corrigé détaillé
  1. Acteurs et cas :
Acteur Type Cas d’utilisation
Technicien principal Déclarer les pièces utilisées
Responsable technique principal Gérer le catalogue des pièces ; Fixer les seuils d’alerte ; Faire l’inventaire d’une réserve
Comptable principal Consulter la valeur du stock
Messagerie secondaire (sollicitée par l’extension d’alerte)

Sabrina Morel est une personne : l’acteur est le rôle Comptable. Le fournisseur n’est pas un acteur : les commandes restent hors de l’application.

  1. «include» : « Déclarer les pièces utilisées » et « Faire l’inventaire d’une réserve » incluent « Rechercher une pièce » (toujours nécessaire, mis en commun). «extend» : « Alerter le responsable » étend « Déclarer les pièces utilisées », au point d’extension « après la sortie », avec la condition {stock de la pièce inférieur au seuil de l’établissement}. La Messagerie est associée à ce cas d’extension.

  2. Diagramme attendu :

  • sujet : rectangle « KerMaint – pièces détachées » contenant tous les cas ;
  • acteurs à gauche : Technicien et Responsable technique (si on reprend la généralisation du cours, triangle creux sur Technicien) ; Comptable ;
  • acteur à droite : rectangle «actor» Messagerie ;
  • associations (traits pleins) : Technicien — Déclarer les pièces utilisées ; Responsable technique — Gérer le catalogue des pièces, Fixer les seuils d’alerte, Faire l’inventaire d’une réserve ; Comptable — Consulter la valeur du stock ; Messagerie — Alerter le responsable ;
  • «include» (pointillés, pointe ouverte) : de « Déclarer les pièces utilisées » vers « Rechercher une pièce » ; de « Faire l’inventaire d’une réserve » vers « Rechercher une pièce » ;
  • «extend» (pointillés, pointe ouverte) : de « Alerter le responsable » vers « Déclarer les pièces utilisées », dont l’ellipse porte le compartiment « extension points : après la sortie » ; une note reliée à la flèche indique la condition.

On peut aussi rattacher « Gérer le catalogue des pièces » à « Rechercher une pièce » par «include» si la modification d’une pièce commence par la retrouver.

  1. Hors périmètre : les commandes aux fournisseurs (« par téléphone »). On l’écrit explicitement dans les spécifications, dans une rubrique « Exclusions » ou en Won’t have this time dans la priorisation MoSCoW : ce qui n’est pas écrit risque d’être réclamé à la recette (CEJMA-03).

  2. Description textuelle de « Déclarer les pièces utilisées » :

Rubrique Contenu
Acteur principal Technicien
Acteur secondaire Messagerie (dans l’extension)
Préconditions technicien authentifié ; intervention qui lui est affectée, non clôturée
Scénario nominal 1. Le technicien ouvre l’intervention et choisit « Pièces utilisées ». 2. Il recherche la pièce par référence ou libellé (inclusion « Rechercher une pièce »). 3. Il saisit la quantité. 4. Il recommence 2-3 pour chaque pièce. 5. Il valide. 6. KerMaint enregistre les consommations et diminue le stock de l’établissement de l’intervention. 7. KerMaint confirme.
Scénario alternatif (point d’extension « après la sortie ») en 6, le stock d’une pièce passe sous son seuil : KerMaint déclenche « Alerter le responsable » (courriel via la Messagerie) ; reprise en 7.
Exception en 5, la quantité dépasse le stock enregistré : message « stock insuffisant : vérifier la quantité ou signaler un écart d’inventaire » ; retour en 3 (la saisie n’est pas bloquée sans fin : le responsable corrigera à l’inventaire, selon la décision prise avec le client).
Postconditions consommations liées à l’intervention ; stock mis à jour ; alerte envoyée si besoin.
Exercice 6

Évaluer une maquette et un test utilisateur

Calcul et analyse

Un premier prototype de l’écran « Échéances » de KerMaint a été réalisé par un stagiaire. Description de l’écran :

  • un tableau de 9 colonnes, police de 11 pixels ; chaque ligne est un contrôle ;
  • l’état est indiqué par une pastille colorée : verte (à jour), rouge (en retard), sans texte ;
  • pour agir sur une ligne, trois petites icônes de 20 × 20 pixels sans libellé (crayon, poubelle, horloge) ;
  • le choix de l’établissement se fait dans une liste déroulante en bas de page, sous le tableau ;
  • un appui sur la poubelle supprime le plan sans confirmation ;
  • les abréviations « NC », « P3 », « Éch. » ne sont expliquées nulle part ;
  • les autres écrans de KerMaint placent le filtre d’établissement en haut à gauche.
  1. Relève au moins six défauts et rattache chacun à un critère ergonomique ou à une règle d’accessibilité du cours. Propose une correction pour chacun.

  2. Le prototype corrigé est testé par 5 techniciens sur trois tâches : T1 « voir tes contrôles de la semaine », T2 « trouver les contrôles en retard de la Corderie », T3 « signaler qu’un contrôle a été fait par un prestataire extérieur ». Résultats : T1 réussie par 5 utilisateurs sur 5, en 40, 55, 38, 62 et 45 secondes ; T2 réussie par 2 sur 5 (en 150 et 170 secondes) ; T3 réussie par 3 sur 5. L’exigence fixée pour T1 est « en moins de 60 secondes ».

Calcule le taux de réussite de chaque tâche et le taux global, le temps moyen de T1 et le nombre d’utilisateurs hors exigence pour T1. Le temps moyen suffit-il pour conclure que l’exigence est respectée ?

  1. Quelle tâche faut-il retravailler en priorité ? Propose une hypothèse sur la cause et la façon de la vérifier.
Voir le corrigé détaillé
Défaut Critère ou règle Correction
Pastille verte ou rouge sans texte accessibilité : information par la couleur seule ajouter un libellé (« À jour », « En retard de 3 jours ») et un symbole
Icônes de 20 × 20 px accessibilité : taille des cibles (≥ 24 × 24, 44 × 44 visé) ; adaptabilité (gants) boutons d’au moins 44 × 44 px, espacés
Icônes sans libellé signifiance des codes ; guidage libellés « Modifier », « Supprimer », « Reporter »
Suppression sans confirmation gestion des erreurs ; contrôle explicite demander confirmation, ou préférer « désactiver » (le plan reste dans l’historique)
Abréviations NC, P3, Éch. signifiance des dénominations ; glossaire mots entiers du glossaire, ou légende
Filtre d’établissement en bas, alors qu’il est en haut ailleurs homogénéité ; guidage filtre en haut à gauche, comme les autres écrans
9 colonnes en 11 px sur tablette charge de travail (densité), lisibilité garder 4 ou 5 colonnes utiles, police d’au moins 14 px, détail au toucher
  1. Taux de réussite : T1 = 5 ÷ 5 = 100 % ; T2 = 2 ÷ 5 = 40 % ; T3 = 3 ÷ 5 = 60 % ; global = (5 + 2 + 3) ÷ 15 = 10 ÷ 15 ≈ 66,67 %. Temps moyen de T1 = (40 + 55 + 38 + 62 + 45) ÷ 5 = 240 ÷ 5 = 48 secondes. Un utilisateur (62 s) dépasse 60 secondes.

La moyenne ne suffit pas : l’exigence « en moins de 60 secondes » vise chaque utilisateur, et un sur cinq ne la respecte pas. Il faut préciser l’exigence avec le client (par exemple « 4 utilisateurs sur 5 en moins de 60 secondes ») et regarder pourquoi cet utilisateur a été plus lent.

  1. T2 est prioritaire : seulement 40 % de réussite, et les deux réussites ont pris 150 et 170 secondes. Hypothèse : le filtre des contrôles en retard n’est pas visible (ou l’état « en retard » ne se distingue pas assez). Vérification : observer les utilisateurs refaire la tâche en pensant à voix haute, puis tester une version avec un bouton « En retard » en tête de liste sur 3 à 5 nouveaux utilisateurs. T3 (60 %) vient ensuite : le cas « contrôle fait par un prestataire » n’est peut-être pas prévu dans le modèle, question à poser au client.
Exercice 7

Choisir entre deux solutions

Calcul et analyse

Gwenaëlle Le Bihan hésite entre deux solutions pour la maintenance préventive.

Option A — module intégré à KerMaint (devis du cours) : réalisation 13 640 € HT ; coûts internes de Kervanet la première année 1 120 € ; maintenance corrective comprise dans le forfait de tierce maintenance applicative ; provision pour petites évolutions 1 000 € HT par an à partir de la deuxième année (hypothèse).

Option B — logiciel de gestion de maintenance du marché, en SaaS (offre fictive) : abonnement de 25 € HT par utilisateur et par mois pour 13 utilisateurs (12 utilisateurs réguliers et Franck Guillou) ; paramétrage et import des 58 plans par l’éditeur 2 400 € HT ; connecteur développé par Vellacor pour recopier chaque nuit les équipements de KerMaint dans le logiciel : 4 jours de développeur ; maintenance du connecteur 500 € HT par an à partir de la deuxième année ; formation : 3 heures pour chacun des 12 utilisateurs réguliers (30 € de l’heure) et 6 heures pour Franck Guillou (40 € de l’heure) ; temps de Franck pour choisir l’offre : 10 heures (40 € de l’heure).

  1. Classe chaque coût dans les composantes du coût d’une solution vues en cours.

  2. Calcule le coût total de possession de chaque option sur 3 ans puis sur 5 ans. Présente le cumul année par année et indique à partir de quelle année l’option B devient plus chère que l’option A.

  3. Compare les deux options du point de vue de l’architecture et des données (intégration, double saisie, hébergement, données personnelles, réversibilité). Quels chapitres de CEJMA faudrait-il mobiliser pour l’option B ?

  4. Rédige en cinq lignes la recommandation que Sarah pourrait adresser à Gwenaëlle Le Bihan, en signalant les limites de la comparaison.

Voir le corrigé détaillé
Coût Composante
A : réalisation 13 640 € réalisation
A : coûts internes 1 120 € coûts internes du client
A : provision pour évolutions 1 000 €/an maintenance
B : abonnement acquisition (licence en abonnement) et exploitation (hébergement compris)
B : paramétrage et import 2 400 € réalisation
B : connecteur (4 j × 560 € = 2 240 €) réalisation
B : maintenance du connecteur 500 €/an maintenance
B : formation et choix de l’offre coûts internes du client
  1. Données et calculs :
  • Option A : 1re année = 13 640 + 1 120 = 14 760 € ; puis + 1 000 € par an.
  • Option B : abonnement annuel = 25 × 13 × 12 = 3 900 € ; coûts de départ = 2 400 + 2 240 + formation (12 × 3 × 30 + 6 × 40 = 1 080 + 240 = 1 320) + choix (10 × 40 = 400) = 6 360 € ; 1re année = 3 900 + 6 360 = 10 260 € ; puis + 3 900 + 500 = 4 400 € par an.
Année Cumul A Cumul B
1 14 760 € 10 260 €
2 15 760 € 14 660 €
3 16 760 € 19 060 €
4 17 760 € 23 460 €
5 18 760 € 27 860 €

Sur 3 ans, A coûte 16 760 € et B 19 060 € (écart de 2 300 € en faveur de A) ; sur 5 ans, A coûte 18 760 € et B 27 860 € (écart de 9 100 €). B est moins cher les deux premières années, mais devient plus cher à partir de la 3e année.

Point Option A (intégrée) Option B (SaaS)
Intégration équipements, techniciens et interventions partagés ; une seule application deux applications ; le connecteur recopie les équipements, les interventions correctives restent dans KerMaint
Double saisie aucune probable (une non-conformité doit être reportée dans KerMaint)
Hébergement serveur de Kervanet (KV-KERMAINT) chez l’éditeur ; dépend de sa disponibilité
Données personnelles dans le système de Kervanet, Vellacor sous-traitant déjà encadré nouvel acteur sous-traitant à encadrer (contrat, localisation des données)
Réversibilité données dans la base de Kervanet à négocier : export, frais de sortie

Chapitres à mobiliser pour B : CEJMA-01 (modèle SaaS, dépendance), CEJMA-03 et CEJMA-04 (contrat, niveaux de service, réversibilité), CEJMA-08 (sous-traitance des données personnelles).

  1. Exemple de recommandation : « Nous recommandons l’option A, intégrée à KerMaint : sur 3 ans, son coût total est inférieur de 2 300 € (9 100 € sur 5 ans), elle évite la double saisie et garde les données chez Kervanet. L’option B ne coûte moins que les deux premières années. Limites : les chiffres de B reposent sur une offre type et la provision d’évolutions de A est une estimation ; une fonction riche du logiciel du marché (planning des prestataires) n’a pas été valorisée. »
Exercice 8

Corriger et compléter un diagramme de classes

Analyse

Un développeur a proposé le diagramme de classes suivant pour le module de maintenance préventive (description textuelle) :

  • classe GestionDesPlans avec les opérations creerPlan(), supprimerPlan() ;
  • classe PlanPreventif avec les attributs idEquipement : Entier, periodicite : Texte, points : Texte (« brûleur ; pression ; fumées ; sécurité ») ;
  • classe Equipement reliée à PlanPreventif par une association avec 0..* du côté d’Equipement et 1 du côté de PlanPreventif ;
  • classe Ecran reliée à PlanPreventif par une association « affiche » ;
  • classe InterventionPreventive reliée à PlanPreventif par une composition dont le losange plein est du côté d’InterventionPreventive ;
  • classe Technicien avec un attribut interventions : Texte (liste des numéros d’interventions réalisées).
  1. Relève les huit erreurs de modélisation et corrige chacune en expliquant la règle du cours qu’elle enfreint.

  2. Complète le modèle du cours pour le module « pièces détachées » de l’exercice 5 :

  • une pièce a une référence, un libellé et un prix unitaire HT ;
  • chaque établissement a, pour chaque pièce qu’il stocke, une quantité en stock et un seuil d’alerte ;
  • une intervention peut consommer plusieurs pièces, chacune en une certaine quantité ; une pièce peut être consommée par de nombreuses interventions.

Dessine les classes Piece, Etablissement et Intervention (sans répéter tous leurs attributs), les associations nécessaires avec leurs multiplicités, et utilise des classes d’association là où une association porte une information. Justifie ce choix.

  1. Vérifie ton modèle sur ce cas : le 12 novembre 2026, Nadia Poitevin change la courroie de l’ascenseur A de la Corderie et utilise 1 courroie et 2 joints. Quels objets et quels liens sont créés ?
Voir le corrigé détaillé
Erreur Règle enfreinte Correction
Classe GestionDesPlans une classe d’analyse est une notion du métier, pas un traitement (nom de « gestion ») supprimer ; les opérations vont dans PlanPreventif ou dans les cas d’utilisation
Attribut idEquipement pas de clé étrangère en attribut : le lien est l’association supprimer l’attribut ; garder l’association avec Equipement
periodicite : Texte type inadapté à RG2 (des mois entiers) periodiciteMois : Entier (1, 3, 6 ou 12)
points : Texte (liste) un élément qui a ses propres caractéristiques devient une classe classe PointControle (ordre, libelle), composée par PlanPreventif 1..*
Multiplicités Equipement/Plan inversées la multiplicité se lit depuis un objet d’en face 1 du côté d’Equipement, 0..* du côté de PlanPreventif
Classe Ecran élément technique d’interface, pas une notion métier supprimer du diagramme d’analyse (il apparaît dans la séquence comme participant)
Composition, losange côté InterventionPreventive le losange se place côté tout, et une intervention n’est pas une partie d’un plan (elle reste dans l’historique) association simple « génère », 1 côté plan, 0..* côté intervention
interventions : Texte dans Technicien même erreur que les clés étrangères : un lien est une association association Technicien 0..1 — 0..* Intervention
  1. Modèle complété :
  • Piece : reference : Texte ; libelle : Texte ; prixUnitaireHT : Décimal.
  • Association Etablissement — Piece « stocke », multiplicités 0..* côté Piece et 0..* côté Etablissement, avec la classe d’association StockPiece : quantite : Entier ; seuilAlerte : Entier.
  • Association Intervention — Piece « consomme », 0..* côté Piece et 0..* côté Intervention, avec la classe d’association Consommation : quantite : Entier.

La quantité en stock n’est ni une caractéristique de la pièce (elle varie selon l’établissement) ni de l’établissement (elle varie selon la pièce) : elle appartient au couple (établissement, pièce), donc à l’association. De même, la quantité consommée appartient au couple (intervention, pièce). La classe d’association se dessine comme une classe reliée au trait de l’association par des pointillés.

  1. Objets et liens créés le 12/11/2026 : une intervention (ordinaire, corrective) sur l’équipement « Ascenseur A » (Corderie), réalisée par Nadia Poitevin ; deux liens « consomme » de cette intervention, chacun avec un objet Consommation : courroie (quantite = 1) et joint (quantite = 2). Les objets StockPiece (Corderie, courroie) et (Corderie, joint) existent déjà ; leurs quantités diminuent de 1 et de 2. Aucun nouvel objet Piece ni Etablissement n’est créé.
Piège

Ne crée pas une classe « Stock » reliée seulement à Piece : tu perdrais l’information « dans quel établissement ». Quand une donnée dépend de deux classes à la fois, pense à la classe d’association.

Exercice 9

Modéliser la génération nocturne

Analyse

On s’intéresse au cas « Générer les interventions préventives » (RG4). Chaque nuit à 5 h, le Planificateur demande au contrôleur de génération (: CtrlGeneration) de lancer le traitement. Le contrôleur demande la liste des plans actifs (: PlanPreventif, collection de plans). Pour chaque plan, il vérifie l’échéance et l’absence d’intervention non clôturée ; si les deux conditions sont remplies, il crée une intervention préventive puis envoie sans attendre une notification au technicien par la Messagerie. On retient la condition « échéance ≤ date du jour + 7 jours », qui génère aussi une intervention pour une échéance déjà dépassée.

  1. Dessine le diagramme de séquence de ce cas (cadre sd, lignes de vie, messages synchrones et réponses, message de création, message asynchrone, fragments loop et opt avec leurs gardes).

  2. Un camarade a dessiné le même diagramme avec : les noms des lignes de vie soulignés ; une réponse en trait plein à pointe pleine ; l’envoi à la Messagerie avec une pointe pleine ; le message de création arrivant au milieu de la ligne de vie de l’intervention, déjà présente en haut du diagramme. Corrige chaque point.

  3. Dessine le diagramme d’activité du même traitement (nœud initial, actions, décision et fusion pour la boucle sur les plans, fin d’activité).

  4. Applique RG4 au jeu d’essai suivant, pour l’exécution du lundi 9 novembre 2026 à 5 h, et indique pour chaque plan si une intervention est créée.

Plan Libellé Prochaine échéance Actif Intervention non clôturée pour ce plan
P1 Chaudière principale – entretien annuel (Port-Neuf) 16/11/2026 oui non
P2 Ascenseur A – contrôle mensuel (Corderie) 30/11/2026 oui non
P3 Chaudière principale – contrôle mensuel (Port-Neuf) 10/11/2026 oui oui (créée le 03/11)
P4 Extincteurs – contrôle annuel (Fort Vauban) 05/11/2026 oui non
P5 Climatisation de la salle de séminaire – semestriel (Phare de Royan) 13/11/2026 non non
P6 Ascenseur B – contrôle mensuel (Port-Neuf) 15/11/2026 oui non (la précédente a été clôturée le 14/10)
  1. Le plan P4 a été créé le 2 novembre avec une échéance déjà passée. Que révèle ce cas sur la formulation initiale de RG4 (« dont l’échéance tombe dans les 7 jours ») ? Propose une formulation sans ambiguïté et le test de recette correspondant.
Voir le corrigé détaillé
  1. Diagramme de séquence attendu, dans l’ordre de haut en bas :
  • cadre sd Générer les interventions préventives ;
  • lignes de vie : Planificateur (acteur), : CtrlGeneration, : PlanPreventif (les plans), Messagerie (acteur secondaire, ou : Messagerie) ; la ligne de vie : InterventionPreventive n’apparaît qu’à sa création ;
  • message synchrone (pointe pleine) Planificateur → CtrlGeneration : generer(dateDuJour) ;
  • message synchrone CtrlGeneration → PlanPreventif : plansActifs(), puis réponse en pointillés : plans = plansActifs() ;
  • fragment loop [pour chaque plan actif] contenant :
    • message synchrone CtrlGeneration → plan : aGenerer(dateDuJour) et sa réponse a = aGenerer ;
    • fragment opt [a = vrai] (échéance ≤ date du jour + 7 et aucune intervention non clôturée) contenant : message de création (pointillés, pointe ouverte) CtrlGeneration → : InterventionPreventive, qui arrive sur la tête de la nouvelle ligne de vie : créer(plan, 3) ; puis message asynchrone (trait plein, pointe ouverte) CtrlGeneration → Messagerie : notifier(technicien, intervention) ;
  • réponse finale CtrlGeneration → Planificateur : generer : nombre d'interventions créées.
  1. Corrections :
  • noms des lignes de vie non soulignés : le soulignement des objets appartient à UML 1 ; en UML 2, la tête contient nom : Type sans soulignement ;
  • une réponse se dessine en pointillés ;
  • l’envoi à la Messagerie n’attend pas de résultat : message asynchrone, pointe ouverte ;
  • le participant créé n’existe pas avant sa création : sa tête est placée à la hauteur du message de création, qui arrive dessus.
  1. Diagramme d’activité attendu : nœud initial → « Lire les plans actifs » → fusion (losange) → décision [reste un plan] / [plus de plan] ; sur [reste un plan] : « Prendre le plan suivant » → décision [échéance ≤ jour + 7 et aucune intervention ouverte] → « Créer l’intervention préventive » → « Envoyer la notification » → retour à la fusion ; [sinon] → retour direct à la fusion ; sur [plus de plan] : « Journaliser le nombre d’interventions créées » → fin d’activité. Les gardes de chaque décision sont exclusives et couvrent tous les cas.

  2. Date limite = 9/11/2026 + 7 jours = 16/11/2026.

Plan Échéance ≤ 16/11 ? Actif ? Pas d’intervention ouverte ? Résultat
P1 oui (16/11, limite incluse) oui oui créée
P2 non (30/11) oui oui non
P3 oui (10/11) oui non (créée le 03/11) non : éviterait un doublon
P4 oui (05/11, déjà passée) oui oui créée, et affichée en retard (RG7)
P5 oui (13/11) non oui non
P6 oui (15/11) oui oui (la précédente est clôturée) créée

Trois interventions sont créées (P1, P4, P6), donc trois notifications.

  1. La formulation « dont l’échéance tombe dans les 7 jours » laisse croire qu’une échéance passée n’est pas concernée : P4 ne serait jamais générée et le contrôle serait oublié, précisément ce que le module doit empêcher. Formulation proposée : « chaque nuit à 5 h, une intervention préventive est créée pour chaque plan actif dont l’échéance est antérieure ou égale à la date du jour + 7 jours, sauf s’il existe déjà une intervention non clôturée pour ce plan ». Test de recette : « Étant donné un plan actif d’échéance le 05/11/2026 sans intervention, quand la génération s’exécute le 09/11/2026, alors une intervention préventive est créée et l’échéance apparaît en retard. »
Exercice 10

Entraînement E6 : faire évoluer le module de maintenance

Entraînement E6

Format de l’épreuve E6 (pratique et orale) : à partir d’une de tes réalisations professionnelles, la commission rédige une expression de besoins. Phase 1 : 30 minutes de préparation, puis 20 minutes d’entretien sur ton analyse du besoin, tes spécifications techniques, tes choix d’outils et ta démarche (la commission peut ajuster sa demande). Phase 2 : 1 heure de réalisation en autonomie sur l’environnement du centre d’examen, puis 20 minutes de recette et d’entretien d’explicitation. Tu es Sarah Cherif ; ta réalisation présentée est l’analyse et le prototype du module de maintenance préventive de KerMaint (le cours).

Annexe 1 — Expression de besoins rédigée par la commission

Après la validation des spécifications, Franck Guillou formule deux nouvelles demandes.

  1. Échéances de fin de mois : « Pour les contrôles mensuels prévus le dernier jour du mois (ascenseur A de la Corderie, échéance de départ le 31/10/2026), je veux que l’échéance reste toujours le dernier jour du mois. Avec votre règle, j’obtiens le 30 novembre, puis le 30 décembre, puis le 30 janvier : ça glisse. »
  2. Indicateur de ponctualité : « Je veux voir, par établissement et sur une période choisie, le taux de contrôles faits à l’heure, c’est-à-dire réalisés au plus tard le jour de l’échéance. »

Livrables attendus : en phase 1, ton analyse et tes propositions ; en phase 2, l’évolution du modèle, une fonction PHP de calcul d’échéance avec son jeu de tests exécuté, et la vérification de l’indicateur sur des données réelles.

Annexe 2 — Rappels du modèle

RG3 : échéance suivante = échéance précédente + périodicité ; si ce jour n’existe pas dans le mois obtenu, dernier jour de ce mois. Classe PlanPreventif : libelle, periodiciteMois, prochaineEcheance, actif ; opération echeanceSuivante(). Environnement : PHP 8.3, framework de KerMaint, base MariaDB.

Annexe 3 — Extrait du classeur des contrôles de Kervanet (septembre-octobre 2026)

Établissement Échéance Réalisé le
Port-Neuf 04/09/2026 03/09/2026
Port-Neuf 15/09/2026 18/09/2026
Port-Neuf 01/10/2026 30/09/2026
Port-Neuf 15/10/2026 15/10/2026
Corderie 10/09/2026 09/09/2026
Corderie 30/09/2026 06/10/2026
Corderie 10/10/2026 12/10/2026
Phare de Royan 20/09/2026 18/09/2026
Phare de Royan 05/10/2026 05/10/2026
Phare de Royan 20/10/2026 16/10/2026
Remblai (Les Sables-d’Olonne) 25/09/2026 14/10/2026
Remblai (Les Sables-d’Olonne) 09/10/2026 08/10/2026

Travail à faire — phase 1 (analyse et choix)

  1. Reformule chaque demande en récit utilisateur avec ses critères d’acceptation, et classe-la (besoin fonctionnel, règle de gestion, exigence non fonctionnelle).

  2. Explique pourquoi l’échéance « glisse » avec RG3. Propose une nouvelle règle RG3 bis qui ne glisse pas, et montre son effet sur les cinq échéances qui suivent le 31/10/2026, comparées à celles de RG3.

  3. Indique les modifications du modèle (attributs, opérations, éventuellement classe) qu’entraînent les deux demandes, et l’impact sur les plans existants.

  4. Précise la démarche et les outils que tu utiliseras en phase 2, et les questions que tu poserais à la commission (qui joue le client) avant de réaliser.

Travail à faire — phase 2 (réalisation et recette)

  1. Écris en PHP une fonction echeance(DateTimeImmutable $depart, int $mois, int $k): DateTimeImmutable qui renvoie la k-ième échéance d’un plan selon RG3 bis, et refuse une périodicité autre que 1, 3, 6 ou 12 mois.

  2. Rédige un cahier de recette d’au moins six cas (numérotés à partir de MP-15) couvrant les fins de mois, une année bissextile, le rang 0 et une périodicité refusée ; exécute-le et présente le résultat.

  3. Calcule, à partir de l’annexe 3, le taux de contrôles faits à l’heure par établissement et pour l’ensemble, et liste les contrôles en retard avec leur nombre de jours de retard.

  4. Prépare les réponses aux questions de la commission pendant la recette :

  1. « Pourquoi ne pas avoir simplement utilisé modify('+1 month') de PHP ? »

  2. « Comment saurez-vous que votre changement n’a rien cassé dans les plans existants ? »

  3. « Votre indicateur compte-t-il les contrôles pas encore faits dont l’échéance est passée ? »

Voir le corrigé détaillé

Phase 1

  1. Récits et classement :
  • Demande 1 (règle de gestion, qui modifie RG3) : « En tant que responsable technique, je veux qu’un plan mensuel prévu le dernier jour du mois garde une échéance au dernier jour de chaque mois afin que le calendrier des contrôles ne glisse pas. » Critère : « Étant donné un plan mensuel de départ le 31/10/2026, quand on calcule ses cinq échéances suivantes, alors on obtient 30/11/2026, 31/12/2026, 31/01/2027, 28/02/2027 et 31/03/2027. »
  • Demande 2 (besoin fonctionnel, avec une règle de calcul) : « En tant que responsable technique, je veux voir par établissement le taux de contrôles faits à l’heure sur une période afin de repérer les sites qui décrochent. » Critère : « Étant donné les 12 contrôles de l’annexe 3, quand j’affiche septembre-octobre 2026, alors Port-Neuf affiche 75 %, la Corderie 33,33 %, Royan 100 %, Remblai 50 %, l’ensemble 66,67 %. » Exigence non fonctionnelle associée : affichage en moins de 2 secondes.
  1. Avec RG3, chaque échéance est calculée à partir de la précédente. Quand on passe par un mois de 30 jours, le 31 devient 30, et le jour 30 est ensuite conservé pour tous les mois suivants : l’information « dernier jour du mois » est perdue. RG3 bis : la k-ième échéance d’un plan = date de départ + k × périodicité ; si le jour de départ n’existe pas dans le mois obtenu, on prend le dernier jour de ce mois. Le jour de référence reste celui de la date de départ.
k RG3 bis (ancrée) RG3 (en chaîne)
1 30/11/2026 30/11/2026
2 31/12/2026 30/12/2026
3 31/01/2027 30/01/2027
4 28/02/2027 28/02/2027
5 31/03/2027 28/03/2027
  1. Modifications du modèle :
  • PlanPreventif : ajouter dateDepart : Date et rangEcheance : Entier (k de la prochaine échéance) ; prochaineEcheance devient un attribut dérivé (/prochaineEcheance), calculé par echeance(k) ; l’opération avancerEcheance() incrémente le rang.
  • Indicateur : opération de calcul sur Etablissement, ou requête de consultation ; il exige que l’intervention préventive garde son échéance prévue et sa date de réalisation (ajouter dateRealisation : Date [0..1] à InterventionPreventive si elle n’existe pas).
  • Plans existants : il faut leur donner une date de départ et un rang. Pour ne pas les décaler, on prend comme départ leur prochaine échéance actuelle et un rang 0 : aucun contrôle déjà planifié ne change de date.
  1. Démarche et outils : mettre à jour les règles et le diagramme de classes (outil de modélisation) ; écrire la fonction en PHP 8.3 dans l’environnement du centre ; écrire d’abord le cahier de recette (cas de fin de mois, année bissextile) puis le code ; exécuter les tests ; calculer l’indicateur sur l’annexe 3 et comparer. Questions à poser à la commission (le client) : un plan qui démarre un 30 doit-il rester au 30, ou passer au dernier jour du mois (il faudrait alors une option « fin de mois ») ? Pour l’indicateur, un contrôle non encore réalisé dont l’échéance est passée compte-t-il comme « pas à l’heure » ? La période se choisit-elle sur l’échéance ou sur la date de réalisation ?

Phase 2

  1. Fonction (PHP 8.3) :
function echeance(DateTimeImmutable $depart, int $mois, int $k): DateTimeImmutable
{
    if (!in_array($mois, [1, 3, 6, 12], true) || $k < 0) {
        throw new InvalidArgumentException("Paramètres refusés : $mois mois, rang $k");
    }
    $debutMois = $depart->modify('first day of this month')->modify('+' . ($mois * $k) . ' months');
    $jour = min((int) $depart->format('j'), (int) $debutMois->format('t'));
    return $debutMois->setDate((int) $debutMois->format('Y'), (int) $debutMois->format('n'), $jour);
}

On se place au premier jour du mois de départ (qui existe toujours), on ajoute k × périodicité mois, puis on choisit le plus petit entre le jour de départ et le nombre de jours du mois obtenu (t).

  1. Cahier de recette et résultat de l’exécution :
Cas Données Résultat attendu
MP-15 départ 31/10/2026, 1 mois, k = 2 31/12/2026
MP-16 départ 31/10/2026, 1 mois, k = 4 28/02/2027
MP-17 départ 30/11/2027, 3 mois, k = 1 29/02/2028 (année bissextile)
MP-18 départ 16/11/2026, 12 mois, k = 1 16/11/2027
MP-19 départ 31/08/2026, 6 mois, k = 3 29/02/2028
MP-20 départ 31/10/2026, 1 mois, k = 0 31/10/2026
MP-21 départ 31/10/2026, 2 mois, k = 1 refus (périodicité interdite)
MP-15 : 2026-10-31, 1 mois, k = 2 -> 2026-12-31 conforme
MP-16 : 2026-10-31, 1 mois, k = 4 -> 2027-02-28 conforme
MP-17 : 2027-11-30, 3 mois, k = 1 -> 2028-02-29 conforme
MP-18 : 2026-11-16, 12 mois, k = 1 -> 2027-11-16 conforme
MP-19 : 2026-08-31, 6 mois, k = 3 -> 2028-02-29 conforme
MP-20 : 2026-10-31, 1 mois, k = 0 -> 2026-10-31 conforme
MP-21 : Paramètres refusés : 2 mois, rang 1 -> conforme
7 tests conformes sur 7
  1. Indicateur (contrôle à l’heure si réalisé le jour de l’échéance ou avant) :
Établissement À l’heure / total Taux
Port-Neuf 3 / 4 75 %
Corderie 1 / 3 33,33 %
Phare de Royan 3 / 3 100 %
Remblai 1 / 2 50 %
Ensemble 8 / 12 66,67 %

Contrôles en retard : Port-Neuf, échéance 15/09, 3 jours ; Corderie, 30/09, 6 jours ; Corderie, 10/10, 2 jours ; Remblai, 25/09, 19 jours. Les cas « réalisé le jour même » (Port-Neuf 15/10, Royan 05/10) comptent à l’heure : c’est un cas limite à faire figurer dans les critères d’acceptation.

  1. Réponses à la commission :
  1. modify('+1 month') déborde sur le mois suivant quand le jour n’existe pas : en PHP 8.3, le 31/10/2026 + 1 mois donne le 01/12/2026, et le 31/01/2027 + 1 mois le 03/03/2027. Le calcul doit partir du premier jour du mois, puis ramener le jour au dernier jour possible.

  2. Par des tests de non-régression : les cas MP-01 à MP-14 de la recette initiale sont rejoués, et une vérification compare, pour chaque plan existant, la prochaine échéance avant et après la migration (elle doit être identique, puisque le rang 0 part de l’échéance actuelle). Ces tests sont automatisés et intégrés au dépôt (SLAM-10, SLAM-11).

  3. Non, pas dans le calcul présenté : il ne porte que sur les contrôles réalisés. Un contrôle en retard non encore fait est pourtant le pire cas. Je propose de le compter comme « pas à l’heure » dès que son échéance est dépassée, et de l’afficher à part ; c’est une règle à faire valider par Franck Guillou avant le développement.

À retenir

À l’E6, la commission évalue autant la démarche que le résultat : reformuler le besoin, poser les bonnes questions au client, écrire les tests avant le code, montrer qu’ils passent et expliquer ce qui n’a pas été fait.

Prêt pour le quiz ?

10 questions pour vérifier que tout est acquis.

Faire le quiz