07 мар. 2025 г.·6 мин

Приложение для регистрации посетителей с QR‑бейджами: модель данных и потоки

Спроектируйте модель данных и потоки регистрации посетителей с QR‑бейджами: оповещения хостов, вопросы безопасности, журналы ЧС и экспортируемая история визитов.

Приложение для регистрации посетителей с QR‑бейджами: модель данных и потоки

Какую задачу должен решать поток регистрации

Поток регистрации — это не просто цифровая книга гостей. Он определяет, кто находится внутри, с кем встречается посетитель и что должно произойти дальше. Когда всё сделано правильно, ресепшен остаётся спокойным, а у вас появляются записи, которым можно доверять позже.

Бумажные журналы сдаются в типичных ситуациях: имена написаны с ошибками или нечитаемо, отсутствуют отметки времени, люди забывают отметиться при уходе. Лист на стойке также может раскрывать личные данные, потому что любой может увидеть прошлые записи. А когда что-то меняется быстро (хост задерживается на встрече, посетитель даёт тревожный ответ в вопросах безопасности), персоналу приходится ловить людей по телефону.

Хороший результат прост: регистрация занимает меньше минуты, бейдж чёткий и сканируемый, хост получает нужное уведомление без спама. Каждый визит превращается в аккуратную запись о том, кто, когда, где, зачем и что было ответлено — её можно экспортировать для проверок или расследований.

Прежде чем что‑то проектировать, зафиксируйте объём. Большинство команд начинают с нескольких типов визитов: гости на месте, подрядчики (обычно с дополнительными шагами по безопасности), доставки (иногда без бейджа, но с отметкой времени) и собеседования (с повышенной просьбой о приватности).

Также решите, где будет происходить опыт. Планшет‑киоск лучше всего подходит для скорости и согласованности. Веб‑приложение для ресепшена удобнее для исключений, исправлений и перевыпусков. Мобильный вариант может помочь хостам или охране верифицировать QR‑чек‑ины вдали от стойки.

Роли, права и события, которые нужно отслеживать

Приложение для регистрации посетителей живёт или умирает двумя вещами: понятными ролями и чистым трекингом событий. Если хоть одно неясно, вы получите пропущенные оповещения, неублюдаемые экспорты и логи, которым никто не доверяет.

Роли, которые нужно предусмотреть

Сначала держите роли простыми:

  • Visitor: вводит свои данные и отвечает на вопросы, но не видит другие визиты.
  • Host: видит визиты, назначенные им, подтверждает приходы и может запрашивать действия вроде сопровождения.
  • Receptionist (front desk): создаёт визиты, правит очевидные опечатки во время регистрации, перевыпускает бейджи и отмечает уход.
  • Security: видит, кто сейчас на объекте, помогает с перекличками при ЧС и просматривает заметки об инцидентах.
  • Admin: управляет сайтами, политиками и экспортами, включая правила хранения данных.

Границы прав особенно важны вокруг персональных данных и отчётности. Рано решите, кто может видеть телефоны, данные удостоверений или фотографии посетителей и кто может экспортировать историю посещений. Частое правило: ресепшен управляет потоком, служба безопасности видит текущее присутствие, а полные экспорты доступны только администраторам.

События, которые всегда нужно фиксировать

Думайте в терминах событий, а не только одной строки «визит», которая правится с течением времени. Это моменты, которые пригодятся для проверок и отладки:

  • Check-in completed (временная метка, устройство, сайт)
  • Badge issued (ID бейджа, значение QR, кем напечатан)
  • Host notified (каканал, статус доставки)
  • Safety answers submitted (какой набор вопросов или версия была показана)
  • Check-out (кто отметился, как, когда)

Сделайте критические события аудируемыми и добавляемыми (append-only). Разрешайте ограниченные правки только в полях, которые часто вводятся с ошибками (правописание имени, компания), и фиксируйте, что изменили и кто это сделал.

Основная модель данных: посетители, визиты, бейджи и сайты

