/** * Display */ public function display($tpl = null) { // load data $this->month = CHLibDate::getMonth(substr($this->search->start_date, 0, -3)); $this->months_list = CHLibDate::getMonthsList(); $this->availability = $this->get('Availability'); // check availability if (!$this->availability || $this->availability->errors->errors) { // errors view $this->setLayout('errors'); } // rooms with extras if (isset($this->availability->results)) { $this->rooms_with_extras = []; $rooms_with_extras = []; foreach ($this->availability->results->search_rooms as $search_room) { foreach ($search_room->available_rooms as $available_room) { if (count($available_room->extras)) { $rooms_with_extras[] = (int) $available_room->room_id; } } } $this->rooms_with_extras = array_values(array_unique($rooms_with_extras)); } // extend view $this->extendView(); // display the view parent::display($tpl); }
/** * Get the availability data for a hotel */ public function getCalendar() { // hotel_id $hotel_id = $this->getHotelId(); if (!$hotel_id) { throw new Exception(CHClient::string('error_resource_not_found'), 404); } // load search $search = CHClient::getSearch(); // get month start and end dates $default_month = substr($search->start_date, 0, -3); $month_date = $this->app->getUserStateFromRequest('chclient.month', 'month', $default_month, 'string'); // init calendar object $calendar = new stdClass(); $calendar->month = CHLibDate::getMonth($month_date); $calendar->months_list = CHLibDate::getMonthsList(); // get ari from api $request = (object) ['hotel_id' => $hotel_id, 'start_date' => $calendar->month->start, 'end_date' => $calendar->month->end, 'currency' => $search->currency, 'lang' => JFactory::getLanguage()->getTag()]; $api_request = $this->apiRequest('ari_get', $request); // check for errors if ($api_request->errors->errors) { return $api_request; } // finalise calendar object $calendar->ari = $api_request->response; return $calendar; }
/** * Display */ public function display($tpl = null) { // load app $this->app = CHClient::getApp(); // get the booking info $this->booking = $this->get('Booking'); // no booking found if (!$this->booking) { $this->setLayout('errors'); parent::display($tpl); return; } // processing booking if ($this->booking->booking_status >= 40) { return $this->displayProcessing(); } // new booking analytics tracking $this->new_booking = false; if ($this->app->getUserState('chclient.new_booking', false)) { $this->new_booking = (object) ['booking_id' => $this->booking->booking_id, 'hotel' => $this->booking->hotel->title, 'total' => $this->booking->amounts->total, 'currency' => $this->booking->currency]; $this->new_booking->rooms = []; foreach ($this->booking->rooms as $room) { $new_booking_room = (object) ['title' => $room->title, 'reference' => $room->reference, 'total' => $room->amounts->total]; $this->new_booking->rooms[] = $new_booking_room; } $this->app->setUserState('chclient.new_booking', null); } // determine free cancellation $this->data = (object) []; $this->data->free_cancellation = 1; $this->data->deadline = ''; $deadline = 00; foreach ($this->booking->rooms as $room) { $rate_deadline = CHLIbdate::sqlToInt($room->rate->deadline); if ($rate_deadline > $deadline) { $this->data->deadline = $room->rate->deadline; } if (!in_array($room->rate->conditions, ['pay_at_hotel', 'deposit_refundable', 'prepay_refundable'])) { $this->data->free_cancellation = 0; } } if ($this->data->free_cancellation) { $this->data->free_cancellation = CHLibDate::isGreater($this->data->deadline, CHLibDate::dateToSql(false)); } // print voucher ? if ($this->booking && CHLib::input()->get('print')) { return $this->printVoucher(); } // set document title $this->document->setTitle(CHClient::string('your_booking') . ' - ' . $this->booking->booking_id); // display parent::display($tpl); }
/** * Get Availability */ public function getAvailability() { // init request $search = $this->search; $search->hotels_ids = $this->getHotelsIds(); $api_request = $this->apiRequest('search_results', $search); if (!$api_request) { return false; } // prepare availability object $availability = (object) []; $availability->errors = $api_request->errors; $availability->request = $api_request->request->data; if (isset($api_request->app)) { $availability->app = $api_request->app; $availability->app->voucher_text_html = CHLibDisplay::convertMarkdownToHtml($availability->app->voucher_text); } // inventory tasks if (isset($api_request->response->inventory)) { // prepare hotel info $availability->hotel = CHInventory::prepare($api_request->response->inventory[0]); // update inventory db foreach ($api_request->response->inventory as $inventory) { $this->_db->setQuery("DELETE FROM `#__chclient_inventory` WHERE id = {$inventory->id}")->execute(); $insert = (object) ['id' => $inventory->id, 'title' => $inventory->title, 'slug' => $inventory->slug, 'data' => json_encode($inventory)]; $this->_db->insertObject('#__chclient_inventory', $insert, 'id'); } } // check for errors if ($api_request->errors->errors) { // init calendar object if (isset($api_request->response->month_ari)) { $calendar = new stdClass(); $calendar->month = CHLibDate::getMonth(substr($search->start_date, 0, -3)); $calendar->months_list = CHLibDate::getMonthsList(); $calendar->ari = $api_request->response->month_ari; $availability->calendar = $calendar; } return $availability; } // prepare the info $availability->results = $api_request->response->results[0]; $availability->month_ari = $api_request->response->month_ari; return $availability; }
if ($room->rate->conditions == 'pay_at_hotel') { echo '<br><span class="ch-text-block ch-text-green">' . CHClient::string('pay_later') . '</span>'; } } // non_refundable if ($room->non_refundable) { echo '<br><i class="uk-icon-calendar-times-o"></i> <span class="ch-text-block">' . CHClient::string('non_refundable') . '</span>'; } // special_conditions if ($room->special_conditions) { echo '<br><i class="uk-icon-calendar-times-o"></i> <span class="ch-text-block">' . CHClient::string('special_conditions') . '</span>'; } // tip $rate_tip = '<strong>' . CHClient::string('cancellation') . '</strong>: ' . $room->rate->cancellation_policy; if ($room->free_cancellation) { $rate_tip .= '<br>' . CHClient::sprintf('free_cancellation_before', CHLibDate::dateToDisplay($room->rate->deadline, false)); } $rate_tip .= '<br><strong>' . CHClient::string('prepayment') . '</strong>: ' . CHClient::string(CHClientDisplay::ratePrepayment($room->rate->conditions)); echo ' <i class="uk-icon-info-circle" data-uk-tooltip title="' . $rate_tip . '"></i>'; ?> <br> <i class="uk-icon-users"></i> <?php echo CHClientDisplay::roomGuests($room->party->adults, $room->party->children, $room->party->babies); ?> <?php if (isset($room->party->children) && $room->party->children) { ?> <i class="uk-icon-info-circle" data-uk-tooltip title="<?php echo CHClient::sprintf('hotel_ages', $this->availability->results->ages->child, $this->availability->results->ages->adult); ?> "></i>
"> </div> </div> </div> <!-- checkout --> <div class="uk-form-row"> <label class="uk-form-label" for="ch-search-checkout"><?php echo CHClient::string('checkout'); ?> </label> <div class="uk-form-controls"> <div class="uk-form-icon"> <i class="uk-icon-calendar"></i> <input id="ch-search-checkout" class="uk-form-width-small ch-datepicker" type="text" readonly data-ch-datepicker data-ch-search-checkout value="<?php echo CHLibDate::dateToLocale($search->end_date); ?> "> </div> </div> </div> <!-- rooms --> <div class="uk-form-row ch-search-row-rooms"> <label class="uk-form-label" for="ch-search-rooms"><?php echo CHClient::string('rooms'); ?> </label> <div class="uk-form-controls"> <select id="ch-search-rooms" class="uk-form-width-small" data-ch-search-rooms> <?php
if ($confirmed && $this->data->free_cancellation) { ?> <h3><?php echo CHClient::string('cancellation'); ?> </h3> <?php if ($this->data->free_cancellation) { ?> <div class="uk-text-center"> <p class="uk-margin uk-margin-bottom-remove"><a data-uk-modal href="#ch-modal-cancel" class="uk-button uk-button-danger uk-width-8-10"><i class="uk-icon-times-circle"></i> <?php echo CHClient::string('cancel_your_booking'); ?> </a></p> <p class="uk-margin-small uk-text-muted uk-text-small"><?php echo CHClient::sprintf('free_cancellation_before', '<br>' . CHLibDate::dateToDisplay($this->data->deadline, false)); ?> 23:59 <?php echo $booking->hotel->timezone; ?> </p> </div> <?php } ?> <?php if (!$this->data->free_cancellation) { ?> <p class="uk-alert uk-alert-warning"><?php echo CHClient::string('cancellation_request_tip'); ?>
<strong><i class="uk-icon-calendar-check-o"></i> <?php echo CHClient::numstring($search->nights, 'nights'); ?> </strong> <small> <br><?php echo CHClient::string('checkin'); ?> : <?php echo CHLibDate::dateToDisplay($search->start_date); ?> <br><?php echo CHClient::string('checkout'); ?> : <?php echo CHLibDate::dateToDisplay($search->end_date); ?> <?php if (count($search->party) == 1) { ?> <br><?php echo CHClient::sprintf('room_for', CHClientDisplay::roomGuests($search->party[0]->adults, count($search->party[0]->children))); ?> <?php } ?> </small> </p> <?php if (count($search->party) > 1) {
<form class="uk-form" action="<?php echo JRoute::_('index.php?Itemid=' . $this->params->get('Itemid')); ?> " data-ch-promo-form> <fieldset> <legend><?php echo CHClient::string('book_now'); ?> </legend> <div class="uk-form-icon uk-margin uk-margin-small-right"> <i class="uk-icon-calendar"></i> <input id="ch-search-checkin" class="ch-datepicker uk-form-large" type="text" readonly data-ch-datepicker data-ch-promo-checkin value="<?php echo CHLibDate::dateToLocale($search->start_date); ?> "> </div> <select name="nights" class="uk-form-large uk-margin uk-margin-small-right"> <?php for ($i = $this->promo->minstay; $i <= $this->promo->maxstay; $i++) { ?> <option><?php echo CHClient::numstring($i, 'nights'); ?> </option> <?php } ?> </select>
/** * Render month row */ static function monthRow($first, $last, $month, $rooms, $ari, $filter_room = false, $start_empty_days = 0, $end_empty_days = 0) { $html = []; $today_int = CHLibDate::getDate()->format('Ymd'); $currency = isset($ari->currency) ? CHLibDisplay::currencySymbol($ari->currency) : ''; foreach ($rooms as $room) { // check room if ($filter_room && $room->id != $filter_room) { continue; } // prepare available & rates keys $room_ari = isset($ari->ari) ? CHLibData::getObjectFromList($ari->ari, $room->id, 'room_id') : 0; // generate html if (!$filter_room) { $title = '<div class="uk-vertical-align-middle">' . $room->title . '</div>'; $html[] = '<div class="uk-vertical-align ch-month-cell ch-month-cell-row ch-month-cell-title">' . $title . '</div>'; } // empty rows for ($i = 0; $i < $start_empty_days; $i++) { $html[] = '<div class="ch-month-cell ch-month-cell-row"></div>'; } foreach ($month->dates as $date) { // month rows $day = $date->day; if ($day < $first || $day > $last) { continue; } // get day data $date_int = str_replace('-', '', $date->date); $rate = '-'; $aclass = ''; $is_not_in_past = $date_int >= $today_int; if ($room_ari) { $has_availability = isset($room_ari->availability[$day - 1]); $has_rate_and_is_not_zero = isset($room_ari->rates[0]->rate[$day - 1]) && $room_ari->rates[0]->rate[$day - 1] > 0; if ($is_not_in_past && $has_availability && $has_rate_and_is_not_zero) { $rate = CHLibDisplay::money($room_ari->rates[0]->rate[$day - 1], $currency); $available = $room_ari->availability[$day - 1]; $aclass = 'ch-month-cell-span-available-' . ($available ? $available > 2 ? 'ok' : 'low' : 'no'); } } // cells $html[] = '<div class="ch-month-cell ch-month-cell-row ch-month-cell-day-' . $date->day_week . '">'; $html[] = '<small class="uk-text-muted ch-month-cell-span ch-month-cell-span-available ' . $aclass . '">' . $rate . '</small>'; $html[] = '</div>'; } // empty rows for ($i = 0; $i < $end_empty_days; $i++) { $html[] = '<div class="ch-month-cell ch-month-cell-row"></div>'; } } return implode("\n", $html); }
/** * Determine free cancellation * @param type $conditions * @param type $deadline */ public static function freeCancellation($conditions, $deadline) { if (!in_array($conditions, ['pay_at_hotel', 'deposit_refundable', 'prepay_refundable'])) { return false; } return CHLibDate::isGreater(CHLibDate::sqlToInt($deadline), CHLibDate::dateToSql(false)); }
} ?> <br><strong><?php echo CHClient::string('cancellation_policy'); ?> </strong>: <?php echo $this->escape($room->rate->cancellation_policy); ?> <?php if ($deadline) { ?> <br><strong><?php echo CHClient::string('cancellation_deadline'); ?> </strong>: <span class="ch-booking-text-green"><?php echo CHLibDate::dateToDisplay($room->rate->deadline); ?> 23:59 [<?php echo $hotel->timezone; ?> ]</span> <?php } ?> </p> </div> </div> <hr>