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

Технические вопросы по UTM 5.0
bear
Сообщения: 498
Зарегистрирован: Чт ноя 15, 2007 11:53

Сообщение bear »

integral писал(а):Так теперь бы заставить запускаться скрипт в последний день месяца.. Ведь где то 30 где-от 31 день, а где-то и 28-29 дней.
элементарно, написанно за 1 минуту, даже без перекуров

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

 bear@bear-desktop:~$ cat date.sh
#!/bin/bash

DATENOW=`date +%d --date="+1day"`

if [ $DATENOW -eq 1 ]
then
    /home/odmin/nash_skript.sh
fi

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

Сообщение integral »

Вот что получилось.. ключик check просто показывает какие аккаунты будет блокировать а ключик write заблокирует аккаунты но он будет работать только в последний день месяца..

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

#!/bin/sh

PSQL="/usr/local/pgsql/bin/psql"
PGUSER="postgres"
UTM5DB="UTM5"
RUNAS="/usr/local/bin/runas"
Day=`date +%d -d '+1 day'`

RESULT=`echo "SELECT users.basic_account AS aid FROM users \
	INNER JOIN accounts ON (users.basic_account = accounts.id) \
	INNER JOIN service_links ON (accounts.id = service_links.account_id) \
	LEFT OUTER JOIN periodic_services_data ON (service_links.service_id = periodic_services_data.id) \
	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" | \
	$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 "Blockin accounts"
	  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 >> /var/log/off_inet_if_no_balance.log
	done
    else
	echo "No last day"
    fi
exit 0
;;

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

esac

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

Сообщение rem_111 »

integral писал(а):Вот что получилось.. ключик check просто показывает какие аккаунты будет блокировать а ключик write заблокирует аккаунты но он будет работать только в последний день месяца..
[/code]
За это низкий поклон 8) ... а еще что-нибудь "проверяющее" и "разблокирующее" лицевой счет при наличии денег или нет нельзя ли накатать ? :)

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

Сообщение integral »

rem_111 писал(а):За это низкий поклон 8) ... а еще что-нибудь "проверяющее" и "разблокирующее" лицевой счет при наличии денег или нет нельзя ли накатать ? :)
Ну вот что удалось накидать, на идеальную версию не претендую надо проверять в работе..
Скрипт должен включить всех кто заблокирован, но у кого на балансе денег больше чем АП.

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

#!/bin/sh

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

RES_AID=`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" | \
	$RUNAS $PGUSER $PSQL -t -U $PGUSER -d $UTM5DB`

RES_UID=`echo "SELECT users.id as uid 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" | \
	$RUNAS $PGUSER $PSQL -t -U $PGUSER -d $UTM5DB`

case $1 in
check&#41;
	for i in $RES_AID;
	do
	  echo "Need unblock account - $i"
	done

	for j in $RES_UID;
	do
	  echo "Need on internet user - $j"
	done
exit 0
;;

write&#41;
# Разблокировка аккаунта
	for i in $RES_AID;
	do
	  echo "$DATE | Unblock account - $i" >> $LOG
	  java -jar /netup/utm5/u5sh/u5sh.jar --AdminLogin init --AdminPass init --CoreHost 127.0.0.1 --CorePort 11758 --ChangeAccount -aid $i -blocks
	done
# Включение интернета
	for j in $RES_UID;
	do
	  echo "$DATE | Internet on for user - $j" >> $LOG
	  java -jar /netup/utm5/u5sh/u5sh.jar --AdminLogin init --AdminPass init --CoreHost 127.0.0.1 --CorePort 11758 --ChangeInternetStatus -uid $j -internetON
	done
exit 0
;;

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

esac

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

Сообщение rem_111 »

integral писал(а):
rem_111 писал(а):За это низкий поклон 8) ... а еще что-нибудь "проверяющее" и "разблокирующее" лицевой счет при наличии денег или нет нельзя ли накатать ? :)
Ну вот что удалось накидать, на идеальную версию не претендую надо проверять в работе..
Скрипт должен включить всех кто заблокирован, но у кого на балансе денег больше чем АП.

[/code]
Спасибо, щас на стенд тестовый попробую поставить погонять... о результате и багах отпишусь. :arrow:
-----------------------------------------------------------------------------
через час:
При выполнении скрипта "включения" чтобы исключить пользователей у которых "Добровольная" блокировка сделал следующее:
В поле Комментарий поставил цифру 1 и в запрос добавил

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

 AND 
   users.comments != 1;
---------------------------------------------------------------------
Через какое то время:

Переделал скрипт под MYSQL и FREEBSD 7 время выполнения запроса ~5 сек, остальное время выполнения занимает консольная админка:

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

#!/bin/sh

MYUSER="user"
MYPASS="pass"
MYHOST="localhost"
UTM5DB="UTM5_DB"
#Day="01"
Day=`date -j -v +1d +%d`

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" | \
mysql -h $MYHOST -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 = "01" &#93;; then
	for i in $RESULT;
