<?php
namespace App\Controller;
use App\Entity\Lot;
use App\Entity\Proposition;
use App\Entity\Prospect;
use App\Repository\HistoriqueRepository;
use App\Repository\LotRepository;
use App\Repository\UtilisateurRepository;
use App\Service\Notification;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Service\VisiteManager;
class PublicController extends AbstractController
{
/**
* @Route("/", name="public_index")
*/
public function index(): Response
{
return $this->redirectToRoute('login_index');
}
/**
* @Route("/p/test/{lot}", name="public_page_test_short")
* @Route("/public/test/{lot}", name="public_page_test_prospect")
*/
public function pageTestProspect(Request $request, HistoriqueRepository $historiqueRepo, Lot $lot): Response
{
$prospect = new Prospect();
$proposition = new Proposition();
$proposition->setProspect($prospect);
$proposition->setLot($lot);
$propositions[] = $proposition;
$request->getSession()->set('propositions', $propositions);
$recap = $request->query->getBoolean('recap', false);
$interlocuteur = null;
return $this->render('public/index.html.twig', [
'propositions' => $propositions,
'prospect' => $prospect,
'recap' => $recap,
'interlocuteur' => $interlocuteur
]);
}
/**
* @Route("/p/{token}", name="public_prospect_short")
* @Route("/public/{token}", name="public_prospect")
*/
public function prospect(?Prospect $prospect, Request $request, EntityManagerInterface $entityManager, HistoriqueRepository $historiqueRepo, LotRepository $lotRepository, VisiteManager $visiteManager, UtilisateurRepository $utilisateurRepository, Notification $serviceNotification): Response
{
$session = new Session();
$session->set('propositions', $request->getSession()->get('propositions'));
$session->start();
// set and get session attributes
$interlocuteur = null;
$recap = $request->query->getBoolean('recap', false);
if($prospect == null){
if($session->get('propositions') == null){
return $this->redirectToRoute('login_index');
}
$propositions = $session->get('propositions');
$lot = $lotRepository->find($propositions[0]->getLot());
$propositions[0]->setLot($lot);
$prospect = $propositions[0]->getProspect();
$session->set('token', $propositions[0]->getProspect()->getToken());
} else {
$propositions = array_values($prospect->getActivePropositions()->toArray());
$session->set('token', $prospect->getToken());
if($prospect->getId() != null){
if($prospect->getAuteur() != null){
$interlocuteur = $prospect->getAuteur();
}
}
$mode = $request->query->get("mode");
if(!$mode && !$this->getUser() && $recap){
$historiques = $prospect->getHistoriques();
if($historiques->count()){
$visiteManager->addVisite($historiques->last());
}
}
}
return $this->render('public/index.html.twig', [
'propositions' => $propositions,
'prospect' => $prospect,
'recap' => $recap,
'interlocuteur' => $interlocuteur
]);
}
/**
* @Route("/public/{token}/lot", name="public_lot")
*/
public function lot(?Prospect $prospect, Request $request, LotRepository $lotRepo, HistoriqueRepository $historiqueRepo, VisiteManager $visiteManager, Notification $serviceNotification, UtilisateurRepository $utilisateurRepository): Response
{
$lot = $lotRepo->find($request->query->getInt('id', 0));
$lot->getPlan();
$programmePjs = []; // $lot->getProgrammeParent()->getPjs();
$attachments = $lot->getPjs();
foreach ($attachments as $attachment) {
if (null === $attachment->getFilename()) {
$lot->removePj($attachment);
}
}
$session = $request->getSession();
$propositions = $session->get('propositions');
if($prospect == null){
if($request->getSession()->get('propositions') == null){
return $this->redirectToRoute('login_index');
}
$prospect = $request->getSession()->get('propositions')[0]->getProspect();
$propositions = $request->getSession()->get('propositions');
}
if(empty($propositions)){
$propositions = array_values($prospect->getActivePropositions()->toArray());
}
$request->getSession()->set('token', $prospect->getToken());
$interlocuteur = null;
if($prospect->getId() != null){
if($prospect->getAuteur() != null){
$interlocuteur = $prospect->getAuteur();
}
}
if($prospect->getId() != null) {
if (!$lot || !$prospect->lotIsProposed($lot->getId())) {
return $this->redirectToRoute('public_prospect', [
'token' => $prospect->getToken(),
'interlocuteur' => $interlocuteur
]);
}
}
if(!$this->getUser()){
if ((string)$session->get('lot_email_envoye') != $prospect->getToken() && !is_null($prospect) && !is_null($prospect->getAuteur())) {
$lastHistorique = $prospect->getHistoriques()->last();
$serviceNotification->alertVisite($prospect, $utilisateurRepository, $prospect->getAuteur()->getEmail(), $lastHistorique);
$session->set('lot_email_envoye', $prospect->getToken());
}
$historiques = $prospect->getHistoriques();
if($historiques->count()){
$visiteManager->addVisite($historiques->last());
}
}
return $this->render('public/lot.html.twig', [
'lot' => $lot,
'propositions' => $propositions,
'prospect' => $prospect,
'interlocuteur' => $interlocuteur,
'programmePjs' => $programmePjs,
]);
}
}