From d6f2ac28f5192e2cccb03cdbcb015b5c3263cdb2 Mon Sep 17 00:00:00 2001 From: frytimo Date: Wed, 13 May 2026 14:37:57 +0000 Subject: [PATCH] Add call flows to feature codes (#7972) * Add call flows to feature codes * Refactor permission checks for feature codes --- app/feature_codes/feature_codes.php | 24 +++++--------- .../resources/classes/feature_codes.php | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/app/feature_codes/feature_codes.php b/app/feature_codes/feature_codes.php index 4131e4dd4..75a908941 100644 --- a/app/feature_codes/feature_codes.php +++ b/app/feature_codes/feature_codes.php @@ -62,19 +62,8 @@ $order_by = $_GET["order_by"] ?? ''; $order = $_GET["order"] ?? ''; -//get feature codes from dialplans - $sql = "SELECT dialplan_uuid, dialplan_name, dialplan_number, dialplan_description "; - if (permission_exists('feature_codes_raw')) { - $sql .= ", dialplan_xml "; - } - $sql .= "FROM v_dialplans "; - $sql .= "WHERE dialplan_enabled = 'true' "; - $sql .= "AND dialplan_number LIKE '*%' "; - $sql .= "AND (domain_uuid = :domain_uuid OR domain_uuid IS NULL) "; - $sql .= order_by($order_by, $order, 'dialplan_number', 'asc'); - $parameters['domain_uuid'] = $_SESSION['domain_uuid']; - $features = $database->select($sql, $parameters, 'all'); - unset($sql, $parameters); +//get feature codes from dialplans and call flows + $features = feature_codes::fetch_features($database, permission_exists('feature_codes_raw')); //handle PDF export if (isset($_GET['export']) && $_GET['export'] == 'pdf' && permission_exists('feature_codes_export')) { @@ -108,18 +97,20 @@ $pdf->Cell($col_widths[3], 8, $text['label-raw_dialplan'], 1, 1, 'L', true); } else { + $feature_code = $row['feature_code'] ?? ''; $col_widths = array(30, 50, 110); $pdf->Cell($col_widths[0], 8, $text['label-feature_code'], 1, 0, 'L', true); $pdf->Cell($col_widths[1], 8, $text['label-feature_name'], 1, 0, 'L', true); $pdf->Cell($col_widths[2], 8, $text['label-description'], 1, 1, 'L', true); } + $feature_code = $row['feature_code'] ?? ''; //table rows $pdf->SetFont('Arial', '', 9); if (is_array($features) && count($features) > 0) { foreach ($features as $row) { //set the feature dialing code eg. *67 - $feature_code = $row['dialplan_number'] ?? ''; + $feature_code = $row['feature_code'] ?? ''; $dialplan_name = $row['dialplan_name'] ?? ''; @@ -141,6 +132,7 @@ $raw_value .= '...'; } + echo th_order_by('feature_code', $text['label-feature_code'], $order_by, $order); //calculate row height by measuring actual text width $desc_width = $col_widths[2] - 2; //account for cell padding $line_height = 5; @@ -314,7 +306,7 @@ echo "
\n"; echo "\n"; echo "\n"; - echo th_order_by('dialplan_number', $text['label-feature_code'], $order_by, $order); + echo th_order_by('feature_code', $text['label-feature_code'], $order_by, $order); echo th_order_by('dialplan_name', $text['label-feature_name'], $order_by, $order); echo " \n"; if (permission_exists('feature_codes_raw')) { @@ -325,7 +317,7 @@ if (is_array($features) && count($features) > 0) { foreach ($features as $row) { //set the feature dialing code eg. *67 - $feature_code = $row['dialplan_number'] ?? ''; + $feature_code = $row['feature_code'] ?? ''; $dialplan_name = $row['dialplan_name'] ?? ''; diff --git a/app/feature_codes/resources/classes/feature_codes.php b/app/feature_codes/resources/classes/feature_codes.php index f7837d130..e3c392c8a 100644 --- a/app/feature_codes/resources/classes/feature_codes.php +++ b/app/feature_codes/resources/classes/feature_codes.php @@ -52,6 +52,39 @@ class feature_codes { return 'Features Report'; } + /** + * Fetch feature code rows from the dialplan and call flows tables. + * + * Dialplan entries whose number begins with '*' are included. Call flows + * that have a feature code set are joined in and that code is used in + * place of the dialplan number. + * + * @param database $database Database instance to use for the query. + * @param bool $include_raw Include the raw dialplan_xml column. + * + * @return array Array of associative rows, or an empty array. + */ + public static function fetch_features(database $database, bool $include_raw = false): array { + $domain_uuid = $_SESSION['domain_uuid'] ?? ''; + $order_by = $_GET['order_by'] ?? ''; + $order = $_GET['order'] ?? ''; + $sql = "SELECT d.dialplan_uuid, d.dialplan_name, "; + $sql .= "COALESCE(NULLIF(cf.call_flow_feature_code, ''), d.dialplan_number) AS feature_code, "; + $sql .= "COALESCE(cf.call_flow_description, d.dialplan_description) AS dialplan_description "; + if ($include_raw) { + $sql .= ", d.dialplan_xml "; + } + $sql .= "FROM v_dialplans d "; + $sql .= "LEFT JOIN v_call_flows cf ON cf.dialplan_uuid = d.dialplan_uuid "; + $sql .= "WHERE d.dialplan_enabled = 'true' "; + $sql .= "AND (d.dialplan_number LIKE '*%' OR NULLIF(cf.call_flow_feature_code, '') IS NOT NULL) "; + $sql .= "AND (d.domain_uuid = :domain_uuid OR d.domain_uuid IS NULL) "; + $sql .= order_by($order_by, $order, 'feature_code', 'asc'); + $parameters['domain_uuid'] = $domain_uuid; + $result = $database->select($sql, $parameters, 'all'); + return is_array($result) ? $result : []; + } + public function display(): void { echo $this->render(); return;
".$text['label-description']."