<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\AdministrateursRepository;
use App\Repository\GroupeRestrictionRepository;
use App\Repository\GroupeRestrictionPageRepository;
use DateTime;
use App\Entity\Pays;
use App\Entity\Etat;
use App\Entity\HistoriqueEvenement;
use App\Entity\Evenement;
use App\Entity\PiecesEvenement;
use App\Entity\Competences;
class EvenementController extends AbstractController
{
public function __construct(SessionInterface $session , Container $container , EntityManagerInterface $em )
{
$this->em = $em ;
$this->session = $session ;
}
#[Route('/evenement', name: 'app_evenement')]
public function index(Request $request,AdministrateursRepository $AdministrateursRepository,GroupeRestrictionRepository $groupeRestrictionRepository,GroupeRestrictionPageRepository $grouprestrictionpageRepository): Response
{
$accessArray=[];
$niveauAcessPages = [];
$groupeRestrictions = [];
if( ($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession()) ){
$admin = $this->session->get('supAdT9m2XJzn4');
}else if(($this->session->get('supAdT9m2XJzn4') != null) && ($request->hasSession())){
$admin = $AdministrateursRepository->findOneBy(['email'=>$this->session->get('supAdT9m2XJzn4')['email']]);
$adminId = $admin->getId();
$groupeRestrictions = $groupeRestrictionRepository->findByAdminId($adminId);
$restrictionPages = $grouprestrictionpageRepository->findByRestriction($groupeRestrictions[0]->getId());
$accessArray = $restrictionPages[0]->getAccess();
$niveauAcessPagesCollection = $restrictionPages[0]->getNiveauAcessPages();
$niveauAcessPagesCollection->initialize();
$niveauAcessPages = $niveauAcessPagesCollection->toArray();
}else {
return $this->redirectToRoute('connexion');
}
$pays = $this->em->getRepository(Pays::class)->findAll();
$etat = $this->em->getRepository(Etat::class)->findAll();
$query = $this->em->createQuery(
'SELECT cj
FROM App\Entity\CoutJournalier cj
JOIN cj.type tc
WHERE tc.nom = \'Evènement\'
'
);
$coutsJournaliers = $query->getResult();
return $this->render('evenement/evenement.html.twig', [
'admin' => $admin,
'pays' => $pays,
'etats' => $etat,
'access' => $accessArray,
'pages' => $niveauAcessPages,
'CoutJournalier'=>$coutsJournaliers[0],
]);
}
/**
* @Route("/serverEvenement", name="serverEvenement", methods={"GET","POST"}, options = {"expose" = true})
*/
public function serverEvenement(Request $request,AdministrateursRepository $AdministrateursRepository): Response
{
if (($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession())) {
$admin = $this->session->get('supAdT9m2XJzn4');
$sql_where_geo = '';
} else {
$admin = $AdministrateursRepository->findOneBy(['email' => $this->session->get('supAdT9m2XJzn4')['email']]);
/* $adminCodesGeo = $admin->getGeo();
if (!empty($adminCodesGeo) && $adminCodesGeo[0] !== "") {
foreach ($adminCodesGeo as $code) {
if (str_ends_with($code, '*')) {
$conditions[] = "u.code_pays_dep LIKE '" . rtrim($code, '*') . "%'";
} else {
$conditions[] = "u.code_pays_dep = '$code'";
}
}
$sql_where_geo = implode(' OR ', $conditions);
} else {
$sql_where_geo = '';
} */
}
$sql_where = "" ;
// $sql_where .= ' AND (ARRAY_CONTAINS(u.motCles, @searchValue) OR u.titre LIKE "%'.$searchValue.'%")';
if($request->get('search')['value']!=""){
$searchValue = $request->get('search')['value'];
//$sql_where .= ' AND ( u.id LIKE \'%'.$request->get('search')['value'].'%\' )';
$sql_where .= ' AND ( u.titre LIKE \'%'.$request->get('search')['value'].'%\' )';
}
$user_array = [] ;
$limit = $request->get('length') ;
$offset = $request->get('start') ;
$array_search = array();
$columns = ['u.id','u.etat'];
$orders = [] ;
for($i=0 ; $i<count($request->get('order')) ;$i++ ){
$orders[] = $columns[ $request->get('order')[$i]['column'] ].' '.$request->get('order')[$i]['dir'] ;
}
if( count($orders)>0){
$order = " ORDER BY ".implode(' , ',$orders) ;
}
else{
$order = "" ;
}
$total_evenements = [];
$total_evenements = $this->em->createQuery(
'SELECT u
FROM App\Entity\Evenement u
WHERE 1=1 ' . $sql_where.'
'
)
->getResult() ;
$I_nbResultatsTotal = count( $total_evenements ) ;
$selectedStatusId = $request->get('status_id');
if ($selectedStatusId !== null) {
$whereClause = " AND u.etat = '$selectedStatusId'";
} else {
$whereClause = " AND u.etat = '4'";
}
$evenements = [];
$adminEvents=[];
$evenements = $this->em->createQuery(
'SELECT u
FROM App\Entity\Evenement u
WHERE 1=1 ' . $sql_where . ' ' . $whereClause . ' ' . $order
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
if (($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession())) {
// Si l'utilisateur est un administrateur et qu'une session est en cours
$adminEvents=$evenements;
} else {
foreach ($evenements as $event) {
$geoCibles = $admin->getGeo();
$paysEvent=$event->getDepartement()->getPays()->getId();
$paysEventCode= $event->getDepartement()->getPays()->getAlpha2();
$cpEvent=$event->getCp();
//dd($cpEvent,$geoCibles,in_array($paysEventCode, $geoCibles),$paysEventCode.'*',$paysEventCode.substr($cpEvent, 0, 3));
if (!empty($admin->getPaysGeo()) && empty($geoCibles) && in_array($paysEvent,$admin->getPaysGeo() )) {
$adminEvents[]=$event;
}
elseif(!empty($geoCibles)&&(in_array($paysEventCode, $geoCibles) || in_array($paysEventCode.'*', $geoCibles) || in_array($paysEventCode.substr($cpEvent, 0, 2), $geoCibles)|| in_array($paysEventCode.substr($cpEvent, 0, 3), $geoCibles)|| in_array($paysEventCode.substr($cpEvent, 0, 4), $geoCibles)))
{
$adminEvents[] = $event;
}
}
}
/*if (($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession())) {
// Si l'utilisateur est un administrateur et qu'une session est en cours
$evenements = $this->em->createQuery(
'SELECT u
FROM App\Entity\Evenement u
WHERE 1=1 ' . $sql_where . ' ' . $whereClause . ' ' . $order
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
} else {
// Récupérer les pays géographiques de l'administrateur
$paysGeo = $admin->getPaysGeo();
// Si $paysGeo n'est pas null, filtrer par pays
if ($paysGeo !== null) {
$paysIds = [];
foreach ($paysGeo as $pays) {
if (is_string($pays)) {
// Si $pays est une chaîne de caractères, alors c'est déjà un ID de pays
$paysIds[] = $pays;
} elseif (is_object($pays) && method_exists($pays, 'getId')) {
// Si $pays est un objet avec une méthode getId(), alors c'est un objet Pays
$paysIds[] = $pays->getId();
}
}
// Récupérer les événements liés à des départements ayant des pays associés aux IDs récupérés
$evenements = $this->em->createQueryBuilder('u')
->select('u')
->from('App\Entity\Evenement', 'u')
->join('u.departement', 'd')
->join('d.pays', 'p')
->where('p.id IN (:paysIds)')
->setParameter('paysIds', $paysIds)
->setMaxResults($limit)
->setFirstResult($offset)
->getQuery()
->getResult();
} else {
// Si $paysGeo est null, ne pas filtrer par pays et récupérer tous les événements
$evenements = $this->em->createQuery(
'SELECT u
FROM App\Entity\Evenement u
WHERE 1=1 ' . $sql_where . ' ' . $whereClause . ' ' . $order
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
}
}*/
$output = [] ;
foreach($adminEvents as $evenement){
// dd($evenement->getParticulier()->getNom());
//
$user=$evenement->getProprietaire();
//dd($user,$user->getRoles(0));
if($user->getRoles(0)==["ROLE_GESTIONNAIRE_FILIALE"]){
$proprietaire = $this->em->createQuery(
'SELECT g
FROM App\Entity\GestionnaireFiliale g
WHERE g.user = \''.$user->getId().'\'
'
)
->getOneOrNullResult() ;
}
elseif ($user->getRoles(0)==["ROLE_GESTIONNAIRE_ENTREPRISE"]) {
$proprietaire = $this->em->createQuery(
'SELECT g
FROM App\Entity\GestionnaireEntreprise g
WHERE g.user = \''.$user->getId().'\'
'
)
->getOneOrNullResult() ;
}
else
{
$proprietaire = $this->em->createQuery(
'SELECT p
FROM App\Entity\Particulier p
WHERE p.user = \''.$user->getId().'\'
'
)
->getOneOrNullResult() ;
}
$output[] = [
'id'=> $evenement->getId() ,
'titre'=> $evenement->getTitre(),
'nomProprietaire' => $proprietaire->getNom().' '.$proprietaire->getPrenom(),
'mailProprietaire' => $evenement->getMailProprietaire(),
'telephoneProprietaire' => $evenement->getTelephoneProprietaire(),
'url' => $evenement->getUrl(),
// 'motCles' =>'--',
// 'coutJournalier' => $evenement->getCoutJournalier()->getCout(),
'cp' => $evenement->getCp(),
//'region' => $evenement->getRegion()->getTitre(),
'departement' => $evenement->getDepartement()->getNom(),
'duree' => $evenement->getDuree(),
'dateCreation'=> $evenement->getDateCreation() !== null ? date_format($evenement->getDateCreation(), 'd/m/Y H:i') : '--',
'dateValidation'=> $evenement->getDateValidation() !== null ? date_format($evenement->getDateValidation(), 'd/m/Y H:i') : '--',
'dateEvenement'=> $evenement->getDateEvenement() !== null ? date_format($evenement->getDateEvenement(), 'd/m/Y H:i') : '--',
'dateDebutDiffusion'=> $evenement->getDateDebutDiffusion() !== null ? date_format($evenement->getDateDebutDiffusion(), 'd/m/Y H:i') : '--',
'dateFinDiffusion'=> $evenement->getDateFinDiffusion() !== null ? date_format($evenement->getDateFinDiffusion(), 'd/m/Y H:i') : '--',
'status' => $evenement->getEtat()->getEtat()
];
}
$JSON = json_encode($output);
$JSON = '{"draw": '.$request->get('draw').',"recordsTotal":'.$I_nbResultatsTotal.',"recordsFiltered":'.$I_nbResultatsTotal.',"data":'.$JSON.'}';
$response = new Response($JSON, 200, ['Content-Type' => 'application/json']);
return $response;
}
/**
* @Route("/modif_evenement/{id}", name="modif_evenement", methods={"GET","POST"} , options={"expose"=true})
*/
public function modif_evenement(Request $request,int $id): Response{
$evenement = $this->em->getRepository(Evenement::class)->find($id);
if (!$evenement) {
return new JsonResponse(['status' => 'KOO', 'message' => 'Entreprise non trouvé !']);
}
$etatId = $request->get('etat_edit');
$etat = $this->em->getRepository(Etat::class)->find($etatId);
$evenement->setEtat($etat);
try {
$this->em->persist($evenement);
$this->em->flush();
return new JsonResponse(['status' => 'OK', 'message' => 'Evenement mis à jour avec succès !']);
} catch (\Exception $e) {
return new JsonResponse(['status' => 'error', 'message' => 'Erreur lors de la modification du evenement : ' . $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @Route("/get_event_byId/{id}", name="get_event_byId", methods={"GET","POST"} , options={"expose"=true})
*/
public function get_event_byId($id){
$evenement=$this->em->getRepository(Evenement::class)->find($id);
if (!$evenement) {
return new JsonResponse(['error' => 'Événement non trouvé'], Response::HTTP_NOT_FOUND);
}
$EventspiecesJointes = [];
$piecesJointes = $this->em->getRepository(PiecesEvenement::class)->findBy(['evenement' => $id]);
foreach( $piecesJointes as $p){
$EventspiecesJointes[] = ['id'=>$p->getId(),
'isPrincipale'=>$p->getPrincipale(),
'src' => str_replace('/uploads/', '/uploadsFront/', $p->getDir().'/'.$p->getNom())
];
}
$historiqueEvent = $this->em->getRepository(HistoriqueEvenement::class)->findBy(['evenement' => $id]);
$dernierHistorique = !empty($historiqueEvent) ? end($historiqueEvent) : null;
$servicesEvent=$evenement->getServices();
$servicesArr=[];
if ($servicesEvent !== null && (is_array($servicesEvent) || $servicesEvent instanceof \Countable) && count($servicesEvent) > 0) {
foreach ($servicesEvent as $service_id) {
$service = $this->em->getRepository(Competences::class)->find($service_id);
if ($service) {
$servicesArr[] = [
'id' => $service->getId(),
'nom' => $service->getNom(),
'type' => ($service->getParents()) ? 'child' :'parent' ,
];
}
}
}
//dd($historiqueEvent);
// dd($EventspiecesJointes);
$data = [
'titre'=>$evenement->getTitre(),
'etat'=>$evenement->getEtat()->getEtat(),
'mailProprietaire' => $evenement->getMailProprietaire(),
'telephoneProprietaire' => $evenement->getTelephoneProprietaire(),
'departement' => $evenement->getDepartement()->getNom(),
'region' => $evenement->getRegion()->getTitre(),
'cp' => $evenement->getCp(),
'duree' => $evenement->getDuree(),
'dateDebutDiffusion' => $evenement->getDateDebutDiffusion()->format('d/m/Y H:i'),
'dateFinDiffusion' => $evenement->getDateFinDiffusion()->format('d/m/Y H:i'),
'description'=>$evenement->getMetaDescription(),
'url' => $evenement->getUrl(),
'motCles' => implode(', ', $evenement->getMotCles()),
'contenu'=>$evenement->getContenu(),
'documents'=>$EventspiecesJointes,
'etatId'=>$evenement->getEtat()->getId(),
'CoutTotal'=>$evenement->getCoutTotal(),
'commentaire' => $dernierHistorique ? $dernierHistorique->getCommentaire() : null,
'servicesArr'=>$servicesArr,
];
return new JsonResponse($data);
}
/**
* @Route("/edit_event", name="edit_event", methods={"GET","POST"} , options={"expose"=true})
*/
public function edit_event(Request $request,AdministrateursRepository $AdministrateursRepository,GroupeRestrictionRepository $groupeRestrictionRepository,GroupeRestrictionPageRepository $grouprestrictionpageRepository){
$adminId=null;
if( ($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession()) ){
$admin = $this->session->get('supAdT9m2XJzn4');
}else if(($this->session->get('supAdT9m2XJzn4') != null) && ($request->hasSession())){
$admin = $AdministrateursRepository->findOneBy(['email'=>$this->session->get('supAdT9m2XJzn4')['email']]);
$adminId = $admin->getId();
$groupeRestrictions = $groupeRestrictionRepository->findByAdminId($adminId);
$restrictionPages = $grouprestrictionpageRepository->findByRestriction($groupeRestrictions[0]->getId());
$accessArray = $restrictionPages[0]->getAccess();
$niveauAcessPagesCollection = $restrictionPages[0]->getNiveauAcessPages();
$niveauAcessPagesCollection->initialize();
$niveauAcessPages = $niveauAcessPagesCollection->toArray();
}else {
return $this->redirectToRoute('connexion');
}
//dd($request->files->get('Autresfichiers'));
$event=$this->em->getRepository(Evenement::class)->find($request->get('idEvent'));
if (!$event) {
return new JsonResponse(['error' => 'Événement non trouvé'], Response::HTTP_NOT_FOUND);
}
//"id" => "T9m2XJzn4")
//$particulier = $this->em->getRepository(Particulier::class)->find($request->get('idParticulier'));
//$user = $this->em->getRepository(User::class)->findOneBy(['email'=>$request->get('emailEvent')]);
//$Departement = $this->em->getRepository(Departement::class)->find($request->get('idDepartementEvent'));
//$RegionEvent = $this->em->getRepository(Region::class)->find($request->get('idRegionEvent'));
$etat = $this->em->getRepository(Etat::class)->find($request->get('etat'));
$event->setTitre($request->get('titre'));
$event->setContenu($request->get('event_content'));
$event->setCp($request->get('cpEvent')) ;
$event->setCoutTotal($request->get('CoutTotalEdit')) ;
// $event->setDepartement($Departement);
// $event->setRegion($RegionEvent);
// $event->setProprietaire($user);
// $event->setMailProprietaire($request->get('emailEvent'));
// $event->setTelephoneProprietaire($request->get('telEvent'));
$event->setUrl($request->get('UrlEvent'));
if($request->get('etat')==1){
$event->setDateValidation(new \DateTime());
}
$event->setMetaDescription($request->get('description'));
$event->setDuree($request->get('dureeEvent'));
$event->setDateupdate(new \DateTime());
$dateDebut=\DateTime::createFromFormat('d/m/Y H:i', $request->get('deb_diffusion_date'));
$dateFin=\DateTime::createFromFormat('d/m/Y H:i', $request->get('fin_diffusion_date'));
$event->setDateDebutDiffusion($dateDebut);
$event->setDateFinDiffusion($dateFin);
$keyWords=$request->get('keyWords');
if(isset($keyWords) && !empty($keyWords)) {
$keyWords = str_replace("; ", ";", $keyWords);
$keyWordsArray = explode(";", $keyWords);
$event->setMotCles($keyWordsArray);
}
$event->setEtat($etat);
//$event->setCoutJournalier($CoutJournalier);
// $event->setParticulier($particulier);
/* $imgprincipale=$request->files->get('imagePrincipale');
$Autresfichiers=$request->files->get('Autresfichiers');
$uploadDirRoot = $this->getParameter('uploads_directory') ;
if( $imgprincipale!=null){
$oldImgPrincipal = $this->em->createQuery(
'SELECT p
FROM App\Entity\PiecesEvenement p
WHERE (p.id) = \''.$request->get('idEvent').'\' AND (p.principale) =1
'
)
->getOneOrNullResult() ;
if($oldImgPrincipal)
{
$filesystem = new Filesystem();
$uploadDirRoot = $this->getParameter('uploads_directory') ;
$filePath = $uploadDirRoot . $oldImgPrincipal->getDirectory() . '/' . $oldImgPrincipal->getNomDocument();
$filesystem->remove($filePath);
$this->em->remove($oldImgPrincipal);
}
$filesystem = new Filesystem();
$piece=new PiecesEvenement();
$imgName = $imgprincipale->getClientOriginalName();
$imgDir = $uploadDirRoot.'/Events/'.$particulier->getId() ;
if( $filesystem->exists($imgDir ) == false ){
$filesystem->mkdir($imgDir , 0777, true);
}
$imgprincipale->move($imgDir, $imgName);
$piece->setNom($imgName);
$piece->setDir('/uploads/Events/'.$particulier->getId());
$piece->setPrincipale(1);
$piece->setDateUpdate(new \DateTime());
$piece->setEvenement($event);
$this->em->persist($piece);
}
if (!empty($Autresfichiers)){
foreach($Autresfichiers as $f)
{$filesystem = new Filesystem();
$piece=new PiecesEvenement();
$imgName = $f->getClientOriginalName();
$imgDir = $uploadDirRoot.'/Events/'.$particulier->getId() ;
if( $filesystem->exists($imgDir ) == false ){
$filesystem->mkdir($imgDir , 0777, true);
}
$f->move($imgDir, $imgName);
$piece->setNom($imgName);
$piece->setDir('/uploads/Events/'.$particulier->getId());
$piece->setPrincipale(0);
$piece->setDateCreation(new \DateTime());
$piece->setEvenement($event);
$this->em->persist($piece);
}
}*/
$historyEdit=new HistoriqueEvenement();
$historyEdit->setEvenement($event);
$historyEdit->setEtat($etat);
$historyEdit->setCommentaire($request->get('Commentaire'));
$historyEdit->setDateUpdate(new \DateTime());
if($admin["email"] === "sadmin")
{
$historyEdit->setResponsable('sadmin');
}
else
{
$historyEdit->setResponsable($adminId);
}
$this->em->persist($historyEdit);
$this->em->persist($event);
$this->em->flush();
return new JsonResponse(['success' => true]);
}
}