Опознание звонящего перед открытием
Панель умеет открыть любую ячейку любого постамата. Пока единст венным условием была «причина текстом», процедура выглядела так: человек звонит, говорит «я из ячейки семь, откройте», оператор пишет «клиент попросил» и открывает. Опознания в этом нет вообще — достаточно позвонить и назвать номер ячейки.
Поэтому перед удалённым открытием панель просит опознать звонящего. Приём неочевидный, и сделать его иначе нельзя.
Сначала найти аренду — и поиск идёт по всем шкафам
Звонящий обычно не знает, у какого шкафа он стоял: он знает адрес улицы и номер на дверце. Поэтому на «Арендах и кодах» поиск по умолчанию идёт по всему парку, а не по шкафу, выбранному наверху. Над формой стоит переключатель «Где искать»: «во всех шкафах» и «только в выбранном вверху».
⛔ Раньше поиск всегда шёл по выбранному шкафу, и сказано об этом не было нигде. Звонок «я не знаю, у какого шкафа стоял» заканчивался ответом «ничего не нашлось» — неотличимым от «такой аренды нет».
Что из этого следует в разговоре:
- «Ничего не нашлось» — это утверждение, и цена у него разная. При поиске по всему парку оно значит «такой аренды нет ни у одного шкафа», и вот тогда названный клиентом номер — повод насторожиться. При суженном поиске оно не значит почти ничего: у соседнего шкафа аренда могла бы найтись. Панель пишет это прямо под пустым ответом, и при суженном поиске там же стоит кнопка «Искать по всем шкафам» — одно нажатие, а не набор заново;
- у каждой находки первым полем написан постамат, раньше ячейки — а ⛔ до 6 сентября шкафа на карточке не было вовсе. Это не мелочь оформления: подпись «26» есть у каждого шкафа парка, и без имени шкафа она половина адреса;
- аренда чужого шкафа помечена громко: «Эта аренда НЕ у выбранного вверху постамата, а у «имя»». Прежде чем открывать дверцу или называть адрес — убедитесь, что клиент стоит именно у этого шкафа;
- если список шкафов не приехал, панель так и говорит: «НЕ МОЖЕТ сказать, тот ли это шкаф», и показывает хвост идентификатора вместо названия. Отсутствие пометки «чужой» в этом случае означает «не знаем», а не «ваш».
🔴 Код при этом всегда выпускается в шкаф самой аренды, а не в выбранный наверху, — ошибиться можно не кодом, а тем, куда вы отправите человека. Обнаружит эту ошибку клиент, стоящий у чужой закрытой дверцы.
⚠️ Редкий отказ, который стоит узнать в лицо. Поиск по имени сверяет имена по одному, поэтому у него есть потолок: если под запрос подходит больше двух тысяч аренд (весь парк да ещё и со снятой галкой «только действующие»), сервер отвечает отказом, а не обрезанным списком — «ничего не нашлось» тут было бы неправдой.
✅ И панель этот отказ объясняет своими словами, а не общей фразой. На экране стоит: «Под этот поиск по имени подходит слишком много аренд, и сервер отказал целиком: обрезанный список показал бы «ничего не нашлось» про человека, который стоит у шкафа. Сузьте отбор: в «Где искать» выберите «только в выбранном вверху» либо верните гал ку «только действующие». Если знаете номер аренды или телефон — уберите имя и ищите по ним: у них потолка нет». Делать по ней ровно то, что написано, — она называет подписи, которые на экране есть. На пилоте с сотней аренд этого не случится вовсе.
⛔ Здесь стояло два утверждения, и оба устарели 6 сентября.
- «🔴 На экране при этом сегодня видна общая фраза «Сервер не принял запрос.» — своих
слов у панели для этого отказа пока нет». Слова появились (строка
name_search_too_wideвapps/panel/src/lib/api/result.ts), и оставленная запись работала бы наоборот задуманного: оператор читает на экране подробный разбор, сверяется с руководством, видит «панель скажет общую фразу» — и решает, что перед ним что-то другое, не тот отказ, про который здесь написано. - Рычаг назывался галкой «только активные». Такой подписи на экране НЕТ вовсе — галка называется «только действующие». Это хуже первой ошибки: руководство отправляло оператора искать несуществующую галку, и происходило это в разговоре с человеком, который стоит у шкафа и ждёт.
🔴 Сверка вслепую: порядок нельзя менять местами
У каждого выданного кода в системе хранятся последние две цифры — только для разговора по телефону, чтобы понять, о каком из кодов речь.
Оператору эти две цифры не показываются никогда: ни до сверки, ни после.
Порядок ровно такой:
- Вы спрашиваете: «назовите последние две цифры вашего кода».
- Вводите в панель то, что услышали.
- Панель отвечает: «сошлось» или «не сошлось».
Соблазн велик, а результат обратный. Увидев на экране «…34», оператор спрашивает: «ваш код заканчивается на тридцать четыре?» — и звонящий отвечает «да». Проверки не произошло, произошла подсказка. Именно поэтому цифр нет на экране, и в панели они не появляются никаким способом: значение, которого нет в ответе, невозможно случайно вывести.
Что означает ответ панели
| Ответ | Что это значит | Что делать |
|---|---|---|
| Сошлось, код годен | это тот самый человек, и его код действует | можно открывать |
| Сошлось, код просрочен или отозван | человек опознан верно, а вот его код уже не работает | открыть можно: человек тот самый. Но выпустите ему новый код, а не открывайте руками каждый раз |
| Не сошлось | названные цифры не подходят ни к одному коду этой аренды | 🔴 не открывать |
| Сверять не с чем | у аренды нет ни одного кода | не открывать, эскалировать |
Сверка идёт со всеми кодами аренды, включая отозванные и просроченные, и это намеренно: человек с протухшим кодом — всё ещё тот самый человек, и опознан он правильно. А годность показывается отдельно, чтобы «сошлось» не превращалось в разрешение открыть.
⚠️ Во второй строке здесь стояло «открывать по этому коду нельзя», и это уводило не туда.
Речь про клиента: его собственный код у клавиатуры уже не сработает. А оператору панель
в этом случае открыть разрешает и прямо советует выпустить новый код вместо ручных
открытий каждый раз (apps/panel/src/lib/rentals/identify.ts, ветка match при
usable: false: кнопка доступна, рядом предупреждение). Отправлять человека «разбираться
с арендой» и не открывать — значит держать его у шкафа дольше, чем нужно.
🔴 Выпустили новый код — не кладите трубку сразу. На шкафу он появится не в момент выпуска, а когда шкаф в очередной раз придёт за новостями; до тех пор клавиатура ответит на него «код не найден» — тем же ответом, что на выдуманный код, и человек решит, что его обманули. Смотрите столбец «У шкафа» в таблице кодов: вести человека к дверце можно на подписи «код у шкафа», а «шкаф молчит» означает, что ждать бесполезно. ⛔ До 7 сентября панель на этот вопрос не отвечала ничем, и оператор считал минуты по часам на стене. Разбор всех пяти подписей — код клиента и блокировка.
Сверка вслепую — не единственный способ, и это надо знать заранее
Опознание в панели — обязательное поле со списком, а не свободная строка, и способов
там шесть (packages/contracts/src/panel-ops.ts, identificationMethodSchema):
| Способ | Когда годится |
|---|---|
| назвал последние две цифры кода | разговор по телефону — то, что описано выше |
| назвал номер аренды из письма или SMS | тоже разговор, но номер уезжал клиенту вместе с кодом — см. оговорку в ошибке в аренде |
| перезвонили на номер из аренды | самый надёжный: позвонить можно с любого номера, ответить на чужой — нет |
| человек рядом, показал документ | сверяете имя в документе с именем в аренде |
| это наш сотрудник или техник | только для служебных открытий; «свой» не проверяется ничем |
| опознать не удалось | открытие под вашу ответственность |
🔴 Открытие без опознания панель не запрещает — и это решение, а не дыра. Запрет был бы фикцией: у оператора бывают законные причины (дверцу заклинило, приехал курьер, идёт объезд), и панель, которая говорит «нельзя», получает в ответ обходной путь. Вместо запрета — обязательное объяснение не короче десяти знаков и отдельная пометка в аудите: такие открытия разбирают потом поимённо.
🔴 И вот чего на этой странице не хватало: окно ОТКРЫВАЕТСЯ на способе «назвал последние
две цифры кода». Это значение по умолчанию
(apps/panel/src/components/open-cell-dialog.tsx, useState<IdentificationMethod>('code_hint')).
Значит при открытии не по звонку — заклинило дверцу, приехал курьер, техник у шкафа,
идёт объезд — вы увидите серую кнопку «открыть» и просьбу ввести две цифры звонящего,
которого нет. Это не поломка: смените способ в списке на «человек рядом», «наш
сотрудник» или «опознать не удалось». Выдумывать две цифры за несуществующего звонящего
нельзя — см. следующий абзац.
⚠️ Одно место, где запрет всё-таки жёсткий: выбрали «назвал две цифры» — цифры обязаны сойтись. Не сошлись — кнопка «открыть» не работает, и надо либо выбрать другой способ, либо отказать. Иначе в аудите осталась бы запись «опознан по коду» о человеке, который код не назвал, — это хуже честного «опознать не удалось»: она врёт.
🔴 Код не диктовать. Никогда
В обычной работе полного кода в панели нет ни в каком виде — его нет даже в данных, которые панель получает: в системе лежит только отпечаток и две последние цифры. Это сделано специально.
Оператор, который «помог» клиенту, назвав ему код, открыл шкаф кому угодно. Человек на том конце провода может оказаться не тем, за кого себя выдаёт, — именно поэтому и существует сверка вслепую.
Если клиент потерял код — код перевыпускается, а не диктуется.
⚠️ Здесь стояло «полного кода нет НИ В КАКОМ ВИДЕ» без оговорок. Это больше не вся правда.
Для показов заведён режим имитации SMS: код уходит «сообщением» в ящик внутри системы, и раздел «SMS (имитация)» показывает этот ящик — с кодо м, читаемым глазами. Это единственное место во всей системе, где код виден человеку из панели, и сделано оно осознанно: без него единственным способом довести код до гостя было открыть журнал сервера и назвать код голосом.
Что из этого следует лично вам:
- раздела у вас, скорее всего, нет. Он требует отдельного права, и у роли оператора его нет — только у администратора;
- каждое чтение ящика записывается в журнал обращений к персональным данным, поимённо;
- на боевом шкафу режим включать нельзя. Не «некрасиво»: включённый, он превращает оператора в человека, знающего все коды, — а звонящего опознать по-прежнему нечем. Правило «код не диктовать» от этого не смягчается, оно становится единственной защитой;
- выключение режима стирает ящик немедленно, вместе с лежащими там кодами.
🔴 Ящик один на весь парк, и с 7 сентября каждая строка называет шкаф. Это не украшение: выбор шкафа в шапке панели сюда не переносится, сообщения всех шкафов лежат вперемешку, а внутри — открытые коды. Раньше в строке стояли только телефон, текс т и номер аренды; номером шкаф не назовёшь — это двадцать шесть знаков, да ещё и повторяющиеся у разных шкафов. Две неотличимые строки с двумя разными кодами означают ровно одно: названный вслух код чужого клиента, и ошибки при этом не видно.
Теперь в строке стоит одно из четырёх, и читать их надо по-разному:
- «шкаф „Название“» — шкаф известен, строку можно сверить с арендой;
- «шкаф №…J7QK2M — в панели такого шкафа больше нет» — шкаф забыли уже после отправки. Сверить строку не с чем; хвост из шести знаков нужен, чтобы найти её в журнале;
- «проба из настроек, она не о шкафе» — это сообщение с кнопки «Отправить пробное», оно ни о каком шкафе и не сообщает;
- «отправлено до того, как ящик стал запоминать шкаф» — сообщение легло в ящик до 7 сентября. Связать его со шкафом задним числом не по чему, и додумывать нельзя. ⛔ Здесь стояло «шкаф не назван: сообщение старше этой пометки» — слова на экране изменились 7 сентября. Причина не в красоте: если шкаф у владельца один, эта подпись стоит у всего прежнего ящика сверху донизу, а «не назван» читается как поломка — на экране, где лежат открытые коды. Подпись говорит про возраст строки, а не про недостачу.
Что ещё требуется на открытие
- Второй фактор. Каждое удалённое открытие подтверждается одноразовым кодом из вашего приложения-аутентификатора. Причина простая: вход в панель был утром, а ноутбук с тех пор стоял в подсобке.
- Причина текстом. Она попадает в журнал и в аудит доступа. Пишите по делу: это то, что прочитает следующий дежурный или проверяющий.
Что происходит после нажатия «открыть»
Панель ставит команду в очередь, а не открывае т дверцу сию секунду. Постамат забирает команды сам, на очередном сеансе связи — обычно раз в минуту, — панель поэтому и пишет «команда поставлена в очередь».
⛔ Здесь стояло «и может быть без связи час или неделю» — как будто команда дождётся
шкафа в любом случае. Она не дождётся: срок годности у открытия пятнадцать минут
(apps/api/src/panel/postamats.service.ts, openCell). Шкаф, вернувшийся позже, эту
команду уже не получит. Для разговора по телефону это ровно тот срок, за который разговор
и заканчивается; шкафу, который лежит дольше, команду надо повторить.
Настоящее подтверждение — событие «ячейка открыта» в журнале. Подробнее — как открыть ячейку.