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