Биллинговая система Nodeny
20 Сентября 2024, 04:36:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
  Начало Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [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;
               }
5  Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, % : 05 Мая 2012, 08:10:37
Точнее, начисляет не ерунду, а сумму вдвое меньше
6  Главная категория / Nodeny 50 / Re: Суточная абонплата Скидка, % : 05 Мая 2012, 07:26:50
Вот блин. Грустный на деле получилась фигня. тем, у кого скидка есть — всё пучком. У кого нет — начиляет всякую ерунду Грустный точнее, ощутимо меньше, чем должно быть.
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 )
Страниц: [1]
Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!