Qonaq yoxlaması axını

Bu bələdçi oteldə qalan qonaqların siyahısından captive portalda necə istifadə olunacağını izah edir: qonağın daxil etdiyi məlumatların siyahı ilə tutuşdurulması, Wi-Fi sessiyasının nə vaxt bitməli olduğu, siyahının hansı tezlikdə yenilənməsi və Türkiyənin 5651 saylı qanunu üzrə qeydlər üçün hansı sahələrin saxlanılması.

Portalda nə soruşmalı#

Siyahı otaq və şəxsiyyət məlumatlarını birlikdə verdiyi üçün ən geniş yayılmış forma otaq nömrəsi + soyad formasıdır. Təkcə otaq nömrəsi kifayət deyil; qonşu otağın nömrəsini bilən hər kəs daxil ola bilər. Alternativlər otaq nömrəsi + şəxsiyyət vəsiqəsi/pasport nömrəsi və ya soyad + doğum tarixidir; sonuncunu şəxsiyyət nömrəsi boş olan qonaqlar üçün ehtiyat variant kimi saxlayın.

Uyğunlaşdırma qaydaları#

Qonağın daxil etdiyi məlumatları siyahıdakı dəyərlərlə müqayisə etməzdən əvvəl hər iki tərəfi normallaşdırın:

  • Otaq nömrəsi: boşluqları kəsin və böyük hərflərə çevirin. roomName sətirdir ("104", "A-12" və ya "Villa 3" ola bilər); onu rəqəmə çevirməyin və əvvəldəki sıfırları atmayın.
  • Soyad: böyük hərflərə çevirin (türk dilinə xas i → İ çevrilməsinə diqqət edin) və təkrarlanan boşluqları birləşdirin. Siyahıdakı dəyərlər adətən şəxsiyyət sənədindən böyük hərflərlə oxunur.
  • Şəxsiyyət nömrəsi: boşluqları silin və böyük hərflərə çevirin. Türkiyə şəxsiyyət nömrəsi 11 rəqəmdən ibarətdir; pasport nömrəsində hərflər və rəqəmlər qarışıq olur.
  • Doğum tarixi: siyahı DD.MM.YYYY formatını verir; formanız başqa format toplayırsa, onu çevirin.
Uyğunlaşdırma
const norm = (s) => String(s ?? "")
  .replace(/\s+/g, " ")
  .trim()
  .toLocaleUpperCase("tr-TR");

function findGuest(list, room, lastName) {
  return list.find((g) =>
    norm(g.roomName) === norm(room) && norm(g.lastName) === norm(lastName)
  ) || null;
}

const guest = findGuest(data.otelde, form.room, form.lastName);
if (!guest) {
  // "Otaq nömrəsi və soyad uyğun gəlmədi" — uğursuz cəhdləri sayın, 5 cəhddən sonra məhdudlaşdırın
}

Uyğun gələn qeydin unique dəyəri hotspot istifadəçisinin identifikatorudur. Eyni qonaq ikinci cihazdan daxil olduqda yeni hesab yaratmaq əvəzinə bu dəyərə bağlı hesabdan istifadə edin və cihaz limitini həmin hesab üzərində tətbiq edin.

Sessiyanın müddəti#

checkout planlaşdırılan çıxış tarixidir və həmin günün 00:00 (UTC) anını göstərir; saat məlumatı daşımır. Sessiyanı bu ana qədər açsanız, qonaq çıxış günü səhər çıxışını itirər. Sessiyanın bitmə vaxtını tarixə otelin check-out saatını əlavə etməklə hesablayın:

Sessiyanın sonu
const CHECKOUT_TIME = "12:00";                       // otelin check-out saatı
const day = new Date(guest.checkout * 1000)
  .toLocaleDateString("en-CA", { timeZone: "UTC" });   // "2026-09-10"
const sessionEnd = new Date(`${day}T${CHECKOUT_TIME}:00+03:00`);

Qonaq check-out saatından əvvəl oteli tərk edərsə, siyahıdan çıxır; hesabı növbəti sinxronizasiyada bağlayın. Qalma müddəti uzadılarsa, checkout dəyişir; sinxronizasiya zamanı bu sahəni müqayisə edin və sessiyanın bitmə vaxtını yeniləyin. Gec check-out hallarında qonaq siyahıda qaldığı müddətcə çıxışı açıq saxlamaq daha etibarlıdır.

Dövri sinxronizasiya#

Siyahı müəyyən anın görüntüsüdür; dəyişiklik bildirişi (webhook) yoxdur. Siyahını sabit intervalla alın və unique üzrə əvvəlki siyahı ilə müqayisə edin:

  • İnterval: əksər otellər üçün 5 dəqiqə kifayətdir. Qonaqların check-in edən kimi internetə qoşulması gözlənilirsə, 1–2 dəqiqəyədək azalda bilərsiniz; 1 dəqiqədən aşağı düşməyin.
  • Yeni unique: hesabı hazırlayın; qonaq portala ilk girişdə uyğunlaşdırılır.
  • Yoxa çıxan unique: qonaq check-out edib və ya rezervasiya ləğv olunub. Sessiyanı bitirin və hesabı bağlayın.
  • Eyni unique, fərqli roomName və ya checkout: otaq dəyişikliyi və ya qalma müddətinin uzadılması. Hesabı yeniləyin.
  • Uğursuz sorğu: vaxt aşımı, 401 və ya 5xx olduqda son uğurlu siyahını saxlayın; hesabları heç vaxt xəta cavabı əsasında bağlamayın.
Sinxronizasiya dövrü
async function sync(prev) {
  const res = await fetch(BASE + "/public/json/customer/inhotel", {
    method: "POST",
    headers: { "ApiKey": process.env.HMS_API_KEY, "HotelCode": HOTEL_CODE }
  });
  if (!res.ok) return prev;                                   // 401 / 5xx: köhnə siyahını saxlayın
  const { success, otelde } = await res.json();
  if (success !== 1) return prev;

  const next = new Map(otelde.map((g) => [g.unique, g]));
  for (const [id] of prev) {
    if (!next.has(id)) await closeAccount(id);                // check-out edib
  }
  for (const [id, g] of next) {
    const old = prev.get(id);
    if (!old) await openAccount(g);                           // yeni qonaq
    else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
  }
  return next;
}

Bir otaqda bir neçə qonaq#

Otaqdakı hər qonaq ayrıca qeyddir: rezervasyon_id ortaqdır, unique isə fərqlidir. Hər qonağın öz cihazı, sessiyası və Türkiyənin 5651 saylı qanunu üzrə öz qeydi olması üçün hesabları otaq üzrə deyil, qonaq üzrə açın. Otaq nömrəsi + soyad sorğusu eyni soyadlı qonaqlar (ailə) üçün birdən çox qeyd qaytara bilər; ilk uyğun qeydi götürmək əvəzinə onları ad və ya doğum tarixinə görə fərqləndirin, ya da onlar üçün ortaq hesab açın.

Türkiyənin 5651 saylı qanunu üzrə qeydlər#

5651 saylı qanuna əsasən giriş jurnallarının aparılması öhdəliyi hotspot sisteminin üzərinə düşür; HMS yalnız şəxsiyyət məlumatlarını təqdim edir. Sessiya açılanda aşağıdakı sahələri MAC/IP ünvanı və vaxt damğası ilə birlikdə saxlayın: unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. Qonaq siyahıdan çıxdıqdan sonra HMS bu məlumatları artıq vermir; qeydi öz tərəfinizdə saxlayın.

Son yenilənmə: 21 sentyabr 2026Səhv tapdınız? Bizə bildirin