<?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%A7%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5_%D1%83%D1%81%D0%BB%D1%83%D0%B3%D0%B8</id>
	<title>Честные услуги - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=%D0%A7%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5_%D1%83%D1%81%D0%BB%D1%83%D0%B3%D0%B8"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:28:24Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv: /* Настройка */</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2020-05-29T09:58:56Z</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;
Честность модуля заключается в том, что сумма списаний соответствует четко времени использования услуги. Это позволяет решить такие частые проблемы как запаздывания внесения абонплаты за услуги доступа в интернет, когда несколько дней учетка заблокирована и доступ фактически не предоставляется. Тогда абонент возмущается «почему я пользовался интернетом 27 дней, а списало как за месяц?»&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Модуль учитывает время услуги только когда учетная запись находится в незаблокированном состоянии. Обратите внимание, блокировка - это основной момент модуля. Мы исходим из того, что когда учетка заблокирована - абонент услугу не получает. Поэтому модуль все время продлевает услугу пока суммарное время разблокированного состояния не станет равным времени, прописанным в услуге .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&lt;br /&gt;
* У абонента 10 грн на счету, завершается тариф и подключается новый, стоимостью 100 грн. На счету -90 грн. Учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа (допустим) 30 дней. Через 5 дней абонент пополняет счет и длительность услуги устанавливается +30 дней от момента пополнения. Следовательно абонент будет пользоваться услугой 30 дней. Но сама услуга будет иметь длительность 35 дней из которых 5 дней абонент не имел возможности ею воспользоваться.&lt;br /&gt;
* У абонента положительный баланс, пользуется услугой 3 дня. Вызов мастера, списали 50 грн. Счет в минусе - учетка блокируется. Модуль «честных услуг» запоминает, что до конца действия тарифа 27 дней (3 из 30 он отработал). Абонент пополняет счет через 10 дней и получает + 27 дней с момента пополнения.&lt;br /&gt;
* Наступил новый месяц. Счет в минусе. Модуль «честных услуг» запоминает, что до конца действия тарифа 30 дней. Клиент 1 день ждет и берет кредит на 2 дня. Через 2 дня кредит аннулируется, учетка блокируется и модуль запоминает 28 дней. Абонент уезжает, счет в минусе. Все это время услуга не завершалась. Приезжает через несколько месяцев, пополняет счет и пользуется 28 дней.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Настройка==&lt;br /&gt;
Кроме установки модуля, необходимо выполнить в консоли mysql:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DROP VIEW IF EXISTS v_fair_services;&lt;br /&gt;
CREATE ALGORITHM=MERGE VIEW v_fair_services AS&lt;br /&gt;
    SELECT u.*, s.module, s.category, s.title, s.description, s.grp_list,&lt;br /&gt;
        s.price, s.auto_renew, s.no_renew, s.param &lt;br /&gt;
    FROM users_services u LEFT JOIN services s ON u.service_id = s.service_id&lt;br /&gt;
    WHERE s.fair = 1;&lt;br /&gt;
&lt;br /&gt;
DROP TRIGGER IF EXISTS `tr_fair_service`;&lt;br /&gt;
&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE TRIGGER tr_fair_service AFTER UPDATE ON users&lt;br /&gt;
    FOR EACH ROW&lt;br /&gt;
    IF OLD.state='on' AND NEW.state='off' THEN&lt;br /&gt;
        UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0&lt;br /&gt;
            WHERE uid=OLD.id AND tm_end &amp;gt; (UNIX_TIMESTAMP() + 5);&lt;br /&gt;
    ELSE&lt;br /&gt;
        IF OLD.state='off' AND NEW.state='on' THEN&lt;br /&gt;
            UPDATE v_fair_services SET tm_end=UNIX_TIMESTAMP()+fair_end, fair_end=0&lt;br /&gt;
                WHERE uid=OLD.id AND fair_end &amp;gt; 0;&lt;br /&gt;
        END IF;&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_fair_service_insert`;&lt;br /&gt;
&lt;br /&gt;
DELIMITER $$&lt;br /&gt;
CREATE TRIGGER tr_fair_service_insert AFTER INSERT ON users_services&lt;br /&gt;
    FOR EACH ROW&lt;br /&gt;
    IF (SELECT 1 FROM services WHERE service_id=NEW.service_id AND fair=1) AND&lt;br /&gt;
       (SELECT 1 FROM users WHERE id=NEW.uid AND state='off')&lt;br /&gt;
    THEN&lt;br /&gt;
        UPDATE v_fair_services SET fair_stop=UNIX_TIMESTAMP(), fair_end=tm_end-UNIX_TIMESTAMP(), tm_end=0&lt;br /&gt;
            WHERE id=NEW.id AND tm_end &amp;gt; 0 AND (tm_end - UNIX_TIMESTAMP()) &amp;gt; 5;&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;
Создайте тестовую услугу, длительностью 1 или 2 минуты (в зависимости от того, насколько вы быстрые чтобы успеть уловить изменения). Подключите тестовому абоненту, у которого на счету достаточно денег. Через одну минуту услуга завершится, подключится новая и счет уйдет в минус (предварительно, подгоните баланс чтоб именно так и произошло). При этом окно с информацией об услуге должно быть следующим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fair service.png|500px]]&lt;br /&gt;
&lt;br /&gt;
При этом, если вы через минуту обновите это окно, время окончания услуги увеличится на 1 минуту. Как только вы пополните счет, что приведет к включению учетки, - услуга продолжит свое действие.&lt;br /&gt;
&lt;br /&gt;
==Техническая информация==&lt;br /&gt;
В таблице уже подключенных услуг users_services добавляются 2 поля:&lt;br /&gt;
&lt;br /&gt;
* fair_stop - timestamp когда в последний раз произошло блокирование учетной записи.&lt;br /&gt;
* fair_end - количество секунд, которое оставалось до окончания услуги в момент блокирование учетной записи.&lt;br /&gt;
&lt;br /&gt;
fair_stop это контрольный параметр, в вычислениях не задействован. Поле fair_end устанавливается по триггеру mysql при изменении таблицы users, так что неважно какой модуль или вручную была заблокирована учетная запись - этот момент отлавливается триггером.&lt;br /&gt;
&lt;br /&gt;
Когда услуга находится в состоянии продления, ее параметр tm_end устанавливается в ноль, что блокирует ее завершение по времени. Как только учетка разблокируется, триггер устанавливает время окончания услуги tm_end = now + fair_end&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>