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é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é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 +}