diff --git a/utils/open-tasks.php b/utils/open-tasks.php new file mode 100644 index 000000000..46f6acc47 --- /dev/null +++ b/utils/open-tasks.php @@ -0,0 +1,295 @@ +] [-u ] [-r receiver] [-h] [-v] [-t] [-q] -d -D \n"; + echo "\n"; + echo "Description:\n"; + echo " Check for tasks which need to be done by a user.\n"; + echo "\n"; + echo "Options:\n"; + echo " -h, --help: print usage information and exit.\n"; + echo " -v, --version: print version and exit.\n"; + echo " --config=: set alternative config file.\n"; + echo " -u : comma separated list of user names to check. If not set all\n"; + echo " users will be checked.\n"; + echo " -r : email address where all mails are sent to. If not set the\n"; + echo " users themselves are informed.\n"; + echo " -f : set From field in notification mail\n"; + echo " -b : set base for links in html email. The final link will be\n"; + echo " out/out.ViewDocument.php. The default is\n"; + echo " http://localhost\n"; + echo " -d : check for n days in the future (default 14). Days always\n". + " start and end at midnight. A value of '1' means today.\n"; + echo " -t: run in test mode (will not send any mails)\n"; + echo " -q: be quite (just output error messages)\n"; +} /* }}} */ + +$version = "0.0.1"; +$tableformat = "%-65s %-12s"; +$tableformathtml = "%s%s"; +$baseurl = "http://localhost/"; +$mailfrom = "uwe@steinman.cx"; + +$shortoptions = "u:d:D:f:b:a:A:c:C:m:u:r:tqhv"; +$longoptions = array('help', 'version', 'config:'); +if(false === ($options = getopt($shortoptions, $longoptions))) { + usage(); + exit(0); +} + +/* Print help and exit */ +if(isset($options['h']) || isset($options['help'])) { + usage(); + exit(0); +} + +/* Print version and exit */ +if(isset($options['v']) || isset($options['verѕion'])) { + echo $version."\n"; + exit(0); +} + +/* Set alternative config file */ +if(isset($options['config'])) { + $settings = new Settings($options['config']); +} else { + $settings = new Settings(); +} +include("inc/inc.Language.php"); +include("inc/inc.Extension.php"); + +$LANG['de_DE']['daylyDigestMail'] = 'Tägliche Benachrichtigungsmail über ausstehende Aufgaben'; +$LANG['en_GB']['daylyDigestMail'] = 'Dayly digest mail with due tasks'; +$LANG['de_DE']['docsNeedToCareAbout'] = 'Dokumente, die seit mehr als [days] Tagen auf ihre Bearbeitung warten.'; +$LANG['en_GB']['docsNeedToCareAbout'] = 'Documents waiting for your attention for more than [days] days.'; +$LANG['de_DE']['waiting_for_review'] = 'Dokumente, die auf ihre Prüfung warten'; +$LANG['de_DE']['waiting_for_approval'] = 'Dokumente, die auf ihre Freigabe warten'; +$LANG['de_DE']['waiting_for_receipt'] = 'Dokumente, die auf ihre Empfangsbestätigung warten'; +$LANG['de_DE']['waiting_for_revision'] = 'Dokumente, die auf ihre Wiederholungsprüfung warten'; +$LANG['de_DE']['duedate'] = 'Fälligkeit'; + +if(isset($settings->_extraPath)) + ini_set('include_path', $settings->_extraPath. PATH_SEPARATOR .ini_get('include_path')); + +require_once("SeedDMS/Core.php"); + +$days = 14; +if(isset($options['d'])) { + $days = (int) $options['d']; +} +$enddays = 0; +if(isset($options['D'])) { + $enddays = (int) $options['D']; +} + +if($enddays >= $days) { + echo "Value of -D must be less then value of -d\n"; + exit(1); +} + +if(isset($options['f'])) { + $mailfrom = trim($options['f']); +} + +if(isset($options['b'])) { + $baseurl = trim($options['b']); +} + +$username = ''; +if(isset($options['u'])) { + $username = trim($options['u']); +} + +$receiver = ''; +if(isset($options['r'])) { + $receiver = trim($options['r']); +} + +$dryrun = false; +if(isset($options['t'])) { + $dryrun = true; + echo "Running in test mode will not send any mail.\n"; +} +$quite = false; +if(isset($options['q'])) { + $quite = true; +} + +$showobsolete = false; + +$db = new SeedDMS_Core_DatabaseAccess($settings->_dbDriver, $settings->_dbHostname, $settings->_dbUser, $settings->_dbPass, $settings->_dbDatabase); +$db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostname . "\""); +$db->_debug = 1; + +$dms = new SeedDMS_Core_DMS($db, $settings->_contentDir.$settings->_contentOffsetDir); +if(!$settings->_doNotCheckDBVersion && !$dms->checkVersion()) { + echo "Database update needed."; + exit; +} +$dms->setRootFolderID($settings->_rootFolderID); +$dms->setMaxDirID($settings->_maxDirID); +$dms->setEnableConverting($settings->_enableConverting); +$dms->setViewOnlineFileTypes($settings->_viewOnlineFileTypes); + +$startts = strtotime("midnight", time()); +if($username) { + $users = array(); + $tmp = explode(',', $username); + foreach($tmp as $t) { + if($u = $dms->getUserByLogin($t)) + $users[] = $u; + } +} else { + $users = $dms->getAllUsers(); +} +if(!$users) { + echo "No users specified or available."; + exit; +} + +foreach($users as $user) { + if(!$quite) + echo "Checking for tasks of user ".$user->getFullName()." which are due for more than ".$days." days\n\n"; + + $sendmail = false; /* Set to true if there is something to report */ + + $tasks = array('approval'=>array(), 'review'=>array(), 'receipt'=>array(), 'revision'=>array()); + $resArr = $dms->getDocumentList('ApproveByMe', $user); + if($resArr) { + foreach ($resArr as $res) { + $tmp = explode(' ', $res['duedate'], 2); + if($tmp[0] < date('Y-m-d', $startts-$days*86400)) { + $document = $dms->getDocument($res["id"]); + if($document->getAccessMode($user) >= M_READ && $document->getLatestContent()) { + $tasks['approval'][] = array('id'=>$res['id'], 'name'=>$res['name'], 'date'=>$res['duedate']); + } + } + } + } + + $resArr = $dms->getDocumentList('ReviewByMe', $user); + if($resArr) { + foreach ($resArr as $res) { + $tmp = explode(' ', $res['duedate'], 2); + if($tmp[0] < date('Y-m-d', $startts-$days*86400)) { + $document = $dms->getDocument($res["id"]); + if($document->getAccessMode($user) >= M_READ && $document->getLatestContent()) { + $tasks['review'][] = array('id'=>$res['id'], 'name'=>$res['name'], 'date'=>$res['duedate']); + } + } + } + } + + $resArr = $dms->getDocumentList('ReceiptByMe', $user); + if($resArr) { + foreach ($resArr as $res) { + $tmp = explode(' ', $res['duedate'], 2); + if($tmp[0] < date('Y-m-d', $startts-$days*86400)) { + $document = $dms->getDocument($res["id"]); + if($document->getAccessMode($user) >= M_READ && $document->getLatestContent()) { + $tasks['receipt'][] = array('id'=>$res['id'], 'name'=>$res['name'], 'date'=>$res['duedate']); + } + } + } + } + + $resArr = $dms->getDocumentList('ReviseByMe', $user); + if($resArr) { + foreach ($resArr as $res) { + $tmp = explode(' ', $res['duedate'], 2); + if($tmp[0] < date('Y-m-d', $startts-$days*86400)) { + $document = $dms->getDocument($res["id"]); + if($document->getAccessMode($user) >= M_READ && $document->getLatestContent()) { + $tasks['revision'][] = array('id'=>$res['id'], 'name'=>$res['name'], 'date'=>$res['duedate']); + } + } + } + } + +// print_r($tasks); + + if (count($tasks['approval'])>0 || count($tasks['review'])>0 || count($tasks['receipt'])>0 || count($tasks['revision'])>0) { + $bodyhead = ""; + $bodyhead .= getMLText('docsNeedToCareAbout', array('days'=>$days))."\n"; + $bodyhead .= "\n"; + + $bodyhtmlhead = "\n\n\nSeedDMS: ".getMLText('daylyDigestMail')."\n_httpRoot."\" />\n\n\n"; + $bodyhtmlhead .= "

