Conversation
Исправлено определение "отвчеченного" для двойного захода в одну и ту же очередь подряд .
…ета при нажатии ENTER в поле длительности разговора.
…равка отображения итогов по количеству звонков.
…ущены, но в одной CDR "Перезвонил клиент"
Безопасность: - Устранён 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 чтобы скрипт не зависал
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.