vvvsvsdgdsrytvvfFrom 7639397d1bd9ab2fd0494eb9f3772e1b3c35e084 Mon Sep 17 00:00:00 2001 From: Jaime Date: Tue, 28 Sep 2021 21:16:15 -0500 Subject: [PATCH] parcheado --- languages/en_us/Vtiger.php | 1 + languages/es_mx/Settings/PBXManager.php | 1 + languages/es_mx/Vtiger.php | 3 +- languages/ru_ru/PBXManager.php | 63 +++++++- languages/ru_ru/Settings/PBXManager.php | 22 +-- layouts/v7/modules/Vtiger/Header.tpl | 1 + layouts/v7/modules/Vtiger/JSResources.tpl | 2 + layouts/v7/modules/Vtiger/resources/Detail.js | 7 + layouts/v7/modules/Vtiger/resources/List.js | 7 + .../PBXManager/DetailViewHeaderTitle.tpl | 2 +- libraries/visibility/visibility.min.js | 1 + modules/PBXManager/PBXManager.php | 11 ++ modules/PBXManager/PBXManagerHandler.php | 1 - .../PBXManager/actions/IncomingCallPoll.php | 24 ++- modules/PBXManager/actions/ListenRecord.php | 68 ++++++++ modules/PBXManager/callbacks/SPAgi.php | 68 ++++++++ modules/PBXManager/connectors/PBXManager.php | 114 +++++++++---- modules/PBXManager/controllers/PBXManager.php | 79 ++++++++- modules/PBXManager/models/ListView.php | 44 +++-- modules/PBXManager/models/Module.php | 2 +- modules/PBXManager/models/Record.php | 153 +++++++++++++++--- modules/PBXManager/resources/PBXManagerJS.js | 63 ++++++-- modules/PBXManager/uitypes/Url.php | 24 +++ modules/PBXManager/views/Detail.php | 33 ++-- modules/Settings/PBXManager/models/Record.php | 2 +- modules/Vtiger/models/RelationListView.php | 10 ++ 26 files changed, 684 insertions(+), 122 deletions(-) create mode 100644 libraries/visibility/visibility.min.js create mode 100644 modules/PBXManager/actions/ListenRecord.php create mode 100644 modules/PBXManager/callbacks/SPAgi.php create mode 100644 modules/PBXManager/uitypes/Url.php diff --git a/languages/en_us/Vtiger.php b/languages/en_us/Vtiger.php index fec3340..fb2de22 100755 --- a/languages/en_us/Vtiger.php +++ b/languages/en_us/Vtiger.php @@ -1934,6 +1934,7 @@ $jsLanguageStrings = array( 'JS_SHARED_WITH'=>'Shared with', 'JS_DEFAULT_DASHBOARD_TOOLTIP' => 'Make this dashboard as default by reordering it as the first tab!', 'JS_SET_DEFAULT_TAB' => 'is set as your default dashboard', + 'JS_LBL_ASSIGNED_TO' => 'Assigned To', 'JS_PASSWORD_MISMATCH_ERROR' => 'Please re-enter passwords. The "new password" and "confirm password" values do not match.', 'LBL_LIST_DELETE_CONFIRMATION' => 'Are you sure you want to delete?', 'JS_WIDGET_RESIZING_WAIT_MSG' => 'Widget contents will load after resizing.', diff --git a/languages/es_mx/Settings/PBXManager.php b/languages/es_mx/Settings/PBXManager.php index a74ab30..bc09acd 100644 --- a/languages/es_mx/Settings/PBXManager.php +++ b/languages/es_mx/Settings/PBXManager.php @@ -23,6 +23,7 @@ $languageStrings = array( 'vtigersecretkey'=>'Clave secreta de Vtiger', 'outboundcontext' => 'Contexto saliente', 'outboundtrunk' => 'Línea saliente', + 'logPBXManager' => 'Log', ); diff --git a/languages/es_mx/Vtiger.php b/languages/es_mx/Vtiger.php index 9081820..9e59cc2 100644 --- a/languages/es_mx/Vtiger.php +++ b/languages/es_mx/Vtiger.php @@ -1384,9 +1384,10 @@ $jsLanguageStrings = array( 'JS_USER_DELETED_SUCCESSFULLY' => 'Usuario eliminado con éxito.', 'JS_PBX_CALL_FROM' => 'Llamada de', 'JS_PBX_INCOMING_CALL' => 'Llamada entrante', - 'JS_PBX_OUTGOING_SUCCESS' => 'Levante la extensión del receptor para marcar el número', + 'JS_PBX_OUTGOING_SUCCESS' => 'Levante su extensión para marcar el número', 'JS_PBX_OUTGOING_FAILURE' => 'Error de llamada', 'JS_PBX_FILL_ALL_FIELDS' => 'Por favor llene todos los campos', + 'JS_PBX_FILL_LASTNAME_AND_MODULE_FIELDS' => 'El campo Apellido y Módulo es obligatorio', 'JS_PBX_CAMPAIGN_NAME' => 'Nombre de la campaña', 'JS_PBX_CAMPAIGN_NUMBER' => 'Campaña número', 'JS_MIN_SEARCH_KEY_LENGTH' => 'La clave de búsqueda debe tener por lo menos 3 caracteres', diff --git a/languages/ru_ru/PBXManager.php b/languages/ru_ru/PBXManager.php index 6d51374..45f5005 100644 --- a/languages/ru_ru/PBXManager.php +++ b/languages/ru_ru/PBXManager.php @@ -9,11 +9,62 @@ ************************************************************************************/ $languageStrings = array( 'Asterisk' => 'Asterisk' , - 'PBXManager' => 'Менеджер PBX' , - 'SINGLE_PBXManager' => 'Менеджер PBX' , // KEY 5.x: PBXManager - 'LBL_CALL_INFORMATION' => 'Звоните Подробнее' , - 'Call From' => 'Звонок От' , + 'PBXManager' => 'Звонки' , + 'SINGLE_PBXManager' => 'Звонок', + 'LBL_CALL_INFORMATION' => 'Информиация о Звонке' , + 'Call From' => 'Звонок от' , 'Call To' => 'Звонок' , 'Time Of Call' => 'Время Звонка' , - 'PBXManager ID' => 'Id PBX Manager' , -); \ No newline at end of file + 'PBXManager ID' => 'ID записи Звонка' , + //Blocks + 'LBL_PBXMANAGER_INFORMATION' => 'Детали Звонка', + 'LBL_CUSTOM_INFORMATION' => 'Информация', + + // list view settings links + 'LBL_SERVER_CONFIGURATION' => 'Настройка конфигурации', + + //Detail view header title + 'LBL_CALL_FROM' => 'Звонок от', + 'LBL_CALL_TO' => 'Звонок', + + //Incoming call pop-up + 'LBL_HIDDEN' => 'Скрытый', + + // Fields + 'Total Duration' => 'Длительность (сек)', + 'Recording URL' => 'Запись Звонка', + + 'SINGLE_PBXManager' => 'Детали Звонка' , + 'Call Status' => 'Статус', + 'Customer Number' => 'Телефон клиента', + 'Customer' => 'Клиент', + 'User' => 'Пользователь', + 'Start Time' => 'Время начала Звонка', + 'Office Phone' => 'Рабочий телефон', + 'Direction' => 'Тип Звонка', + 'Bill Duration' => 'Время разговора (сек)', + 'Gateway' => 'Имя шлюза', + 'Customer Type' => 'Тип клиента', + 'End Time' => 'Время завершения Звонка', + 'Source UUID' => 'Идентификатор источника', + + 'inbound' => 'Входящий', + 'outbound' => 'Исходящий', + 'ringing' => 'Звонок', + 'in-progress' => 'В прогрессе', + 'completed' => 'Завершен', + 'busy' => 'Занято', + 'no-answer' => 'Нет ответа', + 'Answered elsewhere' => 'Ответили в другом месте', + 'No user responding' => 'Нет ответа', + 'Circuit/channel congestion' => 'Линия занята', + 'Incoming Line Name' => 'Входящая линия', +); + +$jsLanguageStrings = array( + 'Enter Email-id' => 'Введите E-mail', + 'Select' => 'Выберите', + 'Save' => 'Сохранить' +); + +include 'renamed/PBXManager.php'; \ No newline at end of file diff --git a/languages/ru_ru/Settings/PBXManager.php b/languages/ru_ru/Settings/PBXManager.php index f048d2a..d6d3ffc 100644 --- a/languages/ru_ru/Settings/PBXManager.php +++ b/languages/ru_ru/Settings/PBXManager.php @@ -10,20 +10,20 @@ * *********************************************************************************** */ $languageStrings = array( 'LBL_SELECT_ONE' => 'Выберите', - 'LBL_PBXManager' =>'PBXManager', - 'LBL_PBXMANAGER_CONFIG' => 'Подробные сведения о сервере Asterisk', - 'LBL_NOTE' => 'Note:', - 'LBL_INFO_WEBAPP_URL' => 'Настройте URL Asterisk App в формате', - 'LBL_FORMAT_WEBAPP_URL' => '(Протокол) :/ / (asterisk_ip): (порт)', + 'LBL_PBXMANAGER' => 'Звонки', + 'LBL_PBXMANAGER_CONFIG' => 'Подробные сведения о SalesPlatform Asterisk Connector', + 'LBL_NOTE' => 'Примечание:', + 'LBL_INFO_WEBAPP_URL' => 'Укажите URL адрес в формате', + 'LBL_FORMAT_WEBAPP_URL' => '(Протокол)://(asterisk_connector_ip):(порт)', 'LBL_FORMAT_INFO_WEBAPP_URL' => 'например: http://0.0.0.0:5000', - 'LBL_INFO_CONTEXT' => 'Vtiger конкретном контексте, сконфигурированные в вашей Asterisk сервера (extensions.conf)', - 'LBL_PBXMANAGER_INFO' => 'Настроить Asterisk сервер детали после Установка Vtiger звездочка разъем вашего сервера Asterisk', + 'LBL_INFO_CONTEXT' => 'Vtiger Specfic контекст, настроенных в Asterisk сервер (extensions.conf)', + 'LBL_PBXMANAGER_INFO' => 'Не забудьте настроить параметры конфигурации SalesPlatform Asterisk Connector после его установки на сервер', - 'webappurl'=>'Vtiger Askterisk веб URL', - 'vtigersecretkey'=>'Vtiger Секретный ключ', - 'outboundcontext' => 'Исходящий Контекст', - 'outboundtrunk' => 'Исходящий багажника', + 'webappurl' => 'URL адрес', + 'vtigersecretkey' => 'Секретный ключ', + 'outboundcontext' => 'Контекст', + 'outboundtrunk' => 'Транк', ); $jsLanguageStrings = array( diff --git a/layouts/v7/modules/Vtiger/Header.tpl b/layouts/v7/modules/Vtiger/Header.tpl index b6bb5e9..e83dbb5 100755 --- a/layouts/v7/modules/Vtiger/Header.tpl +++ b/layouts/v7/modules/Vtiger/Header.tpl @@ -29,6 +29,7 @@ + {assign var=V7_THEME_PATH value=Vtiger_Theme::getv7AppStylePath($SELECTED_MENU_CATEGORY)} diff --git a/layouts/v7/modules/Vtiger/JSResources.tpl b/layouts/v7/modules/Vtiger/JSResources.tpl index fc4fa9b..1344e47 100755 --- a/layouts/v7/modules/Vtiger/JSResources.tpl +++ b/layouts/v7/modules/Vtiger/JSResources.tpl @@ -54,6 +54,8 @@ + + {foreach key=index item=jsModel from=$SCRIPTS} {/foreach} diff --git a/layouts/v7/modules/Vtiger/resources/Detail.js b/layouts/v7/modules/Vtiger/resources/Detail.js index fc0f689..03bbf96 100755 --- a/layouts/v7/modules/Vtiger/resources/Detail.js +++ b/layouts/v7/modules/Vtiger/resources/Detail.js @@ -2718,6 +2718,12 @@ Vtiger.Class("Vtiger_Detail_Js",{ }); }, + registerAudioFieldClickEvent: function() { + var detailContentsHolder = this.getContentHolder(); + detailContentsHolder.on('click', 'audio', function (e) { + e.stopPropagation(); + }); + }, registerEvents : function() { this._super(); @@ -2725,6 +2731,7 @@ Vtiger.Class("Vtiger_Detail_Js",{ var detailContentsHolder = this.getContentHolder(); var self = this; this.registerSendSmsSubmitEvent(); + this.registerAudioFieldClickEvent(); detailContentsHolder.on('click','.viewThread', function(e){ var currentTarget = jQuery(e.currentTarget); var currentTargetParent = currentTarget.parent(); diff --git a/layouts/v7/modules/Vtiger/resources/List.js b/layouts/v7/modules/Vtiger/resources/List.js index 0a46561..23d1b22 100755 --- a/layouts/v7/modules/Vtiger/resources/List.js +++ b/layouts/v7/modules/Vtiger/resources/List.js @@ -2352,6 +2352,12 @@ Vtiger.Class("Vtiger_List_Js", { e.stopPropagation(); }); }, + registerAudioFieldClickEvent: function() { + var listViewContentDiv = this.getListViewContainer(); + listViewContentDiv.on('click', 'audio', function (e) { + e.stopPropagation(); + }); + }, registerConfigureColumnsEvents: function () { var thisInstance = this; var listViewContentDiv = this.getListViewContainer(); @@ -2563,6 +2569,7 @@ Vtiger.Class("Vtiger_List_Js", { this.registerDynamicDropdownPosition(); this.registerDropdownPosition(); this.registerConfigureColumnsEvents(); + this.registerAudioFieldClickEvent(); var recordSelectTrackerObj = this.getRecordSelectTrackerInstance(); recordSelectTrackerObj.registerEvents(); diff --git a/layouts/vlayout/modules/PBXManager/DetailViewHeaderTitle.tpl b/layouts/vlayout/modules/PBXManager/DetailViewHeaderTitle.tpl index 16648e7..8995507 100644 --- a/layouts/vlayout/modules/PBXManager/DetailViewHeaderTitle.tpl +++ b/layouts/vlayout/modules/PBXManager/DetailViewHeaderTitle.tpl @@ -13,7 +13,7 @@
- {if $RECORD->get('customer') and $RECORD->get('customertype') eq 'Contacts'} + {if $RECORD->get('customer') and $RECORD->get('customertype') eq 'Contacts' and isRecordExists($RECORD->get('customer'))} {assign var=MODULE_INSTANCE value=Vtiger_Record_Model::getInstanceById($RECORD->get('customer'),$RECORD->get('customertype'))} {assign var=IMAGE_DETAILS value=$MODULE_INSTANCE->getImageDetails()} {if $IMAGE_DETAILS} diff --git a/libraries/visibility/visibility.min.js b/libraries/visibility/visibility.min.js new file mode 100644 index 0000000..0085022 --- /dev/null +++ b/libraries/visibility/visibility.min.js @@ -0,0 +1 @@ +!function(e){"use strict";var i=-1,t={onVisible:function(e){var i=t.isSupported();if(!i||!t.hidden())return e(),i;var n=t.change(function(i,r){t.hidden()||(t.unbind(n),e())});return n},change:function(e){if(!t.isSupported())return!1;i+=1;var n=i;return t._callbacks[n]=e,t._listen(),n},unbind:function(e){delete t._callbacks[e]},afterPrerendering:function(e){var i=t.isSupported(),n="prerender";if(!i||n!=t.state())return e(),i;var r=t.change(function(i,d){n!=d&&(t.unbind(r),e())});return r},hidden:function(){return!(!t._doc.hidden&&!t._doc.webkitHidden)},state:function(){return t._doc.visibilityState||t._doc.webkitVisibilityState||"visible"},isSupported:function(){return!(!t._doc.visibilityState&&!t._doc.webkitVisibilityState)},_doc:document||{},_callbacks:{},_change:function(e){var i=t.state();for(var n in t._callbacks)t._callbacks[n].call(t._doc,e,i)},_listen:function(){if(!t._init){var e="visibilitychange";t._doc.webkitVisibilityState&&(e="webkit"+e);var i=function(){t._change.apply(t,arguments)};t._doc.addEventListener?t._doc.addEventListener(e,i):t._doc.attachEvent(e,i),t._init=!0}}};"undefined"!=typeof module&&module.exports?module.exports=t:e.Visibility=t}(this),function(e){"use strict";var i=-1,t=function(t){return t.every=function(e,n,r){t._time(),r||(r=n,n=null),i+=1;var d=i;return t._timers[d]={visible:e,hidden:n,callback:r},t._run(d,!1),t.isSupported()&&t._listen(),d},t.stop=function(e){return!!t._timers[e]&&(t._stop(e),delete t._timers[e],!0)},t._timers={},t._time=function(){t._timed||(t._timed=!0,t._wasHidden=t.hidden(),t.change(function(){t._stopRun(),t._wasHidden=t.hidden()}))},t._run=function(i,n){var r,d=t._timers[i];if(t.hidden()){if(null===d.hidden)return;r=d.hidden}else r=d.visible;var a=function(){d.last=new Date,d.callback.call(e)};if(n){var o=new Date,c=o-d.last;r>c?d.delay=setTimeout(function(){d.id=setInterval(a,r),a()},r-c):(d.id=setInterval(a,r),a())}else d.id=setInterval(a,r)},t._stop=function(e){var i=t._timers[e];clearInterval(i.id),clearTimeout(i.delay),delete i.id,delete i.delay},t._stopRun=function(e){var i=t.hidden(),n=t._wasHidden;if(i&&!n||!i&&n)for(var r in t._timers)t._stop(r),t._run(r,!i)},t};"undefined"!=typeof module&&module.exports?module.exports=t(require("./visibility.core")):t(e.Visibility)}(window); \ No newline at end of file diff --git a/modules/PBXManager/PBXManager.php b/modules/PBXManager/PBXManager.php index b7bfa4f..e8b1e08 100644 --- a/modules/PBXManager/PBXManager.php +++ b/modules/PBXManager/PBXManager.php @@ -48,6 +48,7 @@ class PBXManager extends CRMEntity { 'User' => 'user', 'Recording' => 'recordingurl', 'Start Time' => 'starttime', + 'Incoming Line Name' => 'incominglinename', ); // Make the field link to detail view var $list_link_field = 'customernumber'; @@ -81,6 +82,16 @@ class PBXManager extends CRMEntity { function PBXManager(){ self::__construct(); } + function getListQuery($module, $where='') { + global $current_user; + $query = "SELECT vtiger_crmentity.*, vtiger_pbxmanager.*, vtiger_pbxmanagercf.* FROM vtiger_pbxmanager " + . "INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid=vtiger_pbxmanager.pbxmanagerid " + . "INNER JOIN vtiger_pbxmanagercf ON vtiger_pbxmanagercf.pbxmanagerid=vtiger_pbxmanager.pbxmanagerid "; + $query .= getNonAdminAccessControlQuery($module, $current_user); + $query .= "WHERE vtiger_crmentity.deleted = 0 ". $where; + + return $query; + } /** * Invoked when special actions are performed on the module. diff --git a/modules/PBXManager/PBXManagerHandler.php b/modules/PBXManager/PBXManagerHandler.php index 0b38a26..c051811 100644 --- a/modules/PBXManager/PBXManagerHandler.php +++ b/modules/PBXManager/PBXManagerHandler.php @@ -49,7 +49,6 @@ class PBXManagerHandler extends VTEventHandler { $fieldName = $fieldName->get('name'); $values[$fieldName] = $data[$fieldName]; - if($values[$fieldName]) $recordModel->receivePhoneLookUpRecord($fieldName, $values, true); } } diff --git a/modules/PBXManager/actions/IncomingCallPoll.php b/modules/PBXManager/actions/IncomingCallPoll.php index 0a0d1fa..db140c2 100644 --- a/modules/PBXManager/actions/IncomingCallPoll.php +++ b/modules/PBXManager/actions/IncomingCallPoll.php @@ -67,9 +67,17 @@ class PBXManager_IncomingCallPoll_Action extends Vtiger_Action_Controller{ // To check whether the user has permission to see contact name in popup $recordModel->set('callername', null); + // incoming call for calling user + if($user->id != $recordModel->get('user')) { + continue; + } $callerid = $recordModel->get('customer'); - if($callerid){ + if($callerid && isRecordExists($callerid)){ $moduleName = $recordModel->get('customertype'); + $callerRecordModel = Vtiger_Record_Model::getInstanceById($callerid, $moduleName); + $ownerId = $callerRecordModel->get('assigned_user_id'); + $ownername = (getUserFullName($ownerId) != "") ? getUserFullName($ownerId) : getGroupFullName($ownerId); + $recordModel->set('ownername', $ownername); if(!Users_Privileges_Model::isPermitted($moduleName, 'DetailView', $callerid)){ $name = $recordModel->get('customernumber').vtranslate('LBL_HIDDEN','PBXManager'); $recordModel->set('callername',$name); @@ -78,6 +86,9 @@ class PBXManager_IncomingCallPoll_Action extends Vtiger_Action_Controller{ $callerName = $entityNames[$callerid]; $recordModel->set('callername',$callerName); } + } + else { + $recordModel->set('customer', null); } // End $direction = $recordModel->get('direction'); @@ -101,9 +112,10 @@ class PBXManager_IncomingCallPoll_Action extends Vtiger_Action_Controller{ $user = Users_Record_Model::getCurrentUserModel(); $moduleName = $request->get('modulename'); $name = explode("@",$request->get('email')); - $element['lastname'] = $name[0]; + $element['lastname'] = $request->get('lastname'); + $element['firstname'] = $request->get('firstname'); $element['email'] = $request->get('email'); - $element['phone'] = $request->get('number'); + $element['mobile'] = $request->get('number'); $element['assigned_user_id'] = vtws_getWebserviceEntityId('Users', $user->id); $moduleInstance = Vtiger_Module_Model::getInstance($moduleName); @@ -134,8 +146,10 @@ class PBXManager_IncomingCallPoll_Action extends Vtiger_Action_Controller{ $id = vtws_getIdComponents($customer['id']); $sourceuuid = $request->get('callid'); $module = $request->get('modulename'); - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($sourceuuid); - $recordModel->updateCallDetails(array('customer'=>$id[1], 'customertype'=>$module)); + $currentUser = Users_Record_Model::getCurrentUserModel(); + $user = array('id' => $currentUser->id); + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($sourceuuid, $user); + $recordModel->updateCallDetails(array('customer'=>$id[1], 'customertype'=>$module), $user); } public function getCallStatus($request){ diff --git a/modules/PBXManager/actions/ListenRecord.php b/modules/PBXManager/actions/ListenRecord.php new file mode 100644 index 0000000..c700b22 --- /dev/null +++ b/modules/PBXManager/actions/ListenRecord.php @@ -0,0 +1,68 @@ +getModule(); + + if(!Users_Privileges_Model::isPermitted($moduleName, 'ListView', $request->get('record'))) { + throw new AppException(vtranslate('LBL_PERMISSION_DENIED', $moduleName)); + } + } + + public function process(Vtiger_Request $request) { + $pbxRecordModel = PBXManager_Record_Model::getInstanceById($request->get('record')); + if($pbxRecordModel->get('recordingurl') != null) { + $curl = $this->prepareCurl($pbxRecordModel); + $response = curl_exec($curl); + $requestInfo = curl_getinfo($curl); + if($requestInfo !== false) { + if($requestInfo['http_code'] == 200) { + $headerSize = $requestInfo['header_size']; + $headerContent = substr($response, 0, $headerSize); + $bodyContent = substr($response, $headerSize); + + $headersList = $this->getHeadersList($headerContent); + header('Content-Type: ' . $headersList['content-type']); + header('Content-Length: ' . $headersList['content-length']); + header('Content-disposition: ' . $headersList['content-disposition']); + echo $bodyContent; + } + } + curl_close($curl); + } + } + + private function prepareCurl($pbxRecordModel) { + $pbxSettinsModel = PBXManager_Server_Model::getInstance(); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_HEADER, 1); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($curl, CURLOPT_URL, $pbxRecordModel->get('recordingurl') . "&secret=" . urlencode($pbxSettinsModel->get('vtigersecretkey'))); + + return $curl; + } + + private function getHeadersList($headerContent) { + $headersList = array(); + foreach(explode("\r\n", $headerContent) as $number => $header) { + if($number == 0) { + $headersList['http_code'] = $header; + } else { + list($headerName, $headerValue) = explode(': ', $header); + $headersList[strtolower($headerName)] = trim($headerValue); + } + } + + return $headersList; + } +} \ No newline at end of file diff --git a/modules/PBXManager/callbacks/SPAgi.php b/modules/PBXManager/callbacks/SPAgi.php new file mode 100644 index 0000000..659d1ed --- /dev/null +++ b/modules/PBXManager/callbacks/SPAgi.php @@ -0,0 +1,68 @@ +getConnector(); + + $response = new Vtiger_Response(); + $response->setEmitType(Vtiger_Response::$EMIT_JSON); + if($this->validateRequest($connector->getVtigerSecretKey(), $request)) { + $crmUserExtension = $this->getCrmUserExtension($request->get('callerNumber')); + $response->setResult(array('crmUserExtension' => $crmUserExtension)); + } else { + $response->setError(400, 'Invalid request params'); + } + + $response->emit(); + } + + /** + * Validates callback request params + * + * @param string $vtigersecretkey + * @param Vtiger_Request $request + * @return boolean + */ + private function validateRequest($vtigersecretkey, $request) { + return ($vtigersecretkey == $request->get('vtigersignature') && $request->get('callerNumber') != null); + } + + /** + * Returns crm user extension assigned to caller number or null if not assigned user for caller number + * + * @param string $callerNumber + * @return string + */ + private function getCrmUserExtension($callerNumber) { + $crmUserExtension = null; + $callerUserInfo = PBXManager_Record_Model::lookUpRelatedWithNumber($callerNumber); + if($callerUserInfo) { + $callerRecordModel = Vtiger_Record_Model::getInstanceById($callerUserInfo['id']); + $assignedUser = Users_Record_Model::getInstanceById($callerRecordModel->get('assigned_user_id'), "Users"); + $crmUserExtension = $assignedUser->get('phone_crm_extension'); + } + + return $crmUserExtension; + } +} + + +$agiCallback = new SPAgiCallback(); +$agiCallback->process(new Vtiger_Request($_REQUEST)); \ No newline at end of file diff --git a/modules/PBXManager/connectors/PBXManager.php b/modules/PBXManager/connectors/PBXManager.php index 7982710..e7ca802 100644 --- a/modules/PBXManager/connectors/PBXManager.php +++ b/modules/PBXManager/connectors/PBXManager.php @@ -14,12 +14,14 @@ require_once 'vtlib/Vtiger/Net/Client.php'; class PBXManager_PBXManager_Connector { - private static $SETTINGS_REQUIRED_PARAMETERS = array('webappurl' => 'text','outboundcontext' => 'text', 'outboundtrunk' => 'text' , 'vtigersecretkey' => 'text'); - private static $RINGING_CALL_PARAMETERS = array('From' => 'callerIdNumber', 'SourceUUID' => 'callUUID', 'Direction' => 'Direction'); + // hide trunk field + private static $SETTINGS_REQUIRED_PARAMETERS = array('webappurl' => 'text','outboundcontext' => 'text', 'vtigersecretkey' => 'text','logPBXManager' => 'text'); + private static $RINGING_CALL_PARAMETERS = array('From' => 'callerIdNumber', 'SourceUUID' => 'callUUID', 'Direction' => 'Direction', 'IncomingLineName' => 'connectedLineName'); private static $NUMBERS = array(); private $webappurl; private $outboundcontext, $outboundtrunk; private $vtigersecretkey; + private $logPBXManager; const RINGING_TYPE = 'ringing'; const ANSWERED_TYPE = 'answered'; const HANGUP_TYPE = 'hangup'; @@ -48,6 +50,9 @@ class PBXManager_PBXManager_Connector { public function getServer() { return $this->webappurl; } + public function getlogPBXManager(){ + return $this->logPBXManager; + } public function getOutboundContext() { return $this->outboundcontext; @@ -79,6 +84,7 @@ class PBXManager_PBXManager_Connector { $this->outboundcontext = $serverModel->get('outboundcontext'); $this->outboundtrunk = $serverModel->get('outboundtrunk'); $this->vtigersecretkey = $serverModel->get('vtigersecretkey'); + $this->logPBXManager = $serverModel->get('logPBXManager'); } /** @@ -112,23 +118,23 @@ class PBXManager_PBXManager_Connector { $caller = $details->get('callerid1'); // For Inbound call, answered by will be the user, we should fill the user field - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid); - $direction = $recordModel->get('direction'); - if ($direction == self::INCOMING_TYPE) { - // For Incoming call, we should fill the user field if he answered that call - $user = PBXManager_Record_Model::getUserInfoWithNumber($answeredby); - $params['user'] = $user['id']; - $recordModel->updateAssignedUser($user['id']); - } else { - $user = PBXManager_Record_Model::getUserInfoWithNumber($caller); - if ($user) { - $params['user'] = $user['id']; - $recordModel->updateAssignedUser($user['id']); - } - } + /* + * We dont know who caller - crm user or another human. We need check this and also check inner call + * when caller and answer numbers in crm but only one matches on record model + */ + $user = PBXManager_Record_Model::getUserInfoWithNumber($caller); + if(!$user) { + $user = PBXManager_Record_Model::getUserInfoWithNumber($answeredby); + /* If no one crm user for anyone caller - no process ring */ + if(!$user) { + return; + } + } + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid, $user); + $params['user'] = $user['id']; $params['callstatus'] = "in-progress"; - $recordModel->updateCallDetails($params); + $recordModel->updateCallDetails($params, $user); } /** @@ -137,14 +143,16 @@ class PBXManager_PBXManager_Connector { */ public function handleEndCall($details) { $callid = $details->get('callUUID'); - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid); $params['starttime'] = $details->get('starttime'); $params['endtime'] = $details->get('endtime'); $params['totalduration'] = $details->get('duration'); $params['billduration'] = $details->get('billableseconds'); - $recordModel->updateCallDetails($params); + $userNumber = $details->get('callerNumber'); + $user = PBXManager_Record_Model::getUserInfoWithNumber($userNumber); + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid, $user); + $recordModel->updateCallDetails($params, $user); } /** @@ -153,7 +161,12 @@ class PBXManager_PBXManager_Connector { */ public function handleHangupCall($details) { $callid = $details->get('callUUID'); - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid); + $userNumber = $details->get('callerIdNum'); + $user = PBXManager_Record_Model::getUserInfoWithNumber($userNumber); + if(!$user) { + return; + } + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid, $user); $hangupcause = $details->get('causetxt'); switch ($hangupcause) { @@ -175,12 +188,26 @@ class PBXManager_PBXManager_Connector { break; } + $totalDuration = $recordModel->get('totalduration'); + $endTime = $recordModel->get('endtime'); + $startTime = $recordModel->get('starttime'); + if(empty($totalDuration) && empty($endTime) && !empty($startTime)) { + $currentTime = time(); + $params['endtime'] = date("Y-m-d H:i:s", $currentTime); + $startTime = strtotime($startTime); + if($startTime) { + $totalDuration = $currentTime - $startTime; + if($totalDuration > 0) { + $params['totalduration'] = $totalDuration; + } + } + } if($details->get('EndTime') && $details->get('Duration')) { $params['endtime'] = $details->get('EndTime'); $params['totalduration'] = $details->get('Duration'); } - $recordModel->updateCallDetails($params); + $recordModel->updateCallDetails($params, $user); } /** @@ -189,9 +216,12 @@ class PBXManager_PBXManager_Connector { */ public function handleRecording($details) { $callid = $details->get('callUUID'); - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid); - $params['recordingurl'] = $details->get('recordinglink'); - $recordModel->updateCallDetails($params); + $userNumber = $details->get('callerNumber'); + $user = PBXManager_Record_Model::getUserInfoWithNumber($userNumber); + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($callid, $user); + $recordModel->updateCallDetails(array( + 'recordingurl' => $details->get('recordinglink') + ), $user); } /** @@ -201,7 +231,6 @@ class PBXManager_PBXManager_Connector { public function handleStartupCall($details, $userInfo, $customerInfo) { global $current_user; $params = $this->prepareParameters($details, self::RINGING_TYPE); - $direction = $details->get('Direction'); // To add customer and user information in params $params['Customer'] = $customerInfo['id']; @@ -217,15 +246,23 @@ class PBXManager_PBXManager_Connector { $params['starttime'] = $details->get('StartTime'); $params['callstatus'] = "ringing"; $user = CRMEntity::getInstance('Users'); - $current_user = $user->getActiveAdminUser(); + $current_user = $user->retrieveCurrentUserInfoFromFile($userInfo['id']); + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($params['SourceUUID'], $userInfo); + if($recordModel->get('pbxmanagerid') == null) { + $recordModel->saveRecordWithArrray($params); + } else { + $updateParams = array(); + $updateParams['user'] = $userInfo['id']; + $updateParams['callstatus'] = 'ringing'; + $updateParams['customertype'] = $params['CustomerType']; + $updateParams['customernumber'] = $params['CustomerNumber']; + $updateParams['customer'] = $customerInfo['id']; + + $recordModel->updateAssignedUser($userInfo['id']); + $recordModel->updateCallDetails($updateParams, $userInfo); + } - $recordModel = PBXManager_Record_Model::getCleanInstance(); - $recordModel->saveRecordWithArrray($params); - if ($direction == self::INCOMING_TYPE) - $this->respondToIncomingCall($details); - else - $this->respondToOutgoingCall($params['CustomerNumber']); } /** @@ -267,8 +304,10 @@ class PBXManager_PBXManager_Connector { $params['callstatus'] = 'no-answer'; $params['starttime'] = $date; $params['endtime'] = $date; - $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($details->get('callUUID')); - $recordModel->updateCallDetails($params); + $userNumber = $details->get('dialString'); + $user = PBXManager_Record_Model::getUserInfoWithNumber($userNumber); + $recordModel = PBXManager_Record_Model::getInstanceBySourceUUID($details->get('callUUID'), $user); + $recordModel->updateCallDetails($params, $user); } $response .= ''; echo $response; @@ -320,6 +359,9 @@ class PBXManager_PBXManager_Connector { $serviceURL .= 'from=' . urlencode($extension) . '&'; $serviceURL .= 'to=' . urlencode($number) . '&'; $serviceURL .= 'context='. urlencode($context); + $serviceURL .= '&record='. urlencode($record); + + $this->log($serviceURL, 'PBXManager-serviceURL'); $httpClient = new Vtiger_Net_Client($serviceURL); $response = $httpClient->doPost(array()); @@ -332,4 +374,8 @@ class PBXManager_PBXManager_Connector { return true; } + public function log($log, $file) { + if ($this->getlogPBXManager() == "1" ) + file_put_contents('logs/'.$file,'(' . date('Y-m-d H:i:s') . ') ' . print_r($log, true) . PHP_EOL , FILE_APPEND | LOCK_EX); + } } \ No newline at end of file diff --git a/modules/PBXManager/controllers/PBXManager.php b/modules/PBXManager/controllers/PBXManager.php index 8a462b4..cb645e8 100644 --- a/modules/PBXManager/controllers/PBXManager.php +++ b/modules/PBXManager/controllers/PBXManager.php @@ -38,14 +38,91 @@ class PBXManager_PBXManager_Controller { break; case "Hangup" : $callCause = $request->get('causetxt'); - if ($callCause == "null") { + if ($callCause == "null" || empty($callCause)) { break; } $this->processHangupCall($request); + break; + case "DialBegin" : + $this->processDialBeginCall($request); break; } } + // begin alternative start call detection mode + /** + * Function to process Incoming call request + * @params incoming call details + * return Response object + */ + function processDialBeginCall($request) { + $callerNumber = $request->get('callerIdNumber'); + + /* Get dialed number by caller. It has unified format so we need check variants */ + $destinationNumber = ''; + if(strpos($request->get('dialString'), "/") !== false) { + $dialParts = explode("/", $request->get('dialString')); + $destinationNumber = end($dialParts); + } elseif(strpos($request->get('dialString'), "@") !== false) { + $dialParts = explode("@", $request->get('dialString')); + $destinationNumber = $dialParts[0]; + } else { + $destinationNumber = $request->get('dialString'); + } + + /* If not Originate event - prepare begin of call */ + if($callerNumber != $destinationNumber && !empty($destinationNumber) && !empty($callerNumber)) { + $callerUserInfo = PBXManager_Record_Model::getUserInfoWithNumber($callerNumber); + + /* If caller number binded with crm user - it outgoing number */ + $connector = $this->getConnector(); + $log['time'] = $request->get('StartTime'); + $log['from'] = $callerNumber; + $log['to'] = $destinationNumber; + if ($callerUserInfo) { + $request->set('Direction', 'outbound'); + $request->set('to', $destinationNumber); + $customerInfo = PBXManager_Record_Model::lookUpRelatedWithNumber($destinationNumber, $callerUserInfo['id'],'outbound'); + $record = $request->get('record'); + if (!empty($record)) { + $customerInfo = PBXManager_Record_Model::lookUpRelatedWithRecord($record, $callerUserInfo['id']); + } + $from_details = $callerUserInfo; + $to_details = $customerInfo; + if(!is_array($customerInfo)){ + $log['from_details'] = $callerUserInfo; + $log['description'] = $destinationNumber . ' not found in vtiger. Outbound call ignored.'; + $connector->log($log , 'PBXManager-process'); + return; + } + $connector->handleStartupCall($request, $callerUserInfo, $customerInfo); + } else { + + /* If no match of twon numbers for crm users - don't fix ring */ + $crmUserInfo = PBXManager_Record_Model::getUserInfoWithNumber($destinationNumber); + if(!$crmUserInfo) { + $log['description'] = 'Destination ' . $destinationNumber . ' not found in vtiger. Call ignored.'; + $connector->log($log, 'PBXManager-process'); + return; + } + $request->set('Direction', 'inbound'); + $request->set('from', $request->get('callerIdNumber')); + $customerInfo = PBXManager_Record_Model::lookUpRelatedWithNumber($request->get('callerIdNumber'), $crmUserInfo['id'],'inbound'); + if(!is_array($customerInfo)){ + // Descomentar si se quiere ignorar las llamadas de clientes no registrados en CRM. No Popup de desconocidos. + // $connector->log('Inbound ' . $callerNumber . ' not found in vtiger. Call ignored.' , 'PBXManager-process'); + // return; + } + $from_details = $customerInfo; + $to_details = $crmUserInfo; + $connector->handleStartupCall($request, $crmUserInfo, $customerInfo); + } + $log['from_details']= $from_details; + $log['to_details'] = $to_details; + $log['direction'] = $request->get('Direction'); + $connector->log($log , 'PBXManager-process'); + } + } /** * Function to process Incoming call request * @params incoming call details diff --git a/modules/PBXManager/models/ListView.php b/modules/PBXManager/models/ListView.php index bf045b6..aa101b8 100644 --- a/modules/PBXManager/models/ListView.php +++ b/modules/PBXManager/models/ListView.php @@ -71,6 +71,15 @@ class PBXManager_ListView_Model extends Vtiger_ListView_Model { $listViewContoller = $this->get('listview_controller'); + $searchParams = $this->get('search_params'); + if(empty($searchParams)) { + $searchParams = array(); + } + $glue = ""; + if(count($queryGenerator->getWhereFields()) > 0 && (count($searchParams)) > 0) { + $glue = QueryGenerator::$AND; + } + $queryGenerator->parseAdvFilterList($searchParams, $glue); $searchKey = $this->get('search_key'); $searchValue = $this->get('search_value'); $operator = $this->get('operator'); @@ -168,7 +177,7 @@ class PBXManager_ListView_Model extends Vtiger_ListView_Model { $recordingUrl = explode('>', $listViewEntries[$recordId]['recordingurl']); $url = explode('<', $recordingUrl[1]); if ($url[0] != '' && $listViewEntries[$recordId]['callstatus'] == 'completed') { - $listViewEntries[$recordId]['recordingurl'] = $recordingUrl[0] . '>' . '' . ''; + $listViewEntries[$recordId]['recordingurl'] = ''; } else { $listViewEntries[$recordId]['recordingurl'] = ''; } @@ -176,33 +185,34 @@ class PBXManager_ListView_Model extends Vtiger_ListView_Model { if ($listViewEntries[$recordId]['direction'] == 'outbound') { if ($listViewEntries[$recordId]['callstatus'] == 'ringing' || $listViewEntries[$recordId]['callstatus'] == 'in-progress') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else if ($listViewEntries[$recordId]['callstatus'] == 'completed') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else if ($listViewEntries[$recordId]['callstatus'] == 'no-answer') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } } else if ($listViewEntries[$recordId]['direction'] == 'inbound') { if ($listViewEntries[$recordId]['callstatus'] == 'ringing' || $listViewEntries[$recordId]['callstatus'] == 'in-progress') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else if ($listViewEntries[$recordId]['callstatus'] == 'completed') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else if ($listViewEntries[$recordId]['callstatus'] == 'no-answer') { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } else { - $listViewEntries[$recordId]['callstatus'] = ' -  ' . $listViewEntries[$recordId]["callstatus"] . ''; + $listViewEntries[$recordId]['callstatus'] = ' +  ' . vtranslate($listViewEntries[$recordId]["callstatus"], $moduleName) . ''; } } + $listViewEntries[$recordId]['direction'] = vtranslate($listViewEntries[$recordId]['direction'], $moduleName); } //END diff --git a/modules/PBXManager/models/Module.php b/modules/PBXManager/models/Module.php index 7228ddf..1fb14a5 100644 --- a/modules/PBXManager/models/Module.php +++ b/modules/PBXManager/models/Module.php @@ -95,7 +95,7 @@ class PBXManager_Module_Model extends Vtiger_Module_Model { } public function isWorkflowSupported() { - return false; + return true; } function isStarredEnabled(){ diff --git a/modules/PBXManager/models/Record.php b/modules/PBXManager/models/Record.php index 6c9a106..3004f58 100644 --- a/modules/PBXManager/models/Record.php +++ b/modules/PBXManager/models/Record.php @@ -87,7 +87,7 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ * $param $callid * return true */ - public function updateCallDetails($details){ + public function updateCallDetails($details, $user = null){ $db = PearDatabase::getInstance(); $sourceuuid = $this->get('sourceuuid'); $query = 'UPDATE '.self::moduletableName.' SET '; @@ -98,6 +98,10 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ $query = substr_replace($query ,"",-1); $query .= ' WHERE sourceuuid = ?'; $params[] = $sourceuuid; + if($user) { + $query .= ' AND user = ?'; + $params[] = $user['id']; + } $db->pquery($query, $params); return true; } @@ -128,11 +132,15 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ return $record; } - public static function getInstanceBySourceUUID($sourceuuid){ + public static function getInstanceBySourceUUID($sourceuuid, $user = null){ $db = PearDatabase::getInstance(); $record = new self(); $query = 'SELECT * FROM '.self::moduletableName.' WHERE sourceuuid=?'; $params = array($sourceuuid); + if($user) { + $query .= ' AND user=?'; + $params[] = $user['id']; + } $result = $db->pquery($query, $params); $rowCount = $db->num_rows($result); if($rowCount){ @@ -142,6 +150,69 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ return $record; } + public static function updateCallRecordBySourceUUID($sourceuuid, $recordingUrl) { + $db = PearDatabase::getInstance(); + $query = 'UPDATE '.self::moduletableName.' SET recordingurl=? WHERE sourceuuid=?'; + $db->pquery($query, array($recordingUrl, $sourceuuid)); + } + + /** + * Returns pbx manager record model which matches for received end call details + * @param string $sourceuuid + * @return PBXManager_Record_Model + */ + public static function getModelForEndCallDetails($sourceuuid) { + $db = PearDatabase::getInstance(); + $query = "SELECT * FROM " . self::moduletableName . " WHERE sourceuuid=? AND callstatus IN('in-progress','completed')"; + + $params = array($sourceuuid); + $result = $db->pquery($query, $params); + $rowCount = $db->num_rows($result); + if($rowCount){ + $rowData = $db->query_result_rowdata($result, 0); + $record = new self(); + $record->setData($rowData); + + return $record; + } + + return null; + } + + /** + * Updates call details of pbx manager record model by it's id + * @param int $recordId + * @param array $details + */ + public static function updateCallDetailsByRecordId($recordId, $details) { + $db = PearDatabase::getInstance(); + $query = 'UPDATE '.self::moduletableName.' SET '; + $params = array(); + foreach($details as $key => $value){ + $query .= $key . '=?,'; + $params[] = $value; + } + $query = substr_replace($query ,"",-1); + $query .= ' WHERE pbxmanagerid=?'; + $params[] = $recordId; + + $db->pquery($query, $params); + } + + public static function updateCallDetailsBySourceUUID($sourceuuid, $details) { + $db = PearDatabase::getInstance(); + $query = 'UPDATE '.self::moduletableName.' SET '; + $params = array(); + foreach($details as $key => $value){ + $query .= $key . '=?,'; + $params[] = $value; + } + $query = substr_replace($query ,"",-1); + $query .= ' WHERE sourceuuid = ?'; + $params[] = $sourceuuid; + + $db->pquery($query, $params); + } /** * Function to save/update contact/account/lead record in Phonelookup table on every save * @param $details @@ -152,6 +223,12 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ $rnumber = strrev($fnumber); $db = PearDatabase::getInstance(); + /* Delete record if it null after filtering number */ + if($fnumber == '') { + $db->pquery('DELETE FROM ' . self::lookuptableName . ' where crmid=? AND fieldname=? AND setype=?', + array($recordid, $fieldName, $details['setype'])); + return true; + } $params = array($recordid, $details['setype'],$fnumber,$rnumber, $fieldName); $db->pquery('INSERT INTO '.self::lookuptableName. '(crmid, setype, fnumber, rnumber, fieldname) @@ -175,27 +252,67 @@ class PBXManager_Record_Model extends Vtiger_Record_Model{ * * Function to check the customer with number in phonelookup table * @param $from */ - public static function lookUpRelatedWithNumber($from){ + public static function lookUpRelatedWithNumber($from, $callAssignedIserId = null, $direction){ $db = PearDatabase::getInstance(); $fnumber = preg_replace('/[-()\s+]/', '',$from); - $rnumber = strrev($fnumber); - $result = $db->pquery('SELECT crmid, fieldname FROM '.self::lookuptableName.' WHERE fnumber LIKE "'. $fnumber . '%" OR rnumber LIKE "'. $rnumber . '%" ', array()); - if($db->num_rows($result)){ - $crmid = $db->query_result($result, 0, 'crmid'); - $fieldname = $db->query_result($result, 0, 'fieldname'); - $contact = $db->pquery('SELECT label,setype FROM '.self::entitytableName.' WHERE crmid=? AND deleted=0', array($crmid)); - if($db->num_rows($result)){ - $data['id'] = $crmid; - $data['name'] = $db->query_result($contact, 0, 'label'); - $data['setype'] = $db->query_result($contact, 0, 'setype'); - $data['fieldname'] = $fieldname; - return $data; + if($from == NULL) { + return; + } + /* Prepare entity search params and conditions */ + $numberSql = "?"; + $numberSqlArg = $fnumber; + if(strlen($fnumber) >= 10) { + $numberSql = '"%"?'; + $numberSqlArg = array(substr($fnumber, -10, 10)); + } + + $result = $db->pquery( + 'SELECT vtiger_crmentity.crmid AS id,vtiger_crmentity.label AS name,vtiger_crmentity.setype,vtiger_crmentity.smownerid, ' . + self::lookuptableName . '.fieldname FROM ' . self::lookuptableName . ' ' . + 'INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid=' . self::lookuptableName . '.crmid ' . + 'WHERE ' . self::lookuptableName . '.fnumber LIKE ' . $numberSql . ' AND vtiger_crmentity.deleted=0', + array($numberSqlArg) + ); + if ($db->num_rows($result)>1 && $direction == 'outbound') { + return; + } + + /* Search first entity data with match to assigned user if need */ + $callerEntityData = $db->fetchByAssoc($result); + if($callAssignedIserId != null && $callerEntityData['smownerid'] != $callAssignedIserId) { + while($row = $db->fetchByAssoc($result)) { + if($row['smownerid'] == $callAssignedIserId) { + $callerEntityData = $row; + break; + } } - else + } + return $callerEntityData; + } + public static function lookUpRelatedWithRecord($record, $callAssignedIserId = null){ + $db = PearDatabase::getInstance(); + if($record == NULL) { return; + } + $result = $db->pquery( + 'SELECT vtiger_crmentity.crmid AS id,vtiger_crmentity.label AS name,vtiger_crmentity.setype,vtiger_crmentity.smownerid, "mobile" as fieldname + FROM vtiger_crmentity + INNER JOIN vtiger_contactdetails ON vtiger_crmentity.crmid=vtiger_contactdetails.contactid + WHERE vtiger_crmentity.deleted=0 AND vtiger_crmentity.crmid=' . $record + ); + + /* Search first entity data with match to assigned user if need */ + $callerEntityData = $db->fetchByAssoc($result); + if($callAssignedIserId != null && $callerEntityData['smownerid'] != $callAssignedIserId) { + while($row = $db->fetchByAssoc($result)) { + if($row['smownerid'] == $callAssignedIserId) { + $callerEntityData = $row; + break; + } + } + } + return $callerEntityData; } - return; - } /** * Function to user details with number diff --git a/modules/PBXManager/resources/PBXManagerJS.js b/modules/PBXManager/resources/PBXManagerJS.js index c59c872..0d8f72c 100644 --- a/modules/PBXManager/resources/PBXManagerJS.js +++ b/modules/PBXManager/resources/PBXManagerJS.js @@ -8,6 +8,14 @@ *************************************************************************************/ var Vtiger_PBXManager_Js = { + showPnotify : function(customParams) { + return $.pnotify($.extend({ + sticker: false, + delay: '3000', + type: 'error', + pnotify_history: false + }, customParams)); + }, /** * Function registers PBX for popups */ @@ -27,6 +35,9 @@ var Vtiger_PBXManager_Js = { requestPBXgetCalls : function() { var url = 'index.php?module=PBXManager&action=IncomingCallPoll&mode=searchIncomingCalls'; app.request.get({url: url}).then(function(e, result){ + if (typeof result === 'string') { + location.href = 'index.php'; + } if(result) { for(i=0; i< result.length; i++) { var record = result[i]; @@ -44,12 +55,36 @@ var Vtiger_PBXManager_Js = { * Function display the PBX popup */ showPBXIncomingCallPopup : function(record) { + var contactFieldStyle = ((record.customer != null && record.customer != '') ? 'hide' : ''); var params = { - title: app.vtranslate('JS_PBX_INCOMING_CALL'), - message: '
'+app.vtranslate('JS_PBX_CALL_FROM')+' : '+record.customernumber+'\n\ -    
'+app.vtranslate('JS_PBX_FILL_ALL_FIELDS')+'
\n\ - \n\ -

', + 'message': app.vtranslate('JS_PBX_INCOMING_CALL'), + 'title': '
' + + ''+app.vtranslate('JS_PBX_CALL_FROM')+' : '+record.customernumber+''+ + '\n\ + \n\ +    \n\ +    \n\ +    \n\ +
Modulo: \n\ + \n\ +
\n\ +

\n\ + \n\ +
', + width: '28%', + min_height: '75px', + addclass:'vtCall', + icon: 'vtCall-icon', + hide : false, + closer : false, + type:'info', + after_open:function(p) { + jQuery(p).data('info', record); + } }; var settings = { delay: 0, @@ -58,8 +93,8 @@ var Vtiger_PBXManager_Js = { align: 'right' } }; - jQuery.notify(params, settings); + Vtiger_PBXManager_Js.showPnotify(params); //To remove the popup for all users except answeredby (existing record) if(record.user) { if(record.user != record.current_user_id) { @@ -82,7 +117,7 @@ var Vtiger_PBXManager_Js = { jQuery('#alert_msg').show(); return false; } - if(jQuery('#email_'+pbxmanagerid+'').val() == ""){ + if(jQuery('#lastname_'+pbxmanagerid+'').val() == ""){ jQuery('#alert_msg').show(); return false; } @@ -96,10 +131,12 @@ var Vtiger_PBXManager_Js = { createRecord: function(e, record) { var pbxmanagerid = jQuery(e.currentTarget).attr('recordid'); var email = jQuery('#email_'+pbxmanagerid+'').val(); + var firstname = jQuery('#firstname_'+pbxmanagerid+'').val(); + var lastname = jQuery('#lastname_' +pbxmanagerid+'').val(); var moduleName = jQuery('#module_'+pbxmanagerid+'').val(); var number = jQuery('#caller','#pbxcall_'+pbxmanagerid+'').attr("value"); - var url = 'index.php?module=PBXManager&action=IncomingCallPoll&mode=createRecord&number='+encodeURIComponent(number)+'&email='+encodeURIComponent(email)+'&callid='+record.sourceuuid+'&modulename='+moduleName; + var url = 'index.php?module=PBXManager&action=IncomingCallPoll&mode=createRecord&number='+encodeURIComponent(number)+'&email='+encodeURIComponent(email)+'&firstname='+encodeURIComponent(firstname)+'&lastname='+encodeURIComponent(lastname)+'&callid='+record.sourceuuid+'&modulename='+moduleName; app.request.get({url: url}).then(function(e, result){ if(result) { jQuery('#contactsave_'+pbxmanagerid+'').hide(); @@ -130,6 +167,8 @@ var Vtiger_PBXManager_Js = { }); break; default: jQuery('#caller','#pbxcall_'+record.pbxmanagerid+'').html(app.vtranslate('JS_PBX_CALL_FROM')+' : '+record.callername+''); + jQuery('#ownername','#pbxcall_'+record.pbxmanagerid+'').text(record.ownername); + jQuery('#owner','#pbxcall_'+record.pbxmanagerid+'').show(); break; } }, @@ -177,7 +216,7 @@ var Vtiger_PBXManager_Js = { * Function to remove call popup */ removeCallPopup: function(callid) { - jQuery('#pbxcall_'+callid+'').closest('.vt-notification').remove(); + jQuery('#pbxcall_'+callid+'').parent().parent().parent().remove(); }, /** @@ -201,7 +240,7 @@ var Vtiger_PBXManager_Js = { 'action' : 'OutgoingCall' } app.request.post({data: params}).then(function(e, result){ - if(result){ + if(!result.success){ params = { 'title' : app.vtranslate('JS_PBX_OUTGOING_SUCCESS'), 'type' : 'info' @@ -226,7 +265,9 @@ var Vtiger_PBXManager_Js = { app.request.get({url: url}).then(function(e, result){ if(result) { Vtiger_PBXManager_Js.registerPBXCall(); - //setInterval("Vtiger_PBXManager_Js.registerPBXCall()", 3000); + Visibility.every(4000, function () { + Vtiger_PBXManager_Js.registerPBXCall(); + }); } }); } diff --git a/modules/PBXManager/uitypes/Url.php b/modules/PBXManager/uitypes/Url.php new file mode 100644 index 0000000..a26fbf6 --- /dev/null +++ b/modules/PBXManager/uitypes/Url.php @@ -0,0 +1,24 @@ + - Template Name + */ + public function getTemplateName() { + return 'uitypes/Url.tpl'; + } + + public function getDisplayValue($value) { + return $value; + } +} \ No newline at end of file diff --git a/modules/PBXManager/views/Detail.php b/modules/PBXManager/views/Detail.php index 7854ee9..8d898c1 100644 --- a/modules/PBXManager/views/Detail.php +++ b/modules/PBXManager/views/Detail.php @@ -18,21 +18,26 @@ class PBXManager_Detail_View extends Vtiger_Detail_View{ return false; } + function process(\Vtiger_Request $request) { + $recordId = $request->get('record'); + $moduleName = $request->getModule(); + if (!$this->record) { + $this->record = Vtiger_DetailView_Model::getInstance($moduleName, $recordId); + } + $recordModel = $this->record->getRecord(); + + // To show recording link only if callstatus is 'completed' + if ($recordModel->get('callstatus') != 'completed') { + $recordModel->set('recordingurl', ''); + } + if ($recordModel->get('callstatus') == 'completed') { + $recordModel->set('recordingurl', ''); + } + parent::process($request); + } /* * Overided to convert totalduration to minutes */ - function preProcess(Vtiger_Request $request, $display=true) { - $recordId = $request->get('record'); - $moduleName = $request->getModule(); - if(!$this->record){ - $this->record = Vtiger_DetailView_Model::getInstance($moduleName, $recordId); - } - $recordModel = $this->record->getRecord(); - - // To show recording link only if callstatus is 'completed' - if($recordModel->get('callstatus') != 'completed') { - $recordModel->set('recordingurl', ''); - } - return parent::preProcess($request, true); - } } diff --git a/modules/Settings/PBXManager/models/Record.php b/modules/Settings/PBXManager/models/Record.php index f17988f..29e47a1 100644 --- a/modules/Settings/PBXManager/models/Record.php +++ b/modules/Settings/PBXManager/models/Record.php @@ -69,7 +69,7 @@ class Settings_PBXManager_Record_Model extends Settings_Vtiger_Record_Model { public function save() { $db = PearDatabase::getInstance(); - $parameters = ''; + $parameters = array(); $selectedGateway = $this->get('gateway'); $connector = new PBXManager_PBXManager_Connector; diff --git a/modules/Vtiger/models/RelationListView.php b/modules/Vtiger/models/RelationListView.php index 74e829b..0df40bb 100755 --- a/modules/Vtiger/models/RelationListView.php +++ b/modules/Vtiger/models/RelationListView.php @@ -373,6 +373,16 @@ class Vtiger_RelationListView_Model extends Vtiger_Base_Model { } } + if ($relationModuleName == 'PBXManager') { + $recordingUrl = $row['recordingurl']; + if (!empty($recordingUrl) && $row['callstatus'] == 'completed') { + $row['recordingurl'] = ''; + $newRow['recordingurl'] = $row['recordingurl']; + } else { + $newRow['recordingurl'] = ''; + $row['recordingurl'] = ''; + } + } $record = Vtiger_Record_Model::getCleanInstance($relationModule->get('name')); $record->setData($newRow)->setModuleFromInstance($relationModule)->setRawData($row); -- 2.17.1