<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%22%D0%91%D0%BE%D0%BD%D1%83%D1%81%D0%BD%D1%8B%D0%B9_%D1%81%D1%87%D0%B5%D1%82%22</id>
	<title>Модуль &quot;Бонусный счет&quot; - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%22%D0%91%D0%BE%D0%BD%D1%83%D1%81%D0%BD%D1%8B%D0%B9_%D1%81%D1%87%D0%B5%D1%82%22"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:31:02Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv: /* Автоматический  перевод финансов с бонусного на основной счет при пополнении */</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2019-08-20T19:51:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Автоматический  перевод финансов с бонусного на основной счет при пополнении&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Возможности==&lt;br /&gt;
&lt;br /&gt;
Модуль добавляет в биллинг 2 фичи (могут быть задействованы как обе, так и только одна):&lt;br /&gt;
&lt;br /&gt;
* Услуга, которая при завершении пополняет основной и/или бонусный счет&lt;br /&gt;
* При пополнении основного счета, с бонусного, если на нем достаточно финансов, на основной счет будет переведена сумма, эквивалентная пополнению.&lt;br /&gt;
&lt;br /&gt;
==Бонусная услуга==&lt;br /&gt;
Может быть применена в акциях «Пополни счет на 100$ и через 3 месяца будет зачислено 110$» или «Пополни счет на 100$ и через 3 месяца будет зачислено 100$, а на бонусный счет 10$».&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
* Абонент пополняет счет на 100$&lt;br /&gt;
* Баланс увеличивается на 100$&lt;br /&gt;
* Подключает услугу «Депозит» с описанием «Пополни счет на 100$ и через 3 месяца будет зачислено 110$»&lt;br /&gt;
* Со счета списывается 100$&lt;br /&gt;
* Через 3 месяца завершается услуга и основной счет пополняется на 110$&lt;br /&gt;
&lt;br /&gt;
Естественно, все параметры (деньги, время, комментарий) настраиваемы:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bonus_balance.png|700px]]&lt;br /&gt;
&lt;br /&gt;
При настройке услуги поставьте галку «Запретить клиентам продлевать эту услугу» чтобы при переустановке услуги она не замораживалась когда включена такая фича.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, после подключения услуги, деньги как бы резервируются и абонент не сможет ими распоряжаться.&lt;br /&gt;
&lt;br /&gt;
==Бонусный счет==&lt;br /&gt;
&lt;br /&gt;
Создайте дополнительное поле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Имя поля     : Бонусный баланс&lt;br /&gt;
Имя поля в бд : _bonus_balance&lt;br /&gt;
Тип поля      : деньги&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Автоматический  перевод финансов с бонусного на основной счет при пополнении==&lt;br /&gt;
&lt;br /&gt;
Создайте услугу типа «Бонус при завершении»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Имя услуги: С бонусного на основной (можно иное название)&lt;br /&gt;
Стоимость: неважно (использоваться не будет)&lt;br /&gt;
Описание, которое будут видеть клиенты: неважно (использоваться не будет)&lt;br /&gt;
Автопродление: не ставим галку&lt;br /&gt;
Запрет продления: ставим галку&lt;br /&gt;
Группы: не ставим ни одной галки!&lt;br /&gt;
Пополнение основного счета: неважно (вычисляется динамически)&lt;br /&gt;
Комментарий к пополнению (основного счета): «перевод бонусов на основной счет»&lt;br /&gt;
Пополнение бонусного счета: неважно (использоваться не будет)&lt;br /&gt;
Комментарий к пополнению (бонусного счета): неважно (использоваться не будет)&lt;br /&gt;
Режим: неважно (использоваться не будет)&lt;br /&gt;
Срок действия: неважно (устанавливается mysql процедурой)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В mysql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP TRIGGER IF EXISTS `tr_bb_pays_insert`;&lt;br /&gt;
&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE TRIGGER tr_bb_pays_insert AFTER INSERT ON pays&lt;br /&gt;
    FOR EACH ROW&lt;br /&gt;
    IF NEW.mid &amp;gt; 0 AND NEW.cash &amp;gt; 0 AND NEW.category NOT IN (2, 3) THEN&lt;br /&gt;
    BEGIN&lt;br /&gt;
        DECLARE money FLOAT;&lt;br /&gt;
        SELECT CAST(IF(_bonus_balance &amp;gt;= NEW.cash, NEW.cash, _bonus_balance) AS DECIMAL(10,2)) INTO money&lt;br /&gt;
            FROM data0 WHERE uid = NEW.mid LIMIT 1;&lt;br /&gt;
        IF money &amp;gt; 0 THEN&lt;br /&gt;
            BEGIN&lt;br /&gt;
                UPDATE data0 SET _bonus_balance = CAST(_bonus_balance - money AS DECIMAL(10,2))&lt;br /&gt;
                    WHERE uid = NEW.mid LIMIT 1;&lt;br /&gt;
                INSERT INTO users_services SET uid=NEW.mid, service_id=98, next_service_id=0,&lt;br /&gt;
                    pay_id=0, tm_start=UNIX_TIMESTAMP(), tm_end=UNIX_TIMESTAMP()+2,&lt;br /&gt;
                    tags=CONCAT(',main_money=', money, ',');&lt;br /&gt;
            END;&lt;br /&gt;
        END IF;&lt;br /&gt;
    END;&lt;br /&gt;
    END IF;&lt;br /&gt;
