Internal API UK: различия между версиями

Материал из WiKi - UserSide
([IronBot] Sync EN/UK localization from RU)
 
([IronBot] Fix UK localization text)
 
Строка 1: Строка 1:
[[Internal_API_EN|en]] | '''uk''' | [[Internal_API|ru]]
[[Internal_API_EN|en]] | '''uk''' | [[Internal_API|ru]]


Custom Events v2 - это локальная система внутренних событий ERP. Она выполняет клиентский PHP-код внутри текущего PHP-процесса ERP без HTTP-запросов, веб-хуков и внешних очередей.
Custom Events v2 - це локальна система внутрішніх подій ERP. Вона виконує клієнтський PHP-код усередині поточного PHP-процесу ERP без HTTP-запитів, вебхуків і зовнішніх черг.


Старый механизм <code>legacy/Config/custom_api.txt</code> с функцией <code>api_function(...)</code> остается legacy-контрактом. В v2 старые названия используются только для карты совместимости. Новый клиентский код должен использовать константы <code>CustomEvent::...</code>.
Старий механізм <code>legacy/Config/custom_api.txt</code> з функцією <code>api_function(...)</code> залишається legacy-контрактом. У v2 старі назви використовуються лише для карти сумісності. Новий клієнтський код має використовувати константи <code>CustomEvent::...</code>.


== Файлы ==
== Файли ==


Рабочий клиентский файл один:
Робочий клієнтський файл один:


<pre>evolution/CustomEvents/v2/handlers.php</pre>
<pre>evolution/CustomEvents/v2/handlers.php</pre>


Пример:
Приклад:


<pre>evolution/CustomEvents/v2/handlers.example.php</pre>
<pre>evolution/CustomEvents/v2/handlers.example.php</pre>


Список всех констант:
Список усіх констант:


<pre>evolution/CustomEvents/Runtime/v2/CustomEvent.php</pre>
<pre>evolution/CustomEvents/Runtime/v2/CustomEvent.php</pre>


Карта старых имен в новые события:
Карта старих назв у нові події:


<pre>evolution/CustomEvents/Runtime/v2/CustomEventLegacyEventMap.php</pre>
<pre>evolution/CustomEvents/Runtime/v2/CustomEventLegacyEventMap.php</pre>
Строка 31: Строка 31:
<pre>var/log/custom-events-v2.log</pre>
<pre>var/log/custom-events-v2.log</pre>


== Как писать обработчики ==
== Як писати обробники ==


Используется одна функция регистрации: <code>internal_event(...)</code>.
Використовується одна функція реєстрації: <code>internal_event(...)</code>.


В одном файле можно зарегистрировать несколько обработчиков подряд:
В одному файлі можна зареєструвати кілька обробників поспіль:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Строка 51: Строка 51:
     static function ($event): bool|string {
     static function ($event): bool|string {
         if ((int)$event->get('new_status_id') === 0) {
         if ((int)$event->get('new_status_id') === 0) {
             return 'Запрещено переводить абонента в этот статус';
             return 'Заборонено переводити абонента в цей статус';
         }
         }


Строка 63: Строка 63:
         $customerId = (int)$event->get('customer_id');
         $customerId = (int)$event->get('customer_id');


         return '<div>Дополнительная информация по абоненту #' . $customerId . '</div>';
         return '<div>Додаткова інформація щодо абонента #' . $customerId . '</div>';
     },
     },
);
);
</syntaxhighlight>
</syntaxhighlight>


В обработчик всегда приходит один параметр <code>$event</code>.
В обробник завжди надходить один параметр: <code>$event</code>.


Данные читаются без типовых оберток:
Дані читаються без типових обгорток:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Строка 78: Строка 78:
</syntaxhighlight>
</syntaxhighlight>


Если нужен конкретный тип, приводите значение в своем коде:
Якщо потрібен конкретний тип, приведіть значення у своєму коді:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Строка 85: Строка 85:
</syntaxhighlight>
</syntaxhighlight>


== Результат обработчика ==
== Результат обробника ==


Обработчик возвращает простое значение:
Обробник повертає просте значення:


{| class="wikitable"
{| class="wikitable"
! Возврат
! Повернення
! Значение
! Значення
|-
|-
| <code>true</code>
| <code>true</code>
| Обработчик выполнен успешно
| Обробник виконано успішно
|-
|-
| <code>false</code>
| <code>false</code>
| Для события <code>*.before</code> запретить штатную операцию
| Для події <code>*.before</code> заборонити штатну операцію
|-
|-
| <code>null</code>
| <code>null</code>
| Ничего не менять
| Нічого не змінювати
|-
|-
| строка
| рядок
| Для <code>*.before</code> запретить операцию с текстом причины; для <code>*.render</code> вывести строку/HTML
| Для <code>*.before</code> заборонити операцію з текстом причини; для <code>*.render</code> вивести рядок або HTML
|}
|}


События <code>*.before</code> могут отменять штатную операцию. Остальные события не должны отменять уже выполненное действие.
Події <code>*.before</code> можуть скасовувати штатну операцію. Інші події не повинні скасовувати вже виконану дію.


== Пример запрета операции ==
== Приклад заборони операції ==


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Строка 115: Строка 115:
     static function ($event): bool|string {
     static function ($event): bool|string {
         if ((int)$event->get('new_status_id') === 0) {
         if ((int)$event->get('new_status_id') === 0) {
             return 'Запрещено переводить абонента в этот статус';
             return 'Заборонено переводити абонента в цей статус';
         }
         }


Строка 123: Строка 123:
</syntaxhighlight>
</syntaxhighlight>


== Пример вывода HTML ==
== Приклад виведення HTML ==


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Строка 131: Строка 131:
         $customerId = (int)$event->get('customer_id');
         $customerId = (int)$event->get('customer_id');


         return '<div>Дополнительная информация по абоненту #' . $customerId . '</div>';
         return '<div>Додаткова інформація щодо абонента #' . $customerId . '</div>';
     },
     },
);
);
</syntaxhighlight>
</syntaxhighlight>


== Проверка, кеш и лог ==
== Перевірка, кеш і лог ==


При изменении <code>evolution/CustomEvents/v2/handlers.php</code> ERP проверяет синтаксис через <code>php -l</code>. Если синтаксис корректный, файл копируется в <code>var/cache/CustomEvents/handlers.v2.cache.php</code>.
Після зміни <code>evolution/CustomEvents/v2/handlers.php</code> ERP перевіряє синтаксис через <code>php -l</code>. Якщо синтаксис коректний, файл копіюється до <code>var/cache/CustomEvents/handlers.v2.cache.php</code>.


