<?php
namespace App\Features\RecruitmentCampaign\Controller;
use App\Entity\ProviderRequest;
use App\Entity\RecruitmentCampaign;
use App\Features\Core\Paginator;
use App\Features\RecruitmentCampaign\Exception\CampaignNotSubscribableException;
use App\Features\RecruitmentCampaign\Filter\RecruitmentCampaignFilter;
use App\Features\RecruitmentCampaign\RecruitmentCampaignManager;
use App\Form\ProviderRequestType;
use App\Repository\RecruitmentCampaignRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class CampaignProviderRequestController extends AbstractController
{
public function __construct(private RecruitmentCampaignManager $campaignManager){}
/**
* @param Request $request
* @param RecruitmentCampaign $campaign
* @return Response
*/
#[Route([
"fr" => "/campagne/{uuid}/postuler",
"en" => "/campaign/{uuid}/apply"
], name: "campaign-request-provider")]
public function postRequest(Request $request, RecruitmentCampaign $campaign): Response
{
$providerRequest= new ProviderRequest();
$providerRequest->setCampaign($campaign);
return $this->handleRequestForm($providerRequest, $request, $campaign);
}
#[Route("/demande/{providerRequest}/confirmation", name:"campaign-request-provider-confirmation")]
public function requestConfirm(Request $request, ProviderRequest $providerRequest): Response
{
$campaign= $providerRequest->getCampaign();
if($providerRequest->getConfirmedAt()){
//throw new NotFoundHttpException();
}
if($request->get("confirmer")){
try {
if(!$providerRequest->getConfirmedAt()){
$providerRequest->setConfirmedAt(new \DateTimeImmutable());
$this->campaignManager->addRequest($campaign, $providerRequest);
}
return $this->render('RecruitmentCampaign/_post_request_success.html.twig',[
"request" => $providerRequest
]);
} catch (CampaignNotSubscribableException $e) {
$this->addFlash('error', "Impossible de souscrire à cette campagne pour le moment.");
}
}
return $this->render('RecruitmentCampaign/_request_confirmation.html.twig', [
'campaign' => $campaign,
'request' => $providerRequest,
'title' => "Confirmation de ma demande",
]);
}
#[Route("/demande/{providerRequest}/modifier", name:"campaign-request-provider-edit")]
public function editRequest(Request $request, ProviderRequest $providerRequest): Response
{
$campaign= $providerRequest->getCampaign();
if($providerRequest->getConfirmedAt()){
throw new NotFoundHttpException();
}
return $this->handleRequestForm($providerRequest, $request, $campaign);
}
/**
* @param RecruitmentCampaign $campaign
* @return Response
* @Route("/campaign/{uuid}/detail", name="campaign-detail")
*/
#[Route([
"fr" => "/campagne/{uuid}/detail",
"en" => "/campaign/{uuid}/detail",
], name:"campaign-detail")]
public function detail(RecruitmentCampaign $campaign): Response
{
return $this->render('RecruitmentCampaign/_campaign_detail.html.twig', [
'campaign' => $campaign,
'title' => $campaign->getName(),
]);
}
/**
* @param RecruitmentCampaignRepository $repository
* @param string|null $status
* @return Response
*/
#[Route([
"en" => "/approval-in-progress",
"fr" => "/agrement-en-cours"
], name:"approval-in-progress", defaults:["status"=>"active"])]
#[Route([
"en" => "/approval-in-closed",
"fr" => "/agrement-cloture"
], name:"approval-closed", defaults:["status"=>"inactive"])]
public function approval(RecruitmentCampaignRepository $repository,
TranslatorInterface $translatable,
?string $status= RecruitmentCampaignFilter::STATUS_ACTIVE): Response
{
$paginator= new Paginator($repository->filter(RecruitmentCampaignFilter::withStatus($status)), 100);
$paginator->paginate();
return $this->render('RecruitmentCampaign/_campaign_list.html.twig', [
'paginator' => $paginator,
'title' => $translatable->trans(
$status === RecruitmentCampaignFilter::STATUS_ACTIVE
? "Agréments en cours" :
"Agréments clôturés"
),
'menu' => $status === RecruitmentCampaignFilter::STATUS_ACTIVE ? "ac" : "acl",
]);
}
/**
* @param ProviderRequest $providerRequest
* @param Request $request
* @param RecruitmentCampaign|null $campaign
* @return RedirectResponse|Response
*/
private function handleRequestForm(ProviderRequest $providerRequest, Request $request, ?RecruitmentCampaign $campaign): Response|RedirectResponse
{
$this->denyAccessUnlessGranted('CAMPAIGN_IS_SUBSCRIBABLE', $campaign, "Impossible de souscrire à cette campagne pour le moment.");
$form = $this->createForm(ProviderRequestType::class, $providerRequest);
$form->handleRequest(request: $request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$this->campaignManager->addRequest($campaign, $providerRequest);
return $this->redirectToRoute('campaign-request-provider-confirmation', ["providerRequest" => $providerRequest->getId()]);
} catch (CampaignNotSubscribableException $e) {
$this->addFlash('error', "Impossible de souscrire à cette campagne pour le moment.");
}
}
return $this->render('RecruitmentCampaign/_campaign_post_request.html.twig', [
'form' => $form->createView(),
'title' => "Demande d'agrément | " . $campaign->getName(),
'campaign' => $campaign
]);
}
}