<?php
namespace App\Controller\bilanControllers;
use App\Entity\bilan\Criticite;
use App\Entity\bilan\Frequence;
use App\Entity\bilan\Gravite;
use App\Entity\bilan\Job;
use App\Entity\bilan\Location;
use App\Entity\bilan\Mission;
use App\Entity\bilan\MOG;
use App\Entity\bilan\SituationRisque;
use App\Entity\bilan\Task;
use App\Entity\bilan\Zone;
use App\Entity\Processus;
use App\Entity\User;
use App\Repository\bilan\SituationRisqueRepository;
use App\Repository\bilan\JobRepository;
use App\Repository\bilan\TaskRepository;
use App\Repository\Configuration\CompanyEntityRepository;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ProcessusRepository;
/**
* @Route("/analyseSST")
*/
class AnalyseSSTController extends AbstractController
{
private ProcessusRepository $processusRepository;
private JobRepository $jobRepository;
private CompanyEntityRepository $companyEntityRepository;
public function __construct(ProcessusRepository $processusRepository, JobRepository $jobRepository, CompanyEntityRepository $companyEntityRepository)
{
$this->processusRepository = $processusRepository;
$this->jobRepository = $jobRepository;
$this->companyEntityRepository = $companyEntityRepository;
}
private function getYearsList(): array
{
$currentYear = (int)date('Y');
$years = [];
for ($year = $currentYear; $year >= 2020; $year--) {
$years[] = $year;
}
return $years;
}
/**
* @Route("/mission/{id}", name="analyseSST_mission_detail", methods={"GET"})
*/
public function missionDetail(
Mission $mission,
TaskRepository $taskRepository,
EntityManagerInterface $em
): Response {
$data = $taskRepository->transformAllMision($mission);
// Group flat rows by task for easier template rendering
$grouped = [];
foreach ($data['data'] as $row) {
$taskId = $row['idT'];
if (!isset($grouped[$taskId])) {
$grouped[$taskId] = ['title' => $row['titleT'], 'rows' => []];
}
if ($row['idSR'] !== '') {
$grouped[$taskId]['rows'][] = $row;
}
}
$frequences = $em->getRepository(Frequence::class)->findBy([], ['note' => 'ASC']);
$gravites = $em->getRepository(Gravite::class)->findBy([], ['note' => 'ASC']);
$mogs = $em->getRepository(MOG::class)->findBy([], ['note' => 'ASC']);
return $this->render('bilanTemplates/analyse_sst/mission_detail.html.twig', [
'mission' => $mission,
'grouped' => $grouped,
'frequences' => $frequences,
'gravites' => $gravites,
'mogs' => $mogs,
'left_menu' => 'analyseSST',
'menu' => 'evaluate',
]);
}
/**
* @Route("/sr/{id}", name="analyseSST_sr_detail", methods={"GET"})
*/
public function srDetail(SituationRisque $sr, EntityManagerInterface $em): Response
{
$criticite_array = $em->getRepository(Criticite::class)->findBy([], ['valeur' => 'asc']);
$criticiteValue = $sr->getCriticiteValue();
$criticite = '';
$criticite_color = '#ccc';
if ($sr->getFrequence() && $sr->getGravite()) {
foreach ($criticite_array as $el) {
if ($el->getType() === 'criticite' && $criticiteValue >= $el->getValeur()) {
$criticite = $el->getLegende();
$criticite_color = $el->getCouleur();
}
}
}
$rrValue = $sr->getRisqueResiduelValue();
$risqueR = '';
$rr_color = '#ccc';
if ($sr->getFrequence() && $sr->getGravite() && $sr->getMog()) {
foreach ($criticite_array as $el) {
if ($el->getType() === 'prevention' && $rrValue >= $el->getValeur()) {
$risqueR = $el->getLegende();
$rr_color = $el->getCouleur();
}
}
}
return $this->render('bilanTemplates/analyse_sst/sr_detail.html.twig', [
'sr' => $sr,
'criticiteValue' => $criticiteValue,
'criticite' => $criticite,
'criticite_color' => $criticite_color,
'rrValue' => $rrValue,
'risqueR' => $risqueR,
'rr_color' => $rr_color,
'left_menu' => 'analyseSST',
'menu' => 'evaluate',
]);
}
/**
* @Route("/", name="analyseSST")
*/
public function index(): Response
{
$entities = $this->getUser()->getEntities();
$processus = $this->processusRepository->findProcessusInternal();
$jobs = $this->jobRepository->findByUserEntity();
$missions = $this->getDoctrine()->getRepository(Mission::class)->findAll();
$locations = $this->getDoctrine()->getRepository(Location::class)->findAll();
$zones = $this->getDoctrine()->getRepository(Zone::class)->findAll();
$years = $this->getYearsList();
$users = $this->getDoctrine()->getRepository(User::class)->findBy([], ['lastname' => 'ASC']);
// Filter users with 'evrp' in their modules
$usersWithEvrp = array_filter($users, function(User $user) {
$modules = $user->getModules() ?? [];
return in_array('Bilan SST', $modules);
});
$menu="evaluate";
$left_menu="analyseSST";
return $this->render('bilanTemplates/analyse_sst/index.html.twig', [
'menu' => $menu,
'left_menu' => $left_menu,
'processus' => $processus,
'users' => $usersWithEvrp,
'jobs' => $jobs,
'missions' => $missions,
'locations' => $locations,
'zones' => $zones,
'years' => $years,
'entities' => $entities,
]);
}
/**
* @Route("/analyseSSTData", name="analyseSSTData", methods={"GET"})
*/
public function analyseSSTData(Request $request, SituationRisqueRepository $situationRisqueRepository): Response
{
$field = $request->query->get('field', 'job');
$draw = (int) $request->query->get('draw', 1);
$start = (int) $request->query->get('start', 0);
$length = (int) $request->query->get('length', 11);
$searchValue = $request->query->get('search')['value'] ?? '';
$filters = [
'user_entities' => $this->getUser()->getEntities()->toArray(),
'filter_entity' => $request->query->get('filter_entity', ''),
'filter_processus' => $request->query->get('filter_processus', ''),
'filter_responsible' => $request->query->get('filter_responsible', ''),
'filter_year' => $request->query->get('filter_year', ''),
'filter_criticite' => $request->query->get('filter_criticite', ''),
'filter_risqueResiduel' => $request->query->get('filter_risqueResiduel', ''),
];
if ($field === 'job') {
$filters['filter_job'] = $request->query->get('filter_job', '');
$filters['filter_mission'] = $request->query->get('filter_mission', '');
$filters['filter_date'] = $request->query->get('filter_date', '');
$filters['filter_task'] = $request->query->get('filter_task', '');
$filters['filter_danger'] = $request->query->get('filter_danger', '');
$filters['filter_risque'] = $request->query->get('filter_risque', '');
} elseif ($field === 'location') {
$filters['filter_location'] = $request->query->get('filter_location', '');
$filters['filter_zone'] = $request->query->get('filter_zone', '');
}
$result = $situationRisqueRepository->getServerSideData($field, $start, $length, $searchValue, $filters);
return new JsonResponse([
'draw' => $draw,
'recordsTotal' => $result['totalCount'],
'recordsFiltered' => $result['filteredCount'],
'data' => $result['data'],
]);
}
/**
* @Route("/analyseSSTExport", name="analyseSSTExport", methods={"GET"})
*/
public function analyseSSTExport(Request $request, SituationRisqueRepository $situationRisqueRepository): StreamedResponse
{
$field = $request->query->get('field', 'job');
$searchValue = $request->query->get('search', '');
$filters = [
'user_entities' => $this->getUser()->getEntities()->toArray(),
'filter_entity' => $request->query->get('filter_entity', ''),
'filter_processus' => $request->query->get('filter_processus', ''),
'filter_responsible' => $request->query->get('filter_responsible', ''),
'filter_year' => $request->query->get('filter_year', ''),
'filter_criticite' => $request->query->get('filter_criticite', ''),
'filter_risqueResiduel' => $request->query->get('filter_risqueResiduel', ''),
];
if ($field === 'job') {
$filters['filter_job'] = $request->query->get('filter_job', '');
$filters['filter_mission'] = $request->query->get('filter_mission', '');
$filters['filter_date'] = $request->query->get('filter_date', '');
$filters['filter_task'] = $request->query->get('filter_task', '');
$filters['filter_danger'] = $request->query->get('filter_danger', '');
$filters['filter_risque'] = $request->query->get('filter_risque', '');
} elseif ($field === 'location') {
$filters['filter_location'] = $request->query->get('filter_location', '');
$filters['filter_zone'] = $request->query->get('filter_zone', '');
}
$data = $situationRisqueRepository->getFilteredDataForExport($field, $searchValue, $filters);
$response = new StreamedResponse(function () use ($data, $field) {
ini_set('display_errors', '0');
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
if ($field === 'job') {
$headers = ['Entité', 'Métier', 'Mission', 'Date', 'Tâche', 'Situation dangereuse', 'Risque', 'Criticité', 'Risque résiduel', 'Fréquence', 'Gravité', 'Maitrise H+O+T', 'Actions'];
} elseif ($field === 'location') {
$headers = ['Entité', 'Lieu', 'Zone', 'Date', 'Tâche', 'Situation dangereuse', 'Risque', 'Criticité', 'Risque résiduel', 'Fréquence', 'Gravité', 'MOP', 'MOG', 'Actions'];
} else {
$headers = ['Entité', 'Date', 'Tâche', 'Situation dangereuse', 'Risque', 'Criticité', 'Risque résiduel', 'Fréquence', 'Gravité', 'MOP', 'MOG', 'Actions'];
}
$col = 1;
foreach ($headers as $header) {
$sheet->setCellValueByColumnAndRow($col++, 1, $header);
}
$row = 2;
foreach ($data as $item) {
$col = 1;
$sheet->setCellValueByColumnAndRow($col++, $row, $item['entity'] ?? '');
if ($field === 'job') {
$sheet->setCellValueByColumnAndRow($col++, $row, $item['job'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['mission'] ?? '');
} elseif ($field === 'location') {
$sheet->setCellValueByColumnAndRow($col++, $row, $item['location'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['zone'] ?? '');
}
$sheet->setCellValueByColumnAndRow($col++, $row, $item['dateEnregistrement'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['task'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['danger'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['risque'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['criticity'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, $item['risqueResiduel'] ?? '');
$sheet->setCellValueByColumnAndRow($col++, $row, strip_tags($item['frequenceNote'] ?? ''));
$sheet->setCellValueByColumnAndRow($col++, $row, strip_tags($item['gravityNote'] ?? ''));
// $sheet->setCellValueByColumnAndRow($col++, $row, strip_tags($item['mesureOPNote'] ?? ''));
$sheet->setCellValueByColumnAndRow($col++, $row, strip_tags($item['mesureORGNote'] ?? ''));
$sheet->setCellValueByColumnAndRow($col++, $row, $item['actionsRefs'] ?? '');
$row++;
}
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
});
$filename = 'analyse_sst_' . $field . '_' . date('Y-m-d') . '.xlsx';
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
}
// /**
// * @Route("/datatableJobFilter", name="datatableJobFilter", methods={"GET"})
// */
// public function datatableJobFilter(Request $request): Response
// {
// $em=$this->getDoctrine();
// $processus_id= intval($request->query->get('processus_id'));
// $job_id= intval($request->query->get('job_id'));
// $mission_id= intval($request->query->get('mission_id'));
// $user_id= intval($request->query->get('user_id'));
// $user_data='';
// $processus_list=[];
// $processus_data=[];
// $jobs_list=[];
// $jobs_data=[];
// $missions_list=[];
// $missions_data=[];
// /*
// if($user_id){
// $user_data = $user_id;
// $user=$em->getRepository(User::class)->find($user_id);
// $processus_list=$em->getRepository(Processus::class)->findBy(['pilote'=>$user]);
// foreach($processus_list as $processus) {
// }
// }*/
// if($user_id){
// $user_data = $user_id;
// $user=$em->getRepository(User::class)->find($user_id);
// $processus_list=$em->getRepository(Processus::class)->findBy(['pilote'=>$user]);
// foreach($processus_list as $proc){
// if($proc->getPilote()==$user){
// $selected_processus = false;
// if($proc->getId()==$processus_id){
// $selected_processus=true;
// }
// $processus_data[][$proc->getId()]=[
// "id"=>$proc->getId(),
// "title"=>$proc->getTitle(),
// "selected"=>$selected_processus
// ];
// }
// }
// }else {
// $processus_list=$em->getRepository(Processus::class)->findAll();
// foreach($processus_list as $proc){
// $selected_processus = false;
// if($proc->getId()==$processus_id){
// $selected_processus=true;
// }
// $processus_data[][$proc->getId()]=[
// "id"=>$proc->getId(),
// "title"=>$proc->getTitle(),
// "selected"=>$selected_processus
// ];
// }
// }
// if($processus_id){
// $processus=$em->getRepository(Processus::class)->find($processus_id);
// $user_data = $processus->getPilote()->getId();
// $jobs_list=$em->getRepository(Job::class)->findBy(['processus'=>$processus]);
// foreach($jobs_list as $job){
// if($job->getProcessus()==$processus){
// $selected_job = false;
// if($job->getId()==$job_id){
// $selected_job=true;
// }
// $jobs_data[][$job->getId()]=[
// "id"=>$job->getId(),
// 'title'=>$job->getTitle(),
// 'selected'=>$selected_job
// ];
// }
// }
// }else if($user_id){
// foreach($processus_list as $processus) {
// $jobs_list=$em->getRepository(Job::class)->findBy(['processus'=>$processus]);
// foreach($jobs_list as $job){
// if($job->getProcessus()==$processus){
// $selected_job = false;
// if($job->getId()==$job_id){
// $selected_job=true;
// }
// $jobs_data[][$job->getId()]=[
// "id"=>$job->getId(),
// 'title'=>$job->getTitle(),
// 'selected'=>$selected_job
// ];
// }
// }
// }
// }
// else {
// $jobs_list=$em->getRepository(Job::class)->findAll();
// foreach($jobs_list as $job){
// $selected_job = false;
// if($job->getId()==$job_id){
// $selected_job=true;
// }
// $jobs_data[][$job->getId()]=[
// "id"=>$job->getId(),
// 'title'=>$job->getTitle(),
// 'selected'=>$selected_job
// ];
// }
// }
// if($job_id){
// $job=$em->getRepository(Job::class)->find($job_id);
// $user_data = $job->getProcessus()->getPilote()->getId();
// if(!$processus_id)
// {
// $processus_id=$job->getProcessus()->getId();
// foreach($processus_data as $key=>$proc_data){
// if(array_key_exists($processus_id,$proc_data)){
// $proc_data[$processus_id]['selected']=true;
// $processus_data[$key] = $proc_data;
// }
// }
// }
// $missions_list=$em->getRepository(Mission::class)->findBy(['job'=>$job]);
// foreach($missions_list as $mission){
// if($mission->getJob()==$job){
// $selected_mission = false;
// if($mission->getId()==$mission_id){
// $selected_mission=true;
// }
// $missions_data[][$mission->getId()]=[
// "id"=>$mission->getId(),
// 'title'=>$mission->getTitle(),
// 'selected'=>$selected_mission
// ];
// }
// }
// }else {
// foreach($jobs_list as $job)
// {
// $missions_list=$em->getRepository(Mission::class)->findBy(['job'=>$job]);
// foreach($missions_list as $mission){
// if($mission->getJob()==$job){
// $selected_mission = false;
// if($mission->getId()==$mission_id){
// $selected_mission=true;
// }
// $missions_data[][$mission->getId()]=[
// "id"=>$mission->getId(),
// 'title'=>$mission->getTitle(),
// 'selected'=>$selected_mission
// ];
// }
// }
// }
// }
// if($mission_id && !$job_id && !$processus_id && !$user_id){
// $mission = $em->getRepository(Mission::class)->find($mission_id);
// $job = $mission->getJob();
// $processus = $job->getProcessus();
// $user = $processus->getPilote();
// $user_data = $user->getId();
// foreach($processus_data as $key=>$proc_data){
// if(array_key_exists($processus->getId(),$proc_data)){
// $proc_data[$processus->getId()]['selected']=true;
// $processus_data[$key] = $proc_data;
// }
// }
// foreach($jobs_data as $key=>$job_data){
// if(array_key_exists($job->getId(),$job_data)){
// $job_data[$job->getId()]['selected']=true;
// $jobs_data[$key] = $job_data;
// }
// }
// }
// $filters=[
// 'user_data'=>$user_data,
// 'processus_data'=>$processus_data,
// 'jobs_data'=>$jobs_data,
// 'missions_data'=>$missions_data,
// ];
// return new JsonResponse($filters);
// }
// /**
// * @Route("/datatableLocationFilter", name="datatableLocationFilter", methods={"POST"})
// */
// public function datatableLocationFilter(Request $request): Response
// {
// $em=$this->getDoctrine();
// $processus_id= intval($request->request->get('processus_id'));
// $location_id= intval($request->request->get('location_id'));
// $zone_id= intval($request->request->get('zone_id'));
// $user_id= intval($request->request->get('user_id'));
// $user_data='';
// $processus_list=[];
// $processus_data=[];
// $locations_list=[];
// $locations_data=[];
// $zones_list=[];
// $zones_data=[];
// if($user_id){
// $user_data = $user_id;
// $user=$em->getRepository(User::class)->find($user_id);
// $processus_list=$em->getRepository(Processus::class)->findBy(['pilote'=>$user]);
// foreach($processus_list as $proc){
// if($proc->getPilote()==$user){
// $selected_processus = false;
// if($proc->getId()==$processus_id){
// $selected_processus=true;
// }
// $processus_data[][$proc->getId()]=[
// "id"=>$proc->getId(),
// "title"=>$proc->getTitle(),
// "selected"=>$selected_processus
// ];
// }
// }
// }else {
// $processus_list=$em->getRepository(Processus::class)->findAll();
// foreach($processus_list as $proc){
// $selected_processus = false;
// if($proc->getId()==$processus_id){
// $selected_processus=true;
// }
// $processus_data[][$proc->getId()]=[
// "id"=>$proc->getId(),
// "title"=>$proc->getTitle(),
// "selected"=>$selected_processus
// ];
// }
// }
// if($processus_id){
// $processus=$em->getRepository(Processus::class)->find($processus_id);
// $user_data = $processus->getPilote()->getId();
// $locations_list=$em->getRepository(Location::class)->findBy(['processus'=>$processus]);
// foreach($locations_list as $location){
// if($location->getProcessus()==$processus){
// $selected_location = false;
// if($location->getId()==$location_id){
// $selected_location=true;
// }
// $locations_data[][$location->getId()]=[
// "id"=>$location->getId(),
// 'title'=>$location->getName(),
// 'selected'=>$selected_location
// ];
// }
// }
// }else if($user_id){
// foreach($processus_list as $processus) {
// $locations_list=$em->getRepository(Location::class)->findBy(['processus'=>$processus]);
// foreach($locations_list as $location){
// if($location->getProcessus()==$processus){
// $selected_location = false;
// if($location->getId()==$location_id){
// $selected_location=true;
// }
// $locations_data[][$location->getId()]=[
// "id"=>$location->getId(),
// 'title'=>$location->getName(),
// 'selected'=>$selected_location
// ];
// }
// }
// }
// }
// else {
// $locations_list=$em->getRepository(Location::class)->findAll();
// foreach($locations_list as $location){
// $selected_location = false;
// if($location->getId()==$location_id){
// $selected_location=true;
// }
// $locations_data[][$location->getId()]=[
// "id"=>$location->getId(),
// 'title'=>$location->getName(),
// 'selected'=>$selected_location
// ];
// }
// }
// if($location_id){
// $location=$em->getRepository(Location::class)->find($location_id);
// $user_data = $location->getProcessus()->getPilote()->getId();
// if(!$processus_id)
// {
// $processus_id=$location->getProcessus()->getId();
// foreach($processus_data as $key=>$proc_data){
// if(array_key_exists($processus_id,$proc_data)){
// $proc_data[$processus_id]['selected']=true;
// $processus_data[$key] = $proc_data;
// }
// }
// }
// $zones_list=$em->getRepository(Zone::class)->findBy(['location'=>$location]);
// foreach($zones_list as $zone){
// if($zone->getLocation()==$location){
// $selected_zone = false;
// if($zone->getId()==$zone_id){
// $selected_zone=true;
// }
// $zones_data[][$zone->getId()]=[
// "id"=>$zone->getId(),
// 'title'=>$zone->getName(),
// 'selected'=>$selected_zone
// ];
// }
// }
// }else {
// foreach($locations_list as $location)
// {
// $zones_list=$em->getRepository(Zone::class)->findBy(['location'=>$location]);
// foreach($zones_list as $zone){
// if($zone->getLocation()==$location){
// $selected_zone = false;
// if($zone->getId()==$zone_id){
// $selected_zone=true;
// }
// $zones_data[][$zone->getId()]=[
// "id"=>$zone->getId(),
// 'title'=>$zone->getName(),
// 'selected'=>$selected_zone
// ];
// }
// }
// }
// }
// if($zone_id && !$location_id && !$processus_id && !$user_id){
// $zone = $em->getRepository(Zone::class)->find($zone_id);
// $location = $zone->getLocation();
// $processus = $location->getProcessus();
// $user = $processus->getPilote();
// $user_data = $user->getId();
// foreach($processus_data as $key=>$proc_data){
// if(array_key_exists($processus->getId(),$proc_data)){
// $proc_data[$processus->getId()]['selected']=true;
// $processus_data[$key] = $proc_data;
// }
// }
// foreach($locations_data as $key=>$location_data){
// if(array_key_exists($location->getId(),$location_data)){
// $location_data[$location->getId()]['selected']=true;
// $locations_data[$key] = $location_data;
// }
// }
// }
// $filters=[
// 'user_data'=>$user_data,
// 'processus_data'=>$processus_data,
// 'locations_data'=>$locations_data,
// 'zones_data'=>$zones_data,
// ];
// return new JsonResponse($filters);
// }
}