Runtime-лог пишется в JSON Lines в <code>var/log/custom-events-v2.log</code>. Одна строка - один вызов обработчика, ошибка или факт отсутствия обработчиков.
Runtime-лог записується у форматі JSON Lines до <code>var/log/custom-events-v2.log</code>. Один рядок - це один виклик обробника, помилка або факт відсутності обробників.


Пример строки:
Приклад рядка:


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Строка 148: Строка 148:
</syntaxhighlight>
</syntaxhighlight>


Лог ротируется в:
Лог ротується в:


<pre>var/log/custom-events-v2.log.1</pre>
<pre>var/log/custom-events-v2.log.1</pre>


== Ошибки ==
== Помилки ==


Если в обработчике возникнет ошибка, ERP запишет ее в лог и продолжит работу по правилам конкретного события.
Якщо в обробнику виникне помилка, ERP запише її в лог і продовжить роботу за правилами конкретної події.


Обработчик выполняется внутри того же PHP-процесса, что и ядро ERP. Через ядро проходят тысячи операций, и медленный или ошибочный клиентский код может остановить или дестабилизировать работу всей системы. Не используйте <code>exit</code>, <code>die</code>, бесконечные циклы, тяжелые SQL-запросы без ограничений и долгие внешние операции. Держите обработчики короткими и предсказуемыми.
Обробник виконується всередині того самого PHP-процесу, що й ядро ERP. Через ядро проходять тисячі операцій, тому повільний або помилковий клієнтський код може зупинити чи дестабілізувати роботу всієї системи. Не використовуйте <code>exit</code>, <code>die</code>, нескінченні цикли, важкі SQL-запити без обмежень і тривалі зовнішні операції. Тримайте обробники короткими та передбачуваними.


== Рекомендации ==
== Рекомендації ==


* Используйте только константы <code>CustomEvent::...</code>.
* Використовуйте лише константи <code>CustomEvent::...</code>.
* Не пишите строку события вручную.
* Не пишіть рядок події вручну.
* Делайте обработчики короткими.
* Робіть обробники короткими.
* Не вызывайте HTTP/webhook из высокочастотных событий.
* Не викликайте HTTP/webhook із високочастотних подій.
* Не используйте <code>exit</code>, <code>die</code>, бесконечные циклы и тяжелые выборки без ограничений.
* Не використовуйте <code>exit</code>, <code>die</code>, нескінченні цикли та важкі вибірки без обмежень.
* Возвращайте <code>true</code>, <code>false</code>, <code>null</code> или строку.
* Повертайте <code>true</code>, <code>false</code>, <code>null</code> або рядок.


== Все события ==
== Усі події ==


Ниже перечислены все события v2. Полный технический список констант находится в <code>evolution/CustomEvents/Runtime/v2/CustomEvent.php</code>.
Нижче перелічені всі події v2. Повний технічний список констант міститься в <code>evolution/CustomEvents/Runtime/v2/CustomEvent.php</code>.


Поля <code>event</code> указаны как текущий контракт данных.
Поля <code>event</code> вказані як поточний контракт даних.


=== Здания ===
=== Будинки ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::BUILDING_CREATED</code>
| <code>CustomEvent::BUILDING_CREATED</code>
| После создания здания
| Після створення будинку
| <code>building_id</code>, <code>data</code>
| <code>building_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::BUILDING_CHANGED</code>
| <code>CustomEvent::BUILDING_CHANGED</code>
| После редактирования здания
| Після редагування будинку
| <code>building_id</code>, <code>data</code>
| <code>building_id</code>, <code>data</code>
|}
|}


=== Коммутация ===
=== Комутація ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::COMMUTATION_CREATE_BEFORE</code>
| <code>CustomEvent::COMMUTATION_CREATE_BEFORE</code>
| Перед созданием коммутации между объектами
| Перед створенням комутації між об'єктами
| <code>source_type</code>, <code>source_id</code>, <code>target_type</code>, <code>target_id</code>, <code>data</code>
| <code>source_type</code>, <code>source_id</code>, <code>target_type</code>, <code>target_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::COMMUTATION_DELETE_BEFORE</code>
| <code>CustomEvent::COMMUTATION_DELETE_BEFORE</code>
| Перед удалением коммутации между объектами
| Перед видаленням комутації між об'єктами
| <code>source_type</code>, <code>source_id</code>, <code>target_type</code>, <code>target_id</code>, <code>data</code>
| <code>source_type</code>, <code>source_id</code>, <code>target_type</code>, <code>target_id</code>, <code>data</code>
|}
|}


=== Главная страница ===
=== Головна сторінка ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::DASHBOARD_TOP_CONTENT_RENDER</code>
| <code>CustomEvent::DASHBOARD_TOP_CONTENT_RENDER</code>
| При выводе текста в начальной части главной страницы
| Під час виведення тексту у верхній частині головної сторінки
| <code>employee_id</code>, <code>data</code>
| <code>employee_id</code>, <code>data</code>
|}
|}


=== Оборудование ===
=== Обладнання ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::DEVICE_CHANGED</code>
| <code>CustomEvent::DEVICE_CHANGED</code>
| После редактирования оборудования
| Після редагування обладнання
| <code>device_id</code>, <code>device_type</code>, <code>data</code>
| <code>device_id</code>, <code>device_type</code>, <code>data</code>
|-
|-
| <code>CustomEvent::DEVICE_NOTIFICATION_DOWN</code>
| <code>CustomEvent::DEVICE_NOTIFICATION_DOWN</code>
| При фиксации недоступности оборудования
| Під час фіксації недоступності обладнання
| <code>device_id</code>, <code>device_type</code>, <code>ip</code>, <code>data</code>
| <code>device_id</code>, <code>device_type</code>, <code>ip</code>, <code>data</code>
|-
|-
| <code>CustomEvent::DEVICE_NOTIFICATION_UP</code>
| <code>CustomEvent::DEVICE_NOTIFICATION_UP</code>
| При восстановлении доступности оборудования
| Під час відновлення доступності обладнання
| <code>device_id</code>, <code>device_type</code>, <code>ip</code>, <code>data</code>
| <code>device_id</code>, <code>device_type</code>, <code>ip</code>, <code>data</code>
|-
|-
| <code>CustomEvent::DEVICE_INTERFACE_PORT_NUMBER_RENDER</code>
| <code>CustomEvent::DEVICE_INTERFACE_PORT_NUMBER_RENDER</code>
| При выводе номера порта в таблице интерфейсов
| Під час виведення номера порту в таблиці інтерфейсів
| <code>device_id</code>, <code>interface_id</code>, <code>port_number</code>, <code>data</code>
| <code>device_id</code>, <code>interface_id</code>, <code>port_number</code>, <code>data</code>
|-
|-
| <code>CustomEvent::DEVICE_INTERFACE_ADDITIONAL_DATA_RENDER</code>
| <code>CustomEvent::DEVICE_INTERFACE_ADDITIONAL_DATA_RENDER</code>
| При выводе дополнительного содержимого в карточке оборудования
| Під час виведення додаткового вмісту в картці обладнання
| <code>device_id</code>, <code>data</code>
| <code>device_id</code>, <code>data</code>
|}
|}


