Модуль "Бонусный счет": відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Рядок 7: Рядок 7:


==Бонусная услуга==
==Бонусная услуга==
Может быть применена в акциях «Пополни счет на 100$ и через 3 месяца на счет будет зачислено 110$» или «Пополни счет на 100$ и через 3 месяца на счет будет зачислено 100$, а на бонусный счет 10$».
Может быть применена в акциях «Пополни счет на 100$ и через 3 месяца будет зачислено 110$» или «Пополни счет на 100$ и через 3 месяца будет зачислено 100$, а на бонусный счет 10$».


Пример:
Пример:
Рядок 13: Рядок 13:
* Абонент пополняет счет на 100$
* Абонент пополняет счет на 100$
* Баланс увеличивается на 100$
* Баланс увеличивается на 100$
* Подключает услугу «Депозит» с описанием «Пополни счет на 100$ и через 3 месяца на счет будет зачислено 110$»
* Подключает услугу «Депозит» с описанием «Пополни счет на 100$ и через 3 месяца будет зачислено 110$»
* Со счета списывается 100$
* Со счета списывается 100$
* Через 3 месяца завершается услуга и основной счет пополняется на 110$
* Через 3 месяца завершается услуга и основной счет пополняется на 110$
Рядок 21: Рядок 21:
[[Файл:Bonus_balance.png|700px]]
[[Файл:Bonus_balance.png|700px]]


При настройке услуги поставьте галку «Запретить клиентам продлевать эту услугу».
При настройке услуги поставьте галку «Запретить клиентам продлевать эту услугу» чтобы при переустановке услуги она не замораживалась когда включена такая фича.


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

Версія за 22:05, 6 липня 2019

Возможности

Модуль добавляет в биллинг 2 фичи (могут быть задействованы как обе, так и только одна):

  • Услуга, которая при завершении пополняет основной и/или бонусный счет
  • Отдельный бонусный счет. При пополнении основного счета, с бонусного, если на нем достаточно финансов, на основной счет будет переведена сумма, эквивалентная пополнению.

Бонусная услуга

Может быть применена в акциях «Пополни счет на 100$ и через 3 месяца будет зачислено 110$» или «Пополни счет на 100$ и через 3 месяца будет зачислено 100$, а на бонусный счет 10$».

Пример:

  • Абонент пополняет счет на 100$
  • Баланс увеличивается на 100$
  • Подключает услугу «Депозит» с описанием «Пополни счет на 100$ и через 3 месяца будет зачислено 110$»
  • Со счета списывается 100$
  • Через 3 месяца завершается услуга и основной счет пополняется на 110$

Естественно, все параметры (деньги, время, комментарий) настраиваемы:

При настройке услуги поставьте галку «Запретить клиентам продлевать эту услугу» чтобы при переустановке услуги она не замораживалась когда включена такая фича.

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

Бонусный счет

Создайте дополнительное поле:

Имя поля     : Бонусный баланс
Имя поля в бд : _bonus_balance
Тип поля      : деньги

Создайте услугу типа «Бонус при завершении»:

Имя услуги: С бонусного на основной
Стоимость: неважно (использоваться не будет)
Описание, которое будут видеть клиенты: Перевод с бонусного счета на основной (это будет в комментарии бонусного платежа)
Автопродление: не ставим галку
Запрет продления: ставим галку
Группы: не ставим ни одной галки!
Сумма: неважно (использоваться не будет)
Режим: неважно (использоваться не будет)
Срок действия: неважно (использоваться не будет)

В mysql:

DROP TRIGGER IF EXISTS `tr_bb_pays_insert`;

DELIMITER $$
CREATE TRIGGER tr_bb_pays_insert AFTER INSERT ON pays
    FOR EACH ROW
    IF NEW.mid > 0 AND NEW.cash > 0 AND NEW.category <> 2 THEN
    BEGIN
        DECLARE money FLOAT;
        SELECT IF(_bonus_balance >= NEW.cash, NEW.cash, _bonus_balance) INTO money
            FROM data0 WHERE uid = NEW.mid LIMIT 1;
        IF money > 0 THEN
            BEGIN
                UPDATE data0 SET _bonus_balance = _bonus_balance - money WHERE uid = NEW.mid LIMIT 1;
                INSERT INTO users_services SET uid=NEW.mid, service_id=98, next_service_id=0,
                    pay_id=0, tm_start=UNIX_TIMESTAMP(), tm_end=UNIX_TIMESTAMP()+2,
                    tags=CONCAT(',main_money=', money, ',');
            END;
        END IF;
    END;
    END IF;
$$
DELIMITER ;

Тестирование

  • В настройках абонента устанавливаем поле «Бонусный баланс», например, в 10$
  • Пополняем счет любым небонусным платежом на 2$
  • Основной баланс увеличится на 2$
  • Бонусный счет уменьшится на 2$
  • Через несколько секунд основной баланс увеличится еще на 2$
  • Появится бонусный платеж на 2$ с комментарием про перевод денег с бонусного на основной счет

Проверка, что с бонусного не спишется больше чем на нем есть:

  • Создаем платеж на 10$
  • Баланс увеличится на 10 + 8, а на бонусном счете станет 0$
  • Дальнейшие любые пополнения не будут менять бонусный счет и пополнять основной баланс бонусами т.к на бонусном счете будет 0

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

Принцип работы

В mysql создается триггер, который реагирует на создание записей в таблице платежей (pays). Это означает, что неважно как пополняется счет, хоть через платежную систему, хоть карточкой пополнения - триггер это «увидит»‎, подключит услугу перевода баланса (с длительностью 2 секунды), а также уменьшит бонусный счет.

Обратите внимание, что бонусный счет уменьшается в триггере. А основной пополняется именно при завершении услуги.