и тут viewtopic.php?p=1523#p1523
Давно ее решил, но хочу поделиться и с Вами.
Ситуация:
1. Создается услуга создается с ручным выполнением (Например, "Подписка на журнал Мурзилка"/каждый день)
2. Пользователь заказывает услугу, которая будет обрабатываться Администратором в ручную. Т.е. он заказывает, создает счет, оплачивает его. В итоге, заказ со статусом "На создании" лежит в разделе "Услуги". Срок заказа, предположим, 30 дней.
3. Администратор в это время отсутствует (выходные или еще что) и не может сразу обработать заказ.
4. В итоге, Администратор обрабатывает заказ через 2 дня. Но Дата окончания заказа в биллинге от этого не меняется. Т.е. не учитывается срок "простоя".
Тоже самое происходит, если услуга уже была заблокирована, по окончании срока оплаченного периода, и оплачена пользователем на следующий срок после блокировки. В этом случае, перед обработкой Администратором - заказ будет со статусом "На продлении".
Задача:
Нужно, чтобы при изменении статуса заказа на "Активен", после обработки Администратором вручную, компенсировалось время простоя.
Решение (я решил так... может кто решит иначе):
В файле hosts/billing/comp/www/API/StatusSet.comp строки 120-122
Код: Выделить всё
      $StatusDate = Time();
      #-------------------------------------------------------------------------
      $IsUpdate = DB_Update($ModeID,Array('StatusID'=>$StatusID,'StatusDate'=>$StatusDate),Array('ID'=>$Row['ID']));заменить на
Код: Выделить всё
      #-------------------------------------------------------------------------
      if ($ModeID == 'Orders'){
          $ChOrders = DB_Select('OrdersOwners',Array('ID','OrderDate','ExpirationDate','StatusID','StatusDate','UserID'),Array('ID'=>$Row['ID']));
          switch(ValueOf($ChOrders)){
              case 'error':
                return ERROR | @Trigger_Error(500);
              case 'exception':
                #return ERROR | @Trigger_Error(400);
                break;
              case 'array':
                  foreach($ChOrders as $ChOrder){
                  $chOrderDate = $ChOrder['OrderDate'];
                  $chExpirationDate = $ChOrder['ExpirationDate'];
                  $chStatus = $ChOrder['StatusID'];
                  $chStatusDate = $ChOrder['StatusDate'];
                  $chUserID = (integer)$ChOrder['UserID'];
                  }
                  break;
              default:
                  return ERROR | @Trigger_Error(101);
          }
      }
      #-------------------------------------------------------------------------
          if($StatusID=='Active' AND $chStatus=='OnCreate' AND $ModeID == 'Orders') {
             $IsUpdate = DB_Update($ModeID,Array('ExpirationDate'=>$chExpirationDate + ($StatusDate - $chOrderDate),'StatusID'=>$StatusID,'StatusDate'=>$StatusDate),Array('ID'=>$Row['ID']));
          }elseif($StatusID=='Active' AND $chStatus=='OnProlong' AND $ModeID == 'Orders') {
             $IsUpdate = DB_Update($ModeID,Array('ExpirationDate'=>$chExpirationDate + ($StatusDate - $chStatusDate),'StatusID'=>$StatusID,'StatusDate'=>$StatusDate),Array('ID'=>$Row['ID']));
          }else{
             $IsUpdate = DB_Update($ModeID,Array('StatusID'=>$StatusID,'StatusDate'=>$StatusDate),Array('ID'=>$Row['ID']));}


