Repository: centreon/centreon
Pull request #6974: enh(open-tickets): change rights on providers listing and update submit ticket ACL
Author: login: adr-mo
Labels: name: area/backend
name: skip-workflow-open-tickets
name: skip-workflow-open-tickets-analysis
Created: 2025-03-18T18:19:55Z | Merged: 2025-03-27T09:02:46Z

ℹ️ JIRA: https://centreon.atlassian.net/browse/MON-159670
📃 This PR intends to
- Change the ACL menu selection entry for the "Submit Ticket" form (from radio button to checkbox)
- Change the order of the menu "Submit Ticket" form in the Menu Access listing form
- Change access rights to the endpoint that list providers so that dashboard ACLs are applied instead of rights on the configuration -> notification -> rules page.
- refacto the endpoint so that it matches latest API changes.

ACL menu selection

<img width="945" alt="image" src="https://github.com/user-attachments/assets/dfa7ece6-f308-412b-8388-feef9e11b7b0" />

> [!NOTE]
> An other PR will be done on centreon-cloud-extensions so that all users can have in their default ACL menu access to the Submit Ticket form 



Diff:
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php
index 58ced9b00446..6231695f9138 100644
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php
+++ b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php
@@ -23,6 +23,7 @@
 
 namespace CentreonOpenTickets\Providers\Application\Repository;
 
+use Centreon\Domain\Repository\RepositoryException;
 use Centreon\Domain\RequestParameters\Interfaces\RequestParametersInterface;
 use CentreonOpenTickets\Providers\Domain\Model\Provider;
 
@@ -31,7 +32,7 @@ interface ReadProviderRepositoryInterface
     /**
      * @param RequestParametersInterface|null $requestParameters
      *
-     * @throws \Throwable
+     * @throws RepositoryException
      *
      * @return Provider[]
      */
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php
index 1cc2d07434fb..a26b1bcbb45a 100644
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php
+++ b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php
@@ -23,61 +23,50 @@
 
 namespace CentreonOpenTickets\Providers\Application\UseCase;
 
-use Centreon\Domain\Contact\Interfaces\ContactInterface;
 use Centreon\Domain\Log\LoggerTrait;
+use Centreon\Domain\Repository\RepositoryException;
 use Centreon\Domain\RequestParameters\Interfaces\RequestParametersInterface;
-use Centreon\Infrastructure\RequestParameters\RequestParametersTranslatorException;
 use CentreonOpenTickets\Providers\Application\Exception\ProviderException;
 use CentreonOpenTickets\Providers\Application\Repository\ReadProviderRepositoryInterface;
 use CentreonOpenTickets\Providers\Domain\Model\Provider;
 use Core\Application\Common\UseCase\ErrorResponse;
