<?php
namespace App\Controller\Evrp;
use App\Entity\bilan\Mission;
use App\Entity\bilan\MOG;
use App\Entity\bilan\Situation;
use App\Entity\bilan\SituationRisque;
use App\Entity\bilan\Task;
use App\Entity\Configuration\CompanyEntity;
use App\Repository\bilan\CriticiteRepository;
use App\Repository\bilan\FrequenceRepository;
use App\Repository\bilan\GraviteRepository;
use App\Repository\bilan\JobRepository;
use App\Repository\bilan\MissionRepository;
use App\Repository\bilan\MOGRepository;
use App\Repository\bilan\RisqueRepository;
use App\Repository\bilan\SituationRepository;
use App\Repository\bilan\SituationRisqueRepository;
use App\Repository\bilan\TaskRepository;
use App\Repository\Configuration\CompanyEntityRepository;
use App\Service\SelectedEntityService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
/**
* @Route("/identification-metier")
*/
class IdentificationSSTJOBController extends AbstractController
{
private $jobRepository;
private $criticiteRepository;
private $frequenceRepository;
private $graviteRepository;
private $risqueRepository;
private $mogRepository;
private $cache;
public function __construct(
JobRepository $jobRepository,
CriticiteRepository $criticiteRepository,
FrequenceRepository $frequenceRepository,
GraviteRepository $graviteRepository,
RisqueRepository $risqueRepository,
MOGRepository $mogRepository,
CacheInterface $cache
)
{
$this->jobRepository = $jobRepository;
$this->criticiteRepository = $criticiteRepository;
$this->cache = $cache;
$this->frequenceRepository = $frequenceRepository;
$this->graviteRepository = $graviteRepository;
$this->risqueRepository = $risqueRepository;
$this->mogRepository = $mogRepository;
}
/**
* @Route("/", name="job")
*/
public function index(SelectedEntityService $selectedEntityService, CompanyEntityRepository $ceRepo, RisqueRepository $risqueRepository): Response
{
$entities = [];
$selectedEntity = $selectedEntityService->getSelectedEntity();
if (null === $selectedEntity) {
$entities = $ceRepo->findAll();
}
$menu = 'evaluate';
$left_menu = 'identification-metier';
return $this->render('evrp/identification_sst/job/index.html.twig', [
'menu' => $menu,
'left_menu' => $left_menu,
'entities' => $entities,
'selectedEntity' => $selectedEntity
]);
}
/**
* @Route("/jobs", name="getJobs", methods={"GET"})
*/
public function getJobs(): JsonResponse
{
$jobs = $this->jobRepository->findAll();
$jobsData = array_map(function ($job) {
$processus = $job->getProcessus();
$responsible = $processus->getPilote();
return [
'id' => $job->getId(),
'title' => $job->getTitle(),
'responsible' => $responsible->getFullName(),
'fonction' => $responsible->getFonction(),
'processus' => $processus->getTitle(),
];
}, $jobs);
return new JsonResponse(['jobs' => $jobsData]);
}
/**
* @Route("/tasks/{mission}/{companyEntity}", name="getTasksByMission", methods={"GET"})
*/
public function getTasksByMission(
Mission $mission,
CompanyEntity $companyEntity,
TaskRepository $taskRepository,
SituationRepository $situationRepository,
SituationRisqueRepository $situationRisqueRepository
): JsonResponse {
$tasks = $taskRepository->findBy(['mission' => $mission, 'companyEntity' => $companyEntity], ['id' => 'DESC']);
$tasksData = array_map(
function ($task) use ($situationRepository, $situationRisqueRepository) {
return $this->formatTask($task, $situationRepository, $situationRisqueRepository);
},
$tasks
);
return new JsonResponse(['tasks' => $tasksData]);
}
private function formatTask(
$task,
SituationRepository $situationRepository,
SituationRisqueRepository $situationRisqueRepository
): array {
$situations = $situationRepository->findBy(['task' => $task], ['id' => 'DESC']);
return [
'id' => (string) $task->getId(),
'title' => $task->getTitle(),
'situations' => array_map(
function ($situation) use ($situationRisqueRepository) {
return $this->formatSituation($situation, $situationRisqueRepository);
},
$situations
)
];
}
private function formatSituation($situation, SituationRisqueRepository $situationRisqueRepository): array
{
$situationsRisque = $situationRisqueRepository->findBy(['situation' => $situation], ['id' => 'DESC']);
return [
'id' => (string) $situation->getId(),
'title' => $situation->getTitle(),
'situation_risques' => array_map(
function ($situationRisque) {
return $this->formatSituationRisque($situationRisque);
},
$situationsRisque
)
];
}
private function formatSituationRisque($situationRisque): array
{
$criticite_array = $this->getCachedCriticiteData();
$frequence = $situationRisque->getFrequence();
$gravite = $situationRisque->getGravite();
$idFrequence = $frequence ? $frequence->getId() : null;
$frequenceNote = $frequence ? $frequence->getNote() : 0;
$idGravite = $gravite ? $gravite->getId() : null;
$graviteNote = $gravite ? $gravite->getNote() : 0;
$criticiteValue=$frequenceNote*$graviteNote;
$criticite='';
$criticite_valeur=0;
$criticite_color='';
if($idFrequence && $idGravite) {
foreach ($criticite_array as $criticite_element) {
if (($criticite_element->getType()=='criticite')&&($criticiteValue >=$criticite_element->getValeur())) {
$criticite=$criticite_element->getLegende();
$criticite_valeur=$criticite_element->getValeur();
$criticite_color=$criticite_element->getCouleur();
}
}
}
$mog = $situationRisque->getMog();
$idMog = $mog ? $mog->getId() : null;
$mogNote = $mog ? $mog->getNote() : 0;
$risqueResiduelValue = $criticiteValue * $mogNote;
$risqueResiduel='';
$risqueResiduel_valeur=0;
$risqueResiduel_color='';
if($idMog) {
foreach ($criticite_array as $RR_element) {
if (($RR_element->getType()=='prevention')&&($risqueResiduelValue >=$RR_element->getValeur())) {
$risqueResiduel=$RR_element->getLegende();
$risqueResiduel_valeur=$RR_element->getValeur();
$risqueResiduel_color=$RR_element->getCouleur();
}
}
}
return [
'id' => (string) $situationRisque->getId(),
'idRisque' => $situationRisque->getRisque() ? $situationRisque->getRisque()->getId() : null,
'risque' => $situationRisque->getRisque()->getNom() ?? null,
'idFrequence' => $idFrequence,
'frequenceNote' => $frequenceNote,
'idGravite' => $idGravite,
'graviteNote' => $graviteNote,
'criticiteValue' => $criticiteValue,
'criticite' => $criticite,
'criticite_valeur' => $criticite_valeur,
'criticite_color' => $criticite_color,
'idMog' => $idMog,
'mogNote' => $mogNote,
'risqueResiduelValue' => $risqueResiduelValue,
'risqueResiduel' => $risqueResiduel,
'risqueResiduel_valeur' => $risqueResiduel_valeur,
'risqueResiduel_color' => $risqueResiduel_color,
];
}
/**
* this controller is to save tasks and situations and situation risques in step 2 of identification SST JOB
* @Route("/tasks/save", name="saveTask" , methods={"POST"})
*/
public function saveTask(
Request $request,
CompanyEntityRepository $companyEntityRepository,
MissionRepository $missionRepository,
TaskRepository $taskRepository,
SituationRepository $situationRepository,
SituationRisqueRepository $situationRisqueRepository,
RisqueRepository $risqueRepository
): JsonResponse
{
$companyEntityId = $request->request->getInt('companyEntityId');
if (!$companyEntityId) {
return new JsonResponse([
'error' => 'companyEntity ID is required'
], Response::HTTP_BAD_REQUEST);
}
$companyEntity = $companyEntityRepository->find($companyEntityId);
if (!$companyEntity) {
return new JsonResponse([
'error' => sprintf('Company entity with ID %d not found', $companyEntityId)
], Response::HTTP_NOT_FOUND);
}
$idMission = $request->request->getInt('idMission');
if (!$idMission) {
return new JsonResponse([
'error' => 'Mission ID is required'
], Response::HTTP_BAD_REQUEST);
}
$mission = $missionRepository->find($idMission);
if (!$mission) {
return new JsonResponse([
'error' => sprintf('Mission with ID %d not found', $idMission)
], Response::HTTP_NOT_FOUND);
}
$idTask = $request->request->get('idTask');
if (!$idTask) {
return new JsonResponse([
'error' => 'Task ID is required'
], Response::HTTP_BAD_REQUEST);
}
$currentUser = $this->getUser();
$isNewTask = str_starts_with($idTask, "new");
$task = $isNewTask ? new Task() : $taskRepository->find($idTask);
$task->setMission($mission);
$task->setCompanyEntity($companyEntity);
if($isNewTask) {
$task->setCreatedAt(new \DateTime());
$task->setCreatedBy($currentUser);
}else {
$task->setUpdatedBy($currentUser);
$task->setUpdatedAt(new \DateTime());
}
if (!empty($request->request->get('taskTitle'))) {
$taskTitle = $request->request->get('taskTitle');
$task->setTitle($taskTitle);
if ($isNewTask) {
$task->setSlug(Task::generateSlug($taskTitle));
}
}
$situations = $request->request->get('situations');
if (!empty($situations) && is_array($situations)) {
foreach ($situations as $situationData) {
$isNewSituation = str_starts_with($situationData['id'], "new");
$situation = $isNewSituation ? new Situation() : $situationRepository->find($situationData['id']);
$situation->setTitle($situationData['title']);
$situation->setTask($task);
$task->addSituation($situation);
if($isNewSituation) {
$situation->setCreatedBy($currentUser);
}else {
$situation->setUpdatedBy($currentUser);
}
if(!empty($situationData['situationRisks']) && is_array($situationData['situationRisks'])) {
$newSituationRiskIds = array_column($situationData['situationRisks'], 'idRisque');
if(count($newSituationRiskIds) === 0) {
$situation->removeAllSituationRisques();
continue;
}
$oldSituationRisksIds = $isNewSituation ? [] : $situationRisqueRepository->getSituationRisqueBySituation($situation);
$toRemove = $isNewSituation ? [] : array_diff($oldSituationRisksIds, $newSituationRiskIds);
$toAdd = $isNewSituation ? $newSituationRiskIds : array_diff($newSituationRiskIds, $oldSituationRisksIds);
if (!empty($toRemove)) {
$situationRisqueRepository->removeByRisqueIds($situation, $toRemove);
}
foreach ($toAdd as $risqueId) {
$risque = $risqueRepository->find($risqueId);
if ($risque) {
$situationRisk = new SituationRisque();
$situationRisk->setSituation($situation);
$situationRisk->setRisque($risque);
$situation->addSituationRisque($situationRisk);
}
}
}
}
}
$taskRepository->save($task);
return new JsonResponse(['success' => true, 'taskId' => $task->getId()]);
}
private function getCachedCriticiteData(): array
{
return $this->cache->get('criticite_list', function (ItemInterface $item) {
$item->expiresAfter(3600);
return $this->criticiteRepository->findBy([],['valeur'=>'asc']);
});
}
/**
* @Route("/criticite/{id}/edit", name="editCriticite", methods={"GET","POST"})
*/
public function editCriticite(Request $request, SituationRisque $situationRisque, FrequenceRepository $frequenceRepository, GraviteRepository $graviteRepository): Response
{
if (isset($request->request)) {
$listF= $this->getCachedFrequenceData();
$listG= $this->getCachedGraviteData();
$frequenceId=$situationRisque->getFrequence() ? $situationRisque->getFrequence()->getId() : 0;
$graviteId=$situationRisque->getGravite() ? $situationRisque->getGravite()->getId() : 0;
$commentaire=$situationRisque->getCommentCR();
return $this->render('evrp/identification_sst/_formCR.html.twig', [
'frequenceId' => $frequenceId,
'graviteId' => $graviteId,
'commentaire'=> $commentaire,
'id'=>$situationRisque->getId(),
'frequences'=>$listF,
'gravites'=>$listG,
'type'=>'SSTmetier',
]);
}
return new JsonResponse(array('status' => 'error','message' => 'Access forbidden!'), 400);
}
/**
* @Route("/prevention/{id}/edit", name="editPrevention", methods={"GET","POST"})
*/
public function editPrevention(Request $request, SituationRisque $situationRisque): Response
{
if (isset($request->request)) {
$listMOG= $this->getCachedMOGData();
$mogId =0;
if ($situationRisque->getMOG())
$mogId=$situationRisque->getMOG()->getId();
$commentaire=$situationRisque->getCommentRR();
$idSR=$situationRisque->getId();
return $this->render('evrp/identification_sst/_formRR.html.twig', [
'mogId' => $mogId,
'commentaire'=> $commentaire,
'id'=>$idSR,
'mogs'=>$listMOG,
'type'=>'SSTmetier',
]);
}
return new JsonResponse(array('status' => 'error','message' => 'Access forbidden!'), 400);
}
private function getCachedFrequenceData(): array
{
return $this->cache->get('frequence_list', function (ItemInterface $item) {
$item->expiresAfter(3600);
return $this->frequenceRepository->findAll();
});
}
private function getCachedGraviteData(): array
{
return $this->cache->get('gravite_list', function (ItemInterface $item) {
$item->expiresAfter(3600);
return $this->graviteRepository->findAll();
});
}
private function getCachedMOGData(): array
{
return $this->cache->get('MOG_list', function (ItemInterface $item) {
$item->expiresAfter(3600);
return $this->mogRepository->findAll();
});
}
}