src/Features/RecruitmentCampaign/Controller/CampaignProviderRequestController.php line 128

Open in your IDE?
  1. <?php
  2. namespace App\Features\RecruitmentCampaign\Controller;
  3. use App\Entity\ProviderRequest;
  4. use App\Entity\RecruitmentCampaign;
  5. use App\Features\Core\Paginator;
  6. use App\Features\RecruitmentCampaign\Exception\CampaignNotSubscribableException;
  7. use App\Features\RecruitmentCampaign\Filter\RecruitmentCampaignFilter;
  8. use App\Features\RecruitmentCampaign\RecruitmentCampaignManager;
  9. use App\Form\ProviderRequestType;
  10. use App\Repository\RecruitmentCampaignRepository;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class CampaignProviderRequestController extends AbstractController
  19. {
  20.     public function __construct(private RecruitmentCampaignManager $campaignManager){}
  21.     /**
  22.      * @param Request $request
  23.      * @param RecruitmentCampaign $campaign
  24.      * @return Response
  25.      */
  26.     #[Route([
  27.         "fr" => "/campagne/{uuid}/postuler",
  28.         "en" => "/campaign/{uuid}/apply"
  29.     ], name"campaign-request-provider")]
  30.     public function postRequest(Request $requestRecruitmentCampaign $campaign): Response
  31.     {
  32.         $providerRequest= new ProviderRequest();
  33.         $providerRequest->setCampaign($campaign);
  34.         return $this->handleRequestForm($providerRequest$request$campaign);
  35.     }
  36.     #[Route("/demande/{providerRequest}/confirmation"name:"campaign-request-provider-confirmation")]
  37.     public function requestConfirm(Request $requestProviderRequest $providerRequest): Response
  38.     {
  39.         $campaign$providerRequest->getCampaign();
  40.         if($providerRequest->getConfirmedAt()){
  41.             //throw new NotFoundHttpException();
  42.         }
  43.         if($request->get("confirmer")){
  44.             try {
  45.                 if(!$providerRequest->getConfirmedAt()){
  46.                     $providerRequest->setConfirmedAt(new \DateTimeImmutable());
  47.                     $this->campaignManager->addRequest($campaign$providerRequest);
  48.                 }
  49.                 return $this->render('RecruitmentCampaign/_post_request_success.html.twig',[
  50.                     "request" => $providerRequest
  51.                 ]);
  52.             } catch (CampaignNotSubscribableException $e) {
  53.                 $this->addFlash('error'"Impossible de souscrire à cette campagne pour le moment.");
  54.             }
  55.         }
  56.         return $this->render('RecruitmentCampaign/_request_confirmation.html.twig', [
  57.             'campaign' => $campaign,
  58.             'request' => $providerRequest,
  59.             'title' => "Confirmation de ma demande",
  60.         ]);
  61.     }
  62.     #[Route("/demande/{providerRequest}/modifier"name:"campaign-request-provider-edit")]
  63.     public function editRequest(Request $requestProviderRequest $providerRequest): Response
  64.     {
  65.         $campaign$providerRequest->getCampaign();
  66.         if($providerRequest->getConfirmedAt()){
  67.             throw new NotFoundHttpException();
  68.         }
  69.         return $this->handleRequestForm($providerRequest$request$campaign);
  70.     }
  71.     /**
  72.      * @param RecruitmentCampaign $campaign
  73.      * @return Response
  74.      * @Route("/campaign/{uuid}/detail", name="campaign-detail")
  75.      */
  76.     #[Route([
  77.         "fr" => "/campagne/{uuid}/detail",
  78.         "en" => "/campaign/{uuid}/detail",
  79.     ], name:"campaign-detail")]
  80.     public function detail(RecruitmentCampaign $campaign): Response
  81.     {
  82.         return $this->render('RecruitmentCampaign/_campaign_detail.html.twig', [
  83.             'campaign' => $campaign,
  84.             'title' => $campaign->getName(),
  85.         ]);
  86.     }
  87.     /**
  88.      * @param RecruitmentCampaignRepository $repository
  89.      * @param string|null $status
  90.      * @return Response
  91.      */
  92.     #[Route([
  93.         "en" => "/approval-in-progress",
  94.         "fr" => "/agrement-en-cours"
  95.     ], name:"approval-in-progress"defaults:["status"=>"active"])]
  96.     #[Route([
  97.         "en" => "/approval-in-closed",
  98.         "fr" => "/agrement-cloture"
  99.     ], name:"approval-closed"defaults:["status"=>"inactive"])]
  100.     public function approval(RecruitmentCampaignRepository $repository,
  101.                              TranslatorInterface $translatable,
  102.                              ?string $statusRecruitmentCampaignFilter::STATUS_ACTIVE): Response
  103.     {
  104.         $paginator= new Paginator($repository->filter(RecruitmentCampaignFilter::withStatus($status)), 100);
  105.         $paginator->paginate();
  106.         return $this->render('RecruitmentCampaign/_campaign_list.html.twig', [
  107.             'paginator' => $paginator,
  108.             'title' => $translatable->trans(
  109.                 $status === RecruitmentCampaignFilter::STATUS_ACTIVE
  110.                     "Agréments en cours" :
  111.                     "Agréments clôturés"
  112.             ),
  113.             'menu' => $status === RecruitmentCampaignFilter::STATUS_ACTIVE "ac" "acl",
  114.         ]);
  115.     }
  116.     /**
  117.      * @param ProviderRequest $providerRequest
  118.      * @param Request $request
  119.      * @param RecruitmentCampaign|null $campaign
  120.      * @return RedirectResponse|Response
  121.      */
  122.     private function handleRequestForm(ProviderRequest $providerRequestRequest $request, ?RecruitmentCampaign $campaign): Response|RedirectResponse
  123.     {
  124.         $this->denyAccessUnlessGranted('CAMPAIGN_IS_SUBSCRIBABLE'$campaign"Impossible de souscrire à cette campagne pour le moment.");
  125.         $form $this->createForm(ProviderRequestType::class, $providerRequest);
  126.         $form->handleRequest(request$request);
  127.         if ($form->isSubmitted() && $form->isValid()) {
  128.             try {
  129.                 $this->campaignManager->addRequest($campaign$providerRequest);
  130.                 return $this->redirectToRoute('campaign-request-provider-confirmation', ["providerRequest" => $providerRequest->getId()]);
  131.             } catch (CampaignNotSubscribableException $e) {
  132.                 $this->addFlash('error'"Impossible de souscrire à cette campagne pour le moment.");
  133.             }
  134.         }
  135.         return $this->render('RecruitmentCampaign/_campaign_post_request.html.twig', [
  136.             'form' => $form->createView(),
  137.             'title' => "Demande d'agrément | " $campaign->getName(),
  138.             'campaign' => $campaign
  139.         ]);
  140.     }
  141. }