158 lines
4.6 KiB
PHP
Raw Normal View History

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
<?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' );