diff --git a/src/Controller/FrontSignalementController.php b/src/Controller/FrontSignalementController.php index 4ff93940f..04418e9c4 100755 --- a/src/Controller/FrontSignalementController.php +++ b/src/Controller/FrontSignalementController.php @@ -411,67 +411,117 @@ public function suiviProcedure( Request $request, UserManager $userManager, SuiviManager $suiviManager, + EntityManagerInterface $entityManager, + SuiviFactory $suiviFactory ) { - if ($signalement = $signalementRepository->findOneByCodeForPublic($code)) { - $requestEmail = $request->get('from'); - $fromEmail = \is_array($requestEmail) ? array_pop($requestEmail) : $requestEmail; - $suiviAuto = $request->get('suiviAuto'); + $signalement = $signalementRepository->findOneByCodeForPublic($code); + if (!$signalement) { + $this->addFlash('error', 'Le lien utilisé est expiré ou invalide.'); - /** @var User $userOccupant */ - $userOccupant = $userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT); - /** @var User $userDeclarant */ - $userDeclarant = $userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT); - $type = null; - $user = null; - if ($userOccupant && $fromEmail === $userOccupant->getEmail()) { - $type = UserManager::OCCUPANT; - $user = $userOccupant; - } elseif ($userDeclarant && $fromEmail === $userDeclarant->getEmail()) { - $type = UserManager::DECLARANT; - $user = $userDeclarant; - } - if ($user && $suiviAuto) { - if ($signalement->getIsUsagerAbandonProcedure()) { - $this->addFlash('error', 'Les services ont déjà été informés de votre volonté d\'arrêter la procédure. + return $this->redirectToRoute('home'); + } + $requestEmail = $request->get('from'); + $fromEmail = \is_array($requestEmail) ? array_pop($requestEmail) : $requestEmail; + $suiviAuto = $request->get('suiviAuto'); + + /** @var User $userOccupant */ + $userOccupant = $userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT); + /** @var User $userDeclarant */ + $userDeclarant = $userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT); + $type = null; + $user = null; + if ($userOccupant && $fromEmail === $userOccupant->getEmail()) { + $type = UserManager::OCCUPANT; + $user = $userOccupant; + } elseif ($userDeclarant && $fromEmail === $userDeclarant->getEmail()) { + $type = UserManager::DECLARANT; + $user = $userDeclarant; + } + + if (!$user + || !\in_array($suiviAuto, [Suivi::POURSUIVRE_PROCEDURE, Suivi::ARRET_PROCEDURE]) + || \in_array($signalement->getStatut(), [Signalement::STATUS_CLOSED, Signalement::STATUS_REFUSED])) { + $this->addFlash('error', 'Le lien utilisé est invalide.'); + + return $this->redirectToRoute( + 'front_suivi_signalement', + ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] + ); + } + + if ($signalement->getIsUsagerAbandonProcedure()) { + $this->addFlash('error', 'Les services ont déjà été informés de votre volonté d\'arrêter la procédure. Si vous le souhaitez, vous pouvez préciser la raison de l\'arrêt de procédure en envoyant un message via le formulaire ci-dessous.'); - return $this->redirectToRoute( - 'front_suivi_signalement', - ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] - ); - } + return $this->redirectToRoute( + 'front_suivi_signalement', + ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] + ); + } - if (Suivi::POURSUIVRE_PROCEDURE === $suiviAuto) { - $description = $user->getNomComplet().' ('.$type.') a indiqué vouloir poursuivre la procédure.'; - $suiviPoursuivreProcedure = $suiviManager->findOneBy([ - 'description' => $description, - 'signalement' => $signalement, - ]); - if (null !== $suiviPoursuivreProcedure) { - $this->addFlash('error', 'Les services ont déjà été informés de votre volonté de continuer la procédure. + if (Suivi::POURSUIVRE_PROCEDURE === $suiviAuto) { + $description = $user->getNomComplet().' ('.$type.') a indiqué vouloir poursuivre la procédure.'; + $suiviPoursuivreProcedure = $suiviManager->findOneBy([ + 'description' => $description, + 'signalement' => $signalement, + ]); + if (null !== $suiviPoursuivreProcedure) { + $this->addFlash('error', 'Les services ont déjà été informés de votre volonté de continuer la procédure. Si vous le souhaitez, vous pouvez envoyer un message via le formulaire ci-dessous.'); - return $this->redirectToRoute( - 'front_suivi_signalement', - ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] - ); - } - } + return $this->redirectToRoute( + 'front_suivi_signalement', + ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] + ); + } + } - return $this->render('front/suivi_signalement.html.twig', [ - 'signalement' => $signalement, - 'email' => $fromEmail, - 'type' => $type, - 'suiviAuto' => $suiviAuto, - ]); + $token = $request->get('_token'); + $tokenValid = $this->isCsrfTokenValid('suivi_procedure', $token); + if ($token && !$tokenValid) { + $this->addFlash('error', 'Token CSRF invalide, merci de réessayer.'); + } + if ($token && $tokenValid) { + if (Suivi::ARRET_PROCEDURE === $suiviAuto) { + $description = $user->getNomComplet().' ('.$type.') a demandé l\'arrêt de la procédure.'; + $signalement->setIsUsagerAbandonProcedure(true); + $entityManager->persist($signalement); + $this->addFlash('success', "Les services ont été informés de votre volonté d'arrêter la procédure. + Si vous le souhaitez, vous pouvez préciser la raison de l'arrêt de procédure + en envoyant un message via le formulaire ci-dessous."); + } else { + $description = $user->getNomComplet().' ('.$type.') a indiqué vouloir poursuivre la procédure.'; + $this->addFlash('success', "Les services ont été informés de votre volonté de poursuivre la procédure. + N'hésitez pas à mettre à jour votre situation en envoyant un message via le formulaire ci-dessous."); } - return $this->redirectToRoute('front_suivi_signalement'); + $params = [ + 'type' => SUIVI::TYPE_USAGER, + 'description' => $description, + ]; + + $suivi = $suiviFactory->createInstanceFrom( + $user, + $signalement, + $params, + true + ); + $entityManager->persist($suivi); + $entityManager->flush(); + + return $this->redirectToRoute( + 'front_suivi_signalement', + ['code' => $signalement->getCodeSuivi(), 'from' => $fromEmail] + ); } - $this->addFlash('error', 'Le lien utilisé est invalide, vérifiez votre saisie.'); - return $this->redirectToRoute('front_signalement'); + return $this->render('front/suivi_signalement.html.twig', [ + 'signalement' => $signalement, + 'email' => $fromEmail, + 'type' => $type, + 'suiviAuto' => $suiviAuto, + ]); } #[Route('/suivre-mon-signalement/{code}', name: 'front_suivi_signalement', methods: 'GET')] @@ -479,64 +529,23 @@ public function suiviSignalement( string $code, SignalementRepository $signalementRepository, Request $request, - UserManager $userManager, - EntityManagerInterface $entityManager, - SuiviFactory $suiviFactory, + UserManager $userManager ) { if ($signalement = $signalementRepository->findOneByCodeForPublic($code)) { $requestEmail = $request->get('from'); $fromEmail = \is_array($requestEmail) ? array_pop($requestEmail) : $requestEmail; - $suiviAuto = $request->get('suiviAuto'); /** @var User $userOccupant */ $userOccupant = $userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT); /** @var User $userDeclarant */ $userDeclarant = $userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT); $type = null; - $user = null; if ($userOccupant && $fromEmail === $userOccupant->getEmail()) { $type = UserManager::OCCUPANT; - $user = $userOccupant; } elseif ($userDeclarant && $fromEmail === $userDeclarant->getEmail()) { $type = UserManager::DECLARANT; - $user = $userDeclarant; } - if ($user && $suiviAuto) { - $description = ''; - if (Suivi::ARRET_PROCEDURE === $suiviAuto) { - $description = $user->getNomComplet().' ('.$type.') a demandé l\'arrêt de la procédure.'; - $signalement->setIsUsagerAbandonProcedure(true); - $entityManager->persist($signalement); - } - if (Suivi::POURSUIVRE_PROCEDURE === $suiviAuto) { - $description = $user->getNomComplet().' ('.$type.') a indiqué vouloir poursuivre la procédure.'; - } - $params = [ - 'type' => SUIVI::TYPE_USAGER, - 'description' => $description, - ]; - - $suivi = $suiviFactory->createInstanceFrom( - $user, - $signalement, - $params, - true - ); - $entityManager->persist($suivi); - $entityManager->flush(); - if (Suivi::ARRET_PROCEDURE === $suiviAuto) { - $this->addFlash('success', "Les services ont été informés de votre volonté d'arrêter la procédure. - Si vous le souhaitez, vous pouvez préciser la raison de l'arrêt de procédure - en envoyant un message via le formulaire ci-dessous."); - } - if (Suivi::POURSUIVRE_PROCEDURE === $suiviAuto) { - $this->addFlash('success', "Les services ont été informés de votre volonté de poursuivre la procédure. - N'hésitez pas à mettre à jour votre situation en envoyant un message via le formulaire ci-dessous."); - } - } - - // TODO: Verif info perso pour plus de sécu return $this->render('front/suivi_signalement.html.twig', [ 'signalement' => $signalement, 'email' => $fromEmail, @@ -557,69 +566,75 @@ public function postUserResponse( EntityManagerInterface $entityManager, SuiviFactory $suiviFactory, SignalementFileProcessor $signalementFileProcessor, + UserManager $userManager ): RedirectResponse { - if ($signalement = $signalementRepository->findOneByCodeForPublic($code)) { - if ($this->isCsrfTokenValid('signalement_front_response_'.$signalement->getUuid(), $request->get('_token'))) { - $email = $request->get('signalement_front_response')['email']; - $user = $userRepository->findOneBy(['email' => $email]); - $suivi = $suiviFactory->createInstanceFrom( - user: $user, - signalement: $signalement, - params: ['type' => Suivi::TYPE_USAGER], - isPublic: true, - ); + $signalement = $signalementRepository->findOneByCodeForPublic($code); + if (!$signalement) { + $this->addFlash('error', 'Le lien utilisé est expiré ou invalide, vérifiez votre saisie.'); - $description = htmlspecialchars( - nl2br($request->get('signalement_front_response')['content']), - \ENT_QUOTES, - 'UTF-8' - ); + return $this->redirectToRoute('home'); + } + if (!$this->isCsrfTokenValid('signalement_front_response_'.$signalement->getUuid(), $request->get('_token'))) { + $this->addFlash('error', 'Token CSRF invalide'); - $fileList = $descriptionList = []; - if ($data = $request->get('signalement')) { - if (isset($data['files'])) { - $dataFiles = $data['files']; - foreach ($dataFiles as $inputName => $files) { - list($files, $descriptions) = $signalementFileProcessor->process( - $dataFiles, - $inputName, - DocumentType::AUTRE - ); - $fileList = [...$fileList, ...$files]; - $descriptionList = [...$descriptionList, ...$descriptions]; - } - unset($data['files']); - } - if (!empty($descriptionList)) { - $description .= '
Ajout de pièces au signalement'; - $signalementFileProcessor->addFilesToSignalement($fileList, $signalement, $user); - } + return $this->redirectToRoute('front_suivi_signalement', ['code' => $signalement->getCodeSuivi()]); + } + if (\in_array($signalement->getStatut(), [Signalement::STATUS_CLOSED, Signalement::STATUS_REFUSED])) { + return $this->redirectToRoute('front_suivi_signalement', ['code' => $signalement->getCodeSuivi()]); + } + /* @var User $userOccupant */ + $userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT); + /* @var User $userDeclarant */ + $userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT); + + $email = $request->get('signalement_front_response')['email']; + $user = $userRepository->findOneBy(['email' => $email]); + $suivi = $suiviFactory->createInstanceFrom( + user: $user, + signalement: $signalement, + params: ['type' => Suivi::TYPE_USAGER], + isPublic: true, + ); + + $description = htmlspecialchars( + nl2br($request->get('signalement_front_response')['content']), + \ENT_QUOTES, + 'UTF-8' + ); + + $fileList = $descriptionList = []; + if ($data = $request->get('signalement')) { + if (isset($data['files'])) { + $dataFiles = $data['files']; + foreach ($dataFiles as $inputName => $files) { + list($files, $descriptions) = $signalementFileProcessor->process( + $dataFiles, + $inputName, + DocumentType::AUTRE + ); + $fileList = [...$fileList, ...$files]; + $descriptionList = [...$descriptionList, ...$descriptions]; } + unset($data['files']); + } + if (!empty($descriptionList)) { + $description .= '
Ajout de pièces au signalement'; + $signalementFileProcessor->addFilesToSignalement($fileList, $signalement, $user); + } + } - $suivi->setDescription($description); - $entityManager->persist($suivi); - $entityManager->flush(); - $this->addFlash('success', <<setDescription($description); + $entityManager->persist($suivi); + $entityManager->flush(); + $this->addFlash('success', <<addFlash('error', 'Token CSRF invalide'); - } - } else { - $this->addFlash('error', 'Le lien utilisé est expiré ou invalide, vérifiez votre saisie.'); - - return $this->redirectToRoute('home'); - } - if (!empty($email)) { - return $this->redirectToRoute( - 'front_suivi_signalement', - ['code' => $signalement->getCodeSuivi(), 'from' => $email] - ); - } - - return $this->redirectToRoute('front_suivi_signalement', ['code' => $signalement->getCodeSuivi()]); + return $this->redirectToRoute( + 'front_suivi_signalement', + ['code' => $signalement->getCodeSuivi(), 'from' => $email] + ); } } diff --git a/src/Repository/SignalementRepository.php b/src/Repository/SignalementRepository.php index f14474597..fc6d20e15 100755 --- a/src/Repository/SignalementRepository.php +++ b/src/Repository/SignalementRepository.php @@ -517,6 +517,8 @@ public function findOneByCodeForPublic($code): ?Signalement return $this->createQueryBuilder('s') ->andWhere('s.codeSuivi = :code') ->setParameter('code', $code) + ->andWhere('s.statut != :status') + ->setParameter('status', Signalement::STATUS_ARCHIVED) ->leftJoin('s.suivis', 'suivis', Join::WITH, 'suivis.isPublic = 1') ->addSelect('suivis') ->getQuery() diff --git a/templates/front/suivi_signalement.html.twig b/templates/front/suivi_signalement.html.twig index 60808e2a2..fcaa80361 100755 --- a/templates/front/suivi_signalement.html.twig +++ b/templates/front/suivi_signalement.html.twig @@ -24,35 +24,43 @@
- - {% if suiviAuto is defined and suiviAuto is not empty %} -
-
-
-
- {% if suiviAuto is same as constant('App\\Entity\\Suivi::ARRET_PROCEDURE') %} - Vous souhaitez arrêter la procédure ?
- {% endif %} - {% if suiviAuto is same as constant('App\\Entity\\Suivi::POURSUIVRE_PROCEDURE') %} - Vous souhaitez poursuivre la procédure ?
- {% endif %} - Nous allons informer les services de votre réponse.
- Attention votre choix pourra avoir un impact sur la poursuite de votre dossier.
-
-
-
-
- Annuler + {% if signalement.statut is same as constant('App\\Entity\\Signalement::STATUS_REFUSED') %} + + {% elseif signalement.statut is same as constant('App\\Entity\\Signalement::STATUS_CLOSED') %} + + {% else %} + {% if suiviAuto is defined and suiviAuto is not empty %} +
+
+
+
+ {% if suiviAuto is same as constant('App\\Entity\\Suivi::ARRET_PROCEDURE') %} + Vous souhaitez arrêter la procédure ?
+ {% endif %} + {% if suiviAuto is same as constant('App\\Entity\\Suivi::POURSUIVRE_PROCEDURE') %} + Vous souhaitez poursuivre la procédure ?
+ {% endif %} + Nous allons informer les services de votre réponse.
+ Attention votre choix pourra avoir un impact sur la poursuite de votre dossier.
+
-
- Confirmer +
+
+ Annuler +
+
+ Confirmer +
-
- {% elseif signalement.statut != constant('App\\Entity\\Signalement::STATUS_CLOSED') %} + {% endif %}
[Signalement::STATUS_ACTIVE]; + yield 'Clôturé' => [Signalement::STATUS_CLOSED]; + yield 'Refusé' => [Signalement::STATUS_REFUSED]; + yield 'Archivé' => [Signalement::STATUS_ARCHIVED]; + } + + /** + * @dataProvider provideStatusSignalement + */ + public function testDisplaySuiviProcedure(int $status): void + { + $client = static::createClient(); + + /** @var EntityManagerInterface $entityManager */ + $entityManager = self::getContainer()->get('doctrine'); + /** @var Signalement $signalement */ + $signalement = $entityManager->getRepository(Signalement::class)->findOneBy([ + 'statut' => $status, + ]); + /** @var RouterInterface $router */ + $router = self::getContainer()->get(RouterInterface::class); + $urlSuiviSignalementUser = $router->generate('front_suivi_procedure', [ + 'code' => $signalement->getCodeSuivi(), + ]).'?from='.$signalement->getMailOccupant().'&suiviAuto='.Suivi::ARRET_PROCEDURE; + + $crawler = $client->request('GET', $urlSuiviSignalementUser); + if (Signalement::STATUS_ARCHIVED === $status) { + $this->assertResponseRedirects('/'); + } elseif (Signalement::STATUS_ACTIVE === $status) { + $this->assertEquals('Signalement #2022-1', $crawler->filter('h1')->text()); + } else { + $this->assertResponseRedirects('/suivre-mon-signalement/'.$signalement->getCodeSuivi().'?from='.$signalement->getMailOccupant()); + } + } + + /** + * @dataProvider provideStatusSignalement + */ + public function testDisplaySuiviSignalement(int $status): void { $client = static::createClient(); + /** @var EntityManagerInterface $entityManager */ $entityManager = self::getContainer()->get('doctrine'); /** @var Signalement $signalement */ $signalement = $entityManager->getRepository(Signalement::class)->findOneBy([ - 'codeSuivi' => '0123456789', + 'statut' => $status, ]); /** @var RouterInterface $router */ $router = self::getContainer()->get(RouterInterface::class); $urlSuiviSignalementUser = $router->generate('front_suivi_signalement', [ 'code' => $signalement->getCodeSuivi(), - ]).'?from[]='.$signalement->getMailOccupant(); + ]).'?from='.$signalement->getMailOccupant(); $crawler = $client->request('GET', $urlSuiviSignalementUser); - $this->assertResponseIsSuccessful(); - $this->assertEquals('Signalement #2023-18', $crawler->filter('h1')->text()); + if (Signalement::STATUS_ARCHIVED === $status) { + $this->assertResponseRedirects('/'); + } elseif (Signalement::STATUS_ACTIVE === $status) { + $this->assertEquals('Signalement #2022-1', $crawler->filter('h1')->text()); + } elseif (Signalement::STATUS_CLOSED === $status) { + $this->assertEquals('Votre signalement a été clôturé, vous ne pouvez plus envoyer de messages.', $crawler->filter('.fr-alert--error p')->text()); + } elseif (Signalement::STATUS_REFUSED === $status) { + $this->assertEquals('Votre signalement a été refusé, vous ne pouvez plus envoyer de messages.', $crawler->filter('.fr-alert--error p')->text()); + } } - public function testPostUsagerResponse(): void + /** + * @dataProvider provideStatusSignalement + */ + public function testPostUsagerResponse(int $status): void { $client = static::createClient(); /** @var EntityManagerInterface $entityManager */ $entityManager = self::getContainer()->get('doctrine'); /** @var Signalement $signalement */ $signalement = $entityManager->getRepository(Signalement::class)->findOneBy([ - 'codeSuivi' => '0123456789', + 'statut' => $status, ]); /** @var RouterInterface $router */ $router = self::getContainer()->get(RouterInterface::class); @@ -147,8 +199,13 @@ public function testPostUsagerResponse(): void ], ], ]); - - $this->assertResponseRedirects('/suivre-mon-signalement/'.$codeSuivi.'?from='.$emailOccupant); + if (Signalement::STATUS_ARCHIVED === $status) { + $this->assertResponseRedirects('/'); + } elseif (Signalement::STATUS_ACTIVE === $status) { + $this->assertResponseRedirects('/suivre-mon-signalement/'.$codeSuivi.'?from='.$emailOccupant); + } else { + $this->assertResponseRedirects('/suivre-mon-signalement/'.$codeSuivi); + } } public function provideAdressSignalementWithTerritoryActive(): array