=== Абоненты ===
=== Абоненти ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CREATED</code>
| <code>CustomEvent::CUSTOMER_CREATED</code>
| После создания абонента
| Після створення абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CHANGE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_CHANGE_BEFORE</code>
| Перед редактированием абонента
| Перед редагуванням абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CHANGED</code>
| <code>CustomEvent::CUSTOMER_CHANGED</code>
| После редактирования абонента
| Після редагування абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_MERGED</code>
| <code>CustomEvent::CUSTOMER_MERGED</code>
| После объединения абонентов
| Після об'єднання абонентів
| <code>customer_id</code>, <code>target_customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>target_customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE</code>
| Перед изменением статуса абонента
| Перед зміною статусу абонента
| <code>customer_id</code>, <code>new_status_id</code>, <code>old_status_id</code>, <code>data</code>
| <code>customer_id</code>, <code>new_status_id</code>, <code>old_status_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_STATUS_CHANGED</code>
| <code>CustomEvent::CUSTOMER_STATUS_CHANGED</code>
| После изменения статуса абонента
| Після зміни статусу абонента
| <code>customer_id</code>, <code>new_status_id</code>, <code>old_status_id</code>, <code>data</code>
| <code>customer_id</code>, <code>new_status_id</code>, <code>old_status_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TARIFF_CHANGE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_TARIFF_CHANGE_BEFORE</code>
| Перед изменением тарифа абонента
| Перед зміною тарифу абонента
| <code>customer_id</code>, <code>billing_id</code>, <code>new_tariff_id</code>, <code>old_tariff_id</code>, <code>data</code>
| <code>customer_id</code>, <code>billing_id</code>, <code>new_tariff_id</code>, <code>old_tariff_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TARIFF_CHANGED</code>
| <code>CustomEvent::CUSTOMER_TARIFF_CHANGED</code>
| После изменения тарифа абонента
| Після зміни тарифу абонента
| <code>customer_id</code>, <code>billing_id</code>, <code>new_tariff_id</code>, <code>old_tariff_id</code>, <code>data</code>
| <code>customer_id</code>, <code>billing_id</code>, <code>new_tariff_id</code>, <code>old_tariff_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_BALANCE_CHANGED</code>
| <code>CustomEvent::CUSTOMER_BALANCE_CHANGED</code>
| При изменении баланса абонента
| Під час зміни балансу абонента
| <code>customer_id</code>, <code>amount</code>, <code>data</code>
| <code>customer_id</code>, <code>amount</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_FORMER_TRANSFER_BEFORE</code>
| <code>CustomEvent::CUSTOMER_FORMER_TRANSFER_BEFORE</code>
| Перед переводом абонента в бывшие абоненты
| Перед переведенням абонента в колишні абоненти
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_FORMER_TRANSFERRED</code>
| <code>CustomEvent::CUSTOMER_FORMER_TRANSFERRED</code>
| После перевода абонента в бывшие абоненты
| Після переведення абонента в колишні абоненти
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_FORMER_RESTORE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_FORMER_RESTORE_BEFORE</code>
| Перед восстановлением абонента из бывших абонентов
| Перед відновленням абонента з колишніх абонентів
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_FORMER_RESTORED</code>
| <code>CustomEvent::CUSTOMER_FORMER_RESTORED</code>
| После восстановления абонента из бывших абонентов
| Після відновлення абонента з колишніх абонентів
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECT_PLAN_BEFORE</code>
| <code>CustomEvent::CUSTOMER_DISCONNECT_PLAN_BEFORE</code>
| Перед постановкой абонента на отключение
| Перед постановкою абонента на відключення
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECT_PLANNED</code>
| <code>CustomEvent::CUSTOMER_DISCONNECT_PLANNED</code>
| После постановки абонента на отключение
| Після постановки абонента на відключення
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECT_BEFORE</code>
| <code>CustomEvent::CUSTOMER_DISCONNECT_BEFORE</code>
| Перед отключением абонента
| Перед відключенням абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECTED</code>
| <code>CustomEvent::CUSTOMER_DISCONNECTED</code>
| После отключения абонента
| Після відключення абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECT_CANCEL_BEFORE</code>
| <code>CustomEvent::CUSTOMER_DISCONNECT_CANCEL_BEFORE</code>
| Перед отменой отключения абонента
| Перед скасуванням відключення абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_DISCONNECT_CANCELLED</code>
| <code>CustomEvent::CUSTOMER_DISCONNECT_CANCELLED</code>
| После отмены отключения абонента
| Після скасування відключення абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_SERVICE_ENABLE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_SERVICE_ENABLE_BEFORE</code>
| Перед подключением услуги абоненту
| Перед підключенням послуги абоненту
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_SERVICE_ENABLED</code>
| <code>CustomEvent::CUSTOMER_SERVICE_ENABLED</code>
| После подключения услуги абоненту
| Після підключення послуги абоненту
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_SERVICE_DISABLE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_SERVICE_DISABLE_BEFORE</code>
| Перед отключением услуги абоненту
| Перед відключенням послуги абоненту
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_SERVICE_DISABLED</code>
| <code>CustomEvent::CUSTOMER_SERVICE_DISABLED</code>
| После отключения услуги абоненту
| Після відключення послуги абоненту
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
| <code>customer_id</code>, <code>service_id</code>, <code>data</code>
|}
|}
Строка 349: Строка 349:
{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::CUSTOMER_IP_ADD_BEFORE</code>
| <code>CustomEvent::CUSTOMER_IP_ADD_BEFORE</code>
| Перед добавлением IP/MAC-адреса
| Перед додаванням IP/MAC-адреси
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_IP_ADDED</code>
| <code>CustomEvent::CUSTOMER_IP_ADDED</code>
| После добавления IP/MAC-адреса
| Після додавання IP/MAC-адреси
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_IP_DELETE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_IP_DELETE_BEFORE</code>
| Перед удалением IP/MAC-адреса
| Перед видаленням IP/MAC-адреси
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_IP_DELETED</code>
| <code>CustomEvent::CUSTOMER_IP_DELETED</code>
| После удаления IP/MAC-адреса
| Після видалення IP/MAC-адреси
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>subnet_property</code>, <code>data</code>
|}
|}


