Довольно странная ситуация. Есть код.
spoiler<?php
namespace Notification;
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
use Bitrix\Main\Loader;
use Bitrix\Crm\Service\Container;
class BirthDatebp
{
private const BP_ID_7_DAYS_BEFORE = 8;
private const BP_ID_3_DAYS_BEFORE = 10;
private const BP_ID_BIRTHDAY = 9;
public static function runAgent()
{
// Проверяем подключение модуля CRM
if (!Loader::includeModule('crm')) {
return;
}
// Получаем текущую дату
$today = new \DateTime();
// Получаем экземпляр фабрики контактов
$contactFactory = Container::getInstance()->getFactory(\CCrmOwnerType::Contact);
if (!$contactFactory) {
return;
}
// Получаем список контактов с датой рождения
$contactData = $contactFactory->getItems([
'select' => ['ID', 'BIRTHDATE', 'FULL_NAME'],
'filter' => ['!BIRTHDATE' => false]
]);
foreach ($contactData as $contact) {
$contactId = $contact->getId();
$birthDate = $contact->get('BIRTHDATE');
if (!$birthDate) {
continue;
}
$birthDate = new \DateTime($birthDate);
$birthMonthDay = $birthDate->format('m-d');
$todayMonthDay = $today->format('m-d');
// Проверяем за 7 дней до дня рождения
$diff7Days = (clone $birthDate)->modify('-7 days')->format('m-d');
if ($todayMonthDay === $diff7Days) {
self::startBusinessProcess($contactId, self::BP_ID_7_DAYS_BEFORE);
}
// Проверяем за 3 дня до дня рождения
$diff3Days = (clone $birthDate)->modify('-3 days')->format('m-d');
if ($todayMonthDay === $diff3Days) {
self::startBusinessProcess($contactId, self::BP_ID_3_DAYS_BEFORE);
}
// Проверяем, совпадает ли сегодня с днем рождения
if ($todayMonthDay === $birthMonthDay) {
self::startBusinessProcess($contactId, self::BP_ID_BIRTHDAY);
}
}
return "Notification\\BirthDatebp::runAgent();";
}
private static function startBusinessProcess($contactId, $bpId)
{
$errors = [];
\CBPDocument::StartWorkflow(
$bpId,
['crm', 'CCrmDocumentContact', "CONTACT_{$contactId}"],
[],
$errors
);
// Логика обработки ошибок запуска, если потребуется
if (!empty($errors)) {
// Здесь можно добавить обработку ошибок или запись в лог
}
}
}
Файл init создала простенький в local/php_interface . На всякий случай и его код:
spoiler<?php
// Автозагрузка классов
spl_autoload_register(function ($className) {
$path = $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/classes/" . str_replace("\\", "/", $className) . ".php";
if (file_exists($path)) {
require_once $path;
}
});
// Подключение дополнительных файлов, если нужно
$additionalFiles = [
__DIR__ . "/events.php",
__DIR__ . "/functions.php"
];
foreach ($additionalFiles as $file) {
if (file_exists($file)) {
require_once $file;
}
}
Нужно запустить код агентом. Проверяю через php консоль вот так:
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
Notification\BirthDatebp::runAgent();
Код отрабатывает. Всё хорошо. БП нужные запускаются.
Ставлю агент на этот код:
Notification\BirthDatebp::runAgent();
С запуском точно в указанное время и интервалом 86400 .
Агент начинает накапливать попытки запуска, дату последнего запуска не пишет, следующий запуск не обновляет. Код соответственно не запускает.
Есть другой файл для теста делала - там просто запуск и запись перезапуска агента. Его агент ставит на новый запуск нормально.
Не понимаю куда "копать". Почему из консоли запуск есть, а из агента - нет?...
Я только учусь, потому сильно тапками не закидывайте. Спасибо.