Files

1 line
630 KiB
JavaScript
Raw Permalink 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
!function(){"use strict";SR7??={},SR7.WEBGL??={},SR7.WEBGL.vertexShader="varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}",SR7.WEBGL.preFragmentShader="#if __VERSION__ < 130 \n#define TEXTURE2D texture2D \n#else \n#define TEXTURE2D texture \n#endif\n",SR7.WEBGL.getCanvas=(t={})=>{let e=document.createElement("canvas");return t.class&&(e.classList=t.class),e.style.background="transparent",e.style.width="100%",e.style.height="100%",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.zIndex=2,e.width=t.width??1600,e.height=t.height??1200,{canvas:e}},SR7.WEBGL.postProcessing=(t,e,n,i,r)=>{const s={composer:new SR7.WEBGL.EffectComposer(e),renderPass:new SR7.WEBGL.RenderPass(n,i),effectPass:new SR7.WEBGL[t](n,i,r)};return"FilmPass"==t&&(s.effectPass.renderToScreen=!0),s.composer.addPass(s.renderPass),s.composer.addPass(s.effectPass),s},SR7.WEBGL.getPlane=t=>new THREE.Mesh(new THREE.PlaneGeometry(1,1,2,2),t),SR7.WEBGL.cleanThree=(t,e,n)=>{if(e.three){for(e.three.material&&(e.three.material.map&&e.three.material.map.dispose(),e.three.material.dispose(),e.three.material=null),e.three.scene.traverse((t=>{t.isMesh&&(t.geometry.dispose(),t.material.dispose()),t.isTexture&&t.dispose(),t=null}));e.three.scene.children.length>0;)e.three.scene.remove(e.three.scene.children[0]);e.three.renderer.forceContextLoss(),e.three.renderer.dispose(),e.three.renderer.domElement=null,e.three.renderer=null,null!==e.three.canvas.parentNode&&e.three.canvas.parentNode.removeChild(e.three.canvas)}e.three=null;t.querySelectorAll(n).forEach((t=>{t.parentNode.removeChild(t)}))},SR7.WEBGL.cleanPartlyThree=(t,e,n)=>{t.querySelectorAll(n).forEach((t=>{t.parentNode.removeChild(t)}))},SR7.WEBGL={...SR7.WEBGL,EffectComposer:class{constructor(t,n){if(this.renderer=t,void 0===n){var i={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat},r=t.getSize(new THREE.Vector2);this._pixelRatio=t.getPixelRatio(),this._width=r.width,this._height=r.height,(n=new THREE.WebGLRenderTarget(this._width*this._pixelRatio,this._height*this._pixelRatio,i)).texture.name="EffectComposer.rt1"}else this._pixelRatio=1,this._width=n.width,this._height=n.height;this.renderTarget1=n,this.renderTarget2=n.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new SR7.WEBGL.ShaderPass({uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:SR7.WEBGL.vertexShader,fragmentShader:SR7.WEBGL.preFragmentShader+e.copy}),this.clock=new THREE.Clock}swapBuffers(){var t=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=t}addPass(t){this.passes.push(t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(t,e){this.passes.splice(e,0,t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(t){const e=this.passes.indexOf(t);-1!==e&&this.passes.splice(e,1)}isLastEnabledPass(t){for(var e=t+1;e<this.passes.length;e++)if(this.passes[e].enabled)return!1;return!0}render(t){void 0===t&&(t=this.clock.getDelta());var e,n,i=this.renderer.getRenderTarget(),r=!1,s=this.passes.length;for(n=0;n<s;n++)if(!1!==(e=this.passes[n]).enabled){if(e.renderToScreen=this.renderToScreen&&this.isLastEnabledPass(n),e.render(this.renderer,this.writeBuffer,this.readBuffer,t,r),e.needsSwap){if(r){var a=this.renderer.getContext(),o=this.renderer.state.buffers.stencil;o.setFunc(a.NOTEQUAL,1,4294967295),this.copyPass.render(this.renderer,this.writeBuffer,this.readBuffer,t),o.setFunc(a.EQUAL,1,4294967295)}this.swapBuffers()}void 0!==THREE.MaskPass&&(e instanceof THREE.MaskPass?r=!0:e instanceof THREE.ClearMaskPass&&(r=!1))}this.renderer.setRenderTarget(i)}reset(t){if(void 0===t){var e=this.renderer.getSize(new THREE.Vector2);this._pixelRatio=this.renderer.getPixelRatio(),this._width=e.width,this._height=e.height,(t=this.renderTarget1.clone()).setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}this.renderTarge