Skip to content

Develop#18

Merged
boffart merged 46 commits intomasterfrom
develop
Feb 3, 2026
Merged

Develop#18
boffart merged 46 commits intomasterfrom
develop

Conversation

@boffart
Copy link
Collaborator

@boffart boffart commented Feb 3, 2026

No description provided.

Исправлено определение "отвчеченного" для двойного захода в одну и ту же очередь подряд .
…ета при нажатии ENTER в поле длительности разговора.
…равка отображения итогов по количеству звонков.
boffart and others added 16 commits January 22, 2026 14:19
Безопасность:
- Устранён SQL injection в getRecordingPathByID (bind-параметры)
- Добавлен whitelist методов для RPC-вызовов через onEvents
- Исправлен command injection в MP3-тегировании (escapeshellarg)
- Устранён SQL injection в getCountCdr (bind для minBilSec)

Баги:
- Исправлена неинициализированная переменная в getCdrQueueIDs
- Удалён неиспользуемый объект getID3
- Исправлен memory_limit 2024M → 2048M
- Исправлено некорректное условие empty(cdrOffset) при значении 0

Производительность:
- Кеширование путей и обложки в Mp3TagService (lazy init)
- Устранён N+1: setCallType разделён на setBasicCallType + updateRecallTransferStates
- Замена in_array на isset с array_flip для heavyLinkedIds

Архитектура:
- Выделен Lib/Mp3TagService.php (ID3-теги + symlinks)
- Выделен Lib/CdrQueryBuilder.php (fluent API для SQL-условий)
- Типизация getPhoneIndex, удаление неиспользуемого $disableIvr
- Исправлена опечатка $tmoDirName, camelCase в saveInTmpFile
prettyFilename теперь использует dst_num/src_num конкретной ноги звонка
вместо главной записи linkedid. Это решает две проблемы:
- Имя файла содержит реальный номер назначения (сотрудника), а не IVR
- Symlink'и не конфликтуют при экспорте, все записи попадают в архив
Формат: {linkedid}-{date}-{src_num}-{dst_num}-{id}.mp3
Исключает коллизии symlink при экспорте, когда несколько строк
одного linkedid имеют одинаковые src_num и dst_num.
При отключении модуля MikoPBX Core вызывает makeBeforeDisableTest(),
который загружает ВСЕ записи таблиц модуля в память для проверки
связей. При базе 1.3GB (2+ млн записей в CallHistory) это приводит
к timeout при установке/обновлении модуля.

Метод onBeforeModuleDisable() возвращает true, пропуская эту проверку.
Таблицы модуля не имеют внешних связей с Core моделями, поэтому
проверка не требуется.
Аналогично onBeforeModuleDisable — makeBeforeEnableTest() также
загружает все записи таблиц модуля в память, что вызывает timeout
при включении модуля с большой базой.
При включении/выключении модуля MikoPBX Core вызывает find() на всех
моделях для проверки broken references (makeBeforeEnableTest).
Для CallHistory с миллионами записей это приводило к deadlock
с процессом ConnectorDB, который постоянно синхронизирует данные.

Решение: переопределён метод find() — при вызове без параметров из
контекста PbxExtensionState::makeBeforeEnableTest/makeBeforeDisableTest
возвращается пустой Resultset. Поскольку модель CallHistory не имеет
relations, проверка всё равно пропускается — это безопасная оптимизация.

Обычные вызовы find() с параметрами работают без изменений.
- Добавлен scripts/cleanup-vendor.sh для автоматической очистки vendor
- Добавлен composer script cleanup-vendor (post-install/post-update)
- Удалены CJK шрифты mPDF (китайский, корейский, японский): -45MB
- Удалены экзотические шрифты (тибетский, арабский, древние письмена): -23MB
- Удалены tests/docs/examples из vendor пакетов
- Оставлены только DejaVu и Free* шрифты (кириллица/латиница)

Результат: 158MB → 90MB (-68MB, -43%)
- Добавлен error callback во все ajax запросы (getHistory, getOutgoingEmployeeCalls, getCdrQueue)
- Убран некорректный таймаут сброса applyFilterRunning (500ms < время запроса)
- Флаг applyFilterRunning теперь сбрасывается в drawCallback после завершения рендера
- Обновлён CLAUDE.md: добавлена секция JavaScript Build с инструкциями по сборке
Предыдущий коммит содержал JS скомпилированный с babel-preset-airbnb,
который включает @babel/plugin-transform-runtime и генерирует require()
вызовы, несовместимые с браузером.

Изменения:
- Пересобран JS с @babel/preset-env без transform-runtime
- Результат содержит inline helpers вместо require()
- Обновлен CLAUDE.md с инструкциями по сборке JS через Babel
- Добавлен lazy-кэш для getCountCdr через таблицу daily_call_stats
- Завершённые дни кэшируются навсегда, сегодня — живой подсчёт
- Добавлен составной индекс (typeCall, start) для фильтрованных запросов
- Ускорение: декабрь 6.5мин → 1с, фильтры 40с → 0.7с
- getHistoryData() больше не модифицирует offset по ссылке, возвращает
  новый offset в составе результата — offset применяется только после
  успешного сохранения записей
- Добавлена обработка ошибок в batchSaveCallHistory: try/catch на
  INSERT и UPDATE, ошибка одного чанка не блокирует остальные
- Sequential offset check стартует от oldOffset для корректного
  определения разрывов
- Mp3TagService: ID3-теги пишутся только для mp3, webm получает только
  symlink с читаемым именем и корректным расширением
- Исправлена ошибка autoload getid3_writetags: явная загрузка getid3.php
- Добавлены флаги -noheader -csv для sqlite3 (защита от табличного
  формата вывода при кастомном ~/.sqliterc)
- safe.php запускается в фоне с timeout 30 чтобы скрипт не зависал
@boffart boffart merged commit b1dbd6f into master Feb 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant