Файл-пример с выгрузкой из Докуса 19-20.02__5_.xlsx - необходимо иметь в виду, что тут есть повторяющиеся номера телефона, если вы будете импортировать файл куда-то с валидациями.
Файл-пример с выгрузкой из МВД для_импорта__4_.xlsx
Алгоритм работы пользователя
1. Пользователь импортирует файл из Докуса, то есть он для нас как первоисточник
2. Для импорта используется функционал "Импорт пользователей" из "Администрации пользователей", отличается от базового импорта тем, что в рамках импорта именно пользователей можно выбирать настроенные шаблоны импорта - для Докуса и МВД соответственно. А также импорт происходит в промежуточную таблицу extended_profile
, которая также используется для отображения данных на странице профиля для пользователей с actor_type = 'gb'
в таблице actor
.
3. Помимо настроенного меппинга, импорт вызывает функцию create_or_update_gb_actor
, которая создает пользователей, а также настраивает для них next_payment
.
4. Алгоритм работы функции таков, что на каждый номер телефона создается новый actor и записи для него в необходимых таблицах, в том числе и настраиваются роли.
5. Для того, что появились данные о патенте, пользователю необходимо проимпортировать данные из системы МВД. Общего идентификатора между МВД и Докус нет, поэтому было принято решение в качестве натурального ключа использовать поля серия и номер ДУЛ (dul_series
и dul_number
в таблице extended_profile
), при этом обязательное для заполнения только поле dul_number
, так как у ряда стран серия ДУЛ отсутствует.
6. При импорте данных из МВД начинается самое интересное - Система перед тем как запустить процесс импорта, сначала проверяет предложенный файл и определяет какие строки будут созданы новыми, какие будут обновлены, а какие ошибочные. В нашем случае проверка идет как раз по двум полям dul_series
и dul_number
. И только если ошибок нет, запускается инсерт в промежуточную таблицу. Ошибки, в первую очередь из-за того, что если серия и номер не совпадает, то есть нельзя найти строку для обновления, то импорт будет пытаться создать новую запись, однако требование уникальности в номере телефона не позволяет это выполнить (если телефон null, то второй записи с телефоном null быть уже не может).
7. Главные ошибки:
- наличие лишних символов в серии ДУЛ
- разный формат в номере ДУЛ, то есть в Докусе текстовый и если в начале серии указаны нули, они сохраняются, а в МВД - числовой и нули теряются
- использование в серии ДУЛ в разных системах латинскую и кириллическую раскладку, что не позволяет сравнить данные
Правила для обработки файлов
Путем анализа файлов, что в карточке выше, удалось выявить следующую зависимость (в файлах перс данные реальных людей, поэтому распространению они не подлежат).
1. Таджикистан
- Заполнение серии ДУЛ
Серия ДУЛ отсутствует
- Заполнении номера ДУЛ
Везде по 9 символов в номере ДУЛ и он начинается не с нуля (в имеющихся у нас примерах он вообще начинается только с 4)
2. Узбекистан
- Заполнение серии ДУЛ
Две латинские буквы.
- Заполнении номера ДУЛ
Во всех случаях 7 символов в номере ДУЛ и все начинаются с нулей.
3. Латвия
Важно: в документе МВД в графе "Гражданство" указывается "Лицо без гражданства", в том время как в файле Докус - "Латвия". Записывать в extended_profile мы должны "Латвия", которая приходит первой.
- Заполнение серии ДУЛ
Латинские буквы в серии.
- Заполнении номера ДУЛ
Номер состоит из 7 цифр.
4. Эстония
Важно: в документе МВД в графе "Гражданство" указывается "Лицо без гражданства", в том время как в файле Докус - "Эстония". Записывать в extended_profile мы должны "Эстония", которая приходит первой.
- Заполнение серии ДУЛ
Латинские буквы в серии.
- Заполнении номера ДУЛ
Номер состоит из 7 цифр.
5. Республика Молдова
- Заполнение серии ДУЛ
Одна или две латинские буквы
- Заполнении номера ДУЛ
7 цифр в номере ДУЛ
6. Азербайджан
- Заполнение серии ДУЛ
Одна латинская буква (или 'C' или 'P')
- Заполнении номера ДУЛ
Если 'C' - 8 цифр, может начинаться с нуля
Если 'P' - 7 цифр, может начинаться с нуля
7. Украина
У граждан Украины принимаются 4 вида документов: Мультипаспорт, паспорт ДНР ЛНР, загран. старого образца, внутренний паспорт.
- Заполнение серии ДУЛ
Мультипаспорт - серия отсутствует
Паспорт ДНР ЛНР - серия состоит из 4-х цифр
Загран. старого образца - две латинские буквы
Внутренний паспорт - две буквы кириллицы
- Заполнении номера ДУЛ
Мультипаспорт - 9 цифр
Паспорт ДНР ЛНР - 6 цифр
Загран. старого образца - 6 цифр
Внутренний паспорт - 6 цифр
Из-за того, что мы не можем однозначно определить где внутренний, а где заграничный паспорт, мы вынуждены добавить еще одно поле в ключ birthday
.
Логика будет следующая, что если мы видим в серии однозначно кириллицу (например, Ю или Ф), то приводим серию к кириллице, если таких букв нет, то приводим к латинице. Таким образом, чтобы избежать, что мы два разных паспорта приведем к латинице и схлопним в одну запись, добавляется третье поле для ключа - Дата рождения пользователя. Настройка ключевых полей в базе на проде произведена.
8. Литва
Важно: в документе МВД в графе "Гражданство" указывается "Лицо без гражданства", в том время как в файле Докус - "Литва". Записывать в extended_profile мы должны "Литва", которая приходит первой.
- Заполнение серии ДУЛ
Серия ДУЛ отсутствует.
- Заполнении номера ДУЛ
Номер состоит из 8 цифр.
Требования
-
Необходимо обрезать все пробелы до и все пробелы после (по всем полям)
-
Необходимо сделать "сжать пробелы", чтобы ошибочные несколько штук подряд не портили картину (по всем полям)
-
Должна быть таблица с описанными правилами, по которым идет нормализация данных - страна (код страны), тип правила (или поле), значение
-
Регистр не соблюдается - то есть все маленькие буквы приводим к большим, чтобы по ним тоже сопоставление происходило корректно
Нормализация файла должна происходить на этапе построчной проверки импортируемого файла, импортируются в базу уже нормализованные данные.