Не списывать абонентскую плату при недостатке средств

Технические вопросы по UTM 5.0
rem_111
Сообщения: 22
Зарегистрирован: Вт сен 19, 2006 18:10
Контактная информация:

Сообщение rem_111 »

integral писал(а)::) Аналогично, попробовал у себя первый раз скрипт по отключению вроде всё сработало, второй скрипт не использую так как мы всех пользователей включаем сами когда они денежки приносят..
Очень большую роль сыграло добавление sleep 1 в скрипт, т.к. ядро не "успевало" :)

[-Alt-]
Сообщения: 13
Зарегистрирован: Ср апр 22, 2009 10:16

Сообщение [-Alt-] »

dk писал(а):Все эти скрипты будут работать неправильно, если юзер меняет тариф. Лучше всё же через users, [users_accounts,] accounts, account_tariff_link, tariffs_services_link, periodic_services_data.
Да кстати, я тоже заметил, оно суммирует абонентку старого и нового тарифа.

Пришлось сделать хранимую процедуру и поменять запросы:

Код: Выделить всё

CREATE DEFINER=`alt`@`%` FUNCTION `all_services_fee`(`account_id` int(11)) RETURNS double
BEGIN
  DECLARE fee double DEFAULT 0;    
  DECLARE tmp_fee double DEFAULT 0;

    SELECT SUM(`periodic_services_data`.`cost`) into tmp_fee
    FROM `account_tariff_link`
      INNER JOIN `tariffs_services_link` on (`account_tariff_link`.`tariff_id` = `tariffs_services_link`.`tariff_id`)
      LEFT OUTER JOIN `periodic_services_data` ON (`tariffs_services_link`.`service_id` = `periodic_services_data`.`id`)
    WHERE    
      `account_tariff_link`.`account_id` = account_id and
      `account_tariff_link`.`is_deleted` = 0 and
      `tariffs_services_link`.`is_deleted` = 0 AND
      `periodic_services_data`.`is_deleted` = 0 AND
      `periodic_services_data`.`discount_method` = 1 AND
      `periodic_services_data`.`cost` > 0;

  set fee = fee + tmp_fee;  

    SELECT
      SUM(`periodic_services_data`.`cost`) into tmp_fee
    FROM
      `service_links`
      LEFT OUTER JOIN `periodic_services_data` ON (`service_links`.`service_id` = `periodic_services_data`.`id`)
    WHERE    
      `service_links`.`account_id`=account_id and      
      `service_links`.`tariff_link_id` = 0 and
      `service_links`.`is_deleted` = 0 AND
      `periodic_services_data`.`is_deleted` = 0 AND
      `periodic_services_data`.`discount_method` = 1 AND
      `periodic_services_data`.`cost` > 0;      
  
  IF tmp_fee THEN
     set fee = fee + tmp_fee ;     
  END IF;

  RETURN fee;
END;

Код: Выделить всё

SELECT
      users.basic_account
    FROM
      users
      INNER JOIN accounts ON (users.basic_account = accounts.id)
    WHERE
      users.is_deleted = 0 AND
      accounts.is_deleted = 0 AND
      accounts.is_blocked = 0 and
      accounts.credit = 0 and
      accounts.balance < all_services_fee&#40;accounts.id&#41;

integral
Сообщения: 75
Зарегистрирован: Чт авг 14, 2008 14:15

Сообщение integral »

Подправил запрос в скрипте как написал dk который смотрит сколько абонентка в тарифном плане на следующий месяц и его сравнивает с балансом.

Код: Выделить всё

#!/bin/sh

PSQL="/usr/local/pgsql/bin/psql"
PGUSER="postgres"
UTM5DB="UTM5"
RUNAS="/usr/local/bin/runas"
DATE=`date +%Y-%m-%d,%H&#58;%M`
Day=`date +%d -d '+1 day'`
LOG="/var/log/netup/block_accounts.log"

