From 9040e9f2ed3ceb957d180194237acde1304fe8b5 Mon Sep 17 00:00:00 2001 From: numew Date: Fri, 24 Jan 2025 15:14:30 +0100 Subject: [PATCH] auto assigner simulator #3590 --- .../Back/AutoAssignerSimulatorController.php | 54 ++++++++++++++++ src/Repository/PartnerRepository.php | 10 ++- src/Service/Signalement/AutoAssigner.php | 18 +++++- .../auto-affectation-rule/index.html.twig | 5 +- .../auto-assigner-simulator/index.html.twig | 42 +++++++++++++ .../territory.html.twig | 62 +++++++++++++++++++ 6 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 src/Controller/Back/AutoAssignerSimulatorController.php create mode 100755 templates/back/auto-assigner-simulator/index.html.twig create mode 100755 templates/back/auto-assigner-simulator/territory.html.twig diff --git a/src/Controller/Back/AutoAssignerSimulatorController.php b/src/Controller/Back/AutoAssignerSimulatorController.php new file mode 100644 index 000000000..4d5ec491c --- /dev/null +++ b/src/Controller/Back/AutoAssignerSimulatorController.php @@ -0,0 +1,54 @@ +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]); + } +} diff --git a/src/Repository/PartnerRepository.php b/src/Repository/PartnerRepository.php index facbe6ff2..d1fe91c1f 100755 --- a/src/Repository/PartnerRepository.php +++ b/src/Repository/PartnerRepository.php @@ -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 @@ -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]); } diff --git a/src/Service/Signalement/AutoAssigner.php b/src/Service/Signalement/AutoAssigner.php index b49ac8743..f1d4b9132 100755 --- a/src/Service/Signalement/AutoAssigner.php +++ b/src/Service/Signalement/AutoAssigner.php @@ -29,6 +29,7 @@ class AutoAssigner { private int $countAffectations; + private array $assignablePartners = []; private array $affectedPartnersNames = []; public function __construct( @@ -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(); @@ -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 */ @@ -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); @@ -145,4 +154,9 @@ public function getAffectedPartnerNames(): array { return $this->affectedPartnersNames; } + + public function getAssignablePartners(): array + { + return $this->assignablePartners; + } } diff --git a/templates/back/auto-affectation-rule/index.html.twig b/templates/back/auto-affectation-rule/index.html.twig index b5e4d26ca..1adaa2a55 100755 --- a/templates/back/auto-affectation-rule/index.html.twig +++ b/templates/back/auto-affectation-rule/index.html.twig @@ -19,8 +19,9 @@

Règles d'auto-affectation

- Ajouter une règle d'auto-affection + Ajouter une règle d'auto-affection +
+ Simulateur
diff --git a/templates/back/auto-assigner-simulator/index.html.twig b/templates/back/auto-assigner-simulator/index.html.twig new file mode 100755 index 000000000..187086220 --- /dev/null +++ b/templates/back/auto-assigner-simulator/index.html.twig @@ -0,0 +1,42 @@ +{% extends 'back/base_bo.html.twig' %} + +{% block title %}Auto Assigner Simulator ⚗️{% endblock %} + +{% block content %} +
+ {% include 'back/breadcrumb_bo.html.twig' with { + 'level2Title': 'Outils SA', + 'level2Link': '', + 'level2Label': '', + 'level3Title': 'Auto Assigner Simulator ⚗️', + 'level3Link': '', + } %} +
+
+
+

+ Auto Assigner Simulator ⚗️ +
+ Liste des territoires ayant des règles d'auto-affectation +

+
+
+
+
+ +
+ {% set tableHead %} + Territoire + {% endset %} + + {% set tableBody %} + {% for item in territories %} + + {{ item.zip}} - {{item.name}} + + {% endfor %} + {% endset %} + + {% include '_partials/back/table.html.twig' with { 'tableLabel': 'Auto Assigner Simulator ⚗️', 'tableHead': tableHead, 'tableBody': tableBody } %} +
+{% endblock %} diff --git a/templates/back/auto-assigner-simulator/territory.html.twig b/templates/back/auto-assigner-simulator/territory.html.twig new file mode 100755 index 000000000..45fa9ea9d --- /dev/null +++ b/templates/back/auto-assigner-simulator/territory.html.twig @@ -0,0 +1,62 @@ +{% extends 'back/base_bo.html.twig' %} + +{% block title %}Auto Assigner Simulator ⚗️{% endblock %} + +{% block content %} +
+ {% 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': '', + } %} +
+
+
+

+ Auto Assigner Simulator ⚗️ +
+ {% if uuid %} + sur le signalement {{uuid}} du territoire {{territory.zip}} - {{territory.name}} + {% else %} + sur les {{limit}} derniers signalements du {{territory.zip}} - {{territory.name}} + {% endif %} +

+
+
+
+
+ +
+ {% set tableHead %} + Signalement + Partenaires affectés + Affectations simulées + {% endset %} + + {% set tableBody %} + {% for item in results %} + + {{ item.signalement.reference}} + + {% for affectation in item.signalement.affectations %} +
{{ affectation.partner.nom }}
+ {% endfor %} + + + {% for partner in item.assignablePartners %} +
{{ partner.nom }}
+ {% endfor %} + + + {% endfor %} + {% endset %} + + {% include '_partials/back/table.html.twig' with { 'tableLabel': 'Auto Assigner Simulator ⚗️', 'tableHead': tableHead, 'tableBody': tableBody } %} +
+{% endblock %}