| Total Complexity | 142 |
| Total Lines | 908 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Complex classes like ExtensionsController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use ExtensionsController, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 37 | class ExtensionsController extends BaseController |
||
| 38 | { |
||
| 39 | |||
| 40 | /** |
||
| 41 | * Построение списка внутренних номеров и сотрудников |
||
| 42 | */ |
||
| 43 | public function indexAction(): void |
||
| 44 | { |
||
| 45 | $extensionTable = []; |
||
| 46 | |||
| 47 | $parameters = [ |
||
| 48 | 'models' => [ |
||
| 49 | 'Extensions' => Extensions::class, |
||
| 50 | ], |
||
| 51 | 'conditions' => 'Extensions.is_general_user_number = "1"', |
||
| 52 | 'columns' => [ |
||
| 53 | 'id' => 'Extensions.id', |
||
| 54 | 'username' => 'Users.username', |
||
| 55 | 'number' => 'Extensions.number', |
||
| 56 | 'userid' => 'Extensions.userid', |
||
| 57 | 'disabled' => 'Sip.disabled', |
||
| 58 | 'secret' => 'Sip.secret', |
||
| 59 | 'email' => 'Users.email', |
||
| 60 | 'type' => 'Extensions.type', |
||
| 61 | 'avatar' => 'Users.avatar', |
||
| 62 | |||
| 63 | ], |
||
| 64 | 'order' => 'number', |
||
| 65 | 'joins' => [ |
||
| 66 | 'Sip' => [ |
||
| 67 | 0 => Sip::class, |
||
| 68 | 1 => 'Sip.extension=Extensions.number', |
||
| 69 | 2 => 'Sip', |
||
| 70 | 3 => 'LEFT', |
||
| 71 | ], |
||
| 72 | 'Users' => [ |
||
| 73 | 0 => Users::class, |
||
| 74 | 1 => 'Users.id = Extensions.userid', |
||
| 75 | 2 => 'Users', |
||
| 76 | 3 => 'INNER', |
||
| 77 | ], |
||
| 78 | ], |
||
| 79 | ]; |
||
| 80 | $query = $this->di->get('modelsManager')->createBuilder($parameters)->getQuery(); |
||
| 81 | $extensions = $query->execute(); |
||
| 82 | |||
| 83 | foreach ($extensions as $extension) { |
||
| 84 | switch ($extension->type) { |
||
| 85 | case Extensions::TYPE_SIP: |
||
| 86 | $extensionTable[$extension->userid]['userid'] = $extension->userid; |
||
| 87 | $extensionTable[$extension->userid]['number'] = $extension->number; |
||
| 88 | $extensionTable[$extension->userid]['status'] = ($extension->disabled === '1') ? 'disabled' : ''; |
||
| 89 | $extensionTable[$extension->userid]['id'] = $extension->id; |
||
| 90 | $extensionTable[$extension->userid]['username'] = $extension->username; |
||
| 91 | $extensionTable[$extension->userid]['email'] = $extension->email; |
||
| 92 | $extensionTable[$extension->userid]['secret'] = $extension->secret; |
||
| 93 | |||
| 94 | if ( ! array_key_exists('mobile', $extensionTable[$extension->userid])) { |
||
| 95 | $extensionTable[$extension->userid]['mobile'] = ''; |
||
| 96 | } |
||
| 97 | if ($extension->avatar) { |
||
| 98 | $filename = md5($extension->avatar); |
||
| 99 | $imgCacheDir = appPath('sites/admin-cabinet/assets/img/cache'); |
||
| 100 | $imgFile = "{$imgCacheDir}/$filename.jpg"; |
||
| 101 | if ( ! file_exists($imgFile)) { |
||
| 102 | $this->base64ToJpeg($extension->avatar, $imgFile); |
||
| 103 | } |
||
| 104 | |||
| 105 | $extensionTable[$extension->userid]['avatar'] = "{$this->url->get()}assets/img/cache/{$filename}.jpg"; |
||
| 106 | } else { |
||
| 107 | $extensionTable[$extension->userid]['avatar'] = "{$this->url->get()}assets/img/unknownPerson.jpg"; |
||
| 108 | } |
||
| 109 | |||
| 110 | break; |
||
| 111 | case Extensions::TYPE_EXTERNAL: |
||
| 112 | $extensionTable[$extension->userid]['mobile'] = $extension->number; |
||
| 113 | break; |
||
| 114 | default: |
||
| 115 | } |
||
| 116 | } |
||
| 117 | $this->view->extensions = $extensionTable; |
||
| 118 | } |
||
| 119 | |||
| 120 | /** |
||
| 121 | * Создает файл jpeg из переданной картинки |
||
| 122 | * |
||
| 123 | * @param $base64_string |
||
| 124 | * @param $output_file |
||
| 125 | * |
||
| 126 | * @return void |
||
| 127 | */ |
||
| 128 | private function base64ToJpeg($base64_string, $output_file): void |
||
| 129 | { |
||
| 130 | // open the output file for writing |
||
| 131 | $ifp = fopen($output_file, 'wb'); |
||
| 132 | |||
| 133 | if ($ifp === false) { |
||
| 134 | return; |
||
| 135 | } |
||
| 136 | // split the string on commas |
||
| 137 | // $data[ 0 ] == "data:image/png;base64" |
||
| 138 | // $data[ 1 ] == <actual base64 string> |
||
| 139 | $data = explode(',', $base64_string); |
||
| 140 | |||
| 141 | // we could add validation here with ensuring count( $data ) > 1 |
||
| 142 | fwrite($ifp, base64_decode($data[1])); |
||
| 143 | |||
| 144 | // clean up the file resource |
||
| 145 | fclose($ifp); |
||
| 146 | } |
||
| 147 | |||
| 148 | /** |
||
| 149 | * Change extension settings |
||
| 150 | * |
||
| 151 | * @param ?string $id modified extension id |
||
| 152 | */ |
||
| 153 | public function modifyAction($id = null): void |
||
| 154 | { |
||
| 155 | $extension = Extensions::findFirstById($id); |
||
| 156 | |||
| 157 | if ($extension === null) { |
||
| 158 | $extension = new Extensions(); |
||
| 159 | $extension->show_in_phonebook = '1'; |
||
| 160 | $extension->public_access = '0'; |
||
| 161 | $extension->is_general_user_number = '1'; |
||
| 162 | $extension->type = Extensions::TYPE_SIP; |
||
| 163 | $extension->Sip = new Sip(); |
||
| 164 | $extension->Sip->disabled = 0; |
||
| 165 | $extension->Sip->type = 'peer'; |
||
| 166 | $extension->Sip->uniqid = Extensions::TYPE_SIP.strtoupper('-PHONE-' . md5(time())); |
||
| 167 | $extension->Sip->busylevel = 1; |
||
| 168 | $extension->Sip->qualify = '1'; |
||
| 169 | $extension->Sip->qualifyfreq = 60; |
||
| 170 | $extension->number = $this->getNextInternalNumber(); |
||
| 171 | |||
| 172 | $extension->Users = new Users(); |
||
| 173 | $extension->Users->role = 'user'; |
||
| 174 | |||
| 175 | $extension->ExtensionForwardingRights = new ExtensionForwardingRights(); |
||
| 176 | |||
| 177 | $this->view->avatar = ''; |
||
| 178 | } else { |
||
| 179 | $this->view->avatar = $extension->Users->avatar; |
||
| 180 | } |
||
| 181 | $arrNetworkFilters = []; |
||
| 182 | $networkFilters = NetworkFilters::getAllowedFiltersForType(['SIP']); |
||
| 183 | $arrNetworkFilters['none'] = $this->translation->_('ex_NoNetworkFilter'); |
||
| 184 | foreach ($networkFilters as $filter) { |
||
| 185 | $arrNetworkFilters[$filter->id] = $filter->getRepresent(); |
||
| 186 | } |
||
| 187 | |||
| 188 | $parameters = [ |
||
| 189 | 'conditions' => 'type = "'.Extensions::TYPE_EXTERNAL.'" AND is_general_user_number = "1" AND userid=:userid:', |
||
| 190 | 'bind' => [ |
||
| 191 | 'userid' => $extension->userid, |
||
| 192 | ], |
||
| 193 | ]; |
||
| 194 | $externalExtension = Extensions::findFirst($parameters); |
||
| 195 | if ($externalExtension === null) { |
||
| 196 | $externalExtension = new Extensions(); |
||
| 197 | $externalExtension->userid = $extension->userid; |
||
| 198 | $externalExtension->type = Extensions::TYPE_EXTERNAL; |
||
| 199 | $externalExtension->is_general_user_number = '1'; |
||
| 200 | $externalExtension->ExternalPhones = new ExternalPhones(); |
||
| 201 | $externalExtension->ExternalPhones->uniqid = Extensions::TYPE_EXTERNAL.strtoupper('-' . md5(time())); |
||
| 202 | $externalExtension->ExternalPhones->disabled = '0'; |
||
| 203 | } |
||
| 204 | |||
| 205 | $forwardingExtensions = []; |
||
| 206 | $forwardingExtensions[''] = $this->translation->_('ex_SelectNumber'); |
||
| 207 | |||
| 208 | $parameters = [ |
||
| 209 | 'conditions' => 'number IN ({ids:array})', |
||
| 210 | 'bind' => [ |
||
| 211 | 'ids' => [ |
||
| 212 | $extension->ExtensionForwardingRights->forwarding, |
||
| 213 | $extension->ExtensionForwardingRights->forwardingonbusy, |
||
| 214 | $extension->ExtensionForwardingRights->forwardingonunavailable, |
||
| 215 | ], |
||
| 216 | ], |
||
| 217 | ]; |
||
| 218 | $extensions = Extensions::find($parameters); |
||
| 219 | foreach ($extensions as $record) { |
||
| 220 | $forwardingExtensions[$record->number] = $record->getRepresent(); |
||
| 221 | } |
||
| 222 | |||
| 223 | // Ограничим длинну внутреннего номера согласно настройкам |
||
| 224 | $extensionsLength = PbxSettings::getValueByKey('PBXInternalExtensionLength'); |
||
| 225 | $internalExtensionMask = "9{2,{$extensionsLength}}"; |
||
| 226 | |||
| 227 | $form = new ExtensionEditForm( |
||
| 228 | $extension, [ |
||
| 229 | 'network_filters' => $arrNetworkFilters, |
||
| 230 | 'external_extension' => $externalExtension, |
||
| 231 | 'forwarding_extensions' => $forwardingExtensions, |
||
| 232 | 'internalextension_mask' => $internalExtensionMask, |
||
| 233 | ] |
||
| 234 | ); |
||
| 235 | |||
| 236 | $this->view->form = $form; |
||
| 237 | $this->view->represent = $extension->getRepresent(); |
||
| 238 | } |
||
| 239 | |||
| 240 | /** |
||
| 241 | * Получает из базы следующий за последним введенным внутренним номером |
||
| 242 | */ |
||
| 243 | private function getNextInternalNumber() |
||
| 258 | } |
||
| 259 | |||
| 260 | /** |
||
| 261 | * Сохранение карточки пользователя с его номерами |
||
| 262 | * |
||
| 263 | * @return void параметры помещаются в view и обрабатваются через ControllerBase::afterExecuteRoute() |
||
| 264 | */ |
||
| 265 | public function saveAction(): void |
||
| 387 | } |
||
| 388 | } |
||
| 389 | |||
| 390 | /** |
||
| 391 | * Сохранение параметров в таблицу Users |
||
| 392 | * |
||
| 393 | * @param Users $userEntity |
||
| 394 | * @param array $data - POST дата |
||
| 395 | * |
||
| 396 | * @return bool результат сохранения |
||
| 397 | */ |
||
| 398 | private function saveUser(Users $userEntity, array $data) |
||
| 399 | { |
||
| 400 | // Заполним параметры пользователя |
||
| 401 | foreach ($userEntity as $name => $value) { |
||
| 402 | switch ($name) { |
||
| 403 | case 'role': |
||
| 404 | if (array_key_exists('user_' . $name, $data)) { |
||
| 405 | $userEntity->$name = ($userEntity->$name === 'user') ? 'user' : $data['user_' . $name]; // не повышаем роль |
||
| 406 | } |
||
| 407 | break; |
||
| 408 | case 'language': |
||
| 409 | $userEntity->$name = PbxSettings::getValueByKey('PBXLanguage'); |
||
| 410 | break; |
||
| 411 | default: |
||
| 412 | if (array_key_exists('user_' . $name, $data)) { |
||
| 413 | $userEntity->$name = $data['user_' . $name]; |
||
| 414 | } |
||
| 415 | } |
||
| 416 | } |
||
| 417 | |||
| 418 | if ($userEntity->save() === false) { |
||
| 419 | $errors = $userEntity->getMessages(); |
||
| 420 | $this->flash->error(implode('<br>', $errors)); |
||
| 421 | |||
| 422 | return false; |
||
| 423 | } |
||
| 424 | |||
| 425 | return true; |
||
| 426 | } |
||
| 427 | |||
| 428 | /** |
||
| 429 | * Сохранение параметров в таблицу Extensions |
||
| 430 | * |
||
| 431 | * @param Extensions $extension |
||
| 432 | * @param Users $userEntity |
||
| 433 | * @param array $data - POST дата |
||
| 434 | * @param bool isMobile - это мобильный телефон |
||
| 435 | * |
||
| 436 | * @return bool результат сохранения |
||
| 437 | */ |
||
| 438 | private function saveExtension(Extensions $extension, Users $userEntity, array $data, $isMobile = false): bool |
||
| 482 | } |
||
| 483 | |||
| 484 | /** |
||
| 485 | * Сохранение параметров в таблицу SIP |
||
| 486 | * |
||
| 487 | * @param Sip $sipEntity |
||
| 488 | * @param array $data - POST дата |
||
| 489 | * |
||
| 490 | * @return bool результат сохранения |
||
| 491 | */ |
||
| 492 | private function saveSip(Sip $sipEntity, array $data): bool |
||
| 493 | { |
||
| 494 | foreach ($sipEntity as $name => $value) { |
||
| 495 | switch ($name) { |
||
| 496 | case 'qualify': |
||
| 497 | if (array_key_exists($name, $data)) { |
||
| 498 | $sipEntity->$name = ($data[$name] === 'on') ? '1' : '0'; |
||
| 499 | } else { |
||
| 500 | $sipEntity->$name = "0"; |
||
| 501 | } |
||
| 502 | break; |
||
| 503 | case 'disabled': |
||
| 504 | case 'enableRecording': |
||
| 505 | case 'disablefromuser': |
||
| 506 | if (array_key_exists('sip_' . $name, $data)) { |
||
| 507 | $sipEntity->$name = ($data['sip_' . $name] === 'on') ? '1' : '0'; |
||
| 508 | } else { |
||
| 509 | $sipEntity->$name = "0"; |
||
| 510 | } |
||
| 511 | break; |
||
| 512 | case 'networkfilterid': |
||
| 513 | if ( ! array_key_exists('sip_' . $name, $data)) { |
||
| 514 | continue 2; |
||
| 515 | } |
||
| 516 | if ($data['sip_' . $name] === 'none') { |
||
| 517 | $sipEntity->$name = null; |
||
| 518 | } else { |
||
| 519 | $sipEntity->$name = $data['sip_' . $name]; |
||
| 520 | } |
||
| 521 | break; |
||
| 522 | case 'extension': |
||
| 523 | $sipEntity->$name = $data['number']; |
||
| 524 | break; |
||
| 525 | case 'description': |
||
| 526 | $sipEntity->$name = $data['user_username']; |
||
| 527 | break; |
||
| 528 | case 'manualattributes': |
||
| 529 | $sipEntity->setManualAttributes($data['sip_manualattributes']); |
||
| 530 | break; |
||
| 531 | default: |
||
| 532 | if (array_key_exists('sip_' . $name, $data)) { |
||
| 533 | $sipEntity->$name = $data['sip_' . $name]; |
||
| 534 | } |
||
| 535 | } |
||
| 536 | } |
||
| 537 | if ($sipEntity->save() === false) { |
||
| 538 | $errors = $sipEntity->getMessages(); |
||
| 539 | $this->flash->error(implode('<br>', $errors)); |
||
| 540 | |||
| 541 | return false; |
||
| 542 | } |
||
| 543 | |||
| 544 | return true; |
||
| 545 | } |
||
| 546 | |||
| 547 | /** |
||
| 548 | * Заполним параметры переадресации |
||
| 549 | * |
||
| 550 | * @param \MikoPBX\Common\Models\ExtensionForwardingRights $forwardingRight |
||
| 551 | * @param $data |
||
| 552 | * |
||
| 553 | * @return bool |
||
| 554 | */ |
||
| 555 | private function saveForwardingRights(ExtensionForwardingRights $forwardingRight, $data): bool |
||
| 556 | { |
||
| 557 | foreach ($forwardingRight as $name => $value) { |
||
| 558 | switch ($name) { |
||
| 559 | case 'extension': |
||
| 560 | $forwardingRight->$name = $data['number']; |
||
| 561 | break; |
||
| 562 | default: |
||
| 563 | if (array_key_exists('fwd_' . $name, $data)) { |
||
| 564 | $forwardingRight->$name = ($data['fwd_' . $name] === -1) ? '' : $data['fwd_' . $name]; |
||
| 565 | } |
||
| 566 | } |
||
| 567 | } |
||
| 568 | if (empty($forwardingRight->forwarding)) { |
||
| 569 | $forwardingRight->ringlength = null; |
||
| 570 | } |
||
| 571 | |||
| 572 | if ($forwardingRight->save() === false) { |
||
| 573 | $errors = $forwardingRight->getMessages(); |
||
| 574 | $this->flash->error(implode('<br>', $errors)); |
||
| 575 | |||
| 576 | return false; |
||
| 577 | } |
||
| 578 | |||
| 579 | return true; |
||
| 580 | } |
||
| 581 | |||
| 582 | /** |
||
| 583 | * Заполним параметры ExternalPhones для мобильного номера |
||
| 584 | * |
||
| 585 | * @param ExternalPhones $externalPhone |
||
| 586 | * @param array $data - POST дата |
||
| 587 | * |
||
| 588 | * @return bool результат сохранения |
||
| 589 | */ |
||
| 590 | private function saveExternalPhones(ExternalPhones $externalPhone, array $data): bool |
||
| 591 | { |
||
| 592 | foreach ($externalPhone as $name => $value) { |
||
| 593 | switch ($name) { |
||
| 594 | case 'extension': |
||
| 595 | $externalPhone->$name = $data['mobile_number']; |
||
| 596 | break; |
||
| 597 | case 'description': |
||
| 598 | $externalPhone->$name = $data['user_username']; |
||
| 599 | break; |
||
| 600 | case 'disabled': |
||
| 601 | if (array_key_exists('mobile_' . $name, $data)) { |
||
| 602 | $externalPhone->$name = ($data['mobile_' . $name] === 'on') ? '1' : '0'; |
||
| 603 | } else { |
||
| 604 | $externalPhone->$name = '0'; |
||
| 605 | } |
||
| 606 | break; |
||
| 607 | default: |
||
| 608 | if (array_key_exists('mobile_' . $name, $data)) { |
||
| 609 | $externalPhone->$name = $data['mobile_' . $name]; |
||
| 610 | } |
||
| 611 | } |
||
| 612 | } |
||
| 613 | if ($externalPhone->save() === false) { |
||
| 614 | $errors = $externalPhone->getMessages(); |
||
| 615 | $this->flash->error(implode('<br>', $errors)); |
||
| 616 | |||
| 617 | return false; |
||
| 618 | } |
||
| 619 | |||
| 620 | return true; |
||
| 621 | } |
||
| 622 | |||
| 623 | /** |
||
| 624 | * Удаление внутреннего номера и всех зависимых от него записей в том числе мобильного и переадресаций |
||
| 625 | * |
||
| 626 | * @param string $id - записи внутренненго номера |
||
| 627 | */ |
||
| 628 | public function deleteAction(string $id = '') |
||
| 629 | { |
||
| 630 | $this->db->begin(); |
||
| 631 | $extension = Extensions::findFirstById($id); |
||
| 632 | |||
| 633 | // Чтобы не было зацикливания при удалении сначала удалим |
||
| 634 | // настройки переадресации у этой же учетной записи, т.к. она может ссылаться на себя |
||
| 635 | |||
| 636 | $errors = null; |
||
| 637 | if ($extension !== null && $extension->ExtensionForwardingRights |
||
| 638 | && ! $extension->ExtensionForwardingRights->delete()) { |
||
| 639 | $errors = $extension->ExtensionForwardingRights->getMessages(); |
||
| 640 | } |
||
| 641 | |||
| 642 | if ( ! $errors && $extension) { |
||
| 643 | $user = $extension->Users; |
||
| 644 | if ( ! $user->delete()) { |
||
| 645 | $errors = $user->getMessages(); |
||
| 646 | } |
||
| 647 | } |
||
| 648 | |||
| 649 | if ($errors) { |
||
| 650 | $this->flash->error(implode('<br>', $errors)); |
||
| 651 | $this->view->success = false; |
||
| 652 | $this->db->rollback(); |
||
| 653 | } else { |
||
| 654 | $this->db->commit(); |
||
| 655 | $this->view->success = true; |
||
| 656 | } |
||
| 657 | } |
||
| 658 | |||
| 659 | /** |
||
| 660 | * Проверка на доступность номера JS скрипта extensions.js |
||
| 661 | * |
||
| 662 | * @param string $number - внутренний номер пользователя |
||
| 663 | * |
||
| 664 | * @return void параметры помещаются в view и обрабатваются через ControllerBase::afterExecuteRoute() |
||
| 665 | */ |
||
| 666 | public function availableAction(string $number = ''): void |
||
| 667 | { |
||
| 668 | $result = true; |
||
| 669 | // Проверим пересечение с внутренним номерным планом |
||
| 670 | $extension = Extensions::findFirstByNumber($number); |
||
| 671 | if ($extension !== null) { |
||
| 672 | $result = false; |
||
| 673 | $this->view->userId = $extension->userid; |
||
| 674 | } |
||
| 675 | // Проверим пересечение с парковочными слотами |
||
| 676 | if ($result) { |
||
| 677 | $parkExt = PbxSettings::getValueByKey('PBXCallParkingExt'); |
||
| 678 | $parkStartSlot = PbxSettings::getValueByKey('PBXCallParkingStartSlot'); |
||
| 679 | $parkEndSlot = PbxSettings::getValueByKey('PBXCallParkingEndSlot'); |
||
| 680 | if ($number === $parkExt || ($number >= $parkStartSlot && $number <= $parkEndSlot)) { |
||
| 681 | $result = false; |
||
| 682 | $this->view->userId = 0; |
||
| 683 | } |
||
| 684 | } |
||
| 685 | |||
| 686 | $this->view->numberAvailable = $result; |
||
| 687 | } |
||
| 688 | |||
| 689 | /** |
||
| 690 | * Отключение всех номеров пользователя |
||
| 691 | * |
||
| 692 | * @param string $number - внутренний номер пользователя |
||
| 693 | * |
||
| 694 | * @return void |
||
| 695 | */ |
||
| 696 | public function disableAction(string $number = ''): void |
||
| 697 | { |
||
| 698 | $extension = Extensions::findFirstByNumber($number); |
||
| 699 | if ($extension !== null) { |
||
| 700 | $extensions = Extensions::findByUserid($extension->userid); |
||
| 701 | foreach ($extensions as $extension) { |
||
| 702 | switch ($extension->type) { |
||
| 703 | case Extensions::TYPE_SIP: |
||
| 704 | $extension->Sip->disabled = '1'; |
||
| 705 | break; |
||
| 706 | case Extensions::TYPE_EXTERNAL: |
||
| 707 | $extension->ExternalPhones->disabled = '1'; |
||
| 708 | break; |
||
| 709 | } |
||
| 710 | if ($extension->save() === true) { |
||
| 711 | $this->view->success = true; |
||
| 712 | } else { |
||
| 713 | $this->view->success = false; |
||
| 714 | $errors = $extension->getMessages(); |
||
| 715 | $this->flash->error(implode('<br>', $errors)); |
||
| 716 | |||
| 717 | return; |
||
| 718 | } |
||
| 719 | } |
||
| 720 | } |
||
| 721 | } |
||
| 722 | |||
| 723 | /** |
||
| 724 | * Включение всех номеров пользователя |
||
| 725 | * |
||
| 726 | * @param string $number - внутренний номер пользователя |
||
| 727 | * |
||
| 728 | * @return void |
||
| 729 | */ |
||
| 730 | public function enableAction(string $number = ''): void |
||
| 731 | { |
||
| 732 | $extension = Extensions::findFirstByNumber($number); |
||
| 733 | if ($extension !== null) { |
||
| 734 | $extensions = Extensions::findByUserid($extension->userid); |
||
| 735 | foreach ($extensions as $extension) { |
||
| 736 | switch ($extension->type) { |
||
| 737 | case Extensions::TYPE_SIP: |
||
| 738 | $extension->Sip->disabled = '0'; |
||
| 739 | break; |
||
| 740 | case Extensions::TYPE_EXTERNAL: |
||
| 741 | $extension->ExternalPhones->disabled = '1'; |
||
| 742 | break; |
||
| 743 | } |
||
| 744 | if ($extension->save() === true) { |
||
| 745 | $this->view->success = true; |
||
| 746 | } else { |
||
| 747 | $this->view->success = false; |
||
| 748 | $errors = $extension->getMessages(); |
||
| 749 | $this->flash->error(implode('<br>', $errors)); |
||
| 750 | |||
| 751 | return; |
||
| 752 | } |
||
| 753 | } |
||
| 754 | } |
||
| 755 | } |
||
| 756 | |||
| 757 | /** |
||
| 758 | * Возвращает представление для списка нормеров телефонов по AJAX запросу |
||
| 759 | * |
||
| 760 | * @return void |
||
| 761 | */ |
||
| 762 | public function GetPhonesRepresentAction(): void |
||
| 763 | { |
||
| 764 | if ( ! $this->request->isPost()) { |
||
| 765 | return; |
||
| 766 | } |
||
| 767 | $numbers = $this->request->getPost('numbers'); |
||
| 768 | $result = []; |
||
| 769 | foreach ($numbers as $number) { |
||
| 770 | $result[$number] = [ |
||
| 771 | 'number' => $number, |
||
| 772 | 'represent' => $this->GetPhoneRepresentAction($number), |
||
| 773 | ]; |
||
| 774 | } |
||
| 775 | $this->view->success = true; |
||
| 776 | $this->view->message = $result; |
||
| 777 | } |
||
| 778 | |||
| 779 | /** |
||
| 780 | * Возвращает представление нормера телефона по AJAX запросу |
||
| 781 | * |
||
| 782 | * @param $phoneNumber |
||
| 783 | * |
||
| 784 | * @return string |
||
| 785 | */ |
||
| 786 | public function GetPhoneRepresentAction($phoneNumber): string |
||
| 787 | { |
||
| 788 | $response = $phoneNumber; |
||
| 789 | |||
| 790 | if (strlen($phoneNumber) > 10) { |
||
| 791 | $seekNumber = substr($phoneNumber, -9); |
||
| 792 | $parameters = [ |
||
| 793 | 'conditions' => 'number LIKE :SearchPhrase1:', |
||
| 794 | 'bind' => [ |
||
| 795 | 'SearchPhrase1' => "%{$seekNumber}", |
||
| 796 | ], |
||
| 797 | ]; |
||
| 798 | } else { |
||
| 799 | $parameters = [ |
||
| 800 | 'conditions' => 'number = :SearchPhrase1:', |
||
| 801 | 'bind' => [ |
||
| 802 | 'SearchPhrase1' => $phoneNumber, |
||
| 803 | ], |
||
| 804 | ]; |
||
| 805 | } |
||
| 806 | $result = Extensions::findFirst($parameters); |
||
| 807 | if ($result !== null) { |
||
| 808 | $response = $result->getRepresent(); |
||
| 809 | } |
||
| 810 | |||
| 811 | return $response; |
||
| 812 | } |
||
| 813 | |||
| 814 | /** |
||
| 815 | * Используется для генерации списка выбора пользователей из JS скрипта extensions.js |
||
| 816 | * |
||
| 817 | * @param string $type {all, phones, internal} - отображать только телефоны или все возможные номера |
||
| 818 | * |
||
| 819 | * @return void параметры помещаются в view и обрабатваются через ControllerBase::afterExecuteRoute() |
||
| 820 | */ |
||
| 821 | public function getForSelectAction(string $type = 'all'): void |
||
| 906 | } |
||
| 907 | |||
| 908 | /** |
||
| 909 | * Try to find module by extension number |
||
| 910 | * |
||
| 911 | * @param string $number |
||
| 912 | * |
||
| 913 | * @return mixed|null |
||
| 914 | */ |
||
| 915 | private function findModuleByExtensionNumber(string $number) |
||
| 916 | { |
||
| 917 | $result = null; |
||
| 918 | $extension = Extensions::findFirst("number ='{$number}'"); |
||
| 919 | $relatedLinks = $extension->getRelatedLinks(); |
||
| 920 | $moduleUniqueID = false; |
||
| 921 | foreach ($relatedLinks as $relation) { |
||
| 922 | $obj = $relation['object']; |
||
| 923 | if (strpos(get_class($obj), 'Modules\\') === 0) { |
||
| 924 | $moduleUniqueID = explode('Models\\', get_class($obj))[1]; |
||
| 925 | } |
||
| 926 | } |
||
| 927 | if ($moduleUniqueID) { |
||
| 928 | $result = PbxExtensionModules::findFirstByUniqid($moduleUniqueID); |
||
| 929 | } |
||
| 930 | |||
| 931 | return $result; |
||
| 932 | } |
||
| 933 | |||
| 934 | /** |
||
| 935 | * Сортировка массива extensions |
||
| 936 | * |
||
| 937 | * @param $a |
||
| 938 | * @param $b |
||
| 939 | * |
||
| 940 | * @return int |
||
| 941 | */ |
||
| 942 | private function sortExtensionsArray($a, $b): int |
||
| 945 | } |
||
| 946 | |||
| 947 | |||
| 948 | } |