komnod
|
|
« : 12 Апреля 2012, 10:29:03 » |
|
Собственно вопрос, каким образом можно сделать скидку в тарифах с суточной абонплатой? просто имеются абоненты, от которых запитаны свичи (немного но есть такие) и им ставим Скидка, % но она не учитывается при суточной тарификации.
|
|
|
Записан
|
|
|
|
francuz
Новичок
Карма: 0
Offline
Сообщений: 4
|
|
« Ответ #1 : 29 Апреля 2012, 14:30:24 » |
|
Неужели никто не сталкивался?
|
|
|
Записан
|
|
|
|
Rico-X
NoDeny
Старожил
Карма: 7
Offline
Сообщений: 349
|
|
« Ответ #2 : 29 Апреля 2012, 14:32:15 » |
|
А суточный тариф добавить отдельный для таких абонов не вариант?
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #3 : 29 Апреля 2012, 14:58:51 » |
|
И под каждый % свой тариф? oO -- Бред Пит'!
|
|
|
Записан
|
|
|
|
francuz
Новичок
Карма: 0
Offline
Сообщений: 4
|
|
« Ответ #4 : 30 Апреля 2012, 06:31:17 » |
|
НЕ только под каждый % свой тариф, но и еще под тарифный план(( у кого то 100 руб в мес. а у кого то 50((( Так что полнейший БРЭЭЭЭД ПИТ
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #5 : 01 Мая 2012, 10:57:55 » |
|
а если так? nodeny.pl это # получим список клиентов, у которых тариф № $i, а также нет абонплаты за текущий день $sql="SELECT id 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 ) { $V && &debug("SQL OK (".$sth->rows." rows):$sql"); while( $p=$sth->fetchrow_hashref ) { $mid=$p->{id}; $Ustart_day{$mid}<0 && next; # пока не начал пользоваться услугами $ok=&sqldo("INSERT INTO pays (mid,cash,type,bonus,category,reason,coment,time) VALUES ". "($mid,$cash,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная'); # 114 - `абонплата суточная`
на это # получим список клиентов, у которых тариф № $i, а также нет абонплаты за текущий день $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 ) { $V && &debug("SQL OK (".$sth->rows." rows):$sql"); while( $p=$sth->fetchrow_hashref ) { $mid=$p->{id}; $Ustart_day{$mid}<0 && next; # пока не начал пользоваться услугами #получили скидку клиета $discount=$p->{$discount}; #изменили сумму на скидку $cash=$cash-sprintf("%.2f",$money * $discount/100); $ok=&sqldo("INSERT INTO pays (mid,cash,type,bonus,category,reason,coment,time) VALUES ". "($mid,$cash,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная'); # 114 - `абонплата суточная`
не проверялось. но должно работать.
|
|
|
Записан
|
|
|
|
fluffy
Пользователь
Карма: 0
Offline
Сообщений: 7
|
|
« Ответ #6 : 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 )
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #7 : 04 Мая 2012, 14:43:57 » |
|
Проверил. Во-первых, в коде была опечатка видимо, чтобы оградить особо недогадливых? Но идея отличная. + $m=$cash; + $i=-sprintf("%.2f",$cash*$discount/100); + $cash=sprintf("%.2f",$m+$i);
опечатка ... могет быть праздники все таки... а это замени на одну строку и будет гуд Думаю, как бы ещё заставить отображаться сумму тарифа и в случае посуточного списания. а то нули всюду видны... Во-вторых, ввёл проверку на 0 в сумме списания — зачем гадить в лог пустыми записями? думаю тоже ничего сложного нет ... будет время сделаю. я там понял нужно сумма снятия что бы писался суточный тариф?
|
|
|
Записан
|
|
|
|
fluffy
Пользователь
Карма: 0
Offline
Сообщений: 7
|
|
« Ответ #8 : 05 Мая 2012, 07:26:50 » |
|
Вот блин. на деле получилась фигня. тем, у кого скидка есть — всё пучком. У кого нет — начиляет всякую ерунду точнее, ощутимо меньше, чем должно быть.
|
|
|
Записан
|
|
|
|
fluffy
Пользователь
Карма: 0
Offline
Сообщений: 7
|
|
« Ответ #9 : 05 Мая 2012, 08:10:37 » |
|
Точнее, начисляет не ерунду, а сумму вдвое меньше
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #10 : 05 Мая 2012, 10:04:31 » |
|
Точнее, начисляет не ерунду, а сумму вдвое меньше
по ходу у вас предыдущий клиет имел скидку 50% - переменая не обнулялась
|
|
|
Записан
|
|
|
|
fluffy
Пользователь
Карма: 0
Offline
Сообщений: 7
|
|
« Ответ #11 : 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; }
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #12 : 05 Мая 2012, 10:20:31 » |
|
зачем там еще одна переменая ? $cashd=$cash-sprintf("%.2f",$cash * $discount/100); ?
если $cash=$cash-sprintf("%.2f",$cash * $discount/100); этого достаточно
|
|
|
Записан
|
|
|
|
fluffy
Пользователь
Карма: 0
Offline
Сообщений: 7
|
|
« Ответ #13 : 05 Мая 2012, 10:23:47 » |
|
зачем там еще одна переменая ?
Затем, что по отношению к циклу начисления абоненту переменная $cash — глобальная, и инициализируется на вхождении в цикл по тарифу, для всех абонентов этого ТП. заботливо разложеные вами грабли сработали
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #14 : 05 Мая 2012, 11:31:46 » |
|
где грабли и где опечатка покаж
|
|
|
Записан
|
|
|
|
|