Compare commits

..

47 Commits

Author SHA1 Message Date
Uwe Steinmann
181dd2c3ff output some more data (orig filename, document id, document name) 2025-07-30 19:12:18 +02:00
Uwe Steinmann
4bba138184 add missing phrases 2025-07-30 17:36:47 +02:00
Uwe Steinmann
feaed7b49d declare class variable $stats 2025-07-30 14:33:18 +02:00
Uwe Steinmann
a194b7bc5b declare class variables 2025-07-30 14:27:54 +02:00
Uwe Steinmann
0c2f3c651a declare class variables 2025-07-30 14:27:37 +02:00
Uwe Steinmann
01f210ad43 check if user has a pwd expiration before outputing it 2025-07-30 14:27:12 +02:00
Uwe Steinmann
59fedbbcc0 fix typo, add new phrases 2025-07-30 09:43:48 +02:00
Uwe Steinmann
b6dae52f35 check orig filename only if admin 2025-07-30 09:03:13 +02:00
Uwe Steinmann
bc5ae5c74e more changes of 5.1.41 2025-07-30 08:55:19 +02:00
Uwe Steinmann
e823d918e8 add new phrases 2025-07-30 08:21:47 +02:00
Uwe Steinmann
d47b8f8adf add changes for 5.1.41 2025-07-29 21:21:44 +02:00
Uwe Steinmann
46594fa3bc allow to edit original filename 2025-07-29 21:21:05 +02:00
Uwe Steinmann
5dfd280ec5 add code for setting original filename 2025-07-29 21:18:33 +02:00
Uwe Steinmann
f20f4d2ae2 add method printInlineEditOriginalName() 2025-07-29 21:17:35 +02:00
Uwe Steinmann
2e38c8fb92 add command 'setoriginalname' 2025-07-29 21:17:04 +02:00
Uwe Steinmann
c16a9692a3 add translation for 2_fact_auth_qrcode 2025-07-25 09:51:33 +02:00
Uwe Steinmann
ae8b383def fix potential XSS attack in many fields of settings 2025-07-24 20:43:29 +02:00
Uwe Steinmann
698c82b806 add more changes of 5.1.41 2025-07-24 09:30:28 +02:00
Uwe Steinmann
29d6ece06a fix typo 2025-07-24 09:17:03 +02:00
Uwe Steinmann
83ea0e0db9 add changes for 5.1.41 2025-07-24 09:16:09 +02:00
Uwe Steinmann
ee50953d11 fix list of related documents when hook documentListItem() is implemented 2025-07-24 09:15:18 +02:00
Uwe Steinmann
cf2bb2b4c3 more documentation for method documentListRow() 2025-07-24 09:13:59 +02:00
Uwe Steinmann
5bce2fa6fd move code into controller 2025-07-23 22:53:27 +02:00
Uwe Steinmann
5c717cf6ba remove old code 2025-07-23 22:52:23 +02:00
Uwe Steinmann
04df883582 add changes for 5.1.41 2025-07-23 20:09:30 +02:00
Uwe Steinmann
ae635fba1a fix setting path to document below title 2025-07-23 20:08:21 +02:00
Uwe Steinmann
00a5f59bc3 check if attr definition exists when building a search query 2025-07-23 20:07:35 +02:00
Uwe Steinmann
593c6f5f95 check if attr definition exists when building a search query from an url 2025-07-23 20:06:34 +02:00
Uwe Steinmann
30880c0539 move sending notification into sendChangedVersionAttributesMail() 2025-07-23 20:05:57 +02:00
Uwe Steinmann
f969669356 no php warning if company of author isn't set in conf.php 2025-07-18 16:50:32 +02:00
Uwe Steinmann
45eda343d9 fix typo 2025-07-18 10:14:31 +02:00
Uwe Steinmann
82d24098aa better formating, more info for AD 2025-07-18 10:14:12 +02:00
Uwe Steinmann
911684f37f add changes for 5.1.41 2025-07-17 18:34:14 +02:00
Uwe Steinmann
bdde3f6ff5 fix getting access rights in getMandatoryReviewers() 2025-07-15 11:50:43 +02:00
Uwe Steinmann
f3181967b9 fix getting access rights in getMandatoryApprovers() 2025-07-15 11:43:45 +02:00
Uwe Steinmann
398a05ba47 break works if orig filename is too long 2025-07-07 19:53:41 +02:00
Uwe Steinmann
3c9b51c152 show number of reviewers/approvers how has done their work 2025-07-02 16:32:25 +02:00
Uwe Steinmann
4330c7fc7b add methods to show number of reviewers/approvers all ready done their work 2025-07-02 16:31:45 +02:00
Uwe Steinmann
938b417bfc add missing translations 2025-07-02 16:30:49 +02:00
Uwe Steinmann
f95ebce720 add extension for application/x-xz 2025-06-27 09:25:35 +02:00
Uwe Steinmann
ac29815974 replace array_merge by '+' when combining returned array of hooks 2025-06-25 12:58:37 +02:00
Uwe Steinmann
a74f5d9668 get options before output of select tag 2025-06-25 12:57:49 +02:00
Uwe Steinmann
aa5524ec41 export options can be get by hook 2025-06-17 07:48:13 +02:00
Uwe Steinmann
c8ac16cec3 add changes of 5.1.41 2025-05-24 16:11:54 +02:00
Uwe Steinmann
c21465f373 major update 2025-05-24 07:17:29 +02:00
Uwe Steinmann
7edd4fa0b9 action can be set when clicking on a thumbnail 2025-05-23 12:26:34 +02:00
Uwe Steinmann
1296ce3104 new version 5.1.41 2025-05-23 12:25:58 +02:00
333 changed files with 5065 additions and 19130 deletions

339
CHANGELOG
View File

@ -1,325 +1,22 @@
--------------------------------------------------------------------------------
Changes in version 6.0.33
--------------------------------------------------------------------------------
- merge changes up to 5.1.40
--------------------------------------------------------------------------------
Changes in version 6.0.32
--------------------------------------------------------------------------------
- merge changes up to 5.1.39
- fix setting attributes (user, group, document, folder) when checking in
a new document version
- validate setting revision date
--------------------------------------------------------------------------------
Changes in version 6.0.31
--------------------------------------------------------------------------------
- merge changes up to 5.1.38
- fix various restapi endpoints which hadn't been updated to slim4
--------------------------------------------------------------------------------
Changes in version 6.0.30
--------------------------------------------------------------------------------
- merge changes up to 5.1.37
- receipt comment can be disabled
- send request receipt notification only when document is released
--------------------------------------------------------------------------------
Changes in version 6.0.29
--------------------------------------------------------------------------------
- merge changes up to 5.1.36
- fix regression in FolderNotify
--------------------------------------------------------------------------------
Changes in version 6.0.28
--------------------------------------------------------------------------------
- merge changes up to 5.1.35
--------------------------------------------------------------------------------
Changes in version 6.0.27
--------------------------------------------------------------------------------
- merge changes up to 5.1.34
- Document/folder check distinguishes between documents which cannot be
receiped/revised because of access rights or the recipient/revisor being
disabled.
- fix creating user via rest api
- checkout info does not depend on whether the logged in user was substituted
- add new endpoints for managing roles by rest api
- add transmittals in menu
- add legacy access check for controllers
--------------------------------------------------------------------------------
Changes in version 6.0.26
--------------------------------------------------------------------------------
- merge changes up to 5.1.33
- add task to import files from drop folder
- add substitution of users in bootstrap4 theme
--------------------------------------------------------------------------------
Changes in version 6.0.25
--------------------------------------------------------------------------------
- merge changes up to 5.1.32
- status log can be turned on with advanced access control
- scheduler has more condensed layout
--------------------------------------------------------------------------------
Changes in version 6.0.24
--------------------------------------------------------------------------------
- add task to send list of recent changes by email
- merge changes up to 5.1.31
--------------------------------------------------------------------------------
Changes in version 6.0.23
--------------------------------------------------------------------------------
- fix setting recipients and revisors
- check in of a document is allowed for the user having done the check out
or those users with unlimited access rights on the document
- merge changes up to 5.1.30
--------------------------------------------------------------------------------
Changes in version 6.0.22
--------------------------------------------------------------------------------
- merge changes up to 5.1.29
--------------------------------------------------------------------------------
Changes in version 6.0.21
--------------------------------------------------------------------------------
- merge changes up to 5.1.28
- add new check for documents with identical sequence numbers in a folder
--------------------------------------------------------------------------------
Changes in version 6.0.20
--------------------------------------------------------------------------------
- merge changes up to 5.1.27
- fix triggering workflow (Closes: #542)
- create original file name from new document name when uploading document
from the library folder. Used to be the original file name
--------------------------------------------------------------------------------
Changes in version 6.0.19
--------------------------------------------------------------------------------
- merge changes up to 5.1.26
- fix deletion of tasks when using bootstrap4 theme
- fix deletion of documents when clicking on icon in document list (my documents)
--------------------------------------------------------------------------------
Changes in version 6.0.18
--------------------------------------------------------------------------------
- finish op/op.Cron.php, returns json
- merge changes up to 5.1.25
- fix sending trigger workflow notification (Closes: #522)
- fix updating und deleting items in document lists
- call hook 'filenameDownloadItem' in search export and transmittal download
- fix possible xss attack in UsrMgr (CVE-2022-28479)
--------------------------------------------------------------------------------
Changes in version 6.0.17
--------------------------------------------------------------------------------
- merge changes up to 5.1.24
- send notification when a receiption of a document was submitted
--------------------------------------------------------------------------------
Changes in version 6.0.16
--------------------------------------------------------------------------------
- cancel checkout needs confirmation
- add input field to filter list of recipients if more then 10
- add task for creating missing preview images
- no longer use old PHPExcel classes, use PhpOffice\PhpSpreadsheet\Spreadsheet
instead
--------------------------------------------------------------------------------
Changes in version 6.0.15
--------------------------------------------------------------------------------
- merge changes up to 5.1.22
- add a new task for checking the checksum of all document versions
- add searching for revision date
- list of open tasks will no longer contain expired documents but MyDocuments
page still list them
- fixed downloading approval file (Closes: #503)
- regular users can no longer set owner of document while uploading
--------------------------------------------------------------------------------
Changes in version 6.0.14
--------------------------------------------------------------------------------
- show debug menu only if debug mode is on
- merge changes up to 5.1.21
- document links can be added by regular users again
- add list of checked out documents to tasks
- issue a warning when removing a document which is checked out
- checked out can be discarded if it was changed
--------------------------------------------------------------------------------
Changes in version 6.0.13
--------------------------------------------------------------------------------
- merge changes up to 5.1.20
- create download file for transmittal in system tmp (Closes: #478)
- sync source code of checkin with update document
--------------------------------------------------------------------------------
Changes in version 6.0.12
--------------------------------------------------------------------------------
- merge changes up to 5.1.19
- fix various errors concerning workflows
- show menu tasks even if not admin (Closes: #485)
--------------------------------------------------------------------------------
Changes in version 6.0.11
--------------------------------------------------------------------------------
- merge changes up to 5.1.18
- fix access restriction for roles (content of documents was visible even if the
role and status didn't allow it)
- fix missing Content-Type in UserList (Closes: #480)
--------------------------------------------------------------------------------
Changes in version 6.0.10
--------------------------------------------------------------------------------
- merge changes up to 5.1.17
- fix list of previous document versions (Closes: #471)
- fix uploading files with fine uploader (Closes: #472)
- clear revision date when all revisors have been deleted
- improve scheduler task management, tasks can be deleted, fix setting parameters
- add op.Cron.php for running all scheduled tasks
--------------------------------------------------------------------------------
Changes in version 6.0.9
--------------------------------------------------------------------------------
- merge changes up to 5.1.16
- fix removal of roles (Closes: #465)
- fix password forgotten process
- fix setting role of new user and retrieving role of existing user
- processes of users can be deleted again, instead of only transfered to
another user
- fix export of search results, headers of excel file can be translated
- fix arcordeon for folder filters on search page
- fix upload from dropfolder
- fix adding new calendar event
--------------------------------------------------------------------------------
Changes in version 6.0.8
--------------------------------------------------------------------------------
- merge changes up to 5.1.15
- fix syntax error in op/op.EditComment.php
- fix use of private variable in op/op.SetRecipients.php and op/op.SetRevisors.php
- fix triggering a transition in advanced workflow mode
--------------------------------------------------------------------------------
Changes in version 6.0.7
--------------------------------------------------------------------------------
- fix editing of document attachments
- make receipt summary look like approval/review summary
- merge changes up to 5.1.14
- do not show the updating user in a revision workflow if the status is 0
this is misleading because the user starting the revision workflow is the one
first accessing the document
- rejection of document receipts are turned off by default, but can be turned
on in the settings
- documents in DocumentChooser are sorted by name
- instead of just removing a user from all processes it can be replaced by a new user
--------------------------------------------------------------------------------
Changes in version 6.0.6
--------------------------------------------------------------------------------
- fix setting attributes when checking in a new document version
- setting a document revision to 'needs correction' will no longer set the
documents status to 'needѕ correction' if this was turned off in the settings
- a document will not leave draft status when setting the approver/reviewer
without setting a reviewer/approver
- tasks to be counted in menu can be configured
- add number of documents which need correction to menu
- minor 2 factor auth. fixes when initially setting the secret
- remove ѕome unneeded code from AddDocument which just caused php warnings
- do not set the uploader of new documents to owner if the owner is different from
the uploader
- add scheduler
- add hook showVersionComment in out.ViewDocument.php
- Various minor corrections of database tables tblWorkflowLog and
tblWorkflowDocumentContent
- merge changes up to 5.1.7
--------------------------------------------------------------------------------
Changes in version 6.0.5
--------------------------------------------------------------------------------
- sync form for updating document by upload and checkin
- add list of documents which need correction on MyDocuments page
--------------------------------------------------------------------------------
Changes in version 6.0.4
--------------------------------------------------------------------------------
- merge changes up to 5.1.5
--------------------------------------------------------------------------------
Changes in version 6.0.3
--------------------------------------------------------------------------------
- add list of documents without a receiver on MyDocuments page
- propperly calculate number of documents for each value of value set in attribute mgr
- output of progress bar for reception of a document can be controlled by access list
- recipientof a document version can be set when uploading the file
- fix export of search and display of 2nd, 3rd, ... search page
- speed up creation of document lists if reception progress bar is shown
- status of rejected documents can be overriden
- do not add users from group as recipients if they are the uploader or reviewer
of a document
- add list of documents without a receiver, list of drafts, and list of absolete
documents on MyDocuments page
- add callback onCheckAccessDocument to SeedDMS_Core_Document
- add new document status 'needs correction', revised documents which do not pass
will no longer be in status 'rejected' but 'needs correction'
- better error handling when indexing documents fails
- apache xsendfile module is used for downloading documents when installed
- add view access check for ApprovalSummary, ReviewSummary, ReceiptSummary,
WorkflowSummary, DocumentAccess, GroupView, UsrView, WorkflowSummary
- filter out reviewers and uploader of a document version when setting recipients
by user group
--------------------------------------------------------------------------------
Changes in version 6.0.2
--------------------------------------------------------------------------------
- check if user has access on document and is not disabled if set as
receiver, revisor
- check if group has members if set as reviewer, approver, receiver, revisor
- fix bug in notification of approver after successful review
- add document check for docs in revision and missing access rights of revisor
- add document check for docs requiring receptions but user lacks access right
- fix Acl manager when using pgsql
- list all open tasks of user in user info of user manager
- owner of document may see review/approval/receipt/revision log
- fix sending mails to reviewer/approvers after check in
- downloading of review/approval files works again
- optimizing retrieval of open tasks
- do not show user which has been removed from a process except for admins
- show scheduled revisions in calendar
- merge changes up to 5.1.5
--------------------------------------------------------------------------------
Changes in version 6.0.1
--------------------------------------------------------------------------------
- call hook 'rawcontent' when downloading transmittal list or search content
- speed up list of locked documents on MyDocuments page
- sql queries and execution times can be written to file in database layer
--------------------------------------------------------------------------------
Changes in version 6.0.0
--------------------------------------------------------------------------------
- merge changes up to 5.0.10
- filter documents by status 'draft' on search page
- list of documents to look at now contains documents in revision
- add list of documents waiting for reception on MyDocuments page
- group document lists on MyDocuments page into three sections
- show progressbar and comments for reception of document in documentlist
- restructure page for document/folder check, add check for missing access
on documents by recipient or revisor
- overhaul revision workflow, add hook after revision workflow was finished
- add two factor authentication based on google authenticator
- set timeout for ajax call 'mytasks' from 200ms to 1000ms
- use a similar layout for document list on the ViewDocument page
- add RSS feed of timeline
- put more operations under access control
- add receipent list for documents
- add revision of documents
- add substitute user command for regular users
- add access controll list for many functions
- add document list which can be exported as an archive
- search results can be exported
Changes in version 5.1.41
--------------------------------------------------------------------------------
- action when clicking on a thumbnail can be set (download or view online)
- major update of polish translation
- fix getting access rights in getMandatoryApprovers() and getMandatoryReviewers()
- better checking for attribute definition when building a search query
- fix list of related documents when hook documentListItem() is implemented
- move EditAttributes into controller and add various hooks (like EditDocument)
- move sending notification mail when attributes are changed into
Notification Service
- more documentation on configuring LDAP
- collect output controller/view hooks with '+' instead of array_merge()
- add hook 'searchExportOptions'
- show how many users have to review/approve a document and how many did
already (in menu task list and document list)
- break long original file names on viewDocument page
- fix potential XSS attack in many fields of settings
- allow to edit original filename, check filename for problematic chars
--------------------------------------------------------------------------------
Changes in version 5.1.40

View File

@ -22,7 +22,6 @@
"pear/db": "*",
"dragonmantank/cron-expression": "^3.1",
"alecrabbit/php-console-colour": "*",
"dragonmantank/cron-expression": "^3",
"zf1/zend-search-lucene": "*",
"symfony/http-foundation": "^5.4",
"php-di/php-di": "^6.4",

View File

@ -296,7 +296,7 @@
updateNotifyTime = "86400"
extraPath = ""
maxExecutionTime = "30"
cmdTimeout = "10"
cmdTimeout = "1"
/>
<!--
- enableNotificationAppRev: set to true if reviewers and approvers shall be informed about a pending review/approval

View File

@ -52,7 +52,6 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
$sequence = $this->getParam('sequence');
$reviewers = $this->getParam('reviewers');
$approvers = $this->getParam('approvers');
$recipients = $this->getParam('recipients');
$reqversion = $this->getParam('reqversion');
$version_comment = $this->getParam('versioncomment');
$attributes = $this->getParam('attributes');
@ -161,7 +160,6 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
$workflow = $this->getParam('workflow');
$notificationgroups = $this->getParam('notificationgroups');
$notificationusers = $this->getParam('notificationusers');
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
$defaultaccessdocs = $this->getParam('defaultaccessdocs');
@ -172,7 +170,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
$cats, $userfiletmp, utf8_basename($userfilename),
$filetype, $userfiletype, $sequence,
$reviewers, $approvers, $reqversion,
$version_comment, $attributes, $attributes_version, $workflow, $initialdocumentstatus);
$version_comment, $attributes, $attributes_version, $workflow);
if (is_bool($res) && !$res) {
$this->errormsg = "error_occured";
@ -189,24 +187,6 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
}
}
$lc = $document->getLatestContent();
if($recipients) {
if($recipients['i']) {
foreach($recipients['i'] as $uid) {
if($u = $dms->getUser($uid)) {
$res = $lc->addIndRecipient($u, $user);
}
}
}
if($recipients['g']) {
foreach($recipients['g'] as $gid) {
if($g = $dms->getGroup($gid)) {
$res = $lc->addGrpRecipient($g, $user);
}
}
}
}
/* Add a default notification for the owner of the document */
if($settings->_enableOwnerNotification) {
$res = $document->addNotify($owner->getID(), true);

View File

@ -40,11 +40,6 @@ class SeedDMS_Controller_ApproveDocument extends SeedDMS_Controller_Common {
$this->oldstatus = $overallStatus['status'];
$this->newstatus = $this->oldstatus;
if(!$this->callHook('preApproveDocument', $content)) {
}
$result = $this->callHook('approveDocument', $content);
if($result === null) {
if ($approvaltype == "ind") {
$approvalLogID = $content->setApprovalByInd($user, $user, $approvalstatus, $approvalcomment, $approvalfile);
} elseif ($approvaltype == "grp") {
@ -57,10 +52,7 @@ class SeedDMS_Controller_ApproveDocument extends SeedDMS_Controller_Common {
$this->errormsg = "approval_update_failed";
return false;
}
}
$result = $this->callHook('approveUpdateDocumentStatus', $content);
if($result === null) {
if($approvalstatus == -1) {
$this->newstatus = S_REJECTED;
if($content->setStatus(S_REJECTED, $approvalcomment, $user)) {
@ -104,12 +96,6 @@ class SeedDMS_Controller_ApproveDocument extends SeedDMS_Controller_Common {
}
}
}
}
if(!$this->callHook('postApproveDocument', $content)) {
}
return true;
} /* }}} */
}

View File

@ -1,114 +0,0 @@
<?php
/**
* Implementation of CheckInDocument controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for downloading a document
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_CheckInDocument extends SeedDMS_Controller_Common {
public function run() { /* {{{ */
$name = $this->getParam('name');
$comment = $this->getParam('comment');
/* Call preCheckInDocument early, because it might need to modify some
* of the parameters.
*/
if(false === $this->callHook('preCheckInDocument', $this->params['document'])) {
if(empty($this->errormsg))
$this->errormsg = 'hook_preCheckInDocument_failed';
return null;
}
$comment = $this->getParam('comment');
$dms = $this->params['dms'];
$user = $this->params['user'];
$document = $this->params['document'];
$settings = $this->params['settings'];
$fulltextservice = $this->params['fulltextservice'];
$folder = $this->params['folder'];
$userfiletmp = $this->getParam('userfiletmp');
$userfilename = $this->getParam('userfilename');
$filetype = $this->getParam('filetype');
$userfiletype = $this->getParam('userfiletype');
$reviewers = $this->getParam('reviewers');
$approvers = $this->getParam('approvers');
$recipients = $this->getParam('recipients');
$reqversion = $this->getParam('reqversion');
$comment = $this->getParam('comment');
$attributes = $this->getParam('attributes');
$workflow = $this->getParam('workflow');
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
$content = $this->callHook('checkinDocument');
if($content === null) {
if($contentResult=$document->checkIn($comment, $user, $reviewers, $approvers, $version=0, $attributes, $workflow, $initialdocumentstatus)) {
if ($this->hasParam('expires')) {
if($document->setExpires($this->getParam('expires'))) {
} else {
}
}
if(!empty($recipients['i'])) {
foreach($recipients['i'] as $uid) {
if($u = $dms->getUser($uid)) {
$res = $contentResult->getContent()->addIndRecipient($u, $user);
}
}
}
if(!empty($recipients['g'])) {
foreach($recipients['g'] as $gid) {
if($g = $dms->getGroup($gid)) {
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
}
}
}
$content = $contentResult->getContent();
} else {
$this->errormsg = 'error_checkin_document';
$result = false;
}
} elseif($result === false) {
if(empty($this->errormsg))
$this->errormsg = 'hook_checkinDocument_failed';
return false;
}
if($fulltextservice && ($index = $fulltextservice->Indexer()) && $content) {
$idoc = $fulltextservice->IndexedDocument($document);
if(false !== $this->callHook('preIndexDocument', $document, $idoc)) {
$lucenesearch = $fulltextservice->Search();
if($hit = $lucenesearch->getDocument((int) $document->getId())) {
$index->delete($hit->id);
}
$index->addDocument($idoc);
$index->commit();
}
}
if(false === $this->callHook('postCheckInDocument', $document, $content)) {
}
return $content;
} /* }}} */
}

View File

@ -1,108 +0,0 @@
<?php
/**
* Implementation of Cron controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for the regular cron job
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_Cron extends SeedDMS_Controller_Common {
public function run() { /* {{{ */
$dms = $this->params['dms'];
$user = $this->params['user'];
$settings = $this->params['settings'];
$logger = $this->params['logger'];
$mode = $this->params['mode'];
$seltask = $this->params['task'];
$db = $dms->getDb();
$scheduler = new SeedDMS_Scheduler($db);
$tasks = $scheduler->getTasks();
$jsonarr = [];
foreach($tasks as $task) {
if($seltask && $seltask != $task->getExtension()."::".$task->getTask())
continue;
if(isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()]) && is_object($taskobj = resolveTask($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()]))) {
$arr = array(
'extension'=>$task->getExtension(),
'name'=>$task->getTask(),
'mode'=>$mode,
'disabled' => (bool) $task->getDisabled(),
'isdue' => $task->isDue(),
);
switch($mode) {
case "run":
case "dryrun":
if(method_exists($taskobj, 'execute')) {
if(!$task->getDisabled() && $task->isDue()) {
if($mode == 'run') {
/* Schedule the next run right away to prevent a second execution
* of the task when the cron job of the scheduler is called before
* the last run was finished. The task itself can still be scheduled
* to fast, but this is up to the admin of seeddms.
*/
$task->updateLastNextRun();
if($taskobj->execute($task)) {
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." successful.");
$arr['success'] = true;
} else {
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." failed, task has been disabled.", PEAR_LOG_ERR);
$arr['success'] = false;
$task->setDisabled(1);
}
} elseif($mode == 'dryrun') {
$arr['success'] = true;
}
}
}
break;
case "check":
$arr['error'] = false;
if(!method_exists($taskobj, 'execute')) {
$arr['error'] = true;
$arr['messages'][] = 'Missing method execute()';
}
if(get_parent_class($taskobj) != 'SeedDMS_SchedulerTaskBase') {
$arr['error'] = true;
$arr['error'][] = "Wrong parent class";
}
break;
case "list":
default:
header("Content-Type: application/json");
$arr['nextrun']=$task->getNextRun();
$arr['frequency']=$task->getFrequency();
$arr['params']=array();
if($params = $task->getParameter()) {
foreach($params as $key=>$value) {
$p = $taskobj->getAdditionalParamByName($key);
$arr['params'][$key] = ($p['type'] == 'password') ? '*******' : $value;
}
}
break;
}
$jsonarr[] = $arr;
}
}
echo json_encode($jsonarr);
return true;
} /* }}} */
}

View File

@ -22,8 +22,13 @@
*/
class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
public function version() { /* {{{ */
public function run() {
$dms = $this->params['dms'];
$type = $this->params['type'];
switch($type) {
case "version":
if(empty($this->params['content'])) {
$version = $this->params['version'];
$document = $this->params['document'];
if($version < 1) {
@ -43,6 +48,9 @@ class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
* expect the content in the controller
*/
$this->params['content'] = $content;
} else {
$content = $this->params['content'];
}
if(null === $this->callHook('version')) {
if(file_exists($dms->contentDir . $content->getPath())) {
header("Content-Transfer-Encoding: binary");
@ -52,162 +60,11 @@ class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
header("Cache-Control: must-revalidate");
header("ETag: ".$content->getChecksum());
sendFile($dms->contentDir . $content->getPath());
sendFile($dms->contentDir.$content->getPath());
}
}
return true;
} /* }}} */
public function file() { /* {{{ */
$dms = $this->params['dms'];
$file = $this->params['file'];
if(null === $this->callHook('file')) {
if(file_exists($dms->contentDir . $file->getPath())) {
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"" . $file->getOriginalFileName() . "\"");
header("Content-Type: " . $file->getMimeType());
header("Cache-Control: must-revalidate");
sendFile($dms->contentDir . $file->getPath());
}
}
return true;
} /* }}} */
public function archive() { /* {{{ */
$dms = $this->params['dms'];
$filename = $this->params['file'];
$basedir = $this->params['basedir'];
if(null === $this->callHook('archive')) {
if(file_exists($basedir . $filename)) {
header('Content-Description: File Transfer');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: public");
sendFile($basedir .$filename );
}
}
return true;
} /* }}} */
public function log() { /* {{{ */
$dms = $this->params['dms'];
$filename = $this->params['file'];
$basedir = $this->params['basedir'];
if(null === $this->callHook('log')) {
if(file_exists($basedir . $filename)) {
header("Content-Type: text/plain; name=\"" . $filename . "\"");
header("Content-Transfer-Encoding: binary");
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: must-revalidate");
sendFile($basedir.$filename);
}
}
return true;
} /* }}} */
public function sqldump() { /* {{{ */
$dms = $this->params['dms'];
$filename = $this->params['file'];
$basedir = $this->params['basedir'];
if(null === $this->callHook('sqldump')) {
if(file_exists($basedir . $filename)) {
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: must-revalidate");
sendFile($basedir.$filename);
}
}
return true;
} /* }}} */
public function approval() { /* {{{ */
$dms = $this->params['dms'];
$document = $this->params['document'];
$logid = $this->params['approvelogid'];
$filename = $dms->contentDir . $document->getDir().'a'.$logid;
if (!file_exists($filename) ) {
$this->error = 1;
return false;
}
if(null === $this->callHook('approval')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
header("Content-Type: ".$mimetype);
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
header("Cache-Control: must-revalidate");
sendFile($filename);
}
return true;
} /* }}} */
public function review() { /* {{{ */
$dms = $this->params['dms'];
$document = $this->params['document'];
$logid = $this->params['reviewlogid'];
$filename = $dms->contentDir . $document->getDir().'r'.$logid;
if (!file_exists($filename) ) {
$this->error = 1;
return false;
}
if(null === $this->callHook('review')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
header("Content-Type: ".$mimetype);
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename ));
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
header("Cache-Control: must-revalidate");
sendFile($filename);
}
return true;
} /* }}} */
public function run() { /* {{{ */
$dms = $this->params['dms'];
$type = $this->params['type'];
switch($type) {
case "version":
return $this->version();
break;
case "file":
return $this->file();
break;
case "archive":
return $this->archive();
break;
case "log":
return $this->log();
break;
case "sqldump":
return $this->sqldump();
break;
case "approval":
return $this->approval();
break;
case "review":
return $this->review();
break;
}
} /* }}} */
return true;
}
}

View File

@ -0,0 +1,123 @@
<?php
/**
* Implementation of EditAttributes controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for editing the version attributes
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2025 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_EditAttributes extends SeedDMS_Controller_Common {
public function run() {
$dms = $this->params['dms'];
$user = $this->params['user'];
$settings = $this->params['settings'];
$document = $this->params['document'];
$version = $this->params['version'];
if(false === $this->callHook('preEditAttributes')) {
if(empty($this->errormsg))
$this->errormsg = 'hook_preEditAttributes_failed';
return null;
}
$result = $this->callHook('editAttributes', $version);
if($result === null) {
$attributes = $this->params['attributes'];
$oldattributes = $version->getAttributes();
if($attributes) {
foreach($attributes as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
if(is_array($attribute))
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
else
$attribute = date('Y-m-d', makeTsFromDate($attribute));
break;
case SeedDMS_Core_AttributeDefinition::type_folder:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
else
$attribute = $dms->getFolder((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_document:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
else
$attribute = $dms->getDocument((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_user:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
else
$attribute = $dms->getUser((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_group:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
else
$attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, $version, false)) {
$this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
return false;
}
if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
if(!$version->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) {
//UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
return false;
}
}
} elseif($attrdef->getMinValues() > 0) {
$this->errormsg = array("attr_min_values", array("attrname"=>$attrdef->getName()));
return false;
} elseif(isset($oldattributes[$attrdefid])) {
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
// UI::exitError(getMLText("document_title", array("documentname" => $folder->getName())),getMLText("error_occured"));
return false;
}
} else {
if($ret === false)
return false;
}
}
}
}
foreach($oldattributes as $attrdefid=>$oldattribute) {
if(!isset($attributes[$attrdefid])) {
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
return false;
}
}
} elseif($result === false) {
if(empty($this->errormsg))
$this->errormsg = 'hook_editAttributes_failed';
return false;
}
if(false === $this->callHook('postEditAttributes')) {
}
return true;
}
}

View File

@ -64,16 +64,6 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
return false;
}
if($settings->_enable2FactorAuthentication) {
if($user->getSecret()) {
$tfa = new \RobThree\Auth\TwoFactorAuth('SeedDMS');
if($tfa->verifyCode($user->getSecret(), $_POST['twofactauth']) !== true) {
$this->setErrorMsg("login_error_text");
return false;
}
}
}
/* Run any additional checks which may prevent login */
if(false === $this->callHook('restrictLogin', $user)) {
if(empty($this->errormsg))

View File

@ -1,67 +0,0 @@
<?php
/**
* Implementation of ReceiptDocument controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for downloading a document
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_ReceiptDocument extends SeedDMS_Controller_Common {
public function run() {
$dms = $this->params['dms'];
$user = $this->params['user'];
$settings = $this->params['settings'];
$document = $this->params['document'];
$content = $this->params['content'];
$receiptstatus = $this->params['receiptstatus'];
$receipttype = $this->params['receipttype'];
$group = $this->params['group'];
$comment = $this->params['comment'];
/* Get the document id and name before removing the document */
$docname = $document->getName();
$documentid = $document->getID();
if(!$this->callHook('preReceiptDocument', $content)) {
}
$result = $this->callHook('receiptDocument', $content);
if($result === null) {
if ($receipttype == "ind") {
if(0 > $content->setReceiptByInd($user, $user, $receiptstatus, $comment)) {
$this->error = 1;
$this->errormsg = "receipt_update_failed";
return false;
}
} elseif ($receipttype == "grp") {
if(0 > $content->setReceiptByGrp($group, $user, $receiptstatus, $comment)) {
$this->error = 1;
$this->errormsg = "receipt_update_failed";
return false;
}
}
}
if(!$this->callHook('postReceiptDocument', $content)) {
}
return true;
}
}

View File

@ -36,11 +36,6 @@ class SeedDMS_Controller_ReviewDocument extends SeedDMS_Controller_Common {
$this->oldstatus = $overallStatus['status'];
$this->newstatus = $this->oldstatus;
if(!$this->callHook('preReviewDocument', $content)) {
}
$result = $this->callHook('reviewDocument', $content);
if($result === null) {
if ($reviewtype == "ind") {
$reviewLogID = $content->setReviewByInd($user, $user, $reviewstatus, $reviewcomment, $reviewfile);
} elseif($reviewtype == "grp") {
@ -53,10 +48,7 @@ class SeedDMS_Controller_ReviewDocument extends SeedDMS_Controller_Common {
$this->errormsg = "review_update_failed";
return false;
}
}
$result = $this->callHook('reviewUpdateDocumentStatus', $content);
if($result === null) {
if($reviewstatus == -1) {
$this->newstatus = S_REJECTED;
if($content->setStatus(S_REJECTED, $reviewcomment, $user)) {
@ -121,11 +113,6 @@ class SeedDMS_Controller_ReviewDocument extends SeedDMS_Controller_Common {
}
}
}
}
if(!$this->callHook('postReviewDocument', $content)) {
}
return true;
} /* }}} */
}

View File

