Страница 1 из 1

Компенсация времени простоя ручных услуг

Добавлено: 2010-09-13 10:56:44
B0nuse
Ранее я затрагивал эту ситуацию как второстепенную в теме viewtopic.php?p=1035#p1035
и тут 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']));}

Re: Компенсация времени простоя ручных услуг

Добавлено: 2010-09-13 11:15:30
B0nuse
Объясню условия:
Для заказов делается запрос в БД о Дате заказа, Дате окончания, Статусе заказа, Дате последней смены статуса, ID пользователя (чтобы в этом же файле можно было сделать отсылку уведомления о смене статуса заказа)

1. При изменении статуса заказов с "На создании" на "Активен" в БД обновляется Дата окончания, вычисленная по формуле

Код: Выделить всё

Дата окончания = предыдущей дате окончания  + (Текущее время - Дата создания заказа)

2. При изменении статуса заказов с "На продлении" на "Активен" в БД обновляется Дата окончания, вычисленная по формуле

Код: Выделить всё

Дата окончания = предыдущей дате окончания  + (Текущее время - Дата последней смены статуса)

3. Иначе Дата окончания не изменяется.

Думаю, можно ограничиться вообще одним условием

Код: Выделить всё

if($StatusID=='Active' AND ($chStatus=='OnCreate' OR $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']));}

Но мне пока так удобнее... :)

ЗЫ: Плз, увеличьте время редактирования собственных сообщений.... и с Проф праздником всех!

Re: Компенсация времени простоя ручных услуг

Добавлено: 2010-09-14 12:36:53
serge
Ваши бы правки да в релизы.... не пробовали связываться с Виталием по поводу доступа к svn?

Re: Компенсация времени простоя ручных услуг

Добавлено: 2010-09-14 20:55:53
Alex Keda
B0nuse писал(а):ЗЫ: Плз, увеличьте время редактирования собственных сообщений.... и с Проф праздником всех!

до какого разумного срока?
=========
можно совем отменить лимит времени - но иногда появляются отморозки портящие тред в котором они учавствовали - вплоть до полного маразма....
"типа смешно" =(

Re: Компенсация времени простоя ручных услуг

Добавлено: 2010-09-14 21:35:14
B0nuse
Оффтоп все это....
lissyara писал(а):до какого разумного срока?
=========
можно совем отменить лимит времени - но иногда появляются отморозки портящие тред в котором они учавствовали - вплоть до полного маразма....
"типа смешно" =(

Думаю, от пары часов до суток... на выбор...

Бывает постишь что-нить, ошибешься кнокой и отправишь пост... пока дописываешь - редактирование запрещается.
А еще, через некоторое время, бывает проблема решается, а склейки сообщений нет.
... и тому подобное...

Re: Компенсация времени простоя ручных услуг

Добавлено: 2010-09-15 14:21:37
Alex Keda
увеличил до получаса.
было 15 минут
будут проблемы - пишите