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&eacute;l&eacute;charg&eacute;</div><br/><br/>";
Page 8 / 20
fichier
a
bien
SOURCE_DIR."/".
&eacute;t&eacute;
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 &ecirc;tre import&eacute;";
break;
case UPLOAD_ERR_PARTIAL :
$m = "Le fichier n'a &eacute;t&eacute; que partiellement
t&eacute;l&eacute;charg&acute;";
break;
case UPLOAD_ERR_NO_FILE :
$m
=
"Aucun
fichier
n'a
&eacute;t&eacute;
t&eacute;l&eacute;charg&eacute;";
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