Skip to content

Commit

Permalink
auto assigner simulator #3590
Browse files Browse the repository at this point in the history
  • Loading branch information
numew committed Jan 28, 2025
1 parent 095db40 commit 9040e9f
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 5 deletions.
54 changes: 54 additions & 0 deletions src/Controller/Back/AutoAssignerSimulatorController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?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) {
$autoAssigner->assign($signalement, true);
$assignablePartners = $autoAssigner->getAssignablePartners();
$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
18 changes: 16 additions & 2 deletions src/Service/Signalement/AutoAssigner.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
class AutoAssigner
{
private int $countAffectations;
private array $assignablePartners = [];
private array $affectedPartnersNames = [];

public function __construct(
Expand All @@ -43,8 +44,9 @@ public function __construct(
) {
}

public function assign(Signalement $signalement): void
public function assign(Signalement $signalement, $simulation = false): void
{
$this->assignablePartners = [];
$this->countAffectations = 0;
$autoAffectationRules = $signalement->getTerritory()->getAutoAffectationRules()->filter(function (AutoAffectationRule $autoAffectationRule) {
return AutoAffectationRule::STATUS_ACTIVE === $autoAffectationRule->getStatus();
Expand All @@ -64,7 +66,7 @@ public function assign(Signalement $signalement): void
}
$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,6 +92,13 @@ public function assign(Signalement $signalement): void
}
}
$assignablePartners = array_values($assignablePartners);

if ($simulation) {
$this->assignablePartners = $assignablePartners;

return;
}

if (!empty($assignablePartners)) {
$this->activateSignalement($signalement);
$this->createSuivi($signalement, $adminUser);
Expand Down Expand Up @@ -145,4 +154,9 @@ public function getAffectedPartnerNames(): array
{
return $this->affectedPartnersNames;
}

public function getAssignablePartners(): array
{
return $this->assignablePartners;
}
}
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 9040e9f

Please sign in to comment.