Биллинговая система Nodeny

Главная категория => Модули NodenyPlus => Тема начата: Efendy от 14 Апреля 2019, 17:05:13



Название: Честные услуги
Отправлено: Efendy от 14 Апреля 2019, 17:05:13
Сделал модуль "честные услуги". Как работает:

в момент блокировки учетной записи запоминается сколько времени сталось до завершения услуги. В момент переключения в разблокированное состояние время завершения устанавливается текущее время + остаток на момент блокировки.

Мне кажется, эта фича станет основной по решению проблемы ухода в минус вместо всяких заморозок и т.д. Я даже назвал "честным" такой модуль, потому что с стороны клиента не должно возникать никаких претензий. Объясню на примерах:

1) У абона 10 грн на счету, завершается тариф и подключается новый, стоимостью 100 грн. На счету -90 грн. Учетка блокируется. Модуль "честных услуг" запоминает, что до конца действия тарифа (допустим) 30 дней. Через 5 дней абон пополняет счет и длительность услуги устанавливается +30 дней от момента пополнения

Допустим дальше:

2) через 3 дня со счета абона списали 50 грн за вызов мастера. Счет в минусе - клиент блокируется. Модуль "честных услуг" запоминает, что до конца действия тарифа 27 дней (3 из 30 он отработал). Клиент пополняет счет через 10 дней и получает + 27 дней

Допустим дальше:

3) Наступил новый месяц. Счет снова в минусе. Модуль "честных услуг" запоминает, что до конца действия тарифа 30 дней. Клиент 1 день тупит и берет кредит на 2 дня. Через 2 дня кредит анулируется, учетка блокируется и модуль запоминает 28 дней. Абон уезжает в Польшу на несколько месяцев, счет в минусе. Все это время услуга не завершалась. Приезжает, пополняет счет и пользуется 28 дней


Модуль готов, сейчас его тестирую


Название: Re: Честные услуги
Отправлено: skreep от 15 Апреля 2019, 13:18:10
Доброго дня!!!

 Як даний модуль буде взаємодіяти з тарифами де активовано "короткі послуги", абонплата за добу?


Название: Re: Честные услуги
Отправлено: Efendy от 15 Апреля 2019, 17:51:51
На всякий случай повторю: фича "честных услуг" может активироваться для конкретной услуги. С короткими услугами не должна конфликтовать т.к все, что она делает - меняет длительность уже подключенной услуги. Короткие услуги ориентируются на баланс и если он меньше стоимости услуги, подключает услугу на другой период и другую стоимость. Дальше модуль кротких услуг никак не влияет на уже подключенный тариф. А вот "честные услуги" влияют, а именно на длительность


Название: Re: Честные услуги
Отправлено: tima от 28 Мая 2020, 17:33:23
День добрый! После установки модуля честных услуг, при попытке ручного изменения поля «Заблокирован» получаю ошибку:
Код:
The target table v_fair_services of the UPDATE is not updatable 
{
  'param' => [
    'off',
    14
  ],
  'sql' => 'UPDATE users SET state=?, modify_time=UNIX_TIMESTAMP() WHERE id=? LIMIT 1'
};
 UPDATE users SET state='off', modify_time=UNIX_TIMESTAMP() WHERE id='14' LIMIT 1
Подскажите, плиз, куда смотреть. Заранее благодарен.


Название: Re: Честные услуги
Отправлено: Efendy от 28 Мая 2020, 21:24:22
какая версия mysql у тебя?


Название: Re: Честные услуги
Отправлено: tima от 28 Мая 2020, 21:52:36
Код:
mysql  Ver 14.14 Distrib 5.7.30, for FreeBSD12.1 (amd64) using  EditLine wrapper


Название: Re: Честные услуги
Отправлено: Efendy от 29 Мая 2020, 12:06:40
Да, огорчает mysql. В новых версиях не умеет делать то, что умел в старых. Придется переписать апдейт VIEW на апдейт с JOIN. Выполни:

Код:
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
                users_services u LEFT JOIN services s ON u.service_id = s.service_id
            SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0
                WHERE s.fair=1 AND uid=OLD.id AND tm_end > (UNIX_TIMESTAMP() + 5);
    ELSE
        IF OLD.state='off' AND NEW.state='on' THEN
            UPDATE
                users_services u LEFT JOIN services s ON u.service_id = s.service_id
            SET tm_end=UNIX_TIMESTAMP()+fair_end, fair_end=0
                WHERE s.fair=1 AND 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
            users_services u LEFT JOIN services s ON u.service_id = s.service_id
        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 ;


Название: Re: Честные услуги
Отправлено: tima от 29 Мая 2020, 16:19:11
Спасибо! Помогло )
Пока проверяю работу модуля, нашел особенность  - при подключении честной услуги заблокированному абоненту (не зависимо от состояния баланса) – не отображается в списке подключенных услуг, но при этом снимает деньги с баланса, отображая это в «Истории».