/** * gets snoozed time in alarm * * @param Tinebase_Model_Alarm $alarm * @param Tinebase_Model_User $user */ public static function getSnoozeTime($alarm, $user = null) { $user = $user instanceof Tinebase_Model_User ?: Tinebase_Core::getUser(); $times = $alarm->getOption("snoozed-{$user->contact_id}"); if (is_array($times)) { foreach ($times as $idx => $time) { $times[$idx] = $times[$idx] ? new Tinebase_DateTime($time) : $times[$idx]; } return $times; } else { return $times ? new Tinebase_DateTime($times) : $times; } }
/** * checks if given alarm should be send to given attendee * * @param Calendar_Model_Attender $_attendee * @param Tinebase_Model_Alarm $_alarm * @return bool */ public static function isAlarmForAttendee($_attendee, $_alarm, $_event = NULL) { // attendee: array with one user_type/id if alarm is for one attendee only $attendeeOption = $_alarm->getOption('attendee'); // skip: array of array of user_type/id with attendees this alarm is to skip for $skipOption = $_alarm->getOption('skip'); if ($attendeeOption) { return (bool) self::getAttendee(new Tinebase_Record_RecordSet('Calendar_Model_Attender', array($_attendee)), new Calendar_Model_Attender($attendeeOption)); } if (is_array($skipOption)) { $skipAttendees = new Tinebase_Record_RecordSet('Calendar_Model_Attender', $skipOption); if (self::getAttendee($skipAttendees, $_attendee)) { return false; } } $isOrganizerCondition = $_event ? $_event->isOrganizer($_attendee) : TRUE; $isAttendeeCondition = $_event && $_event->attendee instanceof Tinebase_Record_RecordSet ? self::getAttendee($_event->attendee, $_attendee) : TRUE; return ($isAttendeeCondition || $isOrganizerCondition) && $_attendee->status != Calendar_Model_Attender::STATUS_DECLINED; }
/** * send an alarm * * @param Tinebase_Model_Alarm $_alarm * @return void * * NOTE: the given alarm is raw and has not passed _inspectAlarmGet * * @todo throw exception on error */ public function sendAlarm(Tinebase_Model_Alarm $_alarm) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " About to send alarm " . print_r($_alarm->toArray(), TRUE)); } $doContainerACLChecks = $this->doContainerACLChecks(FALSE); try { $event = $this->get($_alarm->record_id); $event->alarms = new Tinebase_Record_RecordSet('Tinebase_Model_Alarm', array($_alarm)); $this->_inspectAlarmGet($event); } catch (Exception $e) { $this->doContainerACLChecks($doContainerACLChecks); throw $e; } $this->doContainerACLChecks($doContainerACLChecks); if ($event->rrule) { $recurid = $_alarm->getOption('recurid'); // adopts the (referenced) alarm and sets alarm time to next occurance parent::_inspectAlarmSet($event, $_alarm); $this->adoptAlarmTime($event, $_alarm, 'instance'); // sent_status might have changed in adoptAlarmTime() if ($_alarm->sent_status !== Tinebase_Model_Alarm::STATUS_PENDING) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Not sending alarm for event at ' . $event->dtstart->toString() . ' with status ' . $_alarm->sent_status); } return; } if ($recurid) { // NOTE: In case of recuring events $event is always the baseEvent, // so we might need to adopt event time to recur instance. $diff = $event->dtstart->diff($event->dtend); $event->dtstart = new Tinebase_DateTime(substr($recurid, -19)); $event->dtend = clone $event->dtstart; $event->dtend->add($diff); } if ($event->exdate && in_array($event->dtstart, $event->exdate)) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Not sending alarm because instance at " . $event->dtstart->toString() . ' is an exception.'); } return; } } Calendar_Controller_EventNotifications::getInstance()->doSendNotifications($event, Tinebase_Core::getUser(), 'alarm', NULL, $_alarm); }
/** * send an alarm * * @param Tinebase_Model_Alarm $_alarm * @return void * * NOTE: the given alarm is raw and has not passed _inspectAlarmGet * * @todo make this working with recuring events * @todo throw exception on error */ public function sendAlarm(Tinebase_Model_Alarm $_alarm) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " About to send alarm " . print_r($_alarm->toArray(), TRUE)); } $doContainerACLChecks = $this->doContainerACLChecks(FALSE); $event = $this->get($_alarm->record_id); $event->alarms = new Tinebase_Record_RecordSet('Tinebase_Model_Alarm', array($_alarm)); $this->_inspectAlarmGet($event); if ($event->rrule) { $recurid = $_alarm->getOption('recurid'); // adopts the (referenced) alarm and sets alarm time to next occurance parent::_inspectAlarmSet($event, $_alarm); $this->adoptAlarmTime($event, $_alarm, 'instance'); if ($recurid) { // NOTE: In case of recuring events $event is always the baseEvent, // so we might need to adopt event time to recur instance. $diff = $event->dtstart->diff($event->dtend); $event->dtstart = new Tinebase_DateTime(substr($recurid, -19)); $event->dtend = clone $event->dtstart; $event->dtend->add($diff); } } $this->doContainerACLChecks($doContainerACLChecks); $this->doSendNotifications($event, $this->_currentAccount, 'alarm'); }