$$&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DROP TRIGGER IF EXISTS `tr_bb_pays_update`;&lt;br /&gt;
&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE TRIGGER tr_bb_pays_update AFTER UPDATE ON pays&lt;br /&gt;
    FOR EACH ROW&lt;br /&gt;
    IF NEW.mid &amp;gt; 0 AND NEW.cash &amp;gt; 0 AND NEW.category NOT IN (2, 3) AND OLD.category IN (444, 445) THEN&lt;br /&gt;
    BEGIN&lt;br /&gt;
        DECLARE money FLOAT;&lt;br /&gt;
        SELECT CAST(IF(_bonus_balance &amp;gt;= NEW.cash, NEW.cash, _bonus_balance) AS DECIMAL(10,2)) INTO money&lt;br /&gt;
            FROM data0 WHERE uid = NEW.mid LIMIT 1;&lt;br /&gt;
        IF money &amp;gt; 0 THEN&lt;br /&gt;
            BEGIN&lt;br /&gt;
                UPDATE data0 SET _bonus_balance = CAST(_bonus_balance - money AS DECIMAL(10,2))&lt;br /&gt;
                    WHERE uid = NEW.mid LIMIT 1;&lt;br /&gt;
                INSERT INTO users_services SET uid=NEW.mid, service_id=98, next_service_id=0,&lt;br /&gt;
                    pay_id=0, tm_start=UNIX_TIMESTAMP(), tm_end=UNIX_TIMESTAMP()+2,&lt;br /&gt;
                    tags=CONCAT(',main_money=', money, ',');&lt;br /&gt;
            END;&lt;br /&gt;
        END IF;&lt;br /&gt;
    END;&lt;br /&gt;
    END IF;&lt;br /&gt;
