Hotel Raxa - Advanced Booking System Implementation

🏨 Hotel Booking Enhancements:
- Implemented Eagle Booking Advanced Pricing add-on
- Added Booking.com-style rate management system
- Created professional calendar interface for pricing
- Integrated deals and discounts functionality

💰 Advanced Pricing Features:
- Dynamic pricing models (per room, per person, per adult)
- Base rates, adult rates, and child rates management
- Length of stay discounts and early bird deals
- Mobile rates and secret deals implementation
- Seasonal promotions and flash sales

📅 Availability Management:
- Real-time availability tracking
- Stop sell and restriction controls
- Closed to arrival/departure functionality
- Minimum/maximum stay requirements
- Automatic sold-out management

💳 Payment Integration:
- Maintained Redsys payment gateway integration
- Seamless integration with existing Eagle Booking
- No modifications to core Eagle Booking plugin

🛠️ Technical Implementation:
- Custom database tables for advanced pricing
- WordPress hooks and filters integration
- AJAX-powered admin interface
- Data migration from existing Eagle Booking
- Professional calendar view for revenue management

📊 Admin Interface:
- Booking.com-style management dashboard
- Visual rate and availability calendar
- Bulk operations for date ranges
- Statistics and analytics dashboard
- Modal dialogs for quick editing

🔧 Code Quality:
- WordPress coding standards compliance
- Secure database operations with prepared statements
- Proper input validation and sanitization
- Error handling and logging
- Responsive admin interface

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Hotel Raxa Dev
2025-07-11 07:43:22 +02:00
commit 5b1e2453c7
9816 changed files with 2784509 additions and 0 deletions

View File

