<?php
namespace App\Controller;
use App\Entity\Activity;
use App\Entity\Comments;
use App\Entity\Folder;
use App\Entity\Indicator;
use App\Entity\Processus;
use App\Entity\Reunion;
use App\Entity\Source;
use App\Entity\Type;
use App\Enum\StatusEnum;
use App\Form\ConfigProcessusType;
use App\Form\ProcessusType;
use App\Repository\ActionRepository;
use App\Repository\ReunionRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Utils\Utility;
use App\Notification\SendNotification;
use App\Repository\ActivityRepository;
use App\Repository\DataRepository;
use App\Repository\IndicatorRepository;
use App\Security\ProcessusVoter;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Security;
/**
* @Route("/processus")
*/
class ProcessusController extends AbstractController
{
/**
* @var SendNotification
*/
private $notify;
private $security;
public function __construct(SendNotification $notify, Security $security)
{
$this->notify = $notify;
$this->security = $security;
}
/**
* @Route("/", name="processus_index", methods={"GET"})
*/
public function index(): Response
{
$processuses = $this->getDoctrine()
->getRepository(Processus::class)
->findAll();
//menu
$menu="processus";
$left_menu="system_management";
return $this->render('processus/index.html.twig', [
'processuses' => $processuses,
'menu'=>$menu,
'left_menu'=>$left_menu
]);
}
/**
* @Route("/configuration", name="config_processus", methods={"GET"})
*/
public function config_processus(Request $request): Response
{
$processuses = $this->getDoctrine()
->getRepository(Processus::class)
->findAll();
$form = $this->createForm(ConfigProcessusType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute('processus_index');
}
//menu
$menu="processus";
$left_menu="configuration";
return $this->render('processus/configuration.html.twig', [
'processuses' => $processuses,
'menu'=>$menu,
'left_menu'=>$left_menu,
'form' => $form->createView(),
]);
}
/**
* @Route("/new/{type}", name="processus_new", methods={"GET","POST"})
*/
public function new(Request $request, String $type): Response
{
$this->denyAccessUnlessGranted(ProcessusVoter::PROCESSUS_CRU);
$processuss = $this->getDoctrine()
->getRepository(Processus::class)
->findAll();
$array_ref=[];
foreach ($processuss as $proc) {
$array_ref[]=$proc->getRef();
}
$processus = new Processus();
$user= $this->getUser();
/* genretate ref */
/*$lastId=0;
$lastprocessus = $this->getDoctrine()->getRepository(processus::class)->findOneBy([], ['id' => 'desc']);
if(is_object($lastprocessus))
{
$lastId = $lastprocessus->getId();
}
$utility = new Utility;
$ref = $utility->generateRef($lastId,processus::PREFIX,'processus');
$processus->setRef($ref);*/
/* end genretate ref*/
$processus ->setType($type);
$form = $this->createForm(processusType::class, $processus);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$ref_exsist = $this->getDoctrine()->getRepository(Processus::class)->findOneBy(['ref'=>$processus->getRef()]);
if (empty($ref_exsist)) {
$processus->setCreatedAt(new \DateTime('now'));
$processus->setCreatedBy($user);
$processus->addParticipant($user);
if($processus->getPilote()) {
$processus->addParticipant($processus->getPilote());
}
$processus->setRef($processus->getRef());
$is_outsourced = boolval($request->request->get('is_outsourced'));
$processus->setIsOutsourced($is_outsourced);
if($is_outsourced) {
$processus->setPilote(null);
}else {
$processus->setExternalCompany('');
$processus->setContactPerson('');
}
// add comment dashboard
$comment = new Comments();
$comment->setCreatedBy($processus->getCreatedBy());
$comment->setProcessus($processus);
//create folder in ged directory
$entityManager = $this->getDoctrine()->getManager();
$folderCommun = $entityManager->getRepository(Folder::class)->findOneBy(["folderName"=>"Documents Communs","path"=>"/"]);
if (empty($folderCommun)) {
$folderCommun = new Folder();
$folderCommun->setFolderName("Documents Communs");
$folderCommun->setFolderType("Documents Communs");
$folderCommun->setPath("/");
}
$folder = new Folder();
$folder->setFolderName($processus->getTitle()) ;
$folder->setParentFolder($folderCommun) ;
$folder->setFolderType("Documents Communs") ;
$folder->setProcessus($processus);
$folder->setPath("/Documents Communs/");
/*$fsObject = new Filesystem();
$current_dir_path = getcwd();
try {
$Commun_dir_path = $current_dir_path . "/Files/Ged_Files/".$folderCommun->getFolderName()."/".$folder->getFolderName();
if (!$fsObject->exists($Commun_dir_path))
{
$old = umask(0);
$fsObject->mkdir($Commun_dir_path, 0775);
$fsObject->chown($Commun_dir_path, "www-data");
$fsObject->chgrp($Commun_dir_path, "www-data");
umask($old);
}
} catch (IOExceptionInterface $exception) {
echo "Error creating directory at". $exception->getPath();
}*/
$entityManager->persist($processus);
$entityManager->persist($comment);
if (empty($folderCommun)) {
$entityManager->persist($folderCommun);
}
$entityManager->persist($folder);
$entityManager->flush();
// $this->notify->notify(
// $processus->getCreatedBy()->getEmail(),
// $processus->getPilote()->getEmail(),
// $processus->getPilote()->getFullName(),
// $processus->getRef()
// );
$this->addFlash("success", "Le processus a été créé avec succès");
return $this->redirectToRoute('processus_index');
}else{
$response = array('error' => 'Cette référence exsiste déjà !');
return new JsonResponse($response,200);
}
}
return $this->render('processus/new.html.twig', [
'processuss'=>$array_ref,
'processus' => $processus,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="processus_show", methods={"GET"})
*/
public function show(Processus $processus): Response
{
//menu
$menu="processus";
$left_menu="system_management";
return $this->render('processus/show.html.twig', [
'processus' => $processus,
'menu' => $menu,
'left_menu' => $left_menu
]);
}
/**
* @Route("/{id}/edit", name="processus_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Processus $processus): Response
{
$processuss = $this->getDoctrine()
->getRepository(Processus::class)
->findAll();
$array_ref=[];
foreach ($processuss as $proc) {
$array_ref[]=$proc->getRef();
}
$form = $this->createForm(ProcessusType::class, $processus);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->denyAccessUnlessGranted(ProcessusVoter::PROCESSUS_CRU);
$processus->setUpdatedAt(new \DateTime('now'));
$is_outsourced = boolval($request->request->get('is_outsourced'));
$processus->setIsOutsourced($is_outsourced);
if($is_outsourced) {
$processus->setPilote(null);
}else {
$processus->setExternalCompany('');
$processus->setContactPerson('');
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash("success","Le processus a été modifié avec succès");
return $this->redirectToRoute('processus_index');
}
return $this->render('processus/edit.html.twig', [
'processuss' => $array_ref,
'processus' => $processus,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/ficheedit", name="processus_fiche_edit", methods={"GET","POST"})
*/
public function ficheedit(Request $request, Processus $processus): Response
{
$this->denyAccessUnlessGranted(ProcessusVoter::PROCESSUS_CRU);
$form = $this->createForm(ProcessusType::class, $processus);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$processus->setUpdatedAt(new \DateTime('now'));
$this->getDoctrine()->getManager()->flush();
$this->addFlash("success","Le processus a été modifié avec succès");
return $this->redirectToRoute('processus_show',['id'=>$processus->getId()]);
}
return $this->render('processus/ficheedit.html.twig', [
'processus' => $processus,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="processus_delete", methods={"POST"})
*/
public function delete(Request $request, Processus $processus): Response
{
$this->denyAccessUnlessGranted(ProcessusVoter::PROCESSUS_D);
if ($this->isCsrfTokenValid('delete'.$processus->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($processus);
$this->addFlash("success","Le processus a été supprimé avec succès");
$entityManager->flush();
}
return $this->redirectToRoute('processus_index');
}
/**
* @Route("/dashboardProcessus/{id}", name="dashboard_processus_signle")
*/
public function dashboardProcessus(ActionRepository $actionRepository, Processus $processus, ReunionRepository $reunionRepository)
{
$utility = new Utility;
$nbrTotalAction = $actionRepository->findNbrAction($processus);
//indicator objectif
$indicators = $this->getDoctrine()
->getRepository(Indicator::class)
->findBy(['processus'=>$processus,'type'=>'OBJECTIF STRATEGIQUE','status'=>Indicator::STATUS_VALIDATED]);
$array_indicators_values=[];
if($indicators)
{
foreach($indicators as $indicator)
{
$cible = $indicator->getCible();
foreach ($indicator->getIndicatorValues() as $indicatorValue)
{
$array_indicator_value=[];
$departValue = $indicatorValue->getJan();
$ecart = $cible - $departValue;
$color_parts_array= $utility->random_rgb_color_array();
$array_indicator_value['name']=$indicator->getTitle();
$array_indicator_value['fillColor']= $utility->generate_rgb_color($color_parts_array,0.2);
$array_indicator_value['color']= $utility->generate_rgb_color($color_parts_array,1);
$array_indicator_value['Jan'] = $utility->getPercentage(($indicatorValue->getJan() - $departValue),$ecart);
$array_indicator_value['Feb'] = $utility->getPercentage(($indicatorValue->getFeb() - $departValue),$ecart);
$array_indicator_value['Mar'] = $utility->getPercentage(($indicatorValue->getMar() - $departValue),$ecart);
$array_indicator_value['Apr'] = $utility->getPercentage(($indicatorValue->getApr() - $departValue),$ecart);
$array_indicator_value['Mai'] = $utility->getPercentage(($indicatorValue->getMai() - $departValue),$ecart);
$array_indicator_value['Jun'] = $utility->getPercentage(($indicatorValue->getJun() - $departValue),$ecart);
$array_indicator_value['Jul'] = $utility->getPercentage(($indicatorValue->getJul() - $departValue),$ecart);
$array_indicator_value['Aug'] = $utility->getPercentage(($indicatorValue->getAug() - $departValue),$ecart);
$array_indicator_value['Sep'] = $utility->getPercentage(($indicatorValue->getSep() - $departValue),$ecart);
$array_indicator_value['Oct'] = $utility->getPercentage(($indicatorValue->getOct() - $departValue),$ecart);
$array_indicator_value['Nov'] = $utility->getPercentage(($indicatorValue->getNov() - $departValue),$ecart);
$array_indicator_value['December'] = $utility->getPercentage(($indicatorValue->getDecember() - $departValue),$ecart);
$array_indicators_values[]=$array_indicator_value;
}
}
}
//first Bar Chart
/*
$array_months=[
1 => "Janvier",
2 => "Février",
3 => "Mars",
4 => "Avril",
5 => "Mai",
6 => "Juin",
7 => "Juillet",
8 => "Août",
9 => "Septembre",
10 => "Octobre",
11 => "Novembre",
12 => "Décembre",
];
$array_individual_actions=[];
$array_objectif_actions=[];
$month_number = date('m');
$i=1;
for ($i=1; $i <= $month_number; $i++) {
$month_text= $array_months[$i];
$individual_actions=$actionRepository->findNbrAction($processus,'not_include',StatusEnum::STATUS_IN_PROGRESS,'late','','',$i);
$array_individual_actions[$month_text]=$utility->getPercentage($individual_actions,$nbrTotalAction);
$objectif_actions=$actionRepository->findNbrAction($processus,'include',StatusEnum::STATUS_IN_PROGRESS,'late','','',$i);
$array_objectif_actions[$month_text]=$utility->getPercentage($objectif_actions,$nbrTotalAction);
}
*/
// chart source
$array_sources=[];
$sources = $this->getDoctrine()->getRepository(Source::class)->findAll();
foreach($sources as $source )
{
$nbrActionSources=$actionRepository->findNbrAction($processus,'','','','','','','',$source);
$array_sources[$source->getTitle()]['value']=$utility->getPercentage($nbrActionSources,$nbrTotalAction);
$array_sources[$source->getTitle()]['color']=$utility->random_color();
}
$types = $this->getDoctrine()->getRepository(Type::class)->findAll();
$array_types=[];
foreach($types as $type )
{
$nbrActionTypes=$actionRepository->findNbrAction($processus,'','','','','','','','',$type);
$array_types[$type->getTitle()]['value']=$utility->getPercentage($nbrActionTypes,$nbrTotalAction);
$array_types[$type->getTitle()]['color']=$utility->random_color();
}
//4 circles
$nbrClosedLateAction = $actionRepository->findNbrAction($processus,'',StatusEnum::STATUS_CLOSED,'late');
$nbrPlannedActions_notStarted = $actionRepository->findNbrAction($processus,'',StatusEnum::STATUS_PLANNED,'','','','','','','','','','no');
$nbrOverBudgetAction = $actionRepository->findNbrAction($processus,'','','','','over');
$nbrActions_overDuration = $actionRepository->findNbrAction($processus,'','','','','','','','','','','','','over');
$nbrClosedLateActionPercent = $utility->getPercentage($nbrClosedLateAction,$nbrTotalAction);
$nbrPlannedActionsPercent = $utility->getPercentage($nbrPlannedActions_notStarted,$nbrTotalAction);
$nbrOverBudgetActionPercent = $utility->getPercentage($nbrOverBudgetAction,$nbrTotalAction);
$nbrActions_overDurationPercent = $utility->getPercentage($nbrActions_overDuration,$nbrTotalAction);
//next reunions
//months
$array_months=[
1 => "Janvier",
2 => "Février",
3 => "Mars",
4 => "Avril",
5 => "Mai",
6 => "Juin",
7 => "Juillet",
8 => "Août",
9 => "Septembre",
10 => "Octobre",
11 => "Novembre",
12 => "Décembre",
];
$month_number = date('m');
$i=1;
$months=[];
for ($i=1; $i <= $month_number; $i++) {
$month_text= $array_months[$i];
$months[]=$month_text;
}
//reunion
$reunions = $reunionRepository->findByCustom($processus,'PLANIFIÉE',5);
return $this->render('processus/dashboard.html.twig', [
'processus' => $processus,
//'individual_actions' => $array_individual_actions,
//'objectif_actions' => $array_objectif_actions,
'nbrClosedLateActionPercent' => $nbrClosedLateActionPercent,
'nbrPlannedActionsPercent' => $nbrPlannedActionsPercent,
'nbrOverBudgetActionPercent' => $nbrOverBudgetActionPercent,
'nbrActions_overDurationPercent' => $nbrActions_overDurationPercent,
'sources' => $array_sources,
'types' => $array_types,
'reunions' => $reunions,
'array_indicators_values'=>$array_indicators_values,
'months'=>$months
]);
}
/**
* @Route("identity/{id}", name="processus_identity", methods={"GET"})
*/
public function processusIdentity(Processus $processus, IndicatorRepository $indicatorRepository, DataRepository $dataRepository, ActivityRepository $activityRepository): Response
{
//find data in
$processus_in =[];
$indicators_in = $indicatorRepository->findIndicatorByRelatedProcessus($processus,'in');
foreach($indicators_in as $indicator)
{
$processusIn = $indicator->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
$doc_in = $dataRepository->findDataByRelatedProcessus($processus,'in');
foreach($doc_in as $doc)
{
$processusIn = $doc->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
$activities_in = $activityRepository->findActivityByRelatedProcessus($processus,'in');
foreach($activities_in as $activity)
{
$processusIn = $activity->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
// find out data
$processus_out =[];
$indicators_out = $indicatorRepository->findIndicatorByRelatedProcessus($processus,'out');
foreach($indicators_out as $indicator)
{
foreach($indicator->getProc() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
$doc_out = $dataRepository->findDataByRelatedProcessus($processus,'out');
foreach($doc_out as $doc)
{
foreach($doc->getProc() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
$activities_out = $activityRepository->findActivityByRelatedProcessus($processus,'out');
foreach($activities_out as $activity)
{
foreach($activity->getProcessusClients() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
//find activities
$activities = $this->getDoctrine()->getRepository(Activity::class)->findBy(['processus'=>$processus]);
// $processus_in = [];
// $indicators_in = [];
$doc_in = [];
// $processus_out = [];
// $indicators_out = [];
$doc_out = [];
// $activities = [];
return $this->render('processus/identity.html.twig', [
'processus' => $processus,
'processus_in' => $processus_in,
'indicators_in' => $indicators_in,
'doc_in' => $doc_in,
'processus_out' => $processus_out,
'indicators_out' => $indicators_out,
'doc_out' => $doc_out,
'activities' => $activities
]);
}
/**
* @Route("/all_processus/json",name="all_processus")
*/
public function getAllProcessus():Response
{
$processus = $this->getDoctrine()->getRepository(Processus::class)->findAll();
$processusJson=[];
foreach($processus as $proc)
{
$processusJson[]=$proc->getTitle();
}
return new JsonResponse($processusJson);
}
/**
* @Route("/fiche-identite/{id}", name="processus_fiche_identite", methods={"GET"})
*/
public function processus_fiche_identite(Processus $processus, IndicatorRepository $indicatorRepository, DataRepository $dataRepository, ActivityRepository $activityRepository)
{
//find data in
$processus_in =[];
$indicators_in = $indicatorRepository->findIndicatorByRelatedProcessus($processus,'in');
foreach($indicators_in as $indicator)
{
$processusIn = $indicator->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
$doc_in = $dataRepository->findDataByRelatedProcessus($processus,'in');
foreach($doc_in as $doc)
{
$processusIn = $doc->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
$activities_in = $activityRepository->findActivityByRelatedProcessus($processus,'in');
foreach($activities_in as $activity)
{
$processusIn = $activity->getProcessus();
if(!in_array($processusIn,$processus_in))
{
$processus_in[]= $processusIn;
}
}
// find out data
$processus_out =[];
$indicators_out = $indicatorRepository->findIndicatorByRelatedProcessus($processus,'out');
foreach($indicators_out as $indicator)
{
foreach($indicator->getProc() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
$doc_out = $dataRepository->findDataByRelatedProcessus($processus,'out');
foreach($doc_out as $doc)
{
foreach($doc->getProc() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
$activities_out = $activityRepository->findActivityByRelatedProcessus($processus,'out');
foreach($activities_out as $activity)
{
foreach($activity->getProcessusClients() as $processusOut)
{
if(!in_array($processusOut,$processus_out))
{
$processus_out[]= $processusOut;
}
}
}
//find activities
$activities = $this->getDoctrine()->getRepository(Activity::class)->findBy(['processus'=>$processus]);
$doc_in = [];
$doc_out = [];
$menu="processus";
$left_menu="system_management";
return $this->render('processus/fiche_identite.html.twig', [
'processus' => $processus,
'processus_in' => $processus_in,
'indicators_in' => $indicators_in,
'doc_in' => $doc_in,
'processus_out' => $processus_out,
'indicators_out' => $indicators_out,
'doc_out' => $doc_out,
'activities' => $activities,
'menu'=>$menu,
'left_menu'=>$left_menu
]);
}
/**
* @Route("/configuration/{id}", name="processus_configuration", methods={"GET"})
*/
public function processus_configuration(Processus $processus) :Response
{
$menu="processus";
$left_menu="system_management";
return $this->render('processus/processus_configuration.html.twig', [
'processus' => $processus,
'menu'=>$menu,
'left_menu'=>$left_menu
]);
}
/**
* @Route("/synthese/{id}", name="processus_synthese", methods={"GET"})
*/
public function processus_synthese(Processus $processus) :Response
{
$menu="processus";
$left_menu="system_management";
return $this->render('processus/processus_synthese.html.twig', [
'processus' => $processus,
'menu'=>$menu,
'left_menu'=>$left_menu
]);
}
/**
* @Route("/participants/{id}", name="processus_participants", methods={"GET"})
*/
public function processus_participants(Processus $processus) :Response
{
$menu="processus";
$left_menu="system_management";
return $this->render('processus/participants.html.twig', [
'processus' => $processus,
'menu'=>$menu,
'left_menu'=>$left_menu
]);
}
}