==== Метки абонента ====
==== Мітки абонента ====


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TAG_ADD_BEFORE</code>
| <code>CustomEvent::CUSTOMER_TAG_ADD_BEFORE</code>
| Перед добавлением метки абоненту
| Перед додаванням мітки абоненту
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TAG_ADDED</code>
| <code>CustomEvent::CUSTOMER_TAG_ADDED</code>
| После добавления метки абоненту
| Після додавання мітки абоненту
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TAG_DELETE_BEFORE</code>
| <code>CustomEvent::CUSTOMER_TAG_DELETE_BEFORE</code>
| Перед удалением метки абонента
| Перед видаленням мітки абонента
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_TAG_DELETED</code>
| <code>CustomEvent::CUSTOMER_TAG_DELETED</code>
| После удаления метки абонента
| Після видалення мітки абонента
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
| <code>customer_id</code>, <code>tag_id</code>, <code>data</code>
|}
|}


==== Личный кабинет абонента ====
==== Особистий кабінет абонента ====


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_REGISTRATION_BEFORE</code>
| <code>CustomEvent::CUSTOMER_PORTAL_REGISTRATION_BEFORE</code>
| Перед регистрацией абонента в личном кабинете
| Перед реєстрацією абонента в особистому кабінеті
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_REGISTERED</code>
| <code>CustomEvent::CUSTOMER_PORTAL_REGISTERED</code>
| После регистрации абонента в личном кабинете
| Після реєстрації абонента в особистому кабінеті
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_LOGIN_BEFORE</code>
| <code>CustomEvent::CUSTOMER_PORTAL_LOGIN_BEFORE</code>
| Перед входом абонента в личный кабинет
| Перед входом абонента в особистий кабінет
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_DASHBOARD_RENDER</code>
| <code>CustomEvent::CUSTOMER_PORTAL_DASHBOARD_RENDER</code>
| При выводе содержимого на главной странице личного кабинета
| Під час виведення вмісту на головній сторінці особистого кабінету
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_PAGE_RENDER</code>
| <code>CustomEvent::CUSTOMER_PORTAL_PAGE_RENDER</code>
| При выводе содержимого на страницах личного кабинета
| Під час виведення вмісту на сторінках особистого кабінету
| <code>customer_id</code>, <code>page_mode</code>, <code>page_id</code>, <code>data</code>
| <code>customer_id</code>, <code>page_mode</code>, <code>page_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_PORTAL_HEAD_RENDER</code>
| <code>CustomEvent::CUSTOMER_PORTAL_HEAD_RENDER</code>
| При выводе содержимого после <code>head</code> в личном кабинете
| Під час виведення вмісту після <code>head</code> в особистому кабінеті
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|}
|}


==== Карточка абонента ====
==== Картка абонента ====


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER</code>
| <code>CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER</code>
| При выводе основного содержимого в карточке абонента
| Під час виведення основного вмісту в картці абонента
| <code>customer_id</code>, <code>mode</code>, <code>employee_id</code>, <code>data</code>
| <code>customer_id</code>, <code>mode</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CARD_SECONDARY_CONTENT_RENDER</code>
| <code>CustomEvent::CUSTOMER_CARD_SECONDARY_CONTENT_RENDER</code>
| При выводе дополнительного содержимого в карточке абонента
| Під час виведення додаткового вмісту в картці абонента
| <code>customer_id</code>, <code>mode</code>, <code>employee_id</code>, <code>ip_mac</code>, <code>data</code>
| <code>customer_id</code>, <code>mode</code>, <code>employee_id</code>, <code>ip_mac</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CARD_IP_MAC_CONTENT_RENDER</code>
| <code>CustomEvent::CUSTOMER_CARD_IP_MAC_CONTENT_RENDER</code>
| При выводе информации возле IP/MAC-адресов абонента
| Під час виведення інформації біля IP/MAC-адрес абонента
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>data</code>
| <code>customer_id</code>, <code>ip</code>, <code>mac</code>, <code>data</code>
|-
|-
| <code>CustomEvent::CUSTOMER_CARD_SMS_CONTENT_RENDER</code>
| <code>CustomEvent::CUSTOMER_CARD_SMS_CONTENT_RENDER</code>
| При выводе содержимого отправки SMS в карточке абонента
| Під час виведення вмісту надсилання SMS у картці абонента
| <code>customer_id</code>, <code>data</code>
| <code>customer_id</code>, <code>data</code>
|}
|}


=== Сотрудники ===
=== Співробітники ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::EMPLOYEE_MESSAGE_CREATED</code>
| <code>CustomEvent::EMPLOYEE_MESSAGE_CREATED</code>
| После создания сообщения сотруднику
| Після створення повідомлення співробітнику
| <code>receiver_employee_id</code>, <code>message_id</code>, <code>data</code>
| <code>receiver_employee_id</code>, <code>message_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::EMPLOYEE_CHANGED</code>
| <code>CustomEvent::EMPLOYEE_CHANGED</code>
| После редактирования сотрудника
| Після редагування співробітника
| <code>employee_id</code>, <code>data</code>
| <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::EMPLOYEE_PERSONAL_SECTION_CONTENT_RENDER</code>
| <code>CustomEvent::EMPLOYEE_PERSONAL_SECTION_CONTENT_RENDER</code>
| При выводе информации в персональном разделе сотрудника
| Під час виведення інформації в персональному розділі співробітника
| <code>employee_id</code>, <code>data</code>
| <code>employee_id</code>, <code>data</code>
|}
|}


==== Табель работ ====
==== Табель робіт ====


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::EMPLOYEE_TIMESHEET_PRINT_HEADER_RENDER</code>
| <code>CustomEvent::EMPLOYEE_TIMESHEET_PRINT_HEADER_RENDER</code>
| При выводе шапки печатного табеля
| Під час виведення шапки друкованого табеля
| <code>employee_id</code>, <code>period</code>, <code>data</code>
| <code>employee_id</code>, <code>period</code>, <code>data</code>
|-
|-
| <code>CustomEvent::EMPLOYEE_TIMESHEET_PRINT_FOOTER_RENDER</code>
| <code>CustomEvent::EMPLOYEE_TIMESHEET_PRINT_FOOTER_RENDER</code>
| При выводе подвала печатного табеля
| Під час виведення підвала друкованого табеля
| <code>employee_id</code>, <code>period</code>, <code>data</code>
| <code>employee_id</code>, <code>period</code>, <code>data</code>
|}
|}
Строка 489: Строка 489:
{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::INVENTORY_TRANSFER_BEFORE</code>
| <code>CustomEvent::INVENTORY_TRANSFER_BEFORE</code>
| Перед перемещением ТМЦ
| Перед переміщенням ТМЦ
| <code>inventory_id</code>, <code>operation_id</code>, <code>data</code>
| <code>inventory_id</code>, <code>operation_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::INVENTORY_TRANSFERRED</code>
| <code>CustomEvent::INVENTORY_TRANSFERRED</code>
| После перемещения ТМЦ
| Після переміщення ТМЦ
| <code>inventory_id</code>, <code>operation_id</code>, <code>data</code>
| <code>inventory_id</code>, <code>operation_id</code>, <code>data</code>
|}
|}


=== Задания ===
=== Завдання ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::TASK_CARD_RENDER</code>
| <code>CustomEvent::TASK_CARD_RENDER</code>
| При выводе содержимого в карточке задания
| Під час виведення вмісту в картці завдання
| <code>task_type_id</code>, <code>task_id</code>, <code>employee_id</code>, <code>data</code>
| <code>task_type_id</code>, <code>task_id</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_WORK_DATE_RENDER</code>
| <code>CustomEvent::TASK_WORK_DATE_RENDER</code>
| При выводе содержимого возле даты работ
| Під час виведення вмісту біля дати робіт
| <code>task_type_id</code>, <code>task_id</code>, <code>employee_id</code>, <code>data</code>
| <code>task_type_id</code>, <code>task_id</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_CREATE_BEFORE</code>
| <code>CustomEvent::TASK_CREATE_BEFORE</code>
| Перед созданием задания
| Перед створенням завдання
| <code>task_type_id</code>, <code>author_employee_id</code>, <code>data</code>
| <code>task_type_id</code>, <code>author_employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_CREATED</code>
| <code>CustomEvent::TASK_CREATED</code>
| После создания задания
| Після створення завдання
| <code>task_id</code>, <code>task_type_id</code>, <code>author_employee_id</code>, <code>data</code>
| <code>task_id</code>, <code>task_type_id</code>, <code>author_employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_DELETE_BEFORE</code>
| <code>CustomEvent::TASK_DELETE_BEFORE</code>
| Перед удалением задания
| Перед видаленням завдання
| <code>task_id</code>, <code>data</code>
| <code>task_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_CHANGE_BEFORE</code>
| <code>CustomEvent::TASK_CHANGE_BEFORE</code>
| Перед редактированием задания
| Перед редагуванням завдання
| <code>task_id</code>, <code>data</code>
| <code>task_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_CHANGED</code>
| <code>CustomEvent::TASK_CHANGED</code>
| После редактирования задания
| Після редагування завдання
| <code>task_id</code>, <code>data</code>
| <code>task_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_COMMENT_CREATE_BEFORE</code>
| <code>CustomEvent::TASK_COMMENT_CREATE_BEFORE</code>
| Перед добавлением комментария к заданию
| Перед додаванням коментаря до завдання
| <code>task_id</code>, <code>comment</code>, <code>data</code>
| <code>task_id</code>, <code>comment</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_COMMENT_CREATED</code>
| <code>CustomEvent::TASK_COMMENT_CREATED</code>
| После добавления комментария к заданию
| Після додавання коментаря до завдання
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_COMMENT_CHANGED</code>
| <code>CustomEvent::TASK_COMMENT_CHANGED</code>
| После редактирования комментария к заданию
| Після редагування коментаря до завдання
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_COMMENT_TEXT_RENDER</code>
| <code>CustomEvent::TASK_COMMENT_TEXT_RENDER</code>
| При выводе текста комментария задания
| Під час виведення тексту коментаря завдання
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
| <code>task_id</code>, <code>comment_id</code>, <code>comment</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_DIVISION_ASSIGN_BEFORE</code>
| <code>CustomEvent::TASK_DIVISION_ASSIGN_BEFORE</code>
| Перед добавлением подразделения к заданию
| Перед додаванням підрозділу до завдання
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_DIVISION_REMOVE_BEFORE</code>
| <code>CustomEvent::TASK_DIVISION_REMOVE_BEFORE</code>
| Перед исключением подразделения из задания
| Перед виключенням підрозділу із завдання
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_EMPLOYEE_ASSIGN_BEFORE</code>
| <code>CustomEvent::TASK_EMPLOYEE_ASSIGN_BEFORE</code>
| Перед добавлением исполнителя к заданию
| Перед додаванням виконавця до завдання
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_EMPLOYEE_REMOVE_BEFORE</code>
| <code>CustomEvent::TASK_EMPLOYEE_REMOVE_BEFORE</code>
| Перед исключением исполнителя из задания
| Перед виключенням виконавця із завдання
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_WATCHER_DIVISION_ASSIGN_BEFORE</code>
| <code>CustomEvent::TASK_WATCHER_DIVISION_ASSIGN_BEFORE</code>
| Перед добавлением подразделения наблюдателем
| Перед додаванням підрозділу спостерігачем
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
| <code>task_id</code>, <code>division_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_WATCHER_EMPLOYEE_ASSIGN_BEFORE</code>
| <code>CustomEvent::TASK_WATCHER_EMPLOYEE_ASSIGN_BEFORE</code>
| Перед добавлением сотрудника наблюдателем
| Перед додаванням співробітника спостерігачем
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
| <code>task_id</code>, <code>employee_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_OBJECT_ATTACHED</code>
| <code>CustomEvent::TASK_OBJECT_ATTACHED</code>
| После добавления объекта к заданию
| Після додавання об'єкта до завдання
| <code>task_id</code>, <code>object_type</code>, <code>object_id</code>, <code>data</code>
| <code>task_id</code>, <code>object_type</code>, <code>object_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_OBJECT_DETACHED</code>
| <code>CustomEvent::TASK_OBJECT_DETACHED</code>
| После исключения объекта из задания
| Після виключення об'єкта із завдання
| <code>task_id</code>, <code>object_type</code>, <code>object_id</code>, <code>data</code>
| <code>task_id</code>, <code>object_type</code>, <code>object_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_RETURNED_TO_AUTHOR</code>
| <code>CustomEvent::TASK_RETURNED_TO_AUTHOR</code>
| После возврата задания автору
| Після повернення завдання автору
| <code>task_id</code>, <code>data</code>
| <code>task_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_STATE_CHANGE_BEFORE</code>
| <code>CustomEvent::TASK_STATE_CHANGE_BEFORE</code>
| Перед изменением статуса задания
| Перед зміною статусу завдання
| <code>task_id</code>, <code>old_state_id</code>, <code>new_state_id</code>, <code>data</code>
| <code>task_id</code>, <code>old_state_id</code>, <code>new_state_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::TASK_STATE_CHANGED</code>
| <code>CustomEvent::TASK_STATE_CHANGED</code>
| После изменения статуса задания
| Після зміни статусу завдання
| <code>task_id</code>, <code>old_state_id</code>, <code>new_state_id</code>, <code>data</code>
| <code>task_id</code>, <code>old_state_id</code>, <code>new_state_id</code>, <code>data</code>
|}
|}


=== Сооружения связи ===
=== Споруди зв'язку ===


{| class="wikitable"
{| class="wikitable"
! Константа
! Константа
! Когда вызывается
! Коли викликається
! Данные <code>$event</code>
! Дані <code>$event</code>
|-
|-
| <code>CustomEvent::NODE_CARD_ADDITIONAL_DATA_RENDER</code>
| <code>CustomEvent::NODE_CARD_ADDITIONAL_DATA_RENDER</code>
| При выводе дополнительного содержимого в карточке сооружения связи
| Під час виведення додаткового вмісту в картці споруди зв'язку
| <code>node_id</code>, <code>data</code>
| <code>node_id</code>, <code>data</code>
|-
|-
| <code>CustomEvent::NODE_CARD_PRIMARY_CONTENT_RENDER</code>
| <code>CustomEvent::NODE_CARD_PRIMARY_CONTENT_RENDER</code>
| При выводе основного содержимого в карточке сооружения связи
| Під час виведення основного вмісту в картці споруди зв'язку
| <code>node_id</code>, <code>data</code>
| <code>node_id</code>, <code>data</code>
|}
|}

Текущая версия от 19:35, 23 мая 2026

en | uk | ru

Custom Events v2 - це локальна система внутрішніх подій ERP. Вона виконує клієнтський PHP-код усередині поточного PHP-процесу ERP без HTTP-запитів, вебхуків і зовнішніх черг.

Старий механізм legacy/Config/custom_api.txt з функцією api_function(...) залишається legacy-контрактом. У v2 старі назви використовуються лише для карти сумісності. Новий клієнтський код має використовувати константи CustomEvent::....

Файли

Робочий клієнтський файл один:

evolution/CustomEvents/v2/handlers.php

Приклад:

evolution/CustomEvents/v2/handlers.example.php

Список усіх констант:

evolution/CustomEvents/Runtime/v2/CustomEvent.php

Карта старих назв у нові події:

evolution/CustomEvents/Runtime/v2/CustomEventLegacyEventMap.php

Кеш:

var/cache/CustomEvents/handlers.v2.cache.php

Лог:

var/log/custom-events-v2.log

Як писати обробники

Використовується одна функція реєстрації: internal_event(...).

В одному файлі можна зареєструвати кілька обробників поспіль:

internal_event(
    CustomEvent::TASK_CREATED,
    static function ($event): bool {
        $taskId = $event->get('task_id');

        return true;
    },
);

internal_event(
    CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE,
    static function ($event): bool|string {
        if ((int)$event->get('new_status_id') === 0) {
            return 'Заборонено переводити абонента в цей статус';
        }

        return true;
    },
);

internal_event(
    CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER,
    static function ($event): string {
        $customerId = (int)$event->get('customer_id');

        return '<div>Додаткова інформація щодо абонента #' . $customerId . '</div>';
    },
);

В обробник завжди надходить один параметр: $event.

Дані читаються без типових обгорток:

$taskId = $event->get('task_id');
$customerId = $event->get('customer_id');
$data = $event->all();

Якщо потрібен конкретний тип, приведіть значення у своєму коді:

$taskId = (int)$event->get('task_id');
$comment = (string)$event->get('comment');

Результат обробника

Обробник повертає просте значення:

Повернення Значення
true Обробник виконано успішно
false Для події *.before заборонити штатну операцію
null Нічого не змінювати
рядок Для *.before заборонити операцію з текстом причини; для *.render вивести рядок або HTML

Події *.before можуть скасовувати штатну операцію. Інші події не повинні скасовувати вже виконану дію.

Приклад заборони операції

internal_event(
    CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE,
    static function ($event): bool|string {
        if ((int)$event->get('new_status_id') === 0) {
            return 'Заборонено переводити абонента в цей статус';
        }

        return true;
    },
);

Приклад виведення HTML

internal_event(
    CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER,
    static function ($event): string {
        $customerId = (int)$event->get('customer_id');

        return '<div>Додаткова інформація щодо абонента #' . $customerId . '</div>';
    },
);

Перевірка, кеш і лог

Після зміни evolution/CustomEvents/v2/handlers.php ERP перевіряє синтаксис через php -l. Якщо синтаксис коректний, файл копіюється до var/cache/CustomEvents/handlers.v2.cache.php.

Runtime-лог записується у форматі JSON Lines до var/log/custom-events-v2.log. Один рядок - це один виклик обробника, помилка або факт відсутності обробників.

Приклад рядка:

{"ts":"2026-05-10T12:01:03+03:00","event":"task.created","has_handlers":true,"handlers":1,"handler_index":0,"duration_ms":2.341,"memory_kb":18,"result":"allow","message":null}