Надёжная система начинается с чистой модели. Ключевая идея — отделить человека от события его прихода. Повторный посетитель остаётся одной записью, а каждое прибытие становится новым визитом.

Начните с двух основных таблиц: Visitors и Visits.

  • Visitor — это человек (имя, телефон, email, компания, опционально фото или пометка по документу).
  • Visit — отдельный случай прихода (дата, цель, с кем встречается, куда направляется).

Один Visitor может иметь много Visits.

Добавьте Hosts и Sites, чтобы логи соответствовали работе бизнеса. Hosts — это сотрудники или арендаторы, которые получают оповещения. Sites представляют физические локации (HQ, Warehouse A). При необходимости позже можно добавить зоны (лобби, этаж, охраняемая зона), не ломая базу.

Таблицы, которые действительно нужны

Держите модель компактной:

  • Visitors
  • Visits
  • Hosts
  • Sites
  • Badges
  • Devices (киоск/планшет/принтер)

Бейджи должны привязываться к Visit, а не навсегда к Visitor. Это предотвращает путаницу при повторном использовании запасов бейджей, утере или двойной печати.

Статусы и временные метки, говорящие правду

Визитам нужны временные метки и статус, который соответствует тому, что говорят сотрудники вслух. Храните как минимум created_at, checked_in_at, checked_out_at и canceled_at (или флаг отмены). Сопоставьте это с понятными статусами: scheduled, arrived, checked_in, checked_out, no_show, canceled.

Пример: кто‑то запланирован на 10:00, приходит в 9:55 (статус: arrived), затем проходит вопросы и получает QR‑бейдж (статус: checked_in). Если уходит без чек‑аута, у вас всё равно будет checked_in_at, и вы сможете позже очистить это по правилу.

Вопросы безопасности: как моделировать шаблоны и ответы

Вопросы по безопасности помогают только если историю можно доверять позже. Частая ошибка — хранить ответы в профиле посетителя, что перезаписывает прошлые ответы. Рассматривайте вопросы как шаблоны, а ответы — как записи на уровне визита, чтобы каждый чек‑ин сохранял собственный снимок.

Простая структура работает хорошо:

  • Шаблон вопроса (Question Template) определяет, что спрашивать.
  • Ответ на визит (Visit Answer) фиксирует ответ для конкретного визита.

Шаблоны вопросов vs ответы по визиту

Держите шаблоны стабильными и сохраняйте точный текст, который показан, вместе с ответом (или версию шаблона). Если вы измените формулировку позже, старые визиты всё равно будут показывать, что человек действительно видел.

Наборы вопросов позволяют показывать разные анкеты в зависимости от контекста: сайт, тип посетителя, временной интервал (временные правила), команда хоста или язык.

Типы ответов и флаги действий

Планируйте больше, чем да/нет. Распространённые типы: да/нет, короткий текст, подпись, фото и загрузка документа (например, страховой полис). Храните метаданные файлов (имя, тип, временная метка) и кто их собрал.

Добавьте флаг «action required» в шаблон и правило типа «если ответ YES, создайте тревогу по безопасности». Пример: «Вы везёте запрещённый предмет?» Если посетитель отвечает «Да», визит может перейти в состояние на рассмотрении и требовать одобрения перед печатью бейджа.

Оповещения хосту: триггеры, каналы и отслеживание доставки

Добавить рабочие оповещения
Триггерьте сообщения на события визита и сохраняйте статус доставки, чтобы не пропускать приезды.
Настроить оповещения

Оповещение хосту должно быстро отвечать на вопрос: «Нужно ли мне действовать сейчас?» Обычно это короткое сообщение с указанием, кто пришёл, где находится, зачем пришёл и нужно ли одобрение.

Что должно триггерить оповещение

Держите триггеры предсказуемыми, чтобы хосты им доверяли:

  • Гость зарегистрировался на ресепшене
  • Запланированный визит опаздывает на заданное время (например, 10 минут)
  • Ответ по безопасности породил флаг службы безопасности
  • Приход VIP (часто с другой приоритетностью)

Делайте триггеры управляемыми через данные: привязывайте их к сайту, типу визита и предпочтениям хоста, чтобы не хардкодить исключения.

Каналы, дедуп и трекинг

Используйте несколько каналов, но не отправляйте их все каждый раз. Хороший дефолт — один главный канал, плюс подсказка на экране ресепшена при ошибке доставки.

Держите правила простыми:

  • Dedupe key: (visit_id + trigger_type + host_id) в пределах короткого окна
  • Priority: normal vs urgent (для urgent можно пробовать второй канал)
  • Quiet hours: учитывайте рабочие часы хоста или сайта

Отслеживайте каждое уведомление как отдельную запись, чтобы можно было аудировать: храните статус (sent, delivered, failed), детали ошибок, количество попыток и время повторных попыток. Если сообщение не дошло, переходите к простому действию ресепшена, например «позвонить хосту».

Журналы ЧС: фиксируем присутствие на площадке, которому можно доверять

Запустить киоск и панель
Выпустите планшет-киоск и веб-приложение ресепшена из одной и той же модели данных.
Собрать приложения

Журнал экстренных событий — это не обычная запись визита. Это привязанный ко времени снимок, на который можно опереться во время учений, эвакуаций или реального инцидента, даже если кто‑то потом забудет чек‑аут.

Определите типы записей и правила заранее. Учение может быть запланировано и запущено сотрудниками. Инцидент может быть создан допущенными пользователями и затем подтверждён лидом по безопасности. Привязывайте каждое событие ЧС к сайту (и опционально к зоне), чтобы можно было ответить на вопрос: «Кто должен быть здесь прямо сейчас?»

Для каждой записи в журнале ЧС фиксируйте минимальные поля, которые делают запись надёжной:

  • Тип события, сайт и опционально зона
  • Время начала, время окончания и статус (open, closed)
  • Кто был на объекте на момент старта (посетители, подрядчики, сотрудники)
  • Подтверждения (кто подтвердил, когда и с какого устройства)
  • Идентификатор актёра для каждого изменения (создано кем, закрыто кем, отредактировано кем)

Держите эти записи добавляемыми. Если кто‑то исправляет имя или помечает человека как безопасного, создавайте новое действие с временной меткой вместо перезаписи старых значений.

Самая быстрая фича — однонажатийный список «Current onsite list», который собирает все активные визиты по сайту и замораживает их в событии ЧС. Сделайте это удобным при напряжении: крупный печатный вид, экспорт в CSV/PDF и фильтр по зонам и «неподтверждённым».

Шаг за шагом: итоговый поток регистрации и ухода

Поток должен работать как для пришедших без регистрации, так и для предварительно зарегистрированных, и оставлять чистый след: кто пришёл, кто одобрил, кто ещё на объекте и когда ушёл.

Чек-ин (от приглашения до бейджа)

Если возможно, начните до прихода посетителя. Предрегистрация создаёт Visit, привязанный к человеку, сайту, хосту и окну времени. Затем отправьте QR‑код, привязанный к конкретному визиту, чтобы ресепшен не гадал.

В киоске посетитель сканирует QR или ресепшен ищет по имени, компании или телефону. Покажите быстрое подтверждение личности (например, полное имя и компания) прежде чем продолжать, чтобы случайный «John S.» не был отмечен по ошибке.

Далее соберите вопросы по безопасности и подтверждения. Сохраняйте каждый ответ как отдельную запись с временной меткой и точной формулировкой, которая была показана.

После прохождения обязательных проверок выдайте бейдж и оповестите хоста. Бейдж должен содержать уникальный QR‑токен, сопоставленный с активным Visit, а не с человеком. Затем отправьте оповещение хосту и сохраните статус доставки, попытки и (если есть) подтверждение прочтения.

Чек‑аут (включая авто‑чек‑аут)

Чек‑аут должен быть так же быстрым: скан бейджа QR, подтверждение визита и установка check_out_time.

Для пропущенных чек‑аутов используйте правило конца дня для сайта, которое помечает визиты как авто‑чек‑аут и логирует причину. Это делает счётчик присутствующих более надёжным.

