isDisabled() ? " class=\"table-danger error\"" : ( $currUser->isHidden() ? " class=\"table-warning warning\"" : "")).">";
echo "";
if ($currUser->hasImage())
print " getId()."\">";
From fb37e526cc491eed9c9e26a24561490b87ea59c8 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Tue, 6 Feb 2024 10:29:23 +0100
Subject: [PATCH 012/100] separated revisions without access from disabled
users
---
CHANGELOG | 3 ++-
out/out.ObjectCheck.php | 22 ++++++++++++------
views/bootstrap/class.ObjectCheck.php | 32 ++++++++++++++++++++++++---
3 files changed, 46 insertions(+), 11 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 796e989ca..99c278ec5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,7 +2,8 @@
Changes in version 6.0.27
--------------------------------------------------------------------------------
- Document/folder check distinguishes between documents which cannot be
- receiped because of access rights or the recipient being disabled.
+ receiped/revised because of access rights or the recipient/revisor being
+ disabled.
--------------------------------------------------------------------------------
Changes in version 6.0.26
diff --git a/out/out.ObjectCheck.php b/out/out.ObjectCheck.php
index 0df6e70a3..6011492a5 100644
--- a/out/out.ObjectCheck.php
+++ b/out/out.ObjectCheck.php
@@ -112,9 +112,10 @@ foreach(array('review', 'approval', 'receipt', 'revision') as $process) {
}
}
}
-$docsinrevision = array();
+$docsinrevisionnoaccess = array();
+$docsinrevisiondisabled = array();
$docsmissingrevsiondate = array();
-if(!isset($_GET['action']) || $_GET['action'] == 'listDocsWithMissingRevisionDate') {
+if(!isset($_GET['action']) || $_GET['action'] == 'listDocsWithMissingRevisionDate' || $_GET['action'] == 'listDocsInRevisionNoAccess' || $_GET['action'] == 'listDocsInRevisionDisabled') {
$tmprevs = $dms->getDocumentsInRevision();
foreach($tmprevs as $rev) {
if($doc = $dms->getDocument($rev['documentID'])) {
@@ -133,8 +134,10 @@ foreach($tmprevs as $rev) {
/* Caution: $content->getAccessMode($ruser) doesn't work as it uses the role
* restrictions of the currently logged in user
*/
- if($mode < M_READ || $cmode < M_READ || $isdisabled)
- $docsinrevision[] = $doc;
+ if($mode < M_READ || $cmode < M_READ)
+ $docsinrevisionnoaccess[$doc->getId()] = $doc;
+ if($isdisabled)
+ $docsinrevisiondisabled[$doc->getId()] = $doc;
/* If a document has a sleeping revisor then it must have a
* revision date, otherwise the revision will never be started.
@@ -168,10 +171,14 @@ foreach($tmprevs as $rev) {
/* Caution: $content->getAccessMode($ruser) doesn't work as it uses the role
* restrictions of the currently logged in user
*/
+ /* A document can appear several times in the list if there are more than
+ * 1 user without access. Using the document id as an index will create a
+ * unique list of documents.
+ */
if($mode < M_READ || $cmode < M_READ)
- $docsinreceptionnoaccess[] = $doc;
+ $docsinreceptionnoaccess[$doc->getId()] = $doc;
if($isdisabled)
- $docsinreceptiondisabled[] = $doc;
+ $docsinreceptiondisabled[$doc->getId()] = $doc;
}
}
}
@@ -249,7 +256,8 @@ if($view) {
$view->setParam('wrongfiletypeversions', $wrongfiletypeversions);
$view->setParam('duplicateversions', $duplicateversions);
$view->setParam('duplicatesequences', $duplicatesequences);
- $view->setParam('docsinrevision', $docsinrevision);
+ $view->setParam('docsinrevisionnoaccess', $docsinrevisionnoaccess);
+ $view->setParam('docsinrevisiondisabled', $docsinrevisiondisabled);
$view->setParam('docsmissingrevsiondate', $docsmissingrevsiondate);
$view->setParam('docsinreceptionnoaccess', $docsinreceptionnoaccess);
$view->setParam('docsinreceptiondisabled', $docsinreceptiondisabled);
diff --git a/views/bootstrap/class.ObjectCheck.php b/views/bootstrap/class.ObjectCheck.php
index 2f075e32e..d43496816 100644
--- a/views/bootstrap/class.ObjectCheck.php
+++ b/views/bootstrap/class.ObjectCheck.php
@@ -474,7 +474,7 @@ class SeedDMS_View_ObjectCheck extends SeedDMS_Theme_Style {
$dms = $this->params['dms'];
$user = $this->params['user'];
$folder = $this->params['folder'];
- $docsinrevision = $this->params['docsinrevision'];
+ $docsinrevision = $this->params['docsinrevisionnoaccess'];
$conversionmgr = $this->params['conversionmgr'];
$cachedir = $this->params['cachedir'];
$previewwidth = $this->params['previewWidthList'];
@@ -494,6 +494,30 @@ class SeedDMS_View_ObjectCheck extends SeedDMS_Theme_Style {
}
} /* }}} */
+ function listDocsInRevisionDisabled() { /* {{{ */
+ $dms = $this->params['dms'];
+ $user = $this->params['user'];
+ $folder = $this->params['folder'];
+ $docsinrevision = $this->params['docsinrevisiondisabled'];
+ $conversionmgr = $this->params['conversionmgr'];
+ $cachedir = $this->params['cachedir'];
+ $previewwidth = $this->params['previewWidthList'];
+ $previewconverters = $this->params['previewConverters'];
+ $timeout = $this->params['timeout'];
+
+ $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout);
+ if($conversionmgr)
+ $previewer->setConversionMgr($conversionmgr);
+ else
+ $previewer->setConverters($previewconverters);
+
+ $this->contentHeading(getMLText("docs_in_revision_disabled"));
+
+ if($docsinrevision) {
+ $this->printList($docsinrevision, $previewer);
+ }
+ } /* }}} */
+
function listDocsWithMissingRevisionDate() { /* {{{ */
$dms = $this->params['dms'];
$user = $this->params['user'];
@@ -698,7 +722,8 @@ $(document).ready( function() {
$nochecksumversions = $this->params['nochecksumversions'];
$duplicateversions = $this->params['duplicateversions'];
$duplicatesequences = $this->params['duplicatesequences'];
- $docsinrevision = $this->params['docsinrevision'];
+ $docsinrevisionnoaccess = $this->params['docsinrevisionnoaccess'];
+ $docsinrevisiondisabled = $this->params['docsinrevisiondisabled'];
$docsinreceptionnoaccess = $this->params['docsinreceptionnoaccess'];
$docsinreceptiondisabled = $this->params['docsinreceptiondisabled'];
$processwithoutusergroup = $this->params['processwithoutusergroup'];
@@ -734,7 +759,8 @@ $(document).ready( function() {
$menuitems = [];
$menuitems[] = array('label'=>getMLText('duplicate_content'), 'badge'=>count($duplicateversions), 'attributes'=>array(array('data-href', "#duplicate_content"), array('data-action', "listDuplicateContent")));
$menuitems[] = array('label'=>getMLText('duplicate_sequences'), 'badge'=>count($duplicatesequences), 'attributes'=>array(array('data-href', "#duplicate_sequences"), array('data-action', "listDuplicateSequence")));
- $menuitems[] = array('label'=>getMLText('docs_in_revision_no_access'), 'badge'=>count($docsinrevision), 'attributes'=>array(array('data-href', "#inrevision_no_access"), array('data-action', "listDocsInRevisionNoAccess")));
+ $menuitems[] = array('label'=>getMLText('docs_in_revision_no_access'), 'badge'=>count($docsinrevisionnoaccess), 'attributes'=>array(array('data-href', "#inrevision_no_access"), array('data-action', "listDocsInRevisionNoAccess")));
+ $menuitems[] = array('label'=>getMLText('docs_in_revision_disabled'), 'badge'=>count($docsinrevisiondisabled), 'attributes'=>array(array('data-href', "#inrevision_disabled"), array('data-action', "listDocsInRevisionDisabled")));
$menuitems[] = array('label'=>getMLText('docs_in_reception_no_access'), 'badge'=>count($docsinreceptionnoaccess), 'attributes'=>array(array('data-href', "#inreception_no_access"), array('data-action', "listDocsInReceptionNoAccess")));
$menuitems[] = array('label'=>getMLText('docs_in_reception_disabled'), 'badge'=>count($docsinreceptiondisabled), 'attributes'=>array(array('data-href', "#inreception_disabled"), array('data-action', "listDocsInReceptionDisabled")));
$menuitems[] = array('label'=>getMLText('docs_with_missing_revision_date'), 'badge'=>count($docsmissingrevsiondate), 'attributes'=>array(array('data-href', "#missing_revision_date"), array('data-action', "listDocsWithMissingRevisionDate")));
From 192e750f0073bb325500ab29fdd589ac30876057 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Wed, 7 Feb 2024 09:41:40 +0100
Subject: [PATCH 013/100] output warning if list of recipients contains
disabled users
---
views/bootstrap/class.ViewDocument.php | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php
index c032469d6..816103d72 100644
--- a/views/bootstrap/class.ViewDocument.php
+++ b/views/bootstrap/class.ViewDocument.php
@@ -1233,7 +1233,7 @@ $(document).ready( function() {
print getReviewStatusText($r["status"])." \n";
print "";
if($accesserr)
- echo "".$accesserr." ";
+ echo "".$accesserr." ";
if($accessobject->mayReview($latestContent->getDocument())) {
if ($is_reviewer) {
@@ -1339,7 +1339,7 @@ $(document).ready( function() {
print getApprovalStatusText($a["status"])." \n";
print "";
if($accesserr)
- echo "".$accesserr." ";
+ echo "".$accesserr." ";
if($accessobject->mayApprove($latestContent->getDocument())) {
if ($is_approver) {
@@ -1627,7 +1627,7 @@ $(document).ready( function() {
print "\n";
print "\n";
- print "".((count($receiptStatus) > 10) ? ' ' : getMLText('name'))." \n";
+ print "".((count($receiptStatus) > 10) ? ' ' : getMLText('name'))." \n";
print "".getMLText("last_update")." \n";
print "".getMLText("comment")." ";
print "".getMLText("status")." \n";
@@ -1637,6 +1637,8 @@ $(document).ready( function() {
print " \n";
$stat = array('-1'=>0, '0'=>0, '1'=>0, '-2'=>0);
+ $disabledcount = 0;
+ $removedusers = '';
foreach ($receiptStatus as $r) {
$required = null;
$is_recipient = false;
@@ -1652,8 +1654,10 @@ $(document).ready( function() {
if($user->isAdmin()) {
if($document->getAccessMode($required) < M_READ || $latestContent->getAccessMode($required) < M_READ)
$accesserr = getMLText("access_denied");
- elseif(is_object($required) && $required->isDisabled())
+ elseif(is_object($required) && $required->isDisabled()) {
+ $disabledcount++;
$accesserr = getMLText("login_disabled_title");
+ }
}
}
if($r["required"] == $user->getId()/* && ($user->getId() != $owner->getId() || $enableownerreceipt == 1)*/)
@@ -1676,7 +1680,7 @@ $(document).ready( function() {
}
break;
}
- /* Do not list users that has been removed from the list of recipients
+ /* Do not list users that have been removed from the list of recipients
* unless admin is logged in.
*/
if($user->isAdmin() || $r["status"] > -2) {
@@ -1703,7 +1707,7 @@ $(document).ready( function() {
print getReceiptStatusText($r["status"])."\n";
print "";
if($accesserr)
- echo "".$accesserr." ";
+ echo "".$accesserr." ";
if($accessobject->mayReceipt($document)) {
if ($is_recipient) {
if($r["status"]==0) {
@@ -1722,6 +1726,9 @@ $(document).ready( function() {
warningMsg(getMLText('list_of_recipients_has_disabled_users'));
+ }
// $this->contentContainerEnd();
if($accessobject->check_view_access('ViewDocument', array('action'=>'receptionBar'))/* $user->isAdmin() || $user->getId() == $document->getOwner()->getId()*/) {
/* Do not count entries '-2' as they are removed userѕ */
@@ -1834,7 +1841,7 @@ $(document).ready( function() {
print getRevisionStatusText($r["status"])."\n";
print "";
if($accesserr)
- echo "".$accesserr." ";
+ echo "".$accesserr." ";
if($accessobject->mayRevise($document)) {
if ($is_recipient && $r["status"]==0) {
print $this->html_link('ReviseDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'revisionid'=>$r['revisionID']), array('class'=>'btn btn-mini btn-primary'), getMLText("add_revision"), false, true, array('', ' '));
From 7c538ad5d1b8f7d91464620f7c60154ecd31ccda Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 8 Feb 2024 20:56:49 +0100
Subject: [PATCH 014/100] some more information when using php-fpm
---
doc/README.Swagger | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
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/"
From 663ce7f675eaf4ee55ff8d6ce3e5cb6bcb04ef92 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 8 Feb 2024 21:02:12 +0100
Subject: [PATCH 015/100] add global and group manager reviewers/approvers
---
inc/inc.ClassSettings.php | 21 +-
inc/inc.Utils.php | 174 +++++++++----
op/op.AddDocument.php | 4 +-
op/op.Ajax.php | 4 +-
op/op.Settings.php | 4 +
op/op.UpdateDocument.php | 4 +-
views/bootstrap/class.AddDocument.php | 161 +++++-------
.../bootstrap/class.SetReviewersApprovers.php | 151 +++++-------
views/bootstrap/class.Settings.php | 4 +
views/bootstrap/class.UpdateDocument.php | 233 ++++++++----------
10 files changed, 392 insertions(+), 368 deletions(-)
diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php
index c1fe6f3b4..5d35b016f 100644
--- a/inc/inc.ClassSettings.php
+++ b/inc/inc.ClassSettings.php
@@ -180,8 +180,16 @@ 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;
+ // group manager is mandatory reviewer
+ var $_addManagerAsReviewer = false;
+ // group manager is mandatory approver
+ var $_addManagerAsApprover = false;
+ // global reviewer
+ var $_globalReviewer = array();
+ // global approver
+ var $_globalApprover = array();
// enable/disable default notification for owner
var $_enableOwnerNotification = false;
// enable/disable deleting of versions for regular users
@@ -747,6 +755,12 @@ class Settings { /* {{{ */
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
+ $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"]));
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
$this->_versioningFileName = strval($tab["versioningFileName"]);
$this->_workflowMode = strval($tab["workflowMode"]);
@@ -1097,7 +1111,12 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
+ $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, "presetExpirationDate", $this->_presetExpirationDate);
+ $this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php
index f71e032dd..b205857b1 100644
--- a/inc/inc.Utils.php
+++ b/inc/inc.Utils.php
@@ -947,7 +947,7 @@ function isAjax() { /* {{{ */
} /* }}} */
/**
- * Hash a password
+ * Hash a password
*
* @param string $password
* @return string hashed password
@@ -957,7 +957,7 @@ function seed_pass_hash($password) { /* {{{ */
} /* }}} */
/**
- * Verify a password
+ * Verify a password
*
* @param string $password
* @return string hashed password
@@ -1019,7 +1019,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()
*
@@ -1041,36 +1041,80 @@ 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.
*
* @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);
+ }
+
+ /* 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($folder->getAccessMode($u) < 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($folder->getGroupAccessMode($g) < M_READ)
+ $reviewers["ng"][] = $g->getId();
+ else
+ $reviewers["g"][] = $g->getId();
+ }
+ }
+
return $reviewers;
} /* }}} */
@@ -1078,38 +1122,80 @@ 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.
*
* @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);
+ }
+
+ /* 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($folder->getAccessMode($u) < 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($folder->getGroupAccessMode($g) < M_READ)
+ $approvers["ng"][] = $g->getId();
+ else
+ $approvers["g"][] = $g->getId();
+ }
+ }
+
return $approvers;
} /* }}} */
diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php
index 54ecd9d72..03fb8c18e 100644
--- a/op/op.AddDocument.php
+++ b/op/op.AddDocument.php
@@ -209,13 +209,13 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
}
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
- $mreviewers = getMandatoryReviewers($folder, $user);
+ $mreviewers = getMandatoryReviewers($folder, null, $user);
if($mreviewers['i'])
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
if($mreviewers['g'])
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
}
- $mapprovers = getMandatoryApprovers($folder, $user);
+ $mapprovers = getMandatoryApprovers($folder, null, $user);
if($mapprovers['i'])
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
if($mapprovers['g'])
diff --git a/op/op.Ajax.php b/op/op.Ajax.php
index bd834407a..f2300781d 100644
--- a/op/op.Ajax.php
+++ b/op/op.Ajax.php
@@ -784,13 +784,13 @@ switch($command) {
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
- $mreviewers = getMandatoryReviewers($folder, $user);
+ $mreviewers = getMandatoryReviewers($folder, null, $user);
if($mreviewers['i'])
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
if($mreviewers['g'])
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
}
- $mapprovers = getMandatoryApprovers($folder, $user);
+ $mapprovers = getMandatoryApprovers($folder, null, $user);
if($mapprovers['i'])
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
if($mapprovers['g'])
diff --git a/op/op.Settings.php b/op/op.Settings.php
index 9cbab86e0..c36df1032 100644
--- a/op/op.Settings.php
+++ b/op/op.Settings.php
@@ -247,6 +247,10 @@ if ($action == "saveSettings")
setBoolValue("enableAdminRevApp");
setBoolValue("enableOwnerRevApp");
setBoolValue("enableSelfRevApp");
+ setBoolValue("addManagerAsReviewer");
+ setBoolValue("addManagerAsApprover");
+ setArrayValue("globalReviewer");
+ setArrayValue("globalApprover");
setBoolValue("enableUpdateRevApp");
setBoolValue("enableRemoveRevApp");
setBoolValue("enableVersionDeletion");
diff --git a/op/op.UpdateDocument.php b/op/op.UpdateDocument.php
index 5fafaaae5..dd4e05cd2 100644
--- a/op/op.UpdateDocument.php
+++ b/op/op.UpdateDocument.php
@@ -251,13 +251,13 @@ default:
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
- $mreviewers = getMandatoryReviewers($folder, $user);
+ $mreviewers = getMandatoryReviewers($folder, $document, $user);
if($mreviewers['i'])
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
if($mreviewers['g'])
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
}
- $mapprovers = getMandatoryApprovers($folder, $user);
+ $mapprovers = getMandatoryApprovers($folder, $document, $user);
if($mapprovers['i'])
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
if($mapprovers['g'])
diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php
index 6787700bf..924ba0ee7 100644
--- a/views/bootstrap/class.AddDocument.php
+++ b/views/bootstrap/class.AddDocument.php
@@ -492,33 +492,30 @@ console.log(params);
);
}
$this->warningMsg(getMLText("add_doc_workflow_warning"));
+ $this->contentContainerEnd();
} elseif($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') {
$this->contentContainerEnd();
if($workflowmode == 'traditional') {
$this->contentSubHeading(getMLText("assign_reviewers"));
$this->contentContainerStart();
+ $mreviewers = getMandatoryReviewers($folder, null, $user);
+
/* List all mandatory reviewers */
- $res=$user->getMandatoryReviewers();
$tmp = array();
- if($res) {
- foreach ($res as $r) {
- if($r['reviewerUserID'] > 0) {
- $u = $dms->getUser($r['reviewerUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
+ foreach ($mreviewers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
}
$options = array();
foreach ($docAccess["users"] as $usr) {
if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerUserID']==$usr->getID()) $mandatory=true;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mreviewers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_reviewer')));
$options[] = $option;
}
$this->formField(
@@ -535,38 +532,29 @@ console.log(params);
);
/* Check for mandatory reviewer without access */
- foreach($res as $r) {
- if($r['reviewerUserID']) {
- $hasAccess = false;
- foreach ($docAccess["users"] as $usr) {
- if ($r['reviewerUserID']==$usr->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['reviewerUserID']);
- $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
- }
+ foreach($mreviewers['ni'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["users"] as $usr) {
+ if ($r == $usr->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessUser = $dms->getUser($r);
+ $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
}
/* List all mandatory groups of reviewers */
$tmp = array();
- if($res) {
- foreach ($res as $r) {
- if($r['reviewerGroupID'] > 0) {
- $u = $dms->getGroup($r['reviewerGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
+ foreach ($mreviewers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
}
$options = array();
foreach ($docAccess["groups"] as $grp) {
-
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($grp->getId(), $mreviewers['g']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer')));
$options[] = $option;
}
$this->formField(
@@ -582,17 +570,15 @@ console.log(params);
array('field_wrap'=>array('', ($tmp ? ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp).'
' : '')))
);
/* Check for mandatory reviewer group without access */
- foreach($res as $r) {
- if ($r['reviewerGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['reviewerGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
- $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mreviewers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
+ $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
$this->contentContainerEnd();
@@ -600,28 +586,24 @@ console.log(params);
$this->contentSubHeading(getMLText("assign_approvers"));
$this->contentContainerStart();
- $res=$user->getMandatoryApprovers();
+
+ $mapprovers = getMandatoryApprovers($folder, null, $user);
+
/* List all mandatory approvers */
$tmp = array();
- if($res) {
- foreach ($res as $r) {
- if($r['approverUserID'] > 0) {
- $u = $dms->getUser($r['approverUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
+ foreach ($mapprovers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
}
$options = array();
foreach ($docAccess["users"] as $usr) {
if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['approverUserID']==$usr->getID()) $mandatory=true;
-
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mapprovers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_approver')));
$options[] = $option;
}
$this->formField(
@@ -638,39 +620,30 @@ console.log(params);
);
/* Check for mandatory approvers without access */
- foreach($res as $r) {
- if($r['approverUserID']) {
- $hasAccess = false;
- foreach ($docAccess["users"] as $usr) {
- if ($r['approverUserID']==$usr->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['approverUserID']);
- $this->warningMsg(getMLText("mandatory_approver_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
- }
+ foreach($mapprovers['ni'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["users"] as $usr) {
+ if ($r == $usr->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessUser = $dms->getUser($r);
+ $this->warningMsg(getMLText("mandatory_approver_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
}
/* List all mandatory groups of approvers */
$tmp = array();
- if($res) {
- foreach ($res as $r) {
- if($r['approverGroupID'] > 0) {
- $u = $dms->getGroup($r['approverGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
+ foreach ($mapprovers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
}
+
$options = array();
foreach ($docAccess["groups"] as $grp) {
-
- $mandatory=false;
- foreach ($res as $r) if ($r['approverGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
-
+ if(in_array($usr->getId(), $mapprovers['g']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_approver')));
$options[] = $option;
}
$this->formField(
@@ -687,23 +660,21 @@ console.log(params);
);
/* Check for mandatory approver groups without access */
- foreach($res as $r) {
- if ($r['approverGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['approverGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['approverGroupID']);
- $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mapprovers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r);
+ $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
+ $this->contentContainerEnd();
$this->warningMsg(getMLText("add_doc_reviewer_approver_warning"));
} else {
}
- $this->contentContainerEnd();
$this->columnEnd();
$this->rowEnd();
$this->formSubmit(" ".getMLText('add_document'));
diff --git a/views/bootstrap/class.SetReviewersApprovers.php b/views/bootstrap/class.SetReviewersApprovers.php
index 6cb1162db..b66b2054a 100644
--- a/views/bootstrap/class.SetReviewersApprovers.php
+++ b/views/bootstrap/class.SetReviewersApprovers.php
@@ -89,52 +89,48 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
$this->contentSubHeading(getMLText("update_reviewers"));
$this->contentContainerStart();
- if($user->getID() != $owner->getID()) {
- $res=$owner->getMandatoryReviewers();
- if($user->isAdmin())
- $res = array();
- } else
- $res=$user->getMandatoryReviewers();
+ /*
+ if($user->getID() != $owner->getID()) {
+ $res=$owner->getMandatoryReviewers();
+ if($user->isAdmin())
+ $res = array();
+ } else
+ $res=$user->getMandatoryReviewers();
+ */
+ $mreviewers = getMandatoryReviewers($folder, $document, $user);
- $options = [];
- foreach ($docAccess["users"] as $usr) {
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerUserID']==$usr->getID()) $mandatory=true;
-
- if ($mandatory){
- $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_reviewer'))));
- } elseif (isset($reviewIndex["i"][$usr->getID()])) {
- switch ($reviewIndex["i"][$usr->getID()]["status"]) {
- case S_LOG_WAITING:
- $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), true);
- break;
- case S_LOG_USER_REMOVED:
- $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('data-subtitle', getMLText('user_previously_removed_from_reviewers'))));
- break;
- default:
- $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('disabled', 'disabled')));
- break;
+ $options = [];
+ foreach ($docAccess["users"] as $usr) {
+ if(in_array($usr->getId(), $mreviewers['i'])) {
+ $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_reviewer'))));
+ } elseif (isset($reviewIndex["i"][$usr->getID()])) {
+ switch ($reviewIndex["i"][$usr->getID()]["status"]) {
+ case S_LOG_WAITING:
+ $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), true);
+ break;
+ case S_LOG_USER_REMOVED:
+ $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('data-subtitle', getMLText('user_previously_removed_from_reviewers'))));
+ break;
+ default:
+ $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('disabled', 'disabled')));
+ break;
+ }
+ } else {
+ if(!$enablehiddenrevapp && $usr->isHidden()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
+ $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()));
}
- } else {
- if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()));
}
- }
/* List all mandatory reviewers */
$extraparams = [];
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerUserID'] > 0) {
- $u = $dms->getUser($r['reviewerUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
- $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n"];
- }
+ $tmp = array();
+ foreach ($mreviewers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+ if($tmp) {
+ $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n"];
}
$this->formField(
getMLText("individuals"),
@@ -153,10 +149,7 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
$options = [];
foreach ($docAccess["groups"] as $group) {
$grpusers = $group->getUsers();
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerGroupID']==$group->getID()) $mandatory=true;
-
- if ($mandatory) {
+ if(in_array($group->getId(), $mreviewers['g'])) {
$options[] = array($group->getID(), htmlspecialchars($group->getName().' ('.count($grpusers).')'), false, array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer'))));
} elseif (isset($reviewIndex["g"][$group->getID()])) {
switch ($reviewIndex["g"][$group->getID()]["status"]) {
@@ -177,17 +170,13 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
/* List all mandatory groups of reviewers */
$extraparams = [];
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerGroupID'] > 0) {
- $u = $dms->getGroup($r['reviewerGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n"];
- }
+ $tmp = array();
+ foreach ($mreviewers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
+ }
+ if($tmp) {
+ $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n"];
}
$this->formField(
getMLText("groups"),
@@ -208,20 +197,21 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
$this->contentSubHeading(getMLText("update_approvers"));
$this->contentContainerStart();
+ /*
if($user->getID() != $owner->getID()) {
$res=$owner->getMandatoryApprovers();
if($user->isAdmin())
$res = array();
} else
$res=$user->getMandatoryApprovers();
+ */
+
+ $mapprovers = getMandatoryApprovers($folder, $document, $user);
$options = [];
foreach ($docAccess["users"] as $usr) {
- $mandatory=false;
- foreach ($res as $r) if ($r['approverUserID']==$usr->getID()) $mandatory=true;
-
- if ($mandatory){
+ if(in_array($usr->getId(), $mapprovers['i'])) {
$options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()), false, array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_approver'))));
} elseif (isset($approvalIndex["i"][$usr->getID()])) {
@@ -239,24 +229,20 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
}
else {
if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
$options[] = array($usr->getID(), htmlspecialchars($usr->getLogin() . " - ". $usr->getFullName()));
}
}
/* List all mandatory approvers */
$extraparams = [];
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverUserID'] > 0) {
- $u = $dms->getUser($r['approverUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
- $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n"];
- }
+ $tmp = array();
+ foreach ($mapprovers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+ if($tmp) {
+ $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n"];
}
$this->formField(
getMLText("individuals"),
@@ -275,10 +261,7 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
$options = [];
foreach ($docAccess["groups"] as $group) {
$grpusers = $group->getUsers();
- $mandatory=false;
- foreach ($res as $r) if ($r['approverGroupID']==$group->getID()) $mandatory=true;
-
- if ($mandatory) {
+ if(in_array($group->getId(), $mapprovers['g'])) {
$options[] = array($group->getID(), htmlspecialchars($group->getName().' ('.count($grpusers).')'), false, array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_approver'))));
} elseif (isset($approvalIndex["g"][$group->getID()])) {
@@ -301,17 +284,13 @@ class SeedDMS_View_SetReviewersApprovers extends SeedDMS_Theme_Style {
/* List all mandatory groups of approvers */
$extraparams = [];
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverGroupID'] > 0) {
- $u = $dms->getGroup($r['approverGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n"];
- }
+ $tmp = array();
+ foreach ($mapprovers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
+ }
+ if($tmp) {
+ $extraparams['field_wrap'] = ['', ''.getMLText('mandatory_approvergroups').': '.implode(', ', $tmp)."
\n"];
}
$this->formField(
getMLText("groups"),
diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php
index e04a75cb4..7319c4655 100644
--- a/views/bootstrap/class.Settings.php
+++ b/views/bootstrap/class.Settings.php
@@ -512,6 +512,10 @@ if(($kkk = $this->callHook('getFullSearchEngine')) && is_array($kkk))
showConfigCheckbox('settings_enableHiddenRevApp', 'enableHiddenRevApp'); ?>
showConfigCheckbox('settings_enableUpdateRevApp', 'enableUpdateRevApp'); ?>
showConfigCheckbox('settings_enableRemoveRevApp', 'enableRemoveRevApp'); ?>
+showConfigCheckbox('settings_addManagerAsReviewer', 'addManagerAsReviewer'); ?>
+showConfigCheckbox('settings_addManagerAsApprover', 'addManagerAsApprover'); ?>
+showConfigUser('settings_globalReviewer', 'globalReviewer', true, true); ?>
+showConfigUser('settings_globalApprover', 'globalApprover', true, true); ?>
showConfigCheckbox('settings_enableVersionDeletion', 'enableVersionDeletion'); ?>
showConfigCheckbox('settings_enableVersionModification', 'enableVersionModification'); ?>
showConfigCheckbox('settings_enableDuplicateDocNames', 'enableDuplicateDocNames'); ?>
diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php
index 45ffb4c2c..8c485c8e8 100644
--- a/views/bootstrap/class.UpdateDocument.php
+++ b/views/bootstrap/class.UpdateDocument.php
@@ -337,28 +337,24 @@ console.log(element);
$this->contentContainerEnd();
$this->contentSubHeading(getMLText("assign_reviewers"));
$this->contentContainerStart();
- $res=$user->getMandatoryReviewers();
+
+ $mreviewers = getMandatoryReviewers($folder, $document, $user);
+
$options = array();
foreach ($docAccess["users"] as $usr) {
if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerUserID']==$usr->getID()) $mandatory=true;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mreviewers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_reviewer')));
$options[] = $option;
}
$tmp = array();
foreach($reviewStatus as $r) {
if($r['type'] == 0) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['reviewerUserID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mreviewers) {
+ if(!in_array($r['required'], $mreviewers['i']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -370,20 +366,17 @@ console.log(element);
$fieldwrap = array('', $this->getSelectPresetButtonHtml("IndReviewers", $tmp));
}
/* List all mandatory reviewers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerUserID'] > 0) {
- $u = $dms->getUser($r['reviewerUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
- if(isset($fieldwrap[1]))
- $fieldwrap[1] .= ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
- else
- $fieldwrap[1] = ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mreviewers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+
+ if($tmp) {
+ if(isset($fieldwrap[1]))
+ $fieldwrap[1] .= ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -401,39 +394,31 @@ console.log(element);
);
/* Check for mandatory reviewer without access */
- foreach($res as $r) {
- if($r['reviewerUserID']) {
- $hasAccess = false;
- foreach ($docAccess["users"] as $usr) {
- if ($r['reviewerUserID']==$usr->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['reviewerUserID']);
- $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
- }
+ foreach($mreviewers['ni'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["users"] as $usr) {
+ if ($r == $usr->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessUser = $dms->getUser($r);
+ $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
}
+
$options = array();
foreach ($docAccess["groups"] as $grp) {
-
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($grp->getId(), $mreviewers['g']) || !$grp->getUsers())
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer')));
$options[] = $option;
}
+
$tmp = array();
foreach($reviewStatus as $r) {
if($r['type'] == 1) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['reviewerGroupID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mreviewers) {
+ if(!in_array($r['required'], $mreviewers['g']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -445,18 +430,18 @@ console.log(element);
$fieldwrap = array('', $this->getSelectPresetButtonHtml("GrpReviewers", $tmp));
}
/* List all mandatory groups of reviewers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerGroupID'] > 0) {
- $u = $dms->getGroup($r['reviewerGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $fieldwrap[1] .= ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mreviewers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
}
+ if($tmp) {
+ if(isset($fieldwrap[1]))
+ $fieldwrap[1] .= ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
+ }
+
$this->formField(
getMLText("groups"),
array(
@@ -472,17 +457,15 @@ console.log(element);
);
/* Check for mandatory reviewer group without access */
- foreach($res as $r) {
- if ($r['reviewerGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['reviewerGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
- $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mreviewers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
+ $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
$this->contentContainerEnd();
@@ -490,29 +473,25 @@ console.log(element);
$this->contentSubHeading(getMLText("assign_approvers"));
$this->contentContainerStart();
+
+ $mapprovers = getMandatoryApprovers($folder, $document, $user);
+
$options = array();
- $res=$user->getMandatoryApprovers();
foreach ($docAccess["users"] as $usr) {
if(!$enablehiddenrevapp && $usr->isHidden()) continue;
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['approverUserID']==$usr->getID()) $mandatory=true;
-
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mapprovers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_approver')));
$options[] = $option;
}
+
$tmp = array();
foreach($approvalStatus as $r) {
if($r['type'] == 0) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['approverUserID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mapprovers) {
+ if(!in_array($r['required'], $mapprovers['i']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -523,18 +502,18 @@ console.log(element);
if($tmp) {
$fieldwrap = array('', $this->getSelectPresetButtonHtml("IndApprovers", $tmp));
}
+
/* List all mandatory approvers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverUserID'] > 0) {
- $u = $dms->getUser($r['approverUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
+ $tmp = array();
+ foreach ($mapprovers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+ if($tmp) {
+ if(isset($fieldwrap[1]))
$fieldwrap[1] .= ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n";
- }
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -552,45 +531,33 @@ console.log(element);
);
/* Check for mandatory approvers without access */
- foreach($res as $r) {
- if($r['approverUserID']) {
+ foreach($mapprovers['ni'] as $r) {
$hasAccess = false;
foreach ($docAccess["users"] as $usr) {
- if ($r['approverUserID']==$usr->getID())
+ if ($r == $usr->getID())
$hasAccess = true;
}
if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['approverUserID']);
+ $noAccessUser = $dms->getUser($r);
$this->warningMsg(getMLText("mandatory_approver_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
- }
}
$options = array();
foreach ($docAccess["groups"] as $grp) {
- $mandatory=false;
- foreach ($res as $r) if ($r['approverGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
-
+ if(in_array($grp->getId(), $mapprovers['g']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_approver')));
$options[] = $option;
}
$tmp = array();
foreach($approvalStatus as $r) {
if($r['type'] == 1) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['approverGroupID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
- $tmp[] = $r['required'];
- } else {
+ if(!in_array($r['required'], $mapprovers['g']))
$tmp[] = $r['required'];
- }
+ } else {
+ $tmp[] = $r['required'];
}
}
$fieldwrap = array('', '');
@@ -598,17 +565,13 @@ console.log(element);
$fieldwrap = array('', $this->getSelectPresetButtonHtml("GrpApprovers", $tmp));
}
/* List all mandatory groups of approvers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverGroupID'] > 0) {
- $u = $dms->getGroup($r['approverGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $fieldwrap[1] .= ''.getMLText('mandatory_approvergroups').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mapprovers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
+ }
+ if($tmp) {
+ $fieldwrap[1] .= ''.getMLText('mandatory_approvergroups').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -626,17 +589,15 @@ console.log(element);
);
/* Check for mandatory approver groups without access */
- foreach($res as $r) {
- if ($r['approverGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['approverGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['approverGroupID']);
- $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mapprovers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r);
+ $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
$this->contentContainerEnd();
From 3347b8e4f5fbb8b70c653df3df66e17a7d06af5f Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Fri, 9 Feb 2024 10:49:15 +0100
Subject: [PATCH 016/100] fix encapsulation with start/end container
---
views/bootstrap/class.AddDocument.php | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php
index 85eacb61a..2761a713b 100644
--- a/views/bootstrap/class.AddDocument.php
+++ b/views/bootstrap/class.AddDocument.php
@@ -733,7 +733,6 @@ console.log(params);
}
if($enablereceiptworkflow) {
- $this->contentContainerEnd();
$this->contentSubHeading(getMLText("assign_recipients"));
$this->contentContainerStart();
$options = array();
@@ -788,9 +787,9 @@ console.log(params);
)
);
+ $this->contentContainerEnd();
}
- $this->contentContainerEnd();
$this->columnEnd();
$this->rowEnd();
$this->formSubmit(" ".getMLText('add_document'));
From d8c2a9df06dbb418d0fa6c3785a7fbf319f6b977 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 12 Feb 2024 14:06:53 +0100
Subject: [PATCH 017/100] add global group approver/reviewer
---
inc/inc.ClassSettings.php | 14 +++++++--
inc/inc.Utils.php | 10 ++++++
op/op.Settings.php | 2 ++
views/bootstrap/class.GroupMgr.php | 12 +++++++-
views/bootstrap/class.Settings.php | 49 ++++++++++++++++++++++++++++++
5 files changed, 84 insertions(+), 3 deletions(-)
diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php
index 5d35b016f..39b8ec88e 100644
--- a/inc/inc.ClassSettings.php
+++ b/inc/inc.ClassSettings.php
@@ -186,10 +186,14 @@ class Settings { /* {{{ */
var $_addManagerAsReviewer = false;
// group manager is mandatory approver
var $_addManagerAsApprover = false;
- // global reviewer
+ // global individuel reviewer
var $_globalReviewer = array();
- // global approver
+ // 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
@@ -761,6 +765,10 @@ class Settings { /* {{{ */
$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->_versioningFileName = strval($tab["versioningFileName"]);
$this->_workflowMode = strval($tab["workflowMode"]);
@@ -1115,6 +1123,8 @@ class Settings { /* {{{ */
$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);
diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php
index b205857b1..ff740d904 100644
--- a/inc/inc.Utils.php
+++ b/inc/inc.Utils.php
@@ -1080,6 +1080,11 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
$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);
@@ -1161,6 +1166,11 @@ function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
$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);
diff --git a/op/op.Settings.php b/op/op.Settings.php
index c36df1032..351d1560b 100644
--- a/op/op.Settings.php
+++ b/op/op.Settings.php
@@ -251,6 +251,8 @@ if ($action == "saveSettings")
setBoolValue("addManagerAsApprover");
setArrayValue("globalReviewer");
setArrayValue("globalApprover");
+ setArrayValue("globalGroupReviewer");
+ setArrayValue("globalGroupApprover");
setBoolValue("enableUpdateRevApp");
setBoolValue("enableRemoveRevApp");
setBoolValue("enableVersionDeletion");
diff --git a/views/bootstrap/class.GroupMgr.php b/views/bootstrap/class.GroupMgr.php
index fa53d78dd..e0cb49596 100644
--- a/views/bootstrap/class.GroupMgr.php
+++ b/views/bootstrap/class.GroupMgr.php
@@ -149,6 +149,7 @@ $(document).ready( function() {
function showGroupForm($group) { /* {{{ */
$dms = $this->params['dms'];
$user = $this->params['user'];
+ $settings = $this->params['settings'];
$allUsers = $this->params['allusers'];
$groups = $this->params['allgroups'];
$sortusersinlist = $this->params['sortusersinlist'];
@@ -213,7 +214,16 @@ $(document).ready( function() {
print "";
print " ";
print "";
- print " ";
+ print "";
+ echo "";
+ if($group->isMember($member, true) && $member->isAdmin() && $settings->_addManagerAsReviewer && !$settings->_enableAdminRevApp) {
+ $this->warningMsg(getMLText("settings_manager_reviewer_is_admin", ['login'=>$member->getLogin()]));
+ }
+ if($group->isMember($member, true) && $member->isAdmin() && $settings->_addManagerAsApprover && !$settings->_enableAdminRevApp) {
+ $this->warningMsg(getMLText("settings_manager_approver_is_admin", ['login'=>$member->getLogin()]));
+ }
+ echo " ";
+ print "";
}
}
?>
diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php
index 7319c4655..fe7041832 100644
--- a/views/bootstrap/class.Settings.php
+++ b/views/bootstrap/class.Settings.php
@@ -225,6 +225,37 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style {
params['settings'];
+ $dms = $this->params['dms'];
+?>
+ ">
+ = getMLText($title) ?>
+
+getAllGroups();
+ if($groups) {
+ if(is_array($settings->{"_".$name}))
+ $selections = $settings->{"_".$name};
+ else
+ $selections = explode(',', $settings->{"_".$name});
+ echo "";
+ if($allowempty)
+ echo " ";
+ foreach($groups as $curgroup) {
+ echo "getID()."\"";
+ if(in_array($curgroup->getID(), $selections))
+ echo " selected";
+ echo ">".htmlspecialchars($curgroup->getName())." ";
+ }
+ echo " ";
+ }
+?>
+
+
+params['extmgr'];
@@ -516,6 +547,8 @@ if(($kkk = $this->callHook('getFullSearchEngine')) && is_array($kkk))
showConfigCheckbox('settings_addManagerAsApprover', 'addManagerAsApprover'); ?>
showConfigUser('settings_globalReviewer', 'globalReviewer', true, true); ?>
showConfigUser('settings_globalApprover', 'globalApprover', true, true); ?>
+showConfigGroup('settings_globalGroupReviewer', 'globalGroupReviewer', true, true); ?>
+showConfigGroup('settings_globalGroupApprover', 'globalGroupApprover', true, true); ?>
showConfigCheckbox('settings_enableVersionDeletion', 'enableVersionDeletion'); ?>
showConfigCheckbox('settings_enableVersionModification', 'enableVersionModification'); ?>
showConfigCheckbox('settings_enableDuplicateDocNames', 'enableDuplicateDocNames'); ?>
@@ -752,6 +785,22 @@ if(is_writeable($settings->_configFilePath)) {
$this->warningMsg(getMLText("settings_partionsize_below_max_filesize"));
}
+ /* Check if globally defined reviewer/approvers are admins */
+ if(!$settings->_enableAdminRevApp) {
+ foreach($settings->_globalReviewer as $uid) {
+ $u = $dms->getUser($uid);
+ if($u->isAdmin()) {
+ $this->warningMsg(getMLText("settings_global_reviewer_is_admin", ['login'=>$u->getLogin()]));
+ }
+ }
+ foreach($settings->_globalReviewer as $uid) {
+ $u = $dms->getUser($uid);
+ if($u->isAdmin()) {
+ $this->warningMsg(getMLText("settings_global_approver_is_admin", ['login'=>$u->getLogin()]));
+ }
+ }
+ }
+
foreach($extmgr->getExtensionConfiguration() as $extname=>$extconf) {
if($this->hasHook('checkConfig'))
$this->callHook('checkConfig', $extname, $extconf);
From 02247933667aa6069a175cac7697ad6aad59e049 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 12 Feb 2024 14:10:12 +0100
Subject: [PATCH 018/100] add showConfigGroup()
---
views/bootstrap/class.Settings.php | 31 ++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php
index cbaa3cb94..a549c9455 100644
--- a/views/bootstrap/class.Settings.php
+++ b/views/bootstrap/class.Settings.php
@@ -225,6 +225,37 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style {
params['settings'];
+ $dms = $this->params['dms'];
+?>
+ ">
+ = getMLText($title) ?>
+
+getAllGroups();
+ if($groups) {
+ if(is_array($settings->{"_".$name}))
+ $selections = $settings->{"_".$name};
+ else
+ $selections = explode(',', $settings->{"_".$name});
+ echo "";
+ if($allowempty)
+ echo " ";
+ foreach($groups as $curgroup) {
+ echo "getID()."\"";
+ if(in_array($curgroup->getID(), $selections))
+ echo " selected";
+ echo ">".htmlspecialchars($curgroup->getName())." ";
+ }
+ echo " ";
+ }
+?>
+
+
+params['settings'];
$dms = $this->params['dms'];
From f671dc0b1cfdfd1674c93852ec7d98367ce3779f Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 12 Feb 2024 14:11:34 +0100
Subject: [PATCH 019/100] add missing phrases
---
languages/ar_EG/lang.inc | 21 +++++++++++++++++++++
languages/bg_BG/lang.inc | 21 +++++++++++++++++++++
languages/ca_ES/lang.inc | 21 +++++++++++++++++++++
languages/cs_CZ/lang.inc | 21 +++++++++++++++++++++
languages/de_DE/lang.inc | 29 +++++++++++++++++++++++++----
languages/el_GR/lang.inc | 21 +++++++++++++++++++++
languages/en_GB/lang.inc | 29 +++++++++++++++++++++++++----
languages/es_ES/lang.inc | 21 +++++++++++++++++++++
languages/fr_FR/lang.inc | 21 +++++++++++++++++++++
languages/hr_HR/lang.inc | 21 +++++++++++++++++++++
languages/hu_HU/lang.inc | 21 +++++++++++++++++++++
languages/id_ID/lang.inc | 21 +++++++++++++++++++++
languages/it_IT/lang.inc | 21 +++++++++++++++++++++
languages/ko_KR/lang.inc | 21 +++++++++++++++++++++
languages/lo_LA/lang.inc | 21 +++++++++++++++++++++
languages/nb_NO/lang.inc | 21 +++++++++++++++++++++
languages/nl_NL/lang.inc | 21 +++++++++++++++++++++
languages/pl_PL/lang.inc | 21 +++++++++++++++++++++
languages/pt_BR/lang.inc | 21 +++++++++++++++++++++
languages/ro_RO/lang.inc | 21 +++++++++++++++++++++
languages/ru_RU/lang.inc | 21 +++++++++++++++++++++
languages/sk_SK/lang.inc | 21 +++++++++++++++++++++
languages/sv_SE/lang.inc | 21 +++++++++++++++++++++
languages/tr_TR/lang.inc | 21 +++++++++++++++++++++
languages/uk_UA/lang.inc | 21 +++++++++++++++++++++
languages/zh_CN/lang.inc | 21 +++++++++++++++++++++
languages/zh_TW/lang.inc | 21 +++++++++++++++++++++
27 files changed, 575 insertions(+), 8 deletions(-)
diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc
index 7243a7732..72d8ea5b0 100644
--- a/languages/ar_EG/lang.inc
+++ b/languages/ar_EG/lang.inc
@@ -380,7 +380,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' => 'مستند',
@@ -952,6 +954,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'لائحة الدمج',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'لائحة المهمات',
'local_file' => 'ملف محلي',
'locked_by' => 'محمي بواسطة',
@@ -1479,6 +1482,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' => 'متقدم',
@@ -1700,6 +1707,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' => '',
@@ -1737,6 +1754,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',
@@ -1932,6 +1951,7 @@ URL: [url]',
'splash_add_transmittal' => 'إضافة إحالة',
'splash_add_user' => 'اضافة مستخدم',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'مسح ذاكرة التخزين المؤقت',
'splash_cleared_clipboard' => 'مسح الحافظة',
'splash_delete_access' => 'حذف الوصول',
@@ -1954,6 +1974,7 @@ URL: [url]',
'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' => 'خطأ في إرسال رابط التنزيل',
diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc
index e956f00a2..2a5c526f2 100644
--- a/languages/bg_BG/lang.inc
+++ b/languages/bg_BG/lang.inc
@@ -367,7 +367,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' => 'Документ',
@@ -846,6 +848,7 @@ $text = array(
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Локален файл',
'locked_by' => 'Блокиран',
@@ -1321,6 +1324,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' => 'Допълнително',
@@ -1542,6 +1549,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' => '',
@@ -1579,6 +1596,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 на папка',
@@ -1774,6 +1793,7 @@ $text = array(
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1796,6 +1816,7 @@ $text = array(
'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' => '',
diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc
index 916fd941d..ae9f106ac 100644
--- a/languages/ca_ES/lang.inc
+++ b/languages/ca_ES/lang.inc
@@ -372,7 +372,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',
@@ -851,6 +853,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',
@@ -1326,6 +1329,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' => '',
@@ -1547,6 +1554,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' => '',
@@ -1584,6 +1601,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' => '',
@@ -1779,6 +1798,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1801,6 +1821,7 @@ URL: [url]',
'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' => '',
diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc
index 7b2f9d6a7..e1698ff0e 100644
--- a/languages/cs_CZ/lang.inc
+++ b/languages/cs_CZ/lang.inc
@@ -392,7 +392,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',
@@ -983,6 +985,7 @@ URL: [url]',
'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',
@@ -1551,6 +1554,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é',
@@ -1772,6 +1779,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' => '',
@@ -1809,6 +1826,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',
@@ -2004,6 +2023,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',
@@ -2026,6 +2046,7 @@ Jméno: [username]
'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í',
diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc
index a692b9053..efb0f2b8f 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 (3304), dgrutsch (22)
+// Translators: Admin (3330), dgrutsch (22)
$text = array(
'2_factor_auth' => '2-Faktor Authentifizierung',
@@ -425,8 +425,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',
@@ -1194,6 +1196,7 @@ URL: [url]',
'list_conversion_services' => 'Liste der Konvertierer',
'list_hooks' => 'Liste der interne Aufrufe',
'list_notification_services' => 'Liste der Benachrichtigungsdienste',
+'list_of_recipients_has_disabled_users' => 'Empfängerliste beinhaltet gesperrte Benutzer.',
'list_tasks' => 'Tasks auflisten',
'local_file' => 'Lokale Datei',
'locked_by' => 'Gesperrt von',
@@ -1219,11 +1222,11 @@ URL: [url]',
'mandatory_approvergroups' => 'Zwingende Gruppen von Freigebern',
'mandatory_approvergroup_no_access' => 'Zwingende Gruppe von Freigebern \'[group]\' hat unzureichende Zugriffsrechte.',
'mandatory_approvers' => 'Zwingende Freigeber',
-'mandatory_approver_no_access' => 'Zwingender Freigeber \'[user]\' hat unzureichende Zugriffsrechte.',
+'mandatory_approver_no_access' => 'Zwingender Freigeber \'[user]\' hat unzureichende Zugriffsrechte oder ist als Freigeber nicht erlaubt.',
'mandatory_reviewergroups' => 'Zwingende Gruppen von Prüfern',
'mandatory_reviewergroup_no_access' => 'Zwingende Gruppe von Prüfern \'[group]\' hat unzureichende Zugriffsrechte.',
'mandatory_reviewers' => 'Zwingende Prüfer',
-'mandatory_reviewer_no_access' => 'Zwingender Prüfer \'[user]\' hat nicht ausreichende Zugriffsrechte.',
+'mandatory_reviewer_no_access' => 'Zwingender Prüfer \'[user]\' hat unzureichende Zugriffsrechte oder ist als Prüfer nicht erlaubt.',
'march' => 'März',
'mark_document' => 'Dokument für Massenoperation auswählen',
'mark_folder' => 'Ordner für Massenoperation auswählen',
@@ -1934,6 +1937,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',
@@ -2155,6 +2162,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',
@@ -2192,6 +2209,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',
@@ -2387,6 +2406,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',
@@ -2409,6 +2429,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'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',
diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc
index d38cbe028..c72009e12 100644
--- a/languages/el_GR/lang.inc
+++ b/languages/el_GR/lang.inc
@@ -367,7 +367,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' => 'Έγγραφο',
@@ -846,6 +848,7 @@ $text = array(
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Τοπικό αρχείο',
'locked_by' => '',
@@ -1332,6 +1335,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' => '',
@@ -1553,6 +1560,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' => '',
@@ -1590,6 +1607,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' => '',
@@ -1785,6 +1804,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => '',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -1807,6 +1827,7 @@ URL: [url]',
'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' => '',
diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc
index 5d54dd6f4..0306b0024 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 (2395), archonwang (3), dgrutsch (9), netixw (14)
+// Translators: Admin (2423), archonwang (3), dgrutsch (9), netixw (14)
$text = array(
'2_factor_auth' => '2-factor authentication',
@@ -314,7 +314,7 @@ URL: [url]',
'chart_sizeperuser_title' => 'Diskspace 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',
@@ -425,7 +425,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',
@@ -1194,6 +1196,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',
@@ -1219,11 +1222,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',
@@ -1936,6 +1939,10 @@ If you did not receive a password, please use the password forgotten function on
'settings' => 'Settings',
'settings_activate_module' => 'Activate module',
'settings_activate_php_extension' => 'Activate PHP extension',
+'settings_addManagerAsApprover' => 'Add group manager as approver',
+'settings_addManagerAsApprover_desc' => 'All uploaded documents of a user will be approved by the managers of the users\'s groups.',
+'settings_addManagerAsReviewer' => 'Add group manager as reviewer',
+'settings_addManagerAsReviewer_desc' => 'All uploaded documents of a user will be reviewed by the managers of the users\'s groups.',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'If set, admin can login only by specified IP address. Leave empty to avoid lose of access. NOTE: works only with local authentication (no LDAP)',
'settings_Advanced' => 'Advanced',
@@ -2157,6 +2164,16 @@ If you did not receive a password, please use the password forgotten function on
'settings_fullSearchEngine_desc' => 'Set the method used for the fulltext search.',
'settings_fullSearchEngine_vallucene' => 'Zend Lucene',
'settings_fullSearchEngine_valsqlitefts' => 'SQLiteFTS',
+'settings_globalApprover' => 'Add approver for all documents',
+'settings_globalApprover_desc' => 'This users will be added to each uploaded document as mandatory approvers.',
+'settings_globalGroupApprover' => 'Add group approver for all documents',
+'settings_globalGroupApprover_desc' => 'This groups will be added to each uploaded document as mandatory approvers.',
+'settings_globalGroupReviewer' => 'Add group reviewer for all documents',
+'settings_globalGroupReviewer_desc' => 'This groups will be added to each uploaded document as mandatory reviewers.',
+'settings_globalReviewer' => 'Add reviewer for all documents',
+'settings_globalReviewer_desc' => 'This users will be added to each uploaded document as mandatory reviewers.',
+'settings_global_approver_is_admin' => 'Approver \'[login]\' for all documents is administrator, but administrators may not approve.',
+'settings_global_reviewer_is_admin' => 'Reviewer \'[login]\' for all documents is administrator, but administrators may not review.',
'settings_guestID' => 'Guest user',
'settings_guestID_desc' => 'ID of guest-user used when logged in as guest (mostly no need to change)',
'settings_guestid_is_admin' => 'Guest user is an administrator',
@@ -2194,6 +2211,8 @@ If you did not receive a password, please use the password forgotten function on
'settings_luceneClassDir_desc' => 'Path to SeedDMS_Lucene (optional). Leave this empty if you have installed SeedDMS_Lucene at a place where it can be found by PHP, e.g. Extra PHP Include-Path',
'settings_luceneDir' => 'Directory for full text index',
'settings_luceneDir_desc' => 'Path to Lucene index',
+'settings_manager_approver_is_admin' => 'Manager ist adminstrator and a mandatory approver, but administrators may not approve.',
+'settings_manager_reviewer_is_admin' => 'Manager ist adminstrator and a mandatory reviewer, but administrators may not review.',
'settings_markdownComments' => 'Parse comments as markdown',
'settings_markdownComments_desc' => 'Enable this, if comments of folders, documents and versions are interpreted as markdown.',
'settings_maxDirID' => 'Max Directory ID',
@@ -2389,6 +2408,7 @@ If you did not receive a password, please use the password forgotten function on
'splash_add_transmittal' => 'Added new transmittal',
'splash_add_user' => 'Added new user',
'splash_cancel_checkout' => 'Checkout canceled',
+'splash_checked_in' => 'Document checked in',
'splash_cleared_cache' => 'Cache cleared',
'splash_cleared_clipboard' => 'Clipboard cleared',
'splash_delete_access' => 'Access right deleted',
@@ -2411,6 +2431,7 @@ If you did not receive a password, please use the password forgotten function on
'splash_edit_transmittal' => 'Transmittal saved',
'splash_edit_user' => 'User saved',
'splash_error_add_to_transmittal' => 'Error while adding document to transmittal',
+'splash_error_checkin_ended' => 'Ended checkin and discarded changes',
'splash_error_rm_download_link' => 'Error when removing download link',
'splash_error_saving_file' => 'Error while saving file',
'splash_error_send_download_link' => 'Error while sending download link',
diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc
index 21f52bfb6..6c73ed1a7 100644
--- a/languages/es_ES/lang.inc
+++ b/languages/es_ES/lang.inc
@@ -387,7 +387,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Esta es un área restringida. Se permite el acceso únicamente a personal autorizado. Cualquier intrusión se perseguirá conforme a las leyes internacionales.',
'discspace' => 'Espacio en disco',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documentos recibidos sin acceso por recipiente',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documentos en revisión sin acceso para el revisor',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
@@ -967,6 +969,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Mis bloques',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Fichero local',
'locked_by' => 'Bloqueado por',
@@ -1502,6 +1505,10 @@ URL: [url]',
'settings' => 'Configuración',
'settings_activate_module' => 'Activar módulo',
'settings_activate_php_extension' => 'Activar extensión PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP de administración',
'settings_adminIP_desc' => 'Si establece que el administrador solo puede conectar desde una dirección IP específica, deje en blanco para evitar el control. NOTA: funciona únicamente con autenticación local (no LDAP).',
'settings_Advanced' => 'Avanzado',
@@ -1723,6 +1730,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'Establece el metodo utilizado para la busqueda de texto completa',
'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 de invitado',
'settings_guestID_desc' => 'ID del usuario invitado cuando se conecta como invitado (mayormente no necesita cambiarlo)',
'settings_guestid_is_admin' => '',
@@ -1760,6 +1777,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Ruta hacia SeedDMS_Lucene (opcional)',
'settings_luceneDir' => 'Carpeta del índice de texto completo',
'settings_luceneDir_desc' => 'Ruta hacia el índice Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'ID máximo de carpeta',
@@ -1955,6 +1974,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Nuevo usuario agregado',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Portapapeles limpiado',
'splash_delete_access' => '',
@@ -1977,6 +1997,7 @@ URL: [url]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Usuario guardado',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc
index 61f31bfc3..4192bdc63 100644
--- a/languages/fr_FR/lang.inc
+++ b/languages/fr_FR/lang.inc
@@ -416,7 +416,9 @@ URL : [url]',
'disable_extension' => 'Désactiver l’extension',
'disclaimer' => 'Cet espace est protégé. Son accès est strictement réservé aux utilisateurs autorisés. Tout accès non autorisé est punissable par les lois internationales.',
'discspace' => 'Espace disque',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documents en attente de réception sans accès du destinataire',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documents en révision sans accès du réviseur',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
@@ -1151,6 +1153,7 @@ URL : [url]',
'list_conversion_services' => '',
'list_hooks' => 'Liste des appels internes',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Liste des tâches',
'local_file' => 'Fichier local',
'locked_by' => 'Verrouillé par',
@@ -1889,6 +1892,10 @@ Nom : [username]
'settings' => 'Configuration',
'settings_activate_module' => 'Activez le module',
'settings_activate_php_extension' => 'Activez l\'extension PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Si activé l\'administrateur ne peut se connecter que par l\'adresse IP spécifiées, laisser vide pour éviter le contrôle. NOTE: fonctionne uniquement avec autentication locale (sans LDAP)',
'settings_Advanced' => 'Avancé',
@@ -2110,6 +2117,16 @@ Nom : [username]
'settings_fullSearchEngine_desc' => 'Définissez la méthode utilisée pour la recherche complète de texte.',
'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 invité',
'settings_guestID_desc' => 'ID de l\'invité utilisé lorsque vous êtes connecté en tant qu\'invité (la plupart du temps pas besoin de changer)',
'settings_guestid_is_admin' => 'L’utilisateur invité est administrateur',
@@ -2147,6 +2164,8 @@ Nom : [username]
'settings_luceneClassDir_desc' => 'Chemin vers SeedDMS_Lucene (optionnel)',
'settings_luceneDir' => 'Répertoire index Lucene',
'settings_luceneDir_desc' => 'Chemin vers index Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Nombre max. de sous-dossiers',
@@ -2342,6 +2361,7 @@ Nom : [username]
'splash_add_transmittal' => 'Ajouté à la transmission',
'splash_add_user' => 'Nouvel utilisateur ajouté',
'splash_cancel_checkout' => 'Vérification annulée',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache vidé',
'splash_cleared_clipboard' => 'Presse-papier vidé',
'splash_delete_access' => 'Droits d’accès supprimés',
@@ -2364,6 +2384,7 @@ Nom : [username]
'splash_edit_transmittal' => 'Transmission enregistrée',
'splash_edit_user' => 'Utilisateur modifié',
'splash_error_add_to_transmittal' => 'Erreur lors de l’ajout du document à la transmission',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Erreur lors de la suppression du lien de téléchargement',
'splash_error_saving_file' => 'Erreur lors de l’enregistrement du fichier',
'splash_error_send_download_link' => 'Erreur lors de l’envoi du lien de téléchargement',
diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc
index f0211529c..f9270ae64 100644
--- a/languages/hr_HR/lang.inc
+++ b/languages/hr_HR/lang.inc
@@ -392,7 +392,9 @@ Internet poveznica: [url]',
'disable_extension' => '',
'disclaimer' => 'Ovo je klasificirano područje. Pristup je omogućen samo ovlaštenim osobama. Sa svakim kršenjem bit će postupano sukladno nacionalnim i međunarodnim zakonima.',
'discspace' => 'Prostor na disku',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -964,6 +966,7 @@ Internet poveznica: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Kuke za popise',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Lokalna datoteka',
'locked_by' => 'Zaključao',
@@ -1515,6 +1518,10 @@ Internet poveznica: [url]',
'settings' => 'Postavke',
'settings_activate_module' => 'Aktiviraj modul',
'settings_activate_php_extension' => 'Aktiviraj PHP ekstenziju',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Ako se postavljeni administrator može prijaviti samo s određenom IP adresom, ostavite prazno da izbjegnete kontrolu. NAPOMENA: radi samo s lokalnom autentifikacijom (ne LDAP)',
'settings_Advanced' => 'Napredno',
@@ -1736,6 +1743,16 @@ Internet poveznica: [url]',
'settings_fullSearchEngine_desc' => 'Postavite metodu koja će se koristiti za pretragu punog teksta',
'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 gosta',
'settings_guestID_desc' => 'ID gost korisnika koja se koristi kada je prijavljen kao gost (uglavnom se ne treba mijenjati)',
'settings_guestid_is_admin' => '',
@@ -1773,6 +1790,8 @@ Internet poveznica: [url]',
'settings_luceneClassDir_desc' => 'Putanja do ProsperaDMS_Lucene (opcija). Ostavite ovo prazno ako ste instalirali ProsperaDMS_Lucene na mjestu gdje se može pronaći PHP-om, npr. Extra PHP Include-Path',
'settings_luceneDir' => 'Mapa za indeksiranje cijelog teksta',
'settings_luceneDir_desc' => 'Putanja to Lucene indeksa',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max Directory ID',
@@ -1968,6 +1987,7 @@ Internet poveznica: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Dodan novi korisnik',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Očišćen međuspremnik',
'splash_delete_access' => '',
@@ -1990,6 +2010,7 @@ Internet poveznica: [url]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Korisnik pohranjen',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc
index 106f9fd12..e443e84ef 100644
--- a/languages/hu_HU/lang.inc
+++ b/languages/hu_HU/lang.inc
@@ -387,7 +387,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Ez egy bizalmas terület. Hozzáférés kizárólag a meghatalmazott személyek részére engedélyezett. Bárminemű megsértését a nemzeti, illetve a nemzetközi jog szerint fogják büntetni.',
'discspace' => 'Lemezterület',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokumentum',
@@ -958,6 +960,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Hook lista',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Helyi állomány',
'locked_by' => 'Zárolta',
@@ -1492,6 +1495,10 @@ URL: [url]',
'settings' => 'Beállítások',
'settings_activate_module' => 'Modul aktiválása',
'settings_activate_php_extension' => 'PHP kiterjesztés aktiválása',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Adminisztációs IP',
'settings_adminIP_desc' => 'Amennyiben beállítja az adminisztrátor csak a megadott IP címről tud bejelentkezni. Hagyja üresen az ellenőrzés elkerüléséhez. MEGJEGYZÉS: csak helyi azonosítás esetén működik (LDAP használatakor nem)',
'settings_Advanced' => 'Részletek',
@@ -1713,6 +1720,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'Állítsa be a kereséséhez használt módot.',
'settings_fullSearchEngine_vallucene' => 'Dokumentum tartalom keresés',
'settings_fullSearchEngine_valsqlitefts' => 'Adatbázis keresés',
+'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' => 'Vendég azonosító',
'settings_guestID_desc' => 'A vendég felhasználó azonosítója ami a vendégként történő bejelentkezéskor lesz használva (általában nem szükséges módosítani)',
'settings_guestid_is_admin' => '',
@@ -1750,6 +1767,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Elérési útvonal a SeedDMS_Lucene programhoz (opcionális). Hagyja üresen, ha már telepített SeedDMS_Lucene alkalmazást olyan helyre, ahol azt megtalálja a PHP, pl.: Extra PHP Include-Path segítségével',
'settings_luceneDir' => 'Teljes szöveg index könyvtára',
'settings_luceneDir_desc' => 'Lucene index elérési útvonal',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Legnagyobb könyvtár azonosító',
@@ -1945,6 +1964,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Új felhasználó hozzáadva',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Vágólap törölve',
'splash_delete_access' => '',
@@ -1967,6 +1987,7 @@ URL: [url]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Felhasználó mentve',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/id_ID/lang.inc b/languages/id_ID/lang.inc
index 61ed4eb85..76e827716 100644
--- a/languages/id_ID/lang.inc
+++ b/languages/id_ID/lang.inc
@@ -396,7 +396,9 @@ URL: [url]',
'disable_extension' => 'Nonaktifkan ekstensi',
'disclaimer' => 'Ini adalah area rahasia. Akses hanya diizinkan untuk personel yang berwenang. Setiap pelanggaran akan dituntut sesuai dengan hukum nasional dan internasional.',
'discspace' => 'Ruang penyimpanan',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokumen dalam revisi tanpa akses oleh revisor',
'docs_with_missing_revision_date' => '',
'document' => 'Dokumen',
@@ -1042,6 +1044,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Daftar hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Daftar tasks',
'local_file' => 'Berkas lokal',
'locked_by' => 'Dikunci oleh',
@@ -1582,6 +1585,10 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'settings' => 'Pengaturan',
'settings_activate_module' => 'Aktifkan modul',
'settings_activate_php_extension' => 'Aktifkan ekstensi PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP Admin',
'settings_adminIP_desc' => 'Jika disetel, admin hanya dapat login dengan alamat IP yang ditentukan. Biarkan kosong untuk menghindari kehilangan akses. CATATAN: hanya berfungsi dengan autentikasi lokal (tanpa LDAP)',
'settings_Advanced' => 'Lanjutan',
@@ -1803,6 +1810,16 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'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' => '',
@@ -1840,6 +1857,8 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'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' => '',
@@ -2035,6 +2054,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'splash_add_transmittal' => 'Menambahkan transmisi baru',
'splash_add_user' => 'Pengguna baru ditambahkan',
'splash_cancel_checkout' => 'Pembayaran dibatalkan',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '',
'splash_delete_access' => '',
@@ -2057,6 +2077,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'splash_edit_transmittal' => 'Pengiriman disimpan',
'splash_edit_user' => 'Pengguna telah disimpan',
'splash_error_add_to_transmittal' => 'Kesalahan saat menambahkan dokumen ke pengiriman',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Kesalahan saat menghapus tautan unduhan',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc
index 245f85fb4..eabd9608d 100644
--- a/languages/it_IT/lang.inc
+++ b/languages/it_IT/lang.inc
@@ -392,7 +392,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Questa è un\'area riservata. L\'accesso è consentito solo agli utenti autorizzati. Qualunque violazione sarà perseguita a norma delle leggi italiane ed internazionali.',
'discspace' => 'Spazio su disco',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documenti con ricezione senza accesso dai destinatari',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documenti in riesame senza accesso dai revisori',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
@@ -965,6 +967,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Elenco hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Elenco attività',
'local_file' => 'File locale',
'locked_by' => 'Bloccato da',
@@ -1538,6 +1541,10 @@ Name: [username]
'settings' => 'Impostazioni',
'settings_activate_module' => 'Attivazione modulo',
'settings_activate_php_extension' => 'Attivazione estensione PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP Amministratore',
'settings_adminIP_desc' => 'Se attivato l\'amministratore si può collegare solo da un IP specifico; lasciare vuoto per evitare il controllo. NOTA: funziona solo con autenticazione locale (no LDAP)',
'settings_Advanced' => 'Avanzate',
@@ -1759,6 +1766,16 @@ Name: [username]
'settings_fullSearchEngine_desc' => 'Configurazioni del sistema di ricerca a testo libero.',
'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 Ospite',
'settings_guestID_desc' => 'ID o utenza ospite utilizzata quando collegati al sito come ospite (da cambiare solo in casi eccezionali).',
'settings_guestid_is_admin' => '',
@@ -1796,6 +1813,8 @@ Name: [username]
'settings_luceneClassDir_desc' => 'Cartella del pacchetto SeedDMS_Lucene (opzionale). Lasciare il campo vuoto se SeedDMS_Lucene è stato installato in una cartella localizzabile dal PHP, ad esempio quella indicata per gli include PHP addizionali.',
'settings_luceneDir' => 'Cartella di indicizzazione fulltext',
'settings_luceneDir_desc' => 'Cartella di memorizzazione dell\'indice utilizzato da Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max numero di ID cartella',
@@ -1991,6 +2010,7 @@ Name: [username]
'splash_add_transmittal' => 'Aggiungere trasmissione',
'splash_add_user' => 'Utente aggiunto',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache cancellata',
'splash_cleared_clipboard' => 'Appunti cancellati',
'splash_delete_access' => 'Diritto d\'accesso cancellato',
@@ -2013,6 +2033,7 @@ Name: [username]
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Utente modificato',
'splash_error_add_to_transmittal' => 'Errore durante l\'aggiunta di documento per la trasmissione',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Errore durante la rimozione del collegamento di scaricamento',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Errore durante l\'invio del collegamento di scaricamento',
diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc
index d90405834..e9a4508c0 100644
--- a/languages/ko_KR/lang.inc
+++ b/languages/ko_KR/lang.inc
@@ -395,7 +395,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' => '문서',
@@ -965,6 +967,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => '로컬 파일',
'locked_by' => '잠근이',
@@ -1509,6 +1512,10 @@ URL : [url]',
'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로 만 로그인 할 경우, 컨트롤을 피하기 위해 비워 둡니다. 참고 : 로컬 인증작동 (NO LDAP)',
'settings_Advanced' => '고급',
@@ -1730,6 +1737,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' => 'Guest ID',
'settings_guestID_desc' => 'Guest로 로그인 할 때 사용하는 ID (변경이 필요치 않음)',
'settings_guestid_is_admin' => '',
@@ -1767,6 +1784,8 @@ URL : [url]',
'settings_luceneClassDir_desc' => 'SeedDMS_Lucene 경로 (선택 사항). 이이 PHP에 의해 발견 될 수있는 장소에 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',
@@ -1962,6 +1981,7 @@ URL : [url]',
'splash_add_transmittal' => '',
'splash_add_user' => '새 사용자 추가',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => '클립 보드 비우기',
'splash_delete_access' => '',
@@ -1984,6 +2004,7 @@ URL : [url]',
'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' => '',
diff --git a/languages/lo_LA/lang.inc b/languages/lo_LA/lang.inc
index c9e830f06..f3f9a138f 100644
--- a/languages/lo_LA/lang.inc
+++ b/languages/lo_LA/lang.inc
@@ -390,7 +390,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' => 'ຟື້ນທີ່ວ່າງໃນດິສ',
@@ -962,6 +964,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'ລາບການ hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'ໄຟລທ້ອງຖິນ',
'locked_by' => 'ຖູກລັອກໂດຍ',
@@ -1535,6 +1538,10 @@ URL: [url]',
'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' => 'ຂັນສູງ',
@@ -1756,6 +1763,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'ພິເສດ',
'settings_fullSearchEngine_vallucene' => 'ເສັ້ນທາງ',
'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' => '',
@@ -1793,6 +1810,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'เส้นทางไป SeedDMS_Lucene (ตัวเลือก) เว้นว่างไว้ถ้าคุณได้ติดตั้ง SeedDMS_Lucene ไว้ ณ ตำแหน่งที่ PHP สามารถพบได้เช่น PHP รวมเส้นทาง.',
'settings_luceneDir' => 'การจัดการดัชนีข้อความเต็มรูปแบบ',
'settings_luceneDir_desc' => 'เส้นทางไปยังดัชนี Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'ລະຫັດໄດເລັກທໍລີຂັນສູງ',
@@ -1988,6 +2007,7 @@ URL: [url]',
'splash_add_transmittal' => 'ເພີ່ມການສົ່ງຜ່ານ',
'splash_add_user' => 'ເພີ່ມຜູ້ໄຊ້ໄຫມ່ແລ້ວ',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'ລ້າງແຄຣແລ້ວ',
'splash_cleared_clipboard' => 'ລ້າງຄິບບອດແລ້ວ',
'splash_delete_access' => '',
@@ -2010,6 +2030,7 @@ URL: [url]',
'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' => 'ຂໍ້ຜິດພາດໃນການລົບລິງການດາວໂຫລດ',
diff --git a/languages/nb_NO/lang.inc b/languages/nb_NO/lang.inc
index cbe75f7c6..c20614a7c 100644
--- a/languages/nb_NO/lang.inc
+++ b/languages/nb_NO/lang.inc
@@ -392,7 +392,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Dette er et klassifisert område. Tilgang er bare tillatt for autorisert personell. Ethvert brudd vil bli tiltalt i henhold til nasjonale og internasjonale lover.',
'discspace' => 'Diskplass',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Dokumenter med mottak uten tilgang fra mottaker',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokumenter i revisjon uten tilgang fra korrekturleser',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -983,6 +985,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Liste hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Liste oppgaver',
'local_file' => 'Lokal fil',
'locked_by' => 'Låst av',
@@ -1548,6 +1551,10 @@ Bruker: [username]
'settings' => 'Innstillinger',
'settings_activate_module' => 'Aktiver modul',
'settings_activate_php_extension' => 'Aktiver PHP-utvidelse',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Hvis den er angitt, kan administrator bare logge på med spesifisert IP-adresse. La stå tomt for å unngå at du mister tilgangen. MERKNAD: fungerer bare med lokal autentisering (ingen LDAP)',
'settings_Advanced' => 'Avansert',
@@ -1769,6 +1776,16 @@ Bruker: [username]
'settings_fullSearchEngine_desc' => 'Angi metoden som brukes for fulltekstsøk.',
'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' => 'Gjestenavn',
'settings_guestID_desc' => 'Navn til gjestebruker som ble brukt når han er logget inn som gjest (trenger stort sett ikke å endre)',
'settings_guestid_is_admin' => '',
@@ -1806,6 +1823,8 @@ Bruker: [username]
'settings_luceneClassDir_desc' => 'Sti til SeedDMS_Lucene (valgfritt). La dette være tomt hvis du har installert SeedDMS_Lucene på et sted der det kan bli funnet av PHP, f.eks. Ekstra PHP inkluderer-bane.',
'settings_luceneDir' => 'Mappe for fulltekstindeks',
'settings_luceneDir_desc' => 'Sti til Lucene-indeksen',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Maks mappenavn',
@@ -2001,6 +2020,7 @@ Bruker: [username]
'splash_add_transmittal' => 'Lagt til overføring',
'splash_add_user' => 'Ny bruker lagt til',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache ble slettet',
'splash_cleared_clipboard' => 'Utklippstavlen ryddet',
'splash_delete_access' => 'Adgangs retten er slettet',
@@ -2023,6 +2043,7 @@ Bruker: [username]
'splash_edit_transmittal' => 'Overføring lagret',
'splash_edit_user' => 'Bruker lagret',
'splash_error_add_to_transmittal' => 'Feil under tilføyelse av dokument til overføringen',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Feil ved fjerning av nedlastingslenke',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Feil under sending av nedlastingslenke',
diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc
index c176c2089..8aba3ab3c 100644
--- a/languages/nl_NL/lang.inc
+++ b/languages/nl_NL/lang.inc
@@ -385,7 +385,9 @@ URL: [url]',
'disable_extension' => 'Schakel de extensie uit',
'disclaimer' => 'Dit is een beveiligde omgeving. Gebruik is alleen toegestaan voor geautoriseerde leden. Ongeautoriseerde toegang kan worden bestraft overeenkomstig (inter)nationale wetgeving.',
'discspace' => 'Schijfruimte',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documenten zonder toegang ontvanger',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documenten in revisie zonder toegang ontvanger',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
@@ -976,6 +978,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Taken',
'local_file' => 'Lokaal bestand',
'locked_by' => 'In gebruik door',
@@ -1547,6 +1550,10 @@ Name: [username]
'settings' => 'Instellingen',
'settings_activate_module' => 'Activeer module',
'settings_activate_php_extension' => 'Activeer PHP uitbreiding',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Beheer IP',
'settings_adminIP_desc' => 'Indien ingesteld kan de beheerder alleen vanaf het ingestelde IP adres inloggen. Leeg laten om controle te vermijden. Opmerking: Werkt alleen met lokale authenticatie (Geen LDAP)',
'settings_Advanced' => 'Uitgebreid',
@@ -1768,6 +1775,16 @@ Name: [username]
'settings_fullSearchEngine_desc' => 'Instellingen Fulltext search',
'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' => 'Gast ID',
'settings_guestID_desc' => 'ID van gastgebruiker gebruikt indien ingelogd als gast (meestal geen wijziging nodig)',
'settings_guestid_is_admin' => '',
@@ -1805,6 +1822,8 @@ Name: [username]
'settings_luceneClassDir_desc' => 'Pad naar SeedDMS_Lucene (optioneel)',
'settings_luceneDir' => 'Map voor volledigetekst index',
'settings_luceneDir_desc' => 'Pad naar Lucene index',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max Map-ID',
@@ -2000,6 +2019,7 @@ Name: [username]
'splash_add_transmittal' => 'Verzending toegevoegd',
'splash_add_user' => 'Nieuwe gebruiker toegevoegd',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache leeggemaakt',
'splash_cleared_clipboard' => 'Klembord leeg gemaakt',
'splash_delete_access' => 'Toegangsrechten verwijderd',
@@ -2022,6 +2042,7 @@ Name: [username]
'splash_edit_transmittal' => 'Zending opgeslagen',
'splash_edit_user' => 'Gebruiker opgeslagen',
'splash_error_add_to_transmittal' => 'Fout: toevoeging aan verzending',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Fout bij verwijderen download-link',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Fout bij verzenden download-link',
diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc
index a0d9eb7bc..8bb4a183e 100644
--- a/languages/pl_PL/lang.inc
+++ b/languages/pl_PL/lang.inc
@@ -380,7 +380,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'To jest zastrzeżona strefa. Dostęp do niej ma wyłącznie wyznaczony personel. Wszelkie naruszenia będą ścigane zgodnie z prawem krajowym i międzynarodowym.',
'discspace' => 'Zajęta przestrzeń dyskowa',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Dokumenty z odbiorem bez dostępu odbiorcy',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokumenty w wersji bez dostępu przez audytora',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -952,6 +954,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Lista błędów',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Lista zadań',
'local_file' => 'Lokalny plik',
'locked_by' => 'Zablokowane przez',
@@ -1478,6 +1481,10 @@ Name: [username]
'settings' => 'Ustawienia',
'settings_activate_module' => 'Aktywuj moduł',
'settings_activate_php_extension' => 'Aktywuj rozszerzenie PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Adres IP Administratora',
'settings_adminIP_desc' => 'Wprowadzenie tego adresu IP spowoduje, że administrator będzie mógł się logować tylko z tego adresu. Zostaw puste aby tego nie kontrolować. Uwaga! Działa tylko z autentykacją lokalną (nie w LDAP-ie)',
'settings_Advanced' => 'Zaawansowane',
@@ -1699,6 +1706,16 @@ Name: [username]
'settings_fullSearchEngine_desc' => 'Ustaw metodę używaną do pełnotekstowego wyszukiwania',
'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 gościa',
'settings_guestID_desc' => 'ID gościa używane kiedy gość jest zalogowany (zazwyczaj nie wymaga zmiany)',
'settings_guestid_is_admin' => '',
@@ -1736,6 +1753,8 @@ Name: [username]
'settings_luceneClassDir_desc' => 'Ścieżka do Path to SeedDMS_Lucene (opcjonalnie)',
'settings_luceneDir' => 'Katalog dla indeksu pełnotekstowego',
'settings_luceneDir_desc' => 'Ścieżka do indeksu Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Maksymalny ID katalogu',
@@ -1931,6 +1950,7 @@ Name: [username]
'splash_add_transmittal' => 'Dodano przekaz',
'splash_add_user' => 'Dodano nowego użytkownika',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Pamięć podręczna wyczyszczona',
'splash_cleared_clipboard' => 'Wyczyszczono schowek',
'splash_delete_access' => 'Prawo dostępu zostało usunięte',
@@ -1953,6 +1973,7 @@ Name: [username]
'splash_edit_transmittal' => 'Przesyłanie zapisane',
'splash_edit_user' => 'Zapisano użytkownika',
'splash_error_add_to_transmittal' => 'Błąd podczas dodawania dokumentu do przekazu',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Błąd podczas usuwania linku do pobrania',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Błąd podczas wysyłania linku do pobrania',
diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc
index bb653cc35..e20fbe32a 100644
--- a/languages/pt_BR/lang.inc
+++ b/languages/pt_BR/lang.inc
@@ -392,7 +392,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Esta é uma área restrita, o acesso é permitido apenas ao pessoal autorizado. Qualquer violação será tratado de acordo com as normas internas e leis vigentes.',
'discspace' => 'Espaço em Disco',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documentos com recepção sem acesso pelo destinatário',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documentos em revisão sem acesso por revisor',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
@@ -983,6 +985,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Listar ganchos',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'Listar tarefas',
'local_file' => 'Arquivo local',
'locked_by' => 'Bloqueado por',
@@ -1554,6 +1557,10 @@ Nome: [username]
'settings' => 'Configurações',
'settings_activate_module' => 'Ativar módulo',
'settings_activate_php_extension' => 'Ativar extensão PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP Administrador',
'settings_adminIP_desc' => 'Se definido administrador pode entrar apenas por endereço IP especificado, deixe em branco para evitar o controle. NOTA: só funciona com Autenticação local (não LDAP)',
'settings_Advanced' => 'Avançado',
@@ -1775,6 +1782,16 @@ Nome: [username]
'settings_fullSearchEngine_desc' => 'Selecione o método utilizado para a busca textual',
'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 convidado',
'settings_guestID_desc' => 'ID do usuário-convidado usada quando conectado como convidado (na maioria das vezes não há necessidade de mudar)',
'settings_guestid_is_admin' => '',
@@ -1812,6 +1829,8 @@ Nome: [username]
'settings_luceneClassDir_desc' => 'Caminho para Sistema GED_Lucene (opcional). Deixe em branco se você tiver instalado Sistema GED_Lucene em um lugar onde ele pode ser encontrado por PHP, por exemplo, PHP extras incluem-Path',
'settings_luceneDir' => 'Diretório para o índice de texto completo',
'settings_luceneDir_desc' => 'Caminho para o índice Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'ID máxima de diretório',
@@ -2007,6 +2026,7 @@ Nome: [username]
'splash_add_transmittal' => 'Transmissão adicionada',
'splash_add_user' => 'Novo usuário adicionado',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache limpo',
'splash_cleared_clipboard' => 'Área de transferência limpa',
'splash_delete_access' => 'Direito de acesso removido',
@@ -2029,6 +2049,7 @@ Nome: [username]
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Usuário salvo',
'splash_error_add_to_transmittal' => 'Erro ao adicionar documento à transmissão',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Erro ao remover o link de download',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Erro ao enviar o link de download',
diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc
index ba723ae11..94fe941b4 100644
--- a/languages/ro_RO/lang.inc
+++ b/languages/ro_RO/lang.inc
@@ -392,7 +392,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Aceasta este o zonă clasificată. Accesul este permis numai personalului autorizat. Orice încălcare va fi urmărită penal în conformitate cu legile naționale și internaționale.',
'discspace' => 'Spațiu pe disc',
+'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',
@@ -964,6 +966,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Fișier local',
'locked_by' => 'Blocat de',
@@ -1516,6 +1519,10 @@ URL: [url]',
'settings' => 'Setări',
'settings_activate_module' => 'Activați modulul',
'settings_activate_php_extension' => 'Activați extensia PHP',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP Admin',
'settings_adminIP_desc' => 'Dacă este setat, adminul se poate autentifica numai de la adresa IP specificată, lăsați gol pentru a evita controlul. NOTĂ: funcționează numai cu autentificarea locală (pe LDAP)',
'settings_Advanced' => 'Avansat',
@@ -1737,6 +1744,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'Selectează metoda folosită pentru căutarea în tot textul',
'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 oaspete',
'settings_guestID_desc' => 'ID-ul utilizatorului oaspete folosit când la Logarea ca oaspete (de cele mai multe ori nu este nevoie să se schimbe)',
'settings_guestid_is_admin' => '',
@@ -1774,6 +1791,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Calea catre SeedDMS_Lucene (optional). Lăsați gol dacă ați instalat SeedDMS_Lucene într-un loc unde poate fi găsit de PHP (exemplu: Extra PHP Include-Path)',
'settings_luceneDir' => 'Directorul pentru indexul de text integral(full text index)',
'settings_luceneDir_desc' => 'Calea catre indexul Lucene',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'ID director Maxim',
@@ -1969,6 +1988,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Utilizator nou adăugat',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Clipboard golit',
'splash_delete_access' => '',
@@ -1991,6 +2011,7 @@ URL: [url]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Utilizator salvat',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc
index 99233a6e8..c435be095 100644
--- a/languages/ru_RU/lang.inc
+++ b/languages/ru_RU/lang.inc
@@ -392,7 +392,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' => 'Документ',
@@ -964,6 +966,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Список хуков',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Локальный файл',
'locked_by' => 'Заблокирован',
@@ -1523,6 +1526,10 @@ URL: [url]',
'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' => 'Дополнительно',
@@ -1744,6 +1751,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' => '',
@@ -1781,6 +1798,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Путь к SeedDMS_Lucene (не обязательно).',
'settings_luceneDir' => 'Каталог полнотекстового индекса Lucene',
'settings_luceneDir_desc' => 'Путь, куда Lucene будет записывать свой индекс.',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Максимальный ID каталога',
@@ -1976,6 +1995,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Добавлен новый пользователь',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Буфер обмена очищен',
'splash_delete_access' => '',
@@ -1998,6 +2018,7 @@ URL: [url]',
'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' => '',
diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc
index 471e3b8be..16ca8b707 100644
--- a/languages/sk_SK/lang.inc
+++ b/languages/sk_SK/lang.inc
@@ -392,7 +392,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Toto je zabezpečená zóna. Prístup je povolený len autorizovaným osobám.',
'discspace' => 'Priestor na disku',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Documents with reception without access by recipient',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Documents in revision without access by revisor',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -983,6 +985,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'List hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => 'List tasks',
'local_file' => 'Lokálny súbor',
'locked_by' => 'Uzamkol',
@@ -1556,6 +1559,10 @@ Meno: [username]
'settings' => 'Nastavenia',
'settings_activate_module' => 'Aktivovať modul',
'settings_activate_php_extension' => 'Aktivovať PHP rozšírenie',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'IP administrátora',
'settings_adminIP_desc' => 'If set, admin can login only by specified IP address. Leave empty to avoid lose of access. NOTE: works only with local authentication (no LDAP)',
'settings_Advanced' => 'Rozšírené',
@@ -1777,6 +1784,16 @@ Meno: [username]
'settings_fullSearchEngine_desc' => 'Set the method used for the fulltext search.',
'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' => 'Hosť ID',
'settings_guestID_desc' => 'ID of guest-user used when logged in as guest (mostly no need to change)',
'settings_guestid_is_admin' => '',
@@ -1814,6 +1831,8 @@ Meno: [username]
'settings_luceneClassDir_desc' => 'Path to SeedDMS_Lucene (optional). Leave this empty if you have installed SeedDMS_Lucene at a place where it can be found by PHP, e.g. Extra PHP Include-Path',
'settings_luceneDir' => 'Directory for full text index',
'settings_luceneDir_desc' => 'Cesta do Lucene indexu',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max Zložka ID',
@@ -2009,6 +2028,7 @@ Meno: [username]
'splash_add_transmittal' => 'Added transmittal',
'splash_add_user' => 'Pridaný nový používateľ',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Vymazanie vyrovnávacej pamäte',
'splash_cleared_clipboard' => 'Schránka bola vymazaná',
'splash_delete_access' => 'Access right deleted',
@@ -2031,6 +2051,7 @@ Meno: [username]
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Používateľ bol uložený',
'splash_error_add_to_transmittal' => 'Error while adding document to transmittal',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Error when removing download link',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Error while sending download link',
diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc
index f933518c6..15707f199 100644
--- a/languages/sv_SE/lang.inc
+++ b/languages/sv_SE/lang.inc
@@ -393,7 +393,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Detta är ett sekretessbelagt område. Bara auktoriserade personer äger tillträde. Vid överträdelse kommer åtal att väckas i enlighet med nationella och internationella lagar.',
'discspace' => 'Diskutrymme',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => 'Dokument med angiven mottagare som saknar behörighet till dokumentet',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokument med angiven granskare som saknar behörighet till dokumentet',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
@@ -970,6 +972,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => 'Lista hooks',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Lokal fil',
'locked_by' => 'Låst av',
@@ -1529,6 +1532,10 @@ Kommentar: [comment]',
'settings' => 'Inställningar',
'settings_activate_module' => 'Aktivera modul',
'settings_activate_php_extension' => 'Aktivera PHP-extension',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin-IP',
'settings_adminIP_desc' => 'Om den har satts, kan administratören bara logga in från den angivna IP-adressen. Lämna detta fält tomt för att undvika begränsningar. OBS! Fungerar bara med lokal autentisering (ingen LDAP).',
'settings_Advanced' => 'Avancerat',
@@ -1750,6 +1757,16 @@ Kommentar: [comment]',
'settings_fullSearchEngine_desc' => 'Se metoder som används för fulltextsökning.',
'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' => 'Gäst-ID',
'settings_guestID_desc' => 'ID som används för inloggad gästanvändare (behöver oftast inte ändras)',
'settings_guestid_is_admin' => '',
@@ -1787,6 +1804,8 @@ Kommentar: [comment]',
'settings_luceneClassDir_desc' => 'Sökväg till LetoDMS_Lucene (valfritt)',
'settings_luceneDir' => 'Mapp för fulltext-index',
'settings_luceneDir_desc' => 'Sökväg till Lucene-index',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Max. mapp-ID',
@@ -1982,6 +2001,7 @@ Kommentar: [comment]',
'splash_add_transmittal' => 'Meddelande tillagt',
'splash_add_user' => 'Ny användare tillagd',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cachen är rensad',
'splash_cleared_clipboard' => 'Urklipp rensat',
'splash_delete_access' => '',
@@ -2004,6 +2024,7 @@ Kommentar: [comment]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Användare sparad',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => 'Fel vid borttagande av nedladdningslänk',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => 'Fel vid sändning av nedladdningslänk',
diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc
index 75f486c56..cc05cb030 100644
--- a/languages/tr_TR/lang.inc
+++ b/languages/tr_TR/lang.inc
@@ -387,7 +387,9 @@ URL: [url]',
'disable_extension' => '',
'disclaimer' => 'Bu sisteme sadece yetkilendirilmiş personel yetki seviyesine göre erişebilir. Herhangi bir ihlalde veya ihlal girişiminde, ulusal ve uluslararası yasalara göre takibat yapılacaktır.',
'discspace' => 'Disk alanı',
+'docs_in_reception_disabled' => '',
'docs_in_reception_no_access' => '',
+'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Doküman',
@@ -956,6 +958,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Yerel dosya',
'locked_by' => 'Kilitleyen',
@@ -1493,6 +1496,10 @@ URL: [url]',
'settings' => 'Ayarlar',
'settings_activate_module' => 'Modülü etkinleştir',
'settings_activate_php_extension' => 'PHP uzantısını etkinleştir',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => 'Yöneticinin sadece belli bir IP adresinden erişmesini istiyorsanız IP adresini giriniz. Kontrolü kaybetme riski olduğunu düşünüyorsanız boş bırakınız. NOT: sadece yerel yetkilendirme ile çalışır (LDAP ile çalışmaz)',
'settings_Advanced' => 'Gelişmiş ayarlar',
@@ -1714,6 +1721,16 @@ URL: [url]',
'settings_fullSearchEngine_desc' => 'Full text arama metodunu ayarlayı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' => 'Misafir ID',
'settings_guestID_desc' => 'Misafir kullanıcı için ID (genelde değiştirmek gerekmez)',
'settings_guestid_is_admin' => '',
@@ -1751,6 +1768,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'SeedDMS_Lucene yolu (isteğe bağlı). SeedDMS_Lucene\'i PHP tarafından bulunabilecek bir yere kurduysanız bu alanı boş bırakabilirsiniz. Ör. Ekstra PHP Include-Path',
'settings_luceneDir' => 'Tam metin dizini',
'settings_luceneDir_desc' => 'Lucene indeks dizini yolu',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Maks Dizin ID',
@@ -1946,6 +1965,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Yeni kullanıcı eklendi',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Pano temizlendi',
'splash_delete_access' => '',
@@ -1968,6 +1988,7 @@ URL: [url]',
'splash_edit_transmittal' => '',
'splash_edit_user' => 'Kullanıcı kaydedildi',
'splash_error_add_to_transmittal' => '',
+'splash_error_checkin_ended' => '',
'splash_error_rm_download_link' => '',
'splash_error_saving_file' => '',
'splash_error_send_download_link' => '',
diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc
index 653d01857..a6257c3a9 100644
--- a/languages/uk_UA/lang.inc
+++ b/languages/uk_UA/lang.inc
@@ -392,7 +392,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' => 'Документ',
@@ -963,6 +965,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '',
'local_file' => 'Локальний файл',
'locked_by' => 'Заблоковано',
@@ -1515,6 +1518,10 @@ URL: [url]',
'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' => 'Додатково',
@@ -1736,6 +1743,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' => '',
@@ -1773,6 +1790,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'Шлях до SeedDMS_Lucene (не обов\'язково).',
'settings_luceneDir' => 'Каталог повнотекстового індексу Lucene',
'settings_luceneDir_desc' => 'Шлях, куди Lucene буде записувати свій індекс.',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => 'Максимальний ID каталогу',
@@ -1968,6 +1987,7 @@ URL: [url]',
'splash_add_transmittal' => '',
'splash_add_user' => 'Додано нового користувача',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '',
'splash_cleared_clipboard' => 'Буфер обміну очищено',
'splash_delete_access' => '',
@@ -1990,6 +2010,7 @@ URL: [url]',
'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' => '',
diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc
index 196af2eba..e80047010 100644
--- a/languages/zh_CN/lang.inc
+++ b/languages/zh_CN/lang.inc
@@ -386,7 +386,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' => '文档',
@@ -966,6 +968,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '钩子列表',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '任务列表',
'local_file' => '本地文件',
'locked_by' => '锁定人',
@@ -1503,6 +1506,10 @@ URL: [url]',
'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' => '高级设置',
@@ -1724,6 +1731,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' => '来宾用户登录时使用的ID(基本不需要更改)',
'settings_guestid_is_admin' => '',
@@ -1761,6 +1778,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => '路径到DMS_Lucene(可选)。如果你已经在PHP可以找到的地方安装了DMS_Lucene请将此空例如Extra PHP Include-Path',
'settings_luceneDir' => '全文索引目录',
'settings_luceneDir_desc' => 'Lucene 索引路径',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => '最大目录编号',
@@ -1956,6 +1975,7 @@ URL: [url]',
'splash_add_transmittal' => '添加传输',
'splash_add_user' => '用户已添加',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => 'Cache 缓存已清理',
'splash_cleared_clipboard' => '剪贴板已清空',
'splash_delete_access' => '访问权限已删除',
@@ -1978,6 +1998,7 @@ URL: [url]',
'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' => '发送下载链接时报错',
diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc
index a1819c9c4..879e31a0a 100644
--- a/languages/zh_TW/lang.inc
+++ b/languages/zh_TW/lang.inc
@@ -392,7 +392,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' => '文件',
@@ -983,6 +985,7 @@ URL: [url]',
'list_conversion_services' => '',
'list_hooks' => '掛勾列表',
'list_notification_services' => '',
+'list_of_recipients_has_disabled_users' => '',
'list_tasks' => '工作列表',
'local_file' => '選擇檔案',
'locked_by' => '鎖定人',
@@ -1554,6 +1557,10 @@ URL: [url]',
'settings' => '設置',
'settings_activate_module' => '激活模塊',
'settings_activate_php_extension' => '激活PHP擴展',
+'settings_addManagerAsApprover' => '',
+'settings_addManagerAsApprover_desc' => '',
+'settings_addManagerAsReviewer' => '',
+'settings_addManagerAsReviewer_desc' => '',
'settings_adminIP' => 'Admin IP',
'settings_adminIP_desc' => '如果設置,則管理員只能通過指定的IP地址登錄。留空以免失去訪問權限。注意:僅適用於本地身份驗證(無LDAP)',
'settings_Advanced' => '進階',
@@ -1775,6 +1782,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' => 'Guest ID',
'settings_guestID_desc' => '以訪客身份登錄時使用的訪客用戶ID(通常無需更改)',
'settings_guestid_is_admin' => '',
@@ -1812,6 +1829,8 @@ URL: [url]',
'settings_luceneClassDir_desc' => 'SeedDMS_Lucene的路徑(可選)。如果您已在PHP可以找到SeedDMS_Lucene的位置安裝了該字段,請將該字段留空。額外的PHP包含路徑',
'settings_luceneDir' => '全文索引目錄',
'settings_luceneDir_desc' => 'Lucene索引的路徑',
+'settings_manager_approver_is_admin' => '',
+'settings_manager_reviewer_is_admin' => '',
'settings_markdownComments' => '',
'settings_markdownComments_desc' => '',
'settings_maxDirID' => '最大目錄編號',
@@ -2007,6 +2026,7 @@ URL: [url]',
'splash_add_transmittal' => '加入傳送',
'splash_add_user' => '新增新的使用者',
'splash_cancel_checkout' => '',
+'splash_checked_in' => '',
'splash_cleared_cache' => '快取清除',
'splash_cleared_clipboard' => '剪貼簿已清除',
'splash_delete_access' => '訪問權限已刪除',
@@ -2029,6 +2049,7 @@ URL: [url]',
'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' => '發送下載鏈接時出錯',
From 6f2300fdd7e379caf78d03b4c12d2312739fb3c3 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 15 Feb 2024 09:28:19 +0100
Subject: [PATCH 020/100] depend on sabre/dav 4, passwords can be shown
---
composer-dist.json | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/composer-dist.json b/composer-dist.json
index af3de13f3..ab9cc52b6 100644
--- a/composer-dist.json
+++ b/composer-dist.json
@@ -6,7 +6,9 @@
},
"require": {
- "sabre/dav": "^3.",
+ "robthree/twofactorauth": "^1.5",
+ "sabre/dav": "^4.",
+ "sabre/xml": "*",
"slim/slim": "^3.0",
"erusev/parsedown": "*",
"erusev/parsedown-extra": "*",
From 53812aa45d1773943192700f7388d05628ca1a6c Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 15 Feb 2024 09:37:43 +0100
Subject: [PATCH 021/100] checkboxes can be made invisible
---
views/bootstrap/class.Settings.php | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php
index fe7041832..f82a9ac1e 100644
--- a/views/bootstrap/class.Settings.php
+++ b/views/bootstrap/class.Settings.php
@@ -59,7 +59,14 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style {
$class = 'input-medium';
else
$class = 'input-small';
+ $html .= '';
}
return $html;
} /* }}} */
@@ -161,7 +168,14 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style {
?>
">
= getMLText($title) ?>
- {"_".$name}) echo "checked" ?> />
+
+isVisible($name))
+ echo ' {"_".$name} ? "checked" : '').' />';
+ else
+ echo getMLText('settings_conf_field_not_editable');
+ echo " \n";
+?>
Date: Thu, 15 Feb 2024 09:38:12 +0100
Subject: [PATCH 022/100] ???
---
views/bootstrap4/styles/application.js | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js
index 61c6ca455..750a563ac 100644
--- a/views/bootstrap4/styles/application.js
+++ b/views/bootstrap4/styles/application.js
@@ -284,6 +284,21 @@ $(document).ready( function() {
$($(this).data("target")+' .modal-header h3').html($(this).data("modal-title"));
});
+ $('body').on('click', '.show-hide-password a', function(ev){
+ ev.preventDefault();
+// console.log($(this).closest('input'));
+// console.log($(ev.target).parent().parent().children('input'));
+ if($('.show-hide-password input').attr("type") == "text"){
+ $('.show-hide-password input').attr('type', 'password');
+ $('.show-hide-password i').addClass( "fa-eye-slash" );
+ $('.show-hide-password i').removeClass( "fa-eye" );
+ }else if($('.show-hide-password input').attr("type") == "password"){
+ $('.show-hide-password input').attr('type', 'text');
+ $('.show-hide-password i').removeClass( "fa-eye-slash" );
+ $('.show-hide-password i').addClass( "fa-eye" );
+ }
+ });
+
// $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); });
initMost();
From 98984619f6e36129ec617559ef3d6b019ace0435 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Fri, 16 Feb 2024 08:50:09 +0100
Subject: [PATCH 023/100] add changes for 5.1.34
---
CHANGELOG | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index d818bbb29..2ac37fb2f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,11 @@
+--------------------------------------------------------------------------------
+ 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.*
+
--------------------------------------------------------------------------------
Changes in version 5.1.33
--------------------------------------------------------------------------------
From 17dbfcf2c751826c2945da5183bbbe88176b3435 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Sat, 17 Feb 2024 13:03:29 +0100
Subject: [PATCH 024/100] propperly import group names with non-printable chars
---
inc/inc.ClassLdapAuthentication.php | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/inc/inc.ClassLdapAuthentication.php b/inc/inc.ClassLdapAuthentication.php
index 987a6a4e9..ff4eb17b9 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]);
}
}
From a0b3d9da27c49ad4939781f707fab3e1012e3bfd Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Wed, 21 Feb 2024 15:33:13 +0100
Subject: [PATCH 025/100] take all mandatory reviewers/approvers into account
---
op/op.CheckInDocument.php | 14 +-
views/bootstrap/class.CheckInDocument.php | 249 ++++++++++------------
2 files changed, 123 insertions(+), 140 deletions(-)
diff --git a/op/op.CheckInDocument.php b/op/op.CheckInDocument.php
index 6b2039e31..729c769b3 100644
--- a/op/op.CheckInDocument.php
+++ b/op/op.CheckInDocument.php
@@ -144,10 +144,14 @@ else
$mreviewers = getMandatoryReviewers($folder, $user);
if($mreviewers['i'])
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
+ if($mreviewers['g'])
+ $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
}
$mapprovers = getMandatoryApprovers($folder, $user);
if($mapprovers['i'])
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
+ if($mapprovers['g'])
+ $approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
if($settings->_workflowMode == 'traditional' && !$settings->_allowReviewerOnly) {
/* Check if reviewers are send but no approvers */
@@ -156,11 +160,19 @@ else
}
}
} elseif($settings->_workflowMode == 'advanced') {
- if(!$workflow = $user->getMandatoryWorkflow()) {
+ if(!$workflows = $user->getMandatoryWorkflows()) {
if(isset($_POST["workflow"]))
$workflow = $dms->getWorkflow($_POST["workflow"]);
else
$workflow = null;
+ } else {
+ /* If there is excactly 1 mandatory workflow, then set no matter what has
+ * been posted in 'workflow', otherwise check if the posted workflow is in the
+ * list of mandatory workflows. If not, then take the first one.
+ */
+ $workflow = array_shift($workflows);
+ foreach($workflows as $mw)
+ if($mw->getID() == $_POST['workflow']) {$workflow = $mw; break;}
}
}
diff --git a/views/bootstrap/class.CheckInDocument.php b/views/bootstrap/class.CheckInDocument.php
index f2c50b693..189be994f 100644
--- a/views/bootstrap/class.CheckInDocument.php
+++ b/views/bootstrap/class.CheckInDocument.php
@@ -272,28 +272,27 @@ $(document).ready(function() {
$this->warningMsg(getMLText("add_doc_workflow_warning"));
} elseif($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') {
if($workflowmode == 'traditional') {
+ $this->contentContainerEnd();
$this->contentSubHeading(getMLText("assign_reviewers"));
- $res=$user->getMandatoryReviewers();
+ $this->contentContainerStart();
+
+ $mreviewers = getMandatoryReviewers($folder, $document, $user);
+
$options = array();
foreach ($docAccess["users"] as $usr) {
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerUserID']==$usr->getID()) $mandatory=true;
+ if(!$enablehiddenrevapp && $usr->isHidden()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mreviewers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_reviewer')));
$options[] = $option;
}
$tmp = array();
foreach($reviewStatus as $r) {
if($r['type'] == 0) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['reviewerUserID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mreviewers) {
+ if(!in_array($r['required'], $mreviewers['i']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -305,20 +304,17 @@ $(document).ready(function() {
$fieldwrap = array('', $this->getSelectPresetButtonHtml("IndReviewers", $tmp));
}
/* List all mandatory reviewers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerUserID'] > 0) {
- $u = $dms->getUser($r['reviewerUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
- if(isset($fieldwrap[1]))
- $fieldwrap[1] .= ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
- else
- $fieldwrap[1] = ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mreviewers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+
+ if($tmp) {
+ if(isset($fieldwrap[1]))
+ $fieldwrap[1] .= ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_reviewers').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -336,17 +332,15 @@ $(document).ready(function() {
);
/* Check for mandatory reviewer without access */
- foreach($res as $r) {
- if($r['reviewerUserID']) {
- $hasAccess = false;
- foreach ($docAccess["users"] as $usr) {
- if ($r['reviewerUserID']==$usr->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['reviewerUserID']);
- $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
- }
+ foreach($mreviewers['ni'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["users"] as $usr) {
+ if ($r == $usr->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessUser = $dms->getUser($r);
+ $this->warningMsg(getMLText("mandatory_reviewer_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
}
@@ -369,24 +363,17 @@ $(document).ready(function() {
$options = array();
foreach ($docAccess["groups"] as $grp) {
-
- $mandatory=false;
- foreach ($res as $r) if ($r['reviewerGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($grp->getId(), $mreviewers['g']) || !$grp->getUsers())
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer')));
$options[] = $option;
}
+
$tmp = array();
foreach($reviewStatus as $r) {
if($r['type'] == 1) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['reviewerGroupID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mreviewers) {
+ if(!in_array($r['required'], $mreviewers['g']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -398,18 +385,18 @@ $(document).ready(function() {
$fieldwrap = array('', $this->getSelectPresetButtonHtml("GrpReviewers", $tmp));
}
/* List all mandatory groups of reviewers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['reviewerGroupID'] > 0) {
- $u = $dms->getGroup($r['reviewerGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $fieldwrap[1] .= ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mreviewers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
}
+ if($tmp) {
+ if(isset($fieldwrap[1]))
+ $fieldwrap[1] .= ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_reviewergroups').': '.implode(', ', $tmp)."
\n";
+ }
+
$this->formField(
getMLText("groups"),
array(
@@ -425,44 +412,41 @@ $(document).ready(function() {
);
/* Check for mandatory reviewer group without access */
- foreach($res as $r) {
- if ($r['reviewerGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['reviewerGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
- $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mreviewers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r['reviewerGroupID']);
+ $this->warningMsg(getMLText("mandatory_reviewergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
+ $this->contentContainerEnd();
}
$this->contentSubHeading(getMLText("assign_approvers"));
- $options = array();
- $res=$user->getMandatoryApprovers();
- foreach ($docAccess["users"] as $usr) {
- if (!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
+ $this->contentContainerStart();
+
+ $mapprovers = getMandatoryApprovers($folder, $document, $user);
+
+ $options = array();
+ foreach ($docAccess["users"] as $usr) {
+ if(!$enablehiddenrevapp && $usr->isHidden()) continue;
+ if(!$enableselfrevapp && $usr->getID()==$user->getID()) continue;
- $mandatory=false;
- foreach ($res as $r) if ($r['approverUserID']==$usr->getID()) $mandatory=true;
-
$option = array($usr->getID(), htmlspecialchars($usr->getLogin()." - ".$usr->getFullName()), null);
- if ($mandatory) $option[] = array(array('disabled', 'disabled'));
+ if(in_array($usr->getId(), $mapprovers['i']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('user_is_mandatory_approver')));
$options[] = $option;
}
+
$tmp = array();
foreach($approvalStatus as $r) {
if($r['type'] == 0) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['approverUserID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
+ if($mapprovers) {
+ if(!in_array($r['required'], $mapprovers['i']))
$tmp[] = $r['required'];
} else {
$tmp[] = $r['required'];
@@ -473,18 +457,18 @@ $(document).ready(function() {
if($tmp) {
$fieldwrap = array('', $this->getSelectPresetButtonHtml("IndApprovers", $tmp));
}
+
/* List all mandatory approvers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverUserID'] > 0) {
- $u = $dms->getUser($r['approverUserID']);
- $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
- }
- }
- if($tmp) {
+ $tmp = array();
+ foreach ($mapprovers['i'] as $r) {
+ $u = $dms->getUser($r);
+ $tmp[] = htmlspecialchars($u->getFullName().' ('.$u->getLogin().')');
+ }
+ if($tmp) {
+ if(isset($fieldwrap[1]))
$fieldwrap[1] .= ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n";
- }
+ else
+ $fieldwrap[1] = ''.getMLText('mandatory_approvers').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -502,18 +486,16 @@ $(document).ready(function() {
);
/* Check for mandatory approvers without access */
- foreach($res as $r) {
- if($r['approverUserID']) {
+ foreach($mapprovers['ni'] as $r) {
$hasAccess = false;
foreach ($docAccess["users"] as $usr) {
- if ($r['approverUserID']==$usr->getID())
+ if ($r == $usr->getID())
$hasAccess = true;
}
if(!$hasAccess) {
- $noAccessUser = $dms->getUser($r['approverUserID']);
+ $noAccessUser = $dms->getUser($r);
$this->warningMsg(getMLText("mandatory_approver_no_access", array('user'=>htmlspecialchars($noAccessUser->getFullName()." (".$noAccessUser->getLogin().")"))));
}
- }
}
$options = array();
@@ -536,28 +518,18 @@ $(document).ready(function() {
$options = array();
foreach ($docAccess["groups"] as $grp) {
- $mandatory=false;
- foreach ($res as $r) if ($r['approverGroupID']==$grp->getID()) $mandatory=true;
-
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if ($mandatory || !$grp->getUsers()) $option[] = array(array('disabled', 'disabled'));
-
+ if(in_array($grp->getId(), $mapprovers['g']))
+ $option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_approver')));
$options[] = $option;
}
$tmp = array();
foreach($approvalStatus as $r) {
if($r['type'] == 1) {
- if($res) {
- $mandatory=false;
- foreach ($res as $rr)
- if ($rr['approverGroupID']==$r['required']) {
- $mandatory=true;
- }
- if(!$mandatory)
- $tmp[] = $r['required'];
- } else {
+ if(!in_array($r['required'], $mapprovers['g']))
$tmp[] = $r['required'];
- }
+ } else {
+ $tmp[] = $r['required'];
}
}
$fieldwrap = array('', '');
@@ -565,17 +537,13 @@ $(document).ready(function() {
$fieldwrap = array('', $this->getSelectPresetButtonHtml("GrpApprovers", $tmp));
}
/* List all mandatory groups of approvers */
- if($res) {
- $tmp = array();
- foreach ($res as $r) {
- if($r['approverGroupID'] > 0) {
- $u = $dms->getGroup($r['approverGroupID']);
- $tmp[] = htmlspecialchars($u->getName());
- }
- }
- if($tmp) {
- $fieldwrap[1] .= ''.getMLText('mandatory_approvergroups').': '.implode(', ', $tmp)."
\n";
- }
+ $tmp = array();
+ foreach ($mapprovers['g'] as $r) {
+ $u = $dms->getGroup($r);
+ $tmp[] = htmlspecialchars($u->getName());
+ }
+ if($tmp) {
+ $fieldwrap[1] .= ''.getMLText('mandatory_approvergroups').': '.implode(', ', $tmp)."
\n";
}
$this->formField(
@@ -593,22 +561,25 @@ $(document).ready(function() {
);
/* Check for mandatory approver groups without access */
- foreach($res as $r) {
- if ($r['approverGroupID']) {
- $hasAccess = false;
- foreach ($docAccess["groups"] as $grp) {
- if ($r['approverGroupID']==$grp->getID())
- $hasAccess = true;
- }
- if(!$hasAccess) {
- $noAccessGroup = $dms->getGroup($r['approverGroupID']);
- $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
- }
+ foreach($mapprovers['ng'] as $r) {
+ $hasAccess = false;
+ foreach ($docAccess["groups"] as $grp) {
+ if ($r == $grp->getID())
+ $hasAccess = true;
+ }
+ if(!$hasAccess) {
+ $noAccessGroup = $dms->getGroup($r);
+ $this->warningMsg(getMLText("mandatory_approvergroup_no_access", array('group'=>htmlspecialchars($noAccessGroup->getName()))));
}
}
+ $this->contentContainerEnd();
$this->warningMsg(getMLText("add_doc_reviewer_approver_warning"));
+ } else {
+ $this->contentContainerEnd();
}
if($enablereceiptworkflow) {
+ $this->contentSubHeading(getMLText("assign_recipients"));
+ $this->contentContainerStart();
$options = array();
foreach ($docAccess["users"] as $usr) {
if (!$enableselfreceipt && $usr->getID()==$user->getID()) continue;
@@ -683,8 +654,8 @@ $(document).ready(function() {
array('field_wrap'=>$fieldwrap)
);
+ $this->contentContainerEnd();
}
- $this->contentContainerEnd();
$this->formSubmit(getMLText('checkin_document'));
?>
From c5d44c3674a5cb7d35f9ddae1b4e3b52a1894a21 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Wed, 21 Feb 2024 16:04:01 +0100
Subject: [PATCH 026/100] do not add empty groups as mandatory
approver/reviewer
---
inc/inc.Utils.php | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php
index ff740d904..315e2545f 100644
--- a/inc/inc.Utils.php
+++ b/inc/inc.Utils.php
@@ -1044,6 +1044,7 @@ function cmp_user_fullname($a, $b) { /* {{{ */
* 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
@@ -1096,7 +1097,11 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
foreach($revi as $uid) {
if($u = $dms->getUser($uid)) {
/* need at least read access on parent folder */
- if($folder->getAccessMode($u) < M_READ)
+ 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())
@@ -1113,7 +1118,11 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
}
foreach($revg as $gid) {
if($g = $dms->getGroup($gid)) {
- if($folder->getGroupAccessMode($g) < M_READ)
+ 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();
@@ -1130,6 +1139,7 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
* 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
@@ -1182,7 +1192,11 @@ function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
foreach($appi as $uid) {
if($u = $dms->getUser($uid)) {
/* need at least read access on parent folder */
- if($folder->getAccessMode($u) < M_READ)
+ 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())
@@ -1199,7 +1213,11 @@ function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
}
foreach($appg as $gid) {
if($g = $dms->getGroup($gid)) {
- if($folder->getGroupAccessMode($g) < M_READ)
+ 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();
From a1a20a4c258dcfdc794e5b577822ba893817a7dc Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 22 Feb 2024 11:58:05 +0100
Subject: [PATCH 027/100] pass document to getMandatoryReviewers() and
getMandatoryApprovers()
---
op/op.CheckInDocument.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/op/op.CheckInDocument.php b/op/op.CheckInDocument.php
index 729c769b3..72f9ce03f 100644
--- a/op/op.CheckInDocument.php
+++ b/op/op.CheckInDocument.php
@@ -141,13 +141,13 @@ else
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
- $mreviewers = getMandatoryReviewers($folder, $user);
+ $mreviewers = getMandatoryReviewers($folder, $document, $user);
if($mreviewers['i'])
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
if($mreviewers['g'])
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
}
- $mapprovers = getMandatoryApprovers($folder, $user);
+ $mapprovers = getMandatoryApprovers($folder, $document, $user);
if($mapprovers['i'])
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
if($mapprovers['g'])
From 43a22ea25290f6c0284a9e68167b8c60cc85e202 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 22 Feb 2024 12:06:16 +0100
Subject: [PATCH 028/100] no need to check if group has users, because those
groups have been removed from the mandatory already
---
views/bootstrap/class.UpdateDocument.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php
index 8c485c8e8..53ec02b33 100644
--- a/views/bootstrap/class.UpdateDocument.php
+++ b/views/bootstrap/class.UpdateDocument.php
@@ -409,7 +409,7 @@ console.log(element);
$options = array();
foreach ($docAccess["groups"] as $grp) {
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if(in_array($grp->getId(), $mreviewers['g']) || !$grp->getUsers())
+ if(in_array($grp->getId(), $mreviewers['g']))
$option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer')));
$options[] = $option;
}
From 36dbc1f825063aba0b9154f371a7668c2cdf4672 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 22 Feb 2024 12:07:35 +0100
Subject: [PATCH 029/100] no need to check if group has users because it has
been remove from the mandatory groups already
---
views/bootstrap/class.CheckInDocument.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/bootstrap/class.CheckInDocument.php b/views/bootstrap/class.CheckInDocument.php
index 189be994f..cc5d8af1d 100644
--- a/views/bootstrap/class.CheckInDocument.php
+++ b/views/bootstrap/class.CheckInDocument.php
@@ -364,7 +364,7 @@ $(document).ready(function() {
$options = array();
foreach ($docAccess["groups"] as $grp) {
$option = array($grp->getID(), htmlspecialchars($grp->getName()), null);
- if(in_array($grp->getId(), $mreviewers['g']) || !$grp->getUsers())
+ if(in_array($grp->getId(), $mreviewers['g']))
$option[] = array(array('disabled', 'disabled'), array('data-subtitle', getMLText('group_is_mandatory_reviewer')));
$options[] = $option;
}
From 88452a63a1cda97d338075bfac97f5f86d6b85b4 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Thu, 29 Feb 2024 08:50:35 +0100
Subject: [PATCH 030/100] do not show form if there are no process to transfer
---
views/bootstrap/class.RemoveUserFromProcesses.php | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php
index 7fbcbfff4..1f531aed8 100644
--- a/views/bootstrap/class.RemoveUserFromProcesses.php
+++ b/views/bootstrap/class.RemoveUserFromProcesses.php
@@ -230,7 +230,6 @@ $(document).ready( function() {
$this->rowStart();
$this->columnStart(4);
- $this->warningMsg(getMLText("confirm_rm_user_from_processes", array ("username" => htmlspecialchars($rmuser->getFullName()))));
$reviewStatus = $rmuser->getReviewStatus();
$tmpr = array();
@@ -315,7 +314,8 @@ $(document).ready( function() {
getMLText('approvals_rejected_latest', array('no_approvals' => $ca["-1"]))
);
}
-
+ if($out) {
+ $this->warningMsg(getMLText("confirm_rm_user_from_processes", array ("username" => htmlspecialchars($rmuser->getFullName()))));
?>
infoMsg(getMLText("info_rm_user_from_processes_none", array ("username" => htmlspecialchars($rmuser->getFullName()))));
+ }
$this->columnEnd();
$this->columnStart(8);
echo '
';
From 83e131d677b70eb980f6d46ee1020d906899d179 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 4 Mar 2024 11:17:58 +0100
Subject: [PATCH 031/100] list of documents: output folder where document is
located
---
views/bootstrap/class.Calendar.php | 9 ++++++++-
views/bootstrap/class.Dashboard.php | 4 +++-
views/bootstrap/class.Timeline.php | 11 ++++++++---
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/views/bootstrap/class.Calendar.php b/views/bootstrap/class.Calendar.php
index 1b93f3b37..378b721ca 100644
--- a/views/bootstrap/class.Calendar.php
+++ b/views/bootstrap/class.Calendar.php
@@ -54,7 +54,14 @@ class SeedDMS_View_Calendar extends SeedDMS_Theme_Style {
else
$previewer->setConverters($previewconverters);
$document->verifyLastestContentExpriry();
- echo $this->documentListRow($document, $previewer);
+ $txt = $this->callHook('documentListItem', $document, $previewer, false, 'calendar');
+ if(is_string($txt))
+ echo $txt;
+ else {
+ $extracontent = array();
+ $extracontent['below_title'] = $this->getListRowPath($document);
+ echo $this->documentListRow($document, $previewer, 0, false, $extracontent);
+ }
echo " \n\n";
}
if($event) {
diff --git a/views/bootstrap/class.Dashboard.php b/views/bootstrap/class.Dashboard.php
index bcd52b191..c03c022b1 100644
--- a/views/bootstrap/class.Dashboard.php
+++ b/views/bootstrap/class.Dashboard.php
@@ -47,7 +47,9 @@ class SeedDMS_View_Dashboard extends SeedDMS_Theme_Style {
if(is_string($txt))
echo $txt;
else {
- echo $this->documentListRow($document, $previewer);
+ $extracontent = array();
+ $extracontent['below_title'] = $this->getListRowPath($document);
+ echo $this->documentListRow($document, $previewer, false, 0, $extracontent);
}
}
diff --git a/views/bootstrap/class.Timeline.php b/views/bootstrap/class.Timeline.php
index a23870530..17b0efd29 100644
--- a/views/bootstrap/class.Timeline.php
+++ b/views/bootstrap/class.Timeline.php
@@ -51,9 +51,14 @@ class SeedDMS_View_Timeline extends SeedDMS_Theme_Style {
$previewer->setConversionMgr($conversionmgr);
else
$previewer->setConverters($previewconverters);
- $extracontent = array();
- $extracontent['below_title'] = $this->getListRowPath($document);
- echo $this->documentListRow($document, $previewer, 0, false, $extracontent);
+ $txt = $this->callHook('documentListItem', $document, $previewer, false, 'timeline');
+ if(is_string($txt))
+ echo $txt;
+ else {
+ $extracontent = array();
+ $extracontent['below_title'] = $this->getListRowPath($document);
+ echo $this->documentListRow($document, $previewer, 0, false, $extracontent);
+ }
echo " \n\n";
}
From 84a3df2e450d9dcab96df39df4afebe0a6888d40 Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 4 Mar 2024 11:40:21 +0100
Subject: [PATCH 032/100] add entry for 5.1.34
---
CHANGELOG | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG b/CHANGELOG
index 2ac37fb2f..96a28f2ae 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@
- 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)
--------------------------------------------------------------------------------
Changes in version 5.1.33
From 2ddbc2410854470085c262ca8a0852e1371ef29a Mon Sep 17 00:00:00 2001
From: Uwe Steinmann
Date: Mon, 4 Mar 2024 18:42:29 +0100
Subject: [PATCH 033/100] remove not needed ()
---
views/bootstrap4/class.Bootstrap4.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php
index b47340aee..a0c6f3995 100644
--- a/views/bootstrap4/class.Bootstrap4.php
+++ b/views/bootstrap4/class.Bootstrap4.php
@@ -1667,7 +1667,7 @@ $(document).ready(function() {
$formid = md5($formname.$form);
$content = '';
- $content .= " getID() : "") ."\">";
+ $content .= " getID() : "") ."\">";
$content .= "