Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
83c9521
Доработал сохранение кэш статуса сотрудников
boffart Nov 18, 2025
8f33433
Реализовал фильтр вызовов с минимальной длительностью ожидания.
boffart Dec 1, 2025
9517cec
Исправил фильтр вызовов с минимальной длительностью ожидания.
boffart Dec 3, 2025
16192f9
Добавил дополнительную проверку существования активной линии
boffart Dec 5, 2025
a018300
Реализовал взаимодействие с модулем ModuleSoftphoneBackend.
boffart Dec 26, 2025
337fce7
Поправил вызов и проверку существования ModuleSoftphoneBackend
boffart Dec 29, 2025
738dd99
Доработал подклбючение по AMI, создал пользователя manager.conf с огр…
boffart Jan 14, 2026
e924cd1
Оптимизация. Исправил ошибки работы форкеров. Дополнил логи7
boffart Jan 15, 2026
9a768ab
Доработал отображение агентов очереди в виде "плитки". Добавил упоряд…
boffart Jan 15, 2026
7d34af7
Правка комментариев.
boffart Jan 15, 2026
f4a903a
Реализовал взаимодействие с модулем ModuleSoftphoneBackend, отображен…
boffart Jan 15, 2026
53a013a
Доработал получение активных вызовов через wss модуля ModuleSoftphone…
boffart Jan 15, 2026
70477b1
Поправил отображение вызовов в ожидании
boffart Jan 16, 2026
1fae40c
Исправил проблемы работы через wss сервисы.
boffart Jan 16, 2026
5bb245d
Исправил проблемы таймеров длительности разговора при работе через че…
boffart Jan 19, 2026
b9caa1a
Поправил обновление информации о контакте.
boffart Jan 20, 2026
721d4a3
Поправил определение собеседника для агентов очереди (внутренние номера)
boffart Jan 20, 2026
e2f9256
Рефакторинг WorkerActiveCalls и улучшения
Jan 28, 2026
d942e34
Исправил обработку псевдо-каналов типа OutgoingSpoolFailed
Jan 29, 2026
9026dfb
Добавил ConnectedLineNum в структуру каналов для отображения номера с…
Jan 29, 2026
8a88919
Добавил обработку NewConnectedLine и фильтрацию <unknown>
Jan 29, 2026
3143a12
Улучшения UI и исправления отображения активных вызовов
Feb 2, 2026
45f95ab
Translated using Weblate (Thai)
sumonchai Feb 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# IDE
.idea/

# Claude Code
CLAUDE.md
tasks.md

# Dependencies
/vendor/

# Logs
*.log
77 changes: 64 additions & 13 deletions App/Controllers/ModuleMonitorActiveCallsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,21 @@
use MikoPBX\AdminCabinet\Controllers\BaseController;
use MikoPBX\AdminCabinet\Controllers\SessionController;
use MikoPBX\Common\Models\Extensions;
use MikoPBX\Common\Models\Users;
use MikoPBX\Common\Models\PbxExtensionModules;
use MikoPBX\Common\Providers\PBXConfModulesProvider;
use MikoPBX\Common\Providers\SessionProvider;
use MikoPBX\Modules\Config\CDRConfigInterface;
use MikoPBX\Modules\PbxExtensionUtils;
use Modules\ModuleMonitorActiveCalls\App\Forms\ModuleMonitorActiveCallsForm;
use Modules\ModuleMonitorActiveCalls\bin\WorkerAmiActions;
use Modules\ModuleMonitorActiveCalls\Lib\CacheManager;
use Modules\ModuleMonitorActiveCalls\Lib\MonitorActiveCallsMain;
use Modules\ModuleMonitorActiveCalls\Models\ModuleMonitorActiveCalls;
use Modules\ModuleMonitorActiveCalls\Models\UsersSettings;
use Modules\ModuleUsersUI\Lib\Constants;
use Modules\ModuleUsersUI\Models\AccessGroups;
use Modules\ModuleUsersUI\Models\UsersCredentials;
use DateTime;
use Modules\ModuleSoftphoneBackend\Lib\RestAPI\Controllers\ApiController as ModuleSoftphoneBackendApi;

