From 059640dd65790020da964e51eeb1449bc69b682e Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Thu, 28 Feb 2019 18:07:54 +0100
Subject: [PATCH] FEAT #9514 download acknowledgement receipt

---
 rest/index.php                                |  1 +
 .../AcknowledgementReceiptController.php      | 80 ++++++++++++++++++-
 .../models/AcknowledgementReceiptModel.php    | 22 ++++-
 3 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/rest/index.php b/rest/index.php
index da163d1fd98..3237b30e28b 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -270,6 +270,7 @@ $app->put('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/exp
 $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/summarySheets', \Resource\controllers\SummarySheetController::class . ':createList');
 $app->put('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}', \Resource\controllers\ResourceListController::class . ':setAction');
 $app->get('/resourcesList/exportTemplate', \Resource\controllers\ExportController::class . ':getExportTemplates');
+$app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/acknowledgementReceipt', \AcknowledgementReceipt\controllers\AcknowledgementReceiptController::class . ':createPaperAcknowledgement');
 
 //SignatureBook
 $app->get('/signatureBook/users/{userId}/groups/{groupId}/baskets/{basketId}/resources', \SignatureBook\controllers\SignatureBookController::class . ':getResources');
diff --git a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
index 461b707c1e7..2390e30d14e 100644
--- a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
+++ b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
@@ -14,7 +14,85 @@
 
 namespace AcknowledgementReceipt\controllers;
 
+use setasign\Fpdi\Tcpdf\Fpdi;
+use AcknowledgementReceipt\models\AcknowledgementReceiptModel;
+use SrcCore\controllers\PreparedClauseController;
+use User\models\UserModel;
+use Basket\models\BasketModel;
+use Resource\models\ResModel;
+use Docserver\models\DocserverModel;
+use Docserver\models\DocserverTypeModel;
+use Resource\controllers\StoreController;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use Respect\Validation\Validator;
+use Resource\controllers\ResourceListController;
+
 class AcknowledgementReceiptController
 {
+    public function createPaperAcknowledgement(Request $request, Response $response, array $aArgs)
+    {
+        $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
+
+        $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]);
+        if (!empty($errors['errors'])) {
+            return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
+        }
+
+        $bodyData = $request->getParsedBody();
+
+        if (!Validator::arrayType()->notEmpty()->validate($bodyData['resources'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Resources is not set or empty']);
+        }
+
+        $bodyData['resources'] = array_slice($bodyData['resources'], 0, 500);
+        $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name']]);
+        $user   = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
+
+        $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
+        $rawResourcesInBasket = ResModel::getOnView([
+            'select'    => ['res_id'],
+            'where'     => [$whereClause, 'res_view_letterbox.res_id in (?)'],
+            'data'      => [$bodyData['resources']]
+        ]);
+
+        $pdf = new Fpdi('P', 'pt');
+        $pdf->setPrintHeader(false);
+
+        $acknowledgement = AcknowledgementReceiptModel::getByResIds([
+            'select'  => ['res_id', 'docserver_id', 'path', 'filename', 'fingerprint', 'send_date'],
+            'resIds'  => $rawResourcesInBasket,
+            'orderBy' => ['res_id']
+        ]);
+
+        foreach ($acknowledgement as $value) {
+            if (empty($value['send_date'])) {
+                $docserver = DocserverModel::getByDocserverId(['docserverId' => $value['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]);
+                if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
+                    return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']);
+                }
+                $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $value['path']) . $value['filename'];
+                if (!file_exists($pathToDocument)) {
+                    return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']);
+                }
+
+                $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]);
+                $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]);
+                if (!empty($value['fingerprint']) && $value['fingerprint'] != $fingerprint) {
+                    return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']);
+                }
+
+                $pdf->setSourceFile($pathToDocument);
+            }
+        }
+
+        $fileContent = $pdf->Output('', 'S');
+        $finfo    = new \finfo(FILEINFO_MIME_TYPE);
+        $mimeType = $finfo->buffer($fileContent);
+
+        $response->write($fileContent);
+        $response = $response->withAddedHeader('Content-Disposition', "inline; filename=maarch.pdf");
 
-}
\ No newline at end of file
+        return $response->withHeader('Content-Type', $mimeType);
+    }
+}
diff --git a/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php b/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php
index b17ceefeaec..d963e490a9d 100644
--- a/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php
+++ b/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php
@@ -26,7 +26,7 @@ class AcknowledgementReceiptModel
 
         $aTemplates = DatabaseModel::select([
             'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['acknowledgment_receipts'],
+            'table'     => ['acknowledgement_receipts'],
             'where'     => empty($aArgs['where']) ? [] : $aArgs['where'],
             'data'      => empty($aArgs['data']) ? [] : $aArgs['data'],
             'order_by'  => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'],
@@ -36,13 +36,29 @@ class AcknowledgementReceiptModel
         return $aTemplates;
     }
 
+    public static function getByResIds(array $aArgs = [])
+    {
+        ValidatorModel::notEmpty($aArgs, ['resIds']);
+        ValidatorModel::arrayType($aArgs, ['select', 'orderBy', 'resIds']);
+
+        $aTemplates = DatabaseModel::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['acknowledgement_receipts'],
+            'where'     => ['res_id in (?)'],
+            'data'      => $aArgs['resIds'],
+            'order_by'  => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy']
+        ]);
+
+        return $aTemplates;
+    }
+
     public static function update(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
         ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
 
         DatabaseModel::update([
-            'table' => 'acknowledgment_receipts',
+            'table' => 'acknowledgement_receipts',
             'set'   => $aArgs['set'],
             'where' => $aArgs['where'],
             'data'  => $aArgs['data']
@@ -57,7 +73,7 @@ class AcknowledgementReceiptModel
         ValidatorModel::arrayType($aArgs, ['where', 'data']);
 
         DatabaseModel::delete([
-            'table' => 'acknowledgment_receipts',
+            'table' => 'acknowledgement_receipts',
             'where' => $aArgs['where'],
             'data'  => $aArgs['data']
         ]);
-- 
GitLab