PPE

 

 

 

CONTEXTE FORMARMOR

 

PPE – FormArmor

 

I.        Contexte

L'organisme de formation FormArmor, spécialisé dans le domaine tertiaire et industriel, est implanté en Bretagne. Il dispose d’antennes dans les 4 départements bretons.

L’antenne des Côtes d’Armor, FormArmor 22, basée à Saint Brieuc couvre uniquement le secteur tertiaire.

La coordonnatrice de ce centre aimerait moderniser son mode de fonctionnement, notamment concernant l'inscription des clients sur les formations dispensées.

 

Fonctionnement actuel du centre de formation

Le centre de formation dispose d'un panel de formations bien établies pour lesquelles sont notées le libellé de la formation, le niveau de celle-ci (initiation, perfectionnement), le type de formation (compta ou bureautique), la durée (en heures) et le coût de revient.

Tous les clients font l'objet d'un entretien préalable auprès de Mme LEROUX, coordonnatrice du centre. Celle-ci note leurs coordonnées, leurs statuts (CIF, SIFE, 1%...) et un plan de formation personnalisé est défini. Sur celui-ci figurent les formations proposées mais pas encore de date.

Le prix de la formation dépend du statut.

Régulièrement, des sessions de formations sont définies (libellé de la formation, dates, niveau, nombre de places disponibles…).

Madame LEROUX se doit donc, au fur et à mesure de l'apparition des sessions, de positionner les clients sur celles-ci. Ce travail génère des inscriptions.

 

II.       Description des applications existantes

FormArmor 22 dispose d’un site Internet. Celui-ci présente l'organisme de formation :

image

Et liste les formations dispensées :

image

 

 

Madame LEROUX (admin) peut, via "le panneau administration" de ce site et après authentification, créer et mettre à jour les clients, les formations, les plans de formations, les sessions et les statuts :

 

 

Cette application web a été conçue avec la méthode MVC et par l'intermédiaire du framework Symfony.

 

Exemple "lister les formations" :

url : http://localhost:8000/formation

 

Contrôleur "FormationsController .php" :

<?php

 

namespace App\Controller;

 

useSymfony\Bundle\FrameworkBundle\Controller\AbstractController;

useSymfony\Component\HttpFoundation\Response;

useSymfony\Component\Routing\Annotation\Route;

 

useDoctrine\Persistence\ManagerRegistry;

 

// Nécessaire pour la pagination

useSymfony\Component\HttpFoundation\Request; // Nous avons besoin d'accéder à la requête pour obtenir le numéro de page

useKnp\Component\Pager\PaginatorInterface; // Nous appelons le bundle KNP Paginator

 

use App\Entity\Formation;

 

class FormationController extends AbstractController

{

    #[Route('/formation', name: 'formation')]

    public function liste(Request $request, PaginatorInterface $paginator, ManagerRegistry $doctrine)

    {

        $em = $doctrine->getManager();

        $rep = $em->getRepository(Formation::class);

        $lesFormations = $rep->findAll();

        

        $lesFormationsPagines = $paginator->paginate(

            $lesFormations, // Requête contenant les données à paginer (ici nos formations)

            $request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page

            4 // Nombre de résultats par page

        );

        

        return $this->render('formation/index.html.twig', Array('lesFormations' => $lesFormationsPagines));

    }

}


 

Modèle :"FormationRepository.php" :

<?php

namespace App\Repository;

 

use App\Entity\Formation;

useDoctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;

useDoctrine\Persistence\ManagerRegistry;

 

/**

 * @method Formation|null find($id, $lockMode = null, $lockVersion = null)

 * @method Formation|null findOneBy(array $criteria, array $orderBy = null)

 * @method Formation[]    findAll()

 * @method Formation[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)

 */

class FormationRepository extends ServiceEntityRepository

{

    public function __construct(ManagerRegistry $registry)

    {

        parent::__construct($registry, Formation::class);

    }

    public function listeFormations()

    {

        // En passant par le raccourci (c'est préférable)

        $queryBuilder = $this->createQueryBuilder('f');

        // On n'ajoute pas de critère ou tri particulier ici car on veut toutes les formations, la construction de notre requête est donc finie

 

        // On récupère la Query à partir du QueryBuilder

        $query = $queryBuilder->getQuery();

        return $query->getResult();

    }

