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