/**
  * Lookup next booking
  * @param ilDate $start
  * @param ilDate $end
  * @param <type> $group_id
  * @return array
  */
 public static function lookupNextBooking(ilDateTime $start, ilDateTime $end, $group_id)
 {
     try {
         $con = new ilViteroBookingSoapConnector();
         $bookings = $con->getByGroupAndDate($group_id, $start, $end);
     } catch (Exception $e) {
         $GLOBALS['ilLog']->write(__METHOD__ . ': Vitero connection failed with message: ' . $e->getMessage());
         return NULL;
     }
     $bookings_arr = array();
     if (is_object($bookings->booking)) {
         $bookings_arr = array($bookings->booking);
     } elseif (is_array($bookings->booking)) {
         $bookings_arr = $bookings->booking;
     }
     include_once './Services/Calendar/classes/class.ilDateList.php';
     $next_booking['start'] = NULL;
     foreach ($bookings_arr as $booking) {
         // Calculate duration
         $fstart = ilViteroUtils::parseSoapDate($booking->start);
         $fend = ilViteroUtils::parseSoapDate($booking->end);
         $duration = $fend->get(IL_CAL_UNIX) - $fstart->get(IL_CAL_UNIX);
         $buffer_start = $booking->startbuffer;
         $buffer_end = $booking->endbuffer;
         $apps = self::calculateBookingAppointments($start, $end, $booking);
         foreach ($apps as $app) {
             if ($next_booking['start'] instanceof ilDateTime) {
                 if (ilDateTime::_before($app, $next_booking['start'])) {
                     $next_booking['start'] = $app;
                     $next_booking['open'] = clone $next_booking['start'];
                     $next_booking['open']->increment(ilDateTime::MINUTE, $buffer_start * -1);
                     $next_booking['end'] = clone $next_booking['start'];
                     $next_booking['end']->setDate($next_booking->get(IL_CAL_UNIX) + $duration, IL_CAL_UNIX);
                     $next_booking['closed'] = clone $next_booking['end'];
                     $next_booking['closed']->increment(ilDateTime::MINUTE, $buffer_end);
                     $next_booking['id'] = $booking->bookingid;
                 }
             } else {
                 $next_booking['start'] = $app;
                 $next_booking['open'] = clone $next_booking['start'];
                 $next_booking['open']->increment(ilDateTime::MINUTE, $buffer_start * -1);
                 $next_booking['end'] = clone $next_booking['start'];
                 $next_booking['end']->setDate($next_booking['end']->get(IL_CAL_UNIX) + $duration, IL_CAL_UNIX);
                 $next_booking['closed'] = clone $next_booking['end'];
                 $next_booking['closed']->increment(ilDateTime::MINUTE, $buffer_end);
                 $next_booking['id'] = $booking->bookingid;
             }
         }
     }
     return $next_booking;
 }
 /**
  * Parse bookings
  * @param int $a_groupid
  * @param ilDate $start
  * @param ilDate $end
  *
  * throws ilViteroConnectionException
  */
 public function parse($a_groupid, ilDateTime $start, ilDateTime $end)
 {
     $booking_list = array();
     try {
         $con = new ilViteroBookingSoapConnector();
         $bookings = $con->getByGroupAndDate($a_groupid, $start, $end);
     } catch (Exception $e) {
         throw $e;
     }
     $booking_arr = array();
     if (is_object($bookings->booking)) {
         $booking_arr = array($bookings->booking);
     } elseif (is_array($bookings->booking)) {
         $booking_arr = $bookings->booking;
     }
     $counter = 0;
     foreach ($booking_arr as $booking) {
         $fstart = ilViteroUtils::parseSoapDate($booking->start);
         $fend = ilViteroUtils::parseSoapDate($booking->end);
         $duration = $fend->get(IL_CAL_UNIX) - $fstart->get(IL_CAL_UNIX);
         foreach (ilViteroUtils::calculateBookingAppointments($start, $end, $booking) as $dl) {
             $booking_list[$counter]['rec'] = $booking->repetitionpattern;
             $booking_list[$counter]['id'] = $booking->bookingid;
             $booking_list[$counter]['start'] = $dl;
             $booking_list[$counter]['startt'] = $dl->get(IL_CAL_UNIX);
             $bend = clone $dl;
             $bend->setDate($dl->get(IL_CAL_UNIX) + $duration, IL_CAL_UNIX);
             $booking_list[$counter]['end'] = $bend;
             if ($booking->cafe) {
                 $booking_list[$counter]['start'] = new ilDate($booking_list[$counter]['startt'], IL_CAL_UNIX);
                 $booking_list[$counter]['time'] = ilDatePresentation::formatDate($booking_list[$counter]['start']);
             } else {
                 $booking_list[$counter]['time'] = ilDatePresentation::formatPeriod($booking_list[$counter]['start'], $booking_list[$counter]['end']);
             }
             $booking_list[$counter]['duration'] = ilFormat::_secondsToString($booking_list[$counter]['end']->get(IL_CAL_UNIX) - $booking_list[$counter]['start']->get(IL_CAL_UNIX), false);
             if ($booking->repetitionpattern) {
                 $repend = ilViteroUtils::parseSoapDate($booking->repetitionenddate);
                 $booking_list[$counter]['ends'] = ilDatePresentation::formatDate(new ilDate($repend->get(IL_CAL_UNIX), IL_CAL_UNIX));
             }
             $counter++;
         }
     }
     $this->setMaxCount(count($booking_list));
     $this->setData($booking_list);
 }
 protected function updateBooking()
 {
     global $ilTabs;
     $ilTabs->activateTab('content');
     $this->ctrl->setParameter($this, 'bookid', (int) $_REQUEST['bookid']);
     try {
         $booking_service = new ilViteroBookingSoapConnector();
         $booking = $booking_service->getBookingById((int) $_REQUEST['bookid']);
     } catch (ilViteroConnectorException $e) {
         ilUtil::sendFailure($e->getMessage(), true);
         $this->ctrl->redirect($this, 'showContent');
     }
     $form = $this->initUpdateBookingForm($booking);
     if (!$form->checkInput()) {
         $form->setValuesByPost();
         ilUtil::sendFailure($this->lng->txt('err_check_input'));
         $GLOBALS['tpl']->setContent($form->getHTML());
         return false;
     }
     $room = new ilViteroRoom();
     $room->setBookingId($booking->booking->bookingid);
     $room->setBufferBefore((int) $_POST['buffer_before']);
     $room->setBufferAfter((int) $_POST['buffer_after']);
     // Set end date for cafe room
     if ($booking->booking->cafe) {
         $start = $form->getItemByPostVar('cstart')->getDate();
         $end = clone $start;
         $end->increment(IL_CAL_DAY, 1);
         $room->setStart($start);
         $room->setEnd($end);
     } else {
         $start = $form->getItemByPostVar('roomduration')->getStart();
         $end = $form->getItemByPostVar('roomduration')->getEnd();
         $room->setStart($start);
         $room->setEnd($end);
     }
     try {
         $con = new ilViteroBookingSoapConnector();
         $con->updateBooking($room, $this->object->getVGroupId());
         ilUtil::sendSuccess($GLOBALS['lng']->txt('settings_saved'), true);
         $this->ctrl->redirect($this, 'showContent');
         return true;
     } catch (ilViteroConnectorException $e) {
         ilUtil::sendFailure($e->getViteroMessage(), true);
         $form->setValuesByPost();
         $GLOBALS['tpl']->setContent($form->getHTML());
     }
 }
 public static function handleDeletedGroups()
 {
     global $ilDB;
     $query = 'SELECT child, obd.obj_id FROM tree ' . 'JOIN object_reference obr ON child = ref_id ' . 'JOIN object_data obd ON obr.obj_id = obd.obj_id ' . 'WHERE type = ' . $ilDB->quote('xvit', 'text') . ' ' . 'AND tree < ' . $ilDB->quote(0, 'integer');
     $res = $ilDB->query($query);
     while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) {
         if (!ilObject::_hasUntrashedReference($row->obj_id)) {
             try {
                 $vgroup_id = ilObjVitero::lookupVGroupId($row->obj_id);
                 if (!$vgroup_id) {
                     continue;
                 }
                 $start = new ilDate(time(), IL_CAL_UNIX);
                 $end = clone $start;
                 $start->increment(IL_CAL_YEAR, -2);
                 $end->increment(IL_CAL_YEAR, 2);
                 $booking_service = new ilViteroBookingSoapConnector();
                 $books = $booking_service->getByGroupAndDate($vgroup_id, $start, $end);
                 if (is_object($books->booking)) {
                     try {
                         $booking_service->deleteBooking($books->booking->bookingid);
                     } catch (ilViteroConnectorException $e) {
                         $GLOBALS['ilLog']->write(__METHOD__ . ': Deleting deprecated booking failed with message: ' . $e->getMessage());
                     }
                 }
                 if (is_array($books->booking)) {
                     foreach ((array) $books->booking as $book) {
                         try {
                             $booking_service->deleteBooking($book->bookingid);
                         } catch (ilViteroConnectorException $e) {
                             $GLOBALS['ilLog']->write(__METHOD__ . ': Deleting deprecated booking failed with message: ' . $e->getMessage());
                         }
                     }
                 }
             } catch (ilViteroConnectorException $e) {
                 $GLOBALS['ilLog']->write(__METHOD__ . ': Cannot read bookings of group "' . $vgroup_id . '": ' . $e->getMessage());
             }
         }
         // Delete group
         try {
             $groups = new ilViteroGroupSoapConnector();
             $groupDefinition = new ilViteroGroupSoap();
             $groupDefinition->groupid = $vgroup_id;
             $groups->delete($groupDefinition);
             // Update vgroup id
             $query = 'UPDATE rep_robj_xvit_data ' . 'SET vgroup_id = 0 ' . 'WHERE obj_id = ' . $ilDB->quote($row->obj_id, 'integer');
             $ilDB->manipulate($query);
         } catch (ilViteroConnectorException $e) {
             $GLOBALS['ilLog']->write(__METHOD__ . ': Delete group failed: "' . $vgroup_id . '": ' . $e->getMessage());
         }
     }
 }