class ModuleMonitorActiveCallsController extends BaseController
{
Expand Down Expand Up @@ -56,6 +57,7 @@ public function indexAction(): void
$headerCollectionCSS->addCss("css/cache/$this->moduleUniqueID/module-monitor-active-calls.css", true);
$headerCollectionCSS->addCss('css/vendor/datatable/dataTables.semanticui.min.css', true);
$headerCollectionCSS->addCss('css/vendor/semantic/comment.css', true);
$headerCollectionCSS->addCss('css/vendor/semantic/card.css', true);
$headerCollectionCSS->addCss('css/vendor/semantic/list.css', true);

$this->view->form = new ModuleMonitorActiveCallsForm();
Expand All @@ -76,24 +78,35 @@ public function indexAction(): void
$user['username'] = "$user[callerid] <$user[number]>";
}
$this->view->usersArray = $users;

$this->view->userRestrictions = implode(',', $userRestrictions);

$this->view->userId = $userId;
$this->view->userNumber = $userNumber;
$this->view->cid = $cid;
$this->view->queueId = '';
$this->view->queueIds = [];

$settings = UsersSettings::findFirst([
'userId=:userId: AND key=:key:',
$settings = UsersSettings::find([
'userId=:userId:',
'bind' => [
'userId' => $userId,
'key' => 'queueId'
'userId' => (string)$userId,
]
]);
if($settings){
$this->view->queueId = $settings->value;
$minWaitVisible = 0;
foreach ($settings as $setting){
if('queueIds' === $setting->key ){
$decoded = json_decode($setting->value, true);
$this->view->queueIds = is_array($decoded) ? $decoded : [];
}elseif ('minWaitVisible' === $setting->key ){
$minWaitVisible = intval($setting->value);
}
}

$minWaitVisibleVariants = [];
foreach ([0,10,20,30,40,50,60] as $value){
$minWaitVisibleVariants[] = ['id' => $value, 'active' => $minWaitVisible === $value, 'name' => $value];
}
$this->view->minWaitVisible = $minWaitVisibleVariants;
$this->view->minWaitVisibleValue = $minWaitVisible;
}

/**
Expand Down Expand Up @@ -136,6 +149,20 @@ public function saveAction() :void
$this->view->data = $data;
}

public function backandEnableAction() :void
{
if (MonitorActiveCallsMain::backendExists()) {
// Модуль включен.
$api = new ModuleSoftphoneBackendApi();
$api->initialize();
$this->view->data = $api->createLoginResponse('1', 'admin');
$this->view->success = true;
}else{
$this->view->success = false;
$this->view->data = [];
}
}

public function saveUserAction():void
{
$data = $this->request->getPost();
Expand All @@ -147,9 +174,27 @@ public function saveUserAction():void
}
$settings->adminUserId = $data['adminUserId']??'';
$this->view->success = $settings->save();
}elseif (isset($data['queueId']) ){
}elseif (isset($data['minWaitVisible']) ){
[,,$userId,] = $this->getUserData();
$key = 'minWaitVisible';
$settings = UsersSettings::findFirst([
'userId=:userId: AND key=:key:',
'bind' => [
'userId' => $userId,
'key' => $key
]
]);
if(!$settings){
$settings = new UsersSettings();
$settings->userId = $userId;
$settings->key = $key;
}
$settings->value = $data['minWaitVisible']??'';
$this->view->success = $settings->save();
}elseif (isset($data['queueIds']) ){
[,,$userId,] = $this->getUserData();
$key = 'queueId';
$userId = (string)$userId;
$key = 'queueIds';
$settings = UsersSettings::findFirst([
'userId=:userId: AND key=:key:',
'bind' => [
Expand All @@ -162,7 +207,13 @@ public function saveUserAction():void
$settings->userId = $userId;
$settings->key = $key;
}
$settings->value = $data['queueId']??'';
// Принимаем массив или JSON-строку
$queueIds = $data['queueIds'];
if (is_string($queueIds)) {
$decoded = json_decode($queueIds, true);
$queueIds = is_array($decoded) ? $decoded : [];
}
$settings->value = json_encode(is_array($queueIds) ? $queueIds : []);
$this->view->success = $settings->save();
}
$this->view->data = $data;
Expand Down
Loading