Очень большую роль сыграло добавление sleep 1 в скрипт, т.к. ядро не "успевало"integral писал(а): Аналогично, попробовал у себя первый раз скрипт по отключению вроде всё сработало, второй скрипт не использую так как мы всех пользователей включаем сами когда они денежки приносят..
Не списывать абонентскую плату при недостатке средств
Да кстати, я тоже заметил, оно суммирует абонентку старого и нового тарифа.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(accounts.id)
Подправил запрос в скрипте как написал dk который смотрит сколько абонентка в тарифном плане на следующий месяц и его сравнивает с балансом.
Код: Выделить всё
#!/bin/sh
PSQL="/usr/local/pgsql/bin/psql"
PGUSER="postgres"
UTM5DB="UTM5"
RUNAS="/usr/local/bin/runas"
DATE=`date +%Y-%m-%d,%H:%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 (users.basic_account = accounts.id) \
INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id) \
INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id) \
LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id) \
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)
for i in $RESULT;
do
echo "Need block account - $i"
done
exit 0
;;
write)
if [ $Day = "01" ]; 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
;;
*)
echo "<script> [check|write]"
exit 0
;;
esac
не так давно начали использовать данный скрипт.
Спасибо разрабам. абоны довольны до ужаса
но на 2 месяц заметили проблему.
у клиентов заблокированных скриптом мифическим образом происходит следующая модификация.
До блокировки НДС =18 % НСП =0%
после блокировки НДС=0% НСП =18 %
на сумму это конечно не влияет...а вот бухгалтерия недовольна. в скрипте никаких данных по этому поводу понятно что нет. селект обычный да и все....откуда это берется непонятно. кто сталкивался с чем нибудь похожим ??? даже предположить не можем куда копать.
UTM 006
P.S Вообще непонятно почему нетап до сих пор держит этот параметр НСП. с точки зрения бухгалтерского учета Налог с продаж отменен году эдак 2005 , а то и раньше
Спасибо разрабам. абоны довольны до ужаса
но на 2 месяц заметили проблему.
у клиентов заблокированных скриптом мифическим образом происходит следующая модификация.
До блокировки НДС =18 % НСП =0%
после блокировки НДС=0% НСП =18 %
на сумму это конечно не влияет...а вот бухгалтерия недовольна. в скрипте никаких данных по этому поводу понятно что нет. селект обычный да и все....откуда это берется непонятно. кто сталкивался с чем нибудь похожим ??? даже предположить не можем куда копать.
UTM 006
P.S Вообще непонятно почему нетап до сих пор держит этот параметр НСП. с точки зрения бухгалтерского учета Налог с продаж отменен году эдак 2005 , а то и раньше
5.2.1-007corwin писал(а): у клиентов заблокированных скриптом мифическим образом происходит следующая модификация.
До блокировки НДС =18 % НСП =0%
после блокировки НДС=0% НСП =18 %
на сумму это конечно не влияет...а вот бухгалтерия недовольна. в скрипте никаких данных по этому поводу понятно что нет. селект обычный да и все....откуда это берется непонятно. кто сталкивался с чем нибудь похожим ??? даже предположить не можем куда копать.
Похожая штука. При редактировании лицевого счета (официальным урфаклиентом) в НСП копируется значение из НДС. Происходит не всегда и не у всех абонентов. Багрепорт писал, меня послали, мол это у меня урфаскрипт кривой. Повесил на крон скрипт, который ищет ненулевые НСП и фиксит.
у меня работает так
рп - сутки, списание по факту за отработанные сутки
привязки у месяцу нет
пока положительный баланс - юзер живет, можно подкидывать потихоньку
как только ушел в минус (макс. в минус сутки, галки не списывать) ему после нуля часов (т.е. в конце рп) скрипт записывает в поле кредит (баланс не трогаю) минус абонентку
пока не пополнит баланс на сумму абонентки не будет работать и списываться, даже если вылез из минуса по балансу
кредит с минусом убирается в реалтайме платежными модулями (своими) при любом варианте оплаты (касса, терминал) пр условии пополнении до суммы >= (абон. - сутки)
никаких перерасчетов и для пользователя удобно
корректная смена тарифа возможна хоть каждые сутки
минус - рп закрывается каждые сутки - 6к юзеров 4-х ядерный xeon (только биллинг и более ничего) ~20 минут длится закрытие рп (пора менять sata на sas наверно), в этот период лучше не производить урфа операции (закрываю возможность пополнения счета, смены тп и т.п.)
рп - сутки, списание по факту за отработанные сутки
привязки у месяцу нет
пока положительный баланс - юзер живет, можно подкидывать потихоньку
как только ушел в минус (макс. в минус сутки, галки не списывать) ему после нуля часов (т.е. в конце рп) скрипт записывает в поле кредит (баланс не трогаю) минус абонентку
пока не пополнит баланс на сумму абонентки не будет работать и списываться, даже если вылез из минуса по балансу
кредит с минусом убирается в реалтайме платежными модулями (своими) при любом варианте оплаты (касса, терминал) пр условии пополнении до суммы >= (абон. - сутки)
никаких перерасчетов и для пользователя удобно
корректная смена тарифа возможна хоть каждые сутки
минус - рп закрывается каждые сутки - 6к юзеров 4-х ядерный xeon (только биллинг и более ничего) ~20 минут длится закрытие рп (пора менять sata на sas наверно), в этот период лучше не производить урфа операции (закрываю возможность пополнения счета, смены тп и т.п.)
Код: Выделить всё
<?php
require_once("./URFAClient.php");
require_once("./function.php");
@ini_set("display_errors", "0");
$result = $db->sql_query("SELECT * FROM accounts where unlimited = 0 and balance < 0 and is_blocked > 0 and credit = 0 and int_status = 0");
if ($db->sql_numrows($result) > 0) {
while ($row = $db->sql_fetchrow($result)) {
$id = stripslashes($row['id']);
try {
$urfa_admin = new URFAClient_Admin("init", "init", "127.0.0.1", 11758, true, true);
} catch (Exception $exception) {
echo "Error in line ", $exception->getLine();
echo $exception->getMessage();
}
#Странная фигня два след параметра 99 а в итоге будут 0 а если у казать 0 буду 1 хрень вобщем.
$accountinfo['block_recalc_abon'] = 99;
$accountinfo['block_recalc_prepaid'] = 99;
$accountinfo['unlimited'] = 1;
$urfa_admin->rpcf_save_account($id,$accountinfo, 0, 0, 0, 0);
sleep(1);
}
?>
заканчиваю прериод.
sleep(5);
убераю галочку безлимитный.
Зачисляю деньги.
Вклучю.
Так у меня если кому надо могу выложить полный набор.
Но опять же это извращение (.
исправил под майскл, остался вопрос, т.к. это выполняется оч долго 1 пользователь в сек, кто когда его запускает?
Код: Выделить всё
#!/bin/sh
MYUSER="root"
MYPASS="password"
UTM5DB="UTM5"
DATE=`date +%Y-%m-%d,%H:%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 (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 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)
for i in $RESULT;
do
echo "Need block account - $i"
done
exit 0
;;
write)
if [ $Day = "23" ]; 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
;;
*)
echo "[check|write]"
exit 0
;;
esac
Вот адаптировал данные скрипты под свои нужды (авторам скриптов огромное спасибо!), так как я не люблю по форуму лазить и собирать всё из кусков = собрал всё в одном месте .. может кому пригодиться .... тут в архиве инструкция + всё что надо , реализовал не с помощью java консоль админки, а с помощью ourfa .. вот ссылка urfaclient на С.
Utm 5.2.1.008
freebsd 8.2
mysql 5.1.55
ну начнем ..
задача :
смотри первый пост этой темы ..
решение :
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" – БД
4) /netup/utm5/script/on – этот скрипт, который запускается раз в 3 минут проверяет у пользователей баланс и сравнивает его с абонентской платой на следующий месяц, если баланс больше или равен абонентской плате скрип выключает блокировку и заносит id пользователя в лог(но только сделанную скриптом off блокировку), если меньше скрипт ни чего не делает. Для работы скрипта нужно в нём указать, БД, имя пароль к БД, хост mysql
MYUSER="root" — имя к БД
MYPASS="pass" — пароль к БД
MYHOST="127.0.0.1" — хост
UTM5DB="UTM5" – БД
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 поставить блок "Да (пересчитывать абонентский плату)"), а скрип автоматом их не разблокировал.
На идеальную версию не претендую, но все проверил = все работает! если кто нашел недочёты, да и так может, где чё не очень правильно = жду комментариев..
Utm 5.2.1.008
freebsd 8.2
mysql 5.1.55
ну начнем ..
задача :
смотри первый пост этой темы ..
решение :
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:%M:%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 (users.basic_account = accounts.id) \
INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id) \
INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id) \
LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id) \
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 [ $day = "01" ]; 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
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:%M:%S`
log="/netup/utm5/log/on.log"
RES_AID=`echo "SELECT users.basic_account AS aid FROM users INNER JOIN accounts ON (users.basic_account = accounts.id) \
INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id) \
INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id) \
LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id) \
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
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 раза.