<?php
namespace App\Controller;
use DateTime;
use DatePeriod;
use DateInterval;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Entity\Ligne;
use App\Entity\Centre;
use App\Entity\Marque;
use App\Entity\MarqueCl;
use App\Entity\Modele;
use App\Entity\ModeleCl;
use App\Entity\Energie;
use App\Entity\Promotion;
use App\Entity\CentreType;
use App\Entity\Partenaire;
use App\Entity\Rendezvous;
use App\Entity\ClientLibre;
use App\Entity\CentreGroupe;
use App\Entity\LigneBlocage;
use App\Entity\TypeVehicule;
use App\Entity\CentreHoraire;
use App\Entity\RendezVousInfos;
use App\Entity\CentrePrestation;
use App\Entity\PromotionCreneau;
use App\Controller\ApiController;
use Symfony\Component\Mime\Email;
use App\Entity\RendezVousVehicule;
use App\Repository\ModeleClRepository;
use App\Repository\ModeleRepository;
use App\Entity\CentreCouponPromotion;
use App\Entity\ParametreCentreGroupe;
use App\Entity\RendezVousFacturation;
use App\Controller\WebServiceController;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class PublicController extends AbstractController
{
public $id;
protected $em;
protected $cache;
protected $mois;
protected $jours;
private $ApiController;
private $PaylineController;
private $WebServiceController;
private $mailer;
private $session;
public function __construct(SessionInterface $session, ApiController $ApiController, PaylineController $PaylineController, EntityManagerInterface $entityManager, CacheInterface $cache, MailerInterface $mailer, WebServiceController $WebServiceController)
{
date_default_timezone_set('Europe/Paris');
$this->jours = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
$this->mois = array(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");
$this->em = $entityManager;
$this->cache = $cache;
$this->ApiController = $ApiController;
$this->PaylineController = $PaylineController;
$this->WebServiceController = $WebServiceController;
$this->mailer = $mailer;
$this->session = $session;
$ParametreCentreGroupe = $this->em->getRepository(ParametreCentreGroupe::class)->findOneByUrl($_SERVER['SERVER_NAME']);
if ($ParametreCentreGroupe) {
$this->id = $ParametreCentreGroupe->getCentreGroupe()->getId();
$this->session->set('centre_groupe', $ParametreCentreGroupe->getCentreGroupe()->getId());
} else {
$this->id = 1;
$this->session->set('centre_groupe', $this->id);
}
}
#[Route('/reservation', name: 'reservation')]
public function reservation(Request $request)
{
$iframe = $request->query->get('iframe');
if ($iframe) {
$typeCentre = $request->query->get('type_centre');
$repositoryCentre = $this->em->getRepository(Centre::class);
/** @var Centre $centreType */
$centre = $repositoryCentre->findCentreByCentreGroupeIdAndDenomination($this->id, $typeCentre);
return $this->redirectToRoute('prendre_rdv', ['iframe' => true, 'id' => $centre->getId()]);
}
return $this->redirectToRoute('index');
}
#[Route('/reservation-pl', name: 'reservation-pl')]
public function reservationPl(Request $request)
{
$iframe = $request->query->get('iframe');
if ($iframe) {
$typeCentre = $request->query->get('type_centre');
$repositoryCentre = $this->em->getRepository(Centre::class);
/** @var Centre $centreType */
$centre = $repositoryCentre->findCentreByCentreGroupeIdAndDenomination($this->id, $typeCentre);
return $this->redirectToRoute('prendre_rdv', ['iframe' => true, 'id' => $centre->getId()]);
}
return $this->redirectToRoute('index');
}
#[Route('/', name: 'index')]
public function index(Request $Request, AuthenticationUtils $authenticationUtils): Response
{
$ParametreCentreGroupe = $this->em->getRepository(ParametreCentreGroupe::class)->findOneByUrl($_SERVER['SERVER_NAME']);
if (!$ParametreCentreGroupe && $_SERVER['APP_ENV'] == 'prod') {
return $this->render('public/construction.html.twig', [
'controller_name' => 'AdminController',
'serverName' => $_SERVER['SERVER_NAME']
]);
}
//if(empty($Request->getSession()->get('centre_groupe'))){
$Request->getSession()->set('centre_groupe', $this->id);
// $this->id = 20;
// }
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
if ($this->getUser()) {
return $this->redirectToRoute('app_pro');
}
$centreGroupe = $this->em->getRepository(CentreGroupe::class)->find($Request->getSession()->get('centre_groupe'));
$centreGroupeByGerant = [];
if($centreGroupe->getCgGerant()){
$centreGroupeByGerants = $this->em->getRepository(CentreGroupe::class)->findBy(['cg_gerant'=>$centreGroupe->getCgGerant()->getId()]);
foreach ($centreGroupeByGerants as $key => $value) {
if($value->getId() != $Request->getSession()->get('centre_groupe')){
$lien = '';
$type = '';
$ville = '';
$ParametreCentreGroupe = $this->em->getRepository(ParametreCentreGroupe::class)->findOneBy(['centre_groupe'=>$value->getId()]);
$lien = $ParametreCentreGroupe->getPcgUrl();
foreach ($value->getCentres() as $key => $centre) {
$type .= $type?',':''.$centre->getCentreType()->getCtLibelePublic();
$ville .= $ville?',':''.$centre->getCtrAdresse()->getAdrVille();
}
$centreGroupeByGerant []=[
'Nom'=>$value->GetCgNom(),
'Lien'=>$lien,
'Type'=>$type ,
'Ville'=>$ville ,
];
}
}
}
$countCentre = 0;
$firstType = 1;
$arrayTypeCentre = [];
$array_horaires = array();
foreach ($centreGroupe->getCentres() as $key => $centre) {
if ($centre->getCtrParametreCentreAdmin()->isPcaActif()) {
$countCentre++;
}
$arrayTypeCentre[] = $centre->getCentreType()->getId();
$CentreHoraires = $this->em->getRepository(CentreHoraire::class)->getHoraires($centre->getId());
$result = "{}";
if ($centre->getCtrParametreCentre()->getPcGoogleBuisness()) {
$result = $this->cache->get($centre->getCtrParametreCentre()->getPcGoogleBuisness(), function (ItemInterface $item) use ($centre) {
$item->expiresAfter(DateInterval::createFromDateString('7 days'));
$url = "https://maps.googleapis.com/maps/api/place/details/json?key=AIzaSyBs9p5zKlf3sCH5w62p-VAG9dzwzmlLEyw&place_id=" . $centre->getCtrParametreCentre()->getPcGoogleBuisness() . "&language=fr-FR&reviews_sort=newest";
$result = file_get_contents($url);
return $result;
});
}
// $Prestations = $this->cache->get('CentrePrestation_'.$value->getId(), function () use($value){
$CentrePrestations = $this->em->getrepository(CentrePrestation::class)->findByCentreGroupeAndCentreType(
$centre->getCentreGroupe()->getId(),
$centre->getCentreType()->getId()
);
$Prestations = [];
foreach ($CentrePrestations as $key => $CentrePrestation) {
$dateDebut = new datetime();
$dateFin = new datetime();
$dateFin->modify('+ 12 days');
$reduction = $this->ApiController->getTarifPromotionsEntreDates($CentrePrestation->getId(), $dateDebut, $dateFin, $CentrePrestation->getPstTarif());
$reduction = $reduction['tarif_final'];
// dd($CentrePrestation->getPstTarif(),$reduction,$CentrePrestation->getPstTypeVisite()->getTypVstLibeleLong() );
if ($reduction < $CentrePrestation->getPstTarif()) {
$tarif_final = $reduction;
}
$Prestations[] = [
'TypeVisite' => $CentrePrestation->getPstTypeVisite()->getTypVstLibeleLong(),
'PrixInitial' => $CentrePrestation->getPstTarif(),
'Duree' => $CentrePrestation->getPstDuree(),
'Reduction' => $reduction < $CentrePrestation->getPstTarif() ? true : false,
'PrixFinal' => $reduction < $CentrePrestation->getPstTarif() ? $tarif_final : $CentrePrestation->getPstTarif(),
'PaiementEnLigne' => $CentrePrestation->isPaiementEnLigne(),
'MessageAppelCentre' => $CentrePrestation->isMessageAppelCentre(),
'Id' => $CentrePrestation->getId(),
'typeVehicule' => ucfirst($CentrePrestation->getPstTypeVehicule()->getTvLibelle()),
'ordre' => $CentrePrestation->getPstOrdre()
];
}
usort($Prestations, function ($a, $b) {
$aOrdre = $a['ordre'];
$bOrdre = $b['ordre'];
if ($aOrdre === null && $bOrdre === null) return 0;
if ($aOrdre === null) return 1; // $a va après
if ($bOrdre === null) return -1; // $b va après
return $aOrdre <=> $bOrdre;
});
$array_centres[] = ['Horaires' => $CentreHoraires, 'avis' => json_decode($result, true), 'Prestations' => $Prestations];
}
if ($countCentre === 1) {
$firstType = $centreGroupe->getCentres()[0]->getCentreType()->getId();
}
if ($firstType === 1 && !in_array(1, $arrayTypeCentre, true)) {
$firstType = $arrayTypeCentre[0];
}
return $this->render('public/index.html.twig', [
'array_centres' => $array_centres,
'last_username' => $lastUsername,
'countcentres' => $countCentre,
'centreGroupeByGerant' => $centreGroupeByGerant,
'firstType' => $firstType
]);
}
#[Route('/prendre_rdv', name: 'prendre_rdv')]
public function prendre_rdv(ManagerRegistry $doctrine, Request $Request,LoggerInterface $Logger ): Response
{
$id = $Request->get('id');
if (!$Request->get('id')) {
$id = $Request->getSession()->get('centre_id');
}
$Request->getSession()->set('centre_id', $id);
// $centre = $doctrine->getRepository(Centre::class)->find($id);
$centre_id = $Request->getSession()->get('centre_id');
$iframe = $Request->query->get('iframe');
if ($iframe) {
$centre_id = $Request->query->get('id');
}
// dd($centre_id);
$Logger->critical('========================debut cache id_'.$centre_id.' =================');
$data_centre = $this->cache->get('Centre_' . $centre_id, function () use ($centre_id,$Logger) {
$Logger->critical('========================Creation cache id_'.$centre_id.' =================');
$data_centre = $this->em->getRepository(Centre::class)->find($centre_id);
return $data_centre;
});
$Logger->critical('========================fin cache id_' . $centre_id . ' =================');
$bornes_recherche = array();
$bornes_recherche['debut'] = new DateTime();
$bornes_recherche['fin'] = clone $bornes_recherche['debut'];
$DureeMaxRdv = $data_centre->getCtrParametreCentre()->getPcDureeMaxRdv() ? $data_centre->getCtrParametreCentre()->getPcDureeMaxRdv() : 60;
$bornes_recherche['fin']->modify('+' . $DureeMaxRdv . ' days');
// $listeMois = $this->ApiController->liste_mois($bornes_recherche['debut']->format('d-m-Y'), $bornes_recherche['fin']->format('d-m-Y'), $this->mois);
$data_marques = $this->cache->get('marque', function () {
$data_marques = $this->em->getrepository(Marque::class)->findBy([], ['ordre' => 'asc', 'marque_libele' => 'asc']);
return $data_marques;
});
$data_marques_cl = $this->cache->get('marqueCl', function () {
$data_marques_cl = $this->em->getrepository(MarqueCl::class)->findBy([], ['ordre' => 'asc', 'marque_libele' => 'asc']);
return $data_marques_cl;
});
$data_energies = $this->cache->get('energie', function () {
$data_energies = $this->em->getrepository(Energie::class)->findAll();
return $data_energies;
});
// $Prestations = $this->cache->get('CentrePrestation_' . $centre->getId(), function () use ($centre) {
$CentrePrestations = $this->em->getrepository(CentrePrestation::class)->findByCentreGroupeAndCentreType(
$data_centre->getCentreGroupe()->getId(),
$data_centre->getCentreType()->getId(),
);
$Prestations = [];
foreach ($CentrePrestations as $key => $CentrePrestation) {
$dateDebut = new datetime();
$dateFin = new datetime();
$dateFin->modify('+ 12 days');
$reduction = $this->ApiController->getTarifPromotionsEntreDates($CentrePrestation->getId(), $dateDebut, $dateFin, $CentrePrestation->getPstTarif());
$reduction = $reduction['tarif_final'];
// dd($CentrePrestation->getPstTarif(),$reduction,$CentrePrestation->getPstTypeVisite()->getTypVstLibeleLong() );
if ($reduction < $CentrePrestation->getPstTarif()) {
$tarif_final = $reduction;
}
$Prestations[] = [
'TypeVisite' => $CentrePrestation->getPstTypeVisite()->getTypVstLibeleLong(),
'PrixInitial' => $CentrePrestation->getPstTarif(),
'Duree' => $CentrePrestation->getPstDuree(),
'Reduction' => $reduction < $CentrePrestation->getPstTarif() ? true : false,
'PrixFinal' => $reduction < $CentrePrestation->getPstTarif() ? $tarif_final : $CentrePrestation->getPstTarif(),
'PaiementEnLigne' => $CentrePrestation->isPaiementEnLigne(),
'MessageAppelCentre' => $CentrePrestation->isMessageAppelCentre(),
'Id' => $CentrePrestation->getId(),
'ordre' => $CentrePrestation->getPstOrdre()
];
}
usort($Prestations, function ($a, $b) {
$aOrdre = $a['ordre'];
$bOrdre = $b['ordre'];
if ($aOrdre === null && $bOrdre === null) return 0;
if ($aOrdre === null) return 1; // $a va après
if ($bOrdre === null) return -1; // $b va après
return $aOrdre <=> $bOrdre;
});
$TypeVehicules = $doctrine->getRepository(TypeVehicule::class)->findByCentreGroupeCentreType($data_centre->getCentreGroupe()->getId(), $data_centre->getCentreType()->getId());
$forceImmat = 'false';
if ($data_centre->getCtrParametreCentre()->isPcForceImmat()) {
$forceImmat = 'true';
}
$forceTelephone = 'false';
if ($data_centre->getCtrParametreCentre()->isPcTelephoneNonObligatoire()) {
$forceTelephone = 'true';
}
return $this->render('public/prendre_rdv.html.twig', [
'id_centre' => $id,
'centrePrestations' => $Prestations,
'centreType' => $data_centre->getCentreType()->getId(),
'parametreCentre' => $data_centre->getCtrParametreCentre(),
'typeVehicules' => $TypeVehicules,
'marques' => $data_marques,
'marquesCl' => $data_marques_cl,
'energies' => $data_energies,
// 'ListeMois' => $listeMois,
'debut' => $bornes_recherche['debut'],
'Centre' => $data_centre,
'prestation_sel' => $Request->get('prestation') ? $Request->get('prestation') : false,
'forceImmat' => $forceImmat,
'forceTelephone' => $forceTelephone
]);
}
#[Route('/prestation_by_type_vehicule_pub/{id_type_vehicule}', name: 'prestation_by_type_vehicule_pub')]
public function prestation_by_type_vehicule_pub(int $id_type_vehicule)
{
$prestationsArray = [];
$data_prestations = $this->em->getrepository(CentrePrestation::class)->findByCentreGroupeAndTypeVehicule($this->id, $id_type_vehicule);
foreach ($data_prestations as $prestation) {
$prestationsArray[] = array(
'id' => $prestation->getId(),
'pst_tarif' => $prestation->getPstTarif(),
'pst_duree' => $prestation->getPstDuree(),
'type_visite' => $prestation->getPstTypeVisite()->getId(),
'type_visite_libele' => $prestation->getPstTypeVisite()->getTypVstLibele(),
'type_visite_libele_long' => $prestation->getPstTypeVisite()->getTypVstLibeleLong(),
// 'centre_groupe' => $prestation->getCentreGroupe()->getId()
);
}
// Retourner les données en format JSON
return new JsonResponse($prestationsArray);
}
#[Route('/get_energie_prestation', name: 'get_energie_prestation')]
public function get_energie_prestation(Request $Request): Response
{
$data =[];
$energies = [];
$centreId = $Request->getSession()->get('centre_id');
$iframe = $Request->request->get('iframe');
if ($iframe == "true") {
$centreId = $Request->request->get('id');
}
$centre = $this->em->getrepository(centre::class)->find($centreId);
$data_Prestation = $this->em->getRepository(CentrePrestation::class)->find($Request->get('prestation'));
if ($Request->get('type_centre') != 2) {
if (count($data_Prestation->getEnergie())) {
foreach ($data_Prestation->getEnergie() as $key => $value) {
if (array_search($value->getDenomination(), $centre->getCtrParametreCentre()->getEnergies()) !== false) {
$energies[] = ['id' => $value->getId(), 'denomination' => $value->getDenomination()];
}
}
} else {
$data_energies = $this->cache->get('energie_' . $centreId, function () {
$data_energies = $this->em->getrepository(Energie::class)->findAll();
return $data_energies;
});
foreach ($data_energies as $key => $value) {
if (array_search($value->getDenomination(), $centre->getCtrParametreCentre()->getEnergies()) !== false) {
$energies[] = ['id' => $value->getId(), 'denomination' => $value->getDenomination()];
}
}
}
} else {
$data_energies = $this->cache->get('energie', function () {
$data_energies = $this->em->getrepository(Energie::class)->findAll();
return $data_energies;
});
foreach ($data_energies as $key => $value) {
if (array_search($value->getDenomination(), $centre->getCtrParametreCentre()->getEnergies()) !== false) {
$energies[] = ['id' => $value->getId(), 'denomination' => $value->getDenomination()];
}
}
}
$paiementWeb = false;
$paiementCentre = true;
if ($centre->getCtrParametreCentre()->isPaiementEnLigne()) {
if ($data_Prestation->isPaiementEnLigne()) {
$paiementWeb = true;
}
if (!$centre->getCtrParametreCentre()->isPaiementEnCentre()){
$paiementCentre = false;
}
if (!$paiementWeb && !$paiementCentre) {
$paiementCentre = true;
}
}
$data = [
'energies' => $energies,
'paiementWeb' => $paiementWeb,
'paiementCentre' => $paiementCentre
];
return new JsonResponse($data);
}
#[Route('/rech_dispon_rdv', name: 'rech_dispon_rdv')]
public function rech_dispon_rdv(Request $Request): Response
{
// On garde le time limit au cas où, mais avec l'optimisation, ça devrait voler
set_time_limit(1000);
$type_client = $Request->get('type', 'public');
$bornes_recherche = array();
list($annee, $mois, $jour) = explode("-", $Request->get('date'));
$bornes_recherche['debut'] = new DateTime();
$bornes_recherche['debut']->setDate(intval($annee),intval($mois), intval($jour));
if ($bornes_recherche['debut'] > new DateTime()) {
$bornes_recherche['debut']->setTime(0, 0);
}
if ($bornes_recherche['debut']->format('Ymd') == (new \DateTime())->format('Ymd')) {
$bornes_recherche['debut']->setTime(date('H'), date('i'));
}
$bornes_recherche['fin'] = clone $bornes_recherche['debut'];
$bornes_recherche['fin']->setTime(23, 59);
// Initialisation Response et Centre (Inchangé)
$content = new Response();
$content->headers->set('Content-Type', 'application/json');
$centre_id = $Request->getSession()->get('centre_id');
$iframe = $Request->request->get('iframe');
if ($iframe == "true") { $centre_id = $Request->request->get('id'); }
/** @var Centre $data_centre */
// Optimisation : Retirez le cache ici si vous modifiez souvent les centres, sinon OK
$data_centre = $this->em->getRepository(Centre::class)->find($centre_id);
if ($data_centre->getCtrParametreCentre()->isPcAfficheRdv6Jours()) {
$bornes_recherche['fin']->modify('+' . '6 days');
}
// Gestion Prestations (Inchangé)
if ($data_centre->getCentreType()->getId() == 1 || $data_centre->getCentreType()->getId() == 4) {
$id_prestation = $Request->get('prestation_vl');
$data_Prestation = $this->em->getRepository(CentrePrestation::class)->find($id_prestation);
$duree = $data_Prestation->getPstDuree();
$tarif = $data_Prestation->getPstTarif();
} else {
$data_Prestation = false;
$duree = 0; $tarif = 0;
foreach ($Request->get('prestation_pl') as $key => $id_prestation) {
$Prestation = $this->em->getRepository(CentrePrestation::class)->find($id_prestation);
$duree += $Prestation->getPstDuree();
$tarif += $Prestation->getPstTarif();
}
}
// Récupération des lignes (Inchangé)
$data_Ligne = $this->em->getRepository(Ligne::class)->findLigneAndHoraireByTypeCentre($this->id, $data_centre->getCentreType()->getId());
// --- OPTIMISATION CHARGEMENT DONNÉES ---
// 1. On charge TOUS les RDV de la période pour TOUTES les lignes d'un coup
// Note: Assurez-vous que findUpcomingRendezVousByLigne accepte null pour charger tout le centre ou bouclez proprement
// Ici on optimise votre boucle existante :
foreach ($data_Ligne as $key => $ligne) {
// On s'assure que 'evts' est bien un tableau vide au départ
$data_Ligne[$key]['evts'] = [];
$rdvs = $this->em->getRepository(Rendezvous::class)->findUpcomingRendezVousByLigne($key, $bornes_recherche['debut'], $bornes_recherche['fin']);
foreach($rdvs as $rdv) {
$evtFin = clone $rdv->getRdvDateHeure();
$evtFin->modify('+' . $rdv->getRdvDuree() . ' minutes');
// On stocke les timestamp pour comparaison rapide
$data_Ligne[$key]['evts'][] = [
'debut' => $rdv->getRdvDateHeure(),
'fin' => $evtFin,
'debut_ts' => $rdv->getRdvDateHeure()->getTimestamp(),
'fin_ts' => $evtFin->getTimestamp()
];
}
}
// 2. On charge TOUS les Blocages
$data_LigneBlocage = $this->em->getRepository(LigneBlocage::class)->findByCentre($this->id, $data_centre->getCentreType()->getId(), $bornes_recherche['debut'], $bornes_recherche['fin']);
foreach ($data_LigneBlocage as $blocage) {
$lId = $blocage->getLigne()->getId();
if (isset($data_Ligne[$lId])) {
$data_Ligne[$lId]['evts'][] = [
'debut' => $blocage->getBlcDebut(),
'fin' => $blocage->getBlcFin(),
'debut_ts' => $blocage->getBlcDebut()->getTimestamp(),
'fin_ts' => $blocage->getBlcFin()->getTimestamp()
];
}
}
// 3. TRI CRUCIAL : On trie les événements par date pour optimiser la recherche
foreach ($data_Ligne as $key => $ligne) {
usort($data_Ligne[$key]['evts'], function($a, $b) {
return $a['debut_ts'] <=> $b['debut_ts'];
});
}
// --- FIN PREPARATION DONNEES ---
// Initialisation Demi-journées (Inchangé)
$demijournees = array();
$demijournee = clone $bornes_recherche['debut'];
// Petite sécu : on clone pour ne pas modifier la boucle
$loopDate = clone $bornes_recherche['debut'];
$endDate = clone $bornes_recherche['fin'];
while ($loopDate <= $endDate) {
$demijournees[] = array('date' => $loopDate->format('Y-m-d'), 'jour' => $this->jours[$loopDate->format('N') - 1], 'periode' => 'matin');
$demijournees[] = array('date' => $loopDate->format('Y-m-d'), 'jour' => $this->jours[$loopDate->format('N') - 1], 'periode' => 'apres_midi');
$loopDate->modify('+ 1 day');
}
$holidays = $this->ApiController->getFormateHolidays($data_centre->getCtrParametreCentre()->getHolidays(), $bornes_recherche['debut']->format('Y'));
$horaires = $this->em->getRepository(CentreHoraire::class)->getHoraires($data_centre->getid());
// Calcul ouvertures (Inchangé mais nettoyé)
foreach ($demijournees as $key => $dj) {
$objet = $horaires[$dj['jour']][$dj['periode']];
$dateStr = $dj['date'];
$demijournees[$key]['ouverture'] = DateTime::createFromFormat('Y-m-d H:i', $dateStr . ' ' . $objet['ouverture']->format('H:i'));
$demijournees[$key]['fermeture'] = DateTime::createFromFormat('Y-m-d H:i', $dateStr . ' ' . $objet['fermeture']->format('H:i'));
$demijournees[$key]['ouvert'] = $objet['ouvert'];
if (in_array($dateStr, $holidays)) { $demijournees[$key]['ouvert'] = false; }
$demijournees[$key]['jourNumber'] = $demijournees[$key]['ouverture']->format('N');
$demijournees[$key]['journeeContinue'] = $objet['journeeContinue'];
}
// Paramètres de blocage RDV
$creneaux = array();
$hourEndBlockRdv = null; $hourStartBlockRdv = null; $hourBeforeBlock = null;
$now = new \DateTime();
if ($data_centre->getCtrParametreCentre()->isIsBlockRdv()) {
$hourStartBlockRdv = (new \DateTime())->setTime($data_centre->getCtrParametreCentre()->getHourStartBlockRdv(), 0);
$hourEndBlockRdv = (clone $hourStartBlockRdv)->modify('+ ' . $data_centre->getCtrParametreCentre()->getNbHoursBlockRdv() . ' hours');
if ($data_centre->getCtrParametreCentre()->getNbHoursBeforeBlockRdv()) {
$hourBeforeBlock = (new \DateTime())->modify('+ ' . $data_centre->getCtrParametreCentre()->getNbHoursBeforeBlockRdv() . ' hours');
}
}
// --- CŒUR DE L'ALGO OPTIMISÉ ---
foreach ($demijournees as $demijournee) {
if (!$demijournee['ouvert']) continue;
// Limites globales de la demi-journée
$globalOuverture = $demijournee['ouverture'];
$globalFermeture = clone $demijournee['fermeture'];
$globalFermeture->modify('- ' . $duree . ' minutes');
// On boucle sur chaque ligne pour trouver ses créneaux
foreach ($data_Ligne as $key => $ligne) {
$periode = $demijournee['periode'] == 'matin' ? 'am' : 'pm';
$ligneHoraire = $ligne["horaires"][$demijournee['jourNumber']][$periode];
if (!$ligneHoraire) continue; // Pas d'horaire pour cette ligne ce jour là
// Calcul Start Ligne
$ligneOuvertureStr = $ligneHoraire['ouverture'];
if ($demijournee['ouverture']->format('Hi') > $ligneOuvertureStr) {
$heure = clone $demijournee['ouverture'];
} else {
$heure = DateTime::createFromFormat('Y-m-d Hi', $demijournee['date'] . ' ' . $ligneOuvertureStr);
}
// Calcul End Ligne
$ligneFermetureStr = $ligneHoraire['fermeture'];
if ($ligneFermetureStr == "") {
$dernier_creneau_ligne = DateTime::createFromFormat('Y-m-d Hi', $demijournee['date'] . ' 0000');
} else {
$dernier_creneau_ligne = DateTime::createFromFormat('Y-m-d Hi', $demijournee['date'] . ' ' . $ligneFermetureStr);
}
$dernier_creneau_ligne->modify('- ' . $duree . ' minutes');
// BOUCLE DES CRENEAUX (Time Slot)
while (
($demijournee['journeeContinue'] and $periode == 'pm' and $heure <= $globalFermeture)
or ($heure <= $globalFermeture and $heure <= $dernier_creneau_ligne)
) {
$ts = $heure->getTimestamp();
// Optimisation : Si ce créneau existe déjà (trouvé sur une autre ligne), on passe !
// Sauf si vous voulez gérer la "capacité" (nb de places dispo), mais pour "rech_dispo", une seule place suffit.
if (isset($creneaux[$ts])) {
$heure->modify('+ ' . $duree . ' minutes');
continue;
}
$fin = clone $heure;
$fin->modify('+ ' . $duree . ' minutes');
$fin_ts = $fin->getTimestamp();
// 1. Vérification des bornes globales
$creneau_disponible = true;
if ($demijournee['journeeContinue']) {
if ($heure < $bornes_recherche['debut'] or ($periode == 'pm' and $fin > $globalFermeture)) {
$creneau_disponible = false;
// Ici break est risqué si ligne suivante a des horaires différents, on laisse couler
}
} else {
if ($heure < $bornes_recherche['debut']) {
$creneau_disponible = false;
}
}
// 2. Vérification "Block RDV" (Parametrage global)
if ($creneau_disponible && $data_centre->getCtrParametreCentre()->isIsBlockRdv()) {
if ($now >= $hourStartBlockRdv and $heure >= $hourStartBlockRdv and $heure < $hourEndBlockRdv) {
$creneau_disponible = false;
}
if ($hourBeforeBlock && $hourBeforeBlock > $heure) {
$creneau_disponible = false;
}
}
// Variable pour stocker la fin de l'événement qui nous bloque
$collision_end_ts = null;
// 3. Vérification des CONFLITS (En mémoire - Ultra rapide)
if ($creneau_disponible) {
foreach ($ligne['evts'] as $evt) {
// Logique Overlap : (StartA < EndB) et (EndA > StartB)
if ($evt['debut_ts'] < $fin_ts && $evt['fin_ts'] > $ts) {
$creneau_disponible = false;
// IMPORTANT : On sauvegarde la fin de l'événement qui bloque
$collision_end_ts = $evt['fin_ts'];
break;
}
// Optimisation : Si l'event commence après notre fin, inutile de continuer (car trié)
if ($evt['debut_ts'] >= $fin_ts) {
break;
}
}
}
// 4. Gestion de l'ajout et de l'incrémentation
if ($creneau_disponible) {
// C'est libre, on ajoute le créneau
$creneaux[$ts] = clone $heure;
// On avance d'un pas normal (durée)
$heure->modify('+ ' . $duree . ' minutes');
} else {
// Ce n'est pas disponible (Conflit ou Blocage global)
// EST-CE QU'ON DOIT REMPLIR LES TROUS ?
// Si l'option est active ET qu'on a identifié un événement bloquant
if ($data_centre->getCtrParametreCentreAdmin()->isPcaCalendrierRemplirTrou() && $collision_end_ts) {
// ALORS : On saute directement à la fin de l'événement bloquant
// Cela permet de "coller" le prochain créneau au RDV existant
$heure->setTimestamp($collision_end_ts);
} else {
// SINON (Pas d'option ou blocage horaire générique) :
// On avance simplement d'un pas normal pour tester le créneau suivant de la grille
$heure->modify('+ ' . $duree . ' minutes');
}
}
}
}
}
ksort($creneaux);
// ... (Reste de la construction de la réponse JSON JSON inchangée) ...
// ... Copiez collez votre partie $response['message']['donnees'] ...
// PARTIE CONSTRUCTION REPONSE (Identique à votre code)
$response = array();
$response['status'] = 200;
$response['message'] = array();
$response['message']['donnees'] = array();
$date_courante = clone $bornes_recherche['debut'];
$date_courante->setTime(0, 0);
foreach ($demijournees as $key => $demijournee) {
$jour = $date_courante->diff($demijournee['ouverture']);
$jour = $jour->format('%r%a');
if (!array_key_exists($jour, $response['message']['donnees'])) {
$response['message']['donnees'][$jour] = array(
'date' => array(
'jour' => $demijournee['ouverture']->format('d'),
'dow' => $demijournee['jour'],
'mois' => array(
'numero' => $demijournee['ouverture']->format('m'),
'nom' => $this->mois[$demijournee['ouverture']->format('n')],
),
'annee' => $demijournee['ouverture']->format('Y'),
),
);
}
// Initialisation de la clé
if (!isset($response['message']['donnees'][$jour][$demijournee['ouverture']->format('A')])) {
$response['message']['donnees'][$jour][$demijournee['ouverture']->format('A')] = array(
'elements' => 0,
'creneaux' => array(),
'ouvert' => $demijournee['ouvert'],
);
}
}
// Promo (Inchangé)
if ($data_Prestation) {
$retour = $this->em->getRepository(PromotionCreneau::class)->prochainePromotion($data_Prestation->getid(), new DateTime());
$response['message']['promotion'] = (bool)$retour;
}
$test = false;
foreach ($creneaux as $creneau) {
$test = true;
$jour = $date_courante->diff($creneau);
$jour = $jour->format('%r%a');
$tarif_final = $tarif;
if ($data_Prestation && $type_client !== 'pro') {
$reduction = $this->ApiController->getTarifPromotionsParHoraire($data_Prestation->getid(), $creneau, $tarif_final);
$reduction = $reduction['tarif_final'];
if ($reduction < $tarif_final) {
$tarif_final = $reduction;
}
}
// Sécurité si l'index n'existe pas (cas de décalage horaire ou jour)
$ampm = $creneau->format('A');
if(isset($response['message']['donnees'][$jour][$ampm])) {
$response['message']['donnees'][$jour][$ampm]['creneaux'][] = array(
'heure' => $creneau->format('H:i'),
'prix' => isset($tarif_final) ? $tarif_final : null,
);
$response['message']['donnees'][$jour][$ampm]['elements'] += 1;
}
}
$response['duree'] = $duree;
$response['tarif'] = $tarif;
$content->setContent(json_encode($response));
// Gestion Récursion
if($test == false){
$date = new DateTime($Request->get('date'));
if ($data_centre->getCtrParametreCentre()->isPcAfficheRdv6Jours()) {
$date->modify('+ 7 days');
} else {
$date->modify('+ 1 days');
}
$dateTest = new datetime();
if ($date->format('Y') == ($dateTest->format('Y') + 2)) {
return $content;
}
// Optimisation : Plutôt que de rappeler la fonction, il faudrait idéalement
// boucler ici pour éviter la stack overflow, mais pour l'instant on garde votre logique
$Request->request->set("date", $date->format('Y-m-d'));
return $this->rech_dispon_rdv($Request);
}
return $content;
}
#[Route('/getModelesByMarque', name: 'getModelesByMarque')]
public function getModelesByMarque(ModeleRepository $modeleRepository, ModeleClRepository $modeleClRepository, Request $Request): JsonResponse
{
if ($Request->get('id_centre_type') == 1) {
$modeles = $modeleRepository->findBy(['code_marque' => $Request->get('id_marque')], ['mdl_ordre' => 'asc', 'mdl_libele' => 'asc']);
} else if ($Request->get('id_centre_type') == 4) {
$modeles = $modeleClRepository->findBy(['code_marque_cl' => $Request->get('id_marque')], ['mdl_ordre' => 'asc', 'mdl_libele' => 'asc']);
}
$modelesArray = [];
foreach ($modeles as $modele) {
$modelesArray[] = [
'id' => $modele->getId(),
'libele' => $modele->getMdlLibele(),
];
}
return new JsonResponse($modelesArray);
}
#[Route('/liste_date', name: 'liste_date')]
public function liste_date(Request $Request)
{
list($mois1, $annee) = explode("_", $Request->get('mois'));
$date = new datetime();
if ($date->format('n') == $mois1) {
$datedebut = new datetime();
} else {
$datedebut = new datetime($annee . '-' . $mois1 . '-' . '01');
}
$datefin = new datetime($datedebut->format('Y-m-t'));
$datefin->modify('+ 1 days');
$centre_id = $Request->getSession()->get('centre_id');
$data_centreHoraire = $this->cache->get('Horaire_' . $centre_id, function () use ($centre_id) {
$data_centreHoraire = $this->em->getRepository(CentreHoraire::class)->getHoraires($centre_id);
return $data_centreHoraire;
});
$dates = [];
foreach (new DatePeriod($datedebut, new DateInterval('P1D') /* pas d'un jour */, $datefin) as $dt) {
if ($data_centreHoraire[$this->jours[$dt->format('N') - 1]]['matin']['ouvert'] || $data_centreHoraire[$this->jours[$dt->format('N') - 1]]['apres_midi']['ouvert']) {
$dates[] = array(
'DateFormat' => $dt->format('Y-m-d'),
'Lib' => $this->jours[$dt->format('N') - 1] . ' ' . $dt->format('d') . ' ' . $this->mois[$dt->format('n')] . ' ' . $dt->format('Y'),
);
}
}
return new JsonResponse($dates);
}
#[Route('/add_rendezvous_client_libre', name: 'add_rendezvous_client_libre')]
public function add_rendezvous_client_libre(Request $Request, UrlGeneratorInterface $urlGenerator)
{
$rendezvous = new Rendezvous;
$centre_id = $Request->getSession()->get('centre_id');
$iframe = $Request->request->get('iframe');
if ($iframe == "true") {
$centre_id = $Request->request->get('id');
}
$data_centre = $this->cache->get('Centre_' . $centre_id, function () use ($centre_id) {
$data_centre = $this->em->getRepository(Centre::class)->find($centre_id);
return $data_centre;
});
if ('POST' == $Request->getMethod()) {
$client_libre = new ClientLibre;
$client_libre->setClNom($Request->get('nom'));
$client_libre->setClPrenom($Request->get('prenom'));
if ($Request->get('email')) {
$client_libre->setClEmail($Request->get('email'));
}
if ($Request->get('telephone')) {
$client_libre->setClTelephone(preg_replace('/[-.]/', '', $Request->get('telephone')));
}
if ($Request->get('civilite')) {
$client_libre->setClCivilite($Request->get('civilite'));
}
$this->em->persist($client_libre);
$rendezvous->setClientLibre($client_libre);
$duree = 0;
$tarif = 0;
if ($data_centre->getCentretype()->getId() == 1 || $data_centre->getCentretype()->getId() == 4) {
$id_prestation = $Request->get('prestation_vl');
$data_Prestation = $this->cache->get('Prestation' . $id_prestation, function () use ($id_prestation) {
$data_Prestation = $this->em->getRepository(CentrePrestation::class)->find($id_prestation);
return $data_Prestation;
});
$duree += $data_Prestation->getPstDuree();
$tarif += $data_Prestation->getPstTarif();
$rendez_vous_vehicules = new RendezVousVehicule();
if ($data_centre->getCentretype()->getId() == 1) {
if ($Request->get('marque')) {
$marque = $this->em->getRepository(Marque::class)->find($Request->get('marque'));
$rendez_vous_vehicules->setMarque($marque);
if ($Request->get('modele')) {
$modele = $this->em->getRepository(Modele::class)->find($Request->get('modele'));
if ($modele !== null) {
$rendez_vous_vehicules->setModele($modele);
} else {
$modele = $this->em->getRepository(Modele::class)->findOneBy(['code_marque' => $marque->getId(), 'mdl_libele' => 'AUTRES MODELES']);
if ($modele !== null) {
$rendez_vous_vehicules->setModele($modele);
} else {
return new Response('error');
}
}
}
}
} elseif ($data_centre->getCentretype()->getId() == 4) {
if ($Request->get('marque')) {
$marque = $this->em->getRepository(MarqueCl::class)->find($Request->get('marque'));
$rendez_vous_vehicules->setMarqueCl($marque);
if ($Request->get('modele')) {
$modele = $this->em->getRepository(ModeleCl::class)->find($Request->get('modele'));
if ($modele !== null) {
$rendez_vous_vehicules->setModeleCl($modele);
} else {
$modele = $this->em->getRepository(ModeleCl::class)->findOneBy(['code_marque_cl' => $marque->getId(), 'mdl_libele' => 'AUTRES MODELES']);
if ($modele !== null) {
$rendez_vous_vehicules->setModele($modele);
} else {
return new Response('error');
}
}
}
}
}
if ($Request->get('energie')) {
$test_energie = $this->em->getrepository(Energie::class)->find($Request->get('energie'));
$rendez_vous_vehicules->setEnergie($test_energie);
}
$rendez_vous_vehicules->setRdvVhcTypeProprietaire('Autre');
$rendez_vous_vehicules->setRdvVhcImmatriculation($Request->get('immatriculation'));
$this->em->persist($rendez_vous_vehicules);
$rendezvous_infos = new RendezVousInfos();
$rendezvous_infos->setCentrePrestation($this->em->getrepository(CentrePrestation::class)->find($data_Prestation->getId()));
$rendezvous_infos->setVehicule($rendez_vous_vehicules);
$rendezvous_infos->setRendezvous($rendezvous);
$rendezvous_infos->setRdvInfDepot(false);
$rendezvous_infos->setRdvInfConvoyage(false);
$rendezvous_infos->setRdvInfPret(false);
$this->em->persist($rendezvous_infos);
} else {
foreach ($Request->get('prestation_pl') as $key => $prestation) {
$id_prestation = $prestation['prestation'];
$data_Prestation = $this->cache->get('Prestation' . $id_prestation, function () use ($id_prestation) {
$data_Prestation = $this->em->getRepository(CentrePrestation::class)->find($id_prestation);
return $data_Prestation;
});
$id_type_vehicule= $prestation['type_vehicule'];
$data_type_vehicule = $this->em->getRepository(TypeVehicule::class)->find($id_type_vehicule);
$duree += $data_Prestation->getPstDuree();
$tarif += $data_Prestation->getPstTarif();
$rendez_vous_vehicules = new RendezVousVehicule();
// if ($Request->get('marque')) {
$marque = $this->em->getrepository(Marque::class)->find(1);
$rendez_vous_vehicules->setMarque($marque);
if ($Request->get('modele')) {
$modele = $this->em->getrepository(Modele::class)->find(1);
$rendez_vous_vehicules->setModele($modele);
}
// }
if ($prestation['energie']) {
$test_energie = $this->em->getrepository(Energie::class)->find($prestation['energie']);
$rendez_vous_vehicules->setEnergie($test_energie);
}
$rendez_vous_vehicules->setTypeVehicule($data_type_vehicule);
$rendez_vous_vehicules->setRdvVhcTypeProprietaire('Autre');
$rendez_vous_vehicules->setRdvVhcImmatriculation($prestation['immat']);
$this->em->persist($rendez_vous_vehicules);
$rendezvous_infos = new RendezVousInfos();
$rendezvous_infos->setCentrePrestation($this->em->getrepository(CentrePrestation::class)->find($data_Prestation->getId()));
$rendezvous_infos->setVehicule($rendez_vous_vehicules);
$rendezvous_infos->setRendezvous($rendezvous);
$rendezvous_infos->setRdvInfDepot(false);
$rendezvous_infos->setRdvInfConvoyage(false);
$rendezvous_infos->setRdvInfPret(false);
$this->em->persist($rendezvous_infos);
}
}
$rendezvous->setCentre($this->em->getrepository(Centre::class)->find($data_centre->getId()));
$rendezvous->setCentreType($this->em->getrepository(CentreType::class)->find($data_centre->getCentreType()->getId()));
$rendezvous->setTokenRendezVous(md5(uniqid()));
$rendezvous->setRdvDateHeure(new Datetime($Request->get('date_rdv') . ' ' . $Request->get('heure_rdv')));
$rendezvous->setRdvDuree($duree);
$rendezvous->setRdvDateCreation(new Datetime());
$rendezvous->setPartenaire($this->em->getrepository(Partenaire::class)->find(2));
if ($rendezvous->getRdvDateHeure() < new DateTime()) {
$this->addFlash('error', 'La date et l\'heure de rendez ne peut être pris dans le passé, veuillez choisir un autre créneau.');
return $this->redirectToRoute('prendre_rdv', ['id' => $centre_id]);
}
$tarif_initial = $tarif;
$tarif_final = $tarif_initial;
if ($Request->get('prestation_vl') or count($Request->get('prestation_pl')) == 1) {
if ($data_centre->getCentreType()->getId() == 1 || $data_centre->getCentreType()->getId() == 4) {
$reduction = $this->ApiController->getTarifPromotionsParHoraire($Request->get('prestation_vl'), $rendezvous->getRdvDateHeure(), $tarif_final);
} else {
$reduction = $this->ApiController->getTarifPromotionsParHoraire($Request->get('prestation_pl')[0]['prestation'], $rendezvous->getRdvDateHeure(), $tarif_final);
}
// $reduction = $reduction['tarif_final'];
if ($reduction['tarif_final'] < $tarif_final) {
$rendezvous->setPromotion($this->em->getrepository(Promotion::class)->find($reduction['id_promotion']));
$tarif_final = $reduction['tarif_final'];
} else {
if ($Request->get('code_promo')) {
$CentreCouponPromotion = $this->em->getrepository(CentreCouponPromotion::class)->findByCode_Coupon_prestation($id_prestation, $Request->get('code_promo'));
if ($CentreCouponPromotion) {
if ($CentreCouponPromotion[0]['cpn_type_reduction'] == 0) {
$tarif_final = $CentreCouponPromotion[0]['cpn_prm_montant_remise'];
} else {
$tarif_final = $CentreCouponPromotion[0]['pst_tarif'] - (($CentreCouponPromotion[0]['pst_tarif'] * $CentreCouponPromotion[0]['cpn_prm_montant_remise']) / 100);
}
$CentreCouponPromotion1 = $this->em->getrepository(CentreCouponPromotion::class)->find($CentreCouponPromotion[0]['id']);
$CentreCouponPromotion1->setCpnPrmNbrUtilisation($CentreCouponPromotion1->getCpnPrmNbrUtilisation() + 1);
$this->em->persist($CentreCouponPromotion1);
$rendezvous->setCouponPromotion($CentreCouponPromotion1);
}
}
}
if ($Request->get('p_centre') == "1") {
if ($Request->get('pay2x') == "true") {
$tarif_final += $data_centre->getCtrParametreCentre()->GetPcOptDeuxFoisMontant();
}
if ($Request->get('payassucv') == "true") {
$tarif_final += $data_centre->getCtrParametreCentre()->getPcOptAssuranceCvMontant();
}
if ($Request->get('paymodif') == "true") {
$tarif_final += $data_centre->getCtrParametreCentre()->getPcOptRdvModifiableMontant();
}
}
}
$rendezvous->setRdvTarif($tarif_final);
if ($data_centre->getCtrParametreCentre()->isPcRappelSms()) {
if ($Request->get('smsrappel') == "true" && $Request->get('telephone') != null) {
$rendezvous->setRdvDemandeRappelSms(true);
} else {
$rendezvous->setRdvDemandeRappelSms(false);
}
}
$debut = clone $rendezvous->getRdvDateHeure();
$fin = clone $debut;
$fin->modify('+ ' . $duree . ' minutes');
$Lignes = $this->em->getrepository(Ligne::class)->findByLigneDisponible($data_centre->getCentreGroupe()->getid(), $debut, $fin, $data_centre->getCentreType()->getId());
if (!$Lignes or count($Lignes) == 0) {
$this->addFlash('error', 'Ce créneau ' . $rendezvous->getRdvDateHeure()->format('d/m/Y H:i') . ' n\'est plus disponible, veuillez en choisir un autre');
return $this->redirectToRoute('prendre_rdv', ['id' => $centre_id]);
} else {
$Ligne = $this->em->getrepository(Ligne::class)->find($Lignes[0]['id']);
$rendezvous->setLigne($Ligne);
}
// verification du paiement en ligne ou selon le choix dna la page de validation
$paiementenligne = true;
if ($Request->get('p_centre') == "0") {
$paiementenligne = false;
}
if ($data_centre->getCtrParametreCentre()->IsPaiementEnLigne() == false) {
$paiementenligne = false;
}
if ($data_centre->getCtrParametreCentre()->IsPaiementEnLigne() && $paiementenligne) {
$rendezvous->setRdvDatetimeTimeout(new datetime());
$rendezvous->setRdvTimeOut("1020");
}
if ($Request->get('smsconfirm') == "true" && $Request->get('telephone') != null) {
$rendezvous->setRdvDemandeConfirmationSms(true);
} else {
$rendezvous->setRdvDemandeConfirmationSms(false);
}
$this->em->persist($rendezvous);
$this->em->flush();
//envoi rdv a autoplanning
$this->ApiController->sendAddRdvToAutoPlanning($rendezvous);
$this->ApiController->sendAddRdvToCtMalin($rendezvous);
if ($paiementenligne) {
// envoi vers paiement en ligne
$return = $this->PaylineController->envoiPaylineComptant($rendezvous, $rendezvous->getRdvTarif(), $Request, $data_centre);
if ($return['result'] == 'OK') {
$url = $return['url'];
} else {
$this->addFlash('error', $return['Msg']);
$url = $urlGenerator->generate('erreur', []);
}
} else {
// envoi email de confirmation
$this->ApiController->envoi_email_confirmation_client($rendezvous);
$this->ApiController->envoi_email_confirmation_centre($rendezvous);
//envoi sms de confirmation
if ($Request->get('smsconfirm') == "true" && $Request->get('telephone' ) != null
&& $rendezvous->getCentre()->getCtrParametreCentre()->isPcEnvoiSmsConfirm() === true) {
$this->ApiController->EnvoiSmsRdvConfirm($rendezvous, $Request->get('telephone'));
}
// renvoyer la page de confirmation
$url = $urlGenerator->generate('confirmation_rdv', [
'id' => $rendezvous->getTokenRendezVous(),
]);
}
// dd($rendezvous);
}
return new Response($url);
}
#[Route('/erreur', name: 'erreur')]
public function erreur(Request $Request)
{
return $this->render('public/erreur.html.twig', []);
}
#[Route('/rech_coupon_promotion', name: 'rech_coupon_promotion')]
public function rech_coupon_promotion(Request $Request)
{
$CentreCouponPromotion = $this->em->getRepository(CentreCouponPromotion::class)->findByCode_Coupon_prestation($Request->request->get('prestation'), $Request->request->get('coupon'));
return new JsonResponse($CentreCouponPromotion ? $CentreCouponPromotion[0] : null);
}
#[Route('/confirmation_rdv/{id}', name: 'confirmation_rdv')]
public function confirmation_rdv($id, Request $Request)
{
$Rendezvous = $this->em->getRepository(Rendezvous::class)->findOneBy(['tokenRendezVous' => $id]);
$paramCentre = $Rendezvous->getCentre()->getCtrParametreCentre();
$CentreHoraires = $this->em->getRepository(CentreHoraire::class)->getHoraires($Rendezvous->getCentre()->getId());
return $this->render('public/confirmation_rdv.html.twig', [
'Rendezvous' => $Rendezvous,
'CentreHoraires' => $CentreHoraires,
'parametreCentre' => $paramCentre
]);
}
#[Route('/modification_rendez_vous/{token}', name: 'modification_rendez_vous')]
public function modification_rendez_vous($token, Request $request)
{
$Rendezvous = $this->em->getRepository(Rendezvous::class)->findOneBy(['tokenRendezVous' => $token]);
$request->getSession()->set('centre_id', $Rendezvous->getCentre()->getId());
if (!$Rendezvous) {
$this->addFlash('error', 'Le rendez-vous sélectionné n\'est plus disponible. Merci de contacter le centre.');
return $this->redirectToRoute('erreur');
}
if ($Rendezvous->getNombreModification() > 0) {
$this->addFlash('error', 'Vous avez atteint le nombre maximum de modifications de rendez-vous autorisées. Merci de contacter le centre.');
return $this->redirectToRoute('erreur');
}
// Date actuelle
$dateActuelle = new DateTime();
// Calcul de la différence en heures entre les deux dates
$interval = $dateActuelle->diff($Rendezvous->getRdvDateHeure());
$heuresDifference = $interval->h;
if ($interval->h < 24 && $interval->d == 0) {
$this->addFlash('error', 'Vous ne pouvez pas modifier un rendez-vous moins de 24 heures avant celui-ci. Merci de contacter le centre.');
return $this->redirectToRoute('erreur');
}
$prestation_vl = null;
$prestation_pl = null;
if ($Rendezvous->getCentre()->getCentreType()->getId() == 1 || $Rendezvous->getCentre()->getCentreType()->getId() == 4) {
$prestation_vl = $Rendezvous->getRendezVousInfos()[0]->getCentrePrestation()->getId();
} elseif ($Rendezvous->getCentre()->getCentreType()->getId() == 2) {
$prestation_pl = '0';
foreach ($Rendezvous->getRendezVousInfos() as $key => $RendezVousInfo) {
$prestation_pl .= ',' . $RendezVousInfo->getCentrePrestation()->getId();
}
}
return $this->render('public/modification_rdv.html.twig', [
'Rendezvous' => $Rendezvous,
'Centre' => $Rendezvous->getCentre(),
'debut' => new datetime(),
'prestation_vl' => $prestation_vl,
'prestation_pl' => $prestation_pl,
'centreType' => $Rendezvous->getCentre()->getCentreType()->getId(),
]);
}
#[Route('/modification_rendez_vous_up', name: 'modification_rendez_vous_up')]
public function modification_rendez_vous_up(Request $Request, UrlGeneratorInterface $urlGenerator)
{
$Rendezvous = $this->em->getRepository(Rendezvous::class)->findOneBy(['tokenRendezVous' => $Request->get('token1')]);
if (!$Rendezvous) {
$this->addFlash('error', 'Le rendez-vous sélectionné n\'est plus disponible. Merci de contacter le centre.');
return $this->redirectToRoute('erreur');
}
$Rendezvous->setRdvDateHeure(new Datetime($Request->get('date_rdv1') . ' ' . $Request->get('heure_rdv1')));
$debut = clone $Rendezvous->getRdvDateHeure();
$fin = clone $debut;
$fin->modify('+ ' . $Rendezvous->getRdvDuree() . ' minutes');
$Lignes = $this->em->getrepository(Ligne::class)->findByLigneDisponible($Rendezvous->getCentre()->getCentreGroupe()->getid(), $debut, $fin, $Rendezvous->getCentre()->getCentreType()->getId());
if (!$Lignes or count($Lignes) == 0) {
$this->addFlash('error', 'Ce créneau ' . $Rendezvous->getRdvDateHeure()->format('d/m/Y H:i') . ' n\'est plus disponible, veuillez en choisir un autre');
return $this->redirectToRoute('erreur');
} else {
$Ligne = $this->em->getrepository(Ligne::class)->find($Lignes[0]['id']);
$Rendezvous->setLigne($Ligne);
}
$Rendezvous->setNombreModification(1);
$this->em->persist($Rendezvous);
$this->em->flush();
$this->ApiController->envoi_email_confirmation_client($Rendezvous);
$this->ApiController->envoi_email_confirmation_centre($Rendezvous);
//envoi sms de confirmation
if ($Rendezvous->getCentre()->getCtrParametreCentre()->isPcEnvoiSmsConfirm() === true) {
$this->ApiController->EnvoiSmsRdvConfirm($Rendezvous, $Rendezvous->getClientLibre() ? $Rendezvous->getClientLibre()->getClTelephone() : $Rendezvous->getClientCompte()->getCliContact1Telephone());
}
// renvoyer la page de confirmation
$url = $urlGenerator->generate('confirmation_rdv', [
'id' => $Rendezvous->getTokenRendezVous(),
]);
return new Response($url);
}
#[Route('/payline_cancel_url_iframe', name: 'payline_cancel_url_iframe')]
public function payline_cancel_url_iframe(Request $request)
{
$type = $request->query->get('type');
return $this->redirectToRoute('payline_cancel_url', ['iframe' => true, 'type_centre' => $type]);
}
#[Route('/payline_return_url_iframe', name: 'payline_return_url_iframe')]
public function payline_return_url_iframe(Request $request)
{
$type = $request->query->get('type');
$retour = $this->PaylineController->returnPaymentPayline($request);
if ($retour['Result'] == 'OK') {
return $this->redirectToRoute('confirmation_rdv', ['id' => $retour['token_rdv'],'iframe' => true]);
} else {
$type = $request->query->get('type_centre');
$this->addFlash('error', $retour['Msg']);
return $this->redirectToRoute('erreur', ['iframe' => true, 'type_centre' => $type]);
}
}
#[Route('/payline_cancel_url', name: 'payline_cancel_url')]
public function payline_cancel_url(Request $Request)
{
$this->PaylineController->CancelPaymentPayline($Request);
$this->addFlash('error', 'Votre rendez-vous à bien été annuler');
$iframe = $Request->query->get('iframe');
$type = $Request->query->get('type_centre');
if ($iframe) {
return $this->redirectToRoute('erreur', ['iframe' => true, 'type_centre' => $type]);
}
return $this->redirectToRoute('erreur');
}
#[Route('/payline_return_url', name: 'payline_return_url')]
public function payline_return_url(Request $Request)
{
$retour = $this->PaylineController->returnPaymentPayline($Request);
if ($retour['Result'] == 'OK') {
return $this->redirectToRoute('confirmation_rdv', ['id' => $retour['token_rdv']]);
} else {
$this->addFlash('error', $retour['Msg']);
return $this->redirectToRoute('erreur');
}
}
#[Route('/payline_notification_url', name: 'payline_notification_url')]
public function payline_notification_url(Request $Request)
{
$retour = $this->PaylineController->returnNotificationPaymentPayline($Request);
return new Response('ok');
}
#[Route('/attestation_rendez_vous/{token}', name: 'attestation_rendez_vous_pub')]
public function attestation_rendez_vous($token)
{
$RendezVous = $this->em->getRepository(RendezVous::class)->findOneBy(['tokenRendezVous' => $token]);
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->set('isRemoteEnabled', true);
// $pdfOptions->set('chroot', [$this->getParameter('Directory')]);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
//return $this->render('admin/template/confirmation_rdv.html.twig', [
$html = $this->renderView('admin/template/confirmation_rdv.html.twig', [
'rdv' => $RendezVous,
]);
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
$dompdf->stream('confirmation_rdv.rdf', array("Attachment" => false));
// $output = $dompdf->output();
// $path = 'uploads/'.$RendezVous->getCentre()->getId();
// if (!file_exists($path)) {
// mkdir($path, 0777, true);
// }
// file_put_contents($path.'/confirmation_rdv.pdf', $output);
return new Response('ok');
}
#[Route('/test_email', name: 'test_email')]
public function test_email(Request $Request, MailerInterface $mailer)
{
set_time_limit(300000);
// create a new cURL resource
$ch = curl_init();
$param = array(
'id' => 1,
'cg_gerant_id' => 1,
'centre_groupe_css_id' => 1,
'cg_nom' => 'Test mon centres 2',
'url' => 'http: //aquila-infotech.fr/Centre_Shared_beta_test/web',
'url2' => '',
'cg_pas_horaires' => '15',
'cg_stay_to_date_rdv' => '1',
'actif' => '1',
'id_partenaire' => '',
);
// dd($param);
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:8000/centre_groupe_add_up");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// grab URL and pass it to the browser
$centre = curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
$centres = json_decode($centre, true);
// dd($centres);
return new JsonResponse($centres);
}
#[Route('/envoi_email_contact', name: 'envoi_email_contact')]
public function envoi_email_contact(Request $Request)
{ // MailerInterface $mailer
$Centre = $this->em->getRepository(Centre::class)->findOneBy(['centre_groupe' => $this->id]);
$email = (new Email())
->from('noreply@notification-abs.com')
->to($Centre->getCtrEmail())
//->to('h.madi@autobilan-systems.com')
->ReplyTo($Request->get('email'))
->subject('Formulaire de contact par un client')
->html($this->renderView('email/contact.html.twig',
[
'Request' => ['nom' => $Request->get('nom'),
'email' => $Request->get('email'),
'objet' => $Request->get('objet'),
'message' => $Request->get('message'),
],
]
));
$this->mailer->send($email);
return new Response('ok');
}
#[Route('/mentions_legales', name: 'mentions_legales')]
public function mentions_legales()
{
return $this->render('public/mentions_legales.html.twig');
}
#[Route('/politique_de_confidentialite', name: 'politiques')]
public function politiques()
{
$parametreCentreGroupe = $this->em->getRepository(ParametreCentreGroupe::class)->findOneBy(['centre_groupe' => $this->id]);
return $this->render('public/politiques.html.twig', [
'parametreCentreGroupe' => $parametreCentreGroupe,
]);
}
#[Route('/Cookies_et_technologies_similaires', name: 'cookies')]
public function cookies()
{
return $this->render('public/cookies.html.twig');
}
#[Route('/Politique_RGPD', name: 'rgpd')]
public function rgpd()
{
return $this->render('public/rgpd.html.twig');
}
}