Skip to content
Snippets Groups Projects
Verified Commit 2518980d authored by Florian Azizian's avatar Florian Azizian
Browse files

FEAT #9514 display acknowledgement receipt

parent c446e294
No related branches found
No related tags found
No related merge requests found
...@@ -129,7 +129,7 @@ if (!empty($tab)) { ...@@ -129,7 +129,7 @@ if (!empty($tab)) {
// TO DO : LINK ROUTE // TO DO : LINK ROUTE
$download = array( $download = array(
"script" => "window.open('../../rest/res/".$identifier."/content','_blank');", "script" => "window.open('../../rest/res/".$identifier."/acknowledgementReceipt/@@id@@','acknowledgementReceipt');",
"icon" => 'eye', "icon" => 'eye',
"tooltip" => _VIEW_DOC, "tooltip" => _VIEW_DOC,
"disabledRules" => "empty(@@id@@)" "disabledRules" => "empty(@@id@@)"
......
...@@ -906,7 +906,7 @@ if ($mode == 'add') { ...@@ -906,7 +906,7 @@ if ($mode == 'add') {
$content .= '</table>'; $content .= '</table>';
//Filename //Filename
$filename = 'notes_'.$identifier.'_'.date(dmY).'.html'; $filename = 'notes_'.$identifier.'_'.date('dmY').'.html';
$all_joined_files .= _NOTES.': '.$filename.PHP_EOL; $all_joined_files .= _NOTES.': '.$filename.PHP_EOL;
} }
} }
...@@ -1303,7 +1303,7 @@ if ($mode == 'add') { ...@@ -1303,7 +1303,7 @@ if ($mode == 'add') {
$content .= '</table>'; $content .= '</table>';
//Filename //Filename
$filename = 'notes_'.$identifier.'_'.date(dmY).'.html'; $filename = 'notes_'.$identifier.'_'.date('dmY').'.html';
$all_joined_files .= _NOTES.': '.$filename.PHP_EOL; $all_joined_files .= _NOTES.': '.$filename.PHP_EOL;
} }
} }
......
...@@ -253,6 +253,7 @@ $app->post('/res', \Resource\controllers\ResController::class . ':createRes'); ...@@ -253,6 +253,7 @@ $app->post('/res', \Resource\controllers\ResController::class . ':createRes');
$app->post('/resExt', \Resource\controllers\ResController::class . ':createExt'); $app->post('/resExt', \Resource\controllers\ResController::class . ':createExt');
$app->get('/res/{resId}/content', \Resource\controllers\ResController::class . ':getFileContent'); $app->get('/res/{resId}/content', \Resource\controllers\ResController::class . ':getFileContent');
$app->get('/res/{resId}/thumbnail', \Resource\controllers\ResController::class . ':getThumbnailContent'); $app->get('/res/{resId}/thumbnail', \Resource\controllers\ResController::class . ':getThumbnailContent');
$app->get('/res/{resId}/acknowledgementReceipt/{id}', \Resource\controllers\ResController::class . ':getAcknowledgementReceipt');
$app->put('/res/resource/status', \Resource\controllers\ResController::class . ':updateStatus'); $app->put('/res/resource/status', \Resource\controllers\ResController::class . ':updateStatus');
$app->post('/res/list', \Resource\controllers\ResController::class . ':getList'); $app->post('/res/list', \Resource\controllers\ResController::class . ':getList');
$app->get('/res/{resId}/notes/count', \Resource\controllers\ResController::class . ':getNotesCountForCurrentUserById'); $app->get('/res/{resId}/notes/count', \Resource\controllers\ResController::class . ':getNotesCountForCurrentUserById');
......
...@@ -36,6 +36,25 @@ class AcknowledgementReceiptModel ...@@ -36,6 +36,25 @@ class AcknowledgementReceiptModel
return $aTemplates; return $aTemplates;
} }
public static function getById(array $aArgs)
{
ValidatorModel::notEmpty($aArgs, ['id']);
ValidatorModel::intVal($aArgs, ['id']);
$aReturn = DatabaseModel::select([
'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
'table' => ['acknowledgement_receipts'],
'where' => ['id = ?'],
'data' => [$aArgs['id']]
]);
if (empty($aReturn[0])) {
return [];
}
return $aReturn[0];
}
public static function getByResIds(array $aArgs = []) public static function getByResIds(array $aArgs = [])
{ {
ValidatorModel::notEmpty($aArgs, ['resIds']); ValidatorModel::notEmpty($aArgs, ['resIds']);
......
...@@ -38,6 +38,7 @@ use SrcCore\models\CoreConfigModel; ...@@ -38,6 +38,7 @@ use SrcCore\models\CoreConfigModel;
use SrcCore\models\ValidatorModel; use SrcCore\models\ValidatorModel;
use Status\models\StatusModel; use Status\models\StatusModel;
use User\models\UserModel; use User\models\UserModel;
use AcknowledgementReceipt\models\AcknowledgementReceiptModel;
class ResController class ResController
{ {
...@@ -232,7 +233,7 @@ class ResController ...@@ -232,7 +233,7 @@ class ResController
return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']); return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
} }
$document = ResModel::getById(['select' => ['docserver_id', 'path', 'filename'], 'resId' => $aArgs['resId']]); $document = ResModel::getById(['select' => ['docserver_id', 'path', 'filename', 'fingerprint'], 'resId' => $aArgs['resId']]);
$extDocument = ResModel::getExtById(['select' => ['category_id', 'alt_identifier'], 'resId' => $aArgs['resId']]); $extDocument = ResModel::getExtById(['select' => ['category_id', 'alt_identifier'], 'resId' => $aArgs['resId']]);
if (empty($document) || empty($extDocument)) { if (empty($document) || empty($extDocument)) {
return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']); return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']);
...@@ -296,7 +297,6 @@ class ResController ...@@ -296,7 +297,6 @@ class ResController
if ($loadedXml) { if ($loadedXml) {
$watermark = (array)$loadedXml->FEATURES->watermark; $watermark = (array)$loadedXml->FEATURES->watermark;
if ($watermark['enabled'] == 'true') { if ($watermark['enabled'] == 'true') {
$text = "watermark by {$GLOBALS['userId']}"; $text = "watermark by {$GLOBALS['userId']}";
if (!empty($watermark['text'])) { if (!empty($watermark['text'])) {
$text = $watermark['text']; $text = $watermark['text'];
...@@ -308,7 +308,7 @@ class ResController ...@@ -308,7 +308,7 @@ class ResController
$tmp = date('d-m-Y'); $tmp = date('d-m-Y');
} elseif ($value == 'hour_now') { } elseif ($value == 'hour_now') {
$tmp = date('H:i'); $tmp = date('H:i');
} elseif($value == 'alt_identifier'){ } elseif ($value == 'alt_identifier') {
$tmp = $extDocument['alt_identifier']; $tmp = $extDocument['alt_identifier'];
} else { } else {
$backFromView = ResModel::getOnView(['select' => $value, 'where' => ['res_id = ?'], 'data' => [$aArgs['resId']]]); $backFromView = ResModel::getOnView(['select' => $value, 'where' => ['res_id = ?'], 'data' => [$aArgs['resId']]]);
...@@ -391,6 +391,64 @@ class ResController ...@@ -391,6 +391,64 @@ class ResController
return $response->withHeader('Content-Type', $mimeType); return $response->withHeader('Content-Type', $mimeType);
} }
public function getAcknowledgementReceipt(Request $request, Response $response, array $aArgs)
{
if (!Validator::intVal()->validate($aArgs['resId']) || !ResController::hasRightByResId(['resId' => $aArgs['resId'], 'userId' => $GLOBALS['userId']])) {
return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
}
$mainDocument = ResModel::getById(['select' => ['docserver_id', 'path', 'filename', 'fingerprint'], 'resId' => $aArgs['resId']]);
$extDocument = ResModel::getExtById(['select' => ['category_id', 'alt_identifier'], 'resId' => $aArgs['resId']]);
if (empty($mainDocument) || empty($extDocument)) {
return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']);
}
$document = AcknowledgementReceiptModel::getById([
'select' => ['docserver_id', 'path', 'filename', 'fingerprint'],
'id' => $aArgs['id']
]);
$docserver = DocserverModel::getByDocserverId(['docserverId' => $document['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, $document['path']) . $document['filename'];
if (!file_exists($pathToDocument)) {
return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']);
}
$fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => 'SHA256']);
if (!empty($document['fingerprint']) && $document['fingerprint'] != $fingerprint) {
return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']);
}
$fileContent = file_get_contents($pathToDocument);
if ($fileContent === false) {
return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']);
}
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($fileContent);
$pathInfo = pathinfo($pathToDocument);
$response->write($fileContent);
$response = $response->withAddedHeader('Content-Disposition', "inline; filename=maarch.{$pathInfo['extension']}");
HistoryController::add([
'tableName' => 'res_letterbox',
'recordId' => $aArgs['resId'],
'eventType' => 'VIEW',
'info' => _DOC_DISPLAYING . " : {$aArgs['resId']}",
'moduleId' => 'res',
'eventId' => 'resview',
]);
return $response->withHeader('Content-Type', $mimeType);
}
public function getThumbnailContent(Request $request, Response $response, array $aArgs) public function getThumbnailContent(Request $request, Response $response, array $aArgs)
{ {
if (!Validator::intVal()->validate($aArgs['resId'])) { if (!Validator::intVal()->validate($aArgs['resId'])) {
...@@ -468,15 +526,15 @@ class ResController ...@@ -468,15 +526,15 @@ class ResController
} }
foreach ($data['externalInfos'] as $mail) { foreach ($data['externalInfos'] as $mail) {
if(!Validator::intType()->validate($mail['res_id'])){ if (!Validator::intType()->validate($mail['res_id'])) {
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid res_id']); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid res_id']);
} }
if(!Validator::StringType()->notEmpty()->validate($mail['external_id'])){ if (!Validator::StringType()->notEmpty()->validate($mail['external_id'])) {
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid external_id for element : '.$mail['res_id']]); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid external_id for element : '.$mail['res_id']]);
} }
if(!Validator::StringType()->notEmpty()->validate($mail['external_link'])){ if (!Validator::StringType()->notEmpty()->validate($mail['external_link'])) {
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid external_link for element'.$mail['res_id']]); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: invalid external_link for element'.$mail['res_id']]);
} }
} }
foreach ($data['externalInfos'] as $mail) { foreach ($data['externalInfos'] as $mail) {
...@@ -488,7 +546,7 @@ class ResController ...@@ -488,7 +546,7 @@ class ResController
return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']); return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
} }
ResModel::update(['set' => ['external_id' => $mail['external_id'] , 'external_link' => $mail['external_link'], 'status' => $data['status']], 'where' => ['res_id = ?'], 'data' => [$document['res_id']]]); ResModel::update(['set' => ['external_id' => $mail['external_id'] , 'external_link' => $mail['external_link'], 'status' => $data['status']], 'where' => ['res_id = ?'], 'data' => [$document['res_id']]]);
} }
return $response->withJson(['success' => 'success']); return $response->withJson(['success' => 'success']);
} }
...@@ -655,15 +713,15 @@ class ResController ...@@ -655,15 +713,15 @@ class ResController
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: clause is not valid']); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: clause is not valid']);
} }
if (!empty($data['withFile'])) { if (!empty($data['withFile'])) {
if(!Validator::boolType()->validate($data['withFile'])){ if (!Validator::boolType()->validate($data['withFile'])) {
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: withFile parameter is not a boolean']); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: withFile parameter is not a boolean']);
} }
} }
if (!empty($data['orderBy'])) { if (!empty($data['orderBy'])) {
if (!Validator::arrayType()->notEmpty()->validate($data['orderBy'])) { if (!Validator::arrayType()->notEmpty()->validate($data['orderBy'])) {
return $response->withStatus(400)->withJson(['errors' => 'Bad Request: orderBy parameter not valid']); return $response->withStatus(400)->withJson(['errors' => 'Bad Request: orderBy parameter not valid']);
} }
} }
if (!empty($data['limit'])) { if (!empty($data['limit'])) {
...@@ -687,7 +745,7 @@ class ResController ...@@ -687,7 +745,7 @@ class ResController
} }
if ($data['withFile'] === true) { if ($data['withFile'] === true) {
$select[] = 'res_id'; $select[] = 'res_id';
} }
$resources = ResModel::getOnView(['select' => $select, 'where' => $where, 'orderBy' => $data['orderBy'], 'limit' => $data['limit']]); $resources = ResModel::getOnView(['select' => $select, 'where' => $where, 'orderBy' => $data['orderBy'], 'limit' => $data['limit']]);
......
...@@ -135,6 +135,7 @@ define('_MAX_SIZE_UPLOAD_REACHED', 'File maximum size is exceeded'); ...@@ -135,6 +135,7 @@ define('_MAX_SIZE_UPLOAD_REACHED', 'File maximum size is exceeded');
define('_PATH_OF_DOCSERVER_UNAPPROACHABLE', 'Inaccessible Docserver path'); define('_PATH_OF_DOCSERVER_UNAPPROACHABLE', 'Inaccessible Docserver path');
define('_BACK_FROM_VACATION', 'back from vacation'); define('_BACK_FROM_VACATION', 'back from vacation');
define('_DOC_DISPLAYING', 'Displaying document'); define('_DOC_DISPLAYING', 'Displaying document');
define('_AR_DISPLAYING', 'Displaying acknowledgement receipt');
define('_DOC_ADDED', 'Document added'); define('_DOC_ADDED', 'Document added');
define('_ATTACH_DISPLAYING', 'Displaying attachment'); define('_ATTACH_DISPLAYING', 'Displaying attachment');
define('_NOTE_ADDED', 'Note added'); define('_NOTE_ADDED', 'Note added');
......
...@@ -135,6 +135,7 @@ define('_MAX_SIZE_UPLOAD_REACHED', 'Taille maximum de fichier dépassée'); ...@@ -135,6 +135,7 @@ define('_MAX_SIZE_UPLOAD_REACHED', 'Taille maximum de fichier dépassée');
define('_PATH_OF_DOCSERVER_UNAPPROACHABLE', 'Chemin de la zone de stockage inaccessible'); define('_PATH_OF_DOCSERVER_UNAPPROACHABLE', 'Chemin de la zone de stockage inaccessible');
define('_BACK_FROM_VACATION', 'de retour de son absence'); define('_BACK_FROM_VACATION', 'de retour de son absence');
define('_DOC_DISPLAYING', 'Visualisation du document'); define('_DOC_DISPLAYING', 'Visualisation du document');
define('_AR_DISPLAYING', 'Visualisation de l\'accusé de réception');
define('_DOC_ADDED', 'Document ajouté'); define('_DOC_ADDED', 'Document ajouté');
define('_ATTACH_DISPLAYING', 'Visualisation de la pièce jointe'); define('_ATTACH_DISPLAYING', 'Visualisation de la pièce jointe');
define('_NOTE_ADDED', 'Annotation ajoutée'); define('_NOTE_ADDED', 'Annotation ajoutée');
......
...@@ -444,3 +444,5 @@ define('_ACTION_DATE', 'Action date_TO_TRANSLATE'); ...@@ -444,3 +444,5 @@ define('_ACTION_DATE', 'Action date_TO_TRANSLATE');
define('_USER_CREATED_IN_MAARCHPARAPHEUR', 'User created in Maarch Parapheur_TO_TRANSLATE'); define('_USER_CREATED_IN_MAARCHPARAPHEUR', 'User created in Maarch Parapheur_TO_TRANSLATE');
define('_SEND_ACKNOWLEDGEMENT_RECEIPT', 'Send acknowledgement receipt_TO_TRANSLATE'); define('_SEND_ACKNOWLEDGEMENT_RECEIPT', 'Send acknowledgement receipt_TO_TRANSLATE');
define('_AR_DISPLAYING', 'Displaying acknowledgement receipt_TO_TRANSLATE');
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment