public function confirmedBookingNumbersObject() { // convert post data to initial form config $counter = array(); foreach (array_keys($_POST) as $id) { if (substr($id, 0, 9) == "conf_nr__") { $id = explode("_", substr($id, 9)); $counter[$id[0] . "_" . $id[1] . "_" . $id[2]] = $id[3]; } } $group_id = $_POST["grp_id"]; $form = $this->initBookingNumbersForm($counter, $group_id); if ($form->checkInput()) { include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; $success = false; foreach ($counter as $id => $all_nr) { $book_nr = $form->getInput("conf_nr__" . $id . "_" . $all_nr); $parts = explode("_", $id); $obj_id = $parts[0]; $from = $parts[1]; $to = $parts[2] - 1; // get currently available slots $counter = ilBookingReservation::getAvailableObject(array($obj_id), $from, $to, false, true); $counter = $counter[$obj_id]; if ($counter) { // we can only book what is left $book_nr = min($book_nr, $counter); for ($loop = 0; $loop < $book_nr; $loop++) { $this->processBooking($obj_id, $from, $to, $group_id); $success = $obj_id; } } } if ($success) { $this->handleBookingSuccess($success); } else { ilUtil::sendFailure($this->lng->txt('book_reservation_failed'), true); $this->ctrl->redirect($this, 'render'); } } else { $form->setValuesByPost(); return $this->confirmBookingNumbers($counter, $group_id, $form); } }
protected function buildDatesBySchedule($week_start, array $hours, $schedule, array $object_ids, $seed, array &$dates) { $map = array('mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'); $definition = $schedule->getDefinition(); $has_open_slot = false; foreach (ilCalendarUtil::_buildWeekDayList($seed, $week_start)->get() as $date) { $date_info = $date->get(IL_CAL_FKT_GETDATE, '', 'UTC'); $slots = array(); if (isset($definition[$map[$date_info['isoday'] - 1]])) { $slots = array(); foreach ($definition[$map[$date_info['isoday'] - 1]] as $slot) { $slot = explode('-', $slot); $slots[] = array('from' => str_replace(':', '', $slot[0]), 'to' => str_replace(':', '', $slot[1])); } } $last = array_pop(array_keys($hours)); $slot_captions = array(); foreach ($hours as $hour => $period) { $dates[$hour][0] = $period; $period = explode("-", $period); if (sizeof($period) == 1) { $period_from = (int) substr($period[0], 0, 2) . "00"; $period_to = (int) substr($period[0], 0, 2) . "59"; } else { $period_from = (int) substr($period[0], 0, 2) . "00"; $period_to = (int) substr($period[1], 0, 2) . "59"; } $column = $date_info['isoday']; if (!$week_start) { if ($column < 7) { $column++; } else { $column = 1; } } if (sizeof($slots)) { $in = false; foreach ($slots as $slot) { $slot_from = mktime(substr($slot['from'], 0, 2), substr($slot['from'], 2, 2), 0, $date_info["mon"], $date_info["mday"], $date_info["year"]); $slot_to = mktime(substr($slot['to'], 0, 2), substr($slot['to'], 2, 2), 0, $date_info["mon"], $date_info["mday"], $date_info["year"]); // check deadline if ($slot_from < time() + $schedule->getDeadline() * 60 * 60 || !ilBookingReservation::getAvailableObject($object_ids, $slot_from, $slot_to - 1)) { continue; } // is slot active in current hour? if ((int) $slot['from'] < $period_to && (int) $slot['to'] > $period_from) { $from = ilDatePresentation::formatDate(new ilDateTime($slot_from, IL_CAL_UNIX)); $from = array_pop(explode(' ', $from)); $to = ilDatePresentation::formatDate(new ilDateTime($slot_to, IL_CAL_UNIX)); $to = array_pop(explode(' ', $to)); // show caption (first hour) of slot $id = $slot_from . '_' . $slot_to; if (!in_array($id, $slot_captions)) { $dates[$hour][$column]['captions'][$id] = $from . '-' . $to; $slot_captions[] = $id; } $in = true; } } // (any) active slot if ($in) { $has_open_slot = true; $dates[$hour][$column]['in_slot'] = $in; } } } } return $has_open_slot; }
public function confirmedBookingNumbersObject() { include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; // convert post data to initial form config $counter = array(); $current_first = $obj_id = null; foreach (array_keys($_POST) as $id) { if (substr($id, 0, 9) == "conf_nr__") { $id = explode("_", substr($id, 9)); $counter[$id[0] . "_" . $id[1] . "_" . $id[2]] = (int) $id[3]; if (!$current_first) { $current_first = date("Y-m-d", $id[1]); } } } // recurrence if ((int) $_POST["recm"] > 0 && $current_first) { ksort($counter); $end = $_POST["rece"]["date"]; $end = date("Y-m-d", mktime(23, 59, 59, $end["m"], $end["d"], $end["y"])); $cycle = (int) $_POST["recm"] * 7; $cut = 0; $org = $counter; while ($cut < 1000 && $this->addDaysDate($current_first, $cycle) <= $end) { $cut++; $current_first = null; foreach ($org as $item_id => $max) { $parts = explode("_", $item_id); $obj_id = $parts[0]; $from = $this->addDaysStamp($parts[1], $cycle * $cut); $to = $this->addDaysStamp($parts[2], $cycle * $cut); $new_item_id = $obj_id . "_" . $from . "_" . $to; // form reload because of validation errors if (!isset($counter[$new_item_id]) && date("Y-m-d", $to) <= $end) { // get max available for added dates $new_max = ilBookingReservation::getAvailableObject(array($obj_id), $from, $to - 1, false, true); $new_max = (int) $new_max[$obj_id]; $counter[$new_item_id] = $new_max; if (!$current_first) { $current_first = date("Y-m-d", $from); } // clone input $_POST["conf_nr__" . $new_item_id . "_" . $new_max] = $_POST["conf_nr__" . $item_id . "_" . $max]; } } } } $group_id = $_POST["grp_id"]; $form = $this->initBookingNumbersForm($counter, $group_id, true); if ($form->checkInput()) { $success = false; $rsv_ids = array(); foreach ($counter as $id => $all_nr) { $book_nr = $form->getInput("conf_nr__" . $id . "_" . $all_nr); $parts = explode("_", $id); $obj_id = $parts[0]; $from = $parts[1]; $to = $parts[2] - 1; // get currently available slots $counter = ilBookingReservation::getAvailableObject(array($obj_id), $from, $to, false, true); $counter = $counter[$obj_id]; if ($counter) { // we can only book what is left $book_nr = min($book_nr, $counter); for ($loop = 0; $loop < $book_nr; $loop++) { $rsv_ids[] = $this->processBooking($obj_id, $from, $to, $group_id); $success = $obj_id; } } } if ($success) { $this->handleBookingSuccess($success, $rsv_ids); } else { ilUtil::sendFailure($this->lng->txt('book_reservation_failed'), true); $this->ctrl->redirect($this, 'render'); } } else { $form->setValuesByPost(); // ilDateTimeInputGUI does NOT add hidden values on disabled! $rece_year = $_POST["rece"]["date"]["y"]; $rece_month = str_pad($_POST["rece"]["date"]["m"], 2, "0", STR_PAD_LEFT); $rece_day = str_pad($_POST["rece"]["date"]["d"], 2, "0", STR_PAD_LEFT); $form->getItemByPostVar("rece")->setDate(new ilDate($rece_year . "-" . $rece_month . "-" . $rece_day, IL_CAL_DATE)); $form->getItemByPostVar("recm")->setHideSubForm($_POST["recm"] < 1); $hidden_date = new ilHiddenInputGUI("rece[date][y]"); $hidden_date->setValue($rece_year); $form->addItem($hidden_date); $hidden_date = new ilHiddenInputGUI("rece[date][m]"); $hidden_date->setValue($rece_month); $form->addItem($hidden_date); $hidden_date = new ilHiddenInputGUI("rece[date][d]"); $hidden_date->setValue($rece_day); $form->addItem($hidden_date); return $this->confirmBookingNumbers($counter, $group_id, $form); } }