Миграция из CSV файла

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (39)

просмотр истории страницы
1. Создаем конфиг т.е какие поля из CSV соответствуют полям в бд биллинга.
{tip}{*}Время выполнения инструкции*: до 30 секунд на одного абонента и до 1 минуты инициализацию скрипта, общее время прямо зависит от количества мигрируемых абонентов{tip}

Пример конфига
{toc:maxLevel=3}

h2. Пошаговая инструкция по миграции абонентов

CSV и конфигурационный файл должны быть в кодировке UTF-8. Расширение файлов .csv для файла с абонентами и .conf для файла с настройками.

# Допустим csv файл выглядит в нашем случае вот так: \\ \\
{panel}
Фильчаков Андрей Петрович;33.1;Белгород;Ленина;3;1;115;89221100331;15J34;Безлимит512;10.0.0.8;AA:BB:CC:DD:11:22;по ip static
Иванов Павел Сидрович;22.5;Москва;Сталина;4;2;8;89991112233;HGJ34;Безлимит1024;192.168.31.5;11:22:33:44:55:66;по vpn pptp, pppoe
Козлов Роман Алексеевич;78.4;Омск;Хрущева;5;3;45;89123336677;B389D;Безлимит5120;172.25.3.7;11:AA:22:BB:33:CC;любая через RADIUS
{panel}
В табличном виде вот так:
| Фильчаков Андрей Петрович | 33.1 | Белгород | Ленина | 3 | 1 | 115 | 89221100331 | 15J34 | Безлимит512 | 10.0.0.8 | AA:BB:CC:DD:11:22 | по ip static |
| Иванов Павел Сидрович | 22.5 | Москва | Сталина | 4 | 2 | 8 | 89991112233 | HGJ34 | Безлимит1024 | 192.168.31.5 | 11:22:33:44:55:66 | по vpn pptp, pppoe |
| Козлов Роман Алексеевич | 78.4 | Омск | Хрущева | 5 | 3 | 45 | 89123336677 | B389D | Безлимит5120 | 172.25.3.7 | 11:AA:22:BB:33:CC | любая через RADIUS |
\\
# Создаем конфигурацию для вашего csv файла т.е какие поля из CSV соответствуют полям в бд биллинга. Первое поле в csv считается 0-вым. Далее в конфигурации Вы указываете имя поля в биллинге и значение столбца в csv файле, которое запишется в это поле биллинга
{info}
Список полей, доступных для переноса, указан в примере. По дополнительным полям уточните у сотрудников CarbonSoft, который проводит миграцию совместно с вами.
{info}
Пример конфига для нашего csv файла (описания столбцов не заканчивается запятой, она вызовет ошибку миграции).
{code}
{
"fields": {
"Название/ФИО": 10,
"Баланс": 21,
"Город": 32,
"Улица": 43,
"Номер дома": 54,
"Корпус": 65,
"Номер квартиры": 76,
"Логин": 87,
"imported_id": 87,
"Номер договора": 87,
"Номер SMS для оповещений": 87,
"Сгенерированный пароль": 98,
"Тариф": 9,
"Название тарифа": "IPv4": 10,
"IPv4": "MAC": 11,
"MAC": "Тип авторизации": 12
},

"Формат даты": "%d.%m.%Y",
"Наследовать параметры от родительской папки": "True",
"Разделитель телефонов": " ", "Следующее списание": "16.07.2016",
"Следующее списание": "16.07.2015",
"Тип списания":"Предоплата",
"Метод списания":"Ежемесячно равными долями в день"
}
{code}
imported_id - уникальный идентификатор записей в CSV
{info}
Обязательно прочтите описание полей ниже
{info}
*imported_id* \- уникальный идентификатор записей в вашем CSV файле(ах) при миграции. *Не может быть пустым\!*
*Папка для импорта* \- имя папки в списке абонентов биллинга, в которую попадут все абоненты из csv-файла после миграции. Если требуется разделить абонентов на подпапки (по тарифам или по месту подключения), тогда до миграции необходимо произвести разделение общего csv-файла на отдельные файлы, в которых абоненты уже сгруппированы по нужному признаку. Также для каждого csv-файла нужен будет свой файл .conf, в котором поле "Папка для импорта" будет иметь соответствующее значение.
Названия остальных полей совпадают с их описанием в интерфейсе управления абонентами:
nas_id - к какому маршрутизатору требуется привязать учетную запись
*Тариф* \- имя тарифа в разделе тарификация, который будет присвоен абоненту. Тариф должен быть создан в биллинге до миграции.
*NAS/BRAS* \- к какому маршрутизатору требуется привязать учетную запись - писать текстом в CSV. Просто название NAS'а без IP в скобках. NAS предварительно должен быть создан в биллинге.
*Тип авторизации* \- тип авторизации пользователей (общий для всех добавляемых пользователей)
*Следующее списание* \- Дата, с которой биллинг начнет списывать средства по услугам у абонента. До этой даты абонент будет иметь включенную услугу и пользоваться ей *бесплатно*, т.е. списания по ним идти до этой даты не будут. Рекомендуется ставить дату миграции.
*Список типов авторизации:*
{code}
по vpn pptp, pppoe
по ip static
по CarbonAgent
по ip+CarbonAgent
через веб
через ip+веб
любая через RADIUS
{code}
# Копирование файлов на сервер.
#* IP адрес сервера биллинга 10.0.0.1
#* Файл конфигурации abonents.conf
#* CSV-файл с данными абонентов abonents.csv
#* Производим копирование программой scp
{code}
scp -P 22 abonents.conf abonents.csv root@10.0.0.1:/app/asr_billing/var/root/
{code}
{info}
Все файлы должны быть в кодировке utf-8, для проверки введите команду в консоли сервера
{code} file /app/asr_billing/var/root/abonents.csv
abonents.csv: UTF-8 Unicode text, with CRLF line terminators{code}
Если в выводе Вы получите 'UTF-8 Unicode (with BOM)' выгрузка работать не будет.
Для исправление выполните команду.
{code}sed -i '1s/^\xEF\xBB\xBF//' /app/asr_billing/var/root/abonents.csv{code}
{info}
# Заходим в контейнер биллнг
{code}
chroot /app/asr_billing
{code}
# Запускаем скрипт миграции без параметров
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc
{code}
будет выведена инструкция к дальнейшим действиям.
# Запускаем миграцию абонентов командой
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc /var/root/abonents.conf /var/root/abonents.csv migrate_abonents
{code}
{info}
Внимание: Первым аргументом обязательно нужно передавать конфигурационный файл, а вторым обязательно файл csv. Если поменять местами аргументы скрипт не заработает.
{info}
# Проверяем миграцию

auth_type тип авторизации пользователей (общий для всех добавляемых пользователей)
h3. Список полей доступных для миграции абонентов

Список типов:
{info}
* Практически все поля из веб - интерфейса можно мигрировать, указав в конфигурационном файле название поля так же, как оно написано в веб - интерфейсе.
* В случае, если в названии поля присутствует *обратный* слэш - данный символ необходимо в конфигурационном файле экранировать. Пример:
{code}
"Списать сумму\\Сделать скидку": 1
{code}
* Максимальная длина *пароля* составляет 16 символов. Если пароль в csv файле будет длиннее - скрипт сгенерирует случайный пароль для этого абонента
{info}
{warning}
Внимательно используйте опцию "*Создавать дополнительных пользователей c login=imported_id*". Эта опция используется в скрипте с параметром create_users. С этой опцией в новую учетную запись не попадут никакие параметры кроме "Логин" .
{warning}

{code}
0 по vpn pptp, pppoe
1 по ip
2 по CarbonAgent
3 по ip+CarbonAgent
4 через веб
5 через ip+веб
6 любая через RADIUS
8 по OPT82
{
"fields": {
"auth_type": 57,
"OPT82": 56,
"Метод списания абон.платы": 70,
"Название/ФИО": 1,
"Порог отключения": 2,
"VLAN": 54,
"Номер договора": 3,
"Абонентка по тарифу": 71,
"Название тарифа": 42,
"rate_in": 49,
"next_auto_acount": 68,
"Добровольная блокировка, до": 21,
"Логин": 2,
"Номер дома": 35,
"Номер квартиры": 37,
"Корпус": 36,
"iptv пароль": 64,
"IP адрес для SNAT": 65,
"порт коммутатора": 55,
"Улица": 34,
"Переход на тариф": 38,
"Баланс": 9,
"Дерево групп": 67,
"IP коммутатора": 53,
"Пул IP адресов": 27,
"iptv ip": 62,
"Номер SMS для оповещений": 11,
"imported_id": 0,
"У пользователя белый ip адрес": 22,
"iptv мак": 63,
"Host Пул (только для VPN)": 26,
"Юр. лицо": 5,
"send_act": 19,
"NAS/BRAS": 58,
"sync1c": 20,
"Дата выставления Акта": 72,
"ceil_in": 51,
"ceil_out": 52,
"Дата договора": 7,
"rate_out": 50,
"enabled": 6,
"Переопределенная абонентская плата": 61,
"email": 10,
"Следующее списание": 69,
"MAC": 8,
"Host IP (только для VPN)": 25,
"IPv4": 4,
"Запретить динамическое выделение параметров": 23,
"Формировать Акт автоматически": 12,
"Город": 32,
"Имя тарифа для перехода": 40,
"Дата следующего перехода": 39,
"Сгенерированный пароль": 15
},
"options": {
"Формат даты": "%Y-%m-%d %H:%M:%S",
"Метод списания": "Ежедневно",
"Разделитель csv": ";",
"Разделитель телефонов": " ",
"Создавать дополнительных пользователей c login=imported_id": "True",
"Наследовать параметры от родительской папки": "False",
"Папка для импорта": "Миграция",
"Тип списания": "Предоплата"
},
"dynamic_attributes": {
"Главный бухгалтер": 87,
"Кем выдан": 83,
"Адрес оборудования": 80,
"Наименование оборудования": 75,
"Адрес": 73,
"Когда выдан": 82,
"Кто подключил": 77,
"Мак адресс": 79,
"Наименование": 85,
"Прописка": 84,
"Паспорт №": 81,
"Номер порта": 76,
"ИНН": 86,
"Когда подключен (дата)": 78,
"Телефон": 74
}
}