$$&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом sql нужно в service_id=98 число 98 заменить на id услуги, что мы создали выше.&lt;br /&gt;
&lt;br /&gt;
==Тестирование==&lt;br /&gt;
&lt;br /&gt;
* В настройках абонента устанавливаем поле «Бонусный баланс», например, в 10$&lt;br /&gt;
* Пополняем счет любым небонусным платежом на 2$&lt;br /&gt;
* Основной баланс увеличится на 2$&lt;br /&gt;
* Бонусный счет уменьшится на 2$&lt;br /&gt;
* Через несколько секунд основной баланс увеличится еще на 2$&lt;br /&gt;
* Появится бонусный платеж на 2$ с комментарием про перевод денег с бонусного на основной счет&lt;br /&gt;
&lt;br /&gt;
Проверка, что с бонусного не спишется больше чем на нем есть:&lt;br /&gt;
* Создаем платеж на 10$&lt;br /&gt;
* Баланс увеличится на 10 + 8, а на бонусном счете станет 0$&lt;br /&gt;
* Дальнейшие любые пополнения не будут менять бонусный счет и пополнять основной баланс бонусами т.к на бонусном счете будет 0&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что ядро должно быть запущено с модулем услуг services, хотя скорее всего он запущен ибо это один из основных модулей в NoDeny.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы==&lt;br /&gt;
&lt;br /&gt;
В mysql создается триггер, который реагирует на создание записей в таблице платежей (pays). Это означает, что неважно как пополняется счет, хоть через платежную систему, хоть карточкой пополнения - триггер это  «увидит»‎, подключит услугу перевода баланса (с длительностью 2 секунды), а также уменьшит бонусный счет.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что бонусный счет уменьшается в триггере. А основной пополняется именно при завершении услуги.&lt;br /&gt;
&lt;br /&gt;
==Вывод бонусного счета в личном кабинете==&lt;br /&gt;
&lt;br /&gt;
Бонусный счет - это дополнительное поле с именем _bonus_balance. Чтобы вывести его значение в личном кабинете, нужно найти соответствующий шаблон и в нужное место вставить вывод значения поля _bonus_balance. Чтобы вы понимали, что будете делать, рекомендуется прочитать:&lt;br /&gt;
*[[Переменные шаблона личного кабинета|Какие переменные есть и как их выводить]]&lt;br /&gt;
*[[Дизайн личного кабинета]]&lt;br /&gt;
&lt;br /&gt;
После прочтения документации по переменным, становится ясно, что баланс можно вывести таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{ user_info.dopdata._bonus_balance.show() }}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из документации по изменению дизайна личного кабинета становится ясно, что не нужно менять файлы с шаблонами, а следует скопировать нужный шаблон в раздел «Документы» и уже там сделать изменения. Если мы хотим, чтобы баланс отображался на всех страницах личного кабинета, нужно править общий шаблон:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat /usr/local/nodeny/web/tmpl/user/base.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скопируйте весь текст из этого файла. В разделе «Документы» создайте папку с именем «Кабинет клиента». Справа в поле «теги» обязательно введите system. В папке «Кабинет клиента» создайте документ с именем «Base» и установите ему теги:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
system&lt;br /&gt;
template=base&lt;br /&gt;
role=user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставьте содержимое файла /usr/local/nodeny/web/tmpl/user/base.html. При этом в тексте после&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;lt;div id='main_block_header'&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
вставьте следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Бонусный баланс: &amp;lt;span&amp;gt;{{ user_info.dopdata._bonus_balance.show() }} {{cfg::gr}}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Автоматическое сообщение абоненту о пополнении бонусного счета==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP TRIGGER IF EXISTS `tr_bb_data0_update`;&lt;br /&gt;
&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE TRIGGER tr_bb_data0_update AFTER UPDATE ON data0&lt;br /&gt;
    FOR EACH ROW&lt;br /&gt;
    IF CAST(NEW._bonus_balance AS DECIMAL(10,2)) &amp;gt; CAST(OLD._bonus_balance AS DECIMAL(10,2)) THEN&lt;br /&gt;
    BEGIN&lt;br /&gt;
        INSERT INTO pays SET cash=0, category=480, reason='', creator='other', creator_ip=0, creator_id=0,&lt;br /&gt;
            time=UNIX_TIMESTAMP(), mid=NEW.uid, comment=&lt;br /&gt;
            CONCAT(&lt;br /&gt;
                'Бонусный счет пополнен на ',&lt;br /&gt;
                CAST(CAST(NEW._bonus_balance AS DECIMAL(10,2)) -&lt;br /&gt;
                    CAST(OLD._bonus_balance AS DECIMAL(10,2)) AS DECIMAL(10,2)),&lt;br /&gt;
                ' грн. Остаток на бонусном счете ',&lt;br /&gt;
                NEW._bonus_balance,&lt;br /&gt;
                ' грн.'&lt;br /&gt;
            );&lt;br /&gt;
    END;&lt;br /&gt;
    END IF;&lt;br /&gt;
$$&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>