Биллинговая система Nodeny

Главная категория => Курилка => Тема начата: Андрій от 10 Ноября 2010, 14:22:13



Название: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 14:22:13
поставив модуль "Обіцяний платіж" щоб користувач сам міг себе включати з особистого кабінету, на його рахунок вноситься тимчасова сума, ніби все ок, але чомусь він автоматично не включається, навіть після рестарту ядра нодені, а коли вручну йому внести тимчасово гроші, то включається автоматично, в чому може бути проблема ??


Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 14:28:39
Я так думаю в модуле.
Вот как делается при добавлении платежа в нодени:
pays.pl
Код:
 735     # Проверим, отключен ли юзер имея положительный баланс или баланс выше границы отключения.
 736     # Если да, то напомним, что неплохо бы включить (или сами включим если настроки указывают)
 737     # Не забываем что может быть ситуация когда основная запись включена, а алиасная выключена
 738     {
 739       $p->{block_if_limit} or last;
....
 755       if( $auto_on==2 )
 756       {  # разрешим доступ
 757          &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Fmid OR mid=$Fmid");
 758          $pay_made_mess.=$br2.'Доступ в интернет разрешен - баланс выше установленного лимита.';
 759          $state_off=" После осуществления платежа доступ в интернет был открыт";
 760       }else
 761       {
 762          $pay_made_mess.=$br2.'Не забудьте разрешить доступ в интернет - баланс выше установленного лимита.';
 763          $state_off=" Необходимо включить доступ в интернет";
 764       }


Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 14:38:16
якщо чесно то я в перлі не дуже розбираюся, куда вставляти цей код ?
ось сам модуль:


Код:
#!/usr/bin/perl
# ------------------- NoDeny ------------------
# Copyright (с) Volik Stanislav, 2008, 2009
# Copyright (с) smallcms, 2010
# Read license http://nodeny.com.ua/license.txt
# ---------------------------------------------
$VER=49.32;

sub PROMI_main
{
 $promisepaylivedays = 1; #если 0 - не учитываем параметр, срок действия временного платежа в днях
 $promisepaymaxinmonth = 2; #если 0 - не учитываем параметр, максимально допустимое количество пользования услогой в месяц (начиная с первого числа)
 $promisepayforpay = 500; #если 0 - не учитываем параметр, сумма списания за пользование услугой
 $promisepayminimumpay = 1000 + $promisepayforpay; #минимальная сумма временного платежа + сумма снятия за услугу
 $promisepaymaximumpay = 20000; #максимальная сумма временного платежа
 $prmpay=$F{prmpay};
 $form=&div('cntr',
   &form('!'=>1,
     ($promisepayforpay > 0 ? 'Если Ваш баланс близок к нулю, а пополнить счет возможности нет, воспользуйтесь услугой «Обещанный платеж». По Вашему запросу Вам будет зачислен временный платеж, и Вы сможете продолжать пользоваться нашими услугами. Не забудьте пополнить счет до истечения срока действия «обещанного платежа». Через ' . $promisepaylivedays . ' дней после активации, сумма «обещанного платежа» будет автоматически полностью списана с Вашего счета. ' . $br .
         &bold('Введите сумму обещанного платежа (минимум ' . $promisepayminimumpay . ' ' . $gr . '): ').&input_t('prmpay',$prmpay,20,18,' autocomplete="off"')
         .$br2 . 'Дополнительно за использование услуги «Обещанный платеж» с платежа будет списана сумма в размере ' . $promisepayforpay . ' ' . $gr :
         'Если Ваш баланс близок к нулю, а пополнить счет возможности нет, воспользуйтесь услугой «Обещанный платеж». По Вашему запросу Вам будет зачислен временный платеж, и Вы сможете продолжать пользоваться нашими услугами. Не забудьте пополнить счет до истечения срока действия «обещанного платежа». Через ' . $promisepaylivedays . ' дней после активации, сумма «обещанного платежа» будет автоматически полностью списана с Вашего счета. ' . $br .
         &bold('Введите сумму обещанного платежа (минимум ' . $promisepayminimumpay . ' ' . $gr . '): ').&input_t('prmpay',$prmpay,20,18,' autocomplete="off"')
     ).$br2.&submit_a('Пополнить')
   )
 );

 #выборка количества использований услуги за последние promisepaylivedays дней
 $countprmpaysql1=&sql_select_line($dbh,"SELECT COUNT(*) FROM pays WHERE `mid`=$Mid AND `type` =50 AND `category` =900 AND `time` > UNIX_TIMESTAMP( SUBDATE( NOW( ) , $promisepaylivedays ) )");
 &Error('проблема с БД.') unless $countprmpaysql1;
 #считаем количество использований услуги
 $countprmpays1=$countprmpaysql1->{'COUNT(*)'};
 #выводим сообщение пользователю, который вконец потерял совесть
 &Error('Вы уже использовали услугу «Обещанный платеж» менее, чем ' . $promisepaylivedays . ' дней назад.') if $countprmpays1 > 0 && $promisepaylivedays != 0;

 #выборка количества использований услуги в этом месяце
 $countprmpaysql2=&sql_select_line($dbh,"SELECT COUNT(*) FROM pays WHERE `mid`=$Mid AND `type` =50 AND `category` =900 AND `time` > UNIX_TIMESTAMP( DATE_FORMAT( NOW( ) , '%Y-%m-01' ) )");
 &Error('проблема с БД.') unless $countprmpaysql2;
 #считаем количество использований услуги
 $countprmpays2=$countprmpaysql2->{'COUNT(*)'};
 #выводим сообщение пользователю, который вконец потерял совесть
 &Error('Вы уже использовали услугу «Обещанный платеж» в этом месяце максимально допустимое количество раз.') if $countprmpays2 >= $promisepaymaxinmonth && $promisepaymaxinmonth != 0;

 #если из браузера клиента не пришла сумма
 unless (defined $F{prmpay})
   {
    #Показываем форму ввода клиенту
    $OUT.=&MessX($form,1);
    return;
   }

 #проверка на длину символов
 &Error('Вы ввели неправильное количество символов в сумме обещанного платежа.',$EOUT) if length($prmpay)<1 || length($prmpay)>20;
 #проверка на корректность (работаем только с цифрами)
 &Error('Использованы недопостимые символы.',$EOUT) if $prmpay!~/^[0-9]+$/;
 #проверка на минимальный платёж
 &Error('Сумма обещанного платежа указана меньше минимально допустимой.',$EOUT) if $prmpay<$promisepayminimumpay;
 #проверка на максимальный платёж
 &Error('Сумма обещанного платежа указана больше максимально допустимой (' . $promisepaymaximumpay . ').',$EOUT) if $prmpay>$promisepaymaximumpay;

 #всё нормально

 #если указано списывать сумму за услугу
 if ($promisepayforpay > 0)
   {
    #списываем сумму в размере promisepayforpay за услугу Обещанный платеж
    $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ".
         "VALUES($Mid,$promisepayforpay,10,'',600,$Adm{id},INET_ATON('$RealIp'),'','За услугу Обещанный платеж',$t)";
    $rows=&sql_do($dbh,$sql);
    &ToLog("! mid $Mid использовал услугу Обещанный платеж (запись списания) $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1;
   }

 #начинаем формировать временный платёж
 #создаём переменную времени окончания платежа (текущее время + количество суток из конфига)
 #если нужно удвоить, утроить срок - цифры ниже. множте, плюсуйте
 $time=$t+$promisepaylivedays*3600*24;
 #отнимаем от суммы платежа стоимость услуги, т.к. сняли за услугу ранее
 $prmpaytmp = $prmpay - $promisepayforpay;
 $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ".
      "VALUES($Mid,$prmpaytmp,20,'y',1000,$Adm{id},INET_ATON('$RealIp'),'','Обещанный платеж',$time)";
 $rows=&sql_do($dbh,$sql);
 &ToLog("! mid $Mid использовал услугу Обещанный платеж $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1;

 #начинаем формировать собитие 900, которое будет блокировать повторные злоупотребления модулем
 $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ".
      "VALUES($Mid,'',50,'',900,$Adm{id},INET_ATON('$RealIp'),'','Обещанный платеж',$t)";
 $rows=&sql_do($dbh,$sql);
 &ToLog("! mid $Mid использовал услугу Обещанный платеж (блокирующая запись) $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1;

 #начинаем формировать внесение в таблицу платежей
 $rows=&sql_do($dbh,"UPDATE users SET balance=balance+($prmpay) WHERE id=$Mid LIMIT 1");
 if ($rows<1)
   {
    &ToLog("! mid $Mid использовал услугу Обещанный платеж $prmpay $gr, но после внесения платежа в таблицу платежей произошла ошибка изменения баланса клиента");
    &Error("Произошла ошибка пополнения счета. Обратитесь к администрации.",$EOUT);
   }

 #сообщаем клиенту, что всё нормально
 &OkMess(&bold_br($promisepayforpay!=0 ? "Ваш счет пополнен на $prmpay $gr из них $promisepayforpay удержано на оплату услуги «Обещанный платеж»" : "Ваш счет пополнен на $prmpay $gr").'Если текущих средств достаточно для включения доступа в интернет - доступ будет включен в течение нескольких минут.'.$br2);

}

1;


Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 15:16:34
Я не знаю, что хотелось сказать вот этим:
Код:
&OkMess(&bold_br($promisepayforpay!=0 ? "Ваш счет пополнен на $prmpay $gr из них $promisepayforpay удержано на оплату услуги «Обещанный платеж»" : "Ваш счет пополнен на $prmpay $gr").'Если текущих средств достаточно для включения доступа в интернет - доступ будет включен в течение нескольких минут.'.$br2);
Откуда беруться эти несколько мин. не пойму.
в строке 1019 nodeny.pl это при удалении временного платежа.

Код:
./web/pays.pl:740:      $p=&sql_select_line($dbh,"SELECT * FROM users WHERE (id=$Fmid OR mid=$Fmid) AND state='off' LIMIT 1",'Åñòü ëè õîòÿ áû îäíà çàáëîêèðîâàííàÿ çàïèñü ó êëèåíòà?');
./web/pays.pl:757:         &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Fmid OR mid=$Fmid");
./web/Scards.pl:109: &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Mid OR mid=$Mid");
./web/listuser.pl:330:  '3' => ["$sel_from_users state='off'", 'Êîìó çàïðåùåí äîñòóï'],
./nodeny.pl:90:$now_on_sql="(auth IN ('on','ong','off') OR lstate=1) AND state='on'";
./nodeny.pl:92:# $Udeny{$id} óñòàíîâëåí, åñëè äîñòóï äëÿ $id çàïðåùåí æåñòêî, ò.å â ÁÄ ïîëå state='off'
./nodeny.pl:684: $rows=&sqldo("UPDATE users SET state='off' WHERE id=$id LIMIT 1");
./nodeny.pl:1019:     $sql=$cash<0? ", state='on'" : '';
./nodeny.pl:1886:         $rows=$dbh->do("UPDATE users SET state='off' WHERE id=$id LIMIT 1");
./nodeny.orig.pl:89:$now_on_sql="(auth IN ('on','ong','off') OR lstate=1) AND state='on'";

Потому предлагаю сделать так:
перед:
Код:
#сообщаем клиенту, что всё нормально
вставить такое:
Код:
&sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Mid AND blance > limit_balance",'Включаем если баланс больше лимита');
#сообщаем клиенту, что всё нормально


Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 17:20:12
зробив як ви написали але нічого не змінилося - дальше не включає після поповнення


Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 10 Ноября 2010, 17:53:24
blance в sql-запросе правильно написан?


Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 18:13:20
все запрацювало, дякую!


Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 18:42:38
Copy-paste -- рулит!


Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 18:51:56
 :) тепер буду уважніший при копіюванні


Название: Re: тимчасовий платіж
Отправлено: smallcms от 10 Ноября 2010, 21:00:10
:) тепер буду уважніший при копіюванні
Я так понял вы пользуете очень сырую (одну из первых версий) модуля, который начинал разрабатывать я.

попробуйте скачать новую версию: http://code.google.com/p/nodeny49modules/ , т.к. по функционалу последние версии уходят далеко вперёд в отличии от той версии, которую вы сейчас используете...


Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 14:06:03
коли ставлю останню версію то не заходить в статистиці в цей пункт, пише ErrorDocument 500 , коли вертаю стару версію то все ок


Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 11 Ноября 2010, 14:34:51
Смотрите логи апача.


Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 11 Ноября 2010, 14:36:40
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?


Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 14:49:40
ось що в логах апача:


Код:
[Thu Nov 11 14:46:05 2010] [error] [client 10.1.1.5] Undefined subroutine &main::PROMI_main called at /usr/local/www/apache22/cgi-bin/adm/stat.pl line 413., referer: https://10.1.1.1/cgi-bin/adm/stat.pl?pp=T1-303579853oz9sVMve9kxcrmqxPIoENg&a=101&id=77&a=119
[Thu Nov 11 14:46:05 2010] [error] [client 10.1.1.5] Premature end of script headers: stat.pl, referer: https://10.1.1.1/cgi-bin/adm/stat.pl?pp=T1-303579853oz9sVMve9kxcrmqxPIoENg&a=101&id=77&a=119

що це означає ?


Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 11 Ноября 2010, 14:52:09
Ругается на субрутину PROMI_main. Посмотрите, как она называется в новой версии скрипта и внесите соответствующие поправки в реестр плагинов.


Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 15:08:38
запрацювало, дякую


Название: Re: тимчасовий платіж
Отправлено: smallcms от 11 Ноября 2010, 16:28:52
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?
Нет,  на данный момент последняя лежит в меркуриале. Я там добавил защиту от "антикварных" хитрецов, у которых баланс -3 с лета, а сейчас они якобы неожиданно взяли платёж. Могу архивом выложить... :-\


Название: Re: тимчасовий платіж
Отправлено: ale-x от 31 Января 2011, 23:52:38
Хороший модуль! Автору плюс. Думаю стоит оформить его в соответствующем разделе, как сделано с модулем "Поделиться банасом"


Название: Re: тимчасовий платіж
Отправлено: dimia от 29 Апреля 2011, 09:44:51
а с 49.33 будет работать?


Название: Re: тимчасовий платіж
Отправлено: Dimension от 27 Мая 2011, 12:13:51
поставил его на 50.32 надеюсь боков не должно быть ? функционально вроди бы все пока в норме...


Название: Re: тимчасовий платіж
Отправлено: poxy. от 27 Мая 2011, 13:42:37
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?
Эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.07.zip&can=2&q=


Название: Re: тимчасовий платіж
Отправлено: Dimension от 27 Мая 2011, 13:44:52
поставил его на 50.32 надеюсь боков не должно быть ? функционально вроди бы все пока в норме...
походу на 50.32 не пашет поле - "Если платежей не поступало столько дней"


Название: Re: тимчасовий платіж
Отправлено: smallcms от 27 Мая 2011, 14:44:33
походу на 50.32 не пашет поле - "Если платежей не поступало столько дней"
Уделил Вашему сообщению 30 минут. Прочитывал его вдумчиво не менее 10 минут и пытался вникнуть в сокральность этой немногословности, одновременно поизводя аудит кода. Остальные 20 минут потратил на вариации и фантазии о сбоях или модификациях биллинга, отрабатывая запросы в MySQL ручками.
И всё же если отбросить иронию по поводу гозирования лужи, то всё равно выходят две причины описанной Вами проблемы:
1) переменная $PRMP_oldpay не определена вовсе. В таком случае условие не отработает. Где-то моя вина, нужно делать проверки определения переменных и в случае если их всех нет в конфиге посылать пользователя модуля лесом.
2) переменная $PRMP_oldpay равна нулю. Тогда согласно задумке автора модуля действительно это поле не обрабатывается, даже если определено в конфигурационном файле.
Впрочем модуль был построен для бесплатной версии 49.32 и на 100% утверждать, что он будет работать в 50.32, не стану...