RESULT=`echo "SELECT users.basic_account AS aid \
	FROM users \
	INNER JOIN accounts ON &#40;users.basic_account = accounts.id&#41; \
	INNER JOIN account_tariff_link ON &#40;accounts.id = account_tariff_link.account_id&#41; \
	INNER JOIN tariffs_services_link ON &#40;account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id&#41; \
	LEFT OUTER JOIN periodic_services_data ON &#40;tariffs_services_link.service_id = periodic_services_data.id&#41; \
	WHERE users.is_deleted = 0 AND  accounts.is_deleted = 0 AND \
	account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND \
	periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND \
	periodic_services_data.cost > 0 AND accounts.balance < periodic_services_data.cost ORDER BY aid" | \
	$RUNAS $PGUSER $PSQL -t -U $PGUSER -d $UTM5DB`

case $1 in
check&#41;
	for i in $RESULT;
	do
	  echo "Need block account - $i" 
	done
exit 0
;;

write&#41;
    if &#91; $Day = "01" &#93;; then
	for i in $RESULT;
	do
	  echo "$DATE Blocking account - $i" >> $LOG
	  java -jar /netup/utm5/u5sh/u5sh.jar --AdminLogin init --AdminPass init --CoreHost 127.0.0.1 --CorePort 11758 --ChangeAccount -aid $i -noabon -chtraf -block 1792 >> $LOG
	  sleep 1
	done
    else
	echo "No last day"
    fi
exit 0
;;

*&#41; 
echo "<script> &#91;check|write&#93;"
exit 0 
;;

esac

acidsas
Сообщения: 10
Зарегистрирован: Пт мар 27, 2009 16:37

Сообщение acidsas »

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

starchik
Сообщения: 461
Зарегистрирован: Сб ноя 22, 2008 22:07

Сообщение starchik »

кто бы эти скрипты переделал под урфаPHP)))

corwin
Сообщения: 76
Зарегистрирован: Вт апр 10, 2007 16:58

Сообщение corwin »

не так давно начали использовать данный скрипт.
Спасибо разрабам. абоны довольны до ужаса :)
но на 2 месяц заметили проблему.
у клиентов заблокированных скриптом мифическим образом происходит следующая модификация.
До блокировки НДС =18 % НСП =0%
после блокировки НДС=0% НСП =18 %

на сумму это конечно не влияет...а вот бухгалтерия недовольна. в скрипте никаких данных по этому поводу понятно что нет. селект обычный да и все....откуда это берется непонятно. кто сталкивался с чем нибудь похожим ??? даже предположить не можем куда копать.

UTM 006

P.S Вообще непонятно почему нетап до сих пор держит этот параметр НСП. с точки зрения бухгалтерского учета Налог с продаж отменен году эдак 2005 , а то и раньше

dwemer
Сообщения: 276
Зарегистрирован: Чт янв 25, 2007 05:59

Сообщение dwemer »

corwin писал(а): у клиентов заблокированных скриптом мифическим образом происходит следующая модификация.
До блокировки НДС =18 % НСП =0%
после блокировки НДС=0% НСП =18 %

на сумму это конечно не влияет...а вот бухгалтерия недовольна. в скрипте никаких данных по этому поводу понятно что нет. селект обычный да и все....откуда это берется непонятно. кто сталкивался с чем нибудь похожим ??? даже предположить не можем куда копать.
5.2.1-007
Похожая штука. При редактировании лицевого счета (официальным урфаклиентом) в НСП копируется значение из НДС. Происходит не всегда и не у всех абонентов. Багрепорт писал, меня послали, мол это у меня урфаскрипт кривой. Повесил на крон скрипт, который ищет ненулевые НСП и фиксит.

Siny
Сообщения: 88
Зарегистрирован: Ср ноя 16, 2005 13:15
Контактная информация:

Сообщение Siny »

у меня работает так
рп - сутки, списание по факту за отработанные сутки
привязки у месяцу нет
пока положительный баланс - юзер живет, можно подкидывать потихоньку
как только ушел в минус (макс. в минус сутки, галки не списывать) ему после нуля часов (т.е. в конце рп) скрипт записывает в поле кредит (баланс не трогаю) минус абонентку
пока не пополнит баланс на сумму абонентки не будет работать и списываться, даже если вылез из минуса по балансу

кредит с минусом убирается в реалтайме платежными модулями (своими) при любом варианте оплаты (касса, терминал) пр условии пополнении до суммы >= (абон. - сутки)

