<?php
namespace App\Controller;
use App\Controller\traits\ContactFormTrait;
use App\Entity\MonthlyCalculation;
use App\Entity\MonthlyCalculationSteps;
use App\Entity\User;
use App\Exception\DocapostException;
use App\Form\FinalRegistrationUploadType;
use App\Form\RegistrationFormType;
use App\Repository\MonthlyCalculationStepsRepository;
use App\Repository\UserRepository;
use App\Service\APILaposte;
use App\Service\APIMailer;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use GuzzleHttp\Exception\GuzzleException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class CMSController extends AbstractController
{
use ContactFormTrait;
/**
* @throws \Exception
*/
#[Route(path: '/ouverture', name: 'cms_ouverture')]
public function ouvertureAction(): Response
{
return $this->render('cms/ouverture.html.twig', [
'date_ouverture' => new \DateTime($this->getParameter('operation_options')['operation_dates'][0]),
]);
}
#[Route(path: '/politique-de-cookies', name: 'cms_poilitique_cookies')]
public function cookieAction(): Response
{
return $this->render('cms/cookies.html.twig');
}
#[Route(path: '/fermeture', name: 'cms_fermeture')]
public function fermetureAction(): Response
{
return $this->render('cms/fermeture.html.twig');
}
#[Route(path: '/modalites', name: 'cms_modalite')]
public function modaliteAction(): Response
{
return $this->render('cms/modalite.html.twig');
}
#[Route(path: '/mentions', name: 'cms_mentions')]
public function mentionAction(): Response
{
return $this->render('cms/mention_legales.html.twig');
}
#[Route(path: '/faq', name: 'cms_faq')]
public function faqAction(): Response
{
return $this->render('cms/faq.html.twig');
}
#[Route(path: '/nous-suivre', name: 'cms_nous_suivre')]
public function nousSuivreAction(): Response
{
return $this->render('cms/nous_suivre.html.twig');
}
/**
* @throws TransportExceptionInterface
* @throws ServerExceptionInterface
* @throws RedirectionExceptionInterface
* @throws GuzzleException
* @throws ClientExceptionInterface
*/
#[Route(path: '/', name: 'cms_homepage')]
public function indexAction(
APILaposte $laposte,
AuthenticationUtils $authUtils,
Request $request,
APIMailer $mailer,
EntityManagerInterface $manager,
Security $security,
): RedirectResponse|Response {
$user = $security->getUser();
if ($user instanceof User) {
if ($user->getPassword()) {
return $this->redirectToRoute('cms_account');
} else {
return $this->redirectToRoute('app_register');
}
}
$lastUsername = $authUtils->getLastUsername();
$request->getSession()->remove('user');
/* CONTACT FORM */
$formContact = $this->generateForm($request, $manager, $mailer);
$user = new User();
$registerForm = $this->createForm(RegistrationFormType::class, $user);
$registerForm->handleRequest($request);
if ($registerForm->isSubmitted() && $registerForm->isValid()) {
try {
/** @var UserRepository $ur */
$ur = $manager->getRepository(User::class);
$testUser = $ur->getByEmailAndCodeAurige($user->getEmail(), $user->getCodeAurige());
if ($testUser) {
$user = $testUser;
}
$laposte->fillUserInfo($user);
$manager->persist($user);
$manager->flush();
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main', serialize($token));
return $this->redirectToRoute('app_register');
} catch (DocapostException $e) {
foreach ($e->getData() as $error) {
$this->addFlash('error-register', $error['message']);
}
} catch (\Exception $e) {
$this->addFlash('error-register', 'L’auto-école n’a pas été trouvée ou un compte existe déjà.');
}
}
return $this->render('cms/homepage.html.twig', [
'formContact' => $formContact->createView(),
'registrationForm' => $registerForm->createView(),
'last_username' => $lastUsername,
]);
}
/**
* @throws TransportExceptionInterface
* @throws ServerExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ClientExceptionInterface
*/
#[Route(path: '/moncompte', name: 'cms_account')]
public function compteAction(
Request $request,
APIMailer $mailer,
EntityManagerInterface $manager,
Security $security,
): RedirectResponse|Response {
/** @var User $user */
$user = $security->getUser();
if (!$user instanceof User) {
return $this->redirectToRoute('cms_homepage');
}
if (!$user->getIban() || !$user->getBic()) {
return $this->redirectToRoute('app_register_update');
}
/** @var MonthlyCalculationStepsRepository $mcs_repo */
$mcs_repo = $manager->getRepository(MonthlyCalculationSteps::class);
$uploadForm = $this->createForm(FinalRegistrationUploadType::class, $user);
$uploadForm->handleRequest($request);
if ($uploadForm->isSubmitted() and $uploadForm->isValid()) {
$manager->persist($user);
$manager->flush();
return $this->redirectToRoute('cms_account');
}
/* CONTACT FORM */
$formContact = $this->generateForm($request, $manager, $mailer);
/** @var MonthlyCalculation[] $periods */
$periods = $user->getMonthlyCalculations();
$labels = [];
$chart_data = [];
$data = [];
foreach ($periods as $period) {
$labels[] = $period->getNamedMonth().' '.$period->getYear();
$chart_data[] = $period->getEuro();
$data[] = [
'label' => ucfirst($period->getNamedMonth()).' '.$period->getYear(),
'id' => $period->getId(),
'status' => $period->getFinancialStatus(),
'exams' => $period->getExams(),
'points' => $period->getEuro(),
'invoice' => $period->getInvoiceId(),
'euros' => $period->getEuro(),
'steps' => $mcs_repo->findByYearAndMonth($period->getYear(), $period->getMonth(), 'ASC', T_ARRAY_CAST),
'date' => $period->getUpdatedAt()->format('d/m/Y'),
];
}
return $this->render('cms/account.html.twig', [
'periods' => $periods,
'labels' => $labels,
'chart_data' => $chart_data,
'data' => $data,
'curent' => end($data),
'formContact' => $formContact->createView(),
'uploadForm' => $uploadForm->createView(),
'document_uploaded' => null != $user->getInvoice()->getName(),
]);
}
#[Route(path: '/approval.pdf', name: 'pdf.approval')]
public function generatePdf(Security $security): Response
{
/** @var User $user */
$user = $security->getUser();
if (!$user->getIban() || !$user->getBic()) {
return $this->redirectToRoute('app_register_update');
}
$html = $this->renderView('pdf/approval.html.twig', [
'user' => $user,
]);
$options = new Options();
$options->setDefaultFont('Arial');
$options->setDefaultPaperSize('A4');
$dompdf = new Dompdf($options);
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream('approval.pdf', [
'Attachment' => false,
]);
return new Response('', 200, ['Content-type' => 'application/pdf']);
}
}