Представим вполне обычный кейс. У пользователя платная подписка на группу (группы), которая ограничена каким-то сроком. За день до истечения мы хотим уведомить пользователя об истечении подписки. Сначала какая логика?
- Запускаем агент раз в час.
- Смотрим при каждом запуске кто истекает ровно через сутки в этот же час (с лагом 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) мы получим сдвиг в два дня уже. Поэтому, два разных объекта.
Еще по теме: