Честные услуги: відмінності між версіями
Sv (обговорення | внесок) Немає опису редагування |
Sv (обговорення | внесок) Немає опису редагування |
||
Рядок 8: | Рядок 8: | ||
Примеры: | Примеры: | ||
* У абонента 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 дней. | * Наступил новый месяц. Счет в минусе. Модуль "честных услуг" запоминает, что до конца действия тарифа 30 дней. Клиент 1 день ждет и берет кредит на 2 дня. Через 2 дня кредит аннулируется, учетка блокируется и модуль запоминает 28 дней. Абонент уезжает, счет в минусе. Все это время услуга не завершалась. Приезжает через несколько месяцев, пополняет счет и пользуется 28 дней. | ||
<br><br> | <br><br> | ||
==Настойка== | |||
Кроме установки модуля, необходимо выполнить в консоли mysql: | |||
<pre> | |||
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 > 0 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 ; | |||
</pre> | |||
Создайте тестовую услугу, длительностью 1 или 2 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим: |
Версія за 15:59, 15 квітня 2019
Модуль позволяет максимально корректно решить проблему когда абонент не пользовался услугой или пользовался частично и считает, что полное списание не является справедливым в такой ситуации. Опишем некоторые типичные случаи:
- При наступлении нового месяца происходит установка тарифа и при этом баланс становится отрицательным - учетка блокируется. Абонент через несколько дней пополняет счет, доступ в интернет разрешается. По факту клиент пользуется услугой не полный ее период т.к был заблокирован. А платит за полную стоимость.
- При наступлении нового месяца происходит установка тарифа и при этом баланс становится отрицательным - учетка блокируется. Проходит срок тарифа (например, месяц), подключается новый тариф - минус на счете еще увеличился. Прошел месяц, подключился тариф, минус увеличился - у клиента громадный долг, хотя он услугами не пользовался.
Если вы хотите лояльно абоненту решить такие вопросы - данный модуль для вас. Модуль учитывает время услуги только когда учетная запись находится в незаблокированном состоянии. Обратите внимание, блокировка - это основной момент модуля. Мы исходим из того, что когда учетка заблокирована - абонент услугу не получает. Поэтому модуль все время продлевает услугу пока не выйдет ее полное время соотнесенное с временем состояния учетки в разблокированном состоянии.
Примеры:
- У абонента 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 > 0 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 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим: