From 0364a2ab051490a53b4f39f68e578861a8ca5292 Mon Sep 17 00:00:00 2001 From: Damien <damien.burel@maarch.org> Date: Thu, 27 Aug 2020 18:08:31 +0200 Subject: [PATCH] FEAT #14001 TIME 4:50 Registered mail update + get by id --- migration/20.10/2010.sql | 1 + rest/index.php | 3 + sql/structure.sql | 1 + .../controllers/RegisteredMailController.php | 148 +++++++++++++++--- .../controllers/RegisteredMailTrait.php | 2 +- .../models/RegisteredMailModel.php | 15 ++ .../resource/controllers/ResController.php | 7 + 7 files changed, 151 insertions(+), 26 deletions(-) diff --git a/migration/20.10/2010.sql b/migration/20.10/2010.sql index 5da182c85b7..48f72fe356b 100755 --- a/migration/20.10/2010.sql +++ b/migration/20.10/2010.sql @@ -241,6 +241,7 @@ CREATE TABLE IF NOT EXISTS registered_mail_resources ( number INTEGER NOT NULL, reference TEXT, generated BOOL NOT NULL DEFAULT FALSE, + deposit_id INTEGER, CONSTRAINT registered_mail_resources_pkey PRIMARY KEY (id), CONSTRAINT registered_mail_resources_unique_key UNIQUE (res_id) ); diff --git a/rest/index.php b/rest/index.php index 5717dfcefaa..d3847839532 100755 --- a/rest/index.php +++ b/rest/index.php @@ -630,6 +630,9 @@ $app->get('/registeredMail/ranges/type/{type}/last', \RegisteredMail\controllers $app->get('/registeredMail/sites/type/{type}', \RegisteredMail\controllers\IssuingSiteController::class . ':getByType'); $app->get('/registeredMail/countries', \RegisteredMail\controllers\RegisteredMailController::class . ':getCountries'); + +$app->get('/registeredMails/{resId}', \RegisteredMail\controllers\RegisteredMailController::class . ':getById'); +$app->put('/registeredMails/{resId}', \RegisteredMail\controllers\RegisteredMailController::class . ':update'); //TODO remove $app->get('/registeredMail/print', \RegisteredMail\controllers\RegisteredMailController::class . ':printTest'); $app->get('/registeredMail/printDeposit', \RegisteredMail\controllers\RegisteredMailController::class . ':printDepositSlipTest'); diff --git a/sql/structure.sql b/sql/structure.sql index 70f2079608b..a9c4a4a94a3 100755 --- a/sql/structure.sql +++ b/sql/structure.sql @@ -1456,6 +1456,7 @@ CREATE TABLE IF NOT EXISTS registered_mail_resources ( number INTEGER NOT NULL, reference TEXT, generated BOOL NOT NULL DEFAULT FALSE, + deposit_id INTEGER, CONSTRAINT registered_mail_resources_pkey PRIMARY KEY (id), CONSTRAINT registered_mail_resources_unique_key UNIQUE (res_id) ); diff --git a/src/app/registeredMail/controllers/RegisteredMailController.php b/src/app/registeredMail/controllers/RegisteredMailController.php index dbdd0869a1f..800a894ffdf 100644 --- a/src/app/registeredMail/controllers/RegisteredMailController.php +++ b/src/app/registeredMail/controllers/RegisteredMailController.php @@ -14,8 +14,12 @@ namespace RegisteredMail\controllers; use Com\Tecnick\Barcode\Barcode; +use RegisteredMail\models\IssuingSiteModel; use RegisteredMail\models\RegisteredMailModel; +use RegisteredMail\models\RegisteredNumberRangeModel; +use Resource\controllers\ResController; use Resource\models\ResModel; +use Respect\Validation\Validator; use setasign\Fpdi\Tcpdf\Fpdi; use Slim\Http\Request; use Slim\Http\Response; @@ -23,6 +27,91 @@ use SrcCore\models\ValidatorModel; class RegisteredMailController { + public function getById(Request $request, Response $response, array $args) + { + if (!ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) { + return $response->withStatus(400)->withJson(['errors' => 'Resource out of perimeter']); + } + + $registeredMail = RegisteredMailController::getFormattedRegisteredMail(['resId' => $args['resId']]); + if (empty($registeredMail)) { + return $response->withStatus(400)->withJson(['errors' => 'No registered mail for this resource']); + } + + return $response->withJson($registeredMail); + } + + public function update(Request $request, Response $response, array $args) + { + if (!ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) { + return $response->withStatus(400)->withJson(['errors' => 'Resource out of perimeter']); + } + + $registeredMail = RegisteredMailModel::getByResId(['select' => ['issuing_site', 'type', 'deposit_id'], 'resId' => $args['resId']]); + if (empty($registeredMail)) { + return $response->withStatus(400)->withJson(['errors' => 'No registered mail for this resource']); + } elseif (!empty($registeredMail['deposit_id'])) { + return $response->withStatus(400)->withJson(['errors' => 'Registered mail can not be modified (deposit list already generated)']); + } + + $body = $request->getParsedBody(); + + if (!Validator::stringType()->notEmpty()->validate($body['type'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body type is empty or not a string']); + } elseif (!Validator::stringType()->notEmpty()->validate($body['warranty'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body warranty is empty or not a string']); + } elseif (!Validator::date()->notEmpty()->validate($body['departureDate'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body departureDate is empty or not a date']); + } elseif (!in_array($body['type'], ['2D', '2C', 'RW'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body type is not correct']); + } elseif (!in_array($body['type'], ['2D', '2C', 'RW'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body type is not correct']); + } elseif (!in_array($body['warranty'], ['R1', 'R2', 'R3'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body warranty is not correct']); + } elseif ($body['type'] == 'RW' && $body['warranty'] == 'R3') { + return $response->withStatus(400)->withJson(['errors' => 'Body warranty R3 is not allowed for type RW']); + } + + ResModel::update(['set' => ['departure_date' => $body['departureDate']], 'where' => ['res_id = ?'], 'data' => [$args['resId']]]); + + $date = new \DateTime($body['departureDate']); + $date = $date->format('d/m/Y'); + + $set = [ + 'type' => $body['type'], + 'warranty' => $body['warranty'], + 'reference' => "{$date} - {$body['reference']}" + ]; + + if ($registeredMail['type'] != $body['type']) { + $range = RegisteredNumberRangeModel::get([ + 'select' => ['id', 'range_end', 'current_number'], + 'where' => ['type = ?', 'site_id = ?', 'status = ?'], + 'data' => [$body['type'], $registeredMail['issuing_site'], 'OK'] + ]); + if (empty($range)) { + return $response->withStatus(400)->withJson(['errors' => 'No range found']); + } + + $status = $range[0]['current_number'] + 1 > $range[0]['range_end'] ? 'DEL' : 'OK'; + RegisteredNumberRangeModel::update([ + 'set' => ['current_number' => $range[0]['current_number'] + 1, 'status' => $status], + 'where' => ['id = ?'], + 'data' => [$range[0]['id']] + ]); + + $set['number'] = $range[0]['current_number']; + } + + RegisteredMailModel::update([ + 'set' => $set, + 'where' => ['res_id = ?'], + 'data' => [$args['resId']] + ]); + + return $response->withStatus(204); + } + public function getCountries(Request $request, Response $response) { $countries = []; @@ -55,31 +144,6 @@ class RegisteredMailController return $registeredMailNumber; } - public static function isRegisteredMailClosed(array $args) - { - ValidatorModel::notEmpty($args, ['resId']); - ValidatorModel::intVal($args, ['resId']); - - $registeredMail = RegisteredMailModel::getByResId(['select' => ['generated'], 'resId' => $args['resId']]); - if (empty($registeredMail['generated'])) { - return false; - } - - $resource = ResModel::getById(['select' => ['departure_date'], 'resId' => $args['resId']]); - if (empty($resource['departure_date'])) { - return ['errors' => ['Departure date is empty']]; - } - $departureDate = new \DateTime($resource['departure_date']); - $today = new \DateTime(); - $today->setTime(16, 00); - - if ($departureDate > $today) { - return false; - } - - return true; - } - public function printTest(Request $request, Response $response) { $args = [ @@ -701,4 +765,38 @@ class RegisteredMailController $fileContent = $pdf->Output('', 'S'); return ['encodedFileContent' => base64_encode($fileContent)]; } + + public static function getFormattedRegisteredMail(array $args) + { + ValidatorModel::notEmpty($args, ['resId']); + ValidatorModel::intVal($args, ['resId']); + + $registeredMail = RegisteredMailModel::getByResId(['select' => ['issuing_site', 'type', 'deposit_id', 'warranty', 'letter', 'recipient', 'reference', 'generated', 'number'], 'resId' => $args['resId']]); + + if (!empty($registeredMail)) { + $registeredMail['recipient'] = json_decode($registeredMail['recipient'], true); + $registeredMail['number'] = RegisteredMailController::getRegisteredMailNumber(['type' => $registeredMail['type'], 'rawNumber' => $registeredMail['number']]); + + $issuingSite = IssuingSiteModel::getById([ + 'id' => $registeredMail['issuing_site'], + 'select' => ['label', 'post_office_label', 'address_number', 'address_street', 'address_additional1', 'address_additional2', 'address_postcode', 'address_town', 'address_country'] + ]); + + $registeredMail['issuingSite'] = [ + 'id' => $registeredMail['issuing_site'], + 'label' => $issuingSite['label'], + 'postOfficeLabel' => $issuingSite['post_office_label'], + 'addressNumber' => $issuingSite['address_number'], + 'addressStreet' => $issuingSite['address_street'], + 'addressAdditional1' => $issuingSite['address_additional1'], + 'addressAdditional2' => $issuingSite['address_additional2'], + 'addressPostcode' => $issuingSite['address_postcode'], + 'addressTown' => $issuingSite['address_town'], + 'addressCountry' => $issuingSite['address_country'] + ]; + unset($registeredMail['issuing_site']); + } + + return $registeredMail; + } } diff --git a/src/app/registeredMail/controllers/RegisteredMailTrait.php b/src/app/registeredMail/controllers/RegisteredMailTrait.php index c679a7b1bc1..2a99fa2b969 100644 --- a/src/app/registeredMail/controllers/RegisteredMailTrait.php +++ b/src/app/registeredMail/controllers/RegisteredMailTrait.php @@ -37,7 +37,7 @@ trait RegisteredMailTrait if (!in_array($args['data']['type'], ['2D', '2C', 'RW'])) { return ['errors' => ['Type is not correct']]; } elseif (!in_array($args['data']['warranty'], ['R1', 'R2', 'R3'])) { - return ['errors' => ['Type is not correct']]; + return ['errors' => ['Warranty is not correct']]; } elseif ($args['data']['type'] == 'RW' && $args['data']['warranty'] == 'R3') { return ['errors' => ['R3 warranty is not allowed for type RW']]; } diff --git a/src/app/registeredMail/models/RegisteredMailModel.php b/src/app/registeredMail/models/RegisteredMailModel.php index 6bb9280bd2e..a023be78c4e 100644 --- a/src/app/registeredMail/models/RegisteredMailModel.php +++ b/src/app/registeredMail/models/RegisteredMailModel.php @@ -94,6 +94,21 @@ class RegisteredMailModel return true; } + public static function update(array $args) + { + ValidatorModel::notEmpty($args, ['where', 'data']); + ValidatorModel::arrayType($args, ['set', 'where', 'data']); + + DatabaseModel::update([ + 'table' => 'registered_mail_resources', + 'set' => $args['set'], + 'where' => $args['where'], + 'data' => $args['data'] + ]); + + return true; + } + public static function getWithResources(array $args = []) { ValidatorModel::arrayType($args, ['select', 'where', 'data']); diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index 2218b94fd32..19d65ec9439 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -38,6 +38,9 @@ use IndexingModel\models\IndexingModelFieldModel; use MessageExchange\models\MessageExchangeModel; use Note\models\NoteModel; use Priority\models\PriorityModel; +use RegisteredMail\controllers\RegisteredMailController; +use RegisteredMail\models\IssuingSiteModel; +use RegisteredMail\models\RegisteredMailModel; use Resource\models\ResModel; use Resource\models\ResourceContactModel; use Resource\models\UserFollowedResourceModel; @@ -230,6 +233,10 @@ class ResController extends ResourceControlController $tags = ResourceTagModel::get(['select' => ['tag_id'], 'where' => ['res_id = ?'], 'data' => [$args['resId']]]); $formattedData['tags'] = array_column($tags, 'tag_id'); + + if ($formattedData['categoryId'] == 'registeredMail') { + $formattedData['registeredMail'] = RegisteredMailController::getFormattedRegisteredMail(['resId' => $args['resId']]); + } } else { $followed = UserFollowedResourceModel::get([ 'select' => [1], -- GitLab