Flux de vérification des clients
Ce guide explique comment exploiter la liste des clients en séjour dans un portail captif : comparer la saisie du client à la liste, déterminer quand la session Wi-Fi doit prendre fin, choisir la fréquence d’actualisation de la liste et savoir quels champs conserver pour les journaux exigés par la loi turque n° 5651.
Que demander sur le portail#
Comme la liste fournit à la fois la chambre et l’identité, le formulaire le plus courant est numéro de chambre + nom de famille. Le numéro de chambre seul ne suffit pas : quiconque connaît le numéro d’une chambre voisine pourrait se connecter. Autres possibilités : numéro de chambre + numéro d’identité/de passeport ou nom de famille + date de naissance ; gardez cette dernière en solution de repli pour les clients dont le numéro d’identité est vide.
Règles de correspondance#
Normalisez les deux côtés avant de comparer la saisie du client aux valeurs de la liste :
- Numéro de chambre : supprimez les espaces superflus et convertissez en majuscules.
roomNameest une chaîne (elle peut valoir"104","A-12"ou"Villa 3") ; ne la convertissez pas en nombre et ne supprimez pas les zéros initiaux. - Nom de famille : convertissez en majuscules (attention à la correspondance turque
i → İ) et réduisez les espaces multiples. Les valeurs de la liste sont généralement lues en majuscules sur la pièce d’identité. - Numéro d’identité : supprimez les espaces et convertissez en majuscules. Un numéro d’identité national turc compte 11 chiffres ; un numéro de passeport mêle lettres et chiffres.
- Date de naissance : la liste la fournit au format
DD.MM.YYYY; convertissez-la si votre formulaire utilise un autre 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) {
// « Le numéro de chambre et le nom ne correspondent pas » — comptez les échecs, limitez après 5
}La valeur unique de l’enregistrement correspondant constitue l’identité de l’utilisateur hotspot. Lorsque le même client se connecte depuis un second appareil, réutilisez le compte rattaché à cette valeur au lieu d’en créer un nouveau, et appliquez la limite d’appareils à ce compte.
Durée de session#
checkout est la date de départ prévue et pointe sur 00:00 (UTC) de ce jour ; elle ne contient aucune heure. Si vous ouvrez la session jusqu’à ce moment, le client perd l’accès le matin de son départ. Calculez la fin de session en ajoutant l’heure de départ de l’hôtel à la date :
const CHECKOUT_TIME = "12:00"; // heure de départ de l’hôtel
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`);Si le client part avant l’heure de départ, il disparaît de la liste ; fermez le compte à la synchronisation suivante. Si le séjour est prolongé, checkout change ; comparez ce champ lors de la synchronisation et mettez à jour la fin de session. Pour les départs tardifs, il est plus sûr de laisser l’accès ouvert tant que le client figure dans la liste.
Synchronisation périodique#
La liste est un instantané ; il n’existe aucune notification de changement (webhook). Récupérez la liste à intervalle fixe et comparez-la à la précédente d’après unique :
- Intervalle : 5 minutes suffisent pour la plupart des hôtels. Si les clients doivent pouvoir se connecter dès leur check-in, vous pouvez descendre à 1–2 minutes ; ne descendez pas en dessous d’une minute.
- Nouvel
unique: préparez le compte ; le client est identifié lors de sa première connexion au portail. uniquedisparu : le client a fait son check-out ou la réservation a été annulée. Mettez fin à la session et fermez le compte.- Même
unique,roomNameoucheckoutdifférent : changement de chambre ou prolongation. Mettez à jour le compte. - Requête en échec : en cas de délai dépassé, de
401ou de5xx, conservez la dernière liste obtenue avec succès ; ne fermez jamais de comptes sur la base d’une réponse d’erreur.
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 : on conserve l’ancienne liste
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 effectué
}
for (const [id, g] of next) {
const old = prev.get(id);
if (!old) await openAccount(g); // nouveau client
else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
}
return next;
}Plusieurs clients dans une même chambre#
Chaque client d’une chambre est un enregistrement distinct : rezervasyon_id est commun, unique diffère. Ouvrez les comptes par client plutôt que par chambre, afin que chaque client dispose de ses propres appareils, de sa session et de son enregistrement au titre de la loi 5651. Une requête numéro de chambre + nom de famille peut renvoyer plusieurs enregistrements pour des clients portant le même nom (une famille) ; au lieu de retenir la première correspondance, départagez-les par prénom ou date de naissance, ou ouvrez-leur un compte commun.
Enregistrements au titre de la loi 5651#
L’obligation de conserver les journaux d’accès prévue par la loi turque n° 5651 incombe au système hotspot ; HMS ne fournit que les données d’identité. À l’ouverture d’une session, enregistrez les champs suivants avec l’adresse MAC/IP et l’horodatage : unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. Une fois qu’un client a disparu de la liste, HMS ne fournit plus ces informations ; conservez l’enregistrement de votre côté.