<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
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\Component\Filesystem\Filesystem;
use App\Entity\HistoriquePublicite;
use App\Entity\Etat;
use App\Entity\Competences;
use App\Entity\PiecesPublicite;
use App\Entity\Publicite;
use App\Entity\Pays;
use DateTime;
use App\Repository\AdministrateursRepository;
use App\Repository\GroupeRestrictionRepository;
use App\Repository\GroupeRestrictionPageRepository;
use App\Repository\PaysRepository;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class PubliciteController extends AbstractController
{
private $em;
private $session ;
public function __construct(SessionInterface $session,EntityManagerInterface $entityManager)
{
$this->em = $entityManager;
$this->session = $session ;
}
#[Route('/gestion_publicites', name: 'gestion_publicites')]
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 = \'Publicité\'
'
);
$coutsJournaliers = $query->getResult();
return $this->render('publicites/publicites.html.twig', [
'admin' => $admin,
'pays' => $pays,
'etats' => $etat,
'access' => $accessArray,
'pages' => $niveauAcessPages,
'CoutJournalier'=>$coutsJournaliers[0],
]);
}
/**
* @Route("/servePublicites", name="servePublicites", methods={"GET","POST"}, options = {"expose" = true})
*/
public function servePublicites(Request $request,AdministrateursRepository $AdministrateursRepository, PaysRepository $paysRepository): Response
{
$sql_where = "" ;
// $sql_where .= ' AND (ARRAY_CONTAINS(u.motCles, @searchValue) OR u.titre LIKE "%'.$searchValue.'%")';
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 = '';
}
}
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.titre','u.entreprise','u.date_creation'];
$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_publicites = $this->em->createQuery(
'SELECT u
FROM App\Entity\Publicite u
WHERE 1=1 ' . $sql_where.'
'
)
->getResult() ;
$I_nbResultatsTotal = count( $total_publicites ) ;
$selectedStatusId = $request->get('etatId');
if ($selectedStatusId !== null) {
$whereClause = " AND u.etat = '$selectedStatusId'";
} else {
$whereClause = " AND u.etat = '4'";
}
// Initialisation de $entreprises
$entreprises = [];
if (($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N') && ($request->hasSession())) {
$entreprises = $this->em->createQuery(
'SELECT u
FROM App\Entity\Entreprise u'
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
} else {
// Récupérer les pays géographiques de l'administrateur
$paysGeo = $admin->getPaysGeo();
// Si $paysGeo est null, ne pas filtrer par pays
if ($paysGeo !== null) {
// Récupérer les entités Pays par leurs noms
$paysEntities = $paysRepository->createQueryBuilder('p')
->where('p.id IN (:id)')
->setParameter('id', $paysGeo)
->getQuery()
->getResult();
// Récupérer les IDs des pays
$paysIds = array_map(fn($pays) => $pays->getId(), $paysEntities);
// Construire le SQL WHERE pour filtrer par pays
$sql_where_geo_pays = '';
if (!empty($paysIds)) {
$sql_where_geo_pays = ' AND u.Pays IN (:paysIds)';
} else {
$sql_where_geo_pays = ' AND 1 = 0';
}
if ($sql_where_geo == "") {
$entreprises = $this->em->createQuery(
'SELECT u
FROM App\Entity\Entreprise u
WHERE 1=1 '
. $sql_where_geo_pays
)
->setParameter('paysIds', $paysIds)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
} else {
$entreprises = $this->em->createQuery(
'SELECT u
FROM App\Entity\Entreprise u
WHERE 1=1 '
. ($sql_where_geo ? ' AND (' . $sql_where_geo . ')' : '')
. $sql_where_geo_pays
)
->setParameter('paysIds', $paysIds)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
}
} else {
// Si $paysGeo est null, ne filtrer que par $sql_where_geo
if ($sql_where_geo == "") {
$entreprises = $this->em->createQuery(
'SELECT u
FROM App\Entity\Entreprise u'
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
} else {
$entreprises = $this->em->createQuery(
'SELECT u
FROM App\Entity\Entreprise u
WHERE 1=1 '
. ($sql_where_geo ? ' AND (' . $sql_where_geo . ')' : '')
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
}
}
}
$entrepriseIds = array_map(fn($entreprise) => $entreprise->getId(), $entreprises);
/* $publicites = $this->em->createQuery(
'SELECT u
FROM App\Entity\Publicite u
WHERE 1=1 ' .$sql_where .' '. $whereClause.' '.$order
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult(); */
if (!empty($entrepriseIds)) {
$publicites = $this->em->createQuery(
'SELECT u
FROM App\Entity\Publicite u
WHERE u.entreprise IN (:entrepriseIds) ' . $sql_where . ' ' . $whereClause . ' ' . $order
)
->setParameter('entrepriseIds', $entrepriseIds)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult();
} else {
$publicites = []; // Aucun résultat si pas d'IDs d'entreprise
}
$output = [] ;
foreach($publicites as $publicite){
// dd($evenement->getParticulier()->getNom());
$output[] = [
'id'=> $publicite->getId() ,
'titre'=> $publicite->getTitre(),
'entreprise'=> $publicite->getEntreprise()->getNomEntreprise(),
'dateCreation'=> $publicite->getDateCreation() !== null ? date_format($publicite->getDateCreation(), 'd/m/Y H:i') : '--',
'dateValidation'=> $publicite->getDateValidation() !== null ? date_format($publicite->getDateValidation(), 'd/m/Y H:i') : '--',
'status' => $publicite->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("/get_pub_byId/{id}", name="get_pub_byId", methods={"GET","POST"}, options = {"expose" = true})
*/
public function get_pub_byId( $id){
$pub=$this->em->getRepository(Publicite::class)->find($id);
if (!$pub) {
return new JsonResponse(['error' => 'Publicité non trouvé'], Response::HTTP_NOT_FOUND);
}
$publicitespiecesJointes = [];
$piecesJointes = $this->em->getRepository(PiecesPublicite::class)->findBy(['publicite' => $id]);
foreach( $piecesJointes as $p){
// dd($p);
$src = $p->getDir() . '/' . $p->getNom();
if (strpos($src, '/uploads') === 0) {
$src = str_replace('/uploads', '/uploadsFront', $src);
}
$publicitespiecesJointes[] = ['id'=>$p->getId(),
'isPrincipale'=>$p->isPrincipale(),
'src'=>$src,
];
}
// dd($EventspiecesJointes);
$servicesPub=$pub->getServices();
$servicesArr=[];
if ($servicesPub !== null && (is_array($servicesPub) || $servicesPub instanceof \Countable) && count($servicesPub) > 0) {
foreach ($servicesPub 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' ,
];
}
}
}
$data = [
'titre'=>$pub->getTitre(),
'etat'=>$pub->getEtat()->getEtat(),
'dateDebut' => $pub->getDateDebut()->format('d/m/Y H:i'),
'dateFin' => $pub->getDateFin()->format('d/m/Y H:i'),
'motCles' => implode(', ', $pub->getMotsCles()),
'contenu'=>$pub->getContenu(),
'documents'=>$publicitespiecesJointes,
'etatId'=>$pub->getEtat()->getId(),
'duree'=>$pub->getDuree(),
'CoutTotal'=>$pub->getCoutTotal(),
'url'=>$pub->getUrl(),
'description'=>$pub->getMetaDescription(),
'servicesArr'=>$servicesArr,
];
return new JsonResponse($data);
}
/**
* @Route("/edit_publicite", name="edit_publicite", methods={"GET","POST"}, options = {"expose" = true})
*/
public function edit_publicite(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->request->all());
//dd($request->files->get('Autresfichiers'));
$pub=$this->em->getRepository(Publicite::class)->find($request->get('idPub'));
if (!$pub) {
return new JsonResponse(['error' => 'publicité non trouvé'], Response::HTTP_NOT_FOUND);
}
$etat = $this->em->getRepository(Etat::class)->find($request->get('pubEtat'));
$pub->setTitre($request->get('titre'));
$pub->setContenu($request->get('pub_content'));
$pub->setDateUpdate(new \DateTime());
$dateDebut=\DateTime::createFromFormat('d/m/Y H:i', $request->get('deb_date'));
$dateFin=\DateTime::createFromFormat('d/m/Y H:i', $request->get('fin_date'));
$pub->setDateDebut($dateDebut);
$pub->setDateFin($dateFin);
$keyWords=$request->get('keyWords');
if(isset($keyWords) && !empty($keyWords)) {
$keyWords = str_replace("; ", ";", $keyWords);
$keyWordsArray = explode(";", $keyWords);
$pub->setMotsCles($keyWordsArray);
}
$pub->setUrl($request->get('url_pub'));
$pub->setCoutTotal($request->get('CoutTotal'));
$pub->setEtat($etat);
$pub->setDuree($request->get('dureePublicite'));
$pub->setMetaDescription($request->get('description'));
$pub->setDateUpdate(new \DateTime());
if($request->get('pubEtat')==1){
$pub->setDateValidation(new \DateTime());
}
$historyEdit=new HistoriquePublicite();
$historyEdit->setPublicite($pub);
$historyEdit->setEtat($etat);
$historyEdit->setCommentaire($request->get('Commentaire'));
$historyEdit->setDateCreation(new \DateTime());
if($admin["email"] === "sadmin")
{
$historyEdit->setResponsable('sadmin');
}
else
{
$historyEdit->setResponsable($adminId);
}
$this->em->persist($historyEdit);
$this->em->persist($pub);
$this->em->flush();
return new JsonResponse(['success' => true]);
}
/**
* @Route("/delete_publicite", name="delete_publicite", methods={"DELETE"}, options = {"expose" = true})
*/
public function delete_publicite($nomLangue, $id): Response
{ //dd($id);
$pub =$this->em->getRepository(Publicite::class)->find($id);
if (!$pub) {
$msg = ['msg'=>'KOO'] ;
$JSON = json_encode($msg);
$response = new Response($JSON, 200, ['Content-Type' => 'application/json']);
return $response;
}
$piecesJointes = $this->em->getRepository(PiecesPublicite::class)->findBy(['publicite' => $id]);
$historiquePub = $this->em->getRepository(HistoriquePublicite::class)->findBy(['publicite' => $id]);
foreach( $piecesJointes as $p){
$filesystem = new Filesystem();
$uploadDirRoot = $this->getParameter('uploads_directory') ;
$filePath = $p->getDir() . '/' . $p->getNom();
$filePath= $uploadDirRoot.'/entreprises/'.$pub->getEntreprise()->getId().'/publicites/'.$pub->getId().'/'. $p->getNom() ;
// dd( $uploadDirRoot,$filePath);
$filesystem->remove($filePath);
$this->em->remove($p);
}
foreach( $historiquePub as $historique){
$this->em->remove($historique);
}
$this->em->remove($pub);
$this->em->flush();
$msg = ['msg'=>'OK'] ;
$JSON = json_encode($msg);
$response = new Response($JSON, 200, ['Content-Type' => 'application/json']);
return $response;
}
}