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

Главная категория => Nodeny 50 => Тема начата: komnod от 12 Апреля 2012, 10:29:03



Название: Суточная абонплата Скидка, %
Отправлено: komnod от 12 Апреля 2012, 10:29:03
Собственно вопрос, каким образом можно сделать скидку в тарифах с суточной абонплатой?
просто имеются абоненты, от которых запитаны свичи (немного но есть такие) и им ставим
Скидка, %
но она не учитывается при суточной тарификации.


Название: Re: Суточная абонплата Скидка, %
Отправлено: francuz от 29 Апреля 2012, 14:30:24
Неужели никто не сталкивался?


Название: Re: Суточная абонплата Скидка, %
Отправлено: Rico-X от 29 Апреля 2012, 14:32:15
А суточный тариф добавить отдельный для таких абонов не вариант?


Название: Re: Суточная абонплата Скидка, %
Отправлено: 0xbad0c0d3 от 29 Апреля 2012, 14:58:51
И под каждый % свой тариф? oO -- Бред Пит'!


Название: Re: Суточная абонплата Скидка, %
Отправлено: francuz от 30 Апреля 2012, 06:31:17
НЕ только под каждый % свой тариф, но и еще под тарифный план(( у кого то 100 руб в мес. а у кого то 50((( Так что полнейший БРЭЭЭЭД ПИТ


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 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 - `абонплата суточная`


не проверялось. но должно работать.


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 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 )


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 04 Мая 2012, 14:43:57
Проверил. Во-первых, в коде была опечатка :) видимо, чтобы оградить особо недогадливых? :)
Но идея отличная.
Код:
+                    $m=$cash;
+                    $i=-sprintf("%.2f",$cash*$discount/100);
+                    $cash=sprintf("%.2f",$m+$i);
опечатка ... могет быть праздники все таки...
а это замени на одну строку и будет гуд


Думаю, как бы ещё заставить отображаться сумму тарифа и в случае посуточного списания. а то нули всюду видны...
Во-вторых, ввёл проверку на 0 в сумме списания — зачем гадить в лог пустыми записями? :)

думаю тоже ничего сложного нет ... будет время сделаю. я там понял нужно сумма снятия что бы писался суточный тариф? 


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 05 Мая 2012, 07:26:50
Вот блин. :( на деле получилась фигня. тем, у кого скидка есть — всё пучком. У кого нет — начиляет всякую ерунду :( точнее, ощутимо меньше, чем должно быть.


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 05 Мая 2012, 08:10:37
Точнее, начисляет не ерунду, а сумму вдвое меньше


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 10:04:31
Точнее, начисляет не ерунду, а сумму вдвое меньше
по ходу у вас предыдущий клиет имел скидку 50% - переменая не обнулялась


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 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;
               }


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 10:20:31
зачем там еще одна переменая ?
$cashd=$cash-sprintf("%.2f",$cash * $discount/100); ?

если
$cash=$cash-sprintf("%.2f",$cash * $discount/100);
этого достаточно
 


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 05 Мая 2012, 10:23:47
зачем там еще одна переменая ?

Затем, что по отношению к циклу начисления абоненту переменная $cash —  глобальная, и инициализируется на вхождении в цикл по тарифу, для всех абонентов этого ТП.
заботливо разложеные вами грабли сработали :)


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 11:31:46
где грабли и где опечатка покаж


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 05 Мая 2012, 12:34:53
где грабли и где опечатка покаж

Я же выше всё описал. Нельзя трогать в цикле начисления абоненту переменную $cash, потому что она посчитана в цикле более верхнего уровня для всей группы для экономии тактов на вычисление. Логика, логика, и ещё раз логика.
В итоге мой вариант — работает, твой — разносит базу в хлам ошибочными начислениями.

Сам же пройдись по циклу и увидишь эти грабли. Просто нарисовав на бумаге схему, на каком уровне что считается.


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 13:22:36
сори увидел опечатку
вот чем опасен копипаст  

$cas=$cash-sprintf("%.2f",$cash * $discount/100);

думаю почему у меня на тестовой все прокатило

там еще лист пл надо поправить  что бы рисовало


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 13:55:40
и еще в
"($mid,$cashd,10,'y',114,'','Суточная абонплата',$ut)",'Абонплата суточная');

в вписать что есть скидка  - так как скидка может быть изменена в течении месяца


Название: Re: Суточная абонплата Скидка, %
Отправлено: fluffy от 05 Мая 2012, 14:45:01
хе. и не забывай, в базу надо вносить не чистый $cash, а после применения скидки :) я сегодня весь день с этим бодался. но победил, результат ты видел :)

да, я уже думал о том, что стоит выводить и размер скидки.
и может стоит предложить внести это в основной код?


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 15:53:21
водитсЯ не cash а cas

и вот как получилось

в инфо юзера

 


Название: Re: Суточная абонплата Скидка, %
Отправлено: ser970 от 05 Мая 2012, 16:03:34
как видно нолики уже не рисует  - рисует снятие как  положено. ( на скрине дата не верная там 29 апреля)
но...
у меня пропало желание писать на халяву - в моих сетях это не нужно.

включай логику и на бумажке рисуй что и где выводится

и по пробуй победить вот это ;D


Название: Re: Суточная абонплата Скидка, %
Отправлено: 0xbad0c0d3 от 05 Мая 2012, 16:23:15
Код:
$cash=$cash-sprintf("%.2f",$cash * $discount/100);
По-моему так красивее:
Код:
$cash=sprintf("%.2f",$cash * (1-$discount/100));
А вообще, глоб. переменную трогать и правда нельзя, но там она не глобальная, но не важно...
Там перед тем, как снимать с абона нужно сделать или другую переменную, или добавлять подсчет скидки в двух местах, или делать my а лучше всего local
т.е.
Код:
$mid=$p->{id};
$Ustart_day{$mid}<0 && next; # пока не начал пользоваться услугами
local $cash=sprintf("%.2f",$cash * (1-$discount/100)) if $discount; #Нафига нам что-то считать если скидки нет!?