Честные услуги: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Немає опису редагування
 
(Не показано 9 проміжних версій цього користувача)
Рядок 1: Рядок 1:
Модуль позволяет максимально корректно решить проблему когда абонент не пользовался услугой или пользовался частично и считает, что полное списание не является справедливым в такой ситуации. Опишем некоторые типичные случаи:
==Описание==
 
Честность модуля заключается в том, что сумма списаний соответствует четко времени использования услуги. Это позволяет решить такие частые проблемы как запаздывания внесения абонплаты за услуги доступа в интернет, когда несколько дней учетка заблокирована и доступ фактически не предоставляется. Тогда абонент возмущается «почему я пользовался интернетом 27 дней, а списало как за месяц?»
<br><br>
<br><br>
* При наступлении нового месяца происходит установка тарифа и при этом баланс становится отрицательным - учетка блокируется. Абонент через несколько дней пополняет счет,  доступ в интернет разрешается. По факту клиент пользуется услугой  не полный ее период т.к был заблокирован. А платит за полную стоимость.
Модуль учитывает время услуги только когда учетная запись находится в незаблокированном состоянии. Обратите внимание, блокировка - это основной момент модуля. Мы исходим из того, что когда учетка заблокирована - абонент услугу не получает. Поэтому модуль все время продлевает услугу пока суммарное время разблокированного состояния не станет равным времени, прописанным в услуге .
* При наступлении нового месяца происходит установка тарифа и при этом баланс становится отрицательным - учетка блокируется. Проходит срок тарифа (например, месяц), подключается новый тариф - минус на счете еще увеличился. Прошел месяц, подключился тариф, минус увеличился - у клиента громадный долг, хотя он услугами не пользовался.
 
<br><br>
Если вы хотите лояльно абоненту решить такие вопросы - данный модуль для вас. Модуль учитывает время услуги только когда учетная запись находится в незаблокированном состоянии. Обратите внимание, блокировка - это основной момент модуля. Мы исходим из того, что когда учетка заблокирована - абонент услугу не получает. Поэтому модуль все время продлевает услугу пока не выйдет ее полное  время соотнесенное с временем состояния учетки в разблокированном состоянии.
<br><br>
<br><br>
Примеры:
Примеры:


* У абонента 10 грн на счету, завершается тариф и подключается новый, стоимостью 100 грн. На счету -90 грн. Учетка блокируется. Модуль "честных услуг" запоминает, что до конца действия тарифа (допустим) 30 дней. Через 5 дней абонент пополняет счет и длительность услуги устанавливается +30 дней от момента пополнения. Следовательно абонент будет пользоваться услугой 30 дней. Но сама услуга будет иметь длительность 35 дней из которых 5 дней абонент не имел возможности ею воспользоваться.
* У абонента 10 грн на счету, завершается тариф и подключается новый, стоимостью 100 грн. На счету -90 грн. Учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа (допустим) 30 дней. Через 5 дней абонент пополняет счет и длительность услуги устанавливается +30 дней от момента пополнения. Следовательно абонент будет пользоваться услугой 30 дней. Но сама услуга будет иметь длительность 35 дней из которых 5 дней абонент не имел возможности ею воспользоваться.
* У абонента положительный баланс, пользуется услугой 3 дня. Вызов мастера, списали 50 грн. Счет в минусе - учетка блокируется. Модуль "честных услуг" запоминает, что до конца действия тарифа 27 дней (3 из 30 он отработал). Абонент пополняет счет через 10 дней и получает + 27 дней с момента пополнения.
* У абонента положительный баланс, пользуется услугой 3 дня. Вызов мастера, списали 50 грн. Счет в минусе - учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа 27 дней (3 из 30 он отработал). Абонент пополняет счет через 10 дней и получает + 27 дней с момента пополнения.
* Наступил новый месяц. Счет в минусе. Модуль "честных услуг" запоминает, что до конца действия тарифа 30 дней. Клиент 1 день ждет и берет кредит на 2 дня. Через 2 дня кредит аннулируется, учетка блокируется и модуль запоминает 28 дней. Абонент уезжает, счет в минусе. Все это время услуга не завершалась. Приезжает через несколько месяцев, пополняет счет и пользуется 28 дней.
* Наступил новый месяц. Счет в минусе. Модуль «честных услуг» запоминает, что до конца действия тарифа 30 дней. Клиент 1 день ждет и берет кредит на 2 дня. Через 2 дня кредит аннулируется, учетка блокируется и модуль запоминает 28 дней. Абонент уезжает, счет в минусе. Все это время услуга не завершалась. Приезжает через несколько месяцев, пополняет счет и пользуется 28 дней.
<br><br>
<br><br>
==Настойка==
 
==Настройка==
Кроме установки модуля, необходимо выполнить в консоли mysql:
Кроме установки модуля, необходимо выполнить в консоли mysql:


Рядок 27: Рядок 29:


DELIMITER $$
DELIMITER $$
CREATE TRIGGER tr_fair_service AFTER UPDATE ON users
CREATE TRIGGER tr_fair_service AFTER UPDATE ON users
     FOR EACH ROW
     FOR EACH ROW
     IF OLD.state='on' AND NEW.state='off' THEN
     IF OLD.state='on' AND NEW.state='off' THEN
         UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0
         UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0
             WHERE uid=OLD.id AND tm_end > 0 AND (tm_end - UNIX_TIMESTAMP()) > 5;
             WHERE uid=OLD.id AND tm_end > (UNIX_TIMESTAMP() + 5);
     ELSE
     ELSE
         IF OLD.state='off' AND NEW.state='on' THEN
         IF OLD.state='off' AND NEW.state='on' THEN
Рядок 59: Рядок 61:
Создайте тестовую услугу, длительностью 1 или 2 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим:
Создайте тестовую услугу, длительностью 1 или 2 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим:


[[Файл:Fair service.png|400px]]
[[Файл:Fair service.png|500px]]
 
При этом, если вы через минуту обновите это окно, время окончания услуги увеличится на 1 минуту. Как только вы пополните счет, что приведет к включению учетки, - услуга продолжит свое действие.
 
==Техническая информация==
В таблице уже подключенных услуг users_services добавляются 2 поля:
 
* fair_stop - timestamp когда в последний раз произошло блокирование учетной записи.
* fair_end - количество секунд, которое оставалось до окончания услуги в момент блокирование учетной записи.
 
fair_stop это контрольный параметр, в вычислениях не задействован. Поле fair_end устанавливается по триггеру mysql при изменении таблицы users, так что неважно какой модуль или вручную была заблокирована учетная запись - этот момент отлавливается триггером.
 
Когда услуга находится в состоянии продления, ее параметр tm_end устанавливается в ноль, что блокирует ее завершение по времени. Как только учетка разблокируется, триггер устанавливает время окончания услуги tm_end = now + fair_end

Поточна версія на 09:58, 29 травня 2020

Описание

Честность модуля заключается в том, что сумма списаний соответствует четко времени использования услуги. Это позволяет решить такие частые проблемы как запаздывания внесения абонплаты за услуги доступа в интернет, когда несколько дней учетка заблокирована и доступ фактически не предоставляется. Тогда абонент возмущается «почему я пользовался интернетом 27 дней, а списало как за месяц?»

Модуль учитывает время услуги только когда учетная запись находится в незаблокированном состоянии. Обратите внимание, блокировка - это основной момент модуля. Мы исходим из того, что когда учетка заблокирована - абонент услугу не получает. Поэтому модуль все время продлевает услугу пока суммарное время разблокированного состояния не станет равным времени, прописанным в услуге .



Примеры:

  • У абонента 10 грн на счету, завершается тариф и подключается новый, стоимостью 100 грн. На счету -90 грн. Учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа (допустим) 30 дней. Через 5 дней абонент пополняет счет и длительность услуги устанавливается +30 дней от момента пополнения. Следовательно абонент будет пользоваться услугой 30 дней. Но сама услуга будет иметь длительность 35 дней из которых 5 дней абонент не имел возможности ею воспользоваться.
  • У абонента положительный баланс, пользуется услугой 3 дня. Вызов мастера, списали 50 грн. Счет в минусе - учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа 27 дней (3 из 30 он отработал). Абонент пополняет счет через 10 дней и получает + 27 дней с момента пополнения.
  • Наступил новый месяц. Счет в минусе. Модуль «честных услуг» запоминает, что до конца действия тарифа 30 дней. Клиент 1 день ждет и берет кредит на 2 дня. Через 2 дня кредит аннулируется, учетка блокируется и модуль запоминает 28 дней. Абонент уезжает, счет в минусе. Все это время услуга не завершалась. Приезжает через несколько месяцев, пополняет счет и пользуется 28 дней.



Настройка

Кроме установки модуля, необходимо выполнить в консоли mysql:


DROP VIEW IF EXISTS v_fair_services;
CREATE ALGORITHM=MERGE VIEW v_fair_services AS
    SELECT u.*, s.module, s.category, s.title, s.description, s.grp_list,
        s.price, s.auto_renew, s.no_renew, s.param 
    FROM users_services u LEFT JOIN services s ON u.service_id = s.service_id
    WHERE s.fair = 1;

DROP TRIGGER IF EXISTS `tr_fair_service`;

DELIMITER $$
CREATE TRIGGER tr_fair_service AFTER UPDATE ON users
    FOR EACH ROW
    IF OLD.state='on' AND NEW.state='off' THEN
        UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0
            WHERE uid=OLD.id AND tm_end > (UNIX_TIMESTAMP() + 5);
    ELSE
        IF OLD.state='off' AND NEW.state='on' THEN
            UPDATE v_fair_services SET tm_end=UNIX_TIMESTAMP()+fair_end, fair_end=0
                WHERE uid=OLD.id AND fair_end > 0;
        END IF;
    END IF;
$$
DELIMITER ;


DROP TRIGGER IF EXISTS `tr_fair_service_insert`;

DELIMITER $$
CREATE TRIGGER tr_fair_service_insert AFTER INSERT ON users_services
    FOR EACH ROW
    IF (SELECT 1 FROM services WHERE service_id=NEW.service_id AND fair=1) AND
       (SELECT 1 FROM users WHERE id=NEW.uid AND state='off')
    THEN
        UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0
            WHERE id=NEW.id AND tm_end > 0 AND (tm_end - UNIX_TIMESTAMP()) > 5;
    END IF;
$$
DELIMITER ;

Создайте тестовую услугу, длительностью 1 или 2 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим:

При этом, если вы через минуту обновите это окно, время окончания услуги увеличится на 1 минуту. Как только вы пополните счет, что приведет к включению учетки, - услуга продолжит свое действие.

Техническая информация

В таблице уже подключенных услуг users_services добавляются 2 поля:

  • fair_stop - timestamp когда в последний раз произошло блокирование учетной записи.
  • fair_end - количество секунд, которое оставалось до окончания услуги в момент блокирование учетной записи.

fair_stop это контрольный параметр, в вычислениях не задействован. Поле fair_end устанавливается по триггеру mysql при изменении таблицы users, так что неважно какой модуль или вручную была заблокирована учетная запись - этот момент отлавливается триггером.

Когда услуга находится в состоянии продления, ее параметр tm_end устанавливается в ноль, что блокирует ее завершение по времени. Как только учетка разблокируется, триггер устанавливает время окончания услуги tm_end = now + fair_end