"; + $bodyhtmlhead .= getMLText('docsNeedToCareAbout', array('days'=>$days))."\n"; + $bodyhtmlhead .= "

\n"; + $bodyhtmlhead .= "

"; + $bodyhtmlhead .= "

\n"; + + /* Build an array of mail bodies for receiver in $bodyarr + * $bodyarr['email@domain.de']['plain'] = 'mail body for plain text mail' + * $bodyarr['email@domain.de']['html'] = 'mail body for html mail' + */ + $email = $user->getEmail(); + $bodyarr = array($email=>array('plain'=>'', 'html'=>'')); + + foreach(array('review', 'approval', 'receipt', 'revision') as $typ) { + if(!empty($tasks[$typ])) { + $bodyarr[$email]['plain'] .= sprintf($tableformat."\n", getMLText('waiting_for_'.$typ, array()), getMLText("duedate", array())); + $bodyarr[$email]['plain'] .= "---------------------------------------------------------------------------------------\n"; + $bodyarr[$email]['html'] .= "

".getMLText('waiting_for_'.$typ, array())."

"; + $bodyarr[$email]['html'] .= "\n"; + $bodyarr[$email]['html'] .= sprintf($tableformathtml."\n", getMLText('name', array()), getMLText("duedate", array())); + foreach($tasks[$typ] as $task) { + $bodyarr[$email]['plain'] .= sprintf($tableformat."\n", $task["name"], (!$task["date"] ? "-":$task["date"])); + $bodyarr[$email]['html'] .= sprintf($tableformathtml."\n", ''.htmlspecialchars($task["name"]).'', (!$task["date"] ? "-":$task["date"])); + } + $bodyarr[$email]['plain'] .= "\n"; + $bodyarr[$email]['html'] .= "
\n"; + } + } + $bodyfoot = "\n"; + $bodyhtmlfoot = ""; + +// echo $body; +// echo "----------------------------\n\n\n"; +// echo $bodyhtml; + foreach($bodyarr as $address => $msg) { + if(!$quite) { + echo "\n=== Send mail to ".trim($address)." =====================================================\n"; + echo $bodyhead; + echo $bodyarr[$address]['plain']; + echo $bodyfoot; + } else { + } + + if(!$dryrun) { + $mime = new Mail_mime(array('eol' => "\n")); + + $mime->setTXTBody($bodyhead.$msg['plain'].$bodyfoot); + $mime->setHTMLBody($bodyhtmlhead.$msg['html'].$bodyhtmlfoot); + + $body = $mime->get(array( + 'text_encoding'=>'8bit', + 'html_encoding'=>'8bit', + 'head_charset'=>'utf-8', + 'text_charset'=>'utf-8', + 'html_charset'=>'utf-8' + )); + $hdrs = $mime->headers(array('From' => $mailfrom, 'Subject' => 'SeedDMS: '.getMLText('daylyDigestMail').($receiver ? " (".trim($address).")" : ""), 'Content-Type' => 'text/plain; charset=UTF-8')); + + $mail = Mail::factory('mail'); + if($receiver) + $mail->send($receiver, $hdrs, $body); + else + $mail->send(trim($address), $hdrs, $body); + } + } + } else { + if(!$quite) { + echo "No notification needed\n"; + } + } +} diff --git a/utils/seeddms-open-tasks b/utils/seeddms-open-tasks new file mode 100644 index 000000000..e8363b2de --- /dev/null +++ b/utils/seeddms-open-tasks @@ -0,0 +1,6 @@ +#!/bin/sh +if [ -z ${SEEDDMS_HOME+x} ]; then + echo "Please set SEEDDMS_HOME before running this script"; + exit 1; +fi +php -f ${SEEDDMS_HOME}/utils/open-tasks.php -- $*