Биллинговая система Nodeny
26 Ноября 2024, 16:08:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2
  Печать  
Автор Тема: Суточная абонплата Скидка, %  (Прочитано 9213 раз)
komnod
Пользователь
**

Карма: 0
Offline Offline

Сообщений: 7


Просмотр профиля Email
« : 12 Апреля 2012, 10:29:03 »

Собственно вопрос, каким образом можно сделать скидку в тарифах с суточной абонплатой?
просто имеются абоненты, от которых запитаны свичи (немного но есть такие) и им ставим
Скидка, %
но она не учитывается при суточной тарификации.
Записан
francuz
Новичок
*

Карма: 0
Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #1 : 29 Апреля 2012, 14:30:24 »

Неужели никто не сталкивался?
Записан
Rico-X
NoDeny
Старожил
*

Карма: 7
Offline Offline

Сообщений: 349


Просмотр профиля
« Ответ #2 : 29 Апреля 2012, 14:32:15 »

А суточный тариф добавить отдельный для таких абонов не вариант?
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #3 : 29 Апреля 2012, 14:58:51 »

И под каждый % свой тариф? oO -- Бред Пит'!
Записан
francuz
Новичок
*

Карма: 0
Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #4 : 30 Апреля 2012, 06:31:17 »

НЕ только под каждый % свой тариф, но и еще под тарифный план(( у кого то 100 руб в мес. а у кого то 50((( Так что полнейший БРЭЭЭЭД ПИТ
Записан
ser970
NoDeny
Спец
*

Карма: 70
Offline Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #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 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 Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #7 : 04 Мая 2012, 14:43:57 »

Проверил. Во-первых, в коде была опечатка Улыбающийся видимо, чтобы оградить особо недогадливых? Улыбающийся
Но идея отличная.
Код:
+                    $m=$cash;
+                    $i=-sprintf("%.2f",$cash*$discount/100);
+                    $cash=sprintf("%.2f",$m+$i);
опечатка ... могет быть праздники все таки...
а это замени на одну строку и будет гуд


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

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

Карма: 0
Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #8 : 05 Мая 2012, 07:26:50 »

Вот блин. Грустный на деле получилась фигня. тем, у кого скидка есть — всё пучком. У кого нет — начиляет всякую ерунду Грустный точнее, ощутимо меньше, чем должно быть.
Записан
fluffy
Пользователь
**

Карма: 0
Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #9 : 05 Мая 2012, 08:10:37 »

Точнее, начисляет не ерунду, а сумму вдвое меньше
Записан
ser970
NoDeny
Спец
*

Карма: 70
Offline Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #10 : 05 Мая 2012, 10:04:31 »

Точнее, начисляет не ерунду, а сумму вдвое меньше
по ходу у вас предыдущий клиет имел скидку 50% - переменая не обнулялась
Записан
fluffy
Пользователь
**

Карма: 0
Offline 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 Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #12 : 05 Мая 2012, 10:20:31 »

зачем там еще одна переменая ?
$cashd=$cash-sprintf("%.2f",$cash * $discount/100); ?

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

Карма: 0
Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #13 : 05 Мая 2012, 10:23:47 »

зачем там еще одна переменая ?

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

Карма: 70
Offline Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #14 : 05 Мая 2012, 11:31:46 »

где грабли и где опечатка покаж
Записан
Страниц: [1] 2
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!