Misafir doğrulama akışı
Bu rehber, oteldeki misafir listesinin bir captive portal’da nasıl kullanılacağını anlatır: misafirin girdiği bilgilerin listeyle eşleştirilmesi, Wi-Fi oturumunun ne zaman biteceği, listenin hangi sıklıkla yenileneceği ve 5651 kayıtları için hangi alanların saklanacağı.
Portalda ne sorulur#
Liste oda ve kimlik bilgilerini birlikte verdiği için en yaygın form oda numarası + soyaddır. Oda numarası tek başına yeterli değildir; komşu odanın numarasını bilen herkes giriş yapabilir. Alternatif olarak oda numarası + kimlik/pasaport numarası ya da soyad + doğum tarihi sorulabilir; kimlik numarası boş olan misafirler için ikinci seçeneği yedek olarak tutun.
Eşleştirme kuralları#
Misafirin yazdığı değerlerle listedeki değerleri karşılaştırmadan önce iki tarafı da normalize edin:
- Oda numarası: baştaki ve sondaki boşlukları kaldırın, büyük harfe çevirin.
roomNamebir metindir ("104","A-12","Villa 3"olabilir); sayıya çevirmeyin, baştaki sıfırları yok saymayın. - Soyad: büyük harfe çevirin (Türkçe için
i → İdönüşümüne dikkat), birden fazla boşluğu teke indirin. Liste değerleri genellikle kimlik belgesinden büyük harfle okunmuştur. - Kimlik numarası: boşlukları kaldırın, büyük harfe çevirin. T.C. kimlik numarası 11 hanedir; pasaport numarası harf ve rakam içerir.
- Doğum tarihi: liste
GG.AA.YYYYverir; formunuz başka biçimde alıyorsa karşılaştırmadan önce dönüştürün.
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) {
// "Oda numarası ve soyad eşleşmedi" — başarısız denemeleri sayın, 5 denemeden sonra bekletin
}Eşleşen kaydın unique değeri hotspot kullanıcısının kimliğidir. Aynı misafir ikinci cihazından giriş yaptığında yeni hesap açmak yerine bu değere bağlı hesabı kullanın; cihaz sayısı sınırını da bu hesap üzerinde uygulayın.
Oturum süresi#
checkout planlanan çıkış tarihidir ve günün 00:00’ını (UTC) gösterir; saat bilgisi yoktur. Oturumu bu zamana kadar açarsanız misafir çıkış günü sabahı erişimini kaybeder. Oturum sonunu, çıkış tarihine otelin çıkış saatini ekleyerek hesaplayın:
const CHECKOUT_TIME = "12:00"; // otelin çıkış saati
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`);Misafir çıkış saatinden önce ayrılırsa listeden düşer; bir sonraki senkronda hesabını kapatın. Konaklama uzatılırsa checkout değeri değişir; senkronda bu alanı da karşılaştırıp oturum süresini güncelleyin. Geç çıkışta misafir listede kaldığı sürece erişimi açık tutmak daha doğrudur.
Periyodik senkron#
Liste anlık durumu verir; değişiklik bildirimi (webhook) yoktur. Listeyi sabit aralıkla çekin ve bir öncekiyle unique üzerinden karşılaştırın:
- Aralık: 5 dakika çoğu otel için yeterlidir. Misafirin check-in anında Wi-Fi’ye girmesi bekleniyorsa 1–2 dakikaya inebilirsiniz; 1 dakikanın altına inmeyin.
- Yeni
unique: hesabı hazırlayın; misafir portalda ilk girişte eşleştirilir. - Kaybolan
unique: misafir çıkış yaptı ya da rezervasyon iptal edildi. Oturumu sonlandırın, hesabı kapatın. - Aynı
unique, farklıroomNameya dacheckout: oda değişikliği ya da uzatma. Hesabı güncelleyin. - Başarısız istek: zaman aşımı,
401ya da5xxaldığınızda son başarılı listeyi koruyun; hesapları hata yanıtına göre kapatmayın.
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: eski listeyi koru
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); // çıkış yaptı
}
for (const [id, g] of next) {
const old = prev.get(id);
if (!old) await openAccount(g); // yeni misafir
else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
}
return next;
}Aynı odada birden fazla misafir#
Bir odadaki her misafir ayrı bir kayıttır: rezervasyon_id ortak, unique farklıdır. Hesabı oda başına değil misafir başına açın; böylece her misafirin kendi cihazı, kendi oturumu ve kendi 5651 kaydı olur. Oda numarası + soyad sorgusu aynı soyadlı iki misafirde (aile) birden fazla kayıt döndürebilir; ilk eşleşeni almak yerine ad ya da doğum tarihiyle ayırın veya bu misafirlere ortak bir hesap açın.
5651 kayıtları#
5651 sayılı kanun kapsamındaki erişim kayıtlarını tutma yükümlülüğü hotspot sistemine aittir; HMS yalnızca kimlik verisini sağlar. Oturum açıldığında MAC/IP adresi ve zaman damgasıyla birlikte şu alanları saklayın: unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. Misafir listeden düştükten sonra HMS bu bilgiyi vermez; kaydı kendi tarafınızda tutun.