Verbesserungen am Dokumentenmanagement (#16)

parent b8940f29
......@@ -250,10 +250,12 @@
PRIMARY KEY (Identifier)
);",
"CREATE TABLE documents ( -- Zuweisung von Dokumenten zu Dokumentationen
DocID INTEGER PRIMARY KEY AUTOINCREMENT, -- ID des Dokuments
DocID INTEGER PRIMARY KEY AUTOINCREMENT, -- ID des Dokuments
ProcessID INT NOT NULL, -- ID der Dokumentation
Description TEXT NOT NULL DEFAULT '', -- Beschreibung
FileRef TEXT NOT NULL, -- Verweis auf Datei
FileSize INT NOT NULL DEFAULT 0, -- Dateigröße
Attach INT NOT NULL DEFAULT 0, -- Dokument an Abschluss-PDF anhängen?
Date DATE NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), -- Letztes Änderungsdatum
FOREIGN KEY (ProcessID) REFERENCES verfahren(ID) ON UPDATE CASCADE ON DELETE CASCADE
);"
......@@ -393,10 +395,12 @@
);",
# 17
"CREATE TABLE documents ( -- Zuweisung von Dokumenten zu Dokumentationen
DocID INTEGER PRIMARY KEY AUTOINCREMENT, -- ID des Dokuments
DocID INTEGER PRIMARY KEY AUTOINCREMENT, -- ID des Dokuments
ProcessID INT NOT NULL, -- ID der Dokumentation
Description TEXT NOT NULL DEFAULT '', -- Beschreibung
FileRef TEXT NOT NULL, -- Verweis auf Datei
FileSize INT NOT NULL DEFAULT 0, -- Dateigröße
Attach INT NOT NULL DEFAULT 0, -- Dokument an Abschluss-PDF anhängen?
Date DATE NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), -- Letztes Änderungsdatum
FOREIGN KEY (ProcessID) REFERENCES verfahren(ID) ON UPDATE CASCADE ON DELETE CASCADE
);"
......@@ -606,7 +610,7 @@
$this->pdo->beginTransaction();
# Neue Tabelle für angehängte Dokumente
$this->pdo->exec(self::TABLES[17]);
# Alte TOMs auf 'unbearbeitet' setzen, wenn nicht umgesetzt und kein Kommentar hinterlegt
$sth1 = $this->pdo->prepare('SELECT ID, JSON FROM verfahren WHERE NOT Status = 3;');
$sth2 = $this->pdo->prepare('UPDATE verfahren SET JSON = ? WHERE ID = ?;');
......@@ -1903,7 +1907,7 @@
* Gibt alle Dokumente zurück, die an eine Dokumentation angehangen sind.
*
* @param int $verfahrensId ID einer Dokumentation
* @return mixed[] Array mit den Einträgen in der Form [['DocID' => 1, 'ProcessID' => 2, 'Description' => 'Test', 'FileRef' => 'test.pdf', 'Date' => '2020-09-08 12:06:18']]
* @return mixed[] Array mit den Einträgen in der Form [['DocID' => 1, 'ProcessID' => 2, 'Description' => 'Test', 'FileRef' => 'test.pdf', 'FileSize' => 1200, 'Attach' => 0, 'Date' => '2020-09-08 12:06:18']]
* @throws PDOException
* @throws Exception
*/
......@@ -1930,7 +1934,7 @@
* Gibt die Detals zu einem Dokument zurück.
*
* @param int $docID ID eines Dokuments
* @return mixed[] Array mit den Einträgen in der Form ['DocID' => 1, 'ProcessID' => 2, 'Description' => 'Test', 'FileRef' => 'test.pdf', 'Date' => '2020-09-08 12:06:18']
* @return mixed[] Array mit den Einträgen in der Form ['DocID' => 1, 'ProcessID' => 2, 'Description' => 'Test', 'FileRef' => 'test.pdf', 'FileSize' => 1200, 'Attach' => 0, 'Date' => '2020-09-08 12:06:18']
* @throws PDOException
* @throws Exception
*/
......@@ -1963,20 +1967,22 @@
* @param int $verfahrensId ID einer Dokumentation
* @param string $description Beschreibung des Dokuments
* @param string $fileRef Dateireferenz
* @param bool $attach Gibt an, ob die Datei an die Abschluss-PDF angehängt werden soll
* @param int $fileSize Dateigröße in Bytes
* @return int ID des neuen Dokuments; -1 bei fehlenden Berechtigungen
* @throws PDOException
* @throws Exception
*/
public function addDocument($verfahrensId, $description, $fileRef) {
public function addDocument($verfahrensId, $description, $fileRef, $fileSize, $attach) {
if(!$this->isConnected()) {
throw new Exception("DBCon.class.php -> Keine aktive Datenbank-Verbindung!");
}
$sql = 'INSERT INTO documents (ProcessID, Description, FileRef) VALUES (?, ?, ?);';
$sql = 'INSERT INTO documents (ProcessID, Description, FileRef, FileSize, Attach) VALUES (?, ?, ?, ?, ?);';
$sth = $this->pdo->prepare($sql);
$sth->execute([$verfahrensId, $description, $fileRef]);
$sth->execute([$verfahrensId, $description, $fileRef, $fileSize, ($attach ? 1 : 0)]);
ob_start();
$sth->debugDumpParams();
......@@ -2016,16 +2022,16 @@
* @throws PDOException
* @throws Exception
*/
public function updateDocument($docID, $description, $fileRef) {
public function updateDocument($docID, $description, $fileRef, $fileSize, $attach) {
if(!$this->isConnected()) {
throw new Exception("DBCon.class.php -> Keine aktive Datenbank-Verbindung!");
}
$sql = 'UPDATE documents SET Description = ?, FileRef = ?, Date = (datetime(CURRENT_TIMESTAMP, \'localtime\')) WHERE DocID = ?;';
$sql = 'UPDATE documents SET Description = ?, FileRef = ?, FileSize = ?, Attach = ?, Date = (datetime(CURRENT_TIMESTAMP, \'localtime\')) WHERE DocID = ?;';
$sth = $this->pdo->prepare($sql);
$sth->execute([$description, $fileRef, $docID]);
$sth->execute([$description, $fileRef, $fileSize, ($attach ? 1 : 0), $docID]);
ob_start();
$sth->debugDumpParams();
......
......@@ -173,8 +173,9 @@
# ----------------------------------------
# Konfiguration der Dokumentenverwaltung
# ----------------------------------------
$docmgmt_method = 'local'; # Aktuell nur local unterstützt
$docmgmt_class = $docmgmt_method . 'DocMGMT';
$docmgmt_method = 'local'; # Aktuell nur local unterstützt
$docmgmt_maxAttachSize = 12 * 1024 * 1024; # Anhangsgröße in Bytes, ab wann eine Warnung angezeigt wird (Default: 12MB)
$docmgmt_class = $docmgmt_method . 'DocMGMT';
# ----------------------------------------
# Lokale Konfiguration laden
......
......@@ -249,7 +249,7 @@
require_once '../vendor/autoload.php';
global $dbcon, $userId, $pdf_dir, $prog_name, $prog_version, $prog_url, $docmgmtClass, $temp_dir;
global $dbcon, $userId, $pdf_dir, $prog_name, $prog_version, $prog_url, $docmgmtClass, $docmgmt_maxAttachSize, $temp_dir;
$res = Utils::searchUsers($userId, TRUE);
$author = !empty($res) ? $res[0]['name'] : '';
......@@ -323,10 +323,16 @@ EOH;
if(!$isDraft) {
# Angehängte PDF-Dokumente einbetten
$attachedDocs = $dbcon->listDocuments($verfahrensId);
$attachedDocs = array_filter($attachedDocs, function($doc) { return ($doc['Attach'] > 0 ? TRUE : FALSE); });
$attachedSize = 0;
if(count($attachedDocs) > 0) {
$mpdf->Bookmark("Angehängte Dokumente", 0);
}
foreach($attachedDocs as $doc) {
# Prüfen, ob Anhanggröße überschritten wird
$attachedSize += $doc['FileSize'];
if($attachedSize > $docmgmt_maxAttachSize) break;
$file = $docmgmtClass->getDocument($verfahrensId, $doc['FileRef']);
$tmpFile = $temp_dir . DIRECTORY_SEPARATOR . "{$verfahrensId}_{$doc['DocID']}.pdf";
if(file_put_contents($tmpFile, base64_decode($file['fileContent'])) === FALSE) {
......@@ -1791,7 +1797,7 @@ EOH;
if(empty($newFileRef)) returnError('Konnte Dokument nicht abspeichern!');
$newDocID = $dbcon->addDocument($verfahrensId, !empty($data['description']) ? $data['description'] : '', $newFileRef);
$newDocID = $dbcon->addDocument($verfahrensId, (!empty($data['description']) ? $data['description'] : ''), $newFileRef, strlen(base64_decode($data['filecontent'])), (!empty($data['attach']) ? intval($data['attach']) : 0));
if($newDocID === -1) returnError('Konnte Document nicht in Datenbank anlegen!');
......@@ -1823,15 +1829,17 @@ EOH;
global $docmgmtClass;
$newFileRef = $docmgmtClass->updateDocument($docDetails['ProcessID'], $docDetails['FileRef'], $data['filename'], $data['filecontent']);
$newFileRef = $docmgmtClass->updateDocument($docDetails['ProcessID'], $docDetails['FileRef'], $data['filename'], $data['filecontent']);
$newFileSize = strlen(base64_decode($data['filecontent']));
if(empty($newFileRef)) returnError('Konnte Dokument nicht abspeichern!');
}
else {
$newFileRef = $docDetails['FileRef'];
$newFileRef = $docDetails['FileRef'];
$newFileSize = $docDetails['FileSize'];
}
if(!$dbcon->updateDocument($docDetails['DocID'], !empty($data['description']) ? $data['description'] : '', $newFileRef)) returnError('Konnte Document nicht in Datenbank aktualisieren!');
if(!$dbcon->updateDocument($docDetails['DocID'], !empty($data['description']) ? $data['description'] : '', $newFileRef, $newFileSize, (array_key_exists('attach', $data) && $data['attach'] ? 1 : 0))) returnError('Konnte Document nicht in Datenbank aktualisieren!');
$output['success'] = TRUE;
break;
......@@ -1901,9 +1909,16 @@ EOH;
$documents = $dbcon->listDocuments($verfahrensId);
$output['success'] = TRUE;
$output['data'] = $documents;
$output['count'] = count($documents);
$combinedSize = 0;
foreach($documents as $doc) {
if($doc['Attach'] > 0) $combinedSize += $doc['FileSize'];
}
$output['success'] = TRUE;
$output['data'] = $documents;
$output['sizewarn'] = $combinedSize > $docmgmt_maxAttachSize ? TRUE : FALSE;
$output['maxsize'] = $docmgmt_maxAttachSize;
$output['count'] = count($documents);
break;
}
......
......@@ -463,11 +463,14 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<div class="alert alert-warning hidden" id="attached_documents_warning"></div>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Dateigröße</th>
<th>Beschreibung</th>
<th>Anhängen?</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
......
......@@ -458,11 +458,14 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<div class="alert alert-warning hidden" id="attached_documents_warning"></div>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Dateigröße</th>
<th>Beschreibung</th>
<th>Anhängen?</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
......
......@@ -146,11 +146,14 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<div class="alert alert-warning hidden" id="attached_documents_warning"></div>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Dateigröße</th>
<th>Beschreibung</th>
<th>Anhängen?</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
......
......@@ -590,11 +590,14 @@ Art. 35 DSGVO" class="fa fa-question-circle-o fa-lg"></i></h6>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<div class="alert alert-warning hidden" id="attached_documents_warning"></div>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Dateigröße</th>
<th>Beschreibung</th>
<th>Anhängen?</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
......
......@@ -185,6 +185,25 @@ function htmlDecode(input) {
return doc.documentElement.textContent;
}
/**
* Wandelt Dateigrößen in Bytes in eine lesbare Größenanzeige um
* @see {@link https://stackoverflow.com/a/18650828}
* @param {Number} bytes Dateigröße in Bytes
* @param {Number} decimals (optional) Nachkommanstellen
* @return {String} Dateigröße (human-readable)
*/
function formatBytes(bytes, decimals = 2) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}
/**
* Generiert eine Debug-Ausgabe, falls der globale debug-Parameter 'true' ist
* @param {Object} msg Ausgabenachricht (kann null sein) (wird mittels console.log(msg) ausgegeben)
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment