diff --git a/class/actes/ActesStatusSQL.php b/class/actes/ActesStatusSQL.php
index 4f504a36a7f7174e09638b89a6abfc0c3330191d..81edaf4bc4bc21f09995956795722d48e3dc244d 100644
--- a/class/actes/ActesStatusSQL.php
+++ b/class/actes/ActesStatusSQL.php
@@ -32,7 +32,7 @@ class ActesStatusSQL
 
     public const STATUS_ERREUR_LORS_DE_L_ARCHIVAGE = 14;
     public const STATUS_EN_ATTENTE_D_ETRE_SIGNEE = 18;
-
+    public const STATUS_EN_ATTENTE_D_ETRE_POSTE = 17;
     public const STATUS_DETRUITE = 16;
 
     public function __construct(private readonly SQLQuery $sqlQuery)
diff --git a/class/actes/ActesTransactionsSQL.php b/class/actes/ActesTransactionsSQL.php
index 1a754d28a41228ebe468b4c87fcbe797b6cd06b5..5be47959114f6d187cc17b3d2a9d7b4c3c8a70e0 100644
--- a/class/actes/ActesTransactionsSQL.php
+++ b/class/actes/ActesTransactionsSQL.php
@@ -415,6 +415,9 @@ WHERE
     ): array | false {
         $offset = intval($offset);
         $limit = intval($limit);
+        $authority_id = intval($authority_id);
+        $status_id = intval($status_id);
+
         $sql = "SELECT actes_transactions.id,subject,number,date(decision_date),nature_descr,classification,type FROM actes_transactions ";
         if ($min_submission_date !== null || $max_submission_date !== null) {
             $sql .= "JOIN actes_transactions_workflow ON transaction_id=actes_transactions.id";
@@ -564,9 +567,11 @@ WHERE
         string $min_date,
         string $max_date
     ): array {
+        $result = [];
         $sql = "SELECT authorities.id,authorities.name FROM authorities " .
             " WHERE authority_group_id=? ORDER BY authorities.name";
         $authorities_list = $this->query($sql, $authority_group_id);
+
         foreach ($authorities_list as $authority_info) {
             $result[$authority_info['id']] = [
                 'authority_id' => $authority_info['id'],
@@ -575,14 +580,16 @@ WHERE
             ];
         }
 
-        $sql = "SELECT authorities.id,authorities.name, COUNT(actes_transactions) As nb_transactions FROM authorities " .
-            " INNER JOIN actes_transactions ON actes_transactions.authority_id = authorities.id " .
-            " WHERE  authorities.authority_group_id =  ? " .
-            " AND actes_transactions.decision_date >= ? " .
-            " AND actes_transactions.decision_date <= ? " .
-            " GROUP BY authorities.id,authorities.name " .
-            " ORDER BY authorities.name";
+        $sql = "SELECT authorities.id, authorities.name, COUNT(actes_transactions) AS nb_transactions 
+        FROM authorities 
+        INNER JOIN actes_transactions ON actes_transactions.authority_id = authorities.id 
+        WHERE authorities.authority_group_id = ? 
+        AND actes_transactions.decision_date >= ?
+        AND actes_transactions.decision_date <= ?
+        GROUP BY authorities.id, authorities.name 
+        ORDER BY authorities.name";
         $count = $this->query($sql, $authority_group_id, $min_date, $max_date);
+
         foreach ($count as $count_info) {
             $result[$count_info['id']]['nb_transactions'] = $count_info['nb_transactions'];
         }
diff --git a/class/actes/TransactionSQL.php b/class/actes/TransactionSQL.php
index 56725faade7dc04221c62e5c4f63a896d2549dcb..74cc9331115c89ae9f70c359d61342f8e52bf76f 100644
--- a/class/actes/TransactionSQL.php
+++ b/class/actes/TransactionSQL.php
@@ -172,7 +172,6 @@ class TransactionSQL
         }
         $this->filter[] = "actes_transactions.subject ILIKE ?";
         $this->value[] = "%$objet%";
-        //$this->value[] = "$objet"; FIX #378
     }
 
     public function setDateMinSubmission($date)
