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;
 }
Ejemplo n.º 3
0
 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);
     }
 }