Add music on hold map

This commit is contained in:
FusionPBX
2026-04-04 19:09:45 +00:00
committed by GitHub
parent f998ff9b2a
commit fabfefa9bb
4 changed files with 481 additions and 1 deletions
+77 -1
View File
@@ -1377,4 +1377,80 @@ $text['button-clear']['zh-cn'] = "清除";
$text['button-clear']['ja-jp'] = "クリア";
$text['button-clear']['ko-kr'] = "분명한";
?>
$text['title-music_on_hold_map']['en-us'] = 'Music on Hold Map';
$text['title-music_on_hold_map']['en-gb'] = 'Music on Hold Map';
$text['title-music_on_hold_map']['ar-eg'] = 'خريطة الموسيقى أثناء الانتظار';
$text['title-music_on_hold_map']['de-at'] = 'Wartemusik-Karte';
$text['title-music_on_hold_map']['de-ch'] = 'Wartemusik-Karte';
$text['title-music_on_hold_map']['de-de'] = 'Wartemusik-Karte';
$text['title-music_on_hold_map']['el-gr'] = 'Χάρτης Μουσικής Αναμονής';
$text['title-music_on_hold_map']['es-cl'] = 'Mapa de Música en Espera';
$text['title-music_on_hold_map']['es-mx'] = 'Mapa de Música en Espera';
$text['title-music_on_hold_map']['fr-ca'] = 'Carte de la musique en attente';
$text['title-music_on_hold_map']['fr-fr'] = 'Carte de la musique en attente';
$text['title-music_on_hold_map']['he-il'] = 'מפת המוזיקה בהמתנה';
$text['title-music_on_hold_map']['it-it'] = 'Mappa Musica in Attesa';
$text['title-music_on_hold_map']['nl-nl'] = 'Wachtmuziekkaart';
$text['title-music_on_hold_map']['pl-pl'] = 'Mapa muzyki na czekanie';
$text['title-music_on_hold_map']['pt-br'] = 'Mapa de Música em Espera';
$text['title-music_on_hold_map']['pt-pt'] = 'Mapa de Música em Espera';
$text['title-music_on_hold_map']['ro-ro'] = 'Hartă Muzică în Așteptare';
$text['title-music_on_hold_map']['ru-ru'] = 'Карта музыки на удержании';
$text['title-music_on_hold_map']['sv-se'] = 'Väntemusik-karta';
$text['title-music_on_hold_map']['uk-ua'] = 'Карта музики на утриманні';
$text['title-music_on_hold_map']['tr-tr'] = 'Bekleme Müziği Haritası';
$text['title-music_on_hold_map']['zh-cn'] = '音乐保持地图';
$text['title-music_on_hold_map']['ja-jp'] = '保留音楽マップ';
$text['title-music_on_hold_map']['ko-kr'] = '보류 음악 맵';
$text['title_description-music_on_hold_map']['en-us'] = 'The music on hold map is searchable directory of all locations where hold music is being used. It simplifies maintenance by offering a centralized view of these locations to update them as needed.';
$text['title_description-music_on_hold_map']['en-gb'] = 'The music on hold map is a searchable directory of all locations where hold music is being used. It simplifies maintenance by providing a centralised view of these locations to update them as needed.';
$text['title_description-music_on_hold_map']['ar-eg'] = 'خريطة الموسيقى أثناء الانتظار هي دليل قابل للبحث يحتوي على جميع المواقع التي تستخدم الموسيقى أثناء الانتظار. تبسط الصيانة من خلال توفير رؤية مركزية لهذه المواقع لتحديثها حسب الحاجة.';
$text['title_description-music_on_hold_map']['de-at'] = 'Die Musik-auf-Warteliste-Karte ist ein durchsuchbares Verzeichnis aller Standorte, an denen Wartemusik verwendet wird. Sie vereinfacht die Wartung, indem sie eine zentrale Übersicht dieser Standorte bietet, um sie bei Bedarf zu aktualisieren.';
$text['title_description-music_on_hold_map']['de-ch'] = 'Die Musik-auf-Warteliste-Karte ist ein durchsuchbares Verzeichnis aller Standorte, an denen Wartemusik verwendet wird. Sie vereinfacht die Wartung, indem sie eine zentrale Übersicht dieser Standorte bietet, um sie bei Bedarf zu aktualisieren.';
$text['title_description-music_on_hold_map']['de-de'] = 'Die Musik-auf-Warteliste-Karte ist ein durchsuchbares Verzeichnis aller Standorte, an denen Wartemusik verwendet wird. Sie vereinfacht die Wartung, indem sie eine zentrale Übersicht dieser Standorte bietet, um sie bei Bedarf zu aktualisieren.';
$text['title_description-music_on_hold_map']['el-gr'] = 'Ο χάρτης μουσικής αναμονής είναι ένα αναζητήσιμο καταλόγιο όλων των τοποθεσιών όπου χρησιμοποιείται μουσική αναμονής. Απλοποιεί τη συντήρηση παρέχοντας μια κεντρική θέα αυτών των τοποθεσιών για να τις ενημερώσετε όπως χρειάζεται.';
$text['title_description-music_on_hold_map']['es-cl'] = 'El mapa de música en espera es un directorio buscable de todas las ubicaciones donde se utiliza música en espera. Simplifica el mantenimiento ofreciendo una vista centralizada de estas ubicaciones para actualizarlas según sea necesario.';
$text['title_description-music_on_hold_map']['es-mx'] = 'El mapa de música en espera es un directorio buscable de todas las ubicaciones donde se utiliza música en espera. Simplifica el mantenimiento al ofrecer una vista centralizada de estas ubicaciones para actualizarlas según sea necesario.';
$text['title_description-music_on_hold_map']['fr-ca'] = 'La carte de la musique en attente est un répertoire consultable de tous les endroits où de la musique en attente est utilisée. Elle simplifie la maintenance en offrant une vue centralisée de ces endroits pour les mettre à jour selon les besoins.';
$text['title_description-music_on_hold_map']['fr-fr'] = 'La carte de la musique en attente est un répertoire consultable de tous les endroits où de la musique en attente est utilisée. Elle simplifie la maintenance en offrant une vue centralisée de ces endroits pour les mettre à jour selon les besoins.';
$text['title_description-music_on_hold_map']['he-il'] = 'מפת המוזיקה בזמן המתנה היא מדריך חיפושי של כל המיקומים בהם משתמשים במוזיקה בזמן המתנה. היא מקלה על התחזוקה על ידי ספקת תצוגה מרכזית של מיקומים אלה לעדכן אותם לפי הצורך.';
$text['title_description-music_on_hold_map']['it-it'] = 'La mappa della musica in attesa è un directory ricercabile di tutte le località in cui viene utilizzata la musica in attesa. Semplifica la manutenzione offrendo una visualizzazione centralizzata di queste località per aggiornarle secondo necessità.';
$text['title_description-music_on_hold_map']['nl-nl'] = 'De muziek op wachtlijstkaart is een doorzoekbaar register van alle locaties waar wachtmuziek wordt gebruikt. Het vereenvoudigt het onderhoud door een centrale weergave van deze locaties te bieden om ze bij te werken wanneer nodig.';
$text['title_description-music_on_hold_map']['pl-pl'] = 'Mapa muzyki na czekaniu to wyszukiwalny katalog wszystkich lokalizacji, w których używana jest muzyka na czekaniu. Ułatwia konserwację, oferując centralny widok tych lokalizacji, aby można je było zaktualizować w razie potrzeby.';
$text['title_description-music_on_hold_map']['pt-br'] = 'O mapa de música em espera é um diretório pesquisável de todos os locais onde música em espera está sendo usada. Simplifica a manutenção oferecendo uma visão centralizada desses locais para atualizá-los conforme necessário.';
$text['title_description-music_on_hold_map']['pt-pt'] = 'O mapa de música em espera é um diretório pesquisável de todos os locais onde música em espera está a ser utilizada. Simplifica a manutenção ao fornecer uma visão centralizada destes locais para os atualizar conforme necessário.';
$text['title_description-music_on_hold_map']['ro-ro'] = 'Harta muzicii în așteptare este un director de căutare al tuturor locațiilor unde este utilizată muzica în așteptare. Simplifică întreținerea prin oferirea unei vizualizări centralizate a acestor locații pentru a le actualiza după cum este necesar.';
$text['title_description-music_on_hold_map']['ru-ru'] = 'Карта музыки на удержании — это поисковый справочник всех мест, где используется музыка на удержании. Она упрощает обслуживание, предоставляя централизованный обзор этих мест для их обновления по мере необходимости.';
$text['title_description-music_on_hold_map']['sv-se'] = 'Musiken på väntelistan-kartan är en sökbar katalog över alla platser där väntemusik används. Den förenklar underhållet genom att erbjuda en centraliserad vy av dessa platser för att uppdatera dem vid behov.';
$text['title_description-music_on_hold_map']['uk-ua'] = 'Карта музики на утриманні — це пошуковий довідник усіх місць, де використовується музика на утриманні. Вона спрощує обслуговування, надаючи централізований огляд цих місць для їх оновлення за необхідності.';
$text['title_description-music_on_hold_map']['tr-tr'] = 'Bekleme müziği haritası, bekleme müziği kullanılan tüm konumların aranabilir bir rehberidir. Bu konumların ihtiyaç duyulduğunda güncellenebilmesi için merkezi bir görünüm sağlayarak bakım işlemlerini basitleştirir.';
$text['title_description-music_on_hold_map']['zh-cn'] = '音乐保持地图是一个可搜索的目录,包含所有使用保持音乐的位置。它通过提供这些位置的集中视图来简化维护,以便根据需要更新它们。';
$text['title_description-music_on_hold_map']['ja-jp'] = '保留音楽マップは、保留音楽が使用されているすべての場所の検索可能なディレクトリです。これは、必要に応じてこれらの場所を更新するために、それらの場所の集中管理ビューを提供することで、メンテナンスを簡素化します。';
$text['title_description-music_on_hold_map']['ko-kr'] = '보류 음악 맵은 보류 음악이 사용되는 모든 위치의 검색 가능한 디렉토리입니다. 필요에 따라 이러한 위치를 업데이트할 수 있도록 중앙 집중식 뷰를 제공하여 유지 보수를 간소화합니다.';
$text['label-music']['en-us'] = 'Music';
$text['label-music']['en-gb'] = 'Music';
$text['label-music']['ar-eg'] = 'موسيقى';
$text['label-music']['de-at'] = 'Musik';
$text['label-music']['de-ch'] = 'Musik';
$text['label-music']['de-de'] = 'Musik';
$text['label-music']['el-gr'] = 'Μουσική';
$text['label-music']['es-cl'] = 'Música';
$text['label-music']['es-mx'] = 'Música';
$text['label-music']['fr-ca'] = 'Musique';
$text['label-music']['fr-fr'] = 'Musique';
$text['label-music']['he-il'] = 'מוזיקה';
$text['label-music']['it-it'] = 'Musica';
$text['label-music']['nl-nl'] = 'Muziek';
$text['label-music']['pl-pl'] = 'Muzyka';
$text['label-music']['pt-br'] = 'Música';
$text['label-music']['pt-pt'] = 'Música';
$text['label-music']['ro-ro'] = 'Muzică';
$text['label-music']['ru-ru'] = 'Музыка';
$text['label-music']['sv-se'] = 'Musik';
$text['label-music']['uk-ua'] = 'Музика';
$text['label-music']['tr-tr'] = 'Müzik';
$text['label-music']['zh-cn'] = '音乐';
$text['label-music']['ja-jp'] = '音楽';
$text['label-music']['ko-kr'] = '음악';
+1
View File
@@ -380,6 +380,7 @@
echo "<input name='action' type='hidden' value='upload'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$settings->get('theme', 'button_icon_add'),'id'=>'btn_add','onclick'=>"$(this).fadeOut(250, function(){ ".$modify_add_action." $('span#form_upload').fadeIn(250); });"]);
echo button::create(['type'=>'button','label'=>$text['button-map'],'icon'=>$settings->get('theme', 'button_icon_map'),'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'music_on_hold_map.php']);
echo "<span id='form_upload' style='display: none;'>";
echo button::create(['label'=>$text['button-cancel'],'icon'=>$settings->get('theme', 'button_icon_cancel'),'type'=>'button','id'=>'btn_upload_cancel','onclick'=>"$('span#form_upload').fadeOut(250, function(){ name_mode('select'); document.getElementById('form_upload').reset(); $('#btn_add').fadeIn(250) });"]);
//name (category)
+286
View File
@@ -0,0 +1,286 @@
<?php
/*
FusionPBX
Version: MPL 1.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
The Original Code is FusionPBX
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2026
the Initial Developer. All Rights Reserved.
*/
//set the include path
$conf = glob("{/usr/local/etc,/etc}/fusionpbx/config.conf", GLOB_BRACE);
set_include_path(parse_ini_file($conf[0])['document.root']);
//includes files
require_once "resources/require.php";
require_once "resources/check_auth.php";
//check permissions
if (!permission_exists('music_on_hold_add)) {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//connect to the database
$database = database::new();
//add the settings object
$settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]);
//set from session variables
$list_row_edit_button = $settings->get('theme', 'list_row_edit_button', 'false');
//get order and order by
$order_by = $_GET["order_by"] ?? null;
$order = $_GET["order"] ?? null;
//define the variables
$search = '';
$show = '';
$list_row_url = '';
//add the search variable
if (!empty($_GET["search"])) {
$search = strtolower($_GET["search"]);
}
//add the show variable
if (!empty($_GET["show"])) {
$show = $_GET["show"];
}
//prepare the excluded applications array based on permission exists
$excluded_app_array = [];
if (!permission_exists('extension_view')) {
$excluded_app_array[] = 'extensions';
}
if (!permission_exists('ring_group_view')) {
$excluded_app_array[] = 'ring_groups';
}
if (!permission_exists('ivr_menu_view')) {
$excluded_app_array[] = 'ivr_menus';
}
if (!permission_exists('call_center_queue_view')) {
$excluded_app_array[] = 'call_center_queues';
}
if (!permission_exists('fifo_view')) {
$excluded_app_array[] = 'fifo';
}
if (!permission_exists('destination_view')) {
$excluded_app_array[] = 'destinations';
}
if (!permission_exists('dialplan_view')) {
$excluded_app_array[] = 'dialplans';
}
$excluded_applications = implode(',', $excluded_app_array);
//get the music on hold map
$sql = "select ";
$sql .= " application, ";
$sql .= " type, ";
$sql .= " uuid, ";
$sql .= " domain_uuid, ";
$sql .= " domain_name, ";
$sql .= " name, ";
$sql .= " number, ";
$sql .= " music, ";
$sql .= " description \n";
$sql .= "from view_music_on_hold_map \n";
$sql .= "where true \n";
if (!empty($show) && $show === "all" && permission_exists('dialplan_all')) {
//show all
}
else {
$sql .= "and domain_uuid = :domain_uuid \n";
$parameters['domain_uuid'] = $domain_uuid;
}
if (!empty($search)) {
$sql .= "and ( \n";
$sql .= " application like :search \n";
$sql .= " or name like :search \n";
$sql .= " or number like :search \n";
$sql .= " or music like :search \n";
$sql .= " or description like :search \n";
$sql .= ") \n";
$parameters['search'] = '%'.$search.'%';
}
if (!empty($excluded_applications)) {
$sql .= "AND application NOT IN ('" . implode("','", $excluded_app_array) . "') \n";
}
$sql .= "ORDER BY application, domain_name ASC \n";
//get the list
$results = $database->select($sql, $parameters ?? null, 'all');
$num_rows = count($results);
unset($sql, $parameters);
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//create the text object
$text_language = new text;
//get the language
$language = $settings->get('domain', 'language', 'en-us');
//additional includes
$document['title'] = $text['title-music_on_hold_map'];
require_once "resources/header.php";
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-music_on_hold_map']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('dialplan_all')) {
if ($show == 'all') {
echo " <input type='hidden' name='show' value='all'>\n";
}
else {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?show=all&search='.urlencode($search)]);
}
}
echo "<input type='text' class='txt list-search' name='search' id='search' value=\"".escape($search)."\" placeholder=\"".$text['label-search']."\" onkeydown=''>";
echo button::create(['label'=>$text['button-search'],'icon'=>$_SESSION['theme']['button_icon_search'],'type'=>'submit','id'=>'btn_search']);
// if ($paging_controls_mini != '') {
// echo "<span style='margin-left: 15px;'>".$paging_controls_mini."</span>\n";
// }
echo " </form>\n";
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['title_description-music_on_hold_map']."\n";
echo "<br /><br />\n";
echo "<form id='form_list' method='post'>\n";
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search ?? '')."\">\n";
if (!empty($results) && is_array($results) && @sizeof($results) != 0) {
$previous_application = '';
$x = 0;
foreach ($results as $row) {
if ($row['application'] == 'extensions' && permission_exists('extension_edit')) {
$list_row_url = "/app/extensions/extension_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'ivr_menus' && permission_exists('ivr_menu_edit')) {
$list_row_url = "/app/ivr_menus/ivr_menu_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'dialplans' && permission_exists('dialplan_edit')) {
$list_row_url = "/app/dialplans/dialplan_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'fifo' && permission_exists('fifo_edit')) {
$list_row_url = "/app/fifo/fifo_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'call_center_queues' && permission_exists('call_center_queue_edit')) {
$list_row_url = "/app/call_centers/call_center_queue_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'ring_groups' && permission_exists('call_center_queue_edit')) {
$list_row_url = "/app/ring_groups/ring_group_edit.php?id=".urlencode($row['uuid']);
}
if ($row['application'] == 'destinations' && permission_exists('destination_edit')) {
$list_row_url = "/app/destinations/destination_edit.php?id=".urlencode($row['uuid']);
}
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
//add the table header
if ($previous_application != $row['application']) {
$previous_application = $row['application'];
if ($x > 0) {
echo "</table>\n";
echo "</div>\n";
}
$application = $row['application'];
if ($application == 'call_center_queues') {
$application = 'call_centers';
}
//add multi-lingual support
if (file_exists(dirname(__DIR__, 2)."/app/".$application."/app_languages.php")) {
$text2 = $text_language->get($settings->get('domain', 'language', 'en-us'), 'app/'.$application);
}
echo "<strong>".escape($text2['title-'.$application])."</strong>\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('extension_view') && $list_row_edit_button == 'true') {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
echo "<tr class='list-header' href='".$list_row_url."'>\n";
if (!empty($show) && $show == 'all' && permission_exists('dialplan_all')) {
echo " <th class='' style='width: 150px;'>".escape($text['label-domain_name'])."</th>\n";
}
echo " <th class='' style='width: 150px;'>".escape($text['label-name'])."</th>\n";
echo " <th class='' style='width: 150px;'>".escape($text['label-type'])."</th>\n";
echo " <th class='' style='width: 150px;'>".escape($text['label-extension'])."</th>\n";
echo " <th class='hide-sm-dn' style='width: 400px;'>".escape($text['label-music'])."</th>\n";
echo " <th class='hide-sm-dn' style='width:'>".escape($text['label-description'])."</th>\n";
if (permission_exists('extension_view') && $list_row_edit_button == 'true') {
echo " <th class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </th>\n";
}
echo "</tr>\n";
}
//ad the table row
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (!empty($show) && $show == 'all' && permission_exists('dialplan_all')) {
echo " <td class=''>".escape($row['domain_name'])."</td>\n";
}
echo " <td class=''>".escape($row['name'])."</td>\n";
echo " <td class=''>".escape($row['type'])."</td>\n";
echo " <td class=''>".escape($row['number'])."</td>\n";
echo " <td class='hide-sm-dn'>".escape($row['music'])."</td>\n";
echo " <td class='hide-sm-dn'>".escape($row['description'])."</td>\n";
if (permission_exists('extension_edit') && $list_row_edit_button == 'true') {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
}
echo "</tr>\n";
//increment the value
$x++;
}
unset($extensions);
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
//echo "<div align='center'>".$paging_controls."</div>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//include the footer
require_once "resources/footer.php";
?>
@@ -0,0 +1,117 @@
<?php
$view['name'] = "view_music_on_hold_map";
$view['version'] = "20260303";
$view['description'] = "Show all the music on hold locations throughougt the system where they are being used.";
$view['sql'] = "select \n";
$view['sql'] .= " 'extensions' as application, \n";
$view['sql'] .= " 'hold_music' as type, \n";
$view['sql'] .= " e.extension_uuid as uuid, \n";
$view['sql'] .= " e.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " e.effective_caller_id_name as name, \n";
$view['sql'] .= " e.extension as number, \n";
$view['sql'] .= " e.hold_music as music, \n";
$view['sql'] .= " e.description \n";
$view['sql'] .= "from v_extensions as e, v_domains as d \n";
$view['sql'] .= "where hold_music like '%local_stream%' \n";
$view['sql'] .= "and e.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'ring_groups' as application, \n";
$view['sql'] .= " 'ringback' as type, \n";
$view['sql'] .= " r.ring_group_uuid as uuid, \n";
$view['sql'] .= " r.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " r.ring_group_name as name, \n";
$view['sql'] .= " r.ring_group_extension as number, \n";
$view['sql'] .= " r.ring_group_ringback as music, \n";
$view['sql'] .= " r.ring_group_description as description \n";
$view['sql'] .= "from v_ring_groups as r, v_domains as d \n";
$view['sql'] .= "where ring_group_ringback like '%local_stream%' \n";
$view['sql'] .= "and r.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'ivr_menus' as application, \n";
$view['sql'] .= " 'ringback' as type, \n";
$view['sql'] .= " i.ivr_menu_uuid as uuid, \n";
$view['sql'] .= " i.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " i.ivr_menu_name as name, \n";
$view['sql'] .= " i.ivr_menu_extension as number, \n";
$view['sql'] .= " i.ivr_menu_ringback as music, \n";
$view['sql'] .= " i.ivr_menu_description as description \n";
$view['sql'] .= "from v_ivr_menus as i, v_domains as d \n";
$view['sql'] .= "where ivr_menu_ringback like '%local_stream%' \n";
$view['sql'] .= "and i.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'call_center_queues' as application, \n";
$view['sql'] .= " 'hold_music' as type, \n";
$view['sql'] .= " q.call_center_queue_uuid as uuid, \n";
$view['sql'] .= " q.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " q.queue_name as name, \n";
$view['sql'] .= " q.queue_extension as number, \n";
$view['sql'] .= " q.queue_moh_sound as music, \n";
$view['sql'] .= " q.queue_description as description \n";
$view['sql'] .= "from v_call_center_queues as q, v_domains as d \n";
$view['sql'] .= "where queue_moh_sound like '%local_stream%' \n";
$view['sql'] .= "and q.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'fifo' as application, \n";
$view['sql'] .= " 'hold_music' as type, \n";
$view['sql'] .= " f.fifo_uuid as uuid, \n";
$view['sql'] .= " f.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " f.fifo_name as name, \n";
$view['sql'] .= " f.fifo_extension as number, \n";
$view['sql'] .= " f.fifo_music as music, \n";
$view['sql'] .= " f.fifo_description as description \n";
$view['sql'] .= "from v_fifo as f, v_domains as d \n";
$view['sql'] .= "where fifo_music like '%local_stream%' \n";
$view['sql'] .= "and f.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'destinations' as application, \n";
$view['sql'] .= " 'hold_music' as type, \n";
$view['sql'] .= " e.destination_uuid as uuid, \n";
$view['sql'] .= " e.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " '' as name, \n";
$view['sql'] .= " e.destination_number as number, \n";
$view['sql'] .= " e.destination_hold_music as music, \n";
$view['sql'] .= " e.destination_description as description \n";
$view['sql'] .= "from v_destinations as e, v_domains as d \n";
$view['sql'] .= "where destination_hold_music like '%local_stream%' \n";
$view['sql'] .= "and e.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'destinations' as application, \n";
$view['sql'] .= " 'ringback' as type, \n";
$view['sql'] .= " e.destination_uuid as uuid, \n";
$view['sql'] .= " e.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " '' as name, \n";
$view['sql'] .= " e.destination_number as number, \n";
$view['sql'] .= " e.destination_ringback as music, \n";
$view['sql'] .= " e.destination_description as description \n";
$view['sql'] .= "from v_destinations as e, v_domains as d \n";
$view['sql'] .= "where destination_ringback like '%local_stream%' \n";
$view['sql'] .= "and e.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "union \n";
$view['sql'] .= "select \n";
$view['sql'] .= " 'dialplans' as application, \n";
$view['sql'] .= " 'unknown' as type, \n";
$view['sql'] .= " dl.dialplan_uuid as uuid, \n";
$view['sql'] .= " dl.domain_uuid, \n";
$view['sql'] .= " d.domain_name, \n";
$view['sql'] .= " dl.dialplan_name as name, \n";
$view['sql'] .= " dl.dialplan_number as number, \n";
$view['sql'] .= " de.dialplan_detail_data as music, \n";
$view['sql'] .= " dl.dialplan_description as description \n";
$view['sql'] .= "from v_dialplan_details as de, v_domains as d, v_dialplans as dl \n";
$view['sql'] .= "where dialplan_detail_data like '%local_stream%' \n";
$view['sql'] .= "and de.domain_uuid = d.domain_uuid \n";
$view['sql'] .= "and dl.dialplan_uuid = de.dialplan_uuid \n";