{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": {
"Название/ФИО": 0,
"Баланс": 1,
"Город": 2,
"Улица": 3,
"Номер дома": 4,
"Корпус": 5,
"Номер квартиры": 6,
"Логин": 7,
"imported_id": 7,
"Номер договора": 7,
"Номер SMS для оповещений": 7,
"Сгенерированный пароль": 8,
"Тариф": 9,
"IPv4": 10,
"MAC": 11,
"Тип авторизации": 12
},
"options":{
"Папка для импорта": "Миграция",
"Разделитель csv": ";",
"Формат даты": "%d.%m.%Y",
"Наследовать параметры от родительской папки": "True",
"Следующее списание": "16.07.2016",
"Тип списания":"Предоплата",
"Метод списания":"Ежемесячно равными долями в день"
}
}
{code}
{info}
Обязательно прочтите описание полей ниже
{info}
*imported_id* \- уникальный идентификатор записей в вашем CSV файле(ах) при миграции. *Не может быть пустым\!*
*Папка для импорта* \- имя папки в списке абонентов биллинга, в которую попадут все абоненты из csv-файла после миграции. Если требуется разделить абонентов на подпапки (по тарифам или по месту подключения), тогда до миграции необходимо произвести разделение общего csv-файла на отдельные файлы, в которых абоненты уже сгруппированы по нужному признаку. Также для каждого csv-файла нужен будет свой файл .conf, в котором поле "Папка для импорта" будет иметь соответствующее значение.
Названия остальных полей совпадают с их описанием в интерфейсе управления абонентами:
*Тариф* \- имя тарифа в разделе тарификация, который будет присвоен абоненту. Тариф должен быть создан в биллинге до миграции.
*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}
# Проверяем миграцию
h3. Список полей доступных для миграции абонентов
{info}
* Практически все поля из веб - интерфейса можно мигрировать, указав в конфигурационном файле название поля так же, как оно написано в веб - интерфейсе.
* В случае, если в названии поля присутствует *обратный* слэш - данный символ необходимо в конфигурационном файле экранировать. Пример:
{code}
"Списать сумму\\Сделать скидку": 1
{code}
* Максимальная длина *пароля* составляет 16 символов. Если пароль в csv файле будет длиннее - скрипт сгенерирует случайный пароль для этого абонента
{info}
{warning}
Внимательно используйте опцию "*Создавать дополнительных пользователей c login=imported_id*". Эта опция используется в скрипте с параметром create_users. С этой опцией в новую учетную запись не попадут никакие параметры кроме "Логин" .
{warning}
{code}
{
"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}
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}
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.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, если есть то сделать значение пустым.
{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": {
"Название/ФИО": 0,
"Баланс": 1,
"Город": 2,
"Улица": 3,
"Номер дома": 4,
"Корпус": 5,
"Номер квартиры": 6,
"Логин": 7,
"imported_id": 7,
"Номер договора": 7,
"Номер SMS для оповещений": 7,
"Сгенерированный пароль": 8,
"Тариф": 9,
"IPv4": 10,
"MAC": 11,
"Тип авторизации": 12
},
"options":{
"Папка для импорта": "Миграция",
"Разделитель csv": ";",
"Формат даты": "%d.%m.%Y",
"Наследовать параметры от родительской папки": "True",
"Следующее списание": "16.07.2016",
"Тип списания":"Предоплата",
"Метод списания":"Ежемесячно равными долями в день"
}
}
{code}
{info}
Обязательно прочтите описание полей ниже
{info}
*imported_id* \- уникальный идентификатор записей в вашем CSV файле(ах) при миграции. *Не может быть пустым\!*
*Папка для импорта* \- имя папки в списке абонентов биллинга, в которую попадут все абоненты из csv-файла после миграции. Если требуется разделить абонентов на подпапки (по тарифам или по месту подключения), тогда до миграции необходимо произвести разделение общего csv-файла на отдельные файлы, в которых абоненты уже сгруппированы по нужному признаку. Также для каждого csv-файла нужен будет свой файл .conf, в котором поле "Папка для импорта" будет иметь соответствующее значение.
Названия остальных полей совпадают с их описанием в интерфейсе управления абонентами:
*Тариф* \- имя тарифа в разделе тарификация, который будет присвоен абоненту. Тариф должен быть создан в биллинге до миграции.
*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}
# Проверяем миграцию
h3. Список полей доступных для миграции абонентов
{info}
* Практически все поля из веб - интерфейса можно мигрировать, указав в конфигурационном файле название поля так же, как оно написано в веб - интерфейсе.
* В случае, если в названии поля присутствует *обратный* слэш - данный символ необходимо в конфигурационном файле экранировать. Пример:
{code}
"Списать сумму\\Сделать скидку": 1
{code}
* Максимальная длина *пароля* составляет 16 символов. Если пароль в csv файле будет длиннее - скрипт сгенерирует случайный пароль для этого абонента
{info}
{warning}
Внимательно используйте опцию "*Создавать дополнительных пользователей c login=imported_id*". Эта опция используется в скрипте с параметром create_users. С этой опцией в новую учетную запись не попадут никакие параметры кроме "Логин" .
{warning}
{code}
{
"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}
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}
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.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, если есть то сделать значение пустым.