Skip to content

Commit

Permalink
Merge pull request #3611 from MTES-MCT/feature/3590-auto-assigner-sim…
Browse files Browse the repository at this point in the history
…ulator

[Auto-affectation] Mettre en place un simulateur
  • Loading branch information
hmeneuvrier authored Jan 31, 2025
2 parents 5405036 + 20d8cd0 commit 13ce4f9
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 8 deletions.
53 changes: 53 additions & 0 deletions src/Controller/Back/AutoAssignerSimulatorController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

namespace App\Controller\Back;

use App\Entity\Territory;
use App\Repository\SignalementRepository;
use App\Repository\TerritoryRepository;
use App\Service\Signalement\AutoAssigner;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;

#[Route('/bo/auto-assigner-simulator')]
class AutoAssignerSimulatorController extends AbstractController
{
#[Route('/', name: 'back_auto_assigner_simulator_index')]
#[IsGranted('ROLE_ADMIN')]
public function index(
TerritoryRepository $territoryRepository,
): Response {
$territories = $territoryRepository->findAllWithAutoAffectationRules();

return $this->render('back/auto-assigner-simulator/index.html.twig', ['territories' => $territories]);
}

#[Route('/{territory}', name: 'back_auto_assigner_simulator_territory')]
#[IsGranted('ROLE_ADMIN')]
public function territory(
Request $request,
Territory $territory,
SignalementRepository $signalementRepository,
AutoAssigner $autoAssigner,
): Response {
$results = [];
$criteria = ['territory' => $territory];
$limit = $request->query->getInt('limit', 10);
if ($uuid = $request->query->get('uuid')) {
$criteria['uuid'] = $uuid;
}
$signalements = $signalementRepository->findBy($criteria, ['createdAt' => 'DESC'], $limit);
foreach ($signalements as $signalement) {
$assignablePartners = $autoAssigner->assign($signalement, true);
$results[] = [
'signalement' => $signalement,
'assignablePartners' => $assignablePartners,
];
}

return $this->render('back/auto-assigner-simulator/territory.html.twig', ['territory' => $territory, 'results' => $results, 'limit' => $limit, 'uuid' => $uuid]);
}
}
10 changes: 9 additions & 1 deletion src/Repository/PartnerRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ public function findByLocalization(Signalement $signalement, bool $affected = tr
/**
* @throws Exception
*/
public function findPartnersByLocalization(Signalement $signalement): array
public function findPartnersByLocalization(Signalement $signalement, $addAffectedPartner = false): array
{
$queryData = $this->buildLocalizationQuery($signalement, false); // Always use $affected = false

Expand All @@ -201,6 +201,14 @@ public function findPartnersByLocalization(Signalement $signalement): array
$queryData['params']
);
$partnerIds = array_column($resultSet->fetchAllAssociative(), 'id');
if ($addAffectedPartner) {
$queryData = $this->buildLocalizationQuery($signalement, true);
$resultSet = $this->getEntityManager()->getConnection()->executeQuery(
$queryData['sql'],
$queryData['params']
);
$partnerIds = array_merge($partnerIds, array_column($resultSet->fetchAllAssociative(), 'id'));
}

return $this->getEntityManager()->getRepository(Partner::class)->findBy(['id' => $partnerIds]);
}
Expand Down
13 changes: 8 additions & 5 deletions src/Service/Signalement/AutoAssigner.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ public function __construct(
) {
}

public function assign(Signalement $signalement): void
public function assign(Signalement $signalement, $simulation = false): array
{
$this->countAffectations = 0;
$autoAffectationRules = $signalement->getTerritory()->getAutoAffectationRules()->filter(function (AutoAffectationRule $autoAffectationRule) {
return AutoAffectationRule::STATUS_ACTIVE === $autoAffectationRule->getStatus();
});
if ($autoAffectationRules->isEmpty()) {
return;
return [];
}
if (empty($signalement->getGeoloc())) {
$logMessage = \sprintf(
Expand All @@ -60,11 +60,11 @@ public function assign(Signalement $signalement): void
$this->logger->info($logMessage);
\Sentry\captureMessage($logMessage);

return;
return [];
}
$adminEmail = $this->parameterBag->get('user_system_email');
$adminUser = $this->userManager->findOneBy(['email' => $adminEmail]);
$partners = $this->partnerRepository->findPartnersByLocalization($signalement);
$partners = $this->partnerRepository->findPartnersByLocalization($signalement, $simulation);
$assignablePartners = [];

/** @var AutoAffectationRule $rule */
Expand All @@ -90,11 +90,14 @@ public function assign(Signalement $signalement): void
}
}
$assignablePartners = array_values($assignablePartners);
if (!empty($assignablePartners)) {

if (!$simulation && !empty($assignablePartners)) {
$this->activateSignalement($signalement);
$this->createSuivi($signalement, $adminUser);
$this->assignPartners($signalement, $adminUser, $assignablePartners);
}

return $assignablePartners;
}

