Ροή επαλήθευσης επισκεπτών

Αυτός ο οδηγός εξηγεί πώς να χρησιμοποιήσετε τη λίστα των διαμενόντων επισκεπτών σε ένα captive portal: την αντιστοίχιση όσων πληκτρολογεί ο επισκέπτης με τη λίστα, πότε πρέπει να λήγει η συνεδρία Wi-Fi, πόσο συχνά να ανανεώνεται η λίστα και ποια πεδία να διατηρείτε για τα αρχεία του νόμου 5651.

Τι να ζητάτε στο portal#

Επειδή η λίστα παρέχει μαζί στοιχεία δωματίου και ταυτότητας, η πιο συνηθισμένη φόρμα είναι αριθμός δωματίου + επώνυμο. Ο αριθμός δωματίου μόνος του δεν αρκεί· οποιοσδήποτε γνωρίζει τον αριθμό ενός γειτονικού δωματίου θα μπορούσε να συνδεθεί. Εναλλακτικές είναι ο αριθμός δωματίου + αριθμός ταυτότητας/διαβατηρίου ή το επώνυμο + ημερομηνία γέννησης· κρατήστε το δεύτερο ως εφεδρική λύση για επισκέπτες με κενό αριθμό ταυτότητας.

Κανόνες αντιστοίχισης#

Κανονικοποιήστε και τις δύο πλευρές πριν συγκρίνετε όσα πληκτρολόγησε ο επισκέπτης με τις τιμές της λίστας:

  • Αριθμός δωματίου: αφαιρέστε τα κενά στα άκρα και μετατρέψτε σε κεφαλαία. Το roomName είναι συμβολοσειρά (μπορεί να είναι "104", "A-12" ή "Villa 3")· μην το μετατρέπετε σε αριθμό και μην αφαιρείτε τα αρχικά μηδενικά.
  • Επώνυμο: μετατρέψτε σε κεφαλαία (προσοχή στην τουρκική αντιστοίχιση i → İ) και συμπτύξτε τα διαδοχικά κενά. Οι τιμές της λίστας συνήθως διαβάζονται από το έγγραφο ταυτότητας με κεφαλαία.
  • Αριθμός ταυτότητας: αφαιρέστε τα κενά και μετατρέψτε σε κεφαλαία. Ο τουρκικός αριθμός εθνικής ταυτότητας έχει 11 ψηφία· ο αριθμός διαβατηρίου συνδυάζει γράμματα και ψηφία.
  • Ημερομηνία γέννησης: η λίστα δίνει DD.MM.YYYY· κάντε μετατροπή αν η φόρμα σας συλλέγει άλλη μορφή.
Αντιστοίχιση
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) {
  // «Ο αριθμός δωματίου και το επώνυμο δεν ταιριάζουν» — μετράτε τις αποτυχημένες προσπάθειες, περιορισμός μετά από 5
}

Η τιμή unique της εγγραφής που ταιριάζει είναι η ταυτότητα του χρήστη του hotspot. Όταν ο ίδιος επισκέπτης συνδέεται από δεύτερη συσκευή, χρησιμοποιήστε ξανά τον λογαριασμό που είναι συνδεδεμένος με αυτή την τιμή αντί να δημιουργήσετε νέο, και εφαρμόστε το όριο συσκευών σε αυτόν τον λογαριασμό.

Διάρκεια συνεδρίας#

Το checkout είναι η προγραμματισμένη ημερομηνία αναχώρησης και δείχνει στις 00:00 (UTC) εκείνης της ημέρας· δεν περιέχει ώρα. Αν ανοίξετε τη συνεδρία μέχρι εκείνη τη στιγμή, ο επισκέπτης χάνει την πρόσβαση το πρωί της αναχώρησης. Υπολογίστε τη λήξη της συνεδρίας προσθέτοντας στην ημερομηνία την ώρα check-out του ξενοδοχείου:

