diff --git a/src/Controller/Back/AutoAssignerSimulatorController.php b/src/Controller/Back/AutoAssignerSimulatorController.php new file mode 100644 index 000000000..978db7819 --- /dev/null +++ b/src/Controller/Back/AutoAssignerSimulatorController.php @@ -0,0 +1,53 @@ +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]); + } +} 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..9e4217ae4 100755 --- a/src/Service/Signalement/AutoAssigner.php +++ b/src/Service/Signalement/AutoAssigner.php @@ -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( @@ -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 */ @@ -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 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 %}