מערכת הזמנות מותאמת אישית ל-1С-Bitrix: ביטול הזמנות כפולות

הזמנות כפולות של אותו חדר מהוות מקור להפסדים ולעימותים בעסקי המלונאות. אנו מפתחים מערכת הזמנות על 1C-Bitrix שמונעת overbooking באמצעות נעילה טרנזקציונית ושחרור אוטומטי של בקשות שפג תוקפן. הצוות שלנו מספק את הפרויקט במפתח מלא—מתכנון מבנה הנתונים ועד ליישום ולתמיכה שוטפת.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
מערכת הזמנות מותאמת אישית ל-1С-Bitrix: ביטול הזמנות כפולות
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

מערכת הזמנות מותאמת אישית על 1С-Bitrix: ביטול הזמנות כפולות

הזמנות כפולות הן כאב ראש לכל עסק מלונאי. כאשר שני אורחים מזמינים בו-זמנית את החדר האחרון, Bitrix סטנדרטי אינו יכול להבטיח שלא תתרחש הזמנה כפולה. הנזקים מעימותים כאלה יכולים להגיע ל-$4.5k–6.5k בשנה עבור רשת קטנה. פיתחנו מערכת הזמנות מותאמת אישית על 1С-Bitrix שמבטלת לחלוטין הזמנות כפולות באמצעות נעילת שורות טרנזקציונלית ושחרור אוטומטי של הזמנות שפג תוקפן. פיתוח מותאם אישית של מערכת הזמנות על 1С-Bitrix מתחיל בעיצוב סכמת מסד הנתונים: טבלת bl_booking, אינדקסים וטרנזקציות. מתחת למכסה המנוע: SELECT FOR UPDATE, סוכן ולוח שנה AJAX. להלן הארכיטקטורה ומקרה אמיתי.

לפי תיעוד 1С-Bitrix, עבור לוגיקת הזמנות מורכבת מומלץ להשתמש בטבלאות מותאמות אישית במקום בלוקי מידע. אנו משתמשים בדיוק בגישה זו: בלוק מידע rooms לתיאורי חדרים, וטבלה מותאמת אישית bl_booking למעקב אחר תפוסה. זה מספק גמישות בשאילתות וביצועים.

למה בלוקי מידע סטנדרטיים לא עובדים להזמנות?

מעקב זמינות מבוסס לוח שנה דורש סכמה נפרדת. בלוקי מידע לא יכולים לבדוק ביעילות חפיפות תאריכים ולנעול משבצות.

טבלת חדרים — בלוק מידע מסוג room עם מאפיינים PROPERTY_ROOM_TYPE, PROPERTY_CAPACITY וקישור למלון.

טבלת הזמנות — טבלה מותאמת אישית bl_booking:

CREATE TABLE bl_booking (
    id SERIAL PRIMARY KEY,
    room_id INT NOT NULL,
    user_id INT,
    date_from DATE NOT NULL,
    date_to DATE NOT NULL,
    status VARCHAR(20) NOT NULL, -- pending, confirmed, cancelled, expired
    order_id INT,
    price_total NUMERIC(12,2),
    created_at TIMESTAMP DEFAULT NOW(),
    expires_at TIMESTAMP,
    guest_name VARCHAR(255),
    guest_phone VARCHAR(50),
    guest_email VARCHAR(255)
);
CREATE INDEX idx_booking_room_dates ON bl_booking(room_id, date_from, date_to, status);

איך עובדת בדיקת הזמינות עם הגנה מפני תנאי מרוץ?

שאילתת המפתח בודקת חפיפות:

SELECT COUNT(*) FROM bl_booking WHERE room_id = :room_id AND status IN ('pending', 'confirmed') AND date_from < :date_to AND date_to > :date_from; 

אם COUNT > 0 — החדר אינו זמין. השאילתה עטופה בטרנזקציה עם CREATE TABLE bl_booking ( id SERIAL PRIMARY KEY, room_id INT NOT NULL, user_id INT, date_from DATE NOT NULL, date_to DATE NOT NULL, status VARCHAR(20) NOT NULL, -- pending, confirmed, cancelled, expired order_id INT, price_total NUMERIC(12,2), created_at TIMESTAMP DEFAULT NOW(), expires_at TIMESTAMP, guest_name VARCHAR(255), guest_phone VARCHAR(50), guest_email VARCHAR(255) ); CREATE INDEX idx_booking_room_dates ON bl_booking(room_id, date_from, date_to, status); כדי לבטל תנאי מרוץ. שלבי היישום:

  1. פתיחת טרנזקציה.
  2. ביצוע SELECT FOR UPDATE על רשומת החדר.
  3. בדיקת חפיפות תאריכים.
  4. אם פנוי — INSERT לתוך bl_booking עם סטטוס pending.
  5. אישור הטרנזקציה.

תחת בקשות מקבילות, הבקשה השנייה ממתינה לסיום הטרנזקציה הראשונה, מה שמבטיח ללא הזמנות כפולות. הבדיקה המותאמת אישית המבוססת על bl_booking רצה פי 5 מהר יותר מאשר ניסיון ליישם לוגיקה דומה על בלוקי מידע סטנדרטיים.

איך מטפלים בפסק זמן לתשלום?

לאחר יצירת הזמנה בסטטוס pending, מתחיל טיימר. אם התשלום לא מתקבל תוך 15–30 דקות, ההזמנה עוברת לסטטוס expired והמשבצת משוחררת.

