diff --git a/.htaccess b/.htaccess
index 24254ed01..ed73c5e67 100644
--- a/.htaccess
+++ b/.htaccess
@@ -6,7 +6,7 @@ Header set X-Content-Type-Options: "nosniff"
RewriteEngine On
-RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
+RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#RewriteRule "^favicon\.ico$" "-" [L]
#RewriteRule "^(favicon\.ico)$" %{HTTP_HOST}/views/bootstrap/images/favicon.svg [L,NC]
RewriteRule "^(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC]
diff --git a/CHANGELOG b/CHANGELOG
index fa4994b35..5171dbce5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,14 @@
when passwords are reset
- count failed runs of a task, disable it after 5 failures
+--------------------------------------------------------------------------------
+ Changes in version 6.0.27
+--------------------------------------------------------------------------------
+- merge changes up to 5.1.34
+- Document/folder check distinguishes between documents which cannot be
+ receiped/revised because of access rights or the recipient/revisor being
+ disabled.
+
--------------------------------------------------------------------------------
Changes in version 6.0.26
--------------------------------------------------------------------------------
@@ -280,10 +288,29 @@
- add document list which can be exported as an archive
- search results can be exported
+--------------------------------------------------------------------------------
+ Changes in version 5.1.34
+--------------------------------------------------------------------------------
+- introduce global reviewer/approver
+- group managers can be used as mandatory reviewers/approvers for all
+ users of that group
+- update sabre/dav to 4.*
+- show parent folder of document in lists of documents (calendar, dashboard)
+- documents can be updated by dragging a file on a document list item
+- dragging a folder on a folder list item oder the drag and drop area will
+ recursively upload the folder hierarchy including all files
+- fix checking if user is owner when sending notifications
+- do not show fast upload area if access on folder is insufficient
+- do not send notification mail 'submitted review/approval' to owner of
+ document, still send it to uploader of version
+- set default language in login form if language selector is turned off
+- do not show full list of notifiers to none admins
+- do not list document/folders in sequence selector if its number exceeds 50
+- typeahead menu works with arrow keys again, wait 1 sec. before searching
+
--------------------------------------------------------------------------------
Changes in version 5.1.33
--------------------------------------------------------------------------------
-- requires php 8.x
- use SeedDMS_Core_File::mimetype() to determine mime type when uploading a
file with drag&drop
- user images may be 300px height, do not scale them up
diff --git a/composer-dist.json b/composer-dist.json
index 1e4d01ddb..9fa2763ce 100644
--- a/composer-dist.json
+++ b/composer-dist.json
@@ -7,8 +7,8 @@
"require": {
"robthree/twofactorauth": "^1.5",
- "sabre/dav": "^3.",
- "sabre/xml": "^1.4.",
+ "sabre/dav": "^4.",
+ "sabre/xml": "*",
"slim/slim": "^3.0",
"erusev/parsedown": "*",
"erusev/parsedown-extra": "*",
diff --git a/controllers/class.AddDocument.php b/controllers/class.AddDocument.php
index 079de59dc..e27ea3b5a 100644
--- a/controllers/class.AddDocument.php
+++ b/controllers/class.AddDocument.php
@@ -56,13 +56,40 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
$reqversion = $this->getParam('reqversion');
$version_comment = $this->getParam('versioncomment');
$attributes = $this->getParam('attributes');
- foreach($attributes as $attrdefid=>$attribute) {
+ foreach($attributes as $attrdefid=>&$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
- $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
+ else
+ $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_folder:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
+ else
+ $attribute = $dms->getFolder((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_document:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
+ else
+ $attribute = $dms->getDocument((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_user:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
+ else
+ $attribute = $dms->getUser((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_group:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
+ else
+ $attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, null, true)) {
@@ -80,13 +107,40 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
}
}
if($attributes_version = $this->getParam('attributesversion')) {
- foreach($attributes_version as $attrdefid=>$attribute) {
+ foreach($attributes_version as $attrdefid=>&$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
- $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
+ else
+ $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_folder:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
+ else
+ $attribute = $dms->getFolder((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_document:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
+ else
+ $attribute = $dms->getDocument((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_user:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
+ else
+ $attribute = $dms->getUser((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_group:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
+ else
+ $attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, null, true)) {
diff --git a/controllers/class.AddSubFolder.php b/controllers/class.AddSubFolder.php
index 24a609cb8..10e99d00c 100644
--- a/controllers/class.AddSubFolder.php
+++ b/controllers/class.AddSubFolder.php
@@ -41,13 +41,40 @@ class SeedDMS_Controller_AddSubFolder extends SeedDMS_Controller_Common {
$comment = $this->getParam('comment');
$sequence = $this->getParam('sequence');
$attributes = $this->getParam('attributes');
- foreach($attributes as $attrdefid=>$attribute) {
+ foreach($attributes as $attrdefid=>&$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
- $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
+ else
+ $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_folder:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
+ else
+ $attribute = $dms->getFolder((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_document:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
+ else
+ $attribute = $dms->getDocument((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_user:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
+ else
+ $attribute = $dms->getUser((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_group:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
+ else
+ $attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, null, true)) {
diff --git a/controllers/class.CheckInDocument.php b/controllers/class.CheckInDocument.php
new file mode 100644
index 000000000..969d18d17
--- /dev/null
+++ b/controllers/class.CheckInDocument.php
@@ -0,0 +1,114 @@
+
+ * @copyright Copyright (C) 2010-2024 Uwe Steinmann
+ * @version Release: @package_version@
+ */
+
+/**
+ * Class which does the busines logic for downloading a document
+ *
+ * @category DMS
+ * @package SeedDMS
+ * @author Uwe Steinmann
+ * @copyright Copyright (C) 2010-2024 Uwe Steinmann
+ * @version Release: @package_version@
+ */
+class SeedDMS_Controller_CheckInDocument extends SeedDMS_Controller_Common {
+
+ public function run() { /* {{{ */
+ $name = $this->getParam('name');
+ $comment = $this->getParam('comment');
+
+ /* Call preCheckInDocument early, because it might need to modify some
+ * of the parameters.
+ */
+ if(false === $this->callHook('preCheckInDocument', $this->params['document'])) {
+ if(empty($this->errormsg))
+ $this->errormsg = 'hook_preCheckInDocument_failed';
+ return null;
+ }
+
+ $comment = $this->getParam('comment');
+ $dms = $this->params['dms'];
+ $user = $this->params['user'];
+ $document = $this->params['document'];
+ $settings = $this->params['settings'];
+ $fulltextservice = $this->params['fulltextservice'];
+ $folder = $this->params['folder'];
+ $userfiletmp = $this->getParam('userfiletmp');
+ $userfilename = $this->getParam('userfilename');
+ $filetype = $this->getParam('filetype');
+ $userfiletype = $this->getParam('userfiletype');
+ $reviewers = $this->getParam('reviewers');
+ $approvers = $this->getParam('approvers');
+ $recipients = $this->getParam('recipients');
+ $reqversion = $this->getParam('reqversion');
+ $comment = $this->getParam('comment');
+ $attributes = $this->getParam('attributes');
+ $workflow = $this->getParam('workflow');
+ $maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
+ $initialdocumentstatus = $this->getParam('initialdocumentstatus');
+
+ $content = $this->callHook('checkinDocument');
+ if($content === null) {
+ if($contentResult=$document->checkIn($comment, $user, $reviewers, $approvers, $version=0, $attributes, $workflow, $initialdocumentstatus)) {
+
+ if ($this->hasParam('expires')) {
+ if($document->setExpires($this->getParam('expires'))) {
+ } else {
+ }
+ }
+
+ if(!empty($recipients['i'])) {
+ foreach($recipients['i'] as $uid) {
+ if($u = $dms->getUser($uid)) {
+ $res = $contentResult->getContent()->addIndRecipient($u, $user);
+ }
+ }
+ }
+ if(!empty($recipients['g'])) {
+ foreach($recipients['g'] as $gid) {
+ if($g = $dms->getGroup($gid)) {
+ $res = $contentResult->getContent()->addGrpRecipient($g, $user);
+ }
+ }
+ }
+
+ $content = $contentResult->getContent();
+ } else {
+ $this->errormsg = 'error_checkin_document';
+ $result = false;
+ }
+ } elseif($result === false) {
+ if(empty($this->errormsg))
+ $this->errormsg = 'hook_checkinDocument_failed';
+ return false;
+ }
+
+ if($fulltextservice && ($index = $fulltextservice->Indexer()) && $content) {
+ $idoc = $fulltextservice->IndexedDocument($document);
+ if(false !== $this->callHook('preIndexDocument', $document, $idoc)) {
+ $lucenesearch = $fulltextservice->Search();
+ if($hit = $lucenesearch->getDocument((int) $document->getId())) {
+ $index->delete($hit->id);
+ }
+ $index->addDocument($idoc);
+ $index->commit();
+ }
+ }
+
+ if(false === $this->callHook('postCheckInDocument', $document, $content)) {
+ }
+
+ return $content;
+ } /* }}} */
+}
+
+
diff --git a/controllers/class.EditDocument.php b/controllers/class.EditDocument.php
index bfe0dac30..cd86dfedf 100644
--- a/controllers/class.EditDocument.php
+++ b/controllers/class.EditDocument.php
@@ -122,7 +122,34 @@ class SeedDMS_Controller_EditDocument extends SeedDMS_Controller_Common {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
- $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
+ else
+ $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_folder:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
+ else
+ $attribute = $dms->getFolder((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_document:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
+ else
+ $attribute = $dms->getDocument((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_user:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
+ else
+ $attribute = $dms->getUser((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_group:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
+ else
+ $attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, $document, false)) {
diff --git a/controllers/class.EditFolder.php b/controllers/class.EditFolder.php
index 94a1fa066..2df566189 100644
--- a/controllers/class.EditFolder.php
+++ b/controllers/class.EditFolder.php
@@ -51,33 +51,61 @@ class SeedDMS_Controller_EditFolder extends SeedDMS_Controller_Common {
$oldattributes = $folder->getAttributes();
if($attributes) {
foreach($attributes as $attrdefid=>$attribute) {
- $attrdef = $dms->getAttributeDefinition($attrdefid);
- if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
- if($attribute) {
- switch($attrdef->getType()) {
- case SeedDMS_Core_AttributeDefinition::type_date:
- $attribute = date('Y-m-d', makeTsFromDate($attribute));
- break;
- }
- if(!$attrdef->validate($attribute, $folder, false)) {
- $this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
- return false;
- }
+ if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
+ if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
+ if($attribute) {
+ switch($attrdef->getType()) {
+ case SeedDMS_Core_AttributeDefinition::type_date:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
+ else
+ $attribute = date('Y-m-d', makeTsFromDate($attribute));
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_folder:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
+ else
+ $attribute = $dms->getFolder((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_document:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
+ else
+ $attribute = $dms->getDocument((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_user:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
+ else
+ $attribute = $dms->getUser((int) $attribute);
+ break;
+ case SeedDMS_Core_AttributeDefinition::type_group:
+ if(is_array($attribute))
+ $attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
+ else
+ $attribute = $dms->getGroup((int) $attribute);
+ break;
+ }
+ if(!$attrdef->validate($attribute, $folder, false)) {
+ $this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
+ return false;
+ }
- if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
- if(!$folder->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute))
+ if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
+ if(!$folder->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute))
+ return false;
+ }
+ } elseif($attrdef->getMinValues() > 0) {
+ $this->errormsg = getMLText("attr_min_values", array("attrname"=>$attrdef->getName()));
+ return false;
+ } elseif(isset($oldattributes[$attrdefid])) {
+ if(!$folder->removeAttribute($dms->getAttributeDefinition($attrdefid)))
+ return false;
+ }
+ } else {
+ if($ret === false)
return false;
}
- } elseif($attrdef->getMinValues() > 0) {
- $this->errormsg = getMLText("attr_min_values", array("attrname"=>$attrdef->getName()));
- return false;
- } elseif(isset($oldattributes[$attrdefid])) {
- if(!$folder->removeAttribute($dms->getAttributeDefinition($attrdefid)))
- return false;
- }
- } else {
- if($ret === false)
- return false;
}
}
}
diff --git a/controllers/class.ReviseDocument.php b/controllers/class.ReviseDocument.php
index 94f085d6d..6abda8b03 100644
--- a/controllers/class.ReviseDocument.php
+++ b/controllers/class.ReviseDocument.php
@@ -22,6 +22,10 @@
*/
class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
+ public $oldstatus;
+
+ public $newstatus;
+
public function run() {
$dms = $this->params['dms'];
$user = $this->params['user'];
@@ -32,6 +36,9 @@ class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
$revisiontype = $this->params['revisiontype'];
$group = $this->params['group'];
$comment = $this->params['comment'];
+ $overallStatus = $content->getStatus();
+ $this->oldstatus = $overallStatus['status'];
+ $this->newstatus = $this->oldstatus;
/* if set to true, a single reject will reject the doc. If set to false
* all revisions will be collected first and afterwards the doc is rejected
@@ -71,6 +78,7 @@ class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
$result = $this->callHook('reviseUpdateDocumentStatus', $content);
if($result === null) {
if ($onevotereject && $revisionstatus == -1){
+ $this->newstatus = S_NEEDS_CORRECTION;
if(!$content->setStatus(S_NEEDS_CORRECTION,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
@@ -102,22 +110,22 @@ class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
// of them were rejections then documents needs correction.
// Otherwise put it back into revision workflow
if ($revisionok == $revisionTotal) {
- $newStatus=S_RELEASED;
- if ($content->finishRevision($user, $newStatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
+ $this->newstatus=S_RELEASED;
+ if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
if(!$this->callHook('finishReviseDocument', $content)) {
}
}
} elseif (($revisionok + $revisionnotok) == $revisionTotal) {
- $newStatus=S_NEEDS_CORRECTION;
-// if ($content->finishRevision($user, $newStatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
- if(!$content->setStatus($newStatus,$comment,$user)) {
+ $this->newstatus=S_NEEDS_CORRECTION;
+// if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
+ if(!$content->setStatus($this->newstatus,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
}
} else {
- $newStatus=S_IN_REVISION;
- if(!$content->setStatus($newStatus,$comment,$user)) {
+ $this->newstatus=S_IN_REVISION;
+ if(!$content->setStatus($this->newstatus,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
diff --git a/doc/README.Notification b/doc/README.Notification
index d6fef8db3..952439a69 100644
--- a/doc/README.Notification
+++ b/doc/README.Notification
@@ -106,6 +106,11 @@ op/op.ReviewDocument.php
* document was reviewed
subscribers of the document
+op/op.SetReviewersApprovers.php
+* Reviewers/approvers were added/deleted
+ subscribers of the document
+ uploader of version
+
op/op.RewindWorkflow.php
* Workflow was rewind to beginning
subscribers of the document
@@ -121,3 +126,28 @@ op/op.TriggerWorkflow.php
op/op.UpdateDocument.php
* document was updated
subscribers of the document
+
+op/op.ReceiptDocument.php
+* document was received
+ subscribers of the document
+
+op/op.ReviseDocument.php
+* document was revised
+ subscribers of the document
+
+op/op.SetRevisors.php
+* Revisors were added/deleted
+ subscribers of the document
+ uploader of version
+ revisor
+
+op/op.ReceiptDocument.php
+* document was receipt
+ subscribers of the document
+
+op/op.SetRecipients.php
+* Recipients were added/deleted
+ subscribers of the document
+ uploader of version
+ recipient
+
diff --git a/doc/README.Swagger b/doc/README.Swagger
index 576339a5e..f32df2f48 100644
--- a/doc/README.Swagger
+++ b/doc/README.Swagger
@@ -7,7 +7,17 @@ http://petstore.swagger.io/ or http://editor.swagger.io/
You may as well set up your own swagger-ui installation as described at
https://medium.com/@tatianaensslin/how-to-add-swagger-ui-to-php-server-code-f1610c01dc03
-Your apache needs to have the module 'header' enabled, because some HTTP headers
-are set when the file swagger.yaml is accessed by the editor.
+Your apache needs to have the module `header` enabled, because some HTTP headers
+are set when the file `swagger.yaml` is accessed by the editor.
Currently, the swagger.yaml shipped with SeedDMS uses still swagger 2.0
+
+If you are using php-fpm you will have to ensure that files with
+extension .yaml are allowed to be parsed. Extend the
+`security.limit_extensions` in the pool configuration by `.yaml`. Also
+check the contents of the file `.htaccess` in directory `restapi`. It
+by default sets the handler for php to `application/x-httpd-php` which
+uses the apache module of php. If you would like to use php-fpm
+instead, then set it to
+
+ SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
diff --git a/inc/inc.ClassConversionServiceImageToImage.php b/inc/inc.ClassConversionServiceImageToImage.php
index ee7ccb9d4..ca2120c15 100644
--- a/inc/inc.ClassConversionServiceImageToImage.php
+++ b/inc/inc.ClassConversionServiceImageToImage.php
@@ -67,8 +67,18 @@ class SeedDMS_ConversionServiceImageToImage extends SeedDMS_ConversionServiceBas
} else {
return $imagick->getImageBlob();
}
+ } else {
+ if($this->logger) {
+ $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with image service failed: could not read input file.', PEAR_LOG_ERR);
+ }
+ $this->success = false;
+ return false;
}
} catch (ImagickException $e) {
+ if($this->logger) {
+ $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with image service failed: '.$e->getMessage(), PEAR_LOG_ERR);
+ }
+ $this->success = false;
return false;
}
} elseif(extension_loaded('gd')) {
@@ -102,6 +112,10 @@ class SeedDMS_ConversionServiceImageToImage extends SeedDMS_ConversionServiceBas
return $image;
}
} else {
+ if($this->logger) {
+ $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with image service failed: could not read input file.', PEAR_LOG_ERR);
+ }
+ $this->success = false;
return false;
}
}
diff --git a/inc/inc.ClassConversionServicePdfToImage.php b/inc/inc.ClassConversionServicePdfToImage.php
index 85ef08a0e..c303eeca0 100644
--- a/inc/inc.ClassConversionServicePdfToImage.php
+++ b/inc/inc.ClassConversionServicePdfToImage.php
@@ -83,6 +83,10 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
} else {
return $imagick->getImageBlob();
}
+ } else {
+ if($this->logger) {
+ $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with pdf service failed: could not read input file.', PEAR_LOG_ERR);
+ }
}
} catch (ImagickException $e) {
if($this->logger) {
diff --git a/inc/inc.ClassDbAuthentication.php b/inc/inc.ClassDbAuthentication.php
index 2d65e8516..0c7eaad4f 100644
--- a/inc/inc.ClassDbAuthentication.php
+++ b/inc/inc.ClassDbAuthentication.php
@@ -47,6 +47,11 @@ class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
if($user = $dms->getUserByLogin($username)) {
$userid = $user->getID();
+ // Check if password matches
+ if (!seed_pass_verify($password, $user->getPwd())) {
+ $user = null;
+ }
+ } elseif(!empty($this->settings->_enableLoginByEmail) && ($user = $dms->getUserByEmail($username))) {
// Check if password matches
if (!seed_pass_verify($password, $user->getPwd())) {
$user = null;
diff --git a/inc/inc.ClassFulltextService.php b/inc/inc.ClassFulltextService.php
index 09a42bf18..286444a45 100644
--- a/inc/inc.ClassFulltextService.php
+++ b/inc/inc.ClassFulltextService.php
@@ -167,11 +167,11 @@ class SeedDMS_FulltextService {
if($previewer->hasPreview($version)) {
$filename = $previewer->getFileName($version).'.txt';
$result['content'] = file_get_contents($filename);
- $result['cmd'] = 'previewer '.$previewer->getFileSize($version);
+ $result['cmd'] = 'text converter '.$previewer->getFileSize($version);
}
} else {
- $result['cmd'] = 'previewer';
- $result['errormsg'] = 'Creating preview failed';
+ $result['cmd'] = 'text converter';
+ $result['errormsg'] = 'Creating plain text failed';
}
}
return $result;
diff --git a/inc/inc.ClassLdapAuthentication.php b/inc/inc.ClassLdapAuthentication.php
index 987a6a4e9..db9ae1449 100644
--- a/inc/inc.ClassLdapAuthentication.php
+++ b/inc/inc.ClassLdapAuthentication.php
@@ -47,9 +47,21 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
if(isset($ldapgroups['count']))
$count = (int) $ldapgroups['count'];
for ($i = 0; $i < $count; $i++) {
- $tmp = ldap_explode_dn($ldapgroups[$i], 1);
+ if(0) {
+ /* ldap_explode_dn() turns all utf-8 chars into \xx
+ * This needs to be undone with the following regex.
+ */
+ $tmp = ldap_explode_dn($ldapgroups[$i], 1);
+ $tmp[0] = preg_replace_callback('/\\\([0-9A-Fa-f]{2})/', function ($matches) { return chr(hexdec($matches[1])); }, $tmp[0]);
+ } else {
+ /* Second option would be to not using ldap_explode_dn()
+ * and just extract the cn with
+ * preg_match('/[^cn=]([^,]*)/i', $ldapgroups[$i], $tmp);
+ */
+ preg_match('/[^cn=]([^,]*)/i', $ldapgroups[$i], $tmp);
+ }
if (!in_array($tmp[0], $groupnames)) {
- $groupnames[] = $tmp[0];
+ $groupnames[] = preg_replace_callback('/\\\([0-9A-Fa-f]{2})/', function ($matches) { return chr(hexdec($matches[1])); }, $tmp[0]);
}
}
@@ -114,14 +126,16 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
* look like if searching for that user didn't return a dn.
*/
if (isset($settings->_ldapBaseDN)) {
- $ldapSearchAttribut = "uid=";
+ $ldapSearchAttribut = "uid";
+ /* $tmpDN will only be used as a last resort if searching for the user failed */
$tmpDN = "uid=".$username.",".$settings->_ldapBaseDN;
}
/* Active directory has a different base dn */
if (isset($settings->_ldapType)) {
if ($settings->_ldapType==1) {
- $ldapSearchAttribut = "sAMAccountName=";
+ $ldapSearchAttribut = "sAMAccountName";
+ /* $tmpDN will only be used as a last resort if searching for the user failed */
$tmpDN = $username.'@'.$settings->_ldapAccountDomainName;
// Add the following if authentication with an Active Dir doesn't work
// See https://sourceforge.net/p/seeddms/discussion/general/thread/19c70d8d/
@@ -143,7 +157,21 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
} else {
$bind = @ldap_bind($ds);
}
+
$dn = false;
+
+ /* The simplest search is just the username */
+ $ldapsearchterm = $ldapSearchAttribut.'='.$username;
+ /* If login by email is allowed, the search for user name is ored with
+ * the search for the email.
+ */
+ if($settings->_enableLoginByEmail) {
+ $ldapsearchterm = "|(".$ldapsearchterm.")(mail=".$username.")";
+ }
+ /* If a ldap filter is set, it will be anded */
+ if($settings->_ldapFilter) {
+ $ldapsearchterm = "&(".$ldapsearchterm.")".$settings->_ldapFilter;
+ }
/* If bind succeed, then get the dn of the user. If a filter
* is set, it will be used to allow only those users to log in
* matching the filter criteria. Depending on the type of server,
@@ -151,19 +179,32 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
* 'sAMAccountName=' or 'uid='. All other filters are ANDed.
* A common filter is '(mail=*)' to ensure a user has an email
* address.
+ * If the previous bind failed, we could try later to bind with
+ * the user's credentials (this was until 6.0.26 and 5.1.33 the case),
+ * but if login by email is allowed, it makes no sense to try it. The
+ * only way to bind is by using a correct dn and that cannot be
+ * formed with an email.
*/
if ($bind) {
+ /*
if (!empty($settings->_ldapFilter)) {
- $search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
+ $search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.'='.$username.")".$settings->_ldapFilter.")");
} else {
- $search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.$username);
+ $search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.'='.$username);
}
+ */
+ $search = ldap_search($ds, $settings->_ldapBaseDN, "(".$ldapsearchterm.")");
if (!is_bool($search)) {
$info = ldap_get_entries($ds, $search);
if (!is_bool($info) && $info["count"]>0) {
$dn = $info[0]['dn'];
+ /* Set username to login name in case the email was used for authentication */
+ $username = $info[0][$ldapSearchAttribut][0];
}
}
+ } elseif(!empty($settings->_enableLoginByEmail)) {
+ ldap_close($ds);
+ return null;
}
/* If the previous bind failed, try it with the users creditionals
@@ -176,8 +217,10 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
* If that user was filtered out, because filter was set to '(mail=*)'
* and the user doesn't have a mail address, then $dn will not be
* set and $tmpDN will be used instead, allowing a successfull bind.
+ * Also do not take the $tmpDN if login by email is allowed, because
+ * the username could be the email and that doesn't form a valid dn.
*/
- if (is_bool($dn) && empty($settings->_ldapFilter)) {
+ if (is_bool($dn) && empty($settings->_ldapFilter) && empty($settings->_enableLoginByEmail)) {
$dn = $tmpDN;
}
@@ -189,6 +232,9 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
/* Check if user already exists in the database. Return with an error
* only if the sql statements fails, but not if no user was found.
+ * The username may not be the one passed to this function anymore. It
+ * could have been overwritten by uid (or sAMAccountName) derived from
+ * the above ldap search.
*/
$user = $dms->getUserByLogin($username);
if($user === false) {
@@ -205,13 +251,15 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
// Successfully authenticated. Now check to see if the user exists within
// the database. If not, add them in if _restricted is not set,
- // but do not add their password.
+ // but do not set the password of the user.
if (!$settings->_restricted) {
- // Retrieve the user's LDAP information.
+ /* Retrieve the user's LDAP information. At this time the username is
+ * the uid or sAMAccountName, even if the email was used for login.
+ */
if (isset($settings->_ldapFilter) && strlen($settings->_ldapFilter) > 0) {
- $search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
+ $search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.'='.$username.")".$settings->_ldapFilter.")");
} else {
- $search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.$username);
+ $search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.'='.$username);
}
if (!is_bool($search)) {
diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php
index a02946950..3bafe2d94 100644
--- a/inc/inc.ClassNotificationService.php
+++ b/inc/inc.ClassNotificationService.php
@@ -439,7 +439,7 @@ class SeedDMS_NotificationService {
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
- if($user->getID() != $version->getUser()->getID() && $version->getUser()->getID() != $document->getOwner() && false === SeedDMS_Core_DMS::inList($version->getUser(), $nl['users']))
+ if($user->getID() != $version->getUser()->getID() && $version->getUser()->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($version->getUser(), $nl['users']))
$this->toIndividual($user, $version->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
@@ -573,12 +573,12 @@ class SeedDMS_NotificationService {
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
- if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
/**
- * This notification is sent when a new attachment is created.
+ * This notification is sent when an attachment is deleted.
*/
public function sendDeleteFileMail($file, $user) { /* {{{ */
$document = $file->getDocument();
@@ -644,7 +644,7 @@ class SeedDMS_NotificationService {
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
- $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
+ $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValueAsString();
$params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
@@ -669,7 +669,7 @@ class SeedDMS_NotificationService {
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
- $params['attribute_value'] = $attribute->getValue();
+ $params['attribute_value'] = $attribute->getValueAsString();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
@@ -699,8 +699,8 @@ class SeedDMS_NotificationService {
$params['name'] = $folder->getName();
$params['folder_id'] = $folder->getId();
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
- $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
- $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
+ $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValueAsString();
+ $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValueAsString() : '';
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID();
@@ -722,8 +722,9 @@ class SeedDMS_NotificationService {
$message = "folder_attribute_added_email_body";
$params = array();
$params['name'] = $folder->getName();
+ $params['folder_id'] = $folder->getId();
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
- $params['attribute_value'] = $attribute->getValue();
+ $params['attribute_value'] = $attribute->getValueAsString();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID();
@@ -816,10 +817,10 @@ class SeedDMS_NotificationService {
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
- // if user is not owner send notification to owner
- if ($user->getID() != $document->getOwner()->getID() &&
- false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) {
- $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
+ // if user is not uploader of the version send notification to uploader
+ if ($user->getID() != $content->getUser()->getID() &&
+ false === SeedDMS_Core_DMS::inList($content->getUser(), $notifyList['users'])) {
+ $this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
}
$this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($notifyList["groups"] as $grp) {
@@ -1013,7 +1014,7 @@ class SeedDMS_NotificationService {
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
- if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
@@ -1125,14 +1126,16 @@ class SeedDMS_NotificationService {
/* Send mail to owner only if the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
+ /*
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
+ */
/* Send mail to uploader of version only if the uploader is not the owner and
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
- if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
@@ -1161,14 +1164,90 @@ class SeedDMS_NotificationService {
/* Send mail to owner only if the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
+ /*
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
+ */
/* Send mail to uploader of version only if the uploader is not the owner and
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
- if($user->getID() != $content->getUser()->getID() && $content->getUser()->getID() != $document->getOwner() && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ $this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
+ } /* }}} */
+
+ public function sendSubmittedReceiptMail($content, $user, $receiptlog) { /* {{{ */
+ $document = $content->getDocument();
+ $nl=$document->getNotifyList();
+ $folder = $document->getFolder();
+ $subject = "receipt_submit_email_subject";
+ $message = "receipt_submit_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['version'] = $content->getVersion();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['status'] = getReceiptStatusText($receiptlog["status"]);
+ $params['comment'] = $receiptlog['comment'];
+ $params['username'] = $user->getFullName();
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+ $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
+ foreach ($nl["groups"] as $grp) {
+ $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
+ }
+ /* Send mail to owner only if the currently logged in user is not the
+ * owner and the owner is not already in the list of notifiers.
+ */
+ /*
+ if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
+ $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
+ */
+
+ /* Send mail to uploader of version only if the uploader is not the owner and
+ * the currently logged in user is not the
+ * owner and the owner is not already in the list of notifiers.
+ */
+ if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
+ $this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
+ } /* }}} */
+
+ public function sendSubmittedRevisionMail($content, $user, $revisionlog) { /* {{{ */
+ $document = $content->getDocument();
+ $nl=$document->getNotifyList();
+ $folder = $document->getFolder();
+ $subject = "revision_submit_email_subject";
+ $message = "revision_submit_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['version'] = $content->getVersion();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['status'] = getRevisionStatusText($revisionlog["status"]);
+ $params['comment'] = $revisionlog['comment'];
+ $params['username'] = $user->getFullName();
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+ $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
+ foreach ($nl["groups"] as $grp) {
+ $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
+ }
+ /* Send mail to owner only if the currently logged in user is not the
+ * owner and the owner is not already in the list of notifiers.
+ */
+ /*
+ if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
+ $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
+ */
+
+ /* Send mail to uploader of version only if the uploader is not the owner and
+ * the currently logged in user is not the
+ * owner and the owner is not already in the list of notifiers.
+ */
+ if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
@@ -1205,7 +1284,11 @@ class SeedDMS_NotificationService {
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
- $params['username'] = $user->getFullName();
+ if($reviewer->isType('user'))
+ $params['reviewer'] = $reviewer->getFullName();
+ elseif($reviewer->isType('group'))
+ $params['reviewer'] = $reviewer->getName();
+ $params['username'] = $user->getName();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
@@ -1216,6 +1299,58 @@ class SeedDMS_NotificationService {
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
} /* }}} */
+ public function sendDeleteRevisionMail($content, $user, $revisor) { /* {{{ */
+ $document = $content->getDocument();
+ $folder = $document->getFolder();
+ $subject = "revision_deletion_email_subject";
+ $message = "revision_deletion_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['version'] = $content->getVersion();
+ $params['comment'] = $content->getComment();
+ if($revisor->isType('user'))
+ $params['revisor'] = $revisor->getFullName();
+ elseif($revisor->isType('group'))
+ $params['revisor'] = $revisor->getName();
+ $params['username'] = $user->getFullName();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+
+ if($revisor->isType('user'))
+ $this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
+ elseif($revisor->isType('group'))
+ $this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
+ } /* }}} */
+
+ public function sendDeleteReceiptMail($content, $user, $recipient) { /* {{{ */
+ $document = $content->getDocument();
+ $folder = $document->getFolder();
+ $subject = "receipt_deletion_email_subject";
+ $message = "receipt_deletion_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['version'] = $content->getVersion();
+ $params['comment'] = $content->getComment();
+ if($recipient->isType('user'))
+ $params['recipient'] = $recipient->getFullName();
+ elseif($recipient->isType('group'))
+ $params['recipient'] = $recipient->getName();
+ $params['username'] = $user->getFullName();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+
+ if($recipient->isType('user'))
+ $this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
+ elseif($recipient->isType('group'))
+ $this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
+ } /* }}} */
+
/**
* This notification is send if a new approver is added.
*
@@ -1267,6 +1402,10 @@ class SeedDMS_NotificationService {
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
+ if($reviewer->isType('user'))
+ $params['reviewer'] = $reviewer->getFullName();
+ elseif($reviewer->isType('group'))
+ $params['reviewer'] = $reviewer->getName();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
@@ -1278,6 +1417,60 @@ class SeedDMS_NotificationService {
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
} /* }}} */
+ public function sendAddRevisionMail($content, $user, $revisor) { /* {{{ */
+ $document = $content->getDocument();
+ $folder = $document->getFolder();
+
+ $subject = "revision_request_email_subject";
+ $message = "revision_request_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['version'] = $content->getVersion();
+ $params['comment'] = $content->getComment();
+ if($revisor->isType('user'))
+ $params['revisor'] = $revisor->getFullName();
+ elseif($revisor->isType('group'))
+ $params['revisor'] = $user->getName();
+ $params['username'] = $user->getFullName();
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+
+ if($revisor->isType('user'))
+ $this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
+ elseif($revisor->isType('group'))
+ $this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
+ } /* }}} */
+
+ public function sendAddReceiptMail($content, $user, $recipient) { /* {{{ */
+ $document = $content->getDocument();
+ $folder = $document->getFolder();
+
+ $subject = "receipt_request_email_subject";
+ $message = "receipt_request_email_body";
+ $params = array();
+ $params['name'] = $document->getName();
+ $params['document_id'] = $document->getId();
+ $params['folder_path'] = $folder->getFolderPathPlain();
+ $params['version'] = $content->getVersion();
+ $params['comment'] = $content->getComment();
+ if($recipient->isType('user'))
+ $params['recipient'] = $recipient->getFullName();
+ elseif($recipient->isType('group'))
+ $params['recipient'] = $user->getName();
+ $params['username'] = $user->getFullName();
+ $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
+ $params['sitename'] = $this->settings->_siteName;
+ $params['http_root'] = $this->settings->_httpRoot;
+
+ if($recipient->isType('user'))
+ $this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
+ elseif($recipient->isType('group'))
+ $this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
+ } /* }}} */
+
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
if($oldowner->getID() != $document->getOwner()->getID()) {
$notifyList = $document->getNotifyList();
diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php
index 55ce331cd..5583ce1c4 100644
--- a/inc/inc.ClassSettings.php
+++ b/inc/inc.ClassSettings.php
@@ -47,6 +47,8 @@ class Settings { /* {{{ */
var $_enableGuestAutoLogin = false;
// Set to true for 2-factor Authentication
var $_enable2FactorAuthentication = false;
+ // If you want to allow login by email, set the following to true
+ var $_enableLoginByEmail = false;
// Allow users to reset their password
var $_enablePasswordForgotten = false;
// Do not allow users to change password
@@ -190,7 +192,7 @@ class Settings { /* {{{ */
var $_enableHiddenRevApp = true;
// enable/disable update of a review/approval by the reviewer/approver
var $_enableUpdateRevApp = false;
- // enable/disable removal of a review/approval by the admiistrator
+ // enable/disable removal of a review/approval by the administrator
var $_enableRemoveRevApp = false;
// enable/disable listing logged in user as recipient
var $_enableSelfReceipt = false;
@@ -204,6 +206,18 @@ class Settings { /* {{{ */
var $_enableOwnerReceipt = false;
// enable/disable filter for receipt by the recipient
var $_enableFilterReceipt = false;
+ // group manager is mandatory reviewer
+ var $_addManagerAsReviewer = false;
+ // group manager is mandatory approver
+ var $_addManagerAsApprover = false;
+ // global individuel reviewer
+ var $_globalReviewer = array();
+ // global individuel approver
+ var $_globalApprover = array();
+ // global group reviewer
+ var $_globalGroupReviewer = array();
+ // global group approver
+ var $_globalGroupApprover = array();
// enable/disable default notification for owner
var $_enableOwnerNotification = false;
// enable/disable deleting of versions for regular users
@@ -670,6 +684,7 @@ class Settings { /* {{{ */
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
$this->_enable2FactorAuthentication = Settings::boolVal($tab["enable2FactorAuthentication"]);
+ $this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
$this->_passwordStrength = intval($tab["passwordStrength"]);
$this->_passwordStrengthAlgorithm = strval($tab["passwordStrengthAlgorithm"]);
@@ -808,6 +823,16 @@ class Settings { /* {{{ */
$this->_enableOwnerReceipt = Settings::boolval($tab["enableOwnerReceipt"]);
$this->_enableUpdateReceipt = Settings::boolval($tab["enableUpdateReceipt"]);
$this->_enableFilterReceipt = Settings::boolval($tab["enableFilterReceipt"]);
+ $this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
+ $this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
+ if(trim(strval($tab["globalReviewer"])))
+ $this->_globalReviewer = explode(',',strval($tab["globalReviewer"]));
+ if(trim(strval($tab["globalApprover"])))
+ $this->_globalApprover = explode(',',strval($tab["globalApprover"]));
+ if(trim(strval($tab["globalGroupReviewer"])))
+ $this->_globalGroupReviewer = explode(',',strval($tab["globalGroupReviewer"]));
+ if(trim(strval($tab["globalGroupApprover"])))
+ $this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
$this->_initialDocumentStatus = intval($tab["initialDocumentStatus"]);
$this->_versioningFileName = strval($tab["versioningFileName"]);
@@ -1065,6 +1090,7 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
$this->setXMLAttributValue($node, "enable2FactorAuthentication", $this->_enable2FactorAuthentication);
+ $this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
$this->setXMLAttributValue($node, "passwordStrengthAlgorithm", $this->_passwordStrengthAlgorithm);
@@ -1181,6 +1207,14 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "enableFilterReceipt", $this->_enableFilterReceipt);
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
$this->setXMLAttributValue($node, "initialDocumentStatus", $this->_initialDocumentStatus);
+ $this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
+ $this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
+ $this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
+ $this->setXMLAttributValue($node, "globalApprover", implode(',', $this->_globalApprover));
+ $this->setXMLAttributValue($node, "globalGroupReviewer", implode(',', $this->_globalGroupReviewer));
+ $this->setXMLAttributValue($node, "globalGroupApprover", implode(',', $this->_globalGroupApprover));
+ $this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
+ $this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
$this->setXMLAttributValue($node, "enableReceiptWorkflow", $this->_enableReceiptWorkflow);
diff --git a/inc/inc.Language.php b/inc/inc.Language.php
index 8a31c22c1..3cbdf965f 100644
--- a/inc/inc.Language.php
+++ b/inc/inc.Language.php
@@ -404,10 +404,24 @@ function getAttributeValidationText($error, $attrname='', $attrvalue='', $regex=
} /* }}} */
function getAttributeValidationError($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */
+ if(is_object($attrvalue))
+ $attrvalue = $attrvalue->getId();
switch($error) {
- case 10:
+ case 14:
return array("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
+ case 13:
+ return array("attr_not_a_group", array('attrname'=>$attrname, 'value'=>$attrvalue));
+ break;
+ case 12:
+ return array("attr_not_a_user", array('attrname'=>$attrname, 'value'=>$attrvalue));
+ break;
+ case 11:
+ return array("attr_not_a_folder", array('attrname'=>$attrname, 'value'=>$attrvalue));
+ break;
+ case 10:
+ return array("attr_not_a_document", array('attrname'=>$attrname, 'value'=>$attrvalue));
+ break;
case 9:
return array("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
diff --git a/inc/inc.Tasks.php b/inc/inc.Tasks.php
index 47adc18cd..0e2bca4c4 100644
--- a/inc/inc.Tasks.php
+++ b/inc/inc.Tasks.php
@@ -45,17 +45,20 @@ class SeedDMS_ExpiredDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
$body .= "---------------------------------------------------------------------------------\n";
foreach($docs as $doc) {
$body .= sprintf($tableformat."\n", getReadableDate($doc->getExpires()), $doc->getId(), $doc->getName());
- $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getExpires()), $doc->getId(), ''.htmlspecialchars($doc->getName()).'');
+ $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getExpires()), $doc->getId(), ''.htmlspecialchars($doc->getName()).'');
}
$bodyhtml .= "".PHP_EOL;
- $params = array();
- $params['count'] = count($docs);
- $params['__body__'] = $body;
- $params['__body_html__'] = $bodyhtml;
- $params['sitename'] = $settings->_siteName;
- $email->toIndividual('', $u, 'expired_docs_mail_subject', '', $params);
-
- $logger->log('Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \''.$u->getLogin().'\'', PEAR_LOG_INFO);
+ if(empty($taskparams['dryrun'])) {
+ $params = array();
+ $params['count'] = count($docs);
+ $params['__body__'] = $body;
+ $params['__body_html__'] = $bodyhtml;
+ $params['sitename'] = $settings->_siteName;
+ $email->toIndividual('', $u, 'expired_docs_mail_subject', '', $params);
+ $logger->log('Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \''.$u->getLogin().'\'', PEAR_LOG_INFO);
+ } else {
+ $logger->log('Task \'expired_docs\': Dry run, not sending reminder \'expired_docs_mail_subject\' to user \''.$u->getLogin().'\'', PEAR_LOG_INFO);
+ }
}
}
}
@@ -68,17 +71,21 @@ class SeedDMS_ExpiredDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
$body .= "---------------------------------------------------------------------------------\n";
foreach($docs as $doc) {
$body .= sprintf($tableformat."\n", getReadableDate($doc->getExpires()), $doc->getId(), $doc->getName());
- $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getExpires()), $doc->getId(), $doc->getName());
+ $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getExpires()), $doc->getId(), ''.htmlspecialchars($doc->getName()).'');
}
$bodyhtml .= "".PHP_EOL;
- $params = array();
- $params['count'] = count($docs);
- $params['__body__'] = $body;
- $params['__body_html__'] = $bodyhtml;
- $params['sitename'] = $settings->_siteName;
- $email->toIndividual('', $taskparams['email'], 'expired_docs_mail_subject', '', $params);
+ if(empty($taskparams['dryrun'])) {
+ $params = array();
+ $params['count'] = count($docs);
+ $params['__body__'] = $body;
+ $params['__body_html__'] = $bodyhtml;
+ $params['sitename'] = $settings->_siteName;
+ $email->toIndividual('', $taskparams['email'], 'expired_docs_mail_subject', '', $params);
- $logger->log('Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \''.$taskparams['email'].'\'', PEAR_LOG_INFO);
+ $logger->log('Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \''.$taskparams['email'].'\'', PEAR_LOG_INFO);
+ } else {
+ $logger->log('Task \'expired_docs\': Dry run, not sending reminder \'expired_docs_mail_subject\' to user \''.$taskparams['email'].'\'', PEAR_LOG_INFO);
+ }
}
} else {
$logger->log('Task \'expired_docs\': neither peruser nor email is set', PEAR_LOG_WARNING);
@@ -92,21 +99,26 @@ class SeedDMS_ExpiredDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
public function getAdditionalParams() {
return array(
- array(
- 'name'=>'email',
- 'type'=>'string',
- 'description'=> '',
- ),
array(
'name'=>'days',
'type'=>'integer',
'description'=> 'Number of days to check for. Negative values will look into the past. 0 will just check for documents expiring the current day. Keep in mind that the document is still valid on the expiration date.',
),
+ array(
+ 'name'=>'email',
+ 'type'=>'string',
+ 'description'=> 'If set, emails are send to this address.',
+ ),
array(
'name'=>'peruser',
'type'=>'boolean',
'description'=> 'Send mail to each user. If set, a list of all expired documents will be send to the owner of the documents.',
- )
+ ),
+ array(
+ 'name'=>'dryrun',
+ 'type'=>'boolean',
+ 'description'=> 'Do not send emails, just log.',
+ ),
);
}
} /* }}} */
@@ -792,7 +804,7 @@ class SeedDMS_RecentChangesTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
$body .= "---------------------------------------------------------------------------------\n";
foreach($ds as $doc) {
$body .= sprintf($tableformat."\n", getReadableDate($doc->getDate()), $doc->getId(), $doc->getName());
- $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getDate()), $doc->getId(), ''.htmlspecialchars($doc->getName()).'');
+ $bodyhtml .= sprintf($tableformathtml."\n", getReadableDate($doc->getDate()), $doc->getId(), ''.htmlspecialchars($doc->getName()).'');
}
$bodyhtml .= "".PHP_EOL;
$body .= PHP_EOL;
diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php
index d047d9458..6b9b5101c 100644
--- a/inc/inc.Utils.php
+++ b/inc/inc.Utils.php
@@ -959,7 +959,7 @@ function isAjax() { /* {{{ */
} /* }}} */
/**
- * Hash a password
+ * Hash a password
*
* @param string $password
* @return string hashed password
@@ -969,7 +969,7 @@ function seed_pass_hash($password) { /* {{{ */
} /* }}} */
/**
- * Verify a password
+ * Verify a password
*
* @param string $password
* @return string hashed password
@@ -1044,7 +1044,7 @@ function cmp_user_login($a, $b) { /* {{{ */
} /* }}} */
/**
- * Compare function for sorting users by name
+ * Compare function for sorting users by name
*
* Use this for usort()
*
@@ -1066,36 +1066,94 @@ function cmp_user_fullname($a, $b) { /* {{{ */
* Returns the mandatory reviewers
*
* This function checks if the reviewers have at least read access
- * on the folder containing the document.
+ * on the folder containing the document. It also checks if the
+ * mandatory reviewer is an admin or the uploading user and if
+ * those are allowed to review/approve a document.
+ * Mandatory groups will only be added if they are not empty
*
* @param $folder folder where document is located
+ * @param $document document which is updated, null when adding a new document
* @param $user user creating the new version or document
- * @return array
+ * @return array containing the elements 'i' and 'g'. Each is a list of user/group ids
*/
-function getMandatoryReviewers($folder, $user) { /* {{{ */
+function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
global $settings;
- /* Get a list of all users and groups with read access on the folder.
- * Only those users and groups will be added as reviewers
- */
- $docAccess = $folder->getReadAccessList($settings->_enableAdminRevApp, $settings->_enableOwnerRevApp);
- $res=$user->getMandatoryReviewers();
- $reviewers = array('i'=>[], 'g'=>[]);
+ /* Get mandatory reviewers of user */
+ $res = $user->getMandatoryReviewers();
+ $revi = $revg = [];
foreach ($res as $r){
if ($r['reviewerUserID']!=0){
- foreach ($docAccess["users"] as $usr)
- if ($usr->getID()==$r['reviewerUserID']){
- $reviewers["i"][] = $r['reviewerUserID'];
- break;
- }
+ $revi[] = $r['reviewerUserID'];
} elseif ($r['reviewerGroupID']!=0){
- foreach ($docAccess["groups"] as $grp)
- if ($grp->getID()==$r['reviewerGroupID']){
- $reviewers["g"][] = $r['reviewerGroupID'];
- break;
- }
+ $revg[] = $r['reviewerGroupID'];
}
}
+
+ /* Add managers of groups as mandatory reviewers */
+ if(!empty($settings->_addManagerAsReviewer)) {
+ $groups = $user->getGroups();
+ foreach($groups as $group) {
+ $managers = $group->getManagers();
+ foreach($managers as $manager) {
+ $revi[] = $manager->getId();
+ }
+ }
+ }
+
+ /* Add global reviewers as mandatory reviewers */
+ if(!empty($settings->_globalReviewer)) {
+ $revi = array_merge($revi, $settings->_globalReviewer);
+ }
+
+ /* Add global group reviewers as mandatory reviewers */
+ if(!empty($settings->_globalGroupReviewer)) {
+ $revg = array_merge($revg, $settings->_globalGroupReviewer);
+ }
+
+ /* Check if reviewers are allowed to review */
+ $revi = array_unique($revi);
+ $revg = array_unique($revg);
+ $reviewers["i"] = []; // users
+ $reviewers["g"] = []; // groups
+ $reviewers["ni"] = []; // users being filtered out
+ $reviewers["ng"] = []; // groups being filtered out
+ $dms = $user->getDMS();
+ foreach($revi as $uid) {
+ if($u = $dms->getUser($uid)) {
+ /* need at least read access on parent folder */
+ if($document)
+ $accessmode = $document->getAccessMode($u);
+ else
+ $accessmode = $folder->getAccessMode($u);
+ if($accessmode < M_READ)
+ $reviewers["ni"][] = $u->getId();
+ /* admins as reviewers must be enabled */
+ elseif(!$settings->_enableAdminRevApp && $u->isAdmin())
+ $reviewers["ni"][] = $u->getId();
+ /* the owner of the document as a reviewer must be enabled */
+ elseif(!$settings->_enableOwnerRevApp && $document && $document->getOwner()->getId() == $u->getId())
+ $reviewers["ni"][] = $u->getId();
+ /* the updloader as a reviewer must be enabled */
+ elseif(!$settings->_enableSelfRevApp && $u->getId() == $user->getId())
+ $reviewers["ni"][] = $u->getId();
+ else
+ $reviewers["i"][] = $u->getId();
+ }
+ }
+ foreach($revg as $gid) {
+ if($g = $dms->getGroup($gid)) {
+ if($document)
+ $accessmode = $document->getGroupAccessMode($u);
+ else
+ $accessmode = $folder->getGroupAccessMode($u);
+ if($accessmode < M_READ || !$g->getUsers())
+ $reviewers["ng"][] = $g->getId();
+ else
+ $reviewers["g"][] = $g->getId();
+ }
+ }
+
return $reviewers;
} /* }}} */
@@ -1103,38 +1161,94 @@ function getMandatoryReviewers($folder, $user) { /* {{{ */
* Returns the mandatory approvers
*
* This function checks if the approvers have at least read access
- * on the folder containing the document.
+ * on the folder containing the document. It also checks if the
+ * mandatory approver is an admin or the uploading user and if
+ * those are allowed to review/approve a document.
+ * Mandatory groups will only be added if they are not empty
*
* @param $folder folder where document is located
+ * @param $document document which is updated, null when adding a new document
* @param $user user creating the new version or document
- * @return array
+ * @return array containing the elements 'i' and 'g'. Each is a list of user/group ids
*/
-function getMandatoryApprovers($folder, $user) { /* {{{ */
+function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
global $settings;
- /* Get a list of all users and groups with read access on the folder.
- * Only those users and groups will be added as approvers
- */
- $docAccess = $folder->getReadAccessList($settings->_enableAdminRevApp, $settings->_enableOwnerRevApp);
- $res=$user->getMandatoryApprovers();
- $approvers = array('i'=>[], 'g'=>[]);
+ /* Get mandatory approvers of user */
+ $res = $user->getMandatoryApprovers();
+ $appi = $appg = [];
foreach ($res as $r){
-
if ($r['approverUserID']!=0){
- foreach ($docAccess["users"] as $usr)
- if ($usr->getID()==$r['approverUserID']){
- $approvers["i"][] = $r['approverUserID'];
- break;
- }
- }
- else if ($r['approverGroupID']!=0){
- foreach ($docAccess["groups"] as $grp)
- if ($grp->getID()==$r['approverGroupID']){
- $approvers["g"][] = $r['approverGroupID'];
- break;
- }
+ $appi[] = $r['approverUserID'];
+ } elseif ($r['approverGroupID']!=0){
+ $appg[] = $r['approverGroupID'];
}
}
+
+ /* Add managers of groups as mandatory approvers */
+ if(!empty($settings->_addManagerAsApprover)) {
+ $groups = $user->getGroups();
+ foreach($groups as $group) {
+ $managers = $group->getManagers();
+ foreach($managers as $manager) {
+ $appi[] = $manager->getId();
+ }
+ }
+ }
+
+ /* Add global approvers as mandatory approvers */
+ if(!empty($settings->_globalApprover)) {
+ $appi = array_merge($appi, $settings->_globalApprover);
+ }
+
+ /* Add global group approvers as mandatory approvers */
+ if(!empty($settings->_globalGroupApprover)) {
+ $appg = array_merge($appg, $settings->_globalGroupApprover);
+ }
+
+ /* Check if approvers are allowed to approve */
+ $appi = array_unique($appi);
+ $appg = array_unique($appg);
+ $approvers["i"] = []; // users
+ $approvers["g"] = []; // groups
+ $approvers["ni"] = []; // users being filtered out
+ $approvers["ng"] = []; // groups being filtered out
+ $dms = $user->getDMS();
+ foreach($appi as $uid) {
+ if($u = $dms->getUser($uid)) {
+ /* need at least read access on parent folder */
+ if($document)
+ $accessmode = $document->getAccessMode($u);
+ else
+ $accessmode = $folder->getAccessMode($u);
+ if($accessmode < M_READ)
+ $approvers["ni"][] = $u->getId();
+ /* admins as approvers must be enabled */
+ elseif(!$settings->_enableAdminRevApp && $u->isAdmin())
+ $approvers["ni"][] = $u->getId();
+ /* the owner of the document as a approver must be enabled */
+ elseif(!$settings->_enableOwnerRevApp && $document && $document->getOwner()->getId() == $u->getId())
+ $approvers["ni"][] = $u->getId();
+ /* the updloader as a approver must be enabled */
+ elseif(!$settings->_enableSelfRevApp && $u->getId() == $user->getId())
+ $approvers["ni"][] = $u->getId();
+ else
+ $approvers["i"][] = $u->getId();
+ }
+ }
+ foreach($appg as $gid) {
+ if($g = $dms->getGroup($gid)) {
+ if($document)
+ $accessmode = $document->getGroupAccessMode($u);
+ else
+ $accessmode = $folder->getGroupAccessMode($u);
+ if($accessmode < M_READ || !$g->getUsers())
+ $approvers["ng"][] = $g->getId();
+ else
+ $approvers["g"][] = $g->getId();
+ }
+ }
+
return $approvers;
} /* }}} */
diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc
index aa5255644..5ff7dfd9e 100644
--- a/languages/ar_EG/lang.inc
+++ b/languages/ar_EG/lang.inc
@@ -155,6 +155,7 @@ URL: [url]',
'attrdef_minvalues_help' => '',
'attrdef_min_greater_max' => 'الأقل اكبر من الأكبر',
'attrdef_multiple' => 'السماح باكثر من قيمة',
+'attrdef_multiple_but_doc_or_folder' => '',
'attrdef_multiple_needs_valueset' => 'يحتاج أكثر من قيمة',
'attrdef_must_be_multiple' => 'يجب أن يكون متعدد القيم',
'attrdef_name' => 'اسم',
@@ -283,6 +284,7 @@ URL: [url]',
'choose_attrdefgroup' => 'من فضلك اختر تعريف سمة المجموعة',
'choose_category' => 'من فضلك اختر القسم',
'choose_group' => 'اختر المجموعة',
+'choose_link_type' => '',
'choose_role' => 'اختر دور',
'choose_target_category' => 'اختر القسم',
'choose_target_document' => 'اختر المستند',
@@ -379,7 +381,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'هذه المنطقة محظورة. الدخول فقط مسموح للموظفين المعتمدين. اي اختراق سيتم التعامل معه وفقا للقوانين المحلية والدولية.',
'discspace' => 'مساحة القرص',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'الدخول مرفوض الى المستندات في الإستقبال',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'الدخول مرفوض الى المستندات قيد المراجعة',
'docs_with_missing_revision_date' => '',
'document' => 'مستند',
@@ -634,6 +638,7 @@ URL: [url]',
'error_update_document' => 'خطأ في تحديث المستند',
'error_uploading_reviewer_only' => 'خطأ في رفع المراجع فقط',
'es_ES' => 'الإسبانية',
+'event' => '',
'event_details' => 'تفاصيل الحدث',
'exclude_items' => 'فصل الأشياء',
'expired' => 'انتهى صلاحيته',
@@ -692,6 +697,7 @@ URL: [url]',
'filter_for_documents' => 'فلتر للمستندات',
'filter_for_documents_and_folders' => '',
'filter_for_folders' => 'فلتر للملفات',
+'finished_workflow_log' => '',
'folder' => 'مجلد',
'folders' => 'مجلدات',
'folders_and_documents_statistic' => 'رؤية عامة للمحتوى',
@@ -790,6 +796,7 @@ URL: [url]',
'global_attributedefinitions' => 'سمات',
'global_default_keywords' => 'كلمات بحثية عامة',
'global_document_categories' => 'اقسام',
+'global_link_types' => '',
'global_workflows' => 'مسارات العمل',
'global_workflow_actions' => 'اجراءات مسار العمل',
'global_workflow_states' => 'حالات مسار العمل',
@@ -855,6 +862,7 @@ URL: [url]',
'individuals_in_groups' => 'أفراد في المجموعات',
'ind_review_removed' => '',
'info_recipients_tab_not_released' => 'رابط معلومات المستلمين لم يصدر بعد',
+'info_rm_user_from_processes_none' => '',
'info_rm_user_from_processes_user' => '',
'inherited' => 'موروث',
'inherits_access_copy_msg' => 'نسخ قائمة صلاحيات موروثة.',
@@ -935,6 +943,7 @@ URL: [url]',
'latest_updateddocuments' => '',
'legend' => 'الدليل',
'librarydoc' => 'مستندات المكتبة',
+'linked_document' => '',
'linked_documents' => 'مستندات متعلقة',
'linked_files' => 'ملحقات',
'linked_to_current_version' => 'متعلقة بالإصدار الحالي',
@@ -948,6 +957,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'لائحة الدمج',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'لائحة المهمات',
'local_file' => 'ملف محلي',
'locked_by' => 'محمي بواسطة',
@@ -1013,6 +1023,7 @@ URL: [url]',
'move_document' => 'تحريك مستند',
'move_folder' => 'تحريك مجلد',
'move_into_rootfolder' => '',
+'must_drop_one_file' => '',
'my_account' => 'حسابي',
'my_documents' => 'مستنداتي',
'my_transmittals' => 'الإحالات الخاصة بي',
@@ -1056,6 +1067,7 @@ URL: [url]',
'new_file_email_body_html' => '',
'new_file_email_subject' => '[sitename]: [document] - مرفقات جديدة',
'new_folder' => 'مجلد جديد',
+'new_link_type' => '',
'new_password' => 'كلمة سر جديدة',
'new_subfolder_email' => 'مستند جديد',
'new_subfolder_email_body' => 'مجلد جديد
@@ -1323,6 +1335,8 @@ URL: [url]',
'revisions_without_group' => 'مراجعات بلا مجموعة',
'revisions_without_user' => 'مراجعات بلا مستخدم',
'revision_date' => 'تاريخ المراجعة',
+'revision_deletion_email_body' => '',
+'revision_deletion_email_subject' => '',
'revision_log' => 'سجل المراجعة',
'revision_request_email_body' => 'طلب مراجعة محتوى البريد الإلكتروني',
'revision_request_email_body_html' => '',
@@ -1474,6 +1488,10 @@ URL: [url]',
'settings' => 'الإعدادات',
'settings_activate_module' => 'Activate module',
'settings_activate_php_extension' => 'Activate PHP extension',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'ِAdmin IP',
'settings_Advanced' => 'متقدم',
@@ -1621,6 +1639,8 @@ URL: [url]',
'settings_enableLanguageSelector_desc' => 'تمكين تحديد اللغة',
'settings_enableLargeFileUpload' => 'تمكين تحميل الملفات الكبيرة',
'settings_enableLargeFileUpload_desc' => 'تمكين تحميل الملفات الكبيرة',
+'settings_enableLoginByEmail' => '',
+'settings_enableLoginByEmail_desc' => '',
'settings_enableMenuTasks' => 'تمكين مهام القائمة',
'settings_enableMenuTasks_desc' => 'تمكين مهام القائمة',
'settings_enableMultiUpload' => 'تمكين تحميل متعدد',
@@ -1695,6 +1715,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'محرك البحث الكامل',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLITEFTS',
+'settings_globalApprover' => '',
+'settings_globalApprover_desc' => '',
+'settings_globalGroupApprover' => '',
+'settings_globalGroupApprover_desc' => '',
+'settings_globalGroupReviewer' => '',
+'settings_globalGroupReviewer_desc' => '',
+'settings_globalReviewer' => '',
+'settings_globalReviewer_desc' => '',
+'settings_global_approver_is_admin' => '',
+'settings_global_reviewer_is_admin' => '',
'settings_guestID' => 'معرف الضيف',
'settings_guestID_desc' => 'معرف الضيف',
'settings_guestid_is_admin' => '',
@@ -1732,6 +1762,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'luceneClassDir',
'settings_luceneDir' => 'luceneDir',
'settings_luceneDir_desc' => 'luceneDir',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'maxDirID',
@@ -1920,6 +1952,7 @@ URL: [url]',
'splash_add_group' => 'اضافة مجموعة',
'splash_add_group_member' => 'اضافة مستخدم الى المجموعة',
'splash_add_keyword' => '',
+'splash_add_keyword_category' => '',
'splash_add_notify' => '',
'splash_add_role' => 'اضافة دور',
'splash_add_task' => '',
@@ -1927,6 +1960,7 @@ URL: [url]',
'splash_add_transmittal' => 'إضافة إحالة',
'splash_add_user' => 'اضافة مستخدم',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'مسح ذاكرة التخزين المؤقت',
'splash_cleared_clipboard' => 'مسح الحافظة',
'splash_delete_access' => 'حذف الوصول',
@@ -1938,17 +1972,20 @@ URL: [url]',
'splash_document_locked' => 'تم قفل المستند',
'splash_document_name_changed' => '',
'splash_document_unlocked' => 'تم الغاء قفل المستند',
+'splash_document_updated' => '',
'splash_edit_access' => 'تحرير الدخول',
'splash_edit_attribute' => 'تحرير السمة',
'splash_edit_category' => '',
'splash_edit_event' => 'تحرير الحدث',
'splash_edit_group' => 'تحرير المجموعة',
'splash_edit_keyword' => '',
+'splash_edit_keyword_category' => '',
'splash_edit_role' => 'تحرير الدور',
'splash_edit_task' => 'تحرير المهمة',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'تحرير المستخدم',
'splash_error_add_to_transmittal' => 'خطأ الإضافة إلى الإحالة',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'خطأ في إزالة رابط التنزيل',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'خطأ في إرسال رابط التنزيل',
@@ -1982,6 +2019,7 @@ URL: [url]',
'splash_rm_group' => 'تم حذف المجموعة',
'splash_rm_group_member' => 'تم حذف مستخدم من المجموعة',
'splash_rm_keyword' => '',
+'splash_rm_keyword_category' => '',
'splash_rm_notify' => '',
'splash_rm_role' => 'تم حذف دور',
'splash_rm_transmittal' => 'تم حذف إحالة',
@@ -2065,6 +2103,7 @@ URL: [url]',
'target_equals_source_folder' => '',
'tasks' => 'مهمات',
'task_core_expireddocs_days' => '',
+'task_core_expireddocs_dryrun' => '',
'task_core_expireddocs_email' => '',
'task_core_expireddocs_peruser' => '',
'task_core_importdropfolder_dryrun' => '',
@@ -2160,6 +2199,7 @@ URL: [url]',
'type_to_filter' => '',
'type_to_search' => 'اكتب لتبحث',
'uk_UA' => 'ﺍﻮﻛﺭﺎﻨﻳ',
+'undefined' => '',
'under_folder' => 'في المجلد',
'unknown_attrdef' => 'تعريف سمة غير معروفة',
'unknown_command' => 'لم يتم التعرف على الأمر.',
@@ -2178,6 +2218,7 @@ URL: [url]',
'unlock_cause_locking_user' => 'يمكنك تحديثه لانك من قمت بحمايته. سيتم ازالة الحماية تلقائية.',
'unlock_document' => 'ازالة القفل',
'update' => 'تحديث',
+'updated' => '',
'updated_documents' => '',
'update_approvers' => 'تحديثة قائمة الموافقون',
'update_document' => 'تحديث المستند',
diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc
index 2c8f02ca6..961112f13 100644
--- a/languages/bg_BG/lang.inc
+++ b/languages/bg_BG/lang.inc
@@ -150,6 +150,7 @@ $text = array(
'attrdef_minvalues_help' => '',
'attrdef_min_greater_max' => '',
'attrdef_multiple' => 'ПОзволи няколко стойности',
+'attrdef_multiple_but_doc_or_folder' => '',
'attrdef_multiple_needs_valueset' => '',
'attrdef_must_be_multiple' => '',
'attrdef_name' => 'Име',
@@ -270,6 +271,7 @@ $text = array(
'choose_attrdefgroup' => '',
'choose_category' => 'Изберете',
'choose_group' => 'Изберете група',
+'choose_link_type' => '',
'choose_role' => '',
'choose_target_category' => 'Изберете категория',
'choose_target_document' => 'Изберете документ',
@@ -366,7 +368,9 @@ $text = array(
'disable_extension' => '',
'disclaimer' => 'Работим аккуратно и задълбочено. От това зависи бъдeщето на нашата страна и благополучието на народа.nПетилетката за три години!nДа не оставим неодрусана слива в наше село!',
'discspace' => '',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Документ',
@@ -572,6 +576,7 @@ $text = array(
'error_update_document' => '',
'error_uploading_reviewer_only' => '',
'es_ES' => 'Испански',
+'event' => '',
'event_details' => 'Детайли за събитието',
'exclude_items' => '',
'expired' => 'Изтекъл',
@@ -626,6 +631,7 @@ $text = array(
'filter_for_documents' => '',
'filter_for_documents_and_folders' => '',
'filter_for_folders' => '',
+'finished_workflow_log' => '',
'folder' => 'Папка',
'folders' => 'Папки',
'folders_and_documents_statistic' => 'Обзор на съдържанието',
@@ -684,6 +690,7 @@ $text = array(
'global_attributedefinitions' => 'атрибути',
'global_default_keywords' => 'Глобални ключови думи',
'global_document_categories' => 'Категории',
+'global_link_types' => '',
'global_workflows' => 'Процеси',
'global_workflow_actions' => 'действия по процеси',
'global_workflow_states' => 'Състояния процеси',
@@ -749,6 +756,7 @@ $text = array(
'individuals_in_groups' => '',
'ind_review_removed' => '',
'info_recipients_tab_not_released' => '',
+'info_rm_user_from_processes_none' => '',
'info_rm_user_from_processes_user' => '',
'inherited' => 'наследен',
'inherits_access_copy_msg' => 'Изкопирай наследения список',
@@ -829,6 +837,7 @@ $text = array(
'latest_updateddocuments' => '',
'legend' => 'легенда',
'librarydoc' => '',
+'linked_document' => '',
'linked_documents' => 'Свързани документи',
'linked_files' => 'Приложения',
'linked_to_current_version' => '',
@@ -842,6 +851,7 @@ $text = array(
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Локален файл',
'locked_by' => 'Блокиран',
@@ -907,6 +917,7 @@ $text = array(
'move_document' => 'Премести документ',
'move_folder' => 'Премести папка',
'move_into_rootfolder' => '',
+'must_drop_one_file' => '',
'my_account' => 'Моя акаунт',
'my_documents' => 'Моите документи',
'my_transmittals' => 'Моите предавания',
@@ -939,6 +950,7 @@ $text = array(
'new_file_email_body_html' => '',
'new_file_email_subject' => '',
'new_folder' => 'Нова папка',
+'new_link_type' => '',
'new_password' => 'Нова парола',
'new_subfolder_email' => 'Нова подпапка',
'new_subfolder_email_body' => '',
@@ -1178,6 +1190,8 @@ $text = array(
'revisions_without_group' => '',
'revisions_without_user' => '',
'revision_date' => '',
+'revision_deletion_email_body' => '',
+'revision_deletion_email_subject' => '',
'revision_log' => '',
'revision_request_email_body' => '',
'revision_request_email_body_html' => '',
@@ -1316,6 +1330,10 @@ $text = array(
'settings' => 'Настройки',
'settings_activate_module' => 'Активирай модул',
'settings_activate_php_extension' => 'Активирай разширение на PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Админско IP',
'settings_adminIP_desc' => 'Ако е сложено, то админа ще може да влиза само от това IP. Оставете празно за да избегнем апокалипсиса. Не работи с LDAP',
'settings_Advanced' => 'Допълнително',
@@ -1463,6 +1481,8 @@ $text = array(
'settings_enableLanguageSelector_desc' => 'Покажи селектор за език на интерфейса след влизане. Това не влияе на избора на език на първа страница.',
'settings_enableLargeFileUpload' => 'Включи джава-зараждане на файлове',
'settings_enableLargeFileUpload_desc' => 'Ако е включено, качване на файлове е дустъпно и чрез джава-аплет, именован jumploader, без лимит за размер на файла. Това също ще позволи да се качват няколко файла наведнъж.',
+'settings_enableLoginByEmail' => '',
+'settings_enableLoginByEmail_desc' => '',
'settings_enableMenuTasks' => '',
'settings_enableMenuTasks_desc' => '',
'settings_enableMultiUpload' => '',
@@ -1537,6 +1557,16 @@ $text = array(
'settings_fullSearchEngine_desc' => '',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLiteFTS',
+'settings_globalApprover' => '',
+'settings_globalApprover_desc' => '',
+'settings_globalGroupApprover' => '',
+'settings_globalGroupApprover_desc' => '',
+'settings_globalGroupReviewer' => '',
+'settings_globalGroupReviewer_desc' => '',
+'settings_globalReviewer' => '',
+'settings_globalReviewer_desc' => '',
+'settings_global_approver_is_admin' => '',
+'settings_global_reviewer_is_admin' => '',
'settings_guestID' => 'Идентификатор за гостенин',
'settings_guestID_desc' => 'Идентификатор за гост (може да не се променя)',
'settings_guestid_is_admin' => '',
@@ -1574,6 +1604,8 @@ $text = array(
'settings_luceneClassDir_desc' => 'Път към SeedDMS_Lucene (не е задължително)',
'settings_luceneDir' => 'Каталог за пълнотекстовия индекс',
'settings_luceneDir_desc' => 'Път, където Lucene ще пише своя индекс',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Максимален ID на папка',
@@ -1762,6 +1794,7 @@ $text = array(
'splash_add_group' => '',
'splash_add_group_member' => '',
'splash_add_keyword' => '',
+'splash_add_keyword_category' => '',
'splash_add_notify' => '',
'splash_add_role' => '',
'splash_add_task' => '',
@@ -1769,6 +1802,7 @@ $text = array(
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1780,17 +1814,20 @@ $text = array(
'splash_document_locked' => 'Документът е заключен',
'splash_document_name_changed' => '',
'splash_document_unlocked' => 'Документа е отключен',
+'splash_document_updated' => '',
'splash_edit_access' => '',
'splash_edit_attribute' => '',
'splash_edit_category' => '',
'splash_edit_event' => '',
'splash_edit_group' => '',
'splash_edit_keyword' => '',
+'splash_edit_keyword_category' => '',
'splash_edit_role' => '',
'splash_edit_task' => '',
'splash_edit_transmittal' => '',
'splash_edit_user' => '',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
@@ -1824,6 +1861,7 @@ $text = array(
'splash_rm_group' => '',
'splash_rm_group_member' => '',
'splash_rm_keyword' => '',
+'splash_rm_keyword_category' => '',
'splash_rm_notify' => '',
'splash_rm_role' => '',
'splash_rm_transmittal' => '',
@@ -1907,6 +1945,7 @@ $text = array(
'target_equals_source_folder' => '',
'tasks' => '',
'task_core_expireddocs_days' => '',
+'task_core_expireddocs_dryrun' => '',
'task_core_expireddocs_email' => '',
'task_core_expireddocs_peruser' => '',
'task_core_importdropfolder_dryrun' => '',
@@ -1993,6 +2032,7 @@ $text = array(
'type_to_filter' => '',
'type_to_search' => 'Тип за търсене',
'uk_UA' => 'Украински',
+'undefined' => '',
'under_folder' => 'В папка',
'unknown_attrdef' => '',
'unknown_command' => 'Командата не е позната.',
@@ -2011,6 +2051,7 @@ $text = array(
'unlock_cause_locking_user' => 'Вие все още можете да го обновите, защото сте един от тези, които го е блокирал. Блокировката ще бъде снета автоматично.',
'unlock_document' => 'Разблокирай',
'update' => 'Обнови',
+'updated' => '',
'updated_documents' => '',
'update_approvers' => 'Обнови списъка с утвърждаващи',
'update_document' => 'Обнови документ',
diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc
index b1d847936..c33ee21b2 100644
--- a/languages/ca_ES/lang.inc
+++ b/languages/ca_ES/lang.inc
@@ -155,6 +155,7 @@ URL: [url]',
'attrdef_minvalues_help' => '',
'attrdef_min_greater_max' => '',
'attrdef_multiple' => '',
+'attrdef_multiple_but_doc_or_folder' => '',
'attrdef_multiple_needs_valueset' => '',
'attrdef_must_be_multiple' => '',
'attrdef_name' => '',
@@ -275,6 +276,7 @@ URL: [url]',
'choose_attrdefgroup' => '',
'choose_category' => 'Elegir categoria',
'choose_group' => 'Seleccionar grup',
+'choose_link_type' => '',
'choose_role' => '',
'choose_target_category' => '',
'choose_target_document' => 'Escollir document',
@@ -371,7 +373,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Aquesta és una àrea restringida. Només es permet l\'accés a usuaris autoritzats. Qualsevol intrusió es perseguirà d\'acord amb les lleis internacionals.',
'discspace' => '',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
@@ -577,6 +581,7 @@ URL: [url]',
'error_update_document' => '',
'error_uploading_reviewer_only' => '',
'es_ES' => 'Castellà',
+'event' => '',
'event_details' => 'Detalls de l\'event',
'exclude_items' => '',
'expired' => 'Caducat',
@@ -631,6 +636,7 @@ URL: [url]',
'filter_for_documents' => '',
'filter_for_documents_and_folders' => '',
'filter_for_folders' => 'Filtre adicional per les carpetes',
+'finished_workflow_log' => '',
'folder' => 'Carpeta',
'folders' => 'Carpetes',
'folders_and_documents_statistic' => 'Vista general de continguts',
@@ -689,6 +695,7 @@ URL: [url]',
'global_attributedefinitions' => 'Atributs',
'global_default_keywords' => 'Mots clau globals',
'global_document_categories' => 'Categories',
+'global_link_types' => '',
'global_workflows' => '',
'global_workflow_actions' => '',
'global_workflow_states' => '',
@@ -754,6 +761,7 @@ URL: [url]',
'individuals_in_groups' => '',
'ind_review_removed' => '',
'info_recipients_tab_not_released' => '',
+'info_rm_user_from_processes_none' => '',
'info_rm_user_from_processes_user' => '',
'inherited' => 'Heredat',
'inherits_access_copy_msg' => 'Copiar llista d\'accés heretat',
@@ -834,6 +842,7 @@ URL: [url]',
'latest_updateddocuments' => '',
'legend' => 'Llegenda',
'librarydoc' => '',
+'linked_document' => '',
'linked_documents' => 'Documents relacionats',
'linked_files' => 'Adjunts',
'linked_to_current_version' => '',
@@ -847,6 +856,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Arxiu local',
'locked_by' => 'Locked by',
@@ -912,6 +922,7 @@ URL: [url]',
'move_document' => 'Moure document',
'move_folder' => 'Moure directori',
'move_into_rootfolder' => '',
+'must_drop_one_file' => '',
'my_account' => 'El meu compte',
'my_documents' => 'Els meus documents',
'my_transmittals' => 'Documents enviats per mi',
@@ -944,6 +955,7 @@ URL: [url]',
'new_file_email_body_html' => '',
'new_file_email_subject' => '',
'new_folder' => 'Nova carpeta',
+'new_link_type' => '',
'new_password' => '',
'new_subfolder_email' => 'Nova subcarpeta',
'new_subfolder_email_body' => '',
@@ -1183,6 +1195,8 @@ URL: [url]',
'revisions_without_group' => '',
'revisions_without_user' => '',
'revision_date' => '',
+'revision_deletion_email_body' => '',
+'revision_deletion_email_subject' => '',
'revision_log' => '',
'revision_request_email_body' => '',
'revision_request_email_body_html' => '',
@@ -1321,6 +1335,10 @@ URL: [url]',
'settings' => 'Settings',
'settings_activate_module' => 'Activate module',
'settings_activate_php_extension' => 'Activate PHP extension',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => '',
'settings_Advanced' => '',
@@ -1468,6 +1486,8 @@ URL: [url]',
'settings_enableLanguageSelector_desc' => '',
'settings_enableLargeFileUpload' => '',
'settings_enableLargeFileUpload_desc' => '',
+'settings_enableLoginByEmail' => '',
+'settings_enableLoginByEmail_desc' => '',
'settings_enableMenuTasks' => '',
'settings_enableMenuTasks_desc' => '',
'settings_enableMultiUpload' => '',
@@ -1542,6 +1562,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => '',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLiteFTS',
+'settings_globalApprover' => '',
+'settings_globalApprover_desc' => '',
+'settings_globalGroupApprover' => '',
+'settings_globalGroupApprover_desc' => '',
+'settings_globalGroupReviewer' => '',
+'settings_globalGroupReviewer_desc' => '',
+'settings_globalReviewer' => '',
+'settings_globalReviewer_desc' => '',
+'settings_global_approver_is_admin' => '',
+'settings_global_reviewer_is_admin' => '',
'settings_guestID' => '',
'settings_guestID_desc' => '',
'settings_guestid_is_admin' => '',
@@ -1579,6 +1609,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Path to LetoDMS_Lucene (optional)',
'settings_luceneDir' => '',
'settings_luceneDir_desc' => 'Path to LetoDMS_Lucene (optional)',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => '',
@@ -1767,6 +1799,7 @@ URL: [url]',
'splash_add_group' => '',
'splash_add_group_member' => '',
'splash_add_keyword' => '',
+'splash_add_keyword_category' => '',
'splash_add_notify' => '',
'splash_add_role' => '',
'splash_add_task' => '',
@@ -1774,6 +1807,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1785,17 +1819,20 @@ URL: [url]',
'splash_document_locked' => 'Document blocat',
'splash_document_name_changed' => '',
'splash_document_unlocked' => 'Document desblocat',
+'splash_document_updated' => '',
'splash_edit_access' => '',
'splash_edit_attribute' => '',
'splash_edit_category' => '',
'splash_edit_event' => '',
'splash_edit_group' => '',
'splash_edit_keyword' => '',
+'splash_edit_keyword_category' => '',
'splash_edit_role' => '',
'splash_edit_task' => '',
'splash_edit_transmittal' => '',
'splash_edit_user' => '',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
@@ -1829,6 +1866,7 @@ URL: [url]',
'splash_rm_group' => '',
'splash_rm_group_member' => '',
'splash_rm_keyword' => '',
+'splash_rm_keyword_category' => '',
'splash_rm_notify' => '',
'splash_rm_role' => '',
'splash_rm_transmittal' => '',
@@ -1912,6 +1950,7 @@ URL: [url]',
'target_equals_source_folder' => '',
'tasks' => '',
'task_core_expireddocs_days' => '',
+'task_core_expireddocs_dryrun' => '',
'task_core_expireddocs_email' => '',
'task_core_expireddocs_peruser' => '',
'task_core_importdropfolder_dryrun' => '',
@@ -1998,6 +2037,7 @@ URL: [url]',
'type_to_filter' => '',
'type_to_search' => 'Cerca',
'uk_UA' => 'Ucraïnès',
+'undefined' => '',
'under_folder' => 'A carpeta',
'unknown_attrdef' => '',
'unknown_command' => 'Ordre no reconeguda.',
@@ -2016,6 +2056,7 @@ URL: [url]',
'unlock_cause_locking_user' => 'Pot actualitzar-lo perquè és qui el va bloquejar. El bloqueig s\'eliminarà automàticament.',
'unlock_document' => 'Desbloquejar',
'update' => 'Actualitzar',
+'updated' => '',
'updated_documents' => '',
'update_approvers' => 'Actualitzar llista d\'aprovadors',
'update_document' => 'Actualitzar',
diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc
index 64a74aba6..3939231a3 100644
--- a/languages/cs_CZ/lang.inc
+++ b/languages/cs_CZ/lang.inc
@@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
-// Translators: Admin (1557), kreml (579)
+// Translators: Admin (1562), kreml (579)
$text = array(
'2_factor_auth' => 'dvoufaktorové ověření',
@@ -167,6 +167,7 @@ URL: [url]',
'attrdef_minvalues_help' => '',
'attrdef_min_greater_max' => 'Minimální počet hodnot je větší, než maximální počet hodnot',
'attrdef_multiple' => 'Povolit více hodnot',
+'attrdef_multiple_but_doc_or_folder' => '',
'attrdef_multiple_needs_valueset' => 'Definice atributu s více hodnotami potřebuje nastavit hodnoty.',
'attrdef_must_be_multiple' => 'Atribut musí mít více než jednu hodnotu, přesto není zadáno více hodnot',
'attrdef_name' => 'Název',
@@ -295,6 +296,7 @@ URL: [url]',
'choose_attrdefgroup' => 'Vybrat skupinu atributů',
'choose_category' => 'Vyberte prosím',
'choose_group' => 'Vyberte skupinu',
+'choose_link_type' => '',
'choose_role' => 'Vyberte roli',
'choose_target_category' => 'Vyberte kategorii',
'choose_target_document' => 'Vyberte dokument',
@@ -360,7 +362,7 @@ URL: [url]',
'current_state' => 'Současný stav',
'current_version' => 'Aktuální verze',
'daily' => 'Denně',
-'dashboard' => '',
+'dashboard' => 'Nástěnka',
'databasesearch' => 'Vyhledání v databázi',
'database_schema_version' => '',
'data_loading' => 'Prosím vyčkejte dokud se data nenahrají...',
@@ -391,7 +393,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Toto je neveřejná oblast. Přístup povolen pouze oprávněným uživatelům. Jakékoliv narušení bude stíháno podle platných právních norem.',
'discspace' => 'Místo na disku',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Dokumenty s přijetím, ale bez přístupu příjemce',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokumenty v revizi bez přístupu kontrolora',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -585,7 +589,7 @@ URL: [url]',
'dropfolder_metadata' => '',
'dropupload' => 'Rychlý upload',
'drop_files_here' => 'Soubory dát sem!',
-'drop_files_here_or_click' => '',
+'drop_files_here_or_click' => 'Přetáhněte sobory sem, nebo klikněte pro nahrání',
'dump_creation' => 'Vytvoření zálohy databáze',
'dump_creation_warning' => 'Pomocí této operace můžete vytvořit soubor se zálohou databáze. Po vytvoření bude soubor zálohy uložen ve složce data vašeho serveru.',
'dump_list' => 'Existující soubory záloh',
@@ -658,6 +662,7 @@ URL: [url]',
'error_update_document' => '',
'error_uploading_reviewer_only' => 'Chyba při vytváření dokumentu. Dokument má recenzenta, ale nemá schvalovatele.',
'es_ES' => 'Španělština',
+'event' => '',
'event_details' => 'Údaje akce',
'exclude_items' => 'Vyloučit položky',
'expired' => 'Platnost vypršela',
@@ -716,6 +721,7 @@ URL: [url]',
'filter_for_documents' => 'Další filtr pro dokumenty',
'filter_for_documents_and_folders' => '',
'filter_for_folders' => 'Další filtr pro složky',
+'finished_workflow_log' => '',
'folder' => 'Složka',
'folders' => 'Složky',
'folders_and_documents_statistic' => 'Přehled složek a dokumentů',
@@ -821,6 +827,7 @@ URL: [url]',
'global_attributedefinitions' => 'Atributy',
'global_default_keywords' => 'Globální klíčová slova',
'global_document_categories' => 'Globální kategorie',
+'global_link_types' => '',
'global_workflows' => 'Workflows',
'global_workflow_actions' => 'Akce workflow',
'global_workflow_states' => 'Stavy workflow',
@@ -854,7 +861,7 @@ URL: [url]',
'hu_HU' => 'Maďarština',
'id' => 'ID',
'identical_version' => 'Nová verze je identická se současnou verzí',
-'id_ID' => '',
+'id_ID' => 'Indonézsky',
'import' => 'Nahrát',
'importfs' => 'Import ze souborového systému',
'import_extension' => 'Importovat rozšíření',
@@ -886,6 +893,7 @@ URL: [url]',
'individuals_in_groups' => 'Členové skupiny',
'ind_review_removed' => '',
'info_recipients_tab_not_released' => 'Potvrzení o příjmu této verze dokumentu není možné, protože verze není uvolněna.',
+'info_rm_user_from_processes_none' => '',
'info_rm_user_from_processes_user' => '',
'inherited' => 'Zděděno',
'inherits_access_copy_msg' => 'Zkopírovat zděděný seznam řízení přístupu',
@@ -966,6 +974,7 @@ URL: [url]',
'latest_updateddocuments' => '',
'legend' => 'Popisek',
'librarydoc' => 'Dokument z knihovny',
+'linked_document' => '',
'linked_documents' => 'Související dokumenty',
'linked_files' => 'Přílohy',
'linked_to_current_version' => 'Provázáno odkazem s aktuální verzí',
@@ -976,9 +985,10 @@ URL: [url]',
'link_to_version' => 'Provázat k verzi',
'list_access_rights' => 'Seznam všech přístupových práv ...',
'list_contains_no_access_docs' => 'Seznam obsahuje více dokumentů, ke kterým nemáte přístup a které se nezobrazují.',
-'list_conversion_services' => '',
+'list_conversion_services' => 'Služba',
'list_hooks' => 'Seznam hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Seznam úkolů',
'local_file' => 'Lokální soubor',
'locked_by' => 'Zamčeno kým',
@@ -1044,6 +1054,7 @@ URL: [url]',
'move_document' => 'Přesunout dokument',
'move_folder' => 'Přesun složky',
'move_into_rootfolder' => '',
+'must_drop_one_file' => '',
'my_account' => 'Můj účet',
'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'Moje přenosy',
@@ -1087,6 +1098,7 @@ URL: [url]',
'new_file_email_body_html' => '',
'new_file_email_subject' => '[sitename]: [document] - Nová příloha',
'new_folder' => 'Nová složka',
+'new_link_type' => '',
'new_password' => 'Nové heslo',
'new_subfolder_email' => 'Nová složka',
'new_subfolder_email_body' => 'Nová složka
@@ -1385,6 +1397,8 @@ URL: [url]',
'revisions_without_group' => 'Revize bez skupiny',
'revisions_without_user' => 'Revize bez uživatele',
'revision_date' => 'Datum revize',
+'revision_deletion_email_body' => '',
+'revision_deletion_email_subject' => '',
'revision_log' => 'Log revize',
'revision_request_email_body' => 'Žádost o revizi
Dokument: [name]
@@ -1546,6 +1560,10 @@ Jméno: [username]
'settings' => 'Nastavení',
'settings_activate_module' => 'Aktivovat modul',
'settings_activate_php_extension' => 'Aktivovat PHP extension',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Pokud je nastaveno, admin se může přihlásit pouze z uvedené IP adresy. Ponechejte prázdné k udržení přístupu. Pozn: pracuje pouze s lokálním ověřováním (ne LDAP)',
'settings_Advanced' => 'Pokročilé',
@@ -1693,6 +1711,8 @@ Jméno: [username]
'settings_enableLanguageSelector_desc' => 'Zobrazit výběr jazyka uživatelského rozhraní po přihlášení.',
'settings_enableLargeFileUpload' => 'Povolit nahrávání velkých souborů',
'settings_enableLargeFileUpload_desc' => 'Je-li nastaveno, nahrávání souborů je také k dispozici prostřednictvím java appletu s názvem jumploader bez omezení velikosti souboru nastaveného prohlížečem. Umožňuje také nahrát několik souborů v jednom kroku.',
+'settings_enableLoginByEmail' => '',
+'settings_enableLoginByEmail_desc' => '',
'settings_enableMenuTasks' => 'Povolit seznam úkolů v nabídce',
'settings_enableMenuTasks_desc' => 'Aktivovat / Zakázat položku nabídky, která obsahuje všechny úkoly pro uživatele. Obsahuje dokumenty, které musí být přezkoumány, schváleny atd.',
'settings_enableMultiUpload' => 'Umožit nahrát více souborů',
@@ -1767,6 +1787,16 @@ Jméno: [username]
'settings_fullSearchEngine_desc' => 'Nastavte metodu použitou pro fulltextové vyhledávání.',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLiteFTS',
+'settings_globalApprover' => '',
+'settings_globalApprover_desc' => '',
+'settings_globalGroupApprover' => '',
+'settings_globalGroupApprover_desc' => '',
+'settings_globalGroupReviewer' => '',
+'settings_globalGroupReviewer_desc' => '',
+'settings_globalReviewer' => '',
+'settings_globalReviewer_desc' => '',
+'settings_global_approver_is_admin' => '',
+'settings_global_reviewer_is_admin' => '',
'settings_guestID' => 'ID hosta',
'settings_guestID_desc' => 'ID hostovaného uživatele při přihlášení jako host (většinou není třeba měnit)',
'settings_guestid_is_admin' => '',
@@ -1804,6 +1834,8 @@ Jméno: [username]
'settings_luceneClassDir_desc' => 'Cesta k SeedDMS_Lucene (volitelná)',
'settings_luceneDir' => 'Adresář pro fulltextový index',
'settings_luceneDir_desc' => 'Cesta k indexu Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max Directory ID',
@@ -1992,6 +2024,7 @@ Jméno: [username]
'splash_add_group' => 'Přidána nová skupina',
'splash_add_group_member' => 'Přidán nový člen skupiny',
'splash_add_keyword' => '',
+'splash_add_keyword_category' => '',
'splash_add_notify' => '',
'splash_add_role' => 'Přidána nová role',
'splash_add_task' => '',
@@ -1999,6 +2032,7 @@ Jméno: [username]
'splash_add_transmittal' => 'Přidán přenos',
'splash_add_user' => 'Přidán nový uživatel',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Mezipaměť vymazána',
'splash_cleared_clipboard' => 'Schránka vymazána',
'splash_delete_access' => 'Přístupová práva smazána',
@@ -2010,17 +2044,20 @@ Jméno: [username]
'splash_document_locked' => 'Dokument zamčen',
'splash_document_name_changed' => '',
'splash_document_unlocked' => 'Dokument odemčen',
+'splash_document_updated' => '',
'splash_edit_access' => 'Přístupová práva změněna',
'splash_edit_attribute' => 'Atribut uložen',
'splash_edit_category' => '',
'splash_edit_event' => 'Událost uložena',
'splash_edit_group' => 'Skupina uložena',
'splash_edit_keyword' => '',
+'splash_edit_keyword_category' => '',
'splash_edit_role' => 'Role uložena',
'splash_edit_task' => '',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Uživatel uložen',
'splash_error_add_to_transmittal' => 'Chyba při přidávání dokumentu k přenosu',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Chyba při odstranění odkazu ke stažení',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Chyba při odesílání odkazu ke stažení',
@@ -2054,6 +2091,7 @@ Jméno: [username]
'splash_rm_group' => 'Skupina odstraněna',
'splash_rm_group_member' => 'Člen skupiny odstraněn',
'splash_rm_keyword' => '',
+'splash_rm_keyword_category' => '',
'splash_rm_notify' => '',
'splash_rm_role' => 'Role odstraněna',
'splash_rm_transmittal' => 'Přenos odstraněn',
@@ -2137,6 +2175,7 @@ Jméno: [username]
'target_equals_source_folder' => '',
'tasks' => 'Úkoly',
'task_core_expireddocs_days' => '',
+'task_core_expireddocs_dryrun' => '',
'task_core_expireddocs_email' => '',
'task_core_expireddocs_peruser' => '',
'task_core_importdropfolder_dryrun' => '',
@@ -2232,6 +2271,7 @@ URL: [url]',
'type_to_filter' => '',
'type_to_search' => 'Zadejte hledaný výraz',
'uk_UA' => 'Ukrajinština',
+'undefined' => '',
'under_folder' => 'Ve složce',
'unknown_attrdef' => 'Neznámá definice atributu',
'unknown_command' => 'Příkaz nebyl rozpoznán.',
@@ -2250,6 +2290,7 @@ URL: [url]',
'unlock_cause_locking_user' => 'Můžete ho pořád aktualizovat, protože jste ten, kdo ho zamknul. Zámek bude automaticky odstraněn.',
'unlock_document' => 'Odemknout',
'update' => 'Aktualizovat',
+'updated' => '',
'updated_documents' => '',
'update_approvers' => 'Aktualizovat seznam schvalovatelů',
'update_document' => 'Aktualizovat',
diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc
index ab84d26ae..0fc4bd1ac 100644
--- a/languages/de_DE/lang.inc
+++ b/languages/de_DE/lang.inc
@@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
-// Translators: Admin (3297), dgrutsch (22)
+// Translators: Admin (3356), dgrutsch (22)
$text = array(
'2_factor_auth' => '2-Faktor Authentifizierung',
@@ -93,7 +93,7 @@ $text = array(
'any_value_set' => 'beliebiger Wert',
'apikey' => 'API-Schlüssel',
'apply' => 'Anwenden',
-'approvals_accepted' => '[no_approvals] Freigaben',
+'approvals_accepted' => '[no_approvals] erfolgte Freigaben',
'approvals_accepted_latest' => '(davon [no_approvals] in letzter Version)',
'approvals_and_reviews_accepted' => '[no_approvals] Freigaben und [no_reviews] Prüfungen',
'approvals_and_reviews_not_touched' => '[no_approvals] offene Freigaben und [no_reviews] offene Prüfungen',
@@ -190,6 +190,7 @@ URL: [url]
',
'attrdef_minvalues_help' => 'Minimale Anzahl der Werte. Setzen Sie diesen Wert auf 1, wenn ein Attribut gesetzt werden muss.',
'attrdef_min_greater_max' => 'Zahl der minimalen Werte ist größer als Zahl der maximalen Werte',
'attrdef_multiple' => 'Mehrfachwerte erlaubt',
+'attrdef_multiple_but_doc_or_folder' => 'Attribute des Typs Dokument oder Ordner können keine Mehrfachwerte haben.',
'attrdef_multiple_needs_valueset' => 'Attributdefinition mit Mehrfachwerten erfordert eine Werteliste.',
'attrdef_must_be_multiple' => 'Attribut muss mehr als einen Wert haben, erlaubt aber keine Mehrfachwerte',
'attrdef_name' => 'Name',
@@ -328,6 +329,7 @@ URL: [url]',
'choose_attrdefgroup' => 'Attributgruppe wählen',
'choose_category' => 'Kategorie wählen',
'choose_group' => 'Gruppe wählen',
+'choose_link_type' => 'Link-Typ auswählen',
'choose_role' => 'Rolle wählen',
'choose_target_category' => 'Kategorie wählen',
'choose_target_document' => 'Dokument wählen',
@@ -424,8 +426,10 @@ URL: [url]',
'disable_extension' => 'Erweiterung deaktivieren',
'disclaimer' => 'Dies ist ein geschützter Bereich. Nur authorisiertes Personal hat Zugriff. Jegliche Verstöße werden nach geltendem Recht (Englisch und International) verfolgt.',
'discspace' => 'Plattenplatz',
+'docs_in_reception_disabled' => 'Dokumente mit Empfangsbestätigung durch gesperrte Benutzer.',
'docs_in_reception_no_access' => 'Dokumente mit Empfangsbestätigung ohne Zugriff des Empfängers',
-'docs_in_revision_no_access' => 'Dokumente in Revision ohne Zugriff des Prüfers',
+'docs_in_revision_disabled' => 'Dokument mit Wiederholungsprüfung durch gesperrten Benutzer',
+'docs_in_revision_no_access' => 'Dokumente mit Wiederholungsprüfung ohne Zugriff des Prüfers',
'docs_with_missing_revision_date' => 'Dokumente ohne Datum der Wiederholungsprüfung',
'document' => 'Dokument',
'documentcontent' => 'Dokumentenversion',
@@ -630,14 +634,16 @@ URL: [url]',
'document_status_changed_email_body' => 'Dokumentenstatus geändert
Dokument: [name]
-Status: [status]
+Alter Status: [old_status]
+Neuer Status: [status]
Elternordner: [folder_path]
Benutzer: [username]
URL: [url]',
'document_status_changed_email_body_html' => '
',
+'revision_deletion_email_subject' => '[sitename]: [name] - Aufforderung zur Wiederholungsprüfung gelöscht',
'revision_log' => 'Protokoll der erneuten Prüfung',
'revision_request_email_body' => 'Aufforderung zur Wiederholungsprüfung
@@ -1929,6 +1951,10 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings' => 'Einstellungen',
'settings_activate_module' => 'Modul aktivieren',
'settings_activate_php_extension' => 'PHP-Erweiterung aktivieren',
+'settings_addManagerAsApprover' => 'Setze Gruppenmanager als Freigeber',
+'settings_addManagerAsApprover_desc' => 'Alle hochgeladenen Dokumente des Benutzers werden durch die Manager der Gruppe, in denen der Benutzer Mitglied ist, freigegeben.',
+'settings_addManagerAsReviewer' => 'Setze Gruppenmanager als Prüfer',
+'settings_addManagerAsReviewer_desc' => 'Alle hochgeladenen Dokumente des Benutzers werden durch die Manager der Gruppe, in denen der Benutzer Mitglied ist, geprüft.',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Wenn hier eine IP-Nummer eingetragen wird, kann eine Anmeldung als Administrator nur von dieser Adresse erfolgen. Funktioniert nur mit Anmeldung über die Datenbank (nicht LDAP)',
'settings_Advanced' => 'Erweitert',
@@ -1940,7 +1966,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings_allowReviewerOnly_desc' => 'Anwählen, um zu erlauben, dass nur ein Prüfer aber kein Freigeber beim traditionellen Workflow gesetzt werden darf.',
'settings_apache_mod_rewrite' => 'Apache - Module Rewrite',
'settings_apiKey' => 'Authentifizierungsschḻüssel für REST API',
-'settings_apiKey_desc' => 'Dieser Schlüssel wird zur alternative Authentifizierung in der REST API verwendet. Wählen Sie eine 32 Zeichen lange Zeichenkette.',
+'settings_apiKey_desc' => 'Dieser Schlüssel wird zur alternativen Authentifizierung in der REST API verwendet. Wählen Sie eine 32 Zeichen lange Zeichenkette.',
'settings_apiOrigin' => 'Erlaubte Herkunft der API Aufrufe',
'settings_apiOrigin_desc' => 'Eine semicolon-separierte Liste von Adressen, denen ein Zugriff auf die REST API erlaubt ist. Jede Adresse muss in der Form ://[:] angegeben werden. Der Port kann ausgelassen werden. Bleibt dieses Feld leer, dann ist der Zugriff uneingeschränkt.',
'settings_apiUserId' => 'Benutzer für die REST API',
@@ -2076,6 +2102,8 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings_enableLanguageSelector_desc' => 'Zeige Auswahl der verfügbaren Sprachen nachdem man sich angemeldet hat.',
'settings_enableLargeFileUpload' => 'Hochladen von sehr großen Dateien ermöglichen',
'settings_enableLargeFileUpload_desc' => 'Wenn dies gesetzt ist, dann ist ebenfalls der Upload von Dokumenten durch ein java applet mit Namen \'jumploader\' ohne Begrenzung der maximalen Dateigröße möglich. Auch das Hochladen mehrerer Dokumente in einem Schritt wird dadurch ermöglicht. Das Einschalten bewirkt, dass keine http only Cookies mehr gesetzt werden.',
+'settings_enableLoginByEmail' => 'Anmeldung mit E-Mail erlauben',
+'settings_enableLoginByEmail_desc' => 'Wenn eingeschaltet, dann ist auch die Anmeldung mit der E-Mail-Adresse möglich. Die Anmeldung mit dem Benutzername bleibt weiterhin möglich. Diese Einstellung wird möglicherweise nicht von allen Authentifizierungsmethoden berücksichtigt. Da die E-Mail nicht eindeutig ist, kann die Identifikation fehlschagen, auch wenn das Password aus Sicht des anmeldenen Benutzers korrekt ist.',
'settings_enableMenuTasks' => 'Aufgabenliste im Menü',
'settings_enableMenuTasks_desc' => 'Ein-/Ausschalten des Menüeintrags, der anstehenden Aufgaben des Benutzers enthält. Diese Liste beinhaltet Dokumente die geprüft, freigegeben, usw. werden müssen.',
'settings_enableMultiUpload' => 'Erlaube Hochladen mehrerer Dateien',
@@ -2150,6 +2178,16 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings_fullSearchEngine_desc' => 'Setzt das Verfahren, welches für die Volltextsuche verwendet wird.',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLiteFTS',
+'settings_globalApprover' => 'Setze Freigeber für alle Dokumente',
+'settings_globalApprover_desc' => 'Die hier eingetragenen Benutzer werden bei allen hochgeladenen Dokumenten als zwingende Freigeber gesetzt.',
+'settings_globalGroupApprover' => 'Setze Gruppenfreigeber für alle Dokumente',
+'settings_globalGroupApprover_desc' => 'Die hier eingetragenen Gruppen werden bei allen hochgeladenen Dokumenten als zwingende Freigeber gesetzt.',
+'settings_globalGroupReviewer' => 'Setze Gruppenprüfer für alle Dokumente',
+'settings_globalGroupReviewer_desc' => 'Die hier eingetragenen Gruppen werden bei allen hochgeladenen Dokumenten als zwingende Prüfer gesetzt.',
+'settings_globalReviewer' => 'Setze Prüfer für alle Dokumente',
+'settings_globalReviewer_desc' => 'Die hier eingetragenen Benutzer werden bei allen hochgeladenen Dokumenten als zwingende Prüfer gesetzt.',
+'settings_global_approver_is_admin' => 'Freigeber \'[login]\' für alle Dokumente ist Administrator, aber Administratoren dürfen nicht freigeben.',
+'settings_global_reviewer_is_admin' => 'Prüfer \'[login]\' für alle Dokumente ist Administrator, aber Administratoren dürfen nicht prüfen.',
'settings_guestID' => 'Gastbenutzer',
'settings_guestID_desc' => 'Id des Gast-Benutzers, wenn man sich als \'guest\' anmeldet.',
'settings_guestid_is_admin' => 'Gastuser ist ein Administrator',
@@ -2187,6 +2225,8 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings_luceneClassDir_desc' => 'Pfad zum PEAR-Paket SeedDMS_Lucene (optional). Lassen Sie diese Einstellung leer, wenn SeedDMS_Lucene ohnehin von PHP gefunden wird, weil es beispielweise im \'Extra PHP Include-Path\' installiert ist.',
'settings_luceneDir' => 'Verzeichnis für Volltext-Index',
'settings_luceneDir_desc' => 'Verzeichnis in dem der Lucene-Index abgelegt wird.',
+'settings_manager_approver_is_admin' => 'Manager ist Administrator und soll als zwingender Freigeber eingetragen, aber Administratoren dürfen nicht freigeben.',
+'settings_manager_reviewer_is_admin' => 'Manager ist Administrator und soll als zwingender Prüfer eingetragen, aber Administratoren dürfen nicht prüfen.',
'settings_markdownComments' => 'Kommentare als Markdown interpretieren',
'settings_markdownComments_desc' => 'Einschalten, um die Kommentare von Ordnern, Dokumenten und Versionen als Markdown zu interpretieren.',
'settings_maxDirID' => 'Max. Anzahl Unterverzeichnisse',
@@ -2375,6 +2415,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'splash_add_group' => 'Neue Gruppe hinzugefügt',
'splash_add_group_member' => 'Neues Gruppenmitglied hinzugefügt',
'splash_add_keyword' => 'Stichwort hinzugefügt',
+'splash_add_keyword_category' => 'Stichwortliste hinzugefügt',
'splash_add_notify' => 'Neue Benachrichtigung hinzugefügt',
'splash_add_role' => 'Neue Rolle hinzugefügt',
'splash_add_task' => 'Neuer Task hinzugefügt',
@@ -2382,6 +2423,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'splash_add_transmittal' => 'Neue Dokumentenliste angelegt',
'splash_add_user' => 'Neuen Benutzer hinzugefügt',
'splash_cancel_checkout' => 'Auschecken abgebrochen',
+'splash_checked_in' => 'Dokument eingecheckt',
'splash_cleared_cache' => 'Cache geleert',
'splash_cleared_clipboard' => 'Zwischenablage geleert',
'splash_delete_access' => 'Zugriffsrecht gelöscht',
@@ -2393,17 +2435,20 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'splash_document_locked' => 'Dokument gesperrt',
'splash_document_name_changed' => 'Dokumentenname geändert',
'splash_document_unlocked' => 'Dokumentensperre aufgehoben',
+'splash_document_updated' => 'Dokument aktualisiert',
'splash_edit_access' => 'Zugriffsrecht verändert',
'splash_edit_attribute' => 'Attribut gespeichert',
'splash_edit_category' => 'Kategorie gespeichert',
'splash_edit_event' => 'Ereignis gespeichert',
'splash_edit_group' => 'Gruppe gespeichert',
'splash_edit_keyword' => 'Stichwort gespeichert',
+'splash_edit_keyword_category' => 'Name der Stichwortliste geändert',
'splash_edit_role' => 'Rolle gespeichert',
'splash_edit_task' => 'Task gespeichert',
'splash_edit_transmittal' => 'Dokumentenliste gespeichert',
'splash_edit_user' => 'Benutzer gespeichert',
'splash_error_add_to_transmittal' => 'Fehler beim Hinzufügen zur Dokumentenliste',
+'splash_error_checkin_ended' => 'Einchecken beendet und Änderungen verworfen',
'splash_error_rm_download_link' => 'Fehler beim Löschen des Download-Links',
'splash_error_saving_file' => 'Fehler beim Speichern der Datei',
'splash_error_send_download_link' => 'Fehler beim Verschicken des Download-Links',
@@ -2437,6 +2482,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'splash_rm_group' => 'Gruppe gelöscht',
'splash_rm_group_member' => 'Mitglied der Gruppe gelöscht',
'splash_rm_keyword' => 'Stichwort gelöscht',
+'splash_rm_keyword_category' => 'Stichwortliste gelöscht',
'splash_rm_notify' => 'Benachrichtigung gelöscht',
'splash_rm_role' => 'Rolle gelöscht',
'splash_rm_transmittal' => 'Dokumentenliste gelöscht',
@@ -2520,6 +2566,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'target_equals_source_folder' => 'Zielordner ist identisch zu Quellordner',
'tasks' => 'Aufgaben',
'task_core_expireddocs_days' => 'Tage',
+'task_core_expireddocs_dryrun' => 'Testlauf',
'task_core_expireddocs_email' => 'E-Mail',
'task_core_expireddocs_peruser' => 'Pro Benutzer',
'task_core_importdropfolder_dryrun' => 'Testlauf',
@@ -2626,6 +2673,7 @@ URL: [url]',
'type_to_filter' => 'Hier tippen zum Filtern der Liste',
'type_to_search' => 'Hier tippen zum Suchen',
'uk_UA' => 'Ukrainisch',
+'undefined' => 'unbestimmt',
'under_folder' => 'In Ordner',
'unknown_attrdef' => 'unbekannte Attributdefinition',
'unknown_command' => 'unbekannter Befehl',
@@ -2644,6 +2692,7 @@ URL: [url]',
'unlock_cause_locking_user' => 'Sie sind im Moment mit demselben Benutzer angemeldet. Daher wird die Sperrung beim Update automatisch aufgehoben',
'unlock_document' => 'Sperrung aufheben',
'update' => 'Aktualisieren',
+'updated' => 'aktualisiert',
'updated_documents' => 'Aktualisierte Dokumente',
'update_approvers' => 'Liste der Freigebenden aktualisieren',
'update_document' => 'Aktualisieren',
diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc
index ada9176ee..0e643522b 100644
--- a/languages/el_GR/lang.inc
+++ b/languages/el_GR/lang.inc
@@ -150,6 +150,7 @@ $text = array(
'attrdef_minvalues_help' => '',
'attrdef_min_greater_max' => '',
'attrdef_multiple' => '',
+'attrdef_multiple_but_doc_or_folder' => '',
'attrdef_multiple_needs_valueset' => '',
'attrdef_must_be_multiple' => '',
'attrdef_name' => 'Όνομα',
@@ -270,6 +271,7 @@ $text = array(
'choose_attrdefgroup' => '',
'choose_category' => 'Επιλέξτε',
'choose_group' => 'Επιλέξτε Ομάδα',
+'choose_link_type' => '',
'choose_role' => 'Επιλογή Ρόλου',
'choose_target_category' => 'Επιλογή κατηγορίας',
'choose_target_document' => 'Επιλογή εγγράφου',
@@ -366,7 +368,9 @@ $text = array(
'disable_extension' => '',
'disclaimer' => 'Διαβαθμισμένη περιοχή. Η πρόσβαση επιτρέπεται μόνο σε εξουσιοδοτημένο προσωπικό. Κάθε παράβαση διώκεται σύμφωνα με τους εθνικούς και διεθνής νόμους.',
'discspace' => '',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Έγγραφο',
@@ -572,6 +576,7 @@ $text = array(
'error_update_document' => '',
'error_uploading_reviewer_only' => '',
'es_ES' => 'Spanish/Ισπανικά',
+'event' => '',
'event_details' => '',
'exclude_items' => '',
'expired' => 'Έχει λήξει',
@@ -626,6 +631,7 @@ $text = array(
'filter_for_documents' => '',
'filter_for_documents_and_folders' => '',
'filter_for_folders' => '',
+'finished_workflow_log' => '',
'folder' => 'Φάκελος',
'folders' => 'Φάκελοι',
'folders_and_documents_statistic' => 'στατιστικά Φακέλλων και Αρχείων',
@@ -684,6 +690,7 @@ $text = array(
'global_attributedefinitions' => 'Ιδιότητες',
'global_default_keywords' => 'Λέξεις Κλειδιά',
'global_document_categories' => 'Κατηγορίες',
+'global_link_types' => '',
'global_workflows' => 'Ροές Εργασίας',
'global_workflow_actions' => 'Ενέργειες Ροής Εργασίας',
'global_workflow_states' => 'Καταστάσεις Ροής Εργασίας',
@@ -749,6 +756,7 @@ $text = array(
'individuals_in_groups' => '',
'ind_review_removed' => '',
'info_recipients_tab_not_released' => '',
+'info_rm_user_from_processes_none' => '',
'info_rm_user_from_processes_user' => '',
'inherited' => 'Κληρονομημένο',
'inherits_access_copy_msg' => 'Αντιγραφή δικαιωμάτων πρόσβασης',
@@ -829,6 +837,7 @@ $text = array(
'latest_updateddocuments' => '',
'legend' => 'Ιστορικό',
'librarydoc' => '',
+'linked_document' => '',
'linked_documents' => 'Σχετικά Έγγραφα',
'linked_files' => 'Συνδεμένα αρχεία',
'linked_to_current_version' => '',
@@ -842,6 +851,7 @@ $text = array(
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Τοπικό αρχείο',
'locked_by' => '',
@@ -907,6 +917,7 @@ $text = array(
'move_document' => 'Μετακίνηση εγγράφου',
'move_folder' => 'Μετακίνηση φακέλου',
'move_into_rootfolder' => '',
+'must_drop_one_file' => '',
'my_account' => 'Ο Λογαριασμός μου',
'my_documents' => 'Τα έγγραφα μου',
'my_transmittals' => 'Οι Διαβιβάσεις μου',
@@ -945,6 +956,7 @@ URL: [url]',
'new_file_email_body_html' => '',
'new_file_email_subject' => '',
'new_folder' => 'Νέος φάκελλος',
+'new_link_type' => '',
'new_password' => 'Νέος κωδικός',
'new_subfolder_email' => 'Νέος φάκελλος',
'new_subfolder_email_body' => 'Νέος φάκελλος
@@ -1189,6 +1201,8 @@ URL: [url]',
'revisions_without_group' => '',
'revisions_without_user' => '',
'revision_date' => '',
+'revision_deletion_email_body' => '',
+'revision_deletion_email_subject' => '',
'revision_log' => '',
'revision_request_email_body' => '',
'revision_request_email_body_html' => '',
@@ -1327,6 +1341,10 @@ URL: [url]',
'settings' => 'Ρυθμίσεις',
'settings_activate_module' => '',
'settings_activate_php_extension' => '',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => '',
'settings_adminIP_desc' => '',
'settings_Advanced' => '',
@@ -1474,6 +1492,8 @@ URL: [url]',
'settings_enableLanguageSelector_desc' => '',
'settings_enableLargeFileUpload' => '',
'settings_enableLargeFileUpload_desc' => '',
+'settings_enableLoginByEmail' => '',
+'settings_enableLoginByEmail_desc' => '',
'settings_enableMenuTasks' => '',
'settings_enableMenuTasks_desc' => '',
'settings_enableMultiUpload' => '',
@@ -1548,6 +1568,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => '',
'settings_fullSearchEngine_vallucene' => '',
'settings_fullSearchEngine_valsqlitefts' => '',
+'settings_globalApprover' => '',
+'settings_globalApprover_desc' => '',
+'settings_globalGroupApprover' => '',
+'settings_globalGroupApprover_desc' => '',
+'settings_globalGroupReviewer' => '',
+'settings_globalGroupReviewer_desc' => '',
+'settings_globalReviewer' => '',
+'settings_globalReviewer_desc' => '',
+'settings_global_approver_is_admin' => '',
+'settings_global_reviewer_is_admin' => '',
'settings_guestID' => '',
'settings_guestID_desc' => '',
'settings_guestid_is_admin' => '',
@@ -1585,6 +1615,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => '',
'settings_luceneDir' => '',
'settings_luceneDir_desc' => '',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => '',
@@ -1773,6 +1805,7 @@ URL: [url]',
'splash_add_group' => '',
'splash_add_group_member' => '',
'splash_add_keyword' => '',
+'splash_add_keyword_category' => '',
'splash_add_notify' => '',
'splash_add_role' => '',
'splash_add_task' => '',
@@ -1780,6 +1813,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1791,17 +1825,20 @@ URL: [url]',
'splash_document_locked' => 'Κλειδωμένο έγγραφο',
'splash_document_name_changed' => '',
'splash_document_unlocked' => '',
+'splash_document_updated' => '',
'splash_edit_access' => '',
'splash_edit_attribute' => '',
'splash_edit_category' => '',
'splash_edit_event' => '',
'splash_edit_group' => '',
'splash_edit_keyword' => '',
+'splash_edit_keyword_category' => '',
'splash_edit_role' => '',
'splash_edit_task' => '',
'splash_edit_transmittal' => '',
'splash_edit_user' => '',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
@@ -1835,6 +1872,7 @@ URL: [url]',
'splash_rm_group' => '',
'splash_rm_group_member' => '',
'splash_rm_keyword' => '',
+'splash_rm_keyword_category' => '',
'splash_rm_notify' => '',
'splash_rm_role' => '',
'splash_rm_transmittal' => '',
@@ -1918,6 +1956,7 @@ URL: [url]',
'target_equals_source_folder' => '',
'tasks' => '',
'task_core_expireddocs_days' => '',
+'task_core_expireddocs_dryrun' => '',
'task_core_expireddocs_email' => '',
'task_core_expireddocs_peruser' => '',
'task_core_importdropfolder_dryrun' => '',
@@ -2004,6 +2043,7 @@ URL: [url]',
'type_to_filter' => '',
'type_to_search' => 'Πληκτρολόγησε για αναζήτηση',
'uk_UA' => 'Ουκρανικά',
+'undefined' => '',
'under_folder' => '',
'unknown_attrdef' => '',
'unknown_command' => '',
@@ -2022,6 +2062,7 @@ URL: [url]',
'unlock_cause_locking_user' => '',
'unlock_document' => 'Ξεκλείδωμα',
'update' => 'Ενημέρωση',
+'updated' => '',
'updated_documents' => '',
'update_approvers' => '',
'update_document' => 'Ενημέρωση εγγράφου',
diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc
index eecdf07bc..8fd4f8d56 100644
--- a/languages/en_GB/lang.inc
+++ b/languages/en_GB/lang.inc
@@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
-// Translators: Admin (2390), archonwang (3), dgrutsch (9), netixw (14)
+// Translators: Admin (2460), archonwang (3), dgrutsch (9), netixw (14)
$text = array(
'2_factor_auth' => '2-factor authentication',
@@ -190,6 +190,7 @@ URL: [url]',
'attrdef_minvalues_help' => 'Minimum number of values. Set to 1 if attribute must be set.',
'attrdef_min_greater_max' => 'Minimum number of values is larger than maximum number of values',
'attrdef_multiple' => 'Allow multiple values',
+'attrdef_multiple_but_doc_or_folder' => 'Attributes of type document or folder cannot have multiple values.',
'attrdef_multiple_needs_valueset' => 'Attribute definition with multiple values needs value set.',
'attrdef_must_be_multiple' => 'Attribute must have more than one value, but is not set multiple value',
'attrdef_name' => 'Name',
@@ -275,7 +276,7 @@ URL: [url]',
'cancel' => 'Cancel',
'cancel_checkout' => 'Cancel checkout',
'cancel_checkout_document' => 'Cancel checkout',
-'cancel_checkout_warning' => 'The check out can canceled thought the checked out file has been changed. In that case the file will be deleted from the check out space and your modification will be lost.',
+'cancel_checkout_warning' => 'The check out can be canceled thought the checked out file has been changed. In that case the file will be deleted from the check out space and your modification will be lost.',
'cannot_assign_invalid_state' => 'Cannot modify an obsolete or rejected document',
'cannot_change_final_states' => 'Warning: You cannot alter status for document rejected, expired or with pending review or approval',
'cannot_delete_user' => 'Cannot delete user',
@@ -311,10 +312,10 @@ URL: [url]',
'chart_docsperuser_title' => 'Documents per user',
'chart_foldersperuser_title' => 'Folders per user',
'chart_selection' => 'Select chart',
-'chart_sizeperuser_title' => 'Diskspace per user',
+'chart_sizeperuser_title' => 'Disk space per user',
'checkedout_file_has_different_version' => 'The checked out version is not identical to the current version. Check in will not update the document.',
'checkedout_file_has_disappeared' => 'The file of the checked out document has disappeared. Check in will not be possible.',
-'checkedout_file_is_unchanged' => 'The file of the checked out document is still unchanged. Check in will not be possible. If do not plan any modifications, you can reset the check out status.',
+'checkedout_file_is_unchanged' => 'The file of the checked out document is still unchanged. Check in will not be possible. If you do not plan any modifications, you can reset the check out status.',
'checkin_document' => 'Check In',
'checkoutpath_does_not_exist' => 'Checkout path does not exists',
'checkout_cancel_confirm' => 'Confirm to cancel checkout',
@@ -328,6 +329,7 @@ URL: [url]',
'choose_attrdefgroup' => 'Choose attribute group',
'choose_category' => 'Please choose',
'choose_group' => 'Choose group',
+'choose_link_type' => 'Choose link type',
'choose_role' => 'Choose role',
'choose_target_category' => 'Choose category',
'choose_target_document' => 'Choose document',
@@ -424,7 +426,9 @@ URL: [url]',
'disable_extension' => 'Disable extension',
'disclaimer' => 'This is a classified area. Access is permitted only to authorized personnel. Any violation will be prosecuted according to the national and international laws.',
'discspace' => 'Disc space',
+'docs_in_reception_disabled' => 'Documents with reception by diabled users',
'docs_in_reception_no_access' => 'Documents with reception without access by recipient',
+'docs_in_revision_disabled' => 'Documents with revision by disabled user',
'docs_in_revision_no_access' => 'Documents in revision without access by revisor',
'docs_with_missing_revision_date' => 'Documents withoug date of revision',
'document' => 'Document',
@@ -630,14 +634,16 @@ URL: [url]',
'document_status_changed_email_body' => 'Document status changed
Document: [name]
-Status: [status]
+Old status: [old_status]
+New status: [status]
Parent folder: [folder_path]
User: [username]
URL: [url]',
'document_status_changed_email_body_html' => '
',
@@ -790,6 +796,7 @@ URL: [url]',
'error_update_document' => 'Error while updating document',
'error_uploading_reviewer_only' => 'Error when creating the document. The document has a reviewer, but no approver.',
'es_ES' => 'Spanish',
+'event' => 'event',
'event_details' => 'Event details',
'exclude_items' => 'Exclude items',
'expired' => 'Expired',
@@ -850,10 +857,11 @@ URL: [url]',
'files_deletion_warning' => 'With this option you can delete all files of entire DMS folders. The versioning information will remain visible.',
'files_loading' => 'Please wait, until the list of files is loaded …',
'filetype' => 'File type',
-'file_size' => 'Filesize',
+'file_size' => 'File size',
'filter_for_documents' => 'Additional filter for documents',
'filter_for_documents_and_folders' => 'Additional filter for folder and documents',
'filter_for_folders' => 'Additional filter for folders',
+'finished_workflow_log' => 'Finished workflows',
'folder' => 'Folder',
'folders' => 'Folders',
'folders_and_documents_statistic' => 'Contents overview',
@@ -887,7 +895,7 @@ Value: [attribute_value]
Parent folder: [folder_path]
User: [username]
URL: [url]',
-'folder_attribute_added_email_subject' => '[sitename]: [name] - Attribute changed',
+'folder_attribute_added_email_subject' => '[sitename]: [name] - Attribute added',
'folder_attribute_changed_email_body' => 'Attribute changed
Folder: [name]
@@ -1032,6 +1040,7 @@ URL: [url]',
'global_attributedefinitions' => 'Attributes',
'global_default_keywords' => 'Global keywords',
'global_document_categories' => 'Categories',
+'global_link_types' => 'Link Types',
'global_workflows' => 'Workflows',
'global_workflow_actions' => 'Workflow Actions',
'global_workflow_states' => 'Workflow States',
@@ -1096,8 +1105,9 @@ URL: [url]',
'individuals' => 'Individuals',
'individuals_in_groups' => 'Members of a group',
'ind_review_removed' => 'Change of status, because review of user [name] was removed.',
-'info_recipients_tab_not_released' => 'Acknowledgement of reception for this document version is not possible, because the version is not released.',
-'info_rm_user_from_processes_user' => 'Only tasks not being touched can be transfered to another user. Task which has been taken care of, will just add an item in the history, as if the user was deleted.',
+'info_recipients_tab_not_released' => 'Acknowledgment of reception for this document version is not possible, because the version is not released.',
+'info_rm_user_from_processes_none' => 'The user has currently no tasks.',
+'info_rm_user_from_processes_user' => 'Only tasks not being touched can be transferred to another user. Task which has been taken care of, will just add an item in the history, as if the user was deleted.',
'inherited' => 'inherited',
'inherits_access_copy_msg' => 'Copy inherited access list',
'inherits_access_empty_msg' => 'Start with empty access list',
@@ -1177,6 +1187,7 @@ URL: [url]',
'latest_updateddocuments' => 'Latest updated documents',
'legend' => 'Legend',
'librarydoc' => 'Document from library',
+'linked_document' => 'Linked document',
'linked_documents' => 'Related Documents',
'linked_files' => 'Attachments',
'linked_to_current_version' => 'Linked to current version',
@@ -1190,6 +1201,7 @@ URL: [url]',
'list_conversion_services' => 'List of conversion services',
'list_hooks' => 'List of hooks',
'list_notification_services' => 'List of notification services',
+'list_of_recipients_has_disabled_users' => 'List of recipients contains disabled users.',
'list_tasks' => 'List tasks',
'local_file' => 'Local file',
'locked_by' => 'Locked by',
@@ -1215,11 +1227,11 @@ URL: [url]',
'mandatory_approvergroups' => 'Mandatory Groups of approvers',
'mandatory_approvergroup_no_access' => 'Mandatory group of approvers \'[group]\' has insufficient access rights.',
'mandatory_approvers' => 'Mandatory approvers',
-'mandatory_approver_no_access' => 'Mandatory approver \'[user]\' has insufficient access rights.',
+'mandatory_approver_no_access' => 'Mandatory approver \'[user]\' has insufficient access rights or is not allowed as an approver.',
'mandatory_reviewergroups' => 'Mandatory group of reviewers',
'mandatory_reviewergroup_no_access' => 'Mandatory group of reviewers \'[group]\' has insufficient access rights.',
'mandatory_reviewers' => 'Mandatory reviewers',
-'mandatory_reviewer_no_access' => 'Mandatory reviewer \'[user]\' has insufficient access rights.',
+'mandatory_reviewer_no_access' => 'Mandatory reviewer \'[user]\' has insufficient access rights or is not allowed as a reviewer.',
'march' => 'March',
'mark_document' => 'Mark document for batch operation',
'mark_folder' => 'Mark folder for batch operation',
@@ -1233,7 +1245,7 @@ URL: [url]',
'misc' => 'Misc',
'missing_checksum' => 'Missing checksum',
'missing_file' => 'Missing file',
-'missing_filesize' => 'Missing filesize',
+'missing_filesize' => 'Missing file size',
'missing_func_class_note' => 'Note',
'missing_php_class' => 'PHP class [classname] missing',
'missing_php_extension' => 'PHP extension [extname] missing',
@@ -1255,6 +1267,7 @@ URL: [url]',
'move_document' => 'Move document',
'move_folder' => 'Move Folder',
'move_into_rootfolder' => 'Move into root folder',
+'must_drop_one_file' => 'You may not drop more than one file',
'my_account' => 'My Account',
'my_documents' => 'My Documents',
'my_transmittals' => 'My Transmittals',
@@ -1272,7 +1285,7 @@ URL: [url]',
'never' => 'never',
'new' => 'New',
'new_attrdef' => 'Add attribute definition',
-'new_default_keywords' => 'Add keywords',
+'new_default_keywords' => 'Add keyword',
'new_default_keyword_category' => 'Add category',
'new_documents' => 'New documents',
'new_documents_today' => 'New documents today',
@@ -1313,6 +1326,7 @@ User: [username]
URL: [url]',
'new_file_email_subject' => '[sitename]: [document] - New attachment',
'new_folder' => 'New folder',
+'new_link_type' => 'Add link type',
'new_password' => 'New password',
'new_subfolder_email' => 'New folder',
'new_subfolder_email_body' => 'New folder
@@ -1728,6 +1742,14 @@ URL: [url]',
'revisions_without_group' => 'Revisions without group',
'revisions_without_user' => 'Revisions without user',
'revision_date' => 'Date of revision',
+'revision_deletion_email_body' => '