Files
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

875 lines
18 KiB
CSS

/* Admin options */
input.zante-hidden, .zante-hidden {
display: none;
}
img.zante-img-select {
border: 2px solid #eee;
cursor: pointer;
border-radius: 4px;
background: #fff;
}
img.zante-img-select.selected {
border: 2px solid #0074a2;
}
ul.zante-img-select-wrap {
float: left;
width: 100%;
display: block;
margin: 5px 0;
}
ul.zante-img-select-wrap li {
float: left;
margin-right: 1px;
}
/* REDUX */
#zante_settings-room_services input {
width: 150px;
margin-bottom: 10px;
}
/* Welcome panel */
.welcome-panel.zante-welcome-panel {
border-left: 4px solid #8ab7ab;
margin: 33px 20px 0 0;
padding-bottom: 30px;
}
.welcome-panel.zante-welcome-panel h3 {
font-weight: 500;
}
.welcome-panel.zante-welcome-panel .welcome-panel-column, .welcome-panel.zante-welcome-panel .welcome-panel-column:first-child {
max-width: 330px;
margin-right: 40px;
width: 25%;
}
.welcome-panel.zante-welcome-panel .welcome-panel-column:last-child {
margin-right: 0;
}
.zante-customize-welcome {
margin-top: 24px;
display: inline-block;
}
/* Buttons */
.zante.welcome-panel .button {
background: #8ab7ab;
box-shadow: none;
color: #fff;
padding: 10px 40px;
height: 50px;
outline: none;
border-color: #8ab7ab;
border-radius: 2px;
font-size: 16px;
margin-top: 20px;
transition: .5s;
}
.zante.welcome-panel .button:hover {
background: #7ea89d;
border-color: #7ea89d;
}
.zante.welcome-panel h3 span {
height: 20px;
width: 20px;
margin-right: 5px;
background: #8ab7ab;
display: inline-block;
color: #fff;
text-align: center;
border-radius: 50%;
line-height: 20px;
font-size: 12px;
}
/* Widgets */
.zante-widget-content-sortable label {
width: 100%;
display: block;
margin-bottom: 5px;
}
/* Posts & Pages Options */
.zante-img-select-wrap li {
margin-right: 20px !important;
margin-bottom: 20px !important;
}
.zante-img-select-wrap li span {
display: block;
}
img.zante-img-select {
border-color: #f2f2f2;
}
/* Hide WordPres Update Message */
.theme-browser .update-message, .theme-overlay .theme-about .theme-info .notice {
display: none;
}
.notice {
margin-left: 0;
}
/* VC */
#vc_inline-frame #text_rotating {
display: none !important;
}
.icon-eagle.vc_element-icon {
background-image: url(../../images/icons/icon-eagle.png);
background-size: 32px;
background-position: 0 0;
background-repeat: no-repeat;
display: block;
margin: 0;
}
.vc_ui-add-element-header-container .ealge-themes-tab {
position: relative;
}
.vc_ui-add-element-header-container .ealge-themes-tab button {
background-color: rgba(0, 0, 0, .1) !important;
padding-right: 40px !important;
color: #fff !important;
font-weight: bold !important
}
.vc_ui-add-element-header-container .ealge-themes-tab:after {
content: '';
position: absolute;
right: 10px;
top: 10px;
background-image: url(../../images/icons/icon-eagle.png);
background-size: 24px;
width: 24px;
height: 24px;
}
/* METABOXES */
.cmb2-postbox .cmb-tabs ul.cmb-tab-nav li a {
padding: 14px 10px;
}
/* Hide specific mtbx on EB CPT */
.post-type-eagle_rooms .cmb2-id-zante-mtb-page-title,
.post-type-eagle_rooms .cmb2-id-zante-mtb-page-sidebar,
.post-type-eagle_rooms .cmb2-id-zante-mtb-page-title-bg-image,
.post-type-eagle_rooms .cmb2-id-zante-mtb-page-padding,
.post-type-eagle_places .cmb2-id-zante-mtb-page-title,
.post-type-eagle_places .cmb2-id-zante-mtb-page-sidebar,
.post-type-eagle_places .cmb2-id-zante-mtb-page-title-bg-image,
.post-type-eagle_places .cmb2-id-zante-mtb-page-padding {
display: none;
}
.post-type-eagle_rooms .cmb2-id-zante-mtb-page-header-semi-transparent {
border-bottom: none !important;
padding-bottom: 0 !important;
}
#cmb2-metabox-zante_mtb_page_meta .cmb-th label {
color: #555;
font-size: 12px;
}
.cmb2-postbox .cmb-tabs ul.cmb-tab-nav, .cmb2-postbox .cmb-tabs ul.cmb-tab-nav:after {
background: #fff;
border-right: 1px solid #eee;
}
.cmb2-postbox .cmb-tabs ul.cmb-tab-nav li a {
border-bottom: 1px solid #eee;
}
.cmb2-postbox .cmb-tabs ul.cmb-tab-nav li.cmb-tab-active a {
border-left: 0;
border-right: 0;
background: #0085ba;
color: #fff;
}
.cmb2-postbox .cmb-tabs ul.cmb-tab-nav li a {
font-size: 14px;
}
/* switch ------------- */
.cmb2-switch {
margin-right: 15px;
margin-bottom: 5px;
float: left;
}
.cmb2-switch label {
cursor: pointer;
}
.cmb2-switch input {
display: none;
}
.cmb2-enable, .cmb2-disable {
background: #F5F5F5;
color: #95999d;
border: 1px solid #bfbfbf;
display: block;
float: left;
}
.cmb2-enable {
border-radius: 3px 0 0 3px;
border-right: 0 none;
}
.cmb2-disable {
border-left: 0 none;
border-radius: 0 3px 3px 0;
}
.cmb2-enable span, .cmb2-disable span {
line-height: 30px;
display: block;
font-weight: normal;
white-space: nowrap;
padding: 0 10px;
}
.cmb2-disable.selected {
background-color: #bfbfbf;
background-image: none;
border-color: #bfbfbf;
color: #fff;
}
.cmb2-enable.selected {
background-color: #0085ba;
background-image: none;
border-color: #0085ba;
box-shadow: none;
color: #fff;
}
/* CMB2 TABS */
.cmb-tabs .cmb-th {
width: 20% !important;
}
.cmb-tabs .cmb-th + .cmb-td, .cmb-tabs .cmb-th + .cmb-td {
width: 80% !important;
}
/* REV UPDATE MESSAGE */
.rs-update-notice-wrap {
display: none;
}
/* admin icons */
.zante-icon {
background-image: url('../../images/admin/menu_icon.png');
}
/* Redux Framework 4 */
#redux-connect-message {
display: none;
}
/* Eagle Themes - Theme Dashboard */
.eth-admin-header {
background: #fff;
border-bottom: 1px solid #e5e5e5;
margin-left: -20px;
margin-bottom: 30px;
padding: 15px 30px;
}
.eth-admin-header .eth-admin-header-inner {
max-width: 1300px;
margin: 0 auto;
padding-left: 20px;
display: flex;
align-items: center;
justify-content: space-between;
}
.eth-admin-header .eth-admin-brand {
display: flex;
align-items: center;
}
.eth-admin-header .eth-admin-brand .eth-admin-logo {
background: #ff3f55;
width: 45px;
height: 45px;
border-radius: 4px;
text-align: center;
outline: none;
box-shadow: none;
overflow: hidden;
position: relative;
}
.eth-admin-header .eth-admin-brand .eth-admin-logo img {
height: 45px;
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
.eth-admin-header .eth-admin-brand .eth-admin-slogan {
vertical-align: bottom;
margin-left: 20px;
}
.eth-admin-header .eth-admin-brand .eth-admin-slogan span {
display: block;
font-size: 24px;
line-height: 20px;
color: #606060;
font-weight: 500;
}
.eth-admin-header .eth-admin-brand .eth-admin-slogan span small {
position: relative;
top: -2px;
margin-left: 10px;
font-size: 12px;
line-height: 20px;
background: #daf3ec;
padding: 2px 6px;
text-align: center;
color: #23b6b6;
border-radius: 2px;
font-weight: 700;
}
.eth-admin-header .eth-admin-menu .view-switcher {
display: flex;
column-gap: 10px;
}
.eth-admin-header .eth-admin-menu .view-switcher a {
padding: 8px 16px;
text-decoration: none;
border: 1px solid #606060;
color: #606060;
border-radius: 4px;
font-weight: 500;
}
.eth-admin-header .eth-admin-menu .view-switcher a.active {
background: #606060;
color: #fff;
}
.eth-admin-header .eth-admin-menu .view-switcher a:hover,
.eth-admin-header .eth-admin-menu .view-switcher a:focus,
.eth-admin-header .eth-admin-menu .view-switcher a:active {
outline: none;
box-shadow: none;
}
.eth-theme-dashboard .eth-theme-panel {
max-width: 1300px;
margin: 0 auto;
padding: 0;
margin-bottom: 30px;
border: 1px solid #e5e5e5;
background: #fff;
border-radius: 4px;
}
.eth-theme-panel a {
text-decoration: none;
}
.eth-theme-panel a:hover,
.eth-theme-panel a:active,
.eth-theme-panel a:focus {
outline: none;
box-shadow: none;
}
.eth-theme-panel .eth-theme-panel-header {
display: grid;
grid-template-columns: 5fr 1fr;
align-items: center;
text-align: left;
font-size: 18px;
margin: 0;
padding: 12px 20px;
color: #2c3338;
border-bottom: 1px solid #ececec;
}
.eth-theme-panel-header .title {
margin: 0;
padding: 5px 0;
font-size: 16px;
}
.eth-theme-panel-header .btn {
margin-left: auto;
border-radius: 4px;
text-decoration: none;
font-size: 14px;
border: 1px solid #606060;
color: #606060;
text-align: center;
padding: 4px 10px;
transition: .3s;
}
.eth-theme-pannel-help {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.eth-theme-pannel-help h4 {
margin-top: 0;
font-size: 14px;
}
.eth-theme-pannel-help ul li {
padding: 5px 0;
padding-left: 15px;
position: relative;
}
.eth-theme-pannel-help ul li:before {
content: '';
left: 0;
top: 12px;
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: #ddd;
}
.eth-theme-pannel-help ul li a {
text-decoration: none;
}
.eth-theme-panel .eth-theme-panel-inner {
padding: 20px;
}
.eth-theme-panel .eth-theme-panel-inner .eth-theme-panel-license-info {
max-width: 600px;
}
.eth-theme-panel .eth-theme-panel-inner label {
display: block;
margin-bottom: 15px;
}
.eth-theme-panel .eth-theme-panel-inner input {
width: 100%;
height: 50px;
border: 1px solid #c5c5c5;
}
.eth-theme-panel .el-license-active-btn p {
padding: 0;
margin: 0;
}
.eth-theme-panel .eth-theme-panel-inner .eth-activate-btn {
margin-top: 30px;
background-color: #2BC37F;
border-color: #2BC37F;
color: #fff;
padding: 12px 15px;
font-size: 14px;
font-weight: 500;
line-height: 22px;
text-transform: uppercase;
cursor: pointer;
border: 0;
border-radius: 3px;
transition: .3s;
}
.eth-theme-panel .eth-theme-panel-inner .eth-activate-btn:hover,
.eth-theme-panel .eth-theme-panel-inner .eth-activate-btn:active,
.eth-theme-panel .eth-theme-panel-inner .eth-activate-btn:focus {
background-color: #26ae71;
border-color: #26ae71;
outline: none;
box-shadow: none;
}
.eth-theme-panel .eth-theme-panel-inner li div {
display: grid;
grid-template-columns: 1fr 1fr;
}
.eth-theme-panel .eth-license-activated {
background: #85c462;
padding: 2px 10px;
padding-left: 8px;
font-weight: 500;
text-transform: uppercase;
font-size: 11px;
letter-spacing: .5px;
color: #ffffff;
border-radius: 2px;
}
.eth-theme-panel .eth-theme-panel-inner .eth-deactivate-btn {
padding: 0;
margin: 0;
height: 20px;
line-height: 10px;
min-height: 10px;
width: auto;
background: none;
border: none;
color: #d90a2c;
}
.eth-theme-panel .eth-theme-panel-inner .eth-deactivate-btn:hover,
.eth-theme-panel .eth-theme-panel-inner .eth-deactivate-btn:active,
.eth-theme-panel .eth-theme-panel-inner .eth-deactivate-btn:focus {
outline: none;
box-shadow: none;
}
.eth-theme-panel .eth-license-activated:before {
content: "";
display: inline-block;
background: rgba(61, 76, 97, 0.55);
-webkit-border-radius: 50%;
border-radius: 50%;
height: 5px;
width: 5px;
margin-left: 2px;
margin-right: 11px;
top: -2px;
position: relative;
-webkit-box-shadow: 0 0 0 3px rgb(61 76 97 / 25%);
box-shadow: 0 0 0 3px rgb(61 76 97 / 25%);
}
.eth-theme-panel .eth-theme-panel-inner p {
line-height: 22px;
font-size: 15px;
color: #10AC84;
font-weight: 500;
}
.eth-theme-dashboard .eth-notice {
border: 1px solid #dfdfdf;
background: #fff;
padding: 15px 10px;
margin-bottom: 30px;
border-radius: 2px;
color: #3c434a;
text-align: left;
margin-left: 0;
margin-top: 20px;
position: relative;
}
.eth-theme-dashboard .eth-notice i {
position: absolute;
top: 50%;
left: 10px;
transform: translateY(-50%);
font-size: 22px;
line-height: 40px;
width: 40px;
height: 40px;
border-radius: 50px;
margin-left: 8px;
margin-right: 15px;
}
.eth-theme-dashboard .eth-notice p {
margin: 0;
display: inline-block;
margin-left: 80px;
}
.eth-notice.eth-notice-info {
border-color: #daf3ec;
background: #f1faf8;
}
.eth-notice.eth-notice-error {
border-color: #fdd6d6;
background: #ffefef;
}
.eth-notice.eth-notice-error i {
color: #d68989;
background: rgb(253 214 214);
}
.eth-notice.eth-notice-error .button {
background-color: #d68989 !important;
color: #fff !important;
border: 1px solid #ffffff !important;
border-radius: 2px i !important;
}
.eth-theme-dashboard .notice,
.eth-theme-dashboard.ocdi .notice {
display: none !important;
}
.eth-theme-dashboard .eth-license-form {
display: flex;
align-items: center;
justify-content: space-between;
}
.eth-theme-dashboard .eth-notice.eth-notice-info i {
color: #10AC84;
background: rgba(16,172,132,0.1);
}
.eth-theme-dashboard .eth-notice.activate-license p {
color:#507269;
margin: 0;
}
.eth-theme-dashboard .el-license-field {
width: 60%;
}
.eth-theme-dashboard .el-license-active-btn {
width: 35%;
}
.eth-theme-panel .ocdi-importing,
.eth-theme-panel .ocdi-imported {
padding: 0;
}
.eth-theme-panel table {
width: 100%;
}
.eth-theme-panel table td {
padding: 6px 0;
}
.eth-theme-panel .requirements th,
.eth-theme-panel .requirements td {
text-align: left;
padding: 6px 0;
}
.eth-theme-panel .requirements th {
padding-bottom: 20px;
}
.eth-theme-panel .requirements .value:before {
content: "";
display: inline-block;
background: rgba(61, 76, 97, 0.75);
-webkit-border-radius: 50%;
border-radius: 50%;
height: 6px;
width: 6px;
margin-left: 5px;
margin-right: 15px;
top: -2px;
position: relative;
-webkit-box-shadow: 0 0 0 3px rgb(61 76 97 / 25%);
box-shadow: 0 0 0 3px rgb(61 76 97 / 25%);
}
.eth-theme-panel .requirements .value.yes:before {
background-color: #2bc37f;
-webkit-box-shadow: 0 0 0 3px rgb(43 195 127 / 30%);
box-shadow: 0 0 0 3px rgb(43 195 127 / 30%);
}
.eth-theme-panel .requirements .value.no:before {
background-color: #d90a2c;
-webkit-box-shadow: 0 0 0 3px rgb(217 10 44 / 30%);
box-shadow: 0 0 0 3px rgb(217 10 44 / 30%);
}
/* Demo Importer */
.ocdi__theme-about {
display: none !important;
}
.ocdi__content-container-content--side {
display: none;
}
.ocdi__content-container-content--main {
margin-right: 0 !important;
}
.ocdi__gl-item {
flex: 0 0 calc(25% - 30px) !important;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item {
margin: 0 !important;
padding: 15px 0 !important;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item h3,
.ocdi__content-container-content .ocdi-install-plugins-content-content .content-item h3,
.ocdi__content-container-content .ocdi-create-content-content .plugin-item h3,
.ocdi__content-container-content .ocdi-create-content-content .content-item h3 {
font-size: 14px !important;
}
.eth-theme-dashboard .ocdi__content-container-content .required-plugin {
background: #ddf3ff;
color: #10AC84;
font-size: 10px;
font-weight: 500;
margin-left: 10px;
padding: 5px 8px;
position: relative;
border-radius: 4px;
text-transform: uppercase;
}
.eth-theme-dashboard .ocdi__content-container-content .suggested-plugin {
background: #f4f4f4;
color: #606060;
font-size: 10px;
font-weight: 500;
margin-left: 10px;
padding: 5px 8px;
position: relative;
border-radius: 4px;
text-transform: uppercase;
}
.eth-theme-dashboard .ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item--active .plugin-item-checkbox input[type=checkbox]:checked + .checkbox {
background: #0085ba;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item .plugin-item-checkbox .checkbox,
.ocdi-loading-md {
width: 24px !important;
height: 24px !important;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item .plugin-item-checkbox input[type=checkbox]:checked + .checkbox::after {
margin: 1px !important;
background: #0085ba !important;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item .plugin-item-checkbox .checkbox .ocdi-lock-icon {
display: none;
}
.ocdi__content-container-content .ocdi-install-plugins-content-content .plugin-item .plugin-item-checkbox .checkbox .ocdi-check-icon {
width: 10px !important;
height: 10px !important;
margin: 7px !important;
}
.ocdi__content-container-content .ocdi-install-plugins-content-footer, .ocdi__content-container-content .ocdi-create-content-footer {
background: #fff !important;
}
.eth-theme-dashboard.ocdi hr {
margin: 15px 0;
border-top: 0;
border-bottom: 0;
}
.eth-theme-dashboard .ocdi__gl-item-footer {
border-top: 1px solid #efefef;
}
.eth-theme-dashboard .ocdi__intro-text p {
font-weight: 400;
color: #878D8D;
font-size: 17px;
line-height: 24px;
margin-bottom: 0;
}
.eth-theme-dashboard .ocdi-importing p,
.eth-theme-dashboard .ocdi-imported p {
font-weight: 500;
}
.eth-theme-dashboard .ocdi-importing-footer,
.eth-theme-dashboard .ocdi-imported-footer {
background-color: #fff;
border-top: 1px solid #ededed;
}
.eth-theme-dashboard .ocdi__gl-item {
width: -webkit-calc((100%/3) - 24px);
width: calc((100%/3) - 24px);
margin: 12px;
background-color: #fff;
border-radius: 8px;
overflow: hidden;
transition: all cubic-bezier(0.4, 0, 0.2, 1) 0.4s;
border: 1px solid #efefef;
}
.eth-theme-dashboard .ocdi__gl-item:hover {
-webkit-box-shadow: 0 5px 15px rgb(23 28 36 / 10%);
box-shadow: 0 5px 15px rgb(23 28 36 / 10%);
}
.eth-theme-dashboard .eth-theme-panel .ocdi-importing-footer,
.eth-theme-dashboard .eth-theme-panel .ocdi-imported-footer {
margin: 0;
}
.eth-theme-dashboard .eth-theme-panel .ocdi-importing-content-imported--success,
.eth-theme-dashboard .eth-theme-panel .ocdi-imported-content-imported--success {
width: 110px;
height: 110px;
background: #daf3ec;
border-radius: 80px;
padding: 20px;
}
.eth-theme-dashboard .eth-theme-panel .ocdi__content-container-content--main {
border: 0;
}
#wpcontent {
padding-left: 20px !important;
}