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,15 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* This file is generated by Webpack, do not edit it directly.
*/
return [
'handle' => 'elementor-v2-editor-responsive',
'deps' => [
'elementor-v2-editor-v1-adapters',
'react',
'wp-i18n',
],
];

View File

@@ -0,0 +1,2 @@
/*! For license information please see editor-responsive.js.LICENSE.txt */
!function(){"use strict";var e={react:function(e){e.exports=window.React},"@elementor/editor-v1-adapters":function(e){e.exports=window.elementorV2.editorV1Adapters},"@wordpress/i18n":function(e){e.exports=window.wp.i18n}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};!function(){n.r(r),n.d(r,{getBreakpoints:function(){return i},useActivateBreakpoint:function(){return c},useActiveBreakpoint:function(){return u},useBreakpoints:function(){return d}});var e=n("@elementor/editor-v1-adapters"),t=n("@wordpress/i18n"),o=n("react");function i(){const{breakpoints:e}=window.elementor?.config?.responsive||{};if(!e||0===Object.entries(e).length)return[];const n=[],r=[],o=[{id:"desktop",label:(0,t.__)("Desktop","elementor")}];Object.entries(e).forEach((([e,t])=>{if(!t.is_enabled)return;const i={id:e,label:t.label,width:t.value,type:"min"===t.direction?"min-width":"max-width"};i.width?"min-width"===i.type?n.push(i):"max-width"===i.type&&r.push(i):o.push(i)}));const i=(e,t)=>e.width&&t.width?t.width-e.width:0;return[...n.sort(i),...o,...r.sort(i)]}function d(){return(0,e.__privateUseListenTo)((0,e.v1ReadyEvent)(),i)}function u(){return(0,e.__privateUseListenTo)((0,e.windowEvent)("elementor/device-mode/change"),s)}function s(){const e=window;return e.elementor?.channels?.deviceMode?.request?.("currentMode")||null}function c(){return(0,o.useCallback)((t=>(0,e.__privateRunCommand)("panel/change-device-mode",{device:t})),[])}}(),(window.elementorV2=window.elementorV2||{}).editorResponsive=r}();

View File

@@ -0,0 +1,21 @@
/*! @elementor/editor-v1-adapters */
/*! @wordpress/i18n */
/*! react */
/*!**************************!*\
!*** external ["React"] ***!
\**************************/
/*!******************************!*\
!*** external ["wp","i18n"] ***!
\******************************/
/*!***************************************************!*\
!*** external ["elementorV2","editorV1Adapters"] ***!
\***************************************************/
/*!******************************************************************!*\
!*** ./node_modules/@elementor/editor-responsive/dist/index.mjs ***!
\******************************************************************/

View File

@@ -0,0 +1 @@
!function(){"use strict";var e={d:function(t,n){for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{getBreakpoints:function(){return r},useActivateBreakpoint:function(){return a},useActiveBreakpoint:function(){return u},useBreakpoints:function(){return d}});var n=window.elementorV2.editorV1Adapters,o=window.wp.i18n,i=window.React;function r(){const{breakpoints:e}=window.elementor?.config?.responsive||{};if(!e||0===Object.entries(e).length)return[];const t=[],n=[],i=[{id:"desktop",label:(0,o.__)("Desktop","elementor")}];Object.entries(e).forEach((([e,o])=>{if(!o.is_enabled)return;const r={id:e,label:o.label,width:o.value,type:"min"===o.direction?"min-width":"max-width"};r.width?"min-width"===r.type?t.push(r):"max-width"===r.type&&n.push(r):i.push(r)}));const r=(e,t)=>e.width&&t.width?t.width-e.width:0;return[...t.sort(r),...i,...n.sort(r)]}function d(){return(0,n.__privateUseListenTo)((0,n.v1ReadyEvent)(),r)}function u(){return(0,n.__privateUseListenTo)((0,n.windowEvent)("elementor/device-mode/change"),c)}function c(){const e=window;return e.elementor?.channels?.deviceMode?.request?.("currentMode")||null}function a(){return(0,i.useCallback)((e=>(0,n.__privateRunCommand)("panel/change-device-mode",{device:e})),[])}(window.elementorV2=window.elementorV2||{}).editorResponsive=t}();

View File

@@ -0,0 +1 @@
__( 'Desktop', 'elementor' );