Пример сценария: визит подрядчика с флагом по безопасности

Настроить роли и права
Определите доступ для ресепшена, хоста, службы безопасности и администратора без написания кода.
Создать роли

Подрядчик по имени Jordan приходит на 20 минут раньше, чтобы обслужить HVAC. На ресепшене Jordan сканирует QR в киоске (или ему выдают один, если это первый визит). Система создаёт новый Visit, привязанный к сайту, ожидаемому хосту и ID бейджа.

Во время чек‑ина Jordan отвечает на короткий набор вопросов по безопасности. Один из вопросов: «Делали ли вы горячие работы за последние 24 часа?» Jordan выбирает «Да». Этот ответ помечается флагом, поэтому статус визита становится «Pending approval» вместо «Checked in». Временная метка и точная формулировка вопроса и ответа сохраняются в визите.

Ресепшен видит три понятных опции:

  • Разрешить вход (переопределить с указанием причины)
  • Отказать во входе (записать причину)
  • Попросить одобрение хоста (рекомендуется при флагах)

Если запрошено одобрение, хосту сразу приходит уведомление с информацией, кто ждёт, почему он помечен, где находится и кнопками решения (approve или deny). Хост также видит короткую историю визитов, например дату последнего визита и были ли предыдущие флаги.

После одобрения визит переключается в «Checked in», и бейдж становится активным. При уходе ресепшен (или сам Jordan в киоске) оформляет чек‑аут. Приложение фиксирует время ухода, статус возврата бейджа и короткую заметку типа «Заменён фильтр HVAC. Проблем не выявлено.» Если бейдж не возвращён — это тоже фиксируется.

Частые ошибки, приводящие к плохим логам и пропущенным оповещениям

Плохие данные обычно начинаются с одной упрощённой логики в потоке. Система полезна ровно настолько, насколько полезен аудиторский след при вопросе «Кто был здесь, когда и кто это одобрил?»

Частая ошибка — смешивать идентичность посетителя и историю визитов. Человек должен оставаться стабильным во времени, а каждое прибытие — отдельной записью. Если вы перезаписываете поле «текущий визит» в профиле посетителя, вы теряете возможность аудита повторных визитов, хостов, ответов по безопасности и перевыпусков бейджей.

QR‑коды — ещё одна ловушка. Если код никогда не истекает, он превращается в многократный пропуск и может быть скопирован с фото. Рассматривайте QR как короткоживущий токен, привязанный к выдаче бейджа и визиту, и инвалидируйте его при чек‑ауте.

Правки без трассировки тихо рушат доверие. Если сотрудники могут менять прошлые ответы по безопасности, храните, кто что и когда изменил, и предыдущее значение.

Отключение киоска не должно превращаться в «пропустите их без записи». Планируйте запасной вариант: поток через телефон сотрудника, бумажный бланк для последующего ввода или офлайн‑режим, который синхронизируется при восстановлении.

Причины пропущенных оповещений часто лежат в реальной жизни:

  • Несколько сайтов в одной базе без явного поля Site на визитах и бейджах
  • Несколько хостов для одного визита (первичный хост, резервный, общая команда)
  • Замена хоста в ходе визита без логирования переназначения

Быстрая проверка перед запуском

Уведомлять хостов через мессенджеры
Отправляйте уведомления хостам по email, SMS или Telegram с помощью встроенных модулей.
Добавить сообщения

Это работает только если данные остаются последовательными в загруженные дни. Прежде чем ставить на фронт‑деск планшет, проведите тест «хаотичный день»: множество одновременных приходов, утерянный бейдж и хост, который не отвечает.

Начните с записи визита. Каждый визит должен иметь один понятный статус (pre-registered, checked-in, checked-out, denied, canceled) и временные метки, соответствующие реальности. Если кто‑то начал чек‑ин и ушёл, решите, что происходит через 5–10 минут: авто‑истечение попытки или оставить как «started», но не отмеченным на площадке.