@ -1,143 +0,0 @@
<?php
/**
* Implementation of ReviseDocument controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for downloading a document
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
public $oldstatus;
public $newstatus;
public function run() {
$dms = $this->params['dms'];
$user = $this->params['user'];
$settings = $this->params['settings'];
$document = $this->params['document'];
$content = $this->params['content'];
$revisionstatus = $this->params['revisionstatus'];
$revisiontype = $this->params['revisiontype'];
$group = $this->params['group'];
$comment = $this->params['comment'];
$overallStatus = $content->getStatus();
$this->oldstatus = $overallStatus['status'];
$this->newstatus = $this->oldstatus;
/* if set to true, a single reject will reject the doc. If set to false
* all revisions will be collected first and afterwards the doc is rejected
* if one has rejected it. So in the very end the doc is rejected, but
* doc remainѕ in S_IN_REVISION until all have revised the doc
*/
$onevotereject = $this->params['onevotereject'];
/* Get the document id and name before removing the document */
$docname = $document->getName();
$documentid = $document->getID();
if(!$this->callHook('preReviseDocument', $content)) {
}
$result = $this->callHook('reviseDocument', $content);
if($result === null) {
if ($revisiontype == "ind") {
if(0 > $content->setRevision($user, $user, $revisionstatus, $comment)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
}
} elseif ($revisiontype == "grp") {
if(0 > $content->setRevision($group, $user, $revisionstatus, $comment)) {
$this->error = 1;
$this->errormsg = $ll."revision_update_failed";
return false;
}
}
}
/* Check to see if the overall status for the document version needs to be
* updated.
*/
$result = $this->callHook('reviseUpdateDocumentStatus', $content);
if($result === null) {
if ($onevotereject && $revisionstatus == -1){
$this->newstatus = S_NEEDS_CORRECTION;
if(!$content->setStatus(S_NEEDS_CORRECTION,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
}
} else {
$docRevisionStatus = $content->getRevisionStatus();
if (is_bool($docRevisionStatus) && !$docRevisionStatus) {
$this->error = 1;
$this->errormsg = "cannot_retrieve_revision_snapshot";
return false;
}
$revisionok = 0;
$revisionnotok = 0;
$revisionTotal = 0;
foreach ($docRevisionStatus as $drstat) {
if ($drstat["status"] == 1) {
$revisionok++;
}
if ($drstat["status"] == -1) {
$revisionnotok++;
}
if ($drstat["status"] != -2) {
$revisionTotal++;
}
}
// If all revisions have been done and there are no rejections,
// then release the document. If all revisions have been done but some
// of them were rejections then documents needs correction.
// Otherwise put it back into revision workflow
if ($revisionok == $revisionTotal) {
$this->newstatus=S_RELEASED;
if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
if(!$this->callHook('finishReviseDocument', $content)) {
}
}
} elseif (($revisionok + $revisionnotok) == $revisionTotal) {
$this->newstatus=S_NEEDS_CORRECTION;
// if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
if(!$content->setStatus($this->newstatus,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
}
} else {
$this->newstatus=S_IN_REVISION;
if(!$content->setStatus($this->newstatus,$comment,$user)) {
$this->error = 1;
$this->errormsg = "revision_update_failed";
return false;
}
}
}
}
if(!$this->callHook('postReviseDocument', $content)) {
}
return true;
}
}

View File

