Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BO - Signalement] Suivi Usager #865

Merged
merged 9 commits into from
Jan 30, 2023
121 changes: 121 additions & 0 deletions src/Command/CreateSignalementUsagerCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?php

namespace App\Command;

use App\Entity\Signalement;
use App\Entity\Suivi;
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) {
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
$this->io->error('Signalement does not exists');

return Command::FAILURE;
}

$userOccupant = $this->userManager->createUsagerFromSignalement($signalement, $this->userManager::OCCUPANT);
$userDeclarant = $this->userManager->createUsagerFromSignalement($signalement, $this->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->entityManager->getRepository(Suivi::class)->findBy([
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
'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[] = 'occupant';
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
}
if ($userDeclarant) {
$question .= ' or to declarant';
$answers[] = 'declarant';
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
}

$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());
$to = $signalement->getMailUsagers();
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
foreach ($to as $recipient) {
$notificationService->send(
NotificationService::TYPE_SIGNALEMENT_VALIDATION,
[$recipient],
[
'signalement' => $signalement,
'lien_suivi' => $urlGenerator->generate(
'front_suivi_signalement',
[
'code' => $signalement->getCodeSuivi(),
'from' => $recipient,
],
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());

$to = $signalement->getMailUsagers();
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
$notificationService->send(
NotificationService::TYPE_SIGNALEMENT_REFUSAL,
$to,
[
'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());

$to = $signalement->getMailUsagers();
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
$notificationService->send(
NotificationService::TYPE_CONFIRM_RECEPTION,
$to,
[
'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, 'occupant');
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
/** @var User $userDeclarant */
$userDeclarant = $userManager->createUsagerFromSignalement($signalement, 'declarant');
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
$type = null;
if ($userOccupant && $fromEmail === $userOccupant->getEmail()) {
$type = $userManager::OCCUPANT;
} elseif ($userDeclarant && $fromEmail === $userDeclarant->getEmail()) {
$type = $userManager::DECLARANT;
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
}

// 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
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"
35 changes: 21 additions & 14 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;
}
$to = $entity->getSignalement()->getMailUsagers();
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
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());
foreach ($to as $recipient) {
hmeneuvrier marked this conversation as resolved.
Show resolved Hide resolved
$this->notifier->send(
NotificationService::TYPE_NEW_COMMENT_FRONT,
[$recipient],
[
'signalement' => $entity->getSignalement(),
'lien_suivi' => $this->urlGenerator->generate(
'front_suivi_signalement',
[
'code' => $entity->getSignalement()->getCodeSuivi(),
'from' => $recipient,
],
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