Лог ротується в:

var/log/custom-events-v2.log.1

Помилки

Якщо в обробнику виникне помилка, ERP запише її в лог і продовжить роботу за правилами конкретної події.

Обробник виконується всередині того самого PHP-процесу, що й ядро ERP. Через ядро проходять тисячі операцій, тому повільний або помилковий клієнтський код може зупинити чи дестабілізувати роботу всієї системи. Не використовуйте exit, die, нескінченні цикли, важкі SQL-запити без обмежень і тривалі зовнішні операції. Тримайте обробники короткими та передбачуваними.

Рекомендації

  • Використовуйте лише константи CustomEvent::....
  • Не пишіть рядок події вручну.
  • Робіть обробники короткими.
  • Не викликайте HTTP/webhook із високочастотних подій.
  • Не використовуйте exit, die, нескінченні цикли та важкі вибірки без обмежень.
  • Повертайте true, false, null або рядок.

Усі події

Нижче перелічені всі події v2. Повний технічний список констант міститься в evolution/CustomEvents/Runtime/v2/CustomEvent.php.

Поля event вказані як поточний контракт даних.

Будинки

Константа Коли викликається Дані $event
CustomEvent::BUILDING_CREATED Після створення будинку building_id, data
CustomEvent::BUILDING_CHANGED Після редагування будинку building_id, data

Комутація

Константа Коли викликається Дані $event
CustomEvent::COMMUTATION_CREATE_BEFORE Перед створенням комутації між об'єктами source_type, source_id, target_type, target_id, data
CustomEvent::COMMUTATION_DELETE_BEFORE Перед видаленням комутації між об'єктами source_type, source_id, target_type, target_id, data

Головна сторінка

Константа Коли викликається Дані $event
CustomEvent::DASHBOARD_TOP_CONTENT_RENDER Під час виведення тексту у верхній частині головної сторінки employee_id, data

Обладнання

Константа Коли викликається Дані $event
CustomEvent::DEVICE_CHANGED Після редагування обладнання device_id, device_type, data
CustomEvent::DEVICE_NOTIFICATION_DOWN Під час фіксації недоступності обладнання device_id, device_type, ip, data
CustomEvent::DEVICE_NOTIFICATION_UP Під час відновлення доступності обладнання device_id, device_type, ip, data
CustomEvent::DEVICE_INTERFACE_PORT_NUMBER_RENDER Під час виведення номера порту в таблиці інтерфейсів device_id, interface_id, port_number, data
CustomEvent::DEVICE_INTERFACE_ADDITIONAL_DATA_RENDER Під час виведення додаткового вмісту в картці обладнання device_id, data

Абоненти

Константа Коли викликається Дані $event
CustomEvent::CUSTOMER_CREATED Після створення абонента customer_id, data
CustomEvent::CUSTOMER_CHANGE_BEFORE Перед редагуванням абонента customer_id, data
CustomEvent::CUSTOMER_CHANGED Після редагування абонента customer_id, data
CustomEvent::CUSTOMER_MERGED Після об'єднання абонентів customer_id, target_customer_id, data
CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE Перед зміною статусу абонента customer_id, new_status_id, old_status_id, data
CustomEvent::CUSTOMER_STATUS_CHANGED Після зміни статусу абонента customer_id, new_status_id, old_status_id, data
CustomEvent::CUSTOMER_TARIFF_CHANGE_BEFORE Перед зміною тарифу абонента customer_id, billing_id, new_tariff_id, old_tariff_id, data
CustomEvent::CUSTOMER_TARIFF_CHANGED Після зміни тарифу абонента customer_id, billing_id, new_tariff_id, old_tariff_id, data
CustomEvent::CUSTOMER_BALANCE_CHANGED Під час зміни балансу абонента customer_id, amount, data
CustomEvent::CUSTOMER_FORMER_TRANSFER_BEFORE Перед переведенням абонента в колишні абоненти customer_id, data
CustomEvent::CUSTOMER_FORMER_TRANSFERRED Після переведення абонента в колишні абоненти customer_id, data
CustomEvent::CUSTOMER_FORMER_RESTORE_BEFORE Перед відновленням абонента з колишніх абонентів customer_id, data
CustomEvent::CUSTOMER_FORMER_RESTORED Після відновлення абонента з колишніх абонентів customer_id, data
CustomEvent::CUSTOMER_DISCONNECT_PLAN_BEFORE Перед постановкою абонента на відключення customer_id, data
CustomEvent::CUSTOMER_DISCONNECT_PLANNED Після постановки абонента на відключення customer_id, data
CustomEvent::CUSTOMER_DISCONNECT_BEFORE Перед відключенням абонента customer_id, data
CustomEvent::CUSTOMER_DISCONNECTED Після відключення абонента customer_id, data
CustomEvent::CUSTOMER_DISCONNECT_CANCEL_BEFORE Перед скасуванням відключення абонента customer_id, data
CustomEvent::CUSTOMER_DISCONNECT_CANCELLED Після скасування відключення абонента customer_id, data
CustomEvent::CUSTOMER_SERVICE_ENABLE_BEFORE Перед підключенням послуги абоненту customer_id, service_id, data
CustomEvent::CUSTOMER_SERVICE_ENABLED Після підключення послуги абоненту customer_id, service_id, data
CustomEvent::CUSTOMER_SERVICE_DISABLE_BEFORE Перед відключенням послуги абоненту customer_id, service_id, data
CustomEvent::CUSTOMER_SERVICE_DISABLED Після відключення послуги абоненту customer_id, service_id, data

IP/MAC абонента

Константа Коли викликається Дані $event
CustomEvent::CUSTOMER_IP_ADD_BEFORE Перед додаванням IP/MAC-адреси customer_id, ip, mac, subnet_property, data
CustomEvent::CUSTOMER_IP_ADDED Після додавання IP/MAC-адреси customer_id, ip, mac, subnet_property, data
CustomEvent::CUSTOMER_IP_DELETE_BEFORE Перед видаленням IP/MAC-адреси customer_id, ip, mac, subnet_property, data
CustomEvent::CUSTOMER_IP_DELETED Після видалення IP/MAC-адреси customer_id, ip, mac, subnet_property, data

Мітки абонента