Проверьте жизненный цикл бейджа от и до. QR‑бейдж должен легко проходить аудит: когда он был выдан, когда стал активен и когда возвращён или истёк. Если бейдж перевыпечатан, немедленно инвалидируйте старый QR, чтобы не получилось двух «активных» бейджей для одного визита.

Короткий чек‑лист достаточен:

  • Экспорты соответствуют тому, что видят сотрудники на экране (по счёту, диапазону дат, фильтрам по сайту и хосту).
  • Повторная отправка оповещения не создаёт дубликатов.
  • Содержимое оповещения полезно (имя посетителя, сайт, хост, флаги безопасности).
  • Сбои доставки видны (sent, delivered, failed) и повторы безопасны.
  • Учение может дать список присутствующих за менее чем две минуты.

Экспортируемая история посетителей: отчёты, хранение и аудиторский след

Подготовиться к учениям
Зафиксируйте моментальный снимок присутствующих по сайту и отслеживайте подтверждения под давлением.
Создать учение

Экспорты — это место, где система регистрации становится действительно полезной для соответствия требованиям, расследований и простых вопросов типа «Кто был во вторник в 15:00?» Решите заранее, что является «истиной», потому что экспорт будут воспринимать как официальный журнал.

Поддерживайте, как минимум, CSV и XLSX. CSV лучше для аудитов и импортов. XLSX удобнее для многих не‑технических команд.

Определите стабильный набор полей и соблюдайте их смысл со временем. Практический минимум включает:

  • Visit ID (уникальный и никогда не переиспользуемый)
  • Идентичность посетителя (имя плюс стабильный ключ посетителя)
  • Сайт и хост
  • Временные метки чек‑ина и чек‑аута (с часовым поясом)
  • Идентификатор бейджа (значение QR или номер бейджа)

Держите правило «кто может экспортировать» жёстким. Обычно ресепшен может видеть список на сегодня, служба безопасности — экспортировать диапазон дат, а админы — всё. Рассматривайте экспорт как отдельное право, а не как «просмотр визитов».

Правила хранения, которые выдерживают реальную жизнь

Пишите правила хранения простым языком, чтобы их соблюдали последовательно. Типичные правила: хранить полные логи визитов 12–24 месяца, анонимизировать личные данные по истечении периода (сохраняя при этом суммы и временные метки), хранить журналы ЧС дольше по политике и никогда не удалять аудиторские следы, даже если вы анонимизируете посетителя.

Аудиторский след и запросы на удаление

Добавьте поля аудита к каждой записи визита (created_by/at, edited_by/at) и к действиям по экспорту (exported_by/at, export_scope, file format, row count).

Для запросов на удаление избегайте жёстких удалений, которые ломают отчёты. Более безопасный подход — «privacy delete»: обнуляйте или хешируйте персональные поля (имя, email, телефон), сохраняя при этом Visit ID, временные метки, сайт, хост и коды причин, чтобы отчётность оставалась целостной.

Следующие шаги: превращаем план в рабочее приложение

Превратите модель в три фокусных экрана: киоск для чек‑ина (быстро, крупные кнопки), панель ресепшена (сегодняшние приходы, оверрайды, перевыпуски) и вид хоста (кто идёт, кто на площадке, кто требует внимания). Когда у каждого экрана одна задача, люди с меньшей вероятностью будут обходить процесс.

Потом привяжите автоматизацию к событиям, а не к нажатию кнопок. Каждое изменение статуса должно быть тем, на что можно опереться: создан, checked in, бейдж выдан, хост уведомлён, checked out и помечен как ушедший при учении. Так оповещения будут срабатывать даже если разные сотрудники используют разные устройства.

Первый релиз, часто достаточный для запуска, включает один сайт, один киоск, панель ресепшена, создание и перевыпуски QR‑бейджей, базовые оповещения хостов с трекингом доставки, вопросы по безопасности с одним правилом проверки и экспорт истории посетителей по выбранному диапазону дат.

Если вы хотите строить без кода, платформа вроде AppMaster (appmaster.io) может помочь настроить модель базы данных, рабочие процессы и несколько интерфейсов (киоск, веб, мобильный) вокруг одного источника истины. Начните с малого, пилотируйте в одном лобби, затем масштабируйте, когда логи и оповещения останутся согласованными в реальных условиях стойки регистрации.

