2020-05-27 13:12:03 +00:00
< ? php
2020-05-28 06:10:39 +00:00
require_once ( " inc/inc.ClassSchedulerTaskBase.php " );
2020-05-27 13:12:03 +00:00
/**
* Class containing methods for running a scheduled task
*
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ package SeedDMS
2020-09-30 07:11:13 +00:00
* @ subpackage core
2020-05-27 13:12:03 +00:00
*/
class SeedDMS_ExpiredDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
/**
* Run the task
*
* @ param $task task to be executed
* @ param $dms dms
* @ return boolean true if task was executed succesfully , otherwise false
*/
2021-07-05 08:08:51 +00:00
public function execute ( SeedDMS_SchedulerTask $task ) {
2020-06-28 11:59:54 +00:00
$dms = $this -> dms ;
2021-02-24 14:01:13 +00:00
$user = $this -> user ;
$settings = $this -> settings ;
$logger = $this -> logger ;
2020-05-27 13:12:03 +00:00
$taskparams = $task -> getParameter ();
2021-02-15 18:04:23 +00:00
$tableformat = " %-10s %5d %-60s " ;
$tableformathead = " %-10s %5s %-60s " ;
2021-02-24 14:01:13 +00:00
$tableformathtml = " <tr><td>%s</td><td>%d</td><td>%s</td></tr> " ;
$tableformatheadhtml = " <tr><th>%s</th><th>%s</th><th>%s</th></tr> " ;
2021-02-15 18:04:23 +00:00
$body = '' ;
2021-02-24 14:01:13 +00:00
$bodyhtml = '' ;
2021-06-16 06:02:32 +00:00
require_once ( 'inc/inc.ClassEmailNotify.php' );
$email = new SeedDMS_EmailNotify ( $dms , $settings -> _smtpSendFrom , $settings -> _smtpServer , $settings -> _smtpPort , $settings -> _smtpUser , $settings -> _smtpPassword );
if ( ! empty ( $taskparams [ 'peruser' ])) {
$users = $dms -> getAllUsers ();
foreach ( $users as $u ) {
2021-08-19 11:52:13 +00:00
if ( ! $u -> isGuest () && ! $u -> isDisabled ()) {
$docs = $dms -> getDocumentsExpired ( intval ( $taskparams [ 'days' ]), $u );
if ( count ( $docs ) > 0 ) {
$bodyhtml .= " <table> " . PHP_EOL ;
$bodyhtml .= sprintf ( $tableformatheadhtml . " \n " , getMLText ( " expires " , array (), " " ), " ID " , getMLText ( " name " , array (), " " ));
$body .= sprintf ( $tableformathead . " \n " , getMLText ( " expires " , array (), " " ), " ID " , getMLText ( " name " , array (), " " ));
$body .= " --------------------------------------------------------------------------------- \n " ;
foreach ( $docs as $doc ) {
$body .= sprintf ( $tableformat . " \n " , getReadableDate ( $doc -> getExpires ()), $doc -> getId (), $doc -> getName ());
$bodyhtml .= sprintf ( $tableformathtml . " \n " , getReadableDate ( $doc -> getExpires ()), $doc -> getId (), $doc -> getName ());
}
$bodyhtml .= " </table> " . PHP_EOL ;
$params = array ();
$params [ 'count' ] = count ( $docs );
$params [ '__body__' ] = $body ;
$params [ '__body_html__' ] = $bodyhtml ;
$params [ 'sitename' ] = $settings -> _siteName ;
$email -> toIndividual ( '' , $u , 'expired_docs_mail_subject' , '' , $params );
2021-06-16 06:02:32 +00:00
2021-08-19 11:52:13 +00:00
$logger -> log ( 'Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \'' . $u -> getLogin () . '\'' , PEAR_LOG_INFO );
}
2021-06-16 06:02:32 +00:00
}
}
} elseif ( $taskparams [ 'email' ]) {
$docs = $dms -> getDocumentsExpired ( intval ( $taskparams [ 'days' ]));
if ( count ( $docs ) > 0 ) {
$bodyhtml .= " <table> " . PHP_EOL ;
$bodyhtml .= sprintf ( $tableformatheadhtml . " \n " , getMLText ( " expiration_date " , array (), " " ), " ID " , getMLText ( " name " , array (), " " ));
$body .= sprintf ( $tableformathead . " \n " , getMLText ( " expiration_date " , array (), " " ), " ID " , getMLText ( " name " , array (), " " ));
$body .= " --------------------------------------------------------------------------------- \n " ;
foreach ( $docs as $doc ) {
$body .= sprintf ( $tableformat . " \n " , getReadableDate ( $doc -> getExpires ()), $doc -> getId (), $doc -> getName ());
$bodyhtml .= sprintf ( $tableformathtml . " \n " , getReadableDate ( $doc -> getExpires ()), $doc -> getId (), $doc -> getName ());
}
$bodyhtml .= " </table> " . PHP_EOL ;
2021-02-24 14:01:13 +00:00
$params = array ();
$params [ 'count' ] = count ( $docs );
$params [ '__body__' ] = $body ;
$params [ '__body_html__' ] = $bodyhtml ;
$params [ 'sitename' ] = $settings -> _siteName ;
$email -> toIndividual ( '' , $taskparams [ 'email' ], 'expired_docs_mail_subject' , '' , $params );
$logger -> log ( 'Task \'expired_docs\': Sending reminder \'expired_docs_mail_subject\' to user \'' . $taskparams [ 'email' ] . '\'' , PEAR_LOG_INFO );
2021-06-16 06:02:32 +00:00
}
} else {
$logger -> log ( 'Task \'expired_docs\': neither peruser nor email is set' , PEAR_LOG_WARNING );
2020-06-28 11:59:54 +00:00
}
2020-05-27 13:12:03 +00:00
return true ;
}
public function getDescription () {
return 'Check for expired documents and set the document status' ;
}
public function getAdditionalParams () {
return array (
2021-02-15 18:04:23 +00:00
array (
'name' => 'email' ,
'type' => 'string' ,
'description' => '' ,
),
2020-05-27 13:12:03 +00:00
array (
'name' => 'days' ,
'type' => 'integer' ,
'description' => 'Number of days to check for. Negative values will look into the past. 0 will just check for documents expiring the current day. Keep in mind that the document is still valid on the expiration date.' ,
2021-06-16 06:02:32 +00:00
),
array (
'name' => 'peruser' ,
'type' => 'boolean' ,
'description' => 'Send mail to each user. If set, a list of all expired documents will be send to the owner of the documents.' ,
2020-05-27 13:12:03 +00:00
)
);
}
} /* }}} */
2020-09-30 07:11:13 +00:00
/**
* Class for processing a single folder
*
* SeedDMS_Task_Indexer_Process_Folder :: process () is used as a callable when
* iterating over all folders recursively .
*/
class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
2021-07-05 08:08:51 +00:00
protected $scheduler ;
2020-09-30 07:11:13 +00:00
protected $forceupdate ;
protected $fulltextservice ;
2021-07-05 08:08:51 +00:00
public function __construct ( $scheduler , $fulltextservice , $forceupdate ) { /* {{{ */
$this -> scheduler = $scheduler ;
2020-09-30 07:11:13 +00:00
$this -> fulltextservice = $fulltextservice ;
$this -> forceupdate = $forceupdate ;
2021-06-24 10:51:44 +00:00
$this -> numdocs = $this -> fulltextservice -> Indexer () -> count ();
2020-09-30 07:11:13 +00:00
} /* }}} */
2021-06-24 10:51:44 +00:00
public function process ( $folder , $depth = 0 ) { /* {{{ */
$lucenesearch = $this -> fulltextservice -> Search ();
2020-09-30 07:11:13 +00:00
$documents = $folder -> getDocuments ();
2021-06-24 10:51:44 +00:00
echo str_repeat ( ' ' , $depth + 1 ) . $folder -> getId () . " : " . $folder -> getFolderPathPlain () . " " ;
if (( $this -> numdocs == 0 ) || ! ( $hit = $lucenesearch -> getFolder ( $folder -> getId ()))) {
try {
$idoc = $this -> fulltextservice -> IndexedDocument ( $folder , true );
if ( isset ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexFolder' ])) {
foreach ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexFolder' ] as $hookObj ) {
if ( method_exists ( $hookObj , 'preIndexFolder' )) {
$hookObj -> preIndexDocument ( null , $folder , $idoc );
}
}
}
$this -> fulltextservice -> Indexer () -> addDocument ( $idoc );
echo " ( " . getMLText ( 'index_folder_added' ) . " ) " . PHP_EOL ;
} catch ( Exception $e ) {
echo " (Timeout) " . PHP_EOL ;
}
} else {
/* Check if the attribute created is set or has a value older
* than the lastet content . Folders without such an attribute
* where added when a new folder was added to the dms . In such
* a case the folder content wasn ' t indexed .
*/
try {
$created = ( int ) $hit -> getDocument () -> getFieldValue ( 'created' );
} catch ( /* Zend_Search_Lucene_ */ Exception $e ) {
$created = 0 ;
}
if ( $created >= $folder -> getDate () && ! $this -> forceupdate ) {
echo " ( " . getMLText ( 'index_folder_unchanged' ) . " ) " . PHP_EOL ;
} else {
$this -> fulltextservice -> Indexer () -> delete ( $hit -> id );
try {
$idoc = $this -> fulltextservice -> IndexedDocument ( $folder , true );
if ( isset ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexFolder' ])) {
foreach ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexFolder' ] as $hookObj ) {
if ( method_exists ( $hookObj , 'preIndexFolder' )) {
$hookObj -> preIndexDocument ( null , $folder , $idoc );
}
}
}
$this -> fulltextservice -> Indexer () -> addDocument ( $idoc );
echo " ( " . getMLText ( 'index_folder_updated' ) . " ) " . PHP_EOL ;
} catch ( Exception $e ) {
echo " (Timeout) " . PHP_EOL ;
}
}
}
2020-09-30 07:11:13 +00:00
if ( $documents ) {
foreach ( $documents as $document ) {
2021-06-24 10:51:44 +00:00
echo str_repeat ( ' ' , $depth + 2 ) . $document -> getId () . " : " . $document -> getName () . " " ;
2020-09-30 07:11:13 +00:00
/* If the document wasn't indexed before then just add it */
2021-06-24 10:51:44 +00:00
if (( $this -> numdocs == 0 ) || ! ( $hit = $lucenesearch -> getDocument ( $document -> getId ()))) {
2020-09-30 07:11:13 +00:00
try {
$idoc = $this -> fulltextservice -> IndexedDocument ( $document , true );
if ( isset ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexDocument' ])) {
foreach ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexDocument' ] as $hookObj ) {
if ( method_exists ( $hookObj , 'preIndexDocument' )) {
$hookObj -> preIndexDocument ( null , $document , $idoc );
}
}
}
$this -> fulltextservice -> Indexer () -> addDocument ( $idoc );
2021-06-24 06:43:09 +00:00
echo " ( " . getMLText ( 'index_document_added' ) . " ) " . PHP_EOL ;
2020-09-30 07:11:13 +00:00
} catch ( Exception $e ) {
2021-06-24 06:43:09 +00:00
echo " (Timeout) " . PHP_EOL ;
2020-09-30 07:11:13 +00:00
}
} else {
/* Check if the attribute created is set or has a value older
* than the lastet content . Documents without such an attribute
* where added when a new document was added to the dms . In such
2021-02-15 18:04:23 +00:00
* a case the document content wasn ' t indexed .
2020-09-30 07:11:13 +00:00
*/
try {
$created = ( int ) $hit -> getDocument () -> getFieldValue ( 'created' );
} catch ( /* Zend_Search_Lucene_ */ Exception $e ) {
$created = 0 ;
}
$content = $document -> getLatestContent ();
if ( $created >= $content -> getDate () && ! $this -> forceupdate ) {
2021-06-24 06:43:09 +00:00
echo " ( " . getMLText ( 'index_document_unchanged' ) . " ) " . PHP_EOL ;
2020-09-30 07:11:13 +00:00
} else {
$this -> fulltextservice -> Indexer () -> delete ( $hit -> id );
try {
$idoc = $this -> fulltextservice -> IndexedDocument ( $document , true );
if ( isset ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexDocument' ])) {
foreach ( $GLOBALS [ 'SEEDDMS_HOOKS' ][ 'indexDocument' ] as $hookObj ) {
if ( method_exists ( $hookObj , 'preIndexDocument' )) {
$hookObj -> preIndexDocument ( null , $document , $idoc );
}
}
}
$this -> fulltextservice -> Indexer () -> addDocument ( $idoc );
2021-06-24 06:43:09 +00:00
echo " ( " . getMLText ( 'index_document_updated' ) . " ) " . PHP_EOL ;
2020-09-30 07:11:13 +00:00
} catch ( Exception $e ) {
2021-06-24 06:43:09 +00:00
echo " (Timeout) " . PHP_EOL ;
2020-09-30 07:11:13 +00:00
}
}
}
}
}
} /* }}} */
} /* }}} */
/**
* Class containing methods for running a scheduled task
*
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ package SeedDMS
* @ subpackage core
*/
class SeedDMS_IndexingDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
/**
* Run the task
*
* @ param $task task to be executed
* @ param $dms dms
* @ return boolean true if task was executed succesfully , otherwise false
*/
2021-07-05 08:08:51 +00:00
public function execute ( SeedDMS_SchedulerTask $task ) {
2020-09-30 07:11:13 +00:00
$dms = $this -> dms ;
2021-02-24 14:11:20 +00:00
$logger = $this -> logger ;
2020-09-30 07:11:13 +00:00
$fulltextservice = $this -> fulltextservice ;
$taskparams = $task -> getParameter ();
$folder = $dms -> getRootFolder ();
$recreate = isset ( $taskparams [ 'recreate' ]) ? $taskparams [ 'recreate' ] : false ;
if ( $fulltextservice ) {
if ( $recreate ) {
$index = $fulltextservice -> Indexer ( true );
if ( ! $index ) {
UI :: exitError ( getMLText ( " admin_tools " ), getMLText ( " no_fulltextindex " ));
}
} else {
$index = $fulltextservice -> Indexer ( false );
if ( ! $index ) {
$index = $fulltextservice -> Indexer ( true );
if ( ! $index ) {
UI :: exitError ( getMLText ( " admin_tools " ), getMLText ( " no_fulltextindex " ));
}
}
}
2021-07-05 08:08:51 +00:00
$folderprocess = new SeedDMS_Task_Indexer_Process_Folder ( $this , $fulltextservice , $recreate );
2021-06-24 10:51:44 +00:00
call_user_func ( array ( $folderprocess , 'process' ), $folder , - 1 );
2021-04-22 07:28:25 +00:00
$tree = new SeedDMS_FolderTree ( $folder , array ( $folderprocess , 'process' ));
} else {
$logger -> log ( 'Task \'indexingdocs\': fulltext search is turned off' , PEAR_LOG_WARNING );
}
2020-09-30 07:11:13 +00:00
return true ;
}
public function getDescription () {
return 'Indexing all new or updated documents' ;
}
public function getAdditionalParams () {
return array (
array (
'name' => 'recreate' ,
'type' => 'boolean' ,
'description' => 'Force recreation of index' ,
)
);
}
} /* }}} */
2021-01-26 14:42:45 +00:00
/**
* Class for processing a single folder
*
* SeedDMS_Task_CheckSum_Process_Folder :: process () is used as a callable when
* iterating over all folders recursively .
*/
class SeedDMS_Task_CheckSum_Process_Folder { /* {{{ */
public function __construct () { /* {{{ */
} /* }}} */
public function process ( $folder ) { /* {{{ */
$dms = $folder -> getDMS ();
$documents = $folder -> getDocuments ();
if ( $documents ) {
foreach ( $documents as $document ) {
$versions = $document -> getContent ();
foreach ( $versions as $version ) {
if ( file_exists ( $dms -> contentDir . $version -> getPath ())) {
$checksum = SeedDMS_Core_File :: checksum ( $dms -> contentDir . $version -> getPath ());
if ( $checksum != $version -> getChecksum ()) {
echo $document -> getId () . ':' . $version -> getVersion () . ' wrong checksum' . PHP_EOL ;
}
} else {
echo $document -> getId () . ':' . $version -> getVersion () . ' missing content' . PHP_EOL ;
}
}
}
}
} /* }}} */
} /* }}} */
/**
* Class containing methods for running a scheduled task
*
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ package SeedDMS
* @ subpackage core
*/
class SeedDMS_CheckSumTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
/**
* Run the task
*
* @ param $task task to be executed
* @ param $dms dms
* @ return boolean true if task was executed succesfully , otherwise false
*/
2021-07-05 08:08:51 +00:00
public function execute ( SeedDMS_SchedulerTask $task ) {
2021-01-26 14:42:45 +00:00
$dms = $this -> dms ;
2021-02-24 14:11:20 +00:00
$logger = $this -> logger ;
2021-01-26 14:42:45 +00:00
$taskparams = $task -> getParameter ();
$folder = $dms -> getRootFolder ();
$folderprocess = new SeedDMS_Task_CheckSum_Process_Folder ();
$tree = new SeedDMS_FolderTree ( $folder , array ( $folderprocess , 'process' ));
call_user_func ( array ( $folderprocess , 'process' ), $folder );
return true ;
}
public function getDescription () {
return 'Check all documents for a propper checksum' ;
}
public function getAdditionalParams () {
return array (
);
}
} /* }}} */
2021-05-09 11:41:53 +00:00
/**
* Class for processing a single folder
*
* SeedDMS_Task_Preview_Process_Folder :: process () is used as a callable when
* iterating over all folders recursively .
*/
class SeedDMS_Task_Preview_Process_Folder { /* {{{ */
protected $logger ;
protected $previewer ;
protected $widths ;
public function __construct ( $previewer , $widths , $logger ) { /* {{{ */
$this -> logger = $logger ;
$this -> previewer = $previewer ;
$this -> widths = $widths ;
} /* }}} */
public function process ( $folder ) { /* {{{ */
$dms = $folder -> getDMS ();
$documents = $folder -> getDocuments ();
if ( $documents ) {
foreach ( $documents as $document ) {
$versions = $document -> getContent ();
foreach ( $versions as $version ) {
2021-05-11 17:02:48 +00:00
foreach ( $this -> widths as $previewtype => $width ) {
if ( $previewtype == 'detail' || $document -> isLatestContent ( $version -> getVersion ())) {
$isnew = null ;
if ( $this -> previewer -> createPreview ( $version , $width , $isnew )) {
if ( $isnew ){
$this -> logger -> log ( 'Task \'preview\': created preview (' . $width . 'px) for document ' . $document -> getId () . ':' . $version -> getVersion (), PEAR_LOG_INFO );
}
}
2021-05-09 11:41:53 +00:00
}
}
}
2021-05-11 20:13:35 +00:00
$files = $document -> getDocumentFiles ();
foreach ( $files as $file ) {
2021-08-06 06:33:34 +00:00
$this -> previewer -> createPreview ( $file , $width , $isnew );
2021-05-11 20:13:35 +00:00
if ( $isnew ){
$this -> logger -> log ( 'Task \'preview\': created preview (' . $width . 'px) for attachment of document ' . $document -> getId () . ':' . $file -> getId (), PEAR_LOG_INFO );
}
}
2021-05-09 11:41:53 +00:00
}
}
} /* }}} */
} /* }}} */
/**
* Class containing methods for running a scheduled task
*
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ package SeedDMS
* @ subpackage core
*/
class SeedDMS_PreviewTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
/**
* Run the task
*
* @ param $task task to be executed
* @ param $dms dms
* @ return boolean true if task was executed succesfully , otherwise false
*/
2021-07-05 08:08:51 +00:00
public function execute ( SeedDMS_SchedulerTask $task ) {
2021-05-09 11:41:53 +00:00
$dms = $this -> dms ;
$logger = $this -> logger ;
$settings = $this -> settings ;
2021-10-16 15:44:11 +00:00
$conversionmgr = $this -> conversionmgr ;
2021-05-09 11:41:53 +00:00
$taskparams = $task -> getParameter ();
$folder = $dms -> getRootFolder ();
$previewer = new SeedDMS_Preview_Previewer ( $settings -> _cacheDir );
2021-10-16 15:44:11 +00:00
$logger -> log ( 'Task \'previewer\': ' . ( $conversionmgr ? 'has conversionmgr' : 'has not conversionmgr' ), PEAR_LOG_INFO );
if ( $conversionmgr ) {
$fromservices = $conversionmgr -> getServices ();
foreach ( $fromservices as $from => $toservices )
foreach ( $toservices as $to => $services )
foreach ( $services as $service )
$logger -> log ( $from . '->' . $to . ' : ' . get_class ( $service ), PEAR_LOG_DEBUG );
$previewer -> setConversionMgr ( $conversionmgr );
} else
$previewer -> setConverters ( isset ( $settings -> _converters [ 'preview' ]) ? $settings -> _converters [ 'preview' ] : array ());
2021-05-09 11:41:53 +00:00
2021-05-11 17:02:48 +00:00
$folderprocess = new SeedDMS_Task_Preview_Process_Folder ( $previewer , array ( 'list' => $settings -> _previewWidthList , 'detail' => $settings -> _previewWidthDetail ), $logger );
2021-05-09 11:41:53 +00:00
$tree = new SeedDMS_FolderTree ( $folder , array ( $folderprocess , 'process' ));
call_user_func ( array ( $folderprocess , 'process' ), $folder );
return true ;
}
public function getDescription () {
return 'Check all documents for a missing preview image' ;
}
public function getAdditionalParams () {
return array (
);
}
} /* }}} */
2022-03-28 15:36:20 +00:00
/**
* Class containing methods for running a scheduled task
*
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ package SeedDMS
* @ subpackage core
*/
class SeedDMS_CalendarTask extends SeedDMS_SchedulerTaskBase { /* {{{ */
/**
* Run the task
*
* @ param $task task to be executed
* @ param $dms dms
* @ return boolean true if task was executed succesfully , otherwise false
*/
public function execute ( SeedDMS_SchedulerTask $task ) {
$dms = $this -> dms ;
$user = $this -> user ;
$logger = $this -> logger ;
$settings = $this -> settings ;
$taskparams = $task -> getParameter ();
$calendar = new SeedDMS_Calendar ( $dms -> getDB (), $user );
$events = $calendar -> getEventsInInterval ( mktime ( 0 , 0 , 0 , $start [ 1 ], $start [ 2 ], $start [ 0 ]), mktime ( 23 , 59 , 59 , $end [ 1 ], $end [ 2 ], $end [ 0 ]));
return true ;
}
public function getDescription () {
return 'Check calendar for upcoming events' ;
}
public function getAdditionalParams () {
return array (
);
}
} /* }}} */
2020-06-28 11:59:54 +00:00
$GLOBALS [ 'SEEDDMS_SCHEDULER' ][ 'tasks' ][ 'core' ][ 'expireddocs' ] = 'SeedDMS_ExpiredDocumentsTask' ;
2020-09-30 07:11:13 +00:00
$GLOBALS [ 'SEEDDMS_SCHEDULER' ][ 'tasks' ][ 'core' ][ 'indexingdocs' ] = 'SeedDMS_IndexingDocumentsTask' ;
2021-01-26 14:42:45 +00:00
$GLOBALS [ 'SEEDDMS_SCHEDULER' ][ 'tasks' ][ 'core' ][ 'checksum' ] = 'SeedDMS_CheckSumTask' ;
2021-05-09 11:41:53 +00:00
$GLOBALS [ 'SEEDDMS_SCHEDULER' ][ 'tasks' ][ 'core' ][ 'preview' ] = 'SeedDMS_PreviewTask' ;
2022-03-28 15:36:20 +00:00
//$GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['calendar'] = 'SeedDMS_CalendarTask';