@ -1,56 +0,0 @@
<?php
/**
* Implementation of Role manager controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for role manager
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_RoleMgr extends SeedDMS_Controller_Common {
public function run() {
}
public function addrole() {
$dms = $this->params['dms'];
$name = $this->params['name'];
$role = $this->params['role'];
return($dms->addRole($name, $role));
}
public function removerole() {
$roleobj = $this->params['roleobj'];
return $roleobj->remove();
}
public function editrole() {
$dms = $this->params['dms'];
$name = $this->params['name'];
$role = $this->params['role'];
$roleobj = $this->params['roleobj'];
$noaccess = $this->params['noaccess'];
if ($roleobj->getName() != $name)
$roleobj->setName($name);
if ($roleobj->getRole() != $role)
$roleobj->setRole($role);
$roleobj->setNoAccess($noaccess);
return true;
}
}

View File

@ -1,68 +0,0 @@
<?php
/**
* Implementation of Transmittal Download controller
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class which does the busines logic for downloading a transmittal
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Controller_TransmittalDownload extends SeedDMS_Controller_Common {
public function run() {
$dms = $this->params['dms'];
$user = $this->params['user'];
$transmittal = $this->params['transmittal'];
$items = $transmittal->getItems();
if($items) {
include("../inc/inc.ClassDownloadMgr.php");
$downmgr = new SeedDMS_Download_Mgr();
if($extraheader = $this->callHook('extraDownloadHeader'))
$downmgr->addHeader($extraheader);
foreach($items as $item) {
$content = $item->getContent();
$document = $content->getDocument();
if ($document->getAccessMode($user) >= M_READ) {
$extracols = $this->callHook('extraDownloadColumns', $document);
$filename = $this->callHook('filenameDownloadItem', $content);
if($rawcontent = $this->callHook('rawcontent', $content)) {
$downmgr->addItem($content, $extracols, $rawcontent, $filename);
} else
$downmgr->addItem($content, $extracols, null, $filename);
}
}
$filename = tempnam(sys_get_temp_dir(), 'transmittal-download-');
if($filename) {
if($downmgr->createArchive($filename)) {
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename));
header("Content-Disposition: attachment; filename=\"export-" .date('Y-m-d') . ".zip\"");
header("Content-Type: application/zip");
header("Cache-Control: must-revalidate");
readfile($filename);
} else {
}
unlink($filename);
}
exit;
}
}
}

View File

@ -48,18 +48,16 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
$userfiletype = $this->getParam('userfiletype');
$reviewers = $this->getParam('reviewers');
$approvers = $this->getParam('approvers');
$recipients = $this->getParam('recipients');
$reqversion = $this->getParam('reqversion');
$comment = $this->getParam('comment');
$attributes = $this->getParam('attributes');
$workflow = $this->getParam('workflow');
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
$content = $this->callHook('updateDocument');
if($content === null) {
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, 0, $attributes, $workflow, $initialdocumentstatus)) {
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, 0, $attributes, $workflow)) {
if ($this->hasParam('expires')) {
if($document->setExpires($this->getParam('expires'))) {
@ -67,21 +65,6 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
}
}
if(!empty($recipients['i'])) {
foreach($recipients['i'] as $uid) {
if($u = $dms->getUser($uid)) {
$res = $contentResult->getContent()->addIndRecipient($u, $user);
}
}
}
if(!empty($recipients['g'])) {
foreach($recipients['g'] as $gid) {
if($g = $dms->getGroup($gid)) {
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
}
}
}
$content = $contentResult->getContent();
} else {
$this->errormsg = 'error_update_document';

View File

@ -1,3 +1,3 @@
#!/bin/sh
# This command retrieves the strings that need to be translated
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php views/bootstrap/*.php |sort|uniq -c
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php|sort|uniq -c

View File

@ -1,7 +1,7 @@
<?php
/* Determine all languages keys used in the php files */
$output = array();
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php views/bootstrap/*.php|sort|uniq -c', $output)) {
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php|sort|uniq -c', $output)) {
$allkeys = array();
foreach($output as $line) {
$data = explode(' ', trim($line));
@ -9,9 +9,8 @@ if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php views/bootstrap/*.php|
}
}
$languages = array('ar_EG', 'bg_BG', 'ca_ES', 'cs_CZ', 'de_DE', 'en_GB', 'es_ES', 'fr_FR', 'hu_HU', 'it_IT', 'nl_NL', 'pl_PL', 'pt_BR', 'ro_RO', 'ru_RU', 'sk_SK', 'sv_SE', 'tr_TR', 'zh_CN', 'zh_TW');
/* Reading languages */
foreach($languages as $lang) {
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
include('languages/'.$lang.'/lang.inc');
ksort($text);
$langarr[$lang] = $text;
@ -21,7 +20,7 @@ foreach($languages as $lang) {
echo "List of missing keys\n";
echo "-----------------------------\n";
foreach(array_keys($allkeys) as $key) {
foreach($languages as $lang) {
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
if(!isset($langarr[$lang][$key])) {
echo "Missing key '".$key."' in language ".$lang."\n";
}
@ -32,7 +31,7 @@ echo "\n";
/* Check for phrases not used anymore */
echo "List of superflous keys\n";
echo "-----------------------------\n";
foreach($languages as $lang) {
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
$n = 0;
foreach($langarr[$lang] as $key=>$value) {
if(!isset($allkeys[$key])) {

View File

@ -10,25 +10,27 @@ regular ldap server, e.g. openldap
The location of the ldap server is specified in two parameters: `host` and
`port`. `host` can be either a plain hostname or an ldap URI, including the
protocol, the host and optionally the port, e.g. ldap://localhost:389. In case
protocol, the host and optionally the port, e.g. `ldap://localhost:389`. In case
of an URI the port in the configuration must remain empty.
The authentication itself is a two step process which differs, depending on how
to bind to the server. If the configuration sets 'bindDN' and 'bindPW', those
to bind to the server. If the configuration sets `bindDN` and `bindPW`, those
values will be used for a initial non anonymous bind to the ldap server
otherwise an anonymous bind is executed.
After the initial bind, a ldap search for either 'uid=<username>' (ldap) or
'sAMAccountName=<username>' (AD) below basedn is done. The purpose of this
After the initial bind, a ldap search for either `uid=<username>` (ldap) or
`sAMAccountName=<username>` (AD) below basedn is done. The purpose of this
search is to retrieve a working bindDN which is then used to actually
authenticate the user. In case of an anonymous first bind the search will
likely fail and the bindDN for the second bind will be either
'uid=<username>,<basedn>' (ldap) or '<username>@<accountDomainName>' (AD). If
the search succeeds the bindDN will be taken from the user's data in the ldap
authenticate the user. In case of a successful anonymous first bind but a
failed search (this seems to be the case when connecting to an AD), a second
non anonymous bind is tried. The bindDN for that second bind will be either
`uid=<username>,<basedn>` (ldap) or `<username>@<accountDomainName>` (AD).
If the search after the first anonymous bind succeeds, the bindDN will be
taken from the user's data in the ldap
server. This bindDN will be used for a second bind using the users password.
If the second bind succeeds the user could be successfully authenticated.
If the second bind succeeds the user is successfully authenticated.
The data from the ldap server can be used to create an account in SeedDMS
The data from the ldap server can be used to create or update an account in SeedDMS
if the user trying to login does not exist yet, but was able to authenticate.
This will only be done if 'authentication->restricted' in the configuration
is set to false. In that case the common name (cn) and email address is taken
@ -41,12 +43,37 @@ can be set with the attribute `mailField`. If it is not set it defaults to `mail
Since version 5.1.34 and 6.0.27 the groups of a user stored in the ldap directory
can be synchronised with the groups in SeedDMS. The ldap field storing
the groups can be configured with the attribute `mailField`. This will add
new groups in SeedDMS and aѕsign them to the user.
new groups in SeedDMS and assign them to the user.
Using email address for authentication
---------------------------------------
Since version 5.1.34 and 6.0.27 the email can be used for authentication
(requires `enableLoginByEmail` to be set in the configuration).
This only works if the search after the first bind succeeds, which is usually
only the case if it is a none anonymous bind.
Notes on connecting to an AD
-----------------------------
The ldap authentication was originally implemented for classic LDAP servers
like openldap. Before doing the actual authentication the user was searched
by combining the user's login name and the configured baseDN. This search was
preceded an anonymous or non anonymous bind (depending on wether bindDN and
bindPWD are set). The only purpose of that search was to retrieve the
distinguished name of the user, which was used in a second non anonymous bind
for authenticating the user. If that search fails or didn't return a record
(which seems to be always the case for an anonymous bind to an AD)
a second non anonymous bind with the user's credentials is tried. That bind
uses a dn which is quite different for classic ldap and AD (see examples
below). The dn for an AD is of the form '<username>@<domain>'. '<domain>' is
the string configured in the parameter `accountDomainName`.
Examples
---------
Anonymous bind to openldap on localhost, port 389
### Anonymous bind to openldap on localhost, port 389
- type = "ldap"
- baseDN = "ou=users,dc=mycompany,dc=de"
- host = "ldap://localhost"
@ -55,12 +82,37 @@ During authentication as user 'admin' the following steps are executed
1. connect to ldap server at localhost:389
2. do an anonymous bind
3. search for 'uid=admin' below basedn
3.1 if the bind succeeds, search for `uid=admin` below basedn
3.2 if the bind fails use `uid=admin,<basedn>` as dn and continue with step 5
4.1. if search succeeds use the dn from the user
4.2. if search fails use 'uid=admin,<basedn>' as dn
4.2. if search fails use `uid=admin,<basedn>` as dn
5. do a non anonymous bind with dn and password entered by user
6. if step 5. succeeds the use is authenticated
6. if step 5. succeeds the user is authenticated
7. if `restricted` in the settings is *not* set another ldap search for the
user is executed to retrieve the full name, and the email and if
8.1 the user doesn't exist in SeedDMS, the user will be created or
8.2 the user exists in SeedDMS, the use will be updated
If bindDN and bindPW are specified in the configuration, the second step
will be a non anonymous bind.
### Connecting to an AD
- type = "AD"
- baseDN = "ou=users,dc=mycompany,dc=de"
- accountDomainName=mycompany
- host = "ldap://localhost"
During authentication as user 'admin' the following steps are executed
1. connect to AD server at localhost:389
2. do an anonymous bind (which usually succeeds)
3. search for `uid=admin` below basedn (which usually returns an empty record)
4. if search returns no data use `admin@<accountDomainName>` as dn
5. do a non anonymous bind with dn and password entered by user
6. if step 5. succeeds the user is authenticated
7. if `restricted` in the settings is *not* set another ldap search for the
user is executed to retrieve the full name, and the email and if
8.1 the user doesn't exist in SeedDMS, the user will be created or
8.2 the user exists in SeedDMS, the use will be updated

View File

@ -126,28 +126,3 @@ op/op.TriggerWorkflow.php
op/op.UpdateDocument.php
* document was updated
subscribers of the document
op/op.ReceiptDocument.php
* document was received
subscribers of the document
op/op.ReviseDocument.php
* document was revised
subscribers of the document
op/op.SetRevisors.php
* Revisors were added/deleted
subscribers of the document
uploader of version
revisor
op/op.ReceiptDocument.php
* document was receipt
subscribers of the document
op/op.SetRecipients.php
* Recipients were added/deleted
subscribers of the document
uploader of version
recipient

View File

@ -1,26 +0,0 @@
Scheduler
==========
The scheduler in SeedDMS manages frequently run tasks. It is very similar
to regular unix cron jobs. A task in SeedDMS is an instanciation of a task
class which itself is defined by an extension or SeedDMS itself.
SeedDMS has some predefined classes e.g. core::expireddocs.
In order for tasks to be runnalbe, a user `cli_scheduler` must exists in
SeedDMS.
All tasks are executed by a single cronjob in the directory `utils`
> */5 * * * * /home/www-data/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
Please keep in mind, that the php interpreter used for the cronjob may be
different from the php interpreter used für the web application. Hence, two
different php.ini files might be used. php and the php extensions may differ as
well. This can cause some extensions to be disabled and consequently some task
classes are not defined.
`utils/seeddms-schedulercli` can also be run on the command line. If you
do that, run it with the same system user used for the web server. On Debian
this is www-data. Hence run it like
sudo -u www-data utils/seeddms-schedulercli --mode=list

View File

@ -1,42 +0,0 @@
Running the scheduler
======================
Since version 6 of SeedDMS a scheduler is implemented which runs
scheduled tasks. Such tasks must be implemented in an extension
and can be scheduled by the administrator within the user interface.
In order to check frequently for tasks ready to run, a system cron job
must be installed. On Linux this can be done by adding the following line
to the crontab
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
(Of course you need to change the path to `seeddms-schedulercli`)
This will install a cronjob running every 5 minutes. `seeddms-schedulercli` will check
for tasks ready to run and execute them in that case. You can decrease the time between
two calls of the cronjob, but keep in mind that seeddms tasks may take longer and
are being started again before the previous task has been ended.
If the configuration file of SeedDMS is not found, its path can be passed
on the command, though this should not be needed in a regular installation
obeying the directory structure of the quickstart archive.
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --config /var/www/seeddms60x/seeddms/conf/settings.xml --mode=run
For testing purposes it may be usefull to run `seeddms-schedulercli` in list mode.
seeddms-schedulercli --mode=list
This will just list all tasks and its scheduled exection time. Tasks ready to run,
because its scheduled execution time is already in the past will be marked with
a `*`. Tasks which are disabled will be marked with a `-`.
Executing `seeddms-schedulercli` in `dryrun` mode will behave just like in `run` mode
but instead of running the task it will just issue a line.
Instead of running utils/seeddms-schedulercli you may as well access
op/op.Cron.php which also runs all scheduled tasks. On Linux you do this
by setting up a cronjob like
*/5 * * * * wget -q -O - "http://<your domain>/op/op.Cron.php"

View File

@ -177,32 +177,7 @@ class SeedDMS_ExtExample_ViewFolder {
* @package SeedDMS
* @subpackage example
*/
class SeedDMS_ExtExample_Task extends SeedDMS_SchedulerTaskBase {
/**
* Run the task
*
* @param $task task to be executed
* @return boolean true if task was executed succesfully, otherwise false
*/
public function execute($task) {
$dms = $this->dms;
$user = $this->user;
$settings = $this->settings;
$logger = $this->logger;
$taskparams = $task->getParameter();
return true;
}
public function getDescription() {
return 'Description';
}
public function getAdditionalParams() {
return array(array(
'name'=>'email',
'type'=>'string',
'description'=> '',
));
class SeedDMS_ExtExample_Task {
public function execute() {
}
}

View File

@ -1,7 +1,7 @@
<?php
$EXT_CONF['example'] = array(
'title' => 'Example Extension',
'description' => 'This sample extension demonstrates the use of various hooks',
'description' => 'This sample extension demonstrate the use of various hooks',
'disable' => true,
'version' => '1.0.1',
'releasedate' => '2018-03-21',

View File

@ -1,9 +1,4 @@
<?php
$__lang['de_DE'] = array(
'folder_contents' => 'Dies war mal "Ordner enthält". Wurde von sample Extension geändert.',
'task_example_example_email' => 'Email',
);
$__lang['en_GB'] = array(
'folder_contents' => 'This used to be "Folder contents". Was changed by sample Extension.',
'task_example_example_email' => 'Email',
);

View File

@ -21,22 +21,16 @@ if (!strncmp("/op", $refer, 3)) {
} else {
$refer = urlencode($refer);
}
/* Check if this is a ajax call. In that case do not redirect to any page */
$isajax = isset($_GET['action']) && ($_GET['action'] != 'show');
if (!isset($_COOKIE["mydms_session"])) {
if($settings->_enableGuestLogin && $settings->_enableGuestAutoLogin) {
$session = new SeedDMS_Session($db);
if(!$dms_session = $session->create(array('userid'=>$settings->_guestID, 'theme'=>$settings->_theme, 'lang'=>$settings->_language))) {
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
$resArr = $session->load($dms_session);
} elseif($settings->_autoLoginUser) {
if(!($user = $dms->getUser($settings->_autoLoginUser))/* || !$user->isGuest()*/) {
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
@ -52,13 +46,11 @@ if (!isset($_COOKIE["mydms_session"])) {
}
$session = new SeedDMS_Session($db);
if(!$dms_session = $session->create(array('userid'=>$user->getID(), 'theme'=>$theme, 'lang'=>$lang))) {
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
$resArr = $session->load($dms_session);
} else {
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
@ -68,7 +60,6 @@ if (!isset($_COOKIE["mydms_session"])) {
$session = new SeedDMS_Session($db);
if(!$resArr = $session->load($dms_session)) {
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
@ -82,16 +73,13 @@ if((int)$resArr['lastAccess']+60 < time())
$user = $dms->getUser($resArr["userID"]);
if (!is_object($user)) {
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
if(!$isajax)
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
exit;
}
$origuser = null;
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
if($user->isAdmin() || $user->maySwitchToUser($su)) {
$origuser = $user;
$user = $su;
if($user->isAdmin()) {
if($resArr["su"]) {
$user = $dms->getUser($resArr["su"]);
} else {
// $session->resetSu();
}
@ -104,8 +92,6 @@ if($settings->_useHomeAsRootFolder && !$user->isAdmin() && $user->getHomeFolder(
$dms->checkWithinRootDir = true;
$dms->setRootFolderID($user->getHomeFolder());
}
$role = $user->getRole();
$dms->noReadForStatus = $role->getNoAccess();
/* Include additional language file for view
* This file must set $LANG[xx][]
@ -114,17 +100,13 @@ if(file_exists($settings->_rootDir . "view/".$theme."/languages/" . $lang . "/la
include $settings->_rootDir . "view/".$theme."/languages/" . $lang . "/lang.inc";
}
/* if this is a ajax call, then exit early as the rest of the script is irrelevant */
if($isajax)
return;
/* Check if password needs to be changed because it expired. If it needs
* to be changed redirect to out/out.ForcePasswordChange.php. Do this
* check only if password expiration is turned on, we are not on the
* page to change the password or the page that changes the password, the
* current user is not admin, and no user substitution has occured. */
if (!$user->isAdmin() && $origuser == null) {
if (!$user->isAdmin() && !$resArr['su']) {
if($settings->_passwordExpiration > 0) {
if(basename($_SERVER['SCRIPT_NAME']) != 'out.ForcePasswordChange.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.EditUserData.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Logout.php') {
$pwdexp = $user->getPwdExpiration();
@ -139,17 +121,6 @@ if (!$user->isAdmin() && $origuser == null) {
}
}
/* Check if secret is set for 2-factor authentication. Redirect to Setup2Factor.php
* if secret is not set and 2-factor authentication is turned on. Also check if
* already on the page Setup2Factor.php and no user substiation has occured.
*/
if($settings->_enable2FactorAuthentication && $settings->_guestID != $user->getID() && $settings->_autoLoginUser != $user->getID() && $origuser == null && $user->getSecret() == '') {
if(basename($_SERVER['SCRIPT_NAME']) != 'out.Setup2Factor.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Setup2Factor.php') {
header("Location: ../out/out.Setup2Factor.php");
exit;
}
}
/* Update cookie lifetime */
if($settings->_cookieLifetime) {
$lifetime = time() + intval($settings->_cookieLifetime);

View File

@ -1,41 +0,0 @@
<?php
/**
* Do authentication of users and session management
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Uwe Steinmann
* @version Release: @package_version@
*/
require_once("inc.Utils.php");
require_once("inc.ClassNotificationService.php");
require_once("inc.ClassEmailNotify.php");
require_once("inc.ClassSession.php");
require_once("inc.ClassAccessOperation.php");
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication');
exit;
} else {
if(!($user = $authenticator->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication');
exit;
}
}
/* Clear login failures if login was successful */
$user->clearLoginFailures();
$dms->setUser($user);
require_once('inc/inc.Notification.php');

View File

@ -11,8 +11,6 @@
* @version Release: @package_version@
*/
require_once "inc.ClassAcl.php";
/**
* Class to check certain access restrictions
*
@ -29,32 +27,33 @@ class SeedDMS_AccessOperation {
*/
private $dms;
/**
* @var object $obj object being accessed
* @access protected
*/
private $obj;
/**
* @var object $user user requesting the access
* @access protected
*/
protected $user;
private $user;
/**
* @var object $settings SeedDMS Settings
* @access protected
*/
protected $settings;
private $settings;
/**
* @var object $aro access request object for caching
* @access protected
*/
private $_aro;
/**
* @var array $legacy_access list of objects with access use for view and controller
* @var array $legacy_access list of objects with access
* @access protected
*/
private $legacy_access;
function __construct($dms, $user, $settings) { /* {{{ */
function __construct($dms, $obj, $user, $settings) { /* {{{ */
$this->dms = $dms;
$this->obj = $obj;
$this->user = $user;
$this->settings = $settings;
$this->legacy_access['guest'] = array(
@ -81,7 +80,6 @@ class SeedDMS_AccessOperation {
'CategoryChooser',
'ChangePassword',
'CheckInDocument',
'CheckOutDocument',
'Clipboard',
'Dashboard',
'DocumentAccess',
@ -165,15 +163,15 @@ class SeedDMS_AccessOperation {
* document may delete versions. The admin may even delete a version
* even if is disallowed in the settings.
*/
function mayEditVersion($document, $vno=0) { /* {{{ */
if($document->isType('document')) {
function mayEditVersion($vno=0) { /* {{{ */
if($this->obj->isType('document')) {
if($vno)
$version = $document->getContentByVersion($vno);
$version = $this->obj->getContentByVersion($vno);
else
$version = $document->getLatestContent();
$version = $this->obj->getLatestContent();
if (!isset($this->settings->_editOnlineFileTypes) || !is_array($this->settings->_editOnlineFileTypes) || (!in_array(strtolower($version->getFileType()), $this->settings->_editOnlineFileTypes) && !in_array(strtolower($version->getMimeType()), $this->settings->_editOnlineFileTypes)))
return false;
if ($document->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
if ($this->obj->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
return true;
}
}
@ -189,10 +187,10 @@ class SeedDMS_AccessOperation {
* document may delete versions. The admin may even delete a version
* even if is disallowed in the settings.
*/
function mayRemoveVersion($document) { /* {{{ */
if($document->isType('document')) {
$versions = $document->getContent();
if ((($this->settings->_enableVersionDeletion && ($document->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
function mayRemoveVersion() { /* {{{ */
if($this->obj->isType('document')) {
$versions = $this->obj->getContent();
if ((($this->settings->_enableVersionDeletion && ($this->obj->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
return true;
}
}
@ -209,11 +207,11 @@ class SeedDMS_AccessOperation {
* The admin may even modify the status
* even if is disallowed in the settings.
*/
function mayOverrideStatus($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function mayOverwriteStatus() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_DRAFT || $status["status"]==S_RELEASED || $status["status"]==S_REJECTED || $status["status"]==S_OBSOLETE || $status["status"]==S_NEEDS_CORRECTION)) {
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_OBSOLETE )) {
return true;
}
}
@ -228,13 +226,12 @@ class SeedDMS_AccessOperation {
* reviewers/approvers is only allowed if version modification is turned on
* in the settings and the document has not been reviewed/approved by any
* user/group already.
* The admin may even set reviewers/approvers after the review/approval
* process has been started, but only if _allowChangeRevAppInProcess
* explicitly allows it.
* The admin may even set reviewers/approvers if is disallowed in the
* settings.
*/
function maySetReviewersApprovers($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function maySetReviewersApprovers() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
$reviewstatus = $latestContent->getReviewStatus();
$hasreview = false;
@ -248,49 +245,7 @@ class SeedDMS_AccessOperation {
if($r['status'] == 1 || $r['status'] == -1)
$hasapproval = true;
}
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && (!$hasreview || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || ($status["status"]==S_DRAFT_APP && ((!$hasreview && !$hasapproval) || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || $status["status"]==S_DRAFT)) {
return true;
}
}
}
return false;
} /* }}} */
/**
* Check if recipients may be edited
*
* This check can only be done for documents. Setting the document
* recipients is only allowed if version modification is turned on
* in the settings. The
* admin may even set recipients if is disallowed in the
* settings.
*/
function maySetRecipients($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
$status = $latestContent->getStatus();
if (($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) >= M_READWRITE)) || $this->user->isAdmin()) {
return true;
}
}
}
return false;
} /* }}} */
/**
* Check if revisors may be edited
*
* This check can only be done for documents. Setting the document
* revisors is only allowed if version modification is turned on
* in the settings. The
* admin may even set revisors if is disallowed in the
* settings.
*/
function maySetRevisors($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
$status = $latestContent->getStatus();
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_IN_REVISION)) {
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && !$hasreview) || ($status["status"]==S_DRAFT_APP && !$hasreview && !$hasapproval))) {
return true;
}
}
@ -307,12 +262,12 @@ class SeedDMS_AccessOperation {
* admin may even set the workflow if is disallowed in the
* settings.
*/
function maySetWorkflow($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function maySetWorkflow() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$workflow = $latestContent->getWorkflow();
$workflowstate = $latestContent->getWorkflowState();
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
return true;
}
}
@ -326,11 +281,11 @@ class SeedDMS_AccessOperation {
* This check can only be done for documents. Setting the documents
* expiration date is only allowed if the document has not been obsoleted.
*/
function maySetExpires($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function maySetExpires() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
if ((($document->getAccessMode($this->user) >= M_READWRITE) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
if ((($this->obj->getAccessMode($this->user) == M_ALL) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
return true;
}
}
@ -347,17 +302,17 @@ class SeedDMS_AccessOperation {
* The admin may set the comment even if is
* disallowed in the settings.
*/
function mayEditComment($document) { /* {{{ */
if($document->isType('document')) {
if($document->getAccessMode($this->user) < M_READWRITE)
function mayEditComment() { /* {{{ */
if($this->obj->isType('document')) {
if($this->obj->getAccessMode($this->user) < M_READWRITE)
return false;
if($document->isLocked()) {
$lockingUser = $document->getLockingUser();
if (($lockingUser->getID() != $this->user->getID()) && ($document->getAccessMode($this->user) != M_ALL)) {
if($this->obj->isLocked()) {
$lockingUser = $this->obj->getLockingUser();
if (($lockingUser->getID() != $this->user->getID()) && ($this->obj->getAccessMode($this->user) != M_ALL)) {
return false;
}
}
if($latestContent = $document->getLatestContent()) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
if (($this->settings->_enableVersionModification || $this->user->isAdmin()) && !in_array($status["status"], array(S_OBSOLETE, S_EXPIRED))) {
return true;
@ -375,15 +330,15 @@ class SeedDMS_AccessOperation {
* the settings or the document is still in an approval/review
* or intial workflow step.
*/
function mayEditAttributes($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function mayEditAttributes() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
$workflow = $latestContent->getWorkflow();
$workflowstate = $latestContent->getWorkflowState();
if($document->getAccessMode($this->user) < M_READWRITE)
if($this->obj->getAccessMode($this->user) < M_READWRITE)
return false;
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP, S_IN_REVISION)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
return true;
}
}
@ -398,11 +353,11 @@ class SeedDMS_AccessOperation {
* review. There are other requirements which are not taken into
* account here.
*/
function mayReview($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function mayReview() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_REV) {
if ($status["status"]==S_DRAFT_REV) {
return true;
}
}
@ -416,24 +371,9 @@ class SeedDMS_AccessOperation {
* A review may only be updated by the user who originaly addedd the
* review and if it is allowed in the settings
*/
function mayUpdateReview($document, $updateUser) { /* {{{ */
if($document->isType('document')) {
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
return true;
}
}
return false;
} /* }}} */
/**
* Check if a approval maybe edited
*
* An approval may only be updated by the user who originaly addedd the
* approval and if it is allowed in the settings
*/
function mayUpdateApproval($document, $updateUser) { /* {{{ */
if($document->isType('document')) {
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
function mayUpdateReview($updateUser) { /* {{{ */
if($this->obj->isType('document')) {
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
return true;
}
}
@ -449,11 +389,11 @@ class SeedDMS_AccessOperation {
* There are other requirements which are not taken into
* account here.
*/
function mayApprove($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
function mayApprove() { /* {{{ */
if($this->obj->isType('document')) {
if($latestContent = $this->obj->getLatestContent()) {
$status = $latestContent->getStatus();
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_APP) {
if ($status["status"]==S_DRAFT_APP) {
return true;
}
}
@ -462,70 +402,14 @@ class SeedDMS_AccessOperation {
} /* }}} */
/**
* Check if document content may be receipted
* Check if a approval maybe edited
*
* Reviewing a document content is only allowed if the document was not
* obsoleted. There are other requirements which are not taken into
* account here.
* An approval may only be updated by the user who originaly addedd the
* approval and if it is allowed in the settings
*/
function mayReceipt($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
$status = $latestContent->getStatus();
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_RELEASED) {
return true;
}
}
}
return false;
} /* }}} */
/**
* Check if a review maybe edited
*
* A review may only be updated by the user who originaly addedd the
* review and if it is allowed in the settings
*/
function mayUpdateReceipt($document, $updateUser) { /* {{{ */
if($document->isType('document')) {
if($this->settings->_enableUpdateReceipt && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
return true;
}
}
return false;
} /* }}} */
/**
* Check if document content may be revised
*
* Revising a document content is only allowed if the document was not
* obsoleted. There may be other requirements which are not taken into
* account here.
*/
function mayRevise($document) { /* {{{ */
if($document->isType('document')) {
if($latestContent = $document->getLatestContent()) {
$status = $latestContent->getStatus();
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]!=S_OBSOLETE) {
return true;
}
}
}
return false;
} /* }}} */
/**
* Check if document content may be checked in
*
*
*/
function mayCheckIn($document) { /* {{{ */
if($document->isType('document')) {
$checkoutinfo = $document->getCheckOutInfo();
if(!$checkoutinfo)
return false;
$info = $checkoutinfo[0];
if($this->user->getID() == $info['userID'] || $document->getAccessMode($this->user) == M_ALL) {
function mayUpdateApproval($updateUser) { /* {{{ */
if($this->obj->isType('document')) {
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
return true;
}
}
@ -564,44 +448,11 @@ class SeedDMS_AccessOperation {
return false;
} /* }}} */
protected function check_controller_legacy_access($controller, $get=array()) { /* {{{ */
if($this->user->isAdmin())
return true;
if(is_string($controller)) {
$scripts = array($controller);
} elseif(is_array($controller)) {
$scripts = $controller;
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
$scripts = array($controller->getParam('class'));
} else {
return false;
}
if($this->user->isGuest()) {
$user_allowed = $this->legacy_access['guest'];
} else {
$user_allowed = $this->legacy_access['user'];
}
if(array_intersect($scripts, $user_allowed))
return true;
return false;
} /* }}} */
/**
* Check for access permission on view
*
* If the parameter $view is an array then each element is considered the
* name of a view and true will be returned if one of them is accessible.
* Whether access is allowed also depends on the currently logged in user
* stored in the view object. If the user is an admin the access
* on a view must be explicitly disallowed. For regular users the access
* must be explicitly allowed.
*
* If advanced access control is turn off, this function will always return
* true for admins and false for other users.
* This function will always return true because it was added to smooth
* migration from 5.1.x to 6.0.x
*
* @param mixed $view Instanz of view, name of view or array of view names
* @param string $get query parameters possible containing the element 'action'
@ -609,79 +460,20 @@ class SeedDMS_AccessOperation {
* no specific access right is set, otherwise false
*/
function check_view_access($view, $get=array()) { /* {{{ */
if(!$this->settings->_advancedAcl) {
return $this->check_view_legacy_access($view, $get);
}
if(is_string($view)) {
$scripts = array($view);
} elseif(is_array($view)) {
$scripts = $view;
} elseif(is_subclass_of($view, 'SeedDMS_View_Common')) {
$scripts = array($view->getParam('class'));
} else {
return false;
}
$scope = 'Views';
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'show';
$acl = new SeedDMS_Acl($this->dms);
if(!$this->_aro)
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
foreach($scripts as $script) {
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
$ll = $acl->check($this->_aro, $aco);
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
return true;
}
return false;
} /* }}} */
/**
* Check for access permission on controller
*
* If the parameter $controller is an array then each element is considered the
* name of a controller and true will be returned if one is accesible.
* If advanced access controll is turn off, this function will return false
* for guest users and true otherwise.
* This function will always return true because it was added to smooth
* migration from 5.1.x to 6.0.x
*
* @param mixed $controller Instanz of controller, name of controller or array of controller names
* @param string $get query parameters
* @return boolean true if access is allowed otherwise false
*/
function check_controller_access($controller, $get=array()) { /* {{{ */
if(!$this->settings->_advancedAcl) {
return $this->check_controller_legacy_access($controller, $get);
/*
if($this->user->isGuest())
return false;
elseif($this->user->isAdmin())
return true;
else {
if($controller == 'AddDocument' && isset($get['action']) && $get['action'] == 'setOwner')
return false;
return true;
}
*/
}
if(is_string($controller)) {
$scripts = array($controller);
} elseif(is_array($controller)) {
$scripts = $controller;
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
$scripts = array($controller->getParam('class'));
} else {
return false;
}
$scope = 'Controllers';
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'run';
$acl = new SeedDMS_Acl($this->dms);
if(!$this->_aro)
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
foreach($scripts as $script) {
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
$ll = $acl->check($this->_aro, $aco);
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
return true;
}
return false;
} /* }}} */
}

View File

@ -1,390 +0,0 @@
<?php
/**
* Implementation of a access control list.
*
* SeedDMS uses access control list for setting permission,
* on various operations.
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2016 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class to represent an access request object
*
* This class provides a model for access request objects.
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Acl { /* {{{ */
/**
* @var object $dms reference to dms object.
* @access public
*/
public $_dms;
/**
* Create a new instance of an acl
*
* @param object $dms object of dms
* @return object instance of SeedDMS_Acl
*/
public function __construct($dms) { /* {{{ */
$this->_dms = $dms;
} /* }}} */
/**
* Check if Aro has access on Aco
*
* @param object $aro access request object
* @param object $aco access control object
* @return integer/boolean -1 if access is explictly denied, 1 if access
* is explictly allow, 0 if no access restrictions exists, false if
* an error occured.
*/
public function check($aro, $aco) { /* {{{ */
$db = $this->_dms->getDB();
while($aco) {
$acoid = $aco->getID();
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$acoid;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return false;
if (count($resArr) == 1)
return((int) $resArr[0]['read']);
$aco = $aco->getParent();
}
return 0;
} /* }}} */
public function toggle($aro, $aco) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return false;
if (count($resArr) != 1)
return false;
$resArr = $resArr[0];
$newperm = $resArr['read'] == 1 ? -1 : 1;
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
if (!$db->getResult($queryStr))
return false;
return true;
} /* }}} */
public function add($aro, $aco, $perm=-1) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return false;
if (count($resArr) == 1) {
$resArr = $resArr[0];
$newperm = $resArr['read'] == 1 ? -1 : 1;
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
if (!$db->getResult($queryStr))
return false;
} else {
$queryStr = "INSERT INTO `tblArosAcos` (`aro`, `aco`, `read`) VALUES (".$aro->getID().", ".$aco->getID().", ".$perm.")";
if (!$db->getResult($queryStr))
return false;
}
return true;
} /* }}} */
public function remove($aro, $aco) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "DELETE FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
if (!$db->getResult($queryStr))
return false;
return true;
} /* }}} */
} /* }}} */
/**
* Class to represent an access request/controll object
*
* This class provides a model for access request/controll objects.
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_AroAco { /* {{{ */
/**
* @var object $dms reference to dms object.
* @access protected
*/
public $_dms;
/**
* @var integer id of access request object
*/
protected $_id;
/**
* @var integer id of parent of access request object
*/
protected $_parent;
/**
* @var string alias of access request object
*/
protected $_alias;
/**
* @var object object of access request object
*/
protected $_object;
/**
* Create a new instance of an aro
*
* @param object $dms object of dms
* @return object instance of SeedDMS_Aco
*/
function __construct($dms, $id, $parent, $object, $alias) { /* {{{ */
$this->_dms = $dms;
$this->_id = $id;
$this->_parent = $parent;
$this->_object = $object;
$this->_alias = $alias;
} /* }}} */
public function setDMS($dms) { /* {{{ */
$this->_dms = $dms;
} /* }}} */
public function getDMS() { /* {{{ */
return($this->_dms);
} /* }}} */
public function getID() { /* {{{ */
return $this->_id;
} /* }}} */
public function getAlias() { /* {{{ */
return $this->_alias;
} /* }}} */
public function getObject() { /* {{{ */
return $this->_object;
} /* }}} */
} /* }}} */
/**
* Class to represent an access request object
*
* This class provides a model for access request objects.
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Aro extends SeedDMS_AroAco { /* {{{ */
/**
* Create a new instance of an aro
*
* @param object $dms object to access the underlying database
* @return object instance of SeedDMS_Aro
*/
public static function getInstance($id, $dms) { /* {{{ */
$db = $dms->getDB();
if(is_int($id)) {
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . (int) $id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) != 1)
return null;
$resArr = $resArr[0];
} elseif(is_object($id)) {
if($dms->getClassname('role') == get_class($id)) {
$model = 'Role';
$queryStr = "SELECT * FROM `tblAros` WHERE `model`=".$db->qstr($model)." AND `foreignid`=".$id->getID();
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) == 0) {
$queryStr = "INSERT INTO `tblAros` (`parent`, `model`, `foreignid`) VALUES (0, ".$db->qstr($model).", ".$id->getID().")";
if (!$db->getResult($queryStr))
return null;
$id = $db->getInsertID();
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . $id;
$resArr = $db->getResultArray($queryStr);
}
$resArr = $resArr[0];
} else {
return null;
}
}
if($resArr['model'] == 'Role') {
$classname = $dms->getClassname('role');
$object = $classname::getInstance($resArr['foreignid'], $dms);
} else {
$object = null;
}
$aro = new SeedDMS_Aro($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
$aro->setDMS($dms);
return $aro;
} /* }}} */
} /* }}} */
/**
* Class to represent an access control object
*
* This class provides a model for access control objects.
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Aco extends SeedDMS_AroAco{ /* {{{ */
/**
* Create a new instance of an aco
*
* @param object $dms object to access the underlying database
* @return object instance of SeedDMS_Aco
*/
public static function getInstance($id, $dms) { /* {{{ */
$db = $dms->getDB();
if(is_int($id)) {
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . (int) $id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) == 0) {
return null;
}
$resArr = $resArr[0];
} elseif(is_string($id)) {
$tmp = explode('/', $id);
$parentid = 0;
foreach($tmp as $part) {
$queryStr = "SELECT * FROM `tblAcos` WHERE `alias` = " . $db->qstr($part);
// if($parentid)
$queryStr .= " AND parent=".$parentid;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) == 0) {
$queryStr = "INSERT INTO `tblAcos` (`parent`, `alias`, `model`) VALUES (".$parentid.",".$db->qstr($part).", '')";
if (!$db->getResult($queryStr))
return null;
$id = $db->getInsertID();
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . $id;
$resArr = $db->getResultArray($queryStr);
}
$parentid = (int) $resArr[0]['id'];
}
$resArr = $resArr[0];
}
if($resArr['model'] == 'Document') {
$classname = $dms->getClassname('document');
$object = $classname::getInstance($resArr['foreignid'], $dms);
} elseif($resArr['model'] == 'Folder') {
$classname = $dms->getClassname('focument');
$object = $classname::getInstance($resArr['foreignid'], $dms);
} else {
$object = null;
}
$aco = new SeedDMS_Aco($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
$aco->setDMS($dms);
return $aco;
} /* }}} */
public function getChildren() { /* {{{ */
$dms = $this->getDMS();
$db = $dms->getDB();
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = ".$this->_id." ORDER BY `alias`";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) == 0)
return null;
$acos = array();
foreach($resArr as $row) {
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
$aco->setDMS($dms);
$acos[] = $aco;
}
return $acos;
} /* }}} */
public function getPermission($aro) { /* {{{ */
if(!$aro)
return 0;
$dms = $this->getDMS();
$db = $dms->getDB();
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$this->_id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return false;
if (count($resArr) != 1)
return 0;
return (int) $resArr[0]['read'];
} /* }}} */
public static function getRoot($dms) { /* {{{ */
$db = $dms->getDB();
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = 0 ORDER BY `alias`";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
$acos = array();
foreach($resArr as $row) {
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
$aco->setDMS($dms);
$acos[] = $aco;
}
return $acos;
} /* }}} */
public function getParent() { /* {{{ */
$dms = $this->getDMS();
$db = $dms->getDB();
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = ".$this->_parent;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr === false)
return null;
if (count($resArr) != 1)
return null;
$row = $resArr[0];
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
$aco->setDMS($dms);
return $aco;
} /* }}} */
} /* }}} */

View File

@ -52,7 +52,6 @@ class Controller {
require_once($filename);
$controller = new $classname($params);
/* Set some configuration parameters */
$controller->setParam('class', $class);
$controller->setParam('postVars', $_POST);
$controller->setParam('getVars', $_GET);
$controller->setParam('requestVars', $_REQUEST);

View File

@ -285,7 +285,7 @@ class SeedDMS_Controller_Common {
if(is_string($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? $ret.$tmpret : array_merge($ret, array($tmpret)));
} elseif(is_array($tmpret)) { // || is_object($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? array_merge(array($ret), $tmpret) : array_merge($ret, $tmpret));
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? (array($ret) + $tmpret) : ($ret + $tmpret));
} else
$ret = $tmpret;
}
@ -317,26 +317,4 @@ class SeedDMS_Controller_Common {
}
return false;
} /* }}} */
/**
* Check if the access on the contoller with given name or the current
* controller itself may be accessed.
*
* The function requires the parameter 'accessobject' to be available in the
* controller, because it calls SeedDMS_AccessOperation::check_controller_access()
* to check access rights. If the the optional $name is not set the
* current controller is used.
*
* @param string|array $name name of controller or list of controller names
* @return boolean true if access is allowed otherwise false
*/
protected function check_access($name='') { /* {{{ */
if(!$name)
$name = $this;
if(!isset($this->params['accessobject']))
return false;
$access = $this->params['accessobject']->check_controller_access($name);
return $access;
} /* }}} */
}

View File

@ -122,6 +122,7 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
$from = $this->from_address;
}
$body = '';
if(!isset($params['__skip_header__']) || !$params['__skip_header__']) {
if(!isset($params['__header__']))
@ -279,12 +280,10 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
* The dispatching is now done in SeedDMS_NotificationService::toList()
*/
function toList($sender, $recipients, $subject, $message, $params=array()) { /* {{{ */
/*
if ((!is_object($sender) && strcasecmp(get_class($sender), $this->_dms->getClassname('user'))) ||
(!is_array($recipients) && count($recipients)==0)) {
return false;
}
*/
$ret = true;
foreach ($recipients as $recipient) {

View File

@ -148,10 +148,6 @@ class SeedDMS_Extension_Mgr {
}
} /* }}} */
public function getRepositoryUrl() { /* {{{ */
return $this->reposurl;
} /* }}} */
private function getStreamContext() { /* {{{ */
if(!$this->proxyurl)
return null;
@ -616,8 +612,8 @@ $EXT_CONF = '.var_export($EXT_CONF, true).';');
$result = array();
$vcache = array(); // keep highest version of extension
foreach($list as $e) {
if($e[0] != '#' && trim($e)) {
if($re = json_decode($e, true)) {
if($e[0] != '#') {
$re = json_decode($e, true);
if(!isset($result[$re['name']])) {
$result[$re['name']] = $re;
$vcache[$re['name']] = $re['version'];
@ -627,7 +623,6 @@ $EXT_CONF = '.var_export($EXT_CONF, true).';');
}
}
}
}
return $result;
} /* }}} */

View File

@ -233,7 +233,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
}
/* Check if user already exists in the database. Return with an error
* only if the sql statements fails, but not if no user was found.
* only if the sql statements fails, but not if the user wasn't found.
* The username may not be the one passed to this function anymore. It
* could have been overwritten by uid (or sAMAccountName) derived from
* the above ldap search.

View File

@ -51,8 +51,6 @@ class SeedDMS_NotificationService {
const RECV_APPROVER = 4;
const RECV_WORKFLOW = 5;
const RECV_UPLOADER = 6;
const RECV_REVISOR = 7;
const RECV_RECIPIENT = 8;
public function __construct($logger = null, $settings = null) { /* {{{ */
$this->services = array();
@ -685,6 +683,64 @@ class SeedDMS_NotificationService {
}
} /* }}} */
public function sendChangedVersionAttributesMail($version, $user, $oldattributes) { /* {{{ */
$document = $version->getDocument();
$dms = $document->getDMS();
$folder = $document->getFolder();
$notifyList = $document->getNotifyList();
$newattributes = $version->getAttributes();
if($oldattributes) {
foreach($oldattributes as $attrdefid=>$attribute) {
if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) {
$subject = "attribute_changed_email_subject";
$message = "attribute_changed_email_body";
$params = array();
$params['name'] = $document->getName();
$params['version'] = $version->getVersion();
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
$params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
$params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($notifyList["groups"] as $grp) {
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
}
}
}
/* Check for new attributes which didn't have a value before */
if($newattributes) {
foreach($newattributes as $attrdefid=>$attribute) {
if(!isset($oldattributes[$attrdefid]) && $attribute) {
$subject = "attribute_changed_email_subject";
$message = "attribute_changed_email_body";
$params = array();
$params['name'] = $document->getName();
$params['version'] = $version->getVersion();
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
$params['attribute_old_value'] = '';
$params['attribute_new_value'] = $attribute->getValue();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($notifyList["groups"] as $grp) {
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
}
}
}
} /* }}} */
public function sendChangedFolderAttributesMail($folder, $user, $oldattributes) { /* {{{ */
$dms = $folder->getDMS();
$notifyList = $folder->getNotifyList();
@ -1177,80 +1233,6 @@ class SeedDMS_NotificationService {
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
public function sendSubmittedReceiptMail($content, $user, $receiptlog) { /* {{{ */
$document = $content->getDocument();
$nl=$document->getNotifyList();
$folder = $document->getFolder();
$subject = "receipt_submit_email_subject";
$message = "receipt_submit_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['version'] = $content->getVersion();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['status'] = getReceiptStatusText($receiptlog["status"]);
$params['comment'] = $receiptlog['comment'];
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($nl["groups"] as $grp) {
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
/* Send mail to owner only if the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
/*
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
*/
/* Send mail to uploader of version only if the uploader is not the owner and
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
public function sendSubmittedRevisionMail($content, $user, $revisionlog) { /* {{{ */
$document = $content->getDocument();
$nl=$document->getNotifyList();
$folder = $document->getFolder();
$subject = "revision_submit_email_subject";
$message = "revision_submit_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['version'] = $content->getVersion();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['status'] = getRevisionStatusText($revisionlog["status"]);
$params['comment'] = $revisionlog['comment'];
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($nl["groups"] as $grp) {
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
/* Send mail to owner only if the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
/*
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
*/
/* Send mail to uploader of version only if the uploader is not the owner and
* the currently logged in user is not the
* owner and the owner is not already in the list of notifiers.
*/
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
} /* }}} */
public function sendDeleteApprovalMail($content, $user, $approver) { /* {{{ */
$document = $content->getDocument();
$folder = $document->getFolder();
@ -1284,11 +1266,7 @@ class SeedDMS_NotificationService {
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($reviewer->isType('user'))
$params['reviewer'] = $reviewer->getFullName();
elseif($reviewer->isType('group'))
$params['reviewer'] = $reviewer->getName();
$params['username'] = $user->getName();
$params['username'] = $user->getFullName();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
@ -1299,58 +1277,6 @@ class SeedDMS_NotificationService {
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
} /* }}} */
public function sendDeleteRevisionMail($content, $user, $revisor) { /* {{{ */
$document = $content->getDocument();
$folder = $document->getFolder();
$subject = "revision_deletion_email_subject";
$message = "revision_deletion_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($revisor->isType('user'))
$params['revisor'] = $revisor->getFullName();
elseif($revisor->isType('group'))
$params['revisor'] = $revisor->getName();
$params['username'] = $user->getFullName();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
if($revisor->isType('user'))
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
elseif($revisor->isType('group'))
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
} /* }}} */
public function sendDeleteReceiptMail($content, $user, $recipient) { /* {{{ */
$document = $content->getDocument();
$folder = $document->getFolder();
$subject = "receipt_deletion_email_subject";
$message = "receipt_deletion_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($recipient->isType('user'))
$params['recipient'] = $recipient->getFullName();
elseif($recipient->isType('group'))
$params['recipient'] = $recipient->getName();
$params['username'] = $user->getFullName();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
if($recipient->isType('user'))
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
elseif($recipient->isType('group'))
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
} /* }}} */
/**
* This notification is send if a new approver is added.
*
@ -1402,10 +1328,6 @@ class SeedDMS_NotificationService {
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($reviewer->isType('user'))
$params['reviewer'] = $reviewer->getFullName();
elseif($reviewer->isType('group'))
$params['reviewer'] = $reviewer->getName();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
@ -1417,89 +1339,6 @@ class SeedDMS_NotificationService {
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
} /* }}} */
public function sendAddRevisionMail($content, $user, $revisor) { /* {{{ */
$document = $content->getDocument();
$folder = $document->getFolder();
$subject = "revision_request_email_subject";
$message = "revision_request_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($revisor->isType('user'))
$params['revisor'] = $revisor->getFullName();
elseif($revisor->isType('group'))
$params['revisor'] = $user->getName();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
if($revisor->isType('user'))
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
elseif($revisor->isType('group'))
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
} /* }}} */
public function sendAddReceiptMail($content, $user, $recipient) { /* {{{ */
$document = $content->getDocument();
$folder = $document->getFolder();
$subject = "receipt_request_email_subject";
$message = "receipt_request_email_body";
$params = array();
$params['name'] = $document->getName();
$params['document_id'] = $document->getId();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['version'] = $content->getVersion();
$params['comment'] = $content->getComment();
if($recipient->isType('user'))
$params['recipient'] = $recipient->getFullName();
elseif($recipient->isType('group'))
$params['recipient'] = $user->getName();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $this->settings->_siteName;
$params['http_root'] = $this->settings->_httpRoot;
if($recipient->isType('user'))
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
elseif($recipient->isType('group'))
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
} /* }}} */
/**
* Send a request receipt notification to all recipients of the document content
*
* This method can be called when the status of a document content changes
* to 'released'. The recipients haven't been informed when the
* document content was created but not immediatly released.
*/
public function sendToAllReceiptMail($content, $user) { /* {{{ */
$dms = $content->getDMS();
$receiptStatus = $content->getReceiptStatus();
if (!empty($receiptStatus)) {
foreach ($receiptStatus as $r) {
if($r['status'] == 0) {
switch ($r["type"]) {
case 0: // Recipient is an individual.
if($recipient = $dms->getUser($r["required"]))
$this->sendAddReceiptMail($content, $user, $recipient);
break;
case 1: // Recipient is a group.
if($recipient = $dms->getGroup($r["required"]))
$this->sendAddReceiptMail($content, $user, $recipient);
break;
}
}
}
}
} /* }}} */
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
if($oldowner->getID() != $document->getOwner()->getID()) {
$notifyList = $document->getNotifyList();

View File

@ -1,74 +0,0 @@
<?php
/**
* Implementation of an SchedulerTask.
*
* SeedDMS can be extended by extensions. Extension usually implement
* hook.
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2018 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class to represent a SchedulerTask
*
* This class provides some very basic methods to manage extensions.
*
* @category DMS
* @package SeedDMS
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2011 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Scheduler {
/**
* Instanz of database
*/
protected $db;
public function getTask($id) { /* {{{ */
return SeedDMS_SchedulerTask::getInstance($id, $this->db);
} /* }}} */
public function getTasksByExtension($extname, $taskname) { /* {{{ */
return SeedDMS_SchedulerTask::getInstancesByExtension($extname, $taskname, $this->db);
} /* }}} */
public function getTasks() { /* {{{ */
return SeedDMS_SchedulerTask::getInstances($this->db);
} /* }}} */
public function addTask($extname, $taskname, $name, $description, $frequency, $disabled, $params) { /* {{{ */
$db = $this->db;
if(!$extname)
return false;
if(!$taskname)
return false;
try {
$cron = Cron\CronExpression::factory($frequency);
} catch (Exception $e) {
return false;
}
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
$queryStr = "INSERT INTO `tblSchedulerTask` (`extension`, `task`, `name`, `description`, `frequency`, `disabled`, `params`, `nextrun`, `lastrun`) VALUES (".$db->qstr($extname).", ".$db->qstr($taskname).", ".$db->qstr($name).", ".$db->qstr($description).", ".$db->qstr($frequency).", ".intval($disabled).", ".$db->qstr(json_encode($params)).", '".$nextrun."', NULL)";
$res = $db->getResult($queryStr);
if (!$res)
return false;
$task = SeedDMS_SchedulerTask::getInstance($db->getInsertID('tblSchedulerTask'), $db);
return $task;
} /* }}} */
function __construct($db) {
$this->db = $db;
}
}

View File

@ -1,347 +0,0 @@
<?php
/**
* Implementation of an SchedulerTask.
*
* SeedDMS can be extended by extensions. Extension usually implement
* hook.
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2018 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class to represent a SchedulerTask
*
* This class provides some very basic methods to manage extensions.
*
* @category DMS
* @package SeedDMS
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2011 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_SchedulerTask {
/**
* Instanz of database
*/
protected $db;
/**
* @var integer unique id of task
*/
protected $_id;
/**
* @var string name of task
*/
protected $_name;
/**
* @var string description of task
*/
protected $_description;
/**
* @var string extension of task
*/
protected $_extension;
/**
* @var string task of task
*/
protected $_task;
/**
* @var string frequency of task
*/
protected $_frequency;
/**
* @var integer set if disabled
*/
protected $_disabled;
/**
* @var array list of parameters
*/
protected $_params;
/**
* @var integer last run
*/
protected $_lastrun;
/**
* @var integer next run
*/
protected $_nextrun;
public static function getInstance($id, $db) { /* {{{ */
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . (int) $id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
if (count($resArr) != 1)
return null;
$row = $resArr[0];
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
$task->setDB($db);
return $task;
} /* }}} */
public static function getInstances($db) { /* {{{ */
$queryStr = "SELECT * FROM `tblSchedulerTask`";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
if (count($resArr) == 0)
return array();
$tasks = array();
foreach($resArr as $row) {
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
$task->setDB($db);
$tasks[] = $task;
}
return $tasks;
} /* }}} */
public static function getInstancesByExtension($extname, $taskname, $db) { /* {{{ */
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `extension` = '".$extname."' AND `task` = '".$taskname."'";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
if (count($resArr) == 0)
return array();
$tasks = array();
foreach($resArr as $row) {
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
$task->setDB($db);
$tasks[] = $task;
}
return $tasks;
} /* }}} */
function __construct($id, $name, $description, $extension, $task, $frequency, $disabled, $params, $nextrun, $lastrun) {
$this->_id = $id;
$this->_name = $name;
$this->_description = $description;
$this->_extension = $extension;
$this->_task = $task;
$this->_frequency = $frequency;
$this->_disabled = $disabled;
$this->_params = $params;
$this->_nextrun = $nextrun;
$this->_lastrun = $lastrun;
}
public function setDB($db) {
$this->db = $db;
}
public function getID() {
return $this->_id;
}
public function getName() {
return $this->_name;
}
public function setName($newName) { /* {{{ */
$db = $this->db;
$queryStr = "UPDATE `tblSchedulerTask` SET `name` =".$db->qstr($newName)." WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_name = $newName;
return true;
} /* }}} */
public function getDescription() {
return $this->_description;
}
public function setDescription($newDescripion) { /* {{{ */
$db = $this->db;
$queryStr = "UPDATE `tblSchedulerTask` SET `description` =".$db->qstr($newDescripion)." WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_description = $newDescripion;
return true;
} /* }}} */
public function getExtension() {
return $this->_extension;
}
public function getTask() {
return $this->_task;
}
public function getFrequency() {
return $this->_frequency;
}
public function setFrequency($newFrequency) { /* {{{ */
$db = $this->db;
try {
$cron = Cron\CronExpression::factory($newFrequency);
} catch (Exception $e) {
return false;
}
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
$queryStr = "UPDATE `tblSchedulerTask` SET `frequency` =".$db->qstr($newFrequency).", `nextrun` = '".$nextrun."' WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_frequency = $newFrequency;
$this->_nextrun = $nextrun;
return true;
} /* }}} */
public function getNextRun() {
return $this->_nextrun;
}
public function getLastRun() {
return $this->_lastrun;
}
public function getDisabled() {
return $this->_disabled;
}
public function setDisabled($newDisabled) { /* {{{ */
$db = $this->db;
$queryStr = "UPDATE `tblSchedulerTask` SET `disabled` =".intval($newDisabled)." WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_disabled = $newDisabled;
return true;
} /* }}} */
public function setParameter($newParams) { /* {{{ */
$db = $this->db;
$queryStr = "UPDATE `tblSchedulerTask` SET `params` =".$db->qstr(json_encode($newParams))." WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_params = $newParams;
return true;
} /* }}} */
public function getParameter($name = '') {
if($name)
return isset($this->_params[$name]) ? $this->_params[$name] : null;
return $this->_params;
}
/**
* Check if task is due
*
* This methods compares the current time with the time in the database
* field `nextrun`.
* If nextrun is smaller than the current time, the the task is due.
* The methode does not rely on the value in the class variable `_nextrun`,
* because that value could be 'very old', retrieved at a time
* when the task list was fetched for checking due tasks e.g. by the
* scheduler client. There is good reason to always take the current
* value of nextrun from the database.
*
* Assuming there are two tasks. Task 1 takes 13 mins and task 2 takes only
* 30 sec. Task 1 is run every hour and task 2 starts at 8:06. The cronjob
* runs every 5 min. At e.g. 8:00 the list of tasks is read from the database
* task 1 is due and starts running and before it runs it sets the database
* field nextrun to 9:00. Task 2 isn't due at that time.
* At 8:05 the cron job runs again, task 1 has already a new nextrun value
* and will not run again. Task 2 isn't due yet and task 1 started at 8:00 is
* still running.
* At 8:10 task 1 is still running an not due again, but task 2 is due and
* will be run. The database field `nextrun` of task 2 will be set to 8:06
* on the next day.
* At 8:13 task 1 which started at 8:00 is finished and the list of tasks
* from that time will be processed further. Task 2 still has the old value
* in the class variable `_nextrun` (8:06 the current day),
* though the database field `nextrun` has been updated in
* between. Taking the value of the class variable would rerun task 2 again,
* though it ran at 8:10 already.
* That's why this method always takes the current value of nextrun
* from the database.
*
* @return boolean true if task is due, otherwise false
*/
public function isDue() {
$db = $this->db;
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
if (count($resArr) != 1)
return false;
$row = $resArr[0];
$this->_nextrun = $row['nextrun'];
return $this->_nextrun < date('Y-m-d H:i:s');
}
public function updateLastNextRun() {
$db = $this->db;
$lastrun = date('Y-m-d H:i:s');
try {
$cron = Cron\CronExpression::factory($this->_frequency);
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
} catch (Exception $e) {
$nextrun = null;
}
$queryStr = "UPDATE `tblSchedulerTask` SET `lastrun`=".$db->qstr($lastrun).", `nextrun`=".($nextrun ? $db->qstr($nextrun) : "NULL")." WHERE `id` = " . $this->_id;
$res = $db->getResult($queryStr);
if (!$res)
return false;
$this->_lastrun = $lastrun;
$this->_nextrun = $nextrun;
}
/**
* Delete task
*
* @return boolean true on success or false in case of an error
*/
function remove() { /* {{{ */
$db = $this->db;
$queryStr = "DELETE FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
if (!$db->getResult($queryStr)) {
return false;
}
return true;
} /* }}} */
}

View File

@ -1,139 +0,0 @@
<?php
/***************************************************************
* Copyright notice
*
* (c) 2018 Uwe Steinmann <uwe@steinmann.cx>
* All rights reserved
*
* This script is part of the SeedDMS project. The SeedDMS project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* Base class for scheduler task
*
* @author Uwe Steinmann <uwe@steinmann.cx>
* @package SeedDMS
*/
class SeedDMS_SchedulerTaskBase {
var $dms;
var $user;
var $settings;
var $logger;
var $fulltextservice;
var $notifier;
var $conversionmgr;
/**
* Call a hook with a given name
*
* Checks if a hook with the given name and for the current task
* exists and executes it. The name of the current task is taken
* from the current class name by lower casing the first char.
* This function will execute all registered hooks in the order
* they were registered.
*
* Attention: as func_get_arg() cannot handle references passed to the hook,
* callHook() should not be called if that is required. In that case get
* a list of hook objects with getHookObjects() and call the hooks yourself.
*
* @params string $hook name of hook
* @return string concatenated string, merged arrays or whatever the hook
* function returns
*/
public function callHook($hook) { /* {{{ */
$tmps = array();
$tmp = explode('_', get_class($this));
$tmps[] = $tmp[1];
$tmp = explode('_', get_parent_class($this));
$tmps[] = $tmp[1];
/* Run array_unique() in case the parent class has the same suffix */
$tmps = array_unique($tmps);
$ret = null;
foreach($tmps as $tmp)
if(isset($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)] as $hookObj) {
if (method_exists($hookObj, $hook)) {
switch(func_num_args()) {
case 1:
$tmpret = $hookObj->$hook($this);
break;
case 2:
$tmpret = $hookObj->$hook($this, func_get_arg(1));
break;
case 3:
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2));
break;
case 4:
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3));
break;
default:
case 5:
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3), func_get_arg(4));
break;
}
if($tmpret !== null) {
if(is_string($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? $ret.$tmpret : array_merge($ret, array($tmpret)));
} elseif(is_array($tmpret) || is_object($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? array_merge(array($ret), $tmpret) : array_merge($ret, $tmpret));
} else
$ret = $tmpret;
}
}
}
}
return $ret;
} /* }}} */
public function __construct($dms=null, $user=null, $settings=null, $logger=null, $fulltextservice=null, $notifier=null, $conversionmgr=null) { /* {{{ */
$this->dms = $dms;
$this->user = $user;
$this->settings = $settings;
$this->logger = $logger;
$this->fulltextservice = $fulltextservice;
$this->notifier = $notifier;
$this->conversionmgr = $conversionmgr;
} /* }}} */
public function execute(SeedDMS_SchedulerTask $task) { /* {{{ */
return true;
} /* }}} */
public function getDescription() { /* {{{ */
return '';
} /* }}} */
public function getAdditionalParams() { /* {{{ */
return array();
} /* }}} */
public function getAdditionalParamByName($name) { /* {{{ */
foreach($this->getAdditionalParams() as $param) {
if($param['name'] == $name)
return $param;
}
return null;
} /* }}} */
}
?>

View File

@ -45,8 +45,6 @@ class Settings { /* {{{ */
var $_enableGuestLogin = false;
// If you even want guest to be logged in automatically, set the following to true
var $_enableGuestAutoLogin = false;
// Set to true for 2-factor Authentication
var $_enable2FactorAuthentication = false;
// If you want to allow login by email, set the following to true
var $_enableLoginByEmail = false;
// Allow users to reset their password
@ -118,12 +116,6 @@ class Settings { /* {{{ */
var $_dropFolderDir = null;
// Where the backup directory is located
var $_backupDir = null;
// Where the library folder is located
var $_libraryFolder = 1;
// Where the checked out files are located
var $_checkOutDir = null;
// Create checkout dir if it doesn't exists
var $_createCheckOutDir = false;
// Where the repository for extensions is located
var $_repositoryUrl = null;
// URL of proxy
@ -196,18 +188,6 @@ class Settings { /* {{{ */
var $_enableUpdateRevApp = false;
// enable/disable removal of a review/approval by the administrator
var $_enableRemoveRevApp = false;
// enable/disable listing logged in user as recipient
var $_enableSelfReceipt = false;
// enable/disable hidden user as recipient
var $_enableHiddenReceipt = true;
// enable/disable update of a receipt by the recipient
var $_enableUpdateReceipt = false;
// enable/disable listing administrator as recipient
var $_enableAdminReceipt = false;
// enable/disable listing owner as recipient
var $_enableOwnerReceipt = false;
// enable/disable filter for receipt by the recipient
var $_enableFilterReceipt = false;
// group manager is mandatory reviewer
var $_addManagerAsReviewer = false;
// group manager is mandatory approver
@ -230,12 +210,8 @@ class Settings { /* {{{ */
var $_enableDuplicateDocNames = true;
// enable/disable duplicate names of a subfolder in a folder
var $_enableDuplicateSubFolderNames = true;
// allow/disallow to cancel a checkout
var $_enableCancelCheckout = true;
// override mimetype set by browser when uploading a file
var $_overrideMimeType = false;
// advanced access control lists
var $_advancedAcl = false;
// enable/disable notification when added as a reviewer/approver
var $_enableNotificationAppRev = true;
// enable/disable notification of users/group who need to take action for
@ -245,26 +221,12 @@ class Settings { /* {{{ */
var $_enableNotificationWorkflow = false;
// preset expiration date
var $_presetExpirationDate = "";
// initial document status
var $_initialDocumentStatus = 2; //S_RELEASED;
// the name of the versioning info file created by the backup tool
var $_versioningFileName = "versioning_info.txt";
// the mode of workflow
var $_workflowMode = "traditional";
// enable/disable acknowledge workflow
var $_enableReceiptWorkflow = true;
// enable/disable reject of reception
var $_enableReceiptReject = false;
// enable/disable comment of reception
var $_disableReceiptComment = false;
// enable/disable revision workflow
var $_enableRevisionWorkflow = true;
// enable/disable revision on vote reject
var $_enableRevisionOneVoteReject = true;
// Allow to set just a reviewer in tradional workflow
var $_allowReviewerOnly = true;
// Allow to change reviewer/approver after review/approval has started
var $_allowChangeRevAppInProcess = false;
// enable/disable log system
var $_logFileEnable = true;
// max log level
@ -301,12 +263,8 @@ class Settings { /* {{{ */
var $_enableClipboard = true;
// show always clipboard in main menu, even if empty
var $_alwaysShowClipboard = false;
// enable/disable list of transmittals in main menu
var $_enableMenuTransmittals = false;
// enable/disable list of tasks in main menu
var $_enableMenuTasks = true;
// select which tasks show up in main menu
var $_tasksInMenu = array();
// show always tasks in main menu, even if none are due
var $_alwaysShowMenuTasks = true;
// enable/disable list of files in drop folder
@ -362,6 +320,8 @@ class Settings { /* {{{ */
var $_previewWidthDetail = 100;
// Preview image width in drop folder list
var $_previewWidthDropFolderList = 100;
// download or view online when clicking on preview image
var $_defaultThumbnailClick = 'download';
// show full preview on document details page
var $_showFullPreview = false;
// convert to pdf for preview on document details page
@ -485,18 +445,6 @@ class Settings { /* {{{ */
return $out;
} /* }}} */
/**
* Check if a variable is a string and returns an array
*
* @param array $var value
* @return true/false
*/
function arrayVal($var) { /* {{{ */
if((string) $var)
return explode(';', $var);
return array();
} /* }}} */
/**
* Return ';' seperated string from array
*
@ -596,6 +544,7 @@ class Settings { /* {{{ */
$this->_previewWidthDetail = intval($tab["previewWidthDetail"]);
if(isset($tab["previewWidthDropFolderList"]))
$this->_previewWidthDropFolderList = intval($tab["previewWidthDropFolderList"]);
$this->_defaultThumbnailClick = strval($tab["defaultThumbnailClick"]);
$this->_showFullPreview = Settings::boolVal($tab["showFullPreview"]);
$this->_convertToPdf = Settings::boolVal($tab["convertToPdf"]);
if(isset($tab["maxItemsPerPage"]))
@ -621,10 +570,8 @@ class Settings { /* {{{ */
$this->_enableSessionList = Settings::boolVal($tab["enableSessionList"]);
$this->_enableClipboard = Settings::boolVal($tab["enableClipboard"]);
$this->_alwaysShowClipboard = Settings::boolVal($tab["alwaysShowClipboard"]);
$this->_enableMenuTransmittals = Settings::boolVal($tab["enableMenuTransmittals"]);
$this->_enableMenuTasks = Settings::boolVal($tab["enableMenuTasks"]);
$this->_alwaysShowMenuTasks = Settings::boolVal($tab["alwaysShowMenuTasks"]);
$this->_tasksInMenu = Settings::arrayVal($tab["tasksInMenu"]);
$this->_enableDropFolderList = Settings::boolVal($tab["enableDropFolderList"]);
$this->_enableDropUpload = Settings::boolVal($tab["enableDropUpload"]);
$this->_enableMultiUpload = Settings::boolVal($tab["enableMultiUpload"]);
@ -650,7 +597,6 @@ class Settings { /* {{{ */
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
$this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]);
$this->_expandFolderTree = intval($tab["expandFolderTree"]);
$this->_libraryFolder = intval($tab["libraryFolder"]);
$this->_defaultDocPosition = strval($tab["defaultDocPosition"]);
$this->_defaultFolderPosition = strval($tab["defaultFolderPosition"]);
@ -694,8 +640,6 @@ class Settings { /* {{{ */
$this->_luceneDir = strval($tab["luceneDir"]);
$this->_dropFolderDir = strval($tab["dropFolderDir"]);
$this->_backupDir = strval($tab["backupDir"]);
$this->_checkOutDir = strval($tab["checkOutDir"]);
$this->_createCheckOutDir = Settings::boolVal($tab["createCheckOutDir"]);
$this->_repositoryUrl = strval($tab["repositoryUrl"]);
$this->_proxyUrl = strval($tab["proxyUrl"]);
$this->_proxyUser = strval($tab["proxyUser"]);
@ -709,13 +653,14 @@ class Settings { /* {{{ */
$this->_maxUploadSize = strval($tab["maxUploadSize"]);
$this->_enableXsendfile = Settings::boolVal($tab["enableXsendfile"]);
$this->_enableMemcached = Settings::boolVal($tab["enableMemcached"]);
}
// XML Path: /configuration/system/authentication
$node = $xml->xpath('/configuration/system/authentication');
if($node) {
$tab = $node[0]->attributes();
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
$this->_enable2FactorAuthentication = Settings::boolVal($tab["enable2FactorAuthentication"]);
$this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
$this->_passwordStrength = intval($tab["passwordStrength"]);
@ -853,11 +798,6 @@ class Settings { /* {{{ */
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
$this->_enableSelfReceipt = Settings::boolval($tab["enableSelfReceipt"]);
$this->_enableAdminReceipt = Settings::boolval($tab["enableAdminReceipt"]);
$this->_enableOwnerReceipt = Settings::boolval($tab["enableOwnerReceipt"]);
$this->_enableUpdateReceipt = Settings::boolval($tab["enableUpdateReceipt"]);
$this->_enableFilterReceipt = Settings::boolval($tab["enableFilterReceipt"]);
$this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
$this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
if(trim(strval($tab["globalReviewer"])))
@ -869,23 +809,14 @@ class Settings { /* {{{ */
if(trim(strval($tab["globalGroupApprover"])))
$this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
$this->_initialDocumentStatus = intval($tab["initialDocumentStatus"]);
$this->_versioningFileName = strval($tab["versioningFileName"]);
$this->_workflowMode = strval($tab["workflowMode"]);
$this->_enableReceiptWorkflow = Settings::boolval($tab["enableReceiptWorkflow"]);
$this->_enableReceiptReject = Settings::boolval($tab["enableReceiptReject"]);
$this->_disableReceiptComment = Settings::boolval($tab["disableReceiptComment"]);
$this->_enableRevisionWorkflow = Settings::boolval($tab["enableRevisionWorkflow"]);
$this->_enableRevisionOneVoteReject = Settings::boolval($tab["enableRevisionOneVoteReject"]);
$this->_allowReviewerOnly = Settings::boolval($tab["allowReviewerOnly"]);
$this->_allowChangeRevAppInProcess = Settings::boolval($tab["allowChangeRevAppInProcess"]);
$this->_enableVersionDeletion = Settings::boolval($tab["enableVersionDeletion"]);
$this->_enableVersionModification = Settings::boolval($tab["enableVersionModification"]);
$this->_enableDuplicateDocNames = Settings::boolval($tab["enableDuplicateDocNames"]);
$this->_enableDuplicateSubFolderNames = Settings::boolval($tab["enableDuplicateSubFolderNames"]);
$this->_enableCancelCheckout = Settings::boolval($tab["enableCancelCheckout"]);
$this->_overrideMimeType = Settings::boolval($tab["overrideMimeType"]);
$this->_advancedAcl = Settings::boolval($tab["advancedAcl"]);
$this->_removeFromDropFolder = Settings::boolval($tab["removeFromDropFolder"]);
$this->_uploadedAttachmentIsPublic = Settings::boolval($tab["uploadedAttachmentIsPublic"]);
}
@ -970,8 +901,6 @@ class Settings { /* {{{ */
$attributValue = "true";
else
$attributValue = "false";
} elseif(is_array($attributValue)) {
$attributValue = implode(';', $attributValue);
}
if (isset($node[$attributName])) {
@ -1037,6 +966,7 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "previewWidthMenuList", $this->_previewWidthMenuList);
$this->setXMLAttributValue($node, "previewWidthDetail", $this->_previewWidthDetail);
$this->setXMLAttributValue($node, "previewWidthDropFolderList", $this->_previewWidthDropFolderList);
$this->setXMLAttributValue($node, "defaultThumbnailClick", $this->_defaultThumbnailClick);
$this->setXMLAttributValue($node, "showFullPreview", $this->_showFullPreview);
$this->setXMLAttributValue($node, "convertToPdf", $this->_convertToPdf);
$this->setXMLAttributValue($node, "maxItemsPerPage", $this->_maxItemsPerPage);
@ -1057,10 +987,8 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "enableSessionList", $this->_enableSessionList);
$this->setXMLAttributValue($node, "enableClipboard", $this->_enableClipboard);
$this->setXMLAttributValue($node, "alwaysShowClipboard", $this->_alwaysShowClipboard);
$this->setXMLAttributValue($node, "enableMenuTransmittals", $this->_enableMenuTransmittals);
$this->setXMLAttributValue($node, "enableMenuTasks", $this->_enableMenuTasks);
$this->setXMLAttributValue($node, "alwaysShowMenuTasks", $this->_alwaysShowMenuTasks);
$this->setXMLAttributValue($node, "tasksInMenu", $this->_tasksInMenu);
$this->setXMLAttributValue($node, "enableDropFolderList", $this->_enableDropFolderList);
$this->setXMLAttributValue($node, "enableDropUpload", $this->_enableDropUpload);
$this->setXMLAttributValue($node, "enableMultiUpload", $this->_enableMultiUpload);
@ -1083,7 +1011,6 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
$this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList);
$this->setXMLAttributValue($node, "sortFoldersDefault", $this->_sortFoldersDefault);
$this->setXMLAttributValue($node, "libraryFolder", $this->_libraryFolder);
$this->setXMLAttributValue($node, "defaultDocPosition", $this->_defaultDocPosition);
$this->setXMLAttributValue($node, "defaultFolderPosition", $this->_defaultFolderPosition);
@ -1115,8 +1042,6 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "luceneDir", $this->_luceneDir);
$this->setXMLAttributValue($node, "dropFolderDir", $this->_dropFolderDir);
$this->setXMLAttributValue($node, "backupDir", $this->_backupDir);
$this->setXMLAttributValue($node, "checkOutDir", $this->_checkOutDir);
$this->setXMLAttributValue($node, "createCheckOutDir", $this->_createCheckOutDir);
$this->setXMLAttributValue($node, "repositoryUrl", $this->_repositoryUrl);
$this->setXMLAttributValue($node, "proxyUrl", $this->_proxyUrl);
$this->setXMLAttributValue($node, "proxyUser", $this->_proxyUser);
@ -1135,7 +1060,6 @@ class Settings { /* {{{ */
$node = $this->getXMLNode($xml, '/configuration/system', 'authentication');
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
$this->setXMLAttributValue($node, "enable2FactorAuthentication", $this->_enable2FactorAuthentication);
$this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
@ -1247,13 +1171,6 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
$this->setXMLAttributValue($node, "enableSelfReceipt", $this->_enableSelfReceipt);
$this->setXMLAttributValue($node, "enableAdminReceipt", $this->_enableAdminReceipt);
$this->setXMLAttributValue($node, "enableOwnerReceipt", $this->_enableOwnerReceipt);
$this->setXMLAttributValue($node, "enableUpdateReceipt", $this->_enableUpdateReceipt);
$this->setXMLAttributValue($node, "enableFilterReceipt", $this->_enableFilterReceipt);
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
$this->setXMLAttributValue($node, "initialDocumentStatus", $this->_initialDocumentStatus);
$this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
$this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
$this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
@ -1263,21 +1180,14 @@ class Settings { /* {{{ */
$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);
$this->setXMLAttributValue($node, "enableReceiptWorkflow", $this->_enableReceiptWorkflow);
$this->setXMLAttributValue($node, "enableReceiptReject", $this->_enableReceiptReject);
$this->setXMLAttributValue($node, "disableReceiptComment", $this->_disableReceiptComment);
$this->setXMLAttributValue($node, "enableRevisionWorkflow", $this->_enableRevisionWorkflow);
$this->setXMLAttributValue($node, "enableRevisionOneVoteReject", $this->_enableRevisionOneVoteReject);
$this->setXMLAttributValue($node, "allowReviewerOnly", $this->_allowReviewerOnly);
$this->setXMLAttributValue($node, "allowChangeRevAppInProcess", $this->_allowChangeRevAppInProcess);
$this->setXMLAttributValue($node, "enableVersionDeletion", $this->_enableVersionDeletion);
$this->setXMLAttributValue($node, "enableVersionModification", $this->_enableVersionModification);
$this->setXMLAttributValue($node, "enableDuplicateDocNames", $this->_enableDuplicateDocNames);
$this->setXMLAttributValue($node, "enableDuplicateSubFolderNames", $this->_enableDuplicateSubFolderNames);
$this->setXMLAttributValue($node, "enableCancelCheckout", $this->_enableCancelCheckout);
$this->setXMLAttributValue($node, "overrideMimeType", $this->_overrideMimeType);
$this->setXMLAttributValue($node, "advancedAcl", $this->_advancedAcl);
$this->setXMLAttributValue($node, "removeFromDropFolder", $this->_removeFromDropFolder);
$this->setXMLAttributValue($node, "uploadedAttachmentIsPublic", $this->_uploadedAttachmentIsPublic);

View File

@ -20,7 +20,6 @@
require_once('inc.ClassUI_Default.php');
require_once('inc.ClassViewCommon.php');
require_once('inc.ClassAccessOperation.php');
/* $theme was possibly set in inc.Authentication.php */
if (!isset($theme) || strlen($theme)==0) {
@ -46,7 +45,7 @@ class UI extends UI_Default {
* @return object an object of a class implementing the view
*/
static public function factory($theme, $class='', $params=array()) { /* {{{ */
global $settings, $dms, $user, $session, $extMgr, $request, $logger, $notifier, $fulltextservice;
global $settings, $session, $extMgr, $request, $logger, $notifier, $fulltextservice;
if(!$class) {
$class = 'Bootstrap';
$class = 'Style';
@ -128,7 +127,6 @@ class UI extends UI_Default {
$params['settings'] = $settings;
$view = new $classname($params, $theme);
/* Set some configuration parameters */
$view->setParam('accessobject', new SeedDMS_AccessOperation($dms, $user, $settings));
$view->setParam('referer', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
$view->setParam('requesturi', $_SERVER['REQUEST_URI']);
$view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir);
@ -156,14 +154,11 @@ class UI extends UI_Default {
$view->setParam('enablefoldertree', $settings->_enableFolderTree);
$view->setParam('enablelanguageselector', $settings->_enableLanguageSelector);
$view->setParam('enableclipboard', $settings->_enableClipboard);
$view->setParam('enablemenutransmittals', $settings->_enableMenuTransmittals);
$view->setParam('enablemenutasks', $settings->_enableMenuTasks);
$view->setParam('tasksinmenu', $settings->_tasksInMenu);
$view->setParam('enabledropfolderlist', $settings->_enableDropFolderList);
$view->setParam('dropfolderdir', $settings->_dropFolderDir);
$view->setParam('enablesessionlist', $settings->_enableSessionList);
$view->setParam('workflowmode', $settings->_workflowMode);
$view->setParam('checkoutdir', $settings->_checkOutDir);
$view->setParam('partitionsize', SeedDMS_Core_File::parse_filesize( $settings->_partitionSize));
$view->setParam('maxuploadsize', $settings->getMaximumUploadSize());
$view->setParam('showmissingtranslations', $settings->_showMissingTranslations);
@ -199,6 +194,7 @@ class UI extends UI_Default {
static public function exitError($pagetitle, $error, $noexit=false, $plain=false) {
global $theme, $dms, $user, $settings;
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
$view = UI::factory($theme, 'ErrorDlg');
$request = $view->getParam('request');
if($request) {
@ -206,6 +202,7 @@ class UI extends UI_Default {
}
$view->setParam('dms', $dms);
$view->setParam('user', $user);
$view->setParam('accessobject', $accessop);
$view->setParam('pagetitle', $pagetitle);
$view->setParam('errormsg', $error);
$view->setParam('plain', $plain);

View File

@ -213,7 +213,7 @@ class SeedDMS_View_Common {
if(is_string($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? $ret.$tmpret : array_merge($ret, array($tmpret)));
} elseif(is_array($tmpret) || is_object($tmpret)) {
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? array_merge(array($ret), $tmpret) : array_merge($ret, $tmpret));
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? (array($ret) + $tmpret) : ($ret + $tmpret));
} else
$ret = $tmpret;
}
@ -322,10 +322,8 @@ class SeedDMS_View_Common {
*/
protected function html_url($view, $urlparams=array()) { /* {{{ */
$url = $this->params['settings']->_httpRoot."out/out.".$view.".php";
if(is_array($urlparams))
if($urlparams)
$url .= "?".http_build_query($urlparams);
elseif(is_string($urlparams))
$url .= "?".$urlparams;
return $url;
} /* }}} */

View File

@ -87,7 +87,6 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
}
}
require_once('inc/inc.Tasks.php');
require_once("inc.ConversionInit.php");
require_once('inc.FulltextInit.php');
require_once('inc.AuthenticationInit.php');

View File

@ -14,7 +14,6 @@
global $logger;
require "inc.ClassExtensionMgr.php";
require_once "inc.ClassSchedulerTaskBase.php";
require_once "inc.ClassExtBase.php";
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);

View File

@ -26,7 +26,6 @@ $fulltextservice = null;
if($settings->_enableFullSearch) {
require_once("inc.ClassFulltextService.php");
$fulltextservice = new SeedDMS_FulltextService();
$fulltextservice->setLogger($logger);
if($settings->_fullSearchEngine == 'sqlitefts') {
$indexconf = array(

View File

@ -174,68 +174,6 @@ function getReviewStatusText($status, $date=0) { /* {{{ */
}
} /* }}} */
function printReceiptStatusText($status, $date=0) { /* {{{ */
print getReceiptStatusText($status, $date);
} /* }}} */
function getReceiptStatusText($status, $date=0) { /* {{{ */
if (is_null($status)) {
return getMLText("status_unknown");
}
else {
switch ($status) {
case -2:
return getMLText("status_recipient_removed");
break;
case -1:
return getMLText("status_receipt_rejected").($date !=0 ? " ".$date : "");
break;
case 0:
return getMLText("status_not_receipted");
break;
case 1:
return getMLText("status_receipted").($date !=0 ? " ".$date : "");
break;
default:
return getMLText("status_unknown");
break;
}
}
} /* }}} */
function printRevisionStatusText($status, $date=0) { /* {{{ */
print getRevisionStatusText($status, $date);
} /* }}} */
function getRevisionStatusText($status, $date=0) { /* {{{ */
if (is_null($status)) {
return getMLText("status_unknown");
}
else {
switch ($status) {
case -3:
return getMLText("status_revision_sleeping");
break;
case -2:
return getMLText("status_revisor_removed");
break;
case -1:
return getMLText("status_needs_correction").($date !=0 ? " ".$date : "");
return getMLText("status_revision_rejected").($date !=0 ? " ".$date : "");
break;
case 0:
return getMLText("status_not_revised");
break;
case 1:
return getMLText("status_revised").($date !=0 ? " ".$date : "");
break;
default:
return getMLText("status_unknown");
break;
}
}
} /* }}} */
function printApprovalStatusText($status, $date=0) { /* {{{ */
if (is_null($status)) {
print getMLText("status_unknown");
@ -317,15 +255,6 @@ function getOverallStatusText($status) { /* {{{ */
case S_EXPIRED:
return getMLText("expired");
break;
case S_IN_REVISION:
return getMLText("in_revision");
break;
case S_DRAFT:
return getMLText("draft");
break;
case S_NEEDS_CORRECTION:
return getMLText("needs_correction");
break;
default:
return getMLText("status_unknown");
break;

View File

@ -1,17 +0,0 @@
<?php
/**
* Initialize scheduler
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2018 Uwe Steinmann
* @version Release: @package_version@
*/
require_once "inc.ClassSchedulerTaskBase.php";
require_once "inc.ClassScheduler.php";
require_once "inc.ClassSchedulerTask.php";

File diff suppressed because it is too large Load Diff

View File

@ -447,7 +447,7 @@ function utf8_basename($path, $suffix='') { /* {{{ */
* @return string valid file name
*/
function getFilenameByDocname($content) { /* {{{ */
if(is_string($content)) {
if(is_string) {
$filename = $content;
} else {
$document = $content->getDocument();
@ -743,6 +743,7 @@ function get_extension($mimetype) { /* {{{ */
case 'video/webm': return '.webm';
case 'application/zip': return '.zip';
case 'application/x-gzip': return '.gz';
case 'application/x-xz': return '.xz';
case 'application/x-rar': return '.rar';
case 'application/x-7z-compressed': return '.7z';
case 'application/x-compressed-tar': return '.tgz';
@ -795,18 +796,6 @@ function addDirSep($str, $chr=DIRECTORY_SEPARATOR) { /* {{{ */
} /* }}} */
/**
* Formats comments for aknowledge of reception.
*
* Only use in documentListRow()
*/
function formatComment($an) { /* {{{ */
$t = array();
foreach($an as $a)
$t[] = $a['n']." × ".$a['c'];
return $t;
} /* }}} */
/*
* Determines if a command exists on the current environment
*
* @param string $command The command to check
@ -982,19 +971,6 @@ function seed_pass_verify($password, $hash) { /* {{{ */
return $hash === md5($password);
} /* }}} */
function resolveTask($task) { /* {{{ */
global $dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr;
if(is_object($task))
return $task;
if(is_string($task)) {
if(class_exists($task)) {
$task = new $task($dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr);
}
}
return $task;
} /* }}} */
/**
* Return nonce for CSP
*
@ -1150,9 +1126,9 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
foreach($revg as $gid) {
if($g = $dms->getGroup($gid)) {
if($document)
$accessmode = $document->getGroupAccessMode($u);
$accessmode = $document->getGroupAccessMode($g);
else
$accessmode = $folder->getGroupAccessMode($u);
$accessmode = $folder->getGroupAccessMode($g);
if($accessmode < M_READ || !$g->getUsers())
$reviewers["ng"][] = $g->getId();
else
@ -1247,9 +1223,9 @@ function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
foreach($appg as $gid) {
if($g = $dms->getGroup($gid)) {
if($document)
$accessmode = $document->getGroupAccessMode($u);
$accessmode = $document->getGroupAccessMode($g);
else
$accessmode = $folder->getGroupAccessMode($u);
$accessmode = $folder->getGroupAccessMode($g);
if($accessmode < M_READ || !$g->getUsers())
$approvers["ng"][] = $g->getId();
else
@ -1432,6 +1408,8 @@ class SeedDMS_Search { /* {{{ */
public $searchparams;
protected $total;
protected $dcount;
protected $fcount;
@ -1444,6 +1422,10 @@ class SeedDMS_Search { /* {{{ */
protected $searchTime;
protected $facets;
protected $stats;
public function __construct($dms, $user, $fulltextservice, $settings) {
$this->dms = $dms;
$this->user = $user;
@ -1452,6 +1434,7 @@ class SeedDMS_Search { /* {{{ */
$this->searchparams = [];
$this->dcount = 0;
$this->fcount = 0;
$this->total = 0;
$this->totalPages = 0;
$this->entries = array();
$this->terms = array();
@ -1787,33 +1770,6 @@ class SeedDMS_Search { /* {{{ */
}
$this->searchparams['startFolder'] = $startFolder;
/* Revision date {{{ */
$revisionstartts = null;
$revisionstartdate = array();
$revisionendts = null;
$revisionenddate = array();
$revised['from'] = null;
$revised['to'] = null;
if(!empty($get["revisiondatestart"])) {
$revisionstartts = makeTsFromDate($get["revisiondatestart"]);
$revisionstartdate = array('year'=>(int)date('Y', $revisionstartts), 'month'=>(int)date('m', $revisionstartts), 'day'=>(int)date('d', $revisionstartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
if (!checkdate($revisionstartdate['month'], $revisionstartdate['day'], $revisionstartdate['year'])) {
UI::exitError(getMLText("search"),getMLText("invalid_revision_date_start"));
}
$revised['from'] = $revisionstartts;
}
$this->searchparams['revisionstartdate'] = $revisionstartdate;
if(!empty($get["revisiondateend"])) {
$revisionendts = makeTsFromDate($get["revisiondateend"]);
$revisionenddate = array('year'=>(int)date('Y', $revisionendts), 'month'=>(int)date('m', $revisionendts), 'day'=>(int)date('d', $revisionendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
if (!checkdate($revisionenddate['month'], $revisionenddate['day'], $revisionenddate['year'])) {
UI::exitError(getMLText("search"),getMLText("invalid_revision_date_end"));
}
$revised['to'] = $revisionendts;
}
$this->searchparams['revisionenddate'] = $revisionenddate;
/* }}} */
/* Status date {{{ */
$statusstartdate = array();
$statusenddate = array();
@ -1858,12 +1814,6 @@ class SeedDMS_Search { /* {{{ */
$this->searchparams['expenddate'] = $expenddate;
/* }}} */
$reception = array();
if (isset($get["reception"])){
$reception = $get["reception"];
}
$this->searchparams['reception'] = $reception;
/* Do not search for folders if result shall be filtered by status.
* If this is not done, unexplainable results will be delivered.
* e.g. a search for expired documents of a given user will list
@ -1879,8 +1829,8 @@ class SeedDMS_Search { /* {{{ */
$attributes = array();
foreach($attributes as $attrdefid=>$attribute) {
$attrdef = $this->dms->getAttributeDefinition($attrdefid);
if($attribute) {
if($attrdef = $this->dms->getAttributeDefinition($attrdefid)) {
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
if(is_array($attribute)) {
if(!empty($attributes[$attrdefid]['from']))
@ -1893,6 +1843,7 @@ class SeedDMS_Search { /* {{{ */
}
}
}
}
$this->searchparams['attributes'] = $attributes;
// }}}
@ -2014,9 +1965,6 @@ class SeedDMS_Search { /* {{{ */
'mode'=>$this->searchparams['resultmode'],
'expirationstartdate'=>$this->searchparams['expstartdate'],
'expirationenddate'=>$this->searchparams['expenddate'],
'revisionstartdate'=>$this->searchparams['revisionstartdate'],
'revisionenddate'=>$this->searchparams['revisionenddate'],
'reception'=>$this->searchparams['reception'],
'statusstartdate'=>$this->searchparams['statusstartdate'],
'statusenddate'=>$this->searchparams['statusenddate'],
'orderby'=>$this->searchparams['orderby']

View File

@ -20,7 +20,7 @@
class SeedDMS_Version { /* {{{ */
const _number = "6.0.33";
const _number = "5.1.41";
const _string = "SeedDMS";
function __construct() {

View File

@ -46,21 +46,6 @@ CREATE TABLE `tblAttributeDefinitions` (
-- --------------------------------------------------------
--
-- Table structure for table `tblRoles`
--
CREATE TABLE `tblRoles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`role` smallint(1) NOT NULL DEFAULT '0',
`noaccess` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblUsers`
--
@ -69,13 +54,12 @@ CREATE TABLE `tblUsers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(50) DEFAULT NULL,
`pwd` varchar(50) DEFAULT NULL,
`secret` varchar(50) DEFAULT NULL,
`fullName` varchar(100) DEFAULT NULL,
`email` varchar(70) DEFAULT NULL,
`language` varchar(32) NOT NULL,
`theme` varchar(32) NOT NULL,
`comment` text NOT NULL,
`role` int(11) NOT NULL,
`role` smallint(1) NOT NULL DEFAULT '0',
`hidden` smallint(1) NOT NULL DEFAULT '0',
`pwdExpiration` datetime DEFAULT NULL,
`loginfailures` tinyint(4) NOT NULL DEFAULT '0',
@ -83,28 +67,11 @@ CREATE TABLE `tblUsers` (
`quota` bigint(20) DEFAULT NULL,
`homefolder` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login`),
CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`)
UNIQUE KEY `login` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblUserSubstitutes`
--
CREATE TABLE `tblUserSubstitutes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` int(11) DEFAULT null,
`substitute` int(11) DEFAULT null,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`,`substitute`),
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`substitute`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
);
-- --------------------------------------------------------
--
-- Table structure for table `tblUserPasswordRequest`
--
@ -255,7 +222,6 @@ CREATE TABLE `tblDocumentApprovers` (
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentApprovers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
-- --------------------------------------------------------
@ -296,7 +262,6 @@ CREATE TABLE `tblDocumentContent` (
`mimeType` varchar(100) NOT NULL DEFAULT '',
`fileSize` bigint(20) DEFAULT NULL,
`checksum` char(32) DEFAULT NULL,
`revisiondate` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `document` (`document`,`version`),
CONSTRAINT `tblDocumentContent_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`)
@ -384,23 +349,6 @@ CREATE TABLE `tblDocumentLocks` (
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentCheckOuts`
--
CREATE TABLE `tblDocumentCheckOuts` (
`document` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`userID` int(11) NOT NULL DEFAULT '0',
`date` datetime NOT NULL,
`filename` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`document`),
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentReviewers`
--
@ -415,7 +363,6 @@ CREATE TABLE `tblDocumentReviewers` (
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentReviewers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
-- --------------------------------------------------------
@ -439,83 +386,6 @@ CREATE TABLE `tblDocumentReviewLog` (
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRecipients`
--
CREATE TABLE `tblDocumentRecipients` (
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
`documentID` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`type` tinyint(4) NOT NULL DEFAULT '0',
`required` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`receiptID`),
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentReceiptLog`
--
CREATE TABLE `tblDocumentReceiptLog` (
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
`receiptID` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`date` datetime NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`receiptLogID`),
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
KEY `tblDocumentReceiptLog_user` (`userID`),
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRevisors`
--
CREATE TABLE `tblDocumentRevisors` (
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
`documentID` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`type` tinyint(4) NOT NULL DEFAULT '0',
`required` int(11) NOT NULL DEFAULT '0',
`startdate` datetime DEFAULT NULL,
PRIMARY KEY (`revisionID`),
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRevisionLog`
--
CREATE TABLE `tblDocumentRevisionLog` (
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
`revisionID` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`date` datetime NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`revisionLogID`),
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
KEY `tblDocumentRevisionLog_user` (`userID`),
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentStatus`
--
@ -738,7 +608,6 @@ CREATE TABLE `tblWorkflows` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`initstate` int(11) NOT NULL,
`layoutdata` text DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tblWorkflow_initstate` (`initstate`),
CONSTRAINT `tblWorkflow_initstate` FOREIGN KEY (`initstate`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
@ -805,48 +674,49 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowDocumentContent`
--
CREATE TABLE `tblWorkflowDocumentContent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent` int(11) DEFAULT NULL,
`workflow` int(11) DEFAULT NULL,
`document` int(11) DEFAULT NULL,
`version` smallint(5) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `tblWorkflowDocument_document` (`document`),
KEY `tblWorkflowDocument_workflow` (`workflow`),
KEY `tblWorkflowDocument_state` (`state`),
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowLog`
--
CREATE TABLE `tblWorkflowLog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`workflowdocumentcontent` int(11) NOT NULL DEFAULT '0',
`document` int(11) DEFAULT NULL,
`version` smallint(5) DEFAULT NULL,
`workflow` int(11) DEFAULT NULL,
`userid` int(11) DEFAULT NULL,
`transition` int(11) DEFAULT NULL,
`date` datetime NOT NULL,
`comment` text,
PRIMARY KEY (`id`),
KEY `tblWorkflowLog_document` (`document`),
KEY `tblWorkflowLog_workflow` (`workflow`),
KEY `tblWorkflowLog_userid` (`userid`),
KEY `tblWorkflowLog_transition` (`transition`),
KEY `tblWorkflowLog_workflowdocumentcontent` (`workflowdocumentcontent`),
CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowLog_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowLog_transition` FOREIGN KEY (`transition`) REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowLog_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowDocumentContent`
--
CREATE TABLE `tblWorkflowDocumentContent` (
`parentworkflow` int(11) DEFAULT '0',
`workflow` int(11) DEFAULT NULL,
`document` int(11) DEFAULT NULL,
`version` smallint(5) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`date` datetime NOT NULL,
KEY `tblWorkflowDocument_document` (`document`),
KEY `tblWorkflowDocument_workflow` (`workflow`),
KEY `tblWorkflowDocument_state` (`state`),
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
@ -866,127 +736,6 @@ CREATE TABLE `tblWorkflowMandatoryWorkflow` (
-- --------------------------------------------------------
--
-- Table structure for transmittal
--
CREATE TABLE `tblTransmittals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`comment` text NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`public` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for transmittal item
--
CREATE TABLE `tblTransmittalItems` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`transmittal` int(11) NOT NULL DEFAULT '0',
`document` int(11) DEFAULT NULL,
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE (transmittal, document, version),
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for cached read access
--
CREATE TABLE `tblCachedAccess` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`document` int(11) DEFAULT NULL,
`user` int(11) DEFAULT null,
`mode` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
CONSTRAINT `tblCachedAccess_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblCachedAccess_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for access request objects
--
CREATE TABLE `tblAros` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent` int(11),
`model` text NOT NULL,
`foreignid` int(11) NOT NULL DEFAULT '0',
`alias` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for access control objects
--
CREATE TABLE `tblAcos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent` int(11),
`model` text NOT NULL,
`foreignid` int(11) NOT NULL DEFAULT '0',
`alias` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for acos/aros relation
--
CREATE TABLE `tblArosAcos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aro` int(11) NOT NULL DEFAULT '0',
`aco` int(11) NOT NULL DEFAULT '0',
`create` tinyint(4) NOT NULL DEFAULT '-1',
`read` tinyint(4) NOT NULL DEFAULT '-1',
`update` tinyint(4) NOT NULL DEFAULT '-1',
`delete` tinyint(4) NOT NULL DEFAULT '-1',
PRIMARY KEY (`id`),
UNIQUE (aco, aro),
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblSchedulerTask`
--
CREATE TABLE `tblSchedulerTask` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`description` text DEFAULT NULL,
`disabled` smallint(1) NOT NULL DEFAULT '0',
`extension` varchar(100) DEFAULT NULL,
`task` varchar(100) DEFAULT NULL,
`frequency` varchar(100) DEFAULT NULL,
`params` text DEFAULT NULL,
`nextrun` datetime DEFAULT NULL,
`lastrun` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tblVersion`
--
@ -1004,10 +753,7 @@ CREATE TABLE `tblVersion` (
-- Initial content for database
--
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
INSERT INTO tblUsers VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
INSERT INTO tblUsers VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
INSERT INTO tblFolders VALUES (1, 'DMS', 0, '', 'DMS root', UNIX_TIMESTAMP(), 1, 0, 2, 0);
INSERT INTO tblVersion VALUES (NOW(), 6, 0, 0);
INSERT INTO tblVersion VALUES (NOW(), 5, 1, 0);

View File

@ -43,19 +43,6 @@ CREATE TABLE "tblAttributeDefinitions" (
-- --------------------------------------------------------
--
-- Table structure for table `tblRoles`
--
CREATE TABLE "tblRoles" (
"id" SERIAL UNIQUE,
"name" varchar(50) default NULL,
"role" INTEGER NOT NULL default '0',
"noaccess" varchar(30) NOT NULL default ''
) ;
-- --------------------------------------------------------
--
-- Table structure for table "tblUsers"
--
@ -64,7 +51,6 @@ CREATE TABLE "tblUsers" (
"id" SERIAL UNIQUE,
"login" varchar(50) default NULL,
"pwd" varchar(50) default NULL,
"secret" varchar(50) default NULL,
"fullName" varchar(100) default NULL,
"email" varchar(70) default NULL,
"language" varchar(32) NOT NULL,
@ -82,18 +68,6 @@ CREATE TABLE "tblUsers" (
-- --------------------------------------------------------
--
-- Table structure for table `tblUserSubstitutes`
--
CREATE TABLE "tblUserSubstitutes" (
"id" SERIAL UNIQUE,
"user" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
"substitute" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
-- --------------------------------------------------------
--
-- Table structure for table "tblUserPasswordRequest"
--
@ -251,7 +225,6 @@ CREATE TABLE "tblDocumentContent" (
"mimeType" varchar(100) NOT NULL default '',
"fileSize" BIGINT,
"checksum" char(32),
"revisiondate" TIMESTAMP default NULL,
UNIQUE ("document","version")
) ;
@ -317,21 +290,6 @@ CREATE TABLE "tblDocumentLocks" (
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentCheckOuts`
--
CREATE TABLE "tblDocumentCheckOuts" (
"document" INTEGER REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER NOT NULL default '0',
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id"),
"date" TEXT NOT NULL,
"filename" varchar(255) NOT NULL default '',
UNIQUE ("document")
) ;
-- --------------------------------------------------------
--
-- Table structure for table "tblDocumentReviewers"
--
@ -362,67 +320,6 @@ CREATE TABLE "tblDocumentReviewLog" (
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRecipients`
--
CREATE TABLE "tblDocumentRecipients" (
"receiptID" SERIAL UNIQUE,
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER NOT NULL default '0',
"type" INTEGER NOT NULL default '0',
"required" INTEGER NOT NULL default '0',
UNIQUE ("documentID","version","type","required")
) ;
-- --------------------------------------------------------
--
-- Table structure for table "tblDocumentReceiptLog"
--
CREATE TABLE "tblDocumentReceiptLog" (
"receiptLogID" SERIAL UNIQUE,
"receiptID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
"status" INTEGER NOT NULL default 0,
"comment" TEXT NOT NULL,
"date" TEXT NOT NULL,
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRevisors`
--
CREATE TABLE "tblDocumentRevisors" (
"revisionID" SERIAL UNIQUE,
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER NOT NULL default '0',
"type" INTEGER NOT NULL default '0',
"required" INTEGER NOT NULL default '0',
"startdate" TIMESTAMP default NULL,
UNIQUE ("documentID","version","type","required")
) ;
-- --------------------------------------------------------
--
-- Table structure for table "tblDocumentRevisionLog"
--
CREATE TABLE "tblDocumentRevisionLog" (
"revisionLogID" SERIAL UNIQUE,
"revisionID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
"status" INTEGER NOT NULL default 0,
"comment" TEXT NOT NULL,
"date" TIMESTAMP default NULL,
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
) ;
-- --------------------------------------------------------
--
-- Table structure for table "tblDocumentStatus"
--
@ -617,8 +514,7 @@ CREATE TABLE "tblWorkflowActions" (
CREATE TABLE "tblWorkflows" (
"id" SERIAL UNIQUE,
"name" text NOT NULL,
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE,
"layoutdata" text default NULL
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE
) ;
-- --------------------------------------------------------
@ -663,29 +559,15 @@ CREATE TABLE "tblWorkflowTransitionGroups" (
-- --------------------------------------------------------
--
-- Table structure for workflow document relation
--
CREATE TABLE "tblWorkflowDocumentContent" (
"id" SERIAL UNIQUE,
"parent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER DEFAULT NULL,
"state" INTEGER DEFAULT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE,
"date" TIMESTAMP default NULL
) ;
-- --------------------------------------------------------
--
-- Table structure for workflow log
--
CREATE TABLE "tblWorkflowLog" (
"id" SERIAL UNIQUE,
"workflowdocumentcontent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER default NULL,
"workflow" INTEGER default NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
"userid" INTEGER default NULL REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
"transition" INTEGER default NULL REFERENCES "tblWorkflowTransitions" ("id") ON DELETE CASCADE,
"date" TIMESTAMP default NULL,
@ -694,6 +576,21 @@ CREATE TABLE "tblWorkflowLog" (
-- --------------------------------------------------------
--
-- Table structure for workflow document relation
--
CREATE TABLE "tblWorkflowDocumentContent" (
"parentworkflow" INTEGER DEFAULT 0,
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER DEFAULT NULL,
"state" INTEGER DEFAULT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE,
"date" TIMESTAMP default NULL
) ;
-- --------------------------------------------------------
--
-- Table structure for mandatory workflows
--
@ -706,101 +603,6 @@ CREATE TABLE "tblWorkflowMandatoryWorkflow" (
-- --------------------------------------------------------
--
-- Table structure for transmittal
--
CREATE TABLE "tblTransmittals" (
"id" SERIAL UNIQUE,
"name" text NOT NULL,
"comment" text NOT NULL,
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
"date" TIMESTAMP default NULL,
"public" INTEGER NOT NULL default '0'
);
-- --------------------------------------------------------
--
-- Table structure for transmittal item
--
CREATE TABLE "tblTransmittalItems" (
"id" SERIAL UNIQUE,
"transmittal" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE,
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
"version" INTEGER NOT NULL default '0',
"date" TIMESTAMP default NULL,
UNIQUE (transmittal, document, version)
);
-- --------------------------------------------------------
--
-- Table structure for access request objects
--
CREATE TABLE "tblAros" (
"id" SERIAL UNIQUE,
"parent" INTEGER,
"model" TEXT NOT NULL,
"foreignid" INTEGER NOT NULL DEFAULT '0',
"alias" TEXT
) ;
-- --------------------------------------------------------
--
-- Table structure for access control objects
--
CREATE TABLE "tblAcos" (
"id" SERIAL UNIQUE,
"parent" INTEGER,
"model" TEXT NOT NULL,
"foreignid" INTEGER NOT NULL DEFAULT '0',
"alias" TEXT
) ;
-- --------------------------------------------------------
--
-- Table structure for acos/aros relation
--
CREATE TABLE "tblArosAcos" (
"id" SERIAL UNIQUE,
"aro" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAros" ("id") ON DELETE CASCADE,
"aco" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
"create" INTEGER NOT NULL DEFAULT '-1',
"read" INTEGER NOT NULL DEFAULT '-1',
"update" INTEGER NOT NULL DEFAULT '-1',
"delete" INTEGER NOT NULL DEFAULT '-1',
UNIQUE (aco, aro)
) ;
-- --------------------------------------------------------
--
-- Table structure for tblSchedulerTask
--
CREATE TABLE "tblSchedulerTask" (
"id" SERIAL UNIQUE,
"name" varchar(100) DEFAULT NULL,
"description" TEXT DEFAULT NULL,
"disabled" INTEGER NOT NULL DEFAULT '0',
"extension" varchar(100) DEFAULT NULL,
"task" varchar(100) DEFAULT NULL,
"frequency" varchar(100) DEFAULT NULL,
"params" TEXT DEFAULT NULL,
"nextrun" TIMESTAMP DEFAULT NULL,
"lastrun" TIMESTAMP DEFAULT NULL
) ;
-- --------------------------------------------------------
--
-- Table structure for version
--
@ -818,16 +620,10 @@ CREATE TABLE "tblVersion" (
-- Initial content for database
--
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
SELECT nextval('"tblRoles_id_seq"');
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
SELECT nextval('"tblRoles_id_seq"');
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
SELECT nextval('"tblRoles_id_seq"');
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
SELECT nextval('"tblUsers_id_seq"');
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
SELECT nextval('"tblUsers_id_seq"');
INSERT INTO "tblFolders" VALUES (1, 'DMS', 0, '', 'DMS root', extract(epoch from now()), 1, 0, 2, 0);
SELECT nextval('"tblFolders_id_seq"');
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 6, 0, 0);
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 5, 1, 0);

View File

@ -43,20 +43,6 @@ CREATE TABLE `tblAttributeDefinitions` (
-- --------------------------------------------------------
--
-- Table structure for table `tblRoles`
--
CREATE TABLE `tblRoles` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` varchar(50) default NULL,
`role` INTEGER NOT NULL default '0',
`noaccess` varchar(30) NOT NULL default '',
UNIQUE (`name`)
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblUsers`
--
@ -65,13 +51,12 @@ CREATE TABLE `tblUsers` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`login` varchar(50) default NULL,
`pwd` varchar(50) default NULL,
`secret` varchar(50) default NULL,
`fullName` varchar(100) default NULL,
`email` varchar(70) default NULL,
`language` varchar(32) NOT NULL,
`theme` varchar(32) NOT NULL,
`comment` text NOT NULL,
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
`role` INTEGER NOT NULL default '0',
`hidden` INTEGER NOT NULL default '0',
`pwdExpiration` TEXT default NULL,
`loginfailures` INTEGER NOT NULL default '0',
@ -83,19 +68,6 @@ CREATE TABLE `tblUsers` (
-- --------------------------------------------------------
--
-- Table structure for table `tblUserSubstitutes`
--
CREATE TABLE `tblUserSubstitutes` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
UNIQUE (`user`, `substitute`)
);
-- --------------------------------------------------------
--
-- Table structure for table `tblUserPasswordRequest`
--
@ -163,7 +135,7 @@ CREATE TABLE `tblFolderAttributes` (
`folder` INTEGER default NULL REFERENCES `tblFolders` (`id`) ON DELETE CASCADE,
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
`value` text default NULL,
UNIQUE (`folder`, `attrdef`)
UNIQUE (folder, attrdef)
) ;
-- --------------------------------------------------------
@ -199,7 +171,7 @@ CREATE TABLE `tblDocumentAttributes` (
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
`value` text default NULL,
UNIQUE (`document`, `attrdef`)
UNIQUE (document, attrdef)
) ;
-- --------------------------------------------------------
@ -216,7 +188,6 @@ CREATE TABLE `tblDocumentApprovers` (
`required` INTEGER NOT NULL default '0',
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
-- --------------------------------------------------------
@ -232,7 +203,6 @@ CREATE TABLE `tblDocumentApproveLog` (
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
-- --------------------------------------------------------
@ -253,7 +223,6 @@ CREATE TABLE `tblDocumentContent` (
`mimeType` varchar(100) NOT NULL default '',
`fileSize` INTEGER,
`checksum` char(32),
`revisiondate` TEXT default NULL,
UNIQUE (`document`,`version`)
) ;
@ -268,7 +237,7 @@ CREATE TABLE `tblDocumentContentAttributes` (
`content` INTEGER default NULL REFERENCES `tblDocumentContent` (`id`) ON DELETE CASCADE,
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
`value` text default NULL,
UNIQUE (`content`, `attrdef`)
UNIQUE (content, attrdef)
) ;
-- --------------------------------------------------------
@ -319,21 +288,6 @@ CREATE TABLE `tblDocumentLocks` (
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentCheckOuts`
--
CREATE TABLE `tblDocumentCheckOuts` (
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
`date` TEXT NOT NULL,
`filename` varchar(255) NOT NULL default '',
UNIQUE (`document`)
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentReviewers`
--
@ -346,7 +300,6 @@ CREATE TABLE `tblDocumentReviewers` (
`required` INTEGER NOT NULL default '0',
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
-- --------------------------------------------------------
@ -362,72 +315,6 @@ CREATE TABLE `tblDocumentReviewLog` (
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRecipients`
--
CREATE TABLE `tblDocumentRecipients` (
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`type` INTEGER NOT NULL default '0',
`required` INTEGER NOT NULL default '0',
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentReceiptLog`
--
CREATE TABLE `tblDocumentReceiptLog` (
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
`status` INTEGER NOT NULL default 0,
`comment` TEXT NOT NULL,
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRevisors`
--
CREATE TABLE `tblDocumentRevisors` (
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`type` INTEGER NOT NULL default '0',
`required` INTEGER NOT NULL default '0',
`startdate` TEXT default NULL,
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
-- --------------------------------------------------------
--
-- Table structure for table `tblDocumentRevisionLog`
--
CREATE TABLE `tblDocumentRevisionLog` (
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
`status` INTEGER NOT NULL default 0,
`comment` TEXT NOT NULL,
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
-- --------------------------------------------------------
@ -456,7 +343,6 @@ CREATE TABLE `tblDocumentStatusLog` (
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
-- --------------------------------------------------------
@ -626,8 +512,7 @@ CREATE TABLE `tblWorkflowActions` (
CREATE TABLE `tblWorkflows` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` text NOT NULL,
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
`layoutdata` text default NULL
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
) ;
-- --------------------------------------------------------
@ -672,29 +557,15 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowDocumentContent`
--
CREATE TABLE `tblWorkflowDocumentContent` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER DEFAULT NULL,
`state` INTEGER DEFAULT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
`date` datetime NOT NULL
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowLog`
--
CREATE TABLE `tblWorkflowLog` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER default NULL,
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
`date` datetime NOT NULL,
@ -703,6 +574,21 @@ CREATE TABLE `tblWorkflowLog` (
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowDocumentContent`
--
CREATE TABLE `tblWorkflowDocumentContent` (
`parentworkflow` INTEGER DEFAULT 0,
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER DEFAULT NULL,
`state` INTEGER DEFAULT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
`date` datetime NOT NULL
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblWorkflowMandatoryWorkflow`
--
@ -710,102 +596,7 @@ CREATE TABLE `tblWorkflowLog` (
CREATE TABLE `tblWorkflowMandatoryWorkflow` (
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
UNIQUE(`userid`, `workflow`)
) ;
-- --------------------------------------------------------
--
-- Table structure for transmittal
--
CREATE TABLE `tblTransmittals` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` text NOT NULL,
`comment` text NOT NULL,
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`date` TEXT default NULL,
`public` INTEGER NOT NULL default '0'
);
-- --------------------------------------------------------
--
-- Table structure for transmittal item
--
CREATE TABLE `tblTransmittalItems` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`date` TEXT default NULL,
UNIQUE (`transmittal`, `document`, `version`)
);
-- --------------------------------------------------------
--
-- Table structure for access request objects
--
CREATE TABLE `tblAros` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER,
`model` TEXT NOT NULL,
`foreignid` INTEGER NOT NULL DEFAULT '0',
`alias` TEXT
) ;
-- --------------------------------------------------------
--
-- Table structure for access control objects
--
CREATE TABLE `tblAcos` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER,
`model` TEXT NOT NULL,
`foreignid` INTEGER NOT NULL DEFAULT '0',
`alias` TEXT
) ;
-- --------------------------------------------------------
--
-- Table structure for acos/aros relation
--
CREATE TABLE `tblArosAcos` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
`create` INTEGER NOT NULL DEFAULT '-1',
`read` INTEGER NOT NULL DEFAULT '-1',
`update` INTEGER NOT NULL DEFAULT '-1',
`delete` INTEGER NOT NULL DEFAULT '-1',
UNIQUE (`aco`, `aro`)
) ;
-- --------------------------------------------------------
--
-- Table structure for table `tblSchedulerTask`
--
CREATE TABLE `tblSchedulerTask` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` varchar(100) DEFAULT NULL,
`description` TEXT DEFAULT NULL,
`disabled` INTEGER NOT NULL DEFAULT '0',
`extension` varchar(100) DEFAULT NULL,
`task` varchar(100) DEFAULT NULL,
`frequency` varchar(100) DEFAULT NULL,
`params` TEXT DEFAULT NULL,
`nextrun` TEXT DEFAULT NULL,
`lastrun` TEXT DEFAULT NULL
UNIQUE(userid, workflow)
) ;
-- --------------------------------------------------------
@ -827,10 +618,7 @@ CREATE TABLE `tblVersion` (
-- Initial content for database
--
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, '', 0, 0, 0, NULL);
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, '', 0, 0, 0, NULL);
INSERT INTO `tblFolders` (`id`, `name`, `parent`, `folderList`, `comment`, `date`, `owner`, `inheritAccess`, `defaultAccess`, `sequence`) VALUES (1, 'DMS', NULL, '', 'DMS root', strftime('%s','now'), 1, 0, 2, 0);
INSERT INTO `tblVersion` VALUES (DATETIME(), 6, 0, 0);
INSERT INTO `tblVersion` VALUES (DATETIME(), 5, 1, 0);

View File

@ -1,181 +0,0 @@
START TRANSACTION;
ALTER TABLE "tblDocumentContent" ADD COLUMN "revisiondate" TIMESTAMP default NULL;
ALTER TABLE "tblUsers" ADD COLUMN "secret" varchar(50) default NULL;
ALTER TABLE "tblWorkflows" ADD COLUMN "layoutdata" text default NULL;
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "id" SERIAL UNIQUE;
ALTER TABLE "tblWorkflowLog" ADD COLUMN "workflowdocumentcontent" INTEGER NOT NULL DEFAULT '0';
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
INSERT INTO "tblWorkflowDocumentContent" ("parentworkflow", "workflow", "document", "version", "state", "date") SELECT 0 AS "parentworkflow", "workflow", "document", "version", NULL AS "state", max("date") AS "date" FROM "tblWorkflowLog" WHERE "workflowdocumentcontent" = 0 GROUP BY "workflow", "document", "version";
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
ALTER TABLE "tblWorkflowLog" ADD CONSTRAINT "tblWorkflowLog_workflowdocumentcontent" FOREIGN KEY ("workflowdocumentcontent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "parent" INTEGER DEFAULT NULL;
ALTER TABLE "tblWorkflowDocumentContent" ADD CONSTRAINT "tblWorkflowDocumentContent_parent" FOREIGN KEY ("parent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
ALTER TABLE "tblWorkflowDocumentContent" DROP COLUMN "parentworkflow";
ALTER TABLE "tblWorkflowLog" DROP COLUMN "document";
ALTER TABLE "tblWorkflowLog" DROP COLUMN "version";
ALTER TABLE "tblWorkflowLog" DROP COLUMN "workflow";
CREATE TABLE "tblUserSubstitutes" (
"id" SERIAL UNIQUE,
"user" INTEGER default null,
"substitute" INTEGER default null,
UNIQUE ("user", "substitute"),
CONSTRAINT "tblUserSubstitutes_user" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
CONSTRAINT "tblUserSubstitutes_substitute" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblDocumentCheckOuts" (
"document" INTEGER NOT NULL default '0',
"version" INTEGER NOT NULL default '0',
"userID" INTEGER NOT NULL default '0',
"date" TIMESTAMP NOT NULL,
"filename" varchar(255) NOT NULL default '',
CONSTRAINT "tblDocumentCheckOuts_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
CONSTRAINT "tblDocumentCheckOuts_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblDocumentRecipients" (
"receiptID" SERIAL UNIQUE,
"documentID" INTEGER NOT NULL default '0',
"version" INTEGER NOT NULL default '0',
"type" INTEGER NOT NULL default '0',
"required" INTEGER NOT NULL default '0',
UNIQUE ("documentID","version","type","required"),
CONSTRAINT "tblDocumentRecipients_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblDocumentReceiptLog" (
"receiptLogID" SERIAL UNIQUE,
"receiptID" INTEGER NOT NULL default '0',
"status" INTEGER NOT NULL default '0',
"comment" text NOT NULL,
"date" TIMESTAMP NOT NULL,
"userID" INTEGER NOT NULL default '0',
CONSTRAINT "tblDocumentReceiptLog_recipient" FOREIGN KEY ("receiptID") REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
CONSTRAINT "tblDocumentReceiptLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblDocumentRevisors" (
"revisionID" SERIAL UNIQUE,
"documentID" INTEGER NOT NULL default '0',
"version" INTEGER NOT NULL default '0',
"type" INTEGER NOT NULL default '0',
"required" INTEGER NOT NULL default '0',
"startdate" TIMESTAMP default NULL,
UNIQUE ("documentID","version","type","required"),
CONSTRAINT "tblDocumentRevisors_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblDocumentRevisionLog" (
"revisionLogID" SERIAL UNIQUE,
"revisionID" INTEGER NOT NULL default '0',
"status" INTEGER NOT NULL default '0',
"comment" text NOT NULL,
"date" TIMESTAMP NOT NULL,
"userID" INTEGER NOT NULL default '0',
CONSTRAINT "tblDocumentRevisionLog_revision" FOREIGN KEY ("revisionID") REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
CONSTRAINT "tblDocumentRevisionLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblTransmittals" (
"id" SERIAL UNIQUE,
"name" text NOT NULL,
"comment" text NOT NULL,
"userID" INTEGER NOT NULL default '0',
"date" TIMESTAMP default NULL,
"public" INTEGER NOT NULL default '0',
CONSTRAINT "tblTransmittals_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblTransmittalItems" (
"id" SERIAL UNIQUE,
"transmittal" INTEGER NOT NULL DEFAULT '0',
"document" INTEGER default NULL,
"version" INTEGER NOT NULL default '0',
"date" TIMESTAMP default NULL,
UNIQUE ("transmittal", "document", "version"),
CONSTRAINT "tblTransmittalItems_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
CONSTRAINT "tblTransmittalItem_transmittal" FOREIGN KEY ("transmittal") REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblRoles" (
"id" SERIAL UNIQUE,
"name" varchar(50) default NULL,
"role" INTEGER NOT NULL default '0',
"noaccess" varchar(30) NOT NULL default '',
UNIQUE ("name")
);
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
SELECT nextval('"tblRoles_id_seq"');
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
SELECT nextval('"tblRoles_id_seq"');
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
SELECT nextval('"tblRoles_id_seq"');
ALTER TABLE "tblUsers" ALTER "role" DROP DEFAULT;
ALTER TABLE "tblUsers" ALTER "role" SET NOT NULL;
UPDATE "tblUsers" SET role=3 WHERE role=0;
ALTER TABLE "tblUsers" ADD CONSTRAINT "tblUsers_role" FOREIGN KEY ("role") REFERENCES "tblRoles" ("id");
CREATE TABLE "tblAros" (
"id" SERIAL UNIQUE,
"parent" INTEGER,
"model" text NOT NULL,
"foreignid" INTEGER NOT NULL DEFAULT '0',
"alias" varchar(255)
);
CREATE TABLE "tblAcos" (
"id" SERIAL UNIQUE,
"parent" INTEGER,
"model" text NOT NULL,
"foreignid" INTEGER NOT NULL DEFAULT '0',
"alias" varchar(255)
);
CREATE TABLE "tblArosAcos" (
"id" SERIAL UNIQUE,
"aro" INTEGER NOT NULL DEFAULT '0',
"aco" INTEGER NOT NULL DEFAULT '0',
"create" INTEGER NOT NULL DEFAULT '-1',
"read" INTEGER NOT NULL DEFAULT '-1',
"update" INTEGER NOT NULL DEFAULT '-1',
"delete" INTEGER NOT NULL DEFAULT '-1',
UNIQUE ("aco", "aro"),
CONSTRAINT "tblArosAcos_acos" FOREIGN KEY ("aco") REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
CONSTRAINT "tblArosAcos_aros" FOREIGN KEY ("aro") REFERENCES "tblAros" ("id") ON DELETE CASCADE
);
CREATE TABLE "tblSchedulerTask" (
"id" SERIAL UNIQUE,
"name" varchar(100) DEFAULT NULL,
"description" TEXT DEFAULT NULL,
"disabled" INTEGER NOT NULL DEFAULT '0',
"extension" varchar(100) DEFAULT NULL,
"task" varchar(100) DEFAULT NULL,
"frequency" varchar(100) DEFAULT NULL,
"params" TEXT DEFAULT NULL,
"nextrun" TIMESTAMP DEFAULT NULL,
"lastrun" TIMESTAMP DEFAULT NULL
) ;
UPDATE "tblVersion" set "major"=6, "minor"=0, "subminor"=0;
COMMIT;

View File

@ -1,206 +0,0 @@
BEGIN;
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` TEXT default NULL;
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) default NULL;
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text default NULL;
CREATE TABLE `new_tblWorkflowDocumentContent` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER DEFAULT NULL,
`state` INTEGER DEFAULT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
`date` datetime NOT NULL
) ;
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL as `parent`, `workflow`, `document`, `version`, `state`, `date` FROM `tblWorkflowDocumentContent`;
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL, `a`.`workflow`, `a`.`document`, `a`.`version`, NULL AS `state`, max(`a`.`date`) FROM `tblWorkflowLog` `a` LEFT JOIN `tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NULL GROUP BY `a`.`document`, `a`.`version`, `a`.`workflow`;
CREATE TABLE `new_tblWorkflowLog` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
`date` datetime NOT NULL,
`comment` text
) ;
INSERT INTO `new_tblWorkflowLog` (`id`, `workflowdocumentcontent`, `userid`, `transition`, `date`, `comment`) SELECT `a`.`id`, `b`.`id`, `a`.`userid`, `a`.`transition`, `a`.`date`, `a`.`comment` FROM `tblWorkflowLog` `a` LEFT JOIN `new_tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NOT NULL;
DROP TABLE `tblWorkflowLog`;
ALTER TABLE `new_tblWorkflowLog` RENAME TO `tblWorkflowLog`;
DROP TABLE `tblWorkflowDocumentContent`;
ALTER TABLE `new_tblWorkflowDocumentContent` RENAME TO `tblWorkflowDocumentContent`;
CREATE TABLE `tblUserSubstitutes` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
UNIQUE (`user`, `substitute`)
);
CREATE TABLE `tblDocumentCheckOuts` (
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
`date` TEXT NOT NULL,
`filename` varchar(255) NOT NULL default '',
UNIQUE (`document`)
) ;
CREATE TABLE `tblDocumentRecipients` (
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`type` INTEGER NOT NULL default '0',
`required` INTEGER NOT NULL default '0',
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
CREATE TABLE `tblDocumentReceiptLog` (
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
`status` INTEGER NOT NULL default 0,
`comment` TEXT NOT NULL,
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
CREATE TABLE `tblDocumentRevisors` (
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`type` INTEGER NOT NULL default '0',
`required` INTEGER NOT NULL default '0',
`startdate` TEXT default NULL,
UNIQUE (`documentID`,`version`,`type`,`required`)
) ;
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
CREATE TABLE `tblDocumentRevisionLog` (
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
`status` INTEGER NOT NULL default 0,
`comment` TEXT NOT NULL,
`date` TEXT NOT NULL,
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ;
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
CREATE TABLE `tblTransmittals` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` text NOT NULL,
`comment` text NOT NULL,
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
`date` TEXT default NULL,
`public` INTEGER NOT NULL default '0'
);
CREATE TABLE `tblTransmittalItems` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
`version` INTEGER unsigned NOT NULL default '0',
`date` TEXT default NULL,
UNIQUE (transmittal, document, version)
);
CREATE TABLE `tblRoles` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` varchar(50) default NULL,
`role` INTEGER NOT NULL default '0',
`noaccess` varchar(30) NOT NULL default '',
UNIQUE (`name`)
);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
UPDATE `tblUsers` SET role=3 WHERE role=0;
CREATE TABLE `new_tblUsers` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`login` varchar(50) default NULL,
`pwd` varchar(50) default NULL,
`fullName` varchar(100) default NULL,
`email` varchar(70) default NULL,
`language` varchar(32) NOT NULL,
`theme` varchar(32) NOT NULL,
`comment` text NOT NULL,
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
`hidden` INTEGER NOT NULL default '0',
`pwdExpiration` TEXT default NULL,
`loginfailures` INTEGER NOT NULL default '0',
`disabled` INTEGER NOT NULL default '0',
`quota` INTEGER,
`homefolder` INTEGER default NULL REFERENCES `tblFolders` (`id`),
`secret` varchar(50) default NULL,
UNIQUE (`login`)
);
INSERT INTO new_tblUsers SELECT * FROM tblUsers;
DROP TABLE tblUsers;
ALTER TABLE new_tblUsers RENAME TO tblUsers;
CREATE TABLE `tblAros` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER,
`model` TEXT NOT NULL,
`foreignid` INTEGER NOT NULL DEFAULT '0',
`alias` TEXT
) ;
CREATE TABLE `tblAcos` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`parent` INTEGER,
`model` TEXT NOT NULL,
`foreignid` INTEGER NOT NULL DEFAULT '0',
`alias` TEXT
) ;
CREATE TABLE `tblArosAcos` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
`create` INTEGER NOT NULL DEFAULT '-1',
`read` INTEGER NOT NULL DEFAULT '-1',
`update` INTEGER NOT NULL DEFAULT '-1',
`delete` INTEGER NOT NULL DEFAULT '-1',
UNIQUE (aco, aro)
) ;
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
CREATE TABLE `tblSchedulerTask` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` varchar(100) DEFAULT NULL,
`description` TEXT DEFAULT NULL,
`disabled` INTEGER NOT NULL DEFAULT '0',
`extension` varchar(100) DEFAULT NULL,
`task` varchar(100) DEFAULT NULL,
`frequency` varchar(100) DEFAULT NULL,
`params` TEXT DEFAULT NULL,
`nextrun` TEXT DEFAULT NULL,
`lastrun` TEXT DEFAULT NULL
) ;
UPDATE tblVersion set major=6, minor=0, subminor=0;
COMMIT;

View File

@ -1,200 +0,0 @@
START TRANSACTION;
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` datetime DEFAULT NULL;
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) DEFAULT NULL AFTER `pwd`;
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text DEFAULT NULL AFTER `initstate`;
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);
ALTER TABLE `tblWorkflowLog` ADD COLUMN `workflowdocumentcontent` int(11) NOT NULL DEFAULT '0' AFTER `id`;
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
INSERT INTO `tblWorkflowDocumentContent` (`parentworkflow`, `workflow`, `document`, `version`, `state`, `date`) SELECT 0 AS `parentworkflow`, `workflow`, `document`, `version`, NULL AS `state`, max(`date`) AS `date` FROM `tblWorkflowLog` WHERE `workflowdocumentcontent` = 0 GROUP BY `workflow`, `document`, `version`;
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
ALTER TABLE `tblWorkflowLog` ADD CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `parent` int(11) DEFAULT NULL AFTER `id`;
ALTER TABLE `tblWorkflowDocumentContent` ADD CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
ALTER TABLE `tblWorkflowDocumentContent` DROP COLUMN `parentworkflow`;
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_document`;
ALTER TABLE `tblWorkflowLog` DROP COLUMN `document`;
ALTER TABLE `tblWorkflowLog` DROP COLUMN `version`;
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_workflow`;
ALTER TABLE `tblWorkflowLog` DROP COLUMN `workflow`;
CREATE TABLE `tblUserSubstitutes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` int(11) DEFAULT null,
`substitute` int(11) DEFAULT null,
PRIMARY KEY (`id`),
UNIQUE (`user`, `substitute`),
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`substitute`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblDocumentCheckOuts` (
`document` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`userID` int(11) NOT NULL DEFAULT '0',
`date` datetime NOT NULL,
`filename` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`document`),
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblDocumentRecipients` (
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
`documentID` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`type` tinyint(4) NOT NULL DEFAULT '0',
`required` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`receiptID`),
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
CREATE TABLE `tblDocumentReceiptLog` (
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
`receiptID` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`date` datetime NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`receiptLogID`),
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
KEY `tblDocumentReceiptLog_user` (`userID`),
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblDocumentRevisors` (
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
`documentID` int(11) NOT NULL DEFAULT '0',
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`type` tinyint(4) NOT NULL DEFAULT '0',
`required` int(11) NOT NULL DEFAULT '0',
`startdate` datetime DEFAULT NULL,
PRIMARY KEY (`revisionID`),
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
CREATE TABLE `tblDocumentRevisionLog` (
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
`revisionID` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`date` datetime NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`revisionLogID`),
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
KEY `tblDocumentRevisionLog_user` (`userID`),
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblTransmittals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`comment` text NOT NULL,
`userID` int(11) NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`public` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblTransmittalItems` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`transmittal` int(11) NOT NULL DEFAULT '0',
`document` int(11) DEFAULT NULL,
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE (transmittal, document, version),
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblRoles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`role` smallint(1) NOT NULL DEFAULT '0',
`noaccess` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
ALTER TABLE `tblRoles` AUTO_INCREMENT=4;
ALTER TABLE tblUsers CHANGE role role int(11) NOT NULL;
UPDATE `tblUsers` SET role=3 WHERE role=0;
ALTER TABLE tblUsers ADD CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`);
CREATE TABLE `tblAros` (
`id` int(11) NOT NULL auto_increment,
`parent` int(11),
`model` text NOT NULL,
`foreignid` int(11) NOT NULL DEFAULT '0',
`alias` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblAcos` (
`id` int(11) NOT NULL auto_increment,
`parent` int(11),
`model` text NOT NULL,
`foreignid` int(11) NOT NULL DEFAULT '0',
`alias` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblArosAcos` (
`id` int(11) NOT NULL auto_increment,
`aro` int(11) NOT NULL DEFAULT '0',
`aco` int(11) NOT NULL DEFAULT '0',
`create` tinyint(4) NOT NULL DEFAULT '-1',
`read` tinyint(4) NOT NULL DEFAULT '-1',
`update` tinyint(4) NOT NULL DEFAULT '-1',
`delete` tinyint(4) NOT NULL DEFAULT '-1',
PRIMARY KEY (`id`),
UNIQUE (aco, aro),
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tblSchedulerTask` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`description` text DEFAULT NULL,
`disabled` smallint(1) NOT NULL DEFAULT '0',
`extension` varchar(100) DEFAULT NULL,
`task` varchar(100) DEFAULT NULL,
`frequency` varchar(100) DEFAULT NULL,
`params` text DEFAULT NULL,
`nextrun` datetime DEFAULT NULL,
`lastrun` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
UPDATE tblVersion set major=6, minor=0, subminor=0;
COMMIT;

View File

@ -1,52 +0,0 @@
Caution when you update seeddms with workflow mode `advanced`
=============================================================
The previous database layout for tracking the workflow state of a
document content was not very well done. It did not allow to run
the document through another workflow at a later time, expecially
the same workflow, e.g. for a scheduled revision of a document.
Technical details
==================
This update modifies the tables tblWorkflowDocumentContent and
tblWorkflowLog. It adds a new autoincrement field as a primary key
(id) to tblWorkflowDocumentContent and references that field in
tblWorkflowLog (workflowdocumentcontent). Till now the two tables
where linked by the fields `document`, `version`, and `workflow` which will
be replaced by the two new fields. The fields `document`, `version`, and
`workflow` will be removed from tblWorkflowLog. tblWorkflowDocumentContent
contained just the workflows currently active for a particlar document.
From now on the table will also contain finished workflows, which
will have the field `state` set to null. This allows to run even the
same workflow again and still be able to distinguish the log entries.
MySQL
------
The update process will first add the new auto incrementing, primary
field to tblWorkflowDocumentContent and a referencing field to
tblWorkflowLog. It will then fill out the referencing field with the
automatically incremented field value from tblWorkflowDocumentContent
by joining the two tables with its common fields document, version,
and workflow. This will not fill out all referencing field values,
because once a workflow has ended the record in
tblWorkflowDocumentContent will be deleted and just the records in
tblWorkflowLog are kept. The still missing records in
tblWorkflowDocumentContent for already completed workflows will be
reconstructed from the records in tblWorkflowLog which do not have a
reference to tblWorkflowDocumentContent yet. Once that is done the
referencing field in tblWorkflowLog can be filled in a second pass.
The date of the new records in tblWorkflowDocumentContent will be
taken from the last record for that workflow in tblWorkflowLog. The
state of the new records will be set null, indicating that this
workflow is no longer active.
SQLite
-------
The update process will first create new table for tblWorkflowDocumentContent
containing a new field for the primary key field. It then copies the
records from the old table to the new table. The missing records for
workflows which has been finished already are recreated from the old
table `tblWorkflowLog`. Which is then replaced by a new table having
the foreign key to table `tblWorkflowDocumentContent`.

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'معلومات عن توثيق ذو عاملين',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -398,6 +399,7 @@ URL: [url]',
'docs_in_reception_no_access' => 'الدخول مرفوض الى المستندات في الإستقبال',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'الدخول مرفوض الى المستندات قيد المراجعة',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'مستند',
'documentcontent' => 'موضوع المستند',
@ -969,6 +971,7 @@ URL: [url]',
'linked_to_this_version' => 'متعلقة بهذا الإصدار',
'link_alt_updatedocument' => 'اذا كنت تود تحميل ملفات اكبر من حجم الملفات المتاحة حاليا, من فضلك استخدم البديل <a href="%s">صفحة التحميل</a>.',
'link_document' => 'رابط المستند',
'link_to' => '',
'link_to_version' => 'رابط الإصدار',
'list_access_rights' => 'لائحة حقوق الدخول',
'list_contains_no_access_docs' => 'هذه الائحة لا تحتوي على مستندات للدخول',
@ -1157,6 +1160,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'لا يوجد سير عمل',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'التحقق من مستند/مجلد',
'objects_without_attribute' => '',
'object_check_critical' => 'التحقق من الشيء في حالة حرجة',
@ -1198,6 +1204,7 @@ URL: [url]',
'password_forgotten_title' => 'ارسال كلمة السر',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'تكرار كلمة السر',
'password_send' => 'أرسل كلمة السر',
'password_send_text' => 'أرسل نموذج كلمة السر',
@ -1225,6 +1232,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => 'حالة سابقة',
'previous_versions' => 'اصدارات سابقة',
'problematic_filename' => '',
'process' => 'سير العمل',
'process_without_user_group' => 'معالجة دون استعمال مستخدم من المجموعة',
'pt_BR' => 'البرتغالية (BR)',
@ -1295,6 +1303,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'تم اصلاحه',
'repairing_objects' => 'تحضير المستندات والمجلدات.',
'replace_content_email_body' => '',
@ -1617,6 +1626,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'طريقة البحث الافتراضية',
'settings_defaultSearchMethod_valdatabase' => 'طريقة البحث الافتراضية في قاعدة البيانات',
'settings_defaultSearchMethod_valfulltext' => 'طريقة البحث الافتراضية في جمل كاملة',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'مسح مثبت المجلد',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2078,6 +2091,7 @@ URL: [url]',
'splash_move_document' => 'نقل المستند',
'splash_move_folder' => 'نقل الملف',
'splash_notinherit_access' => 'لا يرث الوصول',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'استلام التحديث بنجاح',
'splash_removed_from_clipboard' => 'ازيل من الحافظة',
'splash_rm_attribute' => 'إزالة السمة',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -385,6 +386,7 @@ $text = array(
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Документ',
'documentcontent' => '',
@ -863,6 +865,7 @@ $text = array(
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Ако искате да качите файлове над текущия лимит, използвайте друг <a href="%s">начин</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Списък на права',
'list_contains_no_access_docs' => '',
@ -1035,6 +1038,9 @@ $text = array(
'no_workflows' => '',
'no_workflow_available' => '',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Проверка на Папка/Документ',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1076,6 +1082,7 @@ $text = array(
'password_forgotten_title' => 'Парола изпратена',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Повторете паролата',
'password_send' => '',
'password_send_text' => '',
@ -1103,6 +1110,7 @@ $text = array(
'preview_txt' => '',
'previous_state' => 'Предишно състояние',
'previous_versions' => 'Предишни версии',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Португалски (Бразилия)',
@ -1164,6 +1172,7 @@ $text = array(
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '',
'repairing_objects' => 'Поправка на папки и документи',
'replace_content_email_body' => '',
@ -1459,6 +1468,10 @@ $text = array(
'settings_defaultSearchMethod_desc' => '',
'settings_defaultSearchMethod_valdatabase' => '',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Изтрийте ENABLE_INSTALL_TOOL в папка конфигурация, за да започнете да използвате системата',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -1920,6 +1933,7 @@ $text = array(
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => '',
'splash_rm_attribute' => '',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -390,6 +391,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
'documentcontent' => '',
@ -868,6 +870,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => '',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Llista tots els tipus d\'accés...',
'list_contains_no_access_docs' => '',
@ -1040,6 +1043,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Carpeta / Comprobació del document',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1081,6 +1087,7 @@ URL: [url]',
'password_forgotten_title' => '',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => '',
'password_send' => '',
'password_send_text' => '',
@ -1108,6 +1115,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => '',
'previous_versions' => 'Versions anteriors',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Portuguès',
@ -1169,6 +1177,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '',
'repairing_objects' => '',
'replace_content_email_body' => '',
@ -1464,6 +1473,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '',
'settings_defaultSearchMethod_valdatabase' => '',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => '',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -1925,6 +1938,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => '',
'splash_rm_attribute' => '',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Tento systém vyžaduje dvoufaktorové ověření. Na svém mobilním telefonu budete potřebovat Google Authenticator. Níže vidíte dva QR kódy. Správný je vaše současné tajemství. Vlevo můžete nastavit nové tajemství. Pokud nastavíte nové tajemství, ujistěte se, že jste jej znovu otestovali pomocí služby Google Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'tajemství',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
'documentcontent' => 'Obsah dokumentu',
@ -1000,6 +1002,7 @@ URL: [url]',
'linked_to_this_version' => 'Provázáno odkazem s touto verzí',
'link_alt_updatedocument' => 'Chcete-li nahrát soubory větší než je maximální velikost pro nahrávání, použijte prosím <a href="%s">alternativní stránku</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => 'Provázat k verzi',
'list_access_rights' => 'Seznam všech přístupových práv ...',
'list_contains_no_access_docs' => 'Seznam obsahuje více dokumentů, ke kterým nemáte přístup a které se nezobrazují.',
@ -1188,6 +1191,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Není k dispozici žádné workflow',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Kontrola složky/dokumentu',
'objects_without_attribute' => '',
'object_check_critical' => 'Kritické chyby',
@ -1233,6 +1239,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'password_forgotten_title' => 'Heslo odesláno',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Opakujte heslo',
'password_send' => 'Heslo odesláno',
'password_send_text' => 'Vaše nové heslo bylo odesláno a zadanou emailovou adresu, pokud pro přihlašovací jméno a email existuje uživatel. Pokud neobdržíte email během příštích minut, pak se ujistěte se, že přihlašovací jméno a email jsou správné a proces zopakujte.',
@ -1260,6 +1267,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'preview_txt' => '',
'previous_state' => 'Předchozí stav',
'previous_versions' => 'Předešlé verze',
'problematic_filename' => '',
'process' => 'Proces',
'process_without_user_group' => 'Procesy bez uživatele / skupiny',
'pt_BR' => 'Portugalština (BR)',
@ -1341,6 +1349,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'opraveno',
'repairing_objects' => 'Opravuji dokumenty a složky.',
'replace_content_email_body' => '',
@ -1689,6 +1698,10 @@ Jméno: [username]
'settings_defaultSearchMethod_desc' => 'Výchozí metoda vyhledávání, když je vyhledávací formulář spuštěn v hlavním menu.',
'settings_defaultSearchMethod_valdatabase' => 'databáze',
'settings_defaultSearchMethod_valfulltext' => 'fulltext',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Chcete-li použít SeedDMS, musíte v konfiguračním adresáři odstranit soubor ENABLE_INSTALL_TOOL',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2150,6 +2163,7 @@ Jméno: [username]
'splash_move_document' => 'Dokument přesunut',
'splash_move_folder' => 'Složka přesunuta',
'splash_notinherit_access' => 'Přístupová práva již nejsou zděděna',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Příjem byl úspěšně přidán',
'splash_removed_from_clipboard' => 'Odstraněno ze schránky',
'splash_rm_attribute' => 'Atribut odstraněn',

View File

@ -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 (3444), dgrutsch (22)
// Translators: Admin (3461), dgrutsch (22)
$text = array(
'2_factor_auth' => '2-Faktor Authentifizierung',
@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Dieses System erfordert 2-Faktor-Authentifikation. Dazu brauchen Sie einen Authenticator auf Ihrem Mobiltelefon. Unten sehen Sie zwei QR-Codes. Der rechte Code beinhaltet Ihren aktuellen geheimen Schlüssel. Auf der linken Seite wird ein neuer Schlüssel angezeigt. Wenn Sie den neuen Schlüssel speichern, dann stellen Sie zuvor sicher, dass sie ihn mit Ihrem bevorzugten Authenticator (z.B. andOTP) zuvor eingescant haben.',
'2_fact_auth_current_secret' => 'Aktuelles Geheimnis',
'2_fact_auth_new_secret' => 'Neues Geheimnis',
'2_fact_auth_qrcode' => 'QR-Code',
'2_fact_auth_secret' => 'Schlüssel',
'abbr_day' => 'T.',
'abbr_hour' => 'St.',
@ -443,6 +444,7 @@ URL: [url]</p>',
'docs_in_reception_no_access' => 'Dokumente mit Empfangsbestätigung ohne Zugriff des Empfängers',
'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_link_to_itself' => 'Dokumente mit Verknüpfung zu sich selbst',
'docs_with_missing_revision_date' => 'Dokumente ohne Datum der Wiederholungsprüfung',
'document' => 'Dokument',
'documentcontent' => 'Dokumentenversion',
@ -1213,6 +1215,7 @@ URL: [url]</p>',
'linked_to_this_version' => 'Mit dieser Version verknüpft',
'link_alt_updatedocument' => 'Wenn Sie ein Dokument hochladen möchten, das größer als die maximale Dateigröße ist, dann benutzen Sie bitte die alternative <a href="%s">Upload-Seite</a>.',
'link_document' => 'Dokument verlinken',
'link_to' => '',
'link_to_version' => 'An Version hängen',
'list_access_rights' => 'Alle Zugriffsrechte auflisten ...',
'list_contains_no_access_docs' => 'Die Liste enthält weitere Dokumente auf die Sie keinen Zugriff haben und deshalb nicht angezeigt werden.',
@ -1421,6 +1424,9 @@ URL: [url]</p>',
'no_workflows' => 'Sie haben bisher keinen Workflow erstellt',
'no_workflow_available' => 'Kein Workflow verfügbar',
'number_count' => 'Anzahl',
'n_of_m_approved' => '[approved]/[total] freigegeben',
'n_of_m_reviewed' => '[reviewed]/[total] geprüft',
'n_of_m_revised' => '[revised]/[total] wiederholt geprüft',
'objectcheck' => 'Ordner- und Dokumentenprüfung',
'objects_without_attribute' => 'Objekte ohne dieses Attribut',
'object_check_critical' => 'Kritische Fehler',
@ -1478,6 +1484,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'password_forgotten_title' => 'Passwort gesendet',
'password_mismatch_error' => 'Passwörter sind nicht identisch',
'password_mismatch_error_title' => 'Passwörter sind nicht identisch',
'password_never_expires' => 'Passwort läuft nicht ab',
'password_repeat' => 'Passwort wiederholen',
'password_send' => 'Passwort verschickt',
'password_send_text' => 'Ihr neues Passwort wurde an die angegebene E-Mail-Adresse versandt, wenn ein Benutzer mit diesem Login und dieser E-Mail-Adresse existiert. Sollten Sie innerhalb der nächsten Minuten keine E-Mail bekommen, dann überprüfen Sie nochmal die Angaben und wiederholen Sie den Vorgang.',
@ -1505,6 +1512,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'preview_txt' => 'Vorschau als Text',
'previous_state' => 'Voriger Status',
'previous_versions' => 'Vorhergehende Versionen',
'problematic_filename' => 'Der Dateiname beinhaltet entweder Zeichen, die in manchen Dateisystemen nicht erlaubt oder problematisch sind, oder der Dateiname hat die falsche Endung. Der Dateiname wird beim Download eines Dokument und vom WebDAV Server verwendet.',
'process' => 'Prozess',
'process_without_user_group' => 'Prozesse ohne Benutzer/Gruppe',
'pt_BR' => 'Portugiesisch (BR)',
@ -1629,7 +1637,8 @@ URL: [url]</p>',
'remove_marked_files' => 'Markierte Dateien löschen',
'remove_review_log' => 'Einzelne Prüfung entfernen',
'remove_task' => 'Task entfernen',
'reorder' => 'Neu ortnen',
'reorder' => 'Neu ordnen',
'reorder_documents_in_folder' => 'Vergibt für alle Dokumente eines Ordners neue Sequenznummern beginnend bei 1.0',
'repaired' => 'repariert',
'repairing_objects' => 'Repariere Dokumente und Ordner.',
'replace_content_email_body' => 'Die letzte Version des Dokuments wurde ersetzt.
@ -2080,6 +2089,10 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'settings_defaultSearchMethod_desc' => 'Voreingestellte Suchmethode, wenn über das Suchfeld in der Menüleiste gesucht wird.',
'settings_defaultSearchMethod_valdatabase' => 'Datenbank',
'settings_defaultSearchMethod_valfulltext' => 'Volltext',
'settings_defaultThumbnailClick' => 'Aktion nach Anklicken eines Vorschaubildes',
'settings_defaultThumbnailClick_desc' => 'Diese Aktion wird ausgeführt, wenn auf ein Vorschaubild geklickt wird.',
'settings_defaultThumbnailClick_valdownload' => 'Dokument herunterladen',
'settings_defaultThumbnailClick_valviewonline' => 'Dokument online anschauen',
'settings_delete_install_folder' => 'Um SeedDMS nutzen zu können, müssen Sie die Datei ENABLE_INSTALL_TOOL aus dem Konfigurationsverzeichnis löschen.',
'settings_disableChangePassword' => 'Kein Ändern des eigenen Passworts',
'settings_disableChangePassword_desc' => 'Anwählen, um das Ändern des eigenen Passworts zu unterbinden. Schalten Sie dies ein, wenn LDAP-Authentifizierung verwendet wird. Es verhindert, dass Benutzer ein Passwort in der Datenbank setzen und damit die LDAP-Authentifizierung umgehen.',
@ -2541,6 +2554,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'splash_move_document' => 'Dokument verschoben',
'splash_move_folder' => 'Ordner verschoben',
'splash_notinherit_access' => 'Zugriffsrechte werden nicht mehr geerbt',
'splash_orig_filename_changed' => 'Originaler Dateiname geändert',
'splash_receipt_update_success' => 'Empfangsbestätigung hinzugefügt',
'splash_removed_from_clipboard' => 'Aus der Zwischenablage entfernt',
'splash_rm_attribute' => 'Attribut gelöscht',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -385,6 +386,7 @@ $text = array(
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Έγγραφο',
'documentcontent' => '',
@ -863,6 +865,7 @@ $text = array(
'linked_to_this_version' => '',
'link_alt_updatedocument' => '',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Εμφάνισε όλα τα δικαιώματα πρόσβασης',
'list_contains_no_access_docs' => '',
@ -1046,6 +1049,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Αναζήτηση σε αρχεία και φακέλους',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1087,6 +1093,7 @@ URL: [url]',
'password_forgotten_title' => '',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => '',
'password_send' => '',
'password_send_text' => '',
@ -1114,6 +1121,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => '',
'previous_versions' => '',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Πορτογαλικά',
@ -1175,6 +1183,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '',
'repairing_objects' => '',
'replace_content_email_body' => '',
@ -1470,6 +1479,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '',
'settings_defaultSearchMethod_valdatabase' => '',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => '',
'settings_disableChangePassword' => 'Disable changing password',
'settings_disableChangePassword_desc' => '',
@ -1931,6 +1944,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => '',
'splash_rm_attribute' => '',

View File

@ -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 (2547), archonwang (3), dgrutsch (9), netixw (14)
// Translators: Admin (2561), archonwang (3), dgrutsch (9), netixw (14)
$text = array(
'2_factor_auth' => '2-factor authentication',
@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'This system enforces 2 factor authentication. You will need an Authenticator on your mobile phone. Below you see two QR codes. The right one is your current secret. On the left you can set a new secret. If you set a new secret make sure to rescan it with your preffered authenticator, e.g. andOTP.',
'2_fact_auth_current_secret' => 'Current secret',
'2_fact_auth_new_secret' => 'New secret',
'2_fact_auth_qrcode' => 'QR code',
'2_fact_auth_secret' => 'Secret',
'abbr_day' => 'd',
'abbr_hour' => 'h',
@ -443,6 +444,7 @@ URL: [url]</p>',
'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_link_to_itself' => 'Documents with link to itself',
'docs_with_missing_revision_date' => 'Documents withoug date of revision',
'document' => 'Document',
'documentcontent' => 'Document content',
@ -1213,6 +1215,7 @@ URL: [url]</p>',
'linked_to_this_version' => 'Linked to this version',
'link_alt_updatedocument' => 'If you would like to upload files bigger than the current maximum upload size, please use the alternative <a href="%s">upload page</a>.',
'link_document' => 'Link document',
'link_to' => '',
'link_to_version' => 'Attach to version',
'list_access_rights' => 'List all access rights ...',
'list_contains_no_access_docs' => 'The list contains more documents you have no access to and are not displayed.',
@ -1423,6 +1426,9 @@ URL: [url]</p>',
'no_workflows' => 'You have not created a workflow yet',
'no_workflow_available' => 'No workflow available',
'number_count' => 'number',
'n_of_m_approved' => '[approved]/[total] approved',
'n_of_m_reviewed' => '[reviewed]/[total] reviewed',
'n_of_m_revised' => '[revised]/[total] revised',
'objectcheck' => 'Folder/Document check',
'objects_without_attribute' => 'Objects without this attribute',
'object_check_critical' => 'Critical errors',
@ -1480,6 +1486,7 @@ If you still have problems to login, then please contact your administrator.',
'password_forgotten_title' => 'Password sent',
'password_mismatch_error' => 'Passwords mismatch',
'password_mismatch_error_title' => 'Passwords mismatch',
'password_never_expires' => 'Password never expires',
'password_repeat' => 'Repeat password',
'password_send' => 'Password send',
'password_send_text' => 'Your new password has been send to the given email address, if the login and email matches an existing user. If you do not receive an email within the next minutes, then make sure both login and email are correct and restart the process again.',
@ -1507,6 +1514,7 @@ If you still have problems to login, then please contact your administrator.',
'preview_txt' => 'Preview text',
'previous_state' => 'Previous state',
'previous_versions' => 'Previous versions',
'problematic_filename' => 'The filename contains either chars which are not allowed or may cause problems in some file systems or has the wrong extension. This filename is used when downloading the document and also by the webdav server.',
'process' => 'Process',
'process_without_user_group' => 'Processes without user/group',
'pt_BR' => 'Portugese (BR)',
@ -1632,6 +1640,7 @@ URL: [url]</p>',
'remove_review_log' => 'Remove review',
'remove_task' => 'Remove task',
'reorder' => 'Reorder',
'reorder_documents_in_folder' => 'Assign new sequence numbers to all documents of a folder starting at 1.0',
'repaired' => 'repaired',
'repairing_objects' => 'Repairing documents and folders.',
'replace_content_email_body' => 'The last version of the document has been replaced.
@ -2082,6 +2091,10 @@ If you did not receive a password, please use the password forgotten function on
'settings_defaultSearchMethod_desc' => 'Default search method, when a search is started by the search form in the main menu.',
'settings_defaultSearchMethod_valdatabase' => 'database',
'settings_defaultSearchMethod_valfulltext' => 'fulltext',
'settings_defaultThumbnailClick' => 'Action when clicking on thumbnail',
'settings_defaultThumbnailClick_desc' => 'This action will be executed when a thumbnail is clicked.',
'settings_defaultThumbnailClick_valdownload' => 'Download document',
'settings_defaultThumbnailClick_valviewonline' => 'View document online',
'settings_delete_install_folder' => 'In order to use SeedDMS, you must delete the file ENABLE_INSTALL_TOOL in the configuration directory',
'settings_disableChangePassword' => 'Disallow changing own password',
'settings_disableChangePassword_desc' => 'If checked the user cannot change his/her password. Turn this on if LDAP authentication is used. It prevents setting a database password and circumvent LDAP authentication.',
@ -2543,6 +2556,7 @@ If you did not receive a password, please use the password forgotten function on
'splash_move_document' => 'Document moved',
'splash_move_folder' => 'Folder moved',
'splash_notinherit_access' => 'Access rights no longer inherited',
'splash_orig_filename_changed' => 'Original filename changed',
'splash_receipt_update_success' => 'Reception added successfully',
'splash_removed_from_clipboard' => 'Removed from clipboard',
'splash_rm_attribute' => 'Attribute removed',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -405,6 +406,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
'documentcontent' => 'Contenido del documento',
@ -984,6 +986,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Si desea subir archivos mayores que el tamaño máximo actualmente permitido, por favor, utilice la <a href="%s">página de subida</a> alternativa.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Listar los derechos de acceso',
'list_contains_no_access_docs' => '',
@ -1172,6 +1175,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Chequeo de carpeta/documento',
'objects_without_attribute' => '',
'object_check_critical' => 'Errores críticos',
@ -1221,6 +1227,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'password_forgotten_title' => 'Envío de contraseña',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Repetir contraseña',
'password_send' => 'Envío de contraseña',
'password_send_text' => 'Su nueva contraseña fue enviada al e-mail registrado.',
@ -1248,6 +1255,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'preview_txt' => '',
'previous_state' => 'Estado anterior',
'previous_versions' => 'Versiones anteriores',
'problematic_filename' => '',
'process' => 'Proceso',
'process_without_user_group' => 'Procesos sin usuario/grupo',
'pt_BR' => 'Portuges (BR)',
@ -1318,6 +1326,7 @@ nURL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'Reparado',
'repairing_objects' => 'Reparando documentos y carpetas.',
'replace_content_email_body' => '',
@ -1640,6 +1649,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'Método de búsqueda por defecto, cuando se inicia una búsqueda mediante el formulario en el menú principal',
'settings_defaultSearchMethod_valdatabase' => 'base de datos',
'settings_defaultSearchMethod_valfulltext' => 'Todo el texto',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Para utilizar SeedDMS, debe eliminar el archivo ENABLE_INSTALL_TOOL de la carpeta de configuración',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2101,6 +2114,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Eliminado del portapapeles',
'splash_rm_attribute' => 'Atributo eliminado',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Ce système requiert une authentification à deux facteurs. Cela nécessite linstallation de Google Authenticator sur votre téléphone mobile. Ci-dessous sont visibles deux QR codes. Celui de droite correspond à votre clé secrète actuelle. Celui de gauche permet de définir une nouvelle clé secrète. Lorsque vous définissez une nouvelle clé secrète, assurez-vous de la scanner avec Google Authenticator.',
'2_fact_auth_current_secret' => 'Clé secrète actuelle',
'2_fact_auth_new_secret' => 'Nouvelle clé secrète',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Clé secrète',
'abbr_day' => 'j',
'abbr_hour' => 'h',
@ -434,6 +435,7 @@ URL : [url]</p>',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
'documentcontent' => 'Version de document',
@ -1168,6 +1170,7 @@ URL : [url]</p>',
'linked_to_this_version' => 'Lié à cette version',
'link_alt_updatedocument' => 'Pour déposer des fichiers de taille supérieure, utilisez la <a href="%s">page d\'ajout multiple</a>.',
'link_document' => 'Lien vers le document',
'link_to' => '',
'link_to_version' => 'Version',
'list_access_rights' => 'Liste des droits daccès…',
'list_contains_no_access_docs' => 'La liste contient des documents auxquels vous navez pas accès et qui ne sont donc pas affichés.',
@ -1378,6 +1381,9 @@ URL : [url]</p>',
'no_workflows' => 'Vous navez pas encore créé de workflow',
'no_workflow_available' => 'Aucun workflow disponible',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Vérification des dossiers et documents',
'objects_without_attribute' => '',
'object_check_critical' => 'Erreurs critiques',
@ -1433,6 +1439,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'password_forgotten_title' => 'Mot de passe envoyé',
'password_mismatch_error' => 'Les mots de passe ne correspondent pas',
'password_mismatch_error_title' => 'Les mots de passe ne correspondent pas',
'password_never_expires' => '',
'password_repeat' => 'Répétez le mot de passe',
'password_send' => 'Envoi du mot de passe',
'password_send_text' => 'Votre nouveau mot de passe a été envoyé à l\'adresse fournie (si l\'identifiant et l\'adresse e-mail correspondent à un utilisateur existant). Si vous ne recevez rien dans les minutes qui suivent, assurez-vous que l\'identifiant et l\'adresse e-mail sont corrects puis relancez le processus.',
@ -1460,6 +1467,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'preview_txt' => '',
'previous_state' => 'État précédent',
'previous_versions' => 'Versions précédentes',
'problematic_filename' => '',
'process' => 'Processus',
'process_without_user_group' => 'Processus sans utilisateur/groupe',
'pt_BR' => 'Portuguais (BR)',
@ -1585,6 +1593,7 @@ URL : [url]</p>',
'remove_review_log' => 'Vérification retirée',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'réparé',
'repairing_objects' => 'Réparation des documents et des dossiers.',
'replace_content_email_body' => 'La dernière version du document a été remplacée.
@ -2027,6 +2036,10 @@ Nom : [username]
'settings_defaultSearchMethod_desc' => 'Méthode de recherche par défaut, lorsque la recherche est exécutée depuis le moteur de recherche du menu principal',
'settings_defaultSearchMethod_valdatabase' => 'base de données',
'settings_defaultSearchMethod_valfulltext' => 'Plein texte (contenu)',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Pour utiliser SeedDMS, vous devez supprimer le fichier ENABLE_INSTALL_TOOL dans le répertoire de configuration',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2488,6 +2501,7 @@ Nom : [username]
'splash_move_document' => 'Document déplacé',
'splash_move_folder' => 'Dossier déplacé',
'splash_notinherit_access' => 'Les droits daccès ne sont plus hérités',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Réception ajoutée avec succès',
'splash_removed_from_clipboard' => 'Supprimé du presse-papier',
'splash_rm_attribute' => 'Attribut supprimé',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Podaci o autentifikaciji 2 faktora',
'2_fact_auth_current_secret' => '2 činjenica auth trenutna tajna',
'2_fact_auth_new_secret' => '2 činjenica auth nova tajna',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '2 činjenica auth tajna',
'abbr_day' => 'skratiti dan',
'abbr_hour' => 'skraćivati sat',
@ -410,6 +411,7 @@ Internet poveznica: [url]',
'docs_in_reception_no_access' => 'nema pristupa dokumentima na recepciji',
'docs_in_revision_disabled' => 'dokumenti u reviziji onemogućeni',
'docs_in_revision_no_access' => 'dokumenti u reviziji nemaju pristup',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => 'dokumenata kojima nedostaje datum revizije',
'document' => 'Dokument',
'documentcontent' => 'sadržaj dokumenta',
@ -981,6 +983,7 @@ Internet poveznica: [url]',
'linked_to_this_version' => 'povezan s ovom verzijom',
'link_alt_updatedocument' => 'Ako želite prenijeti datoteke veće od trenutne maksimalne veličine prijenosa, molimo koristite alternativu <a href="%s">upload page</a>.',
'link_document' => 'link dokument',
'link_to' => '',
'link_to_version' => 'poveznica na verziju',
'list_access_rights' => 'Izlistaj sve dozvole pristupa',
'list_contains_no_access_docs' => 'popis ne sadrži pristupne dokumente',
@ -1168,6 +1171,9 @@ Internet poveznica: [url]',
'no_workflows' => 'nema radnih procesa',
'no_workflow_available' => 'Nema dostupnog toka rada',
'number_count' => 'brojati broj',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Provjera mapa / dokumenata',
'objects_without_attribute' => 'objekti bez atributa',
'object_check_critical' => 'provjera objekta kritična',
@ -1217,6 +1223,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'password_forgotten_title' => 'Lozinka je poslana',
'password_mismatch_error' => 'pogreška nepodudaranja lozinke',
'password_mismatch_error_title' => 'pogreška nepodudaranja lozinke naslov',
'password_never_expires' => '',
'password_repeat' => 'Ponovi lozinku',
'password_send' => 'Pošalji lozinku',
'password_send_text' => 'Vaša nova lozinka je poslana na navedenu e-mail adresu, ako login i e-mail odgovaraju postojećem korisniku. Ako ne primite e-mail u narednim minutama, tada provjerite da su login i e-mail ispravni te ponovite postupak.',
@ -1244,6 +1251,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'preview_txt' => 'pretpregled txt',
'previous_state' => 'Prethodni status',
'previous_versions' => 'Prethodne verzije',
'problematic_filename' => '',
'process' => 'proces',
'process_without_user_group' => 'nastavi bez usera/grupe',
'pt_BR' => 'Portugalski (BR)',
@ -1314,6 +1322,7 @@ Internet poveznica: [url]',
'remove_review_log' => 'ukloniti dnevnik pregleda',
'remove_task' => 'ukloniti zadatak',
'reorder' => 'preurediti',
'reorder_documents_in_folder' => '',
'repaired' => 'popravljeno',
'repairing_objects' => 'Popravljanje dokumenata ili mapa.',
'replace_content_email_body' => 'zamijeni sadržaj e-pošte tijelo',
@ -1653,6 +1662,10 @@ Internet poveznica: [url]',
'settings_defaultSearchMethod_desc' => 'Zadana metoda pretrage, kada se pretraživanje pokreće putem formulara iz glavnog izbornika',
'settings_defaultSearchMethod_valdatabase' => 'baza podataka',
'settings_defaultSearchMethod_valfulltext' => 'puni tekst',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Da bi koristili ProsperaDMS, morate izbrisati datoteku ENABLE_INSTALL_TOOL u mapi konfiguracije',
'settings_disableChangePassword' => 'postavke onemogućiPromijeni lozinku',
'settings_disableChangePassword_desc' => 'postavke onemogućiPromijeni lozinku desc',
@ -2114,6 +2127,7 @@ Internet poveznica: [url]',
'splash_move_document' => 'splash premjestiti dokument',
'splash_move_folder' => 'splash premjestiti folder',
'splash_notinherit_access' => 'splash notinherit pristup',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'splash potvrda ažuriranje uspješno',
'splash_removed_from_clipboard' => 'Uklonjeno iz međuspremnika',
'splash_rm_attribute' => 'Atribut uklonjen',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'A rendszernek két faktoros hitelesítése van. Szükséged lesz a Google Authenticator-ra a mobil telefonodon. Lejebb látható két QR kód. A jobb oldali a saját jelszavát, a baloldali egy új titkos jelszót tartalmaz. Ha új jelszót szeretne beállítani, szkennelje be újra a Goolge Authenticator-al.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Titkos',
'abbr_day' => '',
'abbr_hour' => '',
@ -405,6 +406,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokumentum',
'documentcontent' => '',
@ -975,6 +977,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Ha a jelenlegi maximális feltöltési méretnél nagyobb állományokat szeretne feltölteni, akkor használja az alternatív <a href="%s">feltöltő oldalt</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Összes jogosultság felsorolása...',
'list_contains_no_access_docs' => '',
@ -1163,6 +1166,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Mappa/Dokumentum ellenőrzés',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1212,6 +1218,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'password_forgotten_title' => 'Jelszó küldés',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Jelszó mégegyszer',
'password_send' => 'Jelszó elküldve',
'password_send_text' => 'Új jelszót küld Önnek a megadott email címre, amennyiben a felhasználónév és az email cím megfelel egy létező felhasználónak. Amennyiben néhány percen belül nem kapja meg az email-t, akkor ellenőrizze a felhasználónevet és email címet és indítsa újra a folyamatot.',
@ -1239,6 +1246,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'preview_txt' => '',
'previous_state' => 'Előző állapot',
'previous_versions' => 'Előző változatok',
'problematic_filename' => '',
'process' => 'Folyamat',
'process_without_user_group' => 'Felhasználó / csoport nélküli folyamatok',
'pt_BR' => 'Portugál (BR)',
@ -1309,6 +1317,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'javított',
'repairing_objects' => 'Dokumentumok és mappák helyreállítása',
'replace_content_email_body' => '',
@ -1630,6 +1639,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '',
'settings_defaultSearchMethod_valdatabase' => 'adatbázis',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'A SeedDMS használatához törölnie kell a konfigurációs könyvtárban található ENABLE_INSTALL_TOOL állományt.',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2091,6 +2104,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Eltávolítva a vágólapról',
'splash_rm_attribute' => 'Jellemző eltávolítva',

View File

@ -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 (489), atoz-chevara (835)
// Translators: Admin (490), atoz-chevara (835)
$text = array(
'2_factor_auth' => '',
@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => 'Kunci rahasi saat ini',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Rahasia',
'abbr_day' => '',
'abbr_hour' => '',
@ -414,6 +415,7 @@ URL: [url]</p>',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'Dokumen dalam revisi tanpa akses oleh revisor',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokumen',
'documentcontent' => 'Isi dokumen',
@ -1059,6 +1061,7 @@ URL: [url]</p>',
'linked_to_this_version' => 'Tertaut ke versi ini',
'link_alt_updatedocument' => '',
'link_document' => 'Tautan dokumen',
'link_to' => '',
'link_to_version' => 'Lampirkan ke versi',
'list_access_rights' => 'Daftar semua hak akses ...',
'list_contains_no_access_docs' => '',
@ -1256,6 +1259,9 @@ URL: [url]',
'no_workflows' => 'Anda belum membuat alur kerja',
'no_workflow_available' => 'Tidak ada alur kerja yang tersedia',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Pemeriksaan Folder/Dokumen',
'objects_without_attribute' => '',
'object_check_critical' => 'Kesalahan kritis',
@ -1313,6 +1319,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'password_forgotten_title' => 'Kirim kata sandi',
'password_mismatch_error' => 'Kata sandi tidak cocok',
'password_mismatch_error_title' => 'Kata sandi tidak cocok',
'password_never_expires' => '',
'password_repeat' => 'Ulangi kata sandi',
'password_send' => 'Kata sandi terkirim',
'password_send_text' => 'Kata sandi baru Anda telah dikirim ke alamat email yang diberikan, jika login dan email cocok dengan pengguna yang ada. Jika Anda tidak menerima email dalam beberapa menit berikutnya, pastikan login dan email sudah benar dan mulai ulang prosesnya lagi.',
@ -1340,6 +1347,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'preview_txt' => '',
'previous_state' => '',
'previous_versions' => 'Versi sebelumnya',
'problematic_filename' => '',
'process' => 'Proses',
'process_without_user_group' => 'Proses tanpa pengguna/kelompok',
'pt_BR' => 'Portugis (BR)',
@ -1418,6 +1426,7 @@ URL: [url]',
'remove_review_log' => 'Hapus ulasan',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'diperbaiki',
'repairing_objects' => 'Memperbaiki dokumen dan folder.',
'replace_content_email_body' => '',
@ -1720,6 +1729,10 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'settings_defaultSearchMethod_desc' => 'Metode pencarian default, ketika pencarian dimulai dengan formulir pencarian di menu utama.',
'settings_defaultSearchMethod_valdatabase' => 'basis data',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Untuk menggunakan SeedDMS, Anda harus menghapus file ENABLE_INSTALL_TOOL di direktori konfigurasi',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2181,6 +2194,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'splash_move_document' => 'Dokumen dipindahkan',
'splash_move_folder' => 'Folder dipindahkan',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => '',
'splash_rm_attribute' => 'Label dihapus',
@ -2432,7 +2446,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'versioning_file_creation_warning' => '',
'versioning_info' => 'Info versi',
'versiontolow' => 'Versi terlalu rendah',
'version_comment' => '',
'version_comment' => 'komen versi',
'version_comment_changed_email_body' => '',
'version_comment_changed_email_body_html' => '',
'version_comment_changed_email_subject' => '',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Questo sistema usa autenticazione a due fattori. Sarà necessario il “Google Authenticator” sul tuo telephono cellulare. Qui potete vedere due codici QR. Quello di destra è il tuo segreto. è sulla sinistra chè un nuovo segreto. Se si imposta un nuovo segreto per assicurarsi si deve scansione con “Google Authenticator” di nuovo.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Segreto',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
'documentcontent' => 'Contenuto documento',
@ -982,6 +984,7 @@ URL: [url]',
'linked_to_this_version' => 'Collegato a questa versione',
'link_alt_updatedocument' => 'Se vuoi caricare file più grandi del limite massimo attuale, usa la <a href="%s">pagina alternativa di upload</a>.',
'link_document' => 'Collegamento al documento',
'link_to' => '',
'link_to_version' => 'Collega alla versione',
'list_access_rights' => 'Elenca tutti i diritti di accesso...',
'list_contains_no_access_docs' => 'L\'elenco contiene più documenti ai quali non si ha accesso e non vengono visualizzati.',
@ -1170,6 +1173,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Nessun flusso di lavoro disponibile',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Controllo cartelle o documenti',
'objects_without_attribute' => '',
'object_check_critical' => 'Errori critici',
@ -1219,6 +1225,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'password_forgotten_title' => 'Password inviata',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Ripetere password',
'password_send' => 'Invia la password',
'password_send_text' => 'La nuova password è stata inviata all\'indirizzo email fornito, nel caso in cui login ed email siano nel database e corrispondano ad un utente. Qualora non si fosse ricevuto alcun messaggio nei prossimi minuti, si prega di controllare che login ed email siano corretti e provare di nuovo.',
@ -1246,6 +1253,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'preview_txt' => '',
'previous_state' => 'Stato precedente',
'previous_versions' => 'Versioni precedenti',
'problematic_filename' => '',
'process' => 'Processi',
'process_without_user_group' => 'Processi senza Utente/Gruppo',
'pt_BR' => 'Portoghese (BR)',
@ -1327,6 +1335,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'riparato',
'repairing_objects' => 'Riparazione documenti e cartelle in corso...',
'replace_content_email_body' => '',
@ -1676,6 +1685,10 @@ Name: [username]
'settings_defaultSearchMethod_desc' => 'Metodo di ricerca predefinito, quando la ricerca viene avviata dal modulo di ricerca nel menu principale.',
'settings_defaultSearchMethod_valdatabase' => 'database',
'settings_defaultSearchMethod_valfulltext' => 'Testo intero',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Per poter usare SeedDMS, devi cancellare il file ENABLE_INSTALL_TOOL nella cartella di configurazione.',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2137,6 +2150,7 @@ Name: [username]
'splash_move_document' => 'Documento spostato',
'splash_move_folder' => 'Cartella spostato',
'splash_notinherit_access' => 'I diritti di accesso non sono più ereditati',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Ricevuta aggiunta con successo',
'splash_removed_from_clipboard' => 'Rimosso dagli appunti',
'splash_rm_attribute' => 'Attributo rimosso',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '시크릿',
'abbr_day' => '',
'abbr_hour' => '',
@ -413,6 +414,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => '문서',
'documentcontent' => '',
@ -982,6 +984,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => '최대 업로드 크기보다 큰 파일을 업로드하려는 경우, 대체 업로드 페이지를 <a href="%s">upload page</a> 사용하십시오.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => '모든 접근 권한 나열',
'list_contains_no_access_docs' => '',
@ -1170,6 +1173,9 @@ URL [url]',
'no_workflows' => '',
'no_workflow_available' => '사용 가능한 워크 플로우 없습니다.',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => '폴더 / 문서 확인',
'objects_without_attribute' => '',
'object_check_critical' => '치명적 오류',
@ -1211,6 +1217,7 @@ URL [url]',
'password_forgotten_title' => '비밀번호 전송',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => '암호 반복',
'password_send' => '비밀번호 전송',
'password_send_text' => '로그인 및 이메일이 기존 사용자와 일치하는 경우 새 암호가 지정된 이메일 주소로 전송됩니다. 당신이 잠시후 이메일을 수신하지 못했으면 반드시 로그인 및 이메일 모두가 올바른지 확인하고 프로세스를 다시 시작 하세요.',
@ -1238,6 +1245,7 @@ URL [url]',
'preview_txt' => '',
'previous_state' => '이전 상태',
'previous_versions' => '이전 버전',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => '포르투갈어 (BR)',
@ -1308,6 +1316,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '복구',
'repairing_objects' => '문서 및 폴더 복구',
'replace_content_email_body' => '',
@ -1647,6 +1656,10 @@ URL : [url]',
'settings_defaultSearchMethod_desc' => '기본 검색 설정',
'settings_defaultSearchMethod_valdatabase' => '기본 검색 방법 설정',
'settings_defaultSearchMethod_valfulltext' => '기본 검색 방법 설정',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'SeedDMS을 사용하려면 구성 디렉토리의 파일 ENABLE_INSTALL_TOOL을 삭제해야합니다',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2108,6 +2121,7 @@ URL : [url]',
'splash_move_document' => '문서 옮겨짐',
'splash_move_folder' => '폴더 옮겨짐',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => '클립 보드에서 제거',
'splash_rm_attribute' => '속성 제거',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'ລະບົບນີ້ໄຊ້ການກວດສອບແບບ 02 ປັດໃຈ. ເຈົ້າຈະຕ້ອງມີ Google Authenticator ໃນໂທລະສັບມືຖືຂອງທ່ານ. ດ້ານລຸ່ມແມ່ນມີ QR Codes ສອງແບບ ທາງດ້ານຂວາຈະມີຄວາມເປັນສ່ວນຕົວຂອງເຈົ້າ, ສ່ວນດ້ານຊ້າຍຂອງເຈົ້າແມ່ນຈະສາມາດຕັ້ງຄ່າຄວາມເປັນສ່ວນຕົວໄຫມ່. ຖ້າເຈົ້າຕັ້ງຄ່າຄວາມເປັນສ່ວນຕົວໄຫມ່ຮຽບຮ້ອຍ ແລ້ວນັ້ນໃຫ້ແນ່ໃຈວ່າໄດ້ສະແກນອີກຄັ້ງດ້ວຍ Google Authenticator',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'ຄວາມລັບ',
'abbr_day' => '',
'abbr_hour' => '',
@ -408,6 +409,7 @@ URL: [url]',
'docs_in_reception_no_access' => 'ເອກະສານທີ່ໄດ້ຮັບແມ່ນບໍ່ສາມາດເຂົ້າເບີ່ງໄດ້',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => 'ເອກະສານທີ້ແກ້ໄຂໂດຍບໍ່ຕ້ອງເຂົ້າໄຊ້ງານ',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'ຟື້ນທີ່ວ່າງໃນດິສ',
'documentcontent' => 'ເນື້ອຫາເອກະສານ',
@ -979,6 +981,7 @@ URL: [url]',
'linked_to_this_version' => 'ເຊື່ອມໂຍງກັບເວີຊັນນີ້ແລ້ວ',
'link_alt_updatedocument' => 'ຖ້າເຈົ້າຕ້ອງການອັບໂຫລດໄຟລທີ່ໄຫ່ຍກວ່າຂະໜາດອັບໂຫລດສູງສຸດໃນປັດຈຸບັນກະລຸນາໄຊ້ <a href="%s"> ອັບໂຫລດຢູ່ຫ້າເຟສ </a>',
'link_document' => '',
'link_to' => '',
'link_to_version' => 'ແນບໄປພ້ອມກັບເວີຊັນ',
'list_access_rights' => 'ສະແດງສິດທິການເຂົ້າເຖິງທັງໝົດ ...',
'list_contains_no_access_docs' => 'ລິດລາຍການປະກອບດ້ວຍເອກະສານເພີ່ມເຕີມທີ່ເຈົ້າບໍ່ສາມາດເຂົ້າເຖິງໄດ້ ແລະບໍ່ສະແດງ',
@ -1167,6 +1170,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'ບໍ່ມີເວີກໂຟລທີ່ພ້ອມໄຊ້ງານ',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'ການກວດສອບໂຟລເດີ / ເອກະສານ',
'objects_without_attribute' => '',
'object_check_critical' => 'ຂໍ້ຜິດພາດທີ່ສຳຄັນ',
@ -1216,6 +1222,7 @@ URL: [url]',
'password_forgotten_title' => 'ສົ່ງລະຫັດຜ່ານ',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'ຢຳລະຫັດຜ່ານ',
'password_send' => 'ສົ່ງລະຫັດຜ່ານ',
'password_send_text' => 'ລະຫັດຜ່ານໄຫມ່ຂອງເຈົ້າໄດ້ຖືກສົ່ງໄປຕາມທີ່ຢູ່ຂອງອີເມວ, ຖ້າການເຂົ້າລະບົບ ແລະອີເມວກົງກັບຜູ້ໄຊ້ທີມີຢູ່, ຖ້າເຈົ້າບໍ່ໄດ້ຮັບອີເມວພາຍຫຼັງນາທີທັດໄປ, ກວດຄືນໃຫ້ແນ່ໃຈວ່າທັ່ງການ Login ເຂົ້າສູ້ລະບົບ ແລະອີເມວວ່າຖືກຕ້ອງແລະເລີ່ມຕົ້ນດຳເນີນການໄຫມ່ອີກຄັ້ງ',
@ -1243,6 +1250,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => 'ສະຖານະກ່ອນຫນ້າ',
'previous_versions' => 'ເວີຊັນກ່ອນໜ້າ',
'problematic_filename' => '',
'process' => 'ຂະບວນການ',
'process_without_user_group' => 'ຂະບວນການຍັງບໍ່ມີຜູ້ໄຊ້/ ກຸ່ມ',
'pt_BR' => 'ໂປຕຸເກດ(BR)',
@ -1324,6 +1332,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'ການສ້ອມແປງ',
'repairing_objects' => 'ການສ້ອມແປງເອກະສານແລະໂຟລເດີ',
'replace_content_email_body' => '',
@ -1673,6 +1682,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'ວິທີການຄົ້ນຫາແບບເລີ້ມຕົ້ນ ເມືອການຄົ້ນຫາເລີ່ມຈາກແບບຟອມການຄົ້ນຫາໃນເມນູ',
'settings_defaultSearchMethod_valdatabase' => 'ຖານຂໍ້ມູນ',
'settings_defaultSearchMethod_valfulltext' => 'ຂໍ້ຄວາມເຕັມ',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'ໃນການໄຊ້ SeedDMS, ເຈົ້າຈະຕ້ອງລົບໄຟລ ເປີດໄຊ້ງານ_ຕິດຕັ້ງ_ເຄື່ອງມືໃນການບໍລິຫານ ການກຳນົດຄ່າ',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2134,6 +2147,7 @@ URL: [url]',
'splash_move_document' => 'ຍ້າຍເອກະສານແລ້ວ',
'splash_move_folder' => 'ຍ້າຍໂຟລເດີແລ້ວ',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'ການເພີ່ມຂໍ້ມູນໄດ້ສຳເລັດແລ້ວ',
'splash_removed_from_clipboard' => 'ຍ້າຍອອກຈາກຄິບບອດ',
'splash_rm_attribute' => 'ນຳແອັດທີບິວອອກແລ້ວ',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Dette systemet håndhever 2-faktor autentisering. Du trenger Google Authenticator på mobiltelefonen din. Nedenfor ser du to QR-koder. Den rette er din nåværende hemmelighet. På venstre side kan du angi en ny hemmelighet. Hvis du angir en ny hemmelighet, må du huske å skanne den på nytt med Google Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Hemmelig',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
'documentcontent' => 'Dokumentinnehold',
@ -1000,6 +1002,7 @@ URL: [url]',
'linked_to_this_version' => 'Link til denne versjonen',
'link_alt_updatedocument' => 'Om du vil laste opp filer som er større enn den aktuella størsta tillate størrelsen, bruk den alternative metoden for å laste opp filer <a href="%s">Alternativ opplasting</a>.',
'link_document' => 'Koblingsdokument',
'link_to' => '',
'link_to_version' => 'Vedlegg til versjonen',
'list_access_rights' => 'Liste over alle rettigheter...',
'list_contains_no_access_docs' => 'Listen inneholder flere dokumenter du ikke har tilgang til og ikke vises.',
@ -1188,6 +1191,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Ingen arbeidsflyt tilgjengelig',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Mappe/dokument sjekk',
'objects_without_attribute' => '',
'object_check_critical' => 'Kritisk feil!!',
@ -1231,6 +1237,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'password_forgotten_title' => 'Passord sendt',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Gjenta passord',
'password_send' => 'Passord sendt',
'password_send_text' => 'Ditt nye passord er blitt sendt til den oppgitte e-postadressen, hvis påloggingen og e-posten samsvarer med en eksisterende bruker. Hvis du ikke mottar en e-post i løpet av de neste minuttene, må du sørge for at både innlogging og e-post er riktig og start prosessen på nytt.',
@ -1258,6 +1265,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'preview_txt' => '',
'previous_state' => 'Tidligere status',
'previous_versions' => 'Tidligere versjoner',
'problematic_filename' => '',
'process' => 'Prosess',
'process_without_user_group' => 'Prosesser uten brukere/grupper',
'pt_BR' => 'Portugisisk (BR)',
@ -1339,6 +1347,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'reparert',
'repairing_objects' => 'Reparere dokumenter og mapper.',
'replace_content_email_body' => '',
@ -1686,6 +1695,10 @@ Bruker: [username]
'settings_defaultSearchMethod_desc' => 'Standard søkemetode, når et søk startes av søkeskjemaet i hovedmenyen.',
'settings_defaultSearchMethod_valdatabase' => 'database',
'settings_defaultSearchMethod_valfulltext' => 'fulltekst',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'For å bruke SeedDMS, må du slette filen ENABLE_INSTALL_TOOL i konfigurasjonsmappen',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2147,6 +2160,7 @@ Bruker: [username]
'splash_move_document' => 'Dokumentet flyttet',
'splash_move_folder' => 'Mappen flyttet',
'splash_notinherit_access' => 'Adgangsrettigheter arves ikke lenger',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Mottak ble lagt til',
'splash_removed_from_clipboard' => 'Fjernet fra utklippstavlen',
'splash_rm_attribute' => 'Egenskap fjernet',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Dit systeem werkt met 2-factor-authenticatie. U heeft de Google Authenticator nodig op uw mobiele telfoon. Hieronder staan 2 QR-codes. De rechter is uw huidige geheime code. Met de linker kunt u een nieuwe geheime code instellen. Denk erom de nieuwe code opnieuw te scannen met Googke Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Toegangscode 2-factor-authenticatie',
'abbr_day' => 'd',
'abbr_hour' => 'u',
@ -403,6 +404,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
'documentcontent' => 'Documentinhoud',
@ -993,6 +995,7 @@ URL: [url]',
'linked_to_this_version' => 'Bijlage bij deze versie',
'link_alt_updatedocument' => 'Als u bestanden wilt uploaden groter dan het huidige maximum, gebruik aub de alternatieve <a href="%s">upload pagina</a>.',
'link_document' => 'Link naar document',
'link_to' => '',
'link_to_version' => 'Bijlage(n) bij versie',
'list_access_rights' => 'Toegangsrechten',
'list_contains_no_access_docs' => 'Geen toegankelijke documenten',
@ -1180,6 +1183,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Geen workflow beschikbaar',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Mappen en documenten controleren',
'objects_without_attribute' => '',
'object_check_critical' => 'Ernstige fouten',
@ -1229,6 +1235,7 @@ Als u nog steed problemen ondervind met het inloggen, neem aub contact op met uw
'password_forgotten_title' => 'Wachtwoord verzonden',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Herhaal wachtwoord',
'password_send' => 'Wachtwoord verzonden',
'password_send_text' => 'Als het opgegeven gebruikersnaam en emailadres overeenkomen met een bestaande gebruiker is er een nieuw wachtwoord verzonden naar het opgegeven emailadres.
@ -1257,6 +1264,7 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con
'preview_txt' => '',
'previous_state' => 'Vorige staat',
'previous_versions' => 'Vorige versies',
'problematic_filename' => '',
'process' => 'Proces',
'process_without_user_group' => 'Proces zonder gebruikersgroep',
'pt_BR' => 'Portugees (BR)',
@ -1337,6 +1345,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'Gerepareerd',
'repairing_objects' => 'Documenten en mappen repareren.',
'replace_content_email_body' => '',
@ -1685,6 +1694,10 @@ Name: [username]
'settings_defaultSearchMethod_desc' => 'Default zoekmethode = op documentnaam / fulltext-search',
'settings_defaultSearchMethod_valdatabase' => 'Default zoekmethode (Documentnaam)',
'settings_defaultSearchMethod_valfulltext' => 'Default fulltext-zoeken',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Om SeedDMS te kunnen gebruiken moet het bestand ENABLE_INSTALL_TOOL uit de configuratiemap verwijderd worden.',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2146,6 +2159,7 @@ Name: [username]
'splash_move_document' => 'Document verplaatst',
'splash_move_folder' => 'Map verplaatst',
'splash_notinherit_access' => 'Toegangsrechten worden niet meer overgeërfd',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Ontvangst succesvol toegevoegd',
'splash_removed_from_clipboard' => 'Verwijderd van het klembord',
'splash_rm_attribute' => 'Attribuut verwijderd',

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Este sistema impõe a autenticação de 2 fatores. Você precisará do Google Authenticator no seu celular. Abaixo você vê dois códigos QR. O caminho certo é o seu atual segredo. À esquerda, você pode definir um novo segredo. Se você definir um novo segredo, verifique novamente com o Google Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Segredo',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Documento',
'documentcontent' => 'Conteúdo do Documento',
@ -1000,6 +1002,7 @@ URL: [url]',
'linked_to_this_version' => 'Vinculado a esta versão',
'link_alt_updatedocument' => 'Se você gostaria de fazer envio de arquivos maiores que o tamanho permitido, por favor use a página alternativa de <a href="%s">envio</a>.',
'link_document' => 'documento de ligação',
'link_to' => '',
'link_to_version' => 'Anexar à versão',
'list_access_rights' => 'Listar todos os direitos de acesso...',
'list_contains_no_access_docs' => 'A lista contém mais documentos aos quais você não tem acesso e não são exibidos.',
@ -1187,6 +1190,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Nenhum fluxo de trabalho disponível',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Verificação da Pasta/Documento',
'objects_without_attribute' => '',
'object_check_critical' => 'Erros críticos',
@ -1236,6 +1242,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'password_forgotten_title' => 'Senha enviada',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Repetir a senha',
'password_send' => 'Senha enviada',
'password_send_text' => 'Sua nova senha foi enviada para o endereço de e-mail indicado, se o login e e-mail corresponde a um usuário existe. Se você não receber um e-mail nos próximos minutos, então certifique se login e e-mail estão corretos e reinicie o processo novamente.',
@ -1263,6 +1270,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'preview_txt' => '',
'previous_state' => 'Estado anterior',
'previous_versions' => 'Versões anteriores',
'problematic_filename' => '',
'process' => 'Processos',
'process_without_user_group' => 'Processos sem usuário/grupo',
'pt_BR' => 'Português (BR)',
@ -1344,6 +1352,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'reparado',
'repairing_objects' => 'Reparando documentos e pastas',
'replace_content_email_body' => '',
@ -1692,6 +1701,10 @@ Nome: [username]
'settings_defaultSearchMethod_desc' => 'Método de pesquisa padrão, quando uma pesquisa é iniciada pelo formulário de pesquisa no menu principal.',
'settings_defaultSearchMethod_valdatabase' => 'Banco de Dados',
'settings_defaultSearchMethod_valfulltext' => 'texto completo',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Para utilizar Sistema GED, você deve excluir o arquivo ENABLE_INSTALL_TOOL do diretório de configuração',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2153,6 +2166,7 @@ Nome: [username]
'splash_move_document' => 'Documento movido',
'splash_move_folder' => 'Pasta movida',
'splash_notinherit_access' => 'Direitos de acesso não herdados',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Recepção adicionada com sucesso',
'splash_removed_from_clipboard' => 'Remover da área de transferência',
'splash_rm_attribute' => 'Atributo removido',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Document',
'documentcontent' => 'Continut Document',
@ -981,6 +983,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Dacă doriți să încărcați fișiere mai mari decât dimensiunea maximă curentă de încărcare, vă rugăm să folosiți alternativa <a href="%s">pagină de încărcare</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Listeaza toate drepturile de acces',
'list_contains_no_access_docs' => '',
@ -1169,6 +1172,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Nici un workflow disponibil',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Verificare folder/document',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1218,6 +1224,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'password_forgotten_title' => 'Parola a fost trimisă',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Repetați parola',
'password_send' => 'Parola a fost trimisă',
'password_send_text' => 'Noua dumneavoastră parolă a fost trimisă la adresa de e-mail furnizată, în cazul în care campurile de login și email se potrivesc cu un utilizator existent. Dacă nu primiți un e-mail în următoarele minute, asigurați-vă că atât campul de login cât și email sunt corecte și incercați din nou procesul.',
@ -1245,6 +1252,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'preview_txt' => '',
'previous_state' => 'Stare precedentă',
'previous_versions' => 'Versiune precedentă',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Portugheză (BR)',
@ -1315,6 +1323,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'reparat',
'repairing_objects' => 'Reparare documente și foldere.',
'replace_content_email_body' => '',
@ -1654,6 +1663,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'Metoda de cautare implicita cand cautarea a fost initiata prin formularul de cautare din meniul principal',
'settings_defaultSearchMethod_valdatabase' => 'baza de date',
'settings_defaultSearchMethod_valfulltext' => 'Text complet',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Pentru a utiliza SeedDMS, trebuie să ștergeți fișierul ENABLE_INSTALL_TOOL din directorul de configurare',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2115,6 +2128,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Eliminat din clipboard',
'splash_rm_attribute' => 'Atribut eliminat',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'Использовать усиленную проверку подлинности',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Кдюч двухфакторной аутентификации',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Документ',
'documentcontent' => 'Содержание документа',
@ -981,6 +983,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Для загрузки файлов, превышающих ограничение размера, используйте <a href="%s">другой способ</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Показать все права доступа',
'list_contains_no_access_docs' => '',
@ -1168,6 +1171,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Отсутствует процесс',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Проверка целостности',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1215,6 +1221,7 @@ URL: [url]',
'password_forgotten_title' => 'Пароль выслан',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Повторите пароль',
'password_send' => 'Пароль выслан',
'password_send_text' => 'Пароль отправлен',
@ -1242,6 +1249,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => 'Предыдущее состояние',
'previous_versions' => 'Предыдущие версии',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Portugese (BR)',
@ -1317,6 +1325,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'исправлено',
'repairing_objects' => 'Восстановление каталогов и документов',
'replace_content_email_body' => '',
@ -1661,6 +1670,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'Метод поиска по умолчанию, когда поиск начинается с поисковой формы главного меню.',
'settings_defaultSearchMethod_valdatabase' => 'база данных',
'settings_defaultSearchMethod_valfulltext' => 'полнотекстовый',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Удалите ENABLE_INSTALL_TOOL в каталоге конфигурации, для того что бы начать использовать систему',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2122,6 +2135,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Удалён из буфера обмена',
'splash_rm_attribute' => 'Атрибут удалён',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => 'This system enforces 2 factor authentication. You will need the Google Authenticator on your mobile phone. Below you see two QR codes. The right one is your current secret. On the left you can set a new secret. If you set a new secret make sure to rescan it with Google Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Tajný',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
'documentcontent' => 'Obsah dokumentu',
@ -1000,6 +1002,7 @@ URL: [url]',
'linked_to_this_version' => 'Prepojené s touto verziou',
'link_alt_updatedocument' => 'If you would like to upload files bigger than the current maximum upload size, please use the alternative <a href="%s">upload page</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => 'Pripojiť k verzii',
'list_access_rights' => 'Zobraziť všetky prístupové práva',
'list_contains_no_access_docs' => 'Zoznam obsahuje viac dokumentov, ku ktorým nemáte prístup a nie sú zobrazené.',
@ -1188,6 +1191,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Nie je k dispozícii žiaden workflow',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Kontrola Adresárov/Dokumentov',
'objects_without_attribute' => '',
'object_check_critical' => 'Kritické chyby',
@ -1237,6 +1243,7 @@ If you have still problems to login, then please contact your administrator.',
'password_forgotten_title' => 'Heslo bolo odoslané',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Zopakovať heslo',
'password_send' => 'Odoslať heslo',
'password_send_text' => 'Your new password has been send to the given email address, if the login and email matches an existing user. If you do not receive an email within the next minutes, then make sure both login and email are correct and restart the process again.',
@ -1264,6 +1271,7 @@ If you have still problems to login, then please contact your administrator.',
'preview_txt' => '',
'previous_state' => 'Predchádzajúci stav',
'previous_versions' => 'Predošlé verzie',
'problematic_filename' => '',
'process' => 'Proces',
'process_without_user_group' => 'Procesy bez používateľa/skupiny',
'pt_BR' => 'Portugalčina',
@ -1345,6 +1353,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'opravené',
'repairing_objects' => 'Oprava dokumentov a zložiek.',
'replace_content_email_body' => '',
@ -1694,6 +1703,10 @@ Meno: [username]
'settings_defaultSearchMethod_desc' => 'Default search method, when a search is started by the search form in the main menu.',
'settings_defaultSearchMethod_valdatabase' => 'databáza',
'settings_defaultSearchMethod_valfulltext' => 'fulltext',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'In order to use SeedDMS, you must delete the file ENABLE_INSTALL_TOOL in the configuration directory',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2155,6 +2168,7 @@ Meno: [username]
'splash_move_document' => 'Dokument bol presunutý',
'splash_move_folder' => 'Zložka bola presunutá',
'splash_notinherit_access' => 'Prístupové práva sa už nededia',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Reception added successfully',
'splash_removed_from_clipboard' => 'Odstránené zo schránky',
'splash_rm_attribute' => 'Atribút bol odstránený',

View File

@ -28,6 +28,7 @@ $text = array(
Nedan ser du två QR-koder. Den högra är din hemliga kod och till vänster kan du skapa en ny kod. Om du skapar en ny kod måste du skanna den nytt med Google Authenticator.',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => 'Hemlighet',
'abbr_day' => '',
'abbr_hour' => '',
@ -411,6 +412,7 @@ URL: [url]',
'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_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Dokument',
'documentcontent' => 'Dokumentinnehåll',
@ -987,6 +989,7 @@ URL: [url]',
'linked_to_this_version' => 'Länkad till denna version',
'link_alt_updatedocument' => 'Om du vill ladda upp filer som är större än den aktuella största tillåtna storleken, använd dig av den alternativa metoden att ladda upp filer <a href="%s">Alternativ uppladdning</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => 'Kopppla till version',
'list_access_rights' => 'Lista alla rättigheter...',
'list_contains_no_access_docs' => 'Listan innehåller fler dokument som inte visas då du saknar rättigheter till dessa.',
@ -1175,6 +1178,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Arbetsflöde saknas',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Kontroll av Katalog/Dokument',
'objects_without_attribute' => '',
'object_check_critical' => 'Kritiska fel',
@ -1221,6 +1227,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'password_forgotten_title' => 'Glömt lösenord',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Upprepa lösenord',
'password_send' => 'Lösenord skickat',
'password_send_text' => 'Ditt nya lösenord har skickats till den angivna e-postadressen, förutsatt att användarnamn och e-postadressen matchar en existerande användare. Om du inte får ett epost inom några minuter, kontrollera att användarnamn och e-postadressen är rätt. Begär ett nytt lösenord igen.',
@ -1248,6 +1255,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'preview_txt' => '',
'previous_state' => 'Föregående status',
'previous_versions' => 'Tidigare versioner',
'problematic_filename' => '',
'process' => 'Process',
'process_without_user_group' => 'Processer utan användare/grupp',
'pt_BR' => 'Portugisiska (BR)',
@ -1318,6 +1326,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'reparerat',
'repairing_objects' => 'Reparerar dokument och kataloger.',
'replace_content_email_body' => '',
@ -1667,6 +1676,10 @@ Kommentar: [comment]',
'settings_defaultSearchMethod_desc' => 'Standard sökmetod, när en sökning startas i sökformuläret i huvudmenyn.',
'settings_defaultSearchMethod_valdatabase' => 'databas',
'settings_defaultSearchMethod_valfulltext' => 'fulltext',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'För att kunna använda LetoDMS måste du ta bort filen ENABLE_INSTALL_TOOL som finns i konfigurationsmappen.',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2128,6 +2141,7 @@ Kommentar: [comment]',
'splash_move_document' => 'Dokumentet flyttat',
'splash_move_folder' => 'Katalogen flyttad',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => 'Meddelande tillagt',
'splash_removed_from_clipboard' => 'Borttaget från urklipp',
'splash_rm_attribute' => 'Attribut har tagits bort',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -405,6 +406,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Doküman',
'documentcontent' => 'Döküman İçeriği',
@ -973,6 +975,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Mevcut maksimum yükleme boyutundan daha büyük dosya yüklemek istiyorsanız <a href="%s">alternatif yükleme sayfası için tıklayın</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Tüm erişim haklarini listele',
'list_contains_no_access_docs' => '',
@ -1161,6 +1164,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Uygun iş akışı yok',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Klasör/Doküman kontrol',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1212,6 +1218,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'password_forgotten_title' => 'Parola gönderildi',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Parolayı tekrar giriniz',
'password_send' => 'Parola gönderildi',
'password_send_text' => 'Kullanıcı adı ve e-posta adresiniz eşleştiyse yeni parolanız belirttiğiniz e-posta adresinize gönderilmiş olacaktır. Eğer birkaç dakika içerisinde e-posta adresinize mesaj gelmezse kullanıcı adı ve sisteme kayıtlı e-posta adresinizin doğru olduğundan emin olarak işlemi tekrarlayınız.',
@ -1239,6 +1246,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'preview_txt' => '',
'previous_state' => 'Önceki durum',
'previous_versions' => 'Önceki versiyonlar',
'problematic_filename' => '',
'process' => 'İşlem',
'process_without_user_group' => '',
'pt_BR' => 'Portekizce',
@ -1309,6 +1317,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'onarıldı',
'repairing_objects' => 'Doküman ve klasörler onarılıyor.',
'replace_content_email_body' => '',
@ -1631,6 +1640,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '',
'settings_defaultSearchMethod_valdatabase' => 'veritabanı',
'settings_defaultSearchMethod_valfulltext' => '',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'SeedDMS kullanabilmeniz için konfigürasyon (conf) dizini içindeki ENABLE_INSTALL_TOOL dosyasını silmelisiniz',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2092,6 +2105,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Panodan silindi',
'splash_rm_attribute' => 'Nitelik silindi',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ URL: [url]',
'docs_in_reception_no_access' => '',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => 'Документ',
'documentcontent' => '',
@ -980,6 +982,7 @@ URL: [url]',
'linked_to_this_version' => '',
'link_alt_updatedocument' => 'Для завантаження файлів, які перевищують обмеження розміру, використовуйте <a href="%s">інший метод</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '',
'list_access_rights' => 'Повний список прав...',
'list_contains_no_access_docs' => '',
@ -1167,6 +1170,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => 'Немає доступних процесів',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => 'Перевірка каталогу чи документа',
'objects_without_attribute' => '',
'object_check_critical' => '',
@ -1214,6 +1220,7 @@ URL: [url]',
'password_forgotten_title' => 'Пароль вислано',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => 'Повторіть пароль',
'password_send' => 'Пароль відіслано',
'password_send_text' => 'Пароль відіслано.',
@ -1241,6 +1248,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => 'Попередній стан',
'previous_versions' => 'Попередні версії',
'problematic_filename' => '',
'process' => '',
'process_without_user_group' => '',
'pt_BR' => 'Portugese (BR)',
@ -1316,6 +1324,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => 'виправлено',
'repairing_objects' => 'Відновлення каталогів і документів',
'replace_content_email_body' => '',
@ -1653,6 +1662,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => 'Метод пошуку за замовчуванням, коли пошук починається з пошукової форми головного меню.',
'settings_defaultSearchMethod_valdatabase' => 'база даних',
'settings_defaultSearchMethod_valfulltext' => 'повнотекстовий',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => 'Видаліть ENABLE_INSTALL_TOOL в каталозі конфігурації для того, щоби почати використовувати систему',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2114,6 +2127,7 @@ URL: [url]',
'splash_move_document' => '',
'splash_move_folder' => '',
'splash_notinherit_access' => '',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '',
'splash_removed_from_clipboard' => 'Видалити з буферу обміну',
'splash_rm_attribute' => 'Атрибут видалено',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '该系统启用双重认证。您需要在手机上进行 Google 认证。下面你会看到两个 QR 码。正确的是你目前的密码。在左边你可以设置一个新的密码。如果您设置了新的密码,请重新扫描并通过 Google 认证。',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '双重认证密码',
'abbr_day' => '',
'abbr_hour' => '',
@ -404,6 +405,7 @@ URL: [url]',
'docs_in_reception_no_access' => '收件人未访问接收到的文档',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '修订人未访问带修订文档',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => '文档',
'documentcontent' => '文档内容',
@ -983,6 +985,7 @@ URL: [url]',
'linked_to_this_version' => '链接到版本',
'link_alt_updatedocument' => '超过20M大文件请选择<a href="%s">上传大文件</a>.',
'link_document' => '',
'link_to' => '',
'link_to_version' => '附加到版本',
'list_access_rights' => '列出所有的访问权限',
'list_contains_no_access_docs' => '这个列表包含了更多你无法访问的文件也没有显示出来。',
@ -1171,6 +1174,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '工作流不可用',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => '文件夹/文件检查',
'objects_without_attribute' => '',
'object_check_critical' => '重大错误',
@ -1220,6 +1226,7 @@ URL: [url]',
'password_forgotten_title' => '密码已发送',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => '重复密码',
'password_send' => '发送密码',
'password_send_text' => '您的新密码已通过邮件发送给您。若您尚未收到该邮件,请确认登陆用户名和对应的电子邮件填写是否正确,并重试。',
@ -1247,6 +1254,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => 'Previous state',
'previous_versions' => '先前版本',
'problematic_filename' => '',
'process' => '进程',
'process_without_user_group' => '不含用户/组的进程',
'pt_BR' => '葡萄牙语',
@ -1322,6 +1330,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '已修复',
'repairing_objects' => '修复文件和文件夹',
'replace_content_email_body' => '',
@ -1641,6 +1650,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '在主菜单中启动检索时,设置默认的搜索方式',
'settings_defaultSearchMethod_valdatabase' => '数据库',
'settings_defaultSearchMethod_valfulltext' => '全文',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => '在使用 DMS 前您必须先删除配置目录config下的 ENABLE_INSTALL_TOOL 文件',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2102,6 +2115,7 @@ URL: [url]',
'splash_move_document' => '文档已迁移',
'splash_move_folder' => '文件夹已迁移',
'splash_notinherit_access' => '访问权不再继承',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '接收人添加成功',
'splash_removed_from_clipboard' => '已从剪切板删除',
'splash_rm_attribute' => '属性已移除',

View File

@ -27,6 +27,7 @@ $text = array(
'2_factor_auth_info' => '此系統強制執行2階段身份驗證。您將需要在手機上使用Google Authenticator。在下面您可以看到兩個QR碼。正確的是您當前的秘密。在左側您可以設置一個新的秘密。如果您設置了新的機密請確保使用Google Authenticator重新掃描它。',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
'2_fact_auth_qrcode' => '',
'2_fact_auth_secret' => '秘密',
'abbr_day' => '',
'abbr_hour' => '',
@ -410,6 +411,7 @@ $text = array(
'docs_in_reception_no_access' => '帶有收件人的文件,收件人無法訪問',
'docs_in_revision_disabled' => '',
'docs_in_revision_no_access' => '修訂中的文件,沒有修訂者可以訪問',
'docs_with_link_to_itself' => '',
'docs_with_missing_revision_date' => '',
'document' => '文件',
'documentcontent' => '文件內容',
@ -1000,6 +1002,7 @@ URL: [url]',
'linked_to_this_version' => '連結到這個版本',
'link_alt_updatedocument' => '如果您要上傳的文件大於當前的最大上傳大小,請使用其他<a href="%s">上傳頁面</a>。',
'link_document' => '連結文件',
'link_to' => '',
'link_to_version' => '附加到版本',
'list_access_rights' => '列出權限',
'list_contains_no_access_docs' => '該列表包含更多您無法訪問且不會顯示的文檔。',
@ -1188,6 +1191,9 @@ URL: [url]',
'no_workflows' => '',
'no_workflow_available' => '沒有可用的工作流程',
'number_count' => '',
'n_of_m_approved' => '',
'n_of_m_reviewed' => '',
'n_of_m_revised' => '',
'objectcheck' => '資料夾/檔檢查',
'objects_without_attribute' => '',
'object_check_critical' => '嚴重錯誤',
@ -1235,6 +1241,7 @@ URL: [url]',
'password_forgotten_title' => '密碼已寄出',
'password_mismatch_error' => '',
'password_mismatch_error_title' => '',
'password_never_expires' => '',
'password_repeat' => '重複輸入密碼',
'password_send' => '密碼寄出',
'password_send_text' => '如果登錄名和電子郵件與現有使用者匹配,則您的新密碼已發送到給定的電子郵件地址。如果您在接下來的幾分鐘內沒有收到電子郵件,請確保登錄名和電子郵件均正確無誤,然後重新啟動該過程。',
@ -1262,6 +1269,7 @@ URL: [url]',
'preview_txt' => '',
'previous_state' => '先前狀態',
'previous_versions' => '先前版本',
'problematic_filename' => '',
'process' => '處理',
'process_without_user_group' => '程序缺少使用者/群組',
'pt_BR' => '葡萄牙語',
@ -1343,6 +1351,7 @@ URL: [url]',
'remove_review_log' => '',
'remove_task' => '',
'reorder' => '',
'reorder_documents_in_folder' => '',
'repaired' => '修復',
'repairing_objects' => '修復文檔和文件夾。',
'replace_content_email_body' => '',
@ -1692,6 +1701,10 @@ URL: [url]',
'settings_defaultSearchMethod_desc' => '默認搜索方法,當通過主菜單中的搜索表單開始搜索時。',
'settings_defaultSearchMethod_valdatabase' => '資料庫',
'settings_defaultSearchMethod_valfulltext' => '全文',
'settings_defaultThumbnailClick' => '',
'settings_defaultThumbnailClick_desc' => '',
'settings_defaultThumbnailClick_valdownload' => '',
'settings_defaultThumbnailClick_valviewonline' => '',
'settings_delete_install_folder' => '為了使用SeedDMS必須在配置目錄中刪除文件ENABLE_INSTALL_TOOL',
'settings_disableChangePassword' => '',
'settings_disableChangePassword_desc' => '',
@ -2153,6 +2166,7 @@ URL: [url]',
'splash_move_document' => '文件已移走',
'splash_move_folder' => '文件夾已移動',
'splash_notinherit_access' => '訪問權限不再繼承',
'splash_orig_filename_changed' => '',
'splash_receipt_update_success' => '接待已成功添加',
'splash_removed_from_clipboard' => '已從剪貼簿中刪除',
'splash_rm_attribute' => '屬性已刪除',

View File

@ -1,118 +0,0 @@
<?php
// MyDMS. Document Management System
// Copyright (C) 2002-2005 Markus Westphal
// Copyright (C) 2006-2008 Malcolm Cowe
// Copyright (C) 2010 Matteo Lucarelli
// Copyright (C) 2010-2012 Uwe Steinmann
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require_once("../inc/inc.Settings.php");
require_once("../inc/inc.Utils.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Language.php");
require_once("../inc/inc.Init.php");
require_once("../inc/inc.Extension.php");
require_once("../inc/inc.DBInit.php");
require_once("../inc/inc.ClassUI.php");
require_once("../inc/inc.Authentication.php");
if (!$user->isAdmin()) {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
if (isset($_GET["action"])) $action=$_GET["action"];
else $action=NULL;
if($action == 'add_aro') {
if (isset($_GET["roleid"])) {
if(!($role = SeedDMS_Core_Role::getInstance((int) $_GET["roleid"], $dms))) {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
} else {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
} else {
if (isset($_GET["aroid"])) {
if(!($aro = SeedDMS_Aro::getInstance((int) $_GET["aroid"], $dms))) {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
} else {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
if (isset($_GET["acoid"])) {
if(!($aco = SeedDMS_Aco::getInstance((int) $_GET["acoid"], $dms))) {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
} else {
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
echo json_encode($result);
exit;
}
}
switch($action) {
case "toggle_permission":
$acl = new SeedDMS_Acl($dms);
if($acl->toggle($aro, $aco))
$result = array('type'=>'success', 'msg'=>getMLText('success_toogle_permission'));
else
$result = array('type'=>'error', 'msg'=>getMLText('error_toogle_permission'));
header('Content-Type: application/json');
echo json_encode($result);
break;
case "add_permission":
$acl = new SeedDMS_Acl($dms);
if($acl->add($aro, $aco))
$result = array('type'=>'success', 'msg'=>getMLText('success_add_permission'));
else
$result = array('type'=>'error', 'msg'=>getMLText('error_add_permission'));
header('Content-Type: application/json');
echo json_encode($result);
break;
case "remove_permission":
$acl = new SeedDMS_Acl($dms);
if($acl->remove($aro, $aco))
$result = array('type'=>'success', 'msg'=>getMLText('success_remove_permission'));
else
$result = array('type'=>'error', 'msg'=>getMLText('error_remove_permission'));
header('Content-Type: application/json');
echo json_encode($result);
break;
case "add_aro":
if(SeedDMS_Aro::getInstance($role, $dms)) {
$result = array('type'=>'success', 'msg'=>getMLText('success_add_aro'));
} else {
$result = array('type'=>'error', 'msg'=>getMLText('error_add_aro'));
}
header('Content-Type: application/json');
echo json_encode($result);
break;
}

View File

@ -69,9 +69,8 @@ if($settings->_quota > 0) {
}
}
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if ($accessop->check_controller_access($controller, array('action'=>'setOwner'))) {
$ownerid = (int) $_POST["ownerid"];
if($user->isAdmin()) {
$ownerid = !empty($_POST['ownerid']) ? (int) $_POST["ownerid"] : null;
if($ownerid) {
if(!($owner = $dms->getUser($ownerid))) {
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured"));
@ -174,13 +173,10 @@ default:
// Get the list of reviewers and approvers for this document.
$reviewers = array();
$approvers = array();
$recipients = array();
$reviewers["i"] = array();
$reviewers["g"] = array();
$approvers["i"] = array();
$approvers["g"] = array();
$recipients["i"] = array();
$recipients["g"] = array();
$workflow = null;
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
@ -197,16 +193,6 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
$reviewers["g"][] = $grp;
}
}
// Retrieve the list of reviewer groups whose members become individual reviewers
if (isset($_POST["grpIndReviewers"])) {
foreach ($_POST["grpIndReviewers"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member)
$reviewers["i"][] = $member->getID();
}
}
}
}
// Retrieve the list of individual approvers from the form.
@ -221,17 +207,6 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
$approvers["g"][] = $grp;
}
}
// Retrieve the list of reviewer groups whose members become individual approvers
if (isset($_POST["grpIndApprovers"])) {
foreach ($_POST["grpIndApprovers"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member)
$approvers["i"][] = $member->getID();
}
}
}
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
$mreviewers = getMandatoryReviewers($folder, null, $user);
@ -269,35 +244,6 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
}
}
// Retrieve the list of individual recipients from the form.
$recipients["i"] = array();
if (isset($_POST["indRecipients"])) {
foreach ($_POST["indRecipients"] as $ind) {
$recipients["i"][] = $ind;
}
}
// Retrieve the list of recipient groups from the form.
$recipients["g"] = array();
if (isset($_POST["grpRecipients"])) {
foreach ($_POST["grpRecipients"] as $grp) {
$recipients["g"][] = $grp;
}
}
// Retrieve the list of recipient groups whose members become individual recipients
if (isset($_POST["grpIndRecipients"])) {
foreach ($_POST["grpIndRecipients"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member) {
/* Do not add the uploader itself and reviewers */
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
if(!in_array($member->getID(), $recipients["i"]))
$recipients["i"][] = $member->getID();
}
}
}
}
function reArrayFiles(&$file_post) {
$file_ary = array();
$file_count = count($file_post['name']);
@ -360,31 +306,6 @@ if(isset($_POST[$prefix.'-fine-uploader-uuids']) && $_POST[$prefix.'-fine-upload
}
}
if($settings->_libraryFolder) {
if(isset($_POST["librarydoc"]) && $_POST["librarydoc"]) {
if($clonedoc = $dms->getDocument($_POST["librarydoc"])) {
if($content = $clonedoc->getLatestContent()) {
$docsource = 'library';
$fullfile = tempnam(sys_get_temp_dir(), '');
if(SeedDMS_Core_File::copyFile($dms->contentDir . $content->getPath(), $fullfile)) {
if($_POST["name"]!="") {
$oext = pathinfo($content->getOriginalFileName(), PATHINFO_EXTENSION);
$origfilename = getFilenameByDocname(trim($_POST['name'])).".".$oext;
} else
$origfilename = $content->getOriginalFileName();
$file_ary[] = array(
'tmp_name' => $fullfile,
'type' => $content->getMimeType(),
'name' => $origfilename,
'size' => $content->getFileSize(),
'error' => 0,
'source' => 'library',
);
}
}
}
}
}
if($controller->hasHook('getDocument')) {
$file_ary = array_merge($file_ary, $controller->callHook('getDocument', $_POST));
}
@ -472,7 +393,6 @@ foreach($file_ary as $file) {
$controller->setParam('sequence', $sequence);
$controller->setParam('reviewers', $reviewers);
$controller->setParam('approvers', $approvers);
$controller->setParam('recipients', $recipients);
$controller->setParam('reqversion', $reqversion);
$controller->setParam('versioncomment', $version_comment);
$controller->setParam('attributes', $attributes);
@ -480,7 +400,6 @@ foreach($file_ary as $file) {
$controller->setParam('workflow', $workflow);
$controller->setParam('notificationgroups', $notgroups);
$controller->setParam('notificationusers', $notusers);
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
@ -498,20 +417,9 @@ foreach($file_ary as $file) {
if($controller->hasHook('cleanUpDocument')) {
$controller->callHook('cleanUpDocument', $document, $file);
}
if($notifier) {
// Send notification to subscribers of folder.
if($notifier) {
$notifier->sendNewDocumentMail($document, $user);
// Send notifcation to recipients of document
$content = $document->getLatestContent();
$status = $content->getStatus();
if ($status["status"] == S_RELEASED) {
if ($settings->_enableNotificationAppRev) {
if ($notifier) {
$notifier->sendToAllReceiptMail($content, $user);
}
}
}
}
if($settings->_removeFromDropFolder) {
if(file_exists($userfiletmp)) {

View File

@ -73,5 +73,4 @@ if (!$document->addDocumentLink($docid, $user->getID(), $public)){
}
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."&currenttab=links");
?>

View File

@ -1,85 +0,0 @@
<?php
// MyDMS. Document Management System
// Copyright (C) 2002-2005 Markus Westphal
// Copyright (C) 2006-2008 Malcolm Cowe
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.Authentication.php");
/* Check if the form data comes for a trusted request */
if(!checkFormKey('addtotransmittal')) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
}
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
$documentid = $_POST["documentid"];
$document = $dms->getDocument($documentid);
if (!is_object($document)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
if ($document->getAccessMode($user) < M_READ) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
}
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
}
$version_num = $_POST["version"];
$version = $document->getContentByVersion($version_num);
if (!is_object($version)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
}
if (!isset($_POST["assignTo"]) || !is_numeric($_POST["assignTo"]) || intval($_POST["assignTo"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
}
$transmittalid = $_POST["assignTo"];
$transmittal = $dms->getTransmittal($transmittalid);
if (!is_object($transmittal)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
}
if ($transmittal->getUser()->getID() != $user->getID()) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_transmittal"));
}
if($transmittal->addContent($version)) {
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_to_transmittal')));
} else {
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('splash_error_add_to_transmittal')));
}
add_log_line("?documentid=".$documentid."&version".$version_num);
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
?>

View File

@ -1,49 +0,0 @@
<?php
// MyDMS. Document Management System
// Copyright (C) 2002-2005 Markus Westphal
// Copyright (C) 2006-2008 Malcolm Cowe
// Copyright (C) 2010 Matteo Lucarelli
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.Authentication.php");
/* Check if the form data comes for a trusted request */
if(!checkFormKey('addtransmittal')) {
UI::exitError(getMLText("my_documents"), getMLText("invalid_request_token"));
}
$name = $_POST["name"];
$comment = $_POST["comment"];
$transmittal = $dms->addTransmittal($name, $comment, $user);
if (!is_object($transmittal)) {
UI::exitError(getMLText("my_documents"), getMLText("error_occured"));
}
add_log_line("?name=".$name);
header("Location:../out/out.MyDocuments.php");
?>

View File

@ -53,12 +53,9 @@ if (isset($_COOKIE["mydms_session"])) {
echo json_encode(array('error'=>1));
exit;
}
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
if($user->isAdmin() || $user->maySwitchToUser($su)) {
$user = $su;
} else {
$session->resetSu();
if($user->isAdmin()) {
if($resArr["su"]) {
$user = $dms->getUser($resArr["su"]);
}
}
$dms->setUser($user);
@ -66,8 +63,6 @@ if (isset($_COOKIE["mydms_session"])) {
$dms->checkWithinRootDir = true;
$dms->setRootFolderID($user->getHomeFolder());
}
$role = $user->getRole();
$dms->noReadForStatus = $role->getNoAccess();
include $settings->_rootDir . "languages/" . $resArr["language"] . "/lang.inc";
} else {
@ -110,13 +105,11 @@ switch($command) {
}
break; /* }}} */
/* Used for document chooser */
case 'searchdocument': /* {{{ */
if($user) {
$query = $_GET['query'];
$status = isset($_GET['status']) ? (is_array($_GET['status']) ? $_GET['status'] : array($_GET['status'])) : array();
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status, $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
if($hits) {
$result = array();
foreach($hits['docs'] as $hit) {
@ -691,6 +684,44 @@ switch($command) {
}
break; /* }}} */
case 'setoriginalname': /* {{{ */
if($user && $user->isAdmin()) {
if(checkFormKey('setoriginalname')) {
$content = $dms->getDocumentContent($_REQUEST['contentid']);
if($content) {
$document = $content->getDocument();
if ($document->getAccessMode($user) >= M_READWRITE) {
$oldname = $content->getOriginalFileName();
if (!$content->setOriginalFilename($_REQUEST['name'])) {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'Error setting original file name', 'data'=>''));
} else {
if($fulltextservice && ($index = $fulltextservice->Indexer())) {
$lucenesearch = $fulltextservice->Search();
if($hit = $lucenesearch->getDocument($document->getId())) {
$index->reindexDocument($hit->id);
$index->commit();
}
}
header('Content-Type: application/json');
echo json_encode(array('success'=>true, 'message'=>getMLText('splash_orig_filename_changed'), 'data'=>''));
add_log_line("set original filename '".$_REQUEST['name']."' of document ".$document->getId().":".$content->getVersion());
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>getMLText('access_denied'), 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_doc_id'), 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
}
}
break; /* }}} */
case 'setmimetype': /* {{{ */
if($user && $user->isAdmin()) {
if(checkFormKey('setmimetype', 'GET')) {
@ -903,7 +934,6 @@ switch($command) {
$controller->setParam('workflow', $workflow);
$controller->setParam('notificationgroups', array());
$controller->setParam('notificationusers', array());
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
@ -935,41 +965,6 @@ switch($command) {
}
break; /* }}} */
/* Deprecated, has moved to op/op.TransmittalMgr.php */
case '___removetransmittalitem': /* {{{ */
if($user) {
if(!checkFormKey('removetransmittalitem', 'GET')) {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
} else {
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
if($item) {
$transmittal = $item->getTransmittal();
if($transmittal) {
if ($transmittal->getUser()->getID() == $user->getID()) {
if($item->remove()) {
header('Content-Type: application/json');
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
}
}
}
break; /* }}} */
case 'updatedocument': /* {{{ */
if($user) {
if(checkFormKey('')) {
@ -1126,41 +1121,6 @@ switch($command) {
}
break; /* }}} */
/* Deprecated, has moved to op/op.TransmittalMgr.php */
case '___updatetransmittalitem': /* {{{ */
if($user) {
if(!checkFormKey('updatetransmittalitem', 'GET')) {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
} else {
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
if($item) {
$transmittal = $item->getTransmittal();
if($transmittal) {
if ($transmittal->getUser()->getID() == $user->getID()) {
if($item->updateContent()) {
header('Content-Type: application/json');
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
}
} else {
header('Content-Type: application/json');
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
}
}
}
break; /* }}} */
case 'addfolder': /* {{{ */
if($user) {
if(checkFormKey('')) {

View File

@ -32,7 +32,6 @@ include("../inc/inc.ClassController.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
/* Check if the form data comes from a trusted request */
if(!checkFormKey('approvedocument')) {
@ -73,8 +72,11 @@ if ($latestContent->getVersion()!=$version) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
}
/* Create object for checking access to certain operations */
$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings);
// verify if document may be approved
if (!$accessop->mayApprove($document)){
if (!$accessop->mayApprove()){
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
}
@ -111,13 +113,6 @@ if(!$controller()) {
$notifier->sendSubmittedApprovalMail($latestContent, $user, $approvelog ? $approvelog[0] : false);
if($controller->oldstatus != $controller->newstatus)
$notifier->sendChangedDocumentStatusMail($latestContent, $user, $controller->oldstatus);
if ($controller->newstatus == S_RELEASED) {
if ($settings->_enableNotificationAppRev) {
if ($notifier) {
$notifier->sendToAllReceiptMail($content, $user);
}
}
}
}
}

View File

@ -1,56 +0,0 @@
<?php
// SeedDMS. Document Management System
// Copyright (C) 2015 Uwe Steinmann
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.Authentication.php");
/* Check if the form data comes from a trusted request */
if(!checkFormKey('cancelcheckout')) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
}
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
$documentid = $_POST["documentid"];
$document = $dms->getDocument($documentid);
$checkoutstatus = $document->checkOutStatus();
/* Check out of files which has been changed, can only be canceled if allowed in the configuration */
if($checkoutstatus == 0 && empty($settings->_enableCancelCheckout)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
}
if(empty($_POST['confirm'])) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
}
if(!$document->cancelCheckOut()) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_cancel_checkout"));
}
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_cancel_checkout')));
add_log_line("?documentid=".$documentid);
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);

View File

@ -1,343 +0,0 @@
<?php
// SeedDMS. Document Management System
// Copyright (C) 2015 Uwe Steinmann
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.Authentication.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.ClassController.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access($controller, $_POST)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
}
/* if post_max_size is to small, then $_POST will not be set and the content
* lenght will exceed post_max_size
*/
if(empty($_POST) && $_SERVER['CONTENT_LENGTH'] > SeedDMS_Core_File::parse_filesize(ini_get('post_max_size'))) {
UI::exitError(getMLText("folder_title", array("foldername" => '')),getMLText("uploading_postmaxsize"));
}
/* Check if the form data comes from a trusted request */
if(!checkFormKey('checkindocument')) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
}
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
$documentid = $_POST["documentid"];
$document = $dms->getDocument($documentid);
$folder = $document->getFolder();
if (!is_object($document)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
if ($document->getAccessMode($user, 'checkinDocument') < M_READWRITE) {
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
}
if($settings->_quota > 0) {
$remain = checkQuota($user);
if ($remain < 0) {
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("quota_exceeded", array('bytes'=>SeedDMS_Core_File::format_filesize(abs($remain)))));
}
}
if ($document->isLocked()) {
$lockingUser = $document->getLockingUser();
if (($lockingUser->getID() != $user->getID()) && ($document->getAccessMode($user) != M_ALL)) {
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("no_update_cause_locked"));
}
else $document->setLocked(false);
}
if(!$accessop->mayCheckIn($document)) {
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
}
if(isset($_POST["comment"]))
$comment = $_POST["comment"];
else
$comment = "";
$oldexpires = $document->getExpires();
switch($_POST["presetexpdate"]) {
case "date":
$expires = makeTsFromDate($_POST["expdate"]);
// $tmp = explode('-', $_POST["expdate"]);
// $expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]);
break;
case "1w":
$tmp = explode('-', date('Y-m-d'));
$expires = mktime(0,0,0, $tmp[1], $tmp[2]+7, $tmp[0]);
break;
case "1m":
$tmp = explode('-', date('Y-m-d'));
$expires = mktime(0,0,0, $tmp[1]+1, $tmp[2], $tmp[0]);
break;
case "1y":
$tmp = explode('-', date('Y-m-d'));
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+1);
break;
case "2y":
$tmp = explode('-', date('Y-m-d'));
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+2);
break;
case "never":
default:
$expires = null;
break;
}
// Get the list of reviewers and approvers for this document.
$reviewers = array();
$approvers = array();
$recipients = array();
$reviewers["i"] = array();
$reviewers["g"] = array();
$approvers["i"] = array();
$approvers["g"] = array();
$recipients["i"] = array();
$recipients["g"] = array();
$workflow = null;
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
if($settings->_workflowMode == 'traditional') {
// Retrieve the list of individual reviewers from the form.
$reviewers["i"] = array();
if (isset($_POST["indReviewers"])) {
foreach ($_POST["indReviewers"] as $ind) {
$reviewers["i"][] = $ind;
}
}
// Retrieve the list of reviewer groups from the form.
$reviewers["g"] = array();
if (isset($_POST["grpReviewers"])) {
foreach ($_POST["grpReviewers"] as $grp) {
$reviewers["g"][] = $grp;
}
}
// Retrieve the list of reviewer groups whose members become individual reviewers
if (isset($_POST["grpIndReviewers"])) {
foreach ($_POST["grpIndReviewers"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member)
$reviewers["i"][] = $member->getID();
}
}
}
}
// Retrieve the list of individual approvers from the form.
$approvers["i"] = array();
if (isset($_POST["indApprovers"])) {
foreach ($_POST["indApprovers"] as $ind) {
$approvers["i"][] = $ind;
}
}
// Retrieve the list of approver groups from the form.
$approvers["g"] = array();
if (isset($_POST["grpApprovers"])) {
foreach ($_POST["grpApprovers"] as $grp) {
$approvers["g"][] = $grp;
}
}
// Retrieve the list of reviewer groups whose members become individual approvers
if (isset($_POST["grpIndApprovers"])) {
foreach ($_POST["grpIndApprovers"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member)
$approvers["i"][] = $member->getID();
}
}
}
// add mandatory reviewers/approvers
if($settings->_workflowMode == 'traditional') {
$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, $document, $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 */
if(($reviewers["i"] || $reviewers["g"]) && !$approvers["i"] && !$approvers["g"]) {
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_uploading_reviewer_only"));
}
}
} elseif($settings->_workflowMode == 'advanced') {
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;}
}
}
// Retrieve the list of individual recipients from the form.
$recipients["i"] = array();
if (isset($_POST["indRecipients"])) {
foreach ($_POST["indRecipients"] as $ind) {
$recipients["i"][] = $ind;
}
}
// Retrieve the list of recipient groups from the form.
$recipients["g"] = array();
if (isset($_POST["grpRecipients"])) {
foreach ($_POST["grpRecipients"] as $grp) {
$recipients["g"][] = $grp;
}
}
// Retrieve the list of recipient groups whose members become individual recipients
if (isset($_POST["grpIndRecipients"])) {
foreach ($_POST["grpIndRecipients"] as $grp) {
if($group = $dms->getGroup($grp)) {
$members = $group->getUsers();
foreach($members as $member) {
/* Do not add the uploader itself as recipient */
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
if(!in_array($member->getID(), $recipients["i"]))
$recipients["i"][] = $member->getID();
}
}
}
}
if(isset($_POST["attributes_version"]) && $_POST["attributes_version"]) {
$attributes = $_POST["attributes_version"];
foreach($attributes as $attrdefid=>$attribute) {
$attrdef = $dms->getAttributeDefinition($attrdefid);
if(null === ($ret = $controller->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
if(is_array($attribute))
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
else
$attribute = date('Y-m-d', makeTsFromDate($attribute));
break;
case SeedDMS_Core_AttributeDefinition::type_folder:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
else
$attribute = $dms->getFolder((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_document:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
else
$attribute = $dms->getDocument((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_user:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
else
$attribute = $dms->getUser((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_group:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
else
$attribute = $dms->getGroup((int) $attribute);
break;
}
if(!$attrdef->validate($attribute, null, true)) {
$errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
}
} elseif($attrdef->getMinValues() > 0) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
}
} else {
if($ret === false)
return false;
}
}
} else {
$attributes = array();
}
$controller->setParam('documentsource', 'checkin');
$controller->setParam('folder', $folder);
$controller->setParam('document', $document);
$controller->setParam('fulltextservice', $fulltextservice);
$controller->setParam('comment', $comment);
if($oldexpires != $expires)
$controller->setParam('expires', $expires);
$controller->setParam('reviewers', $reviewers);
$controller->setParam('approvers', $approvers);
$controller->setParam('recipients', $recipients);
$controller->setParam('attributes', $attributes);
$controller->setParam('workflow', $workflow);
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
if(!$content = $controller()) {
$err = $controller->getErrorMsg();
if(is_string($err))
$errmsg = getMLText($err);
elseif(is_array($err)) {
$errmsg = getMLText($err[0], $err[1]);
} else {
$errmsg = $err;
}
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
} else {
if($controller->hasHook('cleanUpDocument')) {
$controller->callHook('cleanUpDocument', $document, $file);
}
// Send notification to subscribers.
if($notifier) {
$notifier->sendNewDocumentVersionMail($document, $user);
$notifier->sendChangedExpiryMail($document, $user, $oldexpires);
}
}
add_log_line("checkin document ".$documentid." with version ".$content->getVersion());
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);

View File

@ -1,77 +0,0 @@
<?php
// SeedDMS. Document Management System
// Copyright (C) 2015 Uwe Steinmann
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.Authentication.php");
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
$documentid = $_GET["documentid"];
$document = $dms->getDocument($documentid);
if (!is_object($document)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
if(!$settings->_checkOutDir) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkout_is_disabled"));
}
if ($document->getAccessMode($user) < M_READWRITE) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
}
if ($document->isLocked()) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_locked"));
}
if ($document->isCheckedOut()) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_checkedout"));
}
if($session->getSu()) {
$origuser = $dms->getUser($session->getUser());
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $origuser->getLogin()));
} else {
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $user->getLogin()));
}
if(!file_exists($checkoutpath) && $settings->_createCheckOutDir) {
SeedDMS_Core_File::makeDir($checkoutpath);
}
if(!file_exists($checkoutpath)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkoutpath_does_not_exist"));
}
if (!$document->checkOut($user, $checkoutpath)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
}
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_document_checkedout')));
add_log_line();
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);

View File

@ -1,60 +0,0 @@
<?php
// MyDMS. Document Management System
// Copyright (C) 2002-2005 Markus Westphal
// Copyright (C) 2006-2008 Malcolm Cowe
// Copyright (C) 2010 Matteo Lucarelli
// Copyright (C) 2010-2016 Uwe Steinmann
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require_once("../inc/inc.Settings.php");
require_once("../inc/inc.Utils.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Language.php");
require_once("../inc/inc.Init.php");
require_once("../inc/inc.Extension.php");
require_once("../inc/inc.DBInit.php");
require_once("../inc/inc.ClassController.php");
require_once("../inc/inc.Scheduler.php");
require_once("../inc/inc.BasicAuthentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
if($user->getLogin() != 'cli_scheduler') {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized');
echo "Wrong user";
exit;
}
$mode = 'list';
if(!empty($_GET['mode']) && in_array($_GET['mode'], array('list', 'run', 'dryrun', 'check')))
$mode = $_GET['mode'];
$task = '';
if(!empty($_GET['task']))
$task = $_GET['task'];
$controller->setParam('settings', $settings);
$controller->setParam('logger', $logger);
$controller->setParam('mode', $mode);
$controller->setParam('task', $task);
if(!$controller->run()) {
echo getMLText("error_occured");
exit;
}
add_log_line();
exit();

View File

@ -32,10 +32,6 @@ include("../inc/inc.Authentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access($controller, $_POST)) {
UI::exitError(getMLText("document_title", array("documentname" => "")),getMLText("access_denied"));
}
if (isset($_GET["version"])) { /* {{{ */
@ -102,9 +98,19 @@ elseif (isset($_GET["file"])) { /* {{{ */
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_file_id"));
}
$controller->setParam('file', $file);
$controller->setParam('type', 'file');
$controller->run();
if(!file_exists($dms->contentDir . $file->getPath())) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("missing_file"));
}
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($dms->contentDir . $file->getPath() ));
$efilename = rawurlencode($file->getOriginalFileName());
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
header("Content-Type: " . $file->getMimeType());
header("Cache-Control: must-revalidate");
sendFile($dms->contentDir . $file->getPath());
} /* }}} */
elseif (isset($_GET["arkname"])) { /* {{{ */
$filename = basename($_GET["arkname"]);
@ -124,9 +130,16 @@ elseif (isset($_GET["arkname"])) { /* {{{ */
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
}
$controller->setParam('basedir', $backupdir);
$controller->setParam('file', $filename);
$controller->archive();
header('Content-Description: File Transfer');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($backupdir . $filename ));
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: must-revalidate");
sendFile($backupdir .$filename );
} /* }}} */
elseif (isset($_GET["logname"])) { /* {{{ */
$filename = basename($_GET["logname"], '.log').'.log';
@ -145,9 +158,14 @@ elseif (isset($_GET["logname"])) { /* {{{ */
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
}
$controller->setParam('file', $filename);
$controller->setParam('basedir', $settings->_contentDir . 'log/');
$controller->log();
header("Content-Type: text/plain");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($settings->_contentDir.'log/' . $filename ));
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: must-revalidate");
sendFile($settings->_contentDir . 'log/' . $filename );
} /* }}} */
elseif (isset($_GET["vfile"])) { /* {{{ */
@ -197,9 +215,14 @@ elseif (isset($_GET["dumpname"])) { /* {{{ */
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
}
$controller->setParam('basedir', $backupdir);
$controller->setParam('file', $filename);
$controller->sqldump();
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($backupdir . $filename ));
$efilename = rawurlencode($filename);
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
header("Cache-Control: must-revalidate");
sendFile($backupdir .$filename );
} /* }}} */
elseif (isset($_GET["reviewlogid"])) { /* {{{ */
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
@ -220,15 +243,22 @@ elseif (isset($_GET["reviewlogid"])) { /* {{{ */
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
}
$controller->setParam('document', $document);
$controller->setParam('reviewlogid', (int) $_GET['reviewlogid']);
$controller->setParam('type', 'review');
$controller->run();
switch($controller->getErrorNo()) {
case 1:
$filename = $dms->contentDir . $document->getDir().'r'.(int) $_GET['reviewlogid'];
if (!file_exists($filename) ) {
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
break;
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
header("Content-Type: ".$mimetype);
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename ));
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
header("Cache-Control: must-revalidate");
sendFile($filename);
} /* }}} */
elseif (isset($_GET["approvelogid"])) { /* {{{ */
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
@ -249,15 +279,21 @@ elseif (isset($_GET["approvelogid"])) { /* {{{ */
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
}
$controller->setParam('document', $document);
$controller->setParam('approvelogid', (int) $_GET['approvelogid']);
$controller->setParam('type', 'approval');
$controller->run();
switch($controller->getErrorNo()) {
case 1:
$filename = $dms->contentDir . $document->getDir().'a'.(int) $_GET['approvelogid'];
if (!file_exists($filename) ) {
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
break;
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
header("Content-Type: ".$mimetype);
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename ));
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
header("Cache-Control: must-revalidate");
sendFile($filename);
} /* }}} */
add_log_line();

View File

@ -27,18 +27,17 @@ include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");
include("../inc/inc.ClassUI.php");
include("../inc/inc.ClassController.php");
include("../inc/inc.Authentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
/* Check if the form data comes from a trusted request */
if(!checkFormKey('editattributes')) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
}
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access('EditAttributes', $_POST)) {
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
}
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}
@ -51,7 +50,6 @@ if (!is_object($document)) {
}
$folder = $document->getFolder();
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
if ($document->getAccessMode($user, 'editDocumentContentAttributes') < M_READWRITE) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
@ -73,120 +71,25 @@ foreach($version->getAttributes() as $ai=>$aa)
$oldattributes[$ai] = clone $aa;
$attributes = $_POST["attributes"];
if($attributes) {
foreach($attributes as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if($attribute) {
switch($attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_date:
if(is_array($attribute))
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
else
$attribute = date('Y-m-d', makeTsFromDate($attribute));
break;
case SeedDMS_Core_AttributeDefinition::type_folder:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
else
$attribute = $dms->getFolder((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_document:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
else
$attribute = $dms->getDocument((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_user:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
else
$attribute = $dms->getUser((int) $attribute);
break;
case SeedDMS_Core_AttributeDefinition::type_group:
if(is_array($attribute))
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
else
$attribute = $dms->getGroup((int) $attribute);
break;
$controller->setParam('document', $document);
$controller->setParam('version', $version);
$controller->setParam('attributes', $attributes);
if(!$controller()) {
$err = $controller->getErrorMsg();
if(is_string($err))
$errmsg = getMLText($err);
elseif(is_array($err)) {
$errmsg = getMLText($err[0], $err[1]);
} else {
$errmsg = $err;
}
if(!$attrdef->validate($attribute, $version, false)) {
$errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
}
if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
if(!$version->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
}
}
} elseif($attrdef->getMinValues() > 0) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
} elseif(isset($oldattributes[$attrdefid])) {
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
UI::exitError(getMLText("document_title", array("documentname" => $folder->getName())),getMLText("error_occured"));
}
}
}
}
$newattributes = $version->getAttributes();
if($oldattributes) {
foreach($oldattributes as $attrdefid=>$attribute) {
if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) {
if($notifier) {
$notifyList = $document->getNotifyList();
$subject = "attribute_changed_email_subject";
$message = "attribute_changed_email_body";
$params = array();
$params['name'] = $document->getName();
$params['version'] = $version->getVersion();
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
$params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
$params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $settings->_siteName;
$params['http_root'] = $settings->_httpRoot;
$notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($notifyList["groups"] as $grp) {
$notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
}
}
}
}
/* Check for new attributes which didn't have a value before */
if($newattributes) {
foreach($newattributes as $attrdefid=>$attribute) {
if(!isset($oldattributes[$attrdefid]) && $attribute) {
if($notifier) {
$notifyList = $document->getNotifyList();
$subject = "attribute_changed_email_subject";
$message = "attribute_changed_email_body";
$params = array();
$params['name'] = $document->getName();
$params['version'] = '';
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
$params['attribute_old_value'] = '';
$params['attribute_new_value'] = $attribute->getValue();
$params['folder_path'] = $folder->getFolderPathPlain();
$params['username'] = $user->getFullName();
$params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
$params['sitename'] = $settings->_siteName;
$params['http_root'] = $settings->_httpRoot;
$notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
foreach ($notifyList["groups"] as $grp) {
$notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
}
}
}
}
if($notifier) {
$notifier->sendChangedVersionAttributesMail($version, $user, $oldattributes);
}
add_log_line("?documentid=".$documentid);
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$versionid);
?>

View File

@ -34,11 +34,6 @@ if(!checkFormKey('editcomment')) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
}
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access('EditComment', $_POST)) {
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
}
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
}

View File

@ -31,10 +31,6 @@ include("../inc/inc.Authentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access($controller, $_POST)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
}
/* Check if the form data comes from a trusted request */
if(!checkFormKey('editdocument')) {
@ -53,7 +49,6 @@ if (!is_object($document)) {
}
$folder = $document->getFolder();
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
if ($document->getAccessMode($user, 'editDocument') < M_READWRITE) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
@ -129,7 +124,6 @@ $oldexpires = $document->getExpires();
$oldattributes = array();
foreach($document->getAttributes() as $ai=>$aa)
$oldattributes[$ai] = clone $aa;
//$oldattributes = $document->getAttributes();
$controller->setParam('fulltextservice', $fulltextservice);
$controller->setParam('document', $document);

View File

@ -32,10 +32,6 @@ include("../inc/inc.Authentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access($controller, $_POST)) {
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
}
/* Check if the form data comes from a trusted request */
if(!checkFormKey('editdocumentfile')) {

View File

@ -31,10 +31,6 @@ include("../inc/inc.Authentication.php");
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
if (!$accessop->check_controller_access($controller, $_POST)) {
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("access_denied"));
}
/* Check if the form data comes from a trusted request */
if(!checkFormKey('editfolder')) {

Some files were not shown because too many files have changed in this diff Show More