CAS Supmaster
Aucun matériel ni document autorisé
Présentation du contexte
L'organisation cliente : le centre de formation d'apprentis SupMaster
SupMaster est un centre de formation d'apprentis (CFA) préparant des jeunes âgés de 18 à 25 ans au diplôme d'ingénieur. Établissement de formation professionnelle par alternance placé sous la tutelle du ministère de l'Education nationale, SupMaster est investi d'une mission de service public dont la création, le fonctionnement et les attributions sont très précisément décrits dans le livre I du code du travail. C'est au titre de cette mission de service public que le CFA perçoit de l'argent public qui couvre, en partie, ses frais de fonctionnement pédagogique.
SupMaster forme des chefs de projets (bac+5) alliant compétences techniques et managériales. Le centre couvre deux domaines : les systèmes d’information (cursus IM pour Informaticien Manager) et le multimédia (cursus MM pour Media Manager). L’aspect transversal des formations joue un rôle d’accélérateur d’employabilité pour des apprentis recrutés à bac+2. Les formations du CFA sont reconnues au niveau 1 par le RNCP (répertoire national des certifications professionnelles). SupMaster forme ses apprentis dans le cadre de contrats d’alternance pluriannuels entre l’étudiant, le CFA et une entreprise. Le principe des études consiste à effectuer une période d’un mois dans un établissement de formation SupMaster et une période d’un mois dans l’organisation.
Depuis sa création à Marseille en 2002, le centre de formation a choisi une stratégie de diversification géographique en s’implantant dans de grandes villes de France (Lyon, Lille, Paris, Strasbourg, Rennes et Bordeaux). Il forme aujourd’hui environ 300 étudiants, possède 25 salariés à temps plein, auxquels il faut ajouter 70 intervenants extérieurs qui réalisent différents enseignements dans les cursus proposés.
L'entreprise prestataire de services
SIForm est une entreprise de services du numérique (ESN) marseillaise implantée à proximité du centre de formation. Elle réalise des développements auprès de clients qu’elle démarche, ou pour ses besoins propres.
Elle compte un effectif de 6 personnes à temps plein qui interviennent dans tous les domaines de l’informatique d’aujourd’hui, et plus particulièrement les développements Web et mobiles.
Problématique du projet
Le choix exclusif de l’alternance pour tous les étudiants impose un travail important sur la reconnaissance de SupMaster par les organisations (entreprises, administrations, ou encore associations) susceptibles de fournir des contrats aux étudiants. Pour maintenir sa place dans le tissu concurrentiel des écoles du domaine des technologies de l’information et de la communication, le directeur général, Léopold C. a décidé de développer une application destinée à améliorer la notoriété du centre. Compte tenu de la stratégie de diversification géographique, les organisations situées dans les régions couvertes par chaque établissement du centre constituent la cible principale de l’action.
Ce projet est confié à SIForm. L'ESN aura pour rôle d'adapter l'existant aux exigences nouvelles de la direction générale. La proximité géographique des deux structures facilite la communication et le contrôle des travaux. Fraichement embauché-e par SIForm, vous intervenez dans plusieurs missions mises en place par l'ESN dans le cadre de ce projet.
Pour suivre ses promotions, SupMaster utilise une application qui s’appuie sur une base de données nommée Promo qui stocke l'ensemble des informations relatives aux étudiants inscrits dans un cursus.
Lors de la mise en place de cette base de données, les contrats en cours ont été intégrés mais les contrats terminés ne l’ont pas été. C’est pourquoi un attribut nbContratsOrg a été ajouté dans la table Organisation. On s’est contenté de saisir le nombre de contrats ayant été signés avec chaque organisation. Cette information est mise à jour à l’aide du déclencheur (trigger) suivant :
CREATE OR REPLACE TRIGGER ‘majNbContrats’ BEFORE INSERT ON ‘CONTRAT’ FOR EACH ROW UPDATE Organisation SET nbContratsOrg = nbContratsOrg + 1 WHERE id = :new.idOrg;
Afin de connaître le nombre de contrats que signe un étudiant lors de son passage au centre, la donnée nbContratsEtud vient d'être ajoutée dans la table Etudiant.
Le directeur souhaite effectuer un suivi des contrats. Pour cela, il a besoin :
Modifier le code du déclencheur pour mettre à jour la donnée nbContratsEtud.
Expliquer en quelques lignes quels autres déclencheurs sont nécessaires pour que les données nbContratsOrg et nbContratsEtud soient toujours exactes (l'écriture de ces déclencheurs n'est pas demandée).
Écrire les requêtes permettant d'obtenir les deux listes souhaitées.
IMPORTANT : la candidate ou le candidat présentera les évolutions de la structure de la base de données en adoptant le formalisme de son choix (schéma entité-association, diagramme de classes, ou encore schéma relationnel).
Une activité stratégique pour SupMaster consiste à prospecter les organisations susceptibles d’accueillir des étudiants. Dans le but d’améliorer la qualité de cette prospection, il a été décidé de demander à SIForm de tenir compte de nouvelles informations dans la future application.
SupMaster a décidé de faire l’acquisition d’un fichier d’adresses auprès de l’AEF (annuaire des entreprises de France). L’AEF est un service payant proposé par les CCI (chambres de commerce et de l’industrie). Les fichiers sont constitués à partir de différents critères comme la localisation des entreprises ou leur effectif. Le résultat de la recherche est fourni par l’AEF sous forme numérique ou papier.
Le responsable du projet chez SIForm a rencontré le directeur de SupMaster et retranscrit l’entretien qu’il a mené.
La future application de gestion des prospections s’appuiera sur la base de données Promo enrichie des informations nécessaires.
Concernant l’intégration des données de l’AEF, deux solutions sont envisagées :
Dans les deux cas, il est prévu d’acheter un fichier de 2500 adresses.
Proposer une modélisation de la nouvelle base de données à mettre en place en intégrant la base existante et les nouveaux besoins en informations exprimés par le directeur de SupMaster (l’ensemble de la solution proposée devra être cohérent avec le formalisme choisi).
Rédiger une courte note indiquant la meilleure solution pour l’intégration des données de l’AEF. Elle présentera le détail des calculs ainsi que la justification du choix.
IMPORTANT : la candidate ou le candidat peut choisir de présenter les éléments de code à l’aide du langage de programmation de son choix ou de pseudo-code algorithmique.
Pour prospecter les organisations, SupMaster emploie une personne par établissement. Pour faciliter le travail de ce prospecteur, une application java GestVisite est en cours d’écriture. Elle permettra notamment la saisie d’une visite par le prospecteur d’un centre SupMaster. L'exemple ci-contre, consiste à enregistrer la première visite réalisée auprès de l’organisation GRT SA située dans la région Ile de France, par Monsieur Ramirez, prospecteur de l’établissement SupMaster-Paris.
Trois points sont à traiter :
java.lang.NullPointerException at CodeSource.Organisation.ajoutVisite(Organisation.java:1) at CodeSource.GestVisite (GestVisite.java:10)
Expliquer la cause du message d'erreur apparu à la première exécution du programme GestVisite et donner la solution permettant d'y remédier.
Coder les différentes étapes permettant de réaliser la modification demandée dans la fiche PO_14.
Coder une solution permettant de calculer l’indicateur de couverture des visites d’une région.
IMPORTANT : pour les éléments de mise en forme des pages Web, le langage CSS doit être utilisé. En revanche, la candidate ou le candidat peut choisir de présenter les éléments de code à l’aide de PHP, du langage de programmation de son choix ou de pseudo-code algorithmique.
Dans le cadre du travail de refonte des applications, il est nécessaire d’ajouter au site de SupMaster une page dédiée aux organisations. Cette nouvelle rubrique devra être accessible aussi bien à partir d’un ordinateur que d’un téléphone portable, tout en gardant un temps de réponse raisonnable.
Trois solutions ont été envisagées :
Le choix s’est porté sur le développement d’un site adaptatif. Les maquettes de la page entreprise.php ont été conçues pour une consultation à l’aide d’un ordinateur et pour une consultation à l’aide d’un smartphone.
Le développement de cette page a été commencé par une de vos collègues, vous êtes chargé de le terminer.
Indiquer sur votre copie les modifications à effectuer sur le code de la page entreprise.php pour que l’image ne soit pas affichée si le client connecté utilise un smartphone.
Indiquer sur votre copie les compléments à ajouter au script styleEntreprise.php pour prendre en compte la note rédigée par votre collègue.
Rédiger une note justifiant le choix d’un site web adaptatif en comparant cette solution avec les deux autres solutions envisagées (développer deux sites web ou encore un site web et une application Android).
Modélisation conceptuelle
La modélisation conceptuelle est volontairement fournie dans les deux représentations les plus courantes.
Schéma entité-association
Diagramme de classes
Schéma relationnel
Cursus (id, libelle)
Clé primaire : id
/* Le libellé d’un cursus correspond à un choix de formation offert par le centre associé à l’année. Exemple : le cursus IM1 correspond à la 1ère année de formation d’Informaticien Manager. Tous les cursus sont disponibles au sein de chaque établissement de l’institut. */
Etudiant (id, nom, prenom, adresse, ville, nbContratsEtud, idEtablissement, idCursus)
Clé primaire : id
Clé étrangère : idCursus en référence à id de Cursus
/* La donnée idEtablissement contient le code de l’établissement fréquenté par l’étudiant. Exemple : "mar" pour "Marseille" */
Activite (codeApe, libelle)
Clé primaire : codeApe /* code correspondant à un secteur d’activité, défini par l’INSEE */
Organisation (id, nom, adresse, ville, nbContratsOrg, codeApeActivite)
Clé primaire : id
Clé étrangère : codeApeActivite en référence à codeApe de Activite
/* La donnée nbContratsOrg contient le nombre de contrats signés par l’organisation */
Contrat (id, dateContrat, caractéristiques, dateFin, idOrg, idEtudiant)
Clé primaire : id
Clé étrangère : idOrg en référence à id de Organisation
Clé étrangère : idEtudiant en référence à id de Etudiant
/* La table Contrat mémorise les informations sur les contrats signés par les étudiants et les organisations. Il y a, pour chacun, une date de signature (attribut dateContrat) et une date de fin (attribut dateFin) qui n’est pas renseignée pour les contrats en cours*/
Prix de vente | Tarifs indiqués à l'adresse par tranche selon le volume total d'adresses de la commande | Frais de gestion | |||||||
---|---|---|---|---|---|---|---|---|---|
Selon supports | De 1 à 2499 Adr. | De 2500 à 4999 | De 5000 à 9999 | De 10000 à 14999 | De 15000 à 24999 | De 25000 à 49999 | De 50000 à 99999 | Au delà de 100000 adresses | Prix facturés en euros |
Téléchargement (csv, xls) | 0,33 | 0,30 | 0,26 | 0,23 | 0,21 | 0,19 | 0,16 | 0,14 | 5 |
CD-ROM (toute quantité; csv, xls) | 0,33 | 0,30 | 0,26 | 0,23 | 0,21 | 0,19 | 0,16 | 0,14 | 30 |
Liste papier | 0,23 | 0,20 | 0,18 | 0,16 | 0,15 | 0,14 | 0,13 | 0,12 | 30 |
Etiquettes | 0,19 | 0,17 | 0,15 | 0,13 | 0,11 | 0,10 | 0,09 | 0,08 | 30 |
Exemple pour 3000 adresses sur CD-ROM : 3000 * 0,30 + 30 = 930 €.
Q : Quels sont vos principaux besoins en information pour mieux gérer votre prospection ?
R : Pour mettre en relation une entreprise et un étudiant, il y a deux aspects à considérer : la proximité géographique et la capacité de l’étudiant à répondre à la demande de l’entreprise. Actuellement, nous ne gérons ni l’un ni l’autre…
Q : Parlons géographie, vous voulez bien ?
R : Oui, bien sûr ! Chacun de nos établissements couvre une zone géographique, aussi bien pour le recrutement d’étudiants que pour la prospection d’organisations. Par exemple, l’établissement de Lyon couvre les régions Rhône Alpes, Centre et Franche-Comté.
Q : À part les régions couvertes, quelles sont les informations concernant un établissement ?
R : Très simple : nom, adresse, téléphone, e-mail et nom du responsable. Mais laissez-moi finir avec cette géographie… Nous savons dans quel établissement un étudiant est affecté. Cela devrait nous permettre de mieux cibler les recherches de contrats puisque la région d’une entreprise figure dans le fichier AEF.
Q : Quelles informations vous semblent pertinentes dans le fichier fourni par l’AEF ?
R : C’est assez basique… SIRET, nom de l'entreprise, civilité, nom et prénom du responsable légal, adresse, code postal, ville, téléphone, fax, forme juridique, code APE, code région.
Q : Le code APE correspond-il au code activité qui existe déjà dans la table "Organisation" actuelle ?
R : Oui, exactement, il s’agit de la nomenclature 2008.
Q : La forme juridique est importante ?
R : Plus ou moins, on verra par la suite. Savoir qu’un partenaire éventuel est une SNC, une SA ou une SAS sera sans doute utile un jour !
Q : SA pour "société anonyme", SNC pour "société en nom collectif", SAS pour "société par actions simplifiée". On parle bien de cela ?
R : Oui, nous sommes d’accord.
Q : Et en ce qui concerne la capacité d’un étudiant à répondre à la demande des entreprises, vous voulez parler de ses compétences ?
R : Exactement ! Les entreprises recherchent des compétences particulières. Nous y avons réfléchi… Nous avons défini 6 profils, chacun regroupant un ensemble de compétences. Au fil du temps, nous serons capables de savoir quels sont les profils intéressants pour telle ou telle organisation.
Q : Et côté étudiants ?
R : Nous allons demander à nos équipes pédagogiques de recenser et de tenir à jour la liste des compétences de chaque étudiant. Il s’agit bien sûr en général de compétences en cours d’acquisition, ils sont là pour apprendre… Mais la connaissance des compétences d’un étudiant permettra de déterminer quel(s) profil(s) il convient de cibler pour ses recherches de contrat.
Q : Vous pouvez me donner un exemple de profil ?
R : Oui, évidemment. La liste complète n’est pas encore tout à fait au point. On aura par exemple le profil n° 1 intitulé "Développement Web", le profil n° 2 "Administrateur base de données". Le premier devrait regrouper les compétences "HTML", "PHP", "JAVASCRIPT" et "CSS".
Q : D’accord… Vous voyez autre chose ?
R : Non, je crois que nous avons fait le tour de la question.
La description des classes est fournie ici à un niveau d’abstraction intermédiaire, suffisant pour la compréhension des informations principales à gérer.
public class Region { private int numero; private String nom; private Etablissement leEtablissement; // Etablissement de Supmaster couvrant la région private ArrayListlesOrganisations; // Collection des organisations prospectées ou susceptibles de l’être dans la région. public Region(int pNum, String pNom, Etablissement pEtablissement) {…} // Constructeur qui initialise les 3 premiers attributs avec les paramètres. public String getNom() {…} // retourne l’attribut nom public ArrayList getLesOrganisations() {…} // retourne l’attribut lesOrganisations public Etablissement getLeEtablissement() {…} // retourne l’attribut leEtablissement public void ajoutOrganisation(Organisation pOrganisation) {…} } public class Etablissement { private String code; private String adresse; private String prospecteur; private ArrayList lesRegions; // zone géographique couverte par l’établissement public Etablissement(String pCode, String pAdr, String pProspect) {…} // Constructeur qui initialise les 3 premiers attributs avec les paramètres. public String getCode() {…} // retourne l’attribut code public String getAdresse() {…} // retourne l’attribut adresse public String getProspecteur() {…} // retourne l’attribut prospecteur public ArrayList getLesRegions() {…} // retourne l’attribut lesRegions } public class Organisation { private String nom; private String adresse; private ArrayList lesVisites; private Region laRegion; public Organisation(String pNom, String pAdresse, Region pRegion) { this.nom = pNom ; this.adresse = pAdresse ; this.laRegion = pRegion ; } public String getNom() {…} // retourne l’attribut nom public String getAdresse() {…} // retourne l’attribut adresse public ArrayList getLesVisites() {…} // retourne l’attribut lesVisites public Region getLaRegion() {…} // retourne l’attribut laRegion public void ajoutVisite(Visite pLaVisite) { lesVisites.add(pLaVisite) ; } } public class Visite { private String dateVisite; private String prospecteur; public Visite(String pDateVisite, String pProspecteur) {…} // Constructeur qui initialise les deux attributs avec les deux paramètres public Visite(String pDateVisite) {…} //constructeur qui initialise uniquement la date public void setProspecteur(String pProspecteur) {…} // renseigne l’attribut prospecteur }
L’exemple ci-dessous permet de manipuler une collection de chaînes de caractères. Le principe est le même quel que soit le type des éléments.
ArrayList<String> mesChaines; // déclaration d'une collection de chaînes de caractères mesChaines = new ArrayList<String>(); // instanciation de la collection mesChaines.add("un"); // ajout d'une chaîne à la collection mesChaines.add("deux"); mesChaines.add("trois"); System.out.println(mesChaines.size()); // affichage du nombre d'éléments de la collection for (String uneChaine : mesChaines) { // parcours de la collection System.out.println(uneChaine); // affichage de l'élément courant } mesChaines.remove(1); // suppression du 2ème élément (indice 1) System.out.println(mesChaines.get(0)); // affichage du 1er élément (indice 0)
1. public class GestVisite extends JFrame { 2. [...] 3. // clic sur le bouton OK 4. private void btnOKActionPerformed(java.awt.event.ActionEvent evt) { 5. [...] 6. // À ce stade l’objet uneOrga contient l’organisation sélectionnée par 7. // l’utilisateur et est correctement instancié 8. Visite uneVisite = new Visite( txtSaisieDateVisite.getText(), 9. txtSaisieNomProspecteur.getText()); 10. uneOrga.ajoutVisite(uneVisite); 11. [...] 12. } 13. }
Projet : Prospect on des Organisations (PO) - Émise le : 26/02/2014 Demande de modification n° : PO_14 | ||||||
Description de la modification demandée
Fonctionnalité concernée : saisie des visites réalisées par les prospecteurs. Description : La saisie du nom du prospecteur dans la fenêtre du programme GestVisite | ||||||
Implémentation technique :
|
a. Qu'est qu’un site adaptatif ?
De plus en plus de consultations sur le web se font par l’intermédiaire d’un smartphone. Ceci pose un problème aux concepteurs de sites : comment offrir un rendu compatible avec la petite taille des écrans de mobiles ?
Deux solutions sont envisageables :
La deuxième solution définit ce qu’est un site adaptatif.
b. Comment faire ?
Une première approche consiste à faire appel aux "media queries" de CSS3. L’inconvénient est que tous les éléments de la page sont téléchargés sur le smartphone, même s’ils ne sont pas affichés, ce qui est pénalisant en termes de temps de réponse.
La deuxième approche consiste à utiliser un script PHP générant un contenu et une présentation adaptés à l’appareil connecté. Cette approche est décrite ci-dessous :
Le contenu :
La mise en forme :
c. Un exemple :
<!DOCTYPE html> <html lang="fr"> <head> <title>Exemple</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link type="text/css" rel="stylesheet" href="genererCss.php" /> </head> <body> <?php include_once("Mobile_Detect.php"); $detect= new Mobile_Detect(); echo '<p id="unTexte">'; // Identification du paragraphe unTexte if ($detect->isMobile()) echo "Petit intitulé pour mobile"; // Envoi de texte sur le flux else echo "Un intitulé très long bien adapté à l'écran d'un ordinateur classique"; echo "</p>"; ?> </body> </html>
<?php include_once("Mobile_Detect.php"); header('content-type: text/css'); $detect= new Mobile_Detect(); if ($detect->isMobile()) $taille=75; else $taille=150; echo "#unTexte { font-size:" . $taille . "%;}"; // Définition du style CSS pour l’élément unTexte // Le point ( . ) est l’opérateur // de concaténation en PHP ?>Remarque : ce script envoie du code CSS sur le flux et génère donc dynamiquement une feuille de style.
Maquette de la page entreprise.php telle qu’elle doit apparaître sur un ordinateur :
Maquette de la page entreprise.php telle qu’elle doit apparaître sur un smartphone :
Code de la page entreprise.php :
<!DOCTYPE html> <html lang="fr"> <head> <title>Entreprises</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link type="text/css" rel="stylesheet" href="styleEntreprise.php" /> </head> <body> <h2>Accueil entreprises</h2> <img src="entreprise.gif" alt="Entreprises"/> <ul> <li id="lien1"><a href="Trouver.php">Trouver un stagiaire</a></li> <li id="lien2"><a href="SignalerPedago.php">Signaler un problème pédagogique</a></li> <li id="lien3"><a href="SignalerAdmin.php">Signaler un problème administratif</a></li> <li id="lien4"><a href="Embaucher.php">Embaucher un jeune diplômé</a></li> <li id="lien5"><a href="Verser.php">Nous verser votre taxe d'apprentissage</a></li> <li id="lien6"><a href="Contacter.php">Nous contacter</a></li> </ul> </body> </html>
Fichier styleEntreprise.php :
<?php include_once("Mobile_Detect.php"); header('content-type: text/css'); ?> ul { list-style-type: none; text-align: center; } ul li { height: 50px; // Définition du style pour les items de liste background-color: aqua; padding-top: 10px; } ul li { width : 160px; } // Complément pour les items de liste : largeur de l’item 160 pixels ul li a { color: black; text-decoration: none; } <?php $detect= new Mobile_Detect(); if ($detect->isMobile()) { // Cas d’un smartphone $top = 70; for ($i=1; $i<7; $i++) { echo "#lien" . $i . " {left: 10px; top:" . $top."px; position: absolute;}"; // Génération des styles CSS pour les éléments “lien1” à “lien6” $top = $top + 70; } } else { // Cas d’un ordinateur classique } ?>
Je me suis occupé du positionnement des liens dans le cas d’un smartphone. Par contre, je n’ai pas eu le temps de gérer la différence de largeur des items de liste (220px et non 160px, cf maquettes). Il reste également à gérer le cas d’un ordinateur classique.