@@ -308,7 +307,6 @@ class TransactionSQL
 
     public function getDonneesTransaction($id)
     {
-        //$sql = "SELECT decision_date, document_papier, unique_id, classification, classification_string,broadcasted,broadcast_emails FROM actes_transactions WHERE id = ?";
         $sql = "SELECT " .
             " users.name, users.givenname," .
             " authorities.name as authority_name, " .
diff --git a/composer.json b/composer.json
index 297daac13db8b70876b872353d6771021a44b237..0070bc9fd277029233a4e753c3f311250a2f4753 100644
--- a/composer.json
+++ b/composer.json
@@ -81,7 +81,8 @@
     "psr-4": {
       "S2low\\": "src/",
       "Legacy\\": "public.ssl/modules/mail/lib",
-      "IntegrationTests\\": "integration_tests"
+      "IntegrationTests\\": "integration_tests",
+      "S2lowLegacy\\Lib\\": "lib/"
     },
     "classmap": [
       "lib",
diff --git a/config/services.yaml b/config/services.yaml
index 1cad16defb43991e53d3bb46dd93d86c87ad3ae3..9e487f3a912c7a2aad4737edb1539a09ef758ed5 100644
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -547,4 +547,4 @@ services:
 
   App\Http\Controllers\Admin\Admin_authorities:
     public: true
-    tags: [ 'controller.service_arguments' ]
\ No newline at end of file
+    tags: [ 'controller.service_arguments' ]
diff --git a/controller/ActesAPIController.php b/controller/ActesAPIController.php
index 7a786283c711a59807fa2d3e4e56e712cce2179a..f4e6279fb5dba160c50bfa69fa15cdf1fd46a939 100644
--- a/controller/ActesAPIController.php
+++ b/controller/ActesAPIController.php
@@ -4,6 +4,7 @@ namespace S2lowLegacy\Controller;
 
 use S2lowLegacy\Class\actes\ActesStatusSQL;
 use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Class\Helpers;
 use S2lowLegacy\Model\AuthoritySQL;
 
 class ActesAPIController extends Controller
diff --git a/controller/Controller.php b/controller/Controller.php
index d54bc3b42a54d993c6aae606355b2d655dc71d5f..d6cfdccf65fcfe627f0236e059cd95584cc812c1 100644
--- a/controller/Controller.php
+++ b/controller/Controller.php
@@ -101,7 +101,7 @@ class Controller
         if ($url_arg) {
             $url .= "?$url_arg";
         }
-        if (! TESTING_ENVIRONNEMENT) {
+        if (!TESTING_ENVIRONNEMENT) {
             header("Location: $url");
             exit();
         }
@@ -116,7 +116,7 @@ class Controller
         if ($error_message) {
             $this->setErrorMessage($error_message);
         }
-        if (! TESTING_ENVIRONNEMENT) {
+        if (!TESTING_ENVIRONNEMENT) {
             header("Location: $url");
             exit();
         }
@@ -135,6 +135,7 @@ class Controller
         }
         $this->redirectSSL($url_redirect);
     }
+
     //@codeCoverageIgnore
 
     public function displayAndExit($message, $url_redirect)
@@ -146,6 +147,7 @@ class Controller
         $this->setErrorMessage($message);
         $this->redirectSSL($url_redirect);
     }
+
     //@codeCoverageIgnore
 
 
@@ -159,12 +161,13 @@ class Controller
     {
         $this->verifUser();
 
-        if (! $this->me->isAdmin()) {
+        if (!$this->me->isAdmin()) {
             $this->displayErrorAndExit("Accès refusé", "");
         } // @codeCoverageIgnore
         if ($this->me->isSuper()) {
             return;
         }
+
         if ($authority_id) {
             $authoritySQL = new AuthoritySQL($this->getSQLQuery());
             $info = $authoritySQL->getInfo($authority_id);
@@ -177,7 +180,7 @@ class Controller
             } // @codeCoverageIgnore
 
             if ($info['id'] == $this->me->get('authority_id')) {
-                return ;
+                return;
             }
             $this->displayErrorAndExit("Accès refusé", "");
         } // @codeCoverageIgnore
@@ -209,7 +212,7 @@ class Controller
     public function verifSuperAdmin()
     {
         $this->verifAdmin();
-        if (! $this->me->isSuper()) {
+        if (!$this->me->isSuper()) {
             $this->redirect(WEBSITE_SSL, 'Accès refusé');
         } // @codeCoverageIgnore
     }
@@ -256,7 +259,10 @@ class Controller
     public function _actionBefore($controller, $action)
     {
         $this->setViewParameter('title', "S2low");
-        $this->setViewParameter('template_milieu', __DIR__ . "/../template/" . ucfirst($controller) . ucfirst($action) . ".php");
+        $this->setViewParameter(
+            'template_milieu',
+            __DIR__ . "/../template/" . ucfirst($controller) . ucfirst($action) . ".php"
+        );
         $this->setViewParameter('side_bar', false);
     }
 
@@ -276,7 +282,6 @@ class Controller
     }
 
 
-
     public function getFiles()
     {
         return $this->files;
diff --git a/integration_tests/EndpointActeAPI/CancelTransactionTest.php b/integration_tests/EndpointActeAPI/CancelTransactionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..92d9e71a491e3e90937557ec0d0af41f7811e6f2
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/CancelTransactionTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class CancelTransactionTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function dataprovider(): array
+    {
+        return [
+            [true, 'OK'],
+            [false, 'KO'],
+        ];
+    }
+
+    /**
+     * @dataProvider dataProvider
+     */
+    public function testShouldReturnOk($isRealTransactionId, $stringInResponse): void
+    {
+        if ($isRealTransactionId) {
+            $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+        } else {
+            $transactionId = 23664;
+        }
+
+        $api = 1;
+
+        $_POST['api'] = $api;
+        $_POST['id'] = $transactionId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('POST', '/modules/actes/actes_transac_cancel.php', [
+            'api' => $api,
+            'id' => $transactionId,
+        ]);
+
+        $response = $client->getResponse();
+        static::assertStringContainsString($stringInResponse, $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/ChangeActeSaeStatus.php b/integration_tests/EndpointActeAPI/ChangeActeSaeStatus.php
new file mode 100644
index 0000000000000000000000000000000000000000..beba4c97b02b0e44a777a107fb5021b2c6ad0650
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/ChangeActeSaeStatus.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class ChangeActeSaeStatus extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function changeStatusProvider(): array
+    {
+        return [
+            [
+                UserRole::Archiviste,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                ActesStatusSQL::STATUS_ENVOYE_AU_SAE,
+                'status',
+                'ok',
+                200
+            ],
+            [
+                UserRole::Archiviste,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                ActesStatusSQL::STATUS_ERREUR_LORS_DE_L_ARCHIVAGE,
+                'status',
+                'ok',
+                200
+            ],
+            [
+                UserRole::Archiviste,
+                ActesStatusSQL::STATUS_VALIDE,
+                ActesStatusSQL::STATUS_ENVOYE_AU_SAE,
+                'status',
+                'ok',
+                200
+            ],
+            [
+                UserRole::Archiviste,
+                ActesStatusSQL::STATUS_ENVOYE_AU_SAE,
+                ActesStatusSQL::STATUS_ENVOYE_AU_SAE,
+                'error',
+                'Transition entre deux status identiques (12) impossible',
+                400
+            ],
+            [
+                UserRole::Utilisateur,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                ActesStatusSQL::STATUS_ENVOYE_AU_SAE,
+                'error',
+                'L\'utilisateur n\'est pas archiviste',
+                400
+            ],
+            [
+                UserRole::Archiviste,
+                ActesStatusSQL::STATUS_VALIDE,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                'error',
+                'Transition vers le statut 4 impossible',
+                400
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider changeStatusProvider
+     */
+    public function testActeStatusTransition(
+        UserRole $userRole,
+        int $acteStatusDepart,
+        int $acteStatusDestination,
+        string $arrayKeyAnswer,
+        string $arrayValueAnswer,
+        int $codeResponse
+    ): void {
+        $transactionId = $this->createTransaction($acteStatusDepart);
+
+        $statusId = $acteStatusDestination;
+
+        $_POST['transaction_id'] = $transactionId;
+        $_POST['status_id'] = $statusId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs($userRole);
+        $client->request('POST', '/modules/actes/api/actes_sae_status.php', [
+            'transaction_id' => $transactionId,
+            'status_id' => $statusId,
+        ]);
+
+        $response = $client->getResponse();
+
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertJson($content[0]);
+        $contentAsArray = json_decode($content[0], true);
+        static::assertArrayHasKey($arrayKeyAnswer, $contentAsArray);
+        static::assertSame($arrayValueAnswer, $contentAsArray[$arrayKeyAnswer]);
+        static::assertResponseStatusCodeSame($codeResponse);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/CloseTransactionTest.php b/integration_tests/EndpointActeAPI/CloseTransactionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ded0e0b9197483712ca90c075a41b542255e824
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/CloseTransactionTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class CloseTransactionTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function changeStatusProvider(): array
+    {
+        return [
+            [
+                'valid',
+                'OK'
+            ],
+            [
+                'invalid',
+                'OK'
+            ],
+            [
+                'fgdg',
+                'KO'
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider changeStatusProvider
+     */
+    public function testShouldReturnOk($status, $responseMsg): void
+    {
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+
+        $api = 1;
+        $_POST['api'] = $api;
+        $_POST['id'] = $transactionId;
+        $_POST['status'] = $status;
+
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('POST', '/modules/actes/actes_transac_close.php', [
+            'api' => $api,
+            'id' => $transactionId,
+            'status' => $status,
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertSame($responseMsg, $content[0]);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/DownloadFileTest.php b/integration_tests/EndpointActeAPI/DownloadFileTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2d0d77a6a93e4cb10864504b3f84d31a4d69424
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/DownloadFileTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancier;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class DownloadFileTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+        $this->client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function getObjectInstancier(): ObjectInstancier
+    {
+        return ObjectInstancierFactory::getObjetInstancier();
+    }
+
+    public function testShouldReturnFile(): void
+    {
+        $files = $this->getFiles();
+
+        $_GET['file'] = $files[0]['id'];
+        $_GET['tampon'] = false;
+        $_GET['date_affichage'] = date('Y-m-d');
+
+        $this->client->request(
+            'GET',
+            '/modules/actes/actes_download_file.php',
+            [
+                'file' => $_GET['file'],
+                'tampon' => $_GET['tampon'],
+                'date_affichage' => $_GET['date_affichage'],
+            ],
+        );
+
+        $response = $this->client->getResponse();
+        $content = $response->getContent();
+
+        static::assertStringContainsString("Content-type: application/pdf", $content);
+        static::assertStringContainsString("filename=\"PDFTest.pdf\"", $content);
+    }
+
+    private function getFiles()
+    {
+        $archivePath = __DIR__ . '/../fixtures/abc-TACT--443061841--20250313-1.tar.gz';
+
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU, $archivePath);
+
+        $this->createActeIncludedFiles($transactionId);
+
+        $_GET['transaction'] = $transactionId;
+
+        $this->client->request(
+            'GET',
+            '/modules/actes/actes_transac_get_files_list.php',
+            [
+                'transaction' => $transactionId,
+
+            ],
+        );
+
+        $response = $this->client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertNotSame('KO', $content[0]);
+        static::assertJson($content[0]);
+
+        return json_decode($response->getContent(), true);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetActesOfSpecificStatusTest.php b/integration_tests/EndpointActeAPI/GetActesOfSpecificStatusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a389aaf4e2210523f8da8a32a533dafd938a683
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetActesOfSpecificStatusTest.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+
+class GetActesOfSpecificStatusTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function dataProvider(): array
+    {
+        return [
+            [
+                [
+                    'offset' => 0,
+                    'limit' => 5,
+                    'minDate' => (new \DateTimeImmutable('2000-01-01'))->format('Y-m-d'),
+                    'maxDate' => date('Y-m-d'),
+                    'nbTransactionToCreate' => 1,
+                    'nbTransactionToReturn' => 1
+                ]
+            ],
+            [
+                [
+                    'offset' => 1,
+                    'limit' => 5,
+                    'minDate' => (new \DateTimeImmutable('2000-01-01'))->format('Y-m-d'),
+                    'maxDate' => date('Y-m-d'),
+                    'nbTransactionToCreate' => 5,
+                    'nbTransactionToReturn' => 4
+                ]
+            ],
+            [
+                [
+                    'offset' => 0,
+                    'limit' => 5,
+                    'minDate' => (new \DateTimeImmutable('2100-01-01'))->format('Y-m-d'),
+                    'maxDate' => date('Y-m-d'),
+                    'nbTransactionToCreate' => 5,
+                    'nbTransactionToReturn' => 0
+                ]
+            ],
+            [
+                [
+                    'offset' => 0,
+                    'limit' => 5,
+                    'minDate' => (new \DateTimeImmutable('2000-01-01'))->format('Y-m-d'),
+                    'maxDate' => (new \DateTimeImmutable('2001-01-01'))->format('Y-m-d'),
+                    'nbTransactionToCreate' => 5,
+                    'nbTransactionToReturn' => 0
+                ]
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider dataProvider
+     */
+    public function testShouldReturnOk($data): void
+    {
+        $this->createTransaction(ActesStatusSQL::STATUS_VALIDE);
+
+        for ($i = $data['nbTransactionToCreate']; $i > 0; $i--) {
+            $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+        }
+
+        $statusId = ActesStatusSQL::STATUS_ACQUITTEMENT_RECU;
+
+        $_GET['status_id'] = $statusId;
+        $_GET['offset'] = $data['offset'];
+        $_GET['limit'] = $data['limit'];
+        $_GET['min_date'] = $data['minDate'];
+        $_GET['max_date'] = $data['maxDate'];
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::SuperAdministrateur);
+        $client->request('GET', '/modules/actes/api/list_actes.php', [
+            'status_id' => $statusId,
+            'offset' => $data['offset'],
+            'limit' => $data['limit'],
+            'min_date' => $data['minDate'],
+            'max_date' => $data['maxDate'],
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+
+        static::assertJson($content[0]);
+
+        $contentAsArray = json_decode($content[0], true);
+        static::assertArrayHasKey('status_id', $contentAsArray);
+        static::assertArrayHasKey('authority_id', $contentAsArray);
+        static::assertArrayHasKey('offset', $contentAsArray);
+        static::assertArrayHasKey('limit', $contentAsArray);
+        static::assertArrayHasKey('transactions', $contentAsArray);
+        static::assertCount($data['nbTransactionToReturn'], $contentAsArray['transactions']);
+
+        static::assertSame($statusId, intVal($contentAsArray['status_id']));
+        static::assertSame($data['offset'], intVal($contentAsArray['offset']));
+        static::assertSame($data['limit'], intVal($contentAsArray['limit']));
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetAllFilesOfAnActeTest.php b/integration_tests/EndpointActeAPI/GetAllFilesOfAnActeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..799528c9f0b132daed3d5dd2fba4e0fc830fb176
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetAllFilesOfAnActeTest.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetAllFilesOfAnActeTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function transactionIdsProvider(): array
+    {
+        return [
+            [true, 'PDFTest.pdf'],
+            [false, 'Numéro de transaction invalide'],
+        ];
+    }
+
+    /**
+     * @dataProvider transactionIdsProvider
+     */
+    public function testShouldReturnOk($isRealTransaction, $stringInResponse): void
+    {
+        if ($isRealTransaction) {
+            $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+            $this->createActeIncludedFiles($transactionId);
+        } else {
+            $transactionId = 121414;
+        }
+
+        $_GET['transaction'] = $transactionId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request(
+            'GET',
+            '/modules/actes/actes_transac_get_files_list.php',
+            [
+                'transaction' => $transactionId,
+
+            ],
+        );
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString($stringInResponse, $response->getContent());
+
+        $files = json_decode($response->getContent(), true) ?? [];
+
+        foreach ($files as $file) {
+            static::assertArrayHasKey('id', $file);
+            static::assertArrayHasKey('name', $file);
+            static::assertArrayHasKey('posted_filename', $file);
+            static::assertArrayHasKey('mimetype', $file);
+            static::assertArrayHasKey('size', $file);
+            static::assertArrayHasKey('sign', $file);
+            static::assertArrayHasKey('code_pj', $file);
+        }
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetClassificationXMLTest.php b/integration_tests/EndpointActeAPI/GetClassificationXMLTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c4bf3cacc400525b0097901fc12df29863d2e97e
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetClassificationXMLTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetClassificationXMLTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnXML(): void
+    {
+        $api = 1;
+        $_POST['api'] = $api;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('POST', '/modules/actes/actes_classification_fetch.php', [
+            'api' => $api,
+        ]);
+
+        $response = $client->getResponse();
+
+        static::assertTrue($this->headerReturnXMLFile($response));
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetDocumentOfTransaction.php b/integration_tests/EndpointActeAPI/GetDocumentOfTransaction.php
new file mode 100644
index 0000000000000000000000000000000000000000..59d376e58006ffe08d1e17c29ff8deb033a539ab
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetDocumentOfTransaction.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetDocumentOfTransaction extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+    private const TRANSMISSION_D_ACTE = 1;
+    private const DEMANDE_PIECE_COMPLEMENTAIRES = 3;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function transactionTypeProvider()
+    {
+        return [
+            [self::TRANSMISSION_D_ACTE, "('Content-type: text/plain','1','')", "actes_download_file.php"],
+            [self::DEMANDE_PIECE_COMPLEMENTAIRES, "actes_download_file.php", "%String not int header%"],
+        ];
+    }
+
+    /**
+     * @dataProvider transactionTypeProvider
+     */
+    public function testShouldGetDocument($transactionType, $strInHeader, $strNotInHeader): void
+    {
+        $transactionId = $this->createTransactionOfType(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU, $transactionType);
+
+        $_GET['id'] = $transactionId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/actes_transac_get_document.php', [
+            'id' => $transactionId
+        ]);
+
+        $response = $client->getResponse();
+        $content = $response->getContent();
+
+        static::assertStringContainsString($strInHeader, $content);
+        static::assertStringNotContainsString($strNotInHeader, $content);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetNewUniqueEnveloppeNumberTest.php b/integration_tests/EndpointActeAPI/GetNewUniqueEnveloppeNumberTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1891d13fb30814bb7ecebd4932d7ed5f323d96fe
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetNewUniqueEnveloppeNumberTest.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+
+class GetNewUniqueEnveloppeNumberTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnOk(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+
+        $client->request('GET', '/modules/actes/actes_transac_get_env_serial.php');
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertSame('OK', $content[0]);
+        static::assertNotEmpty($content[1]);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetNumberOfActeByAuthoritiesAndDateTest.php b/integration_tests/EndpointActeAPI/GetNumberOfActeByAuthoritiesAndDateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a3a5274321cbd4c23e331bad963f2b1120a1956
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetNumberOfActeByAuthoritiesAndDateTest.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetNumberOfActeByAuthoritiesAndDateTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function dataProvider(): array
+    {
+        return [
+            [
+                [
+                    'monthToRequest' => 7,
+                    'yearToRequest' => 2017,
+                    'nbTransactionToCreate' => 1,
+                    'nbTransactionToReturn' => 1,
+                ]
+            ],
+            [
+                [
+                    'monthToRequest' => 7,
+                    'yearToRequest' => 2017,
+                    'nbTransactionToCreate' => 3,
+                    'nbTransactionToReturn' => 3,
+                ]
+            ],
+            [
+                [
+                    'monthToRequest' => 5,
+                    'yearToRequest' => 2017,
+                    'nbTransactionToCreate' => 2,
+                    'nbTransactionToReturn' => 0,
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * @dataProvider dataProvider
+     */
+    public function testShouldReturnNumberOfTransactions($data): void
+    {
+        for ($i = $data['nbTransactionToCreate']; $i > 0; $i--) {
+            $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+        }
+
+        $collectiviteGroupId = 1;
+        $month = $data['monthToRequest'];
+        $year = $data['yearToRequest'];
+
+        $_GET['month'] = $month;
+        $_GET['year'] = $year;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::SuperAdministrateur);
+        $client->request('GET', '/modules/actes/api/nb_actes_by_authorities_and_date.php', [
+            'authority_group_id' => $collectiviteGroupId,
+            'month' => $month,
+            'year' => $year,
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+        $contentAsArray = json_decode($content[0], true);
+
+        static::assertJson($content[0]);
+        static::assertArrayHasKey('result', $contentAsArray);
+        static::assertArrayHasKey('authority_group_id', $contentAsArray);
+        static::assertArrayHasKey('min_date', $contentAsArray);
+        static::assertArrayHasKey('min_date', $contentAsArray);
+
+        static::assertSame(
+            $data['nbTransactionToReturn'],
+            $contentAsArray['nbTransactionPerAuthorities'][0]['nb_transactions']
+        );
+    }
+
+    public function testShouldExitIfNotAdmin(): void
+    {
+        $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+
+        $collectiviteGroupId = 1;
+        $month = 7;
+        $year = 2017;
+
+        $_GET['authority_group_id'] = $collectiviteGroupId;
+        $_GET['month'] = $month;
+        $_GET['year'] = $year;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/api/nb_actes_by_authorities_and_date.php', [
+            'authority_group_id' => $collectiviteGroupId,
+            'month' => $month,
+            'year' => $year,
+        ]);
+
+        $response = $client->getResponse();
+        static::assertSame('', $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetNumberOfActeWithSpecificStatusTest.php b/integration_tests/EndpointActeAPI/GetNumberOfActeWithSpecificStatusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebb9918ecf41141eab03437ea6fcd37e2061fb51
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetNumberOfActeWithSpecificStatusTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetNumberOfActeWithSpecificStatusTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function statusProvider(): array
+    {
+        return [
+            [ActesStatusSQL::STATUS_TRANSMIS, 0],
+            [ActesStatusSQL::STATUS_POSTE, 1],
+            [ActesStatusSQL::STATUS_EN_ATTENTE_DE_TRANSMISSION, 2],
+            [ActesStatusSQL::STATUS_EN_ATTENTE_D_ETRE_POSTE, 10],
+            [ActesStatusSQL::STATUS_EN_ERREUR, 10],
+        ];
+    }
+
+    /**
+     * @dataProvider statusProvider
+     */
+    public function testShouldReturnGoodJson($status, $nbTransaction): void
+    {
+        for ($i = $nbTransaction; $i > 0; $i--) {
+            $this->createTransaction($status);
+        }
+
+        $_GET['status_id'] = $status;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/api/number_actes.php', [
+            'status_id' => $status,
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertJson($content[0]);
+
+        $contentAsArray = json_decode($content[0], true);
+
+        static::assertArrayHasKey('status_id', $contentAsArray);
+        static::assertArrayHasKey('authority_id', $contentAsArray);
+        static::assertArrayHasKey('nb_transactions', $contentAsArray);
+
+        static::assertSame($nbTransaction, $contentAsArray['nb_transactions']);
+        static::assertSame($status, $contentAsArray['status_id']);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetStatusTest.php b/integration_tests/EndpointActeAPI/GetStatusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2733758f1463e50873fbd15c70836362b05f5d29
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetStatusTest.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetStatusTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+        $this->client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    private function prepareAndGetResponse()
+    {
+        $this->client->request('GET', '/modules/actes/api/actes_status.php');
+        return $this->client->getResponse();
+    }
+
+    public function testActesStatusReturnOk()
+    {
+        $response = $this->prepareAndGetResponse();
+
+        self::assertResponseIsSuccessful($response);
+    }
+
+    public function testActesStatusJsonOk()
+    {
+        $response = $this->prepareAndGetResponse();
+        $responseContent = $response->getContent();
+
+        self::assertJson($responseContent);
+    }
+
+    public function testActesStatusAreOk()
+    {
+        $responseModel = '
+        {
+          "-1": "Erreur",
+          "0": "Annul\u00e9",
+          "1": "Post\u00e9",
+          "2": "En attente de transmission",
+          "3": "Transmis",
+          "4": "Acquittement re\u00e7u",
+          "5": "Valid\u00e9",
+          "6": "Refus\u00e9",
+          "7": "Document re\u00e7u",
+          "8": "Acquittement envoy\u00e9",
+          "9": "Document envoy\u00e9",
+          "10": "Refus d\'envoi",
+          "11": "Acquittement de document re\u00e7u",
+          "12": "Envoy\u00e9 au SAE",
+          "13": "Archiv\u00e9 par le SAE",
+          "14": "Erreur lors de l\'archivage",
+          "15": "Re\u00e7u par le SAE",
+          "16": "D\u00e9truite",
+          "17": "En attente d\'\u00eatre post\u00e9",
+          "18": "En attente d\'\u00eatre sign\u00e9",
+          "19": "En attente de transmission au SAE",
+          "20": "Erreur lors de l\'envoi au SAE",
+          "21": "Document re\u00e7u (pas d\'AR)"
+        }';
+
+        $response = $this->prepareAndGetResponse();
+        $responseContent = $response->getContent();
+
+        $responseArray = json_decode($responseContent, true);
+        $responseModelArray = json_decode($responseModel, true);
+
+        $differentValuesInArrays = array_diff($responseArray, $responseModelArray);
+        $nbOfDifferentValuesInArrays = count($differentValuesInArrays);
+
+        self::assertTrue($nbOfDifferentValuesInArrays === 0, "Les statuts différents.");
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetTransactionBordereauAcquittement.php b/integration_tests/EndpointActeAPI/GetTransactionBordereauAcquittement.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ab9c02d64f3008048feed80dca11b047df95255
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetTransactionBordereauAcquittement.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetTransactionBordereauAcquittement extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnOk(): void
+    {
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+
+        $_GET['trans_id'] = $transactionId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/actes_create_pdf.php', [
+            'trans_id' => $transactionId
+        ]);
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString(
+            "%PDF-1.3
+3 0 obj
+<</Type /Page
+/Parent 1 0 R
+/Resources 2 0 R
+/Contents 4 0 R>>",
+            $response->getContent()
+        );
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetTransactionStatusTest.php b/integration_tests/EndpointActeAPI/GetTransactionStatusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1baab37aa8c924c5983e36b1087d1eb2d13fd7be
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetTransactionStatusTest.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetTransactionStatusTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function transactionStatusProvider(): array
+    {
+        return [
+            [
+                UserRole::Utilisateur,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                'Acquittement très officiel',
+                null
+            ],
+            [
+                UserRole::Utilisateur,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                'Numéro de transaction invalide',
+                12314
+            ],
+            [
+                UserRole::SuperAdministrateur,
+                ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+                'KO',
+                null
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider transactionStatusProvider
+     */
+    public function testShouldReturnTransactionStatusCode(
+        UserRole $userRole,
+        $status,
+        $shouldBeInHeader,
+        $transactionId,
+    ): void {
+        if ($transactionId === null) {
+            $transactionId = $this->createTransaction($status);
+        }
+
+        $_GET['transaction'] = $transactionId;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs($userRole);
+        $client->request('GET', '/modules/actes/actes_transac_get_status.php', [
+            'transaction' => $transactionId,
+        ]);
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString($shouldBeInHeader, $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/GetUnreadPrefectureDocumentsTest.php b/integration_tests/EndpointActeAPI/GetUnreadPrefectureDocumentsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8edacafe84b86186e9c4b4387d874d6929e3a85
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/GetUnreadPrefectureDocumentsTest.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class GetUnreadPrefectureDocumentsTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+    private const DEMANDE_PIECES_COMPLEMENTAIRES = 3;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldListUnreadPrefectureDocuments(): void
+    {
+        $this->createTransactionOfType(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU, self::DEMANDE_PIECES_COMPLEMENTAIRES);
+        $this->createTransactionOfType(ActesStatusSQL::STATUS_VALIDE, self::DEMANDE_PIECES_COMPLEMENTAIRES);
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/api/list_document_prefecture.php');
+
+        $response = $client->getResponse();
+        $contentArray = json_decode($response->getContent(), true);
+
+        foreach ($contentArray as $document) {
+            static::assertArrayHasKey('id', $document);
+            static::assertArrayHasKey('type', $document);
+            static::assertArrayHasKey('number', $document);
+            static::assertArrayHasKey('unique_id', $document);
+            static::assertArrayHasKey('last_status_id', $document);
+            static::assertArrayHasKey('related_transaction_id', $document);
+        }
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/MarkPrefectureDocumentAsRead.php b/integration_tests/EndpointActeAPI/MarkPrefectureDocumentAsRead.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d5197a1fb4c0dab31a5a84e048896cf4b6f2f05
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/MarkPrefectureDocumentAsRead.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class MarkPrefectureDocumentAsRead extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+    private const DEMANDE_PIECES_COMPLEMENTAIRES = 3;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnOk(): void
+    {
+        $transactionId = $this->createTransactionOfType(
+            ActesStatusSQL::STATUS_ACQUITTEMENT_RECU,
+            self::DEMANDE_PIECES_COMPLEMENTAIRES
+        );
+
+        $_GET['transaction_id'] = '$transactionId';
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/api/document_prefecture_mark_as_read.php', [
+            'transaction_id' => $transactionId,
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertSame('{"result":"ok"}', $content[0]);
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/OrderTransmissionOfMultipleActeToMinisterTest.php b/integration_tests/EndpointActeAPI/OrderTransmissionOfMultipleActeToMinisterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8934d2897887506494aa2c752932720ccacee12
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/OrderTransmissionOfMultipleActeToMinisterTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class OrderTransmissionOfMultipleActeToMinisterTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnRightHeader(): void
+    {
+        $firstTransactionId = $this->createTransaction(ActesStatusSQL::STATUS_EN_ATTENTE_D_ETRE_POSTE);
+        $secondTransactionId = $this->createTransaction(ActesStatusSQL::STATUS_EN_ATTENTE_D_ETRE_POSTE);
+
+        $ids[] = [$firstTransactionId, $secondTransactionId];
+        $urlReturn = 'index.php';
+
+        $_GET['id'] = $ids;
+        $_GET['url_return'] = $urlReturn;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/actes_transac_post_confirm_api_multi.php', [
+            'id[]' => $ids,
+            'url_return' => $urlReturn,
+        ]);
+
+        $response = $client->getResponse();
+        static::assertStringContainsString('Location:  index.php', $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/OrderTransmissionToMinistereTest.php b/integration_tests/EndpointActeAPI/OrderTransmissionToMinistereTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bda990ac6a27e997e20c3b67a962362c7fdd3afe
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/OrderTransmissionToMinistereTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class OrderTransmissionToMinistereTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnRightHeader(): void
+    {
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_EN_ATTENTE_D_ETRE_POSTE);
+
+        $id = $transactionId;
+        $urlReturn = 'index.php';
+
+        $_GET['id'] = $id;
+        $_GET['url_return'] = $urlReturn;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', '/modules/actes/actes_transac_post_confirm_api.php', [
+            'id' => $id,
+            'url_return' => $urlReturn,
+        ]);
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString('Location:  index.php', $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/RepondToMinistereDocumentTest.php b/integration_tests/EndpointActeAPI/RepondToMinistereDocumentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..37fbdfe3d3767a7de9bbcca5806b38b6df53d02c
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/RepondToMinistereDocumentTest.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+
+class RepondToMinistereDocumentTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    protected function dataProvider(): array
+    {
+        return [
+            [
+                [
+                    'typeEnvoi' => 3,
+                    'typeActe' => '12345',
+                    'typePj' => '12345',
+                    'natureCode' => '3',
+                    'stringInResponse' => 'OK',
+                ]
+            ],
+            [
+                [
+                    'typeEnvoi' => 3,
+                    'typeActe' => '1234',
+                    'typePj' => '12345',
+                    'natureCode' => '3',
+                    'stringInResponse' => 'Le code de la PJ doit faire 5 carac',
+                ]
+            ],
+            [
+                [
+                    'typeEnvoi' => 3,
+                    'typeActe' => '',
+                    'typePj' => '',
+                    'natureCode' => '',
+                    'stringInResponse' => 'typologie absente',
+                ]
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider dataProvider
+     */
+    public function test($data): void
+    {
+        $transactionId = $this->createTransactionOfType(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU, 2);
+
+        $api = 1;
+        $typeEnvoie = $data['typeEnvoi'];
+        $typeActe = $data['typeActe'];
+        $typePj = $data['typePj'];
+        $natureCode = $data['natureCode'];
+
+        $filePath = __DIR__ . '/../fixtures' . '/PDFTest.pdf';
+        $fileName = 'PDFTest.pdf';
+        $fileType = 'application/pdf';
+        $fileError = UPLOAD_ERR_OK;
+
+        $_POST['api'] = $api;
+        $_POST['id'] = $transactionId;
+        $_POST['type_envoie'] = $typeEnvoie;
+        $_POST['type_acte'] = $typeActe;
+        $_POST['type_pj'] = $typePj;
+        $_POST['nature_code'] = $natureCode;
+
+        $_FILES['acte_pdf_file'] = [
+            'name' => $fileName,
+            'type' => $fileType,
+            'tmp_name' => $filePath,
+            'error' => $fileError,
+            'size' => null
+        ];
+
+        $uploadedFile = new UploadedFile(
+            $filePath,
+            $fileName,
+            $fileType,
+            $fileError,
+            true
+        );
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request(
+            'POST',
+            '/modules/actes/actes_transac_reponse_create.php',
+            [
+                'api' => $api,
+                'id' => $transactionId,
+                'type_envoie' => $typeEnvoie,
+                'type_acte' => $typeActe,
+                'type_pj' => $typePj,
+                'nature_code' => $natureCode,
+            ],
+            [
+                'acte_pdf_file' => $uploadedFile
+            ]
+        );
+
+        $response = $client->getResponse();
+        static::assertStringContainsString($data['stringInResponse'], $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointActeAPI/UpdateClassificationTransactionTest.php b/integration_tests/EndpointActeAPI/UpdateClassificationTransactionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9031fcd9bf2dbd76504ddb894ae49c132babb00
--- /dev/null
+++ b/integration_tests/EndpointActeAPI/UpdateClassificationTransactionTest.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace IntegrationTests\EndpointActeAPI;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+
+class UpdateClassificationTransactionTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldUpdateClassification(): void
+    {
+        $api = 1;
+        $_POST['api'] = $api;
+
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('POST', '/modules/actes/actes_classification_request.php', [
+            'api' => $api,
+        ]);
+
+        $response = $client->getResponse();
+        $content = explode("\n", trim($response->getContent()));
+
+        static::assertSame('OK', $content[0]);
+    }
+}
diff --git a/integration_tests/ActesIntegrationTest.php b/integration_tests/EndpointsActeHtml/ActesIntegrationTest.php
similarity index 72%
rename from integration_tests/ActesIntegrationTest.php
rename to integration_tests/EndpointsActeHtml/ActesIntegrationTest.php
index 62acc8ffec617414fd4a4ca659ea52afb559cfb1..3bd27842eb9f94b4910e53746eb8db9b02cc5522 100644
--- a/integration_tests/ActesIntegrationTest.php
+++ b/integration_tests/EndpointsActeHtml/ActesIntegrationTest.php
@@ -2,9 +2,10 @@
 
 declare(strict_types=1);
 
-namespace IntegrationTests;
+namespace IntegrationTests\EndpointsActeHtml;
 
 use Exception;
+use IntegrationTests\S2lowIntegrationTestCase;
 use PHPUnit\ActesUtilitiesTestTrait;
 use S2lowLegacy\Class\actes\ActesStatusSQL;
 use S2lowLegacy\Class\actes\ActesTransactionsSQL;
@@ -39,34 +40,7 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
     {
         return $this->actesTransactionsSQL;
     }
-    /**
-     * @throws Exception
-     * TODO : corriger, bug dans cette fonctionnalité
-     * https://gitlab.libriciel.fr/libriciel/pole-plate-formes/s2low/s2low/-/issues/1200
-     */
-    /*
-    public function testActesForceClassification(): void
-    {
-        $certificatePem = $this->pemCertificateFactory->getFromString(
-            file_get_contents(__DIR__ . '/../test/api/Eric_Pommateau_RGS_2_etoiles.pem')
-        );
 
-        $this->setUpUser($certificatePem->getContent(), $certificatePem->getHash());
-        $client = $this->setUpClient(
-            $certificatePem->getContent(),
-            $certificatePem->getContentStrippedFromBegin()
-        );
-
-        ObjectInstancierFactory::resetObjectInstancier();
-
-        $crawler = $client->request('GET', 'modules/actes/admin/actes_force_classifiction.php');
-        static::assertMatchesRegularExpression(
-            '#KO#',
-            $crawler->html()
-        );
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-    */
     /**
      * @throws Exception
      */
@@ -76,7 +50,7 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         $enveloppeName = 'enveloppe';
         $this->copyEnveloppeToErrorDirectory($enveloppeName);
         $_GET['file'] = $enveloppeName; // Comme l'objet Récupérateur est set dans le script, ça ne fonctionne pas
-                                      // autrement ( le client Symfony ne set pas _GET )
+        // autrement ( le client Symfony ne set pas _GET )
         $client->request(
             'GET',
             'modules/actes/admin/analyse-response.php'
@@ -125,21 +99,6 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
     }
 
-    /**
-     * @throws \Exception
-     */
-    public function testActesAdminIndex(): void
-    {
-        $client = $this->setUpUser();
-
-        $crawler = $client->request('GET', 'modules/actes/admin/index.php');
-        static::assertMatchesRegularExpression(
-            '#Utilitaires - ACTES#',
-            $crawler->html()
-        );
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-
     /**
      * @throws Exception
      */
@@ -155,22 +114,6 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
     }
 
-    /**
-     * TODO : ajouter un cas qui fonctionne
-     * @throws Exception
-     */
-    public function testActesBatchSign(): void
-    {
-        $client = $this->setUpUser();
-
-        $crawler = $client->request('GET', 'modules/actes/actes_batch_sign.php');
-        static::assertMatchesRegularExpression(
-            '#Vous devez sélectionner au moins une transaction à signer#',
-            $crawler->html()
-        );
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-
     /**
      * @throws Exception
      */
@@ -213,23 +156,6 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
     }
 
-    /**
-     * @throws Exception
-     */
-    public function testActesTransacDelete(): void
-    {
-        $client = $this->setUpUser();
-
-        $transaction_id = $this->createTransaction(ActesStatusSQL::STATUS_TRANSMIS);
-        $_POST['id'] = $transaction_id;
-        $client->request('GET', 'modules/actes/actes_transac_delete.php');
-        static::assertMatchesRegularExpression(
-            "#La transaction $transaction_id a été éradiquée ....#",
-            $_SESSION['error']
-        );
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-
     /**
      * @throws Exception
      */
@@ -248,37 +174,6 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
     }
 
-    /**
-     * @throws Exception
-     */
-    public function testActesTransacPostConfirm(): void
-    {
-        $client = $this->setUpUser();
-
-        $client->request('GET', 'modules/actes/actes_transac_post_confirm.php');
-        static::assertMatchesRegularExpression(
-            '#La télétransmission nécessite un certificat RGS#',
-            $_SESSION['error']
-        );
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-
-    /**
-     * @throws Exception
-     */
-    public function testActesTransacPostConfirmApiMulti(): void
-    {
-        $client = $this->setUpUser();
-
-            $crawler = $client->request('GET', 'modules/actes/actes_transac_post_confirm_api_multi.php');
-            static::assertMatchesRegularExpression(
-                '#exit\(\) called#',
-                $crawler->html()
-            );
-
-        static::assertResponseIsSuccessful();       // Aucune erreur lors de la requête
-    }
-
     /**
      * @throws Exception
      */
@@ -404,15 +299,15 @@ class ActesIntegrationTest extends S2lowIntegrationTestCase
         $this->enveloppeInErrorPath = "/data/tdt-workspace/actes/response_error/$enveloppeName/";
         mkdir($this->enveloppeInErrorPath);
         copy(
-            __DIR__ . '/../test/PHPUnit/class/fixtures/test-courrier-simple/034-000000000-20170701-20170725A-AI-2-1_0.xml',
+            __DIR__ . '/../../test/PHPUnit/class/fixtures/test-courrier-simple/034-000000000-20170701-20170725A-AI-2-1_0.xml',
             $this->enveloppeInErrorPath . '/034-000000000-20170701-20170725A-AI-2-1_0.xml'
         );
         copy(
-            __DIR__ . '/../test/PHPUnit/class/fixtures/test-courrier-simple/TACT--SPREF0011-000000000-20170725-1.xml',
+            __DIR__ . '/../../test/PHPUnit/class/fixtures/test-courrier-simple/TACT--SPREF0011-000000000-20170725-1.xml',
             $this->enveloppeInErrorPath . '/TACT--SPREF0011-000000000-20170725-1.xml'
         );
         copy(
-            __DIR__ . '/../test/PHPUnit/class/fixtures/test-courrier-simple/034-000000000-20170701-20170725A-AI-2-1_1.pdf',
+            __DIR__ . '/../../test/PHPUnit/class/fixtures/test-courrier-simple/034-000000000-20170701-20170725A-AI-2-1_1.pdf',
             $this->enveloppeInErrorPath . '/034-000000000-20170701-20170725A-AI-2-1_1.pdf'
         );
     }
diff --git a/integration_tests/EndpointsActeHtml/AdminIndexTest.php b/integration_tests/EndpointsActeHtml/AdminIndexTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc1cf59143fd8c2be4fef09bc9337eff80bacf7b
--- /dev/null
+++ b/integration_tests/EndpointsActeHtml/AdminIndexTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace IntegrationTests\EndpointsActeHtml;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use S2low\Enum\UserRole;
+
+class AdminIndexTest extends S2lowIntegrationTestCase
+{
+    private const ADMIN_INDEX = 'modules/actes/admin/index.php';
+
+    public static function rolesButNotSADMProvider(): \Generator
+    {
+        yield 'En tant que Utilisateur' => [UserRole::Utilisateur];
+        yield 'En tant que Administrateur' => [UserRole::AdministrateurCollectivite];
+        yield 'En tant que Arch' => [UserRole::Archiviste];
+        yield 'En tant que Gadm' => [UserRole::AdministrateurGroupe];
+    }
+
+    public static function rolesSADMProvider(): \Generator
+    {
+        yield 'En tant que Super Administrateur' => [UserRole::SuperAdministrateur];
+    }
+
+    /**
+     * @dataProvider rolesButNotSADMProvider
+     * @dataProvider rolesSADMProvider
+     */
+    public function testShouldReturnSuccessResponse(UserRole $role): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs($role);
+        $client->request('GET', self::ADMIN_INDEX);
+
+        static::assertResponseIsSuccessful();
+    }
+
+    public function testShouldReturnRightContentWhenAuthenticatedAsSuperAdmin(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::SuperAdministrateur);
+        $client->request('GET', self::ADMIN_INDEX);
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString("Administration", $response->getContent());
+    }
+
+
+    /**
+     * @dataProvider rolesButNotSADMProvider
+     */
+    public function testShouldDenyAccessWhenNotAuthenticatedAsAdmin(UserRole $role): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs($role);
+        $client->request('GET', self::ADMIN_INDEX);
+
+        $response = $client->getResponse();
+
+        static::assertStringNotContainsString("Administration", $response->getContent());
+    }
+}
diff --git a/integration_tests/EndpointsActeHtml/BatchSignTest.php b/integration_tests/EndpointsActeHtml/BatchSignTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..abee1fb5a909526511dae8f50b7afa5dc89b8cc6
--- /dev/null
+++ b/integration_tests/EndpointsActeHtml/BatchSignTest.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace IntegrationTests\EndpointsActeHtml;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\ModulePermission;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class BatchSignTest extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private const BATCH_SIGN_ENDPOINT = "modules/actes/actes_batch_sign.php";
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+        $this->actesTransactionsSQL = new ActesTransactionsSQL($this->sqlQuery);
+        ObjectInstancierFactory::resetObjectInstancier();
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldReturnSuccessResponse(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+        $client->request('GET', self::BATCH_SIGN_ENDPOINT);
+
+        static::assertResponseIsSuccessful();
+    }
+
+    public function testShouldRedirectIndexWithErrorMessage(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur);
+
+        $client->request('GET', self::BATCH_SIGN_ENDPOINT);
+        $response = $client->getResponse();
+
+        static::assertStringContainsString(
+            'Vous devez sélectionner au moins une transaction à signer',
+            $response->getContent()
+        );
+    }
+
+    public function testShouldDisplayUiToSignActes(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur, ModulePermission::Modification);
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_ACQUITTEMENT_RECU);
+        $this->createActeIncludedFiles($transactionId);
+
+        $_POST["liste_id"] = [$transactionId];
+
+        $client->request(
+            'POST',
+            self::BATCH_SIGN_ENDPOINT,
+            [
+                'liste_id[]' => $transactionId,
+            ]
+        );
+
+        $response = $client->getResponse();
+        static::assertStringContainsString(
+            'ACTES - Signature de plusieurs Actes',
+            $response->getContent()
+        );
+    }
+
+    public function testShouldErrorIfNotGoodPerms()
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::Utilisateur, ModulePermission::Visualisation);
+        $client->request('GET', self::BATCH_SIGN_ENDPOINT);
+
+        $response = $client->getResponse();
+
+        static::assertStringContainsString(
+            'Vous ne disposez pas du droit de signature',
+            $response->getContent()
+        );
+    }
+}
diff --git a/integration_tests/EndpointsActeHtml/DeleteTransaction.php b/integration_tests/EndpointsActeHtml/DeleteTransaction.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c236040607b0f89e7bdc482e06e485865d95565
--- /dev/null
+++ b/integration_tests/EndpointsActeHtml/DeleteTransaction.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace IntegrationTests\EndpointsActeHtml;
+
+use IntegrationTests\S2lowIntegrationTestCase;
+use PHPUnit\ActesUtilitiesTestTrait;
+use S2low\Enum\UserRole;
+use S2lowLegacy\Class\actes\ActesStatusSQL;
+use S2lowLegacy\Class\actes\ActesTransactionsSQL;
+use S2lowLegacy\Lib\ObjectInstancierFactory;
+
+class DeleteTransaction extends S2lowIntegrationTestCase
+{
+    use ActesUtilitiesTestTrait;
+
+    private ?ActesTransactionsSQL $actesTransactionsSQL;
+
+    protected function setUp(): void
+    {
+        $this->setUpWithoutDeletingObjectInstancier();
+        $this->actesTransactionsSQL = ObjectInstancierFactory::getObjetInstancier()->get(ActesTransactionsSQL::class);
+        ObjectInstancierFactory::resetObjectInstancier();
+    }
+
+    protected function getActesTransactionsSQL(): ActesTransactionsSQL
+    {
+        return $this->actesTransactionsSQL;
+    }
+
+    public function testShouldDeleteTransaction(): void
+    {
+        $client = $this->getAuthenticatedClientWithUserLoggedAs(UserRole::SuperAdministrateur);
+
+        $transactionId = $this->createTransaction(ActesStatusSQL::STATUS_TRANSMIS);
+
+        $_POST['id'] = $transactionId;
+        $client->request('GET', 'modules/actes/actes_transac_delete.php');
+
+        static::assertTrue($this->transactionIsDeleted($transactionId));
+    }
+
+    private function transactionIsDeleted($transactionId): bool
+    {
+        $transaction = $this->getActesTransactionsSQL()->getInfo($transactionId);
+
+        return $transaction == false;
+    }
+}
diff --git a/integration_tests/S2lowIntegrationTestCase.php b/integration_tests/S2lowIntegrationTestCase.php
index aea8bfab6b024fc62afb568a9edbe9423e8598f0..35f17b77baa71925589970f696f9d4806d4e2838 100644
--- a/integration_tests/S2lowIntegrationTestCase.php
+++ b/integration_tests/S2lowIntegrationTestCase.php
@@ -2,15 +2,19 @@
 
 namespace IntegrationTests;
 
+use S2low\Enum\ModulePermission;
+use S2low\Enum\UserRole;
 use S2lowLegacy\Class\LegacyObjectsManager;
 use S2lowLegacy\Lib\PemCertificateFactory;
 use S2lowLegacy\Lib\SQLQuery;
 use Symfony\Bundle\FrameworkBundle\KernelBrowser;
 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+use Symfony\Component\HttpFoundation\Response;
 
 class S2lowIntegrationTestCase extends WebTestCase
 {
     protected SQLQuery $sqlQuery;
+    private int $nextCreatedUserId = 1;
     protected PemCertificateFactory $pemCertificateFactory;
 
     /**
@@ -56,20 +60,17 @@ class S2lowIntegrationTestCase extends WebTestCase
         parent::tearDown();
     }
 
+    private function getNextCreatedUserId(): int
+    {
+        return $this->nextCreatedUserId++;
+    }
+
     /**
      * @throws \Exception
      */
     public function setUpUserInDB(string $certificatPem, string $certificatHash): void
     {
-        $sql = "INSERT INTO users VALUES (1, 'eric@sigmalis.com', 'test_subject', 'test_issuer', 'Pommateau', 'Eric', NULL, 'SADM', 1, 1, ?, NULL, NULL, NULL, 1, NULL, NULL, ?, ?)";
-        $this->sqlQuery->query($sql, [$certificatPem, $certificatPem, $certificatHash]);
-
-        $sql1 = "INSERT INTO users_perms VALUES (64395, 1, 1, 'RW'); -- Permission RW sur le module Actes";
-        $this->sqlQuery->query($sql1);
-        $sql2 = "INSERT INTO users_perms VALUES (64396, 2, 1, 'RW'); -- Permission RW sur le module Helios";
-        $this->sqlQuery->query($sql2);
-        $sql3 = "INSERT INTO users_perms VALUES (64397, 3, 1, 'RW'); -- Permission RW sur le module Mail";
-        $this->sqlQuery->query($sql3);
+        $this->createUserAs(UserRole::SuperAdministrateur, $certificatPem, $certificatHash);
     }
 
     /**
@@ -111,11 +112,22 @@ class S2lowIntegrationTestCase extends WebTestCase
      */
     protected function setUpUser(): \Symfony\Bundle\FrameworkBundle\KernelBrowser
     {
+        return $this->setUpUserAs(UserRole::SuperAdministrateur, ModulePermission::Modification);
+    }
+
+    /**
+     * @return \Symfony\Bundle\FrameworkBundle\KernelBrowser
+     * @throws \Exception
+     */
+    protected function setUpUserAs(
+        UserRole $role,
+        ModulePermission $permissions
+    ): \Symfony\Bundle\FrameworkBundle\KernelBrowser {
         $certificatePem = $this->pemCertificateFactory->getFromString(
             file_get_contents(__DIR__ . '/../test/api/Eric_Pommateau_RGS_2_etoiles.pem')
         );
 
-        $this->setUpUserInDB($certificatePem->getContent(), $certificatePem->getHash());
+        $this->createUserAs($role, $certificatePem->getContent(), $certificatePem->getHash(), $permissions);
         $client = $this->setUpUserCertInServer(
             $certificatePem->getContent(),
             $certificatePem->getContentStrippedFromBegin()
@@ -123,4 +135,44 @@ class S2lowIntegrationTestCase extends WebTestCase
 
         return $client;
     }
+
+    private function createUserAs(
+        UserRole $role,
+        string $certificatPem,
+        string $certificatHash,
+        ModulePermission $permissions = ModulePermission::Modification
+    ): void {
+        $userId = $this->getNextCreatedUserId();
+
+        $constMaximumUsersCreated = 100000;
+
+        $userPermActeId = $userId;
+        $userPermHeliosId = $userId + $constMaximumUsersCreated;
+        $userPermMailId = $userId + $constMaximumUsersCreated * 2;
+
+        $sql = "INSERT INTO users VALUES ($userId, 'eric@sigmalis.com', 'test_subject', 'test_issuer', 'Pommateau', 'Eric', NULL, '$role->value', 1, 1, ?, NULL, NULL, NULL, 1, NULL, NULL, ?, ?)";
+        $this->sqlQuery->query($sql, [$certificatPem, $certificatPem, $certificatHash]);
+
+        $sql1 = "INSERT INTO users_perms VALUES ($userPermActeId, 1, $userId, '$permissions->value'); -- Permission RW sur le module Actes";
+        $this->sqlQuery->query($sql1);
+        $sql2 = "INSERT INTO users_perms VALUES ($userPermHeliosId, 2, $userId, '$permissions->value'); -- Permission RW sur le module Helios";
+        $this->sqlQuery->query($sql2);
+        $sql3 = "INSERT INTO users_perms VALUES ($userPermMailId, 3, $userId, '$permissions->value'); -- Permission RW sur le module Mail";
+        $this->sqlQuery->query($sql3);
+    }
+
+    /**
+     * @throws \Exception
+     */
+    protected function getAuthenticatedClientWithUserLoggedAs(
+        UserRole $role = UserRole::Utilisateur,
+        ModulePermission $permissions = ModulePermission::Modification
+    ): KernelBrowser {
+        return $this->setUpUserAs($role, $permissions);
+    }
+
+    protected function headerReturnXMLFile(Response $response): bool
+    {
+        return str_contains($response->getContent(), 'Content-type: text/xml');
+    }
 }
diff --git a/integration_tests/fixtures/PDFTest.pdf b/integration_tests/fixtures/PDFTest.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..59750e53bdd6ef19680a8e75a9b1a4d2051c6ddd
Binary files /dev/null and b/integration_tests/fixtures/PDFTest.pdf differ
diff --git a/integration_tests/fixtures/abc-TACT--443061841--20250313-1.tar.gz b/integration_tests/fixtures/abc-TACT--443061841--20250313-1.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..2dee75ff39d72caa8eb7960828f3836c38a5bc96
Binary files /dev/null and b/integration_tests/fixtures/abc-TACT--443061841--20250313-1.tar.gz differ
diff --git a/integration_tests/fixtures/s2low-test-init.sql b/integration_tests/fixtures/s2low-test-init.sql
index 47aadbb4a0757b1247f256cc9eba5f39e4f94f9b..c9af8453357f9a37e0f59028e674aa57ea297b56 100644
--- a/integration_tests/fixtures/s2low-test-init.sql
+++ b/integration_tests/fixtures/s2low-test-init.sql
@@ -1,78 +1,159 @@
 -- Remise à zéro de la BDD
-DELETE FROM logs;
-DELETE FROM logs_historique;
+DELETE
+FROM logs;
+DELETE
+FROM logs_historique;
 
-DELETE FROM authority_pastell_config;
-DELETE FROM actes_classification_codes;
-DELETE FROM actes_classification_requests;
-DELETE FROM actes_included_files;
-DELETE FROM actes_transactions_workflow;
-DELETE FROM actes_transactions;
-DELETE FROM actes_envelopes;
-DELETE FROM actes_type_pj;
-DELETE FROM actes_natures;
-DELETE FROM actes_status;
-DELETE FROM actes_transmission_window_hours;
-DELETE FROM actes_transmission_windows;
+DELETE
+FROM authority_pastell_config;
+DELETE
+FROM actes_classification_codes;
+DELETE
+FROM actes_classification_requests;
+DELETE
+FROM actes_included_files;
+DELETE
+FROM actes_transactions_workflow;
+DELETE
+FROM actes_transactions;
+DELETE
+FROM actes_envelopes;
+DELETE
+FROM actes_type_pj;
+DELETE
+FROM actes_natures;
+DELETE
+FROM actes_status;
+DELETE
+FROM actes_transmission_window_hours;
+DELETE
+FROM actes_transmission_windows;
 
-DELETE FROM helios_transactions;
-DELETE FROM helios_retour;
-DELETE FROM helios_transactions_workflow;
+DELETE
+FROM helios_transactions;
+DELETE
+FROM helios_retour;
+DELETE
+FROM helios_transactions_workflow;
 
-DELETE FROM users_perms;
-DELETE FROM service_user_content;
-DELETE FROM service_user;
-DELETE FROM logs_request;
-DELETE FROM message_admin;
-DELETE FROM users;
-DELETE FROM modules_authorities;
-DELETE FROM authority_siret;
-DELETE FROM nounce;
-DELETE FROM authorities;
-DELETE FROM authority_districts;
-DELETE FROM authority_departments;
-DELETE FROM authority_types;
-DELETE FROM authority_group_siren;
-DELETE FROM authority_groups;
-DELETE FROM modules;
-DELETE FROM logs;
+DELETE
+FROM users_perms;
+DELETE
+FROM service_user_content;
+DELETE
+FROM service_user;
+DELETE
+FROM logs_request;
+DELETE
+FROM message_admin;
+DELETE
+FROM users;
+DELETE
+FROM modules_authorities;
+DELETE
+FROM authority_siret;
+DELETE
+FROM nounce;
+DELETE
+FROM authorities;
+DELETE
+FROM authority_districts;
+DELETE
+FROM authority_departments;
+DELETE
+FROM authority_types;
+DELETE
+FROM authority_group_siren;
+DELETE
+FROM authority_groups;
+DELETE
+FROM modules;
+DELETE
+FROM logs;
 
-DELETE FROM mail_transaction;
+DELETE
+FROM mail_transaction;
 
 -- Insertion des natures d'actes
-INSERT INTO actes_natures VALUES (3, 'AI', 'Arretes individuelles');
-INSERT INTO actes_natures VALUES (1, 'DE', 'Deliberations');
-INSERT INTO actes_status VALUES (-1, 'Erreur');
-INSERT INTO actes_status VALUES (1, 'Posté');
-INSERT INTO actes_status VALUES (2, 'En attente de transmission');
-INSERT INTO actes_status VALUES (3, 'Transmis');
-INSERT INTO actes_status VALUES (4, 'Acquittement reçu');
-INSERT INTO actes_status VALUES (13, 'Archivé par le SAE');
-INSERT INTO actes_status VALUES (14, 'Erreur lors de l''archivage');
-INSERT INTO actes_status VALUES (19, 'En attente de transmission au SAE');
-INSERT INTO actes_status VALUES (20, 'Erreur lors de l''envoi au SAE');
-INSERT INTO actes_status VALUES (21, 'Document reçu (pas d''AR)');
-INSERT INTO actes_status VALUES (12, 'Envoyé au SAE');
-INSERT INTO actes_status VALUES (18, 'En attente d''être signé');
+INSERT INTO actes_natures
+VALUES (3, 'AI', 'Arretes individuelles');
+INSERT INTO actes_natures
+VALUES (1, 'DE', 'Deliberations');
+INSERT INTO actes_status
+VALUES (-1, 'Erreur');
+INSERT INTO actes_status
+VALUES (1, 'Posté');
+INSERT INTO actes_status
+VALUES (2, 'En attente de transmission');
+INSERT INTO actes_status
+VALUES (3, 'Transmis');
+INSERT INTO actes_status
+VALUES (4, 'Acquittement reçu');
+INSERT INTO actes_status
+VALUES (5, 'Validé');
+INSERT INTO actes_status
+VALUES (6, 'Refusé');
+INSERT INTO actes_status
+VALUES (7, 'Document reçu');
+INSERT INTO actes_status
+VALUES (8, 'Acquittement envoyé');
+INSERT INTO actes_status
+VALUES (9, 'Document envoyé');
+INSERT INTO actes_status
+VALUES (10, 'Refus d''envoi');
+INSERT INTO actes_status
+VALUES (11, 'Acquittement de document reçu');
+INSERT INTO actes_status
+VALUES (12, 'Envoyé au SAE');
+INSERT INTO actes_status
+VALUES (13, 'Archivé par le SAE');
+INSERT INTO actes_status
+VALUES (14, 'Erreur lors de l''archivage');
+INSERT INTO actes_status
+VALUES (19, 'En attente de transmission au SAE');
+INSERT INTO actes_status
+VALUES (20, 'Erreur lors de l''envoi au SAE');
+INSERT INTO actes_status
+VALUES (21, 'Document reçu (pas d''AR)');
+INSERT INTO actes_status
+VALUES (18, 'En attente d''être signé');
+INSERT INTO actes_status
+VALUES (17, 'En attente d''être posté');
 
 -- Création des modules
-INSERT INTO modules VALUES (1, 'actes', 'Module Actes', 'Transactions Actes', 1);
-INSERT INTO modules VALUES (2, 'helios', 'Module Helios', 'Transactions Helios', 1);
-INSERT INTO modules VALUES (3, 'mail', 'Module Mail', 'Transactions Mail', 1);
+INSERT INTO modules
+VALUES (1, 'actes', 'Module Actes', 'Transactions Actes', 1);
+INSERT INTO modules
+VALUES (2, 'helios', 'Module Helios', 'Transactions Helios', 1);
+INSERT INTO modules
+VALUES (3, 'mail', 'Module Mail', 'Transactions Mail', 1);
 
 -- Création d'un groupe
-INSERT INTO authority_groups VALUES (1, 'Groupe de test', 1);
+INSERT INTO authority_groups
+VALUES (1, 'Groupe de test', 1);
 
 -- Création d'une collectivité
-INSERT INTO authority_types VALUES (1, NULL, 'Région');
-INSERT INTO authority_departments VALUES (1,'001','nom département');
-INSERT INTO authority_districts VALUES (1,1,'1','nom district');
-INSERT INTO authorities VALUES (1, 1, 1, 'Bourg-en-Bresse', NULL, NULL, '123456789', NULL, NULL, NULL, NULL, NULL, NULL, '001', '1', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, false);
-INSERT INTO modules_authorities VALUES (1, 1, 1);  -- Accès au module Actes
-INSERT INTO modules_authorities VALUES (2, 2, 1);  -- Accès au module Helios
-INSERT INTO modules_authorities VALUES (3, 3, 1);  -- Accès au module Mail
+INSERT INTO authority_types
+VALUES (1, NULL, 'Région');
+INSERT INTO authority_departments
+VALUES (1, '001', 'nom département');
+INSERT INTO authority_districts
+VALUES (1, 1, '1', 'nom district');
+INSERT INTO authorities
+VALUES (1, 1, 1, 'Bourg-en-Bresse', NULL, NULL, '123456789', NULL, NULL, NULL, NULL, NULL, NULL, '001', '1', 1, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL,
+        false);
+INSERT INTO modules_authorities
+VALUES (1, 1, 1); -- Accès au module Actes
+INSERT INTO modules_authorities
+VALUES (2, 2, 1); -- Accès au module Helios
+INSERT INTO modules_authorities
+VALUES (3, 3, 1);
+-- Accès au module Mail
 
--- Création d'un utilisateur
+-- Création d'un acte classification requete
+INSERT INTO actes_classification_requests
+VALUES (1, '2025-02-19 13:59:28.000000 +00:00', 1, '2019-08-28 22:00:00.000000 +00:00',
+        '0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D2277696E646F77732D31323532223F3E0A3C61637465733A5265746F7572436C617373696669636174696F6E20786D6C6E733A61637465733D22687474703A2F2F7777772E696E746572696575722E676F75762E66722F41435445532376312E312D32303034303231362220786D6C6E733A696E7365653D22687474703A2F2F786D6C2E696E7365652E66722F736368656D612220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E636522207873693A736368656D614C6F636174696F6E3D22687474703A2F2F7777772E696E746572696575722E676F75762E66722F41435445532376312E312D323030343032313620616374657376315F312E787364223E0A20203C61637465733A44617465436C617373696669636174696F6E3E323031392D30382D32393C2F61637465733A44617465436C617373696669636174696F6E3E0A20203C61637465733A4E61747572657341637465733E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2236222061637465733A4C6962656C6C653D22417574726573222061637465733A547970654162726567653D224155223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4155222061637465733A4C6962656C6C653D22417574726520646F63756D656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A202020203C2F61637465733A4E6174757265416374653E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2232222061637465733A4C6962656C6C653D2241637465732072E9676C656D656E746169726573222061637465733A547970654162726567653D224152223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4152222061637465733A4C6962656C6C653D22416374652072E9676C656D656E7461697265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4442222061637465733A4C6962656C6C653D2244E96261742064276F7269656E746174696F6E20647520706C616E206427616DE96E6167656D656E742065742064652064E976656C6F7070656D656E742064757261626C65222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4441222061637465733A4C6962656C6C653D2244E9636973696F6E20617272EA74616E74206C652070726F6A6574222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E20646520707265736372697074696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F444F222061637465733A4C6962656C6C653D22446F63756D656E742064276F7269656E746174696F6E2065742064276F626A6563746966222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4550222061637465733A4C6962656C6C653D22456E7175EA7465207075626C69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F5041222061637465733A4C6962656C6C653D2250726F6A6574206427616DE96E6167656D656E742065742064652064E976656C6F7070656D656E742064757261626C65222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F5250222061637465733A4C6962656C6C653D22526170706F7274206465207072E973656E746174696F6E222F3E0A202020203C2F61637465733A4E6174757265416374653E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2233222061637465733A4C6962656C6C653D22416374657320696E646976696475656C73222061637465733A547970654162726567653D224149223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4143222061637465733A4C6962656C6C653D224163636F7264206427756E65206175746F726974E92061646D696E697374726174697665222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4152222061637465733A4C6962656C6C653D224163637573E92064652072E963657074696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4149222061637465733A4C6962656C6C653D224163746520696E646976696475656C222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4147222061637465733A4C6962656C6C653D22416772E96D656E74206F752063657274696669636174222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4154222061637465733A4C6962656C6C653D224174746573746174696F6E20666F75726E696520706172206C276167656E74207075626C6963222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4154222061637465733A4C6962656C6C653D224174746573746174696F6E20666F75726E696520706172206C6520706F72746575722064652070726F6A6574222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4143222061637465733A4C6962656C6C653D224176656E616E7420617520636F6E7472617420646520726563727574656D656E742064276167656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4156222061637465733A4C6962656C6C653D2241766973222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4E43222061637465733A4C6962656C6C653D2241766973206465206372E96174696F6E2C20646520766163616E6365206F75206465207375707072657373696F6E20646520706F737465222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4341222061637465733A4C6962656C6C653D2241766973206465206C6120636F6D6D697373696F6E2061646D696E69737472617469766520706172697461697265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F434D222061637465733A4C6962656C6C653D2241766973206465206C6120636F6D6D697373696F6E206D6978746520706172697461697265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4156222061637465733A4C6962656C6C653D224176697320646520766163616E6365206427656D706C6F69222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4354222061637465733A4C6962656C6C653D2243616E646964617475726520737572206C6520706F73746520766163616E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F434F222061637465733A4C6962656C6C653D22436F6E76656E74696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F444E222061637465733A4C6962656C6C653D2244E9636973696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234315F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E20E97461626C697373616E74206C61206C6973746520646520706F7374657320E020706F7572766F6972222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4444222061637465733A4C6962656C6C653D2244656D616E6465222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4445222061637465733A4C6962656C6C653D2244656D616E6465206465206C276167656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4450222061637465733A4C6962656C6C653D22446F63756D656E742070686F746F677261706869717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234315F4943222061637465733A4C6962656C6C653D22496E666F726D6174696F6E2064752063656E7472652064652067657374696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F494E222061637465733A4C6962656C6C653D22496E736372697074696F6E20737572206C61206C697374652064276170746974756465222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4C45222061637465733A4C6962656C6C653D224C6574747265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234335F4C49222061637465733A4C6962656C6C653D224C6973746520646520706F7374657320E020706F7572766F6972222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F4E45222061637465733A4C6962656C6C653D224E6F74696365206578706C69636174697665222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F5050222061637465733A4C6962656C6C653D225069E8636520647520646F7373696572206465207065726D6973222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F504E222061637465733A4C6962656C6C653D22506C616E73222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F5045222061637465733A4C6962656C6C653D225072E973656E746174696F6E2064657320E97461747320696E69746961757820657420667574757273222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F5245222061637465733A4C6962656C6C653D22526170706F7274206427E974756465222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232325F5441222061637465733A4C6962656C6C653D225461626C656175222F3E0A202020203C2F61637465733A4E6174757265416374653E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2234222061637465733A4C6962656C6C653D22436F6E74726174732C20636F6E76656E74696F6E73206574206176656E616E7473222061637465733A547970654162726567653D224343223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4145222061637465733A4C6962656C6C653D2241637465206427656E676167656D656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4154222061637465733A4C6962656C6C653D224174746573746174696F6E20666F75726E696520706172206C276167656E74207075626C6963222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233335F414F222061637465733A4C6962656C6C653D224175746F7269736174696F6E2064276F636375706174696F6E20647520646F6D61696E65207075626C6963222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4143222061637465733A4C6962656C6C653D224176656E616E7420617520636F6E7472617420646520726563727574656D656E742064276167656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4143222061637465733A4C6962656C6C653D2241766973206427617070656C207075626C696320E020636F6E63757272656E6365222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4144222061637465733A4C6962656C6C653D22417669732064652064E96CE9676174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4156222061637465733A4C6962656C6C653D2241766973206465206C6120636F6D6D697373696F6E20636F6E73756C74617469766520646573207365727669636573207075626C696373206C6F63617578222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233305F4141222061637465733A4C6962656C6C653D2241766973206465206C276175746F726974E920636F6D70E974656E7465206465206C2745746174222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4156222061637465733A4C6962656C6C653D2241766973206475206A75727920646520636F6E636F757273222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4250222061637465733A4C6962656C6C653D22426F72646572656175206465732070726978222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4343222061637465733A4C6962656C6C653D22436168696572206465732063686172676573206465206C612064E96CE9676174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4150222061637465733A4C6962656C6C653D224361686965722064657320636C61757365732061646D696E6973747261746976657320706172746963756C69E8726573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F5450222061637465733A4C6962656C6C653D224361686965722064657320636C617573657320746563686E697175657320706172746963756C69E8726573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4354222061637465733A4C6962656C6C653D2243616E646964617475726520737572206C6520706F73746520766163616E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231355F4A55222061637465733A4C6962656C6C653D22436F706965206475206A7567656D656E74206427686F6D6F6C6F676174696F6E206465206C61207472616E73616374696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4352222061637465733A4C6962656C6C653D22436F757272696572732064652072656A6574206465732063616E64696461747572657320696E636F6D706CE8746573206F75206972726563657661626C6573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E206175746F726973616E7420E020706173736572206C6520636F6E74726174222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233315F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E206175746F726973616E74206C276163717569736974696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234325F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E206175746F726973616E74206C65207265636F7572732061757820636F6E747261637475656C73222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233325F4443222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E20636F6E73746174616E74206C612064E9736166666563746174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233325F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E2064652064E9636C617373656D656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231375F4345222061637465733A4C6962656C6C653D2244656D616E64652064652063617574696F6E6E656D656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4443222061637465733A4C6962656C6C653D22446F63756D656E7420636F6E747261637475656C222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2233305F4450222061637465733A4C6962656C6C653D22446F63756D656E7473207072E92D636F6E747261637475656C73222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231375F4741222061637465733A4C6962656C6C653D22476172616E746965206427656D7072756E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4950222061637465733A4C6962656C6C653D22496E7669746174696F6E20E0207072E973656E74657220756E65206F66667265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F494E222061637465733A4C6962656C6C653D22496E7669746174696F6E206465732063616E64696461747320E020736F756D697373696F6E6E6572222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F4D54222061637465733A4C6962656C6C653D224DE96D6F69726520746563686E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F4156222061637465733A4C6962656C6C653D224D6F64696669636174696F6E20647520636F6E74726174222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F4E52222061637465733A4C6962656C6C653D224E6F74696669636174696F6E2064752072656A657420646573206F6666726573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F5056222061637465733A4C6962656C6C653D2250726F63E8732076657262616C206465206C6120636F6D6D697373696F6E206427617070656C2064276F66667265206F75206475206A757279222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F5056222061637465733A4C6962656C6C653D2250726F63E8732076657262616C206465206C6120636F6D6D697373696F6E2064652064E96CE9676174696F6E2064652073657276696365207075626C6963222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F5241222061637465733A4C6962656C6C653D22526170706F7274206465206C6120636F6D6D697373696F6E206427617070656C2064276F66667265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231325F5253222061637465733A4C6962656C6C653D22526170706F7274206465206C6120636F6D6D697373696F6E2064652064E96CE9676174696F6E2064752073657276696365207075626C6963222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F5250222061637465733A4C6962656C6C653D22526170706F7274206465207072E973656E746174696F6E206465206C276163686574657572222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231315F4A55222061637465733A4C6962656C6C653D22526170706F7274206A757374696669616E74206C652063686F6978206475206D61726368E92C206C6573206D6F64616C6974E973206574206C612070726F63E96475726520646520706173736174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F5244222061637465733A4C6962656C6C653D225265676973747265206465732064E970F4747320646573206F6666726573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231375F5243222061637465733A4C6962656C6C653D2252E8676C656D656E7420646520636F6E636F757273222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F5243222061637465733A4C6962656C6C653D2252E8676C656D656E74206465206C6120636F6E73756C746174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2231305F4154222061637465733A4C6962656C6C653D2252656E736569676E656D656E74732C206174746573746174696F6E732065742064E9636C61726174696F6E7320666F75726E69657320706172206C27617474726962757461697265222F3E0A202020203C2F61637465733A4E6174757265416374653E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2235222061637465733A4C6962656C6C653D22446F63756D656E74732062756467E97461697265732065742066696E616E6369657273222061637465733A547970654162726567653D224246223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237315F414E222061637465733A4C6962656C6C653D2241757472657320616E6E657865732062756467E9746169726573222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237315F4347222061637465733A4C6962656C6C653D22436F6D7074652064652067657374696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237305F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4255222061637465733A4C6962656C6C653D22446F63756D656E742062756467E97461697265222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237315F4442222061637465733A4C6962656C6C653D22526170706F727420616E6E6578E92061752064E96261742064276F7269656E746174696F6E2062756467E97461697265222F3E0A202020203C2F61637465733A4E6174757265416374653E0A202020203C61637465733A4E6174757265416374652061637465733A436F64654E6174757265416374653D2231222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E73222061637465733A547970654162726567653D224445223E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234305F4143222061637465733A4C6962656C6C653D224176656E616E7420617520636F6E7472617420646520726563727574656D656E742064276167656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4442222061637465733A4C6962656C6C653D2244E96261742064276F7269656E746174696F6E20647520706C616E206427616DE96E6167656D656E742065742064652064E976656C6F7070656D656E742064757261626C65222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4441222061637465733A4C6962656C6C653D2244E9636973696F6E20617272EA74616E74206C652070726F6A6574222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232335F4941222061637465733A4C6962656C6C653D2244E9636C61726174696F6E206427696E74656E74696F6E206427616C69E96E6572222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F4445222061637465733A4C6962656C6C653D2244E96C6962E9726174696F6E222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F444F222061637465733A4C6962656C6C653D22446F63756D656E742064276F7269656E746174696F6E2065742064276F626A6563746966222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F4550222061637465733A4C6962656C6C653D22456E7175EA7465207075626C69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2239395F5345222061637465733A4C6962656C6C653D2246696368696572206465207369676E617475726520E96C656374726F6E69717565222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237355F504C222061637465733A4C6962656C6C653D22506C616E2064652066696E616E63656D656E742072656C6174696620E020756E652064656D616E646520646520666F6E647320646520636F6E636F757273206F752064652066696E616E63656D656E74222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F5041222061637465733A4C6962656C6C653D2250726F6A6574206427616DE96E6167656D656E742065742064652064E976656C6F7070656D656E742064757261626C65222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2237335F434F222061637465733A4C6962656C6C653D2250726F6A657420646520636F6E747261742061766563206C276F7267616E69736D6520726574656E75222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2234315F5241222061637465733A4C6962656C6C653D22526170706F7274206269656E6E616C20646573206176616E63656D656E7473206427E96368656C6F6E73222F3E0A2020202020203C61637465733A54797065504A4E6174757265416374652061637465733A436F646554797065504A3D2232315F5250222061637465733A4C6962656C6C653D22526170706F7274206465207072E973656E746174696F6E222F3E0A202020203C2F61637465733A4E6174757265416374653E0A20203C2F61637465733A4E61747572657341637465733E0A20203C61637465733A4D617469657265733E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22436F6D6D616E6465205075626C69717565223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D224D61726368E973207075626C696373222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D2244E96CE9676174696F6E2064652073657276696365207075626C6963222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22436F6E76656E74696F6E73206465204D616E646174222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D2241757472657320747970657320646520636F6E7472617473222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D225472616E73616374696F6E73202F70726F746F636F6C652064206163636F7264207472616E73616374696F6E6E656C222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D2241637465732072656C617469667320E0206C61206D61EE74726973652064276F6575767265222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2237222061637465733A4C6962656C6C653D22416374657320737065636961757820657420646976657273222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D22557262616E69736D65223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22446F63756D656E7473206420757262616E69736D6520222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D2241637465732072656C61746966732061752064726F69742064206F636375706174696F6E206F752064207574696C69736174696F6E2064657320736F6C73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D2244726F697420646520707265656D7074696F6E2075726261696E20222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22446F6D61696E652065742070617472696D6F696E65223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D224163717569736974696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D22416C69656E6174696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D224C6F636174696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D224C696D69746573207465727269746F7269616C6573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D224175747265732061637465732064652067657374696F6E20647520646F6D61696E65207075626C6963222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D224175747265732061637465732064652067657374696F6E20647520646F6D61696E65207072697665222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D22466F6E6374696F6E207075626C69717565223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22506572736F6E6E656C20746974756C61697265732065742073746167696169726573206465206C6120462E502E542E222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D22506572736F6E6E656C20636F6E747261637475656C222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22466F6E6374696F6E207075626C6971756520686F73706974616C69657265222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D224175747265732063617465676F7269657320646520706572736F6E6E656C73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D22526567696D6520696E64656D6E697461697265222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D22496E737469747574696F6E732065742076696520706F6C697469717565223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22456C656374696F6E206578656375746966222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D22466F6E6374696F6E6E656D656E742064657320617373656D626C656573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D2244657369676E6174696F6E20646520726570726573656E74616E7473222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D2244656C65676174696F6E20646520666F6E6374696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D2244656C65676174696F6E206465207369676E6174757265222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D22457865726369636520646573206D616E64617473206C6F63617578222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2237222061637465733A4C6962656C6C653D22496E746572636F6D6D756E616C697465222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2238222061637465733A4C6962656C6C653D224465636973696F6E206420657374657220656E206A757374696365222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D224C6962657274E973207075626C697175657320657420706F7572766F69727320646520706F6C696365223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22506F6C696365206D756E69636970616C65222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D22506F75766F697220647520707265736964656E7420647520636F6E7365696C2067656E6572616C222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22506F75766F697220647520707265736964656E7420647520636F6E7365696C20726567696F6E616C222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D22417574726573206163746573207265676C656D656E746169726573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D2241637465732070726973206175206E6F6D206465206C204574617420657420736F756D697320617520636F6E74726F6C6520686965726172636869717565222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2237222061637465733A4C6962656C6C653D2246696E616E636573206C6F63616C6573223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D224465636973696F6E73206275646765746169726573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D223130222061637465733A4C6962656C6C653D22446976657273222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D2246697363616C6974E9222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22456D7072756E7473222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D22496E74657276656E74696F6E732065636F6E6F6D6971756573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D2253756276656E74696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D22436F6E747269627574696F6E73206275646765746169726573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2237222061637465733A4C6962656C6C653D224176616E636573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2238222061637465733A4C6962656C6C653D22466F6E647320646520636F6E636F757273222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2239222061637465733A4C6962656C6C653D2250726973652064652070617274696369706174696F6E202853454D2C206574632E2E2E29222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2238222061637465733A4C6962656C6C653D22446F6D61696E657320646520636F6D706574656E63657320706172207468656D6573223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D22456E736569676E656D656E74222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D224169646520736F6369616C65222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D22566F69726965222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D22416D656E6167656D656E74206475207465727269746F697265222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2235222061637465733A4C6962656C6C653D22506F6C697469717565206465206C612076696C6C652D686162697461742D6C6F67656D656E74222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2236222061637465733A4C6962656C6C653D22456D706C6F692D666F726D6174696F6E2070726F66657373696F6E6E656C6C65222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2237222061637465733A4C6962656C6C653D225472616E73706F727473222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2238222061637465733A4C6962656C6C653D22456E7669726F6E6E656D656E74222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2239222061637465733A4C6962656C6C653D2243756C74757265222F3E0A202020203C2F61637465733A4D617469657265313E0A202020203C61637465733A4D617469657265312061637465733A436F64654D6174696572653D2239222061637465733A4C6962656C6C653D2241757472657320646F6D61696E657320646520636F6D706574656E636573223E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2231222061637465733A4C6962656C6C653D2241757472657320646F6D61696E657320646520636F6D706574656E6365732064657320636F6D6D756E6573222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2232222061637465733A4C6962656C6C653D2241757472657320646F6D61696E657320646520636F6D706574656E6365732064657320646570617274656D656E7473222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2233222061637465733A4C6962656C6C653D2241757472657320646F6D61696E657320646520636F6D706574656E6365732064657320726567696F6E73222F3E0A2020202020203C61637465733A4D617469657265322061637465733A436F64654D6174696572653D2234222061637465733A4C6962656C6C653D22566F657578206574206D6F74696F6E73222F3E0A202020203C2F61637465733A4D617469657265313E0A20203C2F61637465733A4D617469657265733E0A3C2F61637465733A5265746F7572436C617373696669636174696F6E3E');
 
-
--- INSERT INTO mail_annuaire (authority_id,mail_address) VALUES (1,'test@groupemail.fr');
\ No newline at end of file
+-- INSERT INTO mail_annuaire (authority_id,mail_address) VALUES (1,'test@groupemail.fr');
diff --git a/lib/JSONoutput.php b/lib/JSONoutput.php
index b6a4f2e1836acc5be42c898263d877fcb5a92808..65873197fc41f1fe4245bef9122e81fd9d57f9f6 100644
--- a/lib/JSONoutput.php
+++ b/lib/JSONoutput.php
@@ -10,7 +10,6 @@ class JSONoutput
     {
         $result['status'] = 'error';
         $result['error-message'] = $Errormessage;
-        ;
         $this->display($result);
         if (TESTING_ENVIRONNEMENT) {
             throw new Exception("Exit !");
@@ -22,7 +21,6 @@ class JSONoutput
     {
         $result['status'] = 'ok';
         $result['message'] = $message;
-        ;
         $this->display($result);
         if (TESTING_ENVIRONNEMENT) {
             throw new Exception("Exit !");
diff --git a/public.ssl/modules/actes/actes_create_pdf.php b/public.ssl/modules/actes/actes_create_pdf.php
index ce03c36137d5686d38186248dd52b26b44f50e39..d3a01e032db2e9a8825d0609d1e197b352fcb4cd 100644
--- a/public.ssl/modules/actes/actes_create_pdf.php
+++ b/public.ssl/modules/actes/actes_create_pdf.php
@@ -14,32 +14,30 @@ $id = Helpers :: getVarFromGet("trans_id");
 
 if (empty($id)) {
     $_SESSION["error"] = "Pas d'identifiant de transaction spécifié";
-    header("Location: " . Helpers::getLink("/modules/actes/index.php"));
-    exit();
+    header_wrapper("Location: " . Helpers::getLink("/modules/actes/index.php"));
+    exit_wrapper();
 }
 
-//FIXME : mettre ca dans un script d'initialisation ....
-
 // Instanciation du module courant
 $module = new Module();
 if (!$module->initByName("actes")) {
     $_SESSION["error"] = "Erreur d'initialisation du module";
-    header("Location: " . WEBSITE_SSL);
-    exit();
+    header_wrapper("Location: " . WEBSITE_SSL);
+    exit_wrapper();
 }
 
 $me = new User();
 
 if (!$me->authenticate()) {
     $_SESSION["error"] = "Échec de l'authentification";
-    header("Location: " . Helpers::getLink("connexion-status"));
-    exit();
+    header_wrapper("Location: " . Helpers::getLink("connexion-status"));
+    exit_wrapper();
 }
 
 if (!$module->isActive() || !$me->canAccess($module->get("name"))) {
     $_SESSION["error"] = "Accès refusé";
-    header("Location: " . WEBSITE_SSL);
-    exit();
+    header_wrapper("Location: " . WEBSITE_SSL);
+    exit_wrapper();
 }
 
 
@@ -47,8 +45,8 @@ $trans = new ActesTransaction();
 $trans->setId($id);
 if (! $trans->init()) {
     $_SESSION["error"] = "Erreur d'initialisation de la transaction.";
-    header("Location: " . Helpers::getLink("/modules/actes/index.php"));
-    exit();
+    header_wrapper("Location: " . Helpers::getLink("/modules/actes/index.php"));
+    exit_wrapper();
 }
 
 $envelope = new ActesEnvelope($trans->get("envelope_id"));
@@ -62,8 +60,8 @@ $permission = new ModulePermission($serviceUser, "actes");
 
 if (! $permission->canView($me, $owner)) {
     $_SESSION["error"] = "Accès refusé";
-    header("Location: " . Helpers::getLink("/modules/actes/index.php"));
-    exit();
+    header_wrapper("Location: " . Helpers::getLink("/modules/actes/index.php"));
+    exit_wrapper();
 }
 
 //passer les paramètre
diff --git a/public.ssl/modules/actes/actes_transac_create.php b/public.ssl/modules/actes/actes_transac_create.php
index aeb8f8bae826b4d10d11c2f7370f55d851d59da9..5c285766fb155a525a9f73a66b63d2e4f6177d27 100644
--- a/public.ssl/modules/actes/actes_transac_create.php
+++ b/public.ssl/modules/actes/actes_transac_create.php
@@ -15,11 +15,10 @@ use S2lowLegacy\Class\Module;
 use S2lowLegacy\Class\RgsConnexion;
 use S2lowLegacy\Class\User;
 use S2lowLegacy\Class\WorkerScript;
-use S2lowLegacy\Class\XMLHelper;
 use S2lowLegacy\Lib\ObjectInstancier;
 use S2lowLegacy\Lib\SQLQuery;
 
-$tooManyAnnexes =  error_get_last()["message"] == "Maximum number of allowable file uploads has been exceeded";
+$tooManyAnnexes = error_get_last()["message"] == "Maximum number of allowable file uploads has been exceeded";
 
 list($objectInstancier, $sqlQuery) = \S2lowLegacy\Class\LegacyObjectsManager::getLegacyObjectInstancier()
     ->getArray([ObjectInstancier::class, SQLQuery::class]);
@@ -27,75 +26,90 @@ list($objectInstancier, $sqlQuery) = \S2lowLegacy\Class\LegacyObjectsManager::ge
 $errorMsg = "";
 $extraRedirect = "";
 if (empty($_POST)) {     // La taille est déterminée dans la conf apache par post_max_size, qui serait récupérable par ini_get_all()["post_max_size"]["local_value"] non par ACTES_ARCHIVE_MAX_SIZE.
-    Helpers :: returnAndExit(1, "La taille totale des fichiers est trop importante (max : " . ACTES_ARCHIVE_MAX_SIZE . ")", Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "La taille totale des fichiers est trop importante (max : " . ACTES_ARCHIVE_MAX_SIZE . ")",
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 if ($tooManyAnnexes) {
-    Helpers :: returnAndExit(1, "Le nombre d'annexes est trop important (max : " . ini_get_all()["max_file_uploads"]["local_value"] . ")", Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Le nombre d'annexes est trop important (max : " . ini_get_all()["max_file_uploads"]["local_value"] . ")",
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 // Instanciation du module courant
 $module = new Module();
 if (!$module->initByName("actes")) {
-    Helpers :: returnAndExit(1, "Erreur d'initialisation du module", WEBSITE_SSL);
+    Helpers:: returnAndExit(1, "Erreur d'initialisation du module", WEBSITE_SSL);
 }
 
 $me = new User();
 
 if (!$me->authenticate()) {
-    Helpers :: returnAndExit(1, "Échec de l'authentification", Helpers::getLink("connexion-status"));
+    Helpers:: returnAndExit(1, "Échec de l'authentification", Helpers::getLink("connexion-status"));
 }
 
-if ($me->isGroupAdminOrSuper() || !$module->isActive() || ! $me->checkDroit($module->get("name"), 'CS')) {
-    Helpers :: returnAndExit(1, "Accès refusé", WEBSITE_SSL);
+if ($me->isGroupAdminOrSuper() || !$module->isActive() || !$me->checkDroit($module->get("name"), 'CS')) {
+    Helpers:: returnAndExit(1, "Accès refusé", WEBSITE_SSL);
 }
 
 if ($module->getParam("paper") == "on") {
-    Helpers :: returnAndExit(1, "Mode « papier » actif. Accès interdit.", Helpers::getLink("/modules/actes/"));
+    Helpers:: returnAndExit(1, "Mode « papier » actif. Accès interdit.", Helpers::getLink("/modules/actes/"));
 }
 
 $must_signed = Helpers::getVarFromPost("must_signed", true);
 
 $rgsConnexion = new RgsConnexion();
-if (! $must_signed && ! $rgsConnexion->isRgsConnexion()) {
-    Helpers :: returnAndExit(1, "La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}", Helpers::getLink("/modules/actes/"));
+if (!$must_signed && !$rgsConnexion->isRgsConnexion()) {
+    Helpers:: returnAndExit(
+        1,
+        "La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}",
+        Helpers::getLink("/modules/actes/")
+    );
 }
 
 
 $myAuthority = new Authority($me->get("authority_id"));
 
 // Recuperation des variables du POST
-$nature_code = Helpers :: getVarFromPost("nature_code", true);
-$en_attente = Helpers :: getVarFromPost("en_attente", true);
+$nature_code = Helpers:: getVarFromPost("nature_code", true);
+$en_attente = Helpers:: getVarFromPost("en_attente", true);
 
 for ($i = 1; $i <= 5; $i++) {
-    ${ "classif" . $i } = Helpers :: getIntFromPost("classif" . $i, true, true);
+    ${"classif" . $i} = Helpers:: getIntFromPost("classif" . $i, true, true);
 }
 
-$number = Helpers :: getVarFromPost("number", true);
+$number = Helpers:: getVarFromPost("number", true);
 
 // Vérification que le numéro respecte la regexp
 if (!preg_match(ActesTransaction::NUMBER_REGEXP, $number)) {
-    Helpers :: returnAndExit(1, "Le numéro n'est pas correct", Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Le numéro n'est pas correct",
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
-$decision_date = Helpers :: getVarFromPost("decision_date", true);
+$decision_date = Helpers:: getVarFromPost("decision_date", true);
 
 if (strtotime($decision_date) > time()) {
-    Helpers :: returnAndExit(1, "La date de décision est une date dans le futur", WEBSITE_SSL);
+    Helpers:: returnAndExit(1, "La date de décision est une date dans le futur", WEBSITE_SSL);
 }
 
-$document_papier =  Helpers :: getVarFromPost("document_papier", true) ? 1 : 0;
+$document_papier = Helpers:: getVarFromPost("document_papier", true) ? 1 : 0;
 
-$subject = Helpers :: getVarFromPost("subject", true, true);
+$subject = Helpers:: getVarFromPost("subject", true, true);
 
 try {
-    $batchFileId = Helpers :: getIntFromPost("batchfile", true);
+    $batchFileId = Helpers:: getIntFromPost("batchfile", true);
 } catch (Exception $exception) {
-    Helpers :: returnAndExit(1, $exception->getMessage(), WEBSITE_SSL);
+    Helpers:: returnAndExit(1, $exception->getMessage(), WEBSITE_SSL);
 }
 
 
-
 if (isset($_FILES['acte_pdf_file'])) {
     $actePDFFile = Helpers::getFiles('acte_pdf_file', true);
 } else {
@@ -117,9 +131,9 @@ $type_acte = Helpers::getVarFromPost('type_acte', true);
 $type_pj = Helpers::getVarFromPost('type_pj', true);
 
 
-$auto_broadcast_email = Helpers :: getVarFromPost("show_broadcast_email", true);
-$broadcast_send_sources = Helpers :: getVarFromPost("send_sources", true);
-$broadcast_string = Helpers :: getVarFromPost("broadcast_email", true);
+$auto_broadcast_email = Helpers:: getVarFromPost("show_broadcast_email", true);
+$broadcast_send_sources = Helpers:: getVarFromPost("send_sources", true);
+$broadcast_string = Helpers:: getVarFromPost("broadcast_email", true);
 
 
 if ($broadcast_string) {
@@ -128,7 +142,7 @@ if ($broadcast_string) {
     $broadcast_emails = false;
 }
 
-$processNextBatch = Helpers :: getVarFromPost("process_next_batch_file", true);
+$processNextBatch = Helpers:: getVarFromPost("process_next_batch_file", true);
 
 $processNextBatch = (isset($processNextBatch) && $processNextBatch == "on") ? true : false;
 $extraRedirect = "";
@@ -143,7 +157,7 @@ if (isset($batchFileId) && is_numeric($batchFileId)) {
             $owner = new User($zeBatch->get("user_id"));
             $owner->init();
 
-          // Vérification des permissions sur le lot
+            // Vérification des permissions sur le lot
             if (
                 ($me->isAuthorityAdmin() && $me->get("authority_id") == $owner->get("authority_id")) ||
                 ($me->getId() == $owner->getId())
@@ -154,18 +168,22 @@ if (isset($batchFileId) && is_numeric($batchFileId)) {
         }
     }
 
-  // Les vérifs ont échouées
+    // Les vérifs ont échouées
     if (!$batchMode) {
-        Helpers :: returnAndExit(1, "Échec de la transaction en mode lot.", Helpers::getLink("/modules/actes/actes_batch_handle.php"));
+        Helpers:: returnAndExit(
+            1,
+            "Échec de la transaction en mode lot.",
+            Helpers::getLink("/modules/actes/actes_batch_handle.php")
+        );
     }
 }
 
 $env = new ActesEnvelope();
 $trans = new ActesTransaction();
-$transNatures = ActesTransaction :: getTransactionNaturesIdDescr();
+$transNatures = ActesTransaction:: getTransactionNaturesIdDescr();
 
 // Définition des adresses de retour
-$retMail = array ();
+$retMail = array();
 $retMail[] = ACTES_TDT_MAIL_ADDRESS;
 
 if ($me->get("email")) {
@@ -208,15 +226,15 @@ $trans->setEnAttente($en_attente);
 
 $classification = array();
 for ($i = 1; $i <= 5; $i++) {
-    $trans->set("classif" . $i, ${ "classif" . $i });
-    $classification[] = ${ "classif" . $i };
+    $trans->set("classif" . $i, ${"classif" . $i});
+    $classification[] = ${"classif" . $i};
 }
 
 $actesClassificationCodesSQL = new ActesClassificationCodesSQL($sqlQuery);
 $classification_description = $actesClassificationCodesSQL->getDescription($myAuthority->getId(), $classification);
 $trans->set("classification_string", $classification_description);
 
-$trans->set("classification_date", ActesClassification :: getLastRevisionDate($myAuthority->getId()));
+$trans->set("classification_date", ActesClassification:: getLastRevisionDate($myAuthority->getId()));
 
 
 $trans->set("decision_date", $decision_date);
@@ -230,14 +248,17 @@ $trans->set("broadcasted", 'FALSE');
 
 // Vérification qu'une transaction ayant le même numéro interne n'existe pas déjà
 if (!$trans->isUnique($myAuthority->getId())) {
-    Helpers :: returnAndExit(1, "Un acte portant le même numéro interne existe déjà dans la base de données.\nIl faut peut-être ajouter un suffixe au numéro.", Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Un acte portant le même numéro interne existe déjà dans la base de données.\nIl faut peut-être ajouter un suffixe au numéro.",
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 // Destination de création des fichiers
 $dest = $env->get("siren") . "/" . $trans->get("number") . "/";
 
 
-
 $trans->set("destDir", $dest);
 $env->set("destDir", $dest);
 
@@ -248,7 +269,11 @@ $fileImportError = false;
 $uploader = new FileUploader();
 
 if (!$batchMode && empty($actePDFFile)) {
-    Helpers:: returnAndExit(1, "Aucun fichier acte n'a été posté ", Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Aucun fichier acte n'a été posté ",
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 // Validation du type des fichiers uploadés
@@ -258,15 +283,19 @@ if (isset($actePDFFile) || $batchMode) {
         $acteFilePath = $zeBatchFile->getAbsoluteFilePath();
         $acteFileName = $zeBatchFile->getDisplayName();
     } else {
-        if (! $uploader->verifOK("acte_pdf_file")) {
-            Helpers :: returnAndExit(1, "Erreur lors de la récéption du fichier : " . $uploader->getLastError(), Helpers::getLink("/modules/actes/actes_transac_add.php"));
+        if (!$uploader->verifOK("acte_pdf_file")) {
+            Helpers:: returnAndExit(
+                1,
+                "Erreur lors de la récéption du fichier : " . $uploader->getLastError(),
+                Helpers::getLink("/modules/actes/actes_transac_add.php")
+            );
         }
         $acteFilePath = $actePDFFile["tmp_name"];
         $acteFileName = $actePDFFile["name"];
     }
 
     if (empty($type_acte)) {
-        Helpers :: returnAndExit(
+        Helpers:: returnAndExit(
             1,
             "Erreur lors de la réception du fichier $acteFileName : typologie absente",
             Helpers::getLink("/modules/actes/actes_transac_add.php")
@@ -275,12 +304,12 @@ if (isset($actePDFFile) || $batchMode) {
 
     if (empty($type_acte)) {
         $correspondance_nature_type = array(
-          '1' => '99_DE',
-          '2' => '99_AR',
-          '3' => '99_AI',
-          '4' => '99_DC',
-          '5' => '99_BU',
-          '6' => '99_AU',
+            '1' => '99_DE',
+            '2' => '99_AR',
+            '3' => '99_AI',
+            '4' => '99_DC',
+            '5' => '99_BU',
+            '6' => '99_AU',
         );
         $type_acte = $correspondance_nature_type[$nature_code];
     }
@@ -290,7 +319,7 @@ if (isset($actePDFFile) || $batchMode) {
         $errorMsg .= "Erreur de validation du fichier de l'acte :\n" . $trans->getErrorMsg() . "\n";
         $fileImportError = true;
     } else {
-      // Ajout de la signature si présente
+        // Ajout de la signature si présente
         $signFile = null;
         if ($batchMode) {
             $sign = $zeBatchFile->get("signature");
@@ -299,7 +328,7 @@ if (isset($actePDFFile) || $batchMode) {
                 $readFile = false;
             }
         } else {
-            if (isset($actePDFFileSign["tmp_name"]) && is_uploaded_file($actePDFFileSign["tmp_name"])) {
+            if (isset($actePDFFileSign["tmp_name"]) && is_uploaded_file_wrapper($actePDFFileSign["tmp_name"])) {
                 $signFile = $actePDFFileSign["tmp_name"];
                 $readFile = true;
             }
@@ -307,7 +336,8 @@ if (isset($actePDFFile) || $batchMode) {
 
         if ($signFile) {
             if (!$trans->addActeSign($signFile, $readFile)) {
-                $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteFileName . " :\n" . $trans->getErrorMsg() . "\n";
+                $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteFileName . " :\n" . $trans->getErrorMsg(
+                ) . "\n";
                 $fileImportError = true;
             }
         }
@@ -316,17 +346,21 @@ if (isset($actePDFFile) || $batchMode) {
 
 // Fichiers des pièces jointes
 if (isset($acteAttachments)) {
-    if (! $uploader->verifOKAll("acte_attachments")) {
-        Helpers :: returnAndExit(1, "Erreur lors de la réception du fichier : " . $uploader->getLastError(), Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    if (!$uploader->verifOKAll("acte_attachments")) {
+        Helpers:: returnAndExit(
+            1,
+            "Erreur lors de la réception du fichier : " . $uploader->getLastError(),
+            Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+        );
     }
 
     for ($i = 0; $i < count($acteAttachments["tmp_name"]); $i++) {
-        if (! mb_strlen($acteAttachments["tmp_name"][$i])) {
+        if (!mb_strlen($acteAttachments["tmp_name"][$i])) {
             continue;
         }
 
         if (empty($type_pj[$i])) {
-            Helpers :: returnAndExit(
+            Helpers:: returnAndExit(
                 1,
                 "Erreur lors de la réception du fichier annexe {$acteAttachments["name"][$i]} : typologie absente",
                 Helpers::getLink("/modules/actes/actes_transac_add.php")
@@ -351,10 +385,15 @@ if (isset($acteAttachments)) {
             $errorMsg .= "Erreur de validation d'un fichier de pièce jointe :\n" . $trans->getErrorMsg() . "\n";
             $fileImportError = true;
         } else {
-          // Ajout de la signature si présente
-            if (isset($acteAttachmentsSign["tmp_name"][$i]) && is_uploaded_file($acteAttachmentsSign["tmp_name"][$i])) {
+            // Ajout de la signature si présente
+            if (
+                isset($acteAttachmentsSign["tmp_name"][$i]) && is_uploaded_file_wrapper(
+                    $acteAttachmentsSign["tmp_name"][$i]
+                )
+            ) {
                 if (!$trans->addAttachmentSign($acteAttachmentsSign["tmp_name"][$i])) {
-                    $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteAttachments["name"][$i] . " :\n" . $trans->getErrorMsg() . "\n";
+                    $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteAttachments["name"][$i] . " :\n" . $trans->getErrorMsg(
+                    ) . "\n";
                     $fileImportError = true;
                 }
             }
@@ -364,13 +403,17 @@ if (isset($acteAttachments)) {
 
 
 if ($fileImportError) {
-    Helpers :: returnAndExit(1, $errorMsg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(1, $errorMsg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
 }
 
 // Génération du fichier XML de l'acte
 $xml_name = $trans->getStdFileName($env, false);
 if (!$trans->generateMessageXMLFile($xml_name)) {
-    Helpers :: returnAndExit(1, "Erreur lors de la génération de l'acte : " . $trans->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Erreur lors de la génération de l'acte : " . $trans->getErrorMsg(),
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 $env->addTransaction($trans);
@@ -382,16 +425,29 @@ $serialNumber = $actesEnvelopeSerial->getNext($authority_id);
 
 // Génération du fichier XML de l'enveloppe
 if (!$env->generateEnvelopeXMLFile($serialNumber)) {
-    Helpers :: returnAndExit(1, "Erreur lors de la génération de l'enveloppe. " . $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Erreur lors de la génération de l'enveloppe. " . $env->getErrorMsg(),
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 // Création de l'archive .tar.gz
 if (!$env->generateArchiveFile()) {
-    Helpers :: returnAndExit(1, "Erreur lors de la génération de l'archive.\n" . $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "Erreur lors de la génération de l'archive.\n" . $env->getErrorMsg(),
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 if (!$env->checkArchiveSize()) {
-    Helpers :: returnAndExit(1, "la taille d'archive générée n'est pas conforme. filename=" . $env->get("file_path") . "\n" . $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(
+        1,
+        "la taille d'archive générée n'est pas conforme. filename=" . $env->get("file_path") . "\n" . $env->getErrorMsg(
+        ),
+        Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect
+    );
 }
 
 /*if (!$env->checkArchiveSanity()) {
@@ -405,11 +461,11 @@ $env->purgeFiles();
 
 if (!$env->save()) {
     $msg = "Erreur lors de l'enregistrement de l'enveloppe :\n" . $env->getErrorMsg();
-    if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+    if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
 
-    Helpers :: returnAndExit(1, $msg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(1, $msg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
 }
 
 $trans->set("envelope_id", $env->getId());
@@ -421,26 +477,26 @@ if ($must_signed) {
 
 if (!$trans->save()) {
     $msg = "Erreur lors de l'enregistrement de la transaction :\n" . $trans->getErrorMsg();
-    if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+    if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
 
     $env->deleteArchiveFile();
     $env->delete();
-    Helpers :: returnAndExit(1, $msg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
+    Helpers:: returnAndExit(1, $msg, Helpers::getLink("/modules/actes/actes_transac_add.php") . $extraRedirect);
 }
 
 
-  $msg = "Création de l'enveloppe n°" . $env->getId() . ". Résultat ok.";
-if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
+$msg = "Création de l'enveloppe n°" . $env->getId() . ". Résultat ok.";
+if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
     $msg .= "\nErreur de journalisation.";
 }
 
-  // Message réservé à l'appel via API
-  // Id de la transaction créée
-  $apiMsg = $trans->getId() . "\n";
+// Message réservé à l'appel via API
+// Id de la transaction créée
+$apiMsg = $trans->getId() . "\n";
 
-  $nextBatchFileId = null;
+$nextBatchFileId = null;
 if ($batchMode) {
     if ($processNextBatch) {
         $nextBatchFileId = $zeBatch->getNextUnprocessedId($zeBatchFile->getId());
@@ -459,7 +515,7 @@ if ($batchMode) {
     if (!$zeBatchFile->save()) {
         $msg .= "\nErreur lors de la cloture du fichier de lot.";
     } else {
-      // Suppression physique du fichier
+        // Suppression physique du fichier
         if (!$zeBatchFile->deleteFile()) {
             $msg .= "\nErreur lors de la suppression du fichier de lot.";
         }
@@ -478,8 +534,18 @@ if ($info_actes['last_status_id'] == ActesStatusSQL::STATUS_POSTE) {
 }
 
 if ($nextBatchFileId) {
-    Helpers :: returnAndExit(0, $msg, Helpers::getLink("/modules/actes/actes_transac_add.php?batchfile=") . $nextBatchFileId, $apiMsg);
+    Helpers:: returnAndExit(
+        0,
+        $msg,
+        Helpers::getLink("/modules/actes/actes_transac_add.php?batchfile=") . $nextBatchFileId,
+        $apiMsg
+    );
 } else {
-    Helpers :: purgeTempSession();
-    Helpers :: returnAndExit(0, $msg, Helpers::getLink("/modules/actes/actes_transac_show.php?id=") . $trans->getId(), $apiMsg);
+    Helpers:: purgeTempSession();
+    Helpers:: returnAndExit(
+        0,
+        $msg,
+        Helpers::getLink("/modules/actes/actes_transac_show.php?id=") . $trans->getId(),
+        $apiMsg
+    );
 }
diff --git a/public.ssl/modules/actes/actes_transac_get_document.php b/public.ssl/modules/actes/actes_transac_get_document.php
index 8b4ba37f2dd221bbd9da3c5c9fcdb682dd286308..31311a551c6d3f53fb32292d6efa0cf6392cccf3 100644
--- a/public.ssl/modules/actes/actes_transac_get_document.php
+++ b/public.ssl/modules/actes/actes_transac_get_document.php
@@ -4,21 +4,21 @@ use S2lowLegacy\Class\Helpers;
 use S2lowLegacy\Class\Module;
 use S2lowLegacy\Class\User;
 
-header("Content-type: text/plain");
+header_wrapper("Content-type: text/plain");
 
 // Instanciation du module courant
 $module = new Module();
-if (! $module->initByName("actes")) {
+if (!$module->initByName("actes")) {
     Helpers::returnAndExit(1, "Erreur d'initialisation du module", WEBSITE_SSL);
 }
 
 $me = new User();
 
-if (! $me->authenticate()) {
+if (!$me->authenticate()) {
     Helpers::returnAndExit(1, "Échec de l'authentification", Helpers::getLink("connexion-status"));
 }
 
-if ($me->isSuper() || ! $module->isActive() || ! $me->canAccess($module->get("name"))) {
+if ($me->isSuper() || !$module->isActive() || !$me->canAccess($module->get("name"))) {
     Helpers::returnAndExit(1, "Accès refusé", WEBSITE_SSL);
 }
 
@@ -29,9 +29,9 @@ if ($unique_id) {
     $transId = ActesTransaction::getTransactionFromUniqueId($unique_id);
 }
 
-if (! $transId) {
+if (!$transId) {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 $zeTrans = new ActesTransaction();
@@ -42,7 +42,7 @@ if ($zeTrans->init()) {
     $owner->init();
 } else {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 if ($zeTrans->get("type") == 1) {
@@ -55,5 +55,5 @@ if ($zeTrans->get("type") == 1) {
     }
 } else {
     $envId = $zeTrans->get("envelope_id");
-    header("Location: actes_download_file.php?env=$envId");
+    header_wrapper("Location: actes_download_file.php?env=$envId");
 }
diff --git a/public.ssl/modules/actes/actes_transac_get_files_list.php b/public.ssl/modules/actes/actes_transac_get_files_list.php
index 20db648b9409c3552fcb082add0b6c679b954af0..8051f219346094695ed17e3d34acd00bdbfcc695 100644
--- a/public.ssl/modules/actes/actes_transac_get_files_list.php
+++ b/public.ssl/modules/actes/actes_transac_get_files_list.php
@@ -9,19 +9,18 @@ use S2lowLegacy\Class\User;
 $module = new Module();
 if (! $module->initByName('actes')) {
     echo "KO\nErreur d'initialisation du module";
-    exit();
+    exit_wrapper();
 }
-
 $me = new User();
 
 if (! $me->authenticate()) {
     echo "KO\nÉchec de l'authentification";
-    exit();
+    exit_wrapper();
 }
 
 if ($me->isGroupAdminOrSuper() || ! $module->isActive() || !$me->canAccess($module->get('name'))) {
     echo "KO\nAccès refusé";
-    exit();
+    exit_wrapper();
 }
 
 $myAuthority = new Authority($me->get('authority_id'));
@@ -40,7 +39,7 @@ if (! empty($transId)) {
     $zeTrans->setId($transId);
 } else {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 if ($zeTrans->init()) {
@@ -48,13 +47,13 @@ if ($zeTrans->init()) {
     $owner->init();
 } else {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 $zeEnv = new ActesEnvelope($zeTrans->get('envelope_id'));
 if (! $zeEnv->init()) {
     echo "KO\nEnveloppe invalide.";
-    exit();
+    exit_wrapper();
 }
 
 // Vérification des permissions spécifiques à la transaction
@@ -67,7 +66,7 @@ if (! $me->isSuper()) {
         ! ($me->isArchivistFor($owner->get('authority_id')))
     ) {
         echo "KO\nAccès refusé";
-        exit();
+        exit_wrapper();
     }
 }
 
@@ -82,7 +81,7 @@ foreach ($workflow as $stage) {
 }
 if (! $has_file) {
     echo "KO\nPas d'acquittement recu";
-    exit();
+    exit_wrapper();
 }
 
 
diff --git a/public.ssl/modules/actes/actes_transac_get_status.php b/public.ssl/modules/actes/actes_transac_get_status.php
index a356f2389d14f309e53d9535111604d22673aa51..1e8e766b08a51729c42e85864d94260987bdc0cb 100644
--- a/public.ssl/modules/actes/actes_transac_get_status.php
+++ b/public.ssl/modules/actes/actes_transac_get_status.php
@@ -9,19 +9,19 @@ use S2lowLegacy\Class\User;
 $module = new Module();
 if (! $module->initByName('actes')) {
     echo "KO\nErreur d'initialisation du module";
-    exit();
+    exit_wrapper();
 }
 
 $me = new User();
 
 if (! $me->authenticate()) {
     echo "KO\nÉchec de l'authentification";
-    exit();
+    exit_wrapper();
 }
 
 if ($me->isGroupAdminOrSuper() || ! $module->isActive() || !$me->canEdit($module->get('name'))) {
     echo "KO\nAccès refusé";
-    exit();
+    exit_wrapper();
 }
 
 $myAuthority = new Authority($me->get('authority_id'));
@@ -40,7 +40,7 @@ if (! empty($transId)) {
     $zeTrans->setId($transId);
 } else {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 if ($zeTrans->init()) {
@@ -48,13 +48,13 @@ if ($zeTrans->init()) {
     $owner->init();
 } else {
     echo "KO\nNuméro de transaction invalide.";
-    exit();
+    exit_wrapper();
 }
 
 $zeEnv = new ActesEnvelope($zeTrans->get('envelope_id'));
 if (! $zeEnv->init()) {
     echo "KO\nEnveloppe invalide.";
-    exit();
+    exit_wrapper();
 }
 
 // Vérification des permissions spécifiques à la transaction
@@ -66,7 +66,7 @@ if (
     ! $me->isArchivistFor($owner->get('authority_id'))
 ) {
         echo "KO\nAccès refusé";
-        exit();
+    exit_wrapper();
 }
 
 // Récupération statut
diff --git a/public.ssl/modules/actes/actes_transac_post_confirm_api.php b/public.ssl/modules/actes/actes_transac_post_confirm_api.php
index 1e4ce97fb2570fa7d337e67869f0213f213ba4ee..a850fbd986d9a57ac2d640c835ce649395120597 100644
--- a/public.ssl/modules/actes/actes_transac_post_confirm_api.php
+++ b/public.ssl/modules/actes/actes_transac_post_confirm_api.php
@@ -28,13 +28,13 @@ list($workerScript, $actesTransactionsSQL, $actesScriptHelper, $connexion ) = Le
 $actionHtml = '';
 
 
-function return_error_api($error_message): never
+function return_error_api($error_message)
 {
     $return_error = Helpers :: getVarFromGet('url_return');
     $return_error = str_replace('%%ERROR%%', 1, $return_error);
     $return_error = str_replace('%%MESSAGE%%', $error_message, $return_error);
-    header("Location:  $return_error");
-    exit;
+    header_wrapper("Location:  $return_error");
+    exit_wrapper();
 }
 
 
@@ -104,5 +104,5 @@ $return_ok = Helpers :: getVarFromGet('url_return');
 $return_ok = str_replace('%%ERROR%%', 0, $return_ok);
 $return_ok = str_replace('%%MESSAGE%%', '', $return_ok);
 
-header("Location:  $return_ok");
-exit;
+header_wrapper("Location:  $return_ok");
+exit_wrapper();
diff --git a/public.ssl/modules/actes/actes_transac_post_confirm_api_multi.php b/public.ssl/modules/actes/actes_transac_post_confirm_api_multi.php
index 15fa11e6458dae0b77c759cf3cae04d559802aab..440f156e959159f878771180ada783382fecf056 100644
--- a/public.ssl/modules/actes/actes_transac_post_confirm_api_multi.php
+++ b/public.ssl/modules/actes/actes_transac_post_confirm_api_multi.php
@@ -35,7 +35,7 @@ list(
 $actionHtml = "";
 
 
-function return_error_api($error_message)
+function return_error_api_api_multi($error_message)
 {
     $return_error = Helpers :: getVarFromGet('url_return') ?: WEBSITE_SSL;
     header_wrapper("Location:  $return_error");
@@ -45,28 +45,30 @@ function return_error_api($error_message)
 // Instanciation du module courant
 $module = new Module();
 if (!$module->initByName('actes')) {
-    return_error_api("Erreur d'intialisation du module");
+    return_error_api_api_multi("Erreur d'intialisation du module");
 }
 
 $connexion = new Connexion();
 $me = new User();
 
 if (!$me->authenticate()) {
-    return_error_api("Échec de l'authentification");
+    return_error_api_api_multi("Échec de l'authentification");
 }
 
 if (!$module->isActive() || !$me->checkDroit($module->get('name'), 'TT')) {
-    return_error_api('Accès refusé');
+    return_error_api_api_multi('Accès refusé');
 }
 
 
 $rgsConnexion = new RgsConnexion();
 if (! $rgsConnexion->isRgsConnexion()) {
-    return_error_api("La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}");
+    return_error_api_api_multi(
+        "La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}"
+    );
 }
 
 if (empty($_GET['id'])) {
-    return_error_api("Pas d'identifiant de transaction spécifié");
+    return_error_api_api_multi("Pas d'identifiant de transaction spécifié");
 }
 
 if (is_array($_GET['id'])) {
diff --git a/public.ssl/modules/actes/actes_transac_reponse_create.php b/public.ssl/modules/actes/actes_transac_reponse_create.php
index f663e973abed99f8f11a83cc769cd9197f886fa6..a28461f32172dba7f12f6cacc6baa6ce9b6d3bb9 100644
--- a/public.ssl/modules/actes/actes_transac_reponse_create.php
+++ b/public.ssl/modules/actes/actes_transac_reponse_create.php
@@ -12,14 +12,20 @@ use S2lowLegacy\Class\WorkerScript;
 
 $errorMsg = "";
 
-function sortir_atrc($message, $api)
-{
-    global $related_id;
-    if ($api) {
-        echo "KO : " . $message;
-        exit;
-    } else {
-        Helpers :: returnAndExit(1, $message, Helpers::getLink("/modules/actes/actes_transac_repondre.php?id=$related_id"));
+if (!function_exists('sortir_atrc')) {
+    function sortir_atrc($message, $api)
+    {
+        global $related_id;
+        if ($api) {
+            echo "KO : " . $message;
+            exit;
+        } else {
+            Helpers:: returnAndExit(
+                1,
+                $message,
+                Helpers::getLink("/modules/actes/actes_transac_repondre.php?id=$related_id")
+            );
+        }
     }
 }
 
@@ -35,7 +41,7 @@ if ($api) {
 // Instanciation du module courant
 $module = new Module();
 if (!$module->initByName("actes")) {
-     sortir_atrc("Erreur d'initialisation du module", $api);
+    sortir_atrc("Erreur d'initialisation du module", $api);
 }
 
 $me = new User();
@@ -67,7 +73,7 @@ $type_acte = Helpers::getVarFromPost('type_acte', true);
 $type_pj = Helpers::getVarFromPost('type_pj', true);
 
 if (empty($type_acte)) {
-    Helpers :: returnAndExit(
+    Helpers:: returnAndExit(
         1,
         "Erreur lors de la réception du fichier : typologie absente",
         Helpers::getLink("/modules/actes/actes_transac_reponse.php?id=$related_id")
@@ -87,10 +93,8 @@ if (empty($type_acte)) {
 }
 
 
-
-
 $type_transaction = $related_trans->get("type");
-$type_envoie = Helpers :: getVarFromPost("type_envoie", true);
+$type_envoie = Helpers:: getVarFromPost("type_envoie", true);
 
 $actePDFFile = $_FILES["acte_pdf_file"];
 if (isset($_FILES["acte_pdf_file_sign"])) {
@@ -114,7 +118,7 @@ if (isset($_FILES["acte_attachments_sign"])) {
 $env = new ActesEnvelope();
 $trans = new ActesTransaction();
 
-$retMail = array ();
+$retMail = array();
 $retMail[] = ACTES_TDT_MAIL_ADDRESS;
 
 if ($me->get("email")) {
@@ -150,7 +154,7 @@ $trans->set("type_reponse", $type_envoie);
 $trans->set("user_id", $related_trans->get('user_id'));
 $trans->set("authority_id", $related_trans->get('authority_id'));
 $trans->set("classification", $related_trans->get('classification'));
-$trans->set("classification_date", $related_trans->get('classification_date'));
+$trans->set("classification_date", Helpers::getANSIDateFromBDDDate($related_trans->get('classification_date')));
 $trans->set("unique_id", $related_trans->get('unique_id'));
 
 
@@ -166,11 +170,11 @@ $fileImportError = false;
 // Validation du type des fichiers uploadés
 // Fichier de l'acte
 if (isset($actePDFFile)) {
-    if (is_uploaded_file($actePDFFile["tmp_name"])) {
+    if (is_uploaded_file_wrapper($actePDFFile["tmp_name"])) {
         $acteFilePath = $actePDFFile["tmp_name"];
         $acteFileName = $actePDFFile["name"];
     } else {
-         sortir_atrc("Envoi de fichier illégal.", $api);
+        sortir_atrc("Envoi de fichier illégal.", $api);
     }
 
     $dest_name = $trans->getStdFileName($env, true, $type_acte);
@@ -178,17 +182,18 @@ if (isset($actePDFFile)) {
         $errorMsg = "Erreur de validation du fichier de l'acte :\n" . $trans->getErrorMsg() . "\n";
         $fileImportError = true;
     } else {
-      // Ajout de la signature si présente
+        // Ajout de la signature si présente
         $signFile = null;
 
-        if (isset($actePDFFileSign["tmp_name"]) && is_uploaded_file($actePDFFileSign["tmp_name"])) {
+        if (isset($actePDFFileSign["tmp_name"]) && is_uploaded_file_wrapper($actePDFFileSign["tmp_name"])) {
             $signFile = $actePDFFileSign["tmp_name"];
             $readFile = true;
         }
 
         if ($signFile) {
             if (!$trans->addActeSign($signFile, $readFile)) {
-                $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteFileName . " :\n" . $trans->getErrorMsg() . "\n";
+                $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteFileName . " :\n" . $trans->getErrorMsg(
+                ) . "\n";
                 $fileImportError = true;
             }
         }
@@ -199,9 +204,9 @@ if (isset($actePDFFile)) {
 if (isset($acteAttachments)) {
     for ($i = 0; $i < count($acteAttachments["tmp_name"] ?: []); $i++) {
         if (mb_strlen($acteAttachments["tmp_name"][$i])) {
-            if (is_uploaded_file($acteAttachments["tmp_name"][$i])) {
+            if (is_uploaded_file_wrapper($acteAttachments["tmp_name"][$i])) {
                 if (empty($type_pj[$i])) {
-                    Helpers :: returnAndExit(
+                    Helpers:: returnAndExit(
                         1,
                         "Erreur lors de la réception du fichier annexe {$acteAttachments["name"][$i]} : typologie absente",
                         Helpers::getLink("/modules/actes/actes_transac_add.php")
@@ -209,19 +214,32 @@ if (isset($acteAttachments)) {
                 }
 
                 if (empty($type_pj[$i])) {
-                //Type par defaut des annexes
+                    //Type par defaut des annexes
                     $type_pj[$i] = '99_AU';
                 }
 
                 $dest_name = $trans->getStdFileName($env, true, $type_pj[$i]);
-                if (!$trans->addAttachmentFile($acteAttachments["name"][$i], $dest_name, $acteAttachments["tmp_name"][$i], true, $type_pj[$i])) {
-                      $errorMsg .= "Erreur de validation d'un fichier de pièce jointe :\n" . $trans->getErrorMsg() . "\n";
-                      $fileImportError = true;
+                if (
+                    !$trans->addAttachmentFile(
+                        $acteAttachments["name"][$i],
+                        $dest_name,
+                        $acteAttachments["tmp_name"][$i],
+                        true,
+                        $type_pj[$i]
+                    )
+                ) {
+                    $errorMsg .= "Erreur de validation d'un fichier de pièce jointe :\n" . $trans->getErrorMsg() . "\n";
+                    $fileImportError = true;
                 } else {
-                // Ajout de la signature si présente
-                    if (isset($acteAttachmentsSign["tmp_name"][$i]) && is_uploaded_file($acteAttachmentsSign["tmp_name"][$i])) {
+                    // Ajout de la signature si présente
+                    if (
+                        isset($acteAttachmentsSign["tmp_name"][$i]) && is_uploaded_file_wrapper(
+                            $acteAttachmentsSign["tmp_name"][$i]
+                        )
+                    ) {
                         if (!$trans->addAttachmentSign($acteAttachmentsSign["tmp_name"][$i])) {
-                            $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteAttachments["name"][$i] . " :\n" . $trans->getErrorMsg() . "\n";
+                            $errorMsg .= "Erreur lors du traitement de la signature du fichier " . $acteAttachments["name"][$i] . " :\n" . $trans->getErrorMsg(
+                            ) . "\n";
                             $fileImportError = true;
                         }
                     }
@@ -234,7 +252,6 @@ if (isset($acteAttachments)) {
 }
 
 
-
 if ($fileImportError) {
     sortir_atrc($errorMsg, $api);
 }
@@ -273,7 +290,7 @@ $env->purgeFiles();
 
 if (!$env->save()) {
     $msg = "Erreur lors de l'enregistrement de l'enveloppe :\n" . $env->getErrorMsg();
-    if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+    if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
     sortir_atrc($msg, $api);
@@ -283,7 +300,7 @@ $trans->set("envelope_id", $env->getId());
 
 if (!$trans->save()) {
     $msg = "Erreur lors de l'enregistrement de la transaction :\n" . $trans->getErrorMsg();
-    if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+    if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
 
@@ -292,12 +309,12 @@ if (!$trans->save()) {
     sortir_atrc($msg, $api);
 } else {
     $msg = "Création de l'envelope n°" . $env->getId() . ". Résultat ok.";
-    if (!Log :: newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
+    if (!Log:: newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
 
-  // Message réservé à l'appel via API
-  // Id de la transaction créée
+    // Message réservé à l'appel via API
+    // Id de la transaction créée
     $apiMsg = $trans->getId() . "\n";
 }
 
@@ -307,5 +324,10 @@ $workerScript->putJobByClassName(ActesAntivirusWorker::class, $trans->getId());
 if ($api) {
     echo "OK : id généré : " . $apiMsg;
 } else {
-    Helpers :: returnAndExit(0, $msg, Helpers::getLink("/modules/actes/actes_transac_show.php?id=") . $trans->getId(), $apiMsg);
+    Helpers:: returnAndExit(
+        0,
+        $msg,
+        Helpers::getLink("/modules/actes/actes_transac_show.php?id=") . $trans->getId(),
+        $apiMsg
+    );
 }
diff --git a/public.ssl/modules/actes/actes_transac_submit.php b/public.ssl/modules/actes/actes_transac_submit.php
index 31f9d71531fe828ca3dc573c03f5978964924aaa..607333db87657aec0137549893e9569164f05c41 100644
--- a/public.ssl/modules/actes/actes_transac_submit.php
+++ b/public.ssl/modules/actes/actes_transac_submit.php
@@ -12,21 +12,21 @@ use S2lowLegacy\Class\User;
 use S2lowLegacy\Class\WorkerScript;
 
 [$workerScript, $actesClassificationCodesSQL] = \S2lowLegacy\Class\LegacyObjectsManager::getLegacyObjectInstancier()
-    ->getArray([WorkerScript::class,\S2lowLegacy\Class\actes\ActesClassificationCodesSQL::class]);
+    ->getArray([WorkerScript::class, \S2lowLegacy\Class\actes\ActesClassificationCodesSQL::class]);
 
 // Instanciation du module courant
 $module = new Module();
-if (! $module->initByName("actes")) {
+if (!$module->initByName("actes")) {
     Helpers::returnAndExit(1, "Erreur d'initialisation du module", WEBSITE_SSL);
 }
 
 $me = new User();
 
-if (! $me->authenticate()) {
+if (!$me->authenticate()) {
     Helpers::returnAndExit(1, "Échec de l'authentification", Helpers::getLink("connexion-status"));
 }
 
-if ($me->isSuper() || ! $module->isActive() || !$me->canEdit($module->get("name"))) {
+if ($me->isSuper() || !$module->isActive() || !$me->canEdit($module->get("name"))) {
     Helpers::returnAndExit(1, "Accès refusé", WEBSITE_SSL);
 }
 
@@ -39,17 +39,29 @@ $myAuthority = new Authority($me->get("authority_id"));
 // Recuperation des variables du POST
 $enveloppe = $_FILES["enveloppe"];
 
-if (! is_array($enveloppe) || count($enveloppe) <= 0) {
-    Helpers::returnAndExit(1, "Pas de fichier archive spécifié.", Helpers::getLink("/modules/actes/actes_transac_import.php"));
+if (!is_array($enveloppe) || count($enveloppe) <= 0) {
+    Helpers::returnAndExit(
+        1,
+        "Pas de fichier archive spécifié.",
+        Helpers::getLink("/modules/actes/actes_transac_import.php")
+    );
 }
 
-if (! is_uploaded_file($enveloppe["tmp_name"])) {
-    Helpers::returnAndExit(1, "Envoi de fichier incorrect.", Helpers::getLink("/modules/actes/actes_transac_import.php"));
+if (!is_uploaded_file_wrapper($enveloppe["tmp_name"])) {
+    Helpers::returnAndExit(
+        1,
+        "Envoi de fichier incorrect.",
+        Helpers::getLink("/modules/actes/actes_transac_import.php")
+    );
 }
 
 $rgsConnexion = new RgsConnexion();
-if (! $rgsConnexion->isRgsConnexion()) {
-    Helpers :: returnAndExit(1, "La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}", Helpers::getLink("/modules/actes/"));
+if (!$rgsConnexion->isRgsConnexion()) {
+    Helpers:: returnAndExit(
+        1,
+        "La télétransmission nécessite un certificat RGS<br/>Erreur : {$rgsConnexion->getLastMessage()}",
+        Helpers::getLink("/modules/actes/")
+    );
 }
 
 $actesNameArchive = new ActesNameArchive(ACTES_APPLI_TRIGRAMME, ACTES_APPLI_QUADRIGRAMME);
@@ -57,7 +69,11 @@ $actesNameArchive = new ActesNameArchive(ACTES_APPLI_TRIGRAMME, ACTES_APPLI_QUAD
 try {
     $actesNameArchive->verifNameOK($enveloppe['name']);
 } catch (Exception $e) {
-    Helpers:: returnAndExit(1, "L'archive n'a pas un nom valide : {$e->getMessage()}", Helpers::getLink("/modules/actes/actes_transac_import.php"));
+    Helpers:: returnAndExit(
+        1,
+        "L'archive n'a pas un nom valide : {$e->getMessage()}",
+        Helpers::getLink("/modules/actes/actes_transac_import.php")
+    );
 }
 
 $env = new ActesEnvelope();
@@ -78,7 +94,11 @@ $env->set("destDir", $dest);
 if (($xmlTransFiles = $env->importArchiveFile($enveloppe["name"], $enveloppe["tmp_name"])) === false) {
     $env->purgeFiles();
     $env->deleteArchiveFile();
-    Helpers::returnAndExit(1, "Erreur d'importation de l'enveloppe :\n" . $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_import.php"));
+    Helpers::returnAndExit(
+        1,
+        "Erreur d'importation de l'enveloppe :\n" . $env->getErrorMsg(),
+        Helpers::getLink("/modules/actes/actes_transac_import.php")
+    );
 }
 
 // Création des transactions d'après les fichiers XML contenus dans l'enveloppe
@@ -94,24 +114,32 @@ foreach ($xmlTransFiles as $xmlFile) {
     $trans->set("authority_id", $me->get("authority_id"));
 
 
-    if (! $trans->createFromXML($xmlFile, $actesClassificationCodesSQL)) {
+    if (!$trans->createFromXML($xmlFile, $actesClassificationCodesSQL)) {
         $env->purgeFiles();
         $env->deleteArchiveFile();
-        Helpers::returnAndExit(1, "Erreur d'importation transaction : " . $trans->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_import.php"));
+        Helpers::returnAndExit(
+            1,
+            "Erreur d'importation transaction : " . $trans->getErrorMsg(),
+            Helpers::getLink("/modules/actes/actes_transac_import.php")
+        );
     }
 
     $env->addTransaction($trans);
 
     if ($trans->get("type") == 1) {
-      // Vérification qu'une transaction ayant le même numéro interne n'existe pas déjà
-        if (! $trans->isUnique($myAuthority->getId())) {
+        // Vérification qu'une transaction ayant le même numéro interne n'existe pas déjà
+        if (!$trans->isUnique($myAuthority->getId())) {
             $env->purgeFiles();
             $env->deleteArchiveFile();
-            Helpers::returnAndExit(1, "Un numéro interne d'acte entre en conflit avec un acte existant dans la base de données.", Helpers::getLink("/modules/actes/actes_transac_import.php"));
+            Helpers::returnAndExit(
+                1,
+                "Un numéro interne d'acte entre en conflit avec un acte existant dans la base de données.",
+                Helpers::getLink("/modules/actes/actes_transac_import.php")
+            );
         }
     }
 
-  // En cas de demande de classification, création de la requête dans la table idoine
+    // En cas de demande de classification, création de la requête dans la table idoine
     if ($trans->get("type") == 7) {
         $classifRequest = new ActesClassification();
 
@@ -127,15 +155,19 @@ foreach ($xmlTransFiles as $xmlFile) {
 
 
 // Création de l'archive .tar.gz
-if (! $env->generateArchiveFile()) {
+if (!$env->generateArchiveFile()) {
     $env->purgeFiles();
     $env->deleteArchiveFile();
-    Helpers::returnAndExit(1, "Erreur lors de la regénération de l'archive.\n" . $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_import.php"));
+    Helpers::returnAndExit(
+        1,
+        "Erreur lors de la regénération de l'archive.\n" . $env->getErrorMsg(),
+        Helpers::getLink("/modules/actes/actes_transac_import.php")
+    );
 }
 
 // Vérification taille après regénération
 // Le scan anti-virus a déjà été fait lors de l'import (gruik !!)
-if (! $env->checkArchiveSize()) {
+if (!$env->checkArchiveSize()) {
     $env->purgeFiles();
     $env->deleteArchiveFile();
     Helpers::returnAndExit(1, $env->getErrorMsg(), Helpers::getLink("/modules/actes/actes_transac_import.php"));
@@ -146,11 +178,11 @@ $env->purgeFiles();
 
 
 // Enregistrement de l'enveloppe
-if (! $env->save()) {
+if (!$env->save()) {
     $env->deleteArchiveFile();
     $msg = "Erreur lors de l'enregistrement de l'enveloppe :\n" . $env->getErrorMsg();
 
-    if (! Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+    if (!Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
         $msg .= "\nErreur de journalisation.";
     }
 
@@ -165,9 +197,9 @@ foreach ($transacs as $trans) {
     $trans->set("authority_id", $me->get("authority_id"));
 
 
-    if (! $trans->save()) {
+    if (!$trans->save()) {
         $msg = "Erreur lors de l'enregistrement de la transaction.\n" . $trans->getErrorMsg();
-        if (! Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+        if (!Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
             $msg .= "\nErreur de journalisation.";
         }
 
@@ -184,9 +216,10 @@ foreach ($transacs as $trans) {
 // Enregistrement des demandes de classification
 if (count($classifRequests) > 0) {
     foreach ($classifRequests as $classifRequest) {
-        if (! $classifRequest->save()) {
-            $msg = "Erreur lors de l'enregistrement de la requête de classification.\n" . $classifRequest->getErrorMsg();
-            if (! Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
+        if (!$classifRequest->save()) {
+            $msg = "Erreur lors de l'enregistrement de la requête de classification.\n" . $classifRequest->getErrorMsg(
+            );
+            if (!Log::newEntry(LOG_ISSUER_NAME, $msg, 3, false, 'USER', $module->get("name"), $me)) {
                 $msg .= "\nErreur de journalisation.";
             }
 
@@ -204,7 +237,7 @@ if (count($classifRequests) > 0) {
 $msg = "Importation fichier archive réussie. Enveloppe n°" . $env->getId() . " contenant " . count($transacs);
 $msg .= (count($transacs) > 1) ? " transactions créée." : " transaction créée.";
 
-if (! Log::newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
+if (!Log::newEntry(LOG_ISSUER_NAME, $msg, 1, false, 'USER', $module->get("name"), $me)) {
     $msg .= "\nErreur de journalisation.";
 }
 
@@ -220,5 +253,4 @@ $workerScript->putJobByClassName(ActesStoreEnveloppeWorker::class, $env->getId()
 $workerScript->putJobByClassName(ActesAntivirusWorker::class, $trans->getId());
 
 
-
 Helpers::returnAndExit(0, $msg, Helpers::getLink("/modules/actes/index.php"), $apiMsg);
diff --git a/public.ssl/modules/actes/class/ActesBatch.class.php b/public.ssl/modules/actes/class/ActesBatch.class.php
index 46e3aa995fee0a3e1abbc57d2e907b51164876cc..f5f5e8cff009a7ac55db4a483a2c5cf133aa1546 100644
--- a/public.ssl/modules/actes/class/ActesBatch.class.php
+++ b/public.ssl/modules/actes/class/ActesBatch.class.php
@@ -20,7 +20,6 @@ use S2lowLegacy\Class\User;
  * Auteur   Date       Commentaire
  *
  */
-
 class ActesBatch extends DataObject
 {
     protected $objectName = "actes_batches";
@@ -32,40 +31,40 @@ class ActesBatch extends DataObject
     protected $num_prefix;
     protected $next_suffix;
 
-    protected $dbFields = array (
-    "description" => array (
-      "descr" => "Intitulé du lot",
-      "type" => "isString",
-      "mandatory" => true
-    ),
-    "storage_dir" => array (
-      "descr" => "Répertoire de stockage sur le serveur",
-      "type" => "isString",
-      "mandatory" => false
-    ),
-    "submission_date" => array (
-      "descr" => "Date de soumission du lot",
-      "type" => "isDate",
-      "mandatory" => true
-    ),
-    "user_id" => array (
-      "descr" => "Utilisateur propriétaire du lot",
-      "type" => "isInt",
-      "mandatory" => true
-    ),
-    "num_prefix" => array (
-      "descr" => "Préfixe numéro interne transactions",
-      "type" => "isString",
-      "mandatory" => false
-    ),
-    "next_suffix" => array (
-      "descr" => "Prochain suffixe du numéro interne",
-      "type" => "isInt",
-      "mandatory" => false
-    )
+    protected $dbFields = array(
+        "description" => array(
+            "descr" => "Intitulé du lot",
+            "type" => "isString",
+            "mandatory" => true
+        ),
+        "storage_dir" => array(
+            "descr" => "Répertoire de stockage sur le serveur",
+            "type" => "isString",
+            "mandatory" => false
+        ),
+        "submission_date" => array(
+            "descr" => "Date de soumission du lot",
+            "type" => "isDate",
+            "mandatory" => true
+        ),
+        "user_id" => array(
+            "descr" => "Utilisateur propriétaire du lot",
+            "type" => "isInt",
+            "mandatory" => true
+        ),
+        "num_prefix" => array(
+            "descr" => "Préfixe numéro interne transactions",
+            "type" => "isString",
+            "mandatory" => false
+        ),
+        "next_suffix" => array(
+            "descr" => "Prochain suffixe du numéro interne",
+            "type" => "isInt",
+            "mandatory" => false
+        )
     );
 
-  /** @var ActesBatchFile[] */
+    /** @var ActesBatchFile[] */
     protected $batchFiles;
     protected $unprocessedBatchFiles;
     private bool $asNew;
@@ -78,22 +77,22 @@ class ActesBatch extends DataObject
     public function __construct($id = false, bool $asNew = false)
     {
         $this->asNew = $asNew;
-        parent :: __construct($id);
+        parent:: __construct($id);
     }
 
-  /**
-   * \brief Méthode initialisant l'entité avec l'identifiant courant
-   * \return true si succès, false sinon
-  */
+    /**
+     * \brief Méthode initialisant l'entité avec l'identifiant courant
+     * \return true si succès, false sinon
+     */
     public function init()
     {
-        return $this->initBatchFiles() && parent :: init();
+        return $this->initBatchFiles() && parent:: init();
     }
 
-  /**
-   * \brief Initialisation du répertoire de stockage (création)
-   * \return True en cas de succès, false sinon
-   */
+    /**
+     * \brief Initialisation du répertoire de stockage (création)
+     * \return True en cas de succès, false sinon
+     */
     public function initStorage()
     {
         if (isset($this->user_id) && isset($this->id)) {
@@ -104,7 +103,12 @@ class ActesBatch extends DataObject
 
             $this->storage_dir = $authority->get("siren") . "/" . $this->id;
 
-            if ($this->storage_dir == "/" || !Helpers :: createDirTree(ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir, ACTES_BATCHES_UPLOAD_ROOT)) {
+            if (
+                $this->storage_dir == "/" || !Helpers:: createDirTree(
+                    ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir,
+                    ACTES_BATCHES_UPLOAD_ROOT
+                )
+            ) {
                 $this->errorMsg = "Erreur de création du répertoire de stockage du lot.";
                 return false;
             }
@@ -115,10 +119,10 @@ class ActesBatch extends DataObject
         return true;
     }
 
-  /**
-   * \brief Nettoyage du répertoire de stockage
-   * \return True en cas de succès, false sinon
-   */
+    /**
+     * \brief Nettoyage du répertoire de stockage
+     * \return True en cas de succès, false sinon
+     */
     public function purgeStorage()
     {
         foreach ($this->batchFiles as $batchFile) {
@@ -127,31 +131,31 @@ class ActesBatch extends DataObject
             }
         }
 
-        if (!Helpers :: deleteFromFS(ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir)) {
+        if (!Helpers:: deleteFromFS(ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir)) {
             return false;
         }
 
         return true;
     }
 
-  /**
-   * \brief Suppression du répertoire de stockage
-   * \return True en cas de succès, false sinon
-   */
+    /**
+     * \brief Suppression du répertoire de stockage
+     * \return True en cas de succès, false sinon
+     */
     public function deleteStorage()
     {
-        return Helpers :: deleteFromFS(ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir);
+        return Helpers:: deleteFromFS(ACTES_BATCHES_UPLOAD_ROOT . "/" . $this->storage_dir);
     }
 
-  /**
-   * \brief Initialisation des fichiers associés à un lot
-   */
+    /**
+     * \brief Initialisation des fichiers associés à un lot
+     */
     public function initBatchFiles()
     {
         if (isset($this->id)) {
-            $this->batchFiles = array ();
+            $this->batchFiles = array();
 
-            $fileIds = ActesBatchFile :: getFilesIdForBatch($this->id);
+            $fileIds = ActesBatchFile:: getFilesIdForBatch($this->id);
 
             foreach ($fileIds as $fileId) {
                 $batchFile = new ActesBatchFile($fileId);
@@ -167,10 +171,10 @@ class ActesBatch extends DataObject
         }
     }
 
-  /**
-   * \brief Récupération des fichiers associés à un lot
-   * \return Un tableau de ActesBatchFile associé au lot
-   */
+    /**
+     * \brief Récupération des fichiers associés à un lot
+     * \return Un tableau de ActesBatchFile associé au lot
+     */
     public function getBatchFiles()
     {
         if (!isset($this->batchFiles)) {
@@ -187,7 +191,13 @@ class ActesBatch extends DataObject
      */
     public function getBatchesList($cond = "")
     {
-        if (!$this->pagerInit('DISTINCT actes_batches.id, actes_batches.user_id, actes_batches.submission_date, actes_batches.storage_dir, actes_batches.num_prefix, actes_batches.description', 'actes_batches', $cond)) {
+        if (
+            !$this->pagerInit(
+                'DISTINCT actes_batches.id, actes_batches.user_id, actes_batches.submission_date, actes_batches.storage_dir, actes_batches.num_prefix, actes_batches.description',
+                'actes_batches',
+                $cond
+            )
+        ) {
             return false;
         }
 
@@ -196,7 +206,7 @@ class ActesBatch extends DataObject
 
     /**
      * Méthode d'obtention de la liste des lots et tous leurs attributs pour un utilisateur
-     * @param int $user_id  Identifiant de l'utilisateur
+     * @param int $user_id Identifiant de l'utilisateur
      * @return array|bool Tableau des lots
      */
     public function getBatchesListForUser($user_id)
@@ -205,20 +215,20 @@ class ActesBatch extends DataObject
             return $this->getBatchesList(" WHERE actes_batches.user_id=" . $user_id);
         }
 
-        return array ();
+        return array();
     }
 
-  /**
-   * \brief Méthode de rafraichissement de la liste des fichiers du lot restant à traiter
-   * \return Tableau des fichiers restant à traiter
-   */
+    /**
+     * \brief Méthode de rafraichissement de la liste des fichiers du lot restant à traiter
+     * \return Tableau des fichiers restant à traiter
+     */
     private function refreshUnprocessedFiles()
     {
         if (!isset($this->batchFiles)) {
             $this->initBatchFiles();
         }
 
-        $this->unprocessedBatchFiles = array ();
+        $this->unprocessedBatchFiles = array();
 
         foreach ($this->batchFiles as $file) {
             if (!$file->isProcessed()) {
@@ -227,10 +237,10 @@ class ActesBatch extends DataObject
         }
     }
 
-  /**
-   * \brief Méthode d'obtention de la liste des fichiers du lot restant à traiter
-   * \return Tableau des fichiers restant à traiter
-   */
+    /**
+     * \brief Méthode d'obtention de la liste des fichiers du lot restant à traiter
+     * \return Tableau des fichiers restant à traiter
+     */
     public function getUnprocessedFiles()
     {
         if (!isset($this->unprocessedBatchFiles)) {
@@ -240,10 +250,10 @@ class ActesBatch extends DataObject
         return $this->unprocessedBatchFiles;
     }
 
-  /**
-   * \brief Méthode d'obtention du nombre de fichiers du lot restant à traiter
-   * \return Le nombre de fichier restant à traiter dans le lot
-   */
+    /**
+     * \brief Méthode d'obtention du nombre de fichiers du lot restant à traiter
+     * \return Le nombre de fichier restant à traiter dans le lot
+     */
     public function getUnprocessedFilesCount()
     {
         if (!isset($this->unprocessedBatchFiles)) {
@@ -253,10 +263,10 @@ class ActesBatch extends DataObject
         return count($this->unprocessedBatchFiles);
     }
 
-  /**
-   * \brief Méthode d'obtention du nombre de fichiers du lot
-   * \return Le nombre de fichier dans le lot
-   */
+    /**
+     * \brief Méthode d'obtention du nombre de fichiers du lot
+     * \return Le nombre de fichier dans le lot
+     */
     public function getAllFilesCount()
     {
         if (!isset($this->batchFiles)) {
@@ -266,10 +276,10 @@ class ActesBatch extends DataObject
         return count($this->batchFiles);
     }
 
-  /**
-   * \brief Méthode d'obtention de la liste des fichiers du lot restant à traiter sous forme id/name
-   * \return Tableau des fichiers restant à traiter, clef=id, valeur=nom fichier
-   */
+    /**
+     * \brief Méthode d'obtention de la liste des fichiers du lot restant à traiter sous forme id/name
+     * \return Tableau des fichiers restant à traiter, clef=id, valeur=nom fichier
+     */
     public function getUnprocessedFilesIdName()
     {
         if (!isset($this->unprocessedBatchFiles)) {
@@ -279,10 +289,10 @@ class ActesBatch extends DataObject
         return $this->getFilesIdName($this->unprocessedBatchFiles);
     }
 
-  /**
-   * \brief Méthode d'obtention de la liste des fichiers du lot sous forme id/name
-   * \return Tableau des fichiers, clef=id, valeur=nom fichier
-   */
+    /**
+     * \brief Méthode d'obtention de la liste des fichiers du lot sous forme id/name
+     * \return Tableau des fichiers, clef=id, valeur=nom fichier
+     */
     public function getAllFilesIdName()
     {
         if (!isset($this->batchFiles)) {
@@ -299,7 +309,7 @@ class ActesBatch extends DataObject
      */
     private function getFilesIdName($files)
     {
-        $retFiles = array ();
+        $retFiles = array();
 
         if (is_array($files)) {
             foreach ($files as $file) {
@@ -347,10 +357,10 @@ class ActesBatch extends DataObject
         return $nextId;
     }
 
-  /**
-   * \brief
-   * \return
-   */
+    /**
+     * \brief
+     * \return
+     */
 
     /**
      * Récupération du prochain suffixe pour le numéro interne
@@ -362,7 +372,7 @@ class ActesBatch extends DataObject
         if (isset($this->id)) {
             $next_suffix = 1;
 
-          // On récupère le suffixe
+            // On récupère le suffixe
             $sql = "SELECT next_suffix FROM actes_batches WHERE id= ? FOR UPDATE";
 
             $result = $this->db->select($sql, [$this->id]);
@@ -396,7 +406,7 @@ class ActesBatch extends DataObject
             if ($next_suffix != null) {
                 $sql = "UPDATE actes_batches SET next_suffix= ? WHERE id= ?";
 
-                if (!$this->db->exec($sql, [$next_suffix + 1,$this->id])) {
+                if (!$this->db->exec($sql, [$next_suffix + 1, $this->id])) {
                     $this->errorMsg = "Erreur d'accès base de données.";
                     return $this->errorMsg;
                 }
@@ -419,7 +429,7 @@ class ActesBatch extends DataObject
         $ret_value = true;
 
         if (is_array($files)) {
-          // Copie du tableau pour recherche des signatures
+            // Copie du tableau pour recherche des signatures
             $filesDup = $files;
 
             $this->errorMsg = "<span style='font-weight:bold;color:red;'>Echec de la cr&eacute;ation du lot.</span><br />\n";
@@ -439,19 +449,21 @@ class ActesBatch extends DataObject
 
                 // On ne traite pas individuellement les fichiers de signature
                 if (!preg_match("/\.sig$/", $filename)) {
-                    if (is_uploaded_file($file["tmp_name"])) {
+                    if (is_uploaded_file_wrapper($file["tmp_name"])) {
                         // Vérification du type de fichier
-                        $type = Helpers :: getFileType($file["tmp_name"]);
+                        $type = Helpers:: getFileType($file["tmp_name"]);
                         $trace = Trace::getInstance();
 
-                        $trace->log("Récuperation de " . $file['name'] . " - type : " . $type  . " - tmp_name : " . $file["tmp_name"]);
+                        $trace->log(
+                            "Récuperation de " . $file['name'] . " - type : " . $type . " - tmp_name : " . $file["tmp_name"]
+                        );
 
 
                         if ($type != "application/pdf") {
                             $this->errorMsg .= "Le fichier <span style='font-weight:bold;'>" . $filename . "</span> n'est pas du type requis ($type). <span style='font-weight:bold;'>Seuls les fichiers PDF sont autoris&eacute;s.</span><br />\n";
                             $ret_value = false;
                         } else {
-                      // On recherche un fichier de signature associé
+                            // On recherche un fichier de signature associé
                             $foundSig = false;
                             $sign = "";
                             reset($filesDup);
@@ -523,14 +535,14 @@ class ActesBatch extends DataObject
         }
 
         if ($new) {
-          // Si nouveau lot, création répertoire de stockage
+            // Si nouveau lot, création répertoire de stockage
             if (!$this->initStorage()) {
                 return false;
             }
         }
 
-      //echo $sql;
-      //exit();
+        //echo $sql;
+        //exit();
 
         if (!$this->db->begin()) {
             $this->errorMsg = "Erreur lors de l'initialisation de la transaction.";
@@ -543,11 +555,11 @@ class ActesBatch extends DataObject
             return false;
         }
 
-      // Définition du répertoire de stockage
+        // Définition du répertoire de stockage
         if (
             !$this->db->exec(
                 "UPDATE actes_batches SET storage_dir=? WHERE id= ?",
-                [$this->storage_dir,$this->id]
+                [$this->storage_dir, $this->id]
             )
         ) {
             $this->errorMsg = "Erreur lors de la définition du répertoire de stockage du lot.";
@@ -605,25 +617,26 @@ class ActesBatch extends DataObject
             return false;
         }
 
-      // Suppression des fichiers inclus
+        // Suppression des fichiers inclus
         if (!isset($this->batchFiles)) {
             $this->initBatchFiles();
         }
 
         foreach ($this->batchFiles as $batchFile) {
             if (!$batchFile->delete()) {
-                $this->errorMsg = "Erreur lors de la suppression des fichiers associés au lot : " . $batchFile->getErrorMsg();
+                $this->errorMsg = "Erreur lors de la suppression des fichiers associés au lot : " . $batchFile->getErrorMsg(
+                );
                 $this->db->rollback();
                 return false;
             }
         }
 
-      // Suppression du répertoire de stockage
+        // Suppression du répertoire de stockage
         if (!$this->deleteStorage()) {
             return false;
         }
 
-        if (!parent :: delete()) {
+        if (!parent:: delete()) {
             return false;
         }
 
diff --git a/public.ssl/modules/actes/class/ActesClassification.class.php b/public.ssl/modules/actes/class/ActesClassification.class.php
index 0ac512aeea3d79ad4b476d4a80151ebe9cd0030c..57f6f92b938d0bba9704e134329e34450ace9ce0 100644
--- a/public.ssl/modules/actes/class/ActesClassification.class.php
+++ b/public.ssl/modules/actes/class/ActesClassification.class.php
@@ -18,7 +18,6 @@ use S2lowLegacy\Class\Helpers;
  * Auteur   Date       Commentaire
  *
  */
-
 class ActesClassification extends DataObject
 {
     protected $objectName = "actes_classification_requests";
@@ -28,26 +27,31 @@ class ActesClassification extends DataObject
     protected $version_date;
     protected $xml_data;
 
-    protected $dbFields = array( "request_date" => array( "descr" => "Date de la demande", "type" => "isDate", "mandatory" => true),
-                               "requested_by" => array( "descr" => "Identifiant du demandeur", "type" => "isInt", "mandatory" => true),
-                               "version_date" => array( "descr" => "Date de la version de la classification", "type" => "isDate", "mandatory" => false),
-                               "xml_data" => array( "descr" => "Fichier XML de la classification", "type" => "isString", "mandatory" => false)
-                               );
-
-  /**
-   * \brief Constructeur d'une requete de classification
-   * \param id integer Numéro d'identifiant d'une requete existante avec laquelle initialiser l'objet
-   */
+    protected $dbFields = array(
+        "request_date" => array("descr" => "Date de la demande", "type" => "isDate", "mandatory" => true),
+        "requested_by" => array("descr" => "Identifiant du demandeur", "type" => "isInt", "mandatory" => true),
+        "version_date" => array(
+            "descr" => "Date de la version de la classification",
+            "type" => "isDate",
+            "mandatory" => false
+        ),
+        "xml_data" => array("descr" => "Fichier XML de la classification", "type" => "isString", "mandatory" => false)
+    );
+
+    /**
+     * \brief Constructeur d'une requete de classification
+     * \param id integer Numéro d'identifiant d'une requete existante avec laquelle initialiser l'objet
+     */
     public function __construct($id = false)
     {
         parent::__construct($id);
     }
 
-  /**
-   * \brief Méthode d'initialisation avec les données de la dernière requête en date ayant réussie
-   * \param $authority_id entier : Identifiant de la collectivité concernée
-   * \return True en cas de succès, false sinon
-   */
+    /**
+     * \brief Méthode d'initialisation avec les données de la dernière requête en date ayant réussie
+     * \param $authority_id entier : Identifiant de la collectivité concernée
+     * \return True en cas de succès, false sinon
+     */
     public function initWithLastSuccessful($authority_id)
     {
         if (is_numeric($authority_id)) {
@@ -72,31 +76,32 @@ class ActesClassification extends DataObject
             fclose($xml_data);
             //return $contents;
             //if (! $result->isError() && $result->num_row() == 1) {
-                //$row = $result->get_next_row();
-                $this->request_date = $request_date; //Helpers::getFromBDD($row["request_date"]);
-                $this->requested_by = $requested_by; //Helpers::getFromBDD($row["requested_by"]);
-                $this->version_date = $version_date;//Helpers::getFromBDD($row["version_date"]);
-                $this->xml_data = $contents;//Helpers::getFromBDD($row["xml_data"]);
+            //$row = $result->get_next_row();
+            $this->request_date = $request_date; //Helpers::getFromBDD($row["request_date"]);
+            $this->requested_by = $requested_by; //Helpers::getFromBDD($row["requested_by"]);
+            $this->version_date = $version_date;//Helpers::getFromBDD($row["version_date"]);
+            $this->xml_data = $contents;//Helpers::getFromBDD($row["xml_data"]);
 
-                return true;
+            return true;
             //}
         }
 
         return false;
     }
-  /**
-   * \brief Méthode d'envoi de la classification
-   * \return True en cas de succès, false sinon
-   */
+
+    /**
+     * \brief Méthode d'envoi de la classification
+     * \return True en cas de succès, false sinon
+     */
     public function pushXMLData()
     {
-        if (! empty($this->xml_data)) {
-            header("Content-type: text/xml;charset=iso-8859-1");
-            header('Content-disposition: attachment; filename="classification.xml"');
-          // Celles-ci pour IE
-            header("Expires: 0");
-            header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
-            header("Pragma: public");
+        if (!empty($this->xml_data)) {
+            header_wrapper("Content-type: text/xml;charset=iso-8859-1");
+            header_wrapper('Content-disposition: attachment; filename="classification.xml"');
+            // Celles-ci pour IE
+            header_wrapper("Expires: 0");
+            header_wrapper("Cache-Control: must-revalidate, post-check=0,pre-check=0");
+            header_wrapper("Pragma: public");
 
             echo $this->xml_data . "\r\n";
         } else {
@@ -107,36 +112,36 @@ class ActesClassification extends DataObject
     }
 
 
-  /**********************/
-  /* Méthodes statiques */
-  /**********************/
+    /**********************/
+    /* Méthodes statiques */
+    /**********************/
 
-  /**
-   * \brief Méthode de vérification qu'une transaction de demande de classification n'existe pas déjà dans la journée en cours
-   * \param $authority_id entier : Identifiant de la collectivité concernée
-   * \return True si une transaction a déjà été faites dans la journée en cours, false sinon
-  */
+    /**
+     * \brief Méthode de vérification qu'une transaction de demande de classification n'existe pas déjà dans la journée en cours
+     * \param $authority_id entier : Identifiant de la collectivité concernée
+     * \return True si une transaction a déjà été faites dans la journée en cours, false sinon
+     */
     public static function hasTodayRequest($authority_id)
     {
         if (is_numeric($authority_id)) {
             $today = date('Y-m-d');
             $sql = "SELECT DISTINCT at.id FROM actes_transactions at"
-            . " LEFT JOIN actes_transactions_workflow atw ON at.id=atw.transaction_id"
-            . " LEFT JOIN actes_envelopes ae ON at.envelope_id=ae.id"
-            . " LEFT JOIN users ON ae.user_id=users.id"
-            . " WHERE at.type='7' "
-            // On ne tient compte que des demandes dans les états posté, en attente ou transmis (3), de ce fait si une demande tombe en erreur
-            // il sera possible de refaire une requête dans la même journée
+                . " LEFT JOIN actes_transactions_workflow atw ON at.id=atw.transaction_id"
+                . " LEFT JOIN actes_envelopes ae ON at.envelope_id=ae.id"
+                . " LEFT JOIN users ON ae.user_id=users.id"
+                . " WHERE at.type='7' "
+                // On ne tient compte que des demandes dans les états posté, en attente ou transmis (3), de ce fait si une demande tombe en erreur
+                // il sera possible de refaire une requête dans la même journée
 
-            //Correger pour la report du bug: 190 =>lenteur du plateforme.
-            . " AND (SELECT status_id FROM actes_transactions_workflow atw2 WHERE date = ( SELECT MAX(date) FROM actes_transactions_workflow atw3 WHERE atw3.transaction_id = atw2.transaction_id) AND transaction_id = at.id ORDER BY atw2.id DESC LIMIT 1) IN (1,2,3)"
-            . " AND atw.date >= '" . $today . "' AND users.authority_id=" . $authority_id;
+                //Correger pour la report du bug: 190 =>lenteur du plateforme.
+                . " AND (SELECT status_id FROM actes_transactions_workflow atw2 WHERE date = ( SELECT MAX(date) FROM actes_transactions_workflow atw3 WHERE atw3.transaction_id = atw2.transaction_id) AND transaction_id = at.id ORDER BY atw2.id DESC LIMIT 1) IN (1,2,3)"
+                . " AND atw.date >= '" . $today . "' AND users.authority_id=" . $authority_id;
 
             $db = DatabasePool::getInstance();
 
             $result = $db->select($sql);
 
-            if (! $result->isError() && $result->num_row() > 0) {
+            if (!$result->isError() && $result->num_row() > 0) {
                 return true;
             }
         }
@@ -145,25 +150,25 @@ class ActesClassification extends DataObject
     }
 
 
-  /**
-   * \brief Méthode d'obtention de la date de la dernière classification utilisée
-   * \param $authority_id entier : Identifiant de la collectivité concernée
-   * \param $return_ansi bolléen : si true (défaut) retourne la date au format YYYY-MM-DD, format BDD sinon
-   * \return La date de la dernière classification utilisée
-  */
+    /**
+     * \brief Méthode d'obtention de la date de la dernière classification utilisée
+     * \param $authority_id entier : Identifiant de la collectivité concernée
+     * \param $return_ansi bolléen : si true (défaut) retourne la date au format YYYY-MM-DD, format BDD sinon
+     * \return La date de la dernière classification utilisée
+     */
     public static function getLastRevisionDate($authority_id, $return_ansi = true)
     {
         if (is_numeric($authority_id)) {
-          // TODO : voir s'il ne vaut mieux pas ordonner par ID et prendre la date de la dernière requête
+            // TODO : voir s'il ne vaut mieux pas ordonner par ID et prendre la date de la dernière requête
             $sql = "SELECT MAX(version_date) AS max_date FROM actes_classification_requests"
-            . " LEFT JOIN users ON actes_classification_requests.requested_by=users.id"
-            . " WHERE users.authority_id=" . $authority_id;
+                . " LEFT JOIN users ON actes_classification_requests.requested_by=users.id"
+                . " WHERE users.authority_id=" . $authority_id;
 
             $db = DatabasePool::getInstance();
 
             $result = $db->select($sql);
 
-            if (! $result->isError() && $result->num_row() > 0) {
+            if (!$result->isError() && $result->num_row() > 0) {
                 $row = $result->get_next_row();
                 if ($return_ansi) {
                     return Helpers::getANSIDateFromBDDDate($row["max_date"]);
@@ -176,16 +181,16 @@ class ActesClassification extends DataObject
         return null;
     }
 
-  /**
-   * \brief Méthode de récupération de la liste de classification
-   * \param $authority_id entier : Identifiant de la collectivité concernée
-   * \return Un tableau contenant la liste de classification matières/sous-matières
-   */
+    /**
+     * \brief Méthode de récupération de la liste de classification
+     * \param $authority_id entier : Identifiant de la collectivité concernée
+     * \return Un tableau contenant la liste de classification matières/sous-matières
+     */
     public static function getClassificationList($authority_id)
     {
         if (is_numeric($authority_id)) {
             $sql = "SELECT id, level, code, parent_id, description FROM actes_classification_codes"
-            . " WHERE authority_id=" . $authority_id . " ORDER BY level,code ASC";
+                . " WHERE authority_id=" . $authority_id . " ORDER BY level,code ASC";
 
             $db = DatabasePool::getInstance();
 
@@ -194,9 +199,9 @@ class ActesClassification extends DataObject
 
             $classif = array();
 
-            if (! $result->isError()) {
+            if (!$result->isError()) {
                 while ($row = $result->get_next_row()) {
-                    if (! isset($classif[$row["id"]])) {
+                    if (!isset($classif[$row["id"]])) {
                         $classif[$row["id"]] = array();
                     }
 
@@ -205,11 +210,11 @@ class ActesClassification extends DataObject
                     $classif[$row["id"]]["code"] = $row["code"];
                     $classif[$row["id"]]["description"] = $row["description"];
 
-                    if (isset($row["parent_id"]) && ! empty($row["parent_id"])) {
+                    if (isset($row["parent_id"]) && !empty($row["parent_id"])) {
                         $classif[$row["id"]]["parent_id"] = $row["parent_id"];
 
-                        if (! isset($classif[$row["parent_id"]])) {
-                              $classif[$row["parent_id"]] = array();
+                        if (!isset($classif[$row["parent_id"]])) {
+                            $classif[$row["parent_id"]] = array();
                         }
 
                         $classif[$row["parent_id"]]["children_id"][] = $row["id"];
@@ -225,11 +230,10 @@ class ActesClassification extends DataObject
         return false;
     }
 
-  /**
-   * \brief Méthode de récupération du fichier XML de la classification
-
-   * \return Une chaîne contenant les données XML de la classification
-   */
+    /**
+     * \brief Méthode de récupération du fichier XML de la classification
+     * \return Une chaîne contenant les données XML de la classification
+     */
     public static function getClassificationXMLData($authority_id)
     {
     }
diff --git a/src/Enum/ModulePermission.php b/src/Enum/ModulePermission.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2d361d3e00c6c0d0d4a44af534cc686b86b766b
--- /dev/null
+++ b/src/Enum/ModulePermission.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace S2low\Enum;
+
+enum ModulePermission: string
+{
+    case Modification = 'RW';
+    case Visualisation = 'RO';
+    case Aucune = 'NONE';
+}
diff --git a/src/Enum/UserRole.php b/src/Enum/UserRole.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bce7328d7b2764a9083fdedf59635ed7cab8975
--- /dev/null
+++ b/src/Enum/UserRole.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace S2low\Enum;
+
+enum UserRole: string
+{
+    case Utilisateur = 'USER';
+    case Archiviste = 'ARCH';
+    case AdministrateurCollectivite = 'ADM';
+    case AdministrateurGroupe = 'GADM';
+    case SuperAdministrateur = 'SADM';
+}
diff --git a/test/PHPUnit/ActesUtilitiesTestTrait.php b/test/PHPUnit/ActesUtilitiesTestTrait.php
index f1a8634460c90ee8f02e7673ebbb5c287100e4e3..6b2f3baedbe9a225ceb7f9748544d113dfc35b25 100644
--- a/test/PHPUnit/ActesUtilitiesTestTrait.php
+++ b/test/PHPUnit/ActesUtilitiesTestTrait.php
@@ -8,7 +8,6 @@ use Exception;
 use S2lowLegacy\Class\actes\ActesEnvelopeSQL;
 use S2lowLegacy\Class\actes\ActesStatusSQL;
 use S2lowLegacy\Class\actes\ActesTransactionsSQL;
-use S2lowLegacy\Lib\ObjectInstancier;
 use S2lowLegacy\Lib\SQLQuery;
 
 /**
@@ -17,14 +16,14 @@ use S2lowLegacy\Lib\SQLQuery;
  * Date: 21/08/2018
  * Time: 11:41
  */
-
 trait ActesUtilitiesTestTrait
 {
-    /**
-     * @throws Exception
-     */
-    protected function createTransaction(int $status, string $archive_path = '', ?string $date = '2017-07-01'): int
-    {
+    protected function createTransactionOfType(
+        int $status,
+        int $type = 1,
+        string $archive_path = '',
+        ?string $date = '2017-07-01'
+    ): int {
         $sql = "INSERT INTO actes_envelopes(user_id,siren,department) VALUES(1,'000000000','034') returning ID";
         $envelope_id = $this->getSQLQuery()->queryOne($sql);
 
@@ -37,8 +36,9 @@ trait ActesUtilitiesTestTrait
                                number,
                                nature_code,
                                type,
-                               classification
-                               ) VALUES (?,?,?,?,?,?,?,?,?) returning ID;';
+                               classification,
+                               classification_date
+                               ) VALUES (?,?,?,?,?,?,?,?,?,?) returning ID;';
         $transaction_id = $this->getSQLQuery()->queryOne(
             $sql,
             $envelope_id,
@@ -48,8 +48,9 @@ trait ActesUtilitiesTestTrait
             $date,
             '20170728C',
             3,
-            1,
-            '1.1.1'
+            $type,
+            '1.1.1',
+            '2015-08-28'
         );
 
         $flux_retour = '';
@@ -71,8 +72,46 @@ trait ActesUtilitiesTestTrait
         $sql = 'UPDATE actes_transactions SET unique_id=? WHERE id=?';
         $this->getSQLQuery()->query($sql, $unique_id, $transaction_id);
 
+
         return $transaction_id;
     }
+    /**
+     * @throws Exception
+     */
+    protected function createTransaction(int $status, string $archive_path = '', ?string $date = '2017-07-01'): int
+    {
+        return $this->createTransactionOfType($status, 1, $archive_path, $date);
+    }
+
+    private function createActeIncludedFiles($transactionId)
+    {
+        $sql = "SELECT id FROM actes_envelopes WHERE user_id = 1 AND siren='000000000'";
+        $enveloppeId = $this->getSQLQuery()->queryOne($sql);
+
+        $sql = "INSERT INTO actes_included_files (
+            envelope_id,
+            transaction_id,
+            filename,
+            filetype,
+            filesize,
+            posted_filename,
+            sha1,
+            code_pj
+        ) VALUES (?,?,?,?,?,?,?,?)
+        ";
+
+        return $this->getSQLQuery()->queryOne(
+            $sql,
+            $enveloppeId,
+            $transactionId,
+            "99_AI-034-443061841-20250306-43636243-AI-1-1_1.pdf",
+            "application/pdf",
+            10407,
+            "PDFTest.pdf",
+            "7c839d1ba8f47aee14839d087d7dd67f68c36778",
+            "99_AI"
+        );
+    }
 
     /**
      * @return int
@@ -104,6 +143,7 @@ trait ActesUtilitiesTestTrait
     {
         $this->getActesTransactionsSQL()->updateStatus($transaction_id, $status_id, $message, '', $date);
     }
+
     abstract protected function getActesTransactionsSQL(): ActesTransactionsSQL;
 
     abstract public function getSQLQuery(): SQLQuery;
diff --git a/test/PHPUnit/class/actes/ActesApiControllerTest.php b/test/PHPUnit/class/actes/ActesApiControllerTest.php
index 75fb0a7582348338f3151f27e5acfd63e22077df..2fdd6d6140ed96ad8f81a5bd0602ed616becae31 100644
--- a/test/PHPUnit/class/actes/ActesApiControllerTest.php
+++ b/test/PHPUnit/class/actes/ActesApiControllerTest.php
@@ -8,7 +8,6 @@ use Exception;
 use PHPUnit\ActesUtilitiesTestTrait;
 use S2lowLegacy\Class\actes\ActesStatusSQL;
 use S2lowLegacy\Controller\ActesAPIController;
-use S2lowLegacy\Class\actes\ActesEnvelopeSQL;
 use S2lowLegacy\Class\actes\ActesTransactionsSQL;
 use S2lowLegacy\Lib\Environnement;
 use S2lowLegacy\Lib\SQLQuery;
diff --git a/test/PHPUnit/class/actes/fixtures/nbTransactionPerAuthorities.json b/test/PHPUnit/class/actes/fixtures/nbTransactionPerAuthorities.json
index 30bd715a0231d6f4399f9961ffc362fc5a829c13..d9ab84922d6e0057036a5e91cd5d11d3eacd8728 100644
--- a/test/PHPUnit/class/actes/fixtures/nbTransactionPerAuthorities.json
+++ b/test/PHPUnit/class/actes/fixtures/nbTransactionPerAuthorities.json
@@ -16,4 +16,4 @@
     }
   ],
   "result": "ok"
-}
\ No newline at end of file
+}
diff --git a/test/PHPUnit/class/helios/fixtures/nbTransactionPerAuthorities.json b/test/PHPUnit/class/helios/fixtures/nbTransactionPerAuthorities.json
index 30bd715a0231d6f4399f9961ffc362fc5a829c13..d9ab84922d6e0057036a5e91cd5d11d3eacd8728 100644
--- a/test/PHPUnit/class/helios/fixtures/nbTransactionPerAuthorities.json
+++ b/test/PHPUnit/class/helios/fixtures/nbTransactionPerAuthorities.json
@@ -16,4 +16,4 @@
     }
   ],
   "result": "ok"
-}
\ No newline at end of file
+}