TLDR:
Всё плохо.
Преамбула:
На статью вдохновил ряд предыдущих заблуждений программистов о почтовых адресах, времени и именах.
Все примеры, указанные в статье, вымышлены; некоторые примеры приведены на основе выдачи поисковых запросов.
Кат с философским описанием.
В жизни некоторых программистов наступает момент, когда им ставится задача «Написать модуль работы с персональными данными пользователей». Причём, по традиции, желательно «ещё вчера». Задача на вид несложная, за пару часов до дедлайна программист нажимает кнопку «Деплой» и уходит на законные выходные. Утром в субботу телефон пиликает сообщением о новом письме: техподдержка открывает тикет «Настырный пользователь не может пройти регистрацию». Грустно вздохнув и отложив в сторону билеты на хоккей, программист проверяет полученные данные и садится за ноутбук. Так в проекте появляется первый костыль…
Описанное выше, конечно же, происходит в параллельной вселенной, было 20 лет назад и вообще, сейчас полный Agile. Но вдруг какой‑то из примеров будет вам полезен.
-
Документ удостоверяющий личность — только паспорт.
В законодательстве разных стран предусмотрен различный набор документов, по которым может быть идентифицирован человек: в Российской Федерации это паспорт гражданина, дипломатический паспорт, служебный паспорт, военный билет, временное удостоверение личности, удостоверение личности моряка и тд. Отказ в предоставлении услуг при непредоставлении паспорта может расцениваться как жестокое нарушение Конституционных прав пользователя.
Если ваш софт планирует пересечь наземные границы и будет использоваться в других странах, дополнительно запланируйте широкий ассортимент поддерживаемых документов: ID‑карта (Узбекистан, Казахстан, Армения), водительское удостоверение (Узбекистан), удостоверение беженца (Казахстан), свидетельство на возвращение (Казахстан, Армения).
Если в вашем софте ожидается регистрация иностранцев, сюда же добавляются загранпаспорта по стандарту ICAO. Причём, если чётко следовать букве законодательства, загранпаспорта являются документами удостоверяющими личность гражданина, находящегося за пределами родины.
Возможный выход — определить наиболее востребованные кейсы и волевым решением ограничить круг потенциальных клиентов и их документов.
-
Серия и номер паспорта в базе всегда уникальны.
Первый попавшийся пример: если судить по картинкам в интернете, паспорт с серией‑номером вида «8 цифр» может быть и у гражданина Израиля, и у гражданина Чехии. Соответственно, можно ожидать коллизий в случае использования системы гражданами обеих стран.
Если добавить возможность регистрации по иным документам, удостоверяющим личность, и включить поддержку старых (предыдущих) версий документов, проблемы дублирования в базе гарантированы.
-
У документов всегда последовательный номер, если есть паспорт c номером AB1234567, где-то есть паспорт с номером AB1234568.
Паспорта могут аннулироваться в связи с ошибкой при выдаче.
«Красивый» номер вида «шесть семёрок» может быть сгенерирован разово по просьбе, высказанной с должным уважением и его «соседи» появятся лет через 5.
-
Серия и номер документа всегда соответствует требованиям (шаблону).
Паспортизация — важный элемент любого государства, поэтому с практически 100% вероятностью так и будет. «Но есть нюанс» ©: «шаблон» для серии и номера документа различен. Серия и номер паспорта Российской Федерации состоит из 10 цифр, паспорта Камеруна — из 7. В Беларуси первыми идут две латинские буквы (обозначение региона), в Узбекистане серия состоит из латинских букв, которые последовательно увеличиваются при достижении всех девяток в номере: AA, AB, AC. Сюда же добавим поддержку иных видов документов (удостоверение моряка, водительское удостоверение).
-
Серия и номер паспорта всегда написаны правильно.
При интеграции систем или обогащении данных могут возникнуть ошибки, когда введённые вручную «...адцать лет назад» данные некорректны. И если с ошибками вида «буквы на кириллице вместо латиницы», «лишние пробелы» ETL системы справляются достаточно хорошо, то недостающие или лишние цифры‑буквы становятся большой проблемой. Решение остаётся на получателе данных: принимать некорректные данные в надежде когда‑нибудь их исправить или игнорировать, уменьшая реальное количество записей.
Знакомые рассказывали, что в одном кейсе интеграции систем «мусорными« были 60% данных.
-
Дата выдачи паспорта всегда в прошлом.
Если не рассматривать человеческий фактор и вариант «наша система работает в виртуальной машине, на которой сбилась дата», можно предположить теоретическую ситуацию «Человек получает загранпаспорт на Чукотке и сразу пересекает Берингов пролив на Аляску с паспортом, выданным Завтра».
-
У паспорта всегда есть срок действия.
Нет, старшее поколение обычно не нуждается в замене паспорта.
-
Дата рождения всегда валидна.
В зависимости от законодательства страны могут быть ситуации, разрешающие некорректную дату в паспорте. Например, если известен только год рождения, а архивные документы утрачены (актуально для старшего поколения), день и месяц могут заменяться нулями.
Стандарт ИКАО позволяет заменять «иксами» недостающие части дат. Автор лично встречал в строке «Дата рождения» значения «00.00.1940» и «ХХ.ХХ.1965». Сумеет ли ваша программа грамотно их распарсить и записать в базу? Большой вопрос.
-
Дата рождения всегда в прошлом.
Частный случай пункта 8 — если неизвестен даже год рождения, могут быть выставлены любые значения, стандартные для данного софта. В одной крупной программе встречал значение по умолчанию для года рождения 9999. При этом в самой программе предусмотрена обработка подобных событий. Но если данные начинают передаваться в другую систему, может возникнуть интересный казус.
-
Пол пользователя не может измениться в процессе использования данных.
Может.
10.1. ОК, пол не может измениться в странах, где такое запрещено законодательством.
Крайне редкие медицинские случаи: родился ребёнок с признаками обоих полов. При первой персонализации родители записали ребёнка девочкой (например). Ближе к половому созреванию визуально стали больше проявляться признаки мужского пола. В таких случаях пол будет изменён.
10.2. Пол всегда определён.
Если рождается ребёнок с признаками обоих полов и погибает до первой персонализации, в медицинском софте его пол может быть указан как «неизвестный».
-
В официальном документе, удостоверяющем личность, всегда актуальная информация.
Простой пример: девушка вышла замуж, сменила фамилию и поменяла паспорт. Затем на основании нового паспорта она поменяла водительское удостоверение. В промежутке между этими событиями у неё два актуальных документа, подтверждающих личность, выданных на разные фамилии.
-
Документ, удостоверяющий личность, всегда является актуальным.
Выдуманный пример из банковской сферы: в понедельник гражданин З. подаёт заявление об утере паспорта, платит штраф. Во вторник гражданин З. приходит в банк и берёт кредит на «утерянный паспорт».
И начинается долгая судебная история, в ходе которой гражданин З. утверждает, что никакого кредита он не брал, а это всё мошенники, которые пытаются опорочить его честное имя.
Логичный выход: проверять в центральных базах статус документа.
-
В момент использования софта пользователь жив.
Кто-то может воспользоваться чужой учётной записью и после смерти владельца учётки.
Кто-то из родственников/друзей может попытаться вывести деньги с пластиковой карты усопшего через системы интернет-банкинга.
Кто-то должен получить результаты выполнения «долгоиграющих» заявок пользователя и после его смерти.
В центральных базах может быть ошибочно отмечено, что пользователь покинул наш бренный мир, соответственно пользователь не может получить банковские или иные услуги. Можно даже провести конкурс на самое лучшее сообщение пользователю о том, что он не может получить желаемый доступ по причине того, что мы считаем его мёртвым. Мой фаворит: «Zombies are not allowed in our system».
-
У пользователя всегда есть валидное гражданство.
Лица без гражданства передают большой и пламенный привет.
-
У пользователя всегда есть валидное гражданство или отметка ЛБГ.
После распада СССР был достаточно большой промежуток времени, в течение которого жители могли поменять свой паспорт на паспорт нового государства. То есть в тот момент это были граждане несуществующей страны.
И даже после истечения сроков замены представители старшего поколения (особенно в отдалённых деревеньках) не спешили принять гражданство той или иной страны.
Другой пример из современности: Республика Косово отсутствует в списке государств ISO-3166, но на практике коды KS и RKS используются.Дополнительно см. список частично признанных государств.
-
Всегда есть валидное место рождения.
В дополнение к предыдущему пункту: место рождения может быть не валидным в текущий момент: населённый пункт переименован, упразднён.
Исключительно чтобы не плодить лонгриды, на этом предлагаю остановиться. В других статьях продолжу про типичные заблуждения, связанные с ФИО и идентификаторами пользователей.
Комментарии (34)
sunnybear
02.02.2023 08:30В РФ по решению Верховного суда N ГКПИ06-1016 от 8 ноября 2006 года водительское удостоверение содержит все необходимые реквизиты, которые позволяют удостоверить гражданина и его личность.
Germanjon Автор
02.02.2023 08:32А на практике можно ли получить полный спектр государственных/частных услуг без предъявления паспорта, а при помощи водительского удостоверения?
vadimr
02.02.2023 08:44+4Это решение носит частный характер, и отмечает возможность использования водительского удостоверения только для удостоверения личности водителя при остановке транспортного средства инспектором ГИБДД. В чём как бы никто и не сомневался.
Там фабула рассматриваемого дела была совсем другая, истец безуспешно пытался отменить приказ МВД.
А некоторые поверхностные журналисты сделали далеко идущие неверные выводы.
Список документов, удостоверяющих личность гражданина РФ, установлен указом Президента, там в целом юридически всё прозрачно. Но, как верно заметил автор статьи, на практике встречаются частности. Прежде всего потому, что никто не гарантирует, что заполнение базы было выполнено с полным соблюдением требований законодательства.
sunnybear
02.02.2023 09:16Вариантов удостоверения личности по водительскому немного больше, чем просто проверка ГИБДД. Но есть определённые проблемы с получением ряда услуг по нему. Поэтому, де-юро, водительское можно предъявлять, но де-факто гарантии оказания услуг по нему нет.
vadimr
02.02.2023 10:14+3Де-юре для установления личности водительское удостоверение предъявлять нельзя, кроме как в контексте вождения. Но какие-то организации могут счесть этот документ достаточным для своих целей. Не всем из них нужно собственно устанавливать личность.
Например, чтобы продать алкоголь в магазине, устанавливать личность покупателя не требуется, а для подтверждения возраста водительское удостоверение вполне подходит.
vadim_bv
02.02.2023 16:04Если говорить про банки, то водительское удостоверение документом, удостоверяющим личность, не является. См примечание на странице www.cbr.ru/ckki/ckki_list
Я делал несколько систем для всяких ПОД/ФТ и БКИ, там в списке ДУЛов его нет.
ValeryGL
02.02.2023 08:39+3Прекрасное. Минимум шестнадцать раз рука поднималась написать комментарий "а у меня был похожий случай..." :))
Подписался, жду продолжения про имена
Markscheider
02.02.2023 09:11+3проверять в центральных базах статус документа.
Про гражданина З.
А вы уверены, что прямо на следующий день после подачи в МВД заявления об утрате паспорта, его статус в центральных базах изменится?
Germanjon Автор
02.02.2023 09:23Не уверен, ибо с точки зрения МВД, гражданин может на следующий день благополучно найти свой паспорт.
С точки зрения банка, это уже зона ответственности МВД, чтобы ему предоставлялась актуальная информация.
С точки зрения мошенника, это не до конца урегулированная законодательная область, которой можно бы воспользоваться.Markscheider
02.02.2023 10:29с точки зрения МВД, гражданин может на следующий день благополучно найти свой паспорт
Вот тут не уверен. Вроде бы, с момента подачи заявления об утере "фарш нельзя провернуть обратно". То есть паспорт найти, конечно, можно, но он уже будет считаться недействительным. И это не потому, что МВД так быстро его добавит в базу :), а потому, что есть процессы, бюрократия и "делу обратный ход дать нельзя". Ну или можно - по договоренности...
Germanjon Автор
02.02.2023 10:49+1Либо предусмотреть в базе дополнительные статусы для паспорта: аннулирован, аннулирован в связи со смертью, утерян но пока не аннулирован... Но это труднее
vadim_bv
02.02.2023 16:05МВД добавит в базу, базы синхронизируются с центральной, потом банк синхронизируется с этой… Вполне несколько дней может пройти, даже если на всякие сбои не закладываться
Germanjon Автор
02.02.2023 16:11Получается, в период между тем как пользователь официально "потерял" паспорт и до того, как об этом узнает конечный потребитель (банк), юридически этот паспорт недействителен, но по факту будет приниматься?
vadim_bv
02.02.2023 16:15+1Ну вот по факту я ХЗ. Могу только рассуждать. Отправила операционистка запрос, а в ответ ей что придет? Скорей всего придет «ОК».
Но тут конечно есть риск, что пользователь, как такой обман вскроется (например, в ходе рассмотрения кредитной заявки, она ведь не один день может рассматриваться), попадет в какой-нибудь черный список фрода и уже не отмоется.
Evengard
02.02.2023 11:49Меня больше интересует, где взять доступ к этим центральным базам для такого рода проверок...
Germanjon Автор
02.02.2023 13:14Сильно зависит от законодательства той или иной страны. По идее, должна быть интеграция госсистем с центральными БД через тот же СМЭВ.
Как на деле всё обстоит? Не знаю
Aleshonne
02.02.2023 21:45Список недействительных паспортов вполне может быть размещён открыто. Например: http://services.fms.gov.ru/info-service.htm?sid=2000. Скачиваете файлик и проверяете паспорта локально или же пользуетесь сайтом.
Правда, немного пугает информация о количестве паспортов, для которых в БД нашлись ошибки.
shifted83
02.02.2023 12:19+1Не уверен, как оно в ситуации с паспортом, но вот военный билет я однажды терял. Лежал он на полке в шкафу около года, а как понадобился - нет его. Пришел в военкомат, сообщил о потере, мне прочитали краткую лекцию на тему важности этого документа и разгильдяйства (как вообще, так и моего конкретно). Потом дали бегунок с "мероприятиями". Мероприятия по поиску заключались в том, что надо было удостовериться, что никто не приносил мой военный билет в отдел полиции каждого микрорайона моего города. Дома при более тщательном поиске билет нашелся, о чем я сообщил в военкомат на следующий день. Мне коротко сказали: "Тогда заявление выкидываем, до свидания".
Скорее всего, с паспортом тоже есть стандартная процедура с подобными "мероприятиями".
boopiz
02.02.2023 13:22имхо. это типичные частные кейсы, которые не "рушат" систему. и типичное заблуждение. любой программер будет делать что то по уьвержденному ТЗ с утвержденным атрибутивным срставом, который появляется после изучения законодательства и объективной реальности. и при этом, предусматривпется возможное расширение функционала за счет гиькости семантики. если в вашей системе это не так, то это проблемы конкретно вашей системы. основное правило одно - все меняется и все изменения должны хранится до конца жизни системы.
Germanjon Автор
02.02.2023 14:15+1Кейс с уникальными сериями паспортов, которые вдруг не уникальны может порушить систему.
Кейс с полем ввода, заточенным под конкретный шаблон может привести к оттоку клиентов.Всё это действительно должно формироваться на этапе ТЗ (привет аналитикам) и проверяться на этапе тестов.
speshuric
02.02.2023 15:03+3Я каждый раз, когда ввожу данные свидетельства о рождении моего первого ребёнка путаюсь. В свидетельствах серия состоит из римских цифр (подмножество латиницы) и кириллицы. И номер цифрами. Но в данном конкретном случае серия "II-ET" - поэтому часто на автомате пишу латинские буквы. Иногда системы не дают ввести маской ввода (это норм), иногда тихо подменяют (не очень норм, но норм), иногда подсвечивают и подменяют (вполне норм). А иногда дают ввести, но потом где-то в использовании данных может возникать ошибка (это прям совсем не норм).
Markscheider
02.02.2023 23:00+2Я каждый раз, когда ввожу данные свидетельства о рождении моего первого ребёнка путаюсь.
Но вы хоть правильно визуально вводите. А есть особая категория граждан, которым лень переключать раскладку.
Собирали данные свидетельств, чтобы централизованно заказать билеты на поезд. Одни родители присылают: серия, условно, IV-NA. Я в шоке: ну не может такого быть! Звоню, разбираюсь. Оказывается, в оригинале было "IV-ИА", но было лень переключать язык и "И" заменили на похожую по начертанию "N".
Вот что у людей в головах?
speshuric
02.02.2023 23:03+3Вот что у людей в головах?
Это страшный вопрос и я вообще не уверен, что хочу знать ответ :)
vadimk91
02.02.2023 18:27+145 лет мне было уже много лет назад, но до сих пор аукается замена паспорта по возрасту. Почему в базах не хранится соответствие старого и нового паспорта - для меня загадка, и я (как впрочем и все граждане страны Р) должен до сих пор доказывать, что они тот же самый верблюд, да ещё и с привлечением нотариусов.
Germanjon Автор
03.02.2023 07:37+1Напрашивается политическое решение по вводу единого идентификатора физлица, к которому уже подвязываются все паспорта и и другие выданные документы.
Но это огромный объём работ по оцифровке и очистке
v1000
В банк пришел клиент, которому 101 год. Банковская система стандартно отбросила «лишние» 100 лет, и не дала открыть счет несовершеннолетнему клиенту.
Germanjon Автор
Банковская система не смогла обработать трёхзначный возраст? Эта старый кейс?
v1000
ну не настолько давно :) там вроде прикол был в том, что возраст вычислялся автоматически на основе персонального кода, в котором только две цифры года рождения. поэтому родившиеся в 1910 и 2010 году могли быть одного возраста.
Germanjon Автор
Последний раз встречал такое во времена DOS-а, потом вроде бы перестали экономить и стали хранить данные об юзере в формате DateTime. Возможно - сработал человеческий фактор?
Иначе это большой косяк банковской программы.
Iscander_Che
Вполне возможно, что банковская программа работает ещё на DOSе. На Хабре достаточно про незаменимый софт и железо написано.
v1000
прикол не про хранение данных - возраст вычислялся неправильно. и выдавал ошибку при попытке ввода данных.
ну я бы не сказал, что 100 летние клиенты в банк приходят косяками. тем более что ошибка была найдена и исправлена.