Просмотр сообщений
|
Страниц: [1]
|
1
|
Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, %
|
: 05 Мая 2012, 14:45:01
|
хе. и не забывай, в базу надо вносить не чистый $cash, а после применения скидки я сегодня весь день с этим бодался. но победил, результат ты видел да, я уже думал о том, что стоит выводить и размер скидки. и может стоит предложить внести это в основной код?
|
|
|
2
|
Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, %
|
: 05 Мая 2012, 12:34:53
|
где грабли и где опечатка покаж
Я же выше всё описал. Нельзя трогать в цикле начисления абоненту переменную $cash, потому что она посчитана в цикле более верхнего уровня для всей группы для экономии тактов на вычисление. Логика, логика, и ещё раз логика. В итоге мой вариант — работает, твой — разносит базу в хлам ошибочными начислениями. Сам же пройдись по циклу и увидишь эти грабли. Просто нарисовав на бумаге схему, на каком уровне что считается.
|
|
|
3
|
Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, %
|
: 05 Мая 2012, 10:23:47
|
зачем там еще одна переменая ?
Затем, что по отношению к циклу начисления абоненту переменная $cash — глобальная, и инициализируется на вхождении в цикл по тарифу, для всех абонентов этого ТП. заботливо разложеные вами грабли сработали
|
|
|
4
|
Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, %
|
: 05 Мая 2012, 10:16:04
|
Ох ты ж ёжик! Нельзя, нельзя в цикле трогать глобальную по отношению к нему переменную $cash!!!!! Вот и получалась хрень — дошли до пользователя со скидкой, и всем остальным на этом тарифе дальше начисляет неправильно! --- nodeny.pl.bak 2010-02-21 05:02:47.000000000 +1000 +++ nodeny.pl 2012-05-05 19:19:42.000000000 +1100 @@ -1082,7 +1082,7 @@ $h=~/^(8|9):(.+)/ or next; $cash=$1==8? sprintf("%.2f",-$2/$alldays) : -$2+0; # получим список клиентов, у которых тариф № $i, а также нет абонплаты за текущий день - $sql="SELECT id FROM users WHERE mid=0 AND paket=$i AND id NOT IN ". + $sql="SELECT id,discount FROM users WHERE mid=0 AND paket=$i AND id NOT IN ". "(SELECT u.id FROM users u LEFT JOIN pays p ON u.id=p.mid WHERE u.paket=$i and p.category=114 AND time>=$t1 AND time<=$t2)"; $sth=$dbh->prepare($sql); if( $sth->execute ) @@ -1090,16 +1090,21 @@ $V && &debug("SQL OK (".$sth->rows." rows):$sql"); while( $p=$sth->fetchrow_hashref ) { + my $cashd=0; $mid=$p->{id}; $Ustart_day{$mid}<0 && next; # пока не начал пользоваться услугами + # изменили сумму на скидку + $discount=$p->{$discount}; + #изменили сумму на скидку + $cashd=$cash-sprintf("%.2f",$cash * $discount/100); $ok=&sqldo("INSERT INTO pays (mid,cash,type,bonus,category,reason,coment,time) VALUES ". - "($mid,$cash,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная'); # 114 - `абонплата суточная` + "($mid,$cashd,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная'); # 114 - `абонплата суточная` if( $ok<1 ) { $ok or last; next; } - $ok=&sqldo("UPDATE users SET balance=balance+($cash) WHERE id=$mid LIMIT 1"); + $ok=&sqldo("UPDATE users SET balance=balance+($cashd) WHERE id=$mid LIMIT 1"); $ok<1 && &ToLog("Не удалось изменить баланс после проведения суточной абонплаты. Клиент id=$mid,$Id_to_ip{$mid}",'!!'); $ok or last; }
|
|
|
7
|
Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, %
|
: 04 Мая 2012, 14:31:27
|
Проверил. Во-первых, в коде была опечатка видимо, чтобы оградить особо недогадливых? Но идея отличная. Думаю, как бы ещё заставить отображаться сумму тарифа и в случае посуточного списания. а то нули всюду видны... Во-вторых, ввёл проверку на 0 в сумме списания — зачем гадить в лог пустыми записями? --- nodeny.pl.bak 2010-02-21 05:02:47.000000000 +1000 +++ nodeny.pl 2012-05-04 21:25:06.000000000 +1100 @@ -1082,7 +1082,7 @@ $h=~/^(8|9):(.+)/ or next; $cash=$1==8? sprintf("%.2f",-$2/$alldays) : -$2+0; # получим список клиентов, у которых тариф № $i, а также нет абонплаты за текущий день - $sql="SELECT id FROM users WHERE mid=0 AND paket=$i AND id NOT IN ". + $sql="SELECT id,discount FROM users WHERE mid=0 AND paket=$i AND id NOT IN ". "(SELECT u.id FROM users u LEFT JOIN pays p ON u.id=p.mid WHERE u.paket=$i and p.category=114 AND time>=$t1 AND time<=$t2)"; $sth=$dbh->prepare($sql); if( $sth->execute ) @@ -1092,6 +1092,13 @@ { $mid=$p->{id}; $Ustart_day{$mid}<0 && next; # пока не начал пользоваться услугами + #получили скидку клиента + $discount=$p->{discount}; + #изменили сумму на скидку + $m=$cash; + $i=-sprintf("%.2f",$cash*$discount/100); + $cash=sprintf("%.2f",$m+$i); + $cash<=0 && next; # если 0, то списывать незачем $ok=&sqldo("INSERT INTO pays (mid,cash,type,bonus,category,reason,coment,time) VALUES ". "($mid,$cash,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная'); # 114 - `абонплата суточная` if( $ok<1 )
|
|
|
|