Example #1
0
 public function checkOccurrences($start, $end, $calendarIds)
 {
     $ranges = Controller::find(array('concept' => 'repeatRange'), array('rangeStart', 'rangeEnd'), array('filter' => array('=', 'user', Config::me("uidNumber"))));
     $ranges = $ranges[0];
     $origStart = $start;
     $origEnd = $end;
     if ($initialized = isset($ranges['rangeStart']) && isset($ranges['rangeEnd'])) {
         if ($ranges['rangeStart'] <= $start) {
             $start = false;
         }
         if ($ranges['rangeEnd'] >= $end) {
             $end = false;
         }
     }
     $repeats = self::findRepeats($calendarIds);
     if (!is_array($repeats) || empty($repeats)) {
         return false;
     }
     $result = array();
     $ids = array();
     foreach ($repeats as $repeat) {
         $ids[] = $id = $repeat['id'];
         unset($repeat['id']);
         if (!isset($result[$id])) {
             $result[$id] = !$initialized ? array($repeat['startTime']) : array();
         }
         if (!$initialized) {
             $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $start, $end));
         } else {
             if ($start) {
                 $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $start, $ranges['rangeStart']));
             }
             if ($end) {
                 $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $ranges['rangeEnd'], $end));
             }
         }
         if (empty($result[$id])) {
             unset($result[$id]);
         }
     }
     if ($start || $end) {
         Controller::begin(array('service' => 'PostgreSQL'));
         foreach ($result as $id => $res) {
             $ocurrences = array_unique($res);
             /*
              * Check current range decoded
              * */
             $current = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('=', 'repeat', $id)));
             $toDiff = array();
             if (!empty($current)) {
                 foreach ($current as $c) {
                     $toDiff[] = $c['occurrence'];
                 }
             }
             $ocurrences = array_diff($ocurrences, $toDiff);
             if (!empty($ocurrences)) {
                 Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,occurrence)VALUES('" . $id . "','" . implode("'),('" . $id . "', '", $ocurrences) . "')");
             }
         }
         $data = array();
         if ($start) {
             $data['rangeStart'] = $start;
         }
         if ($end) {
             $data['rangeEnd'] = $end;
         }
         if (!$initialized) {
             $data['user'] = Config::me('uidNumber');
         }
         Controller::call($initialized ? 'replace' : 'create', array('concept' => 'repeatRange'), $data, array('filter' => array('=', 'user', Config::me('uidNumber'))));
         Controller::commit(array('service' => 'PostgreSQL'));
     }
     // 	$return = Controller::find( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( 'AND', array( '>=', 'occurrence', $origStart ), array( '<=', 'occurrence', $origEnd ), array( 'IN', 'repeat', $ids ) ), 'deepness' => $deep ) );
     $return = Controller::service('PostgreSQL')->execResultSql('SELECT calendar_repeat_occurrence.occurrence as "occurrence", calendar_repeat.object_id as "schedulable" FROM calendar_repeat, calendar_repeat_occurrence WHERE calendar_repeat_occurrence.occurrence >= \'' . $origStart . '\' AND calendar_repeat_occurrence.occurrence <= \'' . $origEnd . '\' AND calendar_repeat_occurrence.repeat_id IN (\'' . implode('\',\'', $ids) . '\') AND calendar_repeat.id = calendar_repeat_occurrence.repeat_id AND calendar_repeat_occurrence.exception != 1 order by calendar_repeat_occurrence.occurrence');
     if (!is_array($return)) {
         return false;
     }
     $result = array();
     $params = array();
     $realResult = array();
     foreach ($return as $ret) {
         $currentId = $ret['schedulable'];
         if (!isset($result[$currentId])) {
             $result[$currentId] = Controller::read(array('concept' => 'schedulable', 'id' => $currentId));
             $result[$currentId]['occurrences'] = array();
         }
         $result[$currentId]['occurrences'][] = $ret['occurrence'];
     }
     foreach ($result as $i => $v) {
         $calendarToCalendarObj = self::schedulable2calendarToObject($v['id']);
         foreach ($calendarToCalendarObj as $vv) {
             $v['calendar'] = $vv['calendar_id'];
             $realResult[] = $v;
         }
     }
     return $realResult;
 }