/**
  * 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);
 }
示例#4
0
 /**
  * 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');
 }