<?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 App\Entity\Avocats;
use App\Entity\RendezVous;
use App\Form\AvocatsType;
use App\Repository\AvocatsRepository;
use App\Repository\StatutsRepository;
use App\Repository\RendezVousRepository;
use App\Repository\TranchesRepository;
use App\Repository\LieuxRepository;
use App\Repository\JoursFermeturesRepository;
use App\Repository\JoursSemaineRepository;
use Datetime;
use DateInterval;
use Mailjet\Api\Client;
use Mailjet\Resources;
use Eluceo\iCal\Domain\Entity\Calendar;
use Eluceo\iCal\Domain\Entity\Event;
use Eluceo\iCal\Property\Event\Location;
use Eluceo\iCal\Property\Event\Text;
class RendezVousController extends AbstractController
{
/**
* @Route("/rendezvous", name="app_rendez_vous")
*/
public function index(Request $request, JoursSemaineRepository $joursSemaineRepo, AvocatsRepository $avocatsRepository,JoursFermeturesRepository $joursFermeturesRepo,LieuxRepository $lieuxRepository): Response
{
$avocatsListe = array();
if(isset($_GET['lieu']))
{
$lieuGet = $_GET['lieu'];
$avocatsListe = $joursSemaineRepo->findBy(array('Lieux'=> $lieuGet) );
}
else
{
$lieuGet = 'vide';
}
if(isset($_GET['avocat']))
{
$avocat = $_GET['avocat'];
$avocatGet = $_GET['avocat'];
}
else
{
$avocat = '';
$avocatGet = '';
}
$date = date('d-m-Y');
$date = strtotime($date);
$date = strtotime("+8 day", $date);
$date = date('d-m-Y', $date);
// FERMETURE GENERALE
$fermeture = array();
$jfGlobal = $joursFermeturesRepo->findBy(array('Avocats'=>$avocat,'Lieux'=>$lieuGet));
foreach($jfGlobal as $res)
{
$j = ltrim($res->getDate()->format('d'),'0');
$m = ltrim($res->getDate()->format('m'),'0');
$y = $res->getDate()->format('Y');
$d = $j.'-'.$m.'-'.$y;
array_push($fermeture,$d);
}
return $this->render('rendez_vous/index.html.twig', [
'avocat' => $avocatsRepository->findOneById($avocat),
'lieux' => $lieuxRepository->findAll(),
'date'=>$date,
'fermeture'=>$fermeture,
'lieuGet'=>$lieuGet,
'avocatsListe'=>$avocatsListe,
'avocatGet' => $avocatGet
]);
}
/**
* @Route("/ajaxTranchesHoraires", name="ajaxTranchesHoraires")
*/
public function ajaxTranchesHoraires(Request $request, TranchesRepository $tranchesRepo, JoursFermeturesRepository $joursFermeturesRepo, RendezVousRepository $rdvRepo, AvocatsRepository $avocatsRepository,LieuxRepository $lieuxRepository): Response
{
$lieu = "'".$_POST['lieu']."'";
$joursSemaine = $joursFermeturesRepo->findOneBy(array('Avocats'=>$_POST['avocat'],'Lieux'=>$_POST['lieu'],'Date'=>new Datetime($_POST['date'])));
$tranches = $tranchesRepo->findBy(array('JoursFermetures'=>$joursSemaine,'Ouvert'=>1));
$chaine = '';
$chaine .= "<div class='row'><div class='col-12'><div class='row'>";
$i = 0;
foreach($tranches as $res)
{
$date="'".$res->getDate()->format('d-m-Y')."'";
$tranche = "'".$res->getDate()->format('H:i')."'";
$trancheB = $res->getDate()->format('H:i');
if($res->isOccupe())
{
}
else
{
$i++;
$chaine .= '<div class="col-sm-2"><button type="button" data-toggle="modal" data-target="#exampleModal" class="btn btn-default disponible" id="id" onclick="selectHoraire(' . $date . ',' . $lieu . ','.$tranche.')" value="' . $trancheB . '">' . $trancheB. '</button> </div>';
}
}
if($i == 0)
{
$chaine .= '<div class="alert alert-danger" role="alert" style="font-size:18px">
Il n\'y a plus de disponibilités pour cette date
</div>';
}
$chaine .= '</div></div></div>';
/* $dernierRdv = '';
$chaine = '';
$chaine .= "<div class='row'>";
$y=0;
foreach($heures as $res)
{
$y++;
foreach($minutes as $res2)
{
$tranche = $res."h".$res2;
$trancheB = "'".$tranche."'";
$trancheC = $res.":".$res2.":00";
$date = "'".$_POST['date']."'";
$lieu = "'".$_POST['lieu']."'";
$datetempDebut1 = new Datetime($_POST['date'].' '.$trancheC);
$datetempFin1s = date('Y-m-d H:i:s',strtotime('+1 hour',strtotime($_POST['date'].' '.$trancheC)));
$datetempFin1 = new Datetime($datetempFin1s);
$nbRdv = $rdvRepo->findItemsCreatedBetweenTwoDates($datetempDebut1,$datetempFin1);
if(count($nbRdv) == 0)
{
$datetempDebuts1 = date('Y-m-d H:i:s',strtotime('-30 min',strtotime($_POST['date'].' '.$trancheC)));
$datetempDebut1 = new Datetime($datetempDebuts1);
$datetempFin1s = date('Y-m-d H:i:s',strtotime('+30 min',strtotime($_POST['date'].' '.$trancheC)));
$datetempFin1 = new Datetime($datetempFin1s);
$nbRdv2 = $rdvRepo->findItemsCreatedBetweenTwoDates($datetempDebut1,$datetempFin1);
if(count($nbRdv2) == 0)
{
$chaine .= '<div class="col-sm-2"><button type="button" data-toggle="modal" data-target="#exampleModal" class="btn btn-default disponible" id="' . $tranche . '" onclick="selectHoraire(' . $date . ',' . $lieu . ',' . $trancheB . ')" value="' . $tranche . '">' . $tranche. '</button> </div>';
}
}
}
}
$chaine .= "</div>";*/
return new Response($chaine);
}
/**
* @Route("/confirmerRdv", name="confirmerRdv")
*/
public function confirmerRdv(Request $request,JoursFermeturesRepository $joursFermeturesRepo, TranchesRepository $tranchesRepo, AvocatsRepository $avocatsRepository,StatutsRepository $statutsRepository, RendezVousRepository $rdvRepository,LieuxRepository $lieuxRepository): Response
{
$em = $this->getDoctrine()->getManager();
$avocat = $avocatsRepository->findOneById($_POST['avocatInput']);
$lieu = $lieuxRepository->findOneById($_POST['lieuInput']);
$statuts = $statutsRepository->findOneById(1);
$dateT = $_POST['dateInput'].' '.str_replace('h',':',$_POST['horaireInput']).':00';
$date = new Datetime($dateT);
$dateTemp = new Datetime($_POST['dateInput']);
$date2 = new Datetime($dateT);
$date2->add(new DateInterval('PT1H'));
$date3 = new Datetime($dateT);
$date3->modify('- 30 min');
$datemin = $date3->format('Y-m-d H:i:s');
$datemax = $date2->format('Y-m-d H:i:s');
$joursFermetures = $joursFermeturesRepo->findOneBy(array('Avocats'=>$avocat,'Lieux'=>$lieu,'Date'=>$dateTemp));
if($_POST['tel'][0] == '0')
{
$phone = substr($_POST['tel'],1);
}
else
{
$phone = $_POST['tel'];
}
$phone = $_POST['extension'].$phone;
$rdvExist = $rdvRepository->findOneBy(['Date'=>$date,'Avocats'=>$avocat]);
if($rdvExist == '')
{
$rdv = new RendezVous();
$rdv->setCreated(new Datetime());
$rdv->setAvocats($avocat);
$rdv->setLieux($lieu);
$rdv->setNom($_POST['nom']);
$rdv->setPrenom($_POST['prenom']);
$rdv->setTelephone($phone);
$rdv->setEmail($_POST['email']);
$rdv->setMotif($_POST['motif']);
$rdv->setStatuts($statuts);
$rdv->setHoraires($_POST['horaireInput']);
$rdv->setDate($date);
$rdv->setDateFin($date2);
$rdvRepository->add($rdv, true);
// requete repo
$tranches = $tranchesRepo->findItemsCreatedBetweenTwoDates2($datemin,$datemax,$joursFermetures->getId());
foreach($tranches as $res)
{
$res->setOuvert(0);
$em->persist($res);
$em->flush();
}
$mj = new \Mailjet\Client('9c42ddfa4db6f8f973a32c7087ea2d51',
null, true,
['url' => "api.mailjet.com", 'version' => 'v4', 'call' => false]
);
$message = 'Bonjour '.$_POST['prenom'].', Nous avons bien reçu votre demande de rendez-vous du '.$_POST['dateInput'].' à '.$_POST['horaireInput'].' avec maître '.$avocat->getNom().' '.$avocat->getPrenom().' et vous invitons à vérifier vos emails pour la suite y réservée.';
/* $body = [
'Text' => $message,
'To' => $phone,
'From' => "LLVD",
];
$response = $mj->post(Resources::$SmsSend, ['body' => $body]);
$response->success();
*/
// Données du message
/***************************** */
$data = array(
'key' => '0c33c31c02c1e3ef72692c7bec035c96',
'destinataires' => $phone,
'message' => $message,
'expediteur' => 'LLVD',
'date' => '',
'smslong' => 1
);
// Initialisation de cURL avec l'URL Ã appeler
$ch = curl_init('https://manager.envoyersmspro.com/api/envoyer/sms');
// Paramètres cURL pour activer le POST et retour de la réponse
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
// Passage des données
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data, '', '&'));
// Appel de l'API Envoyer SMS Pro et récupération de la réponse dans la variable $reponse_json
$reponse_json = curl_exec ($ch);
curl_close ($ch);
// Conversion JSON en tableau avec json_decode (http://fr2.php.net/manual/fr/function.json-decode.php)
$reponse_array = json_decode($reponse_json, true);
/*************************/
$to = $_POST['email'];
$subject = 'Demande de rendez-vous soumise pour validation';
$message = $this->renderView(
// templates/emails/registration.txt.twig
'emails/confirmation.html.twig',
[
'nom' => strtoupper($_POST['nom']),
'prenom' => strtoupper($_POST['prenom']),
'date'=>$_POST['dateInput'],
'heure'=>$_POST['horaireInput'],
'email'=>$_POST['email'],
'telephone'=>$_POST['tel'],
'lieu'=>$lieu->getLibelle(),
'adresse'=>$lieu->getAdresse(),
'telAvocat'=>$avocat->getTel(),
'emailAvocat'=>$avocat->getEmail(),
'avocat'=>$avocat->getNom().' '.$avocat->getPrenom(),
]
);
$mj = new \Mailjet\Client('9c42ddfa4db6f8f973a32c7087ea2d51',
'eace5eb7252f4ff3a1b483251360e04c',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "dontreply@llvd-avocats.be",
'Name' => "LLVD AVOCATS"
],
'To' => [
[
'Email' => $to,
],
[
'Email' => $avocat->getEmail(),
]
],
'Bcc' => [ // 👈 C’est ici qu’on met Jocelyn en copie cachée
[
'Email' => 'jocelyn@piranha.lu',
]
],
'Subject' => $subject,
'HTMLPart' => $message,
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
}
return $this->render('rendez_vous/confirmation.html.twig', [
'nom' => strtoupper($_POST['nom']),
'prenom' => strtoupper($_POST['prenom']),
'date'=>$_POST['dateInput'],
'heure'=>$_POST['horaireInput'],
'email'=>$_POST['email'],
'telephone'=>$_POST['tel'],
'lieu'=>$lieu->getLibelle(),
'adresse'=>$lieu->getAdresse(),
'telAvocat'=>$avocat->getTel(),
'emailAvocat'=>$avocat->getEmail(),
'avocat'=>$avocat->getNom().' '.$avocat->getPrenom(),
]);
}
/**
* @Route("/test", name="test")
*/
public function test(Request $request, AvocatsRepository $avocatsRepository,StatutsRepository $statutsRepository, RendezVousRepository $rdvRepository,LieuxRepository $lieuxRepository): Response
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://middleware-production.easy2pilot-v8.com/api/9e16fd2e-b40e-11ec-acaa-a4bf0128f2ba/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'login: LAGENCE-ARE',
'password: Kf45yTxW',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
$result = json_decode($response, true);
$token = $result['data']['token'];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://middleware-production.easy2pilot-v8.com/api/9e16fd2e-b40e-11ec-acaa-a4bf0128f2ba/annonces',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'login: LAGENCE-ARE',
'password: Kf45yTxW',
"token: $token"
),
));
$response = curl_exec($curl);
curl_close($curl);
$result = json_decode($response, true);
dd($result);
}
/**
* @Route("/exportRdv/{avocat}", name="exportRdv")
*/
public function exportRdv(Request $request, AvocatsRepository $avocatsRepository,StatutsRepository $statutsRepository, RendezVousRepository $rdvRepository,LieuxRepository $lieuxRepository, $avocat): Response
{
$av = $avocatsRepository->findOneById($avocat);
$rdvs = $rdvRepository->findBy(['Avocats'=>$avocat,'Statuts'=>2]);
$i= -1;
$events = array();
foreach($rdvs as $rdv)
{
$i++;
$liste = array();
$titre = 'Rendez-vous avec '.$rdv->getNom().' '.$rdv->getPrenom();
$liste['title'] = $titre;
$liste['description'] = "";
$liste['start_date'] = $rdv->getDate()->format('Y-m-d H:i:s');
$liste['end_date'] = $rdv->getDateFin()->format('Y-m-d H:i:s');
$liste['location'] = $rdv->getLieux()->getLibelle();
$events[$i] = $liste;
}
// Construire le contenu ICS
$icsContent = "BEGIN:VCALENDAR\r\n";
$icsContent .= "VERSION:2.0\r\n";
$icsContent .= "PRODID:-//YourCompany//YourApp//EN\r\n";
foreach ($events as $event) {
$icsContent .= "BEGIN:VEVENT\r\n";
$icsContent .= "DTSTART:" . gmdate('Ymd\THis\Z', strtotime($event['start_date'])) . "\r\n";
$icsContent .= "DTEND:" . gmdate('Ymd\THis\Z', strtotime($event['end_date'])) . "\r\n";
$icsContent .= "SUMMARY:" . $event['title'] . "\r\n";
$icsContent .= "DESCRIPTION:" . $event['description'] . "\r\n";
$icsContent .= "LOCATION:" . $event['location'] . "\r\n";
$icsContent .= "END:VEVENT\r\n";
}
$icsContent .= "END:VCALENDAR\r\n";
// En-têtes HTTP pour indiquer le type de contenu
header('Content-Type: text/calendar');
header('Content-Disposition: attachment; filename="event.ics"');
// Afficher le contenu ICS
return new Response($icsContent);
}
/**
* @Route("/deleteJours/{id}", name="deleteJours")
*/
public function deleteJours($id, Request $request, JoursFermeturesRepository $joursFermeturesRepository, TranchesRepository $tranchesRepository ): Response
{
$jours = $joursFermeturesRepository->findOneById($id);
$tranches = $tranchesRepository->findBy(array('JoursFermetures'=>$jours));
foreach($tranches as $res)
{
$tranchesRepository->remove($res,true);
}
$joursFermeturesRepository->remove($jours,true);
return $this->redirectToRoute('app_jours_fermetures_new', ['lieu'=>$jours->getLieux()->getId(),'avocat'=>$jours->getAvocats()->getId()], Response::HTTP_SEE_OTHER);
}
}