Вопросы и ответы

Сколько времени должен занимать чек-ин в хорошей системе?

Старайтесь укладываться в одну минуту для большинства посетителей. Оставьте «зелёный путь» в три шага: идентификация визита (скан QR или быстрый поиск), ответы на обязательные вопросы, затем печать бейджа и уведомление хоста. Исключения (исправление опечаток, одобрения, перевыпуски) оставьте для экрана ресепшена, чтобы киоск оставался быстрым.

Хранить данные посетителя в записи визита или отдельно в профиле?

Отделяйте человека от визита. Храните стабильную запись Visitor (данные личности и контакты) и создавайте новую запись Visit для каждого прихода, чтобы можно было аудитировать временные метки, хостов, ответы и выдачи бейджей без перезаписи прошлой истории.

Как предотвратить повторное использование или копирование QR-бейджей?

Рассматривайте QR-коды как короткоживущие токены, привязанные к конкретной выдаче бейджа и конкретному визиту. Инвалидируйте токен при чек-ауте и также при перевыпуске бейджа, чтобы у одного визита не было двух активных бейджей.

Какие события нужно логировать, чтобы аудиты и расследования были надёжными?

Используйте добавляемые события для моментов, которые понадобятся позднее: завершённый чек-ин, выдача бейджа, уведомление хоста, сохранённые ответы на вопросы по безопасности и чек-аут. Когда кто-то исправляет опечатку (например, имя), фиксируйте кто изменил, когда и каково было старое значение.

Кто должен иметь право просматривать и экспортировать историю посещений?

Начните с простых ролей: посетитель, хост, ресепшен, служба безопасности и админ. Жёстко ограничьте права на экспорт; хорошая отправная точка — ресепшен управляет сегодняшним потоком, служба безопасности видит текущих присутствующих, а полные экспорты доступны только администраторам.

Как моделировать вопросы по безопасности, чтобы история не портилась?

Храните вопросы как шаблоны и ответы на уровне визита, включая точную формулировку или версию шаблона. Тогда если вы измените вопросы позже, старые визиты всё равно будут показывать, что именно видел и ответил посетитель.

Как не задолбать хостов уведомлениями, но при этом гарантировать доставку?

Фиксируйте уведомления как отдельные записи со статусами «sent», «delivered», «failed» и деталями попыток повторной отправки. Используйте правило дедупа, например одно уведомление на хоста по одному типу триггера для визита в коротком окне, и имейте явную резервную процедуру при неудаче доставки (например, подсказка ресепшен звонить хосту).

Как быстро собрать надёжный список присутствующих при экстренной эвакуации?

Журнал экстренных событий должен «замораживать» снимок присутствующих в момент учения или инцидента, даже если кто‑то позже забудет чек-аут. Создайте событие emergency для сайта, копируйте туда все активные визиты на тот момент и фиксируйте подтверждения и изменения как новые метки времени, а не правки по месту.

Как поступать с посетителями, которые забыли отметиться при уходе?

Используйте предсказуемое правило конца дня для каждого сайта, которое помечает оставшиеся активными визиты как авто-чек-аут и записывает причину. Сохраняйте исходное время чек-ина и чётко видно в логах, что это авто-чек-аут, чтобы не было ощущения, что человек ушёл раньше времени.

Что должно войти в первый релиз приложения для регистрации посетителей?

Начните с одного сайта, одного киоска и панели ресепшена. Включите печать QR-бейджей и перевыпуски, базовые оповещения хостов с отслеживанием доставки, небольшой набор вопросов по безопасности с одним правилом проверки и чистый экспорт CSV/XLSX по диапазону дат, а затем расширяйтесь, когда логи останутся корректными в рабочие дни.

Легко начать
Создай что-то невероятное

Экспериментируйте с AppMaster с бесплатной подпиской.
Как только вы будете готовы, вы сможете выбрать подходящий платный план.

Попробовать AppMaster