-use Core\Application\Common\UseCase\ForbiddenResponse;
+use Core\Application\Common\UseCase\ResponseStatusInterface;
 
 final class FindProviders
 {
     use LoggerTrait;
-    public const ROLE_CONFIGURATION_OPEN_TICKETS = 'ROLE_CONFIGURATION_NOTIFICATIONS_RULES_RW';
 
     /**
-     * @param ContactInterface $contact
      * @param RequestParametersInterface $requestParameters
      * @param ReadProviderRepositoryInterface $repository
      */
     public function __construct(
-        private ContactInterface $contact,
         private RequestParametersInterface $requestParameters,
         private ReadProviderRepositoryInterface $repository
     ) {
     }
 
     /**
-     * @param FindProvidersPresenterInterface $presenter
+     * @return FindProvidersResponse|ResponseStatusInterface
      */
-    public function __invoke(FindProvidersPresenterInterface $presenter): void
+    public function __invoke(): FindProvidersResponse|ResponseStatusInterface
     {
-        if (! $this->contact->hasTopologyRole(self::ROLE_CONFIGURATION_OPEN_TICKETS)) {
+        try {
+            $providers = $this->repository->findAll($this->requestParameters);
+
+            return $this->createResponse($providers);
+        } catch (RepositoryException $exception) {
             $this->error(
-                "User doesn't have sufficient rights to get ticket providers information",
+                $exception->getMessage(),
                 [
-                    'user_id' => $this->contact->getId(),
-                ]
-            );
-            $presenter->presentResponse(
-                new ForbiddenResponse(ProviderException::listingNotAllowed()->getMessage())
+                    'exception' => [
+                        'message' => $exception->getMessage(),
+                        'trace' => $exception->getTraceAsString(),
+                    ],
+                ],
             );
 
-            return;
-        }
-
-        try {
-            $providers = $this->repository->findAll($this->requestParameters);
-            $presenter->presentResponse($this->createResponse($providers));
-        } catch (RequestParametersTranslatorException $ex) {
-            $presenter->presentResponse(new ErrorResponse($ex->getMessage()));
-            $this->error($ex->getMessage(), ['trace' => $ex->getTraceAsString()]);
-        } catch (\Throwable $exception) {
-            $presenter->presentResponse(new ErrorResponse(ProviderException::errorWhileListingProviders()));
-            $this->error($exception->getMessage(), ['trace' => $exception->getTraceAsString()]);
+            return new ErrorResponse(ProviderException::errorWhileListingProviders());
         }
     }
 
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php
deleted file mode 100644
index 3b6f25e08894..000000000000
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * Copyright 2005 - 2023 Centreon (https://www.centreon.com/)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * For more information : contact@centreon.com
- *
- */
-
-declare(strict_types=1);
-
-namespace CentreonOpenTickets\Providers\Application\UseCase;
-
-use Core\Application\Common\UseCase\PresenterInterface;
-use Core\Application\Common\UseCase\ResponseStatusInterface;
-
-interface FindProvidersPresenterInterface extends PresenterInterface
-{
-    public function presentResponse(FindProvidersResponse|ResponseStatusInterface $response): void;
-}
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php
index ffd40f96e9e5..e33a64583610 100644
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php
+++ b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php
@@ -23,8 +23,18 @@
 
 namespace CentreonOpenTickets\Providers\Application\UseCase;
 
-final class FindProvidersResponse
+use Core\Application\Common\UseCase\ListingResponseInterface;
+
+final class FindProvidersResponse implements ListingResponseInterface
 {
     /** @var ProviderDto[] */
     public array $providers;
+
+    /**
+     * @return ProviderDto[]
+     */
+    public function getData(): array
+    {
+        return $this->providers;
+    }
 }
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php
index e25f8af36f58..468859b2461c 100644
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php
+++ b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php
@@ -25,26 +25,36 @@
 
 use Centreon\Application\Controller\AbstractController;
 use CentreonOpenTickets\Providers\Application\UseCase\FindProviders;
-use CentreonOpenTickets\Providers\Application\UseCase\FindProvidersPresenterInterface;
+use Core\Application\Common\UseCase\ResponseStatusInterface;
+use Core\Infrastructure\Common\Api\StandardPresenter;
+use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Security\Http\Attribute\IsGranted;
 
+#[IsGranted(
+    'dashboard_access_editor',
+    null,
+    "User doesn't have sufficient rights to get ticket providers information"
+)]
 final class FindProvidersController extends AbstractController
 {
     /**
      * @param FindProviders $useCase
-     * @param FindProvidersPresenterInterface $presenter
+     * @param StandardPresenter $presenter
      *
      * @return Response
      */
     public function __invoke(
         FindProviders $useCase,
-        FindProvidersPresenterInterface $presenter
+        StandardPresenter $presenter
     ): Response
     {
-        $this->denyAccessUnlessGrantedForApiConfiguration();
+        $response = $useCase();
 
-        $useCase($presenter);
+        if ($response instanceof ResponseStatusInterface) {
+            return $this->createResponse($response);
+        }
 
-        return $presenter->show();
+        return JsonResponse::fromJsonString($presenter->present($response));
     }
 }
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php
deleted file mode 100644
index 1dbbf01e145a..000000000000
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/*
- * Copyright 2005 - 2023 Centreon (https://www.centreon.com/)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * For more information : contact@centreon.com
- *
- */
-
-declare(strict_types=1);
-
-namespace CentreonOpenTickets\Providers\Infrastructure\API\FindProviders;
-
-use Centreon\Domain\RequestParameters\Interfaces\RequestParametersInterface;
-use CentreonOpenTickets\Providers\Application\UseCase\FindProvidersPresenterInterface;
-use CentreonOpenTickets\Providers\Application\UseCase\FindProvidersResponse;
-use CentreonOpenTickets\Providers\Application\UseCase\ProviderDto;
-use CentreonOpenTickets\Providers\Domain\Model\ProviderType;
-use Core\Application\Common\UseCase\AbstractPresenter;
-use Core\Application\Common\UseCase\ResponseStatusInterface;
-use Core\Infrastructure\Common\Presenter\PresenterFormatterInterface;
-
-final class FindProvidersPresenter extends AbstractPresenter implements FindProvidersPresenterInterface
-{
-    /**
-     * @param PresenterFormatterInterface $presenterFormatter
-     * @param RequestParametersInterface $requestParameters
-     */
-    public function __construct(
-        protected PresenterFormatterInterface $presenterFormatter,
-        private readonly RequestParametersInterface $requestParameters
-    ) {
-        parent::__construct($presenterFormatter);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public function presentResponse(FindProvidersResponse|ResponseStatusInterface $response): void
-    {
-        if ($response instanceof ResponseStatusInterface) {
-            $this->setResponseStatus($response);
-        } else {
-            $result = array_map(
-                fn (ProviderDto $provider): array => [
-                    'id' => $provider->id,
-                    'name' => $provider->name,
-                    'type' => $this->normalizeProviderType($provider->type),
-                    'is_activated' => $provider->isActivated,
-                ],
-                $response->providers
-            );
-
-            $this->present([
-                'result' => $result,
-                'meta' => $this->requestParameters->toArray(),
-            ]);
-        }
-    }
-
-    /**
-     * @param ProviderType $type
-     *
-     * @return string
-     */
-    private function normalizeProviderType(ProviderType $type): string
-    {
-        return match ($type) {
-            ProviderType::Mail => 'Mail',
-            ProviderType::Glpi => 'Glpi',
-            ProviderType::Otrs => 'Otrs',
-            ProviderType::Simple => 'Simple',
-            ProviderType::BmcItsm => 'BmcItsm',
-            ProviderType::Serena => 'Serena',
-            ProviderType::BmcFootprints11 => 'BmcFootprints11',
-            ProviderType::EasyvistaSoap => 'EasyvistaSoap',
-            ProviderType::ServiceNow => 'ServiceNow',
-            ProviderType::Jira => 'Jira',
-            ProviderType::GlpiRestApi => 'GlpiRestApi',
-            ProviderType::RequestTracker2 => 'RequestTracker2',
-            ProviderType::Itop => 'Itop',
-            ProviderType::EasyVistaRest => 'EasyVistaRest'
-        };
-    }
-}
diff --git a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php
index 0c63f5f479c2..ec66ee7076dc 100644
--- a/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php
+++ b/centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php
@@ -23,6 +23,7 @@
 
 namespace CentreonOpenTickets\Providers\Infrastructure\Repository;
 
+use Centreon\Domain\Repository\RepositoryException;
 use Centreon\Domain\RequestParameters\Interfaces\RequestParametersInterface;
 use Centreon\Infrastructure\DatabaseConnection;
 use Centreon\Infrastructure\RequestParameters\SqlRequestParametersTranslator;
@@ -55,54 +56,61 @@ public function __construct(DatabaseConnection $db)
      */
     public function findAll(?RequestParametersInterface $requestParameters): array
     {
-        $sqlTranslator = $requestParameters !== null ? new SqlRequestParametersTranslator($requestParameters) : null;
-        $sqlTranslator?->setConcordanceArray([
-            'name' => 'alias',
-            'is_activated' => 'activate',
-        ]);
-
-        $sqlTranslator?->addNormalizer('is_activated', new BoolToEnumNormalizer());
-
-        $request = <<<'SQL_WRAP'
-                SELECT SQL_CALC_FOUND_ROWS
-                    rule_id,
-                    alias,
-                    provider_id,
-                    activate
-                FROM `:db`.mod_open_tickets_rule
-            SQL_WRAP;
-
-        // handle search
-        $request .= $sqlTranslator?->translateSearchParameterToSql();
-
-        // handle sort
-        $sort = $sqlTranslator?->translateSortParameterToSql();
-        $request .= $sort ?? ' ORDER BY alias ASC';
-
-        // handle pagination
-        $request .= $sqlTranslator?->translatePaginationToSql();
-
-        $statement = $this->db->prepare($this->translateDbName($request));
-        $sqlTranslator?->bindSearchValues($statement);
-
-        $statement->setFetchMode(\PDO::FETCH_ASSOC);
-
-        $statement->execute();
-
-        // Set total
-        $result = $this->db->query('SELECT FOUND_ROWS()');
-        if ($result !== false && ($total = $result->fetchColumn()) !== false) {
-            $sqlTranslator?->getRequestParameters()->setTotal((int) $total);
-        }
-
-        $providers = [];
-
-        foreach ($statement as $record) {
-            /** @var _Provider $record */
-            $providers[] = $this->createProviderFromRecord($record);
+        try {
+            $sqlTranslator = $requestParameters !== null ? new SqlRequestParametersTranslator($requestParameters) : null;
+            $sqlTranslator?->setConcordanceArray([
+                'name' => 'alias',
+                'is_activated' => 'activate',
+            ]);
+
+            $sqlTranslator?->addNormalizer('is_activated', new BoolToEnumNormalizer());
+
+            $request = <<<'SQL_WRAP'
+                    SELECT SQL_CALC_FOUND_ROWS
+                        rule_id,
+                        alias,
+                        provider_id,
+                        activate
+                    FROM `:db`.mod_open_tickets_rule
+                SQL_WRAP;
+
+            // handle search
+            $request .= $sqlTranslator?->translateSearchParameterToSql();
+
+            // handle sort
+            $sort = $sqlTranslator?->translateSortParameterToSql();
+            $request .= $sort ?? ' ORDER BY alias ASC';
+
+            // handle pagination
+            $request .= $sqlTranslator?->translatePaginationToSql();
+
+            $statement = $this->db->prepare($this->translateDbName($request));
+            $sqlTranslator?->bindSearchValues($statement);
+
+            $statement->setFetchMode(\PDO::FETCH_ASSOC);
+
+            $statement->execute();
+
+            // Set total
+            $result = $this->db->query('SELECT FOUND_ROWS()');
+            if ($result !== false && ($total = $result->fetchColumn()) !== false) {
+                $sqlTranslator?->getRequestParameters()->setTotal((int) $total);
+            }
+
+            $providers = [];
+
+            foreach ($statement as $record) {
+                /** @var _Provider $record */
+                $providers[] = $this->createProviderFromRecord($record);
+            }
+
+            return $providers;
+        } catch (\Throwable $ex) {
+            throw new RepositoryException(
+                message: 'Error while fetching provider rules',
+                previous: $ex
+            );
         }
-
-        return $providers;
     }
 
     /**
diff --git a/centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts b/centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts
index 97b844e3a15a..284c9bac402b 100644
--- a/centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts
+++ b/centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts
@@ -62,6 +62,9 @@ before(() => {
     useSlim: false,
     profiles:['glpi']
   });
+  cy.executeCommandsViaClapi(
+    'resources/clapi/config-ACL/dashboard-notification-permissions.json'
+  );
   cy.addHost({
     hostGroup: 'Linux-Servers',
     name: services.serviceOk.host,
@@ -146,6 +149,7 @@ before(() => {
       service: 'Ping'
     }
   ]);
+  cy.applyAcl();
   cy.logoutViaAPI();
 });
 
@@ -179,7 +183,7 @@ beforeEach(() => {
     url: `/centreon/api/latest/configuration/dashboards/*`
   }).as('addingDashboard');
   cy.loginByTypeOfUser({
-    jsonName: 'admin',
+    jsonName: 'user-dashboard-administrator',
     loginViaApi: false
   });
 });
@@ -292,7 +296,6 @@ When(
 Then(
   'the ticket should be deleted and the resource should no longer be associated with the ticket',
   () => {
-    cy.exportConfig();
     cy.waitForElementToBeVisible('[class*="root-emptyDataCell"]');
     cy.contains('div', 'No result found').should('be.visible');
   }
diff --git a/centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts b/centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts
index e61e99dd9356..c25d5a27fb30 100644
--- a/centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts
+++ b/centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts
@@ -69,7 +69,7 @@ Cypress.Commands.add('exportConfig', () => {
 
 Cypress.Commands.add(
   'waitForElementToBeVisible',
-  (selector, timeout = 50000, interval = 2000) => {
+  (selector, timeout = 70000, interval = 3000) => {
     cy.waitUntil(
       () =>
         cy.get('body').then(($body) => {
@@ -129,6 +129,17 @@ Cypress.Commands.add('editDashboard', (name) => {
   }).should('be.visible');
 });
 
+Cypress.Commands.add('applyAcl', () => {
+  const apacheUser = Cypress.env('WEB_IMAGE_OS').includes('alma')
+    ? 'apache'
+    : 'www-data';
+
+  cy.execInContainer({
+    command: `su -s /bin/sh ${apacheUser} -c "/usr/bin/env php -q /usr/share/centreon/cron/centAcl.php"`,
+    name: 'web'
+  });
+});
+
 declare global {
   namespace Cypress {
     interface Chainable {
@@ -151,6 +162,7 @@ declare global {
         accessRightsTestId: string,
         expectedElementCount: number
       ) => Cypress.Chainable;
+      applyAcl: () => Cypress.Chainable;
     }
   }
 }
diff --git a/centreon-open-tickets/tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json b/centreon-open-tickets/tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json
new file mode 100644
index 000000000000..0e10aa3d877d
--- /dev/null
+++ b/centreon-open-tickets/tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json
@@ -0,0 +1,77 @@
+[
+    {
+        "action": "ADD",
+        "object": "CONTACT",
+        "values": "user-dashboard-administrator;user-dashboard-administrator;user-dashboard-administrator@centreon.test;Centreon@2023;0;1;en_US;local"
+    },
+    {
+        "action":"SETPARAM",
+        "object":"CONTACT",
+        "values":"user-dashboard-administrator;reach_api;1"
+    },
+    {
+        "action": "ADD",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;alias-administrator-ACLMENU"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;0;Home;Dashboards;Administrator;"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;0;Monitoring;Resources Status"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;3;Configuration;Hosts"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;3;Configuration;Services"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;3;Configuration;Notifications"
+    },
+    {
+        "action": "GRANTRW",
+        "object": "ACLMENU",
+        "values": "name-administrator-ACLMENU;4;Administration"
+    },
+    {
+        "action": "ADD",
+        "object": "ACLGROUP",
+        "values": "name-administrator-ACLGROUP;alias-administrator-ACLGROUP"
+    },
+    {
+        "action": "addresource",
+        "object": "ACLGROUP",
+        "values": "name-administrator-ACLGROUP;All Resources"
+    },
+    {
+        "action": "addaction",
+        "object": "ACLGROUP",
+        "values": "name-administrator-ACLGROUP;Simple User"
+    },
+    {
+        "action": "ADDMENU",
+        "object": "ACLGROUP",
+        "values": "name-administrator-ACLGROUP;name-administrator-ACLMENU"
+    },
+    {
+        "action": "ADDMENU",
+        "object": "ACLGROUP",
+        "values": "ALL;name-administrator-ACLMENU"
+    },
+    {
+        "action": "SETCONTACT",
+        "object": "ACLGROUP",
+        "values": "name-administrator-ACLGROUP;user-dashboard-administrator;"
+    }
+]
\ No newline at end of file
diff --git a/centreon-open-tickets/tests/e2e/fixtures/users/user-dashboard-administrator.json b/centreon-open-tickets/tests/e2e/fixtures/users/user-dashboard-administrator.json
new file mode 100644
index 000000000000..92dba2ed36cf
--- /dev/null
+++ b/centreon-open-tickets/tests/e2e/fixtures/users/user-dashboard-administrator.json
@@ -0,0 +1,4 @@
+{
+  "login": "user-dashboard-administrator",
+  "password": "Centreon@2023"
+}
\ No newline at end of file
diff --git a/centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php b/centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php
index 79ba03ed7096..bffa9d075897 100644
--- a/centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php
+++ b/centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php
@@ -23,7 +23,7 @@
 
 namespace Tests\CentreonOpenTickets\Providers\Application\UseCase\FindProviders;
 
-use Centreon\Domain\Contact\Interfaces\ContactInterface;
+use Centreon\Domain\Repository\RepositoryException;
 use Centreon\Domain\RequestParameters\Interfaces\RequestParametersInterface;
 use Centreon\Infrastructure\RequestParameters\RequestParametersTranslatorException;
 use CentreonOpenTickets\Providers\Application\Exception\ProviderException;
@@ -33,75 +33,29 @@
 use CentreonOpenTickets\Providers\Domain\Model\Provider;
 use CentreonOpenTickets\Providers\Domain\Model\ProviderType;
 use Core\Application\Common\UseCase\ErrorResponse;
-use Core\Application\Common\UseCase\ForbiddenResponse;
-use Core\Infrastructure\Common\Presenter\PresenterFormatterInterface;
-use Tests\CentreonOpenTickets\Providers\Infrastructure\API\FindProviders\FindProvidersPresenterStub;
 
 beforeEach(closure: function (): void {
     $this->useCase = new FindProviders(
-        contact: $this->contact = $this->createMock(ContactInterface::class),
         requestParameters: $this->requestParameters = $this->createMock(RequestParametersInterface::class),
         repository: $this->repository = $this->createMock(ReadProviderRepositoryInterface::class)
     );
-
-    $this->presenter = new FindProvidersPresenterStub($this->createMock(PresenterFormatterInterface::class));
-});
-
-it('should present a Forbidden response when user does not have sufficient rights (missing page access)', function (): void {
-    $this->contact
-        ->expects($this->once())
-        ->method('hasTopologyRole')
-        ->willReturn(false);
-
-    ($this->useCase)($this->presenter);
-
-    expect($this->presenter->response)
-        ->toBeInstanceOf(ForbiddenResponse::class)
-        ->and($this->presenter->response->getMessage())
-        ->toBe(ProviderException::listingNotAllowed()->getMessage());
 });
 
 it('should present an ErrorResponse when an exception occurs for ticket provider search', function (): void {
-    $this->contact
-        ->expects($this->once())
-        ->method('hasTopologyRole')
-        ->willReturn(true);
-
-    $exception = new \Exception();
+    $exception = new RepositoryException();
     $this->repository
         ->expects($this->once())
         ->method('findAll')
         ->willThrowException($exception);
 
-    ($this->useCase)($this->presenter);
-    expect($this->presenter->response)
+    $response = ($this->useCase)();
+    expect($response)
         ->toBeInstanceOf(ErrorResponse::class)
-        ->and($this->presenter->response->getMessage())
+        ->and($response->getMessage())
         ->toBe(ProviderException::errorWhileListingProviders()->getMessage());
 });
 
-it('should present an ErrorResponse when an error occurs concerning the request parameters', function (): void {
-    $this->contact
-        ->expects($this->once())
-        ->method('hasTopologyRole')
-        ->willReturn(true);
-
-    $this->repository
-        ->expects($this->once())
-        ->method('findAll')
-        ->willThrowException(new RequestParametersTranslatorException());
-
-    ($this->useCase)($this->presenter);
-    expect($this->presenter->response)
-        ->toBeInstanceOf(ErrorResponse::class);
-});
-
 it('should present a FindProvidersResponse when everything goes well', function (): void {
-    $this->contact
-        ->expects($this->once())
-        ->method('hasTopologyRole')
-        ->willReturn(true);
-
     $provider = new Provider(
         id: 1,
         name: 'glpi',
@@ -114,8 +68,7 @@
         ->method('findAll')
         ->willReturn([$provider]);
 
-    ($this->useCase)($this->presenter);
-    $response = $this->presenter->response;
+    $response = ($this->useCase)();
     expect($response)
         ->toBeInstanceOf(FindProvidersResponse::class)
         ->and($response->providers[0]->id)->toBe($provider->getId())
diff --git a/centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql b/centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql
index e7c144cc8eed..8e713f793189 100644
--- a/centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql
+++ b/centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql
@@ -6,8 +6,8 @@ INSERT INTO `topology` (`topology_id`, `topology_name`, `topology_parent`, `topo
 (NULL, 'Open Tickets', '604', NULL, NULL, '8', NULL, NULL, '0', '1', '1'),
 (NULL, 'Rules', '604', '60420', '10', '8', './modules/centreon-open-tickets/views/rules/index.php', NULL, NULL, '1', '1');
 
-INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_url`, `topology_show`, `readonly`)
-VALUES ('Submit Ticket', 604, 60421, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', '0', '0');
+INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_order`, `topology_group`,  `topology_url`, `topology_show`, `readonly`)
+VALUES ('Create Ticket', 604, 60421, 20, 8, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', '0', '1');
 
 INSERT INTO `topology_JS` (`id_page`, `PathName_js`) VALUES ('60420', './modules/centreon-open-tickets/lib/jquery.sheepItPlugin.js');
 INSERT INTO `topology_JS` (`id_page`, `PathName_js`) VALUES ('60420', './modules/centreon-open-tickets/lib/jquery.serialize-object.min.js');
diff --git a/centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql b/centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql
index 853ecec2bbe8..10c2d0e885bc 100644
--- a/centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql
+++ b/centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql
@@ -7,6 +7,7 @@ DROP TABLE `@DB_CENTSTORAGE@`.`mod_open_tickets_data`;
 DROP TABLE `@DB_CENTSTORAGE@`.`mod_open_tickets`;
 
 DELETE FROM topology WHERE topology_page = '60420' AND topology_name = 'Rules';
+DELETE FROM topology WHERE topology_page = '60421' AND topology_name = 'Create Ticket';
 DELETE FROM topology WHERE topology_parent = '604' AND topology_name = 'Open Tickets';
 DELETE FROM topology_JS WHERE id_page = '60420';
 
diff --git a/centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php b/centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php
new file mode 100644
index 000000000000..98995de7556f
--- /dev/null
+++ b/centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php
@@ -0,0 +1,78 @@
+<?php
+/*
+ * Centreon
+ *
+ * Source Copyright 2005-2025 Centreon
+ *
+ * Unauthorized reproduction, copy and distribution
+ * are not allowed.
+ *
+ * For more information : contact@centreon.com
+ *
+ */
+// Regenerate routes. Should be present in the
+// upgrade scripts of all versions.
+require __DIR__ . '/../../../php/generate_routes.php';
+
+//error specific content
+$errorMessage = '';
+$versionOfTheUpgrade = 'UPGRADE - 25.01.1: ';
+
+/**
+ * @param CentreonDB $pearDB
+ *
+ * @throws CentreonDbException
+ * @return void
+ */
+$reOrderAndChangeType = function (CentreonDB $pearDB) use (&$errorMessage): void {
+    $errorMessage = 'Unable to update table topology to re order and change type of Create Ticket menu access';
+    $pearDB->executeQuery(
+        <<<'SQL'
+            UPDATE `topology`
+            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topology_name = 'Create Ticket'
+            WHERE `topology_page` = 60421
+        SQL
+    );
+
+    $errorMessage = 'Unable to update table acl_topology_relations (radio to checkbox ACL configuration)';
+    $pearDB->executeQuery(
+        <<<'SQL'
+            UPDATE acl_topology_relations AS t1
+            INNER JOIN topology AS t2 ON t1.topology_topology_id = t2.topology_id
+            SET t1.access_right = 0
+            WHERE t1.access_right = 2 AND t2.topology_page = 60421
+        SQL
+    );
+};
+
+try {
+    if (! $pearDB->inTransaction()) {
+        $pearDB->beginTransaction();
+    }
+
+    $reOrderAndChangeType($pearDB);
+
+    $pearDB->commit();
+} catch (\Exception $e) {
+    if ($pearDB->inTransaction()) {
+        try {
+            $pearDB->rollBack();
+        } catch (PDOException $e) {
+            CentreonLog::create()->error(
+                logTypeId: CentreonLog::TYPE_UPGRADE,
+                message: "{$versionOfTheUpgrade} error while rolling back the upgrade operation",
+                customContext: ['error_message' => $e->getMessage(), 'trace' => $e->getTraceAsString()],
+                exception: $e
+            );
+        }
+    }
+
+    CentreonLog::create()->error(
+        logTypeId: CentreonLog::TYPE_UPGRADE,
+        message: $versionOfTheUpgrade . $errorMessage,
+        customContext: ['error_message' => $e->getMessage(), 'trace' => $e->getTraceAsString()],
+        exception: $e
+    );
+
+    throw new \Exception($versionOfTheUpgrade . $errorMessage, (int) $e->getCode(), $e);
+}


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql (1)</summary><blockquote>

`10-10`: **Redundant with line 18.**

The newly added DELETE statement on line 10 is partially redundant with the existing statement on line 18. Both target the same `topology_page = 60421`, but line 10 has an additional condition for `topology_name = 'Submit Ticket'`.

Consider consolidating these DELETE statements to avoid confusion and potential maintenance issues:

```diff
DELETE FROM topology WHERE topology_page = '60420' AND topology_name = 'Rules';
-DELETE FROM topology WHERE topology_page = '60421' AND topology_name = 'Submit Ticket';
DELETE FROM topology WHERE topology_parent = '604' AND topology_name = 'Open Tickets';
DELETE FROM topology_JS WHERE id_page = '60420';

DELETE FROM topology WHERE topology_page = '20320' AND topology_name = 'Ticket Logs';
DELETE FROM topology_JS WHERE id_page = '20320';

DELETE FROM widget_parameters_field_type WHERE ft_typename = 'openTicketsRule';
-DELETE FROM `topology` WHERE topology_page = 60421;
+DELETE FROM `topology` WHERE topology_page = 60421;
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b99c00abfb2bcbbcd9c9cad15d9110fa6389852c and b9536471ea137977259d80c4c48b6e70ce07c944.

</details>

<details>
<summary>📒 Files selected for processing (11)</summary>

* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php` (2 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php` (0 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php` (0 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php` (2 hunks)
* `centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php` (3 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql` (1 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql` (1 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (2)</summary>

* centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php
* centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Definitions (2)</summary>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (4)</summary><blockquote>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php (1) (1)</summary>

* `findAll` (57:114)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (1) (1)</summary>

* `__invoke` (47:59)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php (1) (1)</summary>

* `FindProvidersResponse` (28:40)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php (1) (1)</summary>

* `findAll` (39:39)

</details>

</blockquote></details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (1)</summary><blockquote>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (3) (3)</summary>

* `__invoke` (52:71)
* `FindProviders` (35:93)
* `createResponse` (78:92)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: check-status

</details>

<details>
<summary>🔇 Additional comments (30)</summary><blockquote>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php (2)</summary>

`26-26`: **LGTM: Adding RepositoryException import.**

Properly importing the specific exception type to be used in the error handling.

---

`59-113`: **Improved error handling with specific exception.**

The implementation now properly wraps the database operations in a try-catch block and throws a more specific RepositoryException with a clear error message.

This change aligns with the interface modification and provides better error handling and reporting. The clear error message will help with debugging and troubleshooting.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php (2)</summary>

`26-26`: **LGTM: Adding RepositoryException import.**

Properly importing the specific exception type to be used in the interface.

---

`35-35`: **LGTM: Updating exception type in documentation.**

This change improves the interface contract by specifying that a more specific RepositoryException will be thrown instead of a generic Throwable.

This change aligns with the implementation in DbReadProviderRepository and improves code consistency.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php (3)</summary>

`26-27`: **Appropriate interface implementation for standardized response handling.**

The addition of `ListingResponseInterface` dependency aligns with best practices for standardized response structures across the application.

---

`28-28`: **Standard interface implementation for consistency.**

The class now implements `ListingResponseInterface`, which standardizes how responses are structured and consumed throughout the application.

---

`32-39`: **Well-implemented data access method.**

The `getData()` method provides a standardized way to access the response data, in line with the interface requirements and improving the API's consistency.

</details>
<details>
<summary>centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php (4)</summary>

`26-26`: **Good use of specific exception type.**

The change from generic to specific exception type improves type safety and clarifies the expected error handling path.

---

`44-46`: **Improved exception specificity.**

Using `RepositoryException` instead of generic `\Exception` provides clearer error handling and matches the changes in the repository interface.

---

`51-55`: **Simplified test structure for direct response validation.**

The test now directly validates the response from the use case, which is a cleaner approach following the removal of permission checks in the main implementation.

---

`71-72`: **Streamlined test case with direct invocation.**

The test now directly invokes the use case without dealing with permission checks, which matches the simplified implementation in the use case class.

</details>
<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php (5)</summary>

`13-15`: **Good practice including route regeneration in the upgrade script.**

Including route regeneration ensures that any route-related changes are properly applied during the upgrade process.

---

`17-19`: **Well-structured error reporting setup.**

The error message variable and version identifier improve traceability and error reporting in the upgrade process.

---

`21-46`: **Well-implemented database updates for ACL changes.**

The function properly implements the two key changes required:
1. Reordering the Submit Ticket form in the Menu Access listing (setting topology_order and group)
2. Changing the ACL type from radio to checkbox (updating access_right from 2 to 0)

This aligns perfectly with the PR objectives.

---

`48-56`: **Good transaction management.**

The code correctly checks if a transaction is already in progress before starting a new one, and ensures proper commit after successful execution.

---

`56-78`: **Comprehensive error handling with proper logging.**

The exception handling includes:
1. Transaction rollback attempt with its own error handling
2. Detailed error logging with context information
3. Re-throwing the exception with additional context

This ensures robust error handling and traceability during the upgrade process.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (7)</summary>

`26-30`: **Appropriate imports for standardized response handling.**

The changes in imports reflect the transition to a more standardized approach for handling API responses.

---

`32-32`: **Added security import for attribute-based access control.**

The addition of the `IsGranted` attribute import supports the move to attribute-based access control.

---

`34-38`: **Improved access control with dashboard access rights.**

The `IsGranted` attribute properly implements the dashboard ACL access control as specified in the PR objectives, replacing the previous configuration-based check.

---

`43-43`: **Updated to standard presenter for consistent response formatting.**

Using the `StandardPresenter` instead of a dedicated interface improves code consistency and reuse across the application.

---

`49-49`: **Updated parameter type to use standard presenter.**

This change aligns with the updated dependencies and standardized response handling approach.

---

`52-56`: **Enhanced response handling with type checking.**

The code now properly handles different response types by checking if the response is an instance of `ResponseStatusInterface`, improving error handling and response consistency.

---

`58-58`: **Updated response creation for standard presenter.**

The response creation now uses the standard presenter's presentation method, ensuring consistent formatting of the response.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (7)</summary>

`27-27`: **Good addition of specific exception import.**

Adding the `RepositoryException` import allows for more precise exception handling, which aligns with the refactoring of the error handling logic in this class.

---

`33-33`: **Appropriate addition of ResponseStatusInterface import.**

This import supports the new return type and aligns with the updated method signature in `__invoke()`.

---

`43-46`: **Constructor simplification improves separation of concerns.**

The removal of the `ContactInterface` dependency from the constructor properly shifts access control responsibility from this use case to the API layer, consistent with the PR's objective to "adjust access rights for the endpoint that lists providers."

---

`50-52`: **Method signature properly updated to reflect new return behavior.**

The updated return type signature correctly indicates that this method will now return either a successful response or an error status, which is more explicit than the previous void return.

---

`54-58`: **Streamlined implementation with direct repository access.**

The implementation now directly accesses the repository without role checks, aligning with the PR's goal to apply dashboard ACLs instead of notification rule settings. This simplification makes the code more focused on its core responsibility.

---

`58-70`: **Improved error handling with specific exception type.**

The error handling has been improved by:
1. Catching the specific `RepositoryException` rather than generic exceptions
2. Including more detailed error information in logs
3. Returning a standardized error response

This change makes the error handling more precise and maintainable.

---

`50-70`: <details>
<summary>❓ Verification inconclusive</summary>

**Verify that ACL checks are implemented at the API layer.**

The removal of role checks from this class requires that proper access control is implemented at the API/controller layer. Please ensure that the `FindProvidersController` or middleware is properly applying the dashboard ACLs as mentioned in the PR objectives.

---

🏁 Script executed:

```shell
#!/bin/bash
# Search for ACL checks in the corresponding controller or middleware
echo "Checking for ACL implementations in controller:"
rg -A 10 "FindProvidersController" --glob "*.php"

echo "Checking for middleware that might handle ACLs:"
rg -A 5 "Dashboard.*ACL|ACL.*Dashboard" --glob "*.php"
```

Length of output: 17543

---



</details>

**Action: Verify API-Level ACL Enforcement**

The role checks have been removed from the use-case in `FindProviders.php`, so it's essential that the ACL validations are now fully implemented in the API layer. Please ensure that the ACL logic is correctly enforced in the controller and/or middleware. In particular:

- Confirm that `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php` includes the necessary ACL checks, such as validating the dashboard access rights.
- Verify that any applicable middleware is properly applying the dashboard ACLs as outlined in the PR objectives.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T18:23:00Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b240727b8d555e11dc2847152d69bfd66fbd4ebc and 58d7eeabff4fa0f89c70e2868e482b715ac86256.

</details>

<details>
<summary>📒 Files selected for processing (11)</summary>

* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php` (2 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php` (0 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php` (1 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php` (0 hunks)
* `centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php` (2 hunks)
* `centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php` (3 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql` (1 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql` (1 hunks)
* `centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (2)</summary>

* centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersPresenterInterface.php
* centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersPresenter.php

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (4)</summary>

* centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql
* centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php
* centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php
* centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Definitions (2)</summary>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (1)</summary><blockquote>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (3) (3)</summary>

* `__invoke` (52-71)
* `FindProviders` (35-93)
* `createResponse` (78-92)

</details>

</blockquote></details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (4)</summary><blockquote>

<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/Repository/DbReadProviderRepository.php (1) (1)</summary>

* `findAll` (57-114)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (1) (1)</summary>

* `__invoke` (47-59)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProvidersResponse.php (1) (1)</summary>

* `FindProvidersResponse` (28-40)

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/Repository/ReadProviderRepositoryInterface.php (1) (1)</summary>

* `findAll` (39-39)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (2)</summary>

* GitHub Check: dockerize alma9
* GitHub Check: check-status

</details>

<details>
<summary>🔇 Additional comments (14)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql (1)</summary>

`9-10`: **LGTM: Topology entry correctly updated to 'Create Ticket'.**

The INSERT statement has been properly updated with the correct column and value ordering. The changes align with the PR objectives - reordering the ticket submission form in the menu (now at position 20 in group 8) and updating it from 'Submit Ticket' to 'Create Ticket' with the readonly flag set to '1'.

</details>
<details>
<summary>centreon-open-tickets/tests/php/CentreonOpenTickets/Providers/Application/UseCase/FindProviders/FindProvidersTest.php (3)</summary>

`26-26`: **Correct import for the specific exception type.**

Good update to import the specific `RepositoryException` instead of using a generic throwable.

---

`44-56`: **Properly updated test to use specific exception and direct response checking.**

The test has been correctly updated to:
1. Use the specific `RepositoryException` instead of a generic `\Exception`
2. Directly check the response from the use case invocation

This aligns with the changes in the actual `FindProviders` class which now throws a specific exception type.

---

`71-72`: **Test updated to match the simplified use case.**

The test properly reflects the simplification of the `FindProviders` use case, which no longer requires checking user permissions.

</details>
<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php (2)</summary>

`39-45`: **LGTM: Good SQL update for ACL rights.**

The query correctly updates the access rights in the `acl_topology_relations` table from radio button access (value 2) to checkbox access (value 0) for the 'Submit Ticket' topology entry (page 60421).

---

`48-78`: **Well-structured transaction and error handling.**

The upgrade script uses proper transaction management with clear error handling:
1. Only begins a new transaction if one isn't already active
2. Attempts to rollback on failure
3. Provides detailed error logging
4. Rethrows exceptions with additional context

This follows best practices for database operations in upgrade scripts.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Infrastructure/API/FindProviders/FindProvidersController.php (2)</summary>

`34-38`: **Security enhancement: Proper access control with IsGranted attribute.**

Good implementation of access control using the `IsGranted` attribute with the `dashboard_access_editor` permission. This aligns with the PR objective to ensure that dashboard ACLs are applied for the providers listing endpoint.

---

`47-59`: **Refactored controller to use StandardPresenter and improve response handling.**

The controller has been correctly updated to:
1. Use the standardized presenter
2. Properly handle the response from the use case
3. Check for ResponseStatusInterface instances and handle them appropriately
4. Return a properly formatted JSON response

This makes the code more maintainable and aligns with the overall refactoring of the providers API.

</details>
<details>
<summary>centreon-open-tickets/src/CentreonOpenTickets/Providers/Application/UseCase/FindProviders.php (6)</summary>

`27-27`: **Import changes align with the updated error handling approach.**

The addition of `RepositoryException` and `ResponseStatusInterface` imports is consistent with the changes in the method signature and error handling logic.



Also applies to: 33-33

---

`43-46`: **Simplification of dependencies is a good refactoring.**

Removing the `ContactInterface` dependency from the constructor streamlines the class and reduces coupling. This aligns with the PR objective of changing rights handling for providers listing.

---

`49-52`: **Method signature change supports new response handling pattern.**

The return type is now explicitly declared as a union type, which matches how the controller handles the response in the `FindProvidersController`.

---

`54-58`: **Simplified error handling is more maintainable.**

The code now directly attempts to retrieve providers and handles exceptions in a cleaner way. This is an improvement over the previous implementation.

---

`58-70`: **Error logging has been improved with better structured data.**

The error logging now includes both the exception message and trace in a structured format, which will make debugging easier.

---

`54-70`: <details>
<summary>❓ Verification inconclusive</summary>

**Verify that permission checks are handled at a different level.**

The permission check for `ROLE_CONFIGURATION_OPEN_TICKETS` has been removed from this method. Based on the PR objective "Adjusting the access rights for the endpoint that lists providers, ensuring that dashboard ACLs are applied instead", I assume this is intentional and permissions are now handled elsewhere.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if permissions are handled elsewhere in the application for this endpoint

# Look for dashboard ACL checks related to providers
echo "Searching for dashboard ACL implementations related to providers..."
rg -A 5 -B 5 "dashboard ACL|isAdmin|hasAccess|ROLE_CONFIGURATION_OPEN_TICKETS" --type php centreon-open-tickets/
```

Length of output: 259

---



</details>

**Action Required: Manually Verify Centralized ACL Enforcement for Providers Endpoint**

The removal of the explicit permission check for `ROLE_CONFIGURATION_OPEN_TICKETS` appears intentional in line with the PR objective. However, our automated search for related dashboard ACL or permission checks did not return any evidence of centralized enforcement in the codebase. This result is inconclusive, so please manually verify that permission checks are indeed handled elsewhere (for example, via a centralized middleware or ACL enforcement mechanism) before proceeding.

- Confirm that the dashboard ACLs or equivalent permission logic is applied to the endpoint at a global level.
- Check any central security components or middleware responsible for access control within the repository.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-20T09:39:08Z
user: login: adr-mo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T13:30:46Z
user: login: adr-mo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T13:38:06Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php (1)</summary><blockquote>

`32-33`: **Ensure consistent SQL column naming style.**

The column `topology_name` in the UPDATE query doesn't have backticks, unlike other column names in the query. While this will work, it's inconsistent with the surrounding style.


```diff
-            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topology_name = 'Create Ticket'
+            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, `topology_name` = 'Create Ticket'
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between fd08578fc5cfc9da8ef5a80435ea07da89c075bf and 0637f8cefc2ac00e44631b227214b077f04673ca.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php` (1 hunks)

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (6)</summary>

* GitHub Check: package jammy
* GitHub Check: package bookworm
* GitHub Check: package el9
* GitHub Check: package el8
* GitHub Check: veracode-analysis / Run a pipeline scan
* GitHub Check: check-status

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php (2)</summary>

`27-46`: **LGTM - Well-structured upgrade function with proper error handling.**

The database update function properly sets specific error messages for each operation, making troubleshooting easier if something fails.

---

`48-78`: **LGTM - Excellent transaction management and exception handling.**

The transaction management is implemented correctly with:
1. Checks to avoid nested transactions
2. Proper commit/rollback handling
3. Comprehensive error logging with context
4. Exception re-throwing with enhanced information

This approach ensures data integrity during the upgrade process.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T13:40:53Z
user: login: nfragnet
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T13:53:04Z
user: login: Drago37
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T19:40:14Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts (1)</summary><blockquote>

`132-141`: **Well implemented ACL application command.**

The new `applyAcl` command properly handles different web server user contexts (apache/www-data) based on the OS environment and executes the necessary PHP script to apply ACL changes.


Consider adding error handling in case the command execution fails:

```diff
 Cypress.Commands.add('applyAcl', () => {
   const apacheUser = Cypress.env('WEB_IMAGE_OS').includes('alma')
     ? 'apache'
     : 'www-data';

   cy.execInContainer({
     command: `su -s /bin/sh ${apacheUser} -c "/usr/bin/env php -q /usr/share/centreon/cron/centAcl.php"`,
     name: 'web'
+  }).then((result) => {
+    // Log or assert on the command execution result
+    if (result.stdout) {
+      cy.log(`ACL application output: ${result.stdout}`);
+    }
+    if (result.stderr) {
+      cy.log(`ACL application error: ${result.stderr}`);
+    }
+    expect(result.code).to.equal(0);
   });
 });
```

</blockquote></details>
<details>
<summary>centreon-open-tickets/tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json (1)</summary><blockquote>

`1-77`: **Well-structured ACL configuration for testing.**

The JSON configuration correctly sets up the necessary permissions for a dashboard administrator user, including access to various menu items and resources needed for the tests.


Consider these improvements for better maintainability:

1. Make indentation consistent throughout the file (currently varies between lines)
2. Use more descriptive names for ACL resources (e.g., "dashboard-admin-menu" instead of "name-administrator-ACLMENU")
3. Add comments to explain the purpose of different permission sections

```diff
 [
     {
         "action": "ADD",
         "object": "CONTACT",
         "values": "user-dashboard-administrator;user-dashboard-administrator;user-dashboard-administrator@centreon.test;Centreon@2023;0;1;en_US;local"
     },
     {
-        "action":"SETPARAM",
+        "action": "SETPARAM",
         "object":"CONTACT",
         "values":"user-dashboard-administrator;reach_api;1"
     },
     {
         "action": "ADD",
         "object": "ACLMENU",
-        "values": "name-administrator-ACLMENU;alias-administrator-ACLMENU"
+        "values": "dashboard-admin-menu;Dashboard Administrator Menu" 
     },
     /* Continue with other similar changes */
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 0637f8cefc2ac00e44631b227214b077f04673ca and 369c99046f8cb8b411db28c7c2e0b6f61491c283.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts` (3 hunks)
* `centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts` (3 hunks)
* `centreon-open-tickets/tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json` (1 hunks)
* `centreon-open-tickets/tests/e2e/fixtures/users/user-dashboard-administrator.json` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* centreon-open-tickets/tests/e2e/fixtures/users/user-dashboard-administrator.json

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (4)</summary>

* GitHub Check: backend-lint
* GitHub Check: backend-unit-test
* GitHub Check: veracode-analysis / Run a pipeline scan
* GitHub Check: check-status

</details>

<details>
<summary>🔇 Additional comments (5)</summary><blockquote>

<details>
<summary>centreon-open-tickets/tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts (3)</summary>

`65-67`: **LGTM: Added CLAPI commands to configure dashboard notification permissions.**

This addition helps set up the correct permissions environment for the test suite, which aligns with the PR objectives to change rights on providers listing and update ACLs.

---

`152-152`: **Good addition of the ACL application step.**

This ensures that the ACL permissions configured earlier are applied before running the tests. It's a necessary step when modifying permissions as part of the test setup.

---

`186-186`: **User role properly updated to match new permissions model.**

Changing from admin to dashboard administrator user aligns with the PR's objectives to update the ACL model. This ensures tests run with the appropriate permission level rather than admin privileges.

</details>
<details>
<summary>centreon-open-tickets/tests/e2e/features/Dashboards/commands.ts (2)</summary>

`72-72`: **Improved reliability with increased timeout values.**

Increasing the timeout from 50000ms to 70000ms and interval from 2000ms to 3000ms provides more leeway for elements to appear in the UI during test execution, which can help reduce flaky tests.

---

`165-165`: **TypeScript interface properly updated.**

The addition of the `applyAcl` method to the Cypress.Chainable interface ensures proper TypeScript type checking when using this command.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T14:24:44Z
user: login: s-elhassani
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T14:52:41Z
user: login: nfragnet
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T15:02:01Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php (2)</summary><blockquote>

`27-35`: **Consider adding more descriptive comments about the functional changes.**

While the code is clear, adding comments explaining why these specific values (`topology_order` = 20, `topology_group` = 8) were chosen would improve maintainability and help future developers understand the reasoning behind these changes.

---

`15-19`: **Consider validating $pearDB availability.**

The script assumes that `$pearDB` is defined and available in the scope. Consider adding a validation check at the beginning of the script to ensure it's properly initialized.

```diff
require __DIR__ . '/../../../php/generate_routes.php';

//error specific content
$errorMessage = '';
$versionOfTheUpgrade = 'UPGRADE - 25.01.1: ';

+// Ensure database connection is available
+if (!isset($pearDB) || !($pearDB instanceof CentreonDB)) {
+    throw new \Exception($versionOfTheUpgrade . 'Database connection not available');
+}
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 369c99046f8cb8b411db28c7c2e0b6f61491c283 and 380e245082d66043c86b491f4181996ea8bdd43b.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php` (1 hunks)

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: backend-lint
* GitHub Check: backend-unit-test
* GitHub Check: check-status

</details>

<details>
<summary>🔇 Additional comments (3)</summary><blockquote>

<details>
<summary>centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php (3)</summary>

`21-46`: **Good implementation of database update function.**

The closure function is well-structured with appropriate error messages and SQL queries that align with the PR objectives of modifying ACL menu selection from radio buttons to checkboxes. The use of heredoc syntax for SQL queries enhances readability.

---

`48-78`: **Good transaction and error handling implementation.**

The transaction management and comprehensive error handling with appropriate logging are well-implemented. The code properly checks transaction status before operations and includes detailed error reporting with context.

---

`37-45`: <details>
<summary>❓ Verification inconclusive</summary>

**Verify ACL configuration change impact.**

This query changes access rights from 2 (radio) to 0 (checkbox) for the Create Ticket menu. Make sure this change doesn't inadvertently affect existing user permissions.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check for any dependent configurations that might be affected by this change
echo "Searching for any code that might depend on access_right = 2 specifically for topology_page = 60421..."
rg -A 3 -B 3 "access_right.*[^0-9]2[^0-9]" --type php
```

Length of output: 3221

---



</details>

**Action Required: Verify ACL Update Impact Across All Modules**

The upgrade query in `centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.01.1/php/upgrade.php` now sets `access_right` from 2 to 0 for records where `topology_page = 60421` (related to the Create Ticket menu). During verification, similar references to `access_right = 2` were found in other parts of the codebase:

- **In Update Scripts:**  
  - `centreon/www/install/php/Update-22.10.0-beta.1.php` updates rows by setting `access_right` to 1 when encountering 2.  
  - `centreon/www/install/php/Update-18.10.0.post.php` references the value 2 in ACL configurations.

- **In ACL Insertions:**  
  - `centreon/www/class/centreon-clapi/centreonACLMenu.class.php` inserts ACL entries with `access_right` set to 2.

Please verify that the intentional change to 0 for the Create Ticket menu does not unintentionally affect user permissions elsewhere—especially given the consistency required with updates that alter the same field to 1 or maintain it at 2. Double-check that the filtering by `topology_page = 60421` properly confines the change and aligns with the overall ACL configuration strategy.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T10:00:24Z
user: login: Drago37
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T10:02:15Z
user: login: nfragnet
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T10:04:04Z
user: login: s-elhassani
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T10:09:10Z

Review comments:
diff_hunk: @@ -6,8 +6,8 @@ INSERT INTO `topology` (`topology_id`, `topology_name`, `topology_parent`, `topo
 (NULL, 'Open Tickets', '604', NULL, NULL, '8', NULL, NULL, '0', '1', '1'),
 (NULL, 'Rules', '604', '60420', '10', '8', './modules/centreon-open-tickets/views/rules/index.php', NULL, NULL, '1', '1');
 
-INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_url`, `topology_show`, `readonly`)
-VALUES ('Submit Ticket', 604, 60421, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', '0', '0');
+INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_order`, `topology_group`,  `topology_url`, `topology_show`, `readonly`)
+VALUES ('Submit Ticket', 604, 60421, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', 20, 8, '0', '1');
path: centreon-open-tickets/www/modules/centreon-open-tickets/sql/install.sql
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Critical: Column and value order mismatch in INSERT statement.**

The order of columns doesn't match the order of values in the INSERT statement, which will lead to incorrect data insertion.

The values are misaligned with the column definitions. For example, the URL is being inserted into the `topology_order` column. Fix the alignment as follows:

```diff
-INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_order`, `topology_group`,  `topology_url`, `topology_show`, `readonly`)
-VALUES ('Submit Ticket', 604, 60421, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', 20, 8, '0', '1');
+INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_order`, `topology_group`, `topology_url`, `topology_show`, `readonly`)
+VALUES ('Submit Ticket', 604, 60421, 20, 8, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', '0', '1');
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
INSERT INTO `topology` (`topology_name`, `topology_parent`, `topology_page`, `topology_order`, `topology_group`, `topology_url`, `topology_show`, `readonly`)
VALUES ('Submit Ticket', 604, 60421, 20, 8, './modules/centreon-open-tickets/views/rules/submitTicket/action.php', '0', '1');
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 052ef2b
created_at: 2025-03-18T18:22:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,78 @@
+<?php
+/*
+ * Centreon
+ *
+ * Source Copyright 2005-2025 Centreon
+ *
+ * Unauthorized reproduction, copy and distribution
+ * are not allowed.
+ *
+ * For more information : contact@centreon.com
+ *
+ */
+// Regenerate routes. Should be present in the
+// upgrade scripts of all versions.
+require __DIR__ . '/../../../php/generate_routes.php';
+
+//error specific content
+$errorMessage = '';
+$versionOfTheUpgrade = 'UPGRADE - 25.05.0: ';
+
+/**
+ * @param CentreonDB $pearDB
+ *
+ * @throws CentreonDbException
+ * @return void
+ */
+$reOrderAndChangeType = function (CentreonDB $pearDB) use (&$errorMessage): void {
+    $errorMessage = 'Unable to update table topology to re order and change type of Submit Ticket menu access';
+    $pearDB->executeQuery(
+        <<<'SQL'
+            UPDATE `topology`
+            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topoloy_name = 'Create Ticket'
path: centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix typo in column name.**

There's a typo in the SQL query: `topoloy_name` should be `topology_name`.


```diff
-            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topoloy_name = 'Create Ticket'
+            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topology_name = 'Create Ticket'
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
            SET `readonly` = '1', `topology_order` = 20, `topology_group` = 8, topology_name = 'Create Ticket'
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit e2a5497
created_at: 2025-03-20T09:39:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,6 +7,7 @@ DROP TABLE `@DB_CENTSTORAGE@`.`mod_open_tickets_data`;
 DROP TABLE `@DB_CENTSTORAGE@`.`mod_open_tickets`;
 
 DELETE FROM topology WHERE topology_page = '60420' AND topology_name = 'Rules';
+DELETE FROM topology WHERE topology_page = '60421' AND topology_name = 'Submit Ticket';
path: centreon-open-tickets/www/modules/centreon-open-tickets/sql/uninstall.sql
user: login: adr-mo
body: ```suggestion
DELETE FROM topology WHERE topology_page = '60421' AND topology_name = 'Create Ticket';
```
created_at: 2025-03-24T13:30:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,78 @@
+<?php
+/*
+ * Centreon
+ *
+ * Source Copyright 2005-2025 Centreon
+ *
+ * Unauthorized reproduction, copy and distribution
+ * are not allowed.
+ *
+ * For more information : contact@centreon.com
+ *
+ */
+// Regenerate routes. Should be present in the
+// upgrade scripts of all versions.
+require __DIR__ . '/../../../php/generate_routes.php';
+
+//error specific content
+$errorMessage = '';
+$versionOfTheUpgrade = 'UPGRADE - 25.05.0: ';
+
+/**
+ * @param CentreonDB $pearDB
+ *
+ * @throws CentreonDbException
+ * @return void
+ */
+$reOrderAndChangeType = function (CentreonDB $pearDB) use (&$errorMessage): void {
+    $errorMessage = 'Unable to update table topology to re order and change type of Submit Ticket menu access';
path: centreon-open-tickets/www/modules/centreon-open-tickets/upgrade/25.05.0/php/upgrade.php
user: login: adr-mo
body: ```suggestion
    $errorMessage = 'Unable to update table topology to re order and change type of Create Ticket menu access';
```
created_at: 2025-03-24T13:38:06Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-18T18:22:55Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough
This pull request refines exception handling in the repository interface and use case for finding providers, streamlines the use case by removing obsolete dependencies and permission checks, and updates response management. Additionally, it updates the SQL scripts for ticket creation, refines end-to-end test configurations, and introduces an upgrade script. Overall, the changes enhance error specificity in repository operations while simplifying the control flow and test setups.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `.../Repository/ReadProviderRepositoryInterface.php` | Changed exception thrown in `findAll` from `\Throwable` to `RepositoryException` and added appropriate import. |
| `.../UseCase/FindProviders.php` | Removed `ContactInterface` dependency and permission checks; updated method signature to return a union type; consolidated exception handling to catch `RepositoryException`. |
| `.../UseCase/FindProvidersPresenterInterface.php` <br> `.../Infrastructure/API/FindProviders/FindProvidersPresenter.php` | Deleted unused presenter interface and class. |
| `.../UseCase/FindProvidersResponse.php` | Updated class to implement `ListingResponseInterface` and added the `getData()` method. |
| `.../Infrastructure/API/FindProviders/FindProvidersController.php` | Replaced presenter type with `StandardPresenter`, removed access denial check, and modified response handling logic. |
| `.../Infrastructure/Repository/DbReadProviderRepository.php` | Added try-catch in `findAll` to catch `\Throwable` and rethrow as `RepositoryException`. |
| `.../tests/php/FindProvidersTest.php` | Removed mocks and tests for permission checks and updated exception tests to expect `RepositoryException`. |
| `.../www/modules/centreon-open-tickets/sql/install.sql` | Modified INSERT statement for topology: changed label to 'Create Ticket', added new columns, and updated field values. |
| `.../www/modules/centreon-open-tickets/sql/uninstall.sql` | Added DELETE statement for entries with `topology_page = '60421'` and `topology_name = 'Create Ticket'`. |
| `.../tests/e2e/features/Dashboards/01-open-ticket-configuration/index.ts` | Updated test setup: introduced `cy.executeCommandsViaClapi`, added `cy.applyAcl`, changed login role, and removed `cy.exportConfig()`. |
| `.../tests/e2e/features/Dashboards/commands.ts` | Increased timeout and interval for `waitForElementToBeVisible` and added a new `applyAcl` command; updated Cypress Chainable interface. |
| `.../tests/e2e/fixtures/resources/clapi/config-ACL/dashboard-notification-permissions.json` | Added new JSON fixture for dashboard notification ACL configurations. |
| `.../tests/e2e/fixtures/users/user-dashboard-administrator.json` | Added JSON fixture for dashboard administrator user credentials. |
| `.../upgrade/25.01.1/php/upgrade.php` | Introduced a new upgrade script that performs database updates with transaction management and robust error handling. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant C as Controller
    participant U as UseCase
    participant R as Repository
    participant P as Presenter

    C->>U: __invoke()
    U->>R: findAll(requestParameters)
    alt Exception occurs in Repository
        R-->>U: Throw RepositoryException
        U-->>C: Return error response (ResponseStatusInterface)
    else Successful retrieval
        R-->>U: Return providers array
        U-->>C: Return FindProvidersResponse
    end
    C->>P: Present response
    alt ResponseStatusInterface instance
        P-->>C: createResponse()
    else
        P-->>C: generate JsonResponse
    end
```

## Possibly related PRs
- **centreon/centreon#5048**: Focuses on refining exception handling in repository methods, similar to the changes in the `findAll` method.
- **centreon/centreon#4786**: Updates exception management in the repository, including throwing `RepositoryException` in the `findAll` method.
- **centreon/centreon#4560**: Directly affects the `ReadProviderRepositoryInterface` by modifying the exception declaration in the `findAll` method.

## Suggested labels
`area/ui`, `area/test`

## Suggested reviewers
- selfakiri
- dmyios
- jeremyjaouen
- a-launois

</details>

<!-- walkthrough_end -->

<!-- This is an auto-generated comment: resource warnings by coderabbit.ai -->

> [!WARNING]
> ## Review ran into problems
> 
> <details>
> <summary>🔥 Problems</summary>
> 
> Errors were encountered while retrieving linked issues.
> 
> <details>
> <summary>Errors (1)</summary>
> 
> * JIRA integration encountered authorization issues. Please disconnect and reconnect the integration in the CodeRabbit UI.
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: resource warnings by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=centreon/centreon&utm_content=6974):

> ‼️ **IMPORTANT**
> Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-25T14:26:10Z
body: <br>![](https://www.veracode.com/themes/veracode_new/library/img/veracode-black-hires.svg)<br>Scan Summary:<br>PIPELINE_SCAN_VERSION: 25.2.0-0<br>DEV-STAGE: DEVELOPMENT<br>SCAN_ID: fc91cc44-7a96-4566-844f-8622eaf7be3a<br>SCAN_STATUS: SUCCESS<br>SCAN_MESSAGE: Scan successful. Results size: 25347 bytes<br>====================<br>Analysis Successful.<br>====================<br><br>==========================<br>Found 2 Scannable modules.<br>==========================<br>JS files within centreon-open-tickets-15136a7b4834339161e750bf55b071a972c8c24d-14062048903-veracode-binary.zip<br>PHP files within centreon-open-tickets-15136a7b4834339161e750bf55b071a972c8c24d-14062048903-veracode-binary.zip<br><br>===================<br>Analyzed 2 modules.<br>===================<br>JS files within centreon-open-tickets-15136a7b4834339161e750bf55b071a972c8c24d-14062048903-veracode-binary.zip<br>PHP files within centreon-open-tickets-15136a7b4834339161e750bf55b071a972c8c24d-14062048903-veracode-binary.zip<br><br>===================<br>Analyzed 13 issues.<br>===================<br>*****************************************************************<br>Total flaws found: 13, New flaws found: 0 as compared to baseline<br>*****************************************************************<br><br>==================================<br>SUCCESS: No issues passed filters.<br>==================================<br><br>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T10:02:58Z
body: <br>![](https://www.veracode.com/themes/veracode_new/library/img/veracode-black-hires.svg)<br>Scan Summary:<br>PIPELINE_SCAN_VERSION: 25.2.0-0<br>DEV-STAGE: DEVELOPMENT<br>SCAN_ID: 6e7ee02d-2684-43e6-84a1-eb26a6ec9dd7<br>SCAN_STATUS: SUCCESS<br>SCAN_MESSAGE: Scan successful. Results size: 25347 bytes<br>====================<br>Analysis Successful.<br>====================<br><br>==========================<br>Found 2 Scannable modules.<br>==========================<br>JS files within centreon-open-tickets-41e82e2247e938a02d78932f61c7fd0847e2c562-14080410606-veracode-binary.zip<br>PHP files within centreon-open-tickets-41e82e2247e938a02d78932f61c7fd0847e2c562-14080410606-veracode-binary.zip<br><br>===================<br>Analyzed 2 modules.<br>===================<br>JS files within centreon-open-tickets-41e82e2247e938a02d78932f61c7fd0847e2c562-14080410606-veracode-binary.zip<br>PHP files within centreon-open-tickets-41e82e2247e938a02d78932f61c7fd0847e2c562-14080410606-veracode-binary.zip<br><br>===================<br>Analyzed 13 issues.<br>===================<br>*****************************************************************<br>Total flaws found: 13, New flaws found: 0 as compared to baseline<br>*****************************************************************<br><br>==================================<br>SUCCESS: No issues passed filters.<br>==================================<br><br>
author_association: NONE