никаких перерасчетов и для пользователя удобно

корректная смена тарифа возможна хоть каждые сутки

минус - рп закрывается каждые сутки - 6к юзеров 4-х ядерный xeon (только биллинг и более ничего) ~20 минут длится закрытие рп (пора менять sata на sas наверно), в этот период лучше не производить урфа операции (закрываю возможность пополнения счета, смены тп и т.п.)

nikl
Сообщения: 14
Зарегистрирован: Вт мар 04, 2008 10:45

Сообщение nikl »

rem_111 писал(а): Из замеченных багов:

1. Время выполнения java -jar /netup/utm5/script/admin/u5sh.jar ооооооооочень долгое (1-2 пользователя в секунду т.е. на 5000 пользователей уйдет ~1 час 23 минуты), есть какие либо способы "ускорить процесс" ?
решили как-то проблему?

andim
Сообщения: 7
Зарегистрирован: Вс мар 27, 2011 02:25

Сообщение andim »

Код: Выделить всё

<?php
require_once&#40;"./URFAClient.php"&#41;;
require_once&#40;"./function.php"&#41;;
@ini_set&#40;"display_errors", "0"&#41;;
$result = $db->sql_query&#40;"SELECT * FROM accounts where unlimited = 0 and balance < 0 and is_blocked > 0 and credit = 0 and int_status = 0"&#41;;
								if &#40;$db->sql_numrows&#40;$result&#41; > 0&#41; &#123;
									while &#40;$row = $db->sql_fetchrow&#40;$result&#41;&#41; &#123;
       	 							$id     =  stripslashes&#40;$row&#91;'id'&#93;&#41;;
try &#123;
$urfa_admin = new URFAClient_Admin&#40;"init", "init", "127.0.0.1", 11758, true, true&#41;;
&#125; catch &#40;Exception $exception&#41; &#123;
	echo "Error in line ", $exception->getLine&#40;&#41;;
	echo $exception->getMessage&#40;&#41;;
&#125;
#Странная фигня два след параметра 99 а в итоге будут 0 а если у казать 0 буду 1 хрень вобщем.
$accountinfo&#91;'block_recalc_abon'&#93; = 99;
$accountinfo&#91;'block_recalc_prepaid'&#93; = 99;
$accountinfo&#91;'unlimited'&#93; = 1;
$urfa_admin->rpcf_save_account&#40;$id,$accountinfo, 0, 0, 0, 0&#41;;
sleep&#40;1&#41;;
&#125;
?>
У меня у каждого пользователя свой РП в итоге гоняю вот такой скрипт. Когда зачисляю оплату соответственно
заканчиваю прериод.
sleep(5);
убераю галочку безлимитный.
Зачисляю деньги.
Вклучю.

Так у меня если кому надо могу выложить полный набор.

