65        $this->log = 
$DIC->logger()->crs();
 
   66        $this->lng = 
$DIC->language();
 
   67        $this->lng->loadLanguageModule(
'crs');
 
   68        $this->db = 
$DIC->database();
 
   69        $this->obj_data_cache = 
$DIC[
'ilObjDataCache'];
 
   71        self::$objects_information = array();
 
   72        self::$coaches_emails = array();
 
   73        $this->users_with_exceeded_timings = array();
 
   74        $this->users = array();
 
   83        return 'crs_timings_reminder';
 
   91        return $this->lng->txt(
'timings_reminder_notifications');
 
   99        return $this->lng->txt(
'timings_reminder_notifications_info');
 
  144        $this->log->debug(
'Start.');
 
  155        $this->log->debug(
'End');
 
  166        $query = $this->db->queryF(
 
  167            'SELECT usr_id FROM usr_data WHERE  
  168                                                                        (active = 1 AND time_limit_unlimited = 1) OR  
  169                                                                        (active = 1 AND time_limit_unlimited = 0 AND time_limit_from < %s AND time_limit_until > %s)',
 
  170            array(
'integer', 
'integer'),
 
  173        while (
$row = $this->db->fetchAssoc(
$query)) {
 
  174            $usr_id = (int) 
$row[
'usr_id'];
 
  175            $this->users[$usr_id] = $usr_id;
 
  177        $this->log->debug(
'Found ' . count($this->users) . 
' users.');
 
  186        $this->log->debug(
'Found ' . count($this->users_with_exceeded_timings) . 
' users with exceeded timings.');
 
  194        $users_with_exceeded_objects = array();
 
  196        if (is_array($this->users_with_exceeded_timings) && count($this->users_with_exceeded_timings) > 0) {
 
  197            foreach ($this->users_with_exceeded_timings as 
$key => $user_id) {
 
  199                if (is_array($objects) && count($objects) > 0) {
 
  202                    $objects = array_diff_key($objects, $already_notified);
 
  203                    foreach ($objects as $ref_id => $v) {
 
  205                        $obj_data[$ref_id] = $detail_data;
 
  207                    if (count($obj_data) > 0) {
 
  208                        $users_with_exceeded_objects[$user_id] = $obj_data;
 
  212            $this->log->debug(
'Found ' . 
sizeof($users_with_exceeded_objects) . 
' users with new exceeded timings.');
 
  223        $users_with_new_started_object = array();
 
  225        if (is_array($this->users) && count($this->users) > 0) {
 
  226            foreach ($this->users as 
$key => $user_id) {
 
  228                if (is_array($objects) && count($objects) > 0) {
 
  231                    $this->log->debug(
'User_id ' . $user_id . 
' was already notified for ' . 
sizeof($already_notified) . 
' elements ');
 
  232                    $objects = array_diff_key($objects, $already_notified);
 
  233                    foreach ($objects as $ref_id => $v) {
 
  236                        if (is_array($objects[$ref_id])) {
 
  237                            if ((isset($objects[$ref_id][
'end']) && isset($objects[$ref_id][
'start'])) && $objects[$ref_id][
'end'] > $this->now) {
 
  238                                if ($objects[$ref_id][
'start'] < $this->now) {
 
  239                                    $users_with_new_started_object[$user_id][$ref_id] = $obj_data[$ref_id];
 
  242                                $this->log->debug(
'End is already older than today no notification send for user_id ' . $user_id . 
' on ref_id ' . $ref_id);
 
  248            $this->log->debug(
'Found ' . count($users_with_new_started_object) . 
' users with freshly started timings.');
 
  259        $this->log->debug(
'Start.');
 
  260        if (is_array($users_with_exceeded_objects)) {
 
  261            $this->log->debug(
'...found ' . count($users_with_exceeded_objects));
 
  262            foreach ($users_with_exceeded_objects as $user_id => $exceeded_objects) {
 
  268                    $this->log->debug(
'start sending exceeded mail to user: ' . $user_id);
 
  272            $this->log->warning(
'no array given.');
 
  275        $this->log->debug(
'end.');
 
  283        $this->log->debug(
'start.');
 
  284        if (is_array($users_with_freshly_started_objects)) {
 
  285            $this->log->debug(
'...found ' . 
sizeof($users_with_freshly_started_objects));
 
  286            foreach ($users_with_freshly_started_objects as $user_id => $freshly_started_objects) {
 
  290                if ($has_freshly_started) {
 
  295            $this->log->debug(
'no array given.');
 
  298        $this->log->debug(
'end.');
 
  308        $this->log->debug(
'start...');
 
  309        $tpl = 
new ilTemplate(
'tpl.crs_timings_cron_reminder_mail.html', 
true, 
true, 
'Modules/Course');
 
  313        $tpl->setVariable(
'START_BODY', $this->user_lang->txt($language_variable));
 
  314        $this->log->debug(
'for user: ' . $user_id . 
' end.');
 
  325        $has_elements = 
false;
 
  326        foreach ($objects as $object_id => $object_details) {
 
  327            if ($object_details[
'type'] == 
'fold') {
 
  328                $tpl->setCurrentBlock(
'items');
 
  329                $tpl->setVariable(
'HREF', $object_details[
'url']);
 
  330                $tpl->setVariable(
'ITEM_TITLE', $object_details[
'title']);
 
  331                $tpl->parseCurrentBlock();
 
  332                $has_elements = 
true;
 
  338        $this->log->debug(
'found elements: ' . $has_elements);
 
  339        return $has_elements;
 
  347        $this->log->debug(
'start...');
 
  349        $this->user_lang->loadLanguageModule(
'crs');
 
  350        $this->user_lang->loadLanguageModule(
'mail');
 
  351        $this->log->debug(
'user language for user ' . $user_id . 
' is ' . $this->user_lang->getLangKey() . 
' end.');
 
  361        if (is_array(
$name)) {
 
  362            $salutation = $this->user_lang->txt(
'mail_salutation_n') . 
' ';
 
  363            if (
$name[
'gender'] != 
'') {
 
  364                $salutation .= $this->user_lang->txt(
'salutation_' . 
$name[
'gender']) . 
' ';
 
  366            if (
$name[
'title'] != 
'') {
 
  367                $salutation .= 
$name[
'title'] . 
' ';
 
  369            $tpl->setVariable(
'SALUTATION', $salutation);
 
  370            $tpl->setVariable(
'FIRSTNAME', 
$name[
'firstname']);
 
  371            $tpl->setVariable(
'LASTNAME', 
$name[
'lastname']);
 
  372            $this->log->debug(
'Salutation: ' . $salutation . 
' Firstname: ' . 
$name[
'firstname'] . 
' Lastname: ' . 
$name[
'lastname']);
 
  374            $this->log->debug(
'did not get an array from _lookupName.');
 
  387            $mail = 
new ilMail(ANONYMOUS_USER_ID);
 
  393                    $this->user_lang->txt(
'timings_cron_reminder_exceeded_subject'),
 
  399                $this->log->debug(
'...mail send for user ' . $user_id . 
' to mail ' . 
$login . 
' has exceeded timings for ' . $mail_body);
 
  402                $this->log->debug(
'... no mail was sent because user ' . $user_id . 
' has deactivated their notifications and has no coaches assigned.');
 
  405            $this->log->debug(
'Not send. User ' . $user_id . 
' has no email.');
 
  420            $mail = 
new ilMail(ANONYMOUS_USER_ID);
 
  425                $this->user_lang->txt(
'timings_cron_reminder_started_subject'),
 
  431            $this->log->debug(
'...mail send for user ' . $user_id . 
' to mail ' . 
$login . 
' has freshly started timings for ' . $mail_body);
 
  434            $this->log->debug(
'Not send. User ' . $user_id . 
' has no email.');
 
  444        foreach ($ref_ids as $ref_id => 
$data) {
 
  445            $this->db->manipulateF(
 
  448                array(
'integer', 
'integer', 
'integer'),
 
  449                array($user_id, $ref_id, $this->now)
 
  452            $this->log->debug(
'ilTimingsCronReminder->markExceededInDatabase: Marked exceeded in Database. User ' . $user_id . 
' ref_id ' . $ref_id);
 
  462        foreach ($ref_ids as $ref_id => 
$data) {
 
  463            $this->db->manipulateF(
 
  466                array(
'integer', 
'integer', 
'integer'),
 
  467                array($user_id, $ref_id, $this->now)
 
  470            $this->log->debug(
'ilTimingsCronReminder->markFreshlyStartedInDatabase: Marked freshly started in Database. User ' . $user_id . 
' ref_id ' . $ref_id);
 
  484        if (!$for_exceeded) {
 
  489            'SELECT * FROM ' . 
$table . 
' WHERE ' .
 
  495        while ($record = $this->db->fetchAssoc(
$result)) {
 
  496            $ref_ids[$record[
'ref_id']] = $record[
'ref_id'];
 
  508        if (!array_key_exists($ref_id, self::$objects_information)) {
 
  509            $obj_id = $this->obj_data_cache->lookupObjId($ref_id);
 
  510            $type = $this->obj_data_cache->lookupType($obj_id);
 
  511            $value = array(     
'title' => $this->obj_data_cache->lookupTitle($obj_id),
 
  516            self::$objects_information[$ref_id] = $value;
 
  518            $this->log->debug(
'ilTimingsCronReminder->getInformationForRefId: ...cached object information for => ' . $value[
'type'] . 
' => ' . $value[
'title']);
 
  520        return self::$objects_information[$ref_id];
 
  531        return $exceeded_obj_list;
 
  542        $meta = $meta[$user_id];
 
An exception for terminatinating execution or to throw for unit testing.
const CRON_TIMINGS_STARTED_TABLE
const CRON_TIMINGS_EXCEEDED_TABLE
Cron job result data container.
Cron job application base class.
const SCHEDULE_TYPE_DAILY
static _getLanguageOfUser($a_usr_id)
Get language object of user.
static _getLink($a_ref_id, $a_type='', $a_params=array(), $append="")
static _getInstallationSignature()
static _lookupLogin($a_user_id)
lookup login
static _lookupName($a_user_id)
lookup user name
special template class to simplify handling of ITX/PEAR
getDefaultScheduleValue()
Get schedule value.
sendFreshlyStartedMail($user_id, $ref_ids, $mail_body)
fillObjectListForMailBody($objects, $tpl)
getObjectsWithTimingsForUser($user_id)
gatherUsersWithExceededTimings()
Users with exceeded timings.
markExceededInDatabase($user_id, $ref_ids)
buildFreshlyStartedMails($users_with_freshly_started_objects)
getFreshlyStartedObjectsForUser()
Get freshly started objects.
markFreshlyStartedInDatabase($user_id, $ref_ids)
getNewExceededObjectForUser()
get new exceeded objects for users
getAlreadySentNotifications($user_id, $for_exceeded=true)
static $objects_information
hasUserActivatedNotification($user_id)
buildExceededMails($users_with_exceeded_objects)
buildMailSalutation($user_id, $tpl)
getExceededObjectsForUser($user_id)
gatherUsers()
Read all active users.
$users_with_exceeded_timings
buildTopMailBody($user_id, $language_variable)
getInformationForRefId($ref_id)
sendExceededMail($user_id, $ref_ids, $mail_body)
getUserLanguage($user_id)
__construct()
Constructor.
static lookupTimingsExceededByUser(array $a_user_ids)
Check if users currently exceeded ANY object.
static lookupTimings(array $a_user_ids, array &$a_meta=null, $a_only_exceeded=true)
Lookup references, users with exceeded timings.
if(empty($password)) $table