{code}

2. Заливаем конфиг и CSV-файл в /app/asr_billing/root/
h3. Разделы файла конфигурации

* *fields* \- содержит поля доступные для редактирования в карточке абонента, а также у учётной записи пользователя;
* *options* \- отвечает за параметры csv файла, такие как разделитель, дату следующего списания и тому подобное;
* *dynamic_attributes* содержит список [реквизитов|Реквизиты], которые не были созданы в биллинге, при этом для каждого абонента будет создан отдельный реквизит.

h3. Как мигрировать абоненту персональную стоимость услуги, не как у всех?

Укажите стоимость услуги в отдельном столбце, в конфигурационном файле в разделе fields укажите поле "*Переопределенная абонентская плата*".
В услугах абонента [персональная стоимость|CarbonBilling:Персональная стоимость услуги] будет указана в поле *"Списать сумму/Сделать скидку"* в настройках услуги)

h4. Какой именно услуге тарифа будет назначена указанная стоимость?

Биллинг попытается найти у абонента тарифную услугу с ненулевой стоимостью, если она одна - выставляет сумму ей.
{warning}
* Если услуга не одна - будет ошибка
* Если нет ни одной - тоже ошибка
{warning}

h3. У абонента несколько IP-адресов, как их мигрировать?

Например, абонента Фильчаков Андрей Петрович три IP-адреса: 10.0.0.8, 10.0.0.9, 10.0.0.10.

В CSV сделайте три строки по этому абоненту, они должны отличаться только IP-адресом.

{code}
Фильчаков Андрей Петрович;33.1;Белгород;Ленина;3;1;115;89221100331;15J34;Безлимит512;10.0.0.8;AA:BB:CC:DD:11:22;по ip static
Фильчаков Андрей Петрович;33.1;Белгород;Ленина;3;1;115;89221100331;15J34;Безлимит512;10.0.0.9;AA:BB:CC:DD:11:22;по ip static
Фильчаков Андрей Петрович;33.1;Белгород;Ленина;3;1;115;89221100331;15J34;Безлимит512;10.0.0.10;AA:BB:CC:DD:11:22;по ip static
{code}

h3. Как мигрировать абоненту доп. соглашения.
Для миграции доп. соглашений конкретному абоненту необходимо в конфигурационном файле добавить поле *Главный абонент* и в этом поле указать номер договора главного абонента.
Если это поле будет пустым - абонент будет создан как отдельный, если поле будет заполнено - биллинг попытается найти абонента по указанному номеру договора и создаст ему доп. соглашение на том же лицевом счете.
Поле *Главный абонент* должно быть указано в разделе *fields*.
{info}
Поле *imported_id* у основного абонента и доп. соглашения должны отличаться, иначе скрипт пропустит одну из строчек
{info}

