הגדרת לוח זמינות חדרים ב-1C-Bitrix
מלון מאבד הזמנות לא בגלל חוסר ביקוש, אלא כי אורחים לא יכולים לראות תאריכים פנויים בזמן אמת. הקטלוג הסטנדרטי של ביטריקס לא מטפל בזמינות תאריכים—זה לא המטרה שלו. אנחנו פותרים זאת עם ארכיטקטורה ייעודית: אחסון תקופות תפוסה, לוגיקת חפיפת תאריכים, ורכיב ויזואלי. כפי שצוין בתיעוד הרשמי של ביטריקס, ORM D7 מספק הפשטה נוחה למשימות כאלה. הניסיון שלנו מראה שתצורה נכונה של לוח שנה מגדילה את שיעור ההמרה של הזמנות ב-25–40% בזכות שקיפות ונוחות.
קחו מקרה טיפוסי: מלון עם 80 חדרים, שלוש עונות, אינטגרציה עם Booking.com. עדכונים ידניים של לוח השנה לוקחים עד שעתיים ביום ומובילים ל-15–20 הזמנות כפולות בחודש. לוח שנה אוטומטי מבטל את הבעיות האלה, וחוסך $1,500–2,000 בחודש על משכורות וקנסות.
איך פועל לוח הזמינות
המרכיב המרכזי הוא טבלת ההזמנות, שמתעדת את התפוסה של כל חדר. שאילתת בדיקת הזמינות משתמשת בחפיפת מרווחים: אם תקופת הבקשה חופפת להזמנה קיימת, החדר תפוס. עיקרון זה מבטיח שאין הזמנות כפולות.
פרטי יישום
אחסון תקופות תפוסה
CREATE TABLE custom_room_bookings ( id INT AUTO_INCREMENT PRIMARY KEY, room_id INT NOT NULL, -- ID элемента инфоблока (номер) order_id INT, -- Связь с заказом Битрикс guest_name VARCHAR(255), check_in DATE NOT NULL, check_out DATE NOT NULL, status ENUM('pending','confirmed','cancelled') DEFAULT 'pending', created_at DATETIME, INDEX idx_room_dates (room_id, check_in, check_out), INDEX idx_dates (check_in, check_out) ); CREATE TABLE custom_room_rates ( id INT AUTO_INCREMENT PRIMARY KEY, room_id INT NOT NULL, rate_from DATE NOT NULL, rate_to DATE NOT NULL, price_per_night DECIMAL(10,2) NOT NULL, INDEX idx_room_period (room_id, rate_from, rate_to) ); זמינות החדר לתקופה נבדקת עם שאילתת חפיפת מרווחים:
SELECT id FROM custom_room_bookings WHERE room_id = :room_id AND status != 'cancelled' AND check_in < :check_out AND check_out > :check_in LIMIT 1; עטיפת ORM ב-D7
namespace Custom\Hotel; class BookingTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'custom_room_bookings'; } public static function isRoomAvailable(int $roomId, string $checkIn, string $checkOut): bool { $result = static::getList([ 'filter' => [ '=ROOM_ID' => $roomId, '!=STATUS' => 'cancelled', '<CHECK_IN' => $checkOut, '>CHECK_OUT' => $checkIn, ], 'limit' => 1, ]); return !$result->fetch(); } public static function getOccupiedDates(int $roomId, string $month): array { // Возвращает массив занятых дат для календаря $from = date('Y-m-01', strtotime($month)); $to = date('Y-m-t', strtotime($month)); $bookings = static::getList([ 'filter' => [ '=ROOM_ID' => $roomId, '!=STATUS' => 'cancelled', '<CHECK_IN' => $to, '>CHECK_OUT' => $from, ], ]); $dates = []; while ($booking = $bookings->fetch()) { $current = strtotime($booking['CHECK_IN']); $end = strtotime($booking['CHECK_OUT']); while ($current < $end) { $dates[] = date('Y-m-d', $current); $current = strtotime('+1 day', $current); } } return array_unique($dates); } } רכיב לוח שנה ויזואלי
אנחנו משתמשים בFlatpickr לרינדור—ספרייה קלה (16 KB), שתומכת בטווחי תאריכים ובעיצוב קל. הגדרה עם תאריכים תפוסים:
async function initBookingCalendar(roomId) { const response = await fetch(`/api/hotel/availability/?room_id=${roomId}&months=3`); const { occupiedDates } = await response.json(); flatpickr('#date-range-picker', { mode: 'range', minDate: 'today', dateFormat: 'Y-m-d', locale: 'ru', disable: occupiedDates, onChange: function(selectedDates) { if (selectedDates.length === 2) { const nights = Math.round( (selectedDates[1] - selectedDates[0]) / 86400000 ); updatePricePreview(roomId, selectedDates[0], selectedDates[1], nights); } } }); } נקודת קצה API לנתוני זמינות
בקר AJAX מחזיר תאריכים תפוסים לתקופה המבוקשת:
class HotelAvailabilityController extends \Bitrix\Main\Engine\Controller { public function getAction(int $roomId, int $months = 2): array { $occupiedDates = []; $current = new \DateTime(); for ($m = 0; $m < $months; $m++) { $monthStr = $current->format('Y-m'); $dates = BookingTable::getOccupiedDates($roomId, $monthStr); $occupiedDates = array_merge($occupiedDates, $dates); $current->modify('+1 month'); } return ['occupiedDates' => array_unique($occupiedDates)]; } } שמירת תגובה במטמון—5 דקות דרך CREATE TABLE custom_room_bookings ( id INT AUTO_INCREMENT PRIMARY KEY, room_id INT NOT NULL, -- ID элемента инфоблока (номер) order_id INT, -- Связь с заказом Битрикс guest_name VARCHAR(255), check_in DATE NOT NULL, check_out DATE NOT NULL, status ENUM('pending','confirmed','cancelled') DEFAULT 'pending', created_at DATETIME, INDEX idx_room_dates (room_id, check_in, check_out), INDEX idx_dates (check_in, check_out) ); CREATE TABLE custom_room_rates ( id INT AUTO_INCREMENT PRIMARY KEY, room_id INT NOT NULL, rate_from DATE NOT NULL, rate_to DATE NOT NULL, price_per_night DECIMAL(10,2) NOT NULL, INDEX idx_room_period (room_id, rate_from, rate_to) ); , פסילה בעת הזמנה חדשה.
למה הגישה שלנו יעילה יותר מניהול ידני
עדכוני זמינות ידניים בערוצי OTA צד שלישי לוקחים שעות ומובילים לשגיאות. האוטומציה שלנו מבטלת הזמנות כפולות ומפחיתה את עומס העבודה על העובדים. בהשוואה למודולים מוכנים מהמרקטפלייס, פתרון מותאם אישית עובד מהר יותר עם קטלוגים גדולים (100+ חדרים) וניתן להתאמה בקלות לכללים לא סטנדרטיים: שהייה מינימלית, צ'ק-אין מוקדם, תמחור דינמי. למודולים מוכנים יש זמן תגובה של 2–4 שניות לכל בקשת זמינות, בעוד שהיישום שלנו עם אינדקסי SQL מותאמים מגיב ב-30–80 אלפיות שנייה. עם 1000+ מבקרים ייחודיים ביום, ההבדל קריטי גם להמרה וגם לעומס השרת. שמירת מטמון מתויגת של ביטריקס מפחיתה קריאות למסד הנתונים פי 12 תחת אותן בקשות במקביל.
איך למנוע הזמנות כפולות
בדיקות זמינות מתבצעות בצד השרת בכל בקשה. נעשה שימוש בנעילה אטומית ברמת הטבלה: טרנזקציה עם SELECT id FROM custom_room_bookings WHERE room_id = :room_id AND status != 'cancelled' AND check_in < :check_out AND check_out > :check_in LIMIT 1; מבטיחה ששני משתמשים לא יכולים להזמין את אותו חדר בו זמנית. לאחר יצירת ההזמנה, לוח השנה מתעדכן. מנגנון זה נבדק תחת עומס של 100+ בקשות במקביל—לא נרשמו תקלות.
מה כלול בעבודה
| שלב | תוצאה |
|---|---|
| אחסון הזמנות + אינדקסים | טבלת custom_room_bookings, שאילתות SQL, ORM D7 |
| API זמינות | בקר AJAX, שמירת מטמון, סריאליזציה |
| לוח שנה ויזואלי | Flatpickr עם חסימת תאריכים תפוסים, עיצוב רספונסיבי |
| תעריפים עונתיים | טבלת custom_room_rates, נקודת קצה לחישוב מחירים |
| אינטגרציית הזמנות | יצירת הזמנה ב-sale בעת הזמנה, סנכרון סטטוסים |
| תיעוד והדרכה | תיאור API, מדריך למנהל |
שלבי יישום
- ניתוח — דיון בסוגי חדרים, עונתיות, כללי הזמנה.
- עיצוב — סכמת מסד נתונים, נקודות קצה REST, תכנית שמירת מטמון.
- פיתוח — אחסון, ORM, API, רכיב לוח שנה, תעריפים.
- אינטגרציה — קישור להזמנות, הגדרת תשלום, התראות.
- בדיקות — בדיקת עומס עם 50+ בקשות במקביל, מקרי קצה.
- פריסה — העלאה לסביבת ייצור, ניטור.
לוח זמנים
| היקף | זמן |
|---|---|
| אחסון + API זמינות + Flatpickr | 2–3 ימים |
| תעריפים עונתיים + תצוגה מקדימה של מחיר | +1–2 ימים |
| אינטגרציית הזמנות + התראות | +1–2 ימים |
| סנכרון Channel Manager (OTA) | משימה נפרדת |
לוח הזמינות הוא הבסיס של כל מערכת ההזמנות המקוונת. כאן הלקוח מחליט אם לרכוש. הזמינו לוח זמינות סוהר—צרו קשר, נבחן את הפרויקט שלכם תוך יום אחד. אנחנו מספקים אחריות על קוד ותמיכה לאחר היישום. פנו אלינו לייעוץ על הפרויקט שלכם.







