function gdlrs_get_booking_price($option)
 {
     $ret = array('weekday-night' => 0, 'weekend-night' => 0, 'ss_weekday-night' => 0, 'ss_weekend-night' => 0, 'base' => 0, 'base-weekend' => 0, 'ss_base' => 0, 'ss_base-weekend' => 0, 'total' => 0);
     // get the loop (date) counter
     $from = new DateTime($option['data']['check-in']);
     $to = new DateTime($option['data']['check-out']);
     $interval = new DateInterval('P1D');
     $periods = new DatePeriod($from, $interval, $to);
     // calculate the price
     $workingDays = array(1, 2, 3, 4, 5);
     $ss_prices = json_decode(gdlr_decode_preventslashes($option['special-season-pricing']), true);
     foreach ($periods as $period) {
         $weekday = in_array($period->format('N'), $workingDays) ? true : false;
         $special_season = false;
         foreach ($ss_prices as $ss_price) {
             if (gdlr_is_ss($period->format('Y-m-d'), $ss_price)) {
                 if ($weekday) {
                     $ret['ss_base'] += floatval($ss_price['bpwd']);
                     $ret['ss_weekday-night']++;
                 } else {
                     $ret['ss_base-weekend'] += floatval($ss_price['bpwe']);
                     $ret['ss_weekend-night']++;
                 }
                 $special_season = true;
                 break;
             }
         }
         if (!$special_season) {
             if ($weekday) {
                 $ret['base'] += floatval($option['room-base-price']);
                 $ret['weekday-night']++;
             } else {
                 $ret['base-weekend'] += floatval($option['room-base-price-weekend']);
                 $ret['weekend-night']++;
             }
         }
     }
     // calculate total price
     $ret['total'] = $ret['base'] + $ret['base-weekend'];
     $ret['total'] += $ret['ss_base'] + $ret['ss_base-weekend'];
     return $ret;
 }
 function gdlr_get_booking_room_query($data, $room_number)
 {
     global $wpdb, $hotel_option, $sitepress;
     $num_people = intval($data['gdlr-adult-number'][$room_number]) + intval($data['gdlr-children-number'][$room_number]);
     $hotel_option['preserve-booking-room'] = empty($hotel_option['preserve-booking-room']) ? 'paid' : $hotel_option['preserve-booking-room'];
     // collect the previously selected room
     $rooms = array();
     $room_temp = array();
     if (!empty($data['gdlr-room-id'])) {
         foreach ($data['gdlr-room-id'] as $selected_room_id) {
             if (!empty($sitepress)) {
                 $trid = $sitepress->get_element_trid($selected_room_id, 'post_room');
                 $translations = $sitepress->get_element_translations($trid, 'post_room');
                 if (empty($translations)) {
                     $room_temp[$selected_room_id] = empty($room_temp[$selected_room_id]) ? 1 : $room_temp[$selected_room_id] + 1;
                 } else {
                     foreach ($translations as $translation) {
                         $room_temp[$translation->element_id] = empty($room_temp[$translation->element_id]) ? 1 : $room_temp[$translation->element_id] + 1;
                     }
                 }
             } else {
                 $room_temp[$selected_room_id] = empty($room_temp[$selected_room_id]) ? 1 : $room_temp[$selected_room_id] + 1;
             }
         }
     }
     // select all room id where max people > selected people
     $sql = "SELECT DISTINCT wpostmeta.post_id FROM {$wpdb->postmeta} wpostmeta ";
     if (!empty($data['gdlr-hotel-branches'])) {
         $sql .= "LEFT JOIN {$wpdb->term_relationships} ON (wpostmeta.post_id = {$wpdb->term_relationships}.object_id) ";
         $sql .= "LEFT JOIN {$wpdb->term_taxonomy} ON ({$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id) ";
     }
     $sql .= "WHERE wpostmeta.meta_key = 'gdlr_max_people' AND wpostmeta.meta_value >= {$num_people} ";
     if (!empty($data['gdlr-hotel-branches'])) {
         $sql .= "AND {$wpdb->term_taxonomy}.taxonomy = 'room_category' ";
         $sql .= "AND {$wpdb->term_taxonomy}.term_id = {$data['gdlr-hotel-branches']} ";
     }
     $sql .= "ORDER BY post_id DESC";
     $room_query = $wpdb->get_results($sql, OBJECT);
     // get data with false value filled
     $all_date = gdlr_split_date($data['gdlr-check-in'], $data['gdlr-check-out']);
     // check if the date is blocked
     $blocked_date = '';
     foreach ($all_date as $key => $val) {
         if (gdlr_is_ss($key, array('date' => $hotel_option['block-date']))) {
             $blocked_date .= empty($blocked_date) ? '' : ', ';
             $blocked_date .= $key;
         }
     }
     if (!empty($blocked_date)) {
         $ret = '<div class="gdlr-hotel-missing-room">';
         $ret .= '<i class="fa fa-frown-o icon-frown"></i>';
         $ret .= __('Sorry, our hotel is closed on these following dates :', 'gdlr-hotel');
         $ret .= '<br><strong>' . $blocked_date . '</strong>';
         $ret .= '</div>';
         return $ret;
     }
     // check if each room is available
     foreach ($room_query as $room) {
         $avail_num = intval(get_post_meta($room->post_id, 'gdlr_room_amount', true));
         if (!empty($room_temp[$room->post_id])) {
             $avail_num = $avail_num - $room_temp[$room->post_id];
         }
         $sql = "SELECT COUNT(*) ";
         $sql .= "FROM {$wpdb->prefix}gdlr_hotel_booking, {$wpdb->prefix}gdlr_hotel_payment WHERE ";
         // for wpml where room_id = $room
         if (!empty($sitepress)) {
             $count = 0;
             $trid = $sitepress->get_element_trid($room->post_id, 'post_room');
             $translations = $sitepress->get_element_translations($trid, 'post_room');
             if (!empty($translations)) {
                 $sql .= "(";
                 foreach ($translations as $translation) {
                     $count++;
                     $sql .= $count > 1 ? 'OR ' : '';
                     $sql .= "{$wpdb->prefix}gdlr_hotel_booking.room_id = {$translation->element_id} ";
                 }
                 $sql .= ") AND ";
             } else {
                 $sql .= "{$wpdb->prefix}gdlr_hotel_booking.room_id = {$room->post_id} AND ";
             }
         } else {
             $sql .= "{$wpdb->prefix}gdlr_hotel_booking.room_id = {$room->post_id} AND ";
         }
         // where payment_status = selected_status
         $sql .= "{$wpdb->prefix}gdlr_hotel_payment.id = {$wpdb->prefix}gdlr_hotel_booking.payment_id AND ";
         if ($hotel_option['preserve-booking-room'] == 'paid') {
             $sql .= "{$wpdb->prefix}gdlr_hotel_payment.payment_status = 'paid' AND ";
         } else {
             $sql .= "{$wpdb->prefix}gdlr_hotel_payment.payment_status != 'pending' AND ";
         }
         // where date within
         $room_free = true;
         foreach ($all_date as $key => $val) {
             $temp_sql = $sql . "(start_date <= '{$key}' AND end_date > '{$key}')";
             if ($avail_num <= $wpdb->get_var($temp_sql)) {
                 $room_free = false;
             } else {
                 $all_date[$key] = true;
             }
         }
         if ($room_free) {
             $rooms[] = $room->post_id;
         }
     }
     // query available room to print out
     if (!empty($rooms)) {
         $paged = empty($_POST['paged']) ? 1 : $_POST['paged'];
         $args = array('post_type' => 'room', 'post__in' => $rooms, 'posts_per_page' => $hotel_option['booking-num-fetch'], 'paged' => $paged);
         if (!empty($data['gdlr-hotel-branches'])) {
             $args['tax_query'] = array(array('taxonomy' => 'room_category', 'field' => 'id', 'terms' => intval($data['gdlr-hotel-branches'])));
         }
         $query = new WP_Query($args);
         return gdlr_get_booking_room($query, array('check-in' => $data['gdlr-check-in'], 'check-out' => $data['gdlr-check-out'], 'adult' => $data['gdlr-adult-number'][$room_number], 'children' => $data['gdlr-children-number'][$room_number])) . gdlr_get_ajax_pagination($query->max_num_pages, $paged);
         // room not available
     } else {
         $no_room_text = '';
         foreach ($all_date as $key => $val) {
             $no_room_text .= empty($no_room_text) ? '' : ', ';
             $no_room_text .= !$val ? $key : '';
         }
         $ret = '<div class="gdlr-hotel-missing-room">';
         $ret .= '<i class="fa fa-frown-o icon-frown"></i>';
         if (!empty($no_room_text)) {
             $ret .= __('Sorry, there\'re no room available in these following dates :', 'gdlr-hotel');
             $ret .= '<br><strong>' . $no_room_text . '</strong>';
         } else {
             $ret .= __('Sorry, there\'re no room available within selected dates.', 'gdlr-hotel');
         }
         $ret .= '</div>';
         return $ret;
     }
 }
 function gdlr_get_booking_price($option)
 {
     $ret = array('adult-num' => 0, 'child-num' => 0, 'weekday-night' => 0, 'weekend-night' => 0, 'ss_weekday-night' => 0, 'ss_weekend-night' => 0, 'base' => 0, 'base-weekend' => 0, 'adult' => 0, 'adult-weekend' => 0, 'child' => 0, 'child-weekend' => 0, 'ss_base' => 0, 'ss_base-weekend' => 0, 'ss_adult' => 0, 'ss_adult-weekend' => 0, 'ss_child' => 0, 'ss_child-weekend' => 0, 'total' => 0);
     // get the exceeding adult and children number
     $room_base_num = intval($option['room-base-price-number-people']);
     $adult_num = intval($option['data']['adult']);
     $child_num = intval($option['data']['children']);
     if ($room_base_num >= $adult_num) {
         $room_base_num = $room_base_num - $adult_num;
         if ($room_base_num < $child_num) {
             $ret['child-num'] = $child_num - $room_base_num;
         }
     } else {
         $adult_num = $adult_num - $room_base_num;
         $ret['adult-num'] = $adult_num;
         $ret['child-num'] = $child_num;
     }
     // get the loop (date) counter
     $from = new DateTime($option['data']['check-in']);
     $to = new DateTime($option['data']['check-out']);
     $interval = new DateInterval('P1D');
     $periods = new DatePeriod($from, $interval, $to);
     // calculate the price
     $workingDays = array(1, 2, 3, 4, 5);
     $ss_prices = gdlr_get_ss_array($option);
     foreach ($periods as $period) {
         $weekday = in_array($period->format('N'), $workingDays) ? true : false;
         $special_season = false;
         foreach ($ss_prices as $ss_price) {
             if (gdlr_is_ss($period->format('Y-m-d'), $ss_price)) {
                 if ($weekday) {
                     $ret['ss_base'] += floatval($ss_price['bpwd']);
                     $ret['ss_adult'] += $ret['adult-num'] * floatval($ss_price['adwd']);
                     $ret['ss_child'] += $ret['child-num'] * floatval($ss_price['cpwd']);
                     $ret['ss_weekday-night']++;
                 } else {
                     $ret['ss_base-weekend'] += floatval($ss_price['bpwe']);
                     $ret['ss_adult-weekend'] += $ret['adult-num'] * floatval($ss_price['adwe']);
                     $ret['ss_child-weekend'] += $ret['child-num'] * floatval($ss_price['cpwe']);
                     $ret['ss_weekend-night']++;
                 }
                 $special_season = true;
                 break;
             }
         }
         if (!$special_season) {
             if ($weekday) {
                 $ret['base'] += floatval($option['room-base-price']);
                 $ret['adult'] += $ret['adult-num'] * floatval($option['adult-price-weekday']);
                 $ret['child'] += $ret['child-num'] * floatval($option['children-price-weekday']);
                 $ret['weekday-night']++;
             } else {
                 $ret['base-weekend'] += floatval($option['room-base-price-weekend']);
                 $ret['adult-weekend'] += $ret['adult-num'] * floatval($option['adult-price-weekend']);
                 $ret['child-weekend'] += $ret['child-num'] * floatval($option['children-price-weekend']);
                 $ret['weekend-night']++;
             }
         }
     }
     // calculate total price
     $ret['total'] = $ret['base'] + $ret['base-weekend'] + $ret['adult'] + $ret['adult-weekend'] + $ret['child'] + $ret['child-weekend'];
     $ret['total'] += $ret['ss_base'] + $ret['ss_base-weekend'] + $ret['ss_adult'] + $ret['ss_adult-weekend'] + $ret['ss_child'] + $ret['ss_child-weekend'];
     return $ret;
 }