HEX
Server: Apache
System: Linux webd003.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: slyfwmm (169339)
PHP: 8.1.34
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/s/l/y/slyfwmm/pianob/wp-content/plugins/hbook/admin-pages/pages/rates/rates.php
<?php
class HbAdminPageRates extends HbAdminPage {

	private $seasons;
	private $accom;
	private $rules;
	private $rate_types;
	private $discounts;
	private $discount_rules;

	public function __construct( $page_id, $hbdb, $utils, $options_utils ) {
		$this->seasons = $hbdb->get_seasons_id_name();
		$this->accom = $hbdb->get_all_accom();
		$this->rules = $hbdb->get_all_rate_booking_rules();
		$this->discount_rules = $hbdb->get_all_discount_rules();
		$this->discounts = $hbdb->get_all_discounts();
		$this->coupon_rules = $hbdb->get_all_coupon_rules();
		$this->coupons = $hbdb->get_all_coupons();
		foreach ( $this->coupons as $i => $coupon ) {
			if ( $coupon['max_use_count'] == 0 ) {
				$this->coupons[ $i ]['max_use_count'] = '';
			}
		}
		$this->rate_types = array(
			array(
				'id' => 'accom',
				'name' => esc_html__( 'accommodation', 'hbook-admin' ),
				'title' => esc_html__( 'Accommodation rates', 'hbook-admin' ),
			),
			array(
				'id' => 'extra_adults',
				'name' => esc_html__( 'extra adults', 'hbook-admin' ),
				'title' => esc_html__( 'Price per adult above normal occupancy', 'hbook-admin' ),
			),
			array(
				'id' => 'extra_children',
				'name' => esc_html__( 'extra children', 'hbook-admin' ),
				'title' => esc_html__( 'Price per child above normal occupancy', 'hbook-admin' ),
			)
		);

		$this->data = array(
			'hb_text' => array(
				'invalid_amount' => esc_html__( 'Invalid amount.', 'hbook-admin' ),
				'no_seasons_selected' => esc_html__( 'No seasons selected', 'hbook-admin' ),
				'no_rules_selected' => '',
				'no_discounts_selected' => esc_html__( 'No discounts selected', 'hbook-admin' ),
				'per_night' => esc_html__( 'per night', 'hbook-admin' ),
				'for_nights' => esc_html__( 'for a %s-night stay', 'hbook-admin' ),
				'unset' => esc_html__( 'Unset', 'hbook-admin' ),
				'nights_more' => esc_html__( 'nights and more', 'hbook-admin' ),
				'no_max_use_count' => esc_html__( 'No maximum', 'hbook-admin' ),
				'no_date_limit' => esc_html__( 'No date limit', 'hbook-admin' ),
				'multiple_use_per_customer_yes' => esc_html__( 'Yes', 'hbook-admin' ),
				'multiple_use_per_customer_no' => esc_html__( 'No', 'hbook-admin' ),
				'discount_apply_to_accom' => esc_html__( 'Accommodation price', 'hbook-admin' ),
				'discount_apply_to_global' => esc_html__( 'Global price', 'hbook-admin' ),
			),
			'rates' => $hbdb->get_all_rates(),
			'accom_list' => $this->accom,
			'seasons_list' => $this->seasons,
			'rules_list' => $this->rules,
			'discount_rules_list' => $this->discount_rules,
			'discounts' => $this->discounts,
			'coupon_rules_list' => $this->coupon_rules,
			'coupons' => $this->coupons,
			'hb_price_precision' => get_option( 'hb_price_precision' ),
		);
		parent::__construct( $page_id, $hbdb, $utils, $options_utils );
	}

