Rapport de Stage CPAM Limoges – Janvier
Transcription
Rapport de Stage CPAM Limoges – Janvier
Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges Rapport de Stage CPAM Limoges – Janvier / Février 2015 Page 1 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges Table des matières I. Introduction................................................................................................................3 II. Présentation de l’entreprise......................................................................................4 III. Présentation des besoins..........................................................................................5 IV. Description des travaux réalisés...............................................................................6 IV – A. MCD.................................................................................................................... 6 IV – B. Gestion des Interfaces........................................................................................7 IV – C. Gestion des Indicateurs....................................................................................14 V. Matériels et outils utilisés........................................................................................19 Page 2 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges I. Introduction Ce stage s’est déroulé au cours de ma deuxième année de BTS SIO au sein de la Caisse Primaire d’Assurance Maladie de Limoges. Je n’ai pas été seul pour réaliser le projet de stage. Nous étions trois stagiaires, tous de la même classe de BTS SIO. Mes collègues de stage étaient Théo Lohues et Bastien Grassaud. Page 3 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges II. Présentation de l’entreprise La CPAM se trouve dans la sous-hiérarchie de la CNAMTS comme étant la Caisse Nationale d’Assurance Maladie des Travailleurs Salariés. Elle gère les risques maladie, maternité, invalidité et décès, et dans le cadre d’une gestion distincte, les accidents du travail et les maladies professionnelles. Sa position à la tête de l’Assurance maladie lui permet de coordonner le fonctionne ment des organismes locaux et d’organiser, avec leur soutien, une action sanitaire et sociale importante. La CNAMTS définit les orientations et pilote le réseau d’organismes chargés de les mettre en œuvre tels la CPAM de Limoges. Par ailleurs, la CPAM est chargée de la mise en œuvre des accords conventionnels passés entre l'Assurance Maladie et les syndicats représentatifs des Professionnels de Santé. Elle exerce également un rôle de prévention et d'éducation sanitaire (Centre d'Examens de Santé, actions de dépistage ciblées …). Elle est gérée par un Conseil et une équipe de Direction. La Caisse d'assurance maladie de Limoges (autrement appelée CPAM de Limoges ou sécurité sociale de Limoges) est l'organisme où l’on peut avoir des informations sur les démarches de remboursement, sur nos droits (voir ci-dessus). Elle se situe au 22, avenue Jean-Gagnant à Limoges depuis 1981. Dirigée depuis février 2015 par Mme. Pelletier. Dans ses locaux, on peut dénombrer le personnel au nombre de 360 personnes et plusieurs services intégrés dont le SEI, Services d’Études et d’Informatique de l’organisme conduit par Mr. MINGO. Le SEI exploite et développe le Système d’Information de la CPAM de la Haute-Vienne. L’enjeu clef du système d’information est la performance de l’entreprise. Les meilleures pratiques de gestion des Services Informatiques (IT) organisent les activités par processus et définissent un ensemble d’indicateurs permettant de mesurer l’atteinte des objectifs. Le SEI s’est engagé dans l’adoption du Référentiel ITIL, pour gérer efficacement l’ensemble des Service IT, qu’elle fournit. Comme dans toute démarche, la mise en place doit s’accompagner de l’adhésion des parties prenantes (sponsors, équipes, etc …), ce qui implique des actions de communications. Un certains nombres d’outils de communication ont d’ores et déjà été déployés. Le Tableau De Bord des Services Informatiques au-delà d’être un support de communication, se veut être un outil de pilotage et de contrôle des activités informatiques. Le pilotage est nécessaire pour s’assurer que les décisions actuelles préparent bien l’avenir. Quant au contrôle, il permet de mesurer l’écart entre ce qui a été prévu et ce qui a été réalisé. Les activités sont : la collecte, le traitement, la présentation des données. Les gains attendus permettront de donner aux décideurs et utilisateurs une vision globale sur les services IT et leur bonne délivrance. L’automatisation du « reporting » doit permettre d’agir de façon proactive sur l’organisation et les services et de s’assurer qu’ils sont alignés sur les objectifs stratégiques de l’entreprise. Page 4 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges III. Présentation des besoins Afin d’avoir un meilleur suivi du support du service informatique et de leurs projets, la CPAM avait besoin d’un outil capable de réaliser des indicateurs, sous la forme de graphiques ou de tableaux, en récupérant des données provenant d’autres applications, comme GLPI, ou ayant été saisi dans une base de données. Le développement d’une telle application est nécessaire pour améliorer les performances de l’entreprise. Grâce à cette application, les utilisateurs peuvent avoir une vision globale des services informatiques. C’est ainsi qu’est venu l’idée de l’applicatif Tableau de Bord des Services Informatiques, que j’abrégerais en TDB-SI dans la suite de ce rapport. Page 5 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges IV. Description des travaux réalisés L’application a dû être réalisée selon la structure MVC (Modèle-Vue-Contrôleur). Pour ma part mon stage c’est limité à trois travaux principaux : la réalisation du MCD, la gestion des interfaces et la gestion des indicateurs. Ces deux gestions prévoient la création, la modification, la consultation et la suppression des éléments. A. MCD Ce travail a été réalisé avec Bastien. Nous avions un dictionnaire de données et il nous a fallu réunir les différentes données dans des tables. Le MCD contient beaucoup de tables mais voici celles que j’ai le plus utilisé. interface : ID, NOM, VERSION, ACTIVE, SOURCE_ID, DESCRIPTION interface_structure : ID, INTERFACE_ID, OBJET_ID, DATACOL_ID, NUM_COLONNE, IS_ID, IS_SELECTED, DESCRIPTION interface_structure_lien : INTERF_STRUCT_ID, INTERF_STRUCT_ETRANGER indicateur : ID, REFERENCE, NOM, MODEAFFICHAGE_ID, PROCESSUS, FAMILLE_ID, DESCRIPTION, TYPE_INDICATEUR_ID, PERIODICITE, UNITEMESURE_ID, INTERFACE_ID indicateur_structure : ID, INDICATEUR_ID, INTERF_STRUCT_ID, TYPE, OPERATION, CRITERE, GROUPEMENT, VISIBLE, NOMCOLONNE, IS_PERIODE, IS_METIER, CRITERESAISIE, PLACEMENT, POSITION La récupération des données de la base en PHP se fait par l’utilisation de classes PHP. Exemple avec la Classe ModeAffichage : class ModeAffichage{ private $ID; private $NOM; //Constructeur de la classe public function __construct($NOM=NULL, $ID = 0){ if(!empty($NOM)) { $this->ID = $ID; $this->NOM = $NOM; Page 6 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges } } public function getId(){ //Retourne l’identifiant return $this->ID; } public function getNom(){ //Retourne le nom return $this->NOM; } //Retourne un tableau de ModeAffichage public static function getAll($where = array(), $order = array()){ $retour = array(); $dao = Dao::getLink(); //Récupère l’objet PDO $query = "SELECT * FROM modeaffichage"; if(!empty($where)){ //Permet d’ajouter un where $query .= Requete::where($where); } if(!empty($order)){ //Permet d’ajouter un order $query .= Requete::orderBy($order); } $prep = $dao->prepare($query); $prep->execute(); $retour = $prep->fetchAll(PDO::FETCH_CLASS,'ModeAffichage'); //PDO::FETCH_CLASS permet de spécifier que l’on souhaite un résultat en forme d’objet return $retour; } } B. Gestion des Interfaces Page 7 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges Avant d’aller plus loin il faut définir ce qu’est une Interface. Une Interface est un objet qui permet de récupérer les données d’une application, GLPI par exemple, et de mettre ses données dans la base de données du TDB-SI. La création d’une Interface implique la création de nombreux éléments. Lorsque l’utilisateur souhaite créer une Interface, le formulaire est en trois étapes. La création d’une Interface ne fonctionne que pour les fichiers issus de GLPI. Etape 1 – L’Interface et sa source Il s’agit ici de sélectionner la source de l’interface. Cette source peut être un fichier ou une table que l’utilisateur remplit. Une source possède un type, un nom, et éventuellement un fichier et un paramètre d’accès. Ce dernier permet ensuite de récupérer automatiquement le fichier si celui-ci est présent dans le dossier d’import. Lorsque l’utilisateur clique sur Valider et qu’il a sélectionné un fichier provenant de GLPI, le serveur importe les différentes données du fichier grâce à un code basé sur le travail de Bastien. Les différents objets de GLPI sont insérés dans la table objets, la structure de chaque objet dans interface_structure et les différentes valeurs dans interface_valeur. Code permettant l’import des données (PHP) : $stade = 2; //On vérifie que la source choisi nécessite un fichier if($_POST['typesource'] == 0){ //On vérifie si le fichier a bien été envoyé if($_FILES['fichierImporte']['error'] == UPLOAD_ERR_OK){ move_uploaded_file($_FILES['fichierImporte']['tmp_name'], $_FILES['fichierImporte']['name']); $msg = "<div class='zone-message'>Le téléchargé</div><br/><br/>"; Page 8 / 20 fichier a bien SOURCE_DIR."/". été Rapport de Stage ["extension"]; $extension Thuillier-Le Gac Pierre = CPAM - Limoges ".".pathinfo(SOURCE_DIR."/".$_FILES['fichierImporte']['name']) } else{ switch($_FILES['fichierImporte']['error']){ case UPLOAD_ERR_FORM_SIZE : case UPLOAD_ERR_INI_SIZE : $m = "Le fichier est trop lourd pour être importé"; break; case UPLOAD_ERR_PARTIAL : $m = "Le fichier n'a été que partiellement télécharg´"; break; case UPLOAD_ERR_NO_FILE : $m = "Aucun fichier n'a été téléchargé"; break; default: $m = "Une erreur inconnue est survenu. Code Erreur : ". $_FILES['fichierImporte']['error']; break; } $msg = "<div class='zone-alerte'>".$m."</div><br/><br/>"; $stade = 1; } else{ } $extension = ".sql"; } //Si on n'a pas eu de problèmes pour récupérer le fichier if($stade != 1){ //Création de l'extension si elle n'existe pas $obExtension = Extension::getByNom($extension); if(empty($obExtension)){ $obExtension = new Extension($extension, $_POST['typesource']); $obExtension->add(); } $idExt = $obExtension->getId(); //Création du type de source si il n'existe pas $obTypeSource = TypeSource::getByExtensionId($idExt)[0]; if(empty($obTypeSource)){ $obTypeSource = new $obExtension->getId(), $_POST['typesource']); $obTypeSource->add(); TypeSource("Fichier Page 9 / 20 ".$obExtension->getNom(), Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges } //Création de la source si elle n'existe pas $source = SourceDonnee::getByUnique($_POST['nomSource'], $_POST['parametreFichier'], $obTypeSource->getId()); if(empty($source)){ $source = new SourceDonnee($_POST['nomSource'], $_POST['parametreFichier'], $obTypeSource->getId()); $source->add(); } else{ $source = $source[0]; } //On crée l'interface $interface = new InterfaceDonnee($_POST['nomInterface'], $_POST['versionInterface'], $_POST['actifInterface'], $source->getId(), $_POST['descriptif']); $interface->add(); //On parcourt le fichier envoyé if($_POST['typesource'] == 0){ $nomElements = array(); $fichier = fopen(SOURCE_DIR."/".$_FILES['fichierImporte']['name'], "r"); $n=0; $isNomObjet = 0; $nameObjet = array(); $nObjet = 0; $compteur = 0; $data = array(); $dataD= array(); $colnames = array(); $maxDATA =3; if ($fichier) { while (($ligne = fgetcsv($fichier,0,';')) !== false) { $champs = count($ligne); isNomObjet //Si on arrive dans la description des objets alors on incrémente if(preg_match("#58-tables#", $ligne[0])){ $isNomObjet++; } valeurs du fichier //Si on n'est pas dans la description des objets on récupère les if($isNomObjet == 0){ if(preg_match('#58-glpi#',$ligne[0])){ $n=0; Page 10 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges $dataD= array(); $nData=0; } //On récupère le contenu du fichier if($n==0){ $colonne_name = explode('"',$ligne[0]); $objet = preg_replace('#[0-9 ]+#', $colonne_name[0]); '', $objet = preg_replace('#-glpi_#', '', $objet); $objet = trim(preg_replace('#.csv#', '', $objet)) ; $ligne[0]=$colonne_name[1]; $data[] = array("NOM" => $objet, "COLONNE"=>$ligne,"DATA"=>array()); $compteur++; $nObjet++; } for($i=0;$i<$champs;$i++){ $colnames[] = $ligne[$i]; } $n++; if($nData<=$maxDATA && $n>1) $dataD[] = $ligne; $data[count($data)-1]['DATA'] =$dataD; $nData++; } else if($isNomObjet > 1){ //Sinon on récupère les lignes correspondants à la description des objets if(count($ligne) == 3){ $objetNomGLPI $ligne[0]); = preg_replace("#glpi_#", $nameObjet[] = array($objetNomGLPI, $ligne[1]); } else{ } $isNomObjet++; } } // Fin while if (!feof($fichier)) { echo "Erreur: fgets() a ?chou?\n"; } fclose($fichier); } //On parcourt les noms obtenus et on vérifie si on n'a leur nom dans la description //Puis on vérifie si le nom existe déjà dans la base foreach($data as $o){ $nomDescription = null; Page 11 / 20 "", Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges foreach($nameObjet as $nameO){ if($nameO[0] == $o['NOM']){ $nomDescription = utf8_decode($nameO[1]); break 1; } } $nomOb = Objet::getByNom($o['NOM']); if(empty($nomOb)){ $nomOb = new Objet($o['NOM'], $nomDescription); $nomOb->add(); } else{ $nomOb->setItem("DESCRIPTION", $nomDescription); $nomOb->update(); } } //On récupére les noms de colonnes et on enlève les doublons $colonnes = array_unique($colnames); //On ajoute les colonnes non existantes foreach($colonnes as $cols){ $nomCol = DataColonne::getByNom($cols); if(empty($nomCol)){ $obC = new DataColonne($cols); $obC->add(); } } foreach($data as $ob){ $num = 0; foreach($ob['COLONNE'] as $co){ $idObjet = Objet::getByNom($ob['NOM'])->getId(); $idCol = DataColonne::getByNom($co)->getId(); $structure = new InterfaceStructure($idObjet, $interface->getId(), $num, $idCol, 0, 1); $structure->add(); $num++; } } } Page 12 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges } Etape 2 – Sélection des données Dans cette étape l’utilisateur peut voir toute la structure du fichier. Il peut sélectionner les clés primaires, les clés étrangères ainsi que les champs qui ne doivent pas apparaître. Il peut aussi modifier leurs noms. Dès qu’il sélectionne un objet dans la liste déroulante, le tableau change et affiche la structure de l’objet. Une fois que l’utilisateur a fait ce qu’il voulait il peut valider. Etape 3 – Les Liens Dans la précédente étape, l’utilisateur pouvait sélectionner les clés étrangères de chaque objet. A présent il va pouvoir sélectionner à quel champ de quel objet il fait référence. Pour chaque clé étrangère on affiche une liste des objets de l’interface ainsi que la liste des champs correspondants à l’objet sélectionné. Une fois qu’il a fini il peut valider. L’utilisateur arrive sur un récapitulatif de l’interface créée. Celle-ci a bien été créée. En cliquant sur le bouton Détails il arrive sur une page récapitulant la structure, la source de l’interface. Page 13 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges C. Gestion des Indicateurs Un Indicateur est un objet permettant de récupérer les champs d’une Interface afin de les afficher sous la forme d’un graphique ou d’un tableau. Comme pour les Interfaces, la création d’un Indicateur est en trois étapes. Etape 1 – L’Indicateur L’utilisateur doit tout d’abord saisir les informations de base, nécessaires à la création d’un Indicateur. Il doit avoir une référence, qui est unique, un nom, une description, une périodicité, un type, une unité de mesure et appartient à une famille. Une fois que l’utilisateur a inscrit les différentes informations il peut passer à l’étape suivante. Etape 2 – La structure de l’Indicateur L’utilisateur doit à présent choisir les champs que son Indicateur utilisera. Pour cela il doit cliquer sur l’icône +, sélectionner une Interface et le type de la colonne. Une fois cela fait l’utilisateur a deux fenêtres. La première contient la liste des objets de l’interface ainsi que les champs de l’objet sélectionné. La deuxième contient les tableaux de la structure de chaque objet lié à l’objet sélectionné. Page 14 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges Code permettant de récupérer les objets et leur structure en fonction de l’objet sélectionné (PHP): $data = array(); $nbData = 0; //On récupère les champs de l'objet $champs = InterfaceStructure::getByObjetId($_GET['objet']); $colsIndicateur = IndicateurStructure::getByIndicateurId($id); foreach($champs as $c){ //Pour chaque champ on vérifie si il fait référence à un objet $liens = InterfaceStructureLien::getById($c->getId()); if(!empty($liens)){ //On récupère le champ Lie et son objet $champLie = InterfaceStructure::getById($liens->getCleEtrangere()); $objetLie = Objet::getById($champLie->getObjetId()); if(!empty($objetLie)){ $test = 0; foreach($data as $d){ if($d[0]->getId() == $objetLie->getId()){ $test = 1; } } if($test == 0){ //On ajoute l'objet dans $data $data[$nbData][0] = $objetLie; $data[$nbData][1] = array(); //On récupère tous les champs de l'objet lié $champObjetLie = InterfaceStructure::getByObjetId($objetLie>getId()); //On ajoute chaque champ de l'objet lié dans $data Page 15 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges foreach($champObjetLie as $col){ $test = 0; if(!empty($colsIndicateur)){ foreach($colsIndicateur as $cIndic){ if($cIndic->getInterfaceStructureId() == $col>getId()){ $test = 1; } } } if($test == 0){ $data[$nbData][1][] = $col; } } } $nbData++; } } } $colNames = DataColonne::getAll(); include_once "vues/indicateurLiaison_tableau.php"; L’utilisateur peut modifier ou supprimer les champs qu’il a ajoutés à son indicateur. Pour les supprimer il clique sur la croix. Pour les modifier il clique sur le crayon. Il peut aussi changer leur position. Pour cela il fait juste glisser l’élément derrière le ou les éléments qu’il souhaite. Lorsqu’il dépose l’élément la position de tous les éléments de l’Indicateur sont mis à jour. Code permettant de mettre à jour la position des colonnes de l’Indicateur (Javascript) : /* * Permet de définir la liste triable * et de mettre à jour la position des colonnes de l'indicateur * */ $("#sortableCols").sortable({ update : function(event){ //On récupère les colonnes et l’identifiant de l’indicateur var cols = $(".positionStructure"); var tabValeurs = ""; var id = $("#idIndicateur").val(); //On parcourt les colonnes et on ajoute leur id dans tabValeurs cols.each(function() { tabValeurs += $(this).attr("id").replace("structure", "")+";"; Page 16 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges }); //On définit l’url de la requête et on fait appel à requeteAjax() var url = "? ctl=indicateur_ctl.php&ajax=1&action=ajaxSetPositionColonne&id="+id+"&colonnes="+tabValeurs; var fCall = ""; requeteAjax(url, fCall); } }); $("#sortablesCols").disableSelection(); Une fois la structure de son Indicateur prête, l’utilisateur peut passer à l’étape suivante en cliquant sur Valider. Etape 3 – Le Mode d’Affichage L’utilisateur doit choisir le mode d’affichage de son Indicateur. Il a le choix de plusieurs modes d’affichage dans une liste. Il peut aussi choisir quels seront les champs qui seront en abscisse et en ordonnée. Une fois son choix fait, l’utilisateur peut valider. Il arrive sur une page de récapitulatif qui lui permet de retourner sur la liste des Indicateurs ou de regarder le détail de celui qu’il vient de créer. En plus de ces trois parties, j’ai aussi travaillé sur des petites parties de l’application. Exemple de la fenêtre de suppression d’un objet (Javascript): /* Page 17 / 20 Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges * Permet de faire apparaître la fenêtre modale demandant si l'utilisateur * veut effectivement supprimer l'objet en cours */ function fenetreSupprimer(ctl, id){ //On initialise la variable contenant l'url de l'action à réaliser en php //et le code à effectuer si la requête ajax fonctionne var url = "?&ctl="+ctl+"&action=supprimer&ajax=1&id="+id; var fCall = '$("#supprimer").empty();$("#supprimer").append(data);$ (".popbg").css("display", "inline-block");$("#supprimer").css("display", "inline-block");'; requeteAjax(url, fCall); } //Permet de fermer la fenêtre modale de suppression function fermerSupprimer(){ $("#supprimer").empty(); $("#supprimer").css('display', 'none'); $(".popbg").css("display", "none"); } Page 18 / 20 Rapport de Stage Thuillier-Le Gac Pierre V. Matériels et outils utilisés Langages : PHP, Javascript, HTML/CSS Logiciels : Notepad++, phpMyAdmin Outils : Highcharts, FontAwesome, Jquery Page 19 / 20 CPAM - Limoges Rapport de Stage Thuillier-Le Gac Pierre CPAM - Limoges VI. Conclusion Ce stage a été très intéressant sur différents points. Tout d'abord la durée du stage qui a été de sept semaines m'a permis d'acquérir une expérience sur la réalisation de projets plus longs que ceux que j'avais l'habitude de réaliser. Le projet en lui même était très intéressant. De plus cela m'a permis d'utiliser des outils que je n'avais jamais utilisé ou partiellement utilisé comme JQuery et de renforcer mes connaissances dans certains domaines comme la structure Modèle-Vue-Contrôleur et le PHP. Ensuite le projet m'a aussi permis d'acquérir plus d'expériences dans la réalisation d'un projet de groupe. Le stage s'est déroulé dans de très bonnes conditions. L'équipe du service nous a très bien accueilli et ont toujours été là pour nous aider. Ce stage m'a apporté beaucoup de choses et cela me sera très utile pour les futurs projets auxquels je participerais, ainsi que pour mon développement personnel. Page 20 / 20