Fluxul de verificare a oaspeților
Acest ghid explică modul de utilizare a listei oaspeților cazați într-un portal captiv: compararea datelor introduse de oaspete cu lista, momentul în care trebuie să se încheie sesiunea Wi-Fi, frecvența de reîmprospătare a listei și câmpurile care trebuie păstrate pentru înregistrările cerute de Legea turcă nr. 5651.
Ce cereți pe portal#
Deoarece lista furnizează împreună datele despre cameră și identitate, cel mai frecvent formular este numărul camerei + numele de familie. Numărul camerei singur nu este suficient; oricine cunoaște numărul unei camere vecine s-ar putea autentifica. Alternativele sunt numărul camerei + numărul actului de identitate/pașaportului sau numele de familie + data nașterii; păstrați-o pe cea din urmă ca variantă de rezervă pentru oaspeții al căror număr de identificare este gol.
Reguli de potrivire#
Normalizați ambele părți înainte de a compara datele introduse de oaspete cu valorile din listă:
- Numărul camerei: eliminați spațiile de la capete și convertiți la majuscule.
roomNameeste un șir (poate fi"104","A-12"sau"Villa 3"); nu îl convertiți la număr și nu eliminați zerourile de la început. - Numele de familie: convertiți la majuscule (atenție la corespondența turcească
i → İ) și reduceți spațiile repetate la unul singur. Valorile din listă sunt de obicei citite din actul de identitate, cu majuscule. - Numărul de identificare: eliminați spațiile și convertiți la majuscule. Numărul național de identificare turc are 11 cifre; numărul de pașaport combină litere și cifre.
- Data nașterii: lista o furnizează ca
DD.MM.YYYY; convertiți-o dacă formularul dumneavoastră folosește alt format.
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) {
// „Numărul camerei și numele de familie nu corespund” — numărați încercările eșuate, limitați după 5
}Valoarea unique a înregistrării găsite este identitatea utilizatorului hotspot. Când același oaspete se autentifică de pe un al doilea dispozitiv, refolosiți contul asociat acestei valori în loc să creați unul nou și aplicați limita de dispozitive pe acel cont.
Durata sesiunii#
checkout este data planificată de check-out și indică ora 00:00 (UTC) a acelei zile; nu conține ora efectivă. Dacă deschideți sesiunea până în acel moment, oaspetele pierde accesul în dimineața plecării. Calculați sfârșitul sesiunii adăugând la dată ora de check-out a hotelului:
const CHECKOUT_TIME = "12:00"; // ora de check-out a hotelului
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`);Dacă oaspetele pleacă înainte de ora de check-out, dispare din listă; închideți contul la următoarea sincronizare. Dacă sejurul este prelungit, checkout se schimbă; comparați acest câmp la sincronizare și actualizați sfârșitul sesiunii. Pentru check-out-urile târzii, este mai sigur să păstrați accesul deschis cât timp oaspetele rămâne în listă.
Sincronizare periodică#
Lista este un instantaneu; nu există notificări de modificare (webhook). Obțineți lista la un interval fix și comparați-o cu cea anterioară după unique:
- Interval: 5 minute sunt suficiente pentru majoritatea hotelurilor. Dacă oaspeții trebuie să se poată conecta imediat după check-in, puteți coborî la 1–2 minute; nu coborâți sub 1 minut.
uniquenou: pregătiți contul; oaspetele este identificat la prima autentificare pe portal.uniquedispărut: oaspetele a făcut check-out sau rezervarea a fost anulată. Încheiați sesiunea și închideți contul.- Același
unique, altroomNamesaucheckout: o mutare în altă cameră sau o prelungire. Actualizați contul. - Cerere eșuată: la timeout,
401sau5xx, păstrați ultima listă obținută cu succes; nu închideți niciodată conturi pe baza unui răspuns de eroare.
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: păstrați lista veche
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); // a făcut check-out
}
for (const [id, g] of next) {
const old = prev.get(id);
if (!old) await openAccount(g); // oaspete nou
else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
}
return next;
}Mai mulți oaspeți în aceeași cameră#
Fiecare oaspete dintr-o cameră este o înregistrare separată: rezervasyon_id este comun, unique diferă. Deschideți conturi per oaspete, nu per cameră, astfel încât fiecare oaspete să aibă propriul dispozitiv, propria sesiune și propria înregistrare pentru Legea nr. 5651. O interogare după numărul camerei + numele de familie poate returna mai multe înregistrări pentru oaspeții cu același nume de familie (o familie); în loc să luați prima potrivire, departajați după prenume sau data nașterii ori deschideți un cont comun pentru ei.
Înregistrările pentru Legea nr. 5651#
Obligația de a păstra jurnalele de acces conform Legii nr. 5651 revine sistemului hotspot; HMS furnizează doar datele de identitate. La deschiderea unei sesiuni, stocați următoarele câmpuri împreună cu adresa MAC/IP și marcajul de timp: unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. După ce un oaspete dispare din listă, HMS nu mai furnizează aceste informații; păstrați înregistrarea în sistemul dumneavoastră.