Hotel Raxa Dev 5b1e2453c7 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>
2025-07-11 07:43:22 +02:00

158 lines
4.6 KiB
PHP

<?php
namespace Cmb2Grid;
if ( ! defined( 'CMB2GRID_DIR' ) ) {
define( 'CMB2GRID_DIR', trailingslashit( dirname( __FILE__ ) ) );
}
if ( ! class_exists( '\Cmb2Grid\Cmb2GridPlugin' ) ) {
require_once dirname( __FILE__ ) . '/DesignPatterns/Singleton.php';
class Cmb2GridPlugin extends DesignPatterns\Singleton {
const VERSION = '1.0';
private $url;
protected function __construct() {
spl_autoload_register( array( $this, 'auto_load' ) );
add_action( 'admin_head', array( $this, 'wpHead' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
//$this->test();
}
private function test() {
new Test\Test();
}
/**
* Auto load our class files.
*
* @param string $class Class name.
*
* @return void
*/
public function auto_load( $class ) {
static $prefix;
static $base_dir;
static $sep;
static $length;
if ( ! isset( $prefix, $base_dir, $sep ) ) {
// Project-specific namespace prefix.
$prefix = __NAMESPACE__ . '\\';
// Base directory for the namespace prefix.
$base_dir = plugin_dir_path( __FILE__ ); // Has trailing slash.
// Set directory separator.
$sep = '/';
if ( defined( 'DIRECTORY_SEPARATOR' ) ) {
$sep = DIRECTORY_SEPARATOR;
}
$length = strlen( $prefix );
}
// Does the class use the namespace prefix?
if ( strncmp( $prefix, $class, $length ) !== 0 ) {
// No, move to the next registered autoloader.
return;
}
// Get the relative class name.
$relative_class = substr( $class, $length );
/*
* Add the base directory, replace namespace separators with directory
* separators in the relative class name and append with .php.
*/
$file = $base_dir . str_replace( '\\', $sep, $relative_class ) . '.php';
// If the file exists, require it.
if ( file_exists( $file ) ) {
require_once $file;
}
}
public function admin_enqueue_scripts() {
$suffix = ( ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min' );
wp_enqueue_style( 'cmb2_grid_bootstrap_light', $this->url( 'assets/css/bootstrap' . $suffix . '.css' ), null, self::VERSION );
}
public function wpHead() {
?>
<style>
.cmb2GridRow .cmb-row{border:none !important;padding:0 !important}
.cmb2GridRow .cmb-th label:after{border:none !important}
.cmb2GridRow .cmb-th{width:100% !important}
.cmb2GridRow .cmb-td{width:100% !important}
.cmb2GridRow input[type="text"]:not( '.hasDatepicker' ), .cmb2GridRow textarea, .cmb2GridRow select{width:100%}
.cmb2GridRow .cmb-repeat-group-wrap{max-width:100% !important;}
.cmb2GridRow .cmb-group-title{margin:0 !important;}
.cmb2GridRow .cmb-repeat-group-wrap .cmb-row .cmbhandle, .cmb2GridRow .postbox-container .cmb-row .cmbhandle{right:0 !important}
.cmb2GridRow .cmb-type-group .cmb-remove-field-row{padding-bottom: 1.8em !important;padding-top: 1.8em !important;}
.cmb2GridRow .cmb-td.cmb-nested{padding-left: 15px;padding-right: 15px;}
</style>
<?php
}
// Based on CMB2_Utils url() method.
public function url( $path = '' ) {
if ( isset( $this->url ) ) {
return $this->url . $path;
}
if ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) {
// Windows
$content_dir = str_replace( '/', DIRECTORY_SEPARATOR, WP_CONTENT_DIR );
$content_url = str_replace( $content_dir, WP_CONTENT_URL, CMB2GRID_DIR );
$cmb2_url = str_replace( DIRECTORY_SEPARATOR, '/', $content_url );
} else {
$cmb2_url = str_replace(
array( WP_CONTENT_DIR, WP_PLUGIN_DIR ),
array( WP_CONTENT_URL, WP_PLUGIN_URL ),
CMB2GRID_DIR
);
}
/**
* Filter the CMB location url.
*
* @param string $cmb2_url Currently registered url.
*/
$this->url = trailingslashit( apply_filters( 'cmb2_meta_box_url', set_url_scheme( $cmb2_url ), CMB2_VERSION ) );
return $this->url . $path;
}
}
}
/* Instantiate the class on plugins_loaded. */
// wp_installing() function was introduced in WP 4.4.
if ( ( function_exists( 'wp_installing' ) && wp_installing() === false ) || ( ! function_exists( 'wp_installing' ) && ( ! defined( 'WP_INSTALLING' ) || WP_INSTALLING === false ) ) ) {
add_action( 'plugins_loaded', '\\' . __NAMESPACE__ . '\init' );
}
if ( ! function_exists( '\Cmb2Grid\init' ) ) {
/**
* Initialize the class only if CMB2 is detected.
*
* @return void
*/
function init() {
if ( defined( 'CMB2_LOADED' ) ) {
if ( ! defined( 'CMB2GRID_DIR' ) ) {
define( 'CMB2GRID_DIR', trailingslashit( dirname( __FILE__ ) ) );
}
Cmb2GridPlugin::getInstance();
}
}
}
add_action( 'cmb2_init', '\Cmb2Grid\init' );