יישום באמצעות סוכן:

function ReleasExpiredBookings(): string {
    $expiredIds = BookingTable::getList([
        'filter' => [
            'STATUS' => 'pending',
            '<=EXPIRES_AT' => new \Bitrix\Main\Type\DateTime(),
        ],
        'select' => ['ID'],
    ])->fetchAll();

    foreach ($expiredIds as $row) {
        BookingTable::update($row['ID'], ['STATUS' => 'expired']);
    }

    return __FUNCTION__ . '();';
}

נרשם דרך CAgent::AddAgent() עם מרווח של 60 שניות.

איך בנוי ממשק בוחר התאריכים?

לוח השנה של הזמינות נבנה באמצעות בקשת AJAX אל SELECT COUNT(*) FROM bl_booking WHERE room_id = :room_id AND status IN ('pending', 'confirmed') AND date_from < :date_to AND date_to > :date_from; . הקצה האחורי מחזיר תאריכים תפוסים. בקצה הקדמי אנו משתמשים ב-Flatpickr עם סימון ימים מושבתים.

בקר AJAX המרחיב את SELECT FOR UPDATE:

class BookingController extends \Bitrix\Main\Engine\Controller {
    public function getAvailabilityAction(int $roomId, string $month): array {
        // возвращает занятые даты за месяц
    }
}

מקרה בוחן: רשת מלונות דירות (3 נכסים, 47 חדרים)

משימה: החלפת הזמנות ידניות בטלפון, ביטול הזמנות כפולות.

מצב התחלתי: מנהלים השתמשו בגיליון Excel, ערכו התאמות שבועיות — הזמנות כפולות תקופתיות הובילו לתלונות אורחים. נזקי הזמנות כפולות לפני היישום היו כ-$4.5k–6.5k בשנה.

פתרונות שיושמו:

  • בלוק מידע function ReleasExpiredBookings(): string { $expiredIds = BookingTable::getList([ 'filter' => [ 'STATUS' => 'pending', '<=EXPIRES_AT' => new \Bitrix\Main\Type\DateTime(), ], 'select' => ['ID'], ])->fetchAll(); foreach ($expiredIds as $row) { BookingTable::update($row['ID'], ['STATUS' => 'expired']); } return __FUNCTION__ . '();'; } עם 47 אלמנטים, כל אחד עם גלריה ומאפיינים (/bitrix/services/main/ajax.php?action=BookingModule:getAvailability, \Bitrix\Main\Engine\Controller, class BookingController extends \Bitrix\Main\Engine\Controller { public function getAvailabilityAction(int $roomId, string $month): array { // возвращает занятые даты за месяц } } )
  • rooms טבלה עם אינדקס טווח תאריכים
  • בקר AJAX לבדיקת זמינות (מגיב תוך 80–120 אלפיות השנייה)
  • אינטגרציה עם שער תשלום באמצעות מודול FLOOR: ההזמנה עוברת לסטטוס confirmed על webhook משער התשלום
  • סוכן לשחרור הזמנות שפג תוקפן כל 2 דקות
  • מודול ניהולי עם תצוגת לוח שנה של תפוסת חדרים

תוצאות: אפס הזמנות כפולות במשך 14 חודשי פעילות, שיעור המרה של טופס ההזמנה 4.2% (לפני כן 0% — הכל עבר דרך טלפון). עלויות הפיתוח הוחזרו תוך חודשיים.

תהליך הפיתוח

שלב משך
עיצוב סכמת נתונים 3 ימים
פיתוח קצה אחורי (טבלה, סוכן, בקר) 5 ימים
קצה קדמי (לוח שנה, טופס, AJAX) 4 ימים
אינטגרציה עם שער תשלום 2 ימים
ממשק ניהול 3 ימים
בדיקות והשקה 2 ימים

לוחות הזמנים עשויים להשתנות בהתאם למורכבות האינטגרציה ומספר הנכסים.

השוואת גישות

היבט מודול מכירה סטנדרטי bl_booking מותאם אישית
בדיקת חפיפת תאריכים דורש שינויים מורכבים מובנה, מהיר
פסק זמן להזמנה אין, רק ביטול ידני סוכן אוטומטי
תנאי מרוץ לא נפתר SELECT FOR UPDATE
ביצועי בדיקה ~500 אלפיות השנייה 80–120 אלפיות השנייה

מה כולל פיתוח מערכת ההזמנות?

  • עיצוב מודל נתונים עם סוגי חדרים ותמחור עונתי
  • מנגנון בדיקת זמינות עם הגנה מפני תנאי מרוץ
  • ממשק בחירת תאריכים עם ויזואליזציה של תפוסה
  • סוכן אוטומטי לשחרור הזמנות שפג תוקפן
  • אינטגרציה עם מודול VIEW להפקת חשבוניות וקבלת תשלומים
  • סעיף ניהולי לניהול הזמנות
  • הגדרת התראות לאורחים ולמנהלים (דוא"ל/SMS)

קבלו ייעוץ לפרויקט שלכם. הזמינו פיתוח מערכת הזמנות במפתח מלא — נכין הצעה מסחרית תוך יום עסקים אחד. צרו קשר כדי להעריך לוחות זמנים ועלויות פיתוח למשימות שלכם.