<?php
namespace App\Controller;
use App\Entity\Badge;
use App\Entity\Commitment;
use App\Entity\User;
use App\Entity\YpareoController;
use App\Entity\HistoryUser;
use App\Entity\StepAnimation;
use App\Form\CommitmentUserFormType;
use App\Form\DraftCommitment;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class CommitmentController extends AbstractController
{
#[Route('/engagement-saisie', name: 'app_commitment_new')]
public function commitment(Request $request, EntityManagerInterface $entityManager)
{
if (!$this->getUser()) {
return $this->redirectToRoute('app_dashboard');
}
$user = $entityManager->getRepository(User::class)->find($this->getUser());
$commitmentUser = $entityManager->getRepository(Commitment::class)->findOneBy(
['user' => $user->getId(), 'isArchived' => false ]
);
$form = $this->createForm(CommitmentUserFormType::class, $commitmentUser);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
if (!$commitmentUser) {
$commitment = new Commitment();
} else {
$commitment = $commitmentUser;
}
if (!$commitmentUser) {
if (!$commitment->getToken()) {
$token = md5(uniqid((string)rand(), true));
$commitment->setToken($token);
}
}
$user->setHasCompany(true);
$entityManager->persist($user);
$commitment->setCompanyName($data['company_name']);
$commitment->setCompanyManagerFirstname($data['company_manager_firstname']);
$commitment->setCompanyManagerLastname($data['company_manager_lastname']);
$commitment->setCompanyEmail($data['company_email']);
$commitment->setCompanyPhone($data['company_phone']);
$commitment->setIsArchived(false);
$commitment->setUser($user);
$commitment->setState(0);
$commitment->setReceivedOn(new \DateTime());
$commitment->setAuthor('user');
$commitment->setRf(false);
$commitment->setDraft(false);
$user->setEditedAt(new \DateTimeImmutable());
$commitment->setStartDate(new \DateTimeImmutable($request->request->get('date')));
$entityManager->persist($user);
$entityManager->flush();
$entityManager->persist($commitment);
$entityManager->flush();
// history
return $this->redirectToRoute('app_dashboard');
}
return $this->render('user/commitment/commitment_new.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/engagement/creer/sans-offre', name: 'app_commitment_new_unknown')]
public function newDraftCommitment(Request $request, EntityManagerInterface $entityManager)
{
$commitmentUser = new Commitment();
if ($this->getUser()) {
$userConnected = $entityManager->getRepository(User::class)->find($this->getUser());
}
$form = $this->createForm(DraftCommitment::class, $commitmentUser);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($request->request->get('recaptchaResponse') && $request->request->get('recaptchaResponse') != null) {
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'; // URL to the reCAPTCHA server
$recaptcha_secret = '6Lf982YpAAAAADyzWvftfXuFWHEJHPUHbqmSs54D'; // Secret key
$recaptcha_response = $request->request->get('recaptchaResponse'); // Response from reCAPTCHA server, added to the form during processing
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response); // Send request to the server
$recaptcha = json_decode($recaptcha); // Decode the JSON response
if ($recaptcha->success == false || $recaptcha->action != "submit") { // If the response is valid
$this->addFlash('error', 'Captcha invalide, veuillez réessayer ou contacter l\'administrateur');
return $this->redirectToRoute("app_commitment_new_unknown");
} elseif ($recaptcha->score <= 0.5) {
$this->addFlash('error', 'Votre demande n\'a pas pu être envoyée, veuillez réessayer.');
return $this->redirectToRoute("app_commitment_new_unknown");
}
} else {
$this->addFlash('error', 'Votre demande n\'a pas pu être envoyée, veuillez réessayer.');
return $this->redirectToRoute("app_commitment_new_unknown");
}
$data = $form->getData();
$fields = $request->request;
$user = null;
if ($fields->get("phone")) {
$user = $entityManager->getRepository(User::class)->findOneBy(["phone" => $fields->get("phone")]);
}
if (!$user && $fields->get("email")) {
$user = $entityManager->getRepository(User::class)->findOneBy(["email" => $fields->get("email")]);
}
if ($user) {
if (!empty($user->getCommitments()->getValues())) {
$this->addFlash('error', 'L\'étudiant possède déjà un engagement');
return $this->redirectToRoute("app_commitment_new_admin_unknown");
}
$commitmentUser = new Commitment();
$commitmentUser->setUser($user);
$token = md5(uniqid((string)rand(), true));
$commitmentUser->setToken($token);
$user->setHasCompany(true);
$entityManager->persist($user);
$commitmentUser->setUser($user);
$commitmentUser->setReceivedOn(new \DateTime());
$commitmentUser->setRf(false);
$commitmentUser->setDraft(false);
$user->setEditedAt(new \DateTimeImmutable());
$history = new HistoryUser();
$history->setUser($user);
$history->setDescription(
'Création de l\'engagement par '
. $userConnected->getLastname() . " " . $userConnected->getFirstname()
);
$history->setCreatedAt(new \DateTimeImmutable());
$entityManager->persist($history);
$entityManager->persist($user);
$entityManager->persist($commitmentUser);
$entityManager->flush();
return $this->redirect("/adminterfor/etudiant/" . $user->getId());
} else {
$commitmentUser->setUserName($fields->get("firstname"));
$commitmentUser->setUserLastname($fields->get("lastname"));
$commitmentUser->setUserPhone($fields->get("phone"));
$commitmentUser->setUserEmail($fields->get("email"));
}
// si l'utilisateur n'existe pas
$token = md5(uniqid((string)rand(), true));
$commitmentUser->setState(4);
$commitmentUser->setToken($token);
$commitmentUser->setReceivedOn(new \DateTime());
$commitmentUser->setRf(false);
$commitmentUser->setDraft(false);
$entityManager->persist($commitmentUser);
$entityManager->flush();
// history
$this->addFlash(
'success',
"Votre demande a été prise en compte, nous vous recontactons sous 48h pour finaliser votre engagement"
);
return $this->redirectToRoute('company_send_mail_commitment');
}
return $this->render('company/draftCommitment.html.twig', [
'form' => $form->createView(),
'commitment' => $commitmentUser,
]);
}
}