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; }