From 9040e9f2ed3ceb957d180194237acde1304fe8b5 Mon Sep 17 00:00:00 2001 From: numew Date: Fri, 24 Jan 2025 15:14:30 +0100 Subject: [PATCH 1/3] 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 %} From 418e36b1e79f719569996ea24824bbda17bd63af Mon Sep 17 00:00:00 2001 From: numew Date: Tue, 28 Jan 2025 18:00:27 +0100 Subject: [PATCH 2/3] refacto #3590 --- .../Back/AutoAssignerSimulatorController.php | 4 ++-- src/Service/Signalement/AutoAssigner.php | 23 +++++-------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/Controller/Back/AutoAssignerSimulatorController.php b/src/Controller/Back/AutoAssignerSimulatorController.php index 4d5ec491c..f63601b93 100644 --- a/src/Controller/Back/AutoAssignerSimulatorController.php +++ b/src/Controller/Back/AutoAssignerSimulatorController.php @@ -41,8 +41,8 @@ public function territory( } $signalements = $signalementRepository->findBy($criteria, ['createdAt' => 'DESC'], $limit); foreach ($signalements as $signalement) { - $autoAssigner->assign($signalement, true); - $assignablePartners = $autoAssigner->getAssignablePartners(); + $assignablePartners = $autoAssigner->assign($signalement, true); + dump($assignablePartners); $results[] = [ 'signalement' => $signalement, 'assignablePartners' => $assignablePartners, diff --git a/src/Service/Signalement/AutoAssigner.php b/src/Service/Signalement/AutoAssigner.php index f1d4b9132..9e4217ae4 100755 --- a/src/Service/Signalement/AutoAssigner.php +++ b/src/Service/Signalement/AutoAssigner.php @@ -29,7 +29,6 @@ class AutoAssigner { private int $countAffectations; - private array $assignablePartners = []; private array $affectedPartnersNames = []; public function __construct( @@ -44,15 +43,14 @@ public function __construct( ) { } - public function assign(Signalement $signalement, $simulation = false): void + public function assign(Signalement $signalement, $simulation = false): array { - $this->assignablePartners = []; $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( @@ -62,7 +60,7 @@ public function assign(Signalement $signalement, $simulation = false): void $this->logger->info($logMessage); \Sentry\captureMessage($logMessage); - return; + return []; } $adminEmail = $this->parameterBag->get('user_system_email'); $adminUser = $this->userManager->findOneBy(['email' => $adminEmail]); @@ -93,17 +91,13 @@ public function assign(Signalement $signalement, $simulation = false): void } $assignablePartners = array_values($assignablePartners); - if ($simulation) { - $this->assignablePartners = $assignablePartners; - - return; - } - - 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 @@ -154,9 +148,4 @@ public function getAffectedPartnerNames(): array { return $this->affectedPartnersNames; } - - public function getAssignablePartners(): array - { - return $this->assignablePartners; - } } From 20d8cd0c5fc89626a40edfcb4e12f71795aa7fe3 Mon Sep 17 00:00:00 2001 From: numew Date: Wed, 29 Jan 2025 14:09:56 +0100 Subject: [PATCH 3/3] remove dump #3590 --- src/Controller/Back/AutoAssignerSimulatorController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Controller/Back/AutoAssignerSimulatorController.php b/src/Controller/Back/AutoAssignerSimulatorController.php index f63601b93..978db7819 100644 --- a/src/Controller/Back/AutoAssignerSimulatorController.php +++ b/src/Controller/Back/AutoAssignerSimulatorController.php @@ -42,7 +42,6 @@ public function territory( $signalements = $signalementRepository->findBy($criteria, ['createdAt' => 'DESC'], $limit); foreach ($signalements as $signalement) { $assignablePartners = $autoAssigner->assign($signalement, true); - dump($assignablePartners); $results[] = [ 'signalement' => $signalement, 'assignablePartners' => $assignablePartners,