Skip to content

Commit

Permalink
Merge pull request #865 from MTES-MCT/fix/784-bo-signalement-suivi-us…
Browse files Browse the repository at this point in the history
…ager

[BO - Signalement] Suivi Usager
  • Loading branch information
sfinx13 committed Jan 30, 2023
2 parents 851f4f6 + aae6271 commit 996908c
Show file tree
Hide file tree
Showing 14 changed files with 428 additions and 72 deletions.
120 changes: 120 additions & 0 deletions src/Command/CreateSignalementUsagerCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

namespace App\Command;

use App\Entity\Signalement;
use App\Manager\SuiviManager;
use App\Manager\UserManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(
name: 'app:create-signalement-usager',
description: 'Create declarant and occupant usager for a signalement, affect unaffected suivis if needed'
)]
class CreateSignalementUsagerCommand extends Command
{
private SymfonyStyle $io;

public function __construct(
private EntityManagerInterface $entityManager,
private UserManager $userManager,
private SuiviManager $suiviManager,
) {
parent::__construct();
}

protected function configure(): void
{
$this->addArgument('signalement', InputArgument::REQUIRED, 'Signalement uuid for which we want to create usager (declarant/occupant)');
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
$this->io = new SymfonyStyle($input, $output);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$signalementUuid = $input->getArgument('signalement');
$signalement = $this->entityManager->getRepository(Signalement::class)->findOneBy(['uuid' => $signalementUuid]);
if (null === $signalement) {
$this->io->error('Signalement does not exists');

return Command::FAILURE;
}

$userOccupant = $this->userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT);
$userDeclarant = $this->userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT);

if ($userOccupant) {
$this->io->success($userOccupant->getEmail().' occupant created or already existing');
}
if ($userDeclarant) {
$this->io->success($userDeclarant->getEmail().' declarant created or already existing');
}

$unaffectedSuivis = $this->suiviManager->getRepository()->findBy([
'signalement' => $signalement,
'createdBy' => null,
]);

if (\count($unaffectedSuivis) > 0) {
$helper = $this->getHelper('question');
$question = new ChoiceQuestion(
'Do you want to affect unaffected suivis ?',
['no', 'yes'],
'yes',
);

$affectSuivis = $helper->ask($input, $output, $question);
$this->io->text(' > <info> You have just selected: </info>'.$affectSuivis);

if ('yes' == $affectSuivis) {
$question = 'Do you want to affect this suivi';
$answers = [];

if ($userOccupant) {
$question .= ' to occupant';
$answers[] = UserManager::OCCUPANT;
}
if ($userDeclarant) {
$question .= ' or to declarant';
$answers[] = UserManager::DECLARANT;
}

$question .= ' ?';
$answers[] = 'no';

foreach ($unaffectedSuivis as $unaffectedSuivi) {
$this->io->text('Unaffected suivi created at '.$unaffectedSuivi->getCreatedAt()->format('d/m/Y H:m'));
$this->io->text('"'.$unaffectedSuivi->getDescription().'"');

$questionSuivi = new ChoiceQuestion(
$question,
$answers,
'no',
);
$affectSuivi = $helper->ask($input, $output, $questionSuivi);

if ('occupant' == $affectSuivi) {
$this->suiviManager->updateSuiviCreatedByUser($unaffectedSuivi, $userOccupant);
$this->io->text(' > <info> You have just affected to OCCUPANT this suivi</info>');
} elseif ('declarant' == $affectSuivi) {
$this->suiviManager->updateSuiviCreatedByUser($unaffectedSuivi, $userDeclarant);
$this->io->text(' > <info> You have just affected to DECLARANT this suivi</info>');
}
}
$this->io->text('FIN ');
}
}

