From 8ce558702ae8d1bb699769aec609fd72d1a8b88d Mon Sep 17 00:00:00 2001 From: FusionPBX Date: Sat, 16 Jul 2022 23:31:29 -0600 Subject: [PATCH] Add destination conditions. --- app/destinations/destination_edit.php | 142 ++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 10 deletions(-) diff --git a/app/destinations/destination_edit.php b/app/destinations/destination_edit.php index 9ec7c8c0db..a5c7c85dc0 100644 --- a/app/destinations/destination_edit.php +++ b/app/destinations/destination_edit.php @@ -99,6 +99,7 @@ $destination_caller_id_number = $_POST["destination_caller_id_number"]; $destination_cid_name_prefix = $_POST["destination_cid_name_prefix"]; $destination_context = $_POST["destination_context"]; + $destination_conditions = $_POST["destination_conditions"]; $destination_actions = $_POST["destination_actions"]; $fax_uuid = $_POST["fax_uuid"]; $provider_uuid = $_POST["provider_uuid"]; @@ -120,6 +121,21 @@ $destination_type_text = $_POST["destination_type_text"]; $destination_type_emergency = $_POST["destination_type_emergency"]; $destination_carrier = $_POST["destination_carrier"]; + + //sanitize the destination conditions + if (is_array($destination_conditions)) { + $i=0; + foreach($destination_conditions as $row) { + if (isset($row['condition_expression']) && strlen($row['condition_expression']) > 0) { + if ($row['condition_field'] == 'caller_id_number') { + $row['condition_expression'] = preg_replace('#[^\+0-9\*]#', '', $row['condition_expression']); + $conditions[$i]['condition_field'] = $row['condition_field']; + $conditions[$i]['condition_expression'] = $row['condition_expression']; + $i++; + } + } + } + } } //process the http post @@ -424,6 +440,20 @@ //build the xml dialplan $dialplan["dialplan_xml"] = "\n"; + + //add the dialplan xml destination conditions + if (is_array($conditions)) { + foreach($conditions as $row) { + if (is_numeric($row['condition_expression']) && strlen($destination_number) == strlen($row['condition_expression']) && strlen($destination_prefix) > 0) { + $condition_expression = '\+?'.$destination_prefix.'?'.$row['condition_expression']; + } + else { + $condition_expression = str_replace("+", "\+", $row['condition_expression']); + } + $dialplan["dialplan_xml"] .= " \n"; + } + } + $dialplan["dialplan_xml"] .= " \n"; $dialplan["dialplan_xml"] .= " \n"; $dialplan["dialplan_xml"] .= " \n"; @@ -468,10 +498,8 @@ foreach($destination_actions as $action) { $action_array = explode(":", $action, 2); if (isset($action_array[1]) && $action_array[1] != '') { - $destination_app = $action_array[0]; - $destination_data = $action_array[1]; - if ($destination->valid($destination_app.':'.$destination_data)) { - $dialplan["dialplan_xml"] .= " \n"; + if ($destination->valid($action_array[0].':'.$action_array[1])) { + $dialplan["dialplan_xml"] .= " \n"; } } } @@ -482,12 +510,40 @@ //dialplan details if ($_SESSION['destinations']['dialplan_details']['boolean'] == "true") { + //set initial value of the row id + $y=0; + //increment the dialplan detail order $dialplan_detail_order = $dialplan_detail_order + 10; + //add the dialplan detail destination conditions + if (is_array($conditions)) { + foreach($conditions as $row) { + //prepare the expression + if (is_numeric($row['condition_expression']) && strlen($destination_number) == strlen($row['condition_expression']) && strlen($destination_prefix) > 0) { + $condition_expression = '\+?'.$destination_prefix.'?'.$row['condition_expression']; + } + else { + $condition_expression = str_replace("+", "\+", $row['condition_expression']); + } + + //add to the dialplan_details array + $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; + $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "condition"; + $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $row['condition_field']; + $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = '^'.$condition_expression.'$'; + $dialplan["dialplan_details"][$y]["dialplan_detail_order"] = $dialplan_detail_order; + $y++; + + //increment the dialplan detail order + $dialplan_detail_order = $dialplan_detail_order + 10; + } + } + //check the destination number - $y=0; $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "condition"; if (strlen($destination_condition_field) > 0) { $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $destination_condition_field; @@ -509,6 +565,7 @@ if ($destination_app == 'bridge') { //add hangup_after_bridge $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "hangup_after_bridge=true"; @@ -521,6 +578,7 @@ //add continue_on_fail $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "continue_on_fail=true"; @@ -535,6 +593,7 @@ //set the caller id name prefix if (strlen($destination_cid_name_prefix) > 0) { $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "effective_caller_id_name=".$destination_cid_name_prefix."#\${caller_id_name}"; @@ -549,6 +608,7 @@ //set the call accountcode if (strlen($destination_accountcode) > 0) { $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "export"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "accountcode=".$destination_accountcode; @@ -563,6 +623,7 @@ //set the call carrier if (strlen($destination_carrier) > 0) { $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "carrier=$destination_carrier"; @@ -577,6 +638,7 @@ //set the hold music if (strlen($destination_hold_music) > 0) { $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "export"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "hold_music=".$destination_hold_music; @@ -588,6 +650,7 @@ //set the distinctive ring if (strlen($destination_distinctive_ring) > 0) { $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "export"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "sip_h_Alert-Info=".$destination_distinctive_ring; @@ -601,6 +664,7 @@ //add set tone detect_hits=1 $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "tone_detect_hits=1"; @@ -613,6 +677,7 @@ //execute on tone detect $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "execute_on_tone_detect=transfer ".$fax_extension." XML \${domain_name}"; @@ -625,6 +690,7 @@ //add tone_detect fax 1100 r +5000 $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "tone_detect"; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "fax 1100 r +5000"; @@ -729,6 +795,7 @@ if ($destination->valid($action_app.':'.$action_data)) { //add to the dialplan_details array $dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid; + $dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid; $dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action"; $dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $action_app; $dialplan["dialplan_details"][$y]["dialplan_detail_data"] = $action_data; @@ -807,6 +874,15 @@ $array['destinations'][$x]["destination_type_emergency"] = $destination_type_emergency ? 1 : null; } + //prepare the destination_conditions json + if (is_array($conditions)) { + $array['destinations'][$x]["destination_conditions"] = json_encode($conditions); + unset($conditions); + } + else { + $array['destinations'][$x]["destination_conditions"] = ''; + } + //prepare the $actions array $y=0; foreach($destination_actions as $action) { @@ -957,6 +1033,7 @@ $destination_type_text = $row["destination_type_text"]; $destination_type_emergency = $row["destination_type_emergency"]; $destination_context = $row["destination_context"]; + $destination_conditions = $row["destination_conditions"]; $destination_actions = $row["destination_actions"]; $fax_uuid = $row["fax_uuid"]; $provider_uuid = $row["provider_uuid"]; @@ -976,8 +1053,21 @@ } //decode the json to an array + $destination_conditions = json_decode($destination_conditions, true); $destination_actions = json_decode($destination_actions, true); +//prepare the conditions array, add an empty row + if (is_array($destination_conditions)) { + $i=0; + foreach ($destination_conditions as $row) { $i++; } + $destination_conditions[$i]['condition_field'] = ''; + $destination_conditions[$i]['condition_expression'] = ''; + } + else { + $destination_conditions[0]['condition_field'] = ''; + $destination_conditions[0]['condition_expression'] = ''; + } + //get the dialplan details in an array $sql = "select * from v_dialplan_details "; $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; @@ -1185,7 +1275,7 @@ switch ($destination_type) { case "inbound" : $selected[0] = "selected='selected'"; break; case "outbound" : $selected[1] = "selected='selected'"; break; - case "local" : $selected[2] = "selected='selected'"; break; + case "local" : $selected[2] = "selected='selected'"; break; } echo " \n"; echo " \n"; @@ -1312,21 +1402,51 @@ echo "\n"; } + //destination conditions + if (permission_exists('destination_conditions')) { + echo "\n"; + echo "\n"; + echo " ".$text['label-destination_conditions']."\n"; + echo "\n"; + echo "\n"; + $x=0; + foreach ($destination_conditions as $row) { + echo " \n"; + echo " \n"; + echo "
\n"; + $x++; + } + echo " ".$text['description-destination_conditions']."\n"; + echo "\n"; + echo "\n"; + } + //destination actions echo "\n"; echo "\n"; - echo " ".$text['label-detail_action']."\n"; + echo " ".$text['label-destination_actions']."\n"; echo "\n"; echo "\n"; $x=0; foreach($destination_actions as $row) { +//view_array($row, false); echo $destination->select('dialplan', "destination_actions[$x]", $row['destination_app'].':'.$row['destination_data']); echo "
\n"; $x++; } - - //destination action echo $destination->select('dialplan', "destination_actions[$x]", ''); + echo "
\n"; + echo " ".$text['description-destination_actions']."\n"; + echo "\n"; + echo "\n"; //fax destinations if (permission_exists('destination_fax')) { @@ -1462,6 +1582,7 @@ } echo " \n"; echo "
\n"; + echo $text['description-destination_record']."\n"; echo "\n"; echo "\n"; } @@ -1580,7 +1701,8 @@ $i++; } echo " \n"; - echo "
\n"; + echo "
\n"; + echo $text['description-destination_order']."\n"; echo " \n"; echo " \n";