@@ -0,0 +1,351 @@
<?php
/* --------------------------------------------------------------------------
* Hotel Branches Class
* Since 1.2.9.6
* Author: Eagle Themes
---------------------------------------------------------------------------*/
defined('ABSPATH') || exit;
class EB_BRANCHES {
private static $_instance = null;
/**
* Constructor function.
*
* @since 1.2.9.6
*/
public function __construct() {
// Actions
add_action( 'init', [ $this, 'hotel_branches_taxonomy' ], 10, 2 );
add_action('eagle_branch_add_form_fields', [ $this, 'add_term_image' ], 10, 2);
add_action('created_eagle_branch', [ $this, 'save_custom_fields' ], 10, 2);
add_action('eagle_branch_edit_form_fields', [ $this, 'edit_custom_fields' ], 1, 2);
add_action('admin_enqueue_scripts', [ $this, 'load_media_files' ] );
add_action('edited_eagle_branch', [ $this, 'update_image_upload' ], 10, 2);
add_action('parent_file', [ $this, 'keep_taxonomy_menu_open' ] );
add_action('save_post_eagle_rooms', [ $this, 'save_meta_box'] );
/**
* Allow HTML in term (category, tag) descriptions
*/
foreach ( array( 'pre_term_description' ) as $filter ) {
remove_filter( $filter, 'wp_filter_kses' );
}
foreach ( array( 'term_description' ) as $filter ) {
remove_filter( $filter, 'wp_kses_data' );
}
}
/**
* Create Hotel Branches Taxanomy
*
* @since 1.2.9.6
*/
function hotel_branches_taxonomy() {
$labels = array(
'name' => __( 'Branch', 'eagle-booking' ),
'singular_name' => _x( 'Branch', 'eagle-booking' ),
'search_items' => __( 'Search Branches', 'eagle-booking' ),
'all_items' => __( 'All Branches', 'eagle-booking' ),
'parent_item' => __( 'Parent Branch', 'eagle-booking' ),
'parent_item_colon' => __( 'Parent Branch:', 'eagle-booking' ),
'edit_item' => __( 'Edit Branch', 'eagle-booking' ),
'update_item' => __( 'Update Branch', 'eagle-booking' ),
'add_new_item' => __( 'Add New Branch', 'eagle-booking' ),
'new_item_name' => __( 'New Branch Name', 'eagle-booking' ),
'menu_name' => __( 'Branches', 'eagle-booking' ),
);
register_taxonomy( 'eagle_branch', array('eagle_rooms'), array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'show_in_rest' =>true,
'query_var' => true,
'rewrite' => array('slug' => eb_get_option('branches_slug')),
'meta_box_cb' => [$this, 'create_meta_box']
));
}
/**
* Add custom field on create taxanomy
*
* @since 1.2.9.6
*/
public function add_term_image($taxonomy){
?>
<div class="form-field" style="max-width: 95%">
<label for=""><?php echo __('Logo', 'eagle-booking') ?></label>
<div class="eb-upload-file">
<input type="hidden" name="eb_branch_logo" class="eb-upload-file-url" value="">
<img class="eb-upload-file-preview" src="" style="display: none">
<span class="eb-upload-file-remove remove" style="display: none"><i class="far fa-trash-alt"></i></span>
<p class="eb-upload-file-text"><?php echo __('Upload the logo of the hotel branch', 'eagle-booking') ?></p>
</div>
</div>
<div class="form-field" style="max-width: 95%">
<label for=""><?php echo __('Background Image', 'eagle-booking') ?></label>
<div class="eb-upload-file">
<input type="hidden" name="eb_branch_bg" class="eb-upload-file-url" value="">
<img class="eb-upload-file-preview" src="" style="display: none">
<span class="eb-upload-file-remove remove" style="display: none"><i class="far fa-trash-alt"></i></span>
<p class="eb-upload-file-text"><?php echo __('Upload the background image', 'eagle-booking') ?></p>
</div>
</div>
<div class="form-field term-slug-wrap">
<label for=""><?php echo __('Address', 'eagle-booking') ?></label>
<input type="text" name="eb_branch_address" value="">
</div>
<div class="form-field term-slug-wrap">
<label for=""><?php echo __('Phone', 'eagle-booking') ?></label>
<input type="text" name="eb_branch_phone" value="">
</div>
<div class="form-field term-slug-wrap">
<label for=""><?php echo __('Email', 'eagle-booking') ?></label>
<input type="text" name="eb_branch_email" value="">
</div>
<?php
}
/**
* Save custom field on create taxanomy
*
* @since 1.2.9.6
*/
public function save_custom_fields( $term_id ) {
if ( isset($_POST['eb_branch_logo']) ){
update_term_meta($term_id, 'eb_branch_logo', $_POST['eb_branch_logo'] );
}
if ( isset($_POST['eb_branch_bg']) ){
update_term_meta($term_id, 'eb_branch_bg', $_POST['eb_branch_bg'] );
}
if ( isset($_POST['eb_branch_address']) ){
update_term_meta($term_id, 'eb_branch_address', $_POST['eb_branch_address'] );
}
if ( isset($_POST['eb_branch_phone']) ){
update_term_meta($term_id, 'eb_branch_phone', $_POST['eb_branch_phone'] );
}
if ( isset($_POST['eb_branch_email']) ){
update_term_meta($term_id, 'eb_branch_email', $_POST['eb_branch_email'] );
}
}
/**
* Add custom field on edit taxanomy
*
* @since 1.2.9.6
*/
public function edit_custom_fields($term, $taxonomy) {
$eb_branch_logo_url = get_term_meta($term->term_id, 'eb_branch_logo', true);
$eb_branch_bg_url = get_term_meta($term->term_id, 'eb_branch_bg', true);
$eb_branch_address = get_term_meta($term->term_id, 'eb_branch_address', true);
$eb_branch_phone = get_term_meta($term->term_id, 'eb_branch_phone', true);
$eb_branch_email = get_term_meta($term->term_id, 'eb_branch_email', true);
?>
<tr class="form-field">
<th scope="row">
<label for=""><?php echo __('Logo', 'eagle-booking') ?></label>
</th>
<td>
<div class="eb-upload-file">
<input type="hidden" name="eb_branch_logo" class="eb-upload-file-url" value="<?php echo esc_url( $eb_branch_logo_url ) ?>">
<img class="eb-upload-file-preview" src="<?php echo esc_url( $eb_branch_logo_url ) ?>" style="<?php echo $eb_branch_logo_url ? '' : 'display: none' ?>">
<span class="eb-upload-file-remove remove"><i class="far fa-trash-alt"></i></span>
<p class="eb-upload-file-text" style="<?php echo $eb_branch_logo_url ? 'display: none' : '' ?>"><?php echo __('Upload the logo of the hotel branch', 'eagle-booking') ?></p>
</div>
</td>
</tr>
<tr class="form-field">
<th scope="row">
<label for=""><?php echo __('Background', 'eagle-booking') ?></label>
</th>
<td>
<div class="eb-upload-file">
<input type="hidden" name="eb_branch_bg" class="eb-upload-file-url" value="<?php echo esc_url( $eb_branch_bg_url ) ?>">
<img class="eb-upload-file-preview" src="<?php echo esc_url( $eb_branch_bg_url ) ?>" style="<?php echo $eb_branch_bg_url ? '' : 'display: none' ?>">
<span class="eb-upload-file-remove remove"><i class="far fa-trash-alt"></i></span>
<p class="eb-upload-file-text" style="<?php echo $eb_branch_bg_url ? 'display: none' : '' ?>"><?php echo __('Upload the background image', 'eagle-booking') ?></p>
</div>
</td>
</tr>
<tr class="form-field">
<th scope="row">
<label for=""><?php echo __('Address', 'eagle-booking') ?></label>
</th>
<td>
<input type="text" name="eb_branch_address" value="<?php echo esc_html( $eb_branch_address ) ?>">
</td>
</tr>
<tr class="form-field">
<th scope="row">
<label for=""><?php echo __('Phone', 'eagle-booking') ?></label>
</th>
<td>
<input type="text" name="eb_branch_phone" value="<?php echo esc_html( $eb_branch_phone ) ?>">
</td>
</tr>
<tr class="form-field">
<th scope="row">
<label for=""><?php echo __('Email', 'eagle-booking') ?></label>
</th>
<td>
<input type="text" name="eb_branch_email" value="<?php echo esc_html( $eb_branch_email ) ?>">
</td>
</tr>
<?php
}
/**
* Save custom field on edit taxanomy
*
* @since 1.2.9.6
*/
public function update_image_upload( $term_id ) {
if ( isset($_POST['eb_branch_logo']) ){
update_term_meta($term_id, 'eb_branch_logo', $_POST['eb_branch_logo'] );
}
if ( isset($_POST['eb_branch_bg']) ){
update_term_meta($term_id, 'eb_branch_bg', $_POST['eb_branch_bg'] );
}
if ( isset($_POST['eb_branch_address']) ){
update_term_meta($term_id, 'eb_branch_address', $_POST['eb_branch_address'] );
}
if ( isset($_POST['eb_branch_phone']) ){
update_term_meta($term_id, 'eb_branch_phone', $_POST['eb_branch_phone'] );
}
if ( isset($_POST['eb_branch_email']) ){
update_term_meta($term_id, 'eb_branch_email', $_POST['eb_branch_email'] );
}
}
/**
* Enque Media Files
*
* @since 1.2.9.6
*/
public function load_media_files() {
wp_enqueue_media();
}
/**
* Keep taxonomy menu open
*
* @since 1.2.9.6
*/
public function keep_taxonomy_menu_open($parent_file) {
global $current_screen;
$taxonomy = $current_screen->taxonomy;
if ( $taxonomy == 'eagle_branch' ) $parent_file = 'eb_bookings';
return $parent_file;
}
/**
* Create Branches Select [Edit Room]
*
* @since 1.2.9.6
*/
public function create_meta_box( $post ) {
$terms = get_terms( 'eagle_branch', array( 'hide_empty' => false ) );
$post = get_post();
$branches = wp_get_object_terms( $post->ID, 'eagle_branch', array( 'orderby' => 'term_id', 'order' => 'ASC' ) );
$name = '';
if ( ! is_wp_error( $branches ) ) {
if ( isset( $branches[0] ) && isset( $branches[0]->name ) ) {
$name = $branches[0]->name;
}
}
echo '<select name="eagle_branch" class="eb-branches-select">';
echo '<option value="">'.__('None', 'eagle-booking').'</option>';
foreach ( $terms as $term ) {
?>
<option value="<?php esc_attr_e( $term->name ); ?>" <?php selected( $term->name, $name ); ?>><?php esc_html_e( $term->name ); ?></option>
<?php
}
echo '</select>';
}
/**
* Save Branches [Edit Room]
*
* @since 1.2.9.6
*/
public function save_meta_box( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! isset( $_POST['eagle_branch'] ) ) {
return;
}
$branches = sanitize_text_field( $_POST['eagle_branch'] );
$term = get_term_by( 'name', $branches, 'eagle_branch' );
if ( ! is_wp_error( $term ) ) {
wp_set_object_terms( $post_id, $term->term_id, 'eagle_branch', false );
}
}
}
new EB_BRANCHES;

View File

@@ -0,0 +1,9 @@
<?php
/* --------------------------------------------------------------------------
* Include all Taxonomies required by EB
* @since 1.2.9.6
---------------------------------------------------------------------------*/
defined('ABSPATH') || exit;
require_once EB_PATH . '/core/admin/taxonomies/branches.php';