I don't find information about how to add a new CID Superfecta source (my own custom programmed one) in FreePBX. Documentation doesn't say and there is no obvious method to do it in the FreePBX Administration interface. I only find options for adding new schemes (which are collections of sources).
How can I add a new source?
I want to do an HTTP GET, or preferably POST, to look up the caller ID.
Using FreePBX 14.0.2.10.
1 Answer
Use the FreePBX Module and add it.
One note, I made a modification to the CID Superfecta for FreePBX Asterisk to incorporate the ConnectWise ClientID and REST API.
You will be required to request access to the ConnectWise Developer Network and create a private ClientID.
The modification is to the php script located on the FreePBX server at /var/www/html/admin/modules/superfecta/sources/source-ConnectWise.module
This will check the CW Companies first for the phone number match, returning the Company Name, and then, if not found, the CW contacts, returning the contact First & Last Name.
Cut & Paste the below into the source-ConnectWise.module. Watch out for line returns for lines that should be 1 line, pasting as 2.
Please freely share this outside of CW Forums as long as I am still provided credit. There is a way to have a developer ClientID for mutiple installs.
<?php /***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** * Module Dev notes: * * * Revision History: * v0.1.0: Initial Release Version by myitguy * v0.1.1: Minor bug fix by bushbomb * v0.1.2: More bug fixes id'd by bushbomb * v0.1.3: Initial migration to 2.11 by lgaetz * 2014-08-22 Added user param to set the API version in the URL * 2015-05-01 Add field for user supplied CNAM prefix * 2018-06-30 Fix for bug FREEPBX-17727 * 2020-01-06 Modified by Clinton Pownall of Computer Business to * accommodate the ConnectWise REST API and the ConnectWise * Required ClientID. ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *****/ class ConnectWise extends superfecta_base { public $description = "Look up data in local or remote ConnectWise CRM."; public $version_requirement = "2.11"; public $source_param = array( 'DB_Site' => array( 'description' => 'ConnectWise Site URL not including the initial 'type' => 'text', ), 'DB_Company' => array( 'description' => 'ConnectWise Company ID', 'type' => 'text', ), 'DB_Public_Key' => array( 'description' => 'Integration Public Key Created in ConnectWise: Members -> API Members -> API Keys', 'type' => 'text', ), 'DB_Private_Key' => array( 'description' => 'Integration Private Key Created in ConnectWise: Members -> API Members -> API Keys', 'type' => 'password', ), 'DB_ClientID' => array( 'description' => 'Client ID created using the ConnectWise Developer Site, See https:// 'type' => 'password', ), 'Search_Type' => array( 'description' => 'The ConnectWise type of entries that should be used to match the number', 'type' => 'select', 'option' => array ( '1' => 'Companies Only', '2' => 'Contacts Only', '3' => 'Companies --> Contacts', ), 'default' => '3', ), 'Filter_Length' => array( 'description' => 'The number of rightmost digits to check for a match. Enter zero to disable this setting', 'type' => 'number', 'default' => 10 ), 'CNAM_prefix' => array( 'description' => 'This text will be prefixed to all CNAM returned by this module (optional)', 'type' => 'text', 'default' => null ), 'API_Version' => array( 'description' => 'The part of the URL excluding slashes following the host name that indicates the API version, e.g. "v2014_4" or "v4_6_release" (without quotes)', 'type' => 'text', 'default' => 'v2014_4', ), ); function get_caller_id($thenumber, $run_param=array()) { $caller_id = null; $site = $run_param['DB_Site']; $companyid = $run_param['DB_Company']; $APIPublicKey = $run_param['DB_Public_Key']; $APIPrivateKey = $run_param['DB_Private_Key']; $varSearchType = $run_param['Search_Type']; $clientid = $run_param['DB_ClientID']; $varSearchType = $run_param['Search_Type']; if ($run_param['API_Version']) { $apiver = $run_param['API_Version']; } else { $apiver = 'v4_6_release'; } $wquery_string = ""; $wquery_result = ""; $wresult_caller_name = ""; $this->DebugPrint("Searching ConnectWise ... "); if ($run_param['Filter_Length'] != 0) { if (strlen($thenumber) > $run_param['Filter_Length']) $thenumber = substr($thenumber, -$run_param['Filter_Length']); // keep only the filter_length rightmost digits } $APIEndpoint = ' .$site. '/'.$apiver.'/apis/3.0'; $APIkey = 'Basic ' . base64_encode($companyid . '+' . $APIPublicKey . ':' . $APIPrivateKey); // Search Companies if($run_param['Search_Type'] == 1 || $run_param['Search_Type'] == 3) { $this->DebugPrint("Searching Companies ... "); /* COMPANY */ $conditions='conditions=phoneNumber%20like%20%22'.$thenumber.'%22%20'; $url = '/company/companies?'.$conditions.'&fields=name&pageSize=1000'; $url = $APIEndpoint . $url; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HTTPHEADER, array('clientId:' . $clientid,'Authorization:'. $APIkey, 'Content-Type: application/json',)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLINFO_HEADER_OUT, true); $result = curl_exec($curl); if(!$result){die("Connection Failure");} curl_close($curl); $name=preg_split('/"*"/i', $result, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); if (!empty($name[3])) { $wresult_caller_name = $name[3]; } else { $this->DebugPrint("Not found in Companies... "); } } // Search Contacts if($run_param['Search_Type'] == 2 || $run_param['Search_Type'] == 3 && $wresult_caller_name =="") { $this->DebugPrint("Searching Contacts ... "); /* CONTACT */ $conditions='childconditions=communicationItems/value%20like%20%22'.$thenumber.'%22%20AND%20communicationItems/communicationType="Phone"'; $url = '/company/contacts?'.$conditions.'&fields=&pageSize=1000'; $url = $APIEndpoint . $url; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HTTPHEADER, array('clientId:' . $clientid,'Authorization:'. $APIkey, 'Content-Type: application/json',)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLINFO_HEADER_OUT, true); $result = curl_exec($curl); if(!$result){die("Connection Failure");} curl_close($curl); $name=preg_split('/"*"/i', $result, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);; if (!empty($name[9])) { $wresult_caller_name = $name[5]." ".$name[9]; } } if ($wresult_caller_name =="") { $this->DebugPrint("Not found in Contacts... "); } if(strlen($wresult_caller_name) > 0) { $caller_id = $run_param['CNAM_prefix'].trim(strip_tags($wresult_caller_name)); return $run_param['CNAM_prefix'].$caller_id; } else { $this->DebugPrint("Not found in ConneceWise"); } } } ?>