This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Модуль интеграции Bitrix24 CRM с MikoPBX — телефонной системой на базе Asterisk. Обеспечивает управление звонками, синхронизацию контактов, создание лидов/сделок и загрузку записей разговоров в Bitrix24.
Стек: PHP 7.4+, Phalcon MVC framework, Redis (кеш), Beanstalk (очереди), Asterisk AMI/AGI.
Модуль работает через набор долгоживущих воркеров, взаимодействующих через Beanstalk-очереди:
- WorkerBitrix24IntegrationHTTP — основной демон: OAuth-авторизация, REST API Bitrix24, обработка событий звонков, синхронизация контактов
- WorkerBitrix24IntegrationAMI — слушает события Asterisk AMI (состояния каналов, звонки, очереди)
- ConnectorDb — все операции с БД: настройки, CDR, пользователи, контакты. Другие воркеры обращаются к нему через
ConnectorDb::invoke() - UploaderB24 — асинхронная загрузка записей разговоров в Bitrix24
- safe.php — cron-скрипт (раз в минуту), следит за жизнью воркеров и перезапускает упавшие
- Bitrix24Integration — ядро интеграции: OAuth-токены, REST API, работа с CRM (лиды, контакты, компании, сделки), управление звонками
- Bitrix24IntegrationConf — конфигурация модуля в MikoPBX: регистрация REST-маршрутов, генерация диалплана Asterisk, cron-задачи, lifecycle-хуки модуля
- CacheManager — Redis-кеш с префиксом
b24_token_ - Logger — логирование с ротацией (40MB, 9 бэкапов)
- Bitrix24InvokeRest — очередь вызовов REST API
Единственный контроллер ModuleBitrix24IntegrationController — admin-интерфейс настроек. Views используют Volt-шаблоны Phalcon.
Phalcon ORM модели. Основные таблицы:
ModuleBitrix24Integration— главные настройки (OAuth-токены, регион, параметры интеграции)ModuleBitrix24Users— настройки per-user (режим открытия карточки)ModuleBitrix24ExternalLines— маппинг внешних линийModuleBitrix24CDR— данные о звонкахB24PhoneBook/ContactLinks— кеш контактов
Воркеры общаются через Beanstalk-каналы:
B24_INTEGRATION_CHANNEL— основной канал интеграцииB24_SEARCH_CHANNEL— поиск контактовB24_INVOKE_REST_CHANNEL— очередь REST-вызовов
ConnectorDb::invoke() — универсальный паттерн RPC-вызова к БД-воркеру из других процессов.
Исходники в src/, собранные файлы и sourcemaps рядом. Два основных модуля:
module-bitrix24-integration-index.js— основная форма настроекmodule-bitrix24-integration-status-worker.js— мониторинг состояния воркеров
b24CheckResponsible.php — определяет ответственного за входящий звонок и перехватывает вызов.
Модуль поддерживает несколько регионов с разными OAuth-эндпоинтами: Россия (ru), Беларусь (by), Казахстан (kz), Мир (com). Регион определяет URL для авторизации и REST API.
Modules\ModuleBitrix24Integration\{App,Lib,Models,bin,Setup}
PSR-4 маппинг: корень проекта = Modules\ModuleBitrix24Integration\.
Переводы в Messages/*.php (~30 языков). Ключи переводов: mod_b24_i_*, ex_*. Используется система переводов Phalcon.
Setup/PbxExtensionSetup.php — установка/удаление модуля (создание таблиц, миграция старых настроек). Bitrix24IntegrationConf наследует ConfigClass — стандартный lifecycle MikoPBX-модулей: onAfterModuleEnable, onBeforeModuleDisable, генерация dialplan-контекстов.
Модуль регистрирует эндпоинт:
GET /pbxcore/api/bitrix-integration/workers/state (без авторизации)
Целевая версия PHP 7.4+, код должен работать и на PHP 8.x. Ключевые различия:
array_is_list()— только PHP 8.1+, использоватьarray_keys($a) !== range(0, count($a) - 1)findFirst()в Phalcon 3/4 возвращаетfalse, неnull— проверять через!$recordarray_search()возвращаетfalse→ при использовании как индекс массива тихо приводится к0(PHP 7.4) или Deprecated (PHP 8.1). Всегда проверять=== falsecount(null)— E_WARNING на всех версиях, но работает (возвращает 0). Инициализировать переменные перед count()tempnam()может вернутьfalse— на PHP 8chown(false, ...)даёт TypeError
Входящий звонок в очередь: AMI event → WorkerBitrix24IntegrationAMI → Beanstalk → WorkerBitrix24IntegrationHTTP → Bitrix24 REST API.
linkedid— связывает все плечи одного звонкаUNIQUEID— идентификатор отдельного плеча (leg)telephony.externalcall.register— отправляется один раз на звонок (первый участник), параметрSHOW=1открывает карточкуtelephony.externalcall.show— отдельный вызов для открытия карточки остальным участникам очередиopen_card_mode:DIRECTLY(сразу),ANSWERED(при ответе),NONE(никогда) — настройка per-user вModuleBitrix24Users
Логи воркеров: ConnectorDb.log, HttpConnection.log, HttpConnection_SYNC.log, IntegrationAMI.log.
Формат: [ISO8601][level] message(pid): JSON. Для анализа звонка — искать по linkedid во всех логах.