<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Doctrine\Persistence\ManagerRegistry;
use App\Services\OrderDetailManager;
use App\Services\CourseManager;
use App\Repository\UserRepository;
use App\Entity\Certificate;
use App\Entity\Competence;
use App\Entity\Course;
use App\Entity\CourseSession;
use App\Entity\CustomerSession;
use App\Entity\User;
use App\Entity\UserSession;
use App\Form\ParticipantFormType;
use App\Services\CourseSessionManager;
use App\Services\UserManager;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Component\Mime\Email;
use App\Services\CustomerManager;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use App\Config\Config;
use App\Services\CustomerSessionManager;
use DateTime;
class CatalogController extends AbstractController
{
public function __construct(
EntityManagerInterface $entityManager,
Security $security,
SessionInterface $session,
UserManager $um,
/*, OrderDetailManager $odm*/
CourseManager $cm,
MailerInterface $mailer,
CourseSessionManager $csm,
CustomerManager $customerManager,
Config $config,
CustomerSessionManager $custsesm
) {
$this->entityManager = $entityManager;
$this->session = $session;
$this->security = $security;
$this->config = $config;
$this->um = $um;
$this->mailer = $mailer;
$this->cm = $cm;
$this->csm = $csm;
$this->customerManager = $customerManager;
$this->custsesm = $custsesm;
}
#[Route("/catalog/professionnel", name: "catalog_professionnel")]
public function catalogProfessionnel(Request $request): Response
{
$filtersSelected = [];
$filters = [];
$filtersSelected = [];
if ($request->isMethod("post")) {
$filtersSelected["location"] = $request->request->get("location");
$filtersSelected["duration"] = $request->request->get("duration");
$filtersSelected["year_of_exp"] = $request->request->get(
"year_of_exp"
);
$filtersSelected["certificate"] = $request->request->get(
"certificate"
);
$filtersSelected["competence"] = $request->request->get(
"competence"
);
$filtersSelected["price_min"] = $request->request->get("price_min");
$filtersSelected["price_max"] = $request->request->get("price_max");
$filtersSelected["date_begin"] = $request->request->get(
"date_begin"
);
$this->session->set("filtersSelected", $filtersSelected);
$courses = $this->cm->getFilteredCoursesWithDateByType(
"inter",
$filtersSelected
);
} else {
$courses = $this->cm->getCoursesWithDateByType("inter");
}
$filters["locations"] = $this->cm->getCourseLocationByType("inter");
$filters["durations"] = $this->cm->getCourseDurationByType("inter");
$filters["certificates"] = $this->entityManager
->getRepository(Certificate::class)
->findBy([], ["level" => "ASC", "title" => "ASC"]);
$filters["competences"] = $this->entityManager
->getRepository(Competence::class)
->findBy([], ["id" => "ASC"]);
//"courses" => $this->cm->getLastCourseForHomeIntra(), //courses
return $this->render("acoa/catalog/catalog_professionnel.html.twig", [
"controller_name" => "CatalogController",
"courses" => $courses,
"filters" => $filters,
"filtersSelected" => $filtersSelected,
]);
}
#[Route("/catalog/entreprise", name: "catalog_entreprise")]
public function catalogEntreprise(Request $request): Response
{
$filtersSelected = [];
if ($request->isMethod("post")) {
$filtersSelected["location"] = $request->request->get("location");
$filtersSelected["duration"] = $request->request->get("duration");
$filtersSelected["year_of_exp"] = $request->request->get(
"year_of_exp"
);
$filtersSelected["competence"] = $request->request->get(
"competence"
);
$filtersSelected["price_min"] = $request->request->get("price_min");
$filtersSelected["price_max"] = $request->request->get("price_max");
$filtersSelected["date_begin"] = $request->request->get(
"date_begin"
);
$this->session->set("filtersSelected", $filtersSelected);
$courses = $this->cm->getFilteredCoursesWithDateByType(
"intra",
$filtersSelected
);
} else {
$courses = $this->cm->getCoursesWithDateByType("intra");
}
//On prépare les données pour les SELECT du filtre
$filters = [];
$filters["locations"] = $this->cm->getCourseLocationByType("intra");
$filters["durations"] = $this->cm->getCourseDurationByType("intra");
$filters["competences"] = $this->entityManager
->getRepository(Competence::class)
->findBy([], ["id" => "ASC"]);
return $this->render("acoa/catalog/catalog_entreprise.html.twig", [
"controller_name" => "CatalogController",
"courses" => $courses,
"filters" => $filters,
"filtersSelected" => $filtersSelected,
]);
}
#[
Route(
"/catalog/detail/{idCourse}",
name: "catalog_detail",
requirements: ["idCourse" => "\d+"]
)
]
public function detailFormation(Request $request, int $idCourse): Response
{
if ($request->request->get("idCourseSession")) {
$this->session->set(
"idCourseSession",
$request->request->get("idCourseSession")
);
return $this->redirectToRoute("catalog_participant");
}
if ($this->session->get("filtesSelected") !== null) {
$course = $this->cm->getFilteredCoursesAndCourseSessionsByIdCourse(
$idCourse,
$this->session->get("filtesSelected")
);
$filtersSelected = $this->session->get("filtesSelected");
} else {
$course = $this->cm->getCourseByIdCourse($idCourse);
$filtersSelected = null;
}
if (sizeof($course)) {
if ($course[0]["categorie_id"] != 3) {
$courseSession = $this->cm->getCourseSessionsByIdCourse($idCourse);
//dd($courseSession);
foreach ($courseSession as $i => $data) {
$courseSession[$i]["trainer"] = $this->um->getTeachersForCourseSessionCatalogDetail(
$courseSession[$i]["idCourseSession"]
);
}
$course[0]["courseSession"] = $courseSession;
} else {
$course[0]["courseSession"] = array();
}
}
return $this->render("acoa/catalog/catalog_detail.html.twig", [
"controller_name" => "CatalogController",
"course" => $course,
"filtersSelected" => $filtersSelected,
]);
}
#[
Route(
"/upd_list_paticipants/{email}",
name: "upd_list_paticipants_email"
)
]
public function upd_list_paticipants()
{
$oldEmail = substr($_SERVER["REQUEST_URI"], 31);
if (!str_contains(substr($_SERVER["REQUEST_URI"], 22), "del_to_eb")) {
if ($_POST) {
$this->um->updateUserParticipant($_POST["email"], substr($_SERVER["REQUEST_URI"], 22));
return $this->redirectToRoute("home");
} else {
return $this->renderForm(
"acoa/catalog/catalog_upd_list_participants.html.twig",
["email" => substr($_SERVER["REQUEST_URI"], 22)]
);
}
} else {
$this->um->updateUserParticipantDelete($oldEmail);
return $this->redirectToRoute("home");
}
}
#[Route("/catalog/participant/{origin}", name: "catalog_participant")]
public function participant(
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $userPasswordHasher,
UserRepository $userRepository,
$origin = null
): Response {
$new = $this->session->get('new');
$ics = $this->session->get('ics');
$sd = $this->session->get('sd');
$f = $this->session->get('f');
if ((int)$new == 1) {
$this->session->set('new_data', ["origin" => "?=0", "f" => $f, "sd" => $sd, "ics" => $ics]);
return $this->redirectToRoute('register_information');
}
$internal = false;
if (isset($_GET["origin"]) && urldecode($_GET["origin"]) == "?=0") {
$internal = true;
$this->session->set("origin", 0);
}
if (isset($_GET["f"])) {
$formation = base64_decode($_GET["f"]);
}
if (isset($_GET["sd"])) {
$startDate = base64_decode($_GET["sd"]);
}
if ($this->session->get("ics")) {
$ics = $this->session->get("ics");
}
$users = new ArrayCollection();
$form = $this->createForm(ParticipantFormType::class, $users);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$users = $form->getData();
$i = 0;
$error = false;
$emailExist = false;
$this->session->set(
"users",
$request->request->get("participant_form")["users"]
);
foreach ($request->request->get("participant_form")["users"] as $user) {
if (
$user["firstName"] == null ||
$user["lastName"] == null ||
$user["email"] == null ||
$user["schoolDegree1"] == null
) {
$this->session
->getFlashBag()
->add(
"info",
"Veuillez saisir toutes les informations."
);
$error = true;
break;
} else {
if (!filter_var($user["email"], FILTER_VALIDATE_EMAIL)) {
$this->session
->getFlashBag()
->add("info", "Veuillez saisir un email valide.");
$error = true;
break;
} else {
$newUser = $this->getDoctrine()
->getRepository(User::class)
->findOneBy(["email" => $user["email"]]);
if ($newUser === null) {
$newUser = new User();
$newUser->setFirstName($user["firstName"]);
$newUser->setLastName($user["lastName"]);
$newUser->setEmail($user["email"]);
$newUser->setSchoolDegree1($user["schoolDegree1"]);
$newUser->setPassword(
password_hash(
$this->generateRandomString(10),
PASSWORD_DEFAULT
)
);
$newUser->setRoles(["ROLE_STUDENT"]);
$newUser->setIsActive(1);
$newUser->setIdUserProfil(2);
$this->entityManager->persist($newUser);
///////_______
// PLI dans le cas des formations INTER (en passant par le catalogue)
// on renseigne les particiapants avant l'inscription ou l'authentification du customer
// c'est correct pour les formations INTRA.
if ($this->getUser() && $internal) {
// PL$ - setIdCustomer on
$newUser->setIdCustomer((int) $this->getUser()->getIdCustomer());
if (!$this->custsesm->isCustomerSessionExists($this->getUser()->getIdCustomer(), base64_decode($ics))) {
$customerSession = new CustomerSession();
$customerSession->setIdCustomer((int) $this->getUser()->getIdCustomer());
if (isset($ics)) {
$customerSession->setIdCourseSession(base64_decode($ics));
} else
$customerSession->setIdCourseSession(0);
$customerSession->setDateEvenement(new \DateTime());
$this->entityManager->persist($customerSession);
$this->entityManager->flush();
}
}
///////_______
$this->entityManager->flush();
$emailTo[] = [
"email" => $user["email"],
"name" =>
$user["firstName"] .
" " .
$user["lastName"],
];
} else {
$emailExist = true;
$emailTo[] = [
"email" => $user["email"],
"name" =>
$user["lastName"] .
" " .
$user["firstName"],
];
}
$newUser->setTypeCourseSession($user["type"]);
$this->session->set("user" . $i, $newUser);
$i++;
}
}
}
$s = $this->session->get("origin");
if ($error === false && !$s && !isset($_GET["origin"])) {
$this->entityManager->flush();
$this->session->set("nbUser", $i);
return $this->redirectToRoute("catalog_panier", [
"idCourseSession" => $this->session->get("idCourseSession"),
]);
} elseif (($s || isset($_GET["origin"])) && $error === false) {
$this->session->set(
"data_origin_i_formation",
isset($formation) ? $formation : ""
);
$this->session->set(
"data_origin_i_startDate",
isset($startDate) ? $startDate : ""
);
$formation = isset($formation) ? $formation : "";
$startDate = isset($startDate) ? $startDate : "";
if (!$emailExist) {
if (isset($emailTo) && $emailTo) {
foreach ($emailTo as $key) {
if (isset($ics)) {
$u_s = new UserSession();
$u_s->setIdCourseSession(base64_decode($ics));
$u_s->setIdUser(
$this->um
->getUserByEmail($key["email"])[0]
->getId()
);
$u_s->setMark("");
$this->entityManager->persist($u_s);
$this->entityManager->flush();
}
$url =
$this->config->getDomain() .
"/confirm/registration/" .
base64_encode("iokljhko!$#pkY@787NK---LN47") .
"?sun=" .
base64_encode($key["email"]) .
"&f=" .
base64_encode($formation);
$em = (new TemplatedEmail())
->from($this->config->getMailSender())
->priority(Email::PRIORITY_HIGH)
->to($key["email"])
->cc(
"kalidougattaba@gmail.com",
"pascal.liatard@abware.fr"
)
->subject(
$formation .
": Finalisation de votre inscription"
)
->htmlTemplate(
"acoa/email/mailto_student.html.twig"
)
->context([
"name" => $key["name"],
"formation" => $formation,
"link" => $url,
"startDate" => $startDate,
]);
$this->mailer->send($em);
}
}
} else {
if (isset($emailTo) && $emailTo) {
foreach ($emailTo as $key) {
if (isset($ics)) {
$u_s = new UserSession();
$u_s->setIdCourseSession(base64_decode($ics));
$u_s->setIdUser(
$this->um
->getUserByEmail($key["email"])[0]
->getId()
);
$u_s->setMark("");
$this->um->updateUserIdCustomer($key["email"], $this->getUser()->getIdCustomer());
$this->entityManager->persist($u_s);
$this->entityManager->flush();
}
$em = (new TemplatedEmail())
->from($this->config->getMailSender())
->priority(Email::PRIORITY_HIGH)
->to($key["email"])
->cc(
"kalidougattaba@gmail.com",
"pascal.liatard@abware.fr"
)
->subject($formation . ": Inscription")
->htmlTemplate(
"acoa/email/mailto_student.html.twig"
)
->context([
"name" => $key["name"],
"formation" => $formation,
"startDate" => $startDate,
]);
$this->mailer->send($em);
}
}
}
return $this->redirectToRoute("register_student_confirm");
} else {
for ($j = 0; $j <= $i; $j++) {
$this->session->set("user" . $j, null);
}
}
}
if (!$this->getUser() && $internal) {
return $this->redirectToRoute("login");
}
/*$participants = array();
if ($internal) {
$participants = $this->um->getAllParticipantsByCustomer($this->getUser()->getIdCustomer()) ;
}*/
return $this->renderForm("acoa/catalog/catalog_participant.html.twig", [
"form" => $form,
"internal" => $internal,
"formation" => isset($formation) ? $formation : "",
"startDate" => isset($startDate) ? $startDate : "",
"participants" => $internal ? $this->um->getAllParticipantsByCustomer($this->getUser()->getIdCustomer()) : []
]);
}
#[
Route(
"/catalog/panier/{idCourseSession}",
name: "catalog_panier",
requirements: ["idCourseSession" => "\d+"]
)
]
public function panier(
ManagerRegistry $doctrine,
Request $request,
int $idCourseSession,
UserRepository $userRepository
): Response {
if ($request->isMethod("post")) {
$j = 0;
for ($i = 0; $i < $this->session->get("nbUser"); $i++) {
if (
!in_array(
$this->session->get("user" . $i)->getId(),
$request->request->get("users")
)
) {
$user = $userRepository->find(
$this->session->get("user" . $i)->getId()
);
$doctrine->getManager()->remove($user);
$this->session->set("user" . $i, null);
$j++;
}
}
$this->session->set("finalNbUser", $i - $j);
$doctrine->getManager()->flush();
return $this->redirectToRoute("login");
}
$courseSession = $doctrine
->getRepository(CourseSession::class)
->find($idCourseSession);
$this->session->set("courseSession", $courseSession);
$course = $doctrine
->getRepository(Course::class)
->find($courseSession->getIdCourse());
// PL$ - dans le cas des formations INTER (en passant par le catalogue)
if (
$this->getUser() &&
(!$this->custsesm->isCustomerSessionExists($this->getUser()->getIdCustomer(), $idCourseSession))
) {
$customerSession = new CustomerSession();
$customerSession->setIdCustomer((int) $this->getUser()->getIdCustomer());
if (isset($idCourseSession)) {
$customerSession->setIdCourseSession($idCourseSession);
} else
$customerSession->setIdCourseSession(0);
$customerSession->setDateEvenement(new \DateTime());
$this->entityManager->persist($customerSession);
$this->entityManager->flush();
}
$users = [];
for ($i = 0; $i < $this->session->get("nbUser"); $i++) {
$users[] = $this->session->get("user" . $i);
}
return $this->render("acoa/catalog/catalog_panier.html.twig", [
"controller_name" => "CatalogController",
"courseSession" => $courseSession,
"users" => $users,
"course" => $course,
]);
}
private function generateRandomString($length = 10)
{
$characters =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$charactersLength = strlen($characters);
$randomString = "";
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
#[Route("/catalog/check-mail", name: "catalog_check_mail")]
public function verifMail()
{
$idCourseSession = $this->session->get("idCourseSession");
$mail = $_GET["mail"];
$user = $this->getDoctrine()
->getRepository(User::class)
->findOneBy(["email" => $mail]);
if ($user) {
$userSession = $this->csm->findUserBySession(
$user->getId(),
$idCourseSession
);
if ($userSession) {
return $this->json(true, 200);
}
}
return $this->json(false, 200);
}
}