    public function suppFormation($id) // Suppression de la formation d'identifiant $id

    {

        $qb = $this->createQueryBuilder('f');

        $query = $qb->delete('App\Entity\Formation', 'f')

        ->where('f.id = :id')

        ->setParameter('id', $id);

       

        return $qb->getQuery()->getResult();

    }

}

 


 

Vue :"templates/formation/index.html.twig" :

{% extends 'layout.html.twig' %}

{% block FormArmor_body %}

    <h2>TABLEAU DES FORMATIONS</h2>

    <table class="table">

        <thead>

        <tr>

            <th>Libell&eacute;</th>

            <th>Niveau</th>

            <th>Type</th>

            <th>Description</th>

            <th>Diplomante</th>

            <th>Dur&eacute;e</th>

            <th>Cout</th>

        </tr>

        </thead>

        <tbody>

            {% for formation in lesFormations %}

                <tr {# si le nombre de passages dans la boucle est pair #} {% if loop.index is even %} class="success" {% else %} class="info" {% endif %}>

                    <td>{{formation.libelle}}</td>

                    <td>{{formation.niveau}}</td>

                    <td>{{formation.typeform}}</td>

                    <td>{{formation.description}}</td>

                    {% if formation.diplomante == 0 %}

                        <td>Non</td>

                    {% else %}

                        <td>Oui</td>

                    {% endif %}

                    <td>{{formation.duree}}</td>

                    <td>{{formation.coutrevient}}</td>

                </tr>

            {% endfor %}

        </tbody>

    </table>

    

    {{ knp_pagination_render(lesFormations) }}

    

    <script>

        $(function() {

            $('#menu2').attr('class', 'active');

        });

    </script>

    

{% endblock %}

 


Les données sont stockées sous Mysql :

Base formarmor :

image


 

Les inscriptions des clients aux différentes sessions sont exclusivement réalisées par Madame LEROUX. Ces inscriptions sont faites par l'intermédiaire de l'application Java intitulée "gestion des inscriptions". Cette application est en liaison avec la base de données symfony5_formarmor.

 

image

image

image

 

 

 

 

 


Les limites de ce mode de fonctionnement :

La procédure d'inscription est longue et fastidieuse et donc source d'erreurs fréquentes.

Ces inscriptions sont faites sans connaître la disponibilité du client.

Le coût des formations est mal maîtrisé et des formations déficitaires sont régulièrement dispensées.

III.      Evolutions souhaitées

Sur l'application web :

 

Ajout au site internet d'un espace client :

Cet espace devra être uniquement accessible aux clients reconnus (ROLE_CLIENT), une page de connexion devra être utilisée.

 

Cet espace clients devra se présenter sous cette forme :

La page devra présenter la liste complète des sessions de formation prévues pour les deux mois en cours (libellé de la formation, niveau, description, dates...), mais seules les sessions suivantes proposeront une inscription en ligne (bouton ou lien hypertexte...) :

·      Sessions non totalement pourvues (nombre de places>nombre d'inscrits),

·      Sessions pour lesquelles le client n'est pas encore inscrit,

·      Sessions figurant dans son plan de formation,

·      Sessions non closes;

Les inscriptions seront impossibles pour les clients n'ayant pas fourni d'e-mail et pour ceux qui ont déjà effectué l'ensemble de leur formation.

Un clic sur le bouton inscription ou sur le lien hypertexte de la session permettra après confirmation une inscription provisoire et donc une mise à jour des inscriptions, des sessions (nombre d'inscrits), des plans de formations (effectué(o/n)).

L'inscription ne sera définitive qu'après l'envoi d'un e-mail d'acceptation de la part de l'administrateur (environ une semaine avant la date début de la formation).

 

Modification de l'espace administrateur :

Opération de validation des inscriptions provisoires :

La page devra, pour ce client particulier (madame LEROUX, admin), également lister, avec la même présentation, l'ensemble des sessions prévues en mettant tout de même en évidence les sessions "à valider" c'est à dire les sessions totalement pourvues ou dont la date de début est prévue avant 8 jours.

Un clic sur le bouton validation ou sur le lien hypertexte de la session entraînera l'affichage détaillée des inscriptions (matricule, nom, prénom, statut...) et devra mettre en évidence d'une façon claire la marge dégagée sur cette formation.
Un bouton <Validation> et un bouton <Annulation> seront affichés.
Un clic sur le 1er bouton devra provoquer l'envoi d'un e-mail d'acceptation à chaque client inscrit et rendra close cette session.

Un clic sur le second bouton provoquera la saisie d'un motif, et l'envoi, à chaque client inscrit, d'un e-mail d'annulation et donc la mise à jour des inscriptions, des plans de formations et la suppression de la session.

 

Opération de saisie/modification d'un plan de formation :

L'ajout d'une ligne dans le plan de formation pose actuellement problème. Lors du choix du matricule du client aucune vérification n'est effectuée et le nombre d'heures de formation prévues pour le client choisi, aussi bien en comptabilité qu'en bureautique, n'apparaît pas. Cette absence nuit grandement à l'efficacité de l'opération.

 

 

Modification de l'application Java "gestion des inscriptions" :

(Ces applications seront en liaison avec la base de données formarmor sous Mysql)

 

Ajout d'un module "gestion rentabilité" :

Ce module devra lister, sous forme de tableau par exemple, les sessions achevées.

Un clic sur une session devra permettre

§  l'affichage du détail de celle-ci : libellé, date, nombre d'inscrits, taux de remplissage, nombre d'absents...,

§  l'affichage de la liste des participants avec leur taux horaire.

La marge (positive ou négative) dégagée devra être apparente.

Chaque session donnera la possibilité d'une notification des absences.

 

 

Ajout d'un module "gestion des sessions" :

Ce module devra lister, sous forme de tableau par exemple, les sessions futures (de la plus proche à la plus éloignée).

Pour chacune de ces sessions la génération au format pdf d'une liste d'émargement devra être proposée (voir librairie  itext en java).

 

 

Modification sur la base de données formarmor :

Les ajouts et modifications précédentes devraient impacter la base de données formarmor. En outre, une procédure stockée "sessions_autorisees" pourra être envisagée. Elle sera utilisée pour les inscriptions via l'application Java (Mme LEROUX) ou le site Internet (clients autorisés). Cette procédure devrait permettre de connaître, à partir d'un matricule client, les sessions qui lui sont "permises", c'est à dire :

§  non totalement pourvues,

§  figurant dans son plan de formation,

§  non closes.

 

 

Création d'une application Java android :

 

Envoi d'un texto (le lundi), pour rappel, aux clients inscrits sur la session de la semaine suivante. L'application devra lister les clients concernés et permettre l'envoi d'un texto groupé.

 

IV.     Architecture applicative

Environnement de production :

Le site Internet est hébergé sur un serveur Web (apache) sous linux.

La base de données (formarmor) sous Mysql est implantée sur ce même serveur.

L'application Java "gestion des inscriptions" est sur un poste sous Windows.

 

 

 

Environnement de développement :

Poste sous Windows disposant de Wamp ou Xamp.

Un serveur GIT est installé sur un poste Linux.

 

Développement web avec méthode MVC et Symfony. "Dépôt" des versions sur le serveur GIT.

Développement Java sous l'IDE NetBeans.

 

V.      Missions envisageables

Développement Web (les missions en italique ne sont pas "présentables")

Mission 1 :

Sécuriser l'application pour les clients (ROLE_ADMIN).

 

Mission 2 :

Création de "l'espace clients"

 

Mission 3 :

Création de la procédure stockée (cf page11) et modification des inscriptions via l'espace clients (mission 2)

 

Mission 4 :

Modification de l'espace administrateur (Opération de validation des inscriptions provisoires)

 

Mission 5 (Ajax) :

Modification de l'espace administrateur (Opération de saisie/modification d'un plan de formation) : Prévoir dès le choix du matricule client effectué, l'apparition d'un tableau (en Ajax) faisant apparaître le nom, prénom du client, son nombre d'heures de compta et son nombre d'heures de bureautique attribuées. Ce tableau se mettra à jour sur le choix du matricule mais aussi sur le choix de la formation.

 

Mission 6 :

Tests unitaires

 

 

Client lourd (Java)

 

 

Mission 7 :

Création du module "gestion rentabilité"

 

Mission 8 :

Création du module "gestion des sessions"

 

Mission 9 :

Modification du module d'inscription en utilisant la procédure stockée (cf page 11)

 

Mission 10 :

Tests unitaires

 

Mission 11 :

Application Android