<?php
namespace App\Controller;
use App\Entity\Actuality;
use App\Entity\BecomePartner;
use App\Entity\Contact;
use App\Entity\Devis;
use App\Entity\DevisDocument;
use App\Entity\Fluvial;
use App\Entity\FluvialCategory;
use App\Entity\LandingPage;
use App\Entity\Maritime;
use App\Entity\MaritimeCategory;
use App\Entity\Presentation;
use App\Entity\RecommendContact;
use App\Entity\Service;
use App\Entity\ServicePage;
use App\Entity\Testimony;
use App\Entity\ValeurEngagement;
use App\Form\BecomePartnerFormType;
use App\Form\ContactFormType;
use App\Form\ContactFrontFormType;
use App\Form\DevisFormType;
use App\Form\Flow\DevisFormFlow;
use App\Form\RecommendContactFormType;
use App\Form\TestimonyFrontType;
use App\Repository\ActualityRepository;
use App\Repository\FluvialCategoryRepository;
use App\Repository\FluvialRepository;
use App\Repository\HomepageRepository;
use App\Repository\MaritimeCategoryRepository;
use App\Repository\MaritimeRepository;
use App\Repository\PresentationRepository;
use App\Repository\ServicePageRepository;
use App\Repository\ServiceRepository;
use App\Repository\TestimonyRepository;
use App\Repository\ValeurEngagementRepository;
use App\Service\EmailManager;
use App\Utils\UploadedBase64File;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Pagerfanta\Doctrine\ORM\QueryAdapter;
use Pagerfanta\Pagerfanta;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class FrontController extends AbstractController
{
/** @var ManagerRegistry */
private $em;
public function __construct(ManagerRegistry $em)
{
$this->em = $em;
}
/**
* @Route("/", name="app_homepage")
*/
public function index(ActualityRepository $actualityRepository, TestimonyRepository $testimonyRepository, HomepageRepository $homepageRepository): Response
{
$actualities = $actualityRepository->findBy(array('published' => '1'), ['date' => 'DESC'], 3);
$testimonies = $testimonyRepository->findBy(array(), array(), 3);
$page = $homepageRepository->findUnique();
return $this->render('front/index.html.twig', [
'actualities' => $actualities,
'testimonies' => $testimonies,
'page' => $page
]);
}
/**
* @Route("/presentation", name="app_presentation_index")
*/
public function presentation(Request $request): Response
{
/** @var PresentationRepository $repo */
$repo = $this->em->getRepository(Presentation::class);
$page = $repo->findUnique();
return $this->render('front/Presentation/index.html.twig', array('page' => $page));
}
/**
* @Route("/valeurEngagement", name="app_valeur_engagement_index")
*/
public function valeurEngagement(Request $request): Response
{
/** @var ValeurEngagementRepository $repo */
$repo = $this->em->getRepository(ValeurEngagement::class);
$page = $repo->findUnique();
return $this->render('front/ValeurEngagement/index.html.twig', array('page' => $page));
}
/**
* @Route("/assurance-maritime", name="app_maritime_index")
*/
public function maritime(Request $request, MaritimeCategoryRepository $maritimeCategoryRepository): Response
{
/** @var MaritimeRepository $repo */
$repo = $this->em->getRepository(Maritime::class);
$page = $repo->findUnique();
$categories = $maritimeCategoryRepository->findAll();
return $this->render('front/Assurance/index.html.twig', array(
'page' => $page,
'categories' => $categories,
'type' => "maritime",
));
}
/**
* @Route("/assurance-maritime/{slug}", name="app_maritime_category_show")
*/
public function showMaritimeCategory(Request $request, MaritimeCategory $maritimeCategory, ServiceRepository $serviceRepository): Response
{
$services = $serviceRepository->findAll();
return $this->render('front/AssuranceCategory/show.html.twig', array(
'page' => $maritimeCategory,
'services' => $services,
'type' => "maritime",
));
}
/**
* @Route("/assurance-fluvial", name="app_fluvial_index")
*/
public function Fluvial(Request $request, FluvialCategoryRepository $fluvialCategoryRepository): Response
{
/** @var FluvialRepository $repo */
$repo = $this->em->getRepository(Fluvial::class);
$page = $repo->findUnique();
$categories = $fluvialCategoryRepository->findAll();
return $this->render('front/Assurance/index.html.twig', array(
'page' => $page,
'categories' => $categories,
'type' => "fluvial",
));
}
/**
* @Route("/assurance-Fluvial/{slug}", name="app_fluvial_category_show")
*/
public function showFluvialCategory(Request $request, FluvialCategory $fluvialCategory, ServiceRepository $serviceRepository): Response
{
$services = $serviceRepository->findAll();
return $this->render('front/AssuranceCategory/show.html.twig', array(
'page' => $fluvialCategory,
'services' => $services,
'type' => "fluvial",
));
}
/**
* @Route("/services", name="app_services_index")
*/
public function listServices(Request $request, ServiceRepository $serviceRepository, ServicePageRepository $servicePageRepository): Response
{
$page = $servicePageRepository->findUnique();
$services = $serviceRepository->findAll();
return $this->render('front/Service/list.html.twig', array(
'services' => $services,
'page' => $page,
));
}
/**
* @Route("/actualites/detail/{slug}", name="app_actuality_show")
*/
public function showActuality(Request $request, Actuality $actuality, ActualityRepository $actualityRepository): Response
{
$lastActualities = $actualityRepository->findBy([], ['date' => 'DESC'], 3);
return $this->render('front/Actuality/show.html.twig', array(
'page' => $actuality,
'lastActualities' => $lastActualities,
));
}
/**
* @Route("/actualites/{page}", name="app_actuality_list", requirements={"page"="\d+"}, defaults={"page": 1})
*/
public function listActualitys(Request $request, $page): Response
{
/** @var ActualityRepository $repo */
$repo = $this->em->getRepository(Actuality::class);
$lastActuality = $repo->findOneBy(array('published' => '1'), array('date' => 'desc'), 1);
$actualitys = new Pagerfanta(new QueryAdapter($repo->createQueryBuilder('e')->orderBy('e.date', 'DESC')->andWhere('e.published = 1')->andWhere('e != :last')->setParameter('last', $lastActuality)));
$actualitys->setMaxPerPage(6);
$actualitys->setCurrentPage($page);
return $this->render('front/Actuality/list.html.twig', array('actualitys' => $actualitys, 'lastActuality' => $lastActuality));
}
/**
* @Route("/livre-d-or/{page}", name="app_testimony_list", requirements={"page"="\d+"}, defaults={"page": 1})
*/
public function listTestimonys(Request $request, $page, EntityManagerInterface $em): Response
{
/** @var TestimonyRepository $repo */
$repo = $this->em->getRepository(Testimony::class);
$testimonys = new Pagerfanta(new QueryAdapter($repo->createQueryBuilder('e')));
$testimonys->setMaxPerPage(6);
$testimonys->setCurrentPage($page);
$testimony = new Testimony;
$form = $this->createForm(TestimonyFrontType::class, $testimony);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Contact $contact */
$contact->setCreatedAt(new \DateTime());
$em->persist($contact);
$em->flush();
$this->addFlash('success', 'Merci, nous avons reçu votre Témoignage !');
}
return $this->render('front/Testimony/list.html.twig', array(
'testimonys' => $testimonys,
"form" => $form->createView(),
));
}
/**
* @Route("/contact", name="app_contact_show")
*/
public function showContact(Request $request, EntityManagerInterface $em, EmailManager $mailer): Response
{
$contact = new Contact();
$form = $this->createForm(ContactFrontFormType::class, $contact);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$contact->setCreatedAt(new \DateTime());
$em->persist($contact);
$em->flush();
$mailer->sendContactMail($contact);
$this->addFlash('success', 'Merci nous avons bien reçu votre demande. Nous vous répondrons dans les plus brefs délais.');
$contact = new Contact();
$form = $this->createForm(ContactFrontFormType::class, $contact);
}
return $this->render('front/Contact/show.html.twig', array(
'form' => $form->createView(),
));
}
/**
* @Route("/landingPage/{slug}", name="app_landing_page_show")
*/
public function showLandingPage(Request $request, LandingPage $landingPage, EntityManagerInterface $em, ServiceRepository $serviceRepository): Response
{
$services = $serviceRepository->findAll();
$contact = new Contact;
$form = $this->createForm(ContactFormType::class, $contact);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Contact $contact */
$contact->setCreatedAt(new \DateTime());
$em->persist($contact);
$em->flush();
$this->addFlash('success', 'Merci nous avons reçu votre demande. Nous vous répondrons dans les plus brefs délais.');
}
return $this->render('front/LandingPage/show.html.twig', array(
'page' => $landingPage,
'form' => $form->createView(),
'services' => $services
));
}
/**
* @Route("/devis", name="app_devis_index")
*/
public function showDevis(Request $request, EntityManagerInterface $em, DevisFormFlow $flow, EmailManager $mailer): Response
{
$devis = new Devis();
$flow->bind($devis);
$form = $flow->createForm();
if ($flow->isValid($form)) {
if ($form->has('documents')) {
foreach ($form->get('documents')->getData() as $base64Image) {
$documentFile = new UploadedBase64File($base64Image["base64"], $base64Image["filename"]);
$document = new DevisDocument();
$document->setDocumentFile($documentFile);
$devis->addDocument($document);
}
}
$flow->saveCurrentStepData($form);
if ($flow->nextStep()) {
// form for the next step
$form = $flow->createForm();
} else {
// flow finished
$devis->setCreatedAt(new \DateTime());
$em->persist($devis);
$em->flush();
$flow->reset(); // remove step data from the session
$mailer->sendDevisMailAdmin($devis);
$mailer->sendDevisMailClient($devis);
$this->addFlash('success', 'Merci nous avons reçu votre demande. Nous vous répondrons dans les plus brefs délais.');
return $this->redirectToRoute("app_devis_index");
}
}
return $this->render('front/Devis/index.html.twig', array(
'form' => $form->createView(),
'flow' => $flow
));
}
/**
* @Route("/espace-pro/recommandation-contact", name="app_recommandation_contact_index")
*/
public function showRecommandationContact(Request $request, EntityManagerInterface $em, EmailManager $mailer): Response
{
$recommendContact = new RecommendContact();
$form = $this->createForm(RecommendContactFormType::class, $recommendContact);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var RecommendContact $recommendContact */
$recommendContact->setDate(new \DateTime());
$em->persist($recommendContact);
$em->flush();
$mailer->sendRecommendationMail($recommendContact);
$this->addFlash('success', 'Merci, nous avons reçu votre demande.');
return $this->redirectToRoute("app_recommandation_contact_index");
}
return $this->render('front/EspacePro/recommandation.html.twig', array(
'form' => $form->createView(),
));
}
/**
* @Route("/espace-pro/devenir-partenaire", name="app_become_partner_index")
*/
public function showBecomePartner(Request $request, EntityManagerInterface $em, EmailManager $mailer): Response
{
$becomePartner = new BecomePartner;
$form = $this->createForm(BecomePartnerFormType::class, $becomePartner);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var BecomePartner $becomePartner */
$becomePartner->setDate(new \DateTime());
$em->persist($becomePartner);
$em->flush();
$mailer->sendPartnershipMail($becomePartner);
$this->addFlash('success', 'Merci, nous avons reçu votre demande.');
return $this->redirectToRoute("app_recommandation_contact_index");
}
return $this->render('front/EspacePro/partner.html.twig', array(
'form' => $form->createView(),
));
}
}