diff --git a/application/core/FS_Model.php b/application/core/FS_Model.php index 512278374..0d696d378 100644 --- a/application/core/FS_Model.php +++ b/application/core/FS_Model.php @@ -114,15 +114,20 @@ class FS_Model extends CI_Model return success($writeResult); } + /** + * Removes a given file + */ public function remove($filename) { // Check if the property _path represents a valid directory $checkResult = $this->_checkPath(); + if (isError($checkResult)) return $checkResult; // If not then return the error // Check filename if (isEmptyString($filename)) return error('The given filename is not valid'); + // remove file if (unlink($this->_path.DIRECTORY_SEPARATOR.$filename) === true) { return success(); diff --git a/application/libraries/AkteLib.php b/application/libraries/AkteLib.php index 555b2d0f3..28094aabb 100644 --- a/application/libraries/AkteLib.php +++ b/application/libraries/AkteLib.php @@ -4,10 +4,11 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class AkteLib { - const AKTE_KATEGORIE_KURZBZ = 'Akte'; + const AKTE_KATEGORIE_KURZBZ = 'Akte'; // kategorie_kurzbz of dms when inserting for akte + const DEFAULT_USER = 'Akte'; // fallback string for insertvon if no logged user private $_ci; // Code igniter instance - private $_uid; + private $_uid; // uid of logged user /** * Object initialization @@ -23,17 +24,23 @@ class AkteLib $this->_ci->load->library('DmsLib'); } - public function add($person_id, $dokument_kurzbz, $titel, $mimetype, $fileHandle, $bezeichnung = null, $uid = null) + /** + * Writes a new file, adds a new dms entry with given akte data, + * adds a new dms version 0 for the written file, and adds Akte if dms add was successfull + * Returns success with inserted akte id or error + */ + public function add($person_id, $dokument_kurzbz, $titel, $mimetype, $fileHandle, $bezeichnung = null, $archiv = false, $signiert = false, $stud_selfservice = false) { - $dmsAddResult = $this->_ci->dmslib->add($titel, self::AKTE_KATEGORIE_KURZBZ, $mimetype, $fileHandle, $dokument_kurzbz, $bezeichnung); + // add new dms entry and new dms version for the Akte, using Akte data (title, mimetype, file content as handle) + $dmsAddResult = $this->_ci->dmslib->add($titel, $mimetype, $fileHandle, self::AKTE_KATEGORIE_KURZBZ, $dokument_kurzbz, $bezeichnung); if (isError($dmsAddResult)) return $dmsAddResult; - if (!hasData($dmsAddResult)) - return error("Dms document could not be added"); + if (!hasData($dmsAddResult)) return error("Dms document could not be added"); $dmsAddData = getData($dmsAddResult); + // insert the Akte return $this->_ci->AkteModel->insert( array( 'person_id' => $person_id, @@ -42,36 +49,42 @@ class AkteLib 'mimetype' => $mimetype, 'bezeichnung' => $bezeichnung, 'erstelltam' => date('Y-m-d'), - 'uid' => $uid, 'dms_id' => $dmsAddData->dms_id, + 'archiv' => $archiv, + 'signiert' => $signiert, + 'stud_selfservice' => $stud_selfservice, 'insertamum' => date('Y-m-d H:i:s'), - 'insertvon' => $this->_uid + 'insertvon' => isEmptyString($this->_uid) ? self::DEFAULT_USER : $this->_uid ) ); } - public function update($akte_id, $titel, $mimetype, $fileHandle, $bezeichnung = null) + /** + * Writes a new file, adds a new dms version 0 for the written file, and updates Akte if dms version add was successfull + * Returns success with updated akte id or error + */ + public function update($akte_id, $titel, $mimetype, $fileHandle, $bezeichnung = null, $archiv = false, $signiert = false, $stud_selfservice = false) { + // check if Akte with dms exists $this->_ci->AkteModel->addSelect('dms_id'); $akteResult = $this->_ci->AkteModel->load($akte_id); if (isError($akteResult)) return $akteResult; - if (!hasData($akteResult)) - return error("Akte not found"); + if (!hasData($akteResult)) return error("Akte not found"); $dms_id = getData($akteResult)[0]->dms_id; - if (isEmptyString($dms_id)) - return error("Akte has no dms document"); + if (isEmptyString($dms_id)) return error("Akte has no dms document"); + // if Akte with dms found, update the last dms version $dmsUpdateResult = $this->_ci->dmslib->updateLastVersion($dms_id, $fileHandle, $titel, $mimetype, $bezeichnung); if (isError($dmsUpdateResult)) return $dmsUpdateResult; - if (!hasData($dmsUpdateResult)) - return error("Dms document could not be updated"); + if (!hasData($dmsUpdateResult)) return error("Dms document could not be updated"); + // update the Akte return $this->_ci->AkteModel->update( $akte_id, array( @@ -80,12 +93,19 @@ class AkteLib 'bezeichnung' => $bezeichnung, 'erstelltam' => date('Y-m-d'), 'dms_id' => $dms_id, + 'archiv' => $archiv, + 'signiert' => $signiert, + 'stud_selfservice' => $stud_selfservice, 'updateamum' => date('Y-m-d H:i:s'), 'updatevon' => $this->_uid ) ); } + /** + * Gets akte data and associated dms data by akte Id + * Returns success with akte and dms data or error + */ public function get($akte_id) { // get Akte data @@ -98,19 +118,22 @@ class AkteLib if (isError($akteResult)) return $akteResult; - if (!hasData($akteResult)) - return error("Akte not found"); + if (!hasData($akteResult)) return error("Akte not found"); $resultObject = getData($akteResult)[0]; + // set properties with same name in Akte and Dms table $resultObject->akte_mimetype = $resultObject->mimetype; // get dms data $dmsResult = $this->_ci->dmslib->getLastVersion($resultObject->dms_id); - $dmsProperties = array('version', 'filename', 'mimetype', 'name', 'beschreibung', 'cis_suche', 'schlagworte', DmsLib::FILE_CONTENT_PROPERTY); if (isError($dmsResult)) return $dmsResult; + // properties to retrieve from dms + $dmsProperties = array('version', 'filename', 'mimetype', 'name', 'beschreibung', 'cis_suche', 'schlagworte', DmsLib::FILE_CONTENT_PROPERTY); + + // set dms properties if (hasData($dmsResult)) { $dmsData = getData($dmsResult); @@ -122,17 +145,24 @@ class AkteLib } else { + // set null if no dms result found foreach ($dmsProperties as $dmsProperty) { $resultObject->{$dmsProperty} = null; } } + // return the object containing akte and dms data return success($resultObject); } + /** + * Gets Akte data and associated dms data by person Id and dokument_kurzbz + * Returns success with result array with akte and dms data or error + */ public function getByPersonIdAndDocumentType($person_id, $dokument_kurzbz) { + // load all Akte entries for given person and dokument_kurzbz $this->_ci->AkteModel->addSelect('akte_id'); $akteResult = $this->_ci->AkteModel->loadWhere( array( @@ -141,40 +171,45 @@ class AkteLib ) ); - if (!hasData($akteResult)) - return error("Akte not found"); + if (!hasData($akteResult)) return error("Akte not found"); $akteData = getData($akteResult); $resultArr = array(); + // for each found akte entry foreach ($akteData as $akte) { + // get dms and akte data from akte Id $getAkteDmsResult = $this->get($akte->akte_id); - if (isError($getAkteDmsResult)) - return $getAkteDmsResult; + if (isError($getAkteDmsResult)) return $getAkteDmsResult; $resultArr[] = getData($getAkteDmsResult); } + // return all found entries return success($resultArr); } + /** + * Removes Akte by akte Id, removes all associated dms entries and versions, and deletes all associated files + * Returns success with removed version numbers or error + */ public function remove($akte_id) { + // get dms_id for akte $this->_ci->AkteModel->addSelect('dms_id'); $akteResult = $this->_ci->AkteModel->load($akte_id); if (isError($akteResult)) return $akteResult; - if (!hasData($akteResult)) - return error("Akte not found"); + if (!hasData($akteResult)) return error("Akte not found"); $dms_id = getData($akteResult)[0]->dms_id; $error = null; - // Start DB transaction + // Start DB transaction to avoid deleting only part of the data $this->_ci->db->trans_begin(); // delete Akte @@ -186,6 +221,7 @@ class AkteLib } else { + // remove all dms entry for dms of the akte $removeAllResult = $this->_ci->dmslib->removeAll($dms_id); if (isError($removeAllResult)) @@ -200,6 +236,7 @@ class AkteLib { $this->_ci->db->trans_rollback(); + // return occured error if (isset($error)) return $error; else @@ -208,6 +245,8 @@ class AkteLib else { $this->_ci->db->trans_commit(); + + // return removed dms entry data return $removeAllResult; } } diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index f0c4a36e3..017c7fc08 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -4,10 +4,11 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class DmsLib { - const FILE_CONTENT_PROPERTY = 'file_content'; + const FILE_CONTENT_PROPERTY = 'file_content'; // property name for file content + const DEFAULT_USER = 'DMS'; // fallback string for insertvon if no logged user private $_ci; // code igniter instance - private $_uid; + private $_uid; // uid of logged user /** * Object initialization @@ -26,8 +27,13 @@ class DmsLib // ----------------------------------------------------------------------------------------------------------- // Public methods - public function add($name, $kategorie_kurzbz, $mimetype, $fileHandle, $dokument_kurzbz = null, $beschreibung = null, $cis_suche = false, $schlagworte = null) + /** + * Writes a new file, adds a new dms entry and a new dms version 0 for the written file + * Returns success info of added dms entry (dms_id, version, filename) or error + */ + public function add($name, $mimetype, $fileHandle, $kategorie_kurzbz = null, $dokument_kurzbz = null, $beschreibung = null, $cis_suche = false, $schlagworte = null) { + // write file with content of fileHandle $writeFileResult = $this->_writeNewFile($name, $fileHandle); if (isError($writeFileResult)) return $writeFileResult; @@ -62,7 +68,7 @@ class DmsLib 'beschreibung' => $beschreibung, 'cis_suche' => $cis_suche, 'schlagworte' => $schlagworte, - 'insertvon' => $this->_uid, + 'insertvon' => isEmptyString($this->_uid) ? self::DEFAULT_USER : $this->_uid, 'insertamum' => date('Y-m-d H:i:s') ); @@ -70,6 +76,7 @@ class DmsLib if (isError($dmsVersionResult)) return $dmsVersionResult; + // return dms info $resObj = new stdClass(); $resObj->dms_id = $dms_id; $resObj->version = $version; @@ -84,6 +91,10 @@ class DmsLib return error("file could not be written"); } + /** + * Writes a new file with content of fileHandle, adds a new dms version (max version number + 1) for the written file + * Returns success with info of added dms version (version, filename) or error + */ public function addNewVersion($dms_id, $fileHandle, $name = null, $mimetype = null, $beschreibung = null, $cis_suche = false, $schlagworte = null) { // get the latest version @@ -97,7 +108,7 @@ class DmsLib $originalName = isset($name) ? $name : $lastVersion->name; - // write new file + // write new file with content of fileHandle $writeFileResult = $this->_writeNewFile($originalName, $fileHandle); if (isError($writeFileResult)) return $writeFileResult; @@ -120,15 +131,15 @@ class DmsLib 'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung, 'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche, 'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte, - 'insertvon' => $this->_uid, + 'insertvon' => isEmptyString($this->_uid) ? self::DEFAULT_USER : $this->_uid, 'insertamum' => date('Y-m-d H:i:s') ); $addVersionResult = $this->_ci->DmsVersionModel->insert($newVersion); - if (isError($addVersionResult)) - return $addVersionResult; + if (isError($addVersionResult)) return $addVersionResult; + // return dms info $resObj = new stdClass(); $resObj->version = $newVersionNumber; $resObj->filename = $filename; @@ -142,6 +153,11 @@ class DmsLib return error("last version not found"); } + /** + * Updates the last version (max version number) of a dms entry + * Overwrites the file associated with this version with content read from fileHandle + * Returns success with info of added dms version (version, filename) or error + */ public function updateLastVersion($dms_id, $fileHandle, $name = null, $mimetype = null, $beschreibung = null, $cis_suche = false, $schlagworte = null) { // get the latest version @@ -179,9 +195,9 @@ class DmsLib $newVersion ); - if (isError($addVersionResult)) - return $addVersionResult; + if (isError($addVersionResult)) return $addVersionResult; + // return dms info $resObj = new stdClass(); $resObj->version = $lastVersion->version; $resObj->filename = $filename; @@ -195,8 +211,13 @@ class DmsLib return error("last version not found"); } + /** + * Gets dms version with highest number + * Returns success with dms data and fileHandle with file content or error + */ public function getLastVersion($dms_id) { + // get the latest version number $this->_ci->DmsVersionModel->addSelect('version'); $this->_ci->DmsVersionModel->addOrder('version', 'DESC'); $this->_ci->DmsVersionModel->addOrder('insertamum', 'DESC'); @@ -212,12 +233,17 @@ class DmsLib $lastDmsVersionData = getData($lastDmsVersionResult)[0]; $lastDmsVersion = $lastDmsVersionData->version; + // call get Version with last version number return $this->getVersion($dms_id, $lastDmsVersion); } else return error("Dms last version not found"); } + /** + * Gets specified dms version + * Returns success with dms data and fileHandle with file content or error + */ public function getVersion($dms_id, $version) { $this->_ci->DmsVersionModel->addSelect('dms_id, version, filename, mimetype, name, beschreibung, cis_suche, schlagworte'); @@ -234,7 +260,7 @@ class DmsLib { $dmsVersion = getData($dmsVersionResult)[0]; - // file content as file pointer + // get file content as file pointer $fileHandleResult = $this->_ci->DmsFSModel->openRead($dmsVersion->filename); if (isError($fileHandleResult)) return $fileHandleResult; @@ -244,6 +270,7 @@ class DmsLib $fileHandle = getData($fileHandleResult); $dmsVersion->{self::FILE_CONTENT_PROPERTY} = $fileHandle; + // close file pointer $closeResult = $this->_ci->DmsFSModel->close($fileHandle); if (isError($closeResult)) return $closeResult; @@ -257,9 +284,13 @@ class DmsLib return error("Dms version not found"); } + /** + * Removes dms entry and all its versions, deletes all associated files + * Returns success with removed version numbers or error + */ public function removeAll($dms_id) { - $versions_removed = array(); + $versionsRemoved = array(); $this->_ci->DmsVersionModel->addSelect('version, filename'); $allVersionsResult = $this->_ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id)); @@ -270,10 +301,10 @@ class DmsLib $error = null; - // Start DB transaction + // Start DB transaction to avoid deleting only part of the data $this->_ci->db->trans_begin(); - // remove all versions + // remove all versions of the dms Id foreach ($allVersionsData as $version) { $removeVersionResult = $this->removeVersion($dms_id, $version->version); @@ -284,7 +315,7 @@ class DmsLib break; } else - $versions_removed[] = $version; + $versionsRemoved[] = $version; // return removed versions } // Transaction complete! @@ -306,9 +337,13 @@ class DmsLib } } - return success($versions_removed); + return success($versionsRemoved); } + /** + * Removes latest version and its associated file + * Returns success with removed dms version data (dms_id, version, filename) or error + */ public function removeLastVersion($dms_id) { $lastVersionNumber = 0; @@ -323,9 +358,14 @@ class DmsLib $lastVersionNumber = $lastVersion->version; } + // call remove method for latest version return $this->removeVersion($dms_id, $lastVersionNumber); } + /** + * Removes latest version and its associated file + * Returns success with removed dms version data (dms_id, version, filename) or error + */ public function removeVersion($dms_id, $version) { $removeVersionResultObj = new stdClass(); @@ -333,7 +373,7 @@ class DmsLib $removeVersionResultObj->version = null; $removeVersionResultObj->filename = null; - // load version and check how many versions there are + // load dms version and check how many versions there are $db = new DB_Model(); $checkDeleteResult = $db->execReadOnlyQuery( @@ -353,6 +393,7 @@ class DmsLib { $checkDeleteData = getData($checkDeleteResult)[0]; + // delete version $deleteVersionResult = $this->_ci->DmsVersionModel->delete(array($dms_id, $version)); if (isError($deleteVersionResult)) return $deleteVersionResult; @@ -373,8 +414,7 @@ class DmsLib // delete file from file system $removeResult = $this->_ci->DmsFSModel->remove($checkDeleteData->filename); - if (isError($removeResult)) - return $removeResult; + if (isError($removeResult)) return $removeResult; } return success($removeVersionResultObj); @@ -382,17 +422,26 @@ class DmsLib // ----------------------------------------------------------------------------------------------------------- // Private methods + + /** + * Writes file with content of fileHandle using original document name for file extension + */ private function _writeNewFile($originalName, $fileHandle) { - // create unique filename + // create unique filename, using original document name to detect file extension $filename = $this->_getUniqueFilename($originalName); + // write the file return $this->_writeFile($filename, $fileHandle); } + /** + * Writes file with content of fileHandle + * Returns number of bytes written and filename + */ private function _writeFile($filename, $fileHandle) { - // copy file content provided by fileHandle + // file content provided by fileHandle $fileContent = ''; $readBlockResult = success(); @@ -421,6 +470,7 @@ class DmsLib if (isError($writeFileResult)) return $writeFileResult; + // return number of bytes written and filename $resObj = new stdClass(); $resObj->bytesWritten = 0; $resObj->filename = ''; @@ -439,11 +489,19 @@ class DmsLib return success($resObj); } + /** + * Generates unique filename, appends file extension from document name + * Returns the filename string + */ private function _getUniqueFilename($dokname) { + // create unique id $uniqueFilename = uniqid(); + + // getting extension of file from document name $fileExtension = pathinfo($dokname, PATHINFO_EXTENSION); + // if file extension found, append it if (!isEmptyString($fileExtension)) $uniqueFilename .= '.'.$fileExtension; diff --git a/application/models/content/TempFS_model.php b/application/models/content/TempFS_model.php new file mode 100644 index 000000000..ac55a24d7 --- /dev/null +++ b/application/models/content/TempFS_model.php @@ -0,0 +1,16 @@ +