Уведомление об истечении членства в группе

Углубленное изучение Битрикс
  • Уведомление об истечении членства в группе

    Антон Долганин 1 Апреля 2016 15:30 1123
    Представим вполне обычный кейс. У пользователя платная подписка на группу (группы), которая ограничена каким-то сроком. За день до истечения мы хотим уведомить пользователя об истечении подписки. Сначала какая логика?

    • Запускаем агент раз в час.
    • Смотрим при каждом запуске кто истекает ровно через сутки в этот же час (с лагом 10 минут).
    Перекладывая на код, это такой фильтр:
    '>=DATE_ACTIVE_TO' => $date1->add('+1 day')->add('-70 minutes'),
    '<DATE_ACTIVE_TO' => $date2->add('+1 day'),

    То есть, наткнувшись на определенную запись, обработав ее, в следующий час запуска он ее не затронет.

    И полный код агента:
       /**
        * Проверяет истекающие группы тарифов, отправляет уведомление.
        * @return string
        */
       public static function checkExpiredUsers()
       {
          //смотрим вхождения в группы, которые истекут через месяц (предполагаем, что агент запускается раз в час и лаг 10 минут)
          $date1 = new \Bitrix\Main\Type\DateTime;
          $date2 = new \Bitrix\Main\Type\DateTime;
          $res = \Bitrix\Main\UserGroupTable::getList(array('filter' => array(
                                                             '>=DATE_ACTIVE_TO' => $date1->add('+1 day')->add('-70 minutes'),
                                                             '<DATE_ACTIVE_TO' => $date2->add('+1 day'),
                                                       ),
                                                 'select' => array(
                                                             '*',
                                                             'EMAIL' => 'USER.EMAIL',
                                                             'LOGIN' => 'USER.LOGIN',
                                                             'NAME' => 'USER.NAME',
                                                             'LAST_NAME' => 'USER.LAST_NAME',
                                                       )));
          while ($row = $res->fetch()) {
             $row['NAME'] = trim($row['NAME'].' '.$row['LAST_NAME']);
             if ($row['NAME'] == '') {
                $row['NAME'] = $row['LOGIN'];
             }
       //      \CEvent::send('SUBSCRIPTION_EXPIRED', \BB\Conf::MAIN_SITE_ID, $row);
          }
    
    
          return '\BB\Agents::checkExpiredUsers();';
       }


    Касаемо $date1 и $date2. Дело в том, что при каждом вызове add происходит изменении объекта. И сделав два раза add(+1 day) мы получим сдвиг в два дня уже. Поэтому, два разных объекта.

    Еще по теме: