src/Controller/CMSController.php line 49

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\traits\ContactFormTrait;
  4. use App\Entity\MonthlyCalculation;
  5. use App\Entity\MonthlyCalculationSteps;
  6. use App\Entity\User;
  7. use App\Exception\DocapostException;
  8. use App\Form\FinalRegistrationUploadType;
  9. use App\Form\RegistrationFormType;
  10. use App\Repository\MonthlyCalculationStepsRepository;
  11. use App\Repository\UserRepository;
  12. use App\Service\APILaposte;
  13. use App\Service\APIMailer;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Dompdf\Dompdf;
  16. use Dompdf\Options;
  17. use GuzzleHttp\Exception\GuzzleException;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  24. use Symfony\Component\Security\Core\Security;
  25. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  26. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  27. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  28. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  29. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  30. class CMSController extends AbstractController
  31. {
  32.     use ContactFormTrait;
  33.     /**
  34.      * @throws \Exception
  35.      */
  36.     #[Route(path: '/ouverture', name: 'cms_ouverture')]
  37.     public function ouvertureAction(): Response
  38.     {
  39.         return $this->render('cms/ouverture.html.twig', [
  40.             'date_ouverture' => new \DateTime($this->getParameter('operation_options')['operation_dates'][0]),
  41.         ]);
  42.     }
  43.     #[Route(path: '/politique-de-cookies', name: 'cms_poilitique_cookies')]
  44.     public function cookieAction(): Response
  45.     {
  46.         return $this->render('cms/cookies.html.twig');
  47.     }
  48.     #[Route(path: '/fermeture', name: 'cms_fermeture')]
  49.     public function fermetureAction(): Response
  50.     {
  51.         return $this->render('cms/fermeture.html.twig');
  52.     }
  53.     #[Route(path: '/modalites', name: 'cms_modalite')]
  54.     public function modaliteAction(): Response
  55.     {
  56.         return $this->render('cms/modalite.html.twig');
  57.     }
  58.     #[Route(path: '/mentions', name: 'cms_mentions')]
  59.     public function mentionAction(): Response
  60.     {
  61.         return $this->render('cms/mention_legales.html.twig');
  62.     }
  63.     #[Route(path: '/faq', name: 'cms_faq')]
  64.     public function faqAction(): Response
  65.     {
  66.         return $this->render('cms/faq.html.twig');
  67.     }
  68.     #[Route(path: '/nous-suivre', name: 'cms_nous_suivre')]
  69.     public function nousSuivreAction(): Response
  70.     {
  71.         return $this->render('cms/nous_suivre.html.twig');
  72.     }
  73.     /**
  74.      * @throws TransportExceptionInterface
  75.      * @throws ServerExceptionInterface
  76.      * @throws RedirectionExceptionInterface
  77.      * @throws GuzzleException
  78.      * @throws ClientExceptionInterface
  79.      */
  80.     #[Route(path: '/', name: 'cms_homepage')]
  81.     public function indexAction(
  82.         APILaposte $laposte,
  83.         AuthenticationUtils $authUtils,
  84.         Request $request,
  85.         APIMailer $mailer,
  86.         EntityManagerInterface $manager,
  87.         Security $security,
  88.     ): RedirectResponse|Response {
  89.         $user = $security->getUser();
  90.         if ($user instanceof User) {
  91.             if ($user->getPassword()) {
  92.                 return $this->redirectToRoute('cms_account');
  93.             } else {
  94.                 return $this->redirectToRoute('app_register');
  95.             }
  96.         }
  97.         $lastUsername = $authUtils->getLastUsername();
  98.         $request->getSession()->remove('user');
  99.         /* CONTACT FORM */
  100.         $formContact = $this->generateForm($request, $manager, $mailer);
  101.         $user = new User();
  102.         $registerForm = $this->createForm(RegistrationFormType::class, $user);
  103.         $registerForm->handleRequest($request);
  104.         if ($registerForm->isSubmitted() && $registerForm->isValid()) {
  105.             try {
  106.                 /** @var UserRepository $ur */
  107.                 $ur = $manager->getRepository(User::class);
  108.                 $testUser = $ur->getByEmailAndCodeAurige($user->getEmail(), $user->getCodeAurige());
  109.                 if ($testUser) {
  110.                     $user = $testUser;
  111.                 }
  112.                 $laposte->fillUserInfo($user);
  113.                 $manager->persist($user);
  114.                 $manager->flush();
  115.                 $token = new UsernamePasswordToken($user, 'main', $user->getRoles());
  116.                 $this->get('security.token_storage')->setToken($token);
  117.                 $this->get('session')->set('_security_main', serialize($token));
  118.                 return $this->redirectToRoute('app_register');
  119.             } catch (DocapostException $e) {
  120.                 foreach ($e->getData() as $error) {
  121.                     $this->addFlash('error-register', $error['message']);
  122.                 }
  123.             } catch (\Exception $e) {
  124.                 $this->addFlash('error-register', 'L’auto-école n’a pas été trouvée ou un compte existe déjà.');
  125.             }
  126.         }
  127.         return $this->render('cms/homepage.html.twig', [
  128.             'formContact' => $formContact->createView(),
  129.             'registrationForm' => $registerForm->createView(),
  130.             'last_username' => $lastUsername,
  131.         ]);
  132.     }
  133.     /**
  134.      * @throws TransportExceptionInterface
  135.      * @throws ServerExceptionInterface
  136.      * @throws RedirectionExceptionInterface
  137.      * @throws ClientExceptionInterface
  138.      */
  139.     #[Route(path: '/moncompte', name: 'cms_account')]
  140.     public function compteAction(
  141.         Request $request,
  142.         APIMailer $mailer,
  143.         EntityManagerInterface $manager,
  144.         Security $security,
  145.     ): RedirectResponse|Response {
  146.         /** @var User $user */
  147.         $user = $security->getUser();
  148.         if (!$user instanceof User) {
  149.             return $this->redirectToRoute('cms_homepage');
  150.         }
  151.         if (!$user->getIban() || !$user->getBic()) {
  152.             return $this->redirectToRoute('app_register_update');
  153.         }
  154.         /** @var MonthlyCalculationStepsRepository $mcs_repo */
  155.         $mcs_repo = $manager->getRepository(MonthlyCalculationSteps::class);
  156.         $uploadForm = $this->createForm(FinalRegistrationUploadType::class, $user);
  157.         $uploadForm->handleRequest($request);
  158.         if ($uploadForm->isSubmitted() and $uploadForm->isValid()) {
  159.             $manager->persist($user);
  160.             $manager->flush();
  161.             return $this->redirectToRoute('cms_account');
  162.         }
  163.         /* CONTACT FORM */
  164.         $formContact = $this->generateForm($request, $manager, $mailer);
  165.         /** @var MonthlyCalculation[] $periods */
  166.         $periods = $user->getMonthlyCalculations();
  167.         $labels = [];
  168.         $chart_data = [];
  169.         $data = [];
  170.         foreach ($periods as $period) {
  171.             $labels[] = $period->getNamedMonth().' '.$period->getYear();
  172.             $chart_data[] = $period->getEuro();
  173.             $data[] = [
  174.                 'label' => ucfirst($period->getNamedMonth()).' '.$period->getYear(),
  175.                 'id' => $period->getId(),
  176.                 'status' => $period->getFinancialStatus(),
  177.                 'exams' => $period->getExams(),
  178.                 'points' => $period->getEuro(),
  179.                 'invoice' => $period->getInvoiceId(),
  180.                 'euros' => $period->getEuro(),
  181.                 'steps' => $mcs_repo->findByYearAndMonth($period->getYear(), $period->getMonth(), 'ASC', T_ARRAY_CAST),
  182.                 'date' => $period->getUpdatedAt()->format('d/m/Y'),
  183.             ];
  184.         }
  185.         return $this->render('cms/account.html.twig', [
  186.             'periods' => $periods,
  187.             'labels' => $labels,
  188.             'chart_data' => $chart_data,
  189.             'data' => $data,
  190.             'curent' => end($data),
  191.             'formContact' => $formContact->createView(),
  192.             'uploadForm' => $uploadForm->createView(),
  193.             'document_uploaded' => null != $user->getInvoice()->getName(),
  194.         ]);
  195.     }
  196.     #[Route(path: '/approval.pdf', name: 'pdf.approval')]
  197.     public function generatePdf(Security $security): Response
  198.     {
  199.         /** @var User $user */
  200.         $user = $security->getUser();
  201.         if (!$user->getIban() || !$user->getBic()) {
  202.             return $this->redirectToRoute('app_register_update');
  203.         }
  204.         $html = $this->renderView('pdf/approval.html.twig', [
  205.             'user' => $user,
  206.         ]);
  207.         $options = new Options();
  208.         $options->setDefaultFont('Arial');
  209.         $options->setDefaultPaperSize('A4');
  210.         $dompdf = new Dompdf($options);
  211.         $dompdf->loadHtml($html);
  212.         $dompdf->render();
  213.         $dompdf->stream('approval.pdf', [
  214.             'Attachment' => false,
  215.         ]);
  216.         return new Response('', 200, ['Content-type' => 'application/pdf']);
  217.     }
  218. }