E911 plugin (#6822)

* E911 Service plugin

Emergency Services availability is crucial part of FusionPBX.
This plugin Introduce  match need it visibility  into E911 services.
This commit is contained in:
volga629-1
2023-12-13 16:46:58 -05:00
committed by GitHub
parent 3a854aa24a
commit 50f9c2b3df
6 changed files with 664 additions and 1 deletions

View File

@@ -0,0 +1,96 @@
<?php
//application details
$apps[$x]['name'] = 'Emergency Logs';
$apps[$x]['uuid'] = 'de63b1ae-7750-11ee-b3a5-005056a27559';
$apps[$x]['category'] = 'Emergency Logs';
$apps[$x]['subcategory'] = '';
$apps[$x]['version'] = '1.0.1';
$apps[$x]['license'] = 'Mozilla Public License 1.1';
$apps[$x]['contact_url'] = 'http://austen-it.com';
$apps[$x]['description']['en-us'] = '';
$apps[$x]['description']['es-mx'] = '';
$apps[$x]['description']['de'] = '';
$apps[$x]['description']['de-ch'] = '';
$apps[$x]['description']['de-at'] = '';
$apps[$x]['description']['fr'] = '';
$apps[$x]['description']['fr-ca'] = '';
$apps[$x]['description']['fr-ch'] = '';
$apps[$x]['description']['pt-pt'] = '';
$apps[$x]['description']['pt-br'] = '';
//permission details
$y=0;
$apps[$x]['permissions'][$y]['name'] = "emergency_logs_view";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$apps[$x]['permissions'][$y]['menu']['uuid'] = "23a6fc8a-77f1-11ee-88b0-005056a27559";
$y++;
$apps[$x]['permissions'][$y]['name'] = "emergency_logs_view_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
//schema details
$z=0;
$apps[$x]['db'][$y]['table']['name'] = "v_emergency_logs";
$apps[$x]['db'][$y]['table']['parent'] = "";
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'log_uuid';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'uuid';
$apps[$x]['db'][$y]['fields'][$z]['key']['type'] = 'primary';
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'domain_uuid';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'uuid';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'char(36)';
$apps[$x]['db'][$y]['fields'][$z]['key']['type'] = 'foreign';
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['table'] = 'v_domains';
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['field'] = 'domain_uuid';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'date';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'time';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'extension';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'numeric';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'event';
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "insert_date";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'timestamptz';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'date';
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'date';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "insert_user";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "uuid";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "update_date";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'timestamptz';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'date';
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'date';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "update_user";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "uuid";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
?>

View File

@@ -0,0 +1,35 @@
<?php
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Emergency logs";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Emergency logs";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "سجلات الطوارئ";
$apps[$x]['menu'][$y]['title']['de-at'] = "Notfall-Protokolle";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Notfall-Protokolle";
$apps[$x]['menu'][$y]['title']['de-de'] = "Notfall-Protokolle";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Registros de emergencia";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Registros de emergencia";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Journaux d'urgence";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Journaux d'urgence";
$apps[$x]['menu'][$y]['title']['he-il'] = "יומן חירום";
$apps[$x]['menu'][$y]['title']['it-it'] = "Registri di emergenza";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Logboeken voor noodgevallen";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Dzienniki alarmowe";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Registros de emergência";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Registos de emergência";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Jurnale de urgență";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Журналы аварийных ситуаций";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Dnevniki za nujne primere";
$apps[$x]['menu'][$y]['title']['uk-ua'] = "Журнали аварійних ситуацій";
$apps[$x]['menu'][$y]['title']['zh-cn'] = "紧急日志";
$apps[$x]['menu'][$y]['title']['ja-jp'] = "緊急ログ";
$apps[$x]['menu'][$y]['title']['ko-kr'] = "긴급 상황 로그";
$apps[$x]['menu'][$y]['uuid'] = "4404d592-775b-11ee-bb5c-005056a27559";
$apps[$x]['menu'][$y]['parent_uuid'] = "0438b504-8613-7887-c420-c837ffb20cb1";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/emergency/emergency.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

213
app/emergency/emergency.php Normal file
View File

@@ -0,0 +1,213 @@
<?php
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
//check permissions
if (permission_exists('emergency_logs_view')) {
//access granted
}
else {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//get the http post data
if (!empty($_POST['emergency_logs']) && is_array($_POST['emergency_logs'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$emergency_logs = $_POST['emergency_logs'];
}
//process the http post data by action
if (!empty($action) && !empty($emergency_logs) && is_array($emergency_logs) && @sizeof($emergency_logs) != 0) {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: emergency.php');
exit;
}
//prepare the array
if (!empty($emergency_logs)) {
foreach ($emergency_logs as $row) {
$array['emergency_logs'][$x]['checked'] = $row['checked'];
$array['emergency_logs'][$x]['emergency_log_uuid'] = $row['emergency_log_uuid'];
$x++;
}
}
//prepare the database object
$database = new database;
$database->app_name = 'emergency_logs';
$database->app_uuid = 'de63b1ae-7750-11ee-b3a5-005056a27559';
//send the array to the database class
if (!empty($action) && $action == 'delete') {
$database->delete($array);
}
//redirect the user
header('Location: emergency.php'.($search != '' ? '?search='.urlencode($search) : null));
exit;
}
//get order and order by
$order_by = $_GET["order_by"] ?? null;
$order = $_GET["order"] ?? null;
//define the variables
$search = '';
$show = '';
//add the search variable
if (!empty($_GET["search"])) {
$search = strtolower($_GET["search"]);
}
//add the show variable
if (!empty($_GET["show"])) {
$show = $_GET["show"];
}
//get the count
$sql = "select count(log_uuid) ";
$sql .= "from v_emergency_logs ";
if ($show == 'all') {
$sql .= "where true ";
}
else {
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!empty($search)) {
$sql .= "and ( ";
$sql .= " lower(event) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$database = new database;
$num_rows = $database->select($sql, $parameters ?? null, 'column');
unset($sql, $parameters);
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = !empty($search) ? "&search=".$search : null;
$param .= (!empty($_GET['page']) && $show == 'all' && permission_exists('user_log_all')) ? "&show=all" : null;
$page = !empty($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 0;
list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page);
list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true);
$offset = $rows_per_page * $page;
//set the time zone
if (isset($_SESSION['domain']['time_zone']['name'])) {
$time_zone = $_SESSION['domain']['time_zone']['name'];
}
else {
$time_zone = date_default_timezone_get();
}
//get the list
$sql = "select * ";
$sql .= "from v_emergency_logs ";
if ($show == 'all') {
$sql .= "where true ";
}
else {
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!empty($search)) {
$sql .= "and ( ";
$sql .= " lower(event) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$emergency_logs = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//additional includes
$document['title'] = 'Emergency Logs';
require_once "resources/header.php";
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>Emergency Logs (".$num_rows.")</b></div>\n";
echo " <div class='actions'>\n";
if ($emergency_logs) {
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display:none;','onclick'=>"modal_open('modal-delete','btn_delete');"]);
}
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('emergency_logs_view_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='.$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";
if ($emergency_logs) {
echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete'); list_form_submit('form_list');"])]);
}
echo $text['title_description-emergency_logs']."\n";
echo "<br /><br />\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo "<th class='left'>Time</th>\n";
echo "<th class='left'>Date</th>\n";
echo "<th class='left'>Extension</th>\n";
echo "<th class='left'>Event</th>\n";
echo "</tr>\n";
if (!empty($emergency_logs) && is_array($emergency_logs) && @sizeof($emergency_logs) != 0) {
$x = 0;
foreach ($emergency_logs as $row) {
echo "<tr class='list-row'>\n";
echo " <td>".escape($row['time'])."</td>\n";
echo " <td>".escape($row['date'])."</td>\n";
echo " <td>".escape($row['extension'])."</td>\n";
echo " <td>".escape($row['event'])."</td>\n";
echo "</tr>\n";
$x++;
}
unset($emergency_logs);
}
echo "</table>\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";
?>