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; }