src/Controller/Evrp/IdentificationSSTJOBController.php line 355

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Evrp;
  3. use App\Entity\bilan\Mission;
  4. use App\Entity\bilan\MOG;
  5. use App\Entity\bilan\Situation;
  6. use App\Entity\bilan\SituationRisque;
  7. use App\Entity\bilan\Task;
  8. use App\Entity\Configuration\CompanyEntity;
  9. use App\Repository\bilan\CriticiteRepository;
  10. use App\Repository\bilan\FrequenceRepository;
  11. use App\Repository\bilan\GraviteRepository;
  12. use App\Repository\bilan\JobRepository;
  13. use App\Repository\bilan\MissionRepository;
  14. use App\Repository\bilan\MOGRepository;
  15. use App\Repository\bilan\RisqueRepository;
  16. use App\Repository\bilan\SituationRepository;
  17. use App\Repository\bilan\SituationRisqueRepository;
  18. use App\Repository\bilan\TaskRepository;
  19. use App\Repository\Configuration\CompanyEntityRepository;
  20. use App\Service\SelectedEntityService;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Contracts\Cache\CacheInterface;
  27. use Symfony\Contracts\Cache\ItemInterface;
  28. /**
  29.  * @Route("/identification-metier")
  30.  */
  31. class IdentificationSSTJOBController extends AbstractController
  32. {
  33.     private $jobRepository;
  34.     private $criticiteRepository;
  35.     private $frequenceRepository;
  36.     private $graviteRepository;
  37.     private $risqueRepository;
  38.     private $mogRepository;
  39.     private $cache;
  40.     public function __construct(
  41.         JobRepository $jobRepository,
  42.         CriticiteRepository $criticiteRepository,
  43.         FrequenceRepository $frequenceRepository,
  44.         GraviteRepository $graviteRepository,
  45.         RisqueRepository $risqueRepository,
  46.         MOGRepository $mogRepository,
  47.         CacheInterface $cache
  48.     )
  49.     {
  50.         $this->jobRepository $jobRepository;
  51.         $this->criticiteRepository $criticiteRepository;
  52.         $this->cache $cache;
  53.         $this->frequenceRepository $frequenceRepository;
  54.         $this->graviteRepository $graviteRepository;
  55.         $this->risqueRepository $risqueRepository;
  56.         $this->mogRepository $mogRepository;
  57.     }
  58.     /**
  59.      * @Route("/", name="job")
  60.      */
  61.     public function index(SelectedEntityService $selectedEntityServiceCompanyEntityRepository $ceRepoRisqueRepository $risqueRepository): Response
  62.     {
  63.         $entities = [];
  64.         $selectedEntity $selectedEntityService->getSelectedEntity();
  65.         if (null === $selectedEntity) {
  66.             $entities $ceRepo->findAll();
  67.         }
  68.         $menu 'evaluate';
  69.         $left_menu 'identification-metier';
  70.         return $this->render('evrp/identification_sst/job/index.html.twig', [
  71.             'menu' => $menu,
  72.             'left_menu' => $left_menu,
  73.             'entities' => $entities,
  74.             'selectedEntity' => $selectedEntity
  75.         ]);
  76.     }
  77.     /**
  78.      * @Route("/jobs", name="getJobs", methods={"GET"})
  79.      */
  80.     public function getJobs(): JsonResponse
  81.     {
  82.         $jobs $this->jobRepository->findAll();
  83.          $jobsData array_map(function ($job) {
  84.              $processus $job->getProcessus();
  85.              $responsible $processus->getPilote();
  86.             return [
  87.                 'id' => $job->getId(),
  88.                 'title' => $job->getTitle(),
  89.                 'responsible' => $responsible->getFullName(),
  90.                 'fonction' => $responsible->getFonction(),
  91.                 'processus' => $processus->getTitle(),
  92.             ];
  93.         }, $jobs);
  94.         return new JsonResponse(['jobs' => $jobsData]);
  95.     }
  96.     /**
  97.      * @Route("/tasks/{mission}/{companyEntity}", name="getTasksByMission", methods={"GET"})
  98.      */
  99.     public function getTasksByMission(
  100.         Mission $mission,
  101.         CompanyEntity $companyEntity,
  102.         TaskRepository $taskRepository,
  103.         SituationRepository $situationRepository,
  104.         SituationRisqueRepository $situationRisqueRepository
  105.     ): JsonResponse {
  106.         $tasks $taskRepository->findBy(['mission' => $mission'companyEntity' => $companyEntity], ['id' => 'DESC']);
  107.         $tasksData array_map(
  108.             function ($task) use ($situationRepository$situationRisqueRepository) {
  109.                 return $this->formatTask($task$situationRepository$situationRisqueRepository);
  110.             },
  111.             $tasks
  112.         );
  113.         return new JsonResponse(['tasks' => $tasksData]);
  114.     }
  115.     private function formatTask(
  116.         $task,
  117.         SituationRepository $situationRepository,
  118.         SituationRisqueRepository $situationRisqueRepository
  119.     ): array {
  120.         $situations $situationRepository->findBy(['task' => $task], ['id' => 'DESC']);
  121.         return [
  122.             'id' => (string) $task->getId(),
  123.             'title' => $task->getTitle(),
  124.             'situations' => array_map(
  125.                 function ($situation) use ($situationRisqueRepository) {
  126.                     return $this->formatSituation($situation$situationRisqueRepository);
  127.                 },
  128.                 $situations
  129.             )
  130.         ];
  131.     }
  132.     private function formatSituation($situationSituationRisqueRepository $situationRisqueRepository): array
  133.     {
  134.         $situationsRisque $situationRisqueRepository->findBy(['situation' => $situation], ['id' => 'DESC']);
  135.         return [
  136.             'id' => (string) $situation->getId(),
  137.             'title' => $situation->getTitle(),
  138.             'situation_risques' => array_map(
  139.                 function ($situationRisque) {
  140.                     return $this->formatSituationRisque($situationRisque);
  141.                 },
  142.                 $situationsRisque
  143.             )
  144.         ];
  145.     }
  146.     private function formatSituationRisque($situationRisque): array
  147.     {
  148.         $criticite_array $this->getCachedCriticiteData();
  149.         $frequence $situationRisque->getFrequence();
  150.         $gravite $situationRisque->getGravite();
  151.         $idFrequence $frequence $frequence->getId() : null;
  152.         $frequenceNote $frequence $frequence->getNote() : 0;
  153.         $idGravite $gravite $gravite->getId() : null;
  154.         $graviteNote $gravite $gravite->getNote() : 0;
  155.         $criticiteValue=$frequenceNote*$graviteNote;
  156.         $criticite='';
  157.         $criticite_valeur=0;
  158.         $criticite_color='';
  159.         if($idFrequence && $idGravite) {
  160.             foreach ($criticite_array as $criticite_element) {
  161.                 if (($criticite_element->getType()=='criticite')&&($criticiteValue  >=$criticite_element->getValeur())) {
  162.                     $criticite=$criticite_element->getLegende();
  163.                     $criticite_valeur=$criticite_element->getValeur();
  164.                     $criticite_color=$criticite_element->getCouleur();
  165.                 }
  166.             }
  167.         }
  168.         
  169.         $mog $situationRisque->getMog();
  170.         $idMog $mog $mog->getId() : null;
  171.         $mogNote $mog $mog->getNote() : 0;
  172.         $risqueResiduelValue $criticiteValue $mogNote;
  173.         $risqueResiduel='';
  174.         $risqueResiduel_valeur=0;
  175.         $risqueResiduel_color='';
  176.         if($idMog) {
  177.                 foreach ($criticite_array as $RR_element) {
  178.                 if (($RR_element->getType()=='prevention')&&($risqueResiduelValue >=$RR_element->getValeur())) {
  179.                     $risqueResiduel=$RR_element->getLegende();
  180.                     $risqueResiduel_valeur=$RR_element->getValeur();
  181.                     $risqueResiduel_color=$RR_element->getCouleur();
  182.                 }
  183.             }
  184.         }
  185.         return [
  186.             'id' => (string) $situationRisque->getId(),
  187.             'idRisque' => $situationRisque->getRisque() ? $situationRisque->getRisque()->getId() : null,
  188.             'risque' => $situationRisque->getRisque()->getNom() ?? null,
  189.             'idFrequence' => $idFrequence,
  190.             'frequenceNote' => $frequenceNote,
  191.             'idGravite' => $idGravite,
  192.             'graviteNote' => $graviteNote,
  193.             'criticiteValue' => $criticiteValue,
  194.             'criticite' => $criticite,
  195.             'criticite_valeur' => $criticite_valeur,
  196.             'criticite_color' => $criticite_color,
  197.             'idMog' => $idMog,
  198.             'mogNote' => $mogNote,
  199.             'risqueResiduelValue' => $risqueResiduelValue,
  200.             'risqueResiduel' => $risqueResiduel,
  201.             'risqueResiduel_valeur' => $risqueResiduel_valeur,
  202.             'risqueResiduel_color' => $risqueResiduel_color,
  203.         ];
  204.     }
  205.     /**
  206.      * this controller is to save tasks and situations and situation risques in step 2 of identification SST JOB
  207.      * @Route("/tasks/save", name="saveTask" , methods={"POST"})
  208.      */
  209.     public function saveTask(
  210.         Request $request,
  211.         CompanyEntityRepository $companyEntityRepository,
  212.         MissionRepository $missionRepository,
  213.         TaskRepository $taskRepository,
  214.         SituationRepository $situationRepository,
  215.         SituationRisqueRepository $situationRisqueRepository,
  216.         RisqueRepository $risqueRepository
  217.     ): JsonResponse
  218.     {
  219.         $companyEntityId $request->request->getInt('companyEntityId');
  220.         if (!$companyEntityId) {
  221.             return new JsonResponse([
  222.                 'error' => 'companyEntity ID is required'
  223.             ], Response::HTTP_BAD_REQUEST);
  224.         }
  225.         $companyEntity $companyEntityRepository->find($companyEntityId);
  226.         if (!$companyEntity) {
  227.             return new JsonResponse([
  228.                 'error' => sprintf('Company entity with ID %d not found'$companyEntityId)
  229.             ], Response::HTTP_NOT_FOUND);
  230.         }
  231.         $idMission $request->request->getInt('idMission');
  232.         if (!$idMission) {
  233.             return new JsonResponse([
  234.                 'error' => 'Mission ID is required'
  235.             ], Response::HTTP_BAD_REQUEST);
  236.         }
  237.         $mission $missionRepository->find($idMission);
  238.         if (!$mission) {
  239.             return new JsonResponse([
  240.                 'error' => sprintf('Mission with ID %d not found'$idMission)
  241.             ], Response::HTTP_NOT_FOUND);
  242.         }
  243.         $idTask $request->request->get('idTask');
  244.         if (!$idTask) {
  245.             return new JsonResponse([
  246.                 'error' => 'Task ID is required'
  247.             ], Response::HTTP_BAD_REQUEST);
  248.         }
  249.         $currentUser $this->getUser();
  250.         $isNewTask str_starts_with($idTask"new");
  251.         $task $isNewTask ? new Task() : $taskRepository->find($idTask);
  252.         $task->setMission($mission);
  253.         $task->setCompanyEntity($companyEntity);
  254.         if($isNewTask) {
  255.             $task->setCreatedAt(new \DateTime());
  256.             $task->setCreatedBy($currentUser);
  257.         }else {
  258.             $task->setUpdatedBy($currentUser);
  259.             $task->setUpdatedAt(new \DateTime());
  260.         }
  261.         
  262.         if (!empty($request->request->get('taskTitle'))) {
  263.             $taskTitle $request->request->get('taskTitle');
  264.             $task->setTitle($taskTitle);
  265.             if ($isNewTask) {
  266.                 $task->setSlug(Task::generateSlug($taskTitle));
  267.             }
  268.         }
  269.         $situations $request->request->get('situations');
  270.         if (!empty($situations) && is_array($situations)) {
  271.             foreach ($situations as $situationData) {
  272.                 $isNewSituation =  str_starts_with($situationData['id'], "new");
  273.                 $situation $isNewSituation ? new Situation() :  $situationRepository->find($situationData['id']);
  274.                 $situation->setTitle($situationData['title']);
  275.                 $situation->setTask($task);
  276.                 $task->addSituation($situation);
  277.         
  278.                 if($isNewSituation) {
  279.                     $situation->setCreatedBy($currentUser);
  280.                 }else {
  281.                     $situation->setUpdatedBy($currentUser);
  282.                 }
  283.                 if(!empty($situationData['situationRisks']) && is_array($situationData['situationRisks'])) {
  284.                     $newSituationRiskIds array_column($situationData['situationRisks'], 'idRisque');
  285.                     if(count($newSituationRiskIds) === 0) {
  286.                         $situation->removeAllSituationRisques();
  287.                         continue;
  288.                     }
  289.                     $oldSituationRisksIds $isNewSituation ? [] : $situationRisqueRepository->getSituationRisqueBySituation($situation);
  290.                     $toRemove $isNewSituation ? [] : array_diff($oldSituationRisksIds$newSituationRiskIds);
  291.                     $toAdd $isNewSituation $newSituationRiskIds array_diff($newSituationRiskIds$oldSituationRisksIds);
  292.                     
  293.                     
  294.                     if (!empty($toRemove)) {
  295.                         $situationRisqueRepository->removeByRisqueIds($situation$toRemove);
  296.                     }
  297.                     foreach ($toAdd as $risqueId) {
  298.                         $risque $risqueRepository->find($risqueId);
  299.                         if ($risque) {
  300.                             $situationRisk = new SituationRisque();
  301.                             $situationRisk->setSituation($situation);
  302.                             $situationRisk->setRisque($risque);
  303.                             $situation->addSituationRisque($situationRisk);
  304.                         }
  305.                     }
  306.                 }
  307.             }
  308.         }
  309.         $taskRepository->save($task);
  310.         return new JsonResponse(['success' => true'taskId' => $task->getId()]);
  311.     }
  312.     private function getCachedCriticiteData(): array
  313.     {
  314.         return $this->cache->get('criticite_list', function (ItemInterface $item) {
  315.             $item->expiresAfter(3600);
  316.             return $this->criticiteRepository->findBy([],['valeur'=>'asc']);
  317.         });
  318.     }
  319.     /**
  320.      * @Route("/criticite/{id}/edit", name="editCriticite", methods={"GET","POST"})
  321.      */
  322.     public function editCriticite(Request $requestSituationRisque $situationRisqueFrequenceRepository $frequenceRepositoryGraviteRepository $graviteRepository): Response
  323.     {
  324.         if (isset($request->request)) {
  325.             $listF$this->getCachedFrequenceData();
  326.             $listG$this->getCachedGraviteData();
  327.             $frequenceId=$situationRisque->getFrequence() ? $situationRisque->getFrequence()->getId() : 0;
  328.             $graviteId=$situationRisque->getGravite() ? $situationRisque->getGravite()->getId() : 0;
  329.             $commentaire=$situationRisque->getCommentCR();
  330.             return $this->render('evrp/identification_sst/_formCR.html.twig', [
  331.                 'frequenceId' => $frequenceId,
  332.                 'graviteId' => $graviteId,
  333.                 'commentaire'=> $commentaire,
  334.                 'id'=>$situationRisque->getId(),
  335.                 'frequences'=>$listF,
  336.                 'gravites'=>$listG,
  337.                 'type'=>'SSTmetier',
  338.             ]);
  339.         }
  340.         return new JsonResponse(array('status' => 'error','message' => 'Access forbidden!'), 400);
  341.     }
  342.     /**
  343.      * @Route("/prevention/{id}/edit", name="editPrevention", methods={"GET","POST"})
  344.      */
  345.     public function editPrevention(Request $requestSituationRisque $situationRisque): Response
  346.     {
  347.         if (isset($request->request)) {
  348.             $listMOG$this->getCachedMOGData();
  349.             $mogId =0;
  350.             if ($situationRisque->getMOG())
  351.                 $mogId=$situationRisque->getMOG()->getId();
  352.             $commentaire=$situationRisque->getCommentRR();
  353.             $idSR=$situationRisque->getId();
  354.             return $this->render('evrp/identification_sst/_formRR.html.twig', [
  355.                 'mogId' => $mogId,
  356.                 'commentaire'=> $commentaire,
  357.                 'id'=>$idSR,
  358.                 'mogs'=>$listMOG,
  359.                 'type'=>'SSTmetier',
  360.             ]);
  361.         }
  362.         return new JsonResponse(array('status' => 'error','message' => 'Access forbidden!'), 400);
  363.     }
  364.     private function getCachedFrequenceData(): array
  365.     {
  366.         return $this->cache->get('frequence_list', function (ItemInterface $item) {
  367.             $item->expiresAfter(3600);
  368.             return $this->frequenceRepository->findAll();
  369.         });
  370.     }
  371.     private function getCachedGraviteData(): array
  372.     {
  373.         return $this->cache->get('gravite_list', function (ItemInterface $item) {
  374.             $item->expiresAfter(3600);
  375.             return $this->graviteRepository->findAll();
  376.         });
  377.     }
  378.     private function getCachedMOGData(): array
  379.     {
  380.         return $this->cache->get('MOG_list', function (ItemInterface $item) {
  381.             $item->expiresAfter(3600);
  382.             return $this->mogRepository->findAll();
  383.         });
  384.     }
  385. }