Смена тарифного плана / Перевод расчетного периода

Технические вопросы по UTM 5.0
Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Смена тарифного плана / Перевод расчетного периода

Сообщение Dmitry P. »

Коллеги,
столкнулись с проблемой при проведении акции. Прошу помощи!

Задача:
  • - Провести акицю длительностью 3 месяца. 01.08.2014 - 01.11.2014.
    - Производить подключение новых пользователей к тарифу "Акционный 40 Мбит" в период действия акции.
    - Подключение к акционному тарифу только новых пользователей.
    - Осуществить автоматический перевод пользователей по окончанию акционного периода на тарифный план "Обычный 10 Мбит".
Что было сделано:
  • - Создан расчетный период 3 месяца 01.08.2014 - 01.11.2014
    - Имеются стандартный тарифный план "Обычный 10 Мбит" стоимостью 100 рублей. Расчетный период 1 месяц. Соответственно стоимость 100 руб/мес.
    - Создан акционный тарифный план "Акционный 40 Мбит" стоимостью 150 руб. Расчетный период 3 месяца. Соответственно стоимость 50 руб/мес.
    - Заведены пользователи с тарифами "Акционный 40 Мбит" , указан следующий тариф "Обычный 10 Мбит", расчетный период указан 3 месяца.
Примечания
  • Ранее в рамках тестов был создан расчетный период 1 час, который не удалось удалить даже "отцепив" от всех пользователей
Что произошло
  • - Во время расчетного периода деньги списывались корректно и всё функционировало корректно.
    - 01.11.2014 в 00:00 произошло переключение тарифного плана на "Обычный 10 Мбит"
    - До 01.11.2014 00:00 был расчетный период "3 месяца", в 01.11.2014 00:00 выставился новый расчетный период "1 час" (!!!).
    - Через новый расчетный период (через 1 час) произошло списание абонентской платы 100 рублей, еще через час еще 100 рублей. И т.д. до блокировки абонента. То есть деньги "выжрались" за считанные часы.
Проблематика
  • Соответственно, новый расчетный период(РП) после смены тарифного плана был выставлен автоматически. Почему был выбран именно "1 час" мне непонятно. В документации логики выбора РП я не нашел. Выбрать при заведении пользователя следующий РП невозможно (следующий тарифный план можно).
Вопрос
  • - Кто сталкивался с подобной проблемой?
    - Как она решается?
    - Как выбрать следующий РП?
    - Какие обходные пути для корректного создания Акций (на несколько месяцев) имеются?

Shiva
Сообщения: 131
Зарегистрирован: Пт авг 28, 2009 12:39
Откуда: Россия, Тверь

Re: Смена тарифного плана / Перевод расчетного периода

Сообщение Shiva »

Dmitry P. писал(а):- Какие обходные пути для корректного создания Акций (на несколько месяцев) имеются?
эксель, память, листочки, скрипты...

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Re: Смена тарифного плана / Перевод расчетного периода

Сообщение Dmitry P. »

Shiva писал(а):эксель, память, листочки, скрипты...
Ух, как всё запущено...Вариант с первыми тремя пунктами меня совсем не устраивает. Переключение по окончанию акции обычно происходит в полночь и ручной перевод абонентов неудобен, длителен по времени и не по фэн-шую!
  • О скриптах какого плана Вы говорите? Взаимодействия с БД напрямую или же работы через API?
    Вы реализовывали такого рода скрипты?
    Вообще говоря странно, если корректного механизма Акций не предусмотрено!

Shiva
Сообщения: 131
Зарегистрирован: Пт авг 28, 2009 12:39
Откуда: Россия, Тверь

Сообщение Shiva »

Выбираем в конце месяца тех, кто на акции сидит третий месяц, выставляем им следующий тариф на нужный. По окончанию РП тариф сменится нормально.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Shiva писал(а):Выбираем в конце месяца тех, кто на акции сидит третий месяц, выставляем им следующий тариф на нужный. По окончанию РП тариф сменится нормально.
То есть имеется разница?:
  • Задать следующий ТП (тарифный план) сразу при заведении абонента
    Задать следующий ТП за несколько дней до окончания акции
Но автоматическая (непрограммируемая) логика перевода РП вообще не ясна. Почему в Вашем случае он выбирает правильный РП?
Сколько у Вас всего РП?
Вы умеете удалять РП?

Shiva
Сообщения: 131
Зарегистрирован: Пт авг 28, 2009 12:39
Откуда: Россия, Тверь

Сообщение Shiva »

Периоды в обоих случаях по месяцу.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Появились некоторые умозаключения и выводы.
1. Судя по документации для UTM5 "Удалить расчётный период невозможно"

Код: Выделить всё

http://www.netup.ru/UTM5/documentation/5.3-001/Admin_rus.html
По описанию таблиц (см.ссылку ниже) я нашел таблицу, которая отвечает за расчетные периоды

Код: Выделить всё

http://bearchik.blogspot.ru/2009/12/utm5-netup.html
Таким запросом вы сможете получить все активные расчетные периоды

Код: Выделить всё

mysql> select * from discount_periods where is_expired=0;
Если в нужной строке изменить is_expired=1, то РП станет неактивным. Вы его "удалите". Но необходимо удостовериться, что нет пользователей, которые "висят" на данном расчетном периоде.
Для этого смотрим:

Код: Выделить всё

select * from account_tariff_link where is_deleted=0 and discount_period_id=ИСКОМЫЙ_ID order by account_id;
Если пусто, то смело удаляем ненужный РП (не удаляйте расчетный период с id=1, он технологический. Через админку его не видно).

2. Единственный нормальный метод (найденный мною) проведения акций следующий (пример акция 3 месяца):
  • Создаете новый ТП
    Заводите пользователя на новый ТП
    Задаете РП 1 месяц
    Первый и второй месяца ничего не делаете с данным пользователем
    Когда наступает третий месяц (последний в акции), т.е. после 1 числа, находите всех акционных пользователей и указываете им следующий ТП.
    Получается, что по окончанию РП в месяц все пользователи переведутся на новый ТП. А РП останется прежним, так как он в системе один.
При таком методе имеются ограничения на Акции. Они должны быть кратны 1 месяцу, то есть акцию в 45 дней провести не удастся.

По окончанию проведения экспериментов с переводом своих пользователей на корректные РП я отпишусь и вопрос будет закрыт.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Как выяснилось для перевода лицевого счета на необходимый расчетный период необходимо выполнить следующее:
  • 1. Знать необходимый discount_periods.id РП, на который будет осуществлен переход (в моем случае умолченный Ежемесячный)

    2. Получить список всех номеров лицевых счетов, с которыми будут произведены нижеописанные манипуляции

    Код: Выделить всё

    select account_id from account_tariff_link where is_deleted=0 and discount_period_id<>ID_требуемого_РП order by account_id;
    3.

    Код: Выделить всё

    /etc/init.d/utm5_core stop
    4. Выполнить изменения в таблице periodic_service_links. Если необходимо сразу для всех пользователей, которые не на нужном РП, то так:

    Код: Выделить всё

    select count&#40;*&#41; from periodic_service_links where discount_period_id<>ID_требуемого_РП and is_deleted=0;
    update periodic_service_links set discount_period_id=ID_требуемого_РП  where discount_period_id<>ID_требуемого_РП and is_deleted=0;
    select count&#40;*&#41; from periodic_service_links where discount_period_id<>ID_требуемого_РП and is_deleted=0;
    5. Выполнить изменения в таблице account_tariff_link. Если необходимо сразу для всех пользователей, которые не на нужном РП, то так:

    Код: Выделить всё

    select count&#40;*&#41; from account_tariff_link where is_deleted=0 and discount_period_id<>ID_требуемого_РП  order by account_id;
    update account_tariff_link set discount_period_id=ID_требуемого_РП  where discount_period_id<>ID_требуемого_РП  and is_deleted=0;
    select count&#40;*&#41; from account_tariff_link where is_deleted=0 and discount_period_id<>ID_требуемого_РП  order by account_id;
    6.

    Код: Выделить всё

    /etc/init.d/utm5_core start
    7. Проверить не списалось ли у лицевых счетов, с которыми были произведены манипуляции (пункт 2), "странные" суммы. Если списались, то зачислить данные суммы на лицевой счет.
Затем при необходимости можно удалить отвязанные РП. Как это делать и имеются ли нюансы отпишусь позднее.
Последний раз редактировалось Dmitry P. Ср янв 28, 2015 07:42, всего редактировалось 2 раза.

kirush
Сообщения: 699
Зарегистрирован: Пт фев 04, 2005 13:58

Сообщение kirush »

