mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2025-12-30 09:03:49 +00:00
* Change the data type to boolean
* Use boolean values in SQL and Conditional Statements
* Schema Data Types: Drop views so that alter tables statements complete
* Update settings.php
* Add extension for call_screen_enabled
* Gateway handle boolean
Add the boolean toggle
- distinct_to
- caller_id_in_from
- supress_cng
- extension_in_contact
- contact_in_ping
* Update gateways.php
* Update voicemail_edit.php
* Replace the ${caller_id_name} with the extensions caller id name
* Phrase - Edit: Update slide toggle with new select beneath.
* Update the input toggle style
* Set the input_toggle_style_switch as boolean
* Update the input toggle style
* Theme: Adjust CSS to wrap description text on form fields.
* Add domain_uuid and domain_name to the SQL SELECT
* Unset the parameters to fix the next query
* Gateway: Integrate new slide toggle switch.
* Dashboard: Update the input toggle style (#7499)
* Dashboard: Update the input toggle style
* Update dashboard_widget_edit.php
* Update dashboard_edit.php
* Inbound Route - Add: Integrate new slide toggle switch and boolean.
* User Settings: Integrate new slide toggle switch.
* Call Block Edit: Update the input toggle style (#7500)
* Bridge Edit: Update the input toggle style (#7501)
* Update phrases.php
* Update domain_edit.php
* Domain Settings Edit: Update the input toggle style
* User Edit: Update the input toggle style
* Update install.php
* Remove fields marked as deprecated
* Use boolean in the select statement
* Streams: New slide toggle and boolean.
* Streams: Remove unnecessary default.
* Queues (FIFO): New slide toggle.
* Call Detail Records: Update the input toggle style (#7503)
* Call Detail Records: Update the input toggle style
* Update xml_cdr_extension_summary.php
* Update xml_cdr_extension_summary.php
* Update xml_cdr_extension_summary.php
* Call Centers: Update the input toggle style (#7502)
* Call Centers: Update the input toggle style
* Update call_center_agent_edit.php
* Conference Centers: Update the input toggle style (#7506)
* Conference Centers: Update the input toggle style
* Update app_config.php
* Update conference_center_edit.php
* Use boolean data type (#7505)
* Call Flow Edit: Update the input toggle style (#7504)
* Devices: Update the input toggle style
* IVR Menus: New slide toggle.
* IVR Menu: Remove deprected file.
* SIP Profile - Edit: New slide toggle.
* Device Profiles: Update the input toggle style
* Ring Groups - List: Fix syntax.
* Theme: Fire onchange event when switching slide toggle control.
* Device Vendors: Update the input toggle style
* Update enabled boolean
* Update device_edit.php
* Ring Groups: New slide toggle.
* Update domain_edit.php
* Email Templates: Update the input toggle style
* Header: Correct default value on input toggle style.
* Default/Domain/User Settings: Adjust Select option label for better clarity.
* Use true boolean types for switch theme toggle or drop-down box (#7507)
* Groups: Update the input toggle style
* Conference Controls: Update the input toggle style (#7509)
* Conference Controls: Update the input toggle style
* Update conference_control_edit.php
* Update conference_control_details.php
* Update conference_control_detail_edit.php
* Conferences: Update the input toggle style (#7511)
* Use true boolean types for switch theme toggle or drop-down box (#7513)
* Dialplans: Update the input toggle style
Also updated outbound route add
* Ring Group: Only adjust ring group forward destination top margin when slide toggle enabled.
* Default/Domain/User Settings - List: Adjust for new 'Select Box' label on input_toggle_style value.
* Use true boolean types for switch theme toggle or drop-down box (#7514)
* Call Forward / Follow Me: Minor javascript adjustments to mirror previous behavior.
* Ring Groups [Dashboard]: New slide toggle.
* Get the contacts details with a seperate SQL Query
* Remove debug info
* Destinations: Update the input toggle style
* Conference Profiles: Update the input toggle style (#7515)
* Conference Profiles: Update the input toggle style
* Update conference_profiles.php
* Update conference_profile_params.php
* Update conference_profile_param_edit.php
* Update conference_profile_edit.php
* Extensions: Update the input toggle style
* Contacts: Update the input toggle style (#7517)
* Contacts: Update the input toggle style
* Update contact_address_edit.php
* Update contact_attachment_edit.php
* Update contact_edit.php
* Update contact_email_edit.php
* Update contact_phone_edit.php
* Update contact_relation_edit.php
* Update contact_setting_edit.php
* Update contact_url_edit.php
* Update contacts.php
* Voicemails: New slide toggle.
* Voicemail Greeting: New slide toggle.
* Modules: New slide toggle.
* Recordings: New slide toggle
* Variables: New slide toggle.
* Time Conditions: New slide toggle.
* Extensions - List: Remove invalid column name.
* Extension Settings: New slide toggle.
* Number Translations: New slide toggle and boolean.
* Sofia global settings: Update the input toggle style
* Update alter table convert to boolean
* Fix contact relation search (#7518)
* Sip Profile Edit: Fix setting enabled labels (#7519)
* Sip Profile Edit: Fix setting enabled labels
* Update sip_profile_edit.php
* Update dialplan_edit.php (#7520)
* Update SQL queries to use true/false for contact primary settings (#7521)
* Update SQL queries to use true/false for contact primary settings
* Update contacts_vcard.php
* Update email.php
* Update totp.php
* Update contact_url_edit.php
* Update contact_email_edit.php
* Update contact_address_edit.php
* Update contact_attachment_edit.php
* Update contact_phone_edit.php
* Add a database views method
* Add database view groups
* Add database users view
* Add database call_recordings view
* Update users.php
* Add database view call block
* Update schema to use the database views method
* Update conference.conf.lua boolean
* Update directory.lua boolean
* Update callcenter.conf.lua agent_status boolean
* Update sofia.conf.lua boolean
* Update number translations lua boolean
* Update directory.lua boolean
* Update group_call.lua fix the cache
* Update reverse-auth-lookup.lua boolean
* Update directory.lua boolean
* Use concat instead of ||
* Update index.lua
---------
Co-authored-by: fusionate <nate@fusionpbx.com>
Co-authored-by: Alex <alex@fusionpbx.com>
Co-authored-by: frytimo <tim@fusionpbx.com>
280 lines
10 KiB
Lua
280 lines
10 KiB
Lua
--
|
|
-- 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>
|
|
-- Copyright (C) 2010
|
|
-- the Initial Developer. All Rights Reserved.
|
|
--
|
|
-- Contributor(s):
|
|
-- Mark J Crane <markjcrane@fusionpbx.com>
|
|
-- Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
|
|
|
|
--include config.lua
|
|
require "resources.functions.config";
|
|
|
|
--connect to the database
|
|
local Database = require "resources.functions.database";
|
|
dbh = Database.new('system');
|
|
|
|
--include json library
|
|
local json
|
|
if (debug["sql"]) then
|
|
json = require "resources.functions.lunajson"
|
|
end
|
|
|
|
api = freeswitch.API();
|
|
|
|
--other libs
|
|
require "resources.functions.trim";
|
|
|
|
aleg_number = argv[1];
|
|
bleg_number = argv[2];
|
|
context = argv[3];
|
|
accountcode = argv[4];
|
|
t_started = os.time();
|
|
|
|
local sql = "SELECT domain_uuid FROM v_domains WHERE domain_name=:context";
|
|
local params = {context = context};
|
|
if (debug["sql"]) then
|
|
freeswitch.consoleLog("debug", "[disa.callback] SQL: "..sql.."; params: " .. json.encode(params) .. "\n");
|
|
end
|
|
dbh:query(sql, params, function(row)
|
|
domain_uuid = row.domain_uuid;
|
|
end);
|
|
|
|
cmd = "user_exists id ".. aleg_number .." "..context;
|
|
a_user_exists = trim(api:executeString(cmd));
|
|
freeswitch.consoleLog("notice", "[disa] a_user_exists "..a_user_exists.."\n");
|
|
|
|
--Lets build correct dialstring
|
|
if (a_user_exists == "true") then
|
|
cmd = "user_data ".. aleg_number .."@"..context.." var extension_uuid";
|
|
extension_uuid = trim(api:executeString(cmd));
|
|
a_dialstring = "[origination_caller_id_number=*3472,outbound_caller_id_number=*3472,call_timeout=30,context="..context..",sip_invite_domain="..context..",domain_name="..context..",domain="..context..",accountcode="..accountcode..",domain_uuid="..domain_uuid.."]user/"..aleg_number.."@"..context;
|
|
else
|
|
local sql = [[select * from v_dialplans as d, v_dialplan_details as s
|
|
where (d.domain_uuid = :domain_uuid or d.domain_uuid is null)
|
|
and d.app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3'
|
|
and d.dialplan_enabled = true
|
|
and d.dialplan_uuid = s.dialplan_uuid
|
|
order by
|
|
d.dialplan_order asc,
|
|
d.dialplan_name asc,
|
|
d.dialplan_uuid asc,
|
|
s.dialplan_detail_group asc,
|
|
CASE s.dialplan_detail_tag
|
|
WHEN 'condition' THEN 1
|
|
WHEN 'action' THEN 2
|
|
WHEN 'anti-action' THEN 3
|
|
ELSE 100 END,
|
|
s.dialplan_detail_order asc ]]
|
|
local params = {domain_uuid = domain_uuid};
|
|
if (debug["sql"]) then
|
|
freeswitch.consoleLog("notice", "[disa ] sql for dialplans:" .. sql .. "; params: " .. json.encode(params) .. "\n");
|
|
end
|
|
dialplans = {};
|
|
x = 1;
|
|
dbh:query(sql, params, function(row)
|
|
dialplans[x] = row;
|
|
x = x + 1;
|
|
end);
|
|
|
|
y = 0;
|
|
previous_dialplan_uuid = '';
|
|
for k, r in pairs(dialplans) do
|
|
if (y > 0) then
|
|
if (previous_dialplan_uuid ~= r.dialplan_uuid) then
|
|
regex_match = false;
|
|
bridge_match = false;
|
|
square = square .. "]";
|
|
y = 0;
|
|
end
|
|
end
|
|
if (r.dialplan_detail_tag == "condition") then
|
|
if (r.dialplan_detail_type == "destination_number") then
|
|
if (api:execute("regex", "m:~"..aleg_number.."~"..r.dialplan_detail_data) == "true") then
|
|
--get the regex result
|
|
destination_result = trim(api:execute("regex", "m:~"..aleg_number.."~"..r.dialplan_detail_data.."~$1"));
|
|
regex_match = true
|
|
end
|
|
end
|
|
end
|
|
if (r.dialplan_detail_tag == "action") then
|
|
if (regex_match) then
|
|
--replace $1
|
|
dialplan_detail_data = r.dialplan_detail_data:gsub("$1", destination_result);
|
|
--if the session is set then process the actions
|
|
if (y == 0) then
|
|
square = "[direction=outbound,origination_caller_id_number="..bleg_number..",outbound_caller_id_number="..bleg_number..",call_timeout=30,context="..context..",sip_invite_domain="..context..",domain_name="..context..",domain="..context..",accountcode="..accountcode..",domain_uuid="..domain_uuid..",";
|
|
end
|
|
if (r.dialplan_detail_type == "set") then
|
|
if (dialplan_detail_data == "sip_h_X-accountcode=${accountcode}") then
|
|
square = square .. "sip_h_X-accountcode="..accountcode..",";
|
|
elseif (dialplan_detail_data == "effective_caller_id_name=${outbound_caller_id_name}") then
|
|
elseif (dialplan_detail_data == "effective_caller_id_number=${outbound_caller_id_number}") then
|
|
else
|
|
square = square .. dialplan_detail_data..",";
|
|
end
|
|
elseif (r.dialplan_detail_type == "bridge") then
|
|
if (bridge_match) then
|
|
dial_string = dial_string .. "," .. square .."]"..dialplan_detail_data;
|
|
square = "[";
|
|
else
|
|
dial_string = square .."]"..dialplan_detail_data;
|
|
end
|
|
bridge_match = true;
|
|
end
|
|
y = y + 1;
|
|
end
|
|
end
|
|
previous_dialplan_uuid = r.dialplan_uuid;
|
|
end
|
|
--end for
|
|
a_dialstring = dial_string;
|
|
end
|
|
|
|
freeswitch.consoleLog("info", "[disa.callback] a_dialstring " .. a_dialstring .. "\n");
|
|
|
|
session1 = freeswitch.Session(a_dialstring);
|
|
session1:execute("export", "domain_uuid="..domain_uuid);
|
|
freeswitch.consoleLog("info", "[disa.callback] calling " .. aleg_number .. "\n");
|
|
freeswitch.msleep(2000);
|
|
|
|
while (session1:ready() and not session1:answered()) do
|
|
if os.time() > t_started + 30 then
|
|
freeswitch.consoleLog("info", "[disa.callback] timed out for " .. aleg_number .. "\n");
|
|
session1:hangup();
|
|
else
|
|
freeswitch.consoleLog("info", "[disa.callback] session is not yet answered for " .. aleg_number .. "\n");
|
|
freeswitch.msleep(500);
|
|
end
|
|
end
|
|
|
|
if session1:ready() and session1:answered() then
|
|
session1:answer( );
|
|
freeswitch.consoleLog("info", "[disa.callback] calling " .. bleg_number .. "\n");
|
|
|
|
t_started2 = os.date();
|
|
|
|
cmd = "user_exists id ".. bleg_number .." "..context;
|
|
b_user_exists = trim(api:executeString(cmd));
|
|
freeswitch.consoleLog("notice", "[disa] b_user_exists "..b_user_exists.."\n");
|
|
|
|
--Lets build correct dialstring
|
|
if (b_user_exists == "true") then
|
|
cmd = "user_data ".. bleg_number .."@"..context.." var extension_uuid";
|
|
extension_uuid = trim(api:executeString(cmd));
|
|
b_dialstring = "[origination_caller_id_number=*3472,outbound_caller_id_number=*3472,call_timeout=30,context="..context..",sip_invite_domain="..context..",domain_name="..context..",domain="..context..",accountcode="..accountcode..",domain_uuid="..domain_uuid.."]user/"..bleg_number.."@"..context;
|
|
else
|
|
local sql = [[select * from v_dialplans as d, v_dialplan_details as s
|
|
where (d.domain_uuid = :domain_uuid or d.domain_uuid is null)
|
|
and d.app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3'
|
|
and d.dialplan_enabled = true
|
|
and d.dialplan_uuid = s.dialplan_uuid
|
|
order by
|
|
d.dialplan_order asc,
|
|
d.dialplan_name asc,
|
|
d.dialplan_uuid asc,
|
|
s.dialplan_detail_group asc,
|
|
CASE s.dialplan_detail_tag
|
|
WHEN 'condition' THEN 1
|
|
WHEN 'action' THEN 2
|
|
WHEN 'anti-action' THEN 3
|
|
ELSE 100 END,
|
|
s.dialplan_detail_order asc ]]
|
|
local params = {domain_uuid = domain_uuid};
|
|
if (debug["sql"]) then
|
|
freeswitch.consoleLog("notice", "[disa ] sql for dialplans:" .. sql .. "; params: " .. json.encode(params) .. "\n");
|
|
end
|
|
dialplans = {};
|
|
x = 1;
|
|
dbh:query(sql, params, function(row)
|
|
dialplans[x] = row;
|
|
x = x + 1;
|
|
end);
|
|
y = 0;
|
|
previous_dialplan_uuid = '';
|
|
for k, r in pairs(dialplans) do
|
|
if (y > 0) then
|
|
if (previous_dialplan_uuid ~= r.dialplan_uuid) then
|
|
regex_match = false;
|
|
bridge_match = false;
|
|
square = square .. "]";
|
|
y = 0;
|
|
end
|
|
end
|
|
if (r.dialplan_detail_tag == "condition") then
|
|
if (r.dialplan_detail_type == "destination_number") then
|
|
if (api:execute("regex", "m:~"..bleg_number.."~"..r.dialplan_detail_data) == "true") then
|
|
--get the regex result
|
|
destination_result = trim(api:execute("regex", "m:~"..bleg_number.."~"..r.dialplan_detail_data.."~$1"));
|
|
regex_match = true
|
|
end
|
|
end
|
|
end
|
|
if (r.dialplan_detail_tag == "action") then
|
|
if (regex_match) then
|
|
--replace $1
|
|
dialplan_detail_data = r.dialplan_detail_data:gsub("$1", destination_result);
|
|
--if the session is set then process the actions
|
|
if (y == 0) then
|
|
square = "[direction=outbound,origination_caller_id_number="..aleg_number..",outbound_caller_id_number="..aleg_number..",call_timeout=30,context="..context..",sip_invite_domain="..context..",domain_name="..context..",domain="..context..",accountcode="..accountcode..",domain_uuid="..domain_uuid..",";
|
|
end
|
|
if (r.dialplan_detail_type == "set") then
|
|
if (dialplan_detail_data == "sip_h_X-accountcode=${accountcode}") then
|
|
square = square .. "sip_h_X-accountcode="..accountcode..",";
|
|
elseif (dialplan_detail_data == "effective_caller_id_name=${outbound_caller_id_name}") then
|
|
elseif (dialplan_detail_data == "effective_caller_id_number=${outbound_caller_id_number}") then
|
|
else
|
|
square = square .. dialplan_detail_data..",";
|
|
end
|
|
elseif (r.dialplan_detail_type == "bridge") then
|
|
if (bridge_match) then
|
|
dial_string = dial_string .. "," .. square .."]"..dialplan_detail_data;
|
|
square = "[";
|
|
else
|
|
dial_string = square .."]"..dialplan_detail_data;
|
|
end
|
|
bridge_match = true;
|
|
end
|
|
y = y + 1;
|
|
end
|
|
end
|
|
previous_dialplan_uuid = r.dialplan_uuid;
|
|
end
|
|
--end for
|
|
b_dialstring = dial_string;
|
|
end
|
|
freeswitch.consoleLog("info", "[disa.callback] b_dialstring " .. b_dialstring .. "\n");
|
|
|
|
session2 = freeswitch.Session(b_dialstring);
|
|
while (session2:ready() and not session2:answered()) do
|
|
if os.time() > t_started2 + 30 then
|
|
freeswitch.consoleLog("info", "[disa.callback] timed out for " .. bleg_number .. "\n");
|
|
session2:hangup();
|
|
else
|
|
freeswitch.consoleLog("debug", "[disa.callback] session is not yet answered for " .. bleg_number .. "\n");
|
|
freeswitch.msleep(500);
|
|
end
|
|
end
|
|
freeswitch.bridge(session1, session2);
|
|
else
|
|
freeswitch.consoleLog("info", "[disa.callback] session is not functional for " .. aleg_number .. "\n");
|
|
session1:hangup();
|
|
end
|
|
|