Λήξη συνεδρίας
const CHECKOUT_TIME = "12:00";                       // η ώρα check-out του ξενοδοχείου
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`);

Αν ο επισκέπτης αναχωρήσει πριν από την ώρα check-out, αφαιρείται από τη λίστα· κλείστε τον λογαριασμό στον επόμενο συγχρονισμό. Αν παραταθεί η διαμονή, το checkout αλλάζει· συγκρίνετε αυτό το πεδίο κατά τον συγχρονισμό και ενημερώστε τη λήξη της συνεδρίας. Για καθυστερημένα check-out είναι ασφαλέστερο να διατηρείτε την πρόσβαση ανοιχτή όσο ο επισκέπτης παραμένει στη λίστα.

Περιοδικός συγχρονισμός#

Η λίστα είναι ένα στιγμιότυπο· δεν υπάρχει ειδοποίηση αλλαγών (webhook). Ανακτάτε τη λίστα σε σταθερό διάστημα και συγκρίνετέ τη με την προηγούμενη με βάση το unique:

  • Διάστημα: 5 λεπτά αρκούν για τα περισσότερα ξενοδοχεία. Αν οι επισκέπτες αναμένεται να συνδεθούν αμέσως μετά το check-in, μπορείτε να κατεβείτε στα 1–2 λεπτά· μην κατεβαίνετε κάτω από 1 λεπτό.
  • Νέο unique: προετοιμάστε τον λογαριασμό· ο επισκέπτης αντιστοιχίζεται στην πρώτη σύνδεση στο portal.
  • unique που λείπει: ο επισκέπτης έκανε check-out ή η κράτηση ακυρώθηκε. Τερματίστε τη συνεδρία και κλείστε τον λογαριασμό.
  • Ίδιο unique, διαφορετικό roomName ή checkout: αλλαγή δωματίου ή παράταση. Ενημερώστε τον λογαριασμό.
  • Αποτυχημένο αίτημα: σε λήξη χρόνου, 401 ή 5xx, διατηρήστε την τελευταία επιτυχή λίστα· μην κλείνετε ποτέ λογαριασμούς με βάση μια απόκριση σφάλματος.
Βρόχος συγχρονισμού
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: διατήρηση της παλιάς λίστας
  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
  }
  for (const [id, g] of next) {
    const old = prev.get(id);
    if (!old) await openAccount(g);                           // νέος επισκέπτης
    else if (old.checkout !== g.checkout || old.roomName !== g.roomName) await updateAccount(g);
  }
  return next;
}

Πολλοί επισκέπτες σε ένα δωμάτιο#

Κάθε επισκέπτης ενός δωματίου είναι ξεχωριστή εγγραφή: το rezervasyon_id είναι κοινό, το unique διαφέρει. Ανοίγετε λογαριασμούς ανά επισκέπτη και όχι ανά δωμάτιο, ώστε κάθε επισκέπτης να έχει τη δική του συσκευή, συνεδρία και εγγραφή του νόμου 5651. Ένα ερώτημα αριθμού δωματίου + επωνύμου μπορεί να επιστρέψει περισσότερες από μία εγγραφές για επισκέπτες με το ίδιο επώνυμο (μια οικογένεια)· αντί να παίρνετε την πρώτη αντιστοίχιση, ξεχωρίστε τους με το όνομα ή την ημερομηνία γέννησης, ή ανοίξτε κοινό λογαριασμό για αυτούς.

Αρχεία του νόμου 5651#

Η υποχρέωση τήρησης αρχείων πρόσβασης σύμφωνα με τον τουρκικό νόμο αριθ. 5651 βαραίνει το σύστημα hotspot· το HMS παρέχει μόνο τα στοιχεία ταυτότητας. Όταν ανοίγει μια συνεδρία, αποθηκεύστε τα παρακάτω πεδία μαζί με τη διεύθυνση MAC/IP και τη χρονοσφραγίδα: unique, rezervasyon_id, firstName, lastName, identityNumber, birthDate, roomName, checkin, checkout. Μόλις ένας επισκέπτης αφαιρεθεί από τη λίστα, το HMS δεν παρέχει πλέον αυτές τις πληροφορίες· διατηρήστε την εγγραφή στη δική σας πλευρά.

Τελευταία ενημέρωση: 21 Σεπτεμβρίου 2026Βρήκατε κάποιο λάθος; Ενημερώστε μας