Константа Коли викликається Дані $event
CustomEvent::CUSTOMER_TAG_ADD_BEFORE Перед додаванням мітки абоненту customer_id, tag_id, data
CustomEvent::CUSTOMER_TAG_ADDED Після додавання мітки абоненту customer_id, tag_id, data
CustomEvent::CUSTOMER_TAG_DELETE_BEFORE Перед видаленням мітки абонента customer_id, tag_id, data
CustomEvent::CUSTOMER_TAG_DELETED Після видалення мітки абонента customer_id, tag_id, data

Особистий кабінет абонента

Константа Коли викликається Дані $event
CustomEvent::CUSTOMER_PORTAL_REGISTRATION_BEFORE Перед реєстрацією абонента в особистому кабінеті customer_id, data
CustomEvent::CUSTOMER_PORTAL_REGISTERED Після реєстрації абонента в особистому кабінеті customer_id, data
CustomEvent::CUSTOMER_PORTAL_LOGIN_BEFORE Перед входом абонента в особистий кабінет customer_id, data
CustomEvent::CUSTOMER_PORTAL_DASHBOARD_RENDER Під час виведення вмісту на головній сторінці особистого кабінету customer_id, data
CustomEvent::CUSTOMER_PORTAL_PAGE_RENDER Під час виведення вмісту на сторінках особистого кабінету customer_id, page_mode, page_id, data
CustomEvent::CUSTOMER_PORTAL_HEAD_RENDER Під час виведення вмісту після head в особистому кабінеті customer_id, data

Картка абонента

Константа Коли викликається Дані $event
CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER Під час виведення основного вмісту в картці абонента customer_id, mode, employee_id, data
CustomEvent::CUSTOMER_CARD_SECONDARY_CONTENT_RENDER Під час виведення додаткового вмісту в картці абонента customer_id, mode, employee_id, ip_mac, data
CustomEvent::CUSTOMER_CARD_IP_MAC_CONTENT_RENDER Під час виведення інформації біля IP/MAC-адрес абонента customer_id, ip, mac, data
CustomEvent::CUSTOMER_CARD_SMS_CONTENT_RENDER Під час виведення вмісту надсилання SMS у картці абонента customer_id, data

Співробітники

Константа Коли викликається Дані $event
CustomEvent::EMPLOYEE_MESSAGE_CREATED Після створення повідомлення співробітнику receiver_employee_id, message_id, data
CustomEvent::EMPLOYEE_CHANGED Після редагування співробітника employee_id, data
CustomEvent::EMPLOYEE_PERSONAL_SECTION_CONTENT_RENDER Під час виведення інформації в персональному розділі співробітника employee_id, data

Табель робіт

Константа Коли викликається Дані $event
CustomEvent::EMPLOYEE_TIMESHEET_PRINT_HEADER_RENDER Під час виведення шапки друкованого табеля employee_id, period, data
CustomEvent::EMPLOYEE_TIMESHEET_PRINT_FOOTER_RENDER Під час виведення підвала друкованого табеля employee_id, period, data

Склад

Константа Коли викликається Дані $event
CustomEvent::INVENTORY_TRANSFER_BEFORE Перед переміщенням ТМЦ inventory_id, operation_id, data
CustomEvent::INVENTORY_TRANSFERRED Після переміщення ТМЦ inventory_id, operation_id, data

Завдання

Константа Коли викликається Дані $event
CustomEvent::TASK_CARD_RENDER Під час виведення вмісту в картці завдання task_type_id, task_id, employee_id, data
CustomEvent::TASK_WORK_DATE_RENDER Під час виведення вмісту біля дати робіт task_type_id, task_id, employee_id, data
CustomEvent::TASK_CREATE_BEFORE Перед створенням завдання task_type_id, author_employee_id, data
CustomEvent::TASK_CREATED Після створення завдання task_id, task_type_id, author_employee_id, data
CustomEvent::TASK_DELETE_BEFORE Перед видаленням завдання task_id, data
CustomEvent::TASK_CHANGE_BEFORE Перед редагуванням завдання task_id, data
CustomEvent::TASK_CHANGED Після редагування завдання task_id, data
CustomEvent::TASK_COMMENT_CREATE_BEFORE Перед додаванням коментаря до завдання task_id, comment, data
CustomEvent::TASK_COMMENT_CREATED Після додавання коментаря до завдання task_id, comment_id, comment, data
CustomEvent::TASK_COMMENT_CHANGED Після редагування коментаря до завдання task_id, comment_id, comment, data
CustomEvent::TASK_COMMENT_TEXT_RENDER Під час виведення тексту коментаря завдання task_id, comment_id, comment, data
CustomEvent::TASK_DIVISION_ASSIGN_BEFORE Перед додаванням підрозділу до завдання task_id, division_id, data
CustomEvent::TASK_DIVISION_REMOVE_BEFORE Перед виключенням підрозділу із завдання task_id, division_id, data
CustomEvent::TASK_EMPLOYEE_ASSIGN_BEFORE Перед додаванням виконавця до завдання task_id, employee_id, data
CustomEvent::TASK_EMPLOYEE_REMOVE_BEFORE Перед виключенням виконавця із завдання task_id, employee_id, data
CustomEvent::TASK_WATCHER_DIVISION_ASSIGN_BEFORE Перед додаванням підрозділу спостерігачем task_id, division_id, data
CustomEvent::TASK_WATCHER_EMPLOYEE_ASSIGN_BEFORE Перед додаванням співробітника спостерігачем task_id, employee_id, data
CustomEvent::TASK_OBJECT_ATTACHED Після додавання об'єкта до завдання task_id, object_type, object_id, data
CustomEvent::TASK_OBJECT_DETACHED Після виключення об'єкта із завдання task_id, object_type, object_id, data
CustomEvent::TASK_RETURNED_TO_AUTHOR Після повернення завдання автору task_id, data
CustomEvent::TASK_STATE_CHANGE_BEFORE Перед зміною статусу завдання task_id, old_state_id, new_state_id, data
CustomEvent::TASK_STATE_CHANGED Після зміни статусу завдання task_id, old_state_id, new_state_id, data

Споруди зв'язку

Константа Коли викликається Дані $event
CustomEvent::NODE_CARD_ADDITIONAL_DATA_RENDER Під час виведення додаткового вмісту в картці споруди зв'язку node_id, data
CustomEvent::NODE_CARD_PRIMARY_CONTENT_RENDER Під час виведення основного вмісту в картці споруди зв'язку node_id, data