Попробовали?
Хочу тоже самое осуществить:
viewtopic.php?t=9530

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Все вышеописанные действия я пробовал на сервере в продакшне. Всё работает. Но необходимо было делать перерасчет по каждому лицевому счету. Причину этого выяснить не удалось.
Соответственно Вашу проблему с переводом пользователей на необходимый РП в ситуации идентичной моей Вы решить сможете.
Удаление "ненужных" РП я пока не испытывал.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Все мои умозаключения получены эмпирическим путем, а не теоретическим.

kirush
Сообщения: 699
Зарегистрирован: Пт фев 04, 2005 13:58

Сообщение kirush »

спасибо, попробуем, хотелось бы конечно услышать комментарии от Netup, ничего ли не забыто в данных изменениях.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Во-первых, зачем им отвечать? Это "бесплатный" форум. За ТП на платный.
Во-вторых, не думаю, что разработчики приветствуют прямой UPDATE в БД. Это не "best practice", как говорят в Cisco.

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Процедура удаления расчетного периода:
  • 1. Получения списка всех активных РП (XXXXXX скрытое мною)

    Код: Выделить всё

    select * from discount_periods where is_expired=0;
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    | id   | start_date | end_date   | periodic_type | next_discount_period_id | discount_interval | canonical_len | is_expired | custom_duration | static_id |
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    |    1 |          0 | 2000000000 |             1 |                       0 |                 0 |    2000000000 |          0 |               0 |         0 |
    | 2437 | XXXXXX | XXXXXX |       1048576 |                       0 |            XXXXXX |       XXXXXX |          0 |         XXXXXX |         2 |
    | 3989 | 1414785600 | 1417464000 |             3 |                       0 |                 0 |       2678400 |          0 |               1 |         1 |
    | 4022 | XXXXXX | XXXXXX |       1048576 |                       0 |            XXXXXX |          XXXXXX |          0 |            XXXXXX |         4 |
    | 4307 | XXXXXX | XXXXXX |       1048576 |                       0 |                 0 |         XXXXXX |          0 |           XXXXXX |         5 |
    | 4319 | XXXXXX | XXXXXX |       1048576 |                       0 |                 0 |          XXXXXX |          0 |            XXXXXX |         3 |
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    6 rows in set &#40;0.01 sec&#41;
    
    2. Определяем id РП, которые необходимо удалить. Штатные РП имеют periodic_type < 10. В моем случае это 1 (неотображаемый РП, видимо время жизни UTM5. Так как дата его окончания 2020 год) id=1, а также 3 (Ежемесячный) id=3989.
    Остальные имели periodic_type равный 1048576.

    3.

    Код: Выделить всё

    /etc/init.d/utm5_core stop
    4. Переводим РП в неактивный режим. Запрос конкретно для моего случая

    Код: Выделить всё

    mysql> update discount_periods set is_expired=1, next_discount_period_id=3989 where id=2437 or id=4022 or id=4307 or id=4319;
    Query OK, 4 rows affected &#40;0.05 sec&#41;
    Rows matched&#58; 4  Changed&#58; 4  Warnings&#58; 0
    5. Проверяем корректность отработки запроса

    Код: Выделить всё

    mysql> select * from discount_periods where is_expired=0;
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    | id   | start_date | end_date   | periodic_type | next_discount_period_id | discount_interval | canonical_len | is_expired | custom_duration | static_id |
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    |    1 |          0 | 2000000000 |             1 |                       0 |                 0 |    2000000000 |          0 |               0 |         0 |
    | 3989 | 1414785600 | 1417464000 |             3 |                       0 |                 0 |       2678400 |          0 |               1 |         1 |
    +------+------------+------------+---------------+-------------------------+-------------------+---------------+------------+-----------------+-----------+
    2 rows in set &#40;0.00 sec&#41;
    6.

    Код: Выделить всё

    /etc/init.d/utm5_core start
    7. Проверяем через админку корректность удаления РП.

    8. 1 числа следующего месяца не забываем проверить корректность заведения нового РП. Должен увеличится id на единичку от максимального значения в таблице. В моем случае будет 4320. И у всех пользователей изменится id РП.

    Код: Выделить всё

    mysql> select max&#40;id&#41; from discount_periods;
    +---------+
    | max&#40;id&#41; |
    +---------+
    |    4319 |
    +---------+
    1 row in set &#40;0.00 sec&#41;

Dmitry P.
Сообщения: 18
Зарегистрирован: Ср ноя 05, 2014 08:40

Сообщение Dmitry P. »

Надеюсь данная тема будет полезна.
Всем удачи, всем успехов!

Ответить