Но опять же это извращение (.

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

rem_111 писал(а):
Не могли бы Вы скинуть последнюю версию скрипта рабочую, под майскл?
а то что то скрипт взятый из темы, не пошел, при запуске выдает

./disable check
./disable: line 25: : command not found

в 25 строке exit 0

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

исправил под майскл, остался вопрос, т.к. это выполняется оч долго 1 пользователь в сек, кто когда его запускает?

Код: Выделить всё

#!/bin/sh 


MYUSER="root" 
MYPASS="password" 
UTM5DB="UTM5" 

DATE=`date +%Y-%m-%d,%H&#58;%M` 
Day=`date +%d -d '+1 day'` 
LOG="/netup/block_accounts.log" 

RESULT=`echo "SELECT users.basic_account AS aid FROM users INNER JOIN accounts ON &#40;users.basic_account = accounts.id&#41; INNER JOIN service_links ON &#40;accounts.id = service_links.account_id&#41; LEFT OUTER JOIN periodic_services_data ON &#40;service_links.service_id = periodic_services_data.id&#41; WHERE users.is_deleted = 0 AND accounts.is_deleted = 0 AND service_links.is_deleted = 0 AND periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND periodic_services_data.cost > 0 AND accounts.balance < periodic_services_data.cost AND accounts.is_blocked = 0 AND accounts.credit = 0" | /home/mysql5/bin/mysql -h localhost -u $MYUSER -p$MYPASS -D $UTM5DB` 


case $1 in 
check&#41; 
   for i in $RESULT; 
   do 
     echo "Need block account - $i" 
   done 
exit 0 
;; 

write&#41; 
    if &#91; $Day = "23" &#93;; then 
   for i in $RESULT; 
   do 
     echo "$DATE Blocking account - $i" >> $LOG 
echo `date`
     java -jar /netup/utm5/u5sh/u5sh.jar --AdminLogin init --AdminPass init --CoreHost 127.0.0.1 --CorePort 11758 --ChangeAccount -aid $i -noabon -chtraf -block 1792 >> $LOG 
     sleep 1 
   done 
    else 
   echo "No last day" 
    fi 
exit 0 
;; 

*&#41; 
echo "&#91;check|write&#93;" 
exit 0 
;; 
esac 

mrmix25
Сообщения: 104
Зарегистрирован: Вт июн 07, 2011 11:43

Сообщение mrmix25 »

Вот адаптировал данные скрипты под свои нужды (авторам скриптов огромное спасибо!), так как я не люблю по форуму лазить и собирать всё из кусков = собрал всё в одном месте .. может кому пригодиться .... тут в архиве инструкция + всё что надо :wink:, реализовал не с помощью java консоль админки, а с помощью ourfa .. вот ссылка urfaclient на С.

Utm 5.2.1.008
freebsd 8.2
mysql 5.1.55

:!: ну начнем ..

задача :
смотри первый пост этой темы :D ..

решение :

1)ourfa_client - аналог официального консольного клиента utm5_urfaclient. Выполняет те же функции и работает с теми же XML схемами.
берем от сюда или из архива в папке ourfa
устанавливаем из партов

cd ourfa/freebsd/ourfa
make install
cd ourfa/freebsd/p5-ourfa
make install

на UTM 5.2.1-008 обязательно нужен сертификат admin.crt для работы ourfa_client
Его можно скачать здесь или взять из архива, положить в /netup/utm5/admin.crt и ourfa_client запускать с ключем -S rsa_cert
это для сведенья !

в файле /netup/utm5/utm5_urfaclient.cfg раскомментировать или добавить строки, если их там нет

core_host=127.0.0.1
core_port=11758
core_login=init
core_password=init

2) копируем папку script в /netup/utm5/.. в ней 2 скрипта — off , on Лежит она в архиве. Или создать свои, коды ниже ..

3) /netup/utm5/script/off – этот скрипт, в последний день месяца проверяет у пользователей баланс и сравнивает его с абонентской платой на следующий месяц, если баланс больше абонентской платы скрип ни чего не делает, но если меньше скрипт ставит блокировку и заносит id пользователя в лог. Для работы скрипта нужно в нём указать, БД, имя пароль к БД, хост mysql

MYUSER="root" — имя к БД
MYPASS="pass" — пароль к БД
MYHOST="127.0.0.1" — хост
UTM5DB="UTM5" – БД

Код: Выделить всё

#!/bin/sh
MYUSER="root"
MYPASS="pass"
MYHOST="127.0.0.1"
UTM5DB="UTM5"
dat=`date +%Y%m%d,%H&#58;%M&#58;%S`
day=`date -j -v +1d +%d`
log="/netup/utm5/log/off.log"

RESULT=`echo "SELECT users.basic_account AS aid \
    FROM users \
    INNER JOIN accounts ON &#40;users.basic_account = accounts.id&#41; \
    INNER JOIN account_tariff_link ON &#40;accounts.id = account_tariff_link.account_id&#41; \
    INNER JOIN tariffs_services_link ON &#40;account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id&#41; \
    LEFT OUTER JOIN periodic_services_data ON &#40;tariffs_services_link.service_id = periodic_services_data.id&#41; \
    WHERE users.is_deleted = 0 AND  accounts.is_deleted = 0 AND \
    account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND \
    periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND \
    periodic_services_data.cost > 0 AND accounts.balance < periodic_services_data.cost AND \
    accounts.is_blocked = 0 AND \
    accounts.credit = 0 ORDER BY aid" | \
    mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`

