// S U P P O R T
/**
* Update Summary statuses for the Day
*
* @param $availability_per_this_day
* @param $my_day_tag
* @param $resource_id_arr
*
* @return mixed
*
*
* Dates Status Concept Strategy ::
*
* Check date booking status based on 'all booking resources':
* ( and as one common situation, when we have only 1 resource )
*
* | 'approved' - when all booking resources has approved FULL day bookings or some booking resource unavailable
* | 'pending' - when at least one booking in one booking resource has pending status and there is no available booking resources
* | 'times_partially_booked' - when at least one booking in one booking resource has time bookings and there is no available booking resources
* and if all time slot approved then status approved
* otherwise if at least one time slot booking has pending status then it has pending status
*
* if all 'time_slots' booked (it's time slot passed into function as parameter)
* then such date in specific booking resource has pending or approved status, based on 'pending'|'approved' rule
*
* | 'check_in' - if activated 'change over days' and all bookings have 'check-in' status
* | 'check_out' - if activated 'change over days' and all bookings have 'check-out' status
* | if in booking resource exist both check in/out bookings, and activated 'change over days'
* then such booking resource date has approved or pending status depends on from status of these bookings
* | 'season_unavailable' - if all booking resources defined as unavailable at Booking > Resources > Availability page
* | 'resource_unavailable' - if all booking resources defined as unavailable at Booking > Availability page
* | 'other_unavailable' - if all booking resources defined as unavailable at Booking > Settings General page in "Availability" section
*
*/
function wpbc_update_summary_availability_per_this_day( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
// -------------------------------------------------------------------------------------------------------------
// Summary Tooltips
// -------------------------------------------------------------------------------------------------------------
$availability_per_this_day['summary']['tooltip_times'] = wpbc_support_capacity__tooltip__summary__times( $availability_per_this_day, $my_day_tag, $resource_id_arr );
$availability_per_this_day['summary']['tooltip_booking_details'] = wpbc_support_capacity__tooltip__summary__booked_details( $availability_per_this_day, $my_day_tag, $resource_id_arr );
$availability_per_this_day['summary']['tooltip_day_cost'] = wpbc_support_capacity__tooltip__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr );
$availability_per_this_day['summary']['tooltip_availability'] = wpbc_support_capacity__tooltip__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr );
$availability_per_this_day['summary']['hint__in_day__cost'] = wpbc_support_capacity__in_day_hint__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr );
$availability_per_this_day['summary']['hint__in_day__availability'] = wpbc_support_capacity__in_day_hint__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ); // FixIn: 10.6.4.1.
// -------------------------------------------------------------------------------------------------------------
// ['summary']['status_for_day']
// -------------------------------------------------------------------------------------------------------------
$temp_status = array();
foreach ( $availability_per_this_day['statuses']['day_status'] as $bookings_status_arr ) {
$bookings_status_arr = explode( '|', $bookings_status_arr );
foreach ( $bookings_status_arr as $bookings_status_element ) {
$temp_status[] = $bookings_status_element;
}
}
$temp_status = array_filter( $temp_status ); // All entries of array equal to FALSE (0, '', '0' ) will be removed.
$temp_status = array_unique( $temp_status ); // Erase duplicates
$availability_per_this_day['summary']['status_for_day'] = $temp_status;
/**
* Possible day statuses (searched by value of _day_status):
*
* available
* time_slots_booking
* full_day_booking
*
* limit_available_from_today
* from_today_unavailable
* weekday_unavailable
* resource_availability
* season_filter
*
* change_over
* check_out
* check_in
* 'mixed' from check_in/check_out/change_over
*/
// Priority: available > time_slots_booking > full_day_booking
// > season_filter > resource_availability
// > weekday_unavailable > from_today_unavailable > limit_available_from_today
// if at least one booking "available" then day has this status
if ( in_array( 'available', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'available';
} else if ( in_array( 'time_slots_booking', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'time_slots_booking';
} else if ( ( ! in_array( 'check_out', $availability_per_this_day['summary']['status_for_day'] ) )
&& ( in_array( 'check_in', $availability_per_this_day['summary']['status_for_day'] ) ) ) { $availability_per_this_day['summary']['status_for_day'] = 'check_in';
} else if ( ( ! in_array( 'check_in', $availability_per_this_day['summary']['status_for_day'] ) )
&& ( in_array( 'check_out', $availability_per_this_day['summary']['status_for_day'] ) ) ) { $availability_per_this_day['summary']['status_for_day'] = 'check_out';
} else if ( in_array( 'full_day_booking', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'full_day_booking';
} else if ( in_array( 'season_filter', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'season_filter';
} else if ( in_array( 'resource_availability', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'resource_availability';
} else if ( in_array( 'weekday_unavailable', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'weekday_unavailable';
} else if ( in_array( 'from_today_unavailable', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'from_today_unavailable';
} else if ( in_array( 'limit_available_from_today', $availability_per_this_day['summary']['status_for_day'])){ $availability_per_this_day['summary']['status_for_day'] = 'limit_available_from_today';
} else {
$availability_per_this_day['summary']['status_for_day'] = implode( ' ', $availability_per_this_day['summary']['status_for_day'] );
}
// -------------------------------------------------------------------------------------------------------------
// ['summary']['status_for_bookings']
// -------------------------------------------------------------------------------------------------------------
$temp_status = array();
foreach ( $availability_per_this_day['statuses']['bookings_status'] as $bookings_status_arr ) {
$bookings_status_arr = explode( '|', $bookings_status_arr );
foreach ( $bookings_status_arr as $bookings_status_element ) {
$temp_status[] = $bookings_status_element;
}
}
$temp_status = array_filter( $temp_status ); // All entries of array equal to FALSE (0, '', '0' ) will be removed.
$temp_status = array_values( array_unique( $temp_status ) );
// Structured booking statuses contract. Keep numeric keys sequential so JSON encodes this as a JS array.
$availability_per_this_day['summary']['status_for_bookings_arr'] = $temp_status;
// Priority: pending > approved > ''
// if at least one booking pending then day is pending
if ( in_array( 'pending', $temp_status ) ) { $availability_per_this_day['summary']['status_for_bookings'] = 'pending';
} else if ( in_array( 'pending_pending', $temp_status ) ) { $availability_per_this_day['summary']['status_for_bookings'] = 'pending_pending';
// Usual situations for change over days: pending_pending | pending_approved | approved_pending | approved_approved
} else {
$availability_per_this_day['summary']['status_for_bookings'] = implode( ' ', $temp_status );
}
// -------------------------------------------------------------------------------------------------------------
return $availability_per_this_day;
}
// T O O L T I P s
/**
* Set tooltip summary -- Time-Slots
*
* @param $availability_per_this_day
* @param $my_day_tag
* @param $resource_id_arr
*
* @return string - tooltip content or ''
*/
function wpbc_support_capacity__tooltip__summary__times( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if ( 'On' != get_bk_option( 'booking_disable_timeslots_in_tooltip' ) ) { //FixIn: 9.5.0.2.2
$tooltip_title_word = get_bk_option( 'booking_highlight_timeslot_word' );
$tooltip_title_word = wpbc_lang( $tooltip_title_word );
$tooltip_title_word = ( empty( $tooltip_title_word ) )
? ''
: '' . $tooltip_title_word . '
' . ' ';
$status_summary_tooltip_times = array();
foreach ( $resource_id_arr as $resource_id ) {
if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['times'] ) ) {
$status_summary_tooltip_times[] = $availability_per_this_day[ $resource_id ]->tooltips['times'];
}
}
if ( ! empty( $status_summary_tooltip_times ) ) {
$tooltip = ''
. $tooltip_title_word
. implode( '', $status_summary_tooltip_times )
. '
';
}
}
return $tooltip;
}
function wpbc_support_capacity__tooltip__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if ( ( 'On' == get_bk_option( 'booking_is_show_availability_in_tooltips' ) ) && ( $availability_per_this_day['max_capacity'] > 1 ) ) {
$tooltip_title_word = get_bk_option( 'booking_highlight_availability_word' );
$tooltip_title_word = wpbc_lang( $tooltip_title_word );
$tooltip_title_word = ( empty( $tooltip_title_word ) )
? ''
: '' . $tooltip_title_word . '
' . ' ';
$tooltip_content_header = '';
if ( ! empty( $availability_per_this_day['day_availability'] ) ) {
$tooltip = '';
}
}
return $tooltip;
}
function wpbc_support_capacity__tooltip__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if (
( ! empty( $availability_per_this_day['day_availability'] ) )
&& ( 'On' == get_bk_option( 'booking_is_show_cost_in_tooltips' ) )
){
$tooltip_title_word = get_bk_option( 'booking_highlight_cost_word' );
$tooltip_title_word = wpbc_lang( $tooltip_title_word );
$tooltip_title_word = ( empty( $tooltip_title_word ) )
? ''
: '' . $tooltip_title_word . '
' . ' ';
if ( isset( $resource_id_arr[0] ) ) {
$id_of_first_resource = $resource_id_arr[0];
$tooltip_content_header = '';
if ( ! empty( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate ) ) {
$cur_sym = get_bk_option( 'booking_cost_in_date_cell_currency' ); // in Booking > Settings General page in "Calendar" section
//$cur_sym = wpbc_get_currency_symbol(); // in Booking > Settings > Payment page
$cost_text = wpbc_formate_cost_hint__no_html( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate, $cur_sym );
$cost_text = html_entity_decode( $cost_text );
$tooltip = '';
}
}
}
return $tooltip;
}
function wpbc_support_capacity__in_day_hint__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if (
( ! empty( $availability_per_this_day['day_availability'] ) )
&& ( 'On' == get_bk_option( 'booking_is_show_cost_in_date_cell' ) )
){
$id_of_first_resource = $resource_id_arr[0];
if ( ! empty( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate ) ) {
$cur_sym = get_bk_option( 'booking_cost_in_date_cell_currency' ); // in Booking > Settings General page in "Calendar" section
//$cur_sym = wpbc_get_currency_symbol(); // in Booking > Settings > Payment page
$cost_text = $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate;
$cost_text = number_format( floatval( $cost_text ), wpbc_get_cost_decimals(), '.', '' );
$cost_text = wp_strip_all_tags( wpbc_cost_show( $cost_text, array( 'currency' => 'CURRENCY_SYMBOL' ) ) );
$cost_text = str_replace( array( 'CURRENCY_SYMBOL', '&' ), array( $cur_sym, '&' ), $cost_text );
$cost_text = html_entity_decode($cost_text);
$tooltip = '' . $cost_text . '';;
}
}
return $tooltip;
}
// FixIn: 10.6.4.1.
/**
* Get availability for in Day cells
*
* @param $availability_per_this_day
* @param $my_day_tag
* @param $resource_id_arr
*
* @return string
*/
function wpbc_support_capacity__in_day_hint__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if (
( 'On' == get_bk_option( 'booking_is_show_availability_in_date_cell' ) ) &&
( $availability_per_this_day['max_capacity'] > 1 )
) {
$tooltip_title_word = get_bk_option( 'booking_highlight_availability_word_in_date_cell' );
$tooltip_title_word = wpbc_lang( $tooltip_title_word );
$tooltip_title_word = ( empty( $tooltip_title_word ) )
? ''
: '' . $tooltip_title_word . '';
if ( ! empty( $availability_per_this_day['day_availability'] ) ) {
$tooltip = ''
. ''
. intval( $availability_per_this_day['day_availability'] )
. ' '
. ''
. $tooltip_title_word
. '';
$tooltip = html_entity_decode($tooltip);
}
}
return $tooltip;
}
/**
* Set tooltip summary -- Booking Details
*
* @param $availability_per_this_day
* @param $my_day_tag
* @param $resource_id_arr
*
* @return string - tooltip content or ''
*/
function wpbc_support_capacity__tooltip__summary__booked_details( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
$tooltip = '';
if ( 'On' == get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) ) { //FixIn: 9.5.0.2.2
$tooltip_title_word = '' . esc_html__('Booking details','booking') . '
';
$status_summary_tooltip_times = array();
foreach ( $resource_id_arr as $resource_id ) {
if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['details'] ) ) {
if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['resource_title'] ) ){
$tooltip_content_header = '';
} else{
$tooltip_content_header = '';
}
$booking_details_text = ''
. $tooltip_content_header
. implode( ' ', $availability_per_this_day[ $resource_id ]->tooltips['details'] )
. '
';
$status_summary_tooltip_times[] = $booking_details_text;
}
}
if ( ! empty( $status_summary_tooltip_times ) ) {
$tooltip = ''
. $tooltip_title_word
. implode( '', $status_summary_tooltip_times )
. '
';
}
}
return $tooltip;
}
/**
* Set Tooltip -- Booking Details
*
* @param $availability_per_day
* @param $my_day_tag
* @param $resource_id
* @param $this_date_bookings
* @param $booked_times__key
* @param $resources_obj
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
*/
function wpbc_support_capacity__tooltip__set_for_details( $availability_per_day, $my_day_tag, $resource_id, $this_date_bookings, $booked_times__key, $resources_obj, $booked_time ) {
// Get booking details for tooltip, if needed
if ( 'On' == get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) ) {
$booking_id = $this_date_bookings[ $booked_times__key ]->booking_id;
$this_booking_resource_id = $this_date_bookings[ $booked_times__key ]->type;
$booking_details_text = wpbc_support_capacity__get_booking_details(
$this_date_bookings[ $booked_times__key ],
$resources_obj->get__booking_resource_obj( $this_booking_resource_id )
);
$tooltip_text = '';
$tooltip_text .= '' . $booked_time . '
'; // Booked time
$tooltip_text .= '' . $booking_details_text . '
'; // Booking details
$availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['details'][ $booking_id ] = $tooltip_text;
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set Tooltip Times -- Time-Slots
*
* @param $availability_per_day
* @param $my_day_tag
* @param $resource_id
* @param $resource_id_arr
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
*/
function wpbc_support_capacity__tooltip_times__set_for_times( $availability_per_day, $my_day_tag, $resource_id, $resource_id_arr ){
// Times Tooltip - time slot list --------------------------------------------------------------------
$tooltip_content_header = '';
if ( count( $resource_id_arr ) > 1 ) {
$class_name = 'tooltip_items_count_' . count( $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_readable'] );
$tooltip_content_header = '';
}
$tooltip_content_arr = array_map( function ( $item ) {
return '' . $item . '
';
}
, $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_readable']
);
$availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['times'] = ''
. $tooltip_content_header
. implode( '', $tooltip_content_arr )
. '
';
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set Tooltip Times -- Full Day
*
* @param $availability_per_day
* @param $my_day_tag
* @param $resource_id
* @param $resource_id_arr
* @param $status_title
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
*/
function wpbc_support_capacity__tooltip_times__set_full_day( $availability_per_day, $my_day_tag, $resource_id, $resource_id_arr, $status_title ){
// Times Tooltip - FULL DAY --------------------------------------------------------------------
$tooltip_content_header = '';
if ( count( $resource_id_arr ) > 1 ) {
$class_name = 'tooltip_items_count_1';
$tooltip_content_header = '';
}
$tooltip_content_text = '' . $status_title . '
';
$availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['times'] = ''
. $tooltip_content_header
. $tooltip_content_text
. '
';
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Get parsed booking data, if required
*
* @param object $this_date_bookings
* @param object $resource_obj
*
* @return string
*/
function wpbc_support_capacity__get_booking_details( $this_date_bookings, $resource_obj ) {
if ( ( ! class_exists( 'wpdev_bk_biz_m' ) )
|| ( 'On' !== get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) )
){
return '';
}
$booking_details_for_hint = '';
if ( isset( $this_date_bookings->form ) ) {
// Get shortcodes
$booking_shortcodes_in_tooltips = get_bk_option( 'booking_booked_data_in_tooltips' ); // '[name] [secondname]'
$resource_id = $this_date_bookings->type;
// Get parsed booking data field values -- e.g.: [ "rangetime":"12:00 - 14:00", "secondname":"Smith",... ]
$booking_data_arr = wpbc_get_parsed_booking_data_arr( $this_date_bookings->form, $resource_id, array( 'get' => 'value' ) );
$booking_data_arr['booking_id'] = $this_date_bookings->booking_id;
$booking_data_arr['resource_id'] = $resource_id;
$booking_data_arr['resource_title'] = ( ! empty( $resource_obj ) ) ? wpbc_lang( $resource_obj->title ) : '';
// Replace existing shortcodes
foreach ( $booking_data_arr as $replace_shortcode => $replace_value ) {
if ( is_null( $replace_value ) ) { $replace_value = ''; };
$replace_value = wpbc_replace__true_false__to__yes_no( $replace_value ); // FixIn: 9.8.9.1.
$booking_shortcodes_in_tooltips = str_replace( array(
'[' . $replace_shortcode . ']'
, '{' . $replace_shortcode . '}'
)
, $replace_value
, $booking_shortcodes_in_tooltips
);
}
$booking_details_for_hint = $booking_shortcodes_in_tooltips;
// Remove all shortcodes, which is not replaced early.
$booking_details_for_hint = preg_replace( '/[\[\{][a-zA-Z0-9.,_-]{0,}[\]\}]/', '', $booking_details_for_hint );
}
return $booking_details_for_hint;
}
/**
* Unset some fields from booking data for do not show personal data at front-end side
*
* @param object $this_date_bookings
*
* @return object
*/
function wpbc_support_capacity__unset_some_fields( $this_date_bookings ) {
if ( isset( $this_date_bookings->form ) ) {
unset( $this_date_bookings->form ); // Hide booking details
}
if ( isset( $this_date_bookings->booking_date ) ) {
unset( $this_date_bookings->booking_date ); // Confusing property of last end booking date, because we have 'sql summary booking dates arrays' for all dates and times
}
return $this_date_bookings;
}
// D A Y S T A T U S U N A V A I L A B L E
/**
* Set > _day_status = 'limit_available_from_today' depends on Booking > Settings General page ---> "Limit available days from today"
*
* @param $availability_per_day [ ... ]
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
*/
function wpbc_support_capacity__day_status__limit_available_from_today( $availability_per_day, $my_day_tag, $resource_id ){
// ----------------------------------------------------------------------------------------------------- // limit_available_from_today
// 3. Limit available days from today
if ( function_exists( 'wpbc_is_day_available__relative__limit_available_from_today' ) ) {
if ( ! wpbc_is_day_available__relative__limit_available_from_today( $my_day_tag ) ) {
// this date unavailable
$availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
$availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'limit_available_from_today';
if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
}
}
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set > _day_status = 'from_today_unavailable' depends on Booking > Settings General page ---> "Unavailable days from today"
*
* @param $availability_per_day [ ... ]
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
*/
function wpbc_support_capacity__day_status__from_today_unavailable( $availability_per_day, $my_day_tag, $resource_id ){
// FixIn: 10.8.1.4.
// ----------------------------------------------------------------------------------------------------- // from_today_unavailable
// 2. Unavailable days from today
$unavailable_days_num_from_today = get_bk_option( 'booking_unavailable_days_num_from_today' );
// FixIn: 10.8.1.4.
if ( ! empty( $unavailable_days_num_from_today ) ) {
if ( 'm' === substr( $unavailable_days_num_from_today, - 1 ) ) {
$start_date_unix = strtotime( '+' . ( intval( $unavailable_days_num_from_today ) - 1 ) . ' minutes' ); // + 0 days
} else {
$start_date_unix = strtotime( '+' . intval( $unavailable_days_num_from_today ) . ' days' ); // + 0 days
}
} else {
$start_date_unix = strtotime( 'now' );
}
$date_start__gmt = gmdate( 'Y-m-d H:i:s', $start_date_unix ); // '2025-01-25 12:50:10'
$date_start__midnight__wp_timezone = wpbc_datetime_localized__use_wp_timezone( $date_start__gmt, 'Y-m-d 00:00:00' ); // Local Midnight.
// 'Today Midnight' - 'Calendar Day Cell' .
$days_number = intval( ( strtotime( $date_start__midnight__wp_timezone ) - strtotime( $my_day_tag ) ) / 86400 );
if ( $days_number > 0 ) {
// This date Unavailable.
$availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
$availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'from_today_unavailable';
if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
}
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set > _day_status = 'weekday_unavailable' depends on Booking > Settings General page ---> "Week Days unavailable"
*
* @param $availability_per_day [ ... ]
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
*/
function wpbc_support_capacity__day_status__weekday_unavailable( $availability_per_day, $my_day_tag, $resource_id ){
// 1. Week Days unavailable -------------------------------------------------------------------------------- // weekday_unavailable
$unavailable_weekdays = array();
foreach ( range( 0, 6 ) as $week_day_num ) {
$unavailable_weekdays[ $week_day_num ] = ( 'On' == get_bk_option( 'booking_unavailable_day' . $week_day_num ) ) ? true : false;
}
$this_day_week_num = gmdate( 'w', strtotime( $my_day_tag ) ); // 0 - 6
if ( $unavailable_weekdays[ $this_day_week_num ] ) {
// this date unavailable
$availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
$availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'weekday_unavailable';
if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
}
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set > _day_status = 'resource_availability' depends on Booking > Availability page
*
* @param $availability_per_day [ ... ]
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
* @param array $unavailable_dates__per_resources__arr - [ 2: ['2023-08-01', '2023-08-02'], 10: ['2023-08-05', '2023-08-06'] ]
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
*/
function wpbc_support_capacity__day_status__resource_availability( $availability_per_day, $my_day_tag, $resource_id, $unavailable_dates__per_resources__arr ){
// Booking > Availability page ----------------------------------------------------------------------------- // resource_availability
/**
* $unavailable_dates__per_resources__arr = Array ( [2] => Array( [0] => 2023-08-01
[1] => 2023-08-02
)
[10] => Array( [0] => 2023-08-05
[1] => 2023-08-06
)
)
*/
if (
( isset( $unavailable_dates__per_resources__arr[ $resource_id ] ) )
&& ( in_array( $my_day_tag, $unavailable_dates__per_resources__arr[ $resource_id ] ) )
) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
$availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'resource_availability';
if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
}
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
/**
* Set > _day_status = 'season_filter' depends on Booking > Resources > Availability page
*
* @param $availability_per_day [ ... ]
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
* @param array $season_filters_availability - [...]
*
* @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
*/
function wpbc_support_capacity__day_status__season_filter( $availability_per_day, $my_day_tag, $resource_id, $season_filters_availability ){
if ( function_exists( 'wpbc_is_this_day_available_in_season_filters' ) ) { // BM and higher
$is_date_available = wpbc_is_this_day_available_in_season_filters( $my_day_tag, $resource_id, $season_filters_availability[ $resource_id ] ); // Get availability
if ( ! $is_date_available ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
$availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'season_filter';
if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
$availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
}
}
}
return $availability_per_day[ $my_day_tag ][ $resource_id ];
}
// D A Y C O S T
/**
* Get day cost depend on Rates
* @param $my_day_tag - '2023-08-08'
* @param $resource_id - 2
* @param $base_cost - 25
*
* @return int|string
*/
function wpbc_support_capacity__get_day_cost( $my_day_tag, $resource_id, $base_cost ) {
$fin_day_cost = 0;
if ( function_exists( 'wpbc_get_1_day_cost_apply_rates' ) ) {
list( $year, $month, $day ) = explode( '-', $my_day_tag );
$day = intval( $day );
$month = intval( $month );
$year = intval( $year );
$fin_day_cost = wpbc_get_1_day_cost_apply_rates( $resource_id, $base_cost, $day, $month, $year );
}
return $fin_day_cost;
}
//
//TODO: M I G R A T E to 9.8
// .
// instead of this:
// use this:
// Booking Calendar - JavaScript Settings
// Example or redefine some settings:
//
// [booking type=1]
// .
// .
// 1. Define parameters for calendar(s):
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'single'} );
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'multiple'} );
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'fixed'} );
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'fixed__days_num' : 7 } );
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'fixed__week_days__start': [-1] } ); // { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
// _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'dynamic'} );
// _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_min' , 7 );
// _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_max' , 14 );
// _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_specific' , [] ); // Example [5,7]
// _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__week_days__start' , [-1] ); // { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
// JavaScript functions changes:
// wpbc_unselect_all_days( resource_id ) -> wpbc_calendar__unselect_all_dates( resource_id )
// showErrorMessage( element , errorMessage , isScrollStop ); -> wpbc_front_end__show_message__warning( jq_node, message );
// showMessageUnderElement( element , errorMessage , message_type); -> wpbc_front_end__show_message__warning_under_element( jq_node, message );
// makeScroll( object_name ); -> wpbc_do_scroll( jq_node );
// .
// JavaScript hooks changes:
// jQuery( ".booking_form_div" ).trigger( "date_selected", [ resource_id, date ] );
// become
// jQuery( ".booking_form_div" ).trigger( "date_selected", [ resource_id, mouse_clicked_dates, all_selected_dates_arr ] );
// where:
// mouse_clicked_dates Can be: "05.10.2023 - 07.10.2023" | "10.10.2023 - 10.10.2023" |
// all_selected_dates_arr Can be: [ "2023-10-05", "2023-10-06", "2023-10-07", … ]
// PHP actions:
// from: make_bk_action('wpdev_booking_post_inserted', $booking_id, $bktype, $str_dates__dd_mm_yyyy, array($start_time, $end_time ) , $formdata );
// removed!
// . // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
// from: apply_filters('wpdev_booking_form_content', $form , $resource_id);
// to: apply_filters( 'wpbc_booking_form_html__update__append_change_over_times', $form, $resource_id );
// .
// Removed PHP actions:
// . 'show_payment_forms__for_ajax'
// * make_bk_action('wpbc_ add_new_booking' , array(
// * 'bktype' => 1
// * , 'dates' => '27.08.2014, 28.08.2014, 29.08.2014'
// * , 'form' => 'selectbox-one^rangetime1^10:00 - 12:00~text^name1^Jo~text^secondname1^Smith~email^email1^smith@gmail.com~text^phone1^678676678~text^address1^Linkoln Street~text^city1^London~text^postcode1^78788~selectbox-one^country1^GB~selectbox-one^visitors1^1~selectbox-one^children1^1~textarea^details1^Rooms with sea view~checkbox^term_and_condition1[]^I Accept term and conditions'
// * , 'is_send_emeils' => 0
// * // , 'booking_form_type' => ''
// * // , 'wpdev_active_locale' => 'en_US'
// * ) );
// .
// add_bk_filter('wpbc_add_new_booking_filter' , 'wpbc_add_new_booking' );
// TODO: recheck hooks in wpbc-dev-api.php