private function activateSignalement(Signalement $signalement): void
Expand Down
5 changes: 3 additions & 2 deletions templates/back/auto-affectation-rule/index.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
<h1 class="fr-h1 fr-mb-0">Règles d'auto-affectation</h1>
</div>
<div class="fr-col-6 fr-text--right">
<a class="fr-btn fr-btn--success fr-btn--icon-left fr-btn--md fr-fi-add-circle-line" href="{{ path('back_auto_affectation_rule_new') }}"
>Ajouter une règle d'auto-affection</a>
<a class="fr-btn fr-btn--success fr-btn--icon-left fr-btn--md fr-fi-add-circle-line" href="{{ path('back_auto_affectation_rule_new') }}">Ajouter une règle d'auto-affection</a>
<br>
<a class="fr-btn fr-btn--secondary fr-mt-2v" href="{{ path('back_auto_assigner_simulator_index') }}">Simulateur</a>
</div>
</div>
</header>
Expand Down
42 changes: 42 additions & 0 deletions templates/back/auto-assigner-simulator/index.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{% extends 'back/base_bo.html.twig' %}

{% block title %}Auto Assigner Simulator ⚗️{% endblock %}

{% block content %}
<section class="fr-p-5v">
{% include 'back/breadcrumb_bo.html.twig' with {
'level2Title': 'Outils SA',
'level2Link': '',
'level2Label': '',
'level3Title': 'Auto Assigner Simulator ⚗️',
'level3Link': '',
} %}
<header>
<div class="fr-grid-row">
<div class="fr-col-12">
<h1 class="fr-h1 fr-mb-0">
Auto Assigner Simulator ⚗️
<br>
<small>Liste des territoires ayant des règles d'auto-affectation</small>
</h1>
</div>
</div>
</header>
</section>

<section class="fr-col-12 fr-pt-0 fr-px-5v">
{% set tableHead %}
<th scope="col">Territoire</th>
{% endset %}

{% set tableBody %}
{% for item in territories %}
<tr>
<td><a href="{{path('back_auto_assigner_simulator_territory', {territory:item.id})}}">{{ item.zip}} - {{item.name}}</a></td>
</tr>
{% endfor %}
{% endset %}

{% include '_partials/back/table.html.twig' with { 'tableLabel': 'Auto Assigner Simulator ⚗️', 'tableHead': tableHead, 'tableBody': tableBody } %}
</section>
{% endblock %}
62 changes: 62 additions & 0 deletions templates/back/auto-assigner-simulator/territory.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
{% extends 'back/base_bo.html.twig' %}

{% block title %}Auto Assigner Simulator ⚗️{% endblock %}

{% block content %}
<section class="fr-p-5v">
{% include 'back/breadcrumb_bo.html.twig' with {
'level2Title': 'Outils SA',
'level2Link': '',
'level2Label': '',
'level3Title': 'Auto Assigner Simulator ⚗️',
'level3Link': path('back_auto_assigner_simulator_index'),
'level3Label': 'Retour à la liste des territoires ayant des règles d\'auto-affectation',
'level4Title': 'Simulation',
'level4Link': '',
'level4Label': '',
} %}
<header>
<div class="fr-grid-row">
<div class="fr-col-12">
<h1 class="fr-h1 fr-mb-0">
Auto Assigner Simulator ⚗️
<br>
{% if uuid %}
<small>sur le signalement {{uuid}} du territoire {{territory.zip}} - {{territory.name}}</small>
{% else %}
<small>sur les {{limit}} derniers signalements du {{territory.zip}} - {{territory.name}}</small>
{% endif %}
</h1>
</div>
</div>
</header>
</section>

<section class="fr-col-12 fr-pt-0 fr-px-5v">
{% set tableHead %}
<th scope="col">Signalement</th>
<th scope="col">Partenaires affectés</th>
<th scope="col">Affectations simulées</th>
{% endset %}

{% set tableBody %}
{% for item in results %}
<tr>
<td><a href="{{path('back_signalement_view', {uuid:item.signalement.uuid})}}">{{ item.signalement.reference}}</a></td>
<td>
{% for affectation in item.signalement.affectations %}
<div class="fr-badge fr-badge--blue-ecume fr-mb-1v">{{ affectation.partner.nom }}</div>
{% endfor %}
</td>
<td>
{% for partner in item.assignablePartners %}
<div class="fr-badge fr-mb-1v">{{ partner.nom }}</div>
{% endfor %}
</td>
</tr>
{% endfor %}
{% endset %}

{% include '_partials/back/table.html.twig' with { 'tableLabel': 'Auto Assigner Simulator ⚗️', 'tableHead': tableHead, 'tableBody': tableBody } %}
</section>
{% endblock %}

0 comments on commit 13ce4f9

Please sign in to comment.