Если необходимо мигрировать каждое доп. соглашение на отдельный лицевой счет - необходимо в разделе *options* указать следующую опцию:
{code}
"Создать доп. соглашения на отдельном счете": "True",
{code}

На текущий момент данная возможность есть только в первой версии скрипта миграции
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv.pyc
{code}


h3. Как мигрировать абоненту комментарий с количеством символов больше 256.
В реквизитах у абонента есть ограничение на количество символов. Реквизит длиной свыше 256 символов создать нельзя. Однако данную строку можно мигрировать в комментарий, который будет отображаться прямо в карточке абонента. Для этого в конфигурационном файле нужно добавить поле *Комментарий абонента*
{code}
"fields": {
"Комментарий абонента": 12
},
{code}

h3. В биллинге нет полей для миграции нужных данных. Что делать?

Добавьте нужные данные в выгрузку. В конфигурационном файле укажите их в области "dynamic_attributes". Если каких-то полей нет, биллинг их создаст и отразит в карточке абонента на вкладке [реквизиты|CarbonBilling:Реквизиты].

h2. Миграция тарифов и тарифных услуг

Тарифы мигрируются в два этапа:
* Миграция тарифов
* Миграция тарифных услуг

h3. Пошаговая инструкция по миграции тарифов

CSV и конфигурационный файл должны быть в кодировке UTF-8. Расширение файлов .csv для файла с абонентами и .conf для файла с настройками.

# Допустим csv файл выглядит в нашем случае вот так: \\ \\
{panel}
0;Льготный для сотрудников;
1;Интернет 10;
2;Интернет 20;
3;Интернет 10+TV;
4;Интернет 20+TV;
5;Интернет 10+телефон;
6;Интернет 20+телефон;
{panel}
В табличном виде вот так:
|| IMPORTED_ID || Название ||
| 0 | Льготный для сотрудников |
| 1 | Интернет 10 |
| 2 | Интернет 20 |
| 3 | Интернет 10+TV |
| 4 | Интернет 20+TV |
| 5 | Интернет 10+телефон |
| 6 | Интернет 20+телефон |
\\
# Создаем конфигурацию для вашего csv файла т.е какие поля из CSV соответствуют полям в бд биллинга. Первое поле в csv считается 0-вым. Далее в конфигурации Вы указываете имя поля в биллинге и значение столбца в csv файле, которое запишется в это поле биллинга
{info}
Список полей, доступных для переноса, указан в примере. По дополнительным полям уточните у сотрудников CarbonSoft, который проводит миграцию совместно с вами.
{info}
Пример конфига для нашего csv файла (описания столбцов не заканчивается запятой, она вызовет ошибку миграции).
{code}
{
"fields": {
"imported_id": 0,
"Название": 1
},
"options": {
"Разделитель csv": ";"
}
}
{code}
{info}
Обязательно прочтите описание полей ниже
{info}
*imported_id* - уникальный идентификатор записей в вашем CSV файле(ах) при миграции. *Не может быть пустым\!*
*Название* - название тарифа \\ \\
# Копирование файлов на сервер.
#* IP адрес сервера биллинга 10.0.0.1
#* Файл конфигурации tariff.csv.cfg
#* CSV-файл с данными абонентов tariff.csv
#* Производим копирование программой scp
{code}
scp -P 22 tariff.csv tariff.csv.cfg root@10.0.0.1:/app/asr_billing/var/root/
{code}
{info}
Все файлы должны быть в кодировке utf-8, для проверки введите команду в консоли сервера
{code} file /app/asr_billing/var/root/tariff.csv
tariff.csv: UTF-8 Unicode text, with CRLF line terminators{code}
Если в выводе Вы получите 'UTF-8 Unicode (with BOM)' выгрузка работать не будет.
Для исправление выполните команду.
{code}sed -i '1s/^\xEF\xBB\xBF//' /app/asr_billing/var/root/tariff.csv{code}
{info}
# Заходим в контейнер биллнг
{code}
3. chroot /app/asr_billing
4. python /usr/lib/python2.6/site-packages/carbon_migration_scripts/file_client/import_csv.pyc и там будет инструкция к дальнейшим действиям.
{code}
# Запускаем скрипт миграции без параметров
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc
{code}
будет выведена инструкция к дальнейшим действиям.
# Запускаем миграцию тарифов командой
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc /var/root/tariff.csv.cfg /var/root/tariff.csv migrate_tariff
{code}
{info}
Внимание: Первым аргументом обязательно нужно передавать конфигурационный файл, а вторым обязательно файл csv. Если поменять местами аргументы скрипт не заработает.
{info}
# Проверяем миграцию

h3. Пошаговая инструкция по миграции тарифных услуг


CSV и конфигурационный файл должны быть в кодировке UTF-8. Расширение файлов .csv для файла с абонентами и .conf для файла с настройками.

# Допустим csv файл выглядит в нашем случае вот так: \\ \\
{panel}
Интернет 10;Услуга Интернет 10;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 20;Услуга Интернет 20;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 10+TV;Услуга Интернет 10;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 10+TV;Услуга ТВ;100;;IP телевидение;Ежемесячно равными долями в день;Smotreshka;;
Интернет 20+TV;Услуга Интернет 20;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 20+TV;Услуга ТВ;100;;IP телевидение;Ежемесячно равными долями в день;Smotreshka;;
Интернет 10+телефон;Услуга Интернет 10;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 10+телефон;Услуга Телефония ВЗ;200;;IP телефония;Ежемесячно равными долями в день;;2;
Интернет 20+телефон;Услуга Интернет 20;1000;102400;Трафик;Ежемесячно равными долями в день;;;
Интернет 20+телефон;Услуга Телефония ВЗ;200;;IP телефония;Ежемесячно равными долями в день;;2;
{panel}
В табличном виде вот так:
|| Название тарифа || Название услуги || Цена || Скорость || Тип || Метод списания || NAS || Бесплатно(сек.) ||
| Интернет 10 | Услуга Интернет 10 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 20 | Услуга Интернет 20 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 10+TV | Услуга Интернет 10 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 10+TV | Услуга ТВ | 100 | | IP телевидение | Ежемесячно равными долями в день | Smotreshka | |
| Интернет 20+TV | Услуга Интернет 20 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 20+TV | Услуга ТВ | 100 | | IP телевидение | Ежемесячно равными долями в день | Smotreshka | |
| Интернет 10+телефон | Услуга Интернет 10 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 10+телефон | Услуга Телефония ВЗ | 200 | | IP телефония | Ежемесячно равными долями в день | | 2 |
| Интернет 20+телефон | Услуга Интернет 20 | 1000 | 102400 | Трафик | Ежемесячно равными долями в день | | |
| Интернет 20+телефон | Услуга Телефония ВЗ | 200 | | IP телефония | Ежемесячно равными долями в день | | 2 |
\\
# Создаем конфигурацию для вашего csv файла т.е какие поля из CSV соответствуют полям в бд биллинга. Первое поле в csv считается 0-вым. Далее в конфигурации Вы указываете имя поля в биллинге и значение столбца в csv файле, которое запишется в это поле биллинга
{info}
Список полей, доступных для переноса, указан в примере. По дополнительным полям уточните у сотрудников CarbonSoft, который проводит миграцию совместно с вами.
{info}
Пример конфига для нашего csv файла (описания столбцов не заканчивается запятой, она вызовет ошибку миграции).
{code}
{
"fields": {
"Название тарифа": 0,
"Название": 1,
"Исх. гарант. скорость, Кбит(RATE_OUT)": 3,
"Исх. макс. скорость, Кбит(CEIL_OUT), если не поддерживается оборудованием укажите равным RATE_OUT": 3,
"Вх. гарант. скорость, Кбит(RATE_IN)": 3,
"Вх. макс. скорость, Кбит(CEIL_IN), если не поддерживается оборудованием укажите равным RATE_IN": 3,
"Цена": 2,
"Тип": 4,
"Метод списания": 5,
"NAS": 6,
"Бесплатно(сек.)": 7

},
"options": {
"Разделитель csv": ";"
}
}
{code}
{info}
Обязательно прочтите описание полей ниже
{info}
*Название тарифа* - название тарифа, к которому должна быть добавлена услуга
*Название* - название услуги
*Цена* - цена услуги
*Метод списания* - [CarbonBilling:Методы списания]
*Тип* - обязательный параметр, чтобы услуги создались правильно подробное описание типов доступно по [ссылке|https://docs.carbonsoft.ru/pages/viewpage.action?pageId=50660430#Услуги-Вкладка"Основные"]. Если не выбрать тип, услуги будут созданы с типом "Не определено" и интеграция с оборудованием и сервисами будет работать неверно.
*Исх. гарант. скорость, Кбит(RATE_OUT)* - один из параметров для [услуг интернета|CarbonBilling:Услуги. Трафик (интернет)]
*Исх. макс. скорость, Кбит(CEIL_OUT)* - один из параметров для [услуг интернета|CarbonBilling:Услуги. Трафик (интернет)]
*Вх. гарант. скорость, Кбит(RATE_IN)* - один из параметров для [услуг интернета|CarbonBilling:Услуги. Трафик (интернет)]
*Вх. макс. скорость, Кбит(CEIL_IN)* - один из параметров для [услуг интернета|CarbonBilling:Услуги. Трафик (интернет)]
*NAS* - один из параметров для [услуг телевидения|CarbonBilling:Настройка услуг IPTV]
*Бесплатно(сек.)* - один из парамтеров для [услуг телефонии|CarbonBilling:Услуги. IP Телефония]
\\ \\
# Копирование файлов на сервер.
#* IP адрес сервера биллинга 10.0.0.1
#* Файл конфигурации tariff_usluga.csv.cfg
#* CSV-файл с данными абонентов tariff_usluga.csv
#* Производим копирование программой scp
{code}
scp -P 22 tariff_usluga.csv tariff_usluga.csv.cfg root@10.0.0.1:/app/asr_billing/var/root/
{code}
{info}
Все файлы должны быть в кодировке utf-8, для проверки введите команду в консоли сервера
{code} file /app/asr_billing/var/root/tariff_usluga.csv
tariff_usluga.csv: UTF-8 Unicode text, with CRLF line terminators{code}
Если в выводе Вы получите 'UTF-8 Unicode (with BOM)' выгрузка работать не будет.
Для исправление выполните команду.
{code}sed -i '1s/^\xEF\xBB\xBF//' /app/asr_billing/var/root/tariff_usluga.csv{code}
{info}
# Заходим в контейнер биллнг
{code}
chroot /app/asr_billing
{code}
# Запускаем скрипт миграции без параметров
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc
{code}
будет выведена инструкция к дальнейшим действиям.
# Запускаем миграцию тарифных услуг командой
{code}
python2.7 /usr/lib/python2.7/site-packages/carbon_migration_scripts/file_client/import_csv_v2.pyc /var/root/tariff_usluga.csv.cfg /var/root/tariff_usluga.csv migrate_tariff_usluga
{code}
{info}
Внимание: Первым аргументом обязательно нужно передавать конфигурационный файл, а вторым обязательно файл csv. Если поменять местами аргументы скрипт не заработает.
{info}
# Проверяем миграцию

h2. Логи миграции/Скорость миграции

Оценить скорость прохождения миграции, запущенной с другой машины, можно в логе миграции {{/var/log/import_csv.log}}

h2. Как запустить миграцию фоном и отключиться от сервера

Нужно отвязать процесс от терминала, и делается это сразу при запуске. Например:
{code}setsid python2.7 import_csv_v2.pyc IntercomConverted.config.json IntercomConverted.csv migrate_abonents 2>&1 >import_csv_v2.`date +%Y-%m-%d_%H%M%S`.log & disown -a{code}
Эта команда:
* Позволит закрыть терминал и отключиться от сервера
* Будет дублировать лог в папку, где Вы выполнили команду.
* В названии лога укажет дату запуска миграции, например: {{import_csv_v2.2021-04-15_004551.log}}

h2. Как сделать csv

h3. Выгрузка запросом к базе данных

Уточните структуру базы в документации или у сотрудников биллинга-источника, сформируйте запрос.

h3. Из Excel

Если биллинг-источник позволяет выгрузить данные для миграции в Excel, можно воспользоваться им и пересохранить файл в CSV (меню Файл \-> Сохранить как) или воспользоваться конвертером в интернете: [https://convertio.co/ru/xls-csv/]

h3. Из XML

Можно воспользоваться конвертером в интернете: [https://conversiontools.io/conversion/convert_xml_to_csv]

h3. Если есть CSV, но формат не совсем подходит (разделитеть, кавычки и тд)

Можно открыть файл с LibreOffice и пересохранить в нужном виде, но иногда он "ломает" даты и большие числа - например, номер банковского счёта из 16 цифр может укоротить, отразив в экспоненциальной форме (например 489089058900e17), и это испортит всю выгрузку.

Для решения, воспользуйтесь утилитой [csvformat из пакета csvkit|https://csvkit.readthedocs.io/en/latest/scripts/csvformat.html]

Установить в Ubuntu 18.04 и выше можно так:
{code}sudo apt update; sudo apt install -y csvkit{code}

Преобразовать так:
{code}csvformat -D '|' -Q '' -U 3 IntercomWorkbenchRaw.csv | sed 's/NULL//g' > IntercomConverted.csv{code}
В качестве разделителя будет использован символ "|", все поля будут выгружены без кавычек, а поля "NULL" станут пустыми (такая проблема может быть в старых версиях MySQL Workbench).



h2. Ошибки миграции

h3. Попытка миграции абонента с тарифом, состоящим из одних цифр
{code}
ValueError: Cannot assign "1243": "Abonents.tarif" must be a "Tarif" instance.
{code}
Рекомендуем при миграции создавать тарифы хотя бы с одной буквой. Иначе могут возникнуть трудности при миграции.
h3. Пропущен разделитель в конфигурационном файле
В примере пропущен разделитель "," на позиции *42* в конфигурационном файле. Сообщение об ошибке:
{code}
ERROR 2019-11-25 14:42:11,717 base 6929 140347412997888 [u'ValueError: Expecting , delimiter: line 42 column 1 (char 1326)', u' File "file_client/import_csv.py", line 1612, in <module>', u' File "file_client/import_csv.py", line 1564, in start_import', u' File "json/__init__.py", line 339, in loads', u' File "json/decoder.py", line 364, in decode', u' File "json/decoder.py", line 380, in raw_decode']
{code}
Что бы понять в какой строке нет разделителя просматриваем сообщение об ошибке и находим следующее:
{code}
delimiter: line 42
{code}
Для исправления конфигурационного файла откройте его в текстовом редакторе и перейдите на строку *42*.
{code}
vim +42 /var/root/abonents.conf
{code}

{info}
Нумерация столбцов в .csv файле начинается с *0*.
{info}

h3. Конфигурационный файл содержит некорректные параметры
Указанная ошибка появляется, когда программа миграции считывает конфигурационный файл и не может найти в нём параметр.
{code}
ERROR 2019-12-11 17:41:59,790 base 18056 140138050590464 [u'ValueError: Expecting property name: line 5 column 1 (char 71)', u' File "file_client/import_csv.py", line 1612, in <module>', u' File "file_client/import_csv.py", line 1564, in start_import', u' File "json/__init__.py", line 339, in loads', u' File "json/decoder.py", line 364, in decode', u' File "json/decoder.py", line 380, in raw_decode']
[u'sudo bash -c "export BOOTUP="noncolor";service worker start 2>&1"']
{code}
В указанном случае стояла запятая в конце перечисления параметров конфигурационного файла ("Номер договора": 1,)
{code}
"fields": {
"Баланс": 6,
"Номер договора": 1,
},
{code}
{info}
При перечислении в конфигурационном файле внутри { } используется символ запятая(,), как указатель на следующий параметр
{info}


h3. Неверный тип параметра в конфигурационном файле
Пример ошибки:
{code}
ERROR 2019-11-25 19:24:36,818 base 31955 140598127302400 [u'TypeError: list indices must be integers, not unicode', u' File "file_client/import_csv.py", line 1612, in <module>', u' File "file_client/import_csv.py", line 1589, in start_import', u' File "file_client/import_csv.py", line 189, in start_import', u' File "file_client/import_csv.py", line 138, in parse_csv']
{code}
Ошибка возникает, когда в конфигурационном файле для параметра указано строковое значение вместо целочисленного. Например вместо номера столбца для тарифа указано его название:
{code}
"Тариф": "Основной тариф",
{code}
Верное значение поля "Тариф" - номер столбца в файле .csv , с названиями тарифов:
{code}
"Тариф": 8,
{code}

h3. Ошибка абонент с данным MAC адресом уже существует.
Необходимо проверить чтобы в csv файле в значениях MAC адресов не было равным=0, если есть то сделать значение пустым.