Commit d115a7ef authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Ajout d'un import pour les fiches au format CSV de REFERENS 3

parent e0db1612
Loading
Loading
Loading
Loading
+18 −0
Changes for module/Application/config/merged/fiche-metier.config.php: 18 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -8,6 +8,10 @@ use Application\Form\FicheMetier\LibelleForm;
use Application\Form\FicheMetier\LibelleFormFactory;
use Application\Form\FicheMetier\LibelleHydrator;
use Application\Form\FicheMetier\LibelleHydratorFactory;
use Application\Form\FicheMetierImportation\FicheMetierImportationForm;
use Application\Form\FicheMetierImportation\FicheMetierImportationFormFactory;
use Application\Form\FicheMetierImportation\FichierMetierImportationHydrator;
use Application\Form\FicheMetierImportation\FichierMetierImportationHydratorFactory;
use Application\Form\SelectionFicheMetier\SelectionFicheMetierForm;
use Application\Form\SelectionFicheMetier\SelectionFicheMetierFormFactory;
use Application\Provider\Privilege\FicheMetierPrivileges;
@@ -54,6 +58,7 @@ return [
                    'action' => [
                        'ajouter',
                        'dupliquer',
                        'importer-depuis-csv',
//                        'ajouter-terminer',
                    ],
                    'privileges' => [
@@ -234,6 +239,17 @@ return [
                        ],
                        'may_terminate' => true,
                    ],
                    'importer-depuis-csv' => [
                        'type'  => Segment::class,
                        'options' => [
                            'route'    => '/importer-depuis-csv[/:importation]',
                            'defaults' => [
                                'controller' => FicheMetierController::class,
                                'action'     => 'importer-depuis-csv',
                            ],
                        ],
                        'may_terminate' => true,
                    ],
                    'afficher-applications' => [
                        'type'  => Segment::class,
                        'options' => [
@@ -508,11 +524,13 @@ return [
        'factories' => [
            LibelleForm::class => LibelleFormFactory::class,
            SelectionFicheMetierForm::class => SelectionFicheMetierFormFactory::class,
            FicheMetierImportationForm::class => FicheMetierImportationFormFactory::class,
        ],
    ],
    'hydrators' => [
        'factories' => [
            LibelleHydrator::class => LibelleHydratorFactory::class,
            FichierMetierImportationHydrator::class => FichierMetierImportationHydratorFactory::class,
        ],
    ],
    'view_helpers' => [
+112 −15
Changes for module/Application/src/Application/Controller/FicheMetierController.php: 112 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -3,28 +3,38 @@
namespace Application\Controller;

use Application\Entity\Db\Activite;
use Application\Provider\Etat\FicheMetierEtats;
use Application\Provider\Template\PdfTemplate;
use Element\Entity\Db\ApplicationElement;
use Element\Entity\Db\CompetenceElement;
use Application\Entity\Db\ActiviteDescription;
use Application\Entity\Db\FicheMetier;
use Application\Entity\Db\ParcoursDeFormation;
use Application\Form\Activite\ActiviteForm;
use Application\Form\Activite\ActiviteFormAwareTrait;
use Application\Form\FicheMetier\LibelleForm;
use Application\Form\FicheMetier\LibelleFormAwareTrait;
use Element\Form\SelectionApplication\SelectionApplicationFormAwareTrait;
use Element\Form\SelectionCompetence\SelectionCompetenceFormAwareTrait;
use Application\Form\FicheMetierImportation\FicheMetierImportationFormAwareTrait;
use Application\Form\SelectionFicheMetier\SelectionFicheMetierFormAwareTrait;
use Application\Provider\Etat\FicheMetierEtats;
use Application\Provider\Template\PdfTemplate;
use Application\Service\Activite\ActiviteServiceAwareTrait;
use Application\Service\ActiviteDescription\ActiviteDescriptionServiceAwareTrait;
use Application\Service\Agent\AgentServiceAwareTrait;
use Application\Service\Configuration\ConfigurationServiceAwareTrait;
use Application\Service\FicheMetier\FicheMetierServiceAwareTrait;
use Element\Service\HasApplicationCollection\HasApplicationCollectionServiceAwareTrait;
use Element\Service\HasCompetenceCollection\HasCompetenceCollectionServiceAwareTrait;
use Application\Service\ParcoursDeFormation\ParcoursDeFormationServiceAwareTrait;
use Doctrine\ORM\ORMException;
use Element\Entity\Db\Application;
use Element\Entity\Db\ApplicationElement;
use Element\Entity\Db\Competence;
use Element\Entity\Db\CompetenceElement;
use Element\Form\SelectionApplication\SelectionApplicationFormAwareTrait;
use Element\Form\SelectionCompetence\SelectionCompetenceFormAwareTrait;
use Element\Service\HasApplicationCollection\HasApplicationCollectionServiceAwareTrait;
use Element\Service\HasCompetenceCollection\HasCompetenceCollectionServiceAwareTrait;
use Formation\Form\SelectionFormation\SelectionFormationFormAwareTrait;
use Laminas\Http\Request;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
use Laminas\View\Model\ViewModel;
use Metier\Service\Domaine\DomaineServiceAwareTrait;
use Metier\Service\Metier\MetierServiceAwareTrait;
use Mpdf\MpdfException;
@@ -34,18 +44,14 @@ use UnicaenEtat\Service\Etat\EtatServiceAwareTrait;
use UnicaenEtat\Service\EtatType\EtatTypeServiceAwareTrait;
use UnicaenPdf\Exporter\PdfExporter;
use UnicaenRenderer\Service\Rendu\RenduServiceAwareTrait;
use Laminas\Http\Request;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
use Laminas\View\Model\ViewModel;

/** @method FlashMessenger flashMessenger() */

class FicheMetierController extends AbstractActionController
{
    /** Traits associé aux services */
    /** Traits associés aux services */
    use ActiviteServiceAwareTrait;
    use ActiviteDescriptionServiceAwareTrait;
    use AgentServiceAwareTrait;
    use ConfigurationServiceAwareTrait;
    use DomaineServiceAwareTrait;
@@ -58,9 +64,10 @@ class FicheMetierController extends AbstractActionController
    use ParcoursDeFormationServiceAwareTrait;
    use RenduServiceAwareTrait;

    /** Traits associé aux formulaires */
    /** Traits associés aux formulaires */
    use ActiviteFormAwareTrait;
    use LibelleFormAwareTrait;
    use FicheMetierImportationFormAwareTrait;
    use SelectionApplicationFormAwareTrait;
    use SelectionCompetenceFormAwareTrait;
    use SelectionEtatFormAwareTrait;
@@ -68,6 +75,8 @@ class FicheMetierController extends AbstractActionController
    use SelectionFormationFormAwareTrait;


    const REFERENS_SEP = "|";

    /** CRUD **********************************************************************************************************/

    public function indexAction() : ViewModel
@@ -492,6 +501,94 @@ class FicheMetierController extends AbstractActionController
        return $vm;
    }

    /** IMPORTATION ***************************************************************************************************/

    private function genererInfosFromCSV(string $fichier_path) : array
    {
        $csvInfos = $this->getFicheMetierService()->readFromCSV($fichier_path);

        $ajouts = $this->getConfigurationService()->getConfigurationsFicheMetier();
        foreach ($ajouts as $ajout) {
            if ($ajout->getEntityType() === Application::class) {
                $application = $ajout->getEntity();
                $csvInfos['applications'][$application->getId()] = $application;
            }
            if ($ajout->getEntityType() === Competence::class) {
                $competence = $ajout->getEntity();
                $csvInfos['competencesListe'][$competence->getId()] = $competence;
                $csvInfos['competences'][$competence->getType()->getLibelle()][$competence->getId()] = $competence;
            }
        }

        // tri
        foreach (['Connaissances', 'Opérationnelles', 'Comportementales'] as $type) {
            usort($csvInfos['competences'][$type], function (Competence $a, Competence $b) {return $a->getLibelle() > $b->getLibelle();});
        }
        usort($csvInfos['applications'], function (Application $a, Application $b) {return $a->getLibelle() > $b->getLibelle();});

        return $csvInfos;
    }

    public function importerDepuisCsvAction()
    {
        $form = $this->getFicheMetierImportationForm();
        $form->setAttribute('action', $this->url()->fromRoute('fiche-metier-type/importer-depuis-csv', ['mode' => 'preview', 'path' => null], [], true));


        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $file = $request->getFiles();

            $fichier_path = $file['fichier']['tmp_name'];
            $mode = $data['mode'];

            $csvInfos = $this->genererInfosFromCSV($fichier_path);

            if ($mode === 'preview') {
                return new ViewModel([
                    'fichier_path' => $fichier_path,
                    'form' => $form,
                    'mode' => $mode,
                    'code' => $csvInfos['code'],
                    'metier' => $csvInfos['metier'],
                    'mission' => $csvInfos['mission'],
                    'activites' => $csvInfos['activites'],
                    'applications' => $csvInfos['applications'],
                    'competences' => $csvInfos['competences'],
                ]);
            }
            if ($mode === 'import') {
                if ($csvInfos['metier'] !== null AND empty( $csvInfos['competences']['Manquantes']))
                {
                    $fiche = $this->getFicheMetierService()->importFromCsvArray($csvInfos);

                    /** @see \Application\Controller\FicheMetierController::afficherAction() */
                    return $this->redirect()->toRoute('fiche-metier-type/afficher', ['id' => $fiche->getId()], [], true);
                } else {
                    return new ViewModel([
                        'fichier_path' => $fichier_path,
                        'form' => $form,
                        'mode' => $mode,
                        'code' => $csvInfos['code'],
                        'metier' => $csvInfos['metier'],
                        'mission' => $csvInfos['mission'],
                        'activites' => $csvInfos['activites'],
                        'applications' => $csvInfos['applications'],
                        'competences' => $csvInfos['competences'],
                    ]);
                }
            }
        }

        $vm = new ViewModel([
            'title' => "Importation d'une fiche métier",
            'form' => $form,
        ]);
        return $vm;

    }

    /** Graphique *****************************************************************************************************/

    public function graphiqueCompetencesAction() : ViewModel
+16 −0
Changes for module/Application/src/Application/Controller/FicheMetierControllerFactory.php: 16 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -4,6 +4,8 @@ namespace Application\Controller;

use Application\Form\Activite\ActiviteForm;
use Application\Form\FicheMetier\LibelleForm;
use Application\Form\FicheMetierImportation\FicheMetierImportationForm;
use Application\Service\ActiviteDescription\ActiviteDescriptionService;
use Element\Form\SelectionApplication\SelectionApplicationForm;
use Element\Form\SelectionCompetence\SelectionCompetenceForm;
use Application\Form\SelectionFicheMetier\SelectionFicheMetierForm;
@@ -18,6 +20,8 @@ use Formation\Form\SelectionFormation\SelectionFormationForm;
use Interop\Container\ContainerInterface;
use Metier\Service\Domaine\DomaineService;
use Metier\Service\Metier\MetierService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use UnicaenEtat\Form\SelectionEtat\SelectionEtatForm;
use UnicaenEtat\Service\Etat\EtatService;
use UnicaenEtat\Service\EtatType\EtatTypeService;
@@ -26,10 +30,17 @@ use UnicaenRenderer\Service\Rendu\RenduService;
class FicheMetierControllerFactory
{

    /**
     * @param ContainerInterface $container
     * @return FicheMetierController
     * @throws ContainerExceptionInterface
     * @throws NotFoundExceptionInterface
     */
    public function __invoke(ContainerInterface $container): FicheMetierController
    {
        /**
         * @var ActiviteService $activiteService
         * @var ActiviteDescriptionService $activiteDescriptionService
         * @var AgentService $agentService ;
         * @var RenduService $renduService ;
         * @var DomaineService $domaineService
@@ -43,6 +54,7 @@ class FicheMetierControllerFactory
         * @var ParcoursDeFormationService $parcoursService
         */
        $activiteService = $container->get(ActiviteService::class);
        $activiteDescriptionService = $container->get(ActiviteDescriptionService::class);
        $agentService = $container->get(AgentService::class);
        $renduService = $container->get(RenduService::class);
        $domaineService = $container->get(DomaineService::class);
@@ -57,6 +69,7 @@ class FicheMetierControllerFactory

        /**
         * @var LibelleForm $libelleForm
         * @var FicheMetierImportationForm $ficheMetierImportationForm
         * @var ActiviteForm $activiteForm
         * @var SelectionApplicationForm $selectionApplicationForm
         * @var SelectionCompetenceForm $selectionCompetenceForm
@@ -71,11 +84,13 @@ class FicheMetierControllerFactory
        $selectionFormationForm = $container->get('FormElementManager')->get(SelectionFormationForm::class);
        $selectionEtatForm = $container->get('FormElementManager')->get(SelectionEtatForm::class);
        $selectionFicheMetierForm = $container->get('FormElementManager')->get(SelectionFicheMetierForm::class);
        $ficheMetierImportationForm = $container->get('FormElementManager')->get(FicheMetierImportationForm::class);

        /** @var FicheMetierController $controller */
        $controller = new FicheMetierController();

        $controller->setActiviteService($activiteService);
        $controller->setActiviteDescriptionService($activiteDescriptionService);
        $controller->setAgentService($agentService);
        $controller->setRenduService($renduService);
        $controller->setDomaineService($domaineService);
@@ -95,6 +110,7 @@ class FicheMetierControllerFactory
        $controller->setSelectionFormationForm($selectionFormationForm);
        $controller->setSelectionEtatForm($selectionEtatForm);
        $controller->setSelectionFicheMetierForm($selectionFicheMetierForm);
        $controller->setFicheMetierImportationForm($ficheMetierImportationForm);

        return $controller;
    }
+60 −0
Changes for module/Application/src/Application/Form/FicheMetierImportation/FicheMetierImportationForm.php: 60 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Application\Form\FicheMetierImportation;

use Laminas\Form\Element\Button;
use Laminas\Form\Element\File;
use Laminas\Form\Element\Select;
use Laminas\Form\Form;
use Laminas\InputFilter\Factory;

class FicheMetierImportationForm extends Form {


    public function init()
    {
        //file CSV
        $this->add([
            'type' => File::class,
            'name' => 'fichier',
            'options' => [
                'label' => 'Fiche métier au format CSV <span class="icon icon-star" title="Champ obligatoire"></span> :',
                'label_options' => [ 'disable_html_escape' => true, ],
            ],
        ]);
        //mode
        $this->add([
            'type' => Select::class,
            'name' => 'mode',
            'options' => [
                'label' => 'Mode  <span class="icon icon-star" title="Champ obligatoire"></span> :',
                'label_options' => [ 'disable_html_escape' => true, ],
                'value_options' => [
                    'preview' => "Prévisualisation",
                    'import' => "Importation",
                ]
            ],
            'attributes' => [
                'id' => 'mode',
            ],
        ]);
        //Submit
        $this->add([
            'type' => Button::class,
            'name' => 'creer',
            'options' => [
                'label' => 'Traiter le ficher',
                'label_options' => [ 'disable_html_escape' => true, ],
            ],
            'attributes' => [
                'type' => 'submit',
                'class' => 'btn btn-primary',
            ],
        ]);

        $this->setInputFilter((new Factory())->createInputFilter([
            'fichier' => [ 'required' => true,  ],
            'mode'  => ['required' => true, ],
        ]));
    }
}
 No newline at end of file
+26 −0
Changes for module/Application/src/Application/Form/FicheMetierImportation/FicheMetierImportationFormAwareTrait.php: 26 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Application\Form\FicheMetierImportation;

trait FicheMetierImportationFormAwareTrait {

    private FicheMetierImportationForm $ficheMetierImportationForm;

    /**
     * @return FicheMetierImportationForm
     */
    public function getFicheMetierImportationForm(): FicheMetierImportationForm
    {
        return $this->ficheMetierImportationForm;
    }

    /**
     * @param FicheMetierImportationForm $ficheMetierImportationForm
     */
    public function setFicheMetierImportationForm(FicheMetierImportationForm $ficheMetierImportationForm): void
    {
        $this->ficheMetierImportationForm = $ficheMetierImportationForm;
    }


}
 No newline at end of file
Loading