return Command::SUCCESS;
}
}
38 changes: 30 additions & 8 deletions src/Controller/Back/BackSignalementActionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,39 @@ public function validationResponseSignalement(Signalement $signalement, Request
$description = 'validé';
$signalement->setValidatedAt(new DateTimeImmutable());
$signalement->setCodeSuivi(md5(uniqid()));
$notificationService->send(NotificationService::TYPE_SIGNALEMENT_VALIDATION, [$signalement->getMailDeclarant(), $signalement->getMailOccupant()], [
'signalement' => $signalement,
'lien_suivi' => $urlGenerator->generate('front_suivi_signalement', ['code' => $signalement->getCodeSuivi()], 0),
], $signalement->getTerritory());
$toRecipients = $signalement->getMailUsagers();
foreach ($toRecipients as $toRecipient) {
$notificationService->send(
NotificationService::TYPE_SIGNALEMENT_VALIDATION,
[$toRecipient],
[
'signalement' => $signalement,
'lien_suivi' => $urlGenerator->generate(
'front_suivi_signalement',
[
'code' => $signalement->getCodeSuivi(),
'from' => $toRecipient,
],
0
),
],
$signalement->getTerritory()
);
}
} else {
$statut = Signalement::STATUS_REFUSED;
$description = 'cloturé car non-valide avec le motif suivant :<br>'.$response['suivi'];
$notificationService->send(NotificationService::TYPE_SIGNALEMENT_REFUSAL, [$signalement->getMailDeclarant(), $signalement->getMailOccupant()], [
'signalement' => $signalement,
'motif' => $response['suivi'],
], $signalement->getTerritory());

$toRecipients = $signalement->getMailUsagers();
$notificationService->send(
NotificationService::TYPE_SIGNALEMENT_REFUSAL,
$toRecipients,
[
'signalement' => $signalement,
'motif' => $response['suivi'],
],
$signalement->getTerritory()
);
}
$suivi = new Suivi();
$suivi->setSignalement($signalement);
Expand Down
42 changes: 39 additions & 3 deletions src/Controller/FrontSignalementController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@
use App\Entity\Signalement;
use App\Entity\Situation;
use App\Entity\Suivi;
use App\Entity\User;
use App\Event\SignalementCreatedEvent;
use App\Exception\MaxUploadSizeExceededException;
use App\Form\SignalementType;
use App\Manager\UserManager;
use App\Repository\SignalementRepository;
use App\Repository\SituationRepository;
use App\Repository\TerritoryRepository;
use App\Repository\UserRepository;
use App\Service\CriticiteCalculatorService;
use App\Service\NotificationService;
use App\Service\Signalement\PostalCodeHomeChecker;
Expand Down Expand Up @@ -185,7 +188,17 @@ public function envoi(
$em->persist($signalement);
$em->flush();
!$signalement->getIsProprioAverti() && $attachment = file_exists($this->getParameter('mail_attachment_dir').'ModeleCourrier.pdf') ? $this->getParameter('mail_attachment_dir').'ModeleCourrier.pdf' : null;
$notificationService->send(NotificationService::TYPE_CONFIRM_RECEPTION, [$signalement->getMailDeclarant(), $signalement->getMailOccupant()], ['signalement' => $signalement, 'attach' => $attachment ?? null], $signalement->getTerritory());

$toRecipients = $signalement->getMailUsagers();
$notificationService->send(
NotificationService::TYPE_CONFIRM_RECEPTION,
$toRecipients,
[
'signalement' => $signalement,
'attach' => $attachment ?? null,
],
$signalement->getTerritory()
);

$eventDispatcher->dispatch(new SignalementCreatedEvent($signalement), SignalementCreatedEvent::NAME);

Expand All @@ -196,12 +209,30 @@ public function envoi(
}

#[Route('/suivre-mon-signalement/{code}', name: 'front_suivi_signalement', methods: 'GET')]
public function suiviSignalement(string $code, SignalementRepository $signalementRepository)
{
public function suiviSignalement(
string $code,
SignalementRepository $signalementRepository,
Request $request,
UserManager $userManager
) {
if ($signalement = $signalementRepository->findOneByCodeForPublic($code)) {
$fromEmail = $request->get('from');
/** @var User $userOccupant */
$userOccupant = $userManager->createUsagerFromSignalement($signalement, UserManager::OCCUPANT);
/** @var User $userDeclarant */
$userDeclarant = $userManager->createUsagerFromSignalement($signalement, UserManager::DECLARANT);
$type = null;
if ($userOccupant && $fromEmail === $userOccupant->getEmail()) {
$type = UserManager::OCCUPANT;
} elseif ($userDeclarant && $fromEmail === $userDeclarant->getEmail()) {
$type = UserManager::DECLARANT;
}

// TODO: Verif info perso pour plus de sécu
return $this->render('front/suivi_signalement.html.twig', [
'signalement' => $signalement,
'email' => $fromEmail,
'type' => $type,
]);
}
$this->addFlash('error', 'Le lien utilisé est expiré ou invalide, verifier votre saisie.');
Expand All @@ -213,6 +244,7 @@ public function suiviSignalement(string $code, SignalementRepository $signalemen
public function postUserResponse(
string $code,
SignalementRepository $signalementRepository,
UserRepository $userRepository,
NotificationService $notificationService,
UploadHandlerService $uploadHandlerService,
Request $request,
Expand All @@ -222,6 +254,10 @@ public function postUserResponse(
if ($this->isCsrfTokenValid('signalement_front_response_'.$signalement->getUuid(), $request->get('_token'))) {
$suivi = new Suivi();
$suivi->setIsPublic(true);
$email = $request->get('signalement_front_response')['email'];
$user = $userRepository->findOneBy(['email' => $email]);
$suivi->setCreatedBy($user);

$description = nl2br(filter_var($request->get('signalement_front_response')['content'], \FILTER_SANITIZE_STRING));
$files_array = [
'documents' => $signalement->getDocuments(),
Expand Down
3 changes: 3 additions & 0 deletions src/DataFixtures/Files/Signalement.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ signalements:
uuid: "00000000-0000-0000-2022-000000000001"
details: "Absence d’isolation toiture<br><br>Courrier adressé non pas à la mairie mais au bailleur social"
is_proprio_averti: 1
is_not_occupant: true
nb_adultes: "2"
is_allocataire: "CAF"
nature_logement: "Appartement"
Expand Down Expand Up @@ -127,6 +128,7 @@ signalements:
uuid: "00000000-0000-0000-2022-000000000004"
details: "appartement insalubre avec des..."
is_proprio_averti: 1
is_not_occupant: true
nb_adultes: "2"
is_allocataire: ""
nature_logement: "Appartement"
Expand Down Expand Up @@ -541,6 +543,7 @@ signalements:
uuid: "00000000-0000-0000-2022-000000000014"
details: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
is_proprio_averti: 1
is_not_occupant: true
nb_adultes: "3"
is_allocataire: "CAF"
nature_logement: "Appartement"
Expand Down
5 changes: 5 additions & 0 deletions src/DataFixtures/Files/Suivi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,8 @@ suivis:
description: "Le signalement à été refusé avec le motif suivant: <br>Ne me concerne pas, voir avec la DDT."
is_public: 0
signalement: "2022-3"
-
created_by: null
description: "Bonjour, j'ai toujours le problème, quand vais-je avoir une visite ?"
is_public: 1
signalement: "2022-4"
12 changes: 12 additions & 0 deletions src/DataFixtures/Loader/LoadSignalementData.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use App\Entity\Signalement;
use App\Entity\User;
use App\Form\SignalementType;
use App\Repository\CritereRepository;
use App\Repository\CriticiteRepository;
use App\Repository\SituationRepository;
Expand Down Expand Up @@ -88,6 +89,17 @@ private function loadSignalements(ObjectManager $manager, array $row)
->setOrigineSignalement($row['origine_signalement'])
->setCreatedAt((new \DateTimeImmutable())->modify('-15 days'));

if (isset($row['is_not_occupant'])) {
$signalement
->setIsNotOccupant($row['is_not_occupant'])
->setNomDeclarant($faker->lastName())
->setPrenomDeclarant($faker->firstName())
->setTelDeclarant($phoneNumber)
->setMailDeclarant($faker->email())
->setStructureDeclarant($faker->company())
->setLienDeclarantOccupant(SignalementType::LINK_CHOICES[array_rand(SignalementType::LINK_CHOICES)]);
}

if (isset($row['is_imported'])) {
$signalement
->setIsImported($row['is_imported'])
Expand Down
37 changes: 22 additions & 15 deletions src/EventListener/ActivityListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,26 @@ public function onFlush(OnFlushEventArgs $args): void
}

if ($entity->getIsPublic() && Signalement::STATUS_REFUSED !== $entity->getSignalement()->getStatut()) {
$to = [];
$mailDeclarant = $entity->getSignalement()->getMailDeclarant();
if (!empty($mailDeclarant)) {
$to[] = $mailDeclarant;
}
$mailOccupant = $entity->getSignalement()->getMailOccupant();
if (!empty($mailOccupant)) {
$to[] = $mailOccupant;
}
if (!empty($to) && Signalement::STATUS_CLOSED !== $entity->getSignalement()->getStatut()) {
$this->notifier->send(NotificationService::TYPE_NEW_COMMENT_FRONT, $to, [
'signalement' => $entity->getSignalement(),
'lien_suivi' => $this->urlGenerator->generate('front_suivi_signalement', ['code' => $entity->getSignalement()->getCodeSuivi()], UrlGenerator::ABSOLUTE_URL),
], $entity->getSignalement()->getTerritory());
$toRecipients = $entity->getSignalement()->getMailUsagers();
if (!empty($toRecipients) && Signalement::STATUS_CLOSED !== $entity->getSignalement()->getStatut()) {
foreach ($toRecipients as $toRecipient) {
$this->notifier->send(
NotificationService::TYPE_NEW_COMMENT_FRONT,
[$toRecipient],
[
'signalement' => $entity->getSignalement(),
'lien_suivi' => $this->urlGenerator->generate(
'front_suivi_signalement',
[
'code' => $entity->getSignalement()->getCodeSuivi(),
'from' => $toRecipient,
],
UrlGenerator::ABSOLUTE_URL
),
],
$entity->getSignalement()->getTerritory()
);
}
}
}
}
Expand Down Expand Up @@ -154,7 +160,8 @@ private function sendMail($entity, $mailType)
$this->parameterBag->get('admin_email'),
[
'url' => $this->parameterBag->get('host_url'),
'error' => sprintf('Aucun utilisateur est notifiable pour le signalement #%s.',
'error' => sprintf(
'Aucun utilisateur est notifiable pour le signalement #%s.',
$signalement->getReference()
),
],
Expand Down
Loading

0 comments on commit 996908c

Please sign in to comment.