	public function display() {
	?>

	<div class="wrap">

		<h2><?php esc_html_e( 'Rates', 'hbook-admin' ); ?></h2>
		<?php $this->display_right_menu(); ?>

		<hr/>

		<?php
		if ( $this->utils->nb_accom() == 0 ) {
			$accom_all_status = false;
			$accom_all_languages = true;
			$all_accom_in_all_languages = $this->hbdb->get_all_accom_ids( $accom_all_status, $accom_all_languages );
			if ( count( $all_accom_in_all_languages ) > 0 ) {
				if ( function_exists( 'pll_get_post' ) ) {
					echo( '<p>' );
					printf(
						esc_html__( 'It seems Polylang is not set properly. Please read %s', 'hbook-admin' ),
						'<a target="_blank" href="https://maestrel.com/knowledgebase/?article=39">' .
						esc_html__( 'HBook documentation about setting up Polylang and HBook', 'hbook-admin' ) .
						'</a>'
					);
					echo( '</p>' );
				} else if ( function_exists( 'icl_object_id' ) ) {
					echo( '<p>' );
					printf(
						esc_html__( 'It seems WPML is not set properly. Please read %s', 'hbook-admin' ),
						'<a target="_blank" href="https://maestrel.com/knowledgebase/?article=37">' .
						esc_html__( 'HBook documentation about setting up WPML and HBook', 'hbook-admin' ) .
						'</a>'
					);
					echo( '</p>' );
				} else {
					echo( '<p>' . esc_html__( 'At least one accommodation which uses the default website language must be created in order to set rates.', 'hbook-admin' ) . '</p>' );
				}
			} else {
				if ( count( $this->seasons ) == 0 ) {
					echo( '<p>' . esc_html__( 'At least one accommodation and one season must be created in order to set rates.', 'hbook-admin' ) . '</p>' );
				} else {
					echo( '<p>' . esc_html__( 'At least one accommodation must be created in order to set rates.', 'hbook-admin' ) . '</p>' );
				}
			}
		} else if ( count( $this->seasons ) == 0 ) {
			echo( '<p>' . esc_html__( 'At least one one season must be created in order to set rates.', 'hbook-admin' ) . '</p>' );
		} else {
			foreach ( $this->rate_types as $rate_type ) {
		?>

			<h3>
				<?php echo( esc_html( $rate_type['title'] ) ); ?>
				<?php $new_rate_data_bind = "click: function() { create_rate( '" . $rate_type['id'] . "' ) }"; ?>
				<a data-bind="<?php echo( esc_attr( $new_rate_data_bind ) ); ?>" href="#" class="add-new-h2"><?php esc_html_e( 'Add rate', 'hbook-admin' ); ?></a>
				<?php $new_rate_spinner = 'hb-add-new spinner hb-add-' . $rate_type['id'] . '-rate'; ?>
				<span class="<?php echo( esc_attr( $new_rate_spinner ) ); ?>"></span>
			</h3>

			<!-- ko if: nb_rates( '<?php echo( esc_html( $rate_type['id'] ) ); ?>' ) == 0 -->
			<p><?php printf( esc_html__( 'No %s rates have been defined yet.', 'hbook-admin' ), $rate_type['name'] ); ?></p>
			<!-- /ko -->

			<!-- ko if: nb_rates( '<?php echo( esc_html( $rate_type['id'] ) ); ?>' ) > 0 -->
			<table class="wp-list-table widefat">

				<?php $this->table_rates_head(); ?>
				<?php $rate_table_data_bind = "template: { name: function( rate ) { return rate_template_to_use( rate, '" . $rate_type['id'] . "' ); }, foreach: rates, beforeRemove: hide_setting }"; ?>

				<tbody data-bind="<?php echo( esc_attr( $rate_table_data_bind ) ); ?>">
				</tbody>

			</table>
			<!-- /ko -->

			<!-- ko if: nb_rates( '<?php echo( esc_html( $rate_type['id'] ) ); ?>' ) > 10 -->
			<br/>
			<a data-bind="<?php echo( esc_attr( $new_rate_data_bind ) ); ?>" href="#" class="add-new-h2 add-new-below"><?php esc_html_e( 'Add rate', 'hbook-admin' ); ?></a>
			<?php $new_rate_spinner = 'hb-add-new spinner hb-add-' . $rate_type['id'] . '-rate'; ?>
			<span class="<?php echo( esc_attr( $new_rate_spinner ) ); ?>"></span>
			<br/>
			<!-- /ko -->

			<br/><hr/>

		<?php } ?>

		<h3>
			<?php esc_html_e( 'Discounts', 'hbook-admin' ); ?>
			<?php if ( $this->discount_rules ) { ?>
			<a data-bind="click: create_discount" href="#" class="add-new-h2"><?php esc_html_e( 'Add discount rate', 'hbook-admin' ); ?></a>
			<span class="hb-add-new spinner hb-add-discount"></span>
			<?php } ?>
		</h3>

		<?php if ( ! $this->discount_rules ) { ?>

		<p>
			<?php
			printf(
				esc_html__( 'No discount rules have been defined yet. You can define a discount rule on the %s.', 'hbook-admin' ),
				'<a href="' . admin_url( 'admin.php?page=hb_rules' ) . '">' .
				esc_html__( 'Booking rules page', 'hbook-admin' ) .
				'</a>'
			);
			?>
		</p>

		<?php } else { ?>

		<!-- ko if: discounts().length == 0 -->
		<p><?php esc_html_e( 'No discount rates have been defined yet.', 'hbook-admin' ); ?></p>
		<!-- /ko -->

		<!-- ko if: discounts().length > 0 -->
		<table class="wp-list-table widefat">

			<thead>
				<tr>
					<th width="16.66%"><?php esc_html_e( 'Discounts', 'hbook-admin' ); ?></th>
					<th width="16.66%"><?php esc_html_e( 'Accommodation', 'hbook-admin' ); ?></th>
					<th width="16.66%"><?php esc_html_e( 'Seasons', 'hbook-admin' ); ?></th>
					<th width="16.66%"><?php esc_html_e( 'Applies on', 'hbook-admin' ); ?></th>
					<th width="16.66%"><?php esc_html_e( 'Amount', 'hbook-admin' ); ?></th>
					<th width="16.66%" class="hb-table-action"><?php esc_html_e( 'Actions', 'hbook-admin' ); ?></th>
				</tr>
			</thead>

			<tbody data-bind="template: { name: discount_template_to_use, foreach: discounts, beforeRemove: hide_setting }">
			</tbody>

		</table>
		<!-- /ko -->

		<!-- ko if: discounts().length > 10 -->
		<br/>
		<a data-bind="click: create_discount" href="#" class="add-new-h2 add-new-below"><?php esc_html_e( 'Add discount rate', 'hbook-admin' ); ?></a>
		<span class="hb-add-new spinner hb-add-discount"></span>
		<br/>
		<!-- /ko -->

		<?php } ?>

		<br/>
		<hr/>

		<h3>
			<?php esc_html_e( 'Coupons', 'hbook-admin' ); ?>
			<a data-bind="click: create_coupon" href="#" class="add-new-h2"><?php esc_html_e( 'Add coupon', 'hbook-admin' ); ?></a>
			<span class="hb-add-new spinner hb-add-coupon"></span>
		</h3>

		<!-- ko if: coupons().length == 0 -->
		<p><?php esc_html_e( 'No coupons have been defined yet.', 'hbook-admin' ); ?></p>
		<!-- /ko -->

		<!-- ko if: coupons().length > 0 -->
		<table class="wp-list-table widefat">

			<thead>
				<tr>
					<th width="11.11%"><?php esc_html_e( 'Code', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Accommodation', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Seasons', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Rule', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Use count', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Max use', 'hbook-admin' ); ?></th>
					<th width="11.11%"><?php esc_html_e( 'Date limit', 'hbook-admin' ); ?></th>
					<!-- <th width="10%"><?php esc_html_e( 'Multiple use per customer', 'hbook-admin' ); ?></th> -->
					<th width="11.11%"><?php esc_html_e( 'Amount', 'hbook-admin' ); ?></th>
					<th width="11.11%" class="hb-table-action"><?php esc_html_e( 'Actions', 'hbook-admin' ); ?></th>
				</tr>
			</thead>

			<tbody data-bind="template: { name: coupon_template_to_use, foreach: coupons, afterRender: coupon_render, beforeRemove: hide_setting }">
			</tbody>

		</table>
		<!-- /ko -->

		<!-- ko if: coupons().length > 10 -->
		<br/>
		<a data-bind="click: create_coupon" href="#" class="add-new-h2 add-new-below"><?php esc_html_e( 'Add coupon', 'hbook-admin' ); ?></a>
		<span class="hb-add-new spinner hb-add-coupon"></span>
		<!-- /ko -->

		<script id="text_tmpl" type="text/html">
			<tr>
				<td data-bind="text: accom_list"></td>
				<td data-bind="text: seasons_list"></td>
				<?php if ( count( $this->rules ) > 0 ) { ?>
				<td data-bind="text: rules_list"></td>
				<?php } ?>
				<td data-bind="html: amount_text"></td>
				<td class="hb-table-action"><?php $this->display_admin_action(); ?></td>
			</tr>
		</script>

		<script id="discount_text_tmpl" type="text/html">
			<tr>
				<td data-bind="text: rules_list"></td>
				<td data-bind="text: accom_list"></td>
				<td data-bind="text: seasons_list"></td>
				<td data-bind="html: apply_to_type_text"></td>
				<td data-bind="html: amount_text"></td>
				<td class="hb-table-action"><?php $this->display_admin_action(); ?></td>
			</tr>
		</script>

		<script id="coupon_text_tmpl" type="text/html">
			<tr>
				<td data-bind="text: code"></td>
				<td data-bind="text: accom_list"></td>
				<td data-bind="text: seasons_list"></td>
				<td data-bind="text: rule_name"></td>
				<td data-bind="text: use_count"></td>
				<td data-bind="text: max_use_count_text"></td>
				<td data-bind="text: date_limit_text"></td>
				<!-- <td data-bind="text: multiple_use_per_customer_text"></td> -->
				<td data-bind="html: amount_text"></td>
				<td class="hb-table-action"><?php $this->display_admin_action(); ?></td>
			</tr>
		</script>

		<script id="edit_tmpl" type="text/html">
			<tr>
				<td><?php $this->display_checkbox_list( $this->accom, 'accom' ); ?></td>
				<td><?php $this->display_seasons_checkbox_list(); ?></td>
				<?php if ( count( $this->rules ) > 0 ) { ?>
				<td>
				<?php
				$display_check_all_box = false;
				$display_select_all_link = true;
				$this->display_rules_checkbox_list();
				?>
				</td>
				<?php } ?>
				<td>
					<?php if ( get_option( 'hb_currency_position' ) == 'before' ) { ?>
					<span><?php echo( esc_html( $this->utils->get_currency_symbol() ) ); ?></span>
					<?php } ?>
					<input data-bind="value: amount" type="text" class="hb-rate-amount" />
					<?php if ( get_option( 'hb_currency_position' ) == 'after' ) { ?>
					<span><?php echo( esc_html( $this->utils->get_currency_symbol() ) ); ?></span>
					<?php } ?>
					<br/>
					<?php esc_html_e( 'for', 'hbook-admin' ); ?><br/>
					<input data-bind="value: nights" type="text" class="hb-rate-nights" />
					<span><?php esc_html_e( 'night(s)', 'hbook-admin' ); ?></span>
				</td>
				<td class="hb-table-action"><?php $this->display_admin_on_edit_action(); ?></td>
			</tr>
		</script>

		<script id="discount_edit_tmpl" type="text/html">
			<tr>
				<td>
				<?php
				$display_check_all_box = false;
				$display_select_all_link = true;
				$this->display_checkbox_list( $this->discount_rules, 'rules', $display_check_all_box, $display_select_all_link );
				?>
				</td>
				<td><?php $this->display_checkbox_list( $this->accom, 'accom' ); ?></td>
				<td><?php $this->display_seasons_checkbox_list(); ?></td>
				<td>
					<input data-bind="checked: apply_to_type" id="hb-discount-apply-to-type-accom" type="radio" value="accom" />
					<label for="hb-discount-apply-to-type-accom"><?php echo( esc_html( 'Accommodation price', 'hbook-admin' ) ); ?></label>
					<br/>
					<input data-bind="checked: apply_to_type" id="hb-discount-apply-to-type-global" type="radio" value="global" />
					<label for="hb-discount-apply-to-type-global"><?php echo( esc_html( 'Global price', 'hbook-admin' ) ); ?></label>
				</td>
				<td><?php $this->display_edit_rate_amount_fixed_percent(); ?></td>
				<td class="hb-table-action"><?php $this->display_admin_on_edit_action(); ?></td>
			</tr>
		</script>

		<script id="coupon_edit_tmpl" type="text/html">
			<tr>
				<td><input data-bind="value: code" type="text" class="hb-coupon-code" /></td>
				<td><?php $this->display_checkbox_list( $this->accom, 'accom' ); ?></td>
				<td><?php $this->display_seasons_checkbox_list(); ?></td>
				<td>
				<?php if ( $this->coupon_rules ) : ?>
				<input
					type="radio"
					data-bind="checked: rule"
					id="coupon-rule-none"
					name="coupon-rule"
					value=""
				/>
				<label for="coupon-rule-none"><?php esc_html_e( 'None', 'hbook-admin' ); ?></label>
				<br/>
				<?php
				endif;
				foreach ( $this->coupon_rules as $rule_id => $rule_name ) :
					$radio_input_id = 'coupon-rule-' . $rule_id;
					?>
				<input
					type="radio"
					data-bind="checked: rule"
					id="<?php echo( esc_attr( $radio_input_id ) ); ?>"
					name="coupon-rule"
					value="<?php echo( esc_attr( $rule_id ) ); ?>"
				/>
				<label for="<?php echo( esc_attr( $radio_input_id ) ); ?>"><?php echo( esc_html( $rule_name ) ); ?></label>
				<br/>
				<?php endforeach; ?>
				</td>
				<td data-bind="text: use_count"></td>
				<td><input data-bind="value: max_use_count" type="text" /></td>
				<td><input data-bind="value: date_limit" type="text" class="hb-coupon-limit-date" /></td>
				<!--
				<td>
					<input data-bind="checked: multiple_use_per_customer" name="multiple_use_per_customer" id="multiple_use_per_customer_yes" type="radio" value="yes" />
					<label for="multiple_use_per_customer_yes"><?php esc_html_e( 'Yes', 'hbook-admin' ); ?></label><br/>
					<input data-bind="checked: multiple_use_per_customer" name="multiple_use_per_customer" id="multiple_use_per_customer_no" type="radio" value="no" />
					<label for="multiple_use_per_customer_no"><?php esc_html_e( 'No', 'hbook-admin' ); ?></label>
				</td>
				-->
				<td><?php $this->display_edit_rate_amount_fixed_percent(); ?></td>
				<td class="hb-table-action"><?php $this->display_admin_on_edit_action(); ?></td>
			</tr>
		</script>

		<script id="empty_tmpl" type="text/html"></script>

		<?php } ?>

	</div><!-- end .wrap -->

<?php
	}

	private function table_rates_head() {
		if ( count( $this->rules ) > 0 ) {
			$col_width = '20%';
		} else {
			$col_width = '25%';
		}
		?>
			<thead>
				<tr>
					<th width="<?php echo( esc_attr( $col_width ) ); ?>"><?php esc_html_e( 'Accommodation', 'hbook-admin' ); ?></th>
					<th width="<?php echo( esc_attr( $col_width ) ); ?>"><?php esc_html_e( 'Seasons', 'hbook-admin' ); ?></th>
					<?php if ( count( $this->rules ) > 0 ) { ?>
					<th width="<?php echo( esc_attr( $col_width ) ); ?>"><?php esc_html_e( 'Special rates', 'hbook-admin' ); ?></th>
					<?php } ?>
					<th width="<?php echo( esc_attr( $col_width ) ); ?>"><?php esc_html_e( 'Amount', 'hbook-admin' ); ?></th>
					<th width="<?php echo( esc_attr( $col_width ) ); ?>" class="hb-table-action"><?php esc_html_e( 'Actions', 'hbook-admin' ); ?></th>
				</tr>
			</thead>
		<?php
	}

	private function display_seasons_checkbox_list() {
		?>
		<input data-bind="checked: all_seasons" type="checkbox" id="hb-checkbox-seasons-all" />
		<label for="hb-checkbox-seasons-all"><?php esc_html_e( 'All', 'hbook-admin' ); ?></label><br/>
		<?php
		foreach ( $this->seasons as $id => $season ) {
			$tag_id = 'hb-checkbox-seasons-' . $id;
			?>
			<input id="<?php echo( esc_attr( $tag_id ) ); ?>" data-bind="checked: seasons, disable: all_seasons" type="checkbox" value="<?php echo( esc_attr( $id ) ); ?>" />
			<label for="<?php echo( esc_attr( $tag_id ) ); ?>"><?php echo( esc_html( $season ) ); ?></label><br/>
		<?php
		}
		?>
		<a data-bind="click: unselect_all_seasons" href="#"><?php esc_html_e( 'Unselect all', 'hbook-admin' ); ?></a>
		<?php
	}

	private function display_rules_checkbox_list() {
		foreach ( $this->rules as $id => $rule ) {
			$tag_id = 'hb-checkbox-rules-' . $id;
			?>
			<input id="<?php echo( esc_attr( $tag_id ) ); ?>" data-bind="checked: rules, disable: all_rules" type="checkbox" value="<?php echo( $id ); ?>" />
			<label for="<?php echo( esc_attr( $tag_id ) ); ?>"><?php echo( esc_html( $rule['name'] ) ); ?></label><br/>
		<?php
		}
		?>
		<a data-bind="click: select_all_rules" href="#"><?php esc_html_e( 'Select all', 'hbook-admin' ); ?></a> -
		<a data-bind="click: unselect_all_rules" href="#"><?php esc_html_e( 'Unselect all', 'hbook-admin' ); ?></a>
		<?php
	}

}