do
#     echo "Blockin accounts"
  java -jar /netup/utm5/script/admin/u5sh.jar --AdminLogin login --AdminPass pass --CoreHost localhost --CorePort 11758 --ChangeAccount -aid $i -noabon -chtraf -block 1792 >> /usr/log/off_inet_if_no_balance.log
 done
 else
echo "No last day"
    fi
exit 0
;;

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

esac
Из замеченных багов:

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

2 (решено). В не зависимости от того заблокирован акаунт или нет скрипт "деграет" лиц. счет, т.е. нужно добавить проверку на "уже заблокирован" (Что уже частично поможет в пункте 1)


-----------------------------------------------------------------------------------
any time:

Если добавить в запрос

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

 AND accounts.is_blocked = 0;
То запрос перестает бегать по тем у кого стоит блокировка.
Чтобы не тронуло пользователей с кредитом добавил:

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

AND accounts.credit = 0
------------------------------------------------------------------------------------
Скрипт разблокировки

Возникла следующая проблема:
Если на л.с. подключено несколько услуг то по моему скрипт берет их все... и если хватает хоть на 1 услугу - разблокирует... нужно решение...

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

Сообщение rem_111 »

UP, тема актуальна 8)

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

Сообщение integral »

rem_111 писал(а):Скрипт разблокировки

Возникла следующая проблема:
Если на л.с. подключено несколько услуг то по моему скрипт берет их все... и если хватает хоть на 1 услугу - разблокирует... нужно решение...
У тебя получается несколько услуг на одного пользователя с абонентской платой ?

Тогда попробуй подставь вот этот запрос в скрипт.
Он должен суммировать сумму всех услуг и сравнивать с балансом.

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

SELECT 
  users.basic_account
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.is_blocked > 0
GROUP BY
  users.basic_account,
  accounts.balance
HAVING
  accounts.balance > SUM&#40;periodic_services_data.cost&#41;

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

Сообщение rem_111 »

integral писал(а): У тебя получается несколько услуг на одного пользователя с абонентской платой ?
Помогло ! Спасибо !

Еще хотелось прикрутить сюда-же блокировку юзеров не пользующихся интернетом определенное время.... скажем 2 месяца... (Нужно понятно я думаю для чего - чтобы баланс не "гас")
При условии что таблицы dhs_sessions_log, discount_transactions_all, discount_transactions_iptraffic_all уходят в архив в бругую б.д.

Может выложить скрипт в полном объеме ? Надо кому ? (Mysql, Freebsd)

FarAway
Сообщения: 1
Зарегистрирован: Чт июн 11, 2009 16:54

Сообщение FarAway »

Да, выложи пожалуйста!
Очень надо. Сам давно искал такое решение... :roll:

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

Сообщение rem_111 »

FarAway писал(а):Да, выложи пожалуйста!
Очень надо. Сам давно искал такое решение... :roll:
Выложу... с описанием что куда... после теста у себя на юзерах )
Последний раз редактировалось rem_111 Сб июн 27, 2009 09:03, всего редактировалось 1 раз.

DiKe
Сообщения: 13
Зарегистрирован: Чт май 01, 2008 11:41

Сообщение DiKe »

Всем привет.
У меня такой вопрос:
Если у абонента не хватает денег то он заблокируется в последний день месяца, и будет заблокирован до то го пока деньги не поступят, а когда поступают деньги, с него списывается полностью абонплата?

К примеру у меня абонпалата 450 руб, на счету 400. 30 июня меня заблокировали. 5 июля я заплатил 50 рублей. Интернет включится, и спишется 450 либо за вычетом этих 5 дней?

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

Сообщение rem_111 »

DiKe писал(а):Всем привет.
У меня такой вопрос:
Если у абонента не хватает денег то он заблокируется в последний день месяца, и будет заблокирован до то го пока деньги не поступят, а когда поступают деньги, с него списывается полностью абонплата?

К примеру у меня абонпалата 450 руб, на счету 400. 30 июня меня заблокировали. 5 июля я заплатил 50 рублей. Интернет включится, и спишется 450 либо за вычетом этих 5 дней?
За вычетом 5 дней.
Если у Вас тарифы с включенным трафиком то возможно для баланса поможет галочка "Уменьшать пред оплаченный трафик"

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

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

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

Сообщение rem_111 »

integral скажите куда отсылать продовольствие и пиво ? :) (скрытое огромное спасибо)

Протестил на рабочем билинге, работает все... даже то что вы думаете что не работает... пользователи целуют ноги... постить пока сюда не буду... т.к. желаю всем здорового билинга без костылей !
Также интересует ваше мнение по поводу: почему в билинге это не реализовано по умолчанию 0_о ?
З.Ы. Если кому надо долбитесь в ромашку... подскажу, скину... free...

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

Сообщение integral »

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

Ответить