if &#91; $day = "01" &#93;; then
for i in $RESULT;
 do
 echo "$dat Blockin accounts - $i " >> $log
 ourfa_client -S rsa_cert -a rpcf_block_account -account_id $i -is_blocked 1792 -int_status 0
 sleep 1
 done
else
 echo "$dat no last day!!!" >> $log
fi
4) /netup/utm5/script/on – этот скрипт, который запускается раз в 3 минут проверяет у пользователей баланс и сравнивает его с абонентской платой на следующий месяц, если баланс больше или равен абонентской плате скрип выключает блокировку и заносит id пользователя в лог(но только сделанную скриптом off блокировку), если меньше скрипт ни чего не делает. Для работы скрипта нужно в нём указать, БД, имя пароль к БД, хост mysql

MYUSER="root" — имя к БД
MYPASS="pass" — пароль к БД
MYHOST="127.0.0.1" — хост
UTM5DB="UTM5" – БД

Код: Выделить всё


#!/bin/sh
MYUSER="root"
MYPASS="pass"
MYHOST="127.0.0.1"
UTM5DB="UTM5"
dat=`date +%Y%m%d,%H&#58;%M&#58;%S`
log="/netup/utm5/log/on.log"

RES_AID=`echo "SELECT users.basic_account AS aid FROM users INNER JOIN accounts ON &#40;users.basic_account = accounts.id&#41; \
    INNER JOIN account_tariff_link ON &#40;accounts.id = account_tariff_link.account_id&#41; \
    INNER JOIN tariffs_services_link ON &#40;account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id&#41; \
    LEFT OUTER JOIN periodic_services_data ON &#40;tariffs_services_link.service_id = periodic_services_data.id&#41; \
    WHERE users.is_deleted = 0 AND  accounts.is_deleted = 0 AND \
    account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND \
    periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND \
    periodic_services_data.cost > 0 AND accounts.balance >= periodic_services_data.cost AND \
    accounts.is_blocked = 1792 ORDER BY aid" | \
    mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`


for i in $RES_AID;
do
 echo "$dat Unlockin accounts - $i " >> $log
 ourfa_client -S rsa_cert -a edit_account -account_id $i -is_blocked 0 -int_status 1
 sleep 1
done
5)создаем 2 пустых файла в директории /netup/utm5/log
touch on.log
touch off.log
сюда будут писаться логи выполненной работы скриптов


6)добавляем в /etc/crontab
дописываем в PATH строку :/usr/local/bin:/usr/local/sbin без этого не будут выполняться mysql запросы из скриптов.


PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#Billing !
*/3 * * * * root /netup/utm5/script/on >> /dev/null 2>&1
57 23 * * * root /netup/utm5/script/off >> /dev/null 2>&1

готово.


Скрипт включение, скрипт выключение занимает по времени ~1 секунду на одного пользователя. Так что пока база с пользователями не большая в моем случае ~100 пользователей пока, можно поставить запуск скрипта on каждые 3 минуты, а оff в 23-57... соответственно с ростом пользователей значения эти менять...

Скрипт off блокирует с пометкой "Да (пересчитывать абон.плату и трафик)" значение 1792, скрипт on разблокирует тока блокировку сделанную off и если вы сами поставили блок 1792. это сделано для того, чтоб можно было блокировать пользователей( к примеру из utm_admin поставить блок "Да (пересчитывать абонентский плату)"), а скрип автоматом их не разблокировал.

На идеальную версию не претендую, но все проверил = все работает! :) если кто нашел недочёты, да и так может, где чё не очень правильно = жду комментариев..
Последний раз редактировалось mrmix25 Пт дек 14, 2012 08:01, всего редактировалось 4 раза.

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

Все хорошо, но как быть если пользователей пара тысяч? За час всех начинать отключать? не хорошо получается...

valaykhal
Сообщения: 25
Зарегистрирован: Вт апр 19, 2011 23:02

Сообщение valaykhal »

Решил не создавать новую тему, у нас стоит 5.2.1-008 хотим всем пользователям установить Пересчитывать абонентскую плату, дабы при минусовом балансе не уходили в большие минуса. Подскажите запрос как массово всем пользователям уставить данную галочку?

Ответить