Compare commits

...

3743 Commits

Author SHA1 Message Date
Alex 48a0990d51
Dashboard - Fix device keys and call center agents background color (#7352)
* Fix background color on device keys and call center agent widgets

* Update call_center_agents.php

* Update index.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update call_center_agents.php

* Update device_keys.php

* Update config.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update index.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update call_center_agents.php

* Update device_keys.php
2025-04-04 11:23:22 -06:00
chansizzle 6e171710f6
Add yealink_backlight_time to default settings -> provision section (#7353)
This variable allows automatic provisioned Yealink devices to dim the backlight after X seconds. Disabled by default.
2025-04-03 15:56:24 -06:00
FusionPBX edb6e43462
Create the token once for Active Calls
Improve efficiency by using one token for active calls.
When token generated inside the include it would generate many tokens.
2025-04-01 12:16:17 -06:00
frytimo b01bf7d08c
Add clear settings object cache when modifying or adding setting (#7351)
When a setting is modified, the settings cache can be reloaded allowing the setting that was modified or added to take immediate effect. The call to allow any other clear cache methods to be called will allow any new features to have their settings also take effect. The settings are first cleared though so that any of the other classes that may require updated settings to work with, ensure that they have the newest default setting values.
2025-04-01 10:19:37 -06:00
FusionPBX 4f4a1f9c15
Update switch.php 2025-04-01 09:13:41 -06:00
Antonio Fernandez 7040635baf
Bug Fix - music on hold path (#7349) 2025-04-01 09:10:53 -06:00
frytimo 5ed20f1c2f
Fix plugin class name mismatch in auto loader (#7350)
* Fix plugin class name mismatch in auto loader
When matching the file name of the plugins in the authentication plugin folder they do not match. This causes auto loader not to find and load the class.

* Update auto_loader.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2025-04-01 09:07:26 -06:00
frytimo 5c1be1a318
Update clear cache method for settings object (#7348)
* update clear cache method for settings object

* re-use the database object from settings object
2025-03-31 10:04:33 -06:00
FusionPBX 7d51c8cdd5
Update text for Unregistered, Provisioned, and Rebooted 2025-03-29 15:13:38 -06:00
FusionPBX 98d7fd025c
Fix the registration reboot message 2025-03-29 14:50:07 -06:00
FusionPBX f9bd89ef78
Fixed the response when the result is an array 2025-03-29 14:48:45 -06:00
FusionPBX 091dca3ceb
Update footer.php 2025-03-29 13:39:24 -06:00
FusionPBX 0b9fd924a9
Add not empty check on the domains session 2025-03-29 13:20:38 -06:00
FusionPBX e5e63a3846
Update extension_edit.php 2025-03-29 11:29:58 -06:00
chansizzle 590e58c388
Update extension_edit to populate device servers (#7347)
This pull request fixes the code for adding extensions and a device is added to the extension.

These device fields are populated if they are defined and enabled in default setttings. This works if the data types = text (the default) and it works if the data types = array (very useful for server clusters)
2025-03-29 11:27:03 -06:00
FusionPBX efd9f8979e
Use standard time GMT offset 2025-03-28 17:45:13 -06:00
Alex 7148ba3c66
Prevent date time picker from getting clipped (#7345) 2025-03-28 15:50:39 -06:00
chansizzle c6ecf73fa6
add firmware for yealink T19P (#7344) 2025-03-28 15:21:40 -06:00
FusionPBX c6dd43cff0
Update code to use the server_address_secondary 2025-03-28 12:37:01 -06:00
frytimo 0882b148ec
Check outbound_proxy and server_address for array with drop-down field (#7343)
- Check the outbound_proxy_primary and outbound_proxy_secondary default value for an array value so the drop-down field on the device edit page can be filled.
- Use a variable to get the value from the settings class for server_address_primary and server_address_secondary instead of calling the settings class three times for each value.
2025-03-28 10:50:43 -06:00
frytimo 0e143764e8
Sets the default value for Limit Max field when adding a new extension (#7342) 2025-03-28 10:49:47 -06:00
FusionPBX d1d24a0a9c
Add yealink_force_voice_ring_volume
Forced ringer volume: 0 - 15
2025-03-27 17:44:10 -06:00
Alex aceb77d70e
Dashboard Edit - Only show target, width, and height if needed (#7341) 2025-03-27 16:18:50 -06:00
Alex c305685d23
Fix dashboard edit defaults (#7340)
* Fix dashboard edit defaults

* Update app_defaults.php

* Update config.php
2025-03-27 15:41:38 -06:00
frytimo 00c6befb70
Add missing file path when cache miss in auto_loader (#7339) 2025-03-27 13:33:36 -06:00
FusionPBX 7fe291dfcf
Update xml_cdr.php
Use the permission_exists and is_uuid conditions at the top of the download class method. If false use return to prevent running code without the right permission and a valid uuid.
2025-03-26 18:34:54 -06:00
Alex 5f7ef8848e
Fix typo (#7337) 2025-03-26 14:57:24 -06:00
frytimo b5af974d34
Add backslash to the trim command (#7338) 2025-03-26 14:56:55 -06:00
frytimo c165afc53e
Fix trim command on interface name (#7336) 2025-03-26 13:11:37 -06:00
FusionPBX 288f693c12
Increase the delay when database is not connected 2025-03-26 11:48:18 -06:00
FusionPBX 90b774e86d
Add default setting daylight_savings_auto 2025-03-26 11:44:17 -06:00
FusionPBX 67da2f2a3d
Make sure the database connection is available 2025-03-26 11:30:34 -06:00
frytimo 2ae77071e2
Fix call recordings maintenance path (#7334) 2025-03-25 14:44:20 -06:00
FusionPBX ba413775c7
Get the login destination from the settings 2025-03-24 19:06:09 -06:00
FusionPBX 9d43254603
Set enabled to true by default 2025-03-24 18:29:09 -06:00
FusionPBX 9ee9aa4023
Update xml_cdr.php 2025-03-22 21:03:19 -06:00
FusionPBX f58ed065fc
cdr http_enabled default to false
Using the file system by default instead of HTTP POST
2025-03-22 17:09:51 -06:00
FusionPBX 7fae8eefca
Update xml_cdr.php 2025-03-22 17:03:37 -06:00
Brett@NGEN cf55ca59ed
Corrected case errors in provisioning template for Grandstream GHP6xx Series (#7203)
* Corrected case errors for Grandstream GHP6xx Series

* Corrected case - remotecontrol

* Update {$mac}.xml

* Replaced all camel case within XML element names

* Found a few more

Matching pattern: name=".*[a-z][A-Z].*"
2025-03-22 16:45:14 -06:00
FusionPBX f420a08802
Add grandstream_random_port #6055 2025-03-22 16:34:30 -06:00
FusionPBX 62877b7aab
Add grandstream_random_port 2025-03-22 16:29:36 -06:00
FusionPBX 5b77e3d62b
Ring Ready support disabling it in dialplan #6536 2025-03-22 16:06:18 -06:00
FusionPBX 48661c3aa6
Update sip_status.php 2025-03-22 15:45:19 -06:00
emak-Corey efed19ef1c
Sort the 'sofia xmlstatus' profiles alphabetically (#6091)
* Sort the 'sofia xmlstatus' profiles alphabetically

Added function to sort the 'sofia xmlstatus' SIP profiles alphabetically to match the sort order lower down in the page.
2025-03-22 15:43:58 -06:00
Ahron Greenberg (agree) 0e2b083807
Fix adding duplicate device error (#6490)
* [extensions] Fix adding duplicate device error
2025-03-22 12:55:15 -06:00
FusionPBX 0706b52427
Update destinations.php 2025-03-22 12:33:45 -06:00
mbarvoipdrs d44e7c0c5f
Yealink W60B Updates (#5600)
Adding Alarm server lines to be used with ver 85 firmware and the W59R handset.
2025-03-21 21:02:20 -06:00
FusionPBX cd5693dbd4
Update check for duplicate destinations
Account for destination_prefix
2025-03-21 21:00:37 -06:00
frytimo 52d8f436e4
Replace session variables with the settings class (#7271) 2025-03-21 20:11:44 -06:00
FusionPBX 1778963607
Calculate the daylight savings settings 2025-03-21 19:51:27 -06:00
frytimo d3cedcf17f
Add wifi function enabled (#7333)
* add wifi function enabled
2025-03-21 18:02:54 -06:00
frytimo 449b689840
Fix wifi function enabled (#7332) 2025-03-21 17:50:01 -06:00
frytimo a5e63e0fce
unset the parameters array (#7331) 2025-03-21 10:53:46 -06:00
Stephen Forster 1f2d7e1ceb
Show to superadmin group that has dialplan_all permission (#5458)
If permissions to dialplans is given to anyone other than superadmin then they should not be able to see GLOBAL dialpans unless they have dialplan_all permission as well.

* Update dialplans.php
2025-03-21 10:49:41 -06:00
frytimo b82d9f17a7
Fix exception thrown for order by used in count devices clause (#7330) 2025-03-21 10:33:22 -06:00
frytimo 891e9e3dfa
Use auth_id instead of user_id for pcode 36 (#7329) 2025-03-21 09:44:36 -06:00
frytimo 64a8715245
Fix user id instead of auth id used in grandstream template (#7326) 2025-03-20 23:51:03 -06:00
fusionate e460c4f180
Access Control - Edit: Remove unintended single-quotes when dig domain used as Description. 2025-03-20 17:26:42 -06:00
fusionate 5d37e2a570
Access Control - Edit: Add additional sanitization on dig value. 2025-03-20 17:20:14 -06:00
fusionate 7b8340f021
Access Control - Edit: Escape submitted values in dig command. 2025-03-20 09:51:37 -06:00
FusionPBX a6a39e6d8a
Add fax to the add fax_files table if the file exists 2025-03-19 13:26:31 -06:00
fusionate 7787c4fd73
Default/Domain/User Settings - Edit: Correct Google Fonts URL. 2025-03-18 18:08:26 -06:00
fusionate a482326930
Default/Domain/User Settings - List & Edit: Do not mask new input_text_font_password setting. 2025-03-18 18:04:49 -06:00
fusionate 42c96239c8
Theme: Set select password fields to monospace font when revealed. New input_text_font_password setting to control default font. 2025-03-18 17:55:41 -06:00
FusionPBX 0bec2b9aef
Remove empty XML CDR files 2025-03-18 13:40:47 -06:00
FusionPBX dce8f1ba8a
Update algom{$mac}.conf 2025-03-18 13:25:31 -06:00
Antonio Fernandez c8699a5797
bug fix for voicemail edit transcription (#7324)
* bug fix for voicemail edit transcription

* Update voicemail_edit.php
2025-03-18 09:36:24 -06:00
frytimo 6d356194ba
Ensure apcu_cache_info function is available before calling (#7323) 2025-03-17 14:58:36 -06:00
frytimo 1572c76963
Use regex in autoloader instead of include (#7322) 2025-03-17 10:01:11 -06:00
frytimo ad1ba95566
Fix undefined constant error when flushing cache (#7321) 2025-03-17 10:00:25 -06:00
frytimo 0a42d8f198
Add caching to the auto_loader for interfaces (#7320)
* update auto loader to load and cache interfaces

* use new method to update the auto loader cache

* use new interface

* use new interface to trigger a cache flush

* update the console upgrade menu

* update the missing implements syntax

* add the clear_cache to the flush cache button
2025-03-15 09:13:36 -06:00
frytimo 99b3100ee9
fix typo in require.php file (#7319) 2025-03-14 22:55:00 -06:00
FusionPBX 8a1421eb97
Fix call timeout for ring strategy enterprise
Call timeout ignored with enterprise adjust the destinaton_timeout to honor the call timeout
2025-03-14 20:31:06 -06:00
Alex 89eeeb84ae
Use settings object in css.php (#7317)
* Use settings object in css.php

* Update css.php
2025-03-14 16:57:29 -06:00
Alex 1e96df6e95
Change $setting to $settings (#7318)
* Change $setting to $settings

* Update app_defaults.php

* Update fax_queue.php

* Update xml_cdr.php

* Update email_queue.php

* Update transcribe.php

* Update send.php

* Update fax_queue.php

* Update fax_send.php

* Update app_defaults.php

* Update email_queue.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php
2025-03-14 16:19:49 -06:00
Alex 7639f0755c
Update xml_cdr.php (#7315)
* Update xml_cdr.php

* Update css.php

* Update template.php
2025-03-13 14:58:15 -06:00
Alex 5dffd4d6e0
Add CDR column_overflow default setting (#7314)
* Add cdr column_overflow default setting

* Update app_config.php

* Update xml_cdr.php

* Update default_setting_edit.php

* Update template.php

* Update app_languages.php

* Update css.php
2025-03-13 14:49:30 -06:00
frytimo 77d2b3099a
Create get methods for domain_uuid and user_uuid (#7144)
* create get methods for domain_uuid and user_uuid
2025-03-13 14:32:51 -06:00
FusionPBX 17b938698e
Start with the require.php 2025-03-13 13:08:36 -06:00
chansizzle e6bfaf21ee
Remove escaping character typo (#7311)
escaping character not needed on the template_subject
2025-03-13 11:30:42 -06:00
FusionPBX b0a630e80a
Use no-wrap class 2025-03-13 11:25:15 -06:00
Alex b5592e84c7
Fix fatal error on fax send (#7313) 2025-03-13 11:04:40 -06:00
FusionPBX ee28c6d203
Fix Call Detail Records with invalid xml 2025-03-13 10:06:36 -06:00
FusionPBX 6c6814b29e
Remove syntax that breaks older PHP
Removed :static to support PHP 7.4
2025-03-12 23:39:24 -06:00
frytimo bed7c8827f
fix missing quotes on parameter default value (#7310) 2025-03-12 20:50:14 -06:00
chansizzle 95761621a6
improve emergency emailing (#7309)
* improve emergency emailing

1. set emergency CID name & number to the outbound CID name & number if emergency CID name & number are not set
2. remove duplicate item in email body
3. change the hardcoded email subject '911 Emergency Call' to be dynamically provided from the event. I do not like seeing the subject '911 Emergency Call' when it is an TEST call.

* improve emergency emailing

1. change the hardcoded email subject '911 Emergency Call' to be dynamically provided from the event. I do not like seeing the subject '911 Emergency Call' when it is an TEST call.
2. fix email template misspelling
3. improved email template with bold fonts
2025-03-12 17:39:05 -06:00
FusionPBX 31a88e3a15
Update auto_loader.php 2025-03-12 14:48:33 -06:00
FusionPBX 7897ff5b9e
Clear the cache 2025-03-12 14:42:50 -06:00
frytimo 08001488f4
Allow namespace in auto loader (#7307)
* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove closing tag

* remove invalid method params

* remove closing tag

* remove closing tag

* Update auto_loader to load each class file in the project
Update the auto_loader class to use an include statement on each file in the project to load the class within the file. This will allow mismatched names within the file to be loaded and mapped according to the declaration instead of the filename. The class is then checked against the parsed classes from the PHP engine so that namespaces are available and mapped to the file they were declared in. An update was also made to the search algorithm used to find a file that was not already loaded by collapsing the array to have only valid matches to increase performance on a cache miss. Logging within the auto_loader has been moved to a function.
Multiple files were modified to allow the include statement. When the class has the `if(class_exists())` statement, the auto_loader is called to check for the class. This caused an infinite loop scenario so all wrappers have been removed. The auto_loader will now break the loop by directly modifying the internal classes array instead of trying to restart with the 'reload_classes' method.

- APCu is used to cache classes so any loading of the classes is done only once. To clear the APCu cache, restart php-fpm or call the auto_loader::clear_cache() function.
- Cache file is used when APCu is not available. To clear the cache remove it from the tmp folder or call the auto_loader::clear_cache() function.
- All classes must no longer have a class_exists wrapper to benefit from the performance boost.
- Classes should not be directly included when the auto_loader is used.

* remove include statement of class file

* Update destinations.php
2025-03-12 13:55:47 -06:00
Alex abb95e38bb
Add content card to outbound route add and pin number export (#7308)
* Add content card to outbound route add and pin number export

* Add content card
2025-03-12 13:37:26 -06:00
Alex 43edc82cbe
Fix header user menu when using inline or static menu style (#7306)
* Fix header user menu when using inline or static menu

* Update template.php
2025-03-12 13:15:38 -06:00
FusionPBX 7a167f70af
Get emergency emails from both default and domain settings 2025-03-12 11:37:27 -06:00
FusionPBX 81ab295059
Update template.php 2025-03-12 10:41:39 -06:00
chansizzle 20f3c4eb71
Add CDR Details, Call Recordings Play, and Call Recordings Download to emergency logs (#7301)
* Create download.php

download.php is required to play and download call recordings

* add CDR Details and Call Recording to emergency logs

* add CDR Details and Call Recording to emergency logs

* combine call details column and call status column

removed the call details column
make the call status column be the hyperlink to the cdr details page

* combine call details column and call status column

removed the call details column
make the call status column be the hyperlink to the cdr details page
2025-03-12 09:40:44 -06:00
Alex 3167a8ce49
Use scroll bar if there are too many columns in a content card (#7300) 2025-03-12 09:40:02 -06:00
FusionPBX af9691ff41
Fix missed_call use as boolean 2025-03-11 19:54:54 -06:00
FusionPBX c3e5647c03
Update app_defaults.php 2025-03-11 19:36:56 -06:00
Alex 885df6b3fb
Add count div to domain selector (#7305)
* Add count div to domain selector
2025-03-11 16:11:40 -06:00
frytimo da6471df5f
Optimize require.php (#7286)
Load the auto_loader first
Use config object to find config.conf file and declare global
Use database object and declare global
Use settings object and declare global
2025-03-11 14:37:31 -06:00
Alex d9827f8800
Use table_row_text settings for domain selector text size and font (#7302) 2025-03-11 14:32:50 -06:00
FusionPBX 1be15d7d9c
Update responsive design 2025-03-11 14:27:45 -06:00
Antonio Fernandez ca2b0b22dd
Update algom{$mac}.conf (#7299)
admin password is now added via provisioning
2025-03-10 17:34:43 -06:00
Alex 5ff0af430f
Fix domain settings content cards (#7298) 2025-03-10 11:34:31 -06:00
Alex 35aa781c90
Add content card to device export and pin numbers (#7297)
* Add content card to device export and pin numbers

* Update pin_numbers.php

* Update pin_number_edit.php

* Update device_download.php
2025-03-10 10:26:27 -06:00
FusionPBX 8ef90b9dcc
Update xml_cdr.php 2025-03-08 14:42:35 -07:00
FusionPBX a099de0c6f
Fix the contact import 2025-03-08 14:37:15 -07:00
FusionPBX 5391745155
Update abstraction.conf.xml 2025-03-08 08:59:22 -07:00
chansizzle 8f5d5b58b3
add call status to emergency logs page (#7278)
* add call status to emergency logs page
2025-03-08 07:20:39 -07:00
Alex bb5320e6ca
Change menu multi column dropdown width based on text size (#7296) 2025-03-07 16:27:21 -07:00
fusionate da19ca7a7c
Login: Display Cancel link to reset form if failure using database authentication. 2025-03-07 12:10:52 -07:00
fusionate dd3288585c
Menu: Add setting to reload menu when changing domains. 2025-03-06 20:08:48 -07:00
chansizzle 8f354b54de
add new active calls permissions (#7294)
Add new permissions to the active calls page so the fields can be removed from an admin permissions group to simplify the page, hiding more technical fields they probably will not find helpful.
2025-03-06 18:54:57 -07:00
chansizzle a1c03c364a
add new active calls permissions (#7295)
Add new permissions to the active calls page so the fields can be removed from an admin permissions group to simplify the page, hiding more technical fields they probably will not find helpful.
2025-03-06 18:54:43 -07:00
fusionate fce7a9401a
Dashboard - Edit: Display domain after domain-specific group names. 2025-03-06 16:17:53 -07:00
frytimo fbeb65428e
fix bug for registration count (#7293) 2025-03-06 15:46:17 -07:00
Alex 8b95f62d39
Fix logout icon alignment (#7291) 2025-03-06 15:38:31 -07:00
Alex 941ec9c060
Add input_height default setting (#7292)
* Add input_height default setting

* Update app_config.php
2025-03-06 15:38:12 -07:00
Alex 397db90533
Add content card div to call block recent calls (#7290) 2025-03-06 10:17:41 -07:00
fusionate 03030465d9
Audio Waveform: Boolean adjustments. 2025-03-05 16:09:17 -07:00
Alex b418a892e3
Align action bar text to the left (#7289) 2025-03-05 15:39:05 -07:00
FusionPBX 7ac2f76804
Use audio_player_waveform_enabled as boolean 2025-03-05 15:23:13 -07:00
frytimo e9739d2b06
Use single event socket object in registrations class (#7288)
* Use single event socket object in registrations class
Allow passing an event_socket in the constructor
Ensure the event_socket is connected before using it in loops
2025-03-05 10:08:08 -07:00
AdSecIT b714d25150
Update device.php (#7287)
Spelling correction.
2025-03-05 09:58:00 -07:00
FusionPBX 0fa87760cb
Update fifo_edit.php
Add validation
Use the event_socket object
2025-03-04 18:18:04 -07:00
frytimo 1aa1eb6159
Use text instead of boolean for ace editor settings (#7285) 2025-03-04 16:30:17 -07:00
FusionPBX cd3ff91f9a
Update app_defaults.php 2025-03-04 16:27:59 -07:00
FusionPBX 167cc94f18
Move editor settings used
Used in multiple features for this reason moved to core.
2025-03-04 16:17:16 -07:00
frytimo d529021b3f
Use boolean setting as true boolean (#7284)
* use boolean setting as true boolean

* Update settings class to use the php filter_var function for boolean
Using the built-in filter type for boolean seems like a better option as they are faster, already hardened, and more widely tested.
I found this better method used originally by Mark J. Crane in 2022 in the content.php page so I included it here.

* Update settings class to use the php filter_var function for boolean
Using the built-in filter type for boolean seems like a better option as they are faster, already hardened, and more widely tested.
I found this better method used originally by Mark J. Crane in 2022 in the content.php page so I included it here.
2025-03-04 11:25:47 -07:00
Antonio Fernandez 1b19e40be4
Consistent email wording (#7283) 2025-03-04 10:53:23 -07:00
FusionPBX bb02c97c64
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:51:19 -07:00
FusionPBX c47eac110a
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:50:58 -07:00
FusionPBX 9fcfc7276a
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:50:44 -07:00
FusionPBX 6baa6973f3
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:47:28 -07:00
FusionPBX 150eeccd5e
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:43:29 -07:00
fusionate 7b3b3aa5f9
Menu: New option to set icon colors. 2025-03-03 14:08:05 -07:00
FusionPBX 7d62cc1e63
Fix the server 2 address and sip transport 2025-03-03 12:29:56 -07:00
FusionPBX a15488a708
Update the condition for validate certificate for a boolean value 2025-03-02 10:45:31 -07:00
FusionPBX 48e44814de
Update email_send.php 2025-03-02 10:38:34 -07:00
FusionPBX 06c20ef292
Fix contact notes with line feeds.
When saving contact notes, it would add extra line feeds. The escaping caused this issue.
2025-03-01 22:25:06 -07:00
FusionPBX de516ed210
Minor version update 5.4.2 2025-03-01 20:59:48 -07:00
chansizzle e4ddb4561e
fix email category mispelling (#7280) 2025-02-28 17:22:22 -07:00
FusionPBX b4de6f5e4b
Use status voicemail
Moved voicemail status after missed calls. This way, it will show the status of voicemail when it goes to voicemail.

There is still a field in the CDR for missed_call and this will still be set to true.
2025-02-28 17:09:35 -07:00
fusionate 06e69bf5df
Contact - Attachments: Prevent access without authentication. 2025-02-28 14:36:41 -07:00
fusionate f6df4fd0b3
Contacts - List: Only retrieve a single Primary attachment, in the chance that multiple exist. 2025-02-28 11:03:05 -07:00
fusionate 3de202b987
Contact - Attachment: Store image files in same format as uploaded. 2025-02-28 09:36:42 -07:00
FusionPBX c1296f26e0
Update users.php 2025-02-27 23:16:42 -07:00
frytimo f8e1e81546
fix wrong logical check (#7282)
Forgot to remove the '!' (not) operator from the cache check when re-organizing the update cache function
2025-02-27 21:09:31 -07:00
frytimo 863de97270
Update grandstream template loop (#7281) 2025-02-27 19:47:27 -07:00
FusionPBX f3986290ea
Add enable-rfc-5626 to the internal profile 2025-02-27 10:48:29 -07:00
FusionPBX c3bc265ff0
Show contact details 2025-02-26 12:24:37 -07:00
FusionPBX 1fba94d92b
Add contact note to users 2025-02-26 12:01:20 -07:00
markjcrane 9591ce0cbd Change the path in the menu to use core 2025-02-26 10:30:39 -07:00
markjcrane bd54c07e50 Move email_templates to core 2025-02-26 10:29:45 -07:00
frytimo d919a3cc1b
Add the apcu caching ability for performance (#7276)
* add the apcu caching ability for performance
When the PHP extension APCu is loaded, the settings class and the auto_loader will cache their results across requests in RAM. For more information about the APCu extension visit the PHP page: https://www.php.net/apcu

* use global instead of default terminology
2025-02-25 17:21:41 -07:00
Alex 305f585b17
Add missing counter divs (#7277)
* Add counter div to voicemail messages and domain settings

* Update domain_settings.php

* Update menu_item_list.php

* Update domain_settings.php

* Update voicemail_messages.php
2025-02-25 16:24:16 -07:00
Alex 2f955d4fef
Fix queue edit content alignment (#7274) 2025-02-25 13:23:06 -07:00
FusionPBX c22080d2fc
Fix an unclosed {if} tag
Caused by Commit 40f78c3
2025-02-25 13:09:49 -07:00
Alex e08a79e64d
Add missing required class to required fields (#7273)
* Add missing required class to required fields

* Update destination_edit.php

* Update device_edit.php

* Update voicemail_edit.php

* Update dashboard_edit.php

* Update call_block_edit.php

* Update destination_edit.php
2025-02-25 12:48:50 -07:00
Alex ba48d186a9
Add content card div to contact email edit and module edit (#7272)
* Add content card div to contact email edit and module edit

* Update module_edit.php
2025-02-25 12:35:23 -07:00
FusionPBX bbe7b76673
Add more FIFO Queue features
- Ring Strategy
- Queue
- Exit Key
- Exit Action
2025-02-24 22:07:34 -07:00
FusionPBX 6f26f3d386
Fix item overflow affected
This problem didn't affect all screen resolutions.
2025-02-24 10:05:03 -07:00
n0obHere bb0386e952
Align search input text field with buttons (#7251) 2025-02-22 20:39:08 -07:00
wouam31200 dde61fdeeb
Add template sip server (#7270)
* W80 Sip Server Template

* Update Template Sip Server
2025-02-22 08:36:12 -07:00
FusionPBX eb26156159
Remove the !empty(voicemail_mail_to) condition
The toggle for keeps local after email harms nothing. So we don't need to restrict it.
2025-02-21 13:16:11 -07:00
Alex 7707b9853c
Fix bridges redirect to correct domain when using show all (#7269) 2025-02-21 10:58:53 -07:00
Alex d78c726d9b
Fix call forward show all button (#7267) 2025-02-21 10:23:46 -07:00
fusionate b85eaaac73
Upgrade - Source: Move Preview styles to theme CSS file, style after modal. 2025-02-21 08:51:52 -07:00
chansizzle 3adcad3e5e
date column before time column (#7266)
change the order of the columns
2025-02-20 21:28:22 -07:00
Alex 8cfc221da4
Redirect to the correct domain if using show all (#7265)
* Redirect to the correct domain if using show all

* Update bridges.php

* Update call_recordings.php

* Update conference_controls.php

* Update conference_profile_params.php

* Update conference_profiles.php

* Update email_queue.php

* Update event_guard_logs.php

* Update fax_queue.php

* Update user_settings.php

* Update require.php
2025-02-20 16:30:09 -07:00
FusionPBX c2fe9d32f7
Fix a voicemail bug
Fix the voicemail link
Use only one keep local feature
Deprecate the voicemail_local_after_forward
2025-02-20 15:01:28 -07:00
Alex 036731202e
Remove unnecessary if statement (#7264) 2025-02-20 11:33:06 -07:00
Alex e416e74c30
Add domain change to require.php (#7263) 2025-02-20 11:25:36 -07:00
frytimo fd34a000a6
Add old search method for auto loading classes (#7261)
Adding this commit to ensure backwards compatibility and a fail-safe mechanism for loading a class
2025-02-20 11:24:39 -07:00
FusionPBX 37840abb98
Fix the cdr http_enabled boolean condition 2025-02-20 09:51:08 -07:00
Mendel 83cf184452
Yealink provioning files fix (#7236)
* multiple changes to the and for the yealink t58W

Added the variable for Bluetooth so that it won't be disabled every time the phone is provisioned.
Added what is needed for the wallpaper and firmware.

* Update app_config.php

* Added the Call Waiting Variable to the yealink config files
2025-02-20 09:31:10 -07:00
wouam31200 a18c2edf24
Add Yealink W80 Dect (#7258)
* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

BLF Not Showing Correct Status When Using DNS-SRV

* Update y000000000095.cfg

 yealink_language

* Update y000000000097.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000096.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000095.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000070.cfg

Add {$yealink_enhanced_dss_keys}

* Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys}

* Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys}

* Added some default settings

Added some default settings

* Update y000000000146.cfg

* add w80 dect
2025-02-20 09:18:02 -07:00
chansizzle 3c9720ee36
Add CID Name prefix to destinations.php (#7262) 2025-02-20 09:13:36 -07:00
FusionPBX 7503ff40de
Add 922 as another emergency test number 2025-02-19 10:37:40 -07:00
frytimo 679b407562
bug fix domain name when using devices showall (#7259)
When the 'Show All' button is clicked the display of devices is using the current domain name instead of the domain name that belongs to the device
2025-02-18 15:01:19 -07:00
FusionPBX 2661ad7bf0
Allow the @ in the Caller ID name 2025-02-17 11:56:01 -07:00
FusionPBX 8b54dd8b61
Fix invalid XML CDR 2025-02-15 18:56:12 -07:00
FusionPBX abd2077ede
Send CDR with invalid xml to failed/invalid_xml 2025-02-15 18:21:14 -07:00
FusionPBX 535d0395e6
Update {$mac}.cfg
required for firmware .160 and newer
account.{$row.line_number}.sip_server.1.address

required for firmware .125 and older
account.{$row.line_number}.sip_server_host
2025-02-15 14:38:39 -07:00
FusionPBX 7c25ad1ed7
Disable vad for flying voice by default 2025-02-15 12:09:46 -07:00
frytimo 5e6ec475df
update auto_loader cache file when updating (#7255) 2025-02-15 10:44:46 -07:00
frytimo dc0f146485
fix php warning in menu class (#7256)
initialize variable before use
2025-02-15 10:43:03 -07:00
FusionPBX 27e32e8f34
Send the fax with primary and alternative routes 2025-02-14 15:50:51 -07:00
FusionPBX 9d3dd2a831
Add two fax variables 2025-02-14 13:08:19 -07:00
FusionPBX f11c792c2f
Fix the fifo agent delete 2025-02-13 21:51:50 -07:00
FusionPBX c4aa9e9b02
Update the cache after loading classes array 2025-02-13 15:05:27 -07:00
fusionate bd5002ca32
Voicemail: Rename voicemail filesystem folder if Voicemail ID changes. 2025-02-13 15:02:53 -07:00
frytimo 0931197137
build array in auto_loader constructor (#7158)
* Build an array in the auto_loader constructor

* Update auto_loader.php

* Update auto_loader.php

* minor adjustment to name and comment and remove trailing closing tag

* use best practices for the loader method
Allowing the loader method:
- Should Never Be Called Manually
- Prevents External Modification
- Hides Implementation Details

* cache array in the temp folder and load if available

* re-organize functions within the class

* add cache recreation for auto_loader in upgrade_menu

* add cache recreation for auto_loader in upgrade_menu

* Update app_languages.php
2025-02-13 14:48:40 -07:00
frytimo 9b0eead911
Fix incorrect name on disk usage chart (#7237)
* fix incorrect name on disk usage chart

* put correct information in disk usage for Linux and FreeBSD systems

* Update system_disk_usage.php

* Update system_disk_usage.php
2025-02-13 14:18:36 -07:00
frytimo f03803f113
use settings object where possible (#7246)
* use settings object where possible

* use $user_uuid instead of $_SESSION['user_uuid']

* use extension_uuid when counting for performance
2025-02-13 14:12:48 -07:00
frytimo 056ddc93ca
remove the automatic setting of server connection port in provisioning (#7243)
* remove the automatic setting of the server connection port in provisioning
2025-02-13 14:09:03 -07:00
fusionate 68e3b4c187
Fax - New: Add cover_message, cover_message_height Default Settings to define a default Message and the height of the message box on the cover page, respectively. 2025-02-13 11:56:07 -07:00
frytimo 0cf387f306
do not save event_guard logs to transactions (#7254)
Event Guard already has a log table so no need to duplicate the transactions in another table
2025-02-13 09:10:33 -07:00
frytimo 0a5c377ae6
Remove Extra Line Ending (#7252) 2025-02-13 09:09:52 -07:00
frytimo 5c9eeb1956
Remove Extra Line Ending (#7253) 2025-02-13 09:09:34 -07:00
fusionate 5b1697fc17
Menu - Fixed: Change to submenu item links to hopefully resolve random submenu closure on click bug. 2025-02-11 18:02:16 -07:00
FusionPBX cd5ed73602
Allow # and * in the sanitized caller ID 2025-02-11 13:26:32 -07:00
Ahron Greenberg (agree) 3603711d77
fix destination_condition_field gets overwritten by default setting (#7242) 2025-02-11 08:41:25 -07:00
Ahron Greenberg (agree) 2ef400aefd
validate domain before change (#7244) 2025-02-11 08:39:47 -07:00
FusionPBX a91e2ac547
Fix password when the permission is not assigned 2025-02-07 17:32:09 -07:00
Alex 1237b94cc4
remove duplicates (#7250) 2025-02-07 12:02:44 -07:00
fusionate d51eb0892b
Theme: Reapply changes from yesterday. 2025-02-07 11:55:18 -07:00
Alex a07ca55da5
Update css.php (#7249) 2025-02-07 11:42:59 -07:00
fusionate f056e82740
Theme: Additional settings to better control border and now outline styles. 2025-02-06 14:37:33 -07:00
FusionPBX 0ce6f3c956
Update language French vm 2025-02-06 14:33:11 -07:00
Alex 0a75229a43
Fix input toggle switch handle color default setting (#7247) 2025-02-06 13:45:38 -07:00
Alex 3088bb188f
Fix login input default settings (#7248) 2025-02-06 13:45:26 -07:00
FusionPBX 7f7ca70210
Change value of yealink_voice_vad to 0
A value of 0 disables voice activity detection. VAD when enabled on a Yealink T54W made the audio at the beginning of the call start at the beginning of the call and sometimes took 1 to 30 seconds to start.

Recommend changing this value on all systems using Yealink to use 0 to disable voice activity detection. Currently yealink_voice_vad is used in t46s, t41s, and t54w
2025-02-06 12:11:24 -07:00
FusionPBX 9b0292f3d2
Fix the destination login alternate path 2025-02-05 18:09:08 -07:00
Ahron Greenberg (agree) e21650fe4a
fix unset var (#7245) 2025-02-05 13:56:35 -07:00
FusionPBX 574ec7a5b3
Fax queue setting prefer_local default false
This allows control over whether to prefer sending to the voip provider or attempt local fax call.
2025-02-04 18:37:58 -07:00
Alex 5f2a6eed09
Fix dashboard number background color not showing (#7241)
* Fix dashboard number background color not showing

* Update missed_calls.php

* Update recent_calls.php

* Update voicemails.php

* Update registrations.php
2025-02-03 16:27:09 -07:00
frytimo 1c29addf08
fix spelling mistake in xml_cdr function name (#7240) 2025-02-03 13:21:47 -07:00
FusionPBX ca2e72e6f4
Fix the call recording length 2025-02-02 18:27:03 -07:00
FusionPBX 793e5b5e00
Fix the devices domain names column 2025-02-02 18:01:27 -07:00
FusionPBX bb0e23354a
Add uuid to the custom recording name 2025-02-01 00:22:56 -07:00
FusionPBX d655fa0ba6
Use the settings class use database::new() 2025-01-31 21:40:35 -07:00
FusionPBX 55fa668765
Use one database connection 2025-01-30 22:51:20 -07:00
chansizzle e8f8e2cfc5
add missing semicolons (#7238) 2025-01-30 22:40:21 -07:00
FusionPBX a2fc7dff1d
Update email_send.php 2025-01-30 16:11:33 -07:00
FusionPBX 3ab848e8c0
Minor version update 5.4.1 2025-01-29 22:26:47 -07:00
FusionPBX 0c48569c71
record_extension default to mp3 2025-01-29 21:43:24 -07:00
FusionPBX 355c0e692c
Update call details
- Add pass objects into the constructor
- details show local source and destination extensions
2025-01-28 21:57:41 -07:00
FusionPBX 65aeefaea4
update voicemail_main_menu phrase 2025-01-28 20:27:24 -07:00
FusionPBX d2294f76f3
Update voicemail_listen_file_options phrase 2025-01-28 20:18:16 -07:00
FusionPBX e0c7a8a9b5
Add voicemail_deleted_message_count phrase 2025-01-28 20:05:03 -07:00
fusionate 41556744ff
Contact - View: Tighten up speed dial icon and number, make no wrap. 2025-01-28 17:21:42 -07:00
fusionate cf22444a64
Contact - View: Apply card styles to contact-detail grid boxes. 2025-01-28 17:19:14 -07:00
fusionate bc22ab8cc4
Contact - View: Show speed dial prefix and number after a Contact's number, if defined. 2025-01-28 17:18:28 -07:00
frytimo d6f9b25283
format schema class (#7145)
- format schema class using autoformat
2025-01-28 17:05:00 -07:00
simplecoder732 77f9161408
Add a voicemail deletion queue (#7221)
* Add a deleted messages option to voicemail.
Messages are only deleted after a certain amount of time instead of immediately.
The queue can be turned off or on with the default setting "use_deletion_queue" in the "voicemail" category.
Changed deleted phrase and added a deleted messages count phrase
Added a program to delete messages that are due for deletion. Also small changes to phrases.

* Added a remove_deleted_messages function that runs on voicemail main menu log in. With this method, the deletion queue is handled per mailbox vs system-wide as in the cron-triggered script. It also allows us to adjust the retention hours on a per-domain basis.
2025-01-28 16:57:50 -07:00
Alex b2349060b5
Fix number text and background color not applying (#7235)
* Fix number text and background color not applying

* Update registrations.php

* Update voicemails.php

* Update missed_calls.php

* Update recent_calls.php

* Update domains.php
2025-01-28 16:39:35 -07:00
denisent bb1006aca8
Add serial number to the device edit page (#7234)
* add device serial number

* add device serial number field

* add device serial number field
2025-01-28 16:26:32 -07:00
chansizzle 964865ae63
add xml statistics mouse over text and use languages variables (#7211)
* add xml statistics mouse over text and use languages variables

* add xml statistics mouse over text and use languages variables

* xml statistics - remove English words from non-English languages
2025-01-28 16:22:02 -07:00
frytimo 3144036ae0
add new menu upgrade option to reset file permissions (#7232)
* add new menu upgrade option to reset file permissions
2025-01-28 16:20:43 -07:00
fusionate 9106c7fbfe
Contact - Phone: Adjust to even check same contact for duplicate speed dial numbers. 2025-01-28 16:11:21 -07:00
FusionPBX fe0680f9b1
Handle columns in the table that may not exist
The old v_device_keys column device_profile_uuid is deprecated. It will exist on systems that were upgraded from an older version before the change was made.

The app default code here moves data from the old format to the newer one. This is useful for upgrades. Newer installs will not have this deprecated field in the device_keys and device_settings table.
2025-01-28 15:59:04 -07:00
fusionate 42a1625daa
Contact - Phone: Prevent duplicate speed dial numbers. 2025-01-28 15:54:35 -07:00
FusionPBX b8b796316e
Add method column_exists to the database class 2025-01-28 15:35:02 -07:00
FusionPBX a4f83539ba
Update login.php 2025-01-28 12:54:09 -07:00
fusionate 14288772d5
Yealink App: Replace an invalid UUID. 2025-01-28 12:53:32 -07:00
frytimo 7c887184ff
adjust system service dashboard widget to not show by default (#7233) 2025-01-28 12:17:04 -07:00
fusionate aa75be76e7
Yealink App: Fix UUID in a previous commit.
This was preventing the App Defaults to run properly, because the database was rejecting the UUID value.
2025-01-28 11:58:32 -07:00
frytimo 96da9967e0
create system services dashboard item (#7231)
* create system services dashboard item

* update internationalization language file used in system_services
2025-01-28 10:20:36 -07:00
FusionPBX 88b35835b0
logged in direct to the dashboard 2025-01-27 13:58:06 -07:00
chansizzle ecc9361b68
remove device_label duplicates (#7215)
removed device_label duplicated in 2 locations
2025-01-27 11:12:00 -07:00
chansizzle bf84789f64
yealink power savings description clarity (#7220)
It was unclear as to what 'saving enabled' is. Updated to 'power saving enabled'. Yealink setting `features.power_saving.enable`
2025-01-26 19:28:58 -07:00
Mendel 43612a5049
multiple changes to the and for the yealink t58W,and images for yealinks in general. (#7223)
* multiple changes to the and for the yealink t58W

Added the variable for Bluetooth so that it won't be disabled every time the phone is provisioned.
Added what is needed for the wallpaper and firmware.
2025-01-25 19:32:25 -07:00
Norman King a87bdc997e
Add wp8x6 provisioning template. (#7224)
* added 8x6 template

* Add files via upload

* 8x6 phonebook

* Update {$mac}.xml

* Deleted wp8x6/${mac}.xml

* added TR69 variable

* added tr69 url and interval

* Update {$mac}.xml

changed asc variable

* added gs variables to wp8x6

* removed hard code settings

* remove additionall hard code settings

* wifi, ringtone, and dhcp settings

* bluetooth

---------

Co-authored-by: unknown <rweiler93@gmail.com>
2025-01-25 19:24:47 -07:00
frytimo da1da92d01
fix missing variable in default template (#7222)
When 'dev' or 'all' error level is set in the config.conf file, the menu will fail to expand or contract. This commit adds the missing variable causing a PHP warning responsible for the behavior.
2025-01-24 16:05:37 -07:00
FusionPBX 965b245794
Use lowercase matching domain name #7230
When the domain name has upper and lower case letters. The domain UUID results in not found in app/provision
2025-01-24 16:03:53 -07:00
frytimo d77b69b4d5
fix provision edit to use text type instead of numeric (#7229) 2025-01-24 10:15:36 -07:00
frytimo f6adc9bdd0
suppress access on null php notice in new is_connected method (#7227) 2025-01-23 12:38:03 -07:00
frytimo 95faf83337
add is_connected method to database (#7225) 2025-01-23 11:42:19 -07:00
FusionPBX 18bce0437d
Add more debug details and return false 2025-01-22 20:35:53 -07:00
FusionPBX 7e4f82f840
Enhance message array debug details 2025-01-22 20:07:02 -07:00
FusionPBX 8ea79e56e7
Replace exit; with return false; 2025-01-22 19:26:25 -07:00
fusionate e58a55df97
Password Reset: Adjustment to re-enable password match indication. 2025-01-20 09:10:04 -07:00
FusionPBX 8b59ef881b
Use the settings array to pass database connection
Improve efficiency by using one database connection
2025-01-18 15:47:56 -07:00
FusionPBX b6386ada32
Add table xml_cdr_extensions 2025-01-17 23:30:06 -07:00
frytimo 62039c300a
fix menu php warning when restoring default menu (#7219) 2025-01-17 13:39:17 -07:00
frytimo 50125527de
fix php warning for ini set (#7217)
The ini setting can only be modified when the session has not already started. This moves the ini_set function call inside the if block
2025-01-17 12:48:49 -07:00
frytimo dc22e87fc2
fix dashboard php warnings (#7218) 2025-01-17 12:48:11 -07:00
simplecoder732 5b9e82480d
Add Algo 8103 and 8196 provision templates (#7213)
* Add Algo 8103 and 8196 provision templates

* Added admin password setting to algo 8103 & 8196 templates. Also checked for existence of algo_timezone setting or set to New York time
2025-01-17 08:24:28 -07:00
FusionPBX afe511c403
Add forgot password translations 2025-01-16 21:54:27 -07:00
FusionPBX 3f186d90cc
Fix the forget password feature 2025-01-16 21:49:56 -07:00
FusionPBX 11f250191d
Add call recordings record_extension
Call recording file format options: wav, mp3
2025-01-16 19:59:32 -07:00
FusionPBX 31adc0883a
Update destination_edit.php
- Use the settings class to get the default settings
- Use call recordings variable record_extension wav or mp3
2025-01-16 19:56:32 -07:00
FusionPBX 590e4fb072
Add record_stereo and record_stereo_swap 2025-01-16 18:24:22 -07:00
frytimo 24ecfa16a0
update voicemails to use settings object where possible (#7212) 2025-01-16 12:49:00 -07:00
fusionate edf2efb517
Voicemails - List: Restore search functionality. 2025-01-16 10:51:41 -07:00
FusionPBX df90b758bb
Fix issue with sending local faxes
When sip_to_user or sip_req_user are used then we need to add these variables so that it can find the correct inbound route.
2025-01-15 19:44:56 -07:00
FusionPBX d49e8e4d2c
Add a default for paging 2025-01-15 15:42:11 -07:00
fusionate 93309e17f9
Side Menu: Improved behavior for Expanded and Hidden states when clicking on the content body. 2025-01-15 13:56:02 -07:00
FusionPBX 4e99779bc5
Fix server_address_primary
This was showing as a select box instead of input-type text .
2025-01-13 12:59:11 -07:00
FusionPBX 405a335ffb
Removed domain_enabled to fix a bug for those using BDR
An issue occurs if the domain_enabled data type was text rather than boolean. The upgrade schema data types will correct the data type except when using BDR. The alter table for changing data types doesn't work because of BDR.
2025-01-13 11:10:34 -07:00
fusionate a118cd658e
Voicemail - Edit: Change boolean select elements to toggle switches. 2025-01-09 23:04:03 -07:00
frytimo 79b0767343
fix xml_cdr import failing to move a zero byte record to failed folder (#7210)
When an XML CDR record is zero bytes that is recorded in the /var/log/freeswitch/xml_cdr directory, the xml_cdr class would fail to move the file. This causes the record files to eventually build up to where the files can exceed the import limit. This adjustment moves the sanity checking for `filesize` to before the import attempt and checks for over limit and zero bytes. If those conditions match the file is moved to the "failed" folder.
2025-01-09 11:47:28 -07:00
FusionPBX f121c16931
Update access control export add node_type 2025-01-09 00:16:21 -07:00
FusionPBX c388194721
Add Access Control Export 2025-01-09 00:06:52 -07:00
FusionPBX 106fc33459
Remove the pdo.php include
The pdo.php file was replaced by the database class
2025-01-08 12:14:38 -07:00
FusionPBX 1ada27a5b8
Add the settings_array to the class constructor
- More efficient to pass in the database object
- Added an option to pass in the domain_name
2025-01-07 22:20:57 -07:00
FusionPBX 75e7e9b71b Add multi-cast settings to all yealinks 2025-01-07 20:50:57 +00:00
FusionPBX 43d57fce14
Change the agent.contact size from 255 to 1024 2025-01-03 16:53:23 -07:00
FusionPBX 2aae8635db
Fix the device line default values and use the settings class 2025-01-03 14:41:08 -07:00
FusionPBX 5e8271ecc6
Use the domain_name as the context 2025-01-03 09:01:03 -07:00
FusionPBX eb7645772a
Update the context for the operator
Use the domain_name as the context.
2025-01-03 09:00:17 -07:00
FusionPBX 5c9c872c99
Show newest emails first 2025-01-01 11:26:44 -07:00
frytimo 76af096f52
xml_cdr catch edge case of failed import when no start stamp is present (#7207)
* xml_cdr catch edge case of failed import when no start stamp is present

* xml_cdr catch edge case of failed import when no start stamp is present
2025-01-01 10:32:12 -07:00
fusionate 5ace1902e3
Recordings: Restore audio playback. 2024-12-30 12:33:54 -07:00
chansizzle 9203fa0ed9
update cpm_ans to be cpm_answered (#7204)
The sql aliases the calculation as cpm_answered. Without this change the CDR Statistics Call Per Minute will always be zero.
2024-12-27 09:55:26 -07:00
FusionPBX ff95ada636
Fix the duration by use the created_epoch
Also used the settings class
2024-12-26 10:57:45 -07:00
FusionPBX 803b8755b2
Use the settings class and change date and time handling
- Use the settings class
- Fix the date and time
2024-12-25 22:08:10 -07:00
FusionPBX 6524cdcd0b
Fix greeting when using phrases
After saving a phrase for the greeting it would save but it wouldn't show the correct label. It would continue to play the phrase but show the UUID.
2024-12-23 12:22:44 -07:00
FusionPBX b6e1a2f775
Fix greeting when using phrases
After saving a phrase for the greeting it would save but it wouldn't show the correct label. It would continue to play the phrase but show the UUID.
2024-12-23 12:15:38 -07:00
FusionPBX 640b9f3184
Update the contacts path
Moved contacts from app to core
2024-12-22 10:40:41 -07:00
FusionPBX 67582a0f90
Update presence.php 2024-12-22 10:13:18 -07:00
shing6326 fb719cf331
Add grandstream wp826 template (#7201) 2024-12-21 14:37:50 -07:00
FusionPBX aecf84c6b6
Allow wrap on the action bar
This is needed to fit better on tablets and mobile screens.
2024-12-21 14:35:26 -07:00
FusionPBX eab081e253
Fix log viewer overflow for log content using word wrap 2024-12-21 11:32:15 -07:00
FusionPBX 2b22a15bf9
Update permission to hide hangup cause by default
This call detail records permission was assigned to the superadmin group by default. The Status replaces it with a simpler message. The hangup cause status will remain as an option for those that want it.
2024-12-21 10:56:15 -07:00
FusionPBX afaf31c3a2
Sanitize the caller ID name and number 2024-12-20 11:07:05 -07:00
FusionPBX 257066f4d0
Fix a typo in the description 2024-12-17 12:49:49 -07:00
FusionPBX d9f401f577
Use the settings class 2024-12-16 18:48:44 -07:00
frytimo 38b02f11d5
fix missing slash '/' at end of link tag (#7200) 2024-12-16 13:53:33 -07:00
FusionPBX 2cd94a93a5
Fix the device ADD button.
Also, permission_exists function uses the permission::new() method and this made it efficient enough to continue to use the permission_exists function.
2024-12-13 10:35:36 -07:00
frytimo 075cc4824a
Security, Use the same number of characters for the masked password (#7198)
* security set display asterisks to constant number
Harder to guess when length is also hidden
2024-12-12 10:03:21 -07:00
chansizzle 8feb150dba
rename extension summary csv export (#7179)
rename extension summary export/download from 'user-summary.csv. to 'extension-summary.csv'
2024-12-11 22:15:28 -07:00
FusionPBX 7e5ac499ef
Update {$mac}.xml 2024-12-11 22:08:07 -07:00
FusionPBX 7a33e79f4a
Add the spa_router_mode 2024-12-11 22:06:44 -07:00
FusionPBX a9b2076fbe
Update the cisco 192 template 2024-12-11 22:00:18 -07:00
Alex 9fc82c02cb
Add dashboard icon color setting (#7197)
* Add dashboard icon color setting

* Update index.php

* Update app_languages.php

* Update app_defaults.php

* Update app_config.php

* Update dashboard_edit.php

* Update index.php

* Update app_languages.php

* Update app_defaults.php

* Update app_config.php

* Update config.php

* Update domains.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update registrations.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update voicemails.php

* Update config.php

* Update missed_calls.php

* Update recent_calls.php

* Update index.php

* Update index.php

* Update index.php
2024-12-11 21:28:45 -07:00
frytimo 3d4fe6e5c1
fix call forward back button on save (#7196)
* fix call forward back button on save
2024-12-11 14:53:55 -07:00
Antonio Fernandez 975f0755ea
fix-sms/mms-to-email-en-us (#7194) 2024-12-10 16:53:35 -07:00
Alex 02aacd2c40
Fix menu_side_brand_image_contracted not showing (#7195) 2024-12-10 16:51:36 -07:00
FusionPBX 414c85eef8
Fix a bug where transfer is part of recording name 2024-12-10 13:44:49 -07:00
FusionPBX 3095bb5a30 Removed messages and providers
These are optional and have the own repositories
2024-12-09 17:13:22 +00:00
anthony-ricci 7993e2ad1b
messages-to-email (#7193) 2024-12-09 10:10:15 -07:00
FusionPBX e1cfb7931e
Active Calls responsive design update 2024-12-07 13:28:27 -07:00
Alex f0bc1cfe33
Update contacts path (#7192)
* Update contacts path

* Update menu.php

* Update contact_edit.php

* Update contact_relation_edit.php

* Update config.php

* Update authentication.php

* Update database.php

* Update totp.php

* Update email.php
2024-12-06 11:55:41 -07:00
chansizzle 014adb461b
add call duration to the active calls page (#7191)
* add call duration to the active calls page

* add duration label for active calls
2024-12-04 15:13:25 -07:00
FusionPBX f0837e173b
Add function_exists for posix_getsid
Used to support operating systems that don't support posix_getsid
2024-12-02 18:34:49 -07:00
markjcrane 78306a1a68 Add execute permission 2024-12-02 18:05:26 -07:00
FusionPBX 57a792dccd
Use the PHP_BINARY constant 2024-12-02 17:58:07 -07:00
FusionPBX efdc007eb2
Use the PHP_BINARY constant 2024-12-02 17:55:35 -07:00
FusionPBX 6f1c595b1f
Use the PHP_BINARY constant 2024-12-02 17:54:49 -07:00
FusionPBX 642d4cd8d7
Set the Yealink default to 4 PAI-RPID-FROM 2024-12-02 11:56:35 -07:00
frytimo bb76878156
fix voicemail message count when viewing all domains (#7186) 2024-11-30 12:10:58 -07:00
frytimo 58cfa404b7
fix voicemail message length and size display (#7185) 2024-11-30 11:40:52 -07:00
FusionPBX cd8d5302ac
Fix temporary permissions 2024-11-29 13:57:01 -07:00
FusionPBX 4db95658c3
Method new allow null
Needed to support temporary permissions
2024-11-29 13:50:14 -07:00
FusionPBX 77ec211020
Update functions.php
Remove closing PHP tag
2024-11-29 13:45:40 -07:00
frytimo 91dcc94e82
Fix typo in filename (#7180) 2024-11-27 14:24:03 -07:00
frytimo 7133d4bff1
parse windows 1256 encoding type in email to fax (#7182) 2024-11-27 14:21:45 -07:00
FusionPBX 8563df387f
Start the session in the header.php 2024-11-27 09:26:10 -07:00
FusionPBX c88378a4fe
Default dashboard_label_background_color to empty 2024-11-27 09:23:04 -07:00
FusionPBX 790d1ff137
Use the permissions::new method 2024-11-27 00:14:18 -07:00
FusionPBX 3a14a19800
Create a singleton method called new 2024-11-27 00:11:58 -07:00
FusionPBX 5757f2c9ee
Fix CSS missing characters
Disable the ob_gzhandler
2024-11-26 23:53:32 -07:00
FusionPBX 6e1d52e6b8
Update permissions.php 2024-11-26 22:49:23 -07:00
FusionPBX 5d7a124a79
Fix permissions when not using a session 2024-11-26 21:48:08 -07:00
frytimo b7afc086ec
Update the menu class (#7181)
* fix php warnings in the menu class

* remove an unreachable statement

* update the menu_horizontal function to use settings

* use a single text object

* update menu_side_state to use the default value of contracted

* remove unused variable

* use variables for menu_side_state

* remove unused variable

* remove whitespace

* remove unused variable

* check for user UUID and domain UUID passed to the constructor

* update docs
2024-11-25 10:34:16 -07:00
FusionPBX 2a41ccfebd
Return an empty array if there are no groups 2024-11-20 13:52:58 -07:00
FusionPBX 8655c792a3
Fix ring group missed call to show in CDR 2024-11-19 13:42:25 -07:00
FusionPBX c3c1b18358
Contacts has been moved to the core
This means the contacts should always be avaialble.
2024-11-19 11:39:18 -07:00
FusionPBX 9cb1217995
Update app_defaults.php 2024-11-19 10:13:31 -07:00
FusionPBX 075dcfd96f
Update the path to contacts 2024-11-16 21:11:07 -07:00
FusionPBX 00c4dd374e
Update app_menu.php 2024-11-16 21:08:40 -07:00
markjcrane 9b843bbff0 Move contacts from the app to core directory 2024-11-16 21:06:29 -07:00
FusionPBX cbcc47d47b
Create conference transfer.lua 2024-11-15 15:39:52 -07:00
FusionPBX 7f527aba07
Fix the sql query 2024-11-15 14:32:45 -07:00
FusionPBX d562d11528
Create three_way.lua 2024-11-15 14:16:22 -07:00
fusionate cb9c79bf86
Fax Server - Sent List: Fix Destination value. 2024-11-14 18:56:15 -07:00
FusionPBX caba7800d1
Updated Call Flow Summary for outbound calls 2024-11-14 17:06:41 -07:00
fusionate 15cad2369c
Fax Server - Fax to Email: Fix population of cover page labels. 2024-11-14 13:21:14 -07:00
FusionPBX aae7cbdc5a
Fix the voicemail transcribe title 2024-11-13 17:46:53 -07:00
FusionPBX 33354ff5c7
Update ring_group_edit.php 2024-11-13 16:23:43 -07:00
FusionPBX 5cb5f97743
IVR Menu direct_dial_digits_max set default to 8 2024-11-12 15:39:26 -07:00
FusionPBX 8f08303a82
Add bittel to device vendors 2024-11-12 15:06:38 -07:00
FusionPBX 0a33e58b87
Add vendor Bittel 2024-11-12 14:53:14 -07:00
FusionPBX fc5f10acfa
Add vendor bittel 2024-11-12 14:50:18 -07:00
ijaron 06a6646acb
Updated gxv3240/phonebook.xml (#7153)
Creates groups based on contact type. groups contacts with more then number into one contact.
Sets FirstName to contact_organization if there is no given or family name but contact_organization is set

Labels work, home, and mobile numbers with all others set as other

Sets Primary to line with phone_primary set (will set Primary for each if multiple lines have phone_primary set even though phone  will likely only use one of the tags)
2024-11-09 18:45:30 -07:00
ijaron 8f8caaede7
Update dp750/phonebook.xml (#7151)
Fixes phonebook.xml to work with current contacts.
Sets contact_organization to FirstName if  contact_name_given and contact_name_family are not set but contact_organization is

sets Phone type for home and mobile, sets all others to work

Loads category == "extensions" as well
2024-11-09 18:42:19 -07:00
ijaron 40f78c3c28
Update dp750/mac.xml (#7152)
* Update dp750/mac.xml

Use $grandstream_ring_timeout for Ring time rather then hardcode
Use $grandstream_dial_plan for every account rather then only first
set Station name to DP750-{$mac}
Add option for Automatic Reboot (Firmware 1.0.17.1+)
Allow $grandstream_stun_server and use stun if $grandstream_nat_traversal == 1
$grandstream_accept_sip_from_proxy_only to set Disable Direct IP Call
Turn off 3CX Auto Provision
Use $grandstream_automatic_provisioning and convert to values used in DP750 vs other grandstream heardware
Allow $grandstream_automatic_provisioning_minutes $grandstream_automatic_provisioning_hour $grandstream_automatic_provisioning_day

use $grandstream_phonebook_download_interval rather then just disabling
2024-11-09 18:40:36 -07:00
Antonio Fernandez 9e5116b8fb
contacts appear by default in templates (#7154) 2024-11-09 18:30:03 -07:00
frytimo 773ecc96cc
pass database object to settings object (#7178)
Use the singleton database object with database::new syntax
Pass the connected database object to the settings object so settings object does not have to create another connection
2024-11-09 18:29:22 -07:00
FusionPBX fca029b7df
Use include internal on answered, missed and voicemail
This hides local calls which could also be calls to feature codes. Only add these feature code calls to the count if directed to show internal calls.
2024-11-08 18:09:32 -07:00
FusionPBX 318953bddf
Fix the destination summary when server using UTC
Set the PHP time zone to fix the destination summary report. Without the time zone set it would use the server operating system time zone.  If the time zone is set to UTC when it rolled over to a new date ahead of the local time zone it would make the report show 0 results.
2024-11-08 17:44:09 -07:00
FusionPBX 139867815f
Fix the extension summary and call flow summary
Set the time zone in PHP so that it is correct inside the class method for the extension summary and the call flow summary
2024-11-08 17:21:18 -07:00
FusionPBX 2ad7f5df6d
Yealink boolean and numeric use text
The provisioning template delivers the value as a string
2024-11-04 10:19:58 -07:00
FusionPBX 6b3251ea67
Use yealink_trust_certificates directly
Value should be 0 or 1
2024-11-04 10:09:24 -07:00
FusionPBX baed3947d4
Make sure the origination_uuid is set 2024-11-04 08:21:03 -07:00
Mendel 0757245b75
Update device.php (#7175)
With the help of Tim, he found this typo that has now been resolved.
2024-11-03 19:43:15 -07:00
FusionPBX afdb029a25
Update http_auth to use boolean 2024-11-01 14:17:32 -06:00
FusionPBX 175e88e15a
Fix for the device template
If the device vendor matches then use the alternate device template
2024-11-01 12:33:34 -06:00
Antonio Fernandez fab9a6bbc9
Ring Group search in CDR (#7177)
* Adding Ring Group dropdown in cdr search

* 2nd commit

* remove unused permission
2024-11-01 10:06:23 -06:00
FusionPBX b55e542cbd
Fix lua stream file 2024-10-31 19:33:38 -06:00
fusionate 37ff548fa8
Side / Fixed Menu: Image placeholder tool tip. 2024-10-31 11:49:31 -06:00
fusionate b766ad7f27
Side / Fixed Menu: Image placeholder for User Menu in Body Header / menu bar. 2024-10-31 11:37:17 -06:00
FusionPBX 42d634dc76
Allow adding a large list of emails 2024-10-30 14:11:46 -06:00
fusionate d627db10a6
Devices [Class]: Fix typo. 2024-10-30 13:27:39 -06:00
Antonio Fernandez 3714dc73f4
fix call screen saving (#7174) 2024-10-29 15:52:40 -06:00
FusionPBX 34b8679917
Update the version 5.4.0
This version change seperates it from the current release version.
2024-10-29 15:19:49 -06:00
FusionPBX 7fe9ad5c77
Fix page load time for call_recordings
The page load time was slow when there were no call recordings for the domain.

Remove domain_uuid is null as this isn't needed for call recordings.
2024-10-28 11:00:24 -06:00
FusionPBX 3a0d5fb512
Remove the session when the password is changed 2024-10-27 18:04:35 -06:00
FusionPBX c81e6482a8
Replace the empty function with isset
Don't use empty when value can be 0
2024-10-27 11:08:37 -06:00
FusionPBX f44f9636db
Cast to integer
This prevents an error that was seen on FreeBSD
2024-10-26 22:16:35 -06:00
FusionPBX fbb254c3db
Update and rename 500_ring-group-forward.xml to 495_ring-group-forward.xml 2024-10-25 15:30:39 -06:00
FusionPBX 575db5c918
Create 895_call-forward-no-answer.xml
Add new way to handle call forward no answer
2024-10-25 13:09:17 -06:00
FusionPBX 6e1ef36821
Correct the use of the settings class 2024-10-25 12:44:05 -06:00
FusionPBX ebaf1f909f
Use boolean in conditional statement 2024-10-24 14:37:26 -06:00
frytimo f86214f61e
Fix email send breaks transcribe when php 7.1 is used (#7170)
Ensured the values are of boolean type as PHP 7.1 treats them strange
2024-10-24 14:11:25 -06:00
FusionPBX 11cc01a79a
Provision settings adjust types
If the type is boolean with a value of 0 or 1, use type text; if it is numeric, use type text.

 The template default setting uses a string for the template values, and a boolean type is used with conditions.
2024-10-23 15:10:31 -06:00
FusionPBX adf3ac9aab
Use boolean in the if statement 2024-10-23 13:56:09 -06:00
FusionPBX 9bd77856b8
Fix the condition for smtp_from 2024-10-23 11:32:44 -06:00
FusionPBX e49e2f01ce
Remove redundant code
Handled in the constructor
2024-10-23 10:54:52 -06:00
frytimo 56f3135f21
Update template to match new boolean in settings (#7166) 2024-10-22 20:04:27 -06:00
FusionPBX 2765c1d229
Extension directory order by first name 2024-10-22 19:11:07 -06:00
FusionPBX d28a98bbb1
Update provision.php
Remove debug info
2024-10-22 19:06:45 -06:00
Antonio Fernandez 2f30694ead
Fix Avaya BLF issue on reSUBSCRIBE (#7164)
* Fix Avaya BLF issue on reSUBSCRIBE

* fix an accidental modification
2024-10-22 19:01:50 -06:00
FusionPBX 3415d57751
Provision enabled setting default boolean 2024-10-22 19:00:05 -06:00
FusionPBX fa596c94a4
Provision setting enabled use boolean 2024-10-22 18:58:03 -06:00
frytimo 557de4b744
Update settings using real boolean (#7165)
* update settings using real boolean
2024-10-22 18:55:19 -06:00
FusionPBX 7db445f825
Update boolean devices.php 2024-10-22 18:40:58 -06:00
FusionPBX 23acd611c2
Boolean settings as type boolean
PHP 7.1 and 8.1 handled boolean string differently. Changed the type to a proper boolean to resolve this issue.
2024-10-22 18:23:49 -06:00
FusionPBX 56c59289d4
Update boolean settings
Settings of type boolean need to be set as boolean.
2024-10-22 18:15:35 -06:00
FusionPBX f24847d1c4
Update index.php 2024-10-21 15:25:45 -06:00
Antonio Fernandez b801b8a5c9
fix search when pressing enter in textbox (#7162) 2024-10-18 20:57:15 -06:00
fusionate 9af1f46079
Voicemail Messages - List: Remove unused parameters from the recording_seek() function call. 2024-10-18 19:25:59 -06:00
fusionate 35d097913f
Voicemail Greetings - List: Remove unused parameters from recording_seek() function call, remove additional <td>...</td> tag, add another column count increment. 2024-10-18 19:22:54 -06:00
fusionate b2426a52f4
Recordings - List: Remove extra </td> tag. 2024-10-18 19:18:06 -06:00
fusionate c812dfb58b
Music On Hold: Remove unused parameters from the recording_seek() function call. 2024-10-18 19:07:19 -06:00
fusionate bc3e032efc
IVR Menu - Edit: Remove unused parameters from the recording_seek() function. 2024-10-18 19:05:08 -06:00
fusionate 5d5fbbc83d
Template: Remove unused parameters from recording_seek() function. 2024-10-18 19:02:21 -06:00
fusionate e0fe291da0
CDR - Recording Playback: Fix seeking for chromium based browsers. 2024-10-18 18:58:44 -06:00
anthony-ricci 7122ecc154
Recording Seek (#7163) 2024-10-18 18:45:21 -06:00
FusionPBX 81fc86fc01
Handle country code, trunk prefix and area code 2024-10-17 13:15:26 -06:00
FusionPBX 644bcd5c4c
Update hangup_rx.lua 2024-10-17 13:10:05 -06:00
FusionPBX a1976b2aec
Add contact string to hover 2024-10-17 11:59:39 -06:00
FusionPBX ed836aa41e
Update fax_send.php
- Optimize the database connection
- Use loopback for local FAX destinations
2024-10-17 02:39:03 -06:00
FusionPBX 75a2f5ffd9
Prevent a nil error 2024-10-17 02:32:48 -06:00
FusionPBX 581c6177cf
Update hangup_rx.lua
Prevent an error if the value of x is nil.
2024-10-17 02:29:23 -06:00
fusionate 5459bca44b
CDR - Recording Playback: Fix progress indicator in chromium based browsers. 2024-10-16 17:29:10 -06:00
FusionPBX 9c68c183f2
Fix play recording in CDR 2024-10-16 16:18:13 -06:00
FusionPBX 531aad8baa
Update index.lua 2024-10-16 15:49:39 -06:00
FusionPBX 5c9658334c
Update app_defaults.php 2024-10-16 11:53:45 -06:00
Antonio Fernandez 3b8309af11
fix waveform image background (#7160) 2024-10-15 15:19:04 -06:00
FusionPBX 7b025e490f
Update fax sending order 2024-10-15 12:06:02 -06:00
FusionPBX c21a6cad4c
Add login_background_image 2024-10-11 11:15:29 -06:00
FusionPBX d309ffc1cf
Update the condition for boolean 2024-10-10 17:22:59 -06:00
FusionPBX fc4f75f30c
User logs fix failed 2024-10-10 16:21:03 -06:00
frytimo 949d407604
change include to require once (#7157)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-10-09 09:19:08 -06:00
anthony-ricci 6b49a92f76
Update xml_cdr.php (#7156)
Fixed CDR recording playback - casting an empty string to an int breaks the if statement.
2024-10-08 17:27:54 -06:00
Antonio Fernandez 71b8767d21
Added support for Snom C620 DECT conference phone (#7155)
* Added support for Snom C620 DECT conference phone

* added base firmware option

* added base ds

* added speakerphone firmware
2024-10-08 09:45:03 -06:00
fusionate b498af4cf4
Theme - Fixed Menu: Add new user menu to menu bar. 2024-10-07 14:36:55 -06:00
FusionPBX 1134341635
Before using is_numeric cast the value to int
Without this cc_queue_joined_epoch, cc_queue_answered_epoch, and other values were seen as a string
2024-10-07 14:28:41 -06:00
FusionPBX ab8108e3b7
fixed call center agent save 2024-10-07 13:07:03 -06:00
FusionPBX 7ecfe96381
Add agent state to indicate wrap up time 2024-10-07 11:39:28 -06:00
FusionPBX b9a0cdf4e7
Update authentication.php 2024-10-06 10:32:57 -06:00
FusionPBX 2a9798b370
Fix the FIFO lag time
This is also known as the wrap-up time after the call ends with the agent.
2024-10-04 01:37:25 -06:00
FusionPBX e186958006
Delete app/dialplans/resources/classes/dialplan.better.php 2024-10-04 00:26:06 -06:00
FusionPBX 2c0c8e5a93
Update the database connection 2024-10-04 00:16:40 -06:00
frytimo 1bd7dc1687
Add ability to set a default ringback on ivr menu (#7149)
* add ability to set a default ringback on ivr menu
2024-10-03 23:39:35 -06:00
frytimo aa7c618325
Add ability to set a default ringback on ring group (#7150) 2024-10-03 23:28:36 -06:00
fusionate 0d8d2aacc7
Fax - Sent: Add time sent to cover sheet. 2024-10-02 17:17:26 -06:00
FusionPBX bb2232e62d
Fix valet_park use sip_refer_to
The referred-by domain can't be used as some phones use the domain of the tenant and some their own IP address. For this reason, replaced with sip_refer_to.
2024-10-02 13:37:00 -06:00
FusionPBX 8ce9643901
Removed for better backwards compatibility 2024-10-02 11:35:54 -06:00
FusionPBX 519627b8e5
Fix valet park when call is sent to a different domain
When crossing domains we need to use park with the correct domain. This change uses the referred by to get the proper domain name.
2024-10-01 16:32:09 -06:00
Andy-Seattle a232176717
Update app_config.php (#7147)
Added a permission for call recording transcription as currently the transcribe button is displayed by default whenever a recording is selected. It should be controlled by a permission.
2024-09-30 17:45:08 -06:00
Andy-Seattle c33b5ba2b7
Update call_recordings.php (#7148)
Use the new call_recording_transcribe permission to determine if the Transcribe button should appear.
2024-09-30 17:44:52 -06:00
FusionPBX 3ad177e6c1
Fix call screen to end recording with dtmf and silence 2024-09-30 10:05:00 -06:00
fusionate ae15319487
Body Header User Image and Menu, Domain Selector, Contact Attachment improvements. 2024-09-28 16:37:36 -06:00
FusionPBX 7f2bd7d53a
Fix provision auto_insert_enabled 2024-09-28 11:01:39 -06:00
fusionate b9ebdf673e
Side Menu - Body Header: Show User's assigned primary Contact Attachment image, if exists. 2024-09-27 17:14:42 -06:00
fusionate 8ffbcd09f3
Users - Edit: Minor visual adjustment to API Key Generate and View buttons. 2024-09-27 12:43:45 -06:00
fusionate 21ca2c4761
Contacts - Edit: Better QR Code positioning and sizing. 2024-09-27 12:25:48 -06:00
fusionate 0e39d35a0b
Contacts - List: Better image view position (always centered on viewport). 2024-09-27 12:25:05 -06:00
fusionate 778acbe551
Contacts - List: Better image view position (always centered on viewport). 2024-09-27 12:24:16 -06:00
fusionate 86d018009e
Fax Server: Better view position (always centered on viewport). 2024-09-27 12:23:11 -06:00
fusionate 9ebf0f7bca
Contact - Attachments: Preserve image transparency, large viewing on edit page, other minor adjustments. 2024-09-27 11:56:38 -06:00
fusionate afa0b91b15
Contacts - Attachments: Fix download and image display. 2024-09-27 11:30:53 -06:00
frytimo 28ddb69fe1
add existing multicast options from default settings to yealink t46s (#7146)
Comparing the t46s to the t54w, there were a lot of missing settings beyond the original multicast options that were missing. The two templates have been reconciled with differences and any missing options already available to the t46s that were defined in the t54w have been added.
2024-09-27 07:55:04 -06:00
Alex 84950065aa
Add content card to voicemail greetings (#7142)
* Add content card to voicemail greetings

* Update voicemail_greeting_edit.php
2024-09-26 15:57:32 -06:00
FusionPBX ced8c16a28
Allow right click open in new window 2024-09-26 09:47:12 -06:00
FusionPBX 5a8ab2dd8f
Add the domain_name variable
Without the domain_name variable in some cases the confirm option doesn't work.
2024-09-26 08:44:43 -06:00
frytimo 1762dabfab
add detect audio length of recording (#7140)
* add detect audio length of recording

* Update page.lua
2024-09-26 07:59:31 -06:00
frytimo 4f32833e30
fix dashboard break when app removed (#7141)
Places a guard to check for the file existing before the file is included. Without the guard, PHP will stop with a fatal error.
2024-09-26 07:53:30 -06:00
fusionate 4e17e9e920
Fax Server - Edit: Add period to Confirmation Email description. 2024-09-24 16:35:43 -06:00
fusionate 183e5d652d
Fax Server - Edit: Adjust style for Email & Confirmation Email fields. 2024-09-24 16:33:46 -06:00
FusionPBX 64a95a972e
More efficient use of the database object 2024-09-23 19:19:19 -06:00
FusionPBX 50a1ed145c
Fix voicemail greeting for base64
- Use the settings class
- Re-use the database object
- Update the indentation
2024-09-23 18:17:44 -06:00
FusionPBX 0c9329b119
Restore previous caller ID behavior
If the caller ID was updated then update the caller ID
2024-09-23 13:00:46 -06:00
FusionPBX 095d0d836f
Add translations for email confirmation 2024-09-23 09:40:51 -06:00
anthony-ricci 4df5253b64
Fax Server changes (#7136)
* Added the ability to send out successful and failed fax notifications to a separate list of email addresses (confirmation emails), in addition to the email address of the originator of the fax.
 * Added new fax_email_confirmation permission
* Check the Session variable for the user's email first and if it is not set, then query the database for the currently logged-in user's email.
2024-09-23 09:10:37 -06:00
FusionPBX 1d5506826a
Fix permission_exists fax_file_edit 2024-09-21 21:12:43 -06:00
FusionPBX 9292dda43f
Fixed the registration count
- Fixed on the dashboard for those with superadmin group
- Fixed the count in the SIP status page
2024-09-21 12:50:36 -06:00
FusionPBX 665bb0e802
Default value for create recording should always be false 2024-09-20 23:08:28 -06:00
FusionPBX 98e7eb725f
Add ignore early media for external calls 2024-09-20 16:20:02 -06:00
FusionPBX 20b358f05f
Get the domain_name with a different variable
Get the domain_name with a different variable if the domain_name is not set
2024-09-20 16:16:25 -06:00
Anthony 7263dfe15c
Added/Adjusted translations in app app_languages.php files (#7139)
* Added Turkish translations to database_transactions/app_languages.php

* Added Turkish translations to conferences_active/app_languages.php
2024-09-20 16:01:13 -06:00
FusionPBX c4baf4ad92
Use ring group destination confirm true when call screen is enabled 2024-09-20 13:17:20 -06:00
fusionate 8d81c5f2d7
Extension Summary: Restore previous form wrapping. 2024-09-20 11:37:53 -06:00
fusionate 99b1c1792e
Extension Summary: Fix form layout. 2024-09-20 11:35:53 -06:00
markjcrane 65cb4fe20c Remove the CSS card overflow it cut off the date-time picker 2024-09-20 10:56:49 -06:00
markjcrane 68c79ca0a3 Remove carriage return per line and leave only line feeds 2024-09-19 17:14:21 -06:00
markjcrane 5cbc53c7d9 Fix end of file line only use one line feed at the end of the file 2024-09-19 16:33:17 -06:00
FusionPBX f914922383
Update Grandstream templates
- grandstream_timezone updated to use grandstream_time_zone
- disable wifi settings with an IF statement
- other miscellaneous changes
2024-09-19 12:39:26 -06:00
chansizzle a36b20dbf6
add count next to the title (#7137) 2024-09-19 09:12:05 -06:00
FusionPBX 5bae14c6f9
Update xml_cdr.php 2024-09-18 19:07:02 -06:00
FusionPBX 99ceb6e158
Align SEARCH and other buttons to the right 2024-09-18 18:44:52 -06:00
FusionPBX 6701e4c36d
Show only default extension type
Hide virtual extensions
2024-09-18 11:53:05 -06:00
FusionPBX d9319e4cf1
Update the border radius 2024-09-18 11:36:18 -06:00
FusionPBX 1c0267883b
FIFO Queues added to destination select list
- Also add a new permission fifo_destinations
2024-09-17 22:50:36 -06:00
FusionPBX f03b5ad8bd
Fix voicemail base64 greeting 2024-09-17 17:46:22 -06:00
fusionate 6a467f01af
Remove test code on previous commit. 2024-09-17 14:41:44 -06:00
fusionate e4aa30bcd6
Fax - Sent: Added Recipient column, if allowed. 2024-09-17 14:38:11 -06:00
FusionPBX 7cd6aec9df
Add ring group call screen translations 2024-09-16 23:56:57 -06:00
FusionPBX 9a24c9fa42
Update version to 5.3.3
Major version update. A new branch 5.3 branch created from this point.
2024-09-16 21:44:20 -06:00
FusionPBX fa23ffe255
Disable Call Block dashboard by default 2024-09-16 21:41:31 -06:00
FusionPBX 61d68e2f7d
Update the domain dashboard order 2024-09-16 21:38:36 -06:00
FusionPBX adeb3ac8a7
Add Contacts to the dashboard 2024-09-16 21:21:28 -06:00
FusionPBX e4a8efa0b9
Add event guard to the dashboard 2024-09-16 21:20:12 -06:00
FusionPBX e7434f3560
Update more theme settings 2024-09-16 19:56:29 -06:00
FusionPBX 9d1e8d1110
Update a few more theme settings 2024-09-16 19:45:10 -06:00
FusionPBX 4f87a17761
Update multiple theme settings 2024-09-16 19:40:49 -06:00
FusionPBX aa9c7a18ed
Update button theme colors 2024-09-16 19:00:29 -06:00
FusionPBX f42e11cabe
Update menu theme colors 2024-09-16 18:55:55 -06:00
fusionate 7fc0f19032
Dashboard: Default color adjustments. 2024-09-16 18:30:34 -06:00
FusionPBX 7a77f25057
Update the card theme settings enable by default 2024-09-16 18:29:27 -06:00
fusionate cc08aa724d
Dashboard: Widget counter pill style adjustments. 2024-09-16 18:22:28 -06:00
FusionPBX 4dd7336d32
Update the colors used on the dashboard theme 2024-09-16 18:18:14 -06:00
fusionate fd032f4ad4
Dashboard: Widget counter pill style adjustments. 2024-09-16 18:09:04 -06:00
FusionPBX fe4d329657
Update config.php 2024-09-16 15:00:41 -06:00
FusionPBX 944e032b47
Update the domains icon 2024-09-16 14:50:17 -06:00
FusionPBX c134903615
Add domains count dashboard widget 2024-09-16 14:46:36 -06:00
FusionPBX cabb0d39b6
Add domain dashboard config 2024-09-16 14:45:51 -06:00
FusionPBX a82bd419c6
Add dashboard icon to the list 2024-09-16 14:40:28 -06:00
FusionPBX e6fea6295a
Add translation for progress bar 2024-09-16 14:37:58 -06:00
FusionPBX 493ea83cc3
Add icon and icons 2024-09-16 14:33:49 -06:00
Alex 01e41b09a1
Update system_status.php (#7134) 2024-09-16 14:14:17 -06:00
FusionPBX 340c6e17f3
Add ring group call screening 2024-09-15 16:47:53 -06:00
FusionPBX 795343379c
Handled in its own dashboard widget
For this reason remove the registration count from system status.
2024-09-14 21:49:53 -06:00
FusionPBX 540efc355f
Move the get_memory_details functions 2024-09-14 21:38:14 -06:00
FusionPBX 5e75879518
Add email queue audio string
This enables sending base64 to the transcription class
2024-09-14 21:27:02 -06:00
FusionPBX 384492ab7e
Update the icon color 2024-09-14 16:18:29 -06:00
Alex ca10a3e518
Update registrations.php (#7133) 2024-09-14 16:12:37 -06:00
FusionPBX cee08c8eb7
Update the registration widget 2024-09-14 13:16:22 -06:00
Alex 7edc65fce4
Fixed alignment on dashboard system status progress bars (#7132) 2024-09-14 10:56:18 -06:00
FusionPBX 624877541b
Update dashboard_edit.php 2024-09-14 03:56:45 -06:00
FusionPBX a31484d414
Update dashboard.php 2024-09-14 03:55:20 -06:00
FusionPBX 0357a08a25
Correct the icon name 2024-09-14 03:52:21 -06:00
FusionPBX 02054ae683
Add the missed call icon 2024-09-14 03:45:08 -06:00
FusionPBX 8d5a190063
Add the dashboard icons 2024-09-14 03:40:08 -06:00
FusionPBX a9f61e8cfc
Update missed, recent calls and new messages 2024-09-14 03:10:55 -06:00
FusionPBX c406761897
Update system_status.php 2024-09-13 21:32:08 -06:00
FusionPBX 70b081726e
Call forward widget simple by default 2024-09-13 19:30:51 -06:00
FusionPBX 88b76a4e6d
Dashboard widgets collapsed by default 2024-09-13 19:28:13 -06:00
FusionPBX 8e9527a1c1
Update system_status widget add memory details
Completed work on disk usage percentage
2024-09-13 19:15:15 -06:00
FusionPBX aad87759ac
Remove expanded row span change 2024-09-13 19:10:45 -06:00
Alex 5e6d494796
Add progress bar to system status dashboard (#7131)
* Add progress bar to system status dashboard

* Update dashboard_edit.php

* Update app_languages.php

* Update config.php
2024-09-13 17:00:21 -06:00
FusionPBX 8c67b31441
Update config.php 2024-09-13 16:41:05 -06:00
Anthony 2de3c6f3bd
Added Turkish & adjusted translations in dialplan_inbound & outbound (#7130)
* Update app_languages.php

* Added Turkish & adjusted translations in dialplan_inbound/app_languages.php
2024-09-13 15:15:23 -06:00
FusionPBX 69c0827669
Add system status
Disable system cpu and disk usage dashboard widgets
2024-09-13 15:14:05 -06:00
FusionPBX 4af96791a5
Create system_disk_usage.php 2024-09-13 15:09:35 -06:00
FusionPBX 2f4954fad1
Send base64 string to the send_mail function 2024-09-12 18:38:11 -06:00
FusionPBX 3429f12850
Add email_base64 to the send_mail function 2024-09-12 18:32:50 -06:00
FusionPBX 8edc5d1205
User edit add a Settings button 2024-09-12 09:41:01 -06:00
fusionate f073dbe152
Theme: Style adjustments. 2024-09-11 18:35:50 -06:00
fusionate 102b9ee9cb
Dialplan - Edit: Fix card. 2024-09-11 18:08:31 -06:00
FusionPBX 70dc966a5a
Disable the row description background 2024-09-11 12:51:15 -06:00
FusionPBX 6296fb1f73
Update fax_advanced.php
The IMAP FAX settings for advanced were part of the fax_edit.php these settings were moved to the fax advanced file. 

This update focuses the code only on the Advanced settings its intended to manage.
2024-09-11 09:26:09 -06:00
frytimo 414e0b2a21
fix fax caller id number empty (#7129) 2024-09-11 09:09:14 -06:00
FusionPBX 2032e4937e
Support sip_port value of 0
Change empty to !isset to account for sip_port that can be set to 0.
2024-09-10 13:40:44 -06:00
FusionPBX e86ec20547
Update background_video
- Uses type array
- Use the first item in the array
2024-09-10 04:03:44 -06:00
FusionPBX 86df5a2e6a
Remove transcription from voicemails index.lua
Transcription was moved to the email queue
2024-09-10 01:08:55 -06:00
FusionPBX 6d7b3a9249
Update fax_emails.php
Add additional logging information
2024-09-09 21:06:30 -06:00
FusionPBX c5be2b27e9
Update fax_emails.php
- Get the domain name more efficiently
- Add the domain name to the output
2024-09-09 20:38:26 -06:00
fusionate 8e410a4b19
Theme - Side Menu: Better position submenu icons. 2024-09-09 18:47:42 -06:00
fusionate b05ebfc440
Menu - Edit: Add icon preview to items list. 2024-09-09 18:42:20 -06:00
fusionate 4ecb9650e0
Theme: Add settings to control color/hover of list row text links. 2024-09-09 18:28:39 -06:00
fusionate 418fc49ba8
Theme - Body Header: Add settings to control link text color/hover. 2024-09-09 17:43:07 -06:00
fusionate d8877203c7
Menu Edit - Item List: Fix count. 2024-09-09 17:42:23 -06:00
fusionate 6295dbe4fb
Theme - Side Menu: Fix sub menu icons. 2024-09-09 17:02:45 -06:00
fusionate dbd59bb70a
Theme - Fixed Menu: Fix submenu icon formatting in second column. 2024-09-09 16:42:20 -06:00
Alex 0c5a2ca784
Update streams.php (#7127)
* Update streams.php

* Update call_center_queue.php

* Update menu.php

* Update vars.php

* Update dashboard.php

* Update dashboard_edit.php
2024-09-09 15:25:24 -06:00
Anthony 20283be299
Added Turkish & adjusted translations in dialplans/app_languages.php (#7128) 2024-09-09 15:24:42 -06:00
fusionate 8c155bf066
Theme - Side Menu: More side menu pin scrubbing. 2024-09-09 14:14:17 -06:00
fusionate d67bb02736
Theme - Side Menu: Scrub side menu pin. 2024-09-09 14:13:27 -06:00
fusionate 8f36cd3218
Theme - Side Menu: More adjustments. 2024-09-09 14:11:32 -06:00
fusionate 0d9400de54
Theme - Side Menu: More updates. 2024-09-09 13:51:23 -06:00
fusionate b8689d8f57
Theme - Side Menu: More updates. 2024-09-09 13:22:44 -06:00
FusionPBX 214a24bc39
Simplify voicemail transcription
This is done by deprecating default setting voicemail transcribe_enabled.

Instead control this with the voicemail_transcription_enabled permission  and per voicemail.
2024-09-09 12:58:36 -06:00
fusionate 259ac1212d
Theme - Side Menu: More adjustments. 2024-09-09 12:36:16 -06:00
fusionate f4fbb34e5f
Theme - Side Menu: More adjustments. 2024-09-09 12:29:49 -06:00
fusionate 6059c1e7d1
Theme - Side Menu: Adjustments. 2024-09-09 10:53:12 -06:00
FusionPBX 3b19f4a464
function permisison_exists remove operator
It was added by a contributor who hasn't used it anywhere in the project. For this reason its being removed.
2024-09-09 09:31:54 -06:00
frytimo 2085c950ee
Use isset in permission exists for improved efficiency(#7126)
Using isset on the key name of the array allows it to use a hash table lookup to improve the lookup times for a permission. The permission name is not set if it does not exist for the current user.
2024-09-09 09:14:45 -06:00
FusionPBX 04125ef651
Deprecate ZRTP and inbound-late-negotiation disable by default 2024-09-07 17:38:48 -06:00
fusionate 76d76c8c56
Dashboard: Fix action bar sticky. 2024-09-07 13:12:53 -06:00
FusionPBX 6f55603e12
Update 018_global-variables.xml 2024-09-07 09:50:29 -06:00
FusionPBX 349889ad15
Update vars.xml
Remove a few irrelevant switch variables
2024-09-07 09:47:18 -06:00
FusionPBX ba64a3604d
Global variables add ringback and transfer ringback
Add ringback and transfer_ringback to the global-variables dialplan default enabled false.
2024-09-07 09:44:31 -06:00
FusionPBX 1418b5afc7
Fix the new default setting custom search 2024-09-07 09:21:09 -06:00
fusionate d131f00a4e
Theme: New Settings to control body header shadow color and size. Add overflow on content cards for small screens. 2024-09-06 20:51:32 -06:00
frytimo d4fdd1ce6b
Add back button to fax queue page. Move permission_exists outside loop (#7125)
* Add back button to fax queue page. Move permission_exists outside loop

* move to permission array instead of individual permission variables
2024-09-06 20:27:19 -06:00
frytimo 9f6d828799
pass objects to authentication plugins when possible (#7123)
* pass objects to authentication plugins when possible
Pass the settings and authentication objects to the plugins to re-use existing objects

* Update authentication.php
2024-09-06 18:20:26 -06:00
fusionate d311dc14e9
Theme: Adjustment to make mobile side menu better. 2024-09-06 17:10:27 -06:00
Alex b43bcb9a13
Added the heading counter div (#7124) 2024-09-06 16:43:42 -06:00
fusionate e2eb190c98
[Revert] Theme: Adjust content card display style. 2024-09-06 15:49:02 -06:00
FusionPBX 2f93054f45
Fixed fifo agent member login and logout 2024-09-06 15:26:36 -06:00
fusionate 4a2d9290be
Theme: Adjust content card display style. 2024-09-06 15:15:02 -06:00
fusionate 4fe331b433
Contact - Edit: Move primary indicator to prevent wrapping in left column. 2024-09-06 13:41:46 -06:00
fusionate ff28c5e4ae
Contacts - Edit: Integrate content cards. 2024-09-06 13:13:08 -06:00
fusionate 7cd891187c
Default Settings: Implement new heading counter style. 2024-09-06 13:12:02 -06:00
fusionate 41afe02b1e
Theme: New Default Settings for header counter style. 2024-09-06 13:11:26 -06:00
Alex c01403cce8
Added content card div to devices (#7122) 2024-09-06 11:20:03 -06:00
FusionPBX 2182ebd0b4
Added the content card div 2024-09-05 23:37:34 -06:00
Alex cb6edd88ef
Added content card to applications (#7121) 2024-09-05 17:10:04 -06:00
FusionPBX 54565ede41
Fix a bug where logo was overridden 2024-09-05 10:28:53 -06:00
frytimo 7b94e9434e
fix authentication logging of cidr fail (#7120)
Correct variable name to use when logging a cidr failed login attempt

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-09-05 09:30:22 -06:00
FusionPBX 4dfcba93b7
Update code for line key variables
Search and replace the variables such as user_id, display_name, and other preset variables to match the correct line key. Focused on it working with multiple line keys.
2024-09-04 20:21:03 -06:00
fusionate 21be3354b1
Theme: Fix issue in last commit. 2024-09-04 20:00:49 -06:00
fusionate 65b957c2f7
Theme: Fix sub menu indicator icons, and date/time picker icons after Font Awesome upgrade. 2024-09-04 19:31:09 -06:00
fusionate 3fc209025e
Theme: Additional Default Settings to control the style of content cards. 2024-09-04 19:01:16 -06:00
fusionate bf7526f0ef
Multiple Apps: Integrate content cards. 2024-09-04 17:51:23 -06:00
frytimo a965c78735
fix empty session username (#7119) 2024-09-04 17:09:16 -06:00
fusionate d234fb185a
Multiple Apps: Integrate content cards. 2024-09-04 16:55:24 -06:00
FusionPBX 73c15de84c
Add card_shadow_color and card_background_color 2024-09-04 15:51:05 -06:00
fusionate ffb6876bd8
Default Settings: Use language variable for new Custom category filter. 2024-09-04 14:48:51 -06:00
fusionate 5a8613ec0a
Adjustment in method used to update Font Awesome icon valuse in * Settings. 2024-09-04 14:36:25 -06:00
frytimo 7dde6ceb85
fix default settings showing all settings as bold (#7118) 2024-09-04 14:12:30 -06:00
fusionate 2eab5c623e
Side Menu: Explicitly set content container width when side_menu_pin enabled to avoid issues with browser caching the css. 2024-09-04 13:49:44 -06:00
FusionPBX 86a4df04cf
Regenerate session every 15 minutes 2024-09-04 12:37:06 -06:00
frytimo b529d2a535
regenerate the session after cidr check is complete and then log (#7117)
Logging after all checks are complete ensures the session ID is correct when logging it in the user_logs table

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-09-04 12:06:09 -06:00
Alex 369b8dd049
Fixed minor visual bug and added missing labels (#7116)
* Fixed minor visual bug and added missing labels

* Update app_languages.php

* Update css.php
2024-09-04 11:33:11 -06:00
FusionPBX 2b1cba9a39
Add a permission called destination_local 2024-09-04 10:34:52 -06:00
FusionPBX 91db42f1e3
Categories are ordered by the SQL Query 2024-09-03 22:54:35 -06:00
FusionPBX 3b521d5150
Add a custom category 2024-09-03 22:48:17 -06:00
FusionPBX 757c085ec1
Update dashboard_edit.php 2024-09-03 20:59:30 -06:00
FusionPBX 8c15185774
Update css.php
Re-adding this as it was accidently removed by a commit
2024-09-03 17:41:10 -06:00
FusionPBX ad1b8fbabb
Add hostname to the user logs 2024-09-03 17:33:29 -06:00
fusionate cbb01cea1e
Dashboard: Rever style to apply background color. 2024-09-03 15:03:38 -06:00
FusionPBX c533b7dd22
Update css.php 2024-09-03 14:18:05 -06:00
FusionPBX 5f36a746d5
update css.php
Fixed the sytnax issue
2024-09-03 14:03:59 -06:00
FusionPBX 1bfa5fed9b
Add setting background_color_enabled 2024-09-03 13:57:48 -06:00
FusionPBX f8e363de2f
Update css.php to use background_color_enabled 2024-09-03 13:42:54 -06:00
fusionate a975f6dcb9
Dashboard: Adjust style method to apply background color hover transition universally. 2024-09-03 11:46:57 -06:00
fusionate 0f06ded327
Dashboard: Resolve chart padding and label issue. 2024-09-03 10:50:45 -06:00
FusionPBX 452ddc9539
Add the session status to user logs 2024-09-02 23:42:52 -06:00
FusionPBX ffd0545a22
Update session regenerate 2024-09-02 22:48:02 -06:00
MarBifrost b4edb3c3a0
Additional corrections to the Georgian translation (#7115)
* Corrections in Georgian translation

* Additional corrections to the Georgian translation
2024-09-02 09:00:55 -06:00
FusionPBX 651da82b90
Share the $database with the function
After removing the new database connection from the function. This caused a bug that is fixed by using the global option in from of the variable to  share it with the function.
2024-09-01 09:44:42 -06:00
FusionPBX 4443519aa1
Add subcontent for shadow and background color
Add css options for background color
2024-09-01 02:18:35 -06:00
MarBifrost 906b3edf03
Corrections in Georgian translation (#7113) 2024-08-31 10:02:51 -06:00
Alex 77db4aa9dc
Added dashboard_shadow_color default setting (#7114)
* Added dashboard_shadow_color default setting

* Update css.php

* Update app_config.php
2024-08-30 14:44:56 -06:00
FusionPBX 0cc12aac52
Allow : in the text pattern 2024-08-29 22:38:17 -06:00
FusionPBX a0cd465052
Allow ? and = for the text pattern
Required for Account Settings link
2024-08-29 22:29:04 -06:00
FusionPBX c474b1a59b
Update the dashboard settings 2024-08-29 22:15:55 -06:00
FusionPBX 5ca4207526
Add dashboard device icon 2024-08-29 16:28:53 -06:00
FusionPBX a828add956
Add dashboard registration icon 2024-08-29 16:25:26 -06:00
FusionPBX 0d747ae3d6
Fix permisisons for call detail records export 2024-08-29 11:35:05 -06:00
FusionPBX b17ce08f7c
Fixed voicemail messages show no results
We removed the pointers &$row because two bugs were found that used them. However, this code uses the pointers. This bug fix resolves this problem.
2024-08-29 11:17:18 -06:00
FusionPBX cc145b1554
Update app_languages.php
Fix the syntax
2024-08-29 10:42:35 -06:00
FusionPBX 7d41385304
Clear the buffer before sending the PDF output 2024-08-29 10:04:18 -06:00
NorwayFun 56704d419f
Localizaton: Finishing remaining files for Georgian (#7112) 2024-08-29 04:20:23 -06:00
FusionPBX f6ce98ad45
Improved database connection handling 2024-08-29 04:04:04 -06:00
Mihir Gajjar 273a45bbb6
Yealink Wifi Settings variables (#7094)
* Update y000000000067.cfg

Update the Yealink T42S template to add variables for Wifi settings.

* Update y000000000065.cfg

Update the Yealink T48S template to add variables for Wifi settings.

* Update y000000000066.cfg

Update the Yealink T46S template to add variables for Wifi settings.

* Update y000000000068.cfg

Update the Yealink T41S template to add variables for Wifi settings.

* Update y000000000069.cfg

Update the Yealink T27g template to add variables for Wifi settings.

* Update y000000000046.cfg

Update the Yealink T29G template to add variables for Wifi settings.

* Update y000000000028.cfg

Update the Yealink T46G template to add variables for Wifi settings.

* Update y000000000035.cfg

Update the Yealink T48G template to add variables for Wifi settings.
2024-08-29 03:41:09 -06:00
FusionPBX e0ed81a5ba
Re-use the Database connection 2024-08-29 03:35:38 -06:00
FusionPBX 9347d682bf
Update user settings
Re-use the database connection
2024-08-29 03:10:28 -06:00
FusionPBX 5b9e886183
Update conference center
Re-use the database connection
2024-08-29 03:03:09 -06:00
FusionPBX e160c23268
Update contacts database connection 2024-08-29 02:56:50 -06:00
FusionPBX 15d616f949
Update domain_edit.php
Re-use the database connection
2024-08-29 02:44:59 -06:00
FusionPBX 83c286c513
Update menu_item_edit.php
Re-use the database connection
2024-08-29 02:40:43 -06:00
FusionPBX 34661e9dc7
Update app_languages.php 2024-08-29 02:07:19 -06:00
FusionPBX 029fbefeba
Update app_languages.php 2024-08-29 01:59:47 -06:00
FusionPBX 032b6fca3e
Update translations 2024-08-29 01:57:18 -06:00
FusionPBX d76c4893da
Update resources/app_languages.php
Add missing translations
2024-08-28 23:39:44 -06:00
FusionPBX 54484dedd5
Update dashboard content widget 2024-08-28 12:57:27 -06:00
FusionPBX af15a8e5bc
Update dashboard_edit.php
Sanitize the data before being added to the database
2024-08-28 12:17:22 -06:00
FusionPBX a81cbe4db2
Allow line feeds in the text 2024-08-28 12:16:22 -06:00
FusionPBX 16658e5114
Update the dashboard
Sanitize the data from the dashboard
Use tabs instead of space indentation
2024-08-28 11:30:04 -06:00
FusionPBX 88bfb18e5a
Add hold_accum_seconds to the xml_cdr table 2024-08-28 10:05:48 -06:00
NorwayFun aabc2f33a8
Localization: Add full support for Georgian language (#7110)
* Translating apps to Georgian

* Translating apps to Georgian

* Translating more apps to Georgian

* Translating more apps to Georgian

* Translating more apps to Georgian

* Translating more apps to Georgian

* Translating more apps to Georgian

* Translating theme to Georgian

* Translating core to Georgian

* Translating core to Georgian

* Translating core to Georgian by Marie

* Translating core to Georgian

* Translating resources to Georgian by Marie

* Translating core to Georgian

* fix app_languages.php
2024-08-28 09:59:02 -06:00
FusionPBX 5702102850
Order the dashboard first by order number then by name 2024-08-27 18:17:47 -06:00
FusionPBX 5b969a8d19
Update config.php 2024-08-27 18:12:50 -06:00
FusionPBX 43e72c974d
Fix the disk usage for FreeBSD 2024-08-27 14:34:41 -06:00
fusionate 805954ce36
Dashboard: Add Background Gradient & Angle Controls 2024-08-27 13:58:11 -06:00
FusionPBX 3b1f73f847
Update event_guard.php 2024-08-27 11:09:37 -06:00
FusionPBX 49d885f19f
Update voicemails.php
Prevent an error when the voicemails array is empty
2024-08-27 00:46:20 -06:00
FusionPBX 979917468c
Use uuidgen on FreeBSD 2024-08-26 20:33:05 -06:00
FusionPBX d45f6ddae0
Update event guard for freebsd 2024-08-25 19:31:05 -06:00
FusionPBX a7b1644436
Update the dashboard path 2024-08-22 18:12:43 -06:00
Alex 1a9353ac88
Update parent.php (#7109)
* Update parent.php

* Update dashboard_edit.php

* Update app_defaults.php
2024-08-22 17:59:12 -06:00
fusionate ac94e22a1d
Fax Server: Pull in language file for email template replacements. 2024-08-22 17:20:36 -06:00
fusionate 5a456b9b86
Fax Server: Add missing translations on Fax File field. 2024-08-22 16:43:27 -06:00
fusionate 12eead4b4d
Fax Server: Add option for Download Link on received fax notifications, instead of attachment. 2024-08-22 16:11:06 -06:00
fusionate 9eaef8a242
Email Template [en-us,fax]: Fix subject. 2024-08-22 15:56:46 -06:00
FusionPBX a5f153d419
Remove image meta data
- Reading the image and resaving it the image metadata is removed.
- This meta data is removed to protect privacy
2024-08-22 15:12:03 -06:00
frytimo 2cbb4dbc31
remove instances where a pointer is used in a foreach loop for value (#7108) 2024-08-22 12:41:10 -06:00
fusionate 0583c5b429
Fax Server - Advanced: Make Back button return to Edit page. 2024-08-22 11:26:23 -06:00
FusionPBX 7cd482889a
Remove the ampersand from &$row
This broke the conference center list on PHP 7.4
2024-08-22 10:23:44 -06:00
FusionPBX b0aab10872
Simplify the dashboard path 2024-08-21 16:58:44 -06:00
Anthony 0563292557
Added translations to fifo/app_languages.php (#7105) 2024-08-21 12:53:27 -06:00
FusionPBX 8cfad20fd0
Update app_config.php 2024-08-20 17:44:08 -06:00
FusionPBX c1863a26e4
Update index.php 2024-08-20 17:42:46 -06:00
FusionPBX 8419ca346d
Create parent.php 2024-08-20 17:41:22 -06:00
FusionPBX c71b1180ac
Update app_languages.php 2024-08-20 17:32:31 -06:00
FusionPBX d1b1e3ac39
Update app_languages.php 2024-08-20 17:29:44 -06:00
fusionate daa88790de
Access Controls - Edit: Add Node IP addresses (via dig) by domain name in CIDR field. 2024-08-20 16:55:26 -06:00
Anthony 831f720638
Added translations to app_languages.php files (#7104)
* Added translations to fax_queue/app_languages.php

* Added translations to recordings/app_languages.php

* Added translations to emergency/app_languages.php
2024-08-20 08:51:20 -06:00
FusionPBX 8cc646aece
Add login option for domain name for text input or select
Restoring a feature we had in previous versions.
Not a commonly used feature
2024-08-19 18:57:05 -06:00
frytimo 027a78243a
Fix bug where a global profile doesn't show up in the device list (#7103)
* Fix bug where a global profile doesn't show up in the device list
2024-08-19 09:50:08 -06:00
wouam31200 e502f2d9d1
Add yealink auto provision settings (#7091)
* Update {$mac}.cfg
2024-08-19 09:48:36 -06:00
FusionPBX a5a7a8530a
Update voicemail.php
Don't run the query if there are no assigned voicemails
2024-08-16 15:10:05 -06:00
FusionPBX 83efb46e8e
Update app_defaults.php 2024-08-16 14:58:12 -06:00
FusionPBX 0fef717961
Update the dashboard_label_enabled defaults 2024-08-16 10:11:24 -06:00
frytimo d7035fecaa
exit for loop when matching token for slight performance increase (#7092)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-08-15 14:10:08 -06:00
Alex e57053a3f3
Rename dashboard heading default settings (#7098)
* Update app_config.php

* Update css.php

* Update dashboard_edit.php

* Update dashboard_edit.php

* Update app_config.php
2024-08-15 14:09:24 -06:00
Anthony 02527b2342
Added translations to dashboard/app_languages.php (#7100) 2024-08-15 14:08:57 -06:00
FusionPBX b7b3073d58
Device lines for the current domain 2024-08-14 22:34:39 -06:00
FusionPBX 193a03291c
Update content.php
- Use vertical align for short text and align top for larger amounts of text.
- Adjust values for a row spand of 1, 2, or 3 for height and max-height
2024-08-14 19:14:17 -06:00
FusionPBX f38a51d380
Update app_config.php 2024-08-14 17:48:22 -06:00
Alex 43d102b51c
Added label enabled dashboard setting (#7096)
* Added label enabled dashboard setting
2024-08-14 17:44:11 -06:00
FusionPBX 62d2e3e9a6
Update 010_user_exists.xml
- Add enabled true
- Add limit_max enabled false
2024-08-14 14:57:05 -06:00
FusionPBX 6600bbdfc6
Update the indentation 2024-08-14 13:03:03 -06:00
frytimo 301fb2b974
remove all $_SESSION references and use single database object (#7095)
Updates:
- use config object to find and load config file
- use single database object with config passed in constructor
- use settings object with database passed in constructor
- parse command line options with for loop so order no longer matters
- store all passed options in the super global $_REQUEST array for easy reference and debugging
- add debug and debug_level options for command line
- allow dumping the command line arguments when debug_level is 3 or higher
- add config option in command line to set location of config file
- add a shutdown function to allow for the exit command to be used but still output to either console or file
- add extra checks for options that are needed during runtime
- remove old PHP version 4 code
- add is_file check when checking for a valid .tiff file because file_exists returns true if it's a directory or file
2024-08-14 12:59:53 -06:00
FusionPBX 257fa78fc6
sip_transport is stored in the datbase in lower case 2024-08-14 01:51:42 -06:00
Antonio Fernandez b3f9176538
remove footer bottom margin (#7093) 2024-08-12 18:31:06 -06:00
fusionate 5416a4dd69
Minor adjustment to comments in previous commit. 2024-08-12 16:33:52 -06:00
fusionate 0e3a861cf5
Dashboard - Edit, Menu Item - Edit: Integrate icon search. 2024-08-12 16:25:21 -06:00
fusionate 37af618998
Extension - List: Show registration status icon (when permitted). 2024-08-12 12:15:40 -06:00
fusionate 4b23913555
Update Font Awesome to v6.6.x, adjust some icon references. 2024-08-09 18:14:52 -06:00
frytimo 10bd1b9f9f
add multiple line export feature (#7090)
* move permissions to top of page and use single database object

* use a domain array instead of session

* use a domain array instead of session

* add multiple line export feature
Exporting devices with multiple lines did not show headers for extra columns if the first device listed only had a single line and the other devices had multiple lines. This adds a feature to export multiple lines for devices using the "duplicate column feature" so that the import feature can detect and import all lines for the device.

* Update device_download.php
2024-08-09 17:57:53 -06:00
FusionPBX 64b565d974
This line overwrites the $uuid
We only want to get the uuid one time. This resolves that issue.
2024-08-09 10:52:21 -06:00
Mihir Gajjar cc7197322c
Updated Snom D735 Template (#7087)
Snom D735 has a known issue where the lights on the phone won't illuminate when in use. It still functions correctly but without any lights. I talked with Snom support and they provided me with the string that needs to be changed in the template.

This issue started from Snom firmware version 10.1.127.10

Release Notes - https://service.snom.com/display/wiki/10.1.127.10+Release
2024-08-09 10:31:23 -06:00
FusionPBX 78d24e16dd
If the uuid variable is empty try call_uuid
Found a case where the variables -> uuid doesn't exist found call_uuid as an alternative.
2024-08-09 10:06:17 -06:00
Alex a5a579cadc
Fix spacing when you click on the expand/collapse all button (#7089) 2024-08-08 16:24:13 -06:00
FusionPBX 0044f0b69e
Update permissions handling for performance
- For pages using large number of permission like these
- Creating a permission array that is populated with permission_exists
- Then using the permission array is more efficient
2024-08-08 16:17:28 -06:00
FusionPBX 0829062cc7
Remove the http_domain_filter
The reason its removed from the class is http_domain_filter was moved to provision/index.php
2024-08-07 15:18:02 -06:00
frytimo 56ca4ee695
Remove files not used in project (#7086) 2024-08-07 14:23:30 -06:00
frytimo be68bfb915
honor the domain_filter setting in default settings (#7085)
It was found that the domain_filter was not working when provisioning devices. This can lead to conflicts if a device address is in multiple domains or a valid device address is sent for another domain. This enforces the check so that if http_domain_filter is enabled and the domain name does not match the device specified, it will reject the request.
2024-08-07 14:09:26 -06:00
FusionPBX ba3ab5a8c9
Use parent_name as its more intuitive
Also replace $this->name with $this->app_name
2024-08-06 17:07:16 -06:00
frytimo 7630056bb8
Remove the unset($database) statements (#7084)
* Remove the unset($database) statements
The database object is a global variable that contains a database object reference and should not be unset.

* Update event_guard.php

* Update event_guard.php

* Update event_guard.php

---------

Co-authored-by: Tim Fry <tim@fusionpbx.com>
Co-authored-by: FusionPBX <markjcrane@gmail.com>
2024-08-06 13:19:45 -06:00
FusionPBX c960575796
Update database.php 2024-08-06 11:28:32 -06:00
FusionPBX 46bbb31391
Update database.php
- preset empty values for variables and arrays
- use $table_name instead of $this->name
2024-08-06 02:52:55 -06:00
FusionPBX 1c22b49d5a
Pass the database object to the settings object 2024-08-06 02:40:50 -06:00
FusionPBX 1252649a0c
Replace $db with $database 2024-08-05 19:52:45 -06:00
markjcrane 22ba339505 Allow one line feed at the end of the file 2024-08-05 18:27:59 -06:00
FusionPBX b05c0534b4
Send the database object into the function 2024-08-05 16:56:51 -06:00
FusionPBX a69b4d91f1
Update database handling 2024-08-05 16:19:34 -06:00
FusionPBX dbe37f275b
Update app_defaults.php 2024-08-05 15:55:08 -06:00
FusionPBX 032a24cb28
Update domains.php 2024-08-05 15:52:51 -06:00
FusionPBX 163403acc7
Re-use the database object 2024-08-05 15:07:13 -06:00
FusionPBX cd1cc70044
Remove redundant database objects
This reduces database connections and improves performance.
2024-08-05 14:22:17 -06:00
FusionPBX 00c803f53e
Use the database more efficiently 2024-08-05 12:16:36 -06:00
FusionPBX e24edd47f0
Use database::new() 2024-08-05 09:58:14 -06:00
FusionPBX a84c69a1dc
Use the database object efficiently 2024-08-05 09:53:11 -06:00
FusionPBX 096fd4f898
Remove redundant new database objects 2024-08-05 09:31:20 -06:00
FusionPBX 30735f6587
Update menu_item_list.php 2024-08-05 09:28:19 -06:00
FusionPBX 2c4adc6d21
Add parent dashboard parent
Added for future use. Currently does nothing.
2024-08-04 10:33:19 -06:00
FusionPBX fa68129eaf
Update template.php 2024-08-03 22:41:26 -06:00
FusionPBX 63ec63f32b
Add background_video_enabled (#7083)
Added this to allow disabling video so that global default and individual domains can use different settings.
2024-08-03 22:35:11 -06:00
FusionPBX eb93adba0b
Add title-follow_me 2024-08-02 15:18:11 -06:00
FusionPBX c3a6e22f38
Change title-call-block to title-call_block 2024-08-02 15:14:57 -06:00
FusionPBX 3e9aaf7bfe
Dashboard name translation 2024-08-02 14:06:35 -06:00
FusionPBX 14f2d9df85
Add title logout and account settings 2024-08-02 13:58:27 -06:00
FusionPBX b7467e7e11
Update conference center dashboard url 2024-08-02 13:13:56 -06:00
FusionPBX cdcc0ee73e
Add user logout icon 2024-08-02 13:11:04 -06:00
FusionPBX e9cd4dd1ec
Add fax group to the fax dashboard 2024-08-02 12:51:13 -06:00
FusionPBX 90933eaaf7
Fix the ring group dashboard permissions 2024-08-02 12:49:21 -06:00
FusionPBX 11def15cdc
Fix dashboard_group_uuid conflict 2024-08-02 12:38:33 -06:00
FusionPBX aeeb9e991e
Add account settings icon 2024-08-02 12:31:43 -06:00
FusionPBX 8fd37c6c3c
Delete needs to include dashboard_groups 2024-08-02 12:19:08 -06:00
FusionPBX 720be4a68b
By default FAX permissions remove user
- Reason for change is not everyone uses FAX
- There is a fax group adding users to that group who need FAX maybe a better option.
- There is still the option of assign the fax permissions to the user and then protect those permissions.
2024-08-02 12:06:08 -06:00
FusionPBX 8ffa56ac38
Fix database transaction edit 2024-08-02 11:54:14 -06:00
FusionPBX 0c157bd7ce
Update header.php
Fix indentation and create a new database object only if it is not defined.
2024-08-02 11:35:05 -06:00
FusionPBX b93d3e8050
Fix intermittent issue with the Sub Menu 2024-08-02 11:22:14 -06:00
frytimo 2d16cba7fb
update voicemail constructor to use domain and user uuids for settings (#7080)
If the settings object is not passed in the parameters the settings object that was created did not have the current domain uuid or user uuid set. This would cause default settings that were copied to the domain to be ignored. Ensuring the domain_uuid and user_uuid are initialized before the setting object and then passing them to the settings object constructor will make sure that the values would be returned when a request to the settings object is made.
2024-08-02 09:46:54 -06:00
Mendel 82129ff8ed
Update {$mac}.cfg (#7081)
changed the sip server port to work with the t34w
2024-08-02 09:39:39 -06:00
FusionPBX e2ab9129b6
Add dashboard width and height
Used when opening a new browser window
2024-08-01 23:34:30 -06:00
FusionPBX b3f31af5a8
If data is global then domain_uuid set to null
This means transaction is global. If there is a domain_uuid use the domain ID from the data.
2024-08-01 18:02:15 -06:00
fusionate d86217247e
Voicemail - send_email (script): Assume direct sox call (for now). 2024-08-01 12:12:39 -06:00
fusionate d79c7b1cb9
Voicemail: Integrate message forward intro playback in web interface, and prepend intro on emailed audio file. 2024-08-01 10:27:15 -06:00
FusionPBX a020979947
Add destination_number variable 2024-07-31 17:26:36 -06:00
FusionPBX ac07414b9d
Update send.lua
Add domain_name and message variables
Add error prevention
Pass thru the domain_name, event_subclass and mesage
2024-07-31 17:19:57 -06:00
FusionPBX 3804efe4e1
Update voicemail.php 2024-07-31 13:41:08 -06:00
frytimo 3fc320ea39
method messages in object voicemail erases the property voicemail_uuid (#7079)
The method overwrites the object property initially set when the method is called. This causes any subsequent calls to be incorrect. Removing this keeps the initial objects property intact. The method voicemail_messages is only used internally from the messages method for getting message details in the voicemails. This has been set to a private method to reflect this type of use.

Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-31 13:19:58 -06:00
frytimo cb94f2c02b
voicemail messages function is called twice. second call removes list (#7078)
When voicemail is called the first time, it correctly displays the list of voicemail messages. When it is called a second time the function returns an empty array and gives an empty display. This removes the second call to method 'messages' in 'voicemail' object.

authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-31 12:26:26 -06:00
FusionPBX 4b04d701ec
Update dashboard permissions 2024-07-30 22:18:29 -06:00
FusionPBX 77dd833b55
Update some of the dashboard icons 2024-07-30 22:15:38 -06:00
FusionPBX fbec08e579
Update voicemail_messages.php 2024-07-30 20:34:04 -06:00
FusionPBX 8c7e2044fb
Update voicemail.php 2024-07-30 20:32:47 -06:00
FusionPBX 24a398f98f
Update app_menu.php
Using a redirect now we can use one menu to handle regular users and admins.
2024-07-30 18:52:07 -06:00
FusionPBX 90852f54db
Update voicemails.php 2024-07-30 18:50:55 -06:00
Antonio Fernandez 440ffb69db
set fax failed when missing (#7077) 2024-07-30 16:31:11 -06:00
FusionPBX 52e5da9a23
Update config.php 2024-07-30 14:41:02 -06:00
Alex a793eb9573
Update index.php (#7076) 2024-07-30 11:41:06 -06:00
FusionPBX 6285413dd9
Fix a bug to delete email after send or forward 2024-07-30 11:34:47 -06:00
FusionPBX 0c32c43e9a
update the dashboard 2024-07-29 22:33:44 -06:00
FusionPBX 7101c3f44a
Fix the destination url 2024-07-29 22:29:51 -06:00
FusionPBX 8539bfb2cc
Update config.php 2024-07-29 22:14:44 -06:00
FusionPBX 89ad2172f3
Update config.php 2024-07-29 22:11:39 -06:00
FusionPBX ffbd37f936
Update config.php 2024-07-29 21:31:30 -06:00
FusionPBX 06759afe42
Update config.php 2024-07-29 21:29:52 -06:00
Alex 33e491a75d
Fix dashboard widget hover transition (#7075)
* Fix dashboard widget hover transition

The background colors were being set twice

* Update dashboard_edit.php

* Update index.php
2024-07-29 21:25:05 -06:00
FusionPBX 2d00362105
Add dashboard call forward 2024-07-29 16:38:03 -06:00
FusionPBX 82d1f4eb88
Add more dashboard widgets 2024-07-29 16:32:49 -06:00
FusionPBX b1f64e88b5
Use the default setting text color 2024-07-29 12:33:28 -06:00
FusionPBX dc14285cfd
Default setting used for the background color 2024-07-29 12:27:06 -06:00
FusionPBX a4f86db557
Use the right dashboard_uuid 2024-07-29 12:18:54 -06:00
FusionPBX ecfbeba6ea
Update config.php 2024-07-29 10:58:04 -06:00
FusionPBX 2da57eea9c
Update the user dashboard 2024-07-29 10:56:33 -06:00
Antonio Fernandez f47bdcdc99
generate uuid changes (#7070)
* generate uuid changes
2024-07-29 10:45:22 -06:00
FusionPBX e481a58a86
More efficient use of the database 2024-07-29 09:00:59 -06:00
FusionPBX 7abcda7996
Update the dashboard order 2024-07-29 08:49:01 -06:00
FusionPBX 7566dd1f4b
Update the dashboard settings 2024-07-28 10:42:16 -06:00
FusionPBX 22c57f9340
Fill in dashboard details 2024-07-28 10:36:36 -06:00
FusionPBX d1105f70ba
Update config.php 2024-07-28 10:18:38 -06:00
FusionPBX 436a5831ac
Update icon for the IVR Menu 2024-07-28 02:48:58 -06:00
FusionPBX 5dd8758823
Update config.php 2024-07-28 02:44:16 -06:00
FusionPBX 8c054181f0
Add recordings dashboard 2024-07-28 02:41:22 -06:00
FusionPBX ef5e39bf5e
Update config.php 2024-07-28 02:33:55 -06:00
FusionPBX 1ad86744b0
Update config.php 2024-07-28 02:28:52 -06:00
FusionPBX 7d15164122
Add call detail records dashboard 2024-07-28 02:24:55 -06:00
FusionPBX 08d9f55038
Update the time conditions icon 2024-07-28 02:19:18 -06:00
FusionPBX 4d6852dc99
Add time conditions dashboard 2024-07-28 02:18:23 -06:00
FusionPBX 57f16636df
Add users dashboard 2024-07-28 02:15:17 -06:00
FusionPBX a56e77ce78
Update the comment 2024-07-28 02:11:38 -06:00
FusionPBX fd9e998818
Add extensions dashboard 2024-07-28 02:10:02 -06:00
FusionPBX c302adef2e
Add Destinations dashboard 2024-07-28 02:06:18 -06:00
FusionPBX 6c932fa3d9
Update the body_color and body_shadow_color 2024-07-27 22:13:23 -06:00
FusionPBX abfb0e41b9
Add conferences dashboard 2024-07-27 19:54:42 -06:00
FusionPBX 546fb7edb2
Update config.php 2024-07-27 19:44:59 -06:00
FusionPBX 4e2cde3432
Add the voicemails icon 2024-07-27 19:40:02 -06:00
FusionPBX 0a8bc73209
Add dashboard IVR Menus 2024-07-27 19:32:42 -06:00
FusionPBX abeb241a1b
Add dashboard ring groups 2024-07-27 19:19:45 -06:00
FusionPBX 8db5c8e7eb
Disable picture in picture for background video 2024-07-26 19:47:13 -06:00
FusionPBX f716ef5e87
Use one database object 2024-07-26 19:43:16 -06:00
FusionPBX a5d44ae44b
Use the database more efficiently 2024-07-26 17:04:02 -06:00
FusionPBX e7e2f73004
Format the phone number for call recordings. 2024-07-26 16:32:49 -06:00
FusionPBX cdc8a8842c
Call Block Update
- unify the process for preparing the call_block_number
- move the query for user_extensions outside and before the loop
- database used more efficiently
2024-07-26 14:33:50 -06:00
Antonio Fernandez 9ace83cad1
adding function to be used in app/messages (#7073) 2024-07-26 13:49:06 -06:00
frytimo 78f68d106f
replace if_group with dialplan_edit permission (#7072)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-26 12:20:47 -06:00
FusionPBX 16c6d8d58b
Fix call block for regular non admin users 2024-07-25 20:49:56 -06:00
FusionPBX fa16c8ad7c
Update call_block.php
- Improve the database handling
- Get the country code from the destinations table
2024-07-25 13:24:40 -06:00
Alex fcfb22d4a0
Add adjust_form function back to dashboard path (#7069) 2024-07-25 12:27:43 -06:00
FusionPBX 1d7c239c37
Update app_languages.php 2024-07-25 03:52:42 -06:00
FusionPBX 390bc61cf6
Update the version to 5.3.2 2024-07-25 03:36:33 -06:00
FusionPBX 66e7f05558
Add field recording_voice to the recordings table 2024-07-25 03:24:44 -06:00
FusionPBX 50eb494fcc
Update dashboard_edit.php
- Find the dashboard tools or widgets using a glob
- Use a select box to make it easier to configure
2024-07-24 19:57:59 -06:00
FusionPBX 2425dd4c45
update device_edit.php 2024-07-24 15:26:55 -06:00
FusionPBX 276bf0258f
Video muted for Chrome to autoplay 2024-07-24 15:21:33 -06:00
frytimo bc5165572a
Use ini_get to retrieve the session path instead of using session_path (#7067)
When using session_path, the session must be active and will automatically activate the session. This is a better method so that the session is never started.

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-24 11:28:34 -06:00
Antonio Fernandez 841cc6527e
Groundwire added vendor (#7065)
* Added Groundwire vendor
2024-07-24 07:21:12 -06:00
fusionate 0e3fa58a1f
Voicemail Message: Better handling of keep local after forward. 2024-07-24 00:00:35 -06:00
FusionPBX 1b2a47dd6c
Add voicemail export 2024-07-23 22:59:58 -06:00
frytimo 46abe4897c
use loose comparison instead of strict comparison (#7064)
Update comparison checks when testing the database status and
add a unified log message with a more detailed message from the
database when there is a failure

Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-23 19:58:13 -06:00
FusionPBX 64c6527ab8
Update device_keys.php 2024-07-23 15:58:45 -06:00
Antonio Fernandez 3285483665
changes to wallpaper settings for Avaya J-Series (#7063) 2024-07-23 15:17:26 -06:00
FusionPBX 06a6292ebb
Allow removing an assigned user 2024-07-23 15:15:50 -06:00
FusionPBX f495b28356
Update field name from name to type 2024-07-23 14:29:28 -06:00
FusionPBX 48b2011091
Use mkdir when importing new voicemail boxes
In addition to making sure the voicemail directory exists for each voicemail box

Updated the settings class to use the settings object instead of the SESSION.
2024-07-23 13:39:30 -06:00
FusionPBX ac9497c232
Add toggle for when to create recording 2024-07-23 12:09:50 -06:00
jrmcclean 12a862217f
Update require.php (#6860)
Added an option to check Windows ProgramData
2024-07-23 08:14:55 -06:00
jrmcclean ebd2251b99
Update install.php (#6861)
Added an options for Windows ProgramData folder
2024-07-23 08:14:05 -06:00
jrmcclean 9f20eaf429
Update index.php (#6862)
Added an option to check Windows ProgramData
2024-07-23 08:13:27 -06:00
jrmcclean 1d4f366b05
Update upgrade.php (#6863)
Added Paths for Windows as well new variable for $cache_location and $php_dir to accommodate windows values.
2024-07-23 08:12:44 -06:00
jrmcclean b20df9c33a
Update config.php (#6865)
Added an option for Windows ProgramData
2024-07-23 08:11:58 -06:00
jrmcclean 96f6e87224
Update config.lua (#6864)
Added an option to check Windows ProgramData
2024-07-23 08:07:36 -06:00
Alex dac6e6a6e6
Update dashboard_edit.php (#7059)
* Update dashboard_edit.php
2024-07-23 07:46:45 -06:00
frytimo f80347504a
enable foreground mode for services (#7061)
Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-23 07:40:49 -06:00
Anthony 2b3381f95c
Added translations to resources/app_languages.php (#7062) 2024-07-23 07:38:33 -06:00
FusionPBX f40319ba91
Add dashboard content text align 2024-07-20 23:37:32 -06:00
FusionPBX d368f4376c
Update default_settings.php 2024-07-20 22:05:56 -06:00
FusionPBX f959c3717c
Update contacts.php
- Add trim
- Adjust indentation
2024-07-20 20:23:17 -06:00
FusionPBX bd38191857
Use a permission array 2024-07-19 17:51:00 -06:00
frytimo 8f71f5cf4b
reduce permission_exists calls from 7,000+ to just 7 (#7056)
Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-19 17:39:19 -06:00
FusionPBX a49ca88ce2
Add dashboard_width and dashboard_height 2024-07-19 17:36:37 -06:00
Anthony b451ad44fe
Added translations to resources/app_languages.php (#7058) 2024-07-19 17:29:22 -06:00
FusionPBX f45b6f4033
Add dashboard window size
- Add window width and height
2024-07-19 17:03:21 -06:00
Antonio Fernandez 5cc9f93be8
Find Snom MAC via UA (#7057)
* Find Snom MAC via UA
2024-07-19 13:38:03 -06:00
FusionPBX 2d933a60ee
Update extension_edit.php
Empty option enables ability to see if the value is empty.
2024-07-18 23:43:36 -06:00
FusionPBX cb7fd1e4ac
Use the object format_address method 2024-07-18 23:35:58 -06:00
FusionPBX 8beecfbb89
- Update call block permissions
The call_block_all permission was pulling double duty. 
- Changed the code to use call_block_all only for SHOW ALL to call block across all domains.
- Permission call_block_extension will be used instead for the purpose of showing the extension list. 
- If someone doesn't call_block_permission then their assigned extensions will be use with each call block item they add.
2024-07-18 17:13:22 -06:00
Antonio Fernandez dcf1f9d17c
Update database.php (#7053)
Fix for table_exists method on mysql
2024-07-18 12:10:05 -06:00
Antonio Fernandez fcc2eed4fa
Update provision.php (#7054)
unset the $sql var where needed
2024-07-18 12:07:10 -06:00
frytimo cd9c6e95cb
Use the __DIR__ to include require.php (#7055)
Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-18 12:06:27 -06:00
fusionate c78d300145
Voicemail - Messages: New permission to control visibility of Transcribe feature. 2024-07-16 11:12:27 -06:00
FusionPBX d7e8893325
Update voicemail_messages.php
Initializing the new object for messages prevents a problem where running the message method twice on the same object returns no results.

Running once to get the count and then using that result with paging to get the voicemail messages.
2024-07-16 11:01:40 -06:00
FusionPBX be6afaf948
Update voicemail.php
- Allowing passing the database object into the constructor
- Add the database object in the constructor
- replace $_SESSION['domain_uuid'] and $_SESSION['user_uuid'] with $this->domain_uuid and $this->user_uuid
2024-07-16 10:05:06 -06:00
FusionPBX 215b4d0df7
Prevent empty caller id from blocking calls
Improved the following
- Prevent empty caller id name and number from blocking calls
- Fixed the call block count so it would increment each time it has blocked a call
2024-07-15 23:06:23 -06:00
FusionPBX 79a8d6c8ca
Update fax_files.php 2024-07-15 18:18:34 -06:00
FusionPBX d1c2dfa10a
Update fax file download 2024-07-15 17:24:10 -06:00
Antonio Fernandez 1aa9a93bb5
fix qrcode generation on BSD (#7052) 2024-07-14 09:51:44 -06:00
Antonio Fernandez 541db7b5c9
Fix for BSDs core classes (#7051) 2024-07-14 09:51:20 -06:00
FusionPBX 42a3969836
Update provision.php
Used to replace the domain name in the yealink_provision_url
2024-07-12 18:04:14 -06:00
FusionPBX b59b7ba98a
Update page.lua
If announce delay is true then add an option for a preset recording filename and length
2024-07-12 11:32:12 -06:00
FusionPBX 3bed9c8a5e
Update contact phone number search
Update the phone search to use the country code and phone number or the phone number alone.
2024-07-12 02:48:44 -06:00
FusionPBX fa672d21af
Add grandstream_transfer_mode_via_vpk 2024-07-11 17:37:55 -06:00
FusionPBX ef03e60a0b
Add setting yealink_ps_enabled 2024-07-11 14:49:26 -06:00
Antonio Fernandez cd79bf0a2e
added a better template setting for directory (#7041) 2024-07-11 14:25:16 -06:00
Anthony fd22d407b8
Added translations to app files (#7050)
* Added missing translations to core/xml_cdr

* Added missings translations to app/time_conditions

* Added missing transaltions to app/sip_profiles

* Added missing translations to app/registrations
2024-07-10 17:35:13 -06:00
Antonio Fernandez a295de67c1
added avaya J139 plus other changes to avaya (#7049)
* added avaya J139 plus other changes to avaya

* fixed a few avaya settings

* added wallpaper descriptions
2024-07-10 17:34:26 -06:00
fusionate ea7fb60533
Voicemail Messages: Add Resend feature, fix manual Transcription if voicemail stored as base64. 2024-07-10 16:28:41 -06:00
frytimo 5af4610a9c
Ensure the 'transcribe_' is prepended to the class name (#7048)
Class name requires the transcribe_ prepended before PHP checks to see
if the class actually exists as the engine must have 'transcribe_' in
front of the classes.

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-10 14:02:23 -06:00
frytimo 8cfdb40acc
Database transactions maintenance (#7047)
* add database_maintenance function to database_transactions

* update database_maintenance function in database_transactions
New changes in the maintenance application required changes to any
existing functions already created

---------

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-09 12:52:05 -06:00
frytimo d1594da57e
implement changes in to the fax queue class (#7044)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-09 12:51:36 -06:00
frytimo 72a66f555a
specify the cdr category for xml_cdr (#7046)
* update xml_cdr with the latest changes to the maintenance application
Update the public static function database_maintenance in xml_cdr
class to use the newest changes in the maintenance class. Constants are
now defined in the class for the table names and subcategories.

* update app_config file with necessary default setting changes

* remove constants

* use empty instead of null check

---------

Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-09 12:51:11 -06:00
frytimo abf5ffb9f0
implement changes in to the event_guard class (#7045)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-09 12:50:34 -06:00
frytimo d7f05621c7
Implement changes in to the session class (#7042) 2024-07-09 12:50:01 -06:00
frytimo d68c1a08d8
Call recordings maintenance changes (#7039)
* add filesystem maintenance method to the call_recordings class

* Add filesystem maintenance default setting to the app_config
Set filesystem_retention_days default setting to 90 days in the 
app_config.php file to allow the maintenance service to delete older
files.
2024-07-09 09:19:50 -06:00
FusionPBX 555d52cbb3
Add FAX PDF View
Added an iframe to  display the PDF
2024-07-08 22:40:42 -06:00
Antonio Fernandez da7a748a8a
added notes about avaya firmware (#7040) 2024-07-08 14:43:41 -06:00
FusionPBX 41de2177e1
Update provision.php
Fix bug to pass the parameters including settings and database.
2024-07-08 13:37:58 -06:00
frytimo 50f1601a4d
update voicemail with the latest changes to the maintenance application (#7035)
* update voicemail with the latest changes to the maintenance application
Update the public static function filesystem_maintenance in voicemail
class to use the newest changes in the maintenance class. The
maintenance class now has a constant defined for the subcategory used
within the project.

* update app_config file with necessary default setting changes

---------

Authored-by: Tim Fry <tim@fusionpbx.com>
2024-07-06 20:45:25 -06:00
Antonio Fernandez adbb9f9fd8
fix for Avaya buttons (#7038) 2024-07-05 20:01:30 -06:00
FusionPBX e08943ebc2
Wrap isset grandstream_wifi_enabled
Add a condition around the wifi settings. This allows manually setting up the wifi settings on the phone without the device provisioning. If someone wants to use the provisioning config for wifi then set grandstream_wifi_enabled value to true.
2024-07-05 18:02:59 -06:00
frytimo 0ea012c494
Update database_maintenance (#7037) 2024-07-05 17:37:50 -06:00
Antonio Fernandez 9ec26f0244
Enhanced Avaya J-Series support (#7036)
* Updates to Avaya J-Series support

* small J189 fixes
2024-07-05 17:07:45 -06:00
FusionPBX 56aea7c66d
Domain settings array override default settings
Domain setting array types override the default settings set as type
2024-07-04 18:05:37 -06:00
FusionPBX 0ff2503240
Update index.php
Minor changes. Use the provision array to get the cidr details.
2024-07-04 18:01:50 -06:00
FusionPBX 1d7bcbe0ee
Device disabled send message to syslog 2024-07-04 17:58:12 -06:00
frytimo 766aeeefae
email_send_remove_extra_database_objects (#7034)
Use a single instance of the object instead
2024-07-04 11:53:44 -06:00
frytimo 2b87349e7d
remove the manual inclusion of classes to let autoloader handle it (#7033)
By including the class manually with the include statement, the class
has a possibility of loading twice. This will cause a fatal error if
classes are already loaded.
2024-07-04 09:12:34 -06:00
FusionPBX c0e1b1a6b5
Changed the order of missed_call conditions
Move billsec condition near the end but before voicemail.

If a call center call was missed but answered by an extension with the exit action then the call wasn't technically missed.
2024-07-03 14:35:13 -06:00
frytimo 9beef70b94
fix missing class exists check for transcribe engine (#7032)
Add a class_exists check to ensure transcribe engine exists before
attempting the use of the class.
2024-07-02 09:30:26 -06:00
Alex 482768c1aa
Added maintenance and running labels (#7031) 2024-07-01 11:22:58 -06:00
FusionPBX 54e7b85142
Update functions.php 2024-06-28 13:10:15 -06:00
FusionPBX 1f077ebc2b
Bug FIX - Deny device_address 000000000000
Polycom will make a request with a device address of 000000000000 as well as another request with the real device mac address.

The issue was 000000000000 was on another tenant and it delivered contacts from the other tenant.
2024-06-28 12:18:29 -06:00
Antonio Fernandez b51b97f495
Fixed comment (#7028) 2024-06-28 09:56:01 -06:00
Antonio Fernandez 9081f59ca9
bug fix in device_by.php (#7027) 2024-06-28 09:55:43 -06:00
Antonio Fernandez d1dc1f59ca
bug fix for transcription (#7030) 2024-06-28 09:53:50 -06:00
frytimo 7d493c3287
smtp_from_name was accidentally set to smtp_from (#7029)
This uses the settings default value to set smtp_from_name to be set to
smtp_from if it does not have it's own value. The isset check on line
248 is no longer needed because smtp_from_name will always have a value
2024-06-28 08:47:17 -06:00
frytimo 5ea753295d
add maintenance function to the xml_cdr (#7025)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-27 11:27:09 -06:00
frytimo a863faaae2
fix the user_uuid missing from transaction tables (#7026)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-27 11:26:16 -06:00
FusionPBX 23093f6a14
Add new permissions
- xml_cdr_json_view
- xml_cdr_json_delete
- xml_cdr_flow_view
- xml_cdr_flow_delete
- xml_cdr_log_view
- xml_cdr_log_delete
2024-06-27 10:33:38 -06:00
FusionPBX 6be515de9e
Add a missing $ 2024-06-26 21:50:49 -06:00
FusionPBX 315a3d322f
Provision class use settings and database object
Credit for these changes go to frytimo changes curated by Mark
2024-06-26 21:23:24 -06:00
FusionPBX 71334c9655
Removed session server temp directory
This session variables is no longer used
2024-06-26 07:48:41 -06:00
FusionPBX efce99375b
Template engine use sys_get_temp_dir
Used to get the operating system temp directory.
2024-06-26 07:28:37 -06:00
FusionPBX 7d2941124e
Update provision.php
Use sys_get_temp_dir() to get the temp directory
2024-06-25 20:13:46 -06:00
FusionPBX 2bb2bb79eb
Update install.php
Use sys_get_temp_dir() to get the temp directory
2024-06-25 20:12:57 -06:00
FusionPBX eb4104bd9a
Update footer.php
Use sys_get_temp_dir() to get the temp directory
2024-06-25 19:53:47 -06:00
frytimo 49b2505f0c
Voicemail maintenance (#7023)
* add database_maintenance

* add filesystem_maintenance

* use modified time instead of create time

* Update voicemail.php
2024-06-25 13:07:42 -06:00
FusionPBX 4369ab6380
Update email_send.php
Email transcription has a value no need to transcribe again so run the transcription when the value is empty.
2024-06-24 18:12:49 -06:00
FusionPBX b6257bbda2
Update email_send.php 2024-06-24 17:34:19 -06:00
Anthony 47a17af7cc
Added Turkish translations to core/groups/app_languages.php (#7020) 2024-06-24 16:02:28 -06:00
frytimo 820a7231dc
format class for comments to be at the same tab stop (#7018)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-24 08:26:34 -06:00
FusionPBX 3215f50826
Update domains.php 2024-06-22 19:31:38 -06:00
frytimo fcd64fcce6
Remove session from provisioning (#7014)
* use single database object, use settings class

* add common domain functions

* use settings class
2024-06-22 19:28:04 -06:00
fusionate 81af0fefd1
Voicemail - Edit: Add option to Keep Local After Forward (or not). 2024-06-21 17:24:06 -06:00
Alex 1ef5f1dab0
Dashboard - Icon widget hover settings (#7016)
* Update system_counts.php

* Update system_cpu_status.php

* Update system_status.php

* Update voicemails.php

* Update missed_calls.php

* Update recent_calls.php

* Update index.php

* Update app_defaults.php

* Update app_defaults.php

* Update index.php

* Update index.php

* Update dashboard_edit.php

* Update index.php

* Update app_defaults.php

* Update css.php

* Update icon.php

* Update dashboard_edit.php

* Update app_config.php

* Update app_defaults.php

* Update css.php

* Update app_languages.php

* Update index.php

* Update dashboard_edit.php
2024-06-21 16:44:31 -06:00
FusionPBX 63e2316885
voicemail transcription to show or not show 2024-06-21 16:27:58 -06:00
fusionate 2403fcc20e
Voicemail - Edit: Show Transcription disabled if value empty. 2024-06-21 16:16:05 -06:00
frytimo 4eb9892256
update templates with checking for codec to be set to 'true' (#7015)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-21 14:34:52 -06:00
fusionate f97bfef62a
Outbound Route - Add: Append dialplan expression abbreviation to call_direction-outbound dialplan name if Description empty. 2024-06-21 12:25:19 -06:00
fusionate a5e991a1f2
Outbound Route - Add: Disable dialplan if Enabled is false. 2024-06-21 10:17:54 -06:00
Anthony be678d2694
Added Turkish translations to core app_languages.php (#7012)
* Added Turkish translations to core databases

* Added Turkish trasnaltions to core default_settings

* Added Turkish translations to core domain_settings

* Added Turkish translations to core domains
2024-06-20 11:27:45 -06:00
FusionPBX 64c33b21c1
Call center queue context
When the user doesn't have call center queue context permission get the context from the database.
2024-06-19 16:53:14 -06:00
Antonio Fernandez 25ba853618
clarified one of the transcription default setting (#7003)
* clarified one of the transcription default setting

* shortened the description
2024-06-18 15:59:28 -06:00
Antonio Fernandez 17c385a15c
added some blocked status msgs (#7011) 2024-06-18 15:53:48 -06:00
FusionPBX a5e31a82dd
Update template.php 2024-06-18 14:10:37 -06:00
Antonio Fernandez 1b9c746f00
added snom_ui_theme variable to snom templates (#7010)
* added snom_ui_theme variable to snom templates

* made the Dark theme default just like Snom docs
2024-06-18 09:33:06 -06:00
FusionPBX 02db089d8f
New setting background_video 2024-06-18 09:32:19 -06:00
fusionate 7499606fcb
Dashboard - Icon & Content Widgets: Better integration of color settings. 2024-06-17 15:27:59 -06:00
fusionate 1d35bf9a81
Dashboard - App Defaults: Support additional defined fields from dashboard config.php file. 2024-06-17 15:24:23 -06:00
fusionate eb2870f5aa
Dashboard - Edit: Minor adjustments. 2024-06-17 15:23:38 -06:00
FusionPBX 577e929a4c
Create send.lua 2024-06-17 15:01:02 -06:00
fusionate 0f48b98ced
Ringbacks [Class]: Fix PHP 8.x warning. 2024-06-14 16:28:51 -06:00
fusionate 5455fd96a8
FIFO Queues - Delete: Remove dialplan record as well. 2024-06-14 16:28:15 -06:00
FusionPBX e302122e90
Add new permission user_password 2024-06-14 14:43:11 -06:00
FusionPBX b54ad9cd08
Create fifo member.lua 2024-06-13 22:42:37 -06:00
FusionPBX b38532a9b3
Update fifo_edit.php 2024-06-13 22:36:46 -06:00
FusionPBX 8dec7c5f41
Remove the dashboard description. 2024-06-13 17:22:39 -06:00
Anthony e2c8f67f7b
Added translations to app/fifo/app_languages.php (#7009) 2024-06-13 16:58:16 -06:00
Antonio Fernandez ac876402b3
add function to return the config object used to create the database object (#6998) (#7006)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-13 14:53:30 -06:00
FusionPBX dd4cde850d
Clear the cache 2024-06-13 14:17:50 -06:00
FusionPBX 9a55466677
Update app_languages.php 2024-06-13 14:08:29 -06:00
Anthony 86e588a589
Added/Adjusted translations in core app_languages.php files (#7008)
* Added translations to core/dashboard

* Added Turkish translations to core/menu

* Added Turkish translations to core/install
2024-06-13 13:47:30 -06:00
FusionPBX 6d968e8e3c
Update app_config.php 2024-06-13 12:18:58 -06:00
FusionPBX f11c6669ef
Update app_languages.php 2024-06-13 12:08:22 -06:00
FusionPBX 9d7f95a7e6
Update FIFO to version 2.0 2024-06-13 11:46:34 -06:00
fusionate 30c8fe9a51
Dashboard - Widgets: Add Content widget, enhance Icon widget. 2024-06-13 10:48:24 -06:00
Alex 7640cd21c9
Dashboard - Add row span setting (#7007) 2024-06-12 16:49:34 -06:00
FusionPBX 1998df7c70
Add the required .xml to the file name 2024-06-12 13:01:36 -06:00
FusionPBX 0f01ac7311
Set the context to global 2024-06-12 12:52:04 -06:00
FusionPBX c40ddd5a4d
Create 070_default_ringback 2024-06-11 18:26:37 -06:00
Antonio Fernandez f61ee41c91
remove unused variables (#7002) 2024-06-11 14:12:13 -06:00
FusionPBX 48140218f3
Only set ringback if a value is provided 2024-06-11 10:40:11 -06:00
FusionPBX 20cf6c8255
Remove default rinback
Ringback is not always us-ring. This is not a good default. It can also override the ringback from the inbound destinations and other places where ringback can be set.
2024-06-11 10:27:37 -06:00
frytimo 5fda9b2dda
allow auto_loader to search in traits directories (#7005)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-11 10:17:02 -06:00
FusionPBX 9e2ab9b8c3
Add destination ringback 2024-06-11 10:16:40 -06:00
fusionate e692dc35c4
Dashboard - Icon: Mitigate PHP 8.x warning. 2024-06-10 13:03:02 -06:00
Anthony eaabcf95f1
Added/Adjusted translations in core app_languages.php files (#7004)
* Added/Adjusted translations in user_logs/app_languages.php

* Added/Adjusted translations in core/upgrade

* Added/Adjusted translations in core/notifications
2024-06-10 11:29:31 -06:00
frytimo f0a80426eb
add function to return the config object used to create the database object (#6998)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-06-08 09:57:33 -06:00
Anthony b7ddbd533c
Added/Adjusted translations in core app_languages.php files (#7001)
* Added/Adjusted translations in user_logs/app_languages.php

* Added/Adjusted translations in core/upgrade

* Added/Adjusted translations in core/notifications
2024-06-08 09:56:06 -06:00
fusionate a33975dc29
Voicemail - Messages: Implement paging. 2024-06-07 15:18:14 -06:00
fusionate cb2b1b4132
Voicemails - List: Minor code adjustments. 2024-06-07 15:12:29 -06:00
FusionPBX e553e619bf
Extension column add nowrap 2024-06-06 14:27:09 -06:00
FusionPBX c9c4683d0e
Update index.lua 2024-06-05 23:20:20 -06:00
FusionPBX 737da5bfee
Allow matching prefix in call block 2024-06-05 18:13:32 -06:00
Antonio Fernandez cfc1cd4325
status message fix for emergency numbers (#7000) 2024-06-05 16:36:58 -06:00
Alex 5aa944e3e7
Dashboard - Fixed minor bug with details state (#6999) 2024-06-05 10:02:59 -06:00
Antonio Fernandez cca0c80780
Converted name to first/last name in snom (#6997) 2024-06-05 08:35:42 -06:00
FusionPBX c22d03e33f
Update app_config.php 2024-06-05 08:34:34 -06:00
fusionate e61868a4ec
Fax Server: Implement Read/Unread Toggle. 2024-06-05 06:34:07 -06:00
Antonio Fernandez fbe10bbe04
added emergency numbers default settings for Snom (#6996) 2024-06-04 11:26:13 -06:00
frytimo c176192c13
move dollar sign to inside the curly brace (#6991) 2024-06-03 13:32:19 -06:00
frytimo 968c05374f
do not exit when unable to connect to freeswitch socket (#6992) 2024-06-03 13:31:32 -06:00
frytimo 058d9aba37
fix failing to save dialplan details xml in proper order (#6994) 2024-06-03 13:30:59 -06:00
Alex f6e6750efc
Dashboard - Minor changes (#6993) 2024-06-03 11:40:05 -06:00
fusionate d48208456b
Voicemail Greetings - Edit: Fix issue where no greetings present. 2024-05-31 15:21:23 -06:00
fusionate b678c6e9ce
Recording - Edit: Fix waveform generation for newly created OpenAI generated audio files, misc adjustments. 2024-05-31 15:01:09 -06:00
fusionate 7d105c79e6
Voicemail Greetings: Integrate AI greeting generation, fix waveform image generation for OpenAI audio files. 2024-05-31 15:00:15 -06:00
frytimo 642c0acb79
introduce new service framework (#6990) 2024-05-31 12:40:46 -06:00
frytimo 30b38e7d86
Add methods to handle device and add documentation (#6989) 2024-05-31 11:19:03 -06:00
fusionate 684e0a1b6f
Recording - Edit: Minor HTML adjustment. 2024-05-31 09:20:45 -06:00
fusionate 703675c2c7
Recording - Edit: Hide Delete button on Add. 2024-05-31 09:02:15 -06:00
fusionate 3dd8404daf
Voicemails - List: Generate Greetings count. 2024-05-31 08:48:50 -06:00
fusionate 3d2f27ee0b
Recordings - List: Restore Upload button after Upload cancelled. 2024-05-31 08:33:44 -06:00
FusionPBX 0f284c7a98
Minor version update 5.3.1 2024-05-30 21:29:13 -06:00
fusionate e14dc89488
Time Conditions - Edit: Adjust width of Setting order input width. 2024-05-30 18:57:17 -06:00
FusionPBX fb7d4e5cc3
Update new extension_range 2024-05-30 18:45:45 -06:00
chansizzle 4cdddba430
Add suggested extension ranges (#6871) 2024-05-30 17:58:05 -06:00
FusionPBX d17300c308
Create 082_default_hold_music.xml 2024-05-30 11:40:27 -06:00
FusionPBX a6002f9959
Update xml_cdr_log.php 2024-05-30 02:53:51 -06:00
FusionPBX f084004047
Update xml_cdr_log.php 2024-05-30 02:52:45 -06:00
FusionPBX a60db81896
Ring group handle number alias 2024-05-30 00:09:21 -06:00
FusionPBX 873f431f80
Operator Panel prevent warnings
- Prevent PHP Warnings
- Save vertical space by removing extra br tags
  - Important to fit as many extensions on the page as possible for mid-sized businesses.
2024-05-29 17:09:18 -06:00
FusionPBX 4f70217802
Operator panel group extensions default false 2024-05-29 17:05:04 -06:00
frytimo a4f352aa27
Add check for file fax_active.php to exist before showing link to page (#6966)
Task #8 - File not found: fax_active.php
2024-05-29 16:13:56 -06:00
Antonio Fernandez ef7877f7e7
Adding snom_answer_after_policy default setting (#6988) 2024-05-29 15:12:01 -06:00
FusionPBX 3ceea47824
Update content.php 2024-05-29 14:08:09 -06:00
Antonio Fernandez cf8087916b
New feature: Caller id number startswith (#6987)
* Destination Condition for CID Starts With added

* Translations for CID Starts with added

* changed "startswith" to prefix in app_languages

* added prefix where it needs to be

* Update destination_edit.php
2024-05-29 11:32:51 -06:00
Antonio Fernandez 08a7bb3d8e
Added some missed field for auto lowercase (#6986)
I missed a few fields that should have been added to my previous commit
2024-05-29 11:26:05 -06:00
Antonio Fernandez 0ae13e26c5
C520 directory changes to template (#6982)
* added directory to Snom C520

* uri change

* minor changes to the template

* added number_type in xml to fix directory
2024-05-29 11:25:10 -06:00
Antonio Fernandez 03c78e45bc
Snom firmware fix (#6958)
* Fixed file names for Snom firmware D8xx

* fixed default firmware files for D7xx and D3xx
2024-05-29 11:24:30 -06:00
chansizzle 94341120c2
Update valet_park to include 59 in the park_lot variable (#6984)
included 59 in the park_lot variable so the BLF status will work.
2024-05-28 23:13:00 -06:00
FusionPBX 34460af51c
Update index.php 2024-05-28 23:04:53 -06:00
Antonio Fernandez cabdda88b3
Fix importing extensions (#6985)
This commit will lower the case on all boolean values since if you enter the value as not all lower-case the value will be invalid.
2024-05-28 17:40:15 -06:00
FusionPBX 5ca870a045
Update fifo_member.lua 2024-05-28 14:37:53 -06:00
fusionate c27f287651
Voicemail - Messages: Option to manually submit audio to AI for transcription, if enabled. 2024-05-28 13:08:41 -06:00
fusionate e128bdd850
Dashboard - New Messages: Mitigate PHP 8.x+ warnings. 2024-05-28 08:08:17 -06:00
FusionPBX 1da698887b
Deprecate old contact app defaults.
This was added to help with the upgrade for systems 8 years ago.  This is no longer needed.
2024-05-27 13:59:10 -06:00
frytimo a7f4dd0340
update grandstream template to use NTP provisioning variable (#6983) 2024-05-27 13:10:05 -06:00
FusionPBX a2aa5ea67f
Add class parsedown.php 2024-05-25 13:23:38 -06:00
FusionPBX 0e3eae29ab
Add a new Yealink T34W template 2024-05-24 13:03:22 -06:00
FusionPBX b07c34d262
Complete the T44W template 2024-05-24 12:44:16 -06:00
FusionPBX 05c0b4cc96
Add Yealink template for the T44W 2024-05-24 12:28:53 -06:00
FusionPBX 5672944a5d
Add the extension name to CDR 2024-05-23 14:31:56 -06:00
FusionPBX c5547092d3
Update index.lua 2024-05-22 11:57:56 -06:00
FusionPBX a31452eb48
Update index.lua 2024-05-22 11:45:49 -06:00
FusionPBX ac20b8208c
Update call control
Add ability to set the enabled context and the disabled context
2024-05-22 11:39:06 -06:00
FusionPBX c441844a46
Call Control
Used to enable or disable calling based on the call group.
2024-05-22 10:49:39 -06:00
Antonio Fernandez 4c78076227
Adding Snom C520 template (#6980)
* Adding Snom C520 template

* fix
2024-05-21 23:21:22 -06:00
frytimo 46b7c5536a
Prevent deleting the email when fax sender is not authorized (#6981)
* Prevent deleting the email when fax sender is not authorized
2024-05-21 22:51:50 -06:00
fusionate e6860a54b9
CDR - Details: Add button to Transcribe via AI, if enabled. 2024-05-21 16:07:44 -06:00
fusionate 003b6d7aa8
CDR [Class]: Mitigate PHP 8.x warnings. 2024-05-21 15:33:15 -06:00
fusionate 353bef172d
CDR - List: Make Delete button (if allowed) function like other pages. 2024-05-21 15:26:02 -06:00
fusionate 67b1f245b3
Resources - Languages: Add missing translations. 2024-05-21 15:16:01 -06:00
fusionate 1f8542b9cc
Call Recordings: Option to manually submit audio to AI for transcription, if enabled. 2024-05-21 14:59:23 -06:00
fusionate 7312b9ab67
CDR: Create record_transcription field, drop deprecated recording_file, recording_name fields. 2024-05-21 13:29:48 -06:00
FusionPBX d2b90714c0
Add Greek language and alphabetical order
Also, change the language order. Put the languages in alphabetical order
2024-05-17 14:38:11 -06:00
FusionPBX 54c57bdb18
Update greek sounds to use voice serena 2024-05-17 14:32:05 -06:00
Anthony b751b01161
Added translations to description-ping_max under app/gateways/app_languages.php (#6979) 2024-05-17 10:44:41 -06:00
FusionPBX e95ea23ce9
Change concurrent_outbound_limit to limit_max 2024-05-16 09:38:31 -06:00
denisent 1b83d95935
Make extension concurrent outbound limit a default setting (#6968)
* Make extension concurrent outbound limit a default setting

* Make extension concurrent outbound limit a default setting
2024-05-16 09:34:43 -06:00
Alex b35b447344
Update Chartjs and Sortablejs (#6978)
* minor bug fix

* fix spacing of legend

* remove extra line break

* minor bug fix

* Update dashboard_edit.php

* Update chart.min.js

* Update sortable.min.js
2024-05-16 09:27:00 -06:00
FusionPBX 5286dbbb1b
Add isset with variable last_app 2024-05-15 14:47:07 -06:00
FusionPBX a16ec80ce4
Update the caller ID when using intercept
When intercept is used then use the last_sent_callee_id_name and last_sent_callee_id_number for the caller ID information.
2024-05-15 14:24:52 -06:00
FusionPBX 17bc6ca382
Update app_languages.php 2024-05-15 10:42:10 -06:00
Antonio Fernandez fc76af2d88
Fixed description for gateway pi-min and ping-max (#6975) 2024-05-15 10:34:27 -06:00
Anthony fe7009e7c7
Added missing translations to core app_languages.php files. (#6977)
* Added missing translations to core/users/app_languages.php

* Added missing translations to core/user_settings/app_languages.php
2024-05-15 10:13:11 -06:00
FusionPBX 475696ecff
Check for valid fax numbers
Validate the fax destination number
- Check outbound routes
- Check valid extension
- Set the status to failed for all other numbers
2024-05-14 12:49:13 -06:00
FusionPBX 1a10543851
Use an underscore for phrase agent_status 2024-05-14 12:11:22 -06:00
FusionPBX da1d5fca8c
Update 380_hold_music.xml
- Use rtp_has_crypto
- Remove deprecated zrtp
2024-05-14 12:07:01 -06:00
FusionPBX 23fb7e6211
Add fifo agent_status phrase 2024-05-14 11:46:47 -06:00
FusionPBX 0b055bc31b
Update fax_files.php
Make the code more efficient by using one database object.
2024-05-14 10:03:14 -06:00
FusionPBX 0a4e227706
Update extensions.php
Remove user_context from v_devices as its redundant when the domain_uuid is also used.
2024-05-13 14:32:13 -06:00
Alex 98d5e4fd67
Dashboard - Added chart cutout and text size default settings (#6976) 2024-05-13 14:20:33 -06:00
fusionate 2d3dca985d
Upgrade - CLI (Manual & Menu): Mitigate PHP 8.x warnings, minor adjustments. 2024-05-13 14:19:34 -06:00
fusionate b369fad190
Upgrade - Menu & Permission Defaults: Mitigate PHP 8.x warnings. 2024-05-13 12:49:29 -06:00
fusionate 8ca960b127
Upgrade - Source: Mitigate PHP 8.x warning. 2024-05-13 12:22:01 -06:00
fusionate 5c73ea7bbb
Destination Summary: Mitigate PHP 8.x warnings, fix search criteria on CSV export. 2024-05-13 12:17:14 -06:00
fusionate fc90314009
Destination Summary: Mitigate PHP 8.x warnings. 2024-05-13 11:46:51 -06:00
fusionate 0a419a7698
Voicemail - Edit: Mitigate PHP 8.x warnings. 2024-05-13 11:39:19 -06:00
fusionate e81220d997
Time Conditions - Edit: Mitigate PHP 8.x warnings. 2024-05-13 11:22:32 -06:00
Mihir Gajjar 69524a5162
Updated Snom D735 Template (#6867)
Snom D735 has a known issue where the lights on the phone won't illuminate when in use. It still functions correctly but without any lights. I talked with Snom support and they provided me with the string that needs to be changed in the template.

This issue started from Snom firmware version 10.1.127.10

Release Notes - https://service.snom.com/display/wiki/10.1.127.10+Release
2024-05-13 11:11:19 -06:00
fusionate 05cd649a73
Operator Panel: Mitigate PHP 8.x warnings. 2024-05-13 11:03:09 -06:00
fusionate 7556956763
CDR - Details: Mitigate PHP 8.x warnings. 2024-05-13 10:27:34 -06:00
FusionPBX 1a9eaef5f3
Update 240_page.xml
Changed this value to false as the check destination status will be checked by default. The purpose of this change to keep the original behavior.
2024-05-09 10:30:35 -06:00
FusionPBX 4f7c5789fc
Improve the indentation 2024-05-09 10:25:27 -06:00
FusionPBX 50e0dd33e8
Page check destination status by default 2024-05-09 10:23:14 -06:00
Alex 301a1f69a0
Move dashboard defaults settings to theme (#6973) 2024-05-08 13:41:21 -06:00
Alex 66b57a7784
Dashboard - Add gradient background color settings (#6972)
* Dashboard - Add gradient background color setting
2024-05-08 09:54:18 -06:00
FusionPBX 8657a68d7e
Update destinations.php
The &$row pointer caused a duplicate in the interface on the last row when used with updating the $row['action'] value. 

Used an alternative method to update the destinations array and it solved the appearance of a duplicate.
2024-05-06 17:33:48 -06:00
FusionPBX 04ee47ce8f
Skip the cache if the SQL query timed out 2024-05-06 13:08:02 -06:00
FusionPBX 94e3d1edf6
Voicemail transcription use the new transcribe class 2024-05-05 16:47:32 -06:00
Antonio Fernandez 68b4b32519
Fix issue with some emails not getting pulled from IMAP (#6969)
* Fix issue with some emails not getting pulled from IMAP

* alert users of the ability to enter a domain name
2024-05-04 23:07:23 -06:00
fusionate 3c0a5ad774
Dialplans - Call Screen: Make temp recording filename unique to resolve appending bug. 2024-05-04 16:46:19 -06:00
FusionPBX 3bb8ee345e
Allow multiple colors
Prepare an option for allowing multiple colors to be used with gradients.
2024-05-04 11:51:53 -06:00
fusionate 7c816a1e36
Upgrade: Populate missing translations. 2024-05-03 18:34:29 -06:00
fusionate 006409bdd9
Upgrade - Source Code: Additional minor adjustments. 2024-05-03 18:18:05 -06:00
fusionate 7ec902add2
Upgrade - Source Code: Preview link to view list of changed files before upgrading. 2024-05-03 17:32:17 -06:00
FusionPBX 80c5e589ab
Bug fix for FAX forward 2024-05-03 13:17:14 -06:00
FusionPBX f30180d2b7
Bug fix send fax to a local extension 2024-05-03 13:13:51 -06:00
fusionate 58d2a9d754
CDR - Details: Mitigate PHP 8.x errors. 2024-05-02 15:42:47 -06:00
FusionPBX 1649087beb
Add an emergency logs description 2024-05-02 15:07:48 -06:00
FusionPBX 85e439fdbf
Prevent a warning by using isset 2024-05-02 14:05:30 -06:00
FusionPBX 55bebdec6d
Set the label_call_status to prevent a warning 2024-05-02 07:32:53 -06:00
FusionPBX 8805c2f1c8
Use the settings class 2024-05-02 06:58:58 -06:00
FusionPBX d9c92c00e9
Update database.php add comments 2024-05-02 06:40:30 -06:00
FusionPBX 557afd01ad
Call block save_call_detail_record default
Set to save the record by default. The reason is to have a record of it so that if it's abused it can be reported.
2024-05-01 09:15:49 -06:00
FusionPBX d11308b844
New setting save_call_detail_record
If blocked by call block option to save the call detail record true or false.
2024-04-30 18:21:42 -06:00
FusionPBX 6176ea2376
Update destinations.php
- Update the array to add actions before display.
- Use column names in the SQL select
- Use a SQL Left Join to get the domain name
2024-04-29 12:46:32 -06:00
FusionPBX 6f6d84e1cc
Update conference_centers.php 2024-04-29 10:42:48 -06:00
FusionPBX 38d6f35d78
Define class parameters 2024-04-27 19:45:31 -06:00
FusionPBX 0c08780ca2
Update database.php 2024-04-27 19:29:50 -06:00
frytimo 0b8edef82c
Config class rewrite (#6965)
* Use a singleton pattern in the database class to re-use the database object inside the permission_exists function.
2024-04-27 19:22:20 -06:00
FusionPBX 8a30f04125
Update upgrade.php changes apps to repos 2024-04-27 10:52:22 -06:00
frytimo aeee90d56e
update auto_loader to use magic dir constant (#6963) 2024-04-26 13:49:56 -06:00
Alex 5eead0d88a
Dashboard - Add disabled option to details state (#6962)
* Dashboard - Add disabled option to details state
2024-04-25 23:36:54 -06:00
FusionPBX 64e3a6792d
Rename core/dashboard/resources/classes/dashboard/icon.php to core/dashboard/resources/dashboard/icon.php 2024-04-24 20:48:27 -06:00
FusionPBX 6ca5672d75
Update dashboard_edit.php
Fix the indentation
Set the dashboard_path default value.
2024-04-24 19:58:14 -06:00
Alex 1c8455a9b9
Dashboard - Minor adjustments (#6961) 2024-04-24 19:52:39 -06:00
FusionPBX d4ae2952a3
Add Dashboard settings URL and Icon 2024-04-24 19:49:16 -06:00
FusionPBX 0667f76c05
Add label-link and label-icon 2024-04-24 19:37:40 -06:00
Alex c38caaadc9
Update missed_calls.php (#6960) 2024-04-24 14:37:47 -06:00
Alex 28efea22fd
Dashboard - Add background color settings (#6959)
* Dashboard - Add background color settings

* Update missed_calls.php

* Update recent_calls.php

* Update app_languages.php

* Update app_config.php

* Update dashboard_edit.php

* Update index.php

* Update css.php

* Update system_status.php

* Update system_cpu_status.php

* Update system_counts.php

* Update system_counts.php

* Update switch_status.php

* Update index.php

* Update system_counts.php

* Update domain_limits.php

* Update call_forward.php

* Update caller_id.php

* Update ring_group_forward.php
2024-04-24 14:14:24 -06:00
FusionPBX f8771c4f10
Move emergency setting to its own category. 2024-04-24 10:29:03 -06:00
frytimo c85e10ea09
include software_name in the global declaration (#6957) 2024-04-23 10:23:04 -06:00
frytimo 41eb7ac8d3
Fix empty line printing on console (#6956)
* fix empty line printing on console
2024-04-23 08:53:14 -06:00
frytimo 33ff85ee75
Commad line upgrade enhancements (#6955)
* Add new English language phrases for cli upgrade menu

* include a software name as a const for cli upgrade menu

* add it repos in app folder, internationalizations, and descriptions

* bug fix when response_source_update is empty change back to origin dir

* change original 'menu' to 'menus'. Allow calling menu from upgrade.php

* Update upgrade_menu.php
2024-04-22 17:15:09 -06:00
fusionate 4e8f60cb92
Voicemail Messages - Restore non-Base64 message audio waveform generation. 2024-04-22 15:33:55 -06:00
frytimo c4fd1c4842
Rename domains to app defaults in menu (#6954)
* rename 'Domains' to 'App Defaults' in menu options for clarity

* reorder app defaults to be after the schema like web interface
2024-04-22 12:56:31 -06:00
FusionPBX 9e71d87012
Recent Calls hide Lose Race 2024-04-22 12:16:30 -06:00
FusionPBX bd2f0b7442
Require domain_uuid and user_uuid 2024-04-22 08:48:58 -06:00
FusionPBX b6f68533d1
Update valet_park to exclude 5900 2024-04-22 08:17:08 -06:00
FusionPBX 375c7d228b
Update require.php 2024-04-20 22:59:45 -06:00
FusionPBX 313de4c6dc
Update authentication.php
Empty the permissions before assigning permission to the user during the login process.
2024-04-20 22:00:29 -06:00
FusionPBX 278f1d7453
Update permissions.php 2024-04-20 21:59:04 -06:00
FusionPBX 955a840ad6
Update permissions.php
If the $_SESSION['permissions'] isset then use it to prevent round trips to the database.
2024-04-20 20:54:06 -06:00
FusionPBX f3250db199
Update groups.php
Remove redundant database instances. 
$database new database;

Remove redundant app_name and app_uuid
2024-04-20 20:26:43 -06:00
FusionPBX 675ac2d433
Prevents an error when groups session is not set 2024-04-20 17:06:05 -06:00
FusionPBX c87e40301b
Add a user class to store user details 2024-04-20 17:04:22 -06:00
FusionPBX 09719c7f36
Update authentication, groups and permissions classes 2024-04-20 16:51:53 -06:00
Alex 19e21d9997
Update missed_calls.php (#6953)
* Update missed_calls.php

* Update recent_calls.php

* Update voicemails.php
2024-04-19 17:36:16 -06:00
FusionPBX 2a1e36ca02
Add apps as a class variable
- Use self:$apps
- Replace $_SESSION['apps']
2024-04-19 11:07:30 -06:00
FusionPBX 768937b624
Update database.php
- Allow sending $params into the constructor.
- Add paramaters: domain_uuid and user_uuid
- Replace $user_uuid and the session variable with $this->user_uuid
- Use the SESSION as an alternative to the parameter
2024-04-19 09:48:05 -06:00
Alex 4e06ce8c14
Update voicemails.php (#6952) 2024-04-18 17:11:05 -06:00
Alex 808e2cbe66
Dashboard - Add chart type setting (#6951)
* Dashboard - Add chart type setting
2024-04-18 16:57:45 -06:00
FusionPBX 07ff90f97c
Use $event_socket instead of $esl 2024-04-18 16:14:00 -06:00
fusionate 7b6bdb6fb1
Upgrade - Source Code: Minor adjustments to interface. 2024-04-18 11:51:13 -06:00
FusionPBX cffe54a136
Update app_languages.php 2024-04-17 21:04:28 -06:00
FusionPBX e607253bc6
Update layout for source and other repos 2024-04-17 20:58:47 -06:00
Alex 1412ed7f68
Dashboard - Add text color settings (#6950)
* Dashboard - Add text color setting
2024-04-17 16:01:54 -06:00
frytimo 37fd4692c1
Add command line menu for upgrade (#6949)
* use existing git_pull function from global functions
2024-04-17 15:04:34 -06:00
FusionPBX 1df3015e19
Allow using dsn_call_center
Allow using extra underscore so that it works with either values. 
- dsn_callcenter
- dsn_call_center
2024-04-17 10:47:22 -06:00
FusionPBX 30439ae14a
Get speech settings from category speech 2024-04-17 08:52:53 -06:00
FusionPBX e81d711a92
Update xml_cdr.php
- Initialize the database class in the constructor
- Improve efficiency by removing extra database instances
- Bug fix. If cc_queue has been provided and call_center_queue_uuid is empty. Then use it to get the call_center_queue_uuid
2024-04-16 09:54:27 -06:00
fusionate 360cc3cdd3
Upgrade: Rework Source Code option to be more flexible. 2024-04-15 19:17:09 -06:00
FusionPBX c806aae310
Moved to speech and transcribe repos 2024-04-15 17:12:18 -06:00
FusionPBX 75439fb4e9
Update recording_edit.php
Use the speech and transcribe classes.
2024-04-15 15:38:54 -06:00
emak-Corey 27b2ddb906
[vm] Split new/saved message count macros + improve french translations (#6944)
* [vm] Split new/saved message count macros + fix french translations

* Update main_menu.lua
2024-04-15 09:32:13 -06:00
Ahron Greenberg (agree) 4435cf5bd0
[voicemail transcription] fix google v2 (#6946)
* v2 doesn't require to have api_key set
* allow setting setting a path to the application credentials
* check only ones if the file path exists
2024-04-15 09:26:44 -06:00
Antonio Fernandez 0646bcb93e
Avaya J-Series phone support added (#6948)
* Added support for Avaya J-Series phones

* moved a file

* minor change to remove an invalid parameter
2024-04-15 09:26:02 -06:00
FusionPBX d6bef277d8
Update header.php 2024-04-13 14:42:32 -06:00
FusionPBX 92969d904c
Update valet_park_auto
- Use lua valet_park
2024-04-12 12:00:52 -06:00
FusionPBX d8a8d4997e
Show all messages in the fax queue
Including ones not assigned to a user
2024-04-11 16:04:44 -06:00
FusionPBX 8e76a940aa
Move fax advanced to its own file 2024-04-11 13:23:09 -06:00
FusionPBX cf4f96070a
Use valet_parking
Changed variable prefix from vale_park to valet_parking for consistency
2024-04-10 21:42:40 -06:00
FusionPBX d04802f1ba
Add script valet_park
- Used to handle park in with a * prefix
- Supports *5901 - *5999
2024-04-10 21:31:20 -06:00
FusionPBX ea2274fe6f
Validate the uuid used in intercept 2024-04-09 18:56:07 -06:00
FusionPBX 179745f871
Make Call Center variables more robust 2024-04-09 17:20:38 -06:00
Ahron Greenberg (agree) 199e573041
[email_queue] don't run exec on each iteration (#6945) 2024-04-08 14:18:42 -06:00
Andy-Seattle bbabb4f861
Handle ERR no such channel during call intercepts (#6943)
When call center is not enabled, during a standard call intercept sometimes we are seeing an error as follows:
call_center_queue_uuid=-ERR%20No%20such%20channel!%0A
cc_queue_joined_epoch=-ERR%20No%20such%20channel!%0A
Normally it returns call_center_queue_uuid=_undef_ but occasionally shows the ERR message.
When the epoch variable is set to this it causes the XML CDR service to continually stop and start at the same CDR which raises the CPU load on the server significantly until the CDR is deleted.
This code fix will handle the ERR message in the same way as _undef_.
2024-04-05 17:36:25 -06:00
frytimo 2f31b5addd
if_group caused no conferences to show when user not in the admin group (#6942)
* if_group caused no conferences to show when user not in the admin group

* if_group replaced to be conference_room_edit
2024-04-05 17:33:42 -06:00
FusionPBX 56fe5831af
Bug fix replace dialed_user with dialed_extension 2024-04-03 11:22:02 -06:00
FusionPBX fefb58f5df
Fix bug with extension missed call email
The dialed_user used to exist on all systems no longer the case. So using sip_to_user instead for backward compatibility.
2024-04-03 10:50:52 -06:00
FusionPBX 4313ee17cd
Use autoloader to find the class
ringback class was moved to app/switch/resources/classes
2024-04-02 17:22:40 -06:00
Alex a66477824a
Use dialplan_global permission (#6940)
You can disable this permission to hide global dialplans from the list
2024-04-02 15:05:53 -06:00
frytimo 614986cd7a
use a single database instead of using new database in user_edit (#6939) 2024-04-02 11:55:32 -06:00
FusionPBX 0e658a486f
Update user_edit.php
Move the validation earlier in the code
2024-04-02 11:01:43 -06:00
FusionPBX 2d97968a52
Update cmd.php 2024-04-02 10:58:33 -06:00
FusionPBX bd8cfc9851
Security: Validate the user_status variable 2024-04-02 10:52:02 -06:00
FusionPBX 71bc204417
Update calls_exec.php
Minor updates
2024-04-02 10:34:20 -06:00
FusionPBX 92f5f4abe4
Update destinations.php 2024-04-02 09:43:16 -06:00
FusionPBX 2e7ebaf1c4
Moved ringbacks to app/switch/resources/classes
Moved resources/classes/ringbacks.php to app/switch/resources/classes/ringbacks.php
2024-04-02 09:26:08 -06:00
FusionPBX 463aa5213f
Add object property streams. 2024-04-02 09:24:25 -06:00
frytimo c595df34b2
variable expanded_all was not initialized causing warning (#6938) 2024-04-02 09:23:37 -06:00
frytimo 4377336add
variable conference_center_greeting was not initialized causing warning (#6937) 2024-04-02 09:15:44 -06:00
frytimo e47b2e3710
Fix $x was not initialized on first iteration of for loop (#6936) 2024-04-02 09:09:36 -06:00
Anthony d4b3d8682b
Added bulk translations to app/recordings/app_languages.php (#6935) 2024-04-01 14:16:34 -06:00
FusionPBX 2cca127111
Update app_languages.php 2024-04-01 13:38:36 -06:00
FusionPBX 7dc021dc4e
Disable the model 2024-03-30 23:48:49 -06:00
FusionPBX e8798b3fe1
Model picked up automatically
So for now the model is not required
2024-03-30 19:42:23 -06:00
FusionPBX 2c3f2ffd61
Update AI text speech
- elevenlabs
  - update curl code
  - automatically determine the model
2024-03-30 19:23:03 -06:00
FusionPBX db5cae89e4
Remove the default recording voice
Update the recording if a voice has been selected.
2024-03-30 15:19:50 -06:00
frytimo 502ba07c53
Ai elevenlabs io engine (#6932)
* allow settings to load domain and user settings

* ensure the engine is also enabled before attempting to create a new object

* add default values to stop undefined variable warnings

* enforce all models to set and return voices and languages

* enforce all models to set and return languages

* ensure speech_enabled is set by the current session

* create elevenlabs implementation of ai speech

* Update ai_elevenlabs.php
2024-03-30 14:16:16 -06:00
denisent 883c32d932
Add grandstream gdms acs url default setting (#6934)
* add grandstream gdms acs url default setting

* add grandstream gdms acs url default setting

* add grandstream gdms acs url default setting
2024-03-30 13:52:50 -06:00
FusionPBX 3b0325a2e3
Recording name replace a space with a dash 2024-03-30 12:03:16 -06:00
FusionPBX fb241f5085
Change the value to true
These settings are enabled false by default
2024-03-30 10:30:46 -06:00
FusionPBX 088abe4f4c Improve Ring group context handling
If the user doesn't have the correct permission then keep the ring_group_context  value from the database
2024-03-30 09:35:24 -06:00
FusionPBX 911888e949
Update ivr_menu_edit.php 2024-03-30 08:28:42 -06:00
fusionate cd2d2cf632
Default Settings - List: Mask *_key subcategory values. 2024-03-29 10:19:05 -06:00
wouam31200 2c6b36e356
Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys} (#6910)
* Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys}
2024-03-28 22:15:30 -06:00
frytimo 6bd159a717
settings was being set in constructor but property was missing (#6931) 2024-03-28 22:13:01 -06:00
frytimo 6fd5d7cda4
Fix user_email missing from object properties (#6929) 2024-03-28 22:10:36 -06:00
frytimo 758cb2ec60
set to compare instead of assignment in the message error checking (#6933) 2024-03-28 22:07:04 -06:00
frytimo ff55a36980
after doing a database restore, the permission may not yet exist (#6930) 2024-03-28 08:59:30 -06:00
Alex 2cfbe63a5f
Cover Page Option (#6928)
Subject and Message Required
2024-03-27 22:10:58 -06:00
demonspork 9952026016
Removed unused dialplan is_loopback (#6927) 2024-03-27 22:10:26 -06:00
FusionPBX 2171a5f11a
Use the name to find the Select Option Group translation. 2024-03-27 09:11:43 -06:00
frytimo a9886a8ba9
Add str_starts_with and str_ends_with to PHP versions older than 8 (#6832)
* Add str_starts_with and str_ends_with to PHP versions older than 8

* Update functions.php
2024-03-26 16:42:44 -06:00
FusionPBX 027e0757d1
Update the voices array for key and value 2024-03-25 14:01:21 -06:00
FusionPBX 311febaf0b
Add user_uuid 2024-03-25 13:46:02 -06:00
FusionPBX 71fefde828
Update recordings.php 2024-03-25 13:44:34 -06:00
FusionPBX 6c41c42a40
Fixed set_language error in transcribe
Changed two methods:
get_language_enabled to is_language_enabled
get_translate_enabled to is_translate_enabled
2024-03-25 12:10:16 -06:00
FusionPBX 21c63c3171
Update destination_edit.php 2024-03-24 10:20:12 -06:00
FusionPBX b96a0f6d48
Use the settings object 2024-03-24 08:47:14 -06:00
frytimo 2064c33fb7
AI bug fixes and update interfaces (#6925)
* allow settings to load domain and user settings

* ensure engine is also enabled before attempting to create a new object

* add default values to stop undefined variable warnings

* enforce all models to set and return voices and languages

* enforce all models to set and return languages

* ensure speech_enabled is set by the current session
2024-03-24 08:37:17 -06:00
FusionPBX 93a180878e
Update app_languages.php 2024-03-23 20:00:56 -06:00
FusionPBX b79774db88
Update the AI settings 2024-03-23 19:50:40 -06:00
FusionPBX b50085f5cd
Add AI default settings 2024-03-23 19:42:30 -06:00
FusionPBX 1a34181008
Add a recording message textarea
- Add speech to text
- Add text to speech
2024-03-23 19:24:32 -06:00
FusionPBX 2756e71e37
Update the new ai class
- Add voices and languages
- Change classname audio_ to ai_
2024-03-23 17:17:21 -06:00
FusionPBX 4fd7fd385b
Add label-translate 2024-03-23 14:16:23 -06:00
FusionPBX 67c39ad4a2
Prevent a conflict with the settings object
- Changed from settings to settings_array.
- Prevents a conflict with the settings object.
2024-03-23 13:53:58 -06:00
FusionPBX 7868073b73
Add ai classe and interfaces to the core 2024-03-22 23:14:12 -06:00
Antonio Fernandez 6ec11d32a9
Update {$mac}.xml (#6920) 2024-03-22 21:50:51 -06:00
Antonio Fernandez fe8503c063
Update {$mac}.xml (#6921) 2024-03-22 21:50:36 -06:00
Antonio Fernandez ff2434aca4
Update {$mac}.xml (#6922) 2024-03-22 21:50:19 -06:00
Antonio Fernandez 316a9f7273
Update {$mac}.xml (#6923) 2024-03-22 21:50:06 -06:00
FusionPBX 63d215192d
Use an array in auto_loader
- Added a search for interfaces
- Updated the indentation
2024-03-21 10:33:05 -06:00
FusionPBX e179aaeb22
Disable aggressive-nat-detection by default 2024-03-21 09:16:19 -06:00
chansizzle b9555b191c
Create snom PA1 plus (#6914)
PA1plus is the product replacement for PA1
2024-03-18 08:33:19 -06:00
Antonio Fernandez 8abfa880fd
added new Snom D8XX series phones (#6916) 2024-03-18 08:32:16 -06:00
fusionate 4d728d47e4
Voicemail: Make waveform image generation work when using base64 message storage. 2024-03-16 13:48:59 -06:00
fusionate b2246b3c46
Voicemail: Rework method used for emailed message Download Link to audio file. 2024-03-16 13:46:38 -06:00
frytimo 2264e2c0ed
Add read and write codec to columns displayed (#6913)
* add read and write codec to columns displayed

* update the column display name to be Codecs
2024-03-16 10:56:28 -06:00
denisent e279b0c7b6
Add echo_canceller and echo_suppressor variables (#6827)
* add echo_canceller and echo_suppressor variables
2024-03-16 10:52:32 -06:00
FusionPBX 0b37b04621
Add stun_server, custom CA rule. and blind transfer on speed dial 2024-03-15 23:47:30 -06:00
fusionate fe971649b1
Voicemail [Class]: More adjustments to restore emailed messaage Download link functionality. 2024-03-14 13:59:01 -06:00
FusionPBX 10a4974bd6
Bug fix add bridge_uuid 2024-03-14 13:10:52 -06:00
fusionate 649d740206
Voicemail: Adjust emailed message Listen link to generate message waveform. 2024-03-13 18:09:45 -06:00
fusionate a22d766d6a
Voicemail: Fix emailed direct message Download feature. 2024-03-13 18:08:14 -06:00
FusionPBX 41e95766c6
Update GXP templates 2024-03-13 17:56:35 -06:00
FusionPBX 5c696b6eb3
Add a description for the change 2024-03-13 11:12:48 -06:00
fusionate cac884d672
Device - Edit: Adjust detection of valid line ports. 2024-03-13 10:43:27 -06:00
FusionPBX e0f4309076
New setting call_log_enabled default false 2024-03-12 17:44:46 -06:00
FusionPBX fe5a974dd8
Create xml_cdr_log.php 2024-03-12 09:46:30 -06:00
FusionPBX e6ca01a7af
Add Call Logs and CDR JSON, and Call Flows.
Move the CDR JSON and and Call Flows data to their own tables and add a new table for the Call Log.
2024-03-11 18:51:36 -06:00
FusionPBX 4eed5eaba1
Improve the fax prefix description 2024-03-08 08:37:41 -07:00
FusionPBX 7539a88488
Update intercept.lua 2024-03-07 16:22:08 -07:00
FusionPBX 1f10b6a161
Fixed intercept
Remove from SQL where as the call_uuid is not always used
2024-03-07 14:38:32 -07:00
FusionPBX ad9e175cb9
Remove gswave deprecated by Grandstream 2024-03-07 10:39:54 -07:00
chansizzle 3893ca3838
Remove fields to display the installed firmware version (#6912)
Deleted elements which were making registrations page displaying device and firmware correctly. With the included elements the device and firmware displayed as "snomPA1/x.x.x". Removing the elements allows the device and firmware to display the installed firmware like "snomPA1/8.7.5.75".
2024-03-07 09:44:55 -07:00
FusionPBX 3213d4bab3
IVR Menu - Allow caller_id_name and number variables 2024-03-05 18:28:19 -07:00
FusionPBX 3c17fe6ad4
Update language/sv/vm/sounds.xml fix xml 2024-03-05 12:49:10 -07:00
frytimo 9573cfd9a9
fix transcription bug showing when not enabled in default settings (#6911) 2024-03-05 10:58:22 -07:00
FusionPBX 9810ac81b9
Add tables xml_cdr_json, xml_cdr_flow, call_logs 2024-03-04 23:41:41 -07:00
FusionPBX 19f0a37ad9
Update the GXP Template
grandstream_nat_traversal
    options: No, STUN, KeepAlive, UPnP, Auto, VPN

grandstream_distinctive_ringtone_* (1-10)

grandstream_lan_port_vlan
    Number: 0 - 4095

grandstream_pc_port_vlan
    Number: 0 - 4095

grandstream_pc_mode
    options: Enabled, Disabled, Mirrored

grandstream_stun_server

grandstream_headset_key_mode
    options: DefaultMode, ToggleHeadsetOrSpeaker

grandstream_headset_ringtone
    options: Normal, PlantronicsEHS

grandstream_headset_type
    options: Normal, PlantronicsEHS

grandstream_headset_rx_gain
    Headset RX gain(dB). 1 - -6, 0 - 0, 2 - +6. Default is 0

grandstream_headset_tx_gain
    Handset TX gain(dB). 1 - -6, 0 - 0, 2 - +6. Default is 0

grandstream_screensaver_enable
    options: No, Yes,  OnIfNoVPKIsActive

grandstream_screensaver_source
    options: Default, USB, Download
2024-03-04 23:16:55 -07:00
FusionPBX 5b90e3380a
Update the GXP Template
grandstream_nat_traversal
    options: No, STUN, KeepAlive, UPnP, Auto, VPN

grandstream_distinctive_ringtone_* (1-10)

grandstream_lan_port_vlan
    Number: 0 - 4095

grandstream_pc_port_vlan
    Number: 0 - 4095

grandstream_pc_mode
    options: Enabled, Disabled, Mirrored

grandstream_stun_server

grandstream_headset_key_mode
    options: DefaultMode, ToggleHeadsetOrSpeaker

grandstream_headset_ringtone
    options: Normal, PlantronicsEHS

grandstream_headset_type
    options: Normal, PlantronicsEHS

grandstream_headset_rx_gain
    Headset RX gain(dB). 1 - -6, 0 - 0, 2 - +6. Default is 0

grandstream_headset_tx_gain
    Handset TX gain(dB). 1 - -6, 0 - 0, 2 - +6. Default is 0

grandstream_screensaver_enable
    options: No, Yes,  OnIfNoVPKIsActive

grandstream_screensaver_source
    options: Default, USB, Download
2024-03-04 22:38:26 -07:00
FusionPBX bf4623ccb8
Update index.lua
Use the original_caller_id_number in the diversion header.
2024-03-04 19:09:30 -07:00
FusionPBX 2553caa2b1
Add required diversion header 2024-03-04 16:50:37 -07:00
FusionPBX 422a9d7eb6
Use the line register_expires 2024-03-04 14:48:41 -07:00
FusionPBX 95cf9917e2
Grandstream GXP2135 fix register_expires, DND, and call forward 2024-03-04 13:53:56 -07:00
FusionPBX 472d6e8210
Remove self closing tag when a value is provided 2024-03-04 13:38:50 -07:00
FusionPBX a4e32409ed
GXP2170 fix register_expires, DND, and call forward 2024-03-04 13:32:00 -07:00
FusionPBX 722a2806ee
Remove self closing tag for *78 and *79 2024-03-04 13:28:17 -07:00
FusionPBX a93519e310
Fix the register_expires, DND and grandstream firmware 2024-03-04 13:22:25 -07:00
FusionPBX 46e4afb6f3
Grandstream 2160 Fix keys assignments over 6 2024-03-04 13:16:34 -07:00
FusionPBX 27a894a59f
Grandstream 2140 Fix keys assignments over 4 2024-03-04 13:13:38 -07:00
FusionPBX 77d8aecf5c
Add register_expires and *78 and *79 2024-03-04 13:05:47 -07:00
FusionPBX fb9b67a274
Grandstream 2130 Fix keys assignments over 3 2024-03-04 12:55:09 -07:00
FusionPBX 4cfcbd0c9c
Grandstream 2135 Fix keys over 8 2024-03-04 12:50:37 -07:00
FusionPBX 7d06f5dc9e
Grandstream 2170 Fix keys over 12 2024-03-04 12:40:44 -07:00
fusionate 61c5b6e005
Time Conditions: Better support for date-time based presets. 2024-03-04 12:28:25 -07:00
FusionPBX f873ee7757
Update settings.php
Reverting mixed type until more people have migrated off of PHP 7.4
2024-03-04 09:35:17 -07:00
FusionPBX 1acb30a7fe
Prevent an error 2024-03-02 18:13:25 -07:00
FusionPBX b1589bac86
Move the ring group destination description 2024-03-02 15:31:03 -07:00
FusionPBX e3733381eb
Update the version of the Master Branch
This is not a release yet it's a version for the Master Branch. We are doing this to separate it from the current release.
2024-03-01 18:35:27 -07:00
FusionPBX 3896629817
Fix the order by for IVR Menu Options 2024-03-01 18:26:44 -07:00
FusionPBX bb8c4c0e66
Include ORIGINATOR_CANCEL for missed calls 2024-03-01 14:08:47 -07:00
frytimo ebe12ef338
allow setting a default value (#6908) 2024-03-01 10:26:51 -07:00
FusionPBX 0626fc1c9a
Add yealink_app_unavailable from another template. 2024-02-29 09:51:56 -07:00
fusionate c0d26a9279
Operator Panel: Permission check adjustment. 2024-02-28 13:12:15 -07:00
fusionate 3f6fa8d2f9
Operator Panel: Add permission to show or hide (default) unregistered extensions. 2024-02-28 12:59:49 -07:00
fusionate 07f532afab
Operator Panel: Restore drag/drop calling and transfer. 2024-02-27 11:18:44 -07:00
FusionPBX fb1b8e7a38
Use a join to get the domain_name 2024-02-26 09:28:17 -07:00
frytimo d5cbebadd8
add domain column when showing all domains (#6905) 2024-02-26 08:57:36 -07:00
FusionPBX 672922def0
Ring group destination adde per user music on hold 2024-02-24 21:06:17 -07:00
FusionPBX ebcd78ed4f
Fix fax from address when sending an outbound fax 2024-02-23 15:42:38 -07:00
FusionPBX 4d9160b1cd
Extension summary add voicemail column and use the CDR status 2024-02-22 21:04:14 -07:00
Alex 7436d8e651
Update xml_cdr_inc.php (#6903) 2024-02-22 15:54:18 -07:00
FusionPBX cdc11c5d16
Fix duration if null set to 0
If gmdate gets a null it uses the system time. This affected canceled calls.
2024-02-22 09:19:57 -07:00
FusionPBX 102d973f11
Fix the Yealink Conference templates 2024-02-21 16:30:29 -07:00
fusionate dc0f985b2f
Check Auth: Unset temporary $name variable. 2024-02-21 15:04:09 -07:00
FusionPBX 717ee2d8fc
Update destinations.php
- Use the database object more efficiently
- Access the get method with this->get
- Bypass cached destinations to avoid problems
2024-02-21 11:23:58 -07:00
frytimo b47f9c3219
add default value for ring time delay before voicemail (#6900)
* add default value for ring time delay before voicemail

* Update app_config.php
2024-02-20 22:04:24 -07:00
Anthony 80c670d945
Added bulk Turkish translations to app_languages.php files (#6901)
* Added Turkish translations to access_controls/app_languages.php

* Added Turkish translations to basic_operator_panel/app_languages.php

* Added Turkish translations to bridges/app_languages.php

* Added Turkish translations to call_block/app_languages.php

* Added Turkish translations to call_broadcast/app_languages.php

* Added Turkish translations to call_flows/app_languages.php
2024-02-20 21:59:53 -07:00
FusionPBX 746413cbfe
Update recent_calls.php
- Simplify SQL time format
- Use SQL limit to be more efficient
- Use the call detail record status
2024-02-20 14:48:24 -07:00
FusionPBX 195b46e9e4
Update app_languages.php add no_answer 2024-02-20 14:30:43 -07:00
FusionPBX cdee086045
Use SQL limit for missed calls 2024-02-20 14:16:53 -07:00
FusionPBX 76bcd70824
Use the domain time_format 12h or 24h 2024-02-20 13:57:29 -07:00
FusionPBX 61d40a62ee
Simplify the time format 2024-02-20 13:41:21 -07:00
FusionPBX 53f6f040c1
Update the URL to use status 2024-02-20 13:24:27 -07:00
FusionPBX 60d4a7c1be
Use the call status missed to find missed calls 2024-02-20 13:12:52 -07:00
FusionPBX dbc88b847a
Replace voicemail_answer_stamp with voicemail_message_seconds
The voicemail_answer_stamp value exists if the call reaches voicemail. The voicemail_message_seconds is set if the caller leaves a voicemail message.
2024-02-20 12:47:10 -07:00
FusionPBX 359a323c1f
Don't use voicemail_id to determine call status
This is an unreliable way to detect if the call when to voicemail.
2024-02-20 12:28:59 -07:00
FusionPBX 06480cbc3d
Fix bug with sipnetic use server_address
The registration domain should use server_address not the outbound_proxy_primary address.
2024-02-19 14:56:46 -07:00
Alex 5e6bc5b3ed
Update call_broadcast_send.php (#6896) 2024-02-19 11:34:28 -07:00
FusionPBX 1b5d66e85e
Refresh each subscription publication 2024-02-17 08:34:47 -07:00
FusionPBX 632c2ee10f
Update 310_extension-to-voicemail.xml
Quote the interpolated part of the regexes between \Q and \E
2024-02-13 18:03:32 -07:00
Anthony f80293e163
Added Greek & Turkish translations to app app_laguages.php files (#6895)
* Added Greek & Turkish translations to fifo/app_languages.php

* Added Greek & Turkish translations to fifo_list/app_languages.php

* Added Greek & Turkish translations to gswave/app_languages.php

* Added bulk translations to gateways/app_languages.php
2024-02-13 12:28:13 -07:00
Antonio Fernandez 91cfa5f778
added missing fax_email permission (#6894)
This permission is referenced in the fax_edit.php code and allows you to enter a confirmation email for faxes that are sent. Without this permission it is no editable.
2024-02-12 16:11:46 -07:00
FusionPBX 5ce4ad4879
Update diversion header 2024-02-12 12:57:01 -07:00
frytimo 2a613840ec
avoid user/pass connection request removal in GRP TR-069 settings (#6890) 2024-02-12 11:38:50 -07:00
FusionPBX 1326e8804f
Update app_config.php 2024-02-12 10:46:31 -07:00
FusionPBX 77be489350
Update app_config.php 2024-02-12 10:42:58 -07:00
FusionPBX 12f121190b
Add emergency_email_address setting by default 2024-02-12 10:38:27 -07:00
FusionPBX 1ca084cd76
Fix the spelling of label 2024-02-12 10:19:49 -07:00
Anthony d32e543de6
Added Greek & Turkish translations to app app_laguages.php files (#6893)
* Added Turkish & Greek translations to fax/app_languages.php

* Added Greek & Turkish translations to emergency/app_languages.php
2024-02-12 10:17:59 -07:00
FusionPBX aefbf62094
Add order by desc 2024-02-10 15:38:46 -07:00
FusionPBX 490c26ab52
Fix the emergency lua script 2024-02-10 15:35:41 -07:00
FusionPBX e753ce9175
Update emergency logs 2024-02-10 14:36:52 -07:00
fusionate 8c21a3cd83
Call Recordings - List: Restore proper column widths. 2024-02-09 15:40:06 -07:00
fusionate 9b3eb31ac3
Voicemail [Class]: Resolve fclose() error on null object. 2024-02-09 13:16:34 -07:00
fusionate cf51a862e7
CDR: Audio waveform generation integration. 2024-02-09 13:14:22 -07:00
fusionate b8540ac7e8
Voicemails: Audio waveform generation integration. 2024-02-09 13:14:04 -07:00
fusionate 2eb7e7844f
Voicemail Greetings: Audio waveform generation integration. 2024-02-09 13:12:34 -07:00
fusionate e3ea4977a1
Ring Groups: Audio waveform generation integration. 2024-02-09 13:12:14 -07:00
fusionate 1b1acd754c
Recordings: Audio waveform generation integration. 2024-02-09 13:11:40 -07:00
fusionate f55fbabb87
Music on Hold: Audio waveform generation integration. 2024-02-09 13:11:14 -07:00
fusionate 81a6b947fe
IVR Menus: Audio waveform generation integration. 2024-02-09 13:10:57 -07:00
fusionate 1dbe76dfe4
Conference Centers: Audio waveform generation integration. 2024-02-09 13:10:24 -07:00
fusionate b11901ad4d
Call Recordings: Audio waveform generation integration. 2024-02-09 13:09:52 -07:00
fusionate 1dae61de51
Call Flows: Audio waveform generation integration. 2024-02-09 13:09:29 -07:00
fusionate 3001fa151f
Call Centers: Audio waveform generation integration. 2024-02-09 13:09:07 -07:00
fusionate adf8062378
Themes [Default]: Audio waveform support and new setting integration. 2024-02-09 13:07:19 -07:00
fusionate 0be7204762
Functions: Mods to support color manipulations for waveform generation. 2024-02-09 13:05:38 -07:00
fusionate 504d3a6bf2
Waveform [Class]: Support audio file waveform generation. 2024-02-09 13:04:45 -07:00
frytimo d309308824
Change default DHCP value to SNOM recommendation (#6889)
* change default DHCP  value to match SNOM recommendation

* modify the name to be snom_dhcp
2024-02-09 10:29:03 -07:00
frytimo a17b63e616
Use the settings class in the cache class (#6891) 2024-02-09 10:21:55 -07:00
FusionPBX 6890c21e92
Set directory_setting.local_directory.enable default value to 1 2024-02-08 16:34:30 -07:00
FusionPBX b123e32658
Use {$yealink_rport} variable 2024-02-08 16:15:34 -07:00
frytimo c51d485668
use $app_name and $app_uuid for database transaction (#6881) 2024-02-08 11:13:50 -07:00
Ahron Greenberg (agree) 441bd77a5b
Fix dnd toggle sends wrong state in feature sync event (#6886) 2024-02-08 11:12:47 -07:00
frytimo 535eba25fa
Change domain to server_address (#6888)
template should use account.1.server_address
2024-02-08 11:12:24 -07:00
FusionPBX 18f59eeb61
Disable ws and wss by default 2024-02-07 17:51:21 -07:00
markjcrane 52411c858a Add el-gr language 2024-02-07 13:17:18 -07:00
Antonio Fernandez ae851864be
Fixed link for GSWave (#6887) 2024-02-06 21:30:33 -07:00
FusionPBX bbb71439d0
Bug Fix: missed_call handling and voicemail status
Call going to voicemail for an extension was showing status answered instead of voicemail and missed call
2024-02-06 15:24:46 -07:00
FusionPBX b16b6e844e
Bug Fix: Clean buffer before sending the rendered template 2024-02-06 12:30:09 -07:00
FusionPBX f97a67fb27
Bug Fix: Use the HTTP_HOST if the domain_uuid is empty 2024-02-05 18:58:16 -07:00
fusionate ebb68cccf5
Fax Server: Add date to cover sheet (if any), on Send. 2024-02-06 00:30:46 +00:00
FusionPBX 192e651722
Remove the single quote
Escape with a back slash didn't work
2024-02-05 17:22:42 -07:00
FusionPBX 1f5b979d0d
Add escape_quote quoted values 2024-02-05 17:10:20 -07:00
FusionPBX 951c36b70b
Add more fax permissions 2024-02-05 13:35:06 -07:00
Antonio Fernandez 42cf20a976
added descriptions to RG Destinations (#6885) 2024-02-05 10:57:12 -07:00
paulc97 6538e1c6d6
Translations for Emergency Logs and Time Conditions (#6879)
* Create app_languages.php

* Update emergency.php to use app_language

* Update app_languages.php

add translations for Weekdays and Months

* Update time_condition_edit.php

make month and day of week use translations
2024-02-05 10:53:34 -07:00
Antonio Fernandez 4bb8bbe8a4
Update app_config.php (#6884) 2024-02-05 10:49:12 -07:00
fusionate b33487a437
Operator Panel: Fix mispelling in code. 2024-02-03 05:22:32 +00:00
FusionPBX 9cdc0ac0ef
Fix a bug with emergency_outbound_caller_id_number
Set call_date moved so it didn't overwrite another variable
2024-02-02 19:59:39 -07:00
frytimo 4fbd767c05
Fix bug where a dialplan detail item was deleted but still shows in the XML dialplan (#6875)
* Fix bug where a dialplan detail item was deleted but still shows in the
XML dialplan.

* Update dialplan_edit.php
2024-02-02 09:17:00 -07:00
fusionate bdbb8cef2d
Voicemail: File to playback Recorded Name. 2024-02-02 00:36:36 +00:00
FusionPBX 537e241399
Add device location and description 2024-01-31 21:33:37 -07:00
fusionate 5fcde5caeb
Remove deprecated language files within the Voicemails app. 2024-01-31 17:18:04 +00:00
fusionate 0433789355
Update Switch language files with missing macro. 2024-01-31 17:13:52 +00:00
FusionPBX d994c21ae1
Rename class scripts to switch_files 2024-01-30 18:02:39 -07:00
fusionate 143f85cd4f
Voicemail Languages: Uncomment new options (doh!). 2024-01-31 00:37:19 +00:00
fusionate aafbce9583
Voicemail: Add Delete option (7) from endpoint for message/greeting/name recording. 2024-01-30 23:53:47 +00:00
Alex 4004a698c4
Added more Greek and Turkish translations (#6880)
* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php

* Update app_menu.php

* Update app_languages.php
2024-01-30 16:17:24 -07:00
fusionate b7045176ac
Voicemail - Edit: Manage recorded name for Company Directory. 2024-01-30 17:10:19 +00:00
FusionPBX 3e62819779
Fix issue where smtp from would send as <> 2024-01-29 13:20:17 -07:00
fusionate 0316248bef
Dialplan XML - Edit: Remove old Ace Editor control icons. 2024-01-24 21:00:25 +00:00
fusionate 814a363dfe
Email Templates - Edit: Remove old Ace Editor control icons. 2024-01-24 20:57:19 +00:00
fusionate da67642e96
System Status: Remove old Ace Editor control icons. 2024-01-24 20:55:57 +00:00
fusionate 5f22dc17d0
Dialplan XML - Edit: Ace Editor icon change. 2024-01-24 20:49:06 +00:00
fusionate d6f93adeac
Email Queue - Edit: Ace Editor icon change. 2024-01-24 20:48:49 +00:00
fusionate 6cb09bc2d0
Email Templates - Edit: Ace Editor icon change. 2024-01-24 20:48:33 +00:00
fusionate 7d84742212
System Status: Ace Editor icon change. 2024-01-24 20:48:02 +00:00
fusionate adf8a70200
Theme and language updates for upcoming ACE Editor changes. 2024-01-24 20:46:18 +00:00
FusionPBX 8b90eee5a3
Major version update release 5.2.0 2024-01-24 13:11:53 -07:00
FusionPBX 9d5bc340a4
Add the theme title setting 2024-01-24 12:51:13 -07:00
fusionate 02de5334e5
Restore default branding in window title. 2024-01-24 19:16:36 +00:00
fusionate 3938398b1f
Email Queue - Edit: Hide Response field if response disabled. 2024-01-24 18:41:12 +00:00
FusionPBX 7231a37a57
Enable clearing the email_response 2024-01-24 11:13:57 -07:00
FusionPBX 6ec3c53c1f
Email Queue save response false by default 2024-01-24 11:04:51 -07:00
FusionPBX 2d8f591534
Update send.php
Spelling correction and use domain_uuid to find settings
2024-01-24 10:58:12 -07:00
fusionate 657cbb1b48
System Status: Enhance Support Information section. 2024-01-24 16:49:10 +00:00
FusionPBX 7a24e2aa1f
Update app_languages.php 2024-01-24 08:26:54 -07:00
FusionPBX 8b08756e0b
Add a new permission system_view_support 2024-01-24 08:18:16 -07:00
FusionPBX 560a51cff7
Security - Update session validation and regenerate session id on login 2024-01-23 23:11:28 -07:00
FusionPBX cfbfd8ab52
Update system.php fix the quotes. 2024-01-23 21:08:53 -07:00
FusionPBX 04d08eb76c
Update labels 2024-01-23 16:18:11 -07:00
frytimo 4e9dd1cdc9
Create information area for bug reports or errors to the Support Team (#6876)
* initial commit for system information bug report data

* add javascript to copy to clipboard

* add javascript to copy to clipboard

* Update copy_to_clipboard.js

* Update system.php

* Update app_languages.php

Add other languages

* move function file to resources/functions directory

* use the array returned from system_information function

* Update app_languages.php

* update path locations

* remove require files

* Merge origin/create_json_page_for_bug_report into create_json_page_for_bug_report
2024-01-23 16:11:51 -07:00
frytimo 1cba516bdc
add Multi-cast variables to Yealink t54w provisioning template (#6877) 2024-01-23 15:51:13 -07:00
FusionPBX dce6406791
Update check_auth.php 2024-01-22 23:45:00 -07:00
FusionPBX ee202cd61d
Security - validate session 2024-01-22 14:20:28 -07:00
FusionPBX 34321b2b1d
Fix destination_context use public not null 2024-01-22 11:20:04 -07:00
FusionPBX 8e0c3b57e5
Fixed a few bugs in destination_summary.php 2024-01-20 21:20:34 -07:00
Andy Binder 6427dfa5ac
Update Snom provisioning templates. (#6852) 2024-01-20 17:09:12 -07:00
paulc97 184dbd6d0b
make time_condition_edit.php use time_format var (#6872)
Use the existing default Varriable time_format to adjust the options of the selects of "hours of day" and "time of day" accordingly
2024-01-20 17:00:58 -07:00
Antonio Fernandez 0de35ef4d7
Update indentation for blf_subscribe.lua (#6873) 2024-01-20 16:46:26 -07:00
frytimo a2c54d98b4
ensure $git_repo is an array and has elements before access (#6874) 2024-01-20 16:45:23 -07:00
fusionate 08659badc0
Destinations - List: Show all selected Actions, including Other actions. 2024-01-19 20:28:28 +00:00
fusionate ec934c3895
Log Viewer: Default to 512KB with other options. 2024-01-18 23:27:43 +00:00
FusionPBX 51fe5f1d4b
Update xml_cdr.php 2024-01-18 14:13:44 -07:00
FusionPBX 32f8711b14
Set inline to true for Caller ID prefix 2024-01-17 15:14:27 -07:00
fusionate 0fe2f20375
Domains - Delete: Fix issue deleting multiple domains at once. 2024-01-17 21:33:23 +00:00
frytimo 0b977f044d
Force close port (#6870)
* force close profile sip ports

* create force_close_port function

* force close profile sip ports
2024-01-17 09:05:28 -07:00
FusionPBX 81fbd31524
Add new permission ivr_menu_audio_edit 2024-01-16 11:51:14 -07:00
FusionPBX 9afb69dbda
Update voicemail_greetings.php 2024-01-16 08:45:46 -07:00
FusionPBX 4d29fd8a98
Fix the voicemail greeting base64 upload 2024-01-16 08:44:22 -07:00
FusionPBX 0faa26e58f
page.lua detect transfer return to sender 2024-01-15 13:28:09 -07:00
Krushali Shah 7f35e8178b
Added User Column in Fax Queue. (#6848)
* enable/disable codec settings for all accounts

The template for codec enable settings was taking a value as 1 if it was set in the settings. It was not taking the actual value inside it. So I have edited the templates to check the value if it's set to true.

* Update fax_queue.php

I added a user column in the Fax Queue to see which user sent the fax.

* Update app_languages.php

Added field for User
2024-01-13 18:46:56 -07:00
Andy Binder 0e3283c76a
Yealink corrections (#6851) 2024-01-13 18:29:24 -07:00
FusionPBX 4ebdcdf4b2
Update CDR new call center search 2024-01-13 17:07:11 -07:00
Antonio Fernandez 69fc0c8378
Added CDR dropdown for showing CC Queue calls (#6869)
* Added dropdown for filtering Call Center Queues

* added more translations

* fixed the wrong permission that I had originally

* added the  Call Center dropdown to advanced search
2024-01-13 14:14:51 -07:00
fusionate e665299fe4
Recording/Sound/Audio/Greeting/Voicemail - Playback: Fast Forward and Rewind with Left and Right arrow keys. 2024-01-12 22:34:51 +00:00
FusionPBX 59324ef997
Update page.lua
Control default recording max_length, silence_threshold, silence_seconds

Use the following default settings
- recording_max_length
- recording_silence_threshold, 
- recording_silence_seconds
2024-01-12 14:56:50 -07:00
Antonio Fernandez a4bfd1f20f
added delayed paging (#6771)
* added delayed paging

* Modified the code to use sched_api as requested

* added the beep
2024-01-12 14:52:16 -07:00
FusionPBX c44d1825cf
Add cc_side and call_center_queue_uuid 2024-01-12 13:57:48 -07:00
FusionPBX 869719aa05
Add presence_id for inbound destinations 2024-01-12 12:09:15 -07:00
FusionPBX c7038a78d9
Use feature key sync or dnd off/on code not both 2024-01-12 10:19:51 -07:00
FusionPBX f1bf0c6674
Add missing select closing tag 2024-01-10 18:11:19 -07:00
FusionPBX 5af47bb6ea
Update language translation 2024-01-10 17:57:06 -07:00
FusionPBX fd538950c9
Update to use required default_ prefix 2024-01-10 17:40:04 -07:00
FusionPBX 5c6dd8bfb3
Add extension_language, extension_dialect and extension_voice 2024-01-10 16:32:29 -07:00
FusionPBX 50720e2af0
Update extension language 2024-01-10 16:21:37 -07:00
FusionPBX 5b022623c2
Get the list of installed languages 2024-01-10 16:12:32 -07:00
FusionPBX eb11cbbeed
Add permission extension_language 2024-01-10 16:05:59 -07:00
FusionPBX 0ea2d00289
Add an option for extension language 2024-01-10 15:55:00 -07:00
fusionate ad86456b33
Prevent an error with array - in default_settings() method 2024-01-10 22:25:41 +00:00
FusionPBX bca1d8a573
Prevent an error with array
This is required for PHP 8.1 and higher. This is required for because PHP 8.1 introduced stricter type checking.
2024-01-10 15:08:20 -07:00
FusionPBX 23757cc2ae
Create 075_default_language.xml
Added this to set default language only when its not already set. This is more flexible then setting it in global-variables or domain-variables.
2024-01-10 14:36:14 -07:00
fusionate ae5cb03547
CDR: Add permission for Account Code inclusion. 2024-01-10 21:34:53 +00:00
FusionPBX 530967f28a
When using natural_sort cast to text 2024-01-10 12:22:36 -07:00
FusionPBX d428119f4f
Fix natural_sort cast to text
If item being sorted is numeric data type need to cast to text.

This would usually be fixed during the upgrade. However BDR prevents using standard alter table data type commands.
2024-01-10 11:37:10 -07:00
FusionPBX 13d8a44f81
Update Yealink vlan settings 2024-01-09 11:49:10 -07:00
FusionPBX e0bb35b63b
Add caller_destination to allowed variables 2024-01-09 10:20:25 -07:00
FusionPBX be652845cc
Add sip_req_user to allowed variables 2024-01-09 10:05:18 -07:00
FusionPBX 776334844b
Destination Summary update Total Calls
Purpose of  total calls is count calls to the destination number. This means calls from the server to the call center agent should be excluded.
2024-01-09 00:22:53 -07:00
Anthony e45904649b
Added bulk translations to core app_languages.php files (#6868)
* Added Turkish translations to call_center_active/app_languages.php

* Added Turkish & Greek translations to extensions/app_languages.php
2024-01-08 18:02:39 -07:00
FusionPBX 94e5629012
Add authorized option
If set to authorized=true then logout will not require a password.
2024-01-08 15:02:46 -07:00
FusionPBX 521303265a
Update xml_cdr_details.php 2024-01-05 18:08:25 -07:00
FusionPBX f63524a164
If exists use category fax from and from name 2024-01-05 17:24:08 -07:00
FusionPBX 113d97978a
Set the email from address and name 2024-01-05 17:21:29 -07:00
FusionPBX e8699b37c9
Use voicemail from and from name
When category voicemail from and from name are provided use them.  If not provided then use category email from and from name.
2024-01-05 16:51:56 -07:00
FusionPBX aee125f23a
Create send.php 2024-01-05 15:07:06 -07:00
FusionPBX 4032560291
Update y000000000107.cfg for yealink t43u
If feature_key_sync is set to 1 then make sure the off_code and on_code is not set

features.dnd.off_code =
features.dnd.on_code =
2024-01-04 23:02:29 -07:00
FusionPBX d0c3c93859
Destination summary unique callers
Use caller id number instead of name
2024-01-04 13:54:03 -07:00
fusionate 6a01e84316
Call Block - List: Restore Action column values. 2024-01-03 22:48:56 +00:00
fusionate 64591e413e
Voicemail - Greetings: Margin adjustment on Delete button. 2024-01-03 22:33:46 +00:00
fusionate 365ac1c4ab
Voicemail - Greetings: Hide Add button if max greetings reached (9). 2024-01-03 22:31:48 +00:00
Anthony 46954992a9
Added bulk translations to app/destinations files (#6866)
* Update destinations/app_languages.php

* Update destinations/app_menu.php
2024-01-03 10:54:42 -07:00
Anthony 010011dfa6
Added Greek & Turkish translations to core app_languages.php files (#6859)
* Added Greek & Turkish translations to core app_languages.php files

* Added Greek & Turkish translations to core app_languages.php files

* Added Greek & Turkish translations to core app_languages.php files
2024-01-03 10:54:15 -07:00
FusionPBX 6b9a530cf2
[Bug Fix] Extensions correct the template
Needed to add a few more items to the where clause to get the correct templates.
- domain_uuid
- server_address
2024-01-03 10:41:06 -07:00
FusionPBX fff13633be
Add a new destination summary report 2024-01-02 18:54:22 -07:00
FusionPBX 0b968828fd
Update app_menu.php 2024-01-02 14:28:20 -07:00
FusionPBX 07c50e45ab
Update app_languages.php 2024-01-02 14:27:48 -07:00
fusionate f4d8ec9182
Email [Class]: Remove redundant if statements, simplify logic. 2023-12-29 18:19:59 +00:00
FusionPBX d0c3840a18
Minor version update 5.1.5 2023-12-29 10:03:04 -07:00
chansizzle e253681e54
improved title case (#6858) 2023-12-28 08:44:33 -07:00
FusionPBX 4e622d9b10
Handle no answer for unset status 2023-12-27 13:08:15 -07:00
fusionate e36003f907
Extension - Edit: Include password when determining assigned device lines. 2023-12-27 19:29:19 +00:00
fusionate 9a741780e9
Voicemail - Edit: Hide audio playback button on Default Greeting. 2023-12-27 18:43:18 +00:00
fusionate 212f91dd6c
CDR - List: Hide broken direction icon if invalid Status. 2023-12-27 18:42:32 +00:00
FusionPBX 7de2ae0d23
Use last_bridge_hangup_cause to determine status 2023-12-27 11:37:36 -07:00
FusionPBX 4919633568
Create debian.service 2023-12-26 20:45:54 -07:00
FusionPBX 89ab37ce9d
Create xml_cdr.php 2023-12-26 20:43:59 -07:00
jrmcclean 4484c9ad5f
Update install.php (#6853)
* Update install.php

Update config directory for windows from www folder to Programdata directory
2023-12-22 15:32:42 -07:00
Anthony d002628237
Added Greek & Turkish translations to core app_languages.php files (#6856)
* Added Greek translations to dialplans/app_languages.php

* Added Turkish & Greek translations to email_queue/app_languages.php

* Added Greek translations to dialplan_outbound/app_languages.php

* Added Greek translations to dialplan_inbound/app_languages.php
2023-12-22 15:31:34 -07:00
denisent 6d3671840d
account.3.fallback.timeout typo (#6855) 2023-12-21 20:39:42 -07:00
denisent 06aec4b707
account.3.fallback.timeout typo (#6854) 2023-12-21 20:39:13 -07:00
fusionate c3f20602e7
Upgrade: Minor layout adjustments. 2023-12-22 00:23:29 +00:00
fusionate 0e4f933da2
Functions: Minor clean up. 2023-12-22 00:09:26 +00:00
fusionate f6700881b2
Upgrade - Source Code: Offer optional apps source update. 2023-12-22 00:05:55 +00:00
fusionate cb58bd4fb1
Fax Queue - Update comments. 2023-12-21 19:30:51 +00:00
demonspork df6d56d148
Support updating optional installed apps via git (#6513)
* WIP: Support updating optional installed apps via git

* support app source update via cli

* Update app_languages.php

* Update index.php

* Refactor App Git updating

Refactor Optional App Git updating for more resilience and better handling of ssh remotes and to only update each repository once.

* git app updates fix gui updates for repo based updating
2023-12-21 12:28:04 -07:00
FusionPBX 7d819c4822
Use isset and if statements
Changed ifelse to if statement to make sure it evaluates each condition.
2023-12-20 13:59:33 -07:00
FusionPBX b9686aeae7
Set call center cancel call to missed 2023-12-20 13:49:48 -07:00
fusionate 7e674efe8b
Call Forwarding - No Answer: Adjust failure_handler lua script to capture ALLOTTED_TIMEOUT disposition. 2023-12-19 19:44:45 +00:00
FusionPBX 4ecae0bc15
Minor version update 5.1.4 2023-12-18 16:12:40 -07:00
FusionPBX 9a6c8c68cb
Update call_center_queue_edit.php 2023-12-18 11:03:07 -07:00
FusionPBX 71123be725
Change type array to text 2023-12-18 10:48:40 -07:00
FusionPBX d4da6d0a93
Use setting call_center record_name 2023-12-18 10:35:16 -07:00
FusionPBX f35ddec748
Add new setting call_center record_name 2023-12-18 10:33:47 -07:00
FusionPBX f587c41bb4
Add additional record template variables 2023-12-18 10:19:56 -07:00
FusionPBX ac599a1b48
Update {$mac}.cfg 2023-12-16 16:37:00 -07:00
FusionPBX 2866580c7c
Add new permission and translation 2023-12-16 13:12:23 -07:00
FusionPBX 79817dc205
Add device template and outbound number columns
New Permissions
- extension_device_address
- extension_device_template

Add column Outbound Number for the outbound caller ID number
2023-12-16 13:08:34 -07:00
FusionPBX 38786cacbe
Integrate device address in the extensions SQL query. 2023-12-16 11:56:30 -07:00
K-Flagman fbb2af9bad
Device address in extensions list (#6811)
* Update app_config.php

adding permissions for showing MAC address in the extension list

* Update extensions.php

Adding a new column with MAC address info if it exists for the extension.

* Renamed the permission to access of extension address

* Fixed fields where we used deprecated "device mac address"

Also added support for "show all" button (load device list for current domain or get all devices)
2023-12-16 11:15:22 -07:00
frytimo 10e7b485e7
Schema change object property db instead of database->db (#6833) 2023-12-16 07:54:20 -07:00
fusionate ce8399a7a0
Theme: Add CSS for vertical resize of Ace Editor in Email Templates, Dialplan XML, etc 2023-12-16 00:27:21 +00:00
Andrew Alexander 3a0a7b48f1
openai transcription support (#6850)
* openai transcription support

* Update transcribe.php

* Update transcribe.php
2023-12-14 18:39:11 -07:00
FusionPBX 7a0aa3c4e0
Show the time since last agent call 2023-12-14 17:11:08 -07:00
FusionPBX eee9006c1f
Add format_seconds function 2023-12-14 17:01:32 -07:00
FusionPBX 6b178a30c4
Adding time zone handling for call block 2023-12-13 16:43:53 -07:00
FusionPBX 6ea76efe15
Update app_defaults.php 2023-12-13 14:58:09 -07:00
volga629-1 50f9c2b3df
E911 plugin (#6822)
* E911 Service plugin

Emergency Services availability is crucial part of FusionPBX.
This plugin Introduce  match need it visibility  into E911 services.
2023-12-13 14:46:58 -07:00
FusionPBX 3a854aa24a
Get the snom local IP address
Show the local IP address on the Registrations page.
2023-12-13 14:28:55 -07:00
FusionPBX 40998fdac1
Fix color_adjust rgb error 2023-12-12 16:44:52 -07:00
FusionPBX 16ee4900b0
Factory defaulted phone middle softkey Contacts button is enabled by default. For that reason set directory_setting.local_directory.enabl to 1. 2023-12-11 17:58:05 -07:00
FusionPBX 942a4fc547
Rename yealink_rport_1 to yealink_rport. T58W , t5x, and vp530 2023-12-11 16:18:27 -07:00
Andy Binder 3be682c8cd
prevent dupicates (#6841) 2023-12-11 13:24:57 -07:00
Andy Binder 15a4cca7ac
German translation updates (#6846) 2023-12-11 12:32:54 -07:00
FusionPBX 2e032cd115
Update email_send.php
Move the 'transcribe enabled' message
2023-12-11 12:32:27 -07:00
FusionPBX 87f722e59d
check if transcribe_enabled is enabled
We are checking this already on the voicemail. This checks the setting for transcribe_enabled in default and domain settings.
2023-12-11 12:21:15 -07:00
FusionPBX b919848425
Only include transcribe.php if enabled 2023-12-11 11:51:19 -07:00
FusionPBX 8a2688cfc5
Update email_queue.php 2023-12-11 11:48:58 -07:00
FusionPBX 88a4dbf3e6
Prevent error when the google_url is incorrect 2023-12-11 11:43:55 -07:00
FusionPBX cea06a548e
Add provider_uuid to destinations dialplan xml and XML CDR 2023-12-09 23:07:36 -07:00
FusionPBX d48f4a0b89
Use not empty arround the arrays 2023-12-09 22:51:48 -07:00
FusionPBX a066277460
Fix Active calls SHOW ALL button 2023-12-08 21:43:02 -07:00
FusionPBX ee6b2a4d84
Check if empty to prevent errors 2023-12-08 21:24:52 -07:00
FusionPBX dedafeccc8
Account for dialplan_detail_enabled false 2023-12-08 16:19:17 -07:00
FusionPBX c7e687512f
Add links on the column names 2023-12-08 10:04:53 -07:00
Anthony 3b297ad641
Added Greek translations to app_languages.php files (#6845)
* Added Greek translations to conferences_active/app_languages.php

* Added Greek translations to database_transactions/app_languages.php

* Added Greek translations to destinations/app_languages.php

* Added Greek translations to devices/app_languages.php
2023-12-07 18:41:31 -07:00
fusionate c1ad629d95
Operator Panel - Consistify refresh button, minor adjustments. 2023-12-08 01:41:01 +00:00
Ahron Greenberg (agree) e050827598
[dashboard] Fix memory exhaustion on system counts (#6844)
Getting all rows from the database caused PHP to exhaust the memory on systems with a huge amount of VM messages. This was fixed by querying from the database just the total counts.
2023-12-07 18:40:23 -07:00
frytimo 9f204a7cac
move explode of $line inside of if block to fix php warning for line 93 (#6842) 2023-12-07 18:38:57 -07:00
frytimo 1664bef5d9
use empty check instead of string check to prevent php warning (#6843) 2023-12-07 18:38:01 -07:00
fusionate 1ceb2fcbc9
Calls Active - Add eavesdrop function, and appropriate permission. 2023-12-08 01:37:22 +00:00
FusionPBX 47161fae80
yealink multicast variables 2023-12-07 15:52:46 -07:00
FusionPBX 4c60313ed7
Remove deprecated fields id and v_id 2023-12-04 13:27:20 -07:00
FusionPBX 341dbe6eff
Remove deprecated field ID
This was done so long ago that it can now be fully removed.
2023-12-04 10:44:38 -07:00
frytimo 3a4c2f72e2
Event socket bug fix and more docs (#6823)
* Add documentation to methods. Use is_resource for added type detection

* Allow connect to specify timeout in microseconds with default 30,000

* Update calling mechanism for event sockets

* Update project for new singleton event sockets

* remove unused variable

* catch errors on closing the socket
2023-12-02 17:16:18 -07:00
FusionPBX 44567f7a05
Updated call center use aliases
This fixes the call center context for the destination select list.
2023-12-01 14:58:35 -07:00
Andy Binder c3d625805f
Correct german translations. (#6838) 2023-11-29 17:43:18 -07:00
FusionPBX 5d587fdd17
Add default value for queue_context 2023-11-29 13:57:43 -07:00
FusionPBX 142b4c4d5a
Add default value for conference_context 2023-11-29 13:48:47 -07:00
Alex fa607d4bba
Add context field to conference and call center queue (#6836)
* Update conference_edit.php

* Update app_config.php

* Update app_config.php

* Update call_center_queue_edit.php

* Update call_center_queue_edit.php
2023-11-29 13:26:48 -07:00
Andy Binder b0d87807b8
Check empty array (#6835) 2023-11-29 13:15:16 -07:00
Andy Binder c59f58b4ff
If there are contact permissions enabled, assign the current user. (#6837) 2023-11-29 13:14:22 -07:00
fusionate 4fcc933c74
CDR - Export: Use language variables for PDD and MOS headings. 2023-11-28 00:15:29 +00:00
fusionate dab5b2d0d2
CDR - Export: Fix PDF export for Chrome. 2023-11-27 23:25:02 +00:00
FusionPBX 07392a64d8
Update Call Forward back button
Use history.back for the back button
2023-11-27 11:27:37 -07:00
fusionate 9e8adfc510
Device - Edit: Hide Device Provisioned IP and http/s links if empty. 2023-11-24 23:38:34 +00:00
fusionate 17077532d2
Device - Edit: Add Default Settings to set quantity of new Keys and Settings rows. Check all Delete box for Keys now selects vendor Key groups. 2023-11-24 23:29:46 +00:00
fusionate 0d079fdaba
Device - Edit: Code reduction. 2023-11-24 22:13:52 +00:00
fusionate 546feeb190
Device - Edit: Remove deprecated code. 2023-11-24 21:59:42 +00:00
fusionate d9bf2e3c7b
Device - Edit: Set device key vendor on device key type change. 2023-11-24 21:33:41 +00:00
fusionate 06aba14a59
Device - Edit: Fix character transposition (typo). 2023-11-24 21:32:22 +00:00
FusionPBX 3b550eb6e4
CC pass through hold_music variable 2023-11-24 09:32:39 -07:00
FusionPBX 2a0f2f53a0
Update assigned method use SQL IN 2023-11-23 11:51:47 -07:00
FusionPBX 837b2181ed
Fixed EXPORT missing min and max duration 2023-11-21 10:50:07 -07:00
Anthony 624856090e
Added Greek translations to app_languages.php files in fusionpbx/app/ (#6834)
* Added Greek translations to call_forward/app_languages.php

* Added Greek translations to call_recordings/app_languages.php

* Added Greek translations to active_calls/app_languages.php

* Added Greek translations to click_to_call/app_languages.php

* Added Greek translations to conference_center/app_languages.php

* Added Greek translations to conference_controls/app_languages.php

* Added Greek translations to conference_profiles/app_languages.php

* Added Greek translations to conferences/app_languages.php
2023-11-20 16:40:51 -07:00
FusionPBX 6f7be99083
Update call_center_agents.php 2023-11-19 22:29:32 -07:00
FusionPBX b19a67b1b1
Update agent status only when it has changed 2023-11-19 21:46:34 -07:00
FusionPBX edb0180bcf
Add call_center queue_login options: dynamic or static (default) 2023-11-15 23:17:43 -07:00
FusionPBX cb5fbc68b1
Agent Status Dashboard Update
Fixes some problems on the agent status dashboard
2023-11-15 21:34:53 -07:00
FusionPBX 5e0c27d592
User Status was hidden by an in accessible session variable use user_status permission. There permission is more consistent with the rest of the project. 2023-11-15 08:28:49 -07:00
FusionPBX aa3a412523
Use !empty instead of count 2023-11-14 22:00:02 -07:00
FusionPBX d806fb1ede
Use (?:\+1|1)? instead of \+?1? 2023-11-14 16:36:04 -07:00
frytimo 12fb45c99f
Update logging class (#6829)
* logging class improvements

* remove alias

* adjust line print out for field order

* refactor class name to be inline with framework standard

* fix writing direct to write method
2023-11-13 18:55:52 -07:00
K-Flagman 2bbce23ff2
Ring groups extensions range (#6824)
Now you can use hyphen to set range for extensions in destinations list of ring group.
Example Destination: 2010-2030
2023-11-13 18:50:25 -07:00
agree 90946bbc07
[security] xml validate ringback fields (#6819) 2023-11-12 19:09:34 -07:00
FusionPBX 608031522a
Update 2130 back to previous numbers.
On  version 1.0.11.79  firmware it seems to need these numbers.
2023-11-11 11:15:50 -07:00
FusionPBX 1a42c2083e
yealink_summer_time default to 2 2023-11-09 13:51:30 -07:00
FusionPBX 968706dac2
Using this->apps more consistently
A previous commit moved from $apps to $this->apps but missed some required uses of the $apps array.
2023-11-08 14:18:24 -07:00
FusionPBX 0378f484c5
Update gxp2130 key numbers
The key numbers shown in the template are correct for most keys on the gpx2130.
2023-11-07 11:32:58 -07:00
fusionate 8bd5bc04dd
Fax: Remove deprecated fax_send_greeting elements. 2023-11-07 15:40:34 +00:00
fusionate 99c9486ede
Voicemail - Edit: Make audio playback code consistent with other apps. 2023-11-07 02:23:12 +00:00
fusionate e8d7ac6d03
Ring Group - Edit: Make audio playback code consistent with other apps. 2023-11-07 02:22:33 +00:00
fusionate 328e3de7c5
Conference Center - Edit: Make audio playback code consistent with other apps. 2023-11-07 02:22:16 +00:00
fusionate 09f92fef5f
Call Flow - Edit: Make audio playback code consistent with other apps. 2023-11-07 02:21:54 +00:00
fusionate 62d67f3557
IVR Menu - Edit: Make playback code consistent with other apps, add playback of selected Invalid and Exit Sounds (Recordings and Sounds). 2023-11-07 02:20:45 +00:00
fusionate ff6a3ea71d
Call Center Queue - Edit: Add playback of selected Greeting and Announce Sound (Recordings and Sounds). 2023-11-07 01:56:39 +00:00
fusionate 73e3cb6ce1
Conference Center - Edit: Remove temporary code, clean up. 2023-11-07 00:56:19 +00:00
FusionPBX c12dd29293
Add ring_group_domain to the admin group 2023-11-06 13:13:03 -07:00
fusionate dd3c14e0d1
Ring Group - Edit: Adjust permission block scope for playback code. 2023-11-06 19:51:56 +00:00
fusionate 2e01fc06c5
Conference Center - Edit: Adjust permission block scope for playback code. 2023-11-06 19:51:38 +00:00
fusionate 3dcca2aa3c
Call Flow - Edit: Adjust permission block scope for playback code. 2023-11-06 19:51:02 +00:00
fusionate 22756de281
Call Flow - Edit: Add playback of selected Sound & Alternate Sound (Recordings and Sounds). 2023-11-06 19:45:40 +00:00
fusionate 548ea55660
Voicemail - Edit: Consistency updates for Greeting selection/playback code. 2023-11-06 19:44:21 +00:00
fusionate d04343043e
Ring Group - Edit: Consistency updates for Greeting selection code. 2023-11-06 19:43:35 +00:00
fusionate c649b9d7b0
Conference Center - Edit: Use sounds class for Greeting selection. 2023-11-06 19:42:34 +00:00
fusionate 145025946a
Sounds [Class]: Update to support use on Conference Center Greeting. 2023-11-06 19:42:02 +00:00
fusionate e5f2a697bf
Voicemail - Edit: Add playback of selected Greeting. 2023-11-06 17:12:07 +00:00
FusionPBX 2ed2ac63ae
Add table exists and set row exists 2023-11-03 23:55:35 -06:00
fusionate 10513ef745
Conference Center - Edit: Add playback of selected Greeting (Recordings and Sounds). 2023-11-04 01:06:01 +00:00
fusionate afc7487a40
Ring Group - Edit: Minor adjustments. 2023-11-04 01:05:01 +00:00
fusionate d058b97f64
Theme: Adjust select box left padding for Firefox. 2023-11-03 20:33:50 +00:00
fusionate 64ba5e268c
Ring Group - Edit: Add playback of selected Greeting (Recordings and Sounds). 2023-11-03 20:33:02 +00:00
frytimo 372db3cc50
Patch contacts calling multiple schemas (#6826)
* improve performance for contacts app_defaults

* add app_name and app_uuid as constants in class

* performance boost by removing scanning app_defaults twice

* Update app_defaults.php

* Update schema.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-11-03 14:04:07 -06:00
FusionPBX 5712df1118
Update dialplan_edit.php
Fix the indentation and use not empty.
2023-11-03 13:34:45 -06:00
FusionPBX fa123ff069
Build dialplan xml from the array. More efficient to save data and xml in one step. 2023-11-03 02:18:57 -06:00
FusionPBX 9da5a10a77
Change the permission to device_profile_view 2023-11-02 23:37:42 -06:00
FusionPBX fd2516a297
Update timezones.conf.xml with tabs 2023-11-02 17:02:28 -06:00
FusionPBX 3c57c72044
Revert timezones.conf.xml 2023-11-02 16:59:25 -06:00
FusionPBX 05c52a3fdc
Update timezones.conf.xml 2023-11-02 16:51:09 -06:00
FusionPBX 65b6600e82
Changing format from 11/02 to 02 Nov
Reason for the change better worldwide support. Problem with numeric dates is that it can have a date 07/09 and does mean July 9 or September 7. In the US its standard month then day. However this isn't universal. This makes the dates confusing. So changed this to day and abbreviated month.
2023-11-02 12:45:38 -06:00
FusionPBX 71349f56b2
Fixed ring group hold_music
This commit fixes a problem for music on hold defined in global-variables and domain-variables dialplans.
2023-11-02 12:18:28 -06:00
FusionPBX 86373fd3b4
Update permission for device profiles. Use device_profile_view, device_profile_select and device_profile_edit 2023-11-01 18:43:53 -06:00
FusionPBX 3b5e21a0d8
Update app_config.php 2023-11-01 18:36:28 -06:00
volga629-1 8ed5dd4c76
New Devices permissions profile select and edit. (#6821)
* Device select permissions

* Apply device select permissions.

* Fix missing index

Fix missing index
2023-11-01 18:33:13 -06:00
FusionPBX ac1cb868b8
Update GRP series phones to support memory keys and expansion modules 2023-11-01 17:29:58 -06:00
FusionPBX 3e367ca388
Support Grandstream GXP200EXT Expansion modules 2023-11-01 15:42:34 -06:00
FusionPBX de1f1af13a
Add grandstream_ip_address_mode 2023-10-31 15:48:04 -06:00
markjcrane b19e3aee4f Add icon for outbound missed 2023-10-31 14:33:43 -06:00
FusionPBX a3dbdf7b70
Unset the domain at the before next loop 2023-10-30 20:49:21 -06:00
FusionPBX 12964eb83e
Prevent an error by casting to int 2023-10-30 20:29:56 -06:00
fusionate 834be519ba
Device - Edit: Make Provision button use first Line found on local server. 2023-10-30 19:19:56 +00:00
FusionPBX ac6db02fab
Update Grandstream GRP phones with version 2 templates no p-codes 2023-10-28 22:35:55 -06:00
FusionPBX 77a13ad9ea
Update Grandstream version 2 templates. No P-codes 2023-10-28 02:31:24 -06:00
FusionPBX d3f37c0f84
Add Accept-Ranges for HTTP content delivery 2023-10-27 23:56:57 -06:00
FusionPBX 16b64e42fc
Add a new import for bridges 2023-10-27 21:01:23 -06:00
FusionPBX 9b1493d567
Prevent a warning if the bridge variables are disabled 2023-10-27 20:26:33 -06:00
fusionate 935774d3c0
Device - Edit: Increase width of Keys and Settings input fields. 2023-10-27 18:45:25 +00:00
FusionPBX a391bcc977
Add version and fix LastName 2023-10-26 15:05:09 -06:00
emak-Corey e5025d394f
Fix vm_disk_quota (#6814)
The current condition #vm_disk_quota <= #message_sum is checking the lengths of vm_disk_quota and message_sum, not their actual values. So, it won't compare the numeric values for your intended logic.

If they're strings that can be safely converted to numbers, use tonumber():

if (vm_disk_quota and message_sum and tonumber(vm_disk_quota) <= tonumber(message_sum)) then
  -- your code
end

This will compare them as numbers, ensuring that vm_disk_quota is less than or equal to message_sum.
2023-10-26 13:53:38 -06:00
agree 37d7c43e17
[dialplan] Bind digit bleg without a lua script (#6817) 2023-10-26 13:27:31 -06:00
FusionPBX 3514a489d1
After application conference skip the row 2023-10-25 11:23:38 -06:00
FusionPBX 72fd0fe343
Move code for calculating the duration 2023-10-25 11:13:20 -06:00
FusionPBX 6ff5a8df3c
Update column order duration first and status last 2023-10-25 10:52:42 -06:00
FusionPBX cb65e7f66e
Prevent an warning by using preg_quote
This accounts for special characters like a * in the value.
2023-10-25 10:41:03 -06:00
FusionPBX 57d8d52336
Add Call Detail Record status no answer 2023-10-25 09:37:17 -06:00
Alex fd1820c399
Update app_languages.php (#6816) 2023-10-25 09:29:45 -06:00
markjcrane 8593b49b0c Add inbound and local busy 2023-10-25 09:28:45 -06:00
FusionPBX 3630d29872
Add a new status no_answer 2023-10-25 09:03:04 -06:00
markjcrane 4796e4ada2 Add icon cdr no_answer 2023-10-25 08:58:07 -06:00
FusionPBX 42c21e715e
Update footer.php 2023-10-24 20:05:21 -06:00
FusionPBX bc5d938434
Minor version update 5.1.3 2023-10-24 17:09:07 -06:00
agree a785292811
[eavesdrop] Fix eavesdropping wrong uuid (#6815)
If the extension is in a call and also receives calls at the same time, the query will return more than one uuid causing to eavesdrop the wrong channel.
2023-10-24 17:07:55 -06:00
FusionPBX 2be533687d
Add permissions for call detail record details. Purpose to hide advanced details from the admin group. 2023-10-24 17:06:39 -06:00
markjcrane 713e79a57d Add a local missed icon 2023-10-24 16:02:01 -06:00
FusionPBX d7e2ab900b
Call Detail Record add status and use billsec for the duration 2023-10-24 15:58:13 -06:00
markjcrane d7280b5040 Add icon for busy 2023-10-24 14:57:42 -06:00
markjcrane ac214929dd Add an icon for missed calls 2023-10-24 11:21:26 -06:00
fusionate d5ae60897c
Footer: Fix Domain Selector for superadmin when Domain Reseller app installed and Login Destination set. 2023-10-24 16:57:54 +00:00
FusionPBX f09b04eb01
Only add default value if application was not found 2023-10-23 16:13:07 -06:00
FusionPBX 1e06e3aa1c
Move the find_app method to the xml_cdr class 2023-10-23 15:15:58 -06:00
FusionPBX b2e05fb0f6
IVR Menu: allow sending the ${uuid} variable 2023-10-23 14:25:04 -06:00
FusionPBX d6fb5ac7b8
Call Flow Summary add the IVR Menus status to routed 2023-10-21 20:57:11 -06:00
FusionPBX 115e9e0055
Use lower case status values to match the translation labels. 2023-10-21 13:26:26 -06:00
FusionPBX 134188e383
Add support for the status translations. 2023-10-21 13:25:07 -06:00
FusionPBX 588d96ea6f
Add translations for waited, parked, unparked, and routed 2023-10-21 13:23:09 -06:00
FusionPBX 026b2f4f44
CDR Call Flow Summary add a status for Call Flows 2023-10-21 10:40:31 -06:00
FusionPBX b05fd42b0c
In the destinations array use the feature code extension for the Call Flow
There are two call flow feature categories in the destination select list. One is used for routing call flows and the other is used to toggle the call flow between destinations.
2023-10-21 10:23:14 -06:00
FusionPBX 032673c922
When finding matches add regular expression matching 2023-10-21 10:11:49 -06:00
FusionPBX f09efd3a14
Add the extension value to the destinations array 2023-10-21 10:09:00 -06:00
FusionPBX ea05178018
Add new rows when callee_id_number exists 2023-10-20 22:16:48 -06:00
FusionPBX 19a6252e1f
Make the IVR Menu invalid sound optional. 2023-10-20 16:38:02 -06:00
FusionPBX 1f91a8e713
Update command for a default label one time. 2023-10-20 15:49:30 -06:00
FusionPBX 9fb99cc137
Add additional error handling 2023-10-19 20:02:55 -06:00
FusionPBX 8158518837
CDR call flow array add bridged_time, answer_time and update park 2023-10-19 19:49:51 -06:00
FusionPBX 100ccc0db2
Call Flows allow feature code and alternate destination to be optional. If feature code is empty and pin number is provided then require the pin number. 2023-10-19 19:35:36 -06:00
fusionate fb834ccf8a
Ring Groups - List: Clean up of order by. 2023-10-19 18:55:49 +00:00
fusionate 0e9fd9aaa6
Extensions - List: Minor adjustment to order by, remove deprecated method of natural_sort() integration. 2023-10-19 18:55:19 +00:00
fusionate 1b2bcf2719
Voicemails - List: Implement natural sorting of Voicemail ID column. 2023-10-19 18:54:30 +00:00
fusionate c6a924f492
Time Conditions - List: Implement natural sorting of Number column. 2023-10-19 18:54:07 +00:00
fusionate 2832e7ab66
Conferences - List: Implement natural sorting of Extension column. 2023-10-19 18:53:29 +00:00
fusionate 124428961a
Conference Centers - List: Implement natural sorting of Extension column. 2023-10-19 18:52:54 +00:00
fusionate a6f29aadeb
Call Flows - List: Implement natural sorting of Extension column. 2023-10-19 18:52:26 +00:00
fusionate 9244b65acc
Call Center - List: Implement natural sorting of Extension column. 2023-10-19 18:49:54 +00:00
fusionate 4fcd98638b
Order By [Function]: Only use natural sort function for PostgreSQL databases. 2023-10-19 18:45:42 +00:00
fusionate f1ab4c365e
Destination/Action Select: Implement natural sorting for multiple apps. 2023-10-19 18:02:00 +00:00
MD Riaz bca1e75e02
illogical condition specified in fax_send (#6812) 2023-10-19 11:21:24 -06:00
fusionate 6487688b50
Fax Server - List: Implement natural sorting of Extension column. 2023-10-19 16:49:13 +00:00
fusionate a14dd3d71c
Call Forward - List: Implement natural sorting of Extension column. 2023-10-19 16:48:45 +00:00
fusionate 1926e60b6e
IVR Menu - List: Implement natural sorting of Extension column. 2023-10-19 16:48:13 +00:00
fusionate 0de8570dd3
Order By [Function]: Updated to support natural sorting. 2023-10-19 16:46:48 +00:00
FusionPBX 82f82bd87c
Update xml_cdr_details.php 2023-10-18 21:28:01 -06:00
FusionPBX 6ce57690ee
Update the call_flow_summary array add a new row for inbound calls 2023-10-18 21:26:25 -06:00
FusionPBX ab0fc211d8
Use SQL concat as its safer with NULL values. 2023-10-18 21:18:39 -06:00
FusionPBX fce21d36c3
Use SQL concat as its safer with NULL values. 2023-10-18 21:14:54 -06:00
fusionate 2d9bec9295
Call Recordings: Added ability to do bulk download. 2023-10-19 00:40:50 +00:00
Anthony 4b5bf191f6
Added Greek translations to FusionPBX apps (#6813)
* Added Greek translations to call_broadcast/app_languages.php

* Added Greek translations to call_center_active/app_languages.php

* Added Greek translations to call_centers/app_languages.php

* Added Greek translations to call_flows/app_languages.php
2023-10-18 15:32:35 -06:00
fusionate 92e9c526d6
Menu [Class]: Minor adjustmemt to HTML output. 2023-10-18 13:13:39 +00:00
fusionate 291c03fc75
Call Block - Delete: Update class to allow delete of Global call blocks, if call_block_domain permission exists. 2023-10-17 22:35:29 +00:00
FusionPBX 7c98190bde
Add new class methods called call_flow and call_flow_summary 2023-10-17 16:21:17 -06:00
fusionate aee8664098
Call Block: Add Domain field for global support. 2023-10-17 21:43:09 +00:00
frytimo 77e4bb9865
Reorder project path and project root defines (#6787)
* reorder the project_root and project_path define so isset is called
before the config key project.root is used

* ensure project path begins with a '/'

* rewrite for empty string in project_path

* Update require.php
2023-10-16 21:54:56 -06:00
fusionate dd1ba159ab
Menu - Split longer submenus into two columns of items. 2023-10-17 00:27:59 +00:00
FusionPBX 694d701757
Auto decode when urlencoding is detected 2023-10-16 09:55:20 -06:00
FusionPBX 4b7a93d4a9
Add CDR call summary status messages 2023-10-15 02:20:22 -06:00
FusionPBX 7d5aacf326
Add application details for valet park 2023-10-15 00:15:32 -06:00
FusionPBX 247a1c76c7
Update xml_cdr_details
- Add the time zone
- Add timestamps to the array
- Improve the call summary array
2023-10-14 22:15:32 -06:00
FusionPBX c7ae3b3a63
[SECURITY] Prevent showing Missed and Recent Calls to users that are not in xml_cdr_domain group and not assigned any extensions. 2023-10-13 14:25:02 -06:00
FusionPBX 1ebf3d0826
Works better for this code block to run after building the primary array. 2023-10-13 05:07:01 -06:00
FusionPBX 47bdb893c5
Call Flow Summary when the count array is 1 then use start_epoch and end_epoch 2023-10-13 04:52:58 -06:00
FusionPBX 6381e52d60
Update CDR call summary to improve call centers, conferences. and park. Added an option to debug. Also using transfer_time, bridge_time, and created_time. 2023-10-13 04:18:47 -06:00
FusionPBX a35de4aba3
Call Summary fix voicemails name and extra row 2023-10-13 01:52:09 -06:00
FusionPBX d5f39cf0b2
Call Flow Summary add name, application, link, and a new summary style. Controlled by summary_style setting. 2023-10-12 23:58:11 -06:00
FusionPBX 4dbd4e10a3
Add missing default settings 2023-10-11 17:27:11 -06:00
FusionPBX 76404a03da
Clear the $array variable before its used again 2023-10-11 16:57:50 -06:00
FusionPBX d02ab9de91
manage-presence to a default value of true 2023-10-10 20:13:32 -06:00
Anthony 8b39073265
Added Greek translations to app_languages.php under fusionpbx/apps (#6810)
* Added Greek translations to access_controls/app_language.php

* Added Greek translations to basic_operator_panel/app_language.php

* Added Greek translations to bridges/app_languages.php
2023-10-09 22:23:59 -06:00
FusionPBX 2ccc8c8b12
Change how the virtual extension is disabled
Made this change because if the XML is not generated then extension variables are not available. These variables are needed for call forward and follow me.
2023-10-09 19:52:13 -06:00
FusionPBX 21d5eb5a98
Assign ring_group_domain to the admin group 2023-10-09 10:28:01 -06:00
Anthony 84f487cba8
Added Greek translations for fusionpbx/core. (#6809)
* Added Greek translations to  domain_settings/app_languages.php

* Added Greek translations for domains/app_languages.php

* Added Greek translations for groups/app_languages.php

* Added Greek translations for menu/app_languages.php

* Added Greek translation for upgrade/app_languages.php

* Added Greek & Great Britain translations for user_logs/app_languages.php

* Added Greek translations for user_settings/app_languages.php

* Added Greek translations for users/app_languages.php
2023-10-06 13:46:03 -06:00
Anthony 575590d749
Added Greek translations in core. (#6808)
* Added Greek translations to databases app_languages.php

* Added Greek translation for default_settings/app_languages.php

* Added Greek translations for install/app_languages.php
2023-10-04 16:26:01 -06:00
fusionate bb140e05a3
Provisioning - Yealink [T54W]: Better remote and/or local wallpaper/background compatibility. 2023-10-04 21:22:30 +00:00
FusionPBX b9bef2ee9a
Clear the dial_string variables
Clearing dial_string prevents poisoning the value for extensions in the ring group destinations that exist but are not registered.
2023-10-04 14:55:08 -06:00
FusionPBX 39d975a279
Add allowed API commands regex and sofia_contact 2023-10-04 12:27:45 -06:00
FusionPBX ab0f5d3295
Update agent state to waiting 2023-10-04 09:00:15 -06:00
fusionate 0e073230ce
Fax Server - New: Tidy and add array check. 2023-10-04 00:09:58 +00:00
fusionate e1fe7435e4
Fax Server - New: Honor Fax > allowed_extension defined in Default/Domain Settings on Preview and Send. 2023-10-04 00:04:19 +00:00
FusionPBX f6a3881308
Removed magic quotes as it was deprecated in PHP 7.4 2023-10-02 12:47:12 -06:00
FusionPBX 3d2b12b88e
Fixed the contact search 2023-10-02 11:44:05 -06:00
FusionPBX ebb8193add
outbound_route_to_bridge break only after matching a route
Changing this to behave like a call in the dialplan only break if a matching outbound route has been found.
2023-09-29 16:56:30 -06:00
FusionPBX afc9061fef
Get the fax_response from the fax_queue table 2023-09-28 23:12:58 -06:00
FusionPBX 3eb37e473e
Update the version to 5.1.2 2023-09-28 15:04:55 -06:00
FusionPBX 725e617b61
Translation using double quotes so we are using single quotes. 2023-09-28 13:00:14 -06:00
FusionPBX c19899097d
Send FAX when gateway fails try the next one 2023-09-28 12:41:12 -06:00
fusionate 7984ddeb64
Fax Queue - Edit: Add Response field and translations. 2023-09-28 18:37:36 +00:00
FusionPBX 3c170f8597
Check all active modules with one event socket request
This makes the modules page lighter on resources and load much faster.
2023-09-28 10:48:36 -06:00
emak-Corey 434b691883
Add ability to set custom logout destination (#6806)
Allow administrators to set a custom default setting called logout_destination which will redirect the user to a destination of their choosing.
2023-09-28 09:35:50 -06:00
OskarFranck 0773a346c2
Bulk changes of Swedish translations (#6807)
authored-by: oskfra <oskar.franck@bahnhof.net>
2023-09-28 09:32:34 -06:00
FusionPBX 7ab357380b
simplify the while statement 2023-09-27 23:30:18 -06:00
FusionPBX bf8c6f8078
Simplify event_socket code 2023-09-27 23:23:56 -06:00
FusionPBX 7246961b9f
Add multicast page provision variables for Yealink t43u 2023-09-27 08:50:04 -06:00
chansizzle e2ad49b26f
added missing hyperlink text to dismiss login messages (#6805) 2023-09-25 17:09:42 -06:00
FusionPBX f8c6089f6c
Dreprecated this file 2023-09-25 13:09:58 -06:00
FusionPBX 42015e4e41
This file was replaced by xml_cdr_import.php 2023-09-25 13:08:08 -06:00
FusionPBX 8f0c11fa6c
Make sure to start the PHP SESSION 2023-09-25 13:01:40 -06:00
FusionPBX 09dd09305c
Fix CDR import for HTTP POST
Add syslog server messages with more details when sending access denied.
2023-09-25 12:55:20 -06:00
FusionPBX aad0721b94
Add nowrap to profile name 2023-09-25 12:19:46 -06:00
fusionate 513177688f
Active Calls: Adjust Created time to correct timezone. 2023-09-23 14:50:51 +00:00
fusionate 3cbe36c91f
Voicemail [Script]: Return user to current message options after listening to message envelope, instead of returning to the root mailbox menu. 2023-09-23 04:46:32 +00:00
fusionate 2600c7d159
Voicemail: Honor switch > voicemail > dir value in Default/Domain Settings. 2023-09-23 03:51:51 +00:00
FusionPBX ceb6872aa6
Organize the SQL to be easier to read
Created code to handle a similar task for ring groups. Method used for ring groups is easier and more organized so updated this code to be similar.
2023-09-22 18:01:58 -06:00
FusionPBX 8329120436
Use ring_group_domain and ring_group_all permissions 2023-09-22 17:37:09 -06:00
FusionPBX 0a85ae340b
Fix the ring group count 2023-09-22 17:29:31 -06:00
FusionPBX ba41028649
Add new ring_group_domain permission 2023-09-22 17:14:27 -06:00
FusionPBX 30e9cd66c2
Allow users to view assigned Ring Groups 2023-09-22 17:13:47 -06:00
FusionPBX b0a2f3340a
Fix ring group delay timing
Use sofia_contact instead of user bridge alias. Added a useful note from @greenbea describing why there was a problem with follow me delay timing.

When you originate user/ext@domain, switch_ivr_originate will call the user endpoint. The user endpoint isn't a real endpoint. It is a shortcut to get the real dialstring from the user's XML and calls again switch_ivr_originate, so essentially, what happens is switch_ivr_originate reads twice originate_delay_start variable and waits double the time.

Your patch fixes the case when the endpoint is the user/ endpoint but will make the delay half the time if called with other endpoints like sofia.

The ultimate solution would be freeswitch to handle this in the user endpoint function. I would suggest that fusion manually get the user's dial string from the XML and call originate on it and not rely on the user (shortcut) endpoint for ring group and follow me.
2023-09-22 16:23:14 -06:00
FusionPBX 6030843ca8
Fix follow-me delay timing
Use sofia_contact instead of user bridge alias. Added a useful note from @greenbea describing why there was a problem with follow me delay timing.

When you originate user/ext@domain, switch_ivr_originate will call the user endpoint. The user endpoint isn't a real endpoint. It is a shortcut to get the real dialstring from the user's XML and calls again switch_ivr_originate, so essentially, what happens is switch_ivr_originate reads twice originate_delay_start variable and waits double the time.

Your patch fixes the case when the endpoint is the user/ endpoint but will make the delay half the time if called with other endpoints like sofia.

The ultimate solution would be freeswitch to handle this in the user endpoint function. I would suggest that fusion manually get the user's dial string from the XML and call originate on it and not rely on the user (shortcut) endpoint for ring group and follow me.
2023-09-22 16:01:59 -06:00
FusionPBX d13027a575
FAX cover page fixed hide logo when empty 2023-09-22 10:44:52 -06:00
FusionPBX 28fa49a84a
Hide extension import button 2023-09-21 16:34:23 -06:00
FusionPBX 4d1194828d
Simplify the permissions class 2023-09-21 12:07:32 -06:00
FusionPBX 89ce374d8d
Failover for fax when there are multiple bridges
When the outbound route has more than one bridge statement use it for fail over.

One thing to keep in mind FreeSWITCH seems to limit the sized of the originate command. So we have to be careful how large the string is. If the originate string is too long it will be truncated and fail. For this reason commented out a few variables.
2023-09-21 00:07:42 -06:00
FusionPBX cfd773fbf4
Update switch.php 2023-09-20 22:36:55 -06:00
frytimo 9a982edc2e
update the settings set method to use params instead of array (#6804)
* update the settings set method to use params instead of array

* remove test code
2023-09-20 17:59:37 -06:00
fusionate 518c32efe6
Misc: Mitigate PHP 8.1 warnings. 2023-09-20 20:49:27 +00:00
fusionate 044b91ec6c
Destination - Edit: Mitigate PHP 8.1 warnings. 2023-09-20 19:13:33 +00:00
fusionate d4f7efa4eb
Event Guard: Remove parameters from event_socket connect() method. 2023-09-20 18:50:41 +00:00
fusionate d9d17a6917
Misc: Remove parameters from event_socket_create() calls. 2023-09-20 18:43:17 +00:00
FusionPBX 8ee8e30b31
Save CDR to the file system 2023-09-20 11:25:36 -06:00
fusionate 2a54aa025c
Misc: Remove parameters from event_socket_create() call. 2023-09-20 17:25:24 +00:00
fusionate e4bb0dda6a
Footer: Resolve PHP 8.1 warning. 2023-09-20 17:19:19 +00:00
FusionPBX 2d51bba633
Update template name to gxv3240 2023-09-20 09:25:31 -06:00
fusionate a91f0cf346
CDR - Export: Integrate permissions on CSV output. 2023-09-20 01:58:13 +00:00
fusionate 5c9b02fec2
CDR - Export: Fix file name for Show All, correct average MOS value. 2023-09-20 01:24:46 +00:00
fusionate aab2880153
CDR - Export: Integrate permissions on PDF output. 2023-09-20 01:15:04 +00:00
fusionate 3659e07df9
CDR - Export: Include Caller Destination column in PDF. 2023-09-19 23:53:51 +00:00
chansizzle bcaec41841
add phone icon to the call button (#6802)
* add phone icon to the call button

* Update click_to_call.php
2023-09-19 16:37:39 -06:00
FusionPBX 169bf8788a
Update code using the settings class 2023-09-19 12:56:08 -06:00
FusionPBX 4b9ff10eef
Update email.php 2023-09-19 12:22:00 -06:00
FusionPBX 7f2934ff24
Use !empty when using the setting->get method 2023-09-19 12:17:04 -06:00
FusionPBX 0931324d13
Update email class to use the settings class 2023-09-19 12:14:58 -06:00
FusionPBX a7dce663a1
Simplified array structure as it changed when using the settings class 2023-09-19 11:40:18 -06:00
FusionPBX 24bdccdb0b
Use the settings class instead of the SESSION 2023-09-18 14:59:21 -06:00
FusionPBX 925e37e31f
Add yealink_dnd_allow to a few yealink templates 2023-09-18 09:44:03 -06:00
FusionPBX bf47bbcc47
Event Socket settings auto defaults or custom using config.conf 2023-09-16 15:07:41 -06:00
FusionPBX 0e55637bf6
Correct the description in the comment 2023-09-16 14:18:27 -06:00
FusionPBX 675811f79c
Create event_socket.conf.lua 2023-09-16 04:34:23 -06:00
FusionPBX 3fbb536aa6
Update esl.lua get event_socket from default settings 2023-09-16 03:27:27 -06:00
FusionPBX bc9e5abaf8
Update directory.php 2023-09-16 02:19:29 -06:00
FusionPBX 551eda9080
Update fax_send.php 2023-09-16 02:15:35 -06:00
FusionPBX 905d175e59
Use settings class for fax send 2023-09-16 02:02:38 -06:00
FusionPBX fb8b6db71d
Get event socket details from the settings class 2023-09-16 02:00:57 -06:00
FusionPBX c6d966395e
Use settings class for app_defaults.php 2023-09-16 00:22:12 -06:00
FusionPBX 81b92075a9
Delete app/fax_queue/app_defaults.php 2023-09-15 23:26:33 -06:00
FusionPBX 602495abe9
Delete app/extension_settings/app_defaults.php 2023-09-15 23:25:29 -06:00
FusionPBX 882fae6d22
Delete app/call_forward/app_defaults.php
Removing this as it is empty and not used.
2023-09-15 23:18:52 -06:00
FusionPBX 13529f9b9f
Update app_defaults.php 2023-09-15 23:03:20 -06:00
FusionPBX 66713b969b
Update app_defaults.php 2023-09-15 23:01:12 -06:00
fusionate 98292e04c8
Group Permissions: Adjust button collapsing. 2023-09-15 13:27:08 +00:00
fusionate cb1f5a1429
Group Permissions: Tidy Protected column heading. 2023-09-15 13:24:11 +00:00
FusionPBX f1890976b2
Use settings class for the fax queue 2023-09-14 22:15:37 -06:00
FusionPBX 0011878dcd
Use the settings class to get the event socket details 2023-09-14 21:23:27 -06:00
FusionPBX 7a0420f138
Use the settings class to get event_socket details 2023-09-14 21:18:23 -06:00
FusionPBX 7cb3c0b211
Fix the category and subcategory 2023-09-14 21:17:19 -06:00
FusionPBX 5afce93f03
Update email_queue to use settings class 2023-09-14 16:10:13 -06:00
FusionPBX 741f2a160e
Add event socket and xml rpc values to default settings 2023-09-14 15:48:19 -06:00
FusionPBX 3f4c4702c5
Add set method to the settings class 2023-09-14 15:43:52 -06:00
FusionPBX f6b92fc565
Bypass permission check for command line 2023-09-14 15:42:56 -06:00
FusionPBX e5f6c3067a
settings class use get and refine further 2023-09-14 12:28:38 -06:00
fusionate 8986a2c947
DISA [Script]: Add minor delay before first voice prompt. 2023-09-14 17:47:19 +00:00
fusionate efcf484e57
Ace Editor: Include license and version note. 2023-09-13 19:05:45 +00:00
fusionate cebab0b812
PHP/Script/Provision/XML Editor: Updated Ace to latest version (1.24.2). 2023-09-13 18:58:29 +00:00
FusionPBX 1880688813
Use settings class needed for the email_queue 2023-09-13 09:54:00 -06:00
FusionPBX 0ec6ed696c
Create a new settings class 2023-09-13 09:46:52 -06:00
FusionPBX dd2fbf7745
Update destinations.php 2023-09-13 08:19:06 -06:00
FusionPBX 11df74853a
Change variable from permission to permission_name 2023-09-11 11:54:36 -06:00
FusionPBX 5f688f2e1d
Update functions.php 2023-09-11 11:43:31 -06:00
Andrew 702abf76ee
Update sip_profile_edit.php (#6800)
add one space to fix sql error
2023-09-11 01:46:11 -06:00
FusionPBX 2c5724c6ed
Add new class methods and use them 2023-09-11 01:45:19 -06:00
fusionate 6411f50750
Destination Select: Set minimum width on second select box. 2023-09-08 22:05:19 +00:00
FusionPBX 9684541dbe
PHP 8.1 end function requires array 2023-09-08 09:33:54 -06:00
fusionate 7f48c0f676
Device - Edit: Integrate QR provisioning for Sipnetic softphone. 2023-09-07 23:26:27 +00:00
FusionPBX bd1ff0b9e7
Improved wordwrap on active calls 2023-09-07 16:02:19 -06:00
FusionPBX d8cc5d4ad5
Adjust version 2 command 2023-09-07 13:43:40 -06:00
FusionPBX 6036f36a8b
Use gscloud for oauth2 for Google v2 2023-09-07 13:37:25 -06:00
FusionPBX 556c1fe284
Add Google API v2 speech transcription 2023-09-07 13:13:05 -06:00
FusionPBX d2bb186b33
Prevent an error for PHP 8.1 plus 2023-09-06 16:32:11 -06:00
FusionPBX eb2b530859
Check to see if the provider_prefix setting is enabled 2023-09-06 14:57:22 -06:00
FusionPBX 2ce9254ce5
Add provider_prefix when sending fax
Only add if it the provider_prefix is set in the domain-variables dialplan
2023-09-06 12:03:42 -06:00
FusionPBX 7d7a0cf603
Add fallback method to get caller_id 2023-09-06 10:38:17 -06:00
FusionPBX b5b69071fc
Add respond 404 not found 2023-09-05 16:48:03 -06:00
FusionPBX 677824fe5a
Save destination_number, sip_to_user, and sip_req_user 2023-09-02 10:37:29 -06:00
FusionPBX 0e2506aa8b
Prevent an error if all Time conditions presets are disabled 2023-09-01 14:01:47 -06:00
FusionPBX c285a104f0
Fixed dynamic destinations when switching domains 2023-09-01 10:57:55 -06:00
FusionPBX 14e3cf5546
Order by the IVR menu option order then digits 2023-08-31 13:46:19 -06:00
FusionPBX 879eb67a8a
Minor version update 5.1.1 2023-08-30 18:47:45 -06:00
fusionate a83d62e59c
Default Settings - List: Show Copy even when only a single domain. 2023-08-31 00:09:49 +00:00
FusionPBX d9eae802ec
Change double quotes to single quotes 2023-08-30 17:59:07 -06:00
Alex 5825e58451
Fixed translations (#6794)
* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_menu.php

* Update app_languages.php
2023-08-30 14:52:32 -06:00
FusionPBX 360edbf43f
Update app_menu.php 2023-08-30 14:11:02 -06:00
FusionPBX 9c09269159
Set the search value to lower case 2023-08-30 13:48:35 -06:00
Anthony 4cc864d29a
Fixing/Adding missing translations in app_languages and app_menu files (#6795) 2023-08-30 13:18:55 -06:00
FusionPBX 3a2593002f
Sanitize the application data 2023-08-30 12:52:54 -06:00
FusionPBX 40a7ed7b15
xml sanitize allow $1 and $2
Continue to remove any ${variables}  in this format
2023-08-30 12:50:08 -06:00
FusionPBX 9f7f30a507
Update he-il for SIP profiles 2023-08-30 10:53:42 -06:00
FusionPBX 6edd6cda6b
Fix the spelling for SESSION 2023-08-29 14:31:01 -06:00
FusionPBX 744ec4edaa
Make sure voicemail_id is set before using it 2023-08-29 13:33:29 -06:00
sdwru 3b617cb35c
Update switch.php (#6785)
Running install.php the first time after a manual (not using script) install on Debian 11, there is a failure due to $_SESSION['switch']['conf']['dir'] not yet existing.  Subsequent installs will work.  It's only on the first install that it fails.  There may be better ways but this is the fix I came up with that works for me.
2023-08-29 10:56:31 -06:00
jonathanblack1000 254d58f614
Second try fixing line keys on GXP2135 (#6793)
GXP2135 requires special handling on keys to handle line key vs BLF/Speed dial vs blank.
2023-08-29 10:55:19 -06:00
FusionPBX 988e2490c5
Set the switch session variable tusing the name
To be consistent the $_SESSION['switch'] variables currently require the name. Without this switch session variables are inconsistent.

This inconsistently caused a problem with creating the recording directory for new domains.
2023-08-28 15:07:31 -06:00
FusionPBX 4eb7fdf007
Update default and domain setting session array
In the "domains" class upgrade method, only set the value when either "default_setting_enabled" is true or "domain_setting_enabled" is equal to true.
2023-08-28 14:45:39 -06:00
FusionPBX 401a914726
Add recordings archive sub directory 2023-08-28 10:08:28 -06:00
FusionPBX 5de3e514df
Add Fanvil mac addres detectection
Also arrange the code in alphabetical order
2023-08-28 09:37:02 -06:00
FusionPBX bf520a38d7
Save the category name and not the description in vars.xml 2023-08-26 23:03:38 -06:00
fusionate 959c72abc9
IVR Menu - Edit: Refine greeting playback experience. 2023-08-26 23:34:02 +00:00
fusionate b2a6c4eae2
Theme [CSS]: Update to support next commit to IVR Edit greeting playback. 2023-08-26 23:33:08 +00:00
fusionate 2a14368914
Template: Remove invalid paste. 2023-08-26 23:30:58 +00:00
FusionPBX 29f04383cb
Inbound number not found send to the log 2023-08-26 15:29:58 -06:00
jonathanblack1000 c97ac88cd2
Fix line keys on GXP2135 and contribute GHP6xx template. (#6780) 2023-08-26 10:50:36 -06:00
Mihir Gajjar 9933b44335
Snom D735 Smartlabel Settings (#6776)
* Updated Snom template for Intercom policy

Allow to make changes to Snom intercom policy

* Updated Snom D735 template for setting the Smartlabel display mode

This settings allows to set a domain setting on how we want to see the labels on Snom D735 phones
2023-08-26 10:49:33 -06:00
K-Flagman ff578da24e
Play button in IVR Menu edit (#6786)
* add play button for ivr long and short greetings
2023-08-26 10:17:04 -06:00
Luis Daniel Lucio Quiroz 97835fdd6a
Update intercept.lua (#6788) 2023-08-26 10:12:52 -06:00
FusionPBX 88169f9e30
Use the call direction from the xml_cdr table 2023-08-25 16:13:02 -06:00
FusionPBX 85f6793a41
Set bridge statements variables 2023-08-25 16:05:33 -06:00
FusionPBX bc2e64af28
Change variable name caller_direction to call_direction 2023-08-25 15:21:08 -06:00
FusionPBX 2cf06240c5
Add 809 to outbound route continue_on_fail
This changes accounts for the following error.

Reason: SIP;cause=809;text="GATEWAY_DOWN"
2023-08-25 13:17:46 -06:00
FusionPBX bdef43ce3f
Add a trim on the Bridge variables
When there is a space at the end and used in the string then FreeSWITCH will not add the variables to CDR variables.
2023-08-25 09:37:31 -06:00
FusionPBX 13550f214d
Default the bridge variables to enabled false 2023-08-24 19:42:32 -06:00
FusionPBX cc454ff882
Switch from input text to textarea for destination_number 2023-08-24 14:41:40 -06:00
FusionPBX 18b3c41f47
Better bridge profile support 2023-08-24 14:28:19 -06:00
FusionPBX fac9bad46f
Fix the default_language, default_dialect and default voice variables that were broken by xml.sanitize 2023-08-24 09:26:10 -06:00
FusionPBX 5439a80095
Account for dialplan_detail_enabled is null as enabled true
The interface treats dialplan_detail_enabled null as enabled so in the outbound_route_to_bridge treat it as enabled true.
2023-08-23 19:23:11 -06:00
FusionPBX dcd00c3a15
Find and use the firewall path
Needed as Debian 8 and 9 have a different iptables location than Debian 11
2023-08-23 15:29:04 -06:00
FusionPBX 9a19fb4f82
Add full path to iptables and pfctl
Full path to iptables needed now for Debian 11 since /usr/sbin is no longer in the path by default.
2023-08-23 10:09:24 -06:00
FusionPBX 5182e5e2d5
Change value to textarea 2023-08-22 16:58:47 -06:00
FusionPBX d109fad050
Add the closing foreach for the yealink t46s template 2023-08-22 12:11:56 -06:00
FusionPBX 595197279b
Fix the yealink t41s template 2023-08-22 12:10:47 -06:00
FusionPBX 281a367715
Update the Yealink T46s to use a loop
This allows using any number of accounts (lines) the phone can support.
2023-08-22 11:11:47 -06:00
FusionPBX 1df1afa365
Make pdf from tif only if tiffinfo returns a result 2023-08-22 10:28:43 -06:00
FusionPBX 11c98a860e
Get the extension_uuid using the voicemail_id 2023-08-22 10:01:24 -06:00
FusionPBX 85d194799f
Update 240_page.xml change kick all to hup all
This removes the message when call ends that they have been kicked from the page (conference call)
2023-08-20 23:03:57 -06:00
FusionPBX 086189a769
Use the bridge parts array 2023-08-19 23:16:34 -06:00
FusionPBX a703a75480
Bridge statement builder 2023-08-19 22:50:39 -06:00
FusionPBX 5aa22da9e3
Add label-bridge_variables 2023-08-19 20:14:11 -06:00
FusionPBX 110f6189de
Rename profile to bridge_profile 2023-08-19 18:40:55 -06:00
FusionPBX 1f75cfe2d8
Updated to simplify building bridge statement 2023-08-19 11:04:52 -06:00
FusionPBX 30f028e6be
Add new bridge translations. 2023-08-19 11:00:38 -06:00
FusionPBX 0f26078e93
Add new bridge default settings 2023-08-19 10:59:40 -06:00
fusionate 30034610ac
Voicemail [Class]: Adjust messages() method to avoid count() error if voicemail_messages() method return false. 2023-08-17 23:31:33 +00:00
fusionate 5d7232c0c7
Outbound Route - Add: Include hangup under Additional Options for Gateway and Alternate 1 & 2 2023-08-17 23:19:31 +00:00
FusionPBX 4ed611a187
When the toggle field and values are empty then use defaults 2023-08-15 21:37:05 -06:00
FusionPBX 18df561513
Moved the redirect to resources/require.php 2023-08-15 16:20:27 -06:00
FusionPBX 2ceb4453c5
If the config_file doesn't exist then redirect to the install.php 2023-08-15 16:19:22 -06:00
FusionPBX 9f004f696e
Use trim on the file contents and use file_exists 2023-08-14 21:35:31 -06:00
FusionPBX 0fb78ee94e
Enable setting a custom config_file path 2023-08-14 21:18:10 -06:00
FusionPBX 8ceaa5ce01
Add default setting call_center refresh numeric 1500 2023-08-14 20:28:42 -06:00
FusionPBX 71d2f47ca6
Update call_center_active.php 2023-08-14 20:24:23 -06:00
FusionPBX b74880f28e
Add setting call_center refresh type numeric 2023-08-14 20:23:06 -06:00
FusionPBX f5bdf6662e
Enable customizing the config_file path for LUA 2023-08-14 19:35:41 -06:00
FusionPBX 90cbc08551
Replace GLOB_BRACE as its not compatible with all systems 2023-08-14 12:04:00 -06:00
FusionPBX 4bf775897e
Replace GLOB_BRACE as its not supported by all systems. 2023-08-14 11:27:40 -06:00
FusionPBX 93058bfc57
outbound_route_to_bridge check to see if the dialplan_detail_enabled is set to true 2023-08-10 15:16:17 -06:00
FusionPBX 956b8686f9
Bug fix use tonumber function to detect non numeric required for those using extension number alias 2023-08-10 13:57:30 -06:00
FusionPBX e8e6673be8
Remove some redudant code for finding record_path and record_name 2023-08-10 09:05:42 -06:00
FusionPBX 503b59267e
Fix call center agent call recording
Issue was caused by xml sanitize and this change allows using strftime.
2023-08-09 11:13:09 -06:00
jacobbuscher-bt 719912f453
Fix time conditions using 'minute-of-day' switching 1 minute early (#6784)
Fix time conditions using 'minute-of-day' switching 1 minute early.

We are augmenting the value saved based on what select option is selected.

12:00 AM - 11:59 PM will now serialize as 1-1439 as expected
11:59 PM - 11:59 PM will now serialize as 1440-1439 which is unexpected behavior due to freeswitch's 'wrap around' behavior but acceptable.

Additional information
minute-of-day	1-1440	minute of the day (midnight = 1, 1am = 60, noon = 720, etc)
2023-08-08 14:24:14 -06:00
fusionate 6627e40e76
Default/Domain/User Settings: New setting setting_value_input_type to control Value input field type. 2023-08-04 22:38:41 +00:00
FusionPBX 0304dfffad
Use empty record_name
Recording call through a ring group its not setting the record_name variable this picks up the recording from the file system.
2023-08-04 13:53:37 -06:00
fusionate 6000c8235c
Dashboard - Ring Group Forward: Remove form elements if ring_group_forward permission not assigned. 2023-08-04 19:28:08 +00:00
fusionate 578dcc6256
Voicemail - Email [Function]: Send basic email even if email template is disabled. 2023-08-04 03:49:29 +00:00
FusionPBX 68f575b941
Fixed a problem for inbound destinations with more than one caller ID routing conditions.
Its a minor bug as it created the dialplan XML so the call will work. However the dialplan details needed the group incremented.
2023-08-03 12:18:02 -06:00
markjcrane 49f30603ce Disable Resync_Periodic by setting the value to 0 2023-08-03 10:01:16 -06:00
markjcrane 1c19fc17ba Enable_URI_Dialing_ set to Yes to support blf prefix like park+ 2023-08-03 08:50:48 -06:00
jacobbuscher-bt 2d872a3566
Finalize changing origination_callee_id_name from destination_number to caller_destination in domain_variables and variables dialplan. (#6782)
* Add the / character to the ALLOWED_CHARS variable to fix bug with front slashes being stripped. Previously was turning /var/lib/freeswitch into varlibfreeswitch

* Update app_defaults.php

Updating app defaults for Dialplan -> Domain Variables to set origination_callee_id_name to match the caller_destination instead of the destination number so that if you call another tenant in the same Fusion instance without is_local enabled the caller_destination shows instead of the tenant's called extension.

* Update app_defaults.php

Instead of removing the export all together we need to update it from destination_number to caller_destination.

* Update 020_domain-variables.xml

Set origination callee ID to caller_destination so internal calls don't show "Outbound Call"

---------

Authored-by: Jacob Buscher <jacob@bfitec.com>
2023-08-02 12:25:45 -06:00
jacobbuscher-bt 80580bb931
Fixing 'origination_callee_id_name' in domain variables dialplan (#6781)
Updating app defaults for Dialplan -> Domain Variables to set origination_callee_id_name to match the caller_destination instead of the destination number so that if you call another tenant in the same Fusion instance without is_local enabled the caller_destination shows instead of the tenant's called extension.

---------

Authored-by: Jacob Buscher <jacob@bfitec.com>
2023-08-01 18:19:26 -06:00
FusionPBX 167e5e1740
Create 080_caller_id.xml 2023-08-01 18:14:56 -06:00
FusionPBX 6832d9e081
Deprecate cidlookup dialplan 2023-08-01 18:08:05 -06:00
FusionPBX 2582511594
Update and rename contacts.lua to database.lua 2023-08-01 18:03:58 -06:00
FusionPBX b436200a61
Create index.lua 2023-08-01 18:02:02 -06:00
fusionate f61302190b
Dashboard - Missed Calls: Apply domain time zone. 2023-08-01 20:33:51 +00:00
fusionate d68f9826f1
Dashboard - Recent Calls: Apply domain time zone. 2023-08-01 20:33:39 +00:00
FusionPBX bd513b3629
Rename inbound_lookup.lua to contacts.lua 2023-08-01 10:31:47 -06:00
FusionPBX 398278c7ea
Create inbound_lookup.lua 2023-08-01 00:09:54 -06:00
fusionate d4d5799342
Email Queue - Job & Service: Fix variable issues to mitigate errors. 2023-08-01 00:14:00 +00:00
fusionate 2c298113f6
Destinations - Import/Export: Include Conditions and Actions. 2023-07-31 23:27:45 +00:00
fusionate ac6d9e5c45
Functions - Adjust is_json() function for better detection. 2023-07-31 23:27:15 +00:00
fusionate 3d6c1cbb99
Destinations - List: Adjust case on Type column value, Center Prefix, mitigate PHP 8.1 warning. 2023-07-31 23:26:03 +00:00
fusionate f88af8b502
Extensions - List: Hide Call Group if no permission to view. 2023-07-31 22:37:37 +00:00
fusionate bd12b748e6
Destinations - List: Resolve PHP 8.1 warning. 2023-07-31 21:07:30 +00:00
FusionPBX 5e04c63824
remove origination_callee_id_name from domain-variables dialplan
Removed for these reasons.
- Update the caller's display when making a call to the final destination number rather than the number that was called.
- It also modifies the phone history of called numbers
- Changes the number in Call Detail Records  to the final destination rather than Caller's Destination
2023-07-29 12:55:52 -06:00
FusionPBX 8b502d4355
Remove origination_callee_id_name from domain-variables dialplan 2023-07-29 11:18:36 -06:00
KRooney 0654f26a1a
Patch 43 (#6778)
* Create D713

snom D713
2023-07-27 16:07:44 -06:00
Andy Binder 74bdf82dba
Update event_guard.php (#6779) 2023-07-26 14:05:57 -06:00
FusionPBX ee610ccb1b
convert the message_length value to a number
Fixed this error "attempt to compare number with a string"
2023-07-25 13:12:42 -06:00
FusionPBX e40cc6efd1
Prevent an error in PHP 8.1warning 2023-07-24 14:14:48 -06:00
FusionPBX ee591e730e
Use !empty function instead of != '' 2023-07-22 15:21:01 -06:00
markjcrane cd91040eb5 Prevent edge case PHP 8.1 warnings for domain_uuid and domain_name 2023-07-22 14:21:11 -06:00
markjcrane 32409f88b2 Add new default settings login_text_color, login_text_size and login_text_font 2023-07-22 14:19:57 -06:00
markjcrane 6d2eae5987 Change the default login_text_color to #282828 2023-07-22 14:18:39 -06:00
FusionPBX 1bbe9b2f8a
Prevent CPU number showing more than once on BSD 2023-07-22 09:50:11 -06:00
fusionate 7dd146689f
Functions: Update for PHP 8.1 2023-07-19 02:15:16 +00:00
fusionate c4f3565a15
Provisioning: Updates to resolve PHP 8.1 warnings. 2023-07-17 22:52:03 +00:00
FusionPBX 0a2d29b20d
Update {$mac}.cfg 2023-07-16 16:29:45 -06:00
FusionPBX f7b1ad53cd
is_writable prevents an error writing to the file if its not writable 2023-07-16 00:44:18 -06:00
FusionPBX 5e69a3deda
Update xml_cdr_details.php 2023-07-15 23:59:05 -06:00
FusionPBX 64c5eeb35e
Update xml_cdr_details.php 2023-07-15 23:49:55 -06:00
FusionPBX 1b6bf49a62
Update xml_cdr_details.php 2023-07-15 23:43:19 -06:00
FusionPBX 31ae516a49
FusionPBX 5.1.0 full release 2023-07-15 19:07:35 -06:00
Norman King d70fa0307b
Add var to enable tr 069 on grandstream (#6774)
* added tr069 enable and periodic_inform_enable vars to config templates add variable on dp750 template for enabling tr-069 provisioning.

* add vars to grandstream app default settings

* add if condition to use the variables.

* Update app_config.php
2023-07-15 18:49:39 -06:00
markjcrane 278ae0376b When using dialplan details with the public context ensure call_direction, domain_name and domain_uuids is added to each dialplan detail group 2023-07-15 18:32:25 -06:00
markjcrane 689fe5c6b4 Use call_direction, domain_name and domain_uuuid details are added to the conditions 2023-07-15 18:22:03 -06:00
markjcrane 296b092b22 Add caller ID routing dialplan details. 2023-07-14 20:49:23 -06:00
markjcrane 1f0c30529b Add dialplan condition regex 2023-07-14 20:44:40 -06:00
markjcrane b9e6a89a37 Add extension_type is null for better backwards compatibility 2023-07-14 12:44:24 -06:00
markjcrane 4951647225 Add user_type is null for better backwarads compatibility 2023-07-14 12:38:45 -06:00
FusionPBX 4e861b0dcb
Hide device information If the extension type is virtual 2023-07-13 21:40:43 -06:00
FusionPBX f93fd6b00c
Require extension_type as default 2023-07-13 21:32:25 -06:00
FusionPBX b1457116d8
Require extension_type default 2023-07-13 21:30:24 -06:00
markjcrane 52c0b3955f Disable authentication if the user type is set to virtual. 2023-07-13 18:30:29 -06:00
markjcrane d3aed6707e Update the extension_type when the value is null 2023-07-13 18:29:12 -06:00
FusionPBX 9b68b04aa4
Update the user_type when the value is null 2023-07-13 17:50:09 -06:00
markjcrane 57614ea8af Add user_type options: default, virtual 2023-07-13 17:22:52 -06:00
markjcrane e06c8ea208 Add extension_type options: default, virtual 2023-07-13 17:11:07 -06:00
markjcrane 025f243bac Prevent PHP 8.1 warnings 2023-07-13 17:00:47 -06:00
FusionPBX 0ab4e245e5
Add a new label-virtual translation 2023-07-13 16:19:56 -06:00
FusionPBX 8841e28f32
Default setting catetogies should use an underscore rather than a space 2023-07-13 08:17:44 -06:00
FusionPBX 75e7e0859c
Default Settings show order on hover 2023-07-13 08:15:04 -06:00
jacobbuscher-bt 28695de14c
Add the / character to the ALLOWED_CHARS variable to fix bug with front slashes being stripped. Previously was turning /var/lib/freeswitch into varlibfreeswitch (#6773)
Co-authored-by: Jacob Buscher <jacob@bfitec.com>
2023-07-12 22:15:37 -06:00
FusionPBX 90259527cc
Create y000000000000.boot 2023-07-12 21:05:37 -06:00
FusionPBX 0f3d8a1d87
Create y000000000143.cfg for cp965 2023-07-12 21:03:14 -06:00
FusionPBX ddfa077635
Remove undefined translation 2023-07-12 15:42:40 -06:00
wouam31200 83aff11098
BLF Not Showing Correct Status When Using DNS-SRV (#6714)
* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

BLF Not Showing Correct Status When Using DNS-SRV

* Update y000000000095.cfg

 yealink_language

* Update y000000000097.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000096.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000095.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000070.cfg

Add {$yealink_enhanced_dss_keys}
2023-07-12 15:27:23 -06:00
KRooney 5d387ac3dd
Update app_languages.php (#6772)
French Update
2023-07-12 15:24:55 -06:00
FusionPBX d20b2f3a23
Create ${mac}.cfg for cp965 2023-07-12 14:43:04 -06:00
FusionPBX ffc7d32bdc
Add cp960 2023-07-12 14:40:50 -06:00
FusionPBX 9a2c3f6299
Use isset with REQUEST address and mac 2023-07-12 12:58:02 -06:00
FusionPBX d3cfa9c2bc
Update mkdir.lua 2023-07-12 10:47:57 -06:00
FusionPBX 1f62c73b2d
Use the email_send_mode 2023-07-11 19:22:43 -06:00
FusionPBX 9c0b0c3a60
Change authentication email_queue to email_send_mode 2023-07-11 19:19:58 -06:00
volga629-1 21be0125b5
Auth direct email or email queue (#6617)
* Auth direct email or email_queue

Authentication email plugin improvement 

* Update email.php
2023-07-11 19:14:20 -06:00
FusionPBX 65ec8133df
Update domains array when switching between tenants. 2023-07-11 17:20:49 -06:00
FusionPBX dea23a1e3b
Login destination url changed to text. 2023-07-11 15:28:01 -06:00
fusionate 1bc941e244
Menu [Class]: Reslove PHP 8.1 warning on mobile devices. 2023-07-11 20:26:38 +00:00
fusionate 37c2b8a040
Contact - View: Display first & last name. 2023-07-11 20:25:46 +00:00
FusionPBX 04a6701343
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:19 -06:00
FusionPBX e72afde5a7
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:16 -06:00
FusionPBX e6538d3858
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:15 -06:00
FusionPBX 3732d51753
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:12 -06:00
FusionPBX 73c6b87121
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:10 -06:00
FusionPBX cf38aa88ec
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:47:08 -06:00
FusionPBX 59e96d19b0
Add user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:43:11 -06:00
FusionPBX cd28379dd2
Add snom user_shared_line
https://service.snom.com/display/wiki/user_shared_line
2023-07-11 12:41:34 -06:00
FusionPBX 818fb6f203
Change email queue default interval to 5 seconds 2023-07-11 12:34:48 -06:00
FusionPBX e3cfa0d1da
Prevent more PHP 8.1 warnings 2023-07-10 18:33:18 -06:00
fusionate 3b6c2acd76
CDR Details: Little better output. 2023-07-07 21:55:32 +00:00
FusionPBX d6969715d7
Update xml_cdr_details.php fix PHP 8.1 warnings 2023-07-07 15:39:38 -06:00
fusionate 9ae6c12cbb
Cache [Class]: Resolve PHP 8.1 warning on cache() method. 2023-07-07 19:41:48 +00:00
FusionPBX 7724c6fe5b
Few more adjustments for record_name 2023-07-07 12:01:23 -06:00
FusionPBX 5fb8ab41d8
Requires a colon 2023-07-07 09:48:21 -06:00
Alex 3dfe583a42
Update ivr_menu_edit.php (#6769) 2023-07-07 09:39:36 -06:00
FusionPBX 7f60ff23c4
When record_session is true set record_path variable 2023-07-07 09:38:13 -06:00
FusionPBX f00712463c
Update recording name and file extension 2023-07-07 09:26:03 -06:00
FusionPBX e5a4890d29
Provisioning templates isset is better than !empty 2023-07-06 18:57:18 -06:00
FusionPBX f998c4f62b
Function format_hours convert seconds to an integer and use sprintf for leading zeros. 2023-07-06 15:40:53 -06:00
Anthony 8c8ef2c309
Fixed Warnings (#6768)
* Update device_edit.php

* Update dialplan_edit.php

* Update app_languages.php
2023-07-06 14:51:02 -06:00
FusionPBX ddcd2c6d5a
Minor fix for body_text_color 2023-07-06 14:18:32 -06:00
FusionPBX 656e077d40
Use !empty instead of != '' 2023-07-06 14:08:54 -06:00
FusionPBX 53acebd180
Use !empty instead of != '' 2023-07-06 14:03:21 -06:00
FusionPBX b7e3d6133c
Prevent PHP 8.1 errrors 2023-07-06 12:25:47 -06:00
FusionPBX 890321e338
Update !empty instead of ! = '' 2023-07-06 11:55:20 -06:00
FusionPBX 5bcb9b8d26
Use !empty instead of is_array 2023-07-06 11:42:43 -06:00
FusionPBX 3c9678bbf2
Prevent an error using str_pad on a null string 2023-07-05 19:02:28 -06:00
FusionPBX ae51a57566
Update voicemail.php 2023-07-05 18:53:26 -06:00
FusionPBX e629e615d4
Update destination_edit.php 2023-07-05 18:12:08 -06:00
fusionate ceb0637c83
Database [Class]: Update for PHP 8.1 2023-07-05 23:12:00 +00:00
markjcrane 49a45f08be Preset auth_string value to make sure it is set 2023-07-05 14:22:44 -06:00
markjcrane 27bc8df629 Update for PHP 8.1 2023-07-05 14:20:05 -06:00
markjcrane 0665ac02e2 PHP 8.1 changes 2023-07-05 14:13:22 -06:00
markjcrane 56d5c8a755 Use and update the description 2023-07-04 15:24:13 -06:00
FusionPBX 6f73009728
Add condition_app and condition_data
This allows caller ID routing with one destination.
2023-07-04 14:45:40 -06:00
fusionate 07ff69b53d
Device - Edit: Hide Provision button when using Linphone template. 2023-07-03 20:14:22 +00:00
fusionate c3f4d8a1c2
Device - Edit: Include provisioning htt_auth creds (if enabled) in Linphone QR code. 2023-07-03 19:52:56 +00:00
FusionPBX 408247599b
Remove display none use zindex 2023-07-03 12:55:07 -06:00
FusionPBX 999858e01c
Remove formatting for the device_address 2023-07-03 12:04:19 -06:00
fusionate 3ea9e7d012
Device - Edit: Updates for PHP 8.1 2023-07-03 18:02:17 +00:00
markjcrane d7b3e25cd4 Allow case insensitive UUID 2023-07-03 08:33:34 -06:00
markjcrane 63bb9b6e81 Add QR code for linphone. Use a PHP QR library. Format the device address 2023-07-03 08:26:19 -06:00
FusionPBX 255b1773ae
Update the linphone template its ready to use
- The first nat_policy_0 needs a postfix with _0
- Correct the syntax with the registration password
2023-07-01 10:00:19 -06:00
FusionPBX bcf81d3306
Change new_mac_address to new_address 2023-06-30 20:08:30 -06:00
FusionPBX 2854fd816c
Provision file download work with address 2023-06-30 20:06:40 -06:00
FusionPBX 51c349a78e
Add default linphone template 2023-06-30 19:40:55 -06:00
FusionPBX fe750a092d
Update provision.php add address.xml 2023-06-30 19:01:06 -06:00
FusionPBX 7d90568f05
Add a smarty plugin for md5 2023-06-30 17:34:10 -06:00
FusionPBX e03becd5d1
Add a new device vendor linphone 2023-06-30 17:04:47 -06:00
fusionate b1e6c72408
Devices: New device_address_uuid permission, to enable Address generation on Extension - Edit page. 2023-06-30 22:40:52 +00:00
fusionate 85ed88878d
Extension - Edit: Add option to generate Device Address UUID, respecting device limits (if any). 2023-06-30 22:40:17 +00:00
fusionate ffbd2996f1
Extension - Edit: Format display of device address in Provisioning select box. 2023-06-30 21:49:44 +00:00
fusionate b509050827
Device - Edit: Make address field wider, and limit character length. 2023-06-30 21:48:39 +00:00
fusionate 212ceb361d
Functions: Enhance is_uuid(), is_mac() and format_device_address() functions. 2023-06-30 21:47:32 +00:00
FusionPBX 6fa3dcdb53
Fix a spelling mistake for empty 2023-06-30 14:26:36 -06:00
FusionPBX 1ecd3c7be9
Remove to allow more flexibility on the device_address 2023-06-30 14:23:19 -06:00
fusionate c3438ec3ae
Fax - Edit: Fix issue with Authorized Senders. 2023-06-30 18:52:02 +00:00
fusionate 17af8976d9
Fax Emails: Fix minor syntax issue. 2023-06-30 18:51:25 +00:00
markjcrane f8b657f674 Fix the device.file.download file name 2023-06-30 09:59:57 -06:00
markjcrane 53779d50d3 Change device_mac_address to device_address 2023-06-29 23:40:11 -06:00
FusionPBX 49648e6655
Handle errors better for invalid xml with simplexml_load_string
When the XML object detects invalid XML move the file to the failed directory.

After reading and processing the XML save each call detail record to the database.
2023-06-29 17:25:20 -06:00
FusionPBX e5ca998ef8
Ad ring group destination delay with the follow me delay 2023-06-29 14:13:32 -06:00
FusionPBX ba3afa2565
Requires the path to include the right translation file 2023-06-29 09:54:39 -06:00
Alex 2a577635e3
Update app_languages.php (#6766) 2023-06-29 09:48:05 -06:00
FusionPBX 54beb80b32
Update extension_edit.php
Fix outbound caller ID name select.
Additional PHP 8.1 updates
2023-06-29 09:32:43 -06:00
FusionPBX da6270a7af
Use !empty instead of != '' 2023-06-29 08:53:04 -06:00
Antonio Fernandez 1057c4cf8e
Improvements to the labelling of various CC pages (#6764)
* Improvements to the labeling of various CC pages
2023-06-28 19:00:16 -06:00
FusionPBX ec04006971
Change the scope of the database variables 2023-06-28 15:29:28 -06:00
fusionate c143b9fe83
Authentication - Database: Resolve PHP 8.1 warning when using API Key login. 2023-06-28 20:54:34 +00:00
FusionPBX 1f0d24a447
Show only the Parent Menus 2023-06-28 14:08:01 -06:00
FusionPBX 0177861b45
Remove switch ${variables} from the bridge statement 2023-06-28 12:47:06 -06:00
FusionPBX 4644cf6e15
Update fax_emails.php 2023-06-28 10:21:00 -06:00
Mihir Gajjar fc8bc10803
Updated Snom D717 template for setting the Smartlabel display mode (#6763)
By Default, Snom D717 has the smartlabel display mode set to "short". Snom D717 has an issue where for short labels it doesn't take the label that we configure in devices. Instead, it tries to look for the value in the system and if it doesn't find a contact or extension associated, it will just show the number itself.
2023-06-28 09:50:09 -06:00
Andy Binder 6f352c2efb
Update translate.conf.lua (#6765)
Remove sanitization of number-translation regexes
2023-06-28 09:48:39 -06:00
fusionate b3f9e44db1
Voicemail: Add permissions voicemail_recording_instructions and voicemail_recording_options to control visibility respective fields on Voicemail - Edit page. 2023-06-28 02:47:53 +00:00
fusionate a8f25e9657
Voicemail: Let skip_instructions channel variable still take priority over voicemail_recording_options in database. 2023-06-28 02:45:35 +00:00
fusionate 679df10c6e
Voicemail - Edit: Adjust Recording Instructions and Options description. 2023-06-28 02:27:26 +00:00
fusionate 5ef1c225f6
Voicemail - Edit: Add controls to manage Recording Instructions and Options, Only show Alternate Greeting ID if using Default greeting. 2023-06-28 02:11:01 +00:00
fusionate 24197a88d6
Voicemail - Edit: Fix Greeting None option. 2023-06-27 22:23:04 +00:00
fusionate 5bce5b103b
Voicemail [Class]: Update for PHP 8.1 2023-06-27 22:22:30 +00:00
FusionPBX a034fbe08b
Update the version to 5.1.0 RC2 2023-06-27 11:26:48 -06:00
FusionPBX c393b27bf3
Bug fixed for conference active 2023-06-27 10:15:05 -06:00
fusionate d24acf66bf
Authentication: Updates to improve order compatibility. 2023-06-27 02:32:11 +00:00
fusionate dec61c3833
Check Auth: Updates for PHP 8.1 2023-06-27 02:31:25 +00:00
markjcrane a9bd6cbc9a Update the to point to app/switch/resources/conf 2023-06-26 13:37:08 -06:00
FusionPBX eed43da50c
Update app_defaults.php 2023-06-26 13:20:34 -06:00
FusionPBX 1f5fd680ab
Update app_defaults.php 2023-06-26 13:15:44 -06:00
FusionPBX 68c4e29346
Update path to switch conf directory 2023-06-26 13:08:30 -06:00
FusionPBX 3e64700259
Needs to say empty rather than not empty 2023-06-26 10:24:18 -06:00
FusionPBX 39c81b60c4
Update the path to the conf directory 2023-06-26 10:02:14 -06:00
fusionate 2e2bd53170
Authentication: Additional improvements to order execution and invalid creds. 2023-06-25 01:11:49 +00:00
markjcrane 65a84216bb Update class.phpmailer.php update for PHP 8.1 2023-06-24 16:59:43 -06:00
fusionate b23a18fdf1
Authentication: Minor improvements in bad username handling, effort to integrate messages. 2023-06-24 22:40:44 +00:00
fusionate a7ecdf72f8
Authentication: Remove cancel link from username template (form is always displayed first, if needed). 2023-06-24 21:34:42 +00:00
fusionate aa7def54a6
Authentication - Fix MFA when all methods are enabled. 2023-06-24 21:18:39 +00:00
fusionate 123ac6e00a
Default Settings - List: Display order value for array type settings. 2023-06-24 21:12:39 +00:00
markjcrane a72c843b52 Correct the path to the scripts directory 2023-06-24 10:01:15 -06:00
markjcrane b6c521d787 Define the db_sslmode variable 2023-06-24 09:48:27 -06:00
markjcrane 97e0d93400 Set the values in the config class 2023-06-24 09:39:04 -06:00
markjcrane 6e1cfb0354 The db handle is no longer needed for this function 2023-06-24 09:37:42 -06:00
markjcrane 88faf89219 Move scripts to app/switch/resources/scripts 2023-06-24 08:32:56 -06:00
markjcrane 0d39719318 Move resources/templates/conf to app/switch/resources/conf 2023-06-23 13:27:29 -06:00
fusionate 1f20424cbd
Login: Nevermind. Simplify login.php even further. 2023-06-23 18:04:10 +00:00
fusionate 3389ab292d
Login: Honor login destination setting (if any). 2023-06-23 18:00:37 +00:00
FusionPBX 90c2ef0029
Revert back to tonumber
# counts the characters and tonumber converts a string to a number.
2023-06-23 11:59:10 -06:00
fusionate b22aae01d0
Conference Room - Edit: Allow 0 on Max Members again. 2023-06-23 17:48:14 +00:00
fusionate 71d6415d06
Authentication - TOTP: Add description. 2023-06-23 17:47:31 +00:00
fusionate d17265c3ec
Login: Resolve double prompt for authentication code. 2023-06-23 16:54:19 +00:00
fusionate 67e60db16a
Authentication - TOTP: Updatse for PHP 8.1 2023-06-23 16:53:09 +00:00
fusionate 4641c3d295
Default Settings - Edit: Updates for PHP 8.1 2023-06-23 16:25:05 +00:00
fusionate 2c9d741158
SIP Status: Updates for PHP 8.1 2023-06-23 02:09:45 +00:00
fusionate 6bcc5aff5e
Authentication: Added some polish, Cancel links, PHP 8.1 updates. 2023-06-23 00:14:07 +00:00
fusionate 7c85bc95f6
Extension - Edit: Update for PHP 8.1 2023-06-22 18:35:59 +00:00
Zachary Kitchen 1a65701da8
Added DND & Call Forwarding Codes to GR26XX (#6761) 2023-06-22 10:18:18 -06:00
FusionPBX fd0e30bdb7
Update config class add config.conf 2023-06-22 10:09:14 -06:00
FusionPBX 033774c809
Update send_mail.lua add insert_date 2023-06-21 14:20:40 -06:00
FusionPBX 62a61f451b
Change login destination type url to text 2023-06-21 12:07:08 -06:00
FusionPBX 3eb64d1d9a
Add fax_sent_view to the fax group 2023-06-21 11:29:17 -06:00
markjcrane fcda82136f Fix contact import and extension import button 2023-06-20 08:11:07 -06:00
FusionPBX bcf7cbaad2
Save database errors to the message variable 2023-06-19 16:08:54 -06:00
markjcrane ec7a088099 Ensure variables to exist 2023-06-19 14:56:16 -06:00
Anthony aa4a959f1c
Update domain_limits.php (#6757) 2023-06-19 13:07:01 -06:00
FusionPBX 9520fd9481
Update switch_status.php a few PHP 8.1 changes 2023-06-19 13:06:48 -06:00
FusionPBX b0bfaf8400
Remove redundant check_voicemail, company_directory and hangup.
These are part of the Other category and have been already added to the destination select list in the destinations class.
2023-06-17 23:17:55 -06:00
markjcrane 1452bde1ac Update the database class to find the require.php 2023-06-17 22:29:15 -06:00
markjcrane 38150d25aa Use require.php 2023-06-17 21:50:29 -06:00
markjcrane ab646085be Use dir to include require.php 2023-06-17 21:02:45 -06:00
fusionate 219d65ba18
Login: Restore authentication failed message (for real!). 2023-06-17 23:19:41 +00:00
fusionate 3021f59431
Login: Restore authentication failed message. 2023-06-17 23:16:39 +00:00
markjcrane 8393701d13 Authentication reject on single plugin authorized false 2023-06-17 16:18:02 -06:00
FusionPBX 719b84ed2a
Skip redirect and prompt for login 2023-06-17 15:27:56 -06:00
frytimo 0dc9aaabe8
Minor Changes (#6756)
* Update installer to use magic __DIR__

* move setting default step to near top

* spacing

* move session start before text object creation
2023-06-17 14:07:06 -06:00
Andy Binder cfda1ab335
More german translation updates (#6755) 2023-06-17 13:28:37 -06:00
markjcrane c92872ab8f Use require instead of require_once on require.php 2023-06-17 09:11:32 -06:00
markjcrane d6cb17e5b9 Fix a PHP 8.1 error 2023-06-17 09:08:25 -06:00
markjcrane 32051873be Use __dir__ to find resources/require.php 2023-06-16 22:49:09 -06:00
FusionPBX d4231ab0e1
Follow me uses enterprise multiply by 1000 for milliseconds 2023-06-16 14:03:06 -06:00
FusionPBX c69535413c
Fix ring group timing for enterprise vs simultaneous 2023-06-16 14:01:38 -06:00
FusionPBX 094a0f4388
Only set the device_vendor when the value is not empty 2023-06-16 13:02:47 -06:00
FusionPBX 2ee90482f1
Get the device_vendor from the database 2023-06-16 12:43:58 -06:00
FusionPBX ad34744272
Use is_xml instead of simplexml_load_string
Reason for the change is it was throwing and error. Also using regex is less resource intensive. Using this to determine the content type.
2023-06-16 11:16:22 -06:00
FusionPBX 4d54821119
Add a is_xml function 2023-06-16 11:13:20 -06:00
fusionate 142b6dd323
Dialplan - Edit: Clean up. 2023-06-15 23:59:06 +00:00
fusionate c1aebc39a3
Outbound Routes - Add: Integrate new Enabled toggle. 2023-06-15 23:44:59 +00:00
fusionate e8cca7bcc6
Inbound Routes - Add: Integrate new Enabled toggle. 2023-06-15 23:44:40 +00:00
fusionate 09ef6074a7
Dialplan - Edit: Integrate new Enabled toggle, PHP 8.1 updates. 2023-06-15 23:43:39 +00:00
FusionPBX 76e6b5924b
Initialize recording_description and recording_base64 as a string
This prevents an error inserting a null description and fixes the insert SQL command to fix the insert.
2023-06-15 17:23:25 -06:00
fusionate 91366eddc5
Destinations - List: Fix Trunk Prefix and Area Code column headings. 2023-06-15 22:23:44 +00:00
FusionPBX 09567f45c1
Update index.lua 2023-06-15 15:29:13 -06:00
frytimo d7bbcd89f5
Use magic constant dir (#6711)
* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__

* use magic constant __DIR__ to load only functions.php

* replace spaces with tab character

* update dirname command to use levels instead of nesting

* use magic constant __DIR__

* update dirname command to use levels instead of nesting

* Update access_control_edit.php

* Update access_control_import.php

* Update access_controls.php

* Update dnd.php

* Update access_controls_reload.php

* Update call_center_agents.php

* Update call_center_agents.php

* Update fax_queue.php

* Update login.php

* Update pdo.php

* Update pdo_vm.php

* Update switch.php

* Update index.php

* Update css.php

* Update v_mailto.php

* Update fax_to_email.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-06-15 11:28:23 -06:00
FusionPBX 85599c69a0
Replace tonumber with #variablename 2023-06-14 19:39:56 -06:00
FusionPBX c746119faa
Replace tonumber function with # which casts the string to a number 2023-06-14 19:15:16 -06:00
FusionPBX f8c31c4958
Cast the string to a number to increment call block count 2023-06-14 19:08:37 -06:00
FusionPBX 9f339f4ff2
Fix bold for unread voicemail messages. 2023-06-14 18:53:29 -06:00
FusionPBX ba92ef16f7
Either permisison is sufficient. Use an OR as '||' instead than And '&&' 2023-06-14 17:44:38 -06:00
FusionPBX cdfde3aca2
Fix the syntax for gxw42xx template 2023-06-14 16:33:45 -06:00
FusionPBX c8f71780e3
Add definable call center export variables 2023-06-14 15:54:21 -06:00
markjcrane f63010d915 Fix new install loading music on hold 2023-06-14 15:00:28 -06:00
Andy Binder 13d7703e2d
correct translations (#6752) 2023-06-14 14:37:00 -06:00
Andy Binder 9e6c45f924
German email templates (#6753) 2023-06-14 14:34:16 -06:00
FusionPBX 764dd1612a
Use port 5080 and 5081 2023-06-14 08:49:46 -06:00
fusionate a96b721025
Template: Modify list_self_check() JS function to exclude primary Enabled toggle (if any). 2023-06-13 22:54:48 +00:00
markjcrane 49e8aa9863 Fix conference room pin numbers 2023-06-13 10:18:05 -06:00
markjcrane 821dd7ed08 PHP 8.2 Deprecated dynamic property 2023-06-12 21:35:38 -06:00
markjcrane f506b00b57 PHP 8.2 Deprecated dynamic properties 2023-06-12 21:27:23 -06:00
markjcrane bb9f48296a PHP 8.2 Deprecated dynamic properties. 2023-06-12 20:59:56 -06:00
fusionate 19bb912d27
Merge branch 'master' of https://github.com/fusionpbx/fusionpbx 2023-06-12 23:07:04 +00:00
Alex 25b24d68bd
Fixed more php 8.1 errors (#6754)
* Update default_setting_edit.php

* Update default_settings_reload.php

* Update modules.php

* Update access_controls_reload.php

* Update call_recordings.php

* Update fax.php

* Update extension_edit.php

* Update extension_imports.php

* Update destination_imports.php

* Update dialplan_outbound_add.php

* Update dialplan_inbound_add.php

* Update voicemail_imports.php

* Update contact_import.php
2023-06-12 17:06:56 -06:00
fusionate 364f2582a3
User - Edit: Create socket to update user state even if user status empty. 2023-06-12 23:06:55 +00:00
fusionate 5d9c8ad770
Extension - Edit: Update for PHP 8.1 2023-06-12 23:04:33 +00:00
markjcrane 6e7d274c5a Remove debug for authentication class. The validation method returns enough details. 2023-06-12 16:27:47 -06:00
fusionate a903d0efbf
Call Center Agent - Edit: Fix Contact selection. 2023-06-12 21:03:45 +00:00
fusionate 9b1ac240b3
Call Center Queue - Edit: Updates for PHP 8.1 2023-06-12 21:02:52 +00:00
Alex 5e90483b95
Missing quotes (#6751) 2023-06-09 16:59:09 -06:00
Alex 777b56ae9a
Fixed call broadcast and call block php 8.1 errors (#6750)
* Update call_block_edit.php

* Update call_broadcast_send.php

* Update call_broadcast_send.php
2023-06-09 15:01:46 -06:00
fusionate 8b982dd6e3
Database [Class]: Modify copy() method to support enable and description fields without the table name. 2023-06-09 19:42:10 +00:00
fusionate eeba323429
Number Translations: Update for PHP 8.1 2023-06-09 19:40:41 +00:00
fusionate 305a18c6b0
Access Controls: Update for PHP 8.1 2023-06-09 19:40:20 +00:00
fusionate d92961d769
Sofia Global Settings: Fix Copy of disabled record. 2023-06-09 18:42:16 +00:00
fusionate 2cc5035ceb
Extension Settings [Class]: Updates for PHP 8.1, fix Copy of disabled record. 2023-06-09 18:41:49 +00:00
fusionate 4b249e1fe4
Extension Settings: Updates for PHP 8.1 2023-06-09 18:40:56 +00:00
fusionate 03d446ec0d
Extension - Edit: Updates for PHP 8.1 2023-06-09 18:40:15 +00:00
fusionate 44fe36fc3d
Transactions: Hide View button if not desired. 2023-06-09 18:12:38 +00:00
fusionate 4ba06c5335
Sofia Global Settings: Updates for PHP 8.1 2023-06-09 18:06:02 +00:00
fusionate 3f94d93411
Modules: Updates for PHP 8.1 2023-06-09 17:51:01 +00:00
fusionate d8652d72e9
SIP Profiles: Updates for PHP 8.1 2023-06-09 17:50:36 +00:00
fusionate fa93b4e7f5
Misc: Updates for PHP 8.1 2023-06-09 17:29:33 +00:00
fusionate 09ba7069dc
Functions: Enhance html_select_other() function. 2023-06-09 17:28:56 +00:00
fusionate e016d3d39c
Variables: Updates for PHP 8.1 2023-06-09 17:27:55 +00:00
fusionate 39cb1c3588
Voicemail Greetings: Updates for PHP 8.1 2023-06-09 16:51:59 +00:00
fusionate bd9a407ba5
Voicemails: Updates for PHP 8.1 2023-06-09 16:51:36 +00:00
fusionate 93e59f230a
Time Condition - Edit: Updates for PHP 8.1 2023-06-09 15:48:45 +00:00
FusionPBX 5759a636e6
Add missing cc_queue_joined_epoch variable 2023-06-08 18:47:17 -06:00
Alex 66e14c586c
Update xml_cdr.php (#6749) 2023-06-08 16:57:06 -06:00
Alex 475cf4d253
Fixed more php 8.1 errors (#6748)
* Update call_center_queue_edit.php

* Update number_translation_edit.php

* Update database_transactions.php

* Update xml_cdr_extension_summary.php

* Update call_flow_edit.php

* Update contact_address_edit.php

* Update device_profiles.php
2023-06-08 16:07:01 -06:00
fusionate a07e7af955
Streams: Updates for PHP 8.1 2023-06-08 20:57:33 +00:00
fusionate ec40d59152
Ring Groups: Hide buttons till checkbox checked, Updates for PHP 8.1. 2023-06-08 20:46:57 +00:00
fusionate 9f9021cb69
Recordings: Updates for PHP 8.1 2023-06-08 20:31:36 +00:00
fusionate 0396809b65
Queue - Add: Integrate new toggle switch for Enabled field. 2023-06-08 20:14:43 +00:00
fusionate 6b07e8d168
Phrases: Updates for PHP 8.1 2023-06-08 19:51:18 +00:00
fusionate 4ac06a9194
Operator Panel: Updates for PHP 8.1 2023-06-08 19:32:39 +00:00
fusionate 1b3af9fb36
Operator Panel: Simplify and enhance filter, updates for PHP 8.1. 2023-06-08 19:16:38 +00:00
fusionate fb3d416c76
Event Guard: Fix typo in language value. 2023-06-08 19:15:47 +00:00
markjcrane 557284070a Times the delay by 1000 instead of 500. When using enterprise use originate timeout 2023-06-08 12:44:19 -06:00
fusionate 1e391aad4f
MOH: Updates for PHP 8.1 2023-06-08 18:03:37 +00:00
fusionate 2a2a705f6a
MOH: Minor visual adjustment to upload form. 2023-06-08 17:44:04 +00:00
fusionate eda0d90eb2
IVR Menu - Edit: Fix delete. 2023-06-08 17:38:22 +00:00
fusionate b49892ab8a
IVR Menu - Edit: Update for PHP 8.1 2023-06-08 17:32:55 +00:00
fusionate 83c05beb46
IVR Menu - Edit: Updates for PHP 8.1 2023-06-08 17:26:12 +00:00
fusionate c1dee4cc6a
IVR Menu - Edit: Update for PHP 8.1 2023-06-08 17:19:52 +00:00
markjcrane 230579d9a8 Ring group strategy alphabetical and enterprise by default 2023-06-08 11:10:12 -06:00
markjcrane 4ee30460b8 Improved logic elminated 2 queries and update show all 2023-06-08 00:34:16 -06:00
FusionPBX 7331f90d1b
Comment the call center dialplan rewrite 2023-06-07 23:42:52 -06:00
Alex 3b2964748a
php 8.1 changes (#6747)
* Update ivr_menu_edit.php

* Update call_block.php
2023-06-07 13:31:20 -06:00
FusionPBX 473033257a
Exclude switch default settings.
This category is causing errors and is not needed for this code.
2023-06-07 11:43:15 -06:00
FusionPBX 8014b57a0d
Update call_center_queue_edit.php more PHP 8.1 changes 2023-06-07 03:04:43 -06:00
FusionPBX 426f09b2b0
Update call_center_agents.php more code refactoring
Changed search to use variable
Integrate search direct into the SQL
Simplify the domain handling for show all
2023-06-07 02:18:50 -06:00
markjcrane b75b0f63e6 Initialize the array before using them 2023-06-06 23:37:09 -06:00
fusionate 8d51e9d948
Menu [Class]: Updates for PHP 8.1 2023-06-06 22:27:16 +00:00
fusionate 992a7e6f62
Menu Item - List: Updates for PHP 8.1 2023-06-06 22:26:58 +00:00
fusionate 16aa7f8d3a
Menu - Edit: Updates for PHP 8.1 2023-06-06 22:26:35 +00:00
fusionate 72bb8904be
Group - Edit: Updates for PHP 8.1 2023-06-06 22:12:42 +00:00
fusionate addae78ac8
Groups [Class]: Updates for PHP 8.1 2023-06-06 22:12:29 +00:00
fusionate d327d569f5
Misc: Updates for PHP 8.1 (?: to ??) 2023-06-06 22:05:05 +00:00
fusionate 35a52b46c3
Email Templates: Updates for PHP 8.1 2023-06-06 21:52:55 +00:00
fusionate 9a7311b825
Dialplan [Class]: Updates for PHP 8.1 2023-06-06 21:45:44 +00:00
fusionate 4e77106a4c
Default Settings: Updates for PHP 8.1 2023-06-06 21:45:02 +00:00
fusionate 4783d2dbcc
Domain Settings: Updates for PHP 8.1 2023-06-06 21:44:42 +00:00
fusionate c7e567b2d2
Domain - Edit: Updates for PHP 8.1 2023-06-06 21:44:10 +00:00
fusionate 8e9f28a5e0
Domains [Class]: Updates for PHP 8.1 2023-06-06 21:43:50 +00:00
fusionate 3fddd36858
Databases: Updates for PHP 8.1 2023-06-06 21:19:23 +00:00
Alex 22a01b147d
Fixed call center queue agents table (#6746)
* Update destination_edit.php

* Fixed php 8.1 errors

* Fixed cdr recording download not working

* Update call_center_queue_edit.php

* Update call_center_queue_edit.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-06-06 11:31:22 -06:00
FusionPBX b14fde8eec
Remove reference to fax tasks 2023-06-06 10:41:57 -06:00
markjcrane fb0c2829e6 Remove fax_tasks table 2023-06-06 10:38:33 -06:00
markjcrane 047824cad7 Remove Fax tasks as replaced with the fax queue 2023-06-06 10:33:59 -06:00
fusionate 28ebdbc722
CDR: Restore call recording download. 2023-06-06 16:29:09 +00:00
Alex f86abd84c4
Fixed call recording download and call center show all (#6745) 2023-06-06 10:14:15 -06:00
markjcrane 21fc42f12a Remove fax active replaced by fax queue 2023-06-05 21:36:08 -06:00
FusionPBX 3b7020be21
Update domain_settings.php make sure checked is not empty. 2023-06-05 17:46:27 -06:00
FusionPBX 21f2a922d7
Prevent additional PHP 8.1 errors
Make sure $record['checked'] is not empty
2023-06-05 17:44:06 -06:00
FusionPBX 8f59093604
Update app_defaults.php 2023-06-05 17:14:56 -06:00
FusionPBX 6314053331
Removed code from app_config.php 2023-06-05 12:50:21 -06:00
FusionPBX 658281f46d
Update app_defaults.php 2023-06-05 12:45:47 -06:00
Alex fb8d0e2983
fix bugs in php 8.1 changes (#6744)
* Update voicemail_greetings.php

* Update recordings.php

* Update recording_edit.php

* Update phrases.php

* Update phrase_edit.php

* Update music_on_hold_edit.php

* Update fax_queue.php

* Update extensions.php

* Update email_templates.php

* Update email_queue_edit.php

* Update dialplan_inbound_add.php

* Update device_profiles.php

* Update device_profile_copy.php

* Update contact_address_edit.php

* Update call_recordings.php

* Update call_center_agent_edit.php

* Update call_center_agents.php

* Update call_center_queues.php

* Update call_block.php

* Update menu_edit.php

* Update default_setting_edit.php

* Update database_edit.php
2023-06-05 12:41:28 -06:00
FusionPBX 791be82f27
Fix PHP 8.1 errors 2023-06-05 12:39:00 -06:00
FusionPBX a0dc490838
Bug fixed for recordings upload. 2023-06-05 11:37:24 -06:00
fusionate ae10573235
Recordings - App Defaults: Minor adjustment to IF statement. 2023-06-04 01:50:54 +00:00
fusionate 59a07e9cc7
Default Settings: Updates for PHP 8.1 2023-06-04 01:50:00 +00:00
fusionate 8965f68c8d
Permission Defaults: Updates for PHP 8.1 2023-06-04 01:49:32 +00:00
fusionate 8b5970630e
Grandstream Wave: Updates for PHP 8.1, option to view XML data. 2023-06-04 01:46:51 +00:00
fusionate a4a56d06e3
Contacts: Updates for PHP 8.1 2023-06-04 00:51:12 +00:00
FusionPBX f5f3ef680e
Set session variables from default settings switch category 2023-06-03 13:43:37 -06:00
FusionPBX bc43f696ca
Bug fixed unset the cidr variable 2023-06-03 10:19:42 -06:00
fusionate 079d9ca3d5
Contacts: Updates for PHP 8.1 2023-06-02 23:54:00 +00:00
markjcrane 79df700a81 Few more adjustments for PHP 8.1 2023-06-02 17:52:38 -06:00
Anthony 190e13628d
Fixed Warnings (#6742)
* Update device_edit.php

* Update dialplan_inbound_add.php

* Update device_vendor_function_edit.php

* Update voicemail_edit.php

* Update voicemail_edit.php

* Update dialplan_inbound_add.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-06-02 17:08:36 -06:00
Anthony c01df877e4
Fixed Warnings (#6742)
* Update device_edit.php

* Update dialplan_inbound_add.php

* Update device_vendor_function_edit.php
2023-06-02 17:08:11 -06:00
Alex 93f85e6ea4
php 8.1 changes (#6741)
* Update dashboard_edit.php

* Update dashboard_edit.php

* Update dialplan_inbound_add.php

* Update dialplan_outbound_add.php

* Update dialplan_inbound_add.php

* Update modules.php

* Update sip_profile_edit.php
2023-06-02 17:01:15 -06:00
FusionPBX d5a4146c57
Fix errors when fax directory isn't set 2023-06-02 16:44:04 -06:00
FusionPBX 51b22069ee
Fix errors when the fax directory doesn't exist. 2023-06-02 16:43:12 -06:00
Anthony bf194cddaf
Simplified Variables in xml_cdr.php (#6740) 2023-06-02 16:22:26 -06:00
FusionPBX f8662f20a3
Fix the display of the device table header 2023-06-02 15:43:52 -06:00
FusionPBX 951d3f9321
Fix the table header for extension settings 2023-06-02 15:31:55 -06:00
Alex 42ecba0214
voicemail edit, log viewer, and sip status php 8.1 changes (#6738)
* Update voicemail_edit.php

* Update sip_status.php

* Update message.php

* Update log_viewer.php

* Update log_viewer.php

* Update sip_status.php
2023-06-02 14:53:23 -06:00
Anthony fae05e5341
Fixed Warnings for Recordings, Ring Group Edit and Operator Panel (#6739)
* Update ring_group_edit.php

* Update recordings.php

* Update recording_edit.php

* Update content.php
2023-06-02 14:37:30 -06:00
fusionate 150735c810
Conferences: Updates for PHP 8.1 2023-06-02 20:13:47 +00:00
fusionate 37fd554842
Conference Profiles: Updates for PHP 8.1 2023-06-02 20:00:19 +00:00
fusionate e0e59e6110
Conference Controls: Updates for PHP 8.1 2023-06-02 19:47:40 +00:00
FusionPBX 0a4454ac5c
Add a description 2023-06-02 13:42:37 -06:00
FusionPBX 911f94b080
Make sure the voicemail directory exists 2023-06-02 13:36:54 -06:00
fusionate 340765af8e
Conference Centers/Rooms: Updates for PHP 8.1 2023-06-02 19:26:58 +00:00
Alex 75da594fea
extension_settings and domains php 8.1 changes (#6737)
* Update extension_settings.php

* Update extension_setting_edit.php

* Update extension_edit.php

* Update domain_edit.php

* Update domain_json.php

* Update extension_setting_edit.php
2023-06-02 12:43:35 -06:00
fusionate 358c36ef2b
Call Recordings: Updates for PHP 8.1 2023-06-02 18:26:50 +00:00
fusionate bc322e5cd6
CDR - Details: Update for PHP 8.1 2023-06-02 18:26:30 +00:00
fusionate 7a0fbaeb8e
Call Forward (FM & DND): Updates for PHP 8.1 2023-06-02 17:46:10 +00:00
FusionPBX 7f16f52b8a
Correct the logic to use color 2 if 1 is empty
In the array the color 1 is represented with 0 and color 2 is represented with 1
2023-06-02 10:34:42 -06:00
FusionPBX 237b11705a
Set empty default setting enabled to false by default 2023-06-02 10:03:48 -06:00
fusionate 1eae3a70e9
Call Flows - Edit: Updates for PHP 8.1 2023-06-02 00:09:59 +00:00
fusionate 4e0713bb18
Call Flows - List: Fix search. 2023-06-02 00:04:55 +00:00
fusionate 0849bf51a0
Call Centers: Updates for PHP 8.1 2023-06-01 23:59:29 +00:00
fusionate be9390795c
Call Broadcast: Updates for PHP 8.1 2023-06-01 23:33:32 +00:00
fusionate b4855290de
Call Block: Updates for PHP 8.1 2023-06-01 23:22:59 +00:00
fusionate c8e8c5acd7
Functions: Update format_phone() function for PHP 8.1 2023-06-01 23:22:39 +00:00
FusionPBX 408470b1d2
Update app_config.php 2023-06-01 17:20:49 -06:00
fusionate 69900445b5
CDR: Updates for PHP 8.1 2023-06-01 22:55:19 +00:00
fusionate 85f378c8f2
Switch [Resources]: Update outbound_route_to_bridge() function for PHP 8.1 2023-06-01 22:54:50 +00:00
fusionate 8ca359a5f1
TCPDF: Update for PHP 8.1 2023-06-01 22:53:58 +00:00
Alex d6b73cf296
more php 8.1 changes (#6734)
* Update ivr_menu_edit.php

* Update ringbacks.php

* Update call_block_edit.php

* Update call_broadcast.php

* Update call_broadcast_edit.php

* Update call_center_queue_edit.php

* Update call_center_queue_edit.php

* Update call_center_agent_status.php

* Update call_center_queue_edit.php

* Update call_center_agent_edit.php

* Update call_center_queues.php

* Update call_flow_edit.php

* Update call_broadcast.php

* Update call_forward.php

* Update call_broadcast_send.php

* Update conference_rooms.php

* Update conference_centers.php

* Update conference_control_edit.php

* Update conference_control_details.php

* Update conference_profile_edit.php

* Update conference_profile_param_edit.php

* Update conference_profile_edit.php

* Update database_transaction_edit.php

* Update database_transactions.php
2023-06-01 16:39:05 -06:00
Anthony 9c650a29b1
Fixed Errors for Phrases, Recordings, Operator Panel and Music on Hold. (#6735) 2023-06-01 15:21:29 -06:00
fusionate 072d351b8c
Dialplan - Edit: Update for PHP 8.1 2023-06-01 20:35:53 +00:00
fusionate e68c2f33a0
Call Forward - Edit: Update for PHP 8.1 2023-06-01 19:00:44 +00:00
Alex 9df57e679d
contacts php 8.1 changes (#6730)
* Update contacts_vcard.php

* Update vcard.php

* Update contact_edit.php

* Update contact_view.php

* Update contact_phone_edit.php

* Update contact_address_edit.php

* Update contact_addresses.php

* Update contact_addresses_view.php

* Update contact_attachment.php

* Update contact_attachment_edit.php

* Update contact_attachments.php

* Update contact_attachments_view.php

* Update contact_email_edit.php

* Update contact_emails.php

* Update contact_emails_view.php

* Update contact_extensions.php

* Update contact_extensions_view.php

* Update contact_import.php

* Update contact_import_google.php

* Update contact_json.php

* Update contact_note_edit.php

* Update contact_notes.php

* Update contact_notes_view.php

* Update contact_phones.php

* Update contact_phones_view.php

* Update contact_relation_edit.php

* Update contact_emails_view.php

* Update contact_addresses_view.php

* Update contact_relations.php

* Update contact_relations_view.php

* Update contact_setting_edit.php

* Update contact_settings.php

* Update contact_time_edit.php

* Update contact_timer.php

* Update contact_timer_inc.php

* Update contact_times.php

* Update contact_url_edit.php

* Update contact_urls.php

* Update contact_urls_view.php

* Update contact_import.php

* Update contact_import.php

* Update contact_email_edit.php

* Update contact_url_edit.php

* Update contact_relation_edit.php

* Update contact_note_edit.php

* Update contact_setting_edit.php

* Update contact_attachment_edit.php

* Update contact_edit.php

* Update contact_phones_view.php

* Update contact_note_edit.php

* Update contact_attachment_edit.php

* Update contact_phones_view.php

* Update contact_edit.php

* Update contacts.php

* Update contact_edit.php

* Update contact_edit.php

* Update contact_edit.php

* Update contact_edit.php

* Update contact_edit.php

* Update contact_phone_edit.php

* Update contact_addresses.php

* Update contact_addresses_view.php

* Update contact_attachment_edit.php

* Update contact_attachments.php

* Update contact_attachments_view.php

* Update contact_edit.php

* Update contact_email_edit.php

* Update contact_emails.php

* Update contact_emails_view.php

* Update contact_extensions.php

* Update contact_extensions_view.php

* Update contact_import.php

* Update contact_import_google.php

* Update contact_json.php

* Update contact_note_edit.php

* Update contact_notes.php

* Update contact_notes_view.php

* Update contact_phone_edit.php

* Update contact_phones.php

* Update contact_phones_view.php

* Update contact_relations.php

* Update contact_relations_view.php

* Update contact_setting_edit.php

* Update contact_settings.php

* Update contact_time_edit.php

* Update contact_timer.php

* Update contact_timer_inc.php

* Update contact_times.php

* Update contact_url_edit.php

* Update contact_urls.php

* Update contact_urls_view.php

* Update contact_view.php

* Update contacts.php

* Update contacts_vcard.php
2023-06-01 11:50:12 -06:00
FusionPBX 7b25e81a8d
Update call_forward_edit.php changes for PHP 8.1 2023-05-31 23:52:32 -06:00
FusionPBX 6793ab363f
Order by based on delay and then the destination number 2023-05-31 20:21:32 -06:00
FusionPBX 787fec4d5e
Change data type follow_me_timeout from text to numeric 2023-05-31 19:59:11 -06:00
FusionPBX 19cdc81be0
Change follow_me_delay data type from text to numeric 2023-05-31 19:53:37 -06:00
volga629-1 bbc6b5d280
Simplified version of uptime for Linux (#6733) 2023-05-31 18:41:35 -06:00
Anthony f0598117ab
Fixed Errors for Streams & Ring Groups (#6728)
* Fixed Errors streams.php

* Update streams.php

* Update stream_edit.php

* Update ring_groups.php

* Update tones.php

* Update ringbacks.php

* Update ring_group_edit.php
2023-05-31 11:00:55 -06:00
Alex 410f5e6f68
more php 8.1 changes (#6727)
* Update call_broadcast.php

* Update call_broadcast_edit.php

* Update conference_center_edit.php

* Update call_flows.php

* Update conference_room_edit.php

* Update conference_sessions.php

* Update conference_session_details.php

* Update conference_rooms.php

* Update conference_controls.php

* Update conference_control_edit.php

* Update conference_control_details.php

* Update conference_control_detail_edit.php

* Update conference_profiles.php

* Update conference_profile_edit.php

* Update conference_profile_params.php

* Update conference_profile_param_edit.php

* Update conferences.php

* Update conference_edit.php

* Update conferences.php

* Update conference_interactive_inc.php

* Update contacts.php
2023-05-31 09:11:50 -06:00
Ben 1d23d548d0
Partial php 8.1 changes (#6729)
* Partial php 8.1 changes

* Update extension_settings.php
2023-05-30 17:52:22 -06:00
FusionPBX a93535d990
Calculate the destination delay using the database 2023-05-30 17:19:10 -06:00
FusionPBX d98e054f34
Update follow me delay calculated with the database 2023-05-30 17:12:52 -06:00
FusionPBX 8fff4dc17b
Fix the call flow sound and alternate sound 2023-05-30 10:15:19 -06:00
FusionPBX ae817047ef
Update call_flows.php
There is a select box to select which field to toggle.
2023-05-30 09:44:01 -06:00
FusionPBX a4ad93632d
FAX status busy increment count
It turns out most of the busies are a bad number. So we need to increment the value and eventually stop retrying.
2023-05-30 09:33:24 -06:00
FusionPBX f7dac01eaa
Add a default value to toggle_field 2023-05-29 22:08:27 -06:00
fusionate eb45bc2de0
Switch - outbound_route_to_bridge(): Updates for PHP 8.1 2023-05-29 22:44:03 +00:00
fusionate b90894ae84
Fax Log - View: Updates for PHP 8.1 2023-05-29 22:28:33 +00:00
fusionate 195b81faa0
Fax - Logs: Updates for PHP 8.1 2023-05-29 22:28:00 +00:00
fusionate 38e80c6e1e
Fax - Files: Updates for PHP 8.1 2023-05-29 22:27:31 +00:00
fusionate 94eadf2382
Fax - Send: Updates for PHP 8.1 2023-05-29 22:27:06 +00:00
fusionate 3f17c98516
Fax - Edit: Updates for PHP 8.1 2023-05-29 22:26:37 +00:00
fusionate 0406eeb14f
Fax Server: Updates for PHP 8.1 2023-05-29 22:25:48 +00:00
fusionate 88a966cbcc
Fax Queue: Updates for PHP 8.1 2023-05-29 22:25:05 +00:00
fusionate e9281cb0cb
Fax [Class]: Updates for PHP 8.1 2023-05-29 22:24:23 +00:00
fusionate f444f651e5
TCPDF: Updates for PHP 8.1 2023-05-29 22:23:40 +00:00
FusionPBX 488b199950
Update user_logs.php for PHP 8.1 2023-05-29 14:31:10 -06:00
fusionate 980286a2e3
Extension - Edit: Update for PHP 8.1 2023-05-29 20:07:53 +00:00
fusionate 140e726414
User Logs - List: Updates for PHP 8.1 2023-05-29 20:05:49 +00:00
fusionate 951340dc1b
System Status: Update for PHP 8.1 2023-05-29 19:59:27 +00:00
fusionate c4f44f9ad5
Dashboard - Recent Calls: Updates for PHP 8.1 2023-05-29 19:57:35 +00:00
fusionate c3fda2c09d
Dashboard - Missed Calls: Updates for PHP 8.1 2023-05-29 19:57:10 +00:00
fusionate 3a6d3792db
Registrations [Class]: Updates for PHP 8.1 2023-05-29 19:48:47 +00:00
fusionate 437024d3ed
SIP Status: Updates for PHP 8.1 2023-05-29 19:48:18 +00:00
fusionate 80dd552e15
Registrations: Updates for PHP 8.1 2023-05-29 19:38:09 +00:00
fusionate 2384def111
Registrations [Class]: Updates for PHP 8.1 2023-05-29 19:37:47 +00:00
fusionate c450d10f93
Log Viewer: Updates for PHP 8.1 2023-05-29 19:12:30 +00:00
fusionate b1cf7d7e1d
Functions - format_hours(): Adjust minute formatting. 2023-05-29 19:12:11 +00:00
fusionate f4c141f6ef
Extension Summary: Updates for PHP 8.1 2023-05-29 18:30:31 +00:00
fusionate 81d19fdce7
XML CDR [Class]: Updates for PHP 8.1 2023-05-29 18:30:07 +00:00
FusionPBX 55124c5313
Remove destination_delay arithmetic
Caused Error on FreeSWITCH enterprise version.

index.lua: attempt to perform arithmetic on global destination_delay (a string value)

Tried casting the value to a number and it still failed.
2023-05-28 11:26:39 -06:00
FusionPBX 607d19ab3e
Comment out destination_delay arithmetic
Caused Error on FreeSWITCH enterprise version.

index.lua:747: attempt to perform arithmetic on global destination_delay (a string value)

Tried casting the value to a number and it still failed.
2023-05-28 11:24:36 -06:00
FusionPBX b85e22ea8b
Update gswave link and PHP 8.1 updates 2023-05-27 23:06:45 -06:00
markjcrane 56068684ff Convert base64 description in vars to text 2023-05-27 13:30:07 -06:00
markjcrane 2fd25f3621 Vars PHP 8.1 updates 2023-05-27 13:06:32 -06:00
fusionate c92ebd8f0a
Active Conferences - Interactive: Adjust Joined and Quiet formatting. 2023-05-27 18:54:43 +00:00
fusionate f432bdc14a
Queues - Interactive: Adjust duration formatting. 2023-05-27 18:53:10 +00:00
markjcrane 81f6294a9b When adding a record hide the members and permissions buttons 2023-05-27 12:26:48 -06:00
fusionate 1c4bf2066e
Event Guard - Edit: Updates for PHP 8.1 2023-05-27 18:23:38 +00:00
fusionate 5d75490eab
Event Guard - Add additional languages. 2023-05-27 18:23:18 +00:00
fusionate 2ca03f5159
Event Guard - List: Updates for PHP 8.1 2023-05-27 18:22:35 +00:00
fusionate 1b35623c59
Event Guard [Service]: Updates for PHP 8.1 2023-05-27 18:22:10 +00:00
fusionate 268dd25f6f
Event Guard [Class]: Updates for PHP 8.1 2023-05-27 18:21:53 +00:00
markjcrane 8eb36dc7c2 Clear the group_array between iterations 2023-05-27 12:16:42 -06:00
markjcrane c679165016 Menu: PHP 8.1 updates 2023-05-27 12:00:02 -06:00
markjcrane 283ed042f2 Deprecate email_logs 2023-05-26 22:04:25 -06:00
fusionate 5b79979c41
Email Queue - Delete: Updates for PHP 8.1 2023-05-27 03:40:18 +00:00
fusionate f9dd931caf
Email Queue - Edit: Updates for PHP 8.1 2023-05-27 03:39:52 +00:00
fusionate c1980aa241
Email Queue: Add Email Test feature, updates for PHP 8.1 2023-05-27 03:39:27 +00:00
fusionate 0ca497643c
Email [Class]: Updates for PHP 8.1 2023-05-27 03:36:58 +00:00
fusionate 65ab2ccada
Email Queue: Language additions for Email Test. 2023-05-27 03:36:11 +00:00
fusionate 6670e18e88
Email Queue: Add new email_test.php file. 2023-05-27 03:35:39 +00:00
Alex b4122d04e0
Update number_translation_edit.php (#6726) 2023-05-26 16:32:59 -06:00
Anthony a001f27730
Update voicemail_imports.php (#6724)
* Update voicemail_imports.php
2023-05-26 16:25:07 -06:00
Anthony 164b8b842c
Update voicemail_edit.php (#6723)
* Update voicemail_edit.php
2023-05-26 16:17:53 -06:00
Anthony 75ea925753
Update voicemail messages and greetings (#6725)
* Update voicemail_messages.php

* Update voicemail_greetings.php
2023-05-26 16:13:52 -06:00
Anthony f30614baf0
Update voicemails.php (#6722)
* Update voicemails.php
2023-05-26 13:53:41 -06:00
markjcrane 711ca64ad3 Database Transactions PHP 8.1 changes 2023-05-26 13:48:39 -06:00
Alex 3112c9ae18
php 8.1 changes (#6721)
* Update call_flows.php

* Update call_flow_edit.php

* Update call_forward.php

* Update call_forward_edit.php

* Update call_recordings.php

* Update conference_centers.php

* Update default_settings.php

* Update default_setting_edit.php

* Update access_controls.php

* Update number_translations.php

* Update number_translation_edit.php

* Update setting_edit.php

* Update bridges.php

* Update bridge_edit.php

* Update call_broadcast_edit.php

* Update call_broadcast.php

* Update call_block.php

* Update call_broadcast_edit.php

* Update call_center_agent_edit.php

* Update call_center_agent_status.php

* Update call_recordings.php
2023-05-26 11:48:39 -06:00
Alex b939ac2442
call center php 8.1 changes (#6720)
* Update call_center_agents.php

* Update call_center_queues.php

* Update call_center_queue_edit.php

* Update call_center_agent_edit.php

* Update call_center_agents.php
2023-05-26 10:07:25 -06:00
FusionPBX 7979ff145b
Use $this->message
Reason for using this message rather than local message variable is that it get changed and the information we want is preserved in the class variable.
2023-05-26 09:55:18 -06:00
markjcrane ad6ed407d7 Devices a few more PHP 8.1 changes 2023-05-26 09:24:02 -06:00
markjcrane 55e506ff99 Update save_setting_xml 2023-05-26 09:03:26 -06:00
markjcrane 54dc9e1970 Remove commented out debug info 2023-05-25 22:08:18 -06:00
markjcrane 9083885b75 Sofia global settings PHP 8.1 2023-05-25 22:04:33 -06:00
markjcrane 29008867d0 SIP Profiles changes for PHP 8.1 2023-05-25 21:20:56 -06:00
fusionate 5677ddfa8a
Domains: Updates for PHP 8.1 2023-05-25 22:43:34 +00:00
markjcrane 411e93c4b4 Additional PHP 8.1 changes 2023-05-25 15:44:33 -06:00
fusionate 3adeb15ace
CDR Statistics: Updates for PHP 8.1 2023-05-25 21:34:41 +00:00
fusionate 4d8bad9f1a
Agent Status: Updates for PHP 8.1 2023-05-25 21:25:23 +00:00
fusionate bf1ccc04b5
Queues - List: Updates for PHP 8.1 2023-05-25 21:09:05 +00:00
fusionate 035ba1b86b
Active Conferences: Updates for PHP 8.1 2023-05-25 21:08:30 +00:00
fusionate fd0118206d
Queue - Add: Updates for PHP 8.1 2023-05-25 21:00:54 +00:00
fusionate 82c71368cf
Dialplans - List: Update for PHP 8.1 2023-05-25 20:57:05 +00:00
markjcrane 89a1668cf6 A few more updates for PHP 8.1 2023-05-25 14:15:19 -06:00
fusionate 711ffac87c
Active Call Center - Queue: Updates for PHP 8.1 2023-05-25 19:43:21 +00:00
fusionate 1c54896102
Active Call Center: Updates for PHP 8.1 2023-05-25 19:42:23 +00:00
fusionate 4b86260336
Active Calls: Updates for PHP 8.1 2023-05-25 19:41:42 +00:00
FusionPBX c4a42dda96
Use the email_queue by default 2023-05-25 13:24:23 -06:00
FusionPBX 677aa45a90
Update send_email.lua 2023-05-25 13:23:16 -06:00
markjcrane 47bc97347f Simplify how show all and search 2023-05-25 12:50:11 -06:00
Alex 5bb29763ad
php 8.1 changes (#6719)
* Update email_template_edit.php

* Update menu.php

* Update menu_edit.php

* Update number_translations.php

* Update number_translations.php

* Update email_templates.php

* Update email_templates.php

* Update setting_edit.php

* Update call_block.php

* Update call_block_edit.php

* Update email_template_edit.php

* Update call_block.php
2023-05-25 12:38:32 -06:00
fusionate e3dce560cf
Device Profile - Edit: Updates for PHP 8.1 2023-05-25 17:46:27 +00:00
fusionate 48e5f4f2f4
Device Profiles - List: Updates for PHP 8.1 2023-05-25 17:46:06 +00:00
fusionate 7ad7701640
Device - Edit: Adjustment for PHP 8.1 2023-05-25 17:42:37 +00:00
fusionate 798001bb23
Device [Class]: Updates for PHP 8.1 2023-05-25 17:41:58 +00:00
markjcrane d0357b6124 PHP 8.1 changes 2023-05-25 10:52:28 -06:00
markjcrane 7d2b43dc15 More PHP 8.1 changes 2023-05-25 10:34:48 -06:00
Alex caea15af15
php 8.1 changes (#6718)
* Update database_edit.php

* Update databases.php

* Update default_setting_edit.php

* Update email_templates.php
2023-05-25 10:18:46 -06:00
markjcrane d964f354db Fix PHP 8.1 warnings 2023-05-25 10:15:56 -06:00
fusionate 09219263e1
Device Vendor Function - Edit: Updates for PHP 8.1 2023-05-25 15:43:36 +00:00
fusionate 35b04ba3a1
Device Vendor Functions - List: Updates for PHP 8.1 2023-05-25 15:43:11 +00:00
fusionate 0e9df92730
Device Vendor - Defaults: Updates for PHP 8.1 2023-05-25 15:42:50 +00:00
fusionate fea5368a74
Device Vendor - Edit: Updates for PHP 8.1 2023-05-25 15:42:19 +00:00
fusionate 7b18e82c32
Device Vendors - List: Updates for PHP 8.1 2023-05-25 15:41:45 +00:00
fusionate 18b6c4b318
Device [Class]: Updates for PHP 8.1 2023-05-25 15:40:59 +00:00
fusionate 6119f7de7d
Database [Class]: Update for PHP 8.1 2023-05-25 15:40:20 +00:00
markjcrane 251feddff8 Return this->message variable as array. 2023-05-24 23:00:08 -06:00
markjcrane 65bc00535f Use empty and not empty 2023-05-24 17:42:37 -06:00
Luis Daniel Lucio Quiroz af101bcd7b
Fixes PHP fatal error when editing users (#6700)
* Update user_edit.php

Some PHP implementations return a fatal error when in_array() has the second parameter null.

 $_SESSION['authentication']['methods']  is null by default on new installations.
2023-05-24 17:27:06 -06:00
jrmcclean 3b8b771c92
Update install.php (#6699)
* Changed If statement to Switch Case. 
* Added Win option
* Created new Var $php_dir and $cache_location
2023-05-24 17:21:42 -06:00
Alex 9f84d64981
Access controls php 8.1 changes (#6717)
* Update access_control_edit.php

* Update access_controls.php
2023-05-24 17:13:53 -06:00
markjcrane 843b9b4377 Use conditions with empty and not empty 2023-05-24 15:44:54 -06:00
markjcrane 9e5dec8113 Add some minor fixes 2023-05-24 15:39:10 -06:00
fusionate cc44fc47c9
Device - Import: Updates for PHP 8.1 2023-05-24 21:22:16 +00:00
fusionate e0ccb81dd8
Device - Export: Updates for PHP 8.1 2023-05-24 21:21:58 +00:00
fusionate c65d50160e
Device - Edit: Updates for PHP 8.1 2023-05-24 20:52:50 +00:00
fusionate 5dbff0ca1c
Devices - List: Updates for PHP 8.1 2023-05-24 20:52:26 +00:00
fusionate c026aab073
Device [Class]: Updates for PHP 8.1 2023-05-24 20:52:04 +00:00
frytimo c03ae6e098
Php 8.1 call forward fixes (#6716)
* various PHP 8.1 warning fixes

* various PHP 8.1 warning fixes and create class constants
2023-05-24 10:24:39 -06:00
markjcrane eafa89a624 Fixed require unique username globally or per domain 2023-05-24 10:13:49 -06:00
markjcrane e6a69de549 Send Presence to the for Agent ID 2023-05-23 22:27:58 -06:00
fusionate 7276160030
Time Conditions - Edit: Updates for PHP 8.1 2023-05-24 00:28:55 +00:00
fusionate 66a0d61ad6
Time Conditions - List: Updates for PHP 8.1 2023-05-24 00:28:35 +00:00
fusionate 85314b3a23
Time Conditions [Class]: Updates for PHP 8.1 2023-05-24 00:28:10 +00:00
fusionate a8adf18fcf
Dialplans - List: Include Time Conditions app_uuid. 2023-05-24 00:25:52 +00:00
fusionate ad95542c4c
Queue - Add: Updates for PHP 8.1 2023-05-23 23:56:52 +00:00
fusionate ac217f1209
Dialplans - XML: Fix Back button after XML save. 2023-05-23 23:56:30 +00:00
fusionate 9227344748
xml_cdr [Class]: Update for PHP 8.1 2023-05-23 20:20:40 +00:00
fusionate fcc9600f83
Dialplan - XML: Updates for PHP 8.1 2023-05-23 20:16:07 +00:00
markjcrane a650ca062a Add transcribe_enabled default false 2023-05-23 13:15:00 -06:00
fusionate cc5b2ba554
Group Permissions: Fix search, filter after submit and PHP 8.1 updates. 2023-05-23 18:53:50 +00:00
fusionate 2cf6e79c2e
Merge branch 'master' of https://github.com/fusionpbx/fusionpbx 2023-05-23 18:38:57 +00:00
markjcrane 2608f1ffad Return immediately if switch conf dir is empty 2023-05-23 08:22:23 -06:00
FusionPBX 63ccea687c
Add setting grandstream_public_mode 2023-05-22 21:58:46 -06:00
markjcrane dbb3e90ace Add smarty modifer in_array 2023-05-22 21:50:15 -06:00
markjcrane 3311363c27 Rename public_mode to grandstream_public_mode. 2023-05-22 21:08:18 -06:00
fusionate dfdcba5a0c
Database [Class]: Update for PHP 8.1 2023-05-23 02:42:19 +00:00
fusionate 18f9c7a26f
Functions: Update for PHP 8.1 2023-05-22 23:06:07 +00:00
fusionate d0481896ba
Destinations [Class]: Updates for PHP 8.1 2023-05-22 23:05:44 +00:00
fusionate a707462979
Destinations - Import: Updates for PHP 8.1 2023-05-22 23:05:25 +00:00
fusionate 9abea834b5
Destinations - Export: Updates for PHP 8.1 2023-05-22 23:05:10 +00:00
fusionate d0b6874f23
Destination - Edit: Updates for PHP 8.1 2023-05-22 23:04:46 +00:00
markjcrane 7ee2b7c4b3 Add parentheses to empty string detection 2023-05-22 16:26:01 -06:00
markjcrane a419fa985b Use isset when empty as it could be numeric. 2023-05-22 16:16:58 -06:00
markjcrane c045bb4705 Add a new fax user group 2023-05-22 10:45:01 -06:00
FusionPBX 54ce2b15c8
field name is singular domain_name 2023-05-21 17:13:11 -06:00
FusionPBX 044932163c
After removing natsort add order by domain name 2023-05-21 17:10:43 -06:00
FusionPBX e7730e9e69
Prevent overwriting variables 2023-05-21 16:52:14 -06:00
FusionPBX e0d8574410
Destinations - change negative condition to a positive one.
Usually best use positive conditions rather as they are easier to follow.
2023-05-21 16:19:54 -06:00
FusionPBX efc332aba7
[Bug FIX] Default Setings fix syntax to get the correct values switch settings. 2023-05-21 15:47:59 -06:00
FusionPBX c6e3fd381b
Update scripts dir session variable as it was not set in the install
This would break the install and prevent the scripts getting copied to the right location. That had a chain reaction of breaking multiple additional things.
2023-05-21 10:58:05 -06:00
fusionate 67e77560a6
Database [Class]: Updates for PHP 8.1 2023-05-21 01:13:45 +00:00
fusionate d8a6101460
Dialplan - Add: Updates for PHP 8.1 2023-05-20 23:58:13 +00:00
fusionate c9122ded11
Dialplan - Edit: Updates for PHP 8.1 2023-05-20 23:58:01 +00:00
fusionate dc613c7c44
Dialplans - List: Updates for PHP 8.1 2023-05-20 23:57:44 +00:00
fusionate b235f951a1
Dialplan [Class]: Updates for PHP 8.1 2023-05-20 23:57:27 +00:00
fusionate 878e83fc80
Database [Class]: Updates for PHP 8.1 2023-05-20 23:57:07 +00:00
chansizzle 8673208931
add info and question font awesome icons (#6706) 2023-05-20 14:15:09 -06:00
FusionPBX 6fc9312331
Deprecated natsort
One customer 3 domains were missing and after removing this the all domains showed up in the list. Also no longer needed as the front end for the domain list.
2023-05-19 19:07:56 -06:00
fusionate 04746d9e87
Bridge - Edit: Updates for PHP 8.1 2023-05-19 23:48:18 +00:00
fusionate 61bc6c2b5b
Bridges [Class]: Updates for PHP 8.1 2023-05-19 23:48:01 +00:00
fusionate 6311514ff6
Bridges - List: Updates for PHP 8.1 2023-05-19 23:47:47 +00:00
Finn 886c609a44
add a robots meta tag to reduce chances of private fusionpbx instances appearing in public Google search results (#6710) 2023-05-19 17:33:12 -06:00
Finn 75fff1c33a
add template variables to override DTMF method on certain grandstream devices (#6709) 2023-05-19 17:32:20 -06:00
Anthony d1960cc3e7
Update app_languages.php (#6707) 2023-05-19 16:50:36 -06:00
FusionPBX 3b53247dee
Use !isset instead of empty
Reason for this change is empty treats 0 as null.
2023-05-19 16:10:38 -06:00
FusionPBX 25fdc12f18
Strict identical condition required
Otherwise this condition matches a numeric value of 0.
2023-05-19 15:29:38 -06:00
Anthony 672dc9fa4d
Corrected translations (#6705)
* Update app_languages.php
2023-05-19 14:52:45 -06:00
Alex c6bf3f50f4
Fix translations (#6704)
* Update app_languages.php
2023-05-19 13:54:10 -06:00
FusionPBX 64a8254aa6
Search agent_id or agent_name to improve flexibility 2023-05-19 11:59:06 -06:00
Ben 9a44cd409e
fixed a few translations (#6703) 2023-05-19 10:36:17 -06:00
FusionPBX 8649db18d8
Fax Queue is enabled if the service is enabled
That means this setting is no longer needed.
2023-05-19 09:48:52 -06:00
FusionPBX 62b95fa690
Handle call center variables with a value of _undef_ 2023-05-18 23:41:21 -06:00
markjcrane cf580e6c8c Move failed call detail records to a failed directory 2023-05-18 17:44:36 -06:00
FusionPBX 778b5832be
database save method returns result details 2023-05-18 16:29:03 -06:00
Ben d900a7cffc
corrected translations (#6698) 2023-05-18 15:37:22 -06:00
Anthony 60adb692ec
Corrected translations & added missing translations in core/app_languages.php (#6701)
* Update app_languages.php
2023-05-18 15:36:59 -06:00
Alex 05063e35d2
Update translations (#6694)
* Update app_languages.php
2023-05-18 15:36:17 -06:00
fusionate f8a3d95e83
Upgrade [CLI]: Fix minor language file issue. 2023-05-18 20:25:18 +00:00
FusionPBX f09b7a699f
Update ivr_menus.php fix show all 2023-05-18 09:28:42 -06:00
markjcrane 9a97c44952 Fix the provision template list 2023-05-18 01:42:48 -06:00
markjcrane 0dec70827d Change approach for handling the user_uuid 2023-05-18 00:49:20 -06:00
markjcrane 5c7dfe339b Use the database to format the date time with the time zone 2023-05-17 20:41:52 -06:00
markjcrane f1ac3d92dd Destinations more minor changes 2023-05-17 16:32:05 -06:00
markjcrane 10a4ceae65 Default destination type to inbound. Use is_array where it is required 2023-05-17 16:03:36 -06:00
fusionate 74959e69c7
Extension - Import: Updates for PHP 8.1 2023-05-17 21:42:32 +00:00
fusionate 766cf7ef66
Extensions - Export: Updates for PHP 8.1 2023-05-17 21:06:22 +00:00
fusionate ca6ecc8548
Gateway - Edit: Updates for PHP 8.1 2023-05-17 21:01:43 +00:00
fusionate 662d6e71de
Gateways [Class]: Updates for PHP 8.1 2023-05-17 21:00:49 +00:00
fusionate c3018b6ae2
Upgrade (CLI): Update for PHP 8.1 2023-05-17 20:43:17 +00:00
fusionate 4bac37850a
Upgrade (GUI): Updates for PHP 8.1 2023-05-17 20:37:17 +00:00
fusionate 1618c84e07
Database [Class]: Fix typo. 2023-05-17 20:36:48 +00:00
fusionate c42fd0abdc
Menu [Class]: Updates for PHP 8.1 2023-05-17 20:36:14 +00:00
fusionate 9122baa9d7
Modules [Class]: Updates for PHP 8.1 2023-05-17 20:35:45 +00:00
fusionate 86a09e5635
Dialplan - Inbound: Updates for PHP 8.1 2023-05-17 20:35:25 +00:00
markjcrane af8a6991b1 Initialize the array if its empty 2023-05-17 14:18:46 -06:00
markjcrane 3fc342ad3e prevent an error using trim on a value that could a string or an array 2023-05-17 13:38:17 -06:00
markjcrane 6cbf572512 Remove fax_retry.lua supporting FAX Queue only 2023-05-17 12:37:31 -06:00
markjcrane 7d18e3eedc Destinations update for PHP 8.1 2023-05-17 11:31:53 -06:00
markjcrane 6d7e125743 Fix all PHP 8.1 messages for upgrade.php 2023-05-17 10:07:49 -06:00
fusionate 6816921f47
Extension - Edit: Updates for PHP 8.1 2023-05-17 07:02:45 +00:00
fusionate 603199f1d4
Extension [Class]: Updates for PHP 8.1 2023-05-17 07:02:26 +00:00
fusionate 3487b8ae53
persistformvar [Function]: Updates for PHP 8.1 2023-05-17 07:02:02 +00:00
fusionate d853209c3f
Token [Class]: Update for PHP 8.1 2023-05-17 07:00:45 +00:00
fusionate a26c953291
Voicemail [Class]: Updates for PHP 8.1 2023-05-17 06:59:40 +00:00
fusionate c6eba58cf7
Extensions - List: Updates for PHP 8.1 2023-05-17 05:26:08 +00:00
fusionate 4c50b6e83a
Extension [Class]: Updates for PHP 8.1 2023-05-17 05:25:48 +00:00
fusionate 31f4368851
User - Edit: Updates for PHP 8.1 2023-05-17 05:10:15 +00:00
markjcrane 2afda399e6 IVR Menu code changes for PHP 8.1 2023-05-16 22:55:19 -06:00
fusionate 8bd20b97cd
Users [Class]: Updates for PHP 8.1 2023-05-17 04:51:41 +00:00
fusionate d6306c7efd
User Settings - Edit: Updates for PHP 8.1 2023-05-17 04:44:43 +00:00
fusionate 1faddafbe1
User Settings [Class]: Updates for PHP 8.1 2023-05-17 04:44:19 +00:00
fusionate ea0c03c3ea
User - Edit: Clean up. 2023-05-17 04:43:23 +00:00
fusionate c2776e993f
User - Edit: Fix duplicate Language records and Time Zone being deleted. Also updates for PHP 8.1. 2023-05-17 04:05:52 +00:00
fusionate 9465e36b37
Dashboard - Edit: Updates for PHP 8.1 2023-05-17 00:00:40 +00:00
markjcrane 10c39f9bcb Code cleanup to solve a few minor issues 2023-05-16 16:14:39 -06:00
fusionate c827f6bf21
Message [Class] - Fix bug with messages set by static add method. 2023-05-16 21:00:43 +00:00
fusionate f74db00fb1
Dashboard - Edit: Updates for PHP 8.1 2023-05-16 20:51:02 +00:00
Luis Daniel Lucio Quiroz 3f544496b7
DB and protection (#6696)
so this small change has 2 purposes.
first, I found the hard way, that PHP PDO is not always coded with the same criteria between versions and databases.  While PDO PGSQL on PHP 8.x may work, PDO SQLITE on PHP 7.4 may not and so on.. This will make sure that the value there is an integer.

Second, since these two values are taken from the _GET, which is in the URL string, it will protect against "imaginative" users.
2023-05-16 13:05:07 -06:00
fusionate ab29d70f40
Dashboard - Updates for PHP 8.1 2023-05-16 18:55:10 +00:00
fusionate fac4b6bcd0
Token [Class] - Updates for PHP 8.1 2023-05-16 18:54:45 +00:00
fusionate bc34789bdc
Permission [Class] - Updates for PHP 8.1 2023-05-16 18:54:27 +00:00
fusionate 3dc38973e1
Authentication [Class] - Updates for PHP 8.1 2023-05-16 18:54:11 +00:00
fusionate f7951324ea
Domains [Class] - Updates for PHP 8.1 2023-05-16 18:42:32 +00:00
fusionate a87ae4794e
Permission [Class] - Updates for PHP 8.1 2023-05-16 18:41:34 +00:00
jonathanblack1000 70067117f5
Fix time zone setting for domain (#6695)
* Fix time zone setting for domain

Recent updates broke time zone setting for domain settings
2023-05-16 12:40:30 -06:00
fusionate 7d37d7a521
Require - Updates for PHP 8.1 2023-05-16 18:39:41 +00:00
fusionate 8482b6eb46
Footer - Updates for PHP 8.1 2023-05-16 18:39:29 +00:00
fusionate 47e0347195
Logout - Updates for PHP 8.1 2023-05-16 18:38:06 +00:00
markjcrane 155f15a407 Fix CDR paging and minor code changes 2023-05-16 10:07:32 -06:00
markjcrane 7aac235f14 Check if the digit isset and not an empty string. 2023-05-16 00:48:26 -06:00
markjcrane 3cf0334686 Check if the sounds directory exists 2023-05-16 00:36:27 -06:00
markjcrane 6fa40778f7 Need to use empty persistformvar 2023-05-16 00:08:07 -06:00
markjcrane 93b8c4a4f8 Update IVR Menu Edit 2023-05-15 23:51:18 -06:00
markjcrane 74b3ce154c Update file.php minor code improvements 2023-05-15 23:17:37 -06:00
markjcrane 0c585bcb07 IVR Menu fix some errors and prevent some warnings 2023-05-15 23:11:23 -06:00
markjcrane 78bb6ec80c Fix PHP 8.1 ringback errors 2023-05-15 22:53:00 -06:00
markjcrane c5f7e61c82 Update group files prevent null errors. 2023-05-15 22:38:46 -06:00
FusionPBX b8d03a0384
Add absolute_codec_string PCMU,PCMA 2023-05-15 12:11:40 -06:00
FusionPBX 200bd891f3
Update css.php fixed menu_main_background_color_hover 2023-05-13 22:42:43 -06:00
FusionPBX 64c159931c
Update database.php strlen replace with isset
Used isset instead of empty because empty treats a numeric value of 0 as empty.
2023-05-13 22:13:40 -06:00
FusionPBX 714add73fb
Update css.php favor empty function 2023-05-13 21:28:54 -06:00
FusionPBX 8a449172a0
Update gateway_edit.php 2023-05-13 20:52:18 -06:00
FusionPBX 059aea351e
Update gateway_edit.php for PHP 8.1 2023-05-13 20:50:06 -06:00
FusionPBX ce4de56b7c
Update gateways.php 2023-05-13 20:46:18 -06:00
FusionPBX 2e270b07f0
Update gateway_edit.php for PHP 8.1 2023-05-13 20:43:39 -06:00
FusionPBX aa52764215
Update gateways.php for PHP 8.1 2023-05-13 20:42:16 -06:00
FusionPBX 67e2d731b5
Update persist_form_var.php 2023-05-13 20:39:46 -06:00
FusionPBX a94c465759
Update gateways.php for php 8.1 2023-05-13 20:23:10 -06:00
FusionPBX 5755ae3f48
Update schema.php for PHP 8.1 2023-05-13 17:31:27 -06:00
FusionPBX 5a82d31502
Update user_setting_edit.php for PHP 8.1 2023-05-13 17:21:54 -06:00
FusionPBX ab2bd0ef5e
Update footer.php use the empty function 2023-05-13 17:20:17 -06:00
FusionPBX 01c3ed5c48
Update user_imports.php for php 8.1 2023-05-13 17:02:48 -06:00
FusionPBX 04dc606831
Update user_settings.php 2023-05-13 14:05:41 -06:00
FusionPBX 0035a93d60
Update users.php for PHP 8.1 2023-05-13 13:55:08 -06:00
FusionPBX 445b63ec3a
Update dialplan.php to prevent PHP 8.1 warnings 2023-05-13 12:55:33 -06:00
FusionPBX c63ab15768
Update app_defaults.php 2023-05-13 12:40:14 -06:00
FusionPBX 7a8b2b7d79
Update database.php prevent more php 8.1 warnings. 2023-05-13 12:35:17 -06:00
FusionPBX 0162ac42d8
Update domain_json prevent warnings for PHP 8.1 2023-05-13 12:33:21 -06:00
FusionPBX e7ed4fe568
Update domain_setting_edit with improved syntax 2023-05-13 12:13:38 -06:00
FusionPBX 0a37d8c8d5
Code in domain_settings evolving 2023-05-13 11:28:12 -06:00
FusionPBX f6a48235d2
Update domains for 8.1 support 2023-05-12 23:42:41 -06:00
FusionPBX ca43df30f2
Default Settings updated for PHP 8.1 2023-05-12 23:27:19 -06:00
fusionate 2bcfaf27f2
User - Edit: Updates for PHP 8.1 2023-05-13 04:55:04 +00:00
fusionate adfdb7bae5
Functions: Updates for PHP 8.1 2023-05-13 04:53:18 +00:00
fusionate 196125952b
Message [Class]: Updates for PHP 8.1 2023-05-13 04:52:43 +00:00
fusionate 2fbd1b238d
Dashboard: Updates for PHP 8.1 2023-05-13 04:51:15 +00:00
FusionPBX c1a979a643
dialplan: update for php 8.1 2023-05-12 21:21:32 -06:00
FusionPBX ff2c52eda8
Update domains.php 2023-05-12 20:32:44 -06:00
FusionPBX a4fddc7897
Update authentication.php 2023-05-12 20:30:17 -06:00
fusionate ecf60103a1
Template: Updates for PHP 8.1 2023-05-13 02:29:44 +00:00
FusionPBX 44a46d491b
Use !empty in the if statement 2023-05-12 20:24:39 -06:00
FusionPBX e9839e3b30
Refine the authentication ldap class 2023-05-12 19:34:05 -06:00
FusionPBX cd27922ce6
Refine the authentication email class 2023-05-12 19:33:14 -06:00
FusionPBX d9946b0207
Refine the authentication database class 2023-05-12 19:31:26 -06:00
FusionPBX ebf552e448
Refinements for the authentication class 2023-05-12 19:30:29 -06:00
FusionPBX 5c34c991cf
Update pdo.php 2023-05-12 18:34:54 -06:00
FusionPBX d10e8bfdd4
Update authentication.php 2023-05-12 17:03:02 -06:00
FusionPBX 3185ed5a92
PHP 8.1 changes 2023-05-12 16:57:07 -06:00
fusionate 11a49bfacd
Theme [CSS]: Updates for PHP 8.1 2023-05-12 22:50:24 +00:00
FusionPBX a2bb8e5f90
Limit subquery to one result
This prevent a cardinality error.
2023-05-12 16:22:50 -06:00
Anthony 237603dad0
Update app_languages.php (#6693) 2023-05-12 15:33:39 -06:00
Alex a46c5dbfc9
Update translations (#6688)
* Update app_languages.php
2023-05-12 15:14:59 -06:00
FusionPBX 590faa4e83
Set the export_format
To prevent null and prevent unintended behavior set an empty string to as the default export format.
2023-05-12 14:30:16 -06:00
frytimo 9dc8bcf7e9
Fix xml cdr for PHP 8.1 (#6692)
* fix multiple warnings

* fix multiple warnings

* ensure array key exists

* ensure array key exists

* assign boolean variable for showall in url

* change boolean to show_all instead of showall

* revert some changes. Create default leg value and mos_score

* validate page integer

* revert back to showall from get
2023-05-12 13:28:42 -06:00
FusionPBX 4f60390b34
Check if the tables_exists 2023-05-11 22:33:08 -06:00
FusionPBX 48fb933266
Remove static and use this. 2023-05-11 19:58:09 -06:00
FusionPBX 40d9121c8f
Convenient debug info for testing 2023-05-11 19:55:37 -06:00
Anthony ad06162b29
Update app_languages.php (#6690) 2023-05-11 19:13:55 -06:00
FusionPBX ffd9a2c4b5
[bug fix] get the domain from the username (#6691)
* [bug fix] get the domain from the username

When the URL domain doesn't match the user's domain

Authentication can use domain from the username.

username:
user@domain
2023-05-11 18:58:22 -06:00
fusionate 733b206664
Functions: Updates for PHP 8.1 2023-05-12 00:45:09 +00:00
fusionate 1986dc1ae7
Dashboard: Updates for PHP 8.1 2023-05-12 00:44:44 +00:00
Anthony beac6eedeb
Update app_languages.php (#6689)
* Update app_languages.php
2023-05-11 16:14:05 -06:00
FusionPBX a9baddb6e0
prevent domain_uuid nil error
If the domain_uuid is null then use a random uuid to prevent an error and allow domain_uuid is null SQL to still run
2023-05-11 13:23:13 -06:00
FusionPBX 2a3d9e8e3d
Fix the a mistake in the en-us translation 2023-05-11 11:51:55 -06:00
fusionate 5badf55c3c
Authentication [Class]: Updates for PHP 8.1 2023-05-11 13:40:17 +00:00
fusionate c01c2d7d31
Dashboard - Domain Limits: Updates for PHP 8.1 2023-05-11 13:39:40 +00:00
FusionPBX 5dae7314a1
Add project_path and login_destination_url 2023-05-10 23:11:36 -06:00
FusionPBX 663bcf929e
Add project_path and login_destination_url 2023-05-10 23:10:44 -06:00
FusionPBX cc77a060e1
Add project_path and login_destination_url 2023-05-10 23:09:43 -06:00
FusionPBX cb32d58f21
Add project_path and login_destination_url 2023-05-10 23:08:57 -06:00
FusionPBX 5cac8f61e7
Use empty and isset 2023-05-10 22:30:42 -06:00
FusionPBX eccae62149
Replace is_array with !empty 2023-05-10 22:25:10 -06:00
FusionPBX 020b1414aa
Use empty instead of is_array 2023-05-10 22:22:21 -06:00
FusionPBX 6f554eefa8
Use empty instead of strlen or is_array 2023-05-10 22:18:42 -06:00
FusionPBX 442147391c
Change the and to an or and add an isset 2023-05-10 22:11:01 -06:00
FusionPBX b86cd20e8e
Use isset instead of is_uuid 2023-05-10 22:01:12 -06:00
FusionPBX a9fbb07a55
Use isset and empty 2023-05-10 21:58:00 -06:00
FusionPBX 9902e823b9
Use empty function for the request username and key 2023-05-10 21:53:39 -06:00
Alex ac38507462
Update translations (#6682)
* Update translations

* Update app_menu.php

* Update app_languages.php
2023-05-10 18:20:44 -06:00
frytimo 872e676f59
Fix missing php tags (#6687)
* fix missing php tags

* fix missing php tags
2023-05-10 18:19:57 -06:00
fusionate dae1cc9909
Dashboard - Caller ID: Updates for PHP 8.1 2023-05-10 23:27:52 +00:00
fusionate 1b460941d5
Dashboard - Ring Group Forward: Updates for PHP 8.1 2023-05-10 23:25:22 +00:00
fusionate f5a508ed0b
Dashboard: Updates for PHP 8.1 2023-05-10 23:23:15 +00:00
fusionate 9ec44fed71
Dashboard - System Counts: Updates for PHP 8.1 2023-05-10 23:06:59 +00:00
fusionate c3e0a845d1
Dashboard - Call Forward: Updates for PHP 8.1 2023-05-10 23:05:51 +00:00
fusionate 26595860cc
Dashboard - Switch Status: Updates for PHP 8.1 2023-05-10 22:59:49 +00:00
fusionate e7b72de33c
Modal [Class]: Updates for PHP 8.1 2023-05-10 22:59:12 +00:00
fusionate 71b14727a7
Dashboard - System Status: Updates for PHP 8.1 2023-05-10 22:40:02 +00:00
fusionate 6d4463a5b7
Auto Loader [Class]: Updates for PHP 8.1 2023-05-10 22:39:48 +00:00
fusionate c894161060
Dashboard - System Status: Updates for PHP 8.1 2023-05-10 22:38:11 +00:00
fusionate 4de76b44f2
Auto Loader [Class]: Updates for PHP 8.1 2023-05-10 22:37:47 +00:00
fusionate 80ce576ea5
Dashboard - Missed Calls: Updates for PHP 8.1 2023-05-10 22:34:27 +00:00
fusionate c391faccfc
Dashboard - Recent Calls: Updates for PHP 8.1 2023-05-10 22:32:44 +00:00
fusionate 8f50a96d51
Dashboard - Voicemails: Updates for PHP 8.1 2023-05-10 22:27:19 +00:00
fusionate 198ee84d9a
Dashboard: Updates for PHP 8.1 2023-05-10 22:23:22 +00:00
fusionate 8021a71647
Menu [Class]: Updates for PHP 8.1 2023-05-10 22:17:19 +00:00
fusionate 43961ec6f2
Message [Class]: Update for PHP 8.1 2023-05-10 22:02:13 +00:00
fusionate bac9c83f33
Modal [Class]: Update for PHP 8.1 2023-05-10 21:58:51 +00:00
fusionate 46ff8cb278
Message [Class]: Update for PHP 8.1 2023-05-10 21:58:37 +00:00
FusionPBX 15e11da84b
Redirect to login
login.php has been deprecated.
2023-05-09 22:27:09 -06:00
FusionPBX 2d3f623174
Update for PHP 8.1 2023-05-09 18:50:06 -06:00
FusionPBX c57fa0fc39
Update for PHP 8.1 2023-05-09 18:39:24 -06:00
FusionPBX 32672b7472
Update for PHP 8.1 2023-05-09 17:11:55 -06:00
FusionPBX 821720db1d
Update for PHP 8.1 2023-05-09 17:06:19 -06:00
fusionate be4bf7fa7f
Bridges - List: Update for PHP 8.1 2023-05-09 22:52:32 +00:00
fusionate 5f2a3fde90
Button [Class]: Update for PHP 8.1 2023-05-09 22:52:04 +00:00
Ben 5811b3d377
Added traslations (#6685) 2023-05-09 14:48:32 -06:00
Ben 42936ca6fa
added translations (#6686) 2023-05-09 14:48:00 -06:00
Ben f28fa76890
added traslation for ro-ro and a few minor corrections (#6684) 2023-05-09 14:47:12 -06:00
Anthony 3404a997ac
Updating core/users/app_languages.php (#6683)
* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php
2023-05-09 13:19:10 -06:00
Ben 017c58e44c
added ro-ro translations (#6680) 2023-05-09 11:51:22 -06:00
Ben 0ed58954e3
Updated translations (#6681) 2023-05-09 11:50:58 -06:00
Alex 3e0ec8b752
Add missing translations (#6673) 2023-05-09 11:39:02 -06:00
FusionPBX 55dc76f099
Provide default values 2023-05-09 11:36:39 -06:00
FusionPBX b732c0afe9
[Bug] value of 0 treated as empty
When empty is used its treating 0 as an empty value and then the value is set to null.  Will work on the changes further to prevent this problem.
2023-05-09 11:14:41 -06:00
FusionPBX 13d73a33e2
If the group is null set to 0 2023-05-09 09:50:16 -06:00
FusionPBX 43d33fb121
Remove smarty php cache 2023-05-09 09:13:40 -06:00
Ben 0880485e73
added translation (#6678) 2023-05-09 08:44:41 -06:00
FusionPBX bc0c2ea588
$db variable needed by schema class 2023-05-09 08:39:42 -06:00
FusionPBX 89af27e94e
Update button.php 2023-05-08 23:03:00 -06:00
FusionPBX 06bbdec276
Update for PHP 8.1 2023-05-08 22:55:00 -06:00
FusionPBX 9e4e8558e5
Remove debug 2023-05-08 22:30:39 -06:00
Ben 651c8ba971
updated translations (#6679) 2023-05-08 19:11:11 -06:00
FusionPBX fd0615587e
Update require.php 2023-05-08 19:02:58 -06:00
FusionPBX 0413b998e8
Ensure PROJECT_ROOT is defined 2023-05-08 18:50:32 -06:00
FusionPBX edb12399ce
Add not empty debug 2023-05-08 17:21:52 -06:00
Anthony 1c6c542d15
Update app_languages.php (#6676)
* Update app_languages.php

* Update app_languages.php
2023-05-08 16:30:50 -06:00
Ben e69a509b9d
Added translations (#6677) 2023-05-08 16:30:15 -06:00
FusionPBX 26e3a0881d
Error reporting for user hide deprecated 2023-05-08 15:07:59 -06:00
FusionPBX a1cea6bf56
Set dialplan_continue false 2023-05-08 14:36:35 -06:00
FusionPBX 46e3c9dc48
Upgrade: Fix PHP 8.x issue 2023-05-08 14:22:48 -06:00
FusionPBX 2c9f6a157a
Enable database authentication by default
If no authentication settings are enabled it also defaults to database authentication.
2023-05-08 12:10:44 -06:00
Anthony cb30f00513
Update app_languages.php (#6674) 2023-05-08 11:52:46 -06:00
Anthony 600c2b3a7e
Update app_languages.php (#6675) 2023-05-08 11:52:20 -06:00
markjcrane 423606631b Update version of smarty to 4.3.1 2023-05-08 09:50:42 -06:00
fusionate 28e6cb9b48
Upgrade: Fix PHP 8.x issue on str_replace function in app_defaults.php. 2023-05-08 13:24:29 +00:00
fusionate decebec7db
Call Centers: Fix PHP 8.x issue on explode function in app_defaults.php. 2023-05-08 13:23:07 +00:00
fusionate 8ddbe07d3d
PDO: Fix PHP 8.x issue on explode function. 2023-05-08 13:21:10 +00:00
fusionate 2047921cde
Dashboard - Switch Status: Fix Registrations count error when no registrations. 2023-05-08 13:12:20 +00:00
FusionPBX b9670cf385
Correct the dialplan detail order
The difference between a 1 and a 0 can sometimes be amazing.
2023-05-06 21:00:48 -06:00
FusionPBX eb84bf476b
Add hangup_after_bridge and continue_on_fail
Add both of these variables when using destination bridge application.
2023-05-06 20:38:01 -06:00
FusionPBX d9cc3314d3
Add favicon (#6671)
* Add favicon

* Update totp_secret.htm

* Update totp.htm

* Update login.htm

* Update email.htm

* Update totp.php

* Update ldap.php

* Update email.php

* Update database.php
2023-05-06 18:31:48 -06:00
FusionPBX a866875383
Allow login with email authentication 2023-05-06 14:45:25 -06:00
FusionPBX 3aa5024cb2
Allow login with email authentication 2023-05-06 14:44:30 -06:00
FusionPBX eeef486384
Allow login with email authentication 2023-05-06 14:43:20 -06:00
FusionPBX 0757c79271
Allow login with user email. 2023-05-06 14:40:21 -06:00
Alex 09d953c4dd
Update app_languages.php (#6668) 2023-05-06 13:13:11 -06:00
FusionPBX 2bc91f2612
Auto create TOTP secret (#6670)
* Auto create TOTP secret

Auto create TOTP secret after successful database authentication when the TOTP secret has not been set.
2023-05-06 12:24:26 -06:00
Anthony fddafec0b6
Update app_languages.php (#6667) 2023-05-05 16:01:00 -06:00
Alex 10a2d87ee6
Add missing translations (#6662)
* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php

* Update app_languages.php
2023-05-05 15:22:22 -06:00
Anthony e37b930b07
Update app_languages.php (#6666) 2023-05-05 15:21:50 -06:00
FusionPBX 0038395009
If numeric then don't need to escape
Numeric should be safe as a pass thru.
2023-05-05 13:23:44 -06:00
FusionPBX b40005c11e
Account for numbers 2023-05-05 13:18:15 -06:00
jonathanblack1000 0f3b212586
Fix sort on call broadcast display (#6663)
* Fix sort on call broadcast display

* Grandstream Template Updates

For grp/gxp, added settings for intercom auto answer and multicast paging
For gxw42xx - Added off-hook auto-dial settings to all lines
For wp820 - Fixed incorrect P-codes and added setings for wifi roaming
Contributed new template for gxv3480
2023-05-05 11:23:41 -06:00
fusionate 8614f617a2
Undo: Gateways: Convert State to string to escape function. 2023-05-05 17:02:24 +00:00
fusionate f29a78a6af
Functions: Adjust escape function to handle non-strings (XML objects). 2023-05-05 17:00:39 +00:00
fusionate 6e7c50cba5
Gateways: Convert State to string to escape function. 2023-05-05 16:50:57 +00:00
frytimo fef8165be2
Frytimo pr patches for php8.1 (#6630)
* Passing null to parameter #2 ($string) of type string is deprecated

* Passing null to parameter #1 ($string) of type string is deprecated

* php 8.1 fixes

* php 8.1 fixes - replace strlen($var) > 0 with !empty($var)

* php 8.1 fixes - replace ${var} with {$var}

* php 8.1 fixes - replace ${var} with {$var}

* php 8.1 fixes - replace ${var} with {$var}

* php 8.1 fixes - replace ${var} with {$var}

* php 8.1 fixes - strlower with null

* php 8.1 fixes - strreplace with null

* php 8.1 fixes - passing null to base64_decode

* php 8.1 fixes - check for false and check for null on $this->dir

* php 8.1 fixes - remove assignment of $db variable to modules object

* php 8.1 fixes - avoid sending null to substr

* php 8.1 fixes - change ${var} to {$var}

* php 8.1 fixes - check for null before preg_replace

* php 8.1 fixes - remove setting db variable on domains object

* php 8.1 fixes - set empty string if $row['domain_setting_subcategory'] is null

* php 8.1 fixes - set empty string if $_REQUEST['show'] is not available

* php 8.1 fixes

* php 8.1 fixes - correct $_POST checking syntax

* php 8.1 fixes - correct $_POST variables

* php 8.1 fixes

* Use brackets consistently

* Update user_setting_edit.php

* Change to not empty

* Update device.php

* Update text.php

---------

Co-authored-by: Tim Fry <tim@voipstratus.com>
Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-05-05 10:46:37 -06:00
FusionPBX ebbb2f1a72
Add additional languages 2023-05-03 22:50:18 -06:00
FusionPBX 93d1e1259a
Call broadcast minor update 1.1 2023-05-03 17:42:55 -06:00
FusionPBX 37cbb7e847
Update call_broadcast_edit.php 2023-05-03 17:40:40 -06:00
FusionPBX 33fd5e8fa3
Change to Phone Numbers 2023-05-03 17:33:29 -06:00
FusionPBX 7f37607b4e
Update the permissions 2023-05-03 17:29:47 -06:00
FusionPBX 712018cb19
Use the permissions when saving data 2023-05-03 17:28:19 -06:00
frytimo 37646c0893
Frytimo pr remove unused variables and fix clobbering (#6656)
* config->exists returns true or false but no action taken and variable
is unused

* remove unused variable db_type

* remove unused variable db_name

* remove unused variable db_username

* remove unused variable db_password

* remove unused variable db_secure

* remove unused variable db_cert_authority

* remove unused variable db_host

* remove unused variable db_path

* remove unused variable db_port

* remove unused variable db. The upgrade method never uses the db variable
and instead uses a new database connection each time.

* remove uninitialized parameters variable

* domain_count never used

* variable context is never used in the method or any app_defaults

* variable $row is clobbered by inner foreach loop

* variable domain_name is never used in method scope

* variable domain_array seems to be uninitialized in this scope so set an
empty string value so function lower_case is not receiving null.
2023-05-03 14:41:39 -06:00
FusionPBX 82810fbcb3
Re-add missing icon and order 2023-05-03 14:25:49 -06:00
Ben 9119a1bd65
Added languages and translations Turkish, Greek, English-GB (#6650)
* Added languages and translations Turkish, Greek, English-GB
2023-05-03 13:50:53 -06:00
jonathanblack1000 824f4257e0
Fix Call Broadcast file upload (#6661)
Fixed file import. Previously would import with \n separator instead of \r\n (in PHP 7.1), which breaks dialing.
2023-05-03 13:10:36 -06:00
FusionPBX bc255fba73
Update Arabic translation for email queue 2023-05-03 12:52:47 -06:00
markjcrane 14f6dee027 Add additional translations 2023-05-03 12:49:04 -06:00
frytimo a258a067a5
restore any missing default groups when permissions are restored (#6657) 2023-05-03 11:35:59 -06:00
Ben a802e275f6
Addedlanguages and translations for Turkish, German-CH (#6651)
Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-05-03 11:27:35 -06:00
Ben 719163331a
added German-ch and Turkish language and translations (#6652)
Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-05-03 11:13:35 -06:00
frytimo 1c6c903709
Frytimo pr fix headers already sent (#6655)
* remove space causing headers already sent

* remove space causing headers already sent
2023-05-03 11:10:17 -06:00
Anthony c742f4e03e
Update app_menu.php (#6660)
* Update app_menu.php
2023-05-03 11:05:26 -06:00
Anthony 6c8c6085cb
Update app_menu.php (#6659)
* Update app_menu.php
2023-05-03 11:00:35 -06:00
Alex 19963168d3
Update app_menu.php (#6658)
* Update app_menu.php

* Update app_menu.php
2023-05-03 10:56:54 -06:00
markjcrane 1513bd3301 Add Chinese, Korean, and Japanese translations 2023-05-03 10:36:25 -06:00
markjcrane 28fe89066e Add Chinese, Korean, and Japanese translations 2023-05-02 22:05:16 -06:00
markjcrane 381b3bdd9f Add menu translations 2023-05-02 20:30:13 -06:00
markjcrane 41e87e7f01 Add additional languages 2023-05-02 20:22:44 -06:00
FusionPBX 5a3b35cb83
Add additional languages (#6654) 2023-05-02 16:12:06 -06:00
Ben 2d592027fb
Added Turkish and Greman-ch language (#6653) 2023-05-02 16:11:19 -06:00
Ben 4c01af52f0
Added Greek and Turkish language and translations (#6649) 2023-05-02 12:05:56 -06:00
FusionPBX f313d06bdd
Add additional translations 2023-05-01 21:25:25 -06:00
FusionPBX f12384b282
Add additional translations 2023-05-01 21:16:25 -06:00
FusionPBX 4051b1d4e0
Add additional translations 2023-05-01 21:05:56 -06:00
FusionPBX ad6c7415a6
Add additional languages 2023-05-01 21:03:56 -06:00
FusionPBX dc7d596ace
Add additional translations 2023-05-01 21:02:16 -06:00
FusionPBX 915b8d3fe6
Minor update to be more consistent 2023-05-01 20:57:21 -06:00
FusionPBX afe9a412c6
Add additional languages 2023-05-01 20:54:22 -06:00
FusionPBX bc4ed0c8c1
Add additional languages 2023-05-01 20:51:40 -06:00
FusionPBX 30758cfd4c
Add missing languages 2023-05-01 20:48:35 -06:00
FusionPBX f61ee80185
call_direction dialplan add condition
Don't update the call_direction if already set to inbound.
2023-05-01 10:37:54 -06:00
FusionPBX 501e13eaee
Update missing translations. 2023-04-30 22:02:16 -06:00
FusionPBX 5203eae005
Add missing translations 2023-04-30 22:00:36 -06:00
FusionPBX 3a2dcc23e1
Add missing languages. 2023-04-30 21:58:54 -06:00
FusionPBX 0bb2443dc0
Add Asia/Tel_Aviv and Asia/Jerusalem to IDT-3 2023-04-30 15:41:59 -06:00
FusionPBX 4c0f1ce46f
Update Asia/Jerusalem from IDDT to IDT 2023-04-30 15:15:39 -06:00
FusionPBX 2f7cb99e00
Add missing languages 2023-04-30 00:23:41 -06:00
FusionPBX 66322d63d9
Update app_languages.php 2023-04-30 00:10:36 -06:00
FusionPBX a384772c07
Update app_languages.php 2023-04-30 00:08:33 -06:00
FusionPBX 5b9e9f54a8
Add missing languages 2023-04-29 23:51:25 -06:00
FusionPBX 55313a34a0
Add missing translations 2023-04-29 23:47:52 -06:00
FusionPBX 651f6dda3b
Update app_languages.php 2023-04-29 23:44:33 -06:00
FusionPBX 532ad89330
Update app_languages.php 2023-04-29 23:41:22 -06:00
FusionPBX ee10e9c23a
Fix Ukranian translations 2023-04-29 23:35:26 -06:00
FusionPBX a1167b8f11
Update app_languages.php 2023-04-29 23:32:24 -06:00
FusionPBX acf05f470a
Remove broken language characters 2023-04-29 21:45:54 -06:00
Krushali Shah 1f302c903f
enable/disable codec settings for all accounts (#6628)
The template for codec enable settings was taking a value as 1 if it was set in the settings. It was not taking the actual value inside it. So I have edited the templates to check the value if it's set to true.
2023-04-29 20:32:04 -06:00
lyleatFusionPBX ff944683b8
Update app_menu.php (#6646) 2023-04-29 18:29:31 -06:00
Anthony 610edaae60
Update app_languages.php (#6640) 2023-04-29 18:26:50 -06:00
fusionate 4c36b41313
Streams: Add missing language translations. 2023-04-29 03:20:04 +00:00
fusionate 365d5ee316
Switch: Add missing language translations. 2023-04-29 01:24:37 +00:00
fusionate 74a7d3b612
System: Add missing language translations. 2023-04-29 01:14:09 +00:00
lyleatFusionPBX 68ebe39481
Update app_menu.php (#6645) 2023-04-28 18:18:54 -06:00
Ben 793940f525
added translations (#6644) 2023-04-28 17:20:59 -06:00
fusionate cea439d213
Time Conditions: Add missing language translations. 2023-04-28 23:14:41 +00:00
Alex ce540fe25b
Add missing translations (#6635)
* Update app_languages.php

* Update app_languages.php
2023-04-28 16:11:53 -06:00
Ben de791a2201
Added translations (#6641) 2023-04-28 16:10:31 -06:00
Ben c253e8e975
added translations (#6642) 2023-04-28 16:10:03 -06:00
Ben f4e9069cec
added translations (#6643) 2023-04-28 16:09:44 -06:00
Ben 18ff648488
Added translations and Greek (#6638) 2023-04-28 12:03:32 -06:00
Ben 6d05163a21
Added translations and Greek (#6639) 2023-04-28 12:03:06 -06:00
Harry Foster 83af204be1
Honor the default settings for password complexity and strength when copying extensions (#6632) 2023-04-28 11:21:35 -06:00
Ben 3210441627
Added traslations and Greek (#6637) 2023-04-28 11:19:38 -06:00
Ben a86ef65e76
added translations (#6636) 2023-04-28 11:19:08 -06:00
Ben 0b3cc45032
Filled in traslations (#6634) 2023-04-28 11:17:29 -06:00
frytimo 675ace1d9a
Fix the quotes in language file (#6633)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2023-04-28 08:26:02 -06:00
frytimo 69bd42af05
remove unneeded destruct methods as GC has higher performance (#6631)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2023-04-27 20:18:53 -06:00
Alex c0443e4da9
Add missing translations (#6629)
* Add missing translations

* Update app_languages.php
2023-04-27 20:15:26 -06:00
fusionate 4a67359a78
Domain Settings: Implement ability to Duplicate settings. 2023-04-27 21:04:35 +00:00
fusionate 3711bf3664
Default Settings: Minor adjustment to Copy domain select box default. 2023-04-27 21:02:26 +00:00
fusionate b6950a4083
Default Settings: Fix missing Enabled value when duplicating disabled setting(s). 2023-04-27 20:22:30 +00:00
FusionPBX 5cfdccdc2a
[bug] base32 encoded TOTP secret
Some applications rejected the TOTP secret. Use the Base2n class to create a better base32 encoded TOTP secret.
2023-04-27 01:14:06 -06:00
FusionPBX b3a0d67ac9
FusionPBX version 5.1.0 RC1 2023-04-26 22:45:01 -06:00
chansizzle 414829383c
Add fax_download_view permission (#6605)
* Add fax_download_view permission

Add fax_download_view permission to allow hiding the "File Name (Download)" column on Fax Inbox and Fax Sent pages. Some users prefer hiding this field as they also have the "View" column that they can click on to view and download PDFs of the faxes.
2023-04-26 21:47:45 -06:00
Alex e40749a18b
Add missing translations (#6619)
* Update app_languages.php
2023-04-26 21:08:48 -06:00
Finn ae7c57eb45
Add support for XMLApp to grp2615 provisioning template (#6623)
Co-authored-by: Finn <finn@acceleratenetworks.com>
2023-04-26 20:44:09 -06:00
frytimo 81d3adbd35
cast string to float for memory usage shell_exec call (#6626)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2023-04-26 20:26:53 -06:00
Ben a9908cb745
Added translations (#6622) 2023-04-26 19:31:20 -06:00
fusionate 333e989221
Tones: Add missing language translations. 2023-04-26 23:12:01 +00:00
fusionate 96d64a0b21
Variables: Add missing language translations. 2023-04-26 23:10:09 +00:00
fusionate 0dcc3892da
Voicemail Greetings: Add missing language translations. 2023-04-26 22:46:34 +00:00
fusionate c8b5b58320
Voicemails: Add missing language translations. 2023-04-26 22:36:20 +00:00
fusionate dc327aec6d
CDR: Add missing language translations. 2023-04-26 21:55:55 +00:00
Ben 2e50454e1c
added languages (#6618) 2023-04-26 15:08:58 -06:00
Ben 3cc543c1e5
added translations (#6621) 2023-04-26 15:08:33 -06:00
FusionPBX 019ca725d8
Remove the seed for srand it is done automatically 2023-04-26 13:40:05 -06:00
FusionPBX 4433737c43
Removed quotes
The quotes are optional and looks a little nicer so they have been removed.
2023-04-26 11:46:53 -06:00
FusionPBX 2973ca1e4d
[bug] after moving sanitize remove the original one 2023-04-26 11:28:55 -06:00
FusionPBX b4ccdd244b
[bug] error reporting options user, dev, all (#6616)
An enhancement that adds simple options to show what errors to show in the web interface. This also fixes a bug that causes an error in PHP8.
2023-04-26 11:19:45 -06:00
FusionPBX 4859282306
[bug] Allow specific safe variables
This is a bug fix for recent security changes. These particular variables are essential to the SIP profile: record-template.
2023-04-26 10:20:13 -06:00
FusionPBX 4a71d7a49a
Add sound_prefix variables 2023-04-25 11:24:17 -06:00
FusionPBX c1f81c963f
When language is selected add sound_prefix 2023-04-25 11:10:18 -06:00
FusionPBX 9800311adb
Add a more flexible footer value 2023-04-25 01:25:59 -06:00
Luis Daniel Lucio Quiroz 0c28221ae2
Fix adding Faxes (#6614)
$fax_email_outbound_authorized_senders is only filled when fax_extension_advanced permission is set. However, the edit part doesn't verify that sizeof(NULL) creates a fatal error.

Fatal error: Uncaught TypeError: sizeof(): Argument #1 ($value) must be of type Countable|array, null given in /var/www/fusionpbx/app/fax/fax_edit.php:286 Stack trace: #0 {main} thrown in /var/www/fusionpbx/app/fax/fax_edit.php on line 286

This patch verifies that $fax_email_outbound_authorized_senders is an array before sizeof() evaluates it. You can now add faxes with the fax_extension_advanced disabled.
2023-04-24 21:06:58 -06:00
Mendel 2edfb9a0c2
Update Yealink variables w70b (#6615)
* Update {$mac}.cfg
2023-04-24 21:04:37 -06:00
FusionPBX 225870213b
Change the fax dialplan order
Change to 40 is in case people use a fax number that conflicts with outbound routes
2023-04-24 11:58:52 -06:00
FusionPBX d11d4b167d
Add option to get the version number 2023-04-24 09:45:48 -06:00
FusionPBX 1b025e0aa2
Update class name FixedBitNotation to base2n 2023-04-23 02:31:44 -06:00
FusionPBX 3c2c1f01f2
Add setup, disable and hide 2023-04-23 01:43:15 -06:00
FusionPBX c270aed781
Add language values for user totp 2023-04-23 01:38:17 -06:00
FusionPBX 0295c17393
Add field user_totp_secret 2023-04-23 01:28:45 -06:00
FusionPBX e405e375f6
Add totp and enhance api key 2023-04-23 01:26:51 -06:00
FusionPBX 81f42a4148
Use the google_authenticator php class 2023-04-23 01:17:22 -06:00
FusionPBX b6542299ba
Center the authentication_code 2023-04-23 01:13:55 -06:00
FusionPBX 1058c1bc87
Add google_authenticator PHP class
This class is licensed under Apache version 2.0
2023-04-23 01:11:52 -06:00
FusionPBX 869a1e1350
Create base2n.php
Add an MIT binary to text PHP class
2023-04-23 01:05:46 -06:00
FusionPBX 600d5db942
Use enabled for extensions and domain_enabled for domains 2023-04-21 18:07:45 -06:00
FusionPBX 18430f2abe
Change Access Control from domains to providers. 2023-04-21 17:43:34 -06:00
FusionPBX 8e04ade980
Update the polycom digitmap 2023-04-21 12:32:16 -06:00
FusionPBX 929ac552ea
Depreaced node_domain
This is handled automatically to make it easier and prevent mistakes
2023-04-21 09:58:08 -06:00
FusionPBX 4718999c9e
Remove access_control_nodes node_domain
This is handled automatically to make it easier and prevent mistakes
2023-04-21 09:56:37 -06:00
FusionPBX 121ffe5d3f
Remove access_control_nodes node_domain
This is handled automatically to make it easier and prevent mistakes
2023-04-21 09:55:04 -06:00
fusionate 11e01e416d
Email Templates: Add Category filter. 2023-04-21 14:03:14 +00:00
FusionPBX 7c10962a5f
Add domains automatically to the acl 2023-04-20 23:42:27 -06:00
FusionPBX bba5b22d77
Change talking_clock_date to a global dialplan 2023-04-20 21:12:31 -06:00
FusionPBX 9b7ab3d204
Update 350_please_hold.xml 2023-04-20 21:11:38 -06:00
FusionPBX 840d2dcd31
Change please_hold to a global dialplan 2023-04-20 21:11:05 -06:00
FusionPBX 3771e7af13
Change is_transfer to a global dialplan 2023-04-20 21:09:28 -06:00
FusionPBX 559a963a87
Change cf to a global dialplan 2023-04-20 21:07:02 -06:00
FusionPBX b0f51ebfcd
Change att_xfer to a global dialplan 2023-04-20 21:05:37 -06:00
FusionPBX 9b4c6c2e7e
Change dx to a global dialplan 2023-04-20 21:03:33 -06:00
FusionPBX 3909f12992
Change call_return to a global dialplan 2023-04-20 21:01:14 -06:00
FusionPBX a8eebe9da6
Make redial a global dialplan 2023-04-20 20:57:01 -06:00
FusionPBX ff958a8c96
Make directory dialplan global 2023-04-20 20:52:39 -06:00
FusionPBX c65b316217
Change to global 2023-04-20 20:47:41 -06:00
FusionPBX 98180d0ea2
Delete 410_freeswitch_conference.xml 2023-04-20 20:35:07 -06:00
FusionPBX d906b8e60d
Add a missing required bracket 2023-04-20 16:00:23 -06:00
fusionate c705e8712c
Dialplan Manager: Add Context filter to search form. 2023-04-20 21:02:49 +00:00
FusionPBX 8dbd85484e
xml.santize allow required variables 2023-04-20 14:20:14 -06:00
FusionPBX c989649176
Make call_privacy dialplan global 2023-04-19 23:50:41 -06:00
FusionPBX 2eea25e108
Make follow-me dialplan global 2023-04-19 23:32:06 -06:00
FusionPBX d4ab968fe2
Update 200_agent_status.xml 2023-04-19 23:22:02 -06:00
FusionPBX 15dae6e74a
Update 210_agent_status_id.xml 2023-04-19 23:21:36 -06:00
FusionPBX f8b3649f1b
Update 215_agent_status_break.xml 2023-04-19 23:21:05 -06:00
FusionPBX 9cf9d4c332
Update 370_is_secure.xml 2023-04-19 23:09:50 -06:00
FusionPBX b8816c4089
Update 370_tone_stream.xml 2023-04-19 23:08:58 -06:00
FusionPBX 7d58793a37
Update 360_milliwatt.xml 2023-04-19 23:08:14 -06:00
FusionPBX e6acab33ae
Update 360_is_zrtp_secure.xml 2023-04-19 23:07:09 -06:00
FusionPBX 4ac9b4ea2c
Update 490_do-not-disturb.xml 2023-04-19 23:04:46 -06:00
FusionPBX cb3f458d4e
Update 500_call-forward.xml 2023-04-19 23:04:25 -06:00
FusionPBX f51f48646a
Make vmain a global dialplan 2023-04-19 22:56:40 -06:00
FusionPBX d5a28f3d91
Make xfer_vm a global dialplan 2023-04-19 22:56:22 -06:00
FusionPBX d29bc2987c
Make vmain_user a global dialplan 2023-04-19 22:55:50 -06:00
FusionPBX c6d9b31498
Make echo a global dialplan 2023-04-19 22:55:28 -06:00
FusionPBX 50749f5374
Make delay_echo a global dialplan 2023-04-19 22:55:06 -06:00
FusionPBX 2313d45752
Make hold_music a global dialplan 2023-04-19 22:54:30 -06:00
FusionPBX cb85b66b16
Dialplan send_to_voicemail use global context 2023-04-19 22:46:35 -06:00
FusionPBX 28d323617a
Dialplan caller-details use global context 2023-04-19 22:40:06 -06:00
fusionate 18225f82f2
Email Class: Fix typo that effects embedded base64 image attachments. 2023-04-20 01:33:22 +00:00
fusionate f5f6b33676
Dashboard: Change Contract All button label to Collapse All 2023-04-19 22:24:23 +00:00
FusionPBX cd044b35aa
Change uuid to app_uuid 2023-04-19 10:38:38 -06:00
FusionPBX ad715d7fbb
Update 130_distinctive-ring-local.xml 2023-04-19 10:35:13 -06:00
FusionPBX d674d67143
Add dialplan distinctive-ring-local 2023-04-19 10:31:25 -06:00
FusionPBX 44961e6acb
Make call-direction a global dialplan 2023-04-19 09:59:33 -06:00
Norman King 30db2c5a6b
remove incorrect whitespace for line_3_hanging_group_mode var (#6612) 2023-04-18 15:40:35 -06:00
Alex 3b2f66a3b8
Update contact qr code (#6613) 2023-04-18 15:39:46 -06:00
FusionPBX 6f489f0cf3
Remove unset removes the session settings 2023-04-18 11:28:24 -06:00
FusionPBX fd20067433
Remove unused login_destination_url 2023-04-18 09:41:25 -06:00
FusionPBX e336cb6999
Remove destination url 2023-04-18 09:40:33 -06:00
FusionPBX a9dc2ec479
Add login form to ldap 2023-04-18 09:36:09 -06:00
FusionPBX 33de786791
Add the logo soure, width and height 2023-04-18 09:23:04 -06:00
FusionPBX 1cebbb7c45
If set use the SESSION username 2023-04-17 22:15:02 -06:00
FusionPBX edb65edeec
Update app_config.php 2023-04-17 16:30:35 -06:00
FusionPBX 8498d3edb6
Add default settings authentication methods 2023-04-17 16:04:13 -06:00
FusionPBX 30e75b1288
After sanitize allow ${accountcode} 2023-04-17 15:12:43 -06:00
FusionPBX ca0f5d5363
Use and set the SESSION username 2023-04-17 11:30:27 -06:00
FusionPBX 6bdab612b5
Use the session username when it is set 2023-04-17 11:22:27 -06:00
Antonio Fernandez 6a556e55ad
Fixing Yealink T46s codecs in template (#6611) 2023-04-17 11:13:07 -06:00
markjcrane 00801b5b04 Add mutli-factor authentication. 2023-04-16 01:10:39 -06:00
FusionPBX 74f6630df4
Add a comment for the xml library 2023-04-14 22:33:32 -06:00
FusionPBX 61469d8cb9
Add the xml library description 2023-04-14 22:31:13 -06:00
FusionPBX 94288b7e96
Add a description 2023-04-14 22:29:11 -06:00
FusionPBX 050e242a13
Context tag deprecated use context attribute 2023-04-14 15:08:16 -06:00
FusionPBX 3bd64de10b
Context tag deprecated use context attribute 2023-04-14 15:07:11 -06:00
FusionPBX 4d3f2e1e0b
Add a shutdown function fax send 2023-04-14 12:24:24 -06:00
fusionate 8a3ea373f6
Fax Queue - List: Apply case to Status filter select options, minor layout adjustment. 2023-04-13 21:20:21 +00:00
fusionate f181f533ae
Email Queue - List: Apply case to Status filter select options. 2023-04-13 21:19:39 +00:00
fusionate 00fc9c0dda
Email Queue - List: Responsive optimizations. 2023-04-13 21:04:26 +00:00
fusionate 1f7f047d58
Fax Queue - List: Responsive optimizations. 2023-04-13 21:04:09 +00:00
fusionate 53acce3369
Fax Queue - List: Apply case to Status column value. 2023-04-13 20:44:16 +00:00
fusionate 757fd38c51
Email Queue - List: Apply case to Status column value. 2023-04-13 20:43:58 +00:00
fusionate 076b69ae93
Email Queue - Edit: Format mutliple To addresses better, Status to select field. 2023-04-13 20:32:54 +00:00
fusionate 9a9cff7ebd
Email Queue - List: Truncate long To address values with ellipsis. 2023-04-13 20:32:10 +00:00
fusionate 0356d3ea7e
Fax Queue - Edit: Change Status field to select box. 2023-04-13 20:31:13 +00:00
fusionate 3d593b35d1
Theme: Remove width limit on textarea. 2023-04-13 20:30:28 +00:00
fusionate c4ca3313fe
Email Queue - List: Limit width of To column. 2023-04-13 18:56:14 +00:00
FusionPBX 2582720028
Add permission domain_select 2023-04-12 18:35:32 -06:00
fusionate 19e58af546
Email Queue Attachments - Add CID and Mime Type fields. 2023-04-12 20:06:41 +00:00
markjcrane 2d2c5fc06e Add email attachment cid and mime type 2023-04-12 14:04:56 -06:00
fusionate a5d2558112
Fax Queue - Added new Sending status to select filter. 2023-04-11 20:25:53 +00:00
FusionPBX d662a641e6
Add fax_status sending
While in sending mode it will not send again. The fax hangup hook will update the status to trying again if the fax fails or is set to failed if it reaches max tries.
2023-04-11 14:01:54 -06:00
FusionPBX 00364f318c
Create MN_Generic.cfg 2023-04-11 09:39:20 -06:00
FusionPBX 064bf7204a
Update MN_{$mac}.cfg 2023-04-11 09:38:16 -06:00
FusionPBX 67f3bc6808
Add Mitel 5330e 2023-04-11 09:38:04 -06:00
FusionPBX 81f3bdffc9
snom_dialtone_on_hold default to false 2023-04-11 09:34:46 -06:00
FusionPBX 5eca8b1ade
snom_dialtone_on_hold default to false 2023-04-11 09:33:23 -06:00
FusionPBX d8634b1fc2
Add default setting snom_dialtone_on_hold
Hold usually should not automatically go to dial tone. Unexpected behavior as most phones don't do this.
2023-04-11 09:31:44 -06:00
FusionPBX dbeb793710
Get the destination_number when needed
If the user doesn't have permission to set the destination_number then get it from the database
2023-04-10 12:09:14 -06:00
emak 800e742387
Disable fax sending when domain is disabled (#6606)
* Add warning_bar style for disabled fax sending

Add styles for .warning_bar class when fax server sending is disabled due to disabled domain.

* Disable fax sending if domain is disabled

When domain is disabled, users should not be able to send faxes either.

* Add text for fax sending disabled warning
2023-04-10 09:31:16 -06:00
Finn cd0e603521
add a missing import to some of the xml_handling lua scripts. (#6607)
Co-authored-by: Finn <finn@acceleratenetworks.com>
2023-04-10 09:30:34 -06:00
Finn 13c25f77c3
Hide field for key subtype when $show_key_subtype is false (#6608)
Co-authored-by: Finn <finn@acceleratenetworks.com>
2023-04-10 09:29:02 -06:00
FusionPBX 09d5108fb3
Remove polycom functions speed dial
Polycom key functions in their own web interface only show automata and normal.
2023-04-08 13:03:23 -06:00
FusionPBX b9776041c1
xml.sanitize on ivr_menu_option_digits
The sanitize breaks  /^(\d{4})>$/ as removes the $
2023-04-07 13:42:01 -06:00
FusionPBX 3d62b16259
xml.santize removed from direct_dial_regex
This wasn't needed since direct_dial_regex is built from ivr_menu_option_digits that have a statement ensuring they are numeric.
2023-04-07 13:30:30 -06:00
FusionPBX b6012976fb
Allow an empty ringback value 2023-04-07 12:36:20 -06:00
FusionPBX 1af129b94f
Only include ringback if it has a value 2023-04-07 12:28:27 -06:00
fusionate 36a4768917
MOH: Move None option to Others option group. 2023-04-05 00:39:00 +00:00
fusionate f5e21d8a49
MOH: Add None option. 2023-04-05 00:32:00 +00:00
FusionPBX 005cd93c3e
Bug fixed for hold_music for ring groups 2023-04-04 13:53:26 -06:00
FusionPBX 88da43b924
Change name to type and add subtype 2023-04-04 11:08:37 -06:00
FusionPBX 423bcd8aa8
Rename name to type 2023-04-04 10:59:24 -06:00
FusionPBX d704ffa1c9
Remove domain limit
Limit is likely not needed unless someone has a really large number of domains.
2023-04-04 09:56:16 -06:00
FusionPBX 408122c60c
Add subtype to vendor functions and device keys. (#6409)
* Add subtype to vendor functions and device keys.

Added to support phones that require a subtype for provisioning the phone.

* Add device_key_subtype

* Update device_edit.php

* Update device_profile_edit.php

* Update device_vendor_edit.php

* Update device_vendor_function_edit.php

* Update device_vendor_functions.php

* Update device_vendor_restore.php

* Update index.php

* Update provision.php

* Update app_languages.php

* Update app_config.php
2023-04-04 08:57:41 -06:00
Antonio Fernandez de08aa6a1d
Added support for secondary outbound proxy on Snom D series phones. (#6603) 2023-04-03 20:58:36 -06:00
Luis Daniel Lucio Quiroz 3a8dfca16d
SQL query missing toll_allow (#6604)
The SQL query is missing the toll-allow setting from the virtual fax extension. All dialplans that have that condition will fail.
This patch makes sure the variable is present if need it.
2023-04-03 19:14:26 -06:00
FusionPBX 751596cd89
Use CDR list add call block caller ID number 2023-04-03 13:17:42 -06:00
FusionPBX 253635bde4
Disable bxfer-return by default
This returns the call back to the person that tried to do a blind transfer. Enable this dialplan if its a behavior you want.
2023-04-03 11:22:46 -06:00
FusionPBX e2c22776ce
Country code note required but highly recommended 2023-04-03 09:44:08 -06:00
FusionPBX a78d3a221e
Default to destination_number
Set the default value back to destination_number.  There are cases where ${sip_to_user} and ${sip_req_user} may work better with the SIP diversion header. However seeing issues for some people when not using destination_number. It maintains original behavior so setting it back to the original default.
2023-04-03 02:08:19 -06:00
FusionPBX fe065819af
Update grandstream_stun_server value 2023-04-02 22:36:26 -06:00
FusionPBX f657e15b7b
Replace duplicated uuid with unique ones 2023-04-02 22:16:14 -06:00
David Jacob f0c1ebd3a1
Provisioning template changes (#6588)
* Provisioning template changes

Grandstream
GAC2500 - Added account sip port to grandstream template after account server name
GRP2612 - Added Variable for grandstream dial timeout
GRP2612 - Added Variable for grandstream lock volume
GRP2612w - Added Variable for grandstream dial timeout
GRP2612w - Added Variable for grandstream lock volume
GRP2613 - Added Variable for grandstream lock volume
GRP2614 - Added Variable for grandstream dial timeout
GRP2614 - Added Variable for grandstream lock volume
GRP2614 - Added Variable for granstream call popup enabled
GRP2615 - Added Variable for grandstream dial timeout
GRP2615 - Added Variable for grandstream lock volume
GRP2616 - Added Variable for grandstream lock volume
GRP26xx - Added Variable for grandstream lock volume
GXP2160 - Changed template to default enable options keepalive
GXP2160 - Added option for multicast listen address with "if isset" for variable on P1569
GXP2160 - Added Variable for grandstream lock volume
GXP2160 - added variable grandstream_weather_enable to enable/disable weather function in phones
GXP2170 - Added Variable for grandstream dial timeout
GXP2170 - Added Variable for grandstream lock volume
GXP2170 - Added Variable for grandstream stun server
GXP2170 - Added Variable for granstream call popup enabled
GXP2170 - Added option for multicast listen address with "if isset" for variable on P1569
GXP2170 - added variable grandstream_weather_enable to enable/disable weather function in phones
GXP3240 - Added account sip port to grandstream template after account server name

HTek
UC903 - Added account sip port to htek template after account server name
UC903 - Added variable to specify account 1 ringtone
UC903 - Added ** as pickup code - Not defined
UC903 - Added variable for screen timeout
UC903 - Enabled call waiting tone P8850 - its off by default for some reason
UC903 - fixed variable P2 to set the admin password on the phone from default settings, was not defined
UC903 - Added variable to change the pc port mode if expansion module needed P231
UC903 - Fixed expansion module key types - not defined
UC923 - Added variable to specify account 1 ringtone
UC923 - Added variable to change the pc port mode if expansion module needed P231
UC923 - Added ** as pickup code - Not defined
UC923 - Added variable for screen timeout
UC923 - Enabled call waiting tone P8850 - its off by default for some reason
UC923 - fixed variable P2 to set the admin password on the phone from default settings, was not defined
UC923 - Fixed expansion module key types - not defined
UC924 - Added variable to specify account 1 ringtone
UC924 - Added variable to change the pc port mode if expansion module needed P231
UC924 - Added ** as pickup code - Not defined
UC924 - Added variable for screen timeout
UC924 - Enabled call waiting tone P8850 - its off by default for some reason
UC924 - fixed variable P2 to set the admin password on the phone from default settings, was not defined
UC924 - Fixed expansion module key types - not defined
UC926 - Added variable to specify account 1 ringtone
UC926 - Added variable to change the pc port mode if expansion module needed P231
UC926 - Added ** as pickup code - Not defined
UC926 - Added variable for screen timeout
UC926 - Enabled call waiting tone P8850 - its off by default for some reason
UC926 - fixed variable P2 to set the admin password on the phone from default settings, was not defined
UC926 - Fixed expansion module key types - not defined

Snom
D735 - Added code given to use by snom to light the BLF green when avail and red when in use

Fanvil

X210 - Added default setting for fanvil blf pickup code
X210 - Added if exist in template for fanvil x210 the pickup code var

* grandstream_stun_server variable already exists

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-04-02 22:12:13 -06:00
FusionPBX 4dbee9b596
Fix bridge statements from recent change
Example bridge statement broken by the sanitize

before
sofia/internal/$1${regex(${sofia_contact(101@dev.local)}|^[^@]+(.*)|%1)}

after
sofia/internal/1{regex({sofia_contact(101@dev.local)}|^[^@]+(.*)|%1)}
2023-03-31 19:00:23 -06:00
FusionPBX 3e0b41ef0f
Refactor cidr and number-alias 2023-03-31 18:29:23 -06:00
yois615 7a26c271de
[call_recordings] Add destination to view (#6601) 2023-03-31 15:46:31 -06:00
fusionate 120a25e6db
[security] Implement Sanitize in XML Handler Scripts 2023-03-31 21:03:21 +00:00
FusionPBX eac6f09832
Update how dialplan_detail_type is sanitized
These detail types are safe: ${sip_to_user} and ${sip_req_user}
2023-03-31 13:34:22 -06:00
FusionPBX abbaccde9d
Move xml::santize
Need to preserve ${caller_id_number} and ${strftime(%Y-%m-%d-%H-%M-%S)} so moved the xml::santize
2023-03-31 13:25:42 -06:00
FusionPBX 08fce99db7
Allow sip_to_user and sip_req_user 2023-03-31 11:10:58 -06:00
FusionPBX ab67243911
Add the registration_expires variable 2023-03-30 14:58:09 -06:00
FusionPBX fce7b43c2e
Add the registration_expires variable 2023-03-30 14:56:54 -06:00
Ben 737adf44f3
Add registration expiry with register_expires (#6596) 2023-03-30 14:09:00 -06:00
Ben 3a1f3d1feb
Add registration expiry with register_expires - corrections (#6597) 2023-03-30 14:08:33 -06:00
Ben b4670b1203
Add registration expiry with register_expires (#6598) 2023-03-30 13:50:07 -06:00
Ben bb4e854198
Add registration expiry with register_expires (#6599) 2023-03-30 13:49:49 -06:00
Ben d1d42eb1d3
Update {$mac}.xml (#6600) 2023-03-30 13:49:25 -06:00
FusionPBX 8165dcc251
Re-add permission voicemail_destinations used
This permission is used by the Destination Select List.
2023-03-30 13:15:52 -06:00
yois615 d92c32764a
[database] Handle NULL literal in params (#6581) 2023-03-30 12:50:47 -06:00
Alex 43eb2a5b9d
[security] sanitize the xml (#6595)
* Update call_center_queue_edit.php

* fix typo

* Update call_flow_edit.php

* Update conference_center_edit.php

* Update conference_edit.php

* Update destination_edit.php

* Update fax.php

* Update ivr_menu_edit.php

* Update ring_group_edit.php

* Update app_defaults.php

* Update ivr_menu_copy.php

* Update destination_imports.php

* Update app_defaults.php
2023-03-30 12:46:36 -06:00
FusionPBX 3091370f14
Fix the ntp_server setting 2023-03-30 10:56:43 -06:00
FusionPBX e710c20a0d
Minor version update to 5.0.10 2023-03-30 09:34:24 -06:00
agree ca36d10121
[security] prevent xml injection and executing switch api cmds (#6594) 2023-03-29 23:24:04 -06:00
FusionPBX de70dd2910
Using for backwards compatibility
Added for more graceful upgrade as people update their menu to use the new dashboard.
2023-03-29 20:50:13 -06:00
FusionPBX 7d31d6958b
User log auto white list for limited time.
This is so that temporary IP addresses are not permanently allowed.
2023-03-29 19:13:10 -06:00
Finn 54be67935b
Improve error handling when a recording download fails (#6592) 2023-03-29 17:46:51 -06:00
FusionPBX ac129143a7
Add registration expiry with register_expires 2023-03-29 16:59:59 -06:00
FusionPBX 21cdf81256
Remove redundant syslog command 2023-03-28 18:26:34 -06:00
FusionPBX 850beb081b
Set global dialplan to global context (#6593)
* Set global dialplan to global context

* Update 530_talking_clock_date_and_time.xml
2023-03-28 14:03:55 -06:00
FusionPBX 14cbce3fdd
Add fax_status select list trying and busy 2023-03-28 13:12:30 -06:00
FusionPBX 7800633304
Add label busy and trying 2023-03-28 13:11:16 -06:00
FusionPBX 75fcb46b47
Account for fax_status busy 2023-03-28 13:01:49 -06:00
FusionPBX 7a3c67f6c5
Preserve the fax_result_code and set USER_BUSY 2023-03-28 12:49:46 -06:00
FusionPBX d03fca2970
Always update the fax_status
We want to show fax_status to be updated to show busy if the call was busy.
2023-03-28 12:46:54 -06:00
FusionPBX a1505ea945
Preserve the fax_result_code 2023-03-28 12:23:05 -06:00
FusionPBX 366577891f
Do not overwrite the fax_result_code 2023-03-28 12:21:59 -06:00
FusionPBX 2f37571b64
Set fax result text to USER_BUSY 2023-03-28 12:14:57 -06:00
FusionPBX 5c14e0b8cf
Update result text to USER_BUSY 2023-03-28 12:11:34 -06:00
markjcrane 1eece9111d Use global context 2023-03-28 11:38:29 -06:00
FusionPBX d07996d9d8
Update context to global 2023-03-28 11:27:41 -06:00
FusionPBX 48c3c11cfc
Update context to global 2023-03-28 11:27:18 -06:00
FusionPBX 0b9ea07576
Update context set to global 2023-03-28 11:26:44 -06:00
trideeindhoven fba26b3f84
Better NL translations (#6590)
Co-authored-by: Jeroen Hermans <jeroen@perfectvoip.nl>
2023-03-28 10:24:11 -06:00
trideeindhoven 8c0f8e8505
Keep device vendor when using alternate device (#6591) 2023-03-28 10:23:37 -06:00
FusionPBX d5850f154c
Update the array path after removing context tag 2023-03-27 16:49:36 -06:00
markjcrane d31e854488 Finish move context to an extension attribute 2023-03-27 14:28:24 -06:00
fusionate d40c3c76fa
Minor code adjustment to previous commit. 2023-03-27 20:27:30 +00:00
fusionate 0f02253e4e
SIP Profiles - Edit/Copy: Prevent duplicate names. 2023-03-27 20:22:35 +00:00
markjcrane 4fe99907e1 Move context to an extension attribute 2023-03-27 14:14:36 -06:00
fusionate 9714da4309
Default/Domain/User Settings: Offer select for boolean values. 2023-03-27 17:10:10 +00:00
Luis Daniel Lucio Quiroz 945ff01553
Update app_defaults.php (#6577) 2023-03-24 20:07:16 -06:00
Finn c1de249792
A few improvements to some grandstream configs + new devices (#6584)
Co-authored-by: Finn <finn@acceleratenetworks.com>
2023-03-24 20:06:15 -06:00
Antonio Fernandez 5c77562535
New Snom phone support plus fix for older snom model (#6587)
* Added support for privacy_out config parameter

* Added support for Snom M Series KLE Phones/Base

* minor fix to app_config.php
2023-03-24 20:04:54 -06:00
chansizzle e905e7e3c8
upgrade menu sorted (#6586)
Sets the list of menus to upgrade sorted ascending, and leaves 'default' menu as default selected for consistency and ease.
2023-03-24 20:00:52 -06:00
Finn 8cdcd86ba9
update custom transcription provider for async transcriptions and retry logic (#6583)
Co-authored-by: Finn <finn@acceleratenetworks.com>
2023-03-24 12:43:17 -06:00
frytimo 5e23824940
contacts app_defaults breaks PDO db (#6585) 2023-03-24 09:18:23 -06:00
FusionPBX 051cb01fdc
Use the subcategory when refreshing the session
Beset to be specific when using unset to clear values in the session
2023-03-23 21:40:50 -06:00
FusionPBX cedef761a6
FAX Queue retry_limit set to 5 2023-03-22 20:25:21 -06:00
FusionPBX 3247357c5d
Remove action == add 2023-03-22 10:01:43 -06:00
FusionPBX 26b0988075
destination_country_code is required 2023-03-22 09:53:28 -06:00
FusionPBX 9e01767688
Update call_block_edit.php 2023-03-21 11:58:29 -06:00
FusionPBX 42ca53567d
Re-enable the other destinations
Permission re-added as its used for the destination select list.
2023-03-20 10:33:54 -06:00
fusionate 9c8f4e9060
Event Guard - Fix Unblock multiple checked. 2023-03-17 21:07:35 +00:00
ednt c923293050
Update email_logs.php (#6578)
Due to a change of table field name the SQL generates an postgres error
2023-03-16 22:14:01 -06:00
fusionate c41121a00f
Dialplan - Feature code to control agent Break status. 2023-03-16 20:23:39 +00:00
FusionPBX 9a565cdb14
Update send_email.lua 2023-03-16 11:22:14 -06:00
FusionPBX 628592e1af
Update daylight savings start and stop dates.
Search engine search term:
daylight savings 2023
daylight savings 2024
2023-03-16 10:44:42 -06:00
FusionPBX e3696871c9
If record_length is not set then still set record path and name
This affected outbound calls in some cases.
2023-03-15 14:48:26 -06:00
FusionPBX 6d114f0d11
Fix outbound call result status 2023-03-15 13:30:53 -06:00
FusionPBX 07280b0754
Regex removed broke call recording 2023-03-13 12:50:52 -06:00
FusionPBX b449bef03e
Use preg_replace instead of escape (#6575)
Escape broke auto matching fields use preg_replace instead.
2023-03-10 09:54:49 -07:00
FusionPBX d8a45a5872
Add variable ${caller_id_name} 2023-03-09 18:39:58 -07:00
televoice_pl e91ed6e5a3
Update device.php (#6570)
"cisco spa" check must be before "cisco" otherwise "cisco spa" is ignored
2023-03-09 14:20:24 -07:00
Luis Daniel Lucio Quiroz c4422e65f8
Remove redundant SQL condition (#6573)
In this condition you already have  p.dialplay_uuid = s.dialplay_uuid  and you have p.dialplay_uuid = CONST, no need tor s.dialplay_uuid=CONST,

In small databases, this could be trivial; but in significant databases, this saves a lot of processing.
2023-03-09 14:13:50 -07:00
FusionPBX 801c19da80
Add voicemail_destination view, add, edit and delete 2023-03-09 11:10:48 -07:00
fusionate 98f4ae6bb7
Dialplans: Fix search by dialplan Number. 2023-03-08 16:54:21 +00:00
fusionate 934d653b21
Script - is_local: Add space. 2023-03-03 18:32:23 +00:00
fusionate 731d6d1e47
Domains - Edit: Update Call Center Agent Contact on domain rename. 2023-03-01 22:43:43 +00:00
fusionate 242ceb7ccb
Voicemails - List: Additional permission check. 2023-03-01 22:35:44 +00:00
fusionate 49ed64bba9
Voicemails - List: Misc minor adjustments. 2023-03-01 22:13:27 +00:00
fusionate e2c1157227
Voicemail Email: Use (First Assigned) Extension User Time Zone, where set. 2023-03-01 04:04:15 +00:00
fusionate b7e63aff1a
Email Queue - Edit: Textarea for Body field. 2023-03-01 03:19:40 +00:00
levishores 181998cb37
Yealink blf active variable (#6567)
* Updated blf_active_backlight with variable

* Fixed variable name

---------

Co-authored-by: Levi Shores <levi@dtpartners.com>
2023-02-28 10:24:07 -08:00
fusionate 58f43ba642
Event Guard - Clarify Filter select options. 2023-02-28 17:51:21 +00:00
Daniel C c57f8fee22
Fix fax queue selection not sending list and some french translation. (#6565)
* Fix sending selected faxes from the queue

* Fix some french translations

---------

Co-authored-by: Daniel <git@myrandor.com>
2023-02-28 00:00:51 -07:00
zrd740 bc7b6d9529
Added 2 new variables for T54W provisioning (#6560)
Added 2 new variables for changing the idle clock {$yealink_idle_clock} and transparency of the dsskeys {$yealink_idle_dsskey_title_transparency}
2023-02-23 20:28:58 -07:00
fusionate c6cbecc5d5
Upgrade: Toggle checkmarks by row click. 2023-02-23 15:23:00 +00:00
fusionate f6b065085b
Dashboard - Missed & Recent Calls: Fix minor inconsistencies. 2023-02-23 14:50:16 +00:00
FusionPBX e72094543a
Add key to the name 2023-02-21 20:45:54 -07:00
FusionPBX 99f88edcc3
More specific add key to the name 2023-02-21 20:44:27 -07:00
FusionPBX aa51f96212
Customizable empty rows for device keys (#6561)
* Customizable empty rows for device keys

* New default setting profile_add_rows and profile_edit_rows
2023-02-21 20:27:55 -07:00
FusionPBX 67bfd31765
Fix syntax problem 2023-02-21 19:44:41 -07:00
FusionPBX 2ca41f446b
Add user voicemail to menu 2023-02-21 15:47:31 -07:00
FusionPBX eb828db2d7
Minor version update to 5.0.9 2023-02-21 15:17:33 -07:00
demonspork 95579ca716
Fix cdr delete for recordings schema change and minor refactoring (#6532)
* Fix cdr delete for recordings schema change and minor refactoring

* Update changes to prevent losing changes.

Also remove trailing spaces

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-02-21 10:38:25 -07:00
frytimo 8e86fe6243
Remove '&' on new (#6559)
Remove '&' on static function new.
2023-02-21 09:39:15 -07:00
fusionate 593b90230e
Dashboard - Domain Limits: Default Settings for chart. 2023-02-20 22:28:32 +00:00
fusionate fc7a8106fb
Dashboard - Domain Limits: Rework style to match other widgets. 2023-02-20 22:21:54 +00:00
fusionate 2c76741976
Dashboard - Caller ID: Rework style to match other widgets. 2023-02-20 19:49:32 +00:00
FusionPBX e91f78bafe
permission exists xml_cdr_domain false 2023-02-20 12:29:32 -07:00
FusionPBX d4458782b8
Change is_group to permission_exists
Use the xml_cdr_domain permission instead of is_group admin or superadmin.
Using the permission is more flexible.
2023-02-20 12:12:43 -07:00
fusionate 29b5b774eb
Upgrade: Detect alternate successful response. 2023-02-20 18:43:51 +00:00
FusionPBX cd517ea403
Show the latest 24 hours for CDR statistics 2023-02-18 17:28:15 -07:00
fusionate ecad712b26
Dashboard: Adjust Expand/Contract All button based on widget Hidden state, as well. 2023-02-18 00:18:29 +00:00
fusionate 2d4bd75ac9
Dashboard: Fix Save position without change. 2023-02-18 00:11:36 +00:00
FusionPBX 1d36ca2dc9
Preprend the settings to the email response 2023-02-17 16:58:44 -07:00
fusionate da4f02521f
Dashboard - Settings: Fix Enabled state on edit. 2023-02-17 23:53:08 +00:00
FusionPBX c430c5c07f
Add email settings to the saved email response 2023-02-17 16:45:52 -07:00
fusionate f027c75aa4
Dashboard - Ring Group Forward: Show chart even without data, hide Save button without data. 2023-02-17 23:17:06 +00:00
fusionate 0334768c30
Dashboard - Ring Group Forward: Rework style to match other widgets. 2023-02-17 23:02:25 +00:00
fusionate a677c6abc3
Dashboard - Call Forward: Add permissions to chart data. 2023-02-17 23:01:40 +00:00
Alex 7326cb845a
Set default for enabled (#6556)
* Set default for enabled

* Update conference_profile_edit.php

* Update call_block_edit.php

* Update conference_control_edit.php

* Update conference_control_detail_edit.php

* Update conference_profile_edit.php

* Update conference_profile_param_edit.php

* Update conference_edit.php

* Update destination_edit.php

* Update device_edit.php

* Update device_profile_edit.php

* Update device_vendor_edit.php

* Update email_template_edit.php

* Update extension_edit.php

* Update module_edit.php

* Update phrase_edit.php

* Update ring_group_edit.php

* Update sip_profile_edit.php

* Update stream_edit.php

* Update time_condition_edit.php

* Update var_edit.php

* Update voicemail_edit.php

* Update call_block_edit.php

* Update default_setting_edit.php

* Update domain_setting_edit.php

* Update domain_edit.php

* Update user_edit.php

* Update bridge_edit.php

* Update sip_profile_edit.php

* Update sofia_global_setting_edit.php

* Update call_flow_edit.php

* Update email_template_edit.php

* Update call_flow_edit.php

* Update bridge_edit.php

* Update email_template_edit.php

* Update sip_profile_edit.php

* Update sofia_global_setting_edit.php

* Update bridge_edit.php

* Update call_flow_edit.php

* Update conference_control_edit.php

* Update sip_profile_edit.php

* Update stream_edit.php

* Update default_setting_edit.php

* Update email_template_edit.php

* Update extension_setting_edit.php

* Update default_setting_edit.php

* Update dashboard_edit.php

* Update dashboard_edit.php

* Update default_setting_edit.php
2023-02-17 14:21:41 -07:00
FusionPBX ef866e12d7
Remove code that was commented out 2023-02-17 12:59:22 -07:00
FusionPBX 97dbe7b31a
Save the email response (#6558)
* Save the email response

* use the response variable from the email class

* Rename email_debug to email_response

* Update app_languages.php

* Show the email response

* Save the email response
2023-02-17 12:47:11 -07:00
FusionPBX 7dbfd22acb
Add email status search trying 2023-02-17 11:55:47 -07:00
FusionPBX bc84d609d0
Update app_languages.php 2023-02-17 11:54:09 -07:00
FusionPBX 712b1e7281
Update xml_cdr_statistics.php (#6557)
* Update xml_cdr_statistics.php

* Build the xml cdr statistics with a query
2023-02-16 22:09:00 -07:00
David Jacob ae98ad2d49
Fix page issue of hold music heard (#6555)
Adding "mintwo" flag will tell the system that there has to be a minimum of two people in the conference to keep it open. This fixes the problem of when a user initiates a *8[ext] to someone and the far end hangs up and the initiator does not hang up the line they will hear hold music till they hang up.  Adding this will disconnect the intercom page if either party hangs up the call.
2023-02-16 15:51:01 -07:00
FusionPBX 5fe06f76c1
Update app_config.php 2023-02-16 11:50:03 -07:00
FusionPBX 7901818eec
Update app_config.php 2023-02-16 11:49:05 -07:00
FusionPBX 20ba2acf3c
Add provision user_name
User level username for endpoint embedded web server.
2023-02-16 11:42:36 -07:00
fusionate a65c4cc532
Fax Server - List: Better parameter string. 2023-02-15 19:46:54 +00:00
fusionate ee466d69b0
Fax Server - List: Add Show All, fix search. 2023-02-15 19:33:11 +00:00
FusionPBX eab4b53d3a
Update {$mac}.cfg 2023-02-15 11:27:35 -07:00
FusionPBX 66695f00c9
Create {$mac}.cfg 2023-02-15 11:26:15 -07:00
FusionPBX f15b012c9f
Enable the input_toggle_style by default 2023-02-15 11:04:02 -07:00
Alex a8deadc38c
Update ivr_menu_edit.php (#6554)
* Update ivr_menu_edit.php

* Update extension_setting_edit.php

* Update domain_setting_edit.php
2023-02-15 09:52:49 -07:00
FusionPBX 615a776af4
Add database connections and size 2023-02-15 09:51:36 -07:00
FusionPBX aee22fe540
Add databases and database connections 2023-02-15 09:50:47 -07:00
FusionPBX bb5588fe58
Add path, version and size 2023-02-15 09:49:47 -07:00
FusionPBX eda9ee41fb
Default settings will override channel variables
These two settings when enabled
- message_caller_id_number 
- message_date_time

Override the following channel variables
- vm_say_caller_id_number
- vm_say_date_time
2023-02-14 18:19:48 -07:00
FusionPBX 9ef904fed1
Backwards comptability for these channel variables
- vm_say_caller_id_number
- vm_say_date_time
2023-02-14 17:33:25 -07:00
agree 4c29c3c4cf
[security] import pages xss prevention (#6553) 2023-02-14 15:34:53 -07:00
Alex a229d1e46c
Add enabled toggle to more pages and bug fix (#6552)
* Add enabled toggle to more pages and bug fix

* Add device profile enable toggle

* fixed enable on bridge_edit.php

* Fixed enable on call_block_edit.php

* Fixed enable on call_flow_edit.php

* Fixed enable on conference_center_edit.php

* Add conference room enabled toggle

* Fixed enable on conference_control_detail_edit.php

* Fixed enable on conference_control_edit.php

* Fixed enable on conference_profile_edit.php

* Add conference profile param enabled toggle

* Fixed enable on conference_edit.php

* Fixed enabled on device_edit.php

* Fixed enable on extension_edit.php

* Fixed enable on gateway_edit.php

* Fixed enable on number_translation_edit.php

* Fixed enable on phrase_edit.php

* Fixed enable on ring_group_edit.php

* Fixed enable on sip_profile_edit.php

* Fixed enable on stream_edit.php

* Fixed enable on time_condition_edit.php

* Fixed enable on var_edit.php

* Fixed enable on voicemail_edit.php

* Fixed enable on user_edit.php

* Fixed enable on user_setting_edit.php

* Update user_edit.php

* Update bridge_edit.php

* Update call_flow_edit.php

* Update conference_control_edit.php

* Update stream_edit.php

* Fixed enable on default_setting_edit.php

* Fixed enable on domain_edit.php

* Fixed enable on email_template_edit.php

* Fixed enable on module_edit.php
2023-02-14 11:19:02 -07:00
FusionPBX 7afcad0743
Add database information (#6551)
* Add database information

Show the database version.

* Add title-database

* Update app_config.php
2023-02-14 10:30:38 -07:00
fusionate f8f906a29c
Dialplan - Wakeup Call: Remove sample rate from path. 2023-02-14 16:48:55 +00:00
fusionate 854802ea7f
Recordings - Enable Default/Domain/User setting to control filename prefix and password. 2023-02-14 01:27:37 +00:00
fusionate 0f6ac8920c
Dialplan - Wakeup Call: Use dynamic path. 2023-02-14 01:22:48 +00:00
Alex 129d173624
Add enable toggle to more pages (#6549)
* Add bridge enabled toggle

* Update call_block_edit.php

* Add call flows enabled toggle

* Add conference center enabled toggle

* Add conference control detail enabled toggle

* Add conference control enabled toggle

* Add conference enabled toggle

* Add phrase enabled toggle

* Add stream enabled toggle

* Add voicemail enabled toggle

* Add destination enabled toggle

* Add time condition enabled toggle

* Add default settings enabled toggle

* Add domain enabled toggle

* Add email template enabled toggle

* Add module enabled toggle

* Add number translation enabled toggle

* Add sip profile enabled toggle

* Add switch var enabled toggle
2023-02-13 18:02:01 -07:00
fusionate fe616a6ce8
Dialplan - Wakeup Call: Correct sounds_dir variable used in previous commit. 2023-02-14 00:51:37 +00:00
fusionate 9438b6979b
Dialplan - Wakeup Call: Remove deprecated pin_number reference. 2023-02-14 00:35:30 +00:00
FusionPBX e1713bfc0b
Add text area for email error 2023-02-13 13:21:29 -07:00
FusionPBX 7bca5305ec
Add the email error
Log the email error to identify what went wrong with the email.
2023-02-13 13:03:04 -07:00
FusionPBX 8396f1b572
Fix the search and status for paging 2023-02-11 12:00:53 -07:00
Alex 2acda5ea06
Add dashboard, device, extension, and gateway enabled toggle (#6548)
* Update system_counts.php

* Update call_forward.php

* Add dashboard widget enabled toggle

* Add device enabled toggle

* Add extension enabled toggle

* Add gateway enabled toggle

* Update extension_edit.php

* Update extension_edit.php

* Update device_edit.php

* Update gateway_edit.php
2023-02-10 11:14:43 -07:00
FusionPBX ce52b2f750
Change formatting for user and admin password 2023-02-10 10:31:56 -07:00
FusionPBX 7b6774050e
Set ivr_menu_enabled default to false 2023-02-10 10:08:54 -07:00
FusionPBX f5afe618e1
Set ring_group_enabled default to false 2023-02-10 09:58:03 -07:00
FusionPBX 9c19eff170
Add toggle ring group enabled 2023-02-10 09:43:14 -07:00
FusionPBX 06949a96d9
Add toggle ivr menu enabled 2023-02-10 09:41:32 -07:00
FusionPBX 1ad7f84011
Add user setting enabled toggle 2023-02-10 09:35:01 -07:00
FusionPBX 2055aff48a
Add user enabled toggle. 2023-02-10 09:20:10 -07:00
FusionPBX f14d050979
Don't show null domain_uuid 2023-02-09 16:13:31 -07:00
FusionPBX 9026f3b505
Don't show null domain_uuid
Don't show user logs for login attempts that weren't assigned to a domain. Show null domain_uuid when using show all.
2023-02-09 16:11:41 -07:00
Alex d35c7577bf
Fixed call forward chart not showing up (#6547)
Fixed a bug where the chart doesn't show up when all the values are equal to 0.
2023-02-09 13:38:48 -07:00
FusionPBX a727c4c38a
Add domain_uuid useful for debug 2023-02-09 12:58:07 -07:00
FusionPBX 9c73670845
Move the fax_queue update before originate
Reason for the change is to make sure the api_hangup_hook lua script update of the email queue doesn't conflict.
2023-02-09 12:40:42 -07:00
FusionPBX f862d65f4b
If fax succes is 1 then fax_status set to sent 2023-02-09 12:28:22 -07:00
fusionate 3ea56af2c3
Gateways - List: Show Register value. 2023-02-09 18:36:24 +00:00
denisent 00b5b79886
separating status and hangup permissions (#6522)
* separating status and hangup permissions

Creating a status permission so status can be displayed independently from hangup cause. The combination of status within the hangup permissions has confused some conversations with admins and superadmins.

* separating status and hangup permissions

Creating a status permission so status can be displayed independently from hangup cause. The combination of status within the hangup permissions has confused some conversations with admins and superadmins.
2023-02-08 19:03:40 -07:00
Luis Daniel Lucio Quiroz 9aa88dc537
Make the XML CDR Importer more resilient (#6543)
So I discovered 2 things,

1. If a user adds the default config cdr-field-array with the content of a database field Let's pretend they want to show the xml_cdr_uuid column (for support purposes) - it could be any column, the SQL construction will fail as not Postgresql, Not MariaDB/MySQL allow having a column repeated twice. Adding array_unique() fixes this issue.

2. This one is for developers: If a developer wants to create more columns in the v_xml_cdr table and make them visible in the CDR app, common sense tells to add the default setting cdr-field-array to show it. As the code is now, this will look into the freeswitch variables and overwrite it with NULL. I am adding a condition that verifies if the value has been already assigned, if it is, it won't overwrite it. This allows any developer who may be interested in extending the CDR to simply extend the class without touching it; very handy to keep the original code untouched.
2023-02-08 18:43:25 -07:00
fusionate ea59d3bf58
Conferences - List: Display CDR link in Tools column, if allowed. 2023-02-09 00:30:56 +00:00
FusionPBX 324b720cda
Fix the syntax $ needs to inside the variable brackets 2023-02-08 16:28:47 -07:00
fusionate b0c1a74f63
Access Controls - Reload: Clean up. 2023-02-08 22:17:49 +00:00
fusionate 5494a72941
Access Controls - List: Add Reload button. 2023-02-08 21:56:36 +00:00
FusionPBX 1078bacd70
Move database.name add adiditional comments 2023-02-07 22:56:44 -07:00
FusionPBX 78b4651106
Use additional conditions so sqlite will work or postgresql
Also added trim to prevent a trailing space from breaking the dsn string for sqlite.
Also added debug lines helpful for testing.
2023-02-07 22:50:05 -07:00
FusionPBX aacb232fc3
Add debug info and change method to access the table
Changing the method to access the table with dot notation is just a style should work either way.
2023-02-07 22:47:03 -07:00
FusionPBX 09c41b88ef
Add contact-params (#6545)
Adding contact params for control over this setting.
2023-02-06 22:24:16 -07:00
fusionate 46854d4025
Voicemail - Edit: Renenable Listen Link option in select, like Extension edit page. 2023-02-06 23:24:49 +00:00
garryavx 7d08ffc53c
Update app_config.php (#6544)
changed description to make destination_number a variable, and added warning that you must use a global default setting, domain setting will not work.
2023-02-06 14:49:48 -07:00
markjcrane 87192bd07d Add autoanswer setting to more phones 2023-02-03 16:30:40 -07:00
markjcrane d8f3f698e3 Add settings for autoanswer 2023-02-03 16:17:48 -07:00
fusionate a4c4e4c52a
Functions: Modify permission_exists() function to support an array of permissions. 2023-02-03 18:50:56 +00:00
fusionate 658cb83894
Recordings: Display *732 password in description. Permission: record_pin 2023-02-02 21:20:31 +00:00
fusionate a7437be120
Interactive Conference - Add left margin to video icon, like others. 2023-02-02 20:06:40 +00:00
FusionPBX 0a6148bbc4
Use the switch database defined in config.conf 2023-02-01 19:51:33 -07:00
FusionPBX d9ba8b8880
Disable destination_number by default
This dialplan is meant to not record any calls any feature code calls. This means all calls starting with a * prefix.  However if you set the call to record all on the extension wouldn't you expect it to record all calls? Including when picking up a call. Or when intercepting call? or when un-parking a call. Had a someone call that had used a * prefix on an outbound route because they did that this condition prevented the call from being recorded which they didn't expect when the extension was set to record all calls. Tempted to remove it entirely but have instead disabled it by default for now.
2023-02-01 11:39:34 -07:00
FusionPBX 530ba85969
Option to disable dialplan conditions 2023-02-01 11:33:36 -07:00
fusionate f0797aee40
Conferences/Rooms - Edit & List: Make View button/link destination (Interactive or Active Conferences) determined by permissions. 2023-01-31 20:14:32 +00:00
fusionate 2092156157
Active Conferences: Show Conference/Room name and extension numbers. Conferences - Edit: Fix View button. Conferences - List: Add View link. 2023-01-31 19:59:08 +00:00
Alex 3fe43be2a8
Update default chart colors (#6542)
* Update default chart colors

* Update app_config.php

* Update index.php
2023-01-31 11:08:00 -07:00
fusionate a48ba691b4
Dashboard: Show Expand/Contract All button for all user groups. 2023-01-31 02:45:06 +00:00
fusionate 6bc1e53244
Default Settings - Copy: Move function to list view and use copy method in class. 2023-01-31 01:41:43 +00:00
fusionate d04b6db96a
Dashboard: Call Forward widget, Edit position without reload, misc adjustments. 2023-01-31 00:19:09 +00:00
FusionPBX ba344fd56b
Add option for /usr/share and /usr/local/share 2023-01-29 16:48:25 -07:00
FusionPBX badc0ee6c4
Add option for /usr/share and /usr/local/share 2023-01-29 16:46:39 -07:00
fusionate 5b3cd98a29
Default Setting - Edit: Add Clone button to duplicate setting. 2023-01-29 07:37:38 +00:00
fusionate eca0080b39
Theme: Fix icon reference for Domain button. 2023-01-28 23:06:36 +00:00
FusionPBX e3b600eaff
Exclude Call center agent as missed call
The call could have been answered by another call center agent.
2023-01-28 14:49:35 -07:00
fusionate 87716d051d
Extension - Edit: Clarify more descriptions. 2023-01-28 21:38:46 +00:00
fusionate 4ba6148f57
Extension - Edit: Add clarity to Max Registrations and Limit Max descriptions. 2023-01-28 21:31:00 +00:00
fusionate 4b7bac9ba1
Extension - Edit: Remove extra line breaks. 2023-01-28 21:18:01 +00:00
fusionate b35aafc391
Dashboard: Click chart to expand/contract details. 2023-01-28 01:52:13 +00:00
fusionate 9f7133ac4f
Login: Change destination setting type. 2023-01-28 00:19:00 +00:00
FusionPBX 8a95ff6453
Move the login destination with the other default settings 2023-01-27 17:18:44 -07:00
FusionPBX 2db8d523ff
Use a preset uuid for login destination 2023-01-27 17:12:58 -07:00
FusionPBX 49f3aa1fcf
Update app_config.php 2023-01-27 17:06:39 -07:00
fusionate 6825825891
Device Profile - Edit: Implement device_key_icon permission on Icon column of Keys. 2023-01-27 22:42:05 +00:00
fusionate 107b8a48f2
Voicemail: Default/Domain Settings to control CID Number and Date & Time playback/order. 2023-01-27 22:17:51 +00:00
fusionate c4b8c7add1
Default/Domain/User Settings - Edit: Change Type field to select box. 2023-01-27 21:50:43 +00:00
FusionPBX 02a9372634
Fix call block search and search by more fields.
Search by new fields.
- call_block_direction
- call_block_app
- call_block_data

Remove search by country code as its type numeric and casting it to text is likely to lower performance.
2023-01-27 13:08:22 -07:00
demonspork a3811128af
Support upcoming change in freeswitch - bridge_uuid changes to bridge_uuids array (#6531) 2023-01-27 10:18:35 -07:00
emak 21b639cd8e
user_exists: Add extension_caller_id_name and extension_caller_id_number (#6540)
* Add extension_effective_caller_id_name and extension_effective_caller_id_number

Adds 2 new variables to the user_exists dialplan:

* extension_caller_id_name
* extension_caller_id_number

This allows us to access these channel variables from the event socket and get the caller id name and number of the dialed extension when an inbound call comes in to that extension.

* Update 010_user_exists.xml

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2023-01-27 10:11:53 -07:00
FusionPBX 433e42d933
Update sv voicemail language 2023-01-26 16:40:45 -07:00
FusionPBX 9a6628b592
Update app_config.php 2023-01-26 11:50:15 -07:00
FusionPBX a46d0856d3
Add new language_destinations permission 2023-01-26 10:34:01 -07:00
FusionPBX 9ae3cf8da3
Add destination languages 2023-01-25 23:08:38 -07:00
FusionPBX e488985708
Add title-languages translations 2023-01-25 22:57:24 -07:00
FusionPBX 9672dcc299
Use /es/mx/maria by default
Copied the wrong one in a previous commit. FreeSWITCH has sound files for es/mx/maria so we will use this by default.
2023-01-25 08:41:42 -07:00
FusionPBX 0279384ed6
Update es.xml 2023-01-25 08:37:24 -07:00
markjcrane 4ad93b421d For spanish use /es/ar/mario by default 2023-01-25 08:36:31 -07:00
fusionate 7dac0db939
Default Settings: Use Reload icon on Reload button. 2023-01-25 15:16:43 +00:00
fusionate 7fc8ad9c77
Default Settings: Change icon on Domain button. 2023-01-25 15:12:20 +00:00
FusionPBX 9781d965ff
Added to support the Disabled option 2023-01-24 11:22:57 -07:00
FusionPBX 3bfa2fc525
Added to support the Disabled option 2023-01-24 11:21:49 -07:00
fusionate 8f2e1b0cd1
IVR Menu: Implement Enabled toggle control on Options. 2023-01-23 23:45:57 +00:00
fusionate b393089769
Ring Group - Edit: Set value to FALSE when Destination switch is off. 2023-01-23 22:44:57 +00:00
FusionPBX 14e752197e
Minor version change to 5.0.8 2023-01-23 13:48:34 -07:00
fusionate dc1307028a
Default/Domain/User Settings: Implement select field for input_toggle_style options. 2023-01-23 19:31:18 +00:00
FusionPBX d31d028a0c
Upgrade: Enable ring group destinations by default 2023-01-22 11:19:50 -07:00
fusionate df6bc02489
Ring Groups: Enhance Destination Enabled Switch 2023-01-21 01:30:34 +00:00
K-Flagman 581c919132
Add iphone style toggle to enable/disable ring groups destinations #6394 (#6395)
* Add iphone style toggle for destinations in ring groups

* Add iphone style toggle for destinations in ring groups

* only select enabled destination when make ring group calls

* add destination_enable filed in table v_ring_group_destinations schema

* Change destination_enabled value on to true.

* Update app_config.php

* Change destination_enabled from on to true

* Change destination_enabled to boolean

* Delete fix.css

* Will style this

* Update template.php

Co-authored-by: flagman <flagman@flagman.com>
Co-authored-by: FusionPBX <markjcrane@gmail.com>
Co-authored-by: K-flagman <43560934+kapetrosyan@users.noreply.github.com>
2023-01-20 18:25:13 -07:00
Alex 7d22b514a4
Update index.php (#6539) 2023-01-20 15:01:11 -07:00
FusionPBX c5ebafa893
Add spa_vlan_enable, spa_vlan_id and spa_vlan_pc_id 2023-01-20 11:50:52 -07:00
FusionPBX a527bb5122
Remove cisco spa settings
These settings have been moved to app/cisco/app_config.php
2023-01-20 11:40:17 -07:00
FusionPBX 41ac46b204
Move the cisco spa default settings
Moved to own app/cisco/app_config.php
2023-01-20 11:38:52 -07:00
FusionPBX 28aa3dce38
Add spa_vlan_enable, spa_vlan_id and spa_vlan_pc_id 2023-01-20 11:24:25 -07:00
FusionPBX ec6daa7be0
Add missing required permission. 2023-01-19 16:00:59 -07:00
FusionPBX 62a8b95a16
Use effective_caller_id_name for local caller ID name
A local call does not have caller_id_name set automatically so we need to use effective_caller_id_name
2023-01-19 14:48:18 -07:00
fusionate 2980555287
Call Broadcast: Implement Date/Time Picker for Start Time field. 2023-01-18 22:25:55 +00:00
fusionate f2d98ebcdf
Domain Selector: Restore previous click functionality and appearance. 2023-01-18 00:34:34 +00:00
FusionPBX a5c6314861
Remove fail_on_single_reject
For one customer this broke voicemail as it never went to voicemail.
2023-01-17 17:18:59 -07:00
Alex 25cdd2dbda
Add details state dashboard widget setting (#6537)
* Update index.php

* Update dashboard_edit.php

* Update app_config.php

* Update app_languages.php
2023-01-17 13:50:44 -07:00
FusionPBX dc3b95da36
Use tabs for indentation 2023-01-17 12:07:35 -07:00
denisent d27fddda45
added missing local voicemail B leg image (#6533) 2023-01-16 21:03:36 -07:00
fusionate 4b52636022
Log Viewer: Update copyright date. 2023-01-17 00:06:01 +00:00
fusionate e8c59469c4 Call Center Agent - Edit: Clarify Announce Sound Description. 2023-01-16 23:44:24 +00:00
fusionate 96ba877a30 CDR: Update copyright date. 2023-01-16 23:10:11 +00:00
fusionate bbcfa128e5 Vars: Update copyright year. 2023-01-16 22:15:46 +00:00
FusionPBX e914fcde5e
Fix the fax queue status and search 2023-01-14 15:27:02 -07:00
FusionPBX c29c00dac1
Use $_REQUEST instead of $_POST or $_GET 2023-01-14 15:12:24 -07:00
FusionPBX 0873d67552
Add a link to fax_queue 2023-01-14 15:05:27 -07:00
FusionPBX e5b4f36b4b
Add label-queue 2023-01-14 15:04:05 -07:00
FusionPBX a51fba9745
Add permission fax_queue_domain 2023-01-13 18:12:42 -07:00
FusionPBX 3d144e58b0
Show faxes assigned to the user 2023-01-13 18:11:01 -07:00
FusionPBX 3b2e92a67d
Use $_SERVER['DOCUMENT_ROOT'] 2023-01-13 14:24:33 -07:00
FusionPBX a28e248867
Use $_SERVER['DOCUMENT_ROOT'] 2023-01-13 14:23:27 -07:00
FusionPBX e1b0f08321
Update the config.conf include 2023-01-13 13:58:06 -07:00
FusionPBX 86b8c2bea6
Update the fax-queue config.conf include 2023-01-13 13:56:34 -07:00
FusionPBX 1aa1467872
Allow inbound_route_view and outbound_route_view permissions 2023-01-11 23:35:29 -07:00
FusionPBX 59129449fd
Rebuild the dialplan SQL 2023-01-11 20:21:14 -07:00
FusionPBX dad60ef40a
config fs_path convert to boolean
The fs_path setting from config.conf is picked up from the config as a string. The directory.lua code expects the value as boolean so we are converting it to a boolean so it can be used in that way.
2023-01-11 19:52:42 -07:00
denisent 422b41cf8f
malformed sql messed up fax server columns (#6535) 2023-01-11 15:04:34 -07:00
FusionPBX bb3b813ce4
Update year range to include years passed
This is needed so that if going back to an old time condition see the year it previously had. This provides opportunity to update or remove the old time condition. This provides time to remove the old setting and not confuse it with new years.
2023-01-09 16:49:18 -07:00
FusionPBX d796eee8a0
Security: validate the user
Safest approach is to validate the user for the current domain.
2023-01-08 11:49:34 -07:00
FusionPBX 60aa8f6ab2
Remove the domain from the user_id 2023-01-08 11:46:57 -07:00
FusionPBX cf69ee46dc
Use the call recordings view 2023-01-07 08:44:20 -07:00
Alex 37ab508d1b
Update chart.js v3 to v4 (#6529)
* Update chart.min.js

* Update missed_calls.php

* Update recent_calls.php

* Update system_counts.php

* Update system_cpu_status.php

* Update system_status.php

* Update domain_limits.php

* Update voicemails.php
2023-01-06 13:18:53 -07:00
Alex 310d4d00e7
Fix chartjs-adapter-date-fns (#6528) 2023-01-05 15:52:59 -07:00
Alex b43d6f3267
Update chart.min.js (#6527) 2023-01-05 14:54:46 -07:00
Alex bae38f3b65
Update chart.js (#6526)
* Update chart.min.js

* Update chartjs-adapter-date-fns.bundle.min.js

* Update chart.min.js
2023-01-05 14:45:50 -07:00
FusionPBX 0dbbdd000e
Create shell_esc.lua 2023-01-04 19:48:36 -07:00
FusionPBX 1e49e686c9
Add additional values to Registrations array
Items added to registrations array
* network-ip
* sip-auth-user
* ping-status
2023-01-04 14:05:16 -07:00
Alex 08a6cdb864
Update system_counts.php (#6525) 2023-01-04 09:42:58 -07:00
Harry Foster 13bcd5d244
Updated device key save to be a submit function for the form. (#6524)
The reason for this is the default behaviour for 'return' or 'enter' is to delete the device entirely. This makes using a barcode scanner impossible, or user error resulting in a lot of lost time.
2023-01-04 09:19:48 -07:00
FusionPBX 2b1b4b9315
Blind transfer on fail return call to sender 2023-01-03 18:34:05 -07:00
FusionPBX 819d7aeb4c
Update spandsp 2023-01-02 23:58:38 -07:00
FusionPBX 784bdafccf
Use the time zone and format the date 2023-01-02 23:21:40 -07:00
FusionPBX a93bce2ae4
Disable grandstream_enable_call_features
When enabled it breaks ability to dial 72/73/74 or 97/98 and other feature codes
2023-01-02 11:52:08 -07:00
demonspork 7e58f6d773
Fix edge case permissions problem with extension_advanced (#6512)
* Fix edge case permissions problem with extension_advanced
2022-12-31 11:57:41 -07:00
zrd740 7908de0965
Update t41p {$mac}.cfg to correct IPv4 / IPv6 bug (#6516)
I was having an issue where my T41P phones were getting provisioned with IPv4 & IPv6 - even though I specified in default settings yealink_ip_address_mode=0 for IPv4 only. Checked the y000000000036.cfg, which was setting it correctly. The issue was that {$mac}.cfg was overriding the correct setting. There were several instances of "network.ip_address_mode = 2" in this file, which specifies ipv4&ipv6. I changed all 5 of those entries in this file to pull from the default setting {$yealink_ip_address_mode} rather than just setting a static value of 2. I don't know why it has this listed in this file 5 times. But, this change resolved my issue and will force the T41P provisioning to follow FusionPBX default settings.
2022-12-31 11:51:08 -07:00
yois615 cb1777c794
[call_flow] Adjust lamp on web changes (#6519)
Trigger event on status change from WebUI
2022-12-31 11:49:33 -07:00
Alex 21dfbc2d61
Update system_counts.php (#6517) 2022-12-31 11:47:33 -07:00
yois615 885c950a15
[call_center] Add uuid to lamp turn (#6518)
Agent log out from queue would have delayed lamp turn off.
Solution credit:
https://www.pbxforums.com/threads/agent-status-blf.549/page-2#post-11458
2022-12-31 11:46:58 -07:00
yois615 967445ab34
[call_center] Use agent_name or agent_id (#6520)
When logging into call center from phone, index.lua
only supports identity with agent_id.  We allow passing
agent_name as well to assist with BLF configuration.
2022-12-31 11:44:37 -07:00
yois615 2a0616b050
[call_center_active] Queue pickup (#6521) 2022-12-31 11:42:44 -07:00
Vincent 68f7ca517e
Update all model templates of Flyingvoice. (#6509)
* Fix the registration failed after provision Flyingvoice phone.

* Fix the parameter configuration of Flyingvoice not displayed in the Default Settings

* Fix: after configuring SIP line 1 of Flyingvoice phone, other SIP lines are disable and the configuration parameters of Flyingvoice are not displayed by default settings.

* Fix after configuring SIP line 1 of Flyingvoice phone, other SIP lines are disable.
* Fix the configuration parameters of Flyingvoice are not displayed by default settings.

* Fix: when only one sip line's shared line is enable, the shared lines of all SIP lines will be enable.

* Fix: unable to generate configuration file of Flyingvoice due to syntax error.

* Add the P1X, P2X, P3X, P5X, i86Box, iMetalBox, audioKit Series for Flyingvoice in Devices.

* Update all model templates of Flyingvoice.
2022-12-31 11:32:58 -07:00
markjcrane 7c44a0b642 Add missing CDR image 2022-12-31 10:32:56 -07:00
FusionPBX 52308e2f15
Set new_json from the array
Fixes the new_json value that is added to the database transactions table.
2022-12-29 23:55:11 -07:00
FusionPBX ef1dbca245
Fix paging records for call recordings 2022-12-29 12:05:51 -07:00
FusionPBX ba9548c196
Minor version update to 5.0.7 2022-12-29 11:21:58 -07:00
FusionPBX 6a3f7e95a4
When greeting is used a short sleep is required
Without the sleep may miss the beginning of the recording.
2022-12-23 10:03:29 -07:00
FusionPBX 0afe985352
Make the SQL queries more readable 2022-12-22 13:15:14 -07:00
FusionPBX 9f0217aa44
user_dashboard has been replaced by core/dashboard 2022-12-22 13:09:35 -07:00
FusionPBX f714ef6798
Fix problems with the app_uuid and domain_uuid
app_uuid was null, and domain_uuid getting the wrong uuid.
2022-12-22 13:04:24 -07:00
FusionPBX c9fe34f271
Change call_routing to call_forward. 2022-12-22 13:02:27 -07:00
demonspork 19354fa37c
Update local_extension fail_on_single_reject (#6514)
Update local_extension fail_on_single_reject to handle stale registrations and other failures. Previously any failure mode would cause the call to drop to all registrations.
2022-12-22 00:27:50 -07:00
FusionPBX 8c749a2d02
Hide domain from list for user without permission
Use session domain_uuid by default when saving a new stream.
2022-12-22 00:18:43 -07:00
FusionPBX ba8adb9df6
Make streams more admin group safe. 2022-12-22 00:13:06 -07:00
FusionPBX a44ca60441
Category and Search pass-through (#6511)
* Update default_settings.php

* Update default_setting_edit.php
2022-12-20 14:12:47 -07:00
FusionPBX ee17eb2665
Security, sanitize fax file path and name 2022-12-18 15:39:11 -07:00
FusionPBX 347874d42f
Fix mkdir by includ function an use after includes 2022-12-18 12:13:01 -07:00
FusionPBX fa8ef47510
Make Aastra config files more like other provision templates (#6510)
* Update {$mac}.cfg
2022-12-16 13:13:55 -07:00
demonspork 5ccd29f20f
Add : colon to menu item links to fix external links (#6508) 2022-12-15 18:29:46 -07:00
demonspork 0719510ab5
Update file_cache.lua (#6507)
* Update file_cache.lua

Updated file_cache.lua to use default settings for compatibility with the removal of config.lua/local.lua. Also refactored some code for readability/nesting

* reload remote server list on cache clear
2022-12-14 10:10:34 -07:00
FusionPBX a83982ea1b
Set where and order_by to public 2022-12-14 09:58:27 -07:00
FusionPBX 30ddc55e03
Update 035_call_direction.xml
Change call_direction dialplan to set the value to local only if the value is empty.
2022-12-12 10:10:03 -07:00
FusionPBX 5ed0b299aa
Update and rename 030_call_direction.xml to 035_call_direction.xml 2022-12-12 10:08:23 -07:00
FusionPBX a593f567d1
Add the greeting to the database when uploaded 2022-12-09 18:55:49 -07:00
FusionPBX b3d201b909
Add Voicemail Greeting mp3 option 2022-12-09 15:01:27 -07:00
Alex 045c87c98c
Update SortableJS to 1.15.0 (#6506) 2022-12-09 10:42:09 -07:00
FusionPBX 49e8222219
Clear the speed_dial cache. 2022-12-08 22:12:22 -07:00
FusionPBX 3f4c74dac8
Simplify the speed_dial cache key 2022-12-08 21:07:25 -07:00
demonspork a62235e983
Typo Fix in recordings.php (#6504) 2022-12-08 16:16:13 -07:00
FusionPBX 7997d808ce
Make this a case insensitive 2022-12-08 07:44:55 -07:00
FusionPBX 7b928dc6b4
Fix conference active buttons.
Security validation wasn't quite right so it prevented the mute, unmute and other conference actions from working.
2022-12-07 22:29:59 -07:00
FusionPBX b7147022cc
include document root and config.conf 2022-12-07 21:52:34 -07:00
chansizzle b8c2fc182a
allow fax FROM to have more characters (#6503)
Fax cover sheet FROM field - increase the number of characters
2022-12-07 11:13:16 -07:00
FusionPBX 433918a151
Special characters not required by default.
Long enough password special characters can be optional
2022-12-07 00:46:02 -07:00
FusionPBX 1cb9c932b8
Use the new ivr_menu answer setting. 2022-12-06 13:31:05 -07:00
FusionPBX 92123052e1
Add answer to IVR Menu dialplan.
Whether to add application answer to the IVR Menu dialplan.
2022-12-06 13:27:14 -07:00
FusionPBX bccc736fea
Update xml_cdr.php 2022-12-05 17:52:36 -07:00
FusionPBX 5fabba6bb9
Default to default sip_to_user
The value sip_req_user is not working out as a good default. Change this to better default is sip_to_user.
2022-12-05 09:43:50 -07:00
FusionPBX 7cb9836574
Update version to 1.1
Deprecate the v_call_recordings table
2022-12-03 19:23:58 -07:00
FusionPBX 3b9357976d
Use the new call recordings view 2022-12-03 19:19:29 -07:00
FusionPBX afa57b26a4
Update call recordings with more details
- Use the view_call_recordings view
- Add caller id name, number and destination
- Add more to the search
- Improve responsiveness
- Remove count to improve speed
2022-12-03 18:46:58 -07:00
FusionPBX 259dd1fbab
Add view_call_recordings 2022-12-03 18:44:17 -07:00
FusionPBX 77cbcad4dc
Add Caller ID Name, Number, and Destination 2022-12-03 18:42:07 -07:00
FusionPBX 0f60b2b34d
Add record_length numeric
And remove call_recordings save
2022-12-03 18:36:42 -07:00
FusionPBX c910f2177a
Add record_length type numeric 2022-12-03 18:24:09 -07:00
garryavx 93dc310178
Update {$mac}.cfg (#6248)
Added a line to set SRTP encryption. the default setting yealink_srtp_encryption was not setting properly to my T56a devices. I downloaded my config files and did not find an entry for srtp at all.

compared with the t54w template and it did have a srtp setting. So I pretty much stole the line from the T54w template and dumped it in here.

The T54w template is vastly superior to this one and this probably needs a rewrite to bring it in line.

Tested on my T56a and it at least gets the job done.
2022-12-03 14:50:53 -07:00
hershyheilpern ec91cbb962
Update {$mac}.xml (#6495)
Add variable options for Line Echo Canceller & Network Echo Suppressor
2022-12-03 14:48:23 -07:00
Vincent e8d01efc58
Add the P1X, P2X, P3X, P5X, i86Box, iMetalBox, audioKit Series for Flyingvoice in Devices. (#6502)
* Fix the registration failed after provision Flyingvoice phone.

* Fix the parameter configuration of Flyingvoice not displayed in the Default Settings

* Fix: after configuring SIP line 1 of Flyingvoice phone, other SIP lines are disable and the configuration parameters of Flyingvoice are not displayed by default settings.

* Fix after configuring SIP line 1 of Flyingvoice phone, other SIP lines are disable.
* Fix the configuration parameters of Flyingvoice are not displayed by default settings.

* Fix: when only one sip line's shared line is enable, the shared lines of all SIP lines will be enable.

* Fix: unable to generate configuration file of Flyingvoice due to syntax error.

* Add the P1X, P2X, P3X, P5X, i86Box, iMetalBox, audioKit Series for Flyingvoice in Devices.
2022-12-03 14:46:40 -07:00
FusionPBX 7767c7dc33
Disable yealink_provision_url by default.
- When this is disable it will use the domain of the tenant.
- If the domain of the tenant is not resolvable then yealink_provision_url is needed.
- One reason to disable it is the domain_name has to be manually updated to the correct domain.
2022-12-02 17:39:02 -07:00
chansizzle 61b1c5547b
Update call_block.php (#6500)
show all domains when using show all
use the correct permission for show all access
2022-11-30 09:35:38 -07:00
FusionPBX 6aab62d12f
Set default setting to enabled to true.
Set default setting to enabled to true for yealink_missed_call_power_led_flash_enable.
2022-11-30 09:30:49 -07:00
FusionPBX 8c7677bbb2
Disable until its less disruptive for multiple tabs 2022-11-29 15:03:46 -07:00
FusionPBX 7b9892b414
Add domain_json_token_name and domain_json_token_hash 2022-11-28 21:09:19 -07:00
FusionPBX 57756eb2a8
Add domain json token to the template 2022-11-28 21:07:18 -07:00
FusionPBX 421b5dd024
Use domain_view permisison for better versatility. 2022-11-28 21:05:05 -07:00
FusionPBX 7b9203e84f
Correc the permission name 2022-11-28 20:11:32 -07:00
FusionPBX 2885115ed8
Live on demand domain search. 2022-11-28 14:56:52 -07:00
FusionPBX bbde291760
Create domain_json.php 2022-11-28 14:52:53 -07:00
FusionPBX cb7881ce02
Minor version update to 5.0.6 2022-11-28 14:31:13 -07:00
Marvin Skeete dba7375faa
Update SIP Transport and Added Idle Screen vars (#6498)
<!--# P130 = 0-->
{if $account.1.sip_transport == 'udp'}P130 = 0{/if}
{if $account.1.sip_transport == 'tcp'}P130 = 1{/if}
{if $account.1.sip_transport == 'tls'}P130 = 2{/if}
{if $account.1.sip_transport == 'dns srv'}P130 = 1{/if}

<P340>{$grandstream_enable_idle_screen_download}</P340>
<P1349>{$grandstream_download_idle_at_boot}</P1349>
2022-11-24 21:07:22 -07:00
emak bfbfd8a99b
Add French translations for email_address labels (#6494) 2022-11-21 19:25:43 -07:00
FusionPBX 61652e1eb3
Update and rename 505_call-forward-all.xml to 515_call-forward-all.xml 2022-11-18 12:00:51 -07:00
FusionPBX c50e737beb
Update and rename 500_follow-me-destinations.xml to 520_follow-me-destinations.xml 2022-11-18 11:57:21 -07:00
FusionPBX 696ad43044
Add queue email address 2022-11-18 00:12:53 -07:00
FusionPBX 700e964221
Add queue_email_address to call_center_queues 2022-11-18 00:02:43 -07:00
FusionPBX e32351eee0
Add label-queue_email_address 2022-11-17 23:36:10 -07:00
FusionPBX 440883fba8
Add iptables chain add and exit functions 2022-11-17 21:59:46 -07:00
FusionPBX ff2aa6a5db
Start specific gateway using sofia profile startgw
Old way to start gateway was re-scanning the SIP profile.
2022-11-16 14:54:22 -07:00
zrd740 c447dccd21
Update y000000000068.cfg (#6473)
Fixed a typo in call pickup variable setup for T41S to make it consistent with other yealink phone templates
2022-11-15 22:23:43 -07:00
agree 095e1f6016
[directory.lua] Add domain_uuid to export_vars (#6493) 2022-11-15 22:22:11 -07:00
FusionPBX 135686c252
Replace the commas for display with a space.
Browser will handle different display sizes better with a space.
2022-11-15 11:01:26 -07:00
FusionPBX 2d3b41a3ee
Use wild card with sofia_contact by default. 2022-11-15 10:37:37 -07:00
FusionPBX 520b5d71f3
Add access control Import button 2022-11-14 17:40:41 -07:00
FusionPBX 895530ce71
Create access_control_import.php 2022-11-14 17:39:31 -07:00
FusionPBX ddcc5d3065
Fix number alias by removing code that broke it. 2022-11-14 16:48:09 -07:00
FusionPBX 6a8bf567ae
Set user, admin and var passwords if isset is true 2022-11-11 10:22:16 -07:00
FusionPBX 9e5f931626
Use the callers Caller ID for local calls
With set to false the callers original outbound caller ID information is used. 
Keep original callers caller ID is now set as the default.
With these enabled to true the caller ID is picked from the extension being called.
2022-11-09 10:44:58 -07:00
FusionPBX c4a46297a0
Add PHP ODBC 2022-11-08 09:45:04 -07:00
FusionPBX 88bc541d0d
Create database object if not set. (#6492)
* Create database object if not set.
2022-11-08 09:40:12 -07:00
Dan 4a1913b447
Update to jQuery 3.6.1 (#6491)
This commit updates FusionPBX to use jQuery 3.6.1 and also adds a fallback to the other variable name for offhook autodial on the HT802.
2022-11-07 08:58:38 -07:00
FusionPBX b241b921fa
Create user_json.php 2022-11-07 08:57:01 -07:00
FusionPBX 0eaab4e60a
Add contact relation search 2022-11-06 00:08:36 -06:00
FusionPBX 1ec48d46c9
Update contact_edit.php 2022-11-06 00:04:40 -06:00
FusionPBX acf9a046e0
Add contact relation search 2022-11-05 18:27:21 -06:00
FusionPBX f3c2c4930d
Create contact_json.php 2022-11-05 18:26:09 -06:00
FusionPBX ce77a7ca75
A better way to add a page timeout 2022-11-04 10:59:32 -06:00
FusionPBX 786d60120a
Update kickall
- Original kickall had an extra set command and was missing the domain name.
- Shouldn't be needed because conference is set to end when moderator leaves
- For this reason disabled by default.
- Additional kickall with sched_api is a time limit for the call
2022-11-04 10:57:52 -06:00
agree d9e43cda4c
set dbh if there isn't a global dbh set (#6489) 2022-11-03 10:49:22 -06:00
FusionPBX b88c79938b
Use this for better backward compatiblity
Will keep this file for a while to give people an easier upgrade.
It will be removed again but will give some time for features to be upgraded.
2022-11-02 21:05:54 -06:00
FusionPBX d3ee256286
Remove these as they break PHP 7.0
Doesn't just break PHP 5.6 it also breaks PHP 7.0
2022-11-01 15:52:56 -06:00
FusionPBX acf3781bd3
Use the destination_prefix permission 2022-11-01 12:07:56 -06:00
FusionPBX ef98de7a8f
Update to match other recent SPA phones 2022-10-31 10:02:38 -06:00
FusionPBX 3796d6424e
Add RTP_Packet_Size set to 0.020 2022-10-31 09:56:37 -06:00
FusionPBX cb96c4a848
Inbound routes use destination sip_req_user
This setting allows adjusting the variable that is used for match the inbound number. For many years inbound routes have used destination_number as the variable to match inbound calls. When SIP diversion header is used the destination_number is not always dependable. The variable sip_to_user is more dependable but still fails with how some providers have implemented the SIP diversion header. It appears the sip_req_user is the seems to be the most dependable.
2022-10-28 09:10:54 -06:00
FusionPBX b620b36f28
Use SQLite by default for FreeSWITCH 2022-10-26 13:52:30 -06:00
FusionPBX 3859f72c5a
Minor version increment to 5.0.5 2022-10-26 10:01:44 -06:00
Tuan Nguyen c797953291
Fix Call Center max wait time with no agent reached (#6487)
Fix xml_handler when edit Max Wait Time With No Agent Reached when edit Call Center
2022-10-26 09:57:36 -06:00
FusionPBX 1ec440684b
Replace X-accountcode with accountcode
Deprecating the "X-" Prefix (RFC 6648)
https://www.rfc-editor.org/rfc/rfc6648
2022-10-26 09:56:19 -06:00
Alex b3f16569fd
Update multiple registration (#6488)
* Update {$mac}.cfg
2022-10-24 16:09:01 -06:00
FusionPBX 95dd6094e0
Removing this because it breaks Missed Call results
Missed calls should include hangup_cause NO_ANSWER
2022-10-24 15:27:41 -06:00
levishores 63e6c5ab66
Update blf_subscribe.lua (#6482) 2022-10-24 13:09:33 -06:00
FusionPBX bdbc1c2d4d
Fix dual registration 2022-10-24 10:45:04 -06:00
FusionPBX f40621141f
Update the include path 2022-10-22 23:56:10 -06:00
FusionPBX 720eb58a89
Re-organize the inlcudes. 2022-10-22 23:52:01 -06:00
FusionPBX 150e3cfed7
Re-organize the includes 2022-10-22 23:50:31 -06:00
FusionPBX 9cd8261eda
Update email_queue.php 2022-10-22 23:47:58 -06:00
FusionPBX 5a71e16f15
Use the config.conf file 2022-10-22 23:45:59 -06:00
FusionPBX bc378823bd
Check teh config method result.
Show the error message if the result is false.
2022-10-22 19:23:03 -06:00
FusionPBX d87ecbb3f2
Add a message variable. 2022-10-22 19:21:48 -06:00
FusionPBX bfe557edc3
install class method return boolean 2022-10-22 19:13:32 -06:00
FusionPBX 9880cd630a
Update install.php 2022-10-22 18:46:22 -06:00
FusionPBX dd87f510c6
Update install.php 2022-10-22 18:39:03 -06:00
FusionPBX a0e3cd1268
Use is_writable on the config directory
- If the directory is writable and config.php exists then use it to write the config.conf file.
- Otherwise provide a message on the commands to run to create the config.conf file.
2022-10-22 18:16:52 -06:00
FusionPBX e807f9c14a
Move the config.php section 2022-10-22 17:48:47 -06:00
FusionPBX e84927a216
Use the new install class
- Move the code to build config.conf file
- If the config.php file exists use it to create the config.conf file
2022-10-22 16:49:24 -06:00
FusionPBX 2178427977
Add content to the config method 2022-10-22 16:44:19 -06:00
FusionPBX 7685e7fcdb
Delete iso_countries.php 2022-10-22 15:23:04 -06:00
FusionPBX 4892c468eb
Create the install class 2022-10-22 15:22:47 -06:00
FusionPBX fdf5f5f1f1
Update configuration.htm 2022-10-22 15:06:24 -06:00
FusionPBX 127d55579f
Add button style to the install 2022-10-22 14:16:53 -06:00
FusionPBX b44a4da6e1
Add local CSS to install.php 2022-10-22 13:19:13 -06:00
FusionPBX d345542098
Update css.php 2022-10-22 10:49:09 -06:00
FusionPBX d8acec2630
Update install.php 2022-10-21 12:28:14 -06:00
FusionPBX 7485757458
Change the timeout to 20 seconds 2022-10-21 11:43:53 -06:00
FusionPBX 4afc040efa
Add SMTP Timeout and SMTPKeepAlive 2022-10-21 11:43:14 -06:00
FusionPBX 88b43cfa14
If no handle return false
Splitting up the condition and return false for each condition works in all tests.
2022-10-20 16:18:55 -06:00
FusionPBX b004e8f3ba
Add message Unable to connect... 2022-10-20 16:07:23 -06:00
FusionPBX 87360643ab
Update upgrade.php 2022-10-19 22:25:28 -06:00
FusionPBX 2ea90bfc52
Copy of the domain array and used it in dialplan import 2022-10-19 13:48:15 -06:00
frytimo 2bdf0d382e
add isset($_REQUEST['debug']) before testing value for true (#6486)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2022-10-19 11:49:31 -06:00
FusionPBX 2816a54a8f
Use the now() for PostgreSQL
This prevents and error for SQLite
2022-10-19 11:29:22 -06:00
FusionPBX 7e88b594dd
Use the database_dir variable 2022-10-19 11:07:43 -06:00
FusionPBX 14552806a1
Update upgrade.php 2022-10-19 11:06:38 -06:00
FusionPBX 353be53ba8
Use sqlite by default
FusionPBX uses PostgreSQL by default
FreeSWITCH uses SQLite by default
2022-10-19 11:06:24 -06:00
FusionPBX 0bba8702a1
Add sqlite support
Example use in config.conf file.

database.1.type = sqlite
database.1.path = /var/lib/freeswitch/db
database.1.name = core.db
2022-10-19 10:57:04 -06:00
FusionPBX 87ccce1867
Fix the sub data insert. 2022-10-18 13:04:16 -06:00
FusionPBX 47c13a7270
Set update_date now() when the status is updated 2022-10-18 07:58:03 -06:00
FusionPBX 8df6c6be4f
Update configuration.htm 2022-10-15 22:01:03 -06:00
FusionPBX dfe990b277
Update database.htm 2022-10-15 22:00:57 -06:00
FusionPBX ef3bd6ddaf
Update index.php 2022-10-15 21:14:43 -06:00
FusionPBX 2197aa0c74
Update login.php 2022-10-15 21:12:09 -06:00
FusionPBX 9436090b7b
Update index.php 2022-10-15 21:11:06 -06:00
FusionPBX eacff4c797
Code is causing a larger issue removed for more testing. 2022-10-14 12:38:01 -06:00
FusionPBX a373958ffd
Use $_SERVER['DOCUMENT_ROOT'] 2022-10-14 11:51:17 -06:00
FusionPBX 49e146c8c2
Write the new config.conf file.
Remove config.php and add the new code to write the config.conf file.
2022-10-14 11:18:42 -06:00
FusionPBX 5f12776252
change label-domain to domain_name. 2022-10-14 10:37:35 -06:00
FusionPBX 07916dec2e
Add server variables and project path 2022-10-14 10:30:52 -06:00
FusionPBX 80b76cd156
Add domain 2022-10-14 10:28:30 -06:00
FusionPBX 69246119f6
Fix the domain label 2022-10-14 10:23:14 -06:00
FusionPBX 61d8b54dcb
Fix the include path 2022-10-14 10:10:40 -06:00
FusionPBX 03ac05fc64
Moved to resources/require.php
Found a better home for this code.
2022-10-14 10:08:03 -06:00
FusionPBX 3b8d3b70ea
Include additional functions
Moved here from resources/functions.php
2022-10-14 10:07:14 -06:00
FusionPBX ef040f2b7a
Command line or web server both includes can work the same 2022-10-13 16:50:47 -06:00
FusionPBX 3e8ea2015f
Use the error reporting defined in config.conf 2022-10-13 16:23:20 -06:00
FusionPBX 0a25c48b5d
event socket make fp public 2022-10-13 12:52:52 -06:00
FusionPBX 58d0a1ad8c
Make sure resource exists before using feof
This code changes prevents this error.

Warning: feof() expects parameter 1 to be resource, bool given
2022-10-13 11:26:53 -06:00
FusionPBX 598eb4ab31
Wrap is_array arround foreach 2022-10-13 08:43:32 -06:00
FusionPBX 2a2069fe9e
Use is_array around foreach 2022-10-12 14:59:13 -06:00
FusionPBX d207508ac5
Use require_once instead of include for functions.php 2022-10-12 13:46:16 -06:00
FusionPBX 2d88fc35d8
Get http_protocol from default settings 2022-10-12 11:40:38 -06:00
FusionPBX 1fd0b9976b
Add http_protocol as a default setting 2022-10-12 11:38:14 -06:00
FusionPBX d3c4fa011d
Update index.php 2022-10-12 10:46:19 -06:00
FusionPBX 40680f1e00
Change comment from config.php to config.conf 2022-10-12 10:45:40 -06:00
FusionPBX 0ef99c7649
Update the description 2022-10-12 10:43:14 -06:00
FusionPBX f54f1e6fc5
Replace config.php with config.conf 2022-10-12 10:41:49 -06:00
FusionPBX 2bcf6743a5
Ensure DOCUMENT_ROOT and PROJECT_PATH exist 2022-10-12 10:24:30 -06:00
FusionPBX 1dee0683ef
Add missing resources/require.php 2022-10-12 09:47:19 -06:00
frytimo 4a8e148ccf
remove is_numeric check for voicemail id (#6484)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2022-10-11 21:32:32 -06:00
FusionPBX dc748c2376
Method text send the core/upgrade
Also remove the additional includes not necessary because of the auto loader in resources/require.php
2022-10-11 17:54:13 -06:00
FusionPBX 0a47fc22b3
Get the DOCUMENT_ROOT and PROJECT_PATH 2022-10-11 17:10:39 -06:00
FusionPBX b373e3c7fe
Needed to get DOCUMENT_ROOT and PROJECT_PATH 2022-10-11 15:53:18 -06:00
FusionPBX 227aa97adc
Use class_exists around auto_loader 2022-10-11 15:34:55 -06:00
FusionPBX b8e8c726be
Update the include handling. 2022-10-11 11:54:01 -06:00
FusionPBX b300961d75
Use server DOCUMENT_ROOT variable. 2022-10-11 11:45:37 -06:00
FusionPBX fa870da5c9
Use server DOCUMENT_ROOT variable
Move includes to the near the top of the page
2022-10-11 11:44:54 -06:00
FusionPBX f75f623767
Remove root.php and include require.php once 2022-10-11 11:27:57 -06:00
FusionPBX eadc950298
Remove deprecated domain_count 2022-10-11 11:09:48 -06:00
FusionPBX 0a2798575c
Remove domain_count
Not needed only request domain_uuid if value is null
2022-10-11 11:07:48 -06:00
FusionPBX 122a8c1e03
Set the temp_dir variable 2022-10-11 10:59:51 -06:00
FusionPBX 2f55ba03c8
Allow copy setting to a domain for single tenant 2022-10-11 10:20:02 -06:00
FusionPBX 8179da3ef8
Allow domain copy even for single tenant systems. 2022-10-11 10:16:57 -06:00
FusionPBX 878e5a10eb
Update database method connect to use config.conf 2022-10-10 19:43:07 -06:00
FusionPBX e3b782e7cb
Update user_dashboard.php 2022-10-10 19:39:27 -06:00
FusionPBX fb0c92bbeb
Change config.php to config.conf 2022-10-10 19:38:46 -06:00
FusionPBX 80d25cc088
Minor change from spaces to tabs 2022-10-10 19:37:47 -06:00
FusionPBX eb8ccb4fb5
Replace config.php with config.conf 2022-10-10 19:35:44 -06:00
FusionPBX 09427c23ba
Replace config.php with config.conf 2022-10-10 19:34:55 -06:00
FusionPBX 93ec88629b
Replace root.php 2022-10-10 17:28:02 -06:00
FusionPBX fe53483ed8
Update require.php 2022-10-10 16:59:57 -06:00
FusionPBX 83d2f4fe2c
Update login.php 2022-10-10 16:59:20 -06:00
markjcrane d50bcb476a Replace root.php 2022-10-10 16:35:14 -06:00
FusionPBX a52ab303e9
Remove deprecated write_config 2022-10-10 13:28:22 -06:00
FusionPBX 30ec556c4a
Remove script write_config method. 2022-10-10 13:27:50 -06:00
FusionPBX cdd6397285
Replace root.php with config.conf 2022-10-10 13:19:44 -06:00
FusionPBX 114fe7252c
Replace root.php with config.conf 2022-10-10 13:19:40 -06:00
FusionPBX 4f7018700a
Replace root.php with config.conf 2022-10-10 13:18:54 -06:00
FusionPBX 7a16083095
Replace root.php with new config.conf 2022-10-10 13:18:34 -06:00
FusionPBX 1c81f9c8b2
Replace config.php with config.conf 2022-10-10 13:16:32 -06:00
FusionPBX 7aa7ae4dd1
Add option to use host or hostaddr in config.conf 2022-10-10 13:08:30 -06:00
FusionPBX 26401d45c0
Replace config.lua with config.conf 2022-10-10 12:48:35 -06:00
FusionPBX f37dad8814
Update upgrade.php 2022-10-10 12:35:28 -06:00
FusionPBX adcc0ad068
Get the dial_string from default settings 2022-10-08 23:48:24 -06:00
FusionPBX 8f269a56f9
Update lazy_settings.lua 2022-10-08 23:43:51 -06:00
FusionPBX 263af5a76f
Change the indentation from two spaces to a tab. 2022-10-08 23:43:08 -06:00
FusionPBX 6081a34833
Update {$mac}.xml (#6483)
* Update {$mac}.xml

* Update {$mac}.xml
2022-10-05 15:49:06 -06:00
FusionPBX a7721f5186
Add grandstream_auto_dial_number and grandstream_auto_dial_delay 2022-10-05 15:48:55 -06:00
FusionPBX b58d34010f
Add option billing to phone numbers and addresses. 2022-10-05 10:53:55 -06:00
FusionPBX 4d8496f4ad
Fix the event socket connected method
It was not detecting the connection to event socket correctly. 
This change resolve the high cpu usage for event guard.
2022-10-04 12:36:27 -06:00
FusionPBX 0db773e395
Correct the user_log_allowed function 2022-10-03 22:32:17 -06:00
FusionPBX b16265458e
Chang device key line number from 12 to 99 2022-10-03 10:40:23 -06:00
FusionPBX 93dd8bda71
Change variabale name from action to destination_action.
Resolves a conflict with another variable called action.
2022-09-30 16:18:39 -06:00
FusionPBX aeec91fae8
Fix insert on for child data
Add a few try catch,
Add ; to the end of a few SQL queries
2022-09-30 12:46:44 -06:00
FusionPBX e06a7d4fef
Minor version update to 5.0.4 2022-09-30 11:28:28 -06:00
FusionPBX 92f0eb7405
Fix a problem with loading default sofia global settings. 2022-09-30 11:27:15 -06:00
amibtl 1a0a8e1f6a
Update call center dialplan template for add and edit (#6481)
* prepend to cc_export_vars

* prepend to cc_export_vars
2022-09-30 08:39:09 -06:00
FusionPBX 8bdfcb935b
Time condition set to default false.
The add was setting condition to dialplan_continue false and update set to true. This changes makes it consistent as both add and update will set dialplan_continue to false.
2022-09-28 12:00:31 -06:00
FusionPBX 7964410618
Use is_array before foreach and implode 2022-09-27 14:29:53 -06:00
FusionPBX ad9087316a
Fix a division by zero error.
Add better support for BSD
2022-09-27 13:53:52 -06:00
FusionPBX c28dcab2ca
Add grandstream_enable_call_features template var (#6480)
* Add grandstream_enable_call_features template var

* Update {$mac}.xml

* Update {$mac}.xml

* Update {$mac}.xml
2022-09-27 09:02:31 -06:00
FusionPBX 0e163a8e68
Update {$mac}.xml 2022-09-27 08:58:20 -06:00
FusionPBX 6d9e83cb1f
Remove /pb off of the phone book path 2022-09-27 08:43:10 -06:00
jonathanblack1000 d084f68a45
Update Grandstream Templates on most common models (#6479)
Add grandstream_missed_call_log, grandstream_missed_call_notification, grandstream_missed_call_backlight, grandstream_firmware_upgrade_protocol, grandstream_onhook_dial_barging,  grandstream_transfer_mode_via_vpk, grandstream_enable_call_features.
Add condition on grandstream_distinctive_ringtone_name_1, and grandstream_distinctive_ringtone_name_2.
Update Connection request user/pw to work better with GDMS.
On grandstream_wallpaper_url, use current setting name on GRP2613
2022-09-27 08:17:31 -06:00
FusionPBX 370139f7ef
Add sip_req_user next to sip_to_user 2022-09-26 15:19:31 -06:00
FusionPBX 2f19cf2ff4
Add sip_req_user as another alternative destination. 2022-09-26 14:46:52 -06:00
FusionPBX 568d561c0c
Update debian.service 2022-09-26 11:45:00 -06:00
FusionPBX 6fc44d467e
Update debian.service 2022-09-26 11:43:57 -06:00
FusionPBX f70576b8d0
Update debian.service 2022-09-26 11:43:22 -06:00
FusionPBX ecb385cf60
PostgreSQL maybe running on a different server 2022-09-26 11:42:32 -06:00
FusionPBX 49aa12067b
When using sip_to_user set before the dialplan_cache_key
To get use the sip_to_user  it needs to be set before the cache
2022-09-22 16:26:49 -06:00
FusionPBX f4b9a3331c
Change from switchname to hostname 2022-09-22 15:02:36 -06:00
FusionPBX eeec6173e0
Update dialplan.lua 2022-09-22 15:01:36 -06:00
FusionPBX ed107606d3
Deprecated no longer needed. 2022-09-22 11:38:39 -06:00
FusionPBX 6f2a8df168
Update FusionPBX version only when changed. 2022-09-22 11:23:51 -06:00
FusionPBX 3c18286c69
Update if the call center dialplan is different 2022-09-22 10:40:16 -06:00
FusionPBX 27041e63e6
Only update version if it has changed 2022-09-22 10:15:49 -06:00
FusionPBX 24b982d87c
Add is_array around foreach
Prevents a PHP Warning.
2022-09-22 09:45:29 -06:00
FusionPBX 8a0f4ed6d2
Add group_uuid for group permissions if the ID is null 2022-09-22 09:22:23 -06:00
FusionPBX 21d6f002b3
Add missing permissions.
Goal is to make work to make loading new permissions more efficient.
2022-09-22 00:25:00 -06:00
FusionPBX eafd5a9fe0
Add missing sofia global settings. 2022-09-22 00:09:01 -06:00
FusionPBX 2900b9fb1b
Code had two file connections use one.
Noticed there were two open connection for the file log. A few other adjustments.
2022-09-21 13:02:56 -06:00
FusionPBX bc2b14739c
Change 'do' to 'action' and update options.
Options: upgrade_source, upgrade_schema, app_defaults, menu_defaults, permission_defaults
2022-09-20 19:01:32 -06:00
FusionPBX a355dda5b7
Fix a copy error.
Fixed the copy issue when the data includes insert_user, insert_update, update_user and update_date.
2022-09-20 13:56:54 -06:00
FusionPBX c9b3b7ce3f
Remove settings that were accidently addded here. 2022-09-19 16:13:11 -06:00
FusionPBX 7435e8bd91
Remove extra $z++ 2022-09-19 12:59:12 -06:00
FusionPBX ff6f555793
Remove extra $z++ 2022-09-19 12:54:29 -06:00
FusionPBX dee0b53cfe
Remove an extra $z++; 2022-09-19 12:52:24 -06:00
FusionPBX e29877e958
Move unset parameters outside of the debug
Unset of the parameters is required or can have parameters that interfere with other queries.
2022-09-19 09:30:20 -06:00
FusionPBX 446f4615bf
Bug fix use column instead of field
If updated in the last few days then you need should clear the file cache. Also disabled event_guard_log_allowed until there is a setting to enable or disable it.

Update the source code
cd /var/www/fusionpbx
rm /var/cache/fusionpbx/*
service event_guard restart
2022-09-18 17:53:03 -06:00
FusionPBX 884e90ac39
Comment out the database response. 2022-09-18 04:48:17 -06:00
FusionPBX 4400618830
Sub array data use the child table name.
In Destination edit it was using the dialplan table name instead of child dialplan details table.
2022-09-18 04:47:17 -06:00
FusionPBX 50b66f8bea
If the domain_uuid is null the data is global.
This error broken dialplan edit when saving a global dialplan.
2022-09-18 03:08:18 -06:00
FusionPBX d5bd5957a4
Minor edit add a few spaces. 2022-09-18 02:59:58 -06:00
FusionPBX 7c2017bd03
On insert and update add the user and date 2022-09-18 02:57:43 -06:00
FusionPBX 2ff62f638b
Add a few minor changes for code consistency. 2022-09-18 02:13:33 -06:00
FusionPBX 5485764c08
Update event_guard_logs.php 2022-09-18 02:10:28 -06:00
markjcrane eb5c25aa35 Add insert_date, insert_user, update_date, update_user to all tables 2022-09-18 00:54:37 -06:00
frytimo ba3b60b07b
Move database methods to static and document database class (#6474)
* Add new static method to created newly connected database object

* Document database class and clean up and document some of the methods.
This removes the methods that should not be in each instance and places
them in the single instance class as to occupy less resources and be
able to create database objects more efficiently.

* More docs & removed the ability to set any value within the object.

Co-authored-by: Tim Fry <tim@voipstratus.com>
2022-09-17 15:44:21 -06:00
FusionPBX 46e554e2fc
Update readme.md 2022-09-17 11:07:02 -06:00
FusionPBX 894afb08a1
Update readme.md 2022-09-17 11:06:34 -06:00
FusionPBX ba398de05c
Update readme.md 2022-09-17 11:05:40 -06:00
FusionPBX 85ca868ee4
Update event_guard_log_edit.php (#6477) 2022-09-17 10:19:56 -06:00
FusionPBX a2cedd0513
Reduce fax originate command
- Size limit for originate command parameters around 1130 characters.
- The originate command is used in event socket and not in shell command so remove escapeshellarg.
- Remove for_fax=1 as it doesn't seem to be used anywhere.
2022-09-16 17:05:36 -06:00
FusionPBX de21143246
Reduce size of fax originate command.
Originate command is limited to around 1130 characters. So this work was to reduce the size. Single quotes aren't needed on everything as this is not a command line. Its an even socket command. Also moving fax_variables into the fax options prevents variable duplicates.
2022-09-16 17:02:16 -06:00
FusionPBX b5ba126aae
Fix Sofia global settings search. 2022-09-15 23:42:27 -06:00
FusionPBX 864afee9c3
Preven overwritting global profile settings. 2022-09-15 23:37:47 -06:00
FusionPBX 410bab6d05
Allow access for addresses that have been unblocked 2022-09-15 17:34:38 -06:00
FusionPBX 1d55981cbb
Add user_log_allowed function. 2022-09-15 17:00:57 -06:00
FusionPBX 4fce9a4565
Filter for specific Events 2022-09-15 16:01:47 -06:00
FusionPBX 6f6eb88ebb
Use single quotes for the function_exists parameter. 2022-09-12 20:50:13 -06:00
FusionPBX 694fa611ef
Check to see if posix_getsid exists 2022-09-12 20:49:04 -06:00
FusionPBX 7d641711fc
Get the mime type to set vm_message_ext 2022-09-12 16:53:12 -06:00
FusionPBX 81688cb8c8
Remove transcription from if statements.
Transcription is handled using the email queue.
2022-09-12 16:07:59 -06:00
FusionPBX 5ed64d2be4
Prevent an error message if the directory doesn't exist. 2022-09-12 11:41:03 -06:00
FusionPBX be257eeb03
Use is_array before foreach 2022-09-12 09:19:21 -06:00
FusionPBX 0fce8ac1a5
Add more comments and is_array before foreach 2022-09-12 08:59:28 -06:00
FusionPBX bb56827f4f
Use is_array before foreach 2022-09-12 08:54:16 -06:00
FusionPBX b17748dc1e
Use loop only if destination_actions is an array 2022-09-11 10:22:23 -06:00
FusionPBX c9a661de6f
Optional to send syslog message for the cache delete and flush 2022-09-10 11:40:59 -06:00
FusionPBX bf11de1215
Add option for agent_authorized by default enabled false. 2022-09-09 09:03:13 -06:00
FusionPBX 33ff275c12
Add call_center_agents.php as agent blf helper. 2022-09-08 13:52:08 -06:00
frytimo e88176c755
voicemail boxes can now be text or numeric (#6467) 2022-09-07 16:37:02 -06:00
Joyce Babu ae7c312136
Add Telekonnectors Galaxy 1000 Plus template (#6469) 2022-09-07 16:36:03 -06:00
FusionPBX c12cd0d296
Unset destination_app and destination_data
This fixes a bug where a blank empty value shows the previous value.
2022-09-07 16:33:10 -06:00
Norman King 7369409648
Allow setting hanging group mode on a per line basis for grandstream … (#6472)
* allow setting hanging group mode on a per line basis for grandstream dp bases.

* Keep grandstream_hanging_group_mode for better backwards compatibility.
2022-09-07 16:24:49 -06:00
FusionPBX 8f8e0795ff
Add label-file_name 2022-09-06 17:16:40 -06:00
FusionPBX aa2d0eb477
Show the file name on the second page of the import. 2022-09-06 17:15:35 -06:00
FusionPBX f9324acecc
Wallboard in ES (panish) 2022-09-06 12:39:45 -06:00
garryavx d71e4075a4
Update app_config.php (#6470)
* Update app_config.php

changed the wording to let the user know they can add multiple email address for delivery.

* Update app_languages.php
2022-09-02 12:22:06 -06:00
FusionPBX 6bed337061
Chunk the work into batches of a 1000 numbers at a time.
This is useful for customers with over 1000 destination numbers. Will work from command line with any number of destination numbers.
2022-09-01 11:11:13 -06:00
FusionPBX 52b06b5afc
Use /proc/$pid if posix_getsid is undefined 2022-08-30 14:45:09 -06:00
FusionPBX 29d1221346
On CentOS posix_getsid function may not be available. 2022-08-30 14:20:40 -06:00
FusionPBX 334d989b08
By default don't set the this outbound_caller_id when using loopback 2022-08-29 16:51:23 -06:00
FusionPBX f63cbfaa78
Fix the find_file function when so it works with base64 2022-08-27 23:29:20 -06:00
FusionPBX a43388bace
Increase the timeout to 30000 microseconds.
30,000 Microseconds = 0.03 Seconds. Longer timeout reduces the CPU. If the timeout is too long then the Status -> SIP STATUS page will take longer to load.
2022-08-27 16:45:07 -06:00
frytimo 09dbdfb79f
Removed usleep command (#6468)
* Removed usleep command

* Update event_socket.php
2022-08-26 16:53:25 -06:00
FusionPBX 56de8714fa
Add base.active_handset.number = 8 to Yealink w60b
#Sets the amount of active handsets allowed on the base station, options are 4 or 8
base.active_handset.number = 8
2022-08-26 14:45:19 -06:00
FusionPBX fd364879ac
Remove duplicated yealink_firmware_t54s 2022-08-26 14:34:09 -06:00
FusionPBX 0435dc0719
Remove duplicate yealink_remote_phonebook_enable 2022-08-26 14:30:04 -06:00
FusionPBX 2ca336e956
Wait until event socket is ready then connect to it.
If FreeSWITCH is not started yet then wait to connect to it then
2022-08-26 12:05:28 -06:00
FusionPBX b8f1eb7f10
Add function to check if we are connected to event soscket 2022-08-26 11:48:47 -06:00
FusionPBX 347e02e273
Update software.php 2022-08-25 15:24:14 -06:00
FusionPBX d62f360f77
Delete the cache in e.164 format. 2022-08-24 16:53:31 -06:00
frytimo 6bb6ae6b2b
Fix PHP warning for PDO::setAttribute() requires 2 parameters (#6464)
Co-authored-by: Tim Fry <tim@voipstratus.com>
2022-08-24 14:09:33 -06:00
FusionPBX 2cd382ec38
Get caller ID from the same call flow -> caller profile
This is the same place we get caller ID from in the XML CDR Details page.
2022-08-23 13:13:34 -06:00
agree d52695b29f
[fax] replace bg_system with os.execute (#6462)
to support systems that have the system commands disabled
2022-08-23 10:14:34 -06:00
FusionPBX e51f48b17f
Update app_defaults.php 2022-08-22 17:54:29 -06:00
FusionPBX 2fcd0dbd9a
Use destination_app and destination_data 2022-08-22 17:30:31 -06:00
yois615 6e2e54922f
Retain recording display name and reset digit timeout (#6163)
This commit fixes 2 issues:
1. The recording name was not preserved upon
rerecording

2. When selecting rerecord, the digit timeout would retain
the value of 100, preventing the user from selecting the recording
id
2022-08-22 11:15:23 -06:00
agree fa270a4ee8
[ring groups] remove unused code (#6456) 2022-08-22 11:11:59 -06:00
yois615 04d3b0bfe0
[ht814] Grandstream escape html and sip_port (#6457) 2022-08-22 11:11:23 -06:00
Harry Foster 3d0fe368ac
Adding the Yealink Tone Country setting to all templates, and including two more minor revisions of handsets that have been released. (#6458)
* Added two new minor hardware revisions, the CP925 and T42U, and added the voice.tone.country = {} to all templates, previously missing on most

* Minor typo from a wrong window issue, and removing the commented examples for easier grepping
2022-08-22 11:10:24 -06:00
emak e52f6626f9
Fix fax_queue to Email PDF Instead of TIF (#6461)
* Fix fax_queue to Email PDF Instead of TIF

Variables `$fax_file_tif` and `$fax_file_pdf` are missing a period before the extension so file_exists is always evaluating to false. Thus, TIF was always sent. Adds the period back into the path so the check works correctly.

NOTE: `$fax_file_tif` is completely unused and can be removed from this code for cleanup.

* Use single quotes.
2022-08-22 10:10:31 -06:00
FusionPBX 4f2d0316c5
Add custom event_guard:unblock 2022-08-20 12:48:41 -06:00
FusionPBX 01b31dce1a
Watch for event_guard:unblock and more debug info. 2022-08-20 12:47:24 -06:00
Joyce Babu 6365b28cf2
Add Telekonnectors Galaxy 1000 template. (#6442) 2022-08-20 09:28:15 -06:00
emak 26b3e7893b
Add Fax Queue TX Email Variables (#6460)
* Add db field to v_fax_queue to link to fax log

* Add fax_duration field to v_fax_logs

Add fax duration to db to allow for logging of this data for fax email templates.

* Add new email variables to fax send

* Fix some logging variables and fax_log_uuid

Added back some missing session variables for the fax log.

Also update the email queue db field with the fax_log_uuid to allow us to add variables to the fax email templates later.

* Update hangup_tx.lua
2022-08-19 18:08:43 -06:00
FusionPBX f8f09f9a31
Skip resolving IP addresses to improve performance. 2022-08-18 23:31:42 -06:00
FusionPBX a9e534f1fa
Remove playback silence_stream 2022-08-18 17:59:41 -06:00
FusionPBX ea9b9ce621
Update additional occurances of PDO::PGSQL_ATTR_DISABLE_PREPARES 2022-08-18 17:53:33 -06:00
FusionPBX 2783cbd251
Update database.php 2022-08-18 17:39:51 -06:00
FusionPBX 98b19d1f22
Only add PDO::PGSQL_ATTR_DISABLE_PREPARES for versions of PHP that support it. 2022-08-18 17:37:43 -06:00
FusionPBX e4884fa4b1
Remove outbound_caller_id_number as it overrides caller ID
When the caller is a local extension to another location extension the caller ID in the follow-me-destinations dialplan sets the caller ID to the local extension number and then the VoIP provider doesn't accept the call. As long as the local extension has Outbound Caller ID set on their extension then the information is already correct.
2022-08-18 15:33:16 -06:00
Alex ada9f69af3
Add status dropdown to Fax Queue search (#6459)
* Update fax_queue.php

* Update app_languages.php
2022-08-18 13:13:50 -06:00
FusionPBX 82bb973ea7
Update the event_guard constructor. 2022-08-17 17:27:47 -06:00
FusionPBX 7e34f1f8f4
Add permission event_guard_log_unblock 2022-08-17 17:26:26 -06:00
FusionPBX 1b8bf75eff
Simplify outbound destinations further by hiding irrelevant settings. 2022-08-17 09:38:24 -06:00
FusionPBX 074628ca7a
Add method unblock to the event_guard class. 2022-08-17 00:27:08 -06:00
FusionPBX 2177091702
Use unblock instead of delete. 2022-08-17 00:25:53 -06:00
FusionPBX c2085c2320
Add button-unblock, label-unblocked, and label-pending 2022-08-17 00:23:54 -06:00
FusionPBX 9b06671810
Add ability to unblock addresses and use more descriptive variable names. 2022-08-17 00:06:52 -06:00
FusionPBX 326544a006
Get the hostname of the server before the loop. 2022-08-16 18:45:48 -06:00
FusionPBX df755fae5c
Hide columns for smaller screens, and truncate the email_body. 2022-08-16 18:43:03 -06:00
Alex a517e185d5
Add status dropdown to search (#6455)
* Update app_languages.php

* Update email_queue.php

* Update app_languages.php
2022-08-16 15:58:05 -06:00
FusionPBX 5fe1f5c601
Add an IPv4 address missing cidr notation add /32 by default. 2022-08-16 14:16:39 -06:00
FusionPBX 3519353008
Hide a few columns for smaller screens. 2022-08-16 11:51:13 -06:00
Alex d9ed7a343f
Update devices.php (#6454)
* Update devices.php

* Update event_guard_logs.php
2022-08-16 11:27:17 -06:00
Alex 93c90c8969
Add a filter dropdown (#6453)
* Update event_guard_logs.php
2022-08-16 10:56:30 -06:00
agree f94bad1730
[xml_cdr] more caller id handling (#6452) 2022-08-16 00:00:43 -06:00
FusionPBX 8a3af98f6b
Multiple changes including reconnect to event socket if needed.
- IN function block replace array with event to prevent a naming conflict.
- Reconnect to event socket if the connection is lost.
- Use condition if is_array around each foreach.
- Unset the database connection
- Use event socket variables and close the session before the loop
2022-08-15 14:54:49 -06:00
FusionPBX 24b9012d8c
Update email_send.php 2022-08-11 13:43:37 -06:00
FusionPBX 00c9452e13
Add a line feed to the Yealink T58w after outbound_proxy_enable 2022-08-10 22:50:55 -06:00
FusionPBX 59b42035e4
directory.xml 2022-08-09 14:13:53 -06:00
FusionPBX d67fa590bd
Update internal-ipv6.xml.noload 2022-08-09 10:31:30 -06:00
FusionPBX d9c2388975
Update internal.xml.noload 2022-08-09 10:30:46 -06:00
FusionPBX df3a492816
Update external.xml.noload 2022-08-09 10:30:23 -06:00
FusionPBX d4572fcb0f
Update internal.xml.noload 2022-08-09 10:29:19 -06:00
FusionPBX 68965ccf0a
Update ivr.conf.lua 2022-08-08 20:08:51 -06:00
FusionPBX 8431d419ca
Reduce round trips to the database server.
Add PDO attribute:  PDO::PGSQL_ATTR_DISABLE_PREPARES
https://prototype.php.net/manual/en/ref.pdo-pgsql.php
2022-08-08 16:58:52 -06:00
FusionPBX 25d59d69fe
On change destination type show and hide specific fields 2022-08-08 13:25:56 -06:00
FusionPBX b12c474c19
When using the add button send the destination type in the URL. 2022-08-08 12:56:17 -06:00
FusionPBX 1466659fe6
Change domains ACL to providers for new installs. 2022-08-06 17:13:38 -06:00
FusionPBX 38fa7591d5
Add the acl and move the dtmf-type. 2022-08-06 17:10:59 -06:00
FusionPBX 4d88052984
Add a description for track-calls 2022-08-06 17:04:01 -06:00
FusionPBX 6299e91d76
Sync up the external-ipv6 SIP Profile 2022-08-06 17:01:16 -06:00
FusionPBX eea25a336d
Sync up the internal ipv6 SIP Profile 2022-08-06 16:35:10 -06:00
FusionPBX 6e746c89a4
Sync up the external SIP Profile 2022-08-06 15:47:36 -06:00
FusionPBX 174a72a9fa
Sync up the internal SIP Profile 2022-08-06 15:29:18 -06:00
FusionPBX da768d984b
If the call goes to voicemail it is a missed call. 2022-08-05 15:05:49 -06:00
FusionPBX 84a3ab143d
Needs to use double equals for the condition. 2022-08-05 14:35:54 -06:00
FusionPBX 6f2a2a76a1
Answered calls to exclude missed calls.
Determining missed_call is done in the import so the extra originating_leg_uuid is not needed.
2022-08-05 13:46:26 -06:00
FusionPBX e0b37ae834
When call goes to voicemail mark it as missed.
Add additional labels and change isset answer_stamp to use billsec greater than zero.
2022-08-05 13:19:35 -06:00
FusionPBX 0a45b7acf1
Don't show these by default.
Permissions are there to show these however its is expected that these permissions will be assigned to a group rarely.
Considering removing the permissions and not import the records.
2022-08-05 11:30:57 -06:00
FusionPBX 440584898b
Missed calls are marked when the call is imported.
Missed calls are marked when the call is imported and in some cases near the end of the call. This simplifies the missed_call in reports and call detail records.
2022-08-05 11:18:40 -06:00
FusionPBX d5e7552fb4
Hide not answered calls Ring Group Destinations that were answered by someone else.
Improve the form
2022-08-05 11:15:09 -06:00
FusionPBX 58d7e402d9
Hide ring group legs by default that were not answered.
Cleans up the Call Detail Records list.
2022-08-05 10:43:40 -06:00
FusionPBX 301dc1501c
Eliminate faxes from missed calls and ring group destinations that didn't answer the call. 2022-08-04 19:09:23 -06:00
FusionPBX 74d034d7a9
Work on missed_call field. 2022-08-04 18:37:14 -06:00
FusionPBX 3418859ee9
Update xml_cdr.php 2022-08-04 15:37:12 -06:00
FusionPBX e1449e5cd3
Change default from allow to deny for the LAN rfc198 ACL 2022-08-04 15:02:41 -06:00
FusionPBX 7a6c44267a
Check for missed_call variable use it if it exists 2022-08-04 12:50:29 -06:00
FusionPBX f591c04f22
Update index.lua 2022-08-04 12:43:16 -06:00
Mendel 86fe4fe1b0
sip listen port yealink cordless (#6450) 2022-08-04 12:23:11 -06:00
Mendel 10b28721f7
Add cid of remote ext to dialplan (#6449) 2022-08-04 11:53:46 -06:00
markjcrane 2f67b36276 Add add a provison variable for cp_source 2022-08-04 11:52:08 -06:00
FusionPBX a4ff0f1007
Format the date and time with the time zone. 2022-08-02 12:59:09 -06:00
FusionPBX 2c5c522186
Add a better way to detect if the iptables chain exists. 2022-08-02 12:34:03 -06:00
FusionPBX 7103adf98f
Set accountcode variable
Set the account code variable so it can be used in the dialplan after the pin_number.lua has run.
2022-08-02 09:00:55 -06:00
FusionPBX c12b03d31a
Disable the toggle. 2022-08-01 23:41:44 -06:00
FusionPBX 7f494e3baf
Add the user_agent field. 2022-08-01 23:38:03 -06:00
FusionPBX 79b5f70cdf
Add the user_agent field. 2022-08-01 23:37:18 -06:00
FusionPBX d384547adb
Add the user_agent field. 2022-08-01 23:36:47 -06:00
FusionPBX 0680a4d252
Add label and description for user_agent. 2022-08-01 23:36:05 -06:00
FusionPBX 054a33cf3e
Add the user_agent field. 2022-08-01 23:35:31 -06:00
FusionPBX 73ded9bf60
Remove cache from switch.blocked.
Since the IP address is blocked don't need to cache it.
2022-08-01 19:37:59 -06:00
FusionPBX 854f2bf1f0
Add missing _alternate 2022-08-01 18:20:38 -06:00
Luis Daniel Lucio Quiroz 976d983174
Add period and dash to Click 2 Call (#6425)
Source can be not only numbers but letters, dots, and -. They are still valid:

name.lastname,  or name-lastname.
2022-08-01 08:45:21 -06:00
emak 3ec9cdaba1
Update deprecated sip profile params (#6445)
* Update deprecated sip profile params

Parameter names have changed. See here: https://freeswitch.org/confluence/display/FREESWITCH/Sofia+Configuration+Files

When starting a profile, the following warnings would appear:
[WARNING] sofia.c:5332 rtp-hold-timeout-sec deprecated use media_hold_timeout variable.
[WARNING] sofia.c:5325 rtp-timeout-sec deprecated use media_timeout variable.

Updating the parameters fixes the issue.

* Update external.xml.noload

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2022-08-01 08:38:35 -06:00
garryavx 53c20a156e
Update y000000000035.cfg (#6443)
this way the $yealink_t48g_wallpaper_filename actually gets used for both the check and the setting of the wallpaper itself.
2022-08-01 08:37:52 -06:00
emak 2f8ba11520
Update deprecated sip profile params (#6444)
* Update deprecated sip profile params

Parameter names have changed. See here: https://freeswitch.org/confluence/display/FREESWITCH/Sofia+Configuration+Files

When starting a profile, the following warnings would appear:
[WARNING] sofia.c:5332 rtp-hold-timeout-sec deprecated use media_hold_timeout variable.
[WARNING] sofia.c:5325 rtp-timeout-sec deprecated use media_timeout variable.

Updating the parameters fixes the issue.

* Update external-ipv6.xml.noload

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2022-08-01 08:37:24 -06:00
emak 9bd300db84
Update deprecated sip profile params (#6446)
* Update deprecated sip profile params

Parameter names have changed. See here: https://freeswitch.org/confluence/display/FREESWITCH/Sofia+Configuration+Files

When starting a profile, the following warnings would appear:
[WARNING] sofia.c:5332 rtp-hold-timeout-sec deprecated use media_hold_timeout variable.
[WARNING] sofia.c:5325 rtp-timeout-sec deprecated use media_timeout variable.

Updating the parameters fixes the issue.

* Update internal-ipv6.xml.noload

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2022-08-01 08:34:53 -06:00
emak 305ba420dc
Update deprecated sip profile params (#6447)
* Update deprecated sip profile params

Parameter names have changed. See here: https://freeswitch.org/confluence/display/FREESWITCH/Sofia+Configuration+Files

When starting a profile, the following warnings would appear:
[WARNING] sofia.c:5332 rtp-hold-timeout-sec deprecated use media_hold_timeout variable.
[WARNING] sofia.c:5325 rtp-timeout-sec deprecated use media_timeout variable.

Updating the parameters fixes the issue.

* Update internal.xml.noload

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2022-08-01 08:33:59 -06:00
markjcrane d881ca7af6 Revert "Not using momentjs so removing it"
This reverts commit 11fb638d2d.
2022-08-01 08:00:35 -06:00
markjcrane 551f84d5c5 Revert "Remove momentjs"
This reverts commit a49177c5c5.
2022-08-01 07:59:53 -06:00
FusionPBX 7a71f0bf0a
Less CPU used to listen to event socket. 2022-07-31 10:15:42 -06:00
FusionPBX c20e83e64c
Add additional pre-defined variables to the disa dialplan. 2022-07-30 16:41:04 -06:00
FusionPBX 5997aae095
Fix the search and add a link to arin.net 2022-07-29 15:59:21 -06:00
FusionPBX f60d6e7557
Add proxy to the gateway list. 2022-07-29 10:28:22 -06:00
FusionPBX 95c358f8e4
Add database log for new blocked address. 2022-07-28 11:15:48 -06:00
FusionPBX 7897bd16aa
Update event_guard_logs.php 2022-07-28 09:34:16 -06:00
FusionPBX 02522b11f3
Create event_guard.php 2022-07-28 09:33:09 -06:00
FusionPBX 2b457c9dfb
Create root.php 2022-07-28 09:31:04 -06:00
FusionPBX 8779206311
Create event_guard_logs.php 2022-07-28 09:30:41 -06:00
FusionPBX 9c8840ed6a
Create event_guard_log_edit.php 2022-07-28 09:30:00 -06:00
FusionPBX 5dd4459acd
Create app_menu.php 2022-07-28 09:29:28 -06:00
FusionPBX 37f754336b
Create app_languages.php 2022-07-28 09:29:01 -06:00
FusionPBX 1f6a081471
Create app_config.php 2022-07-28 09:28:36 -06:00
FusionPBX 22a243ceb4
Update and rename app/switch/resources/service/debian-event_guard.service to app/event_guard/resources/service/debian.service
Move event guard to its own directory.
2022-07-28 08:38:16 -06:00
FusionPBX 9d2efbeccb
Rename app/switch/resources/service/event_guard.php to app/event_guard/resources/service/event_guard.php
Move the event_guard service to its own directory name.
2022-07-28 08:35:16 -06:00
FusionPBX 3ee97e0d76
Add more debug information. 2022-07-27 13:40:55 -06:00
FusionPBX 5a11c55553
Remove orphaned access control nodes 2022-07-27 13:28:52 -06:00
FusionPBX 287e8c07b6
Minor version update 5.0.2 2022-07-27 12:29:55 -06:00
FusionPBX c8aaf80781
Create debian-event_guard.service 2022-07-25 19:28:18 -06:00
FusionPBX 17ab8e61ab
Create event_guard.php 2022-07-25 19:24:35 -06:00
Antonio Fernandez 96df02b398
adding template support for call waiting tone (#6441) 2022-07-25 09:54:44 -06:00
agree 6e40068040
[dialplans] Allow multiple extensions per xml (#6437)
* [dialplans] Allow multiple extensions per xml

* remove extra character
2022-07-23 13:16:25 -06:00
emak ea4a5e7f67
Check to make sure accountcode has some value (#6440)
The accountcode variable is used in a dialstring later on and if it comes back nil for any reason, then the following error is thrown:

2022-07-22 16:19:11.524674 [ERR] mod_lua.cpp:202 /usr/share/freeswitch/scripts/app/follow_me/index.lua:396: attempt to concatenate global 'accountcode' (a nil value)
stack traceback:
        /usr/share/freeswitch/scripts/app/follow_me/index.lua:396: in main chunk
        /usr/share/freeswitch/scripts/app.lua:48: in main chunk

This completely breaks follow-me.

This code sets the accountcode variable to the domain name if it comes back nil during script execution, thus protecting the script from failing with an empty accountcode value in the db or query.
2022-07-22 16:47:31 -06:00
Jesse Gruver 0e9b8f15b5
Added grandstream_show_key_labels and other default values. (#6438) 2022-07-22 13:02:51 -06:00
FusionPBX 5be250c569
Set Caller ID only when the call_direction is outbound. 2022-07-20 16:15:04 -06:00
FusionPBX 1a96d4007a
Additional changes to allow hangup action which has no data. 2022-07-20 09:45:11 -06:00
FusionPBX aa488eed01
Needed to allow hangup action which has no data. 2022-07-20 09:40:23 -06:00
FusionPBX e65d483ef7
Add contact_in_ping to Gateways (#6439)
* Add contact_in_ping to Gateways

* Update gateway_edit.php

* Update gateways.php

* Update app_languages.php

* Update sofia.conf.lua
2022-07-19 16:34:01 -06:00
FusionPBX 4cf53c9719
Work around for FreeSWITCH bug where .loc break Music on Hold.
Fixed in the following commit.
https://github.com/signalwire/freeswitch/pull/1577

The commit was accepted. Hoping the bug fix is included in the next release of FreeSWITCH 1.10.8. However we need a work around for those using older versions and 1.10.8 hasn't been released yet.
2022-07-19 12:02:54 -06:00
FusionPBX 3eb258c7ea
Add an alternative method to get the device vendor. 2022-07-19 09:52:34 -06:00
Joseph 2de1abb657
fix issue with device vendors (#6340)
If mac address and template already exists in Devices page and you attempt to associate the mac address with the extension from the extensions page, the "vendor" is removed from the device, thus causing provisioning not to look at the device profiles settings of the mac address
2022-07-19 09:48:04 -06:00
FusionPBX dfa60ba49a
Update timezones.conf.xml 2022-07-18 20:21:05 -06:00
FusionPBX 89258e09e5
Admin user should have access to the destination_prefix. 2022-07-18 10:42:56 -06:00
FusionPBX e6d7c76870
Fix the caller ID number label. 2022-07-17 19:09:34 -06:00
FusionPBX 5f8fcc07fb
Add destination_prefix required for superadmin. 2022-07-17 18:59:19 -06:00
FusionPBX 8ce558702a
Add destination conditions. 2022-07-16 23:31:29 -06:00
FusionPBX ca5ef8d03d
Change label-detail_action to label-destination_actions. 2022-07-16 23:30:15 -06:00
FusionPBX 41c5fa3a3f
Add a field and permission called destination_conditions. 2022-07-16 23:29:04 -06:00
FusionPBX 2c7e40bd8e
Add destination_conditions, destination_actions, and additional descriptions. 2022-07-16 23:27:59 -06:00
FusionPBX d9a9bbc8e0
Add destination_actions to the destinations table. 2022-07-16 11:27:03 -06:00
markjcrane 4f2987da2d Add destination_actions type json allows adding multiple actions 2022-07-15 22:38:21 -06:00
markjcrane 4ee607eb83 Change RTP_Packet_Size from 0.030 to 0.020 2022-07-15 09:25:32 -06:00
markjcrane a49177c5c5 Remove momentjs 2022-07-15 09:07:01 -06:00
markjcrane 11fb638d2d Not using momentjs so removing it 2022-07-15 09:07:01 -06:00
agree f89ecf5b36
[dialplan] NANP match + only if followed by a 1 (#6436) 2022-07-12 17:32:49 -06:00
FusionPBX e2640b8752
Use the destination_cid_name_prefix permission and get more values from the database when user doesn't have permission to the value. 2022-07-12 17:16:19 -06:00
FusionPBX c2ba621c15
Add permission destination_cid_name_prefix. Remove an unused permission other_destinations. 2022-07-12 16:46:47 -06:00
FusionPBX cacdc51899
Add provision settings snom_user_auto_connect_1 to snom_user_auto_connect_4, and snom_user_ringer_1 - snom_user_ringer_4 2022-07-12 15:24:52 -06:00
FusionPBX 4669b3efba
Get the call center channel variables and set in the intercepted call. 2022-07-11 13:46:25 -06:00
FusionPBX 084e36d0a0
Sanitize the menu link by restricting it to specific characters. 2022-07-08 18:38:13 -06:00
FusionPBX 88b34831e4
Sanitize the menu link by restricting it to specific characters. 2022-07-08 18:28:08 -06:00
FusionPBX 6780949019
Remove LOG_LOCAL0 from openlog it caused the output to the console. 2022-07-08 14:46:21 -06:00
FusionPBX 767937260d
Limit this to run only with the web server. 2022-07-08 14:21:29 -06:00
FusionPBX da181fc6f6
Improve multi-server cluster support. 2022-07-07 16:14:01 -06:00
Jason Kinner 5bc7083692
BUG FIX: incorrect comment characters (#6435)
Replaced // characters with --
2022-07-06 19:42:43 -06:00
FusionPBX 899fc18420
Use the right comments for lua. 2022-07-06 16:09:44 -06:00
FusionPBX 230ee4ab49
Vociemail, Allow play a mix of mp3 or wav files whatever exists. 2022-07-06 10:09:01 -06:00
FusionPBX 1bcff440d4
Change yealink w606 to w60b 2022-07-01 16:40:25 -06:00
FusionPBX 57df8a02aa
Require destination_number for add.
Update can get the number from the database.
2022-07-01 11:37:48 -06:00
garryavx 24962e4033
Update y000000000066.cfg (#6415)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:27:01 -06:00
garryavx be98ea3fea
Update y000000000028.cfg (#6414)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:26:54 -06:00
garryavx 3838c55fae
Update y000000000067.cfg (#6413)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:26:50 -06:00
garryavx fb5aae1fb0
Update y000000000029.cfg (#6412)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:26:45 -06:00
garryavx 216383b3b1
Update y000000000035.cfg (#6416) 2022-06-30 10:26:19 -06:00
garryavx e7651c0456
Update y000000000065.cfg (#6417)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:26:11 -06:00
garryavx 930f813057
Update y000000000096.cfg (#6418)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:26:00 -06:00
garryavx d2d79f3f0b
Update y000000000056.cfg (#6419)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:25:52 -06:00
garryavx 35d1e28a23
Update y000000000097.cfg (#6420)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:25:42 -06:00
garryavx d8fb60b11e
Update y000000000058.cfg (#6421)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:25:35 -06:00
garryavx c3a9987868
Update y000000000058.cfg (#6422)
This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-30 10:25:16 -06:00
FusionPBX 07679fe80d
Add escapeshellarg to the variables used in the command line. 2022-06-29 10:38:36 -06:00
FusionPBX de22a9121a
Security use escapeshellarg 2022-06-29 10:24:05 -06:00
FusionPBX b8f70a6cb5
Add an option to keep the original caller id name and number. 2022-06-28 17:43:17 -06:00
FusionPBX be841cd17a
Update fax_send.php 2022-06-28 11:06:19 -06:00
FusionPBX 220f19dcf0
Add new permisisons for the switch dashboard.
switch_version
switch_uptime
switch_channels
switch_registrations
2022-06-28 11:00:45 -06:00
FusionPBX 3a31141e6f
Add permisisons to the dashboard.
Add new permissions switch_version, switch_uptime, switch_channels, switch_registrations
2022-06-28 10:59:19 -06:00
garryavx 6dbe626b56
Update y000000000150.cfg (#6423)
* Update y000000000150.cfg

This should be paired with a default setting to match. it controls the behavior of the headset if you make a call while it is connected. by default (0), yealink phones will not connect the call via the headset. if you set it to 1, the phone will immediately start using the headset for the call, instead of requiring you to press the headset button after dialing.
2022-06-25 12:07:58 -06:00
agree b7e7d27c79
[xml_cdr] LOSE_RACE handled in wrong place (#6433)
LOSE_RACE is already being handled later `if (permission_exists('xml_cdr_lose_race'))`
2022-06-25 12:04:44 -06:00
agree f907619679
[xml_cdr] cdr statistics fix LOSE_RACE (#6432) 2022-06-25 12:04:23 -06:00
FusionPBX 9c176e31e5
Simplify the Yealink T41s Template 2022-06-25 11:20:55 -06:00
FusionPBX d82fd6a587
Add park+*xxxx to the templates using the spa_dial_plan 2022-06-24 16:30:38 -06:00
FusionPBX 39ed9d80b1
Update {$mac}.xml 2022-06-24 15:43:04 -06:00
FusionPBX 74fcfdc5a9
Update {$mac}.xml 2022-06-24 15:42:49 -06:00
FusionPBX d6c02e8694
Update {$mac}.xml 2022-06-24 15:41:45 -06:00
FusionPBX 44dedb9acf
Set disabled when the device key type is disabled. 2022-06-24 15:41:13 -06:00
FusionPBX 7983bee43d
Update {$mac}.xml 2022-06-24 15:40:36 -06:00
FusionPBX f450a1c9bb
Use Disabled when the device key type is set to disabled. 2022-06-24 15:40:15 -06:00
FusionPBX c36f1c3968
Cisco 8851 spacfg.xml after factory default 2022-06-24 14:19:57 -06:00
FusionPBX 8c6d8a4103
Require the fax extension to be numeric. 2022-06-23 15:02:07 -06:00
FusionPBX 2e2376829f
Use the domain_name from the database. 2022-06-23 10:25:31 -06:00
FusionPBX dd7117fbbe
While in a call put blind transfer and transfer first. (#6431)
* While in a call put blind transfer and transfer first.
2022-06-21 17:37:59 -06:00
FusionPBX c076fae485
Use # instead of * to prevent *97 conflict with voicemail. (#6430)
* Use # instead of * to prevent *97 conflict with voicemail.
2022-06-21 17:25:11 -06:00
Dan f6c64054fa
Add missing $ to variables in HT802 template (#6427)
* Grandstream HT802 Added Offhook Auto-dial variables

* Grandstream HT802 Added Offhook Auto-dial variables

* Grandstream GRP261x Make Configuration Keypad Lock configurable, fix default

* Grandstream Add grandstream_dhcp_time_zone across all templates

* Yealink Added yealink_missed_calllog to control whether missed calls are logged or not

* Grandstream HT802 update variable name to not use dash (which was breaking the template)

* added default settings for grandstreams
added "grandstream_configuration_via_keypad" and
"grandstream_dhcp_time_zone" as settings
also changed "grandstream_long_label" to 1

* Add custom transcription providers to email queue, fix spelling error

* Correct missing $ in Grandstream template

Co-authored-by: Jesse Gruver (piajesse) <me@piajesse.com>
2022-06-21 16:04:28 -06:00
nacircoronado 99ed45ca2b
Update app_menu.php (#6429) 2022-06-21 15:41:56 -06:00
nacircoronado 2620f9e266
Spanish change cerca to cerrar. (#6428)
* Spanish change cerca to cerrar.

* Update app_languages.php
2022-06-21 15:31:35 -06:00
FusionPBX 5cc64eefb2
Change needed to support Cisco 3PCC endpoints.
The Cisco phone sends the + without the park prefix. This change allows dialing +*5901.
2022-06-21 13:20:17 -06:00
FusionPBX 632898d4a9
Use sip_from_user in orbit extension for an outbound call that is parked.
This allows outbound calls to receive a call back to original extension that parked it if the parked call is left in park.
2022-06-17 10:55:33 -06:00
FusionPBX 7a6f02474e
Prevent spaces from being considered as a valid destination_number. 2022-06-16 15:07:21 -06:00
FusionPBX d6b1cdd63f
Prevent a problem when an IVR Option number is set without and action. 2022-06-16 10:29:01 -06:00
M. Skenderian b3fc6e6857
removed duplicate code (#6410)
Co-authored-by: mskenderian <michael@wireprosolutions.com>
2022-06-16 10:04:28 -06:00
agree 0e3f286ff7
[page] Add check_destination_status to dialplan (#6411)
* [page] Add check_destination_status to dialplan

* Update 240_page.xml
2022-06-15 18:56:08 -06:00
FusionPBX d3af1acd73
Simplify the registrations count method by using the get method. 2022-06-15 10:52:11 -06:00
FusionPBX 611a13c32c
Change the retry_limit to 5. 2022-06-14 23:31:32 -06:00
FusionPBX f214547359
First attempt use the fax variables from settings
Also set fax_retry_attempts, and fax_retry_limit.
2022-06-14 23:09:54 -06:00
FusionPBX 44f07fa5db
Add missing single quotes 2022-06-14 20:42:17 -06:00
agree 4634e1b579
[Ring Groups] Handle 404 (#6407) 2022-06-13 16:08:57 -06:00
agree dfeda45c68
email.lua fix execution from api (#6408) 2022-06-13 16:06:21 -06:00
FusionPBX af6b00bf66
Update page.lua with more options check_destination_status, auto answer and alert info. 2022-06-11 00:58:00 -06:00
FusionPBX d0d0346b42
Use fax_extension_copy permission for the copy button. 2022-06-09 19:23:28 -06:00
FusionPBX 7644c8d4fa
Change ulfile to file to be similar to the voicemail greetings. 2022-06-09 17:42:04 -06:00
FusionPBX 7f6b1472e6
Add conference recording to CDR page.
Tested and works with regular dialplan conference.
2022-06-09 11:04:07 -06:00
markjcrane 1fa04dd8a5 Add additional Fanvil templates 2022-06-07 19:58:36 -06:00
FusionPBX d16dd2ae1e
Enable ability to use sip_to_user. (#6406)
* Enable ability to use sip_to_user.

* Set the sip_to_user variable.

* Update index.lua
2022-06-07 16:00:28 -06:00
FusionPBX cf1aad072c
Found a more efficient way to force lower case on boolean values.
Helpful for supporting multiple databases. Make the import safer for users where the value is expected in lower case. Best solution for PostgreSQL is boolean data type but that would still not be a good solution for alternative databases.
2022-06-06 18:11:13 -06:00
FusionPBX e0866eba32
Force the value to lower case for enabled. 2022-06-06 18:04:06 -06:00
FusionPBX 7205c76fba
Force the value to lower case for voicemail_local_after_email, voicemail_tutorial, and voicemail_enabled. 2022-06-06 17:52:34 -06:00
FusionPBX d3eeaab1b4
Set the date using now() instead of the php date function. 2022-06-02 15:11:13 -06:00
FusionPBX 1199269347
When the cache is deleted log details to the syslog server. 2022-06-01 22:28:12 -06:00
Mendel 9fc81c880c
Update 12-24 hour variable (#6404)
Checked on the Yealink cordless base and found a different variable for the time format.
2022-06-01 21:49:17 -06:00
FusionPBX ad3a4825a1
Use a log prefix that makes more sense. 2022-06-01 18:57:33 -06:00
Jesse Gruver 3643f98d62
Added variables to grandstream configs for idle mute fuction (#6371)
* Added varibles to grandstream configs for idle mute fuction
I have changed them all to the default of "0" and then added a
varible called "grandstream_idle_mute_function" that overwrites
the default option of 0

There seems to be older configs where 0 = no instead of dnd
so I've added grandstream_idle_mute_function_old for these configs

* Added curls for grandstream_idle_mute_function
2022-06-01 13:54:56 -06:00
FusionPBX 93c7714148
Add new permission voicemail_file (#6403)
* Add new permission voicemail_file

* Update app_config.php

* Update voicemail_edit.php
2022-06-01 10:48:33 -06:00
Antonio Fernandez 7bbbc4e895
Settings Refresh Timer has been added to the templates and new variable (#6402)
* Settings Refresh Timer has been added to the templates and new variable

* changed the variable name to a better name $snom_provision_timer_seconds
2022-06-01 09:32:22 -06:00
Dan 4dd80fb779
Add Default Settings for Grandstream Templates, and custom transcription provider for Email Queues (#6401) 2022-05-31 23:05:23 -06:00
FusionPBX 795254a421
Add http_auth, STUN and NTP. 2022-05-31 21:56:12 -06:00
FusionPBX 6440e4362d
Add http_auth, STUN and NTP 2022-05-31 21:54:30 -06:00
FusionPBX d3533931df
Update {$mac}.xml 2022-05-31 21:34:43 -06:00
FusionPBX ae3e7ba9cb
Add a new Panasonic utg200b template. 2022-05-31 21:34:24 -06:00
FusionPBX 27c03ae80b
Add new panasonic utg300b template. 2022-05-31 21:29:15 -06:00
FusionPBX 83eaee56a2
number_alias permission removed from superadmin group.
Not providing permissions to this by default to discourage using it. However anyone can assign the permission to any groups of their choice.
2022-05-31 09:42:26 -06:00
Luis Daniel Lucio Quiroz 643f014181
Fix Missed Call email when Follow Me is On (#6323)
When a user has the Email Alerts for Missed Calls set, it works
As soon as there is a Follow Me configured, the email stops arriving

This patch restores the desired behaviour
2022-05-30 20:07:08 -06:00
Dan 2a0392dec2
Add variables to Grandstream and Yealink Templates (#6400)
* Grandstream HT802 Added Offhook Auto-dial variables

* Grandstream HT802 Added Offhook Auto-dial variables

* Grandstream GRP261x Make Configuration Keypad Lock configurable, fix default

* Grandstream Add grandstream_dhcp_time_zone across all templates

* Yealink Added yealink_missed_calllog to control whether missed calls are logged or not

* Grandstream HT802 update variable name to not use dash (which was breaking the template)
2022-05-30 16:37:38 -06:00
FusionPBX 54a5fb5a2b
Access Controls protect new users from hurting themselves. 2022-05-28 17:19:37 -06:00
FusionPBX a0718f367a
Create an additional dialplan to set call_direction outbound. 2022-05-28 10:02:58 -06:00
FusionPBX 147956f655
Add bg_system to run the command as non blocking. 2022-05-27 16:58:32 -06:00
FusionPBX 5a89fa5081
Remove code from checks to see if the extension is on the phone.
Having the PBX check if the caller is already on the phone has not worked well at least not the approach that is getting removed in this commit. It is not the right way to solve the issue. Its better for the phone endpoint  to block the intercom or auto answer when it is already on a call.

One way to do this that worked in testing was to disable call waiting. Then the call is rejected and not allowed to interrupt. the call that already exists. Expect there are also other ways to instruct the phone not to interrupt active calls when it receives a SIP message to auto answer.
2022-05-27 14:45:41 -06:00
markjcrane 10748a95c8 Add device_line_label and device_line_display_name permissions. 2022-05-26 21:37:19 -06:00
FusionPBX c87ab41fff
Add FAX Queue with retry_interval (#6398)
* Update app_config.php

* Use the new retry interval.

* Add the new retry interval.
2022-05-26 14:33:19 -06:00
FusionPBX 5d2b919fa9
Correct invalid UUID 2022-05-25 12:38:29 -06:00
FusionPBX 5d41fd01df
Need to allow ability to clear the value. 2022-05-25 12:21:02 -06:00
FusionPBX fd67765c74
Correct the Provisioning information 2022-05-25 09:25:23 -06:00
FusionPBX 3093a0a8cb
Fix a missing semi-colon. 2022-05-25 08:43:59 -06:00
Antonio Fernandez e851245c86
Snom templates - added per model wallpaper settings (#6391) 2022-05-25 08:39:39 -06:00
FusionPBX b1e2d3312d
Initial version of fanvil v67 configuration. 2022-05-25 08:31:34 -06:00
Mendel 1be00e330e
updated yealink cordless files (#6396) 2022-05-24 23:32:56 -06:00
FusionPBX d897fad100
Replace io.popen with api:executeString 2022-05-24 16:55:25 -06:00
FusionPBX 56f8d4ba44
Replace system with api:executeString 2022-05-24 16:50:45 -06:00
FusionPBX d5775257b4
Use system instead of io.open 2022-05-24 16:38:04 -06:00
FusionPBX 46447d83c3
Remove the transcription as this can blocking.
Transcription still available through email queue this way it offloads the work off of FreeSWITCH.
2022-05-24 16:32:40 -06:00
FusionPBX 2326d79113
This function is not being used. 2022-05-24 16:12:29 -06:00
FusionPBX fdbaefa2cf
Create dnd.php 2022-05-23 10:03:03 -06:00
FusionPBX 7d82b82089
Send presence events for DND 2022-05-20 17:51:52 -06:00
FusionPBX 53e8ab5f16
Unset the event socket handles. 2022-05-20 17:49:42 -06:00
FusionPBX ed1d1afd07
Update presence.php 2022-05-20 17:15:57 -06:00
FusionPBX 27f0d9d5b4
Add a new presence class. 2022-05-20 17:14:50 -06:00
FusionPBX 37e3837323
Fix a spelling mistake change Formward to Forward. 2022-05-20 09:33:50 -06:00
FusionPBX c4556ebba4
Add cc-instance-id to callcenter.conf xml. 2022-05-19 21:55:04 -06:00
FusionPBX 1434d39cff
Change condition where the email address was not set.
- When the email address was not set then post process did not happen and the status was not updated to failed.
- Updated debug and file parameters for debugging.
2022-05-19 16:00:58 -06:00
FusionPBX 10de04f929
Send presence when changing the status of the call flow. 2022-05-19 13:28:54 -06:00
FusionPBX a2477f8dd5
Add domain_uuid the email object. 2022-05-19 10:44:54 -06:00
FusionPBX 41e96f691e
Add voicemail BLF. 2022-05-19 09:38:31 -06:00
Antonio Fernandez c73f4de8d1
BLF Presence added for Voicemail Boxes (#6389)
* BLF Presence added for Voicemail Boxes

* Newline added to the end of the blf_notify.lua script

* changed prefix of vmail to voicemail
2022-05-19 08:37:10 -06:00
agree d097d5b64c
[call center] (#6390)
call_center_announce_sound check for permission
2022-05-18 18:06:22 -06:00
FusionPBX f13d538277
Remove a redundant ignore_early_media. 2022-05-17 13:47:53 -06:00
FusionPBX c1f9134654
Remove ignore_early_media because its added below. 2022-05-17 13:42:44 -06:00
FusionPBX bc9f33cde1
Remove ignore_early_media because its added below. 2022-05-17 12:46:32 -06:00
agree 55de8844bf
[fax] use get_accountcode function to get the accountcode (#6387) 2022-05-16 09:35:58 -06:00
FusionPBX 8c4ad43fbc
Fix spelling in accountcode description 2022-05-16 09:13:29 -06:00
FusionPBX 58fc71fce9
Fix implode paramater order and few other minor edits. 2022-05-13 11:44:41 -06:00
FusionPBX 22db796b11
Adds an extra line so that internet_port_vid doesn't show up on the same line. 2022-05-12 10:31:41 -06:00
markjcrane 6c2ebbc28c Correct the template syntax 2022-05-12 10:24:39 -06:00
FusionPBX 6247cddddc
Add ${yealink_call_info_display_method} variable (#6383)
* Add ${yealink_call_info_display_method} variable

* Update y000000000074.cfg

* Update y000000000095.cfg

* Update y000000000070.cfg

* Update y000000000058.cfg

* Update y000000000097.cfg

* Update y000000000150.cfg
2022-05-12 09:49:02 -06:00
Ben 94ec533ca1
Updated multiple items including jitter buffer, echo cancellation and DND (#6382) 2022-05-11 18:30:54 -06:00
Anthony 269aeccde9
Update y000000000095.cfg (#6381) 2022-05-11 15:58:26 -06:00
Anthony 1de40cbaf6
Update y000000000096.cfg (#6380) 2022-05-11 15:58:14 -06:00
Anthony b32dfe4025
Update y000000000056.cfg (#6379) 2022-05-11 15:58:03 -06:00
Anthony 8e3b136ca4
Update y000000000058.cfg (#6378) 2022-05-11 15:57:54 -06:00
Anthony c6e1e5e08d
Update y000000000096.cfg (#6377) 2022-05-11 15:57:46 -06:00
Anthony decdee0d0c
Update y000000000095.cfg (#6376) 2022-05-11 15:57:38 -06:00
Anthony 47fc0edfde
Update y000000000091.cfg (#6375) 2022-05-11 14:18:14 -06:00
Anthony 9d154ba66d
Update y000000000070.cfg (#6374) 2022-05-11 14:17:57 -06:00
Anthony fbd09820a8
Update y000000000029.cfg (#6373)
* Update y000000000029.cfg

Added ${yealink_call_info_display_method} setting to template

* Update y000000000067.cfg

* Update y000000000107.cfg

* Update y000000000028.cfg

* Update y000000000066.cfg

* Update y000000000108.cfg

* Update y000000000035.cfg

* Update y000000000065.cfg

* Update y000000000109.cfg

* Update y000000000051.cfg

* Update y000000000028.cfg

* Update y000000000029.cfg

* Update y000000000036.cfg

* Update y000000000054.cfg

* Update y000000000065.cfg

* Update y000000000066.cfg

* Update y000000000067.cfg

* Update y000000000068.cfg

* Update y000000000076.cfg

* Update y000000000107.cfg

* Update y000000000108.cfg

* Update y000000000109.cfg

* Update y000000000116.cfg
2022-05-11 14:17:12 -06:00
AlexC a752ab76dc
Add yealink_call_info_display_method (#6372)
* Update y000000000068.cfg

* Update y000000000036.cfg

* Update y000000000054.cfg

* Update y000000000076.cfg

* Update y000000000124.cfg

* Update y000000000044.cfg

* Update y000000000052.cfg

* Update y000000000069.cfg

* Update y000000000046.cfg

* Update y000000000045.cfg

* Update y000000000069.cfg

* Update y000000000044.cfg

* Update y000000000044.cfg

* Update y000000000052.cfg
2022-05-11 14:03:40 -06:00
Ben dd44b54082
Update template with array and other minor changes (#6369) 2022-05-11 13:05:45 -06:00
FusionPBX 5448ac02a9
Add yealink_call_info_display_method to default settings with a default value of 1 - Number+Name 2022-05-11 13:05:01 -06:00
FusionPBX 38541f7a2d
Add domain_uuid to the email object and remove deprecated code. 2022-05-10 20:21:20 -06:00
FusionPBX d5db02be42
Add sip_h_Alert-Info to cc_export_vars. 2022-05-09 21:53:27 -06:00
FusionPBX 312873fb39
Add sip_h_Alert-Info to cc_export_vars 2022-05-09 21:52:30 -06:00
FusionPBX 3dd7d3cdf4
BLF for Call Center Agents
Updated when the phone registers.
2022-05-09 21:21:41 -06:00
Jesse Gruver 56b53b5f2c
Remove the country code if not e.164 (#6367) 2022-05-09 16:40:44 -06:00
FusionPBX 28c0d704df
Add op_valet_park_active to the css. 2022-05-09 15:33:44 -06:00
FusionPBX dd1b315101
Add valet park and line feeds. 2022-05-09 15:32:10 -06:00
FusionPBX ca16c0b622
Fixed hidden calls after picking up a parked call.
Also improved code indentation.
2022-05-07 12:46:14 -06:00
FusionPBX e83885c722
User Logs - Paging Broken with Search 2022-05-07 09:36:14 -06:00
FusionPBX f2aba2251f
Presence is not correctly updated when caller rings an IVR
When a user calls an IVR, the presence is updated and sent to subscribers to notify they are on the phone, however it is never terminated so it appears they are busy long after the call ended. Removing the dialplan setting for the presence_id fixes this issue so the caller no longer appears on the phone when the IVR call ends.
2022-05-07 09:18:42 -06:00
FusionPBX a4c0e93cbe
Only one row allowed so added limit 1. 2022-05-07 09:02:58 -06:00
agree 90f33bd64d
[domains] add exit after redirect (#6366) 2022-05-06 17:08:52 -06:00
FusionPBX 4d18f598b2
Use a css class for the sub category labels. 2022-05-06 14:14:29 -06:00
FusionPBX 5e9481ebc4
user_hold_music condition order user_exist must be first. 2022-05-06 09:25:08 -06:00
FusionPBX 60e484e8f5
Default settings overridden by domain SMTP settings
Fixed a regressions where the domain SMTP settings were ignored.
2022-05-05 19:41:38 -06:00
FusionPBX 3600e479fe
call-forward-all set diversion header to default false.
If the diversion header is required it can be enabled.
2022-05-05 16:45:12 -06:00
FusionPBX d2d8c2bdcb
Rename queue and remove the escape on the domain_name. 2022-05-05 12:17:14 -06:00
FusionPBX 9330414120
Use the number alias permission in the extension summary. 2022-05-05 10:59:25 -06:00
FusionPBX 9e77266299
Re-add permission check for xml_cdr_lose_race and xml_cdr_enterprise_leg. 2022-05-05 10:55:52 -06:00
emak 2050d98e3e
Update XML CDR Extension Summary Queries #5979 (#6365)
* Change labels to reflect new CC missed field

* Update extension summary queries

* Hide number alias field
2022-05-05 10:43:44 -06:00
FusionPBX 4e2fe618e7
Fix the dialplan call center greeting and queue_extension. 2022-05-05 10:16:33 -06:00
agree 4e9e007a2b
[dialplans] don't set hold music if from user exists (#6359)
If the aleg is an existing user, setting the hold_music on his leg causes the wrong hold_music to be used when he puts the other leg on hold.
2022-05-05 09:06:29 -06:00
Luis Daniel Lucio Quiroz ca921e88ac
Fixes NULL in _SESSION[context] (#6360)
* Update check_auth.php

* Update domains.php
2022-05-05 09:04:19 -06:00
Mendel ea337e42ae
Update polycom configs each separate (#6363)
* Update provision.php

* Update y000000000124.cfg

Added {$yealink_dnd_allow} so that you can remove DND from the phone

* Added all the Polycom Templates separately

* Update app_config.php

* Update app_config.php

* Delete resources/templates/provision/polycom/IP321 directory

* Revert "Delete resources/templates/provision/polycom/IP321 directory"

This reverts commit 6f532a37bb.

* Delete resources/templates/provision/polycom directory

* Working on making the file Lowercase

* Still working on making it lowercase

* Update the Description of Polycom Firmwares

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

* Updated the name of the Sound Station Duo to just Duo

* Update app_config.php
2022-05-04 15:19:53 -06:00
FusionPBX cc8914341f
Use &lt; and &gt; in place of < and > 2022-05-04 14:58:15 -06:00
FusionPBX d5481c05fd
Fix the syntax. 2022-05-04 14:44:43 -06:00
FusionPBX 652621c215
Simplify call-forward-all dialplan. 2022-05-04 14:26:44 -06:00
FusionPBX 829f8a35d6
Change the order of the conditions to a-z and add call_direction. 2022-05-03 18:16:08 -06:00
FusionPBX b8a71eb59b
Remove the reset on the fax queue search. 2022-05-03 17:46:20 -06:00
FusionPBX 907c2d332c
Remove the reset on the email queue search. Don't think its needed for a single item html form. 2022-05-03 17:35:01 -06:00
FusionPBX d9c3779c47
Update call_center_queue_edit.php 2022-05-03 16:00:24 -06:00
FusionPBX bfa5492e21
Allow an empty destination so that values can be nulled. 2022-05-03 09:46:26 -06:00
FusionPBX 94bc7d9f99
Add distinctive ring to inbound destinations (#6357)
* Add distinctive ring to inbound destinations

* Update destination_edit.php
2022-05-02 18:11:56 -06:00
FusionPBX be5f1e47f6
Add new permissions destination_hold_music and destination_distinctive_ring. Add new field destination_distinctive_ring to to the destinations table. 2022-05-02 16:54:31 -06:00
FusionPBX ee84131443
Fix the yealink_ring_file to match the correct number. 2022-05-02 16:19:27 -06:00
FusionPBX 791d0046c0
Add an option to the select Greeting: none (#6356)
* Update play_greeting.lua

* Update voicemail_edit.php
2022-05-02 12:09:20 -06:00
FusionPBX eee7786529
Remove some code redundancy. 2022-05-02 08:27:15 -06:00
FusionPBX 16b8d5e172
Update extension_edit.php 2022-05-02 08:17:53 -06:00
Joseph f080a39053
Fix voicemail transcriptions not being pushed (#6339)
* Fix voicemail transcriptions not being pushed

When creating a new extension, under the Voicemail tab, Transcribe is empty. This was causing users to not receive VM transcriptions. Adding the above code will push transcribe = true or false (depending on the value in default settings) after creating a new extension.
2022-05-02 08:06:21 -06:00
FusionPBX 0e4e379b14
Use fax_email from the fax table for the mail to address.
And add additional condition for fax_queue enabled.
2022-04-30 23:50:50 -06:00
FusionPBX eeba3eb66f
Fix fax forward so it can use the fax queue. 2022-04-30 20:39:15 -06:00
FusionPBX bac66f75ac
Update 480_operator.xml (#6355)
* Update 480_operator.xml

* Define operator to be used in the operator dialplan.
2022-04-29 15:59:18 -06:00
FusionPBX 06e0e48476
Calculate the time zone for the device list. 2022-04-29 15:45:02 -06:00
5360 changed files with 690991 additions and 366398 deletions

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "";
$apps[$x]['description']['nl-nl'] = "";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "";

View File

@ -17,13 +17,12 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2018 - 2020
Portions created by the Initial Developer are Copyright (C) 2018-2024
the Initial Developer. All Rights Reserved.
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -39,14 +38,18 @@
$language = new text;
$text = $language->get();
//create the database connection
$database = database::new();
//action add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$access_control_uuid = $_REQUEST["id"];
$id = $_REQUEST["id"];
}
else {
$action = "add";
$access_control_uuid = uuid();
}
//get http post variables and set them to php variables
@ -58,7 +61,15 @@
}
//process the user data and save it to the database
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (count($_POST) > 0 && empty($_POST["persistformvar"])) {
//enforce valid data
if ($access_control_name == 'providers' || $access_control_name == 'domains') {
$access_control_default = 'deny';
}
if ($access_control_default != 'allow' && $access_control_default != 'deny') {
$access_control_default = 'deny';
}
//validate the token
$token = new token;
@ -69,7 +80,7 @@
}
//process the http post data by submitted action
if ($_POST['action'] != '' && strlen($_POST['action']) > 0) {
if (!empty($_POST['action'])) {
//prepare the array(s)
$x = 0;
@ -85,20 +96,17 @@
switch ($_POST['action']) {
case 'copy':
if (permission_exists('access_control_add')) {
$obj = new database;
$obj->copy($array);
$database->copy($array);
}
break;
case 'delete':
if (permission_exists('access_control_delete')) {
$obj = new database;
$obj->delete($array);
$database->delete($array);
}
break;
case 'toggle':
if (permission_exists('access_control_update')) {
$obj = new database;
$obj->toggle($array);
$database->toggle($array);
}
break;
}
@ -110,10 +118,7 @@
$cache->delete("configuration:acl.conf");
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
event_socket_request($fp, "api reloadacl");
}
event_socket::api("reloadacl");
//redirect the user
header('Location: access_control_edit.php?id='.$id);
@ -123,11 +128,11 @@
//check for all required data
$msg = '';
if (strlen($access_control_name) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_name']."<br>\n"; }
if (strlen($access_control_default) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_default']."<br>\n"; }
//if (strlen($access_control_nodes) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_nodes']."<br>\n"; }
//if (strlen($access_control_description) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_description']."<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (empty($access_control_name)) { $msg .= $text['message-required']." ".$text['label-access_control_name']."<br>\n"; }
if (empty($access_control_default)) { $msg .= $text['message-required']." ".$text['label-access_control_default']."<br>\n"; }
//if (empty($access_control_nodes)) { $msg .= $text['message-required']." ".$text['label-access_control_nodes']."<br>\n"; }
//if (empty($access_control_description)) { $msg .= $text['message-required']." ".$text['label-access_control_description']."<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -140,45 +145,101 @@
return;
}
//add the access_control_uuid
if (!is_uuid($_POST["access_control_uuid"])) {
$access_control_uuid = uuid();
}
//prepare the array
$array['access_controls'][0]['access_control_uuid'] = $access_control_uuid;
$array['access_controls'][0]['access_control_name'] = $access_control_name;
$array['access_controls'][0]['access_control_default'] = $access_control_default;
$array['access_controls'][0]['access_control_description'] = $access_control_description;
$y = 0;
if (is_array($access_control_nodes)) {
if (!empty($access_control_nodes) && is_array($access_control_nodes)) {
foreach ($access_control_nodes as $row) {
if (strlen($row['node_type']) > 0) {
$array['access_controls'][0]['access_control_nodes'][$y]['access_control_node_uuid'] = $row["access_control_node_uuid"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_type'] = $row["node_type"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_cidr'] = $row["node_cidr"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_domain'] = $row["node_domain"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = $row["node_description"];
$y++;
//validate the data
if (!is_uuid($row["access_control_node_uuid"])) { continue; }
if ($row["node_type"] != 'allow' && $row["node_type"] != 'deny') { continue; }
if (isset($row["node_cidr"]) && $row["node_cidr"] != '') {
$cidr_array = explode("/", str_replace("\\", "/", $row["node_cidr"]));
if (filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
if (isset($cidr_array[1]) && is_numeric($cidr_array[1])) {
//valid IPv4 address and cidr notation
$node_cidr = $row["node_cidr"];
}
else {
//valid IPv4 address add the missing cidr notation
$node_cidr = $row["node_cidr"].'/32';
}
}
else if(filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
//valid IPv6 address
$node_cidr = $row["node_cidr"];
}
//build the sub array
if (!empty($node_cidr)) {
$array['access_controls'][0]['access_control_nodes'][$y]['access_control_node_uuid'] = $row["access_control_node_uuid"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_type'] = $row["node_type"];
$array['access_controls'][0]['access_control_nodes'][$y]['node_cidr'] = $node_cidr;
$array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = $row["node_description"];
$y++;
//unset values
unset($cidr_array, $node_cidr);
}
//digs to attempt
else {
$digs[] = [
'type'=>$row['node_type'],
'value'=>$row['node_cidr'],
'description'=>$row['node_description'],
];
}
}
}
//attempt digs
if (!empty($digs) && is_array($digs)) {
foreach ($digs as $dig) {
$response = shell_exec("dig +noall +answer ".escapeshellarg(str_replace(' ', '', $dig['value']))." | awk '{ print $5 }'");
if (!empty($response)) {
$lines = explode("\n", $response);
foreach ($lines as $l => $line) {
if (!empty($line) && filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
//check for duplicate
if (!empty($array['access_controls'][0]['access_control_nodes']) && is_array($array['access_controls'][0]['access_control_nodes'])) {
foreach ($array['access_controls'][0]['access_control_nodes'] as $n => $node) {
if ($node['node_cidr'] == $line.'/32') { continue 2; }
}
}
//add to array
$array['access_controls'][0]['access_control_nodes'][$y]['access_control_node_uuid'] = uuid();
$array['access_controls'][0]['access_control_nodes'][$y]['node_type'] = $dig['type'];
$array['access_controls'][0]['access_control_nodes'][$y]['node_cidr'] = $line.'/32';
$array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = !empty($dig['description']) ? $dig['description'] : str_replace(' ', '', $dig['value']);
$y++;
}
}
}
}
}
}
//save the data
$database = new database;
$database->app_name = 'access controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array);
if (is_array($array)) {
$database->app_name = 'access controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array);
}
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
event_socket_request($fp, "api reloadacl");
}
event_socket::async("reloadacl");
//redirect the user
if (isset($action)) {
@ -194,14 +255,19 @@
}
}
//set default values
$access_control_name = '';
$access_control_default = '';
$access_control_description = '';
//pre-populate the form
if (is_array($_GET) && $_POST["persistformvar"] != "true") {
if (!empty($access_control_uuid) && is_uuid($access_control_uuid) && empty($_POST["persistformvar"])) {
$sql = "select * from v_access_controls ";
$sql .= "where access_control_uuid = :access_control_uuid ";
$parameters['access_control_uuid'] = $access_control_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
if (!empty($row) && count($row) > 0) {
$access_control_name = $row["access_control_name"];
$access_control_default = $row["access_control_default"];
$access_control_description = $row["access_control_description"];
@ -210,34 +276,32 @@
}
//get the child data
if (is_uuid($access_control_uuid)) {
if (!empty($access_control_uuid) && is_uuid($access_control_uuid)) {
$sql = "select * from v_access_control_nodes ";
$sql .= "where access_control_uuid = :access_control_uuid ";
$sql .= "order by node_cidr asc";
$parameters['access_control_uuid'] = $access_control_uuid;
$database = new database;
$access_control_nodes = $database->select($sql, $parameters, 'all');
unset ($sql, $parameters);
}
//add the $access_control_node_uuid
if (!is_uuid($access_control_node_uuid)) {
if (empty($access_control_node_uuid)) {
$access_control_node_uuid = uuid();
}
//add an empty row
if (is_array($access_control_nodes) && @sizeof($access_control_nodes) != 0) {
if (!empty($access_control_nodes) && count($access_control_nodes) > 0) {
$x = count($access_control_nodes);
}
else {
$access_control_nodes = array();
$x = 0;
}
$access_control_nodes[$x]['access_control_uuid'] = $access_control_uuid;
$access_control_nodes[$x]['access_control_uuid'] = $access_control_uuid ?? '';
$access_control_nodes[$x]['access_control_node_uuid'] = uuid();
$access_control_nodes[$x]['node_type'] = '';
$access_control_nodes[$x]['node_cidr'] = '';
$access_control_nodes[$x]['node_domain'] = '';
$access_control_nodes[$x]['node_description'] = '';
//create token
@ -257,6 +321,12 @@
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','collapse'=>'hide-xs','style'=>'margin-right: 15px;','link'=>'access_controls.php']);
if ($action == 'update') {
if (permission_exists('access_control_node_add')) {
echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'style'=>'margin-right: 3px;','link'=>'access_control_import.php?id='.escape($access_control_uuid)]);
}
if (permission_exists('access_control_node_view')) {
echo button::create(['type'=>'button','label'=>$text['button-export'],'icon'=>$_SESSION['theme']['button_icon_export'],'style'=>'margin-right: 3px;','link'=>'access_control_export.php?id='.escape($access_control_uuid)]);
}
if (permission_exists('access_control_node_add')) {
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none;','onclick'=>"modal_open('modal-copy','btn_copy');"]);
}
@ -290,6 +360,7 @@
}
}
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -337,7 +408,6 @@
echo " <tr>\n";
echo " <th class='vtablereq'>".$text['label-node_type']."</th>\n";
echo " <td class='vtable'>".$text['label-node_cidr']."</td>\n";
echo " <td class='vtable'>".$text['label-node_domain']."</td>\n";
echo " <td class='vtable'>".$text['label-node_description']."</td>\n";
if (is_array($access_control_nodes) && @sizeof($access_control_nodes) > 1 && permission_exists('access_control_node_delete')) {
echo " <td class='vtable edit_delete_checkbox_all' onmouseover=\"swap_display('delete_label_details', 'delete_toggle_details');\" onmouseout=\"swap_display('delete_label_details', 'delete_toggle_details');\">\n";
@ -372,9 +442,6 @@
echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_cidr]' maxlength='255' value=\"".escape($row["node_cidr"])."\">\n";
echo " </td>\n";
echo " <td class='formfld'>\n";
echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_domain]' maxlength='255' value=\"".escape($row["node_domain"])."\">\n";
echo " </td>\n";
echo " <td class='formfld'>\n";
echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_description]' maxlength='255' value=\"".escape($row["node_description"])."\">\n";
echo " </td>\n";
if (is_array($access_control_nodes) && @sizeof($access_control_nodes) > 1 && permission_exists('access_control_node_delete')) {
@ -408,6 +475,7 @@
echo "</tr>\n";
echo "</table>";
echo "</div>";
echo "<br /><br />";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";

View File

@ -0,0 +1,185 @@
<?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) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//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('access_control_node_view')) {
//access granted
}
else {
echo "access denied";
exit;
}
//initialize the database object
$database = new database;
//add multi-lingual support
$language = new text;
$text = $language->get();
//define available columns
$available_columns[] = 'node_type';
$available_columns[] = 'node_cidr';
$available_columns[] = 'node_description';
$available_columns[] = 'insert_date';
$available_columns[] = 'insert_user';
$available_columns[] = 'update_date';
$available_columns[] = 'update_user';
//action add or update
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$access_control_uuid = $_REQUEST["id"];
}
//define the functions
function array2csv(array &$array) {
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
//send download headers
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
//get the extensions from the database and send them as output
if (!empty($_REQUEST["column_group"]) && is_array($_REQUEST["column_group"]) && @sizeof($_REQUEST["column_group"]) != 0) {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: access_control_export.php');
exit;
}
//validate submitted columns
foreach ($_REQUEST["column_group"] as $column_name) {
if (in_array($column_name, $available_columns)) {
$selected_columns[] = $column_name;
}
}
if (!empty($access_control_uuid) && is_uuid($access_control_uuid) && is_array($selected_columns) && @sizeof($selected_columns) != 0) {
//get the child data
$sql = "select ".implode(', ', $selected_columns)." from v_access_control_nodes ";
$sql .= "where access_control_uuid = :access_control_uuid ";
$sql .= "order by node_cidr asc";
$parameters['access_control_uuid'] = $access_control_uuid;
$access_control_nodes = $database->select($sql, $parameters, 'all');
unset($sql, $parameters, $selected_columns);
//send the download headers
download_send_headers("access_control_export_".date("Y-m-d").".csv");
//output the data
echo array2csv($access_control_nodes);
exit;
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include the header
$document['title'] = $text['title-access_control_export'];
require_once "resources/header.php";
//show the content
echo "<form method='post' name='frm' id='frm'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-access_control_export']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'access_control_edit.php?id='.$access_control_uuid]);
echo button::create(['type'=>'submit','label'=>$text['button-export'],'icon'=>$_SESSION['theme']['button_icon_export'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-access_control_export'];
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle();' ".(empty($available_columns) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
echo " <th>".$text['label-column_name']."</th>\n";
echo "</tr>\n";
if (!empty($available_columns) && is_array($available_columns) && @sizeof($available_columns) != 0) {
$x = 0;
foreach ($available_columns as $column_name) {
$list_row_onclick = "if (!this.checked) { document.getElementById('checkbox_all').checked = false; }";
echo "<tr class='list-row'>\n";
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='column_group[]' id='checkbox_".$x."' value=\"".$column_name."\" onclick=\"".$list_row_onclick."\">\n";
echo " </td>\n";
echo " <td onclick=\"document.getElementById('checkbox_".$x."').checked = document.getElementById('checkbox_".$x."').checked ? false : true; ".$list_row_onclick."\">".$column_name."</td>";
echo "</tr>";
$x++;
}
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//include the footer
require_once "resources/footer.php";
?>

View File

@ -0,0 +1,458 @@
<?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) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
if (permission_exists('access_control_node_add')) {
//access granted
}
else {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//built in str_getcsv requires PHP 5.3 or higher, this function can be used to reproduce the functionality but requires PHP 5.1.0 or higher
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
$fp = fopen("php://memory", 'r+');
fputs($fp, $input);
rewind($fp);
$data = fgetcsv($fp, null, $delimiter, $enclosure); // $escape only got added in 5.3.0
fclose($fp);
return $data;
}
}
//set the max php execution time
ini_set('max_execution_time', 7200);
//get the http get values and set them as php variables
$action = $_POST["action"] ?? '';
$from_row = $_POST["from_row"] ?? '';
$delimiter = $_POST["data_delimiter"] ?? '';
$enclosure = $_POST["data_enclosure"] ?? '';
//save the data to the csv file
if (isset($_POST['data'])) {
$file = $_SESSION['server']['temp']['dir']."/access_control_nodes-".$_SESSION['domain_name'].".csv";
if (file_put_contents($file, $_POST['data'])) {
$_SESSION['file'] = $file;
}
}
//copy the csv file
//$_POST['submit'] == "Upload" &&
if (!empty($_FILES['ulfile']['tmp_name']) && is_uploaded_file($_FILES['ulfile']['tmp_name']) && permission_exists('access_control_node_add')) {
if (!empty($_POST['type']) &&$_POST['type'] == 'csv') {
$file = $_SESSION['server']['temp']['dir'].'/'.$_FILES['ulfile']['name'];
if (move_uploaded_file($_FILES['ulfile']['tmp_name'], $file)) {
$_SESSION['file'] = $file;
}
}
}
//get the schema
if (!empty($delimiter)) {
//get the first line
$line = fgets(fopen($_SESSION['file'], 'r'));
$line_fields = explode($delimiter, $line);
//get the schema
$x = 0;
include "app/access_controls/app_config.php";
$i = 0;
foreach ($apps[0]['db'] as $table) {
//get the table name and parent name
if (is_array($table["table"]['name'])) {
$table_name = $table["table"]['name']['text'];
}
else {
$table_name = $table["table"]['name'];
}
$parent_name = $table["table"]['parent'];
//remove the v_ table prefix
if (substr($table_name, 0, 2) == 'v_') {
$table_name = substr($table_name, 2);
}
if (substr($parent_name, 0, 2) == 'v_') {
$parent_name = substr($parent_name, 2);
}
//filter for specific tables and build the schema array
if ($table_name == 'access_control_nodes') {
$schema[$i]['table'] = $table_name;
$schema[$i]['parent'] = $parent_name;
foreach($table['fields'] as $row) {
$row['deprecated'] = $row['deprecated'] ?? '';
if ($row['deprecated'] !== 'true') {
if (is_array($row['name'])) {
$field_name = $row['name']['text'];
}
else {
$field_name = $row['name'];
}
$schema[$i]['fields'][] = $field_name;
}
}
$i++;
}
}
}
//match the column names to the field names
if (!empty($delimiter) && file_exists($_SESSION['file']) && $action != 'import') {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: access_control_edit.php?id='.$_GET['id']);
exit;
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include header
$document['title'] = $text['label-import'];
require_once "resources/header.php";
//form to match the fields to the column names
echo "<form name='frmUpload' method='post' enctype='multipart/form-data'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['label-import']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'access_control_node_edit.php?id='.$_GET['id']]);
echo button::create(['type'=>'submit','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'id'=>'btn_save']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-import']."\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
//loop through the lines and fields
$x = 0;
foreach ($line_fields as $line_field) {
$line_field = preg_replace('#[^a-zA-Z0-9_]#', '', $line_field);
echo "<tr>\n";
echo " <td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo $line_field;
echo " </td>\n";
echo " <td width='70%' class='vtable' align='left'>\n";
echo " <select class='formfld' style='' name='fields[$x]' onchange=\"document.getElementById('labels_$x').style.display = this.options[this.selectedIndex].value == 'contact_phones.phone_number' ? 'inline' : 'none';\">\n";
echo " <option value=''></option>\n";
foreach($schema as $row) {
echo " <optgroup label='".$row['table']."'>\n";
foreach($row['fields'] as $field) {
$selected = '';
if ($field == $line_field) {
$selected = "selected='selected'";
}
if (substr($field, -5) != '_uuid') {
echo " <option value='".$row['table'].".".$field."' ".$selected.">".$field."</option>\n";
}
}
echo " </optgroup>\n";
}
echo " </select>\n";
echo " </td>\n";
echo "</tr>\n";
$x++;
}
echo "</table>\n";
echo "</div>\n";
echo "<br /><br />\n";
echo "<input name='action' type='hidden' value='import'>\n";
echo "<input name='from_row' type='hidden' value='$from_row'>\n";
echo "<input name='data_delimiter' type='hidden' value='$delimiter'>\n";
echo "<input name='data_enclosure' type='hidden' value='$enclosure'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
require_once "resources/footer.php";
//end the script
exit;
}
//get the parent table
function get_parent($schema,$table_name) {
foreach ($schema as $row) {
if ($row['table'] == $table_name) {
return $row['parent'];
}
}
}
//upload the csv
if (file_exists($_SESSION['file'] ?? '') && $action == 'import') {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: access_control_edit.php?id='.$_GET['id']);
exit;
}
//user selected fields, labels
$fields = $_POST['fields'] ?? '';
$labels = $_POST['labels'] ?? '';
//set the domain_uuid
$domain_uuid = $_SESSION['domain_uuid'];
//get the contents of the csv file and convert them into an array
$handle = @fopen($_SESSION['file'], "r");
if ($handle) {
//set the starting identifiers
$row_id = 0;
$row_number = 1;
//loop through the array
while (($line = fgets($handle, 4096)) !== false) {
if ($from_row <= $row_number) {
//format the data
$y = 0;
foreach ($fields as $key => $value) {
//get the line
$result = str_getcsv($line, $delimiter, $enclosure);
//get the table and field name
$field_array = explode(".",$value);
$table_name = $field_array[0];
$field_name = $field_array[1];
//echo "value: $value<br />\n";
//echo "table_name: $table_name<br />\n";
//echo "field_name: $field_name<br />\n";
//get the parent table name
$parent = get_parent($schema, $table_name);
//count the field names
if (isset($field_count[$table_name][$field_name])) {
$field_count[$table_name][$field_name]++;
}
else {
$field_count[$table_name][$field_name] = 0;
}
//set the ordinal ID
$id = $field_count[$table_name][$field_name];
//remove formatting from the phone number
if ($field_name == "node_cidr") {
if (isset($result[$key]) && $result[$key] != '') {
$cidr_array = explode("/", str_replace("\\", "/", $result[$key]));
if (filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
if (isset($cidr_array[1]) && is_numeric($cidr_array[1])) {
//valid IPv4 address and cidr notation
//$result[$key] = $result[$key];
}
else {
//valid IPv4 address add the missing cidr notation
$result[$key] = $result[$key].'/32';
}
}
elseif(filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
//valid IPv6 address
}
}
}
//build the data array
if (!empty($table_name)) {
$array[$table_name][$row_id]['access_control_node_uuid'] = uuid();
$array[$table_name][$row_id]['access_control_uuid'] = $_GET['id'];
$array[$table_name][$row_id][$field_name] = $result[$key];
}
if (is_array($array[$parent][$row_id])) { $y++; }
}
//debug information
//view_array($field_count);
//process a chunk of the array
if ($row_id === 1000) {
//save to the data
$database = new database;
$database->app_name = 'access_controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array);
//clear the array
unset($array);
//set the row id back to 0
$row_id = 0;
}
} //if ($from_row <= $row_id)
$row_number++;
$row_id++;
} //end while
fclose($handle);
//debug information
//view_array($array);
//save to the data
if (!empty($array)) {
$database = new database;
$database->app_name = 'access_controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array);
unset($array);
}
//send the redirect header
header("Location: access_control_edit.php?id=".$_GET['id']);
return;
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include the header
$document['title'] = $text['label-import'];
require_once "resources/header.php";
//show content
echo "<form name='frmUpload' method='post' enctype='multipart/form-data'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['label-import']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'access_control_edit.php?id='.$_GET['id']]);
echo button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>$_SESSION['theme']['button_icon_upload'],'id'=>'btn_save']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-import']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table border='0' cellpadding='0' cellspacing='0' width='100%'>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_data']."\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <textarea name='data' id='data' class='formfld' style='width: 100%; min-height: 150px;' wrap='off'></textarea>\n";
echo "<br />\n";
echo $text['description-import_data']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-from_row']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='from_row'>\n";
$i=2;
while($i<=99) {
$selected = ($i == $from_row) ? "selected" : null;
echo " <option value='$i' ".$selected.">$i</option>\n";
$i++;
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-from_row']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_delimiter']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' style='width:40px;' name='data_delimiter'>\n";
echo " <option value=','>,</option>\n";
echo " <option value='|'>|</option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-import_delimiter']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_enclosure']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' style='width:40px;' name='data_enclosure'>\n";
echo " <option value='\"'>\"</option>\n";
echo " <option value=''></option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-import_enclosure']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_file_upload']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input name='ulfile' type='file' class='formfld fileinput' id='ulfile'>\n";
echo "<br />\n";
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
echo "</div>\n";
echo "<br /><br />\n";
echo "<input name='type' type='hidden' value='csv'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>";
//include the footer
require_once "resources/footer.php";
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2018 - 2020
Portions created by the Initial Developer are Copyright (C) 2018-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -42,15 +41,24 @@
$language = new text;
$text = $language->get();
//define variable
$search = '';
//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 the http post data
if (is_array($_POST['access_controls'])) {
$action = $_POST['action'];
$search = $_POST['search'];
if (!empty($_POST['access_controls'])) {
$action = $_POST['action'] ?? '';
$search = $_POST['search'] ?? '';
$access_controls = $_POST['access_controls'];
}
//process the http post data by action
if ($action != '' && is_array($access_controls) && @sizeof($access_controls) != 0) {
if (!empty($action) && !empty($access_controls) && count($access_controls) > 0) {
//validate the token
$token = new token;
@ -61,8 +69,9 @@
}
//prepare the array
foreach($access_controls as $row) {
$array['access_controls'][$x]['checked'] = $row['checked'];
$x = 0;
foreach ($access_controls as $row) {
$array['access_controls'][$x]['checked'] = $row['checked'] ?? null;
$array['access_controls'][$x]['access_control_uuid'] = $row['access_control_uuid'];
$x++;
}
@ -92,13 +101,13 @@
}
//redirect the user
header('Location: access_controls.php'.($search != '' ? '?search='.urlencode($search) : null));
header('Location: access_controls.php'.(!empty($search) ? '?search='.urlencode($search) : null));
exit;
}
//get order and order by
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//add the search
if (isset($_GET["search"])) {
@ -109,7 +118,7 @@
//get the count
$sql = "select count(access_control_uuid) ";
$sql .= "from v_access_controls ";
if (isset($_GET["search"])) {
if (!empty($search)) {
$sql .= "where (";
$sql .= " lower(access_control_name) like :search ";
$sql .= " or lower(access_control_default) like :search ";
@ -117,7 +126,7 @@
$sql .= ") ";
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//get the list
$sql = "select ";
@ -126,7 +135,7 @@
$sql .= "access_control_default, ";
$sql .= "access_control_description ";
$sql .= "from v_access_controls ";
if (isset($_GET["search"])) {
if (!empty($search)) {
$sql .= "where (";
$sql .= " lower(access_control_name) like :search ";
$sql .= " or lower(access_control_default) like :search ";
@ -134,9 +143,8 @@
$sql .= ") ";
}
$sql .= order_by($order_by, $order, 'access_control_name', 'asc');
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$access_controls = $database->select($sql, $parameters, 'all');
$access_controls = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -149,8 +157,9 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-access_controls']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['title-access_controls']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
echo button::create(['label'=>$text['button-reload'],'icon'=>$_SESSION['theme']['button_icon_reload'],'type'=>'button','id'=>'button_reload','link'=>'access_controls_reload.php'.(!empty($search) ? '?search='.urlencode($search) : null),'style'=>'margin-right: 15px;']);
if (permission_exists('access_control_add')) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','name'=>'btn_add','link'=>'access_control_edit.php']);
}
@ -164,9 +173,6 @@
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']);
//echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','link'=>'access_controls.php','style'=>($search == '' ? 'display: none;' : null)]);
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";
@ -186,26 +192,31 @@
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('access_control_add') || permission_exists('access_control_edit') || permission_exists('access_control_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($access_controls ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($access_controls) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
echo th_order_by('access_control_name', $text['label-access_control_name'], $order_by, $order);
echo th_order_by('access_control_default', $text['label-access_control_default'], $order_by, $order);
echo " <th class='hide-sm-dn'>".$text['label-access_control_description']."</th>\n";
if (permission_exists('access_control_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('access_control_edit') && $list_row_edit_button == 'true') {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($access_controls) && @sizeof($access_controls) != 0) {
if (!empty($access_controls) && count($access_controls) > 0) {
$x = 0;
foreach ($access_controls as $row) {
$list_row_url = '';
if (permission_exists('access_control_edit')) {
$list_row_url = "access_control_edit.php?id=".urlencode($row['access_control_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('access_control_add') || permission_exists('access_control_edit') || permission_exists('access_control_delete')) {
@ -224,7 +235,7 @@
echo " </td>\n";
echo " <td>".escape($row['access_control_default'])."</td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['access_control_description'])."</td>\n";
if (permission_exists('access_control_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('access_control_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";
@ -236,8 +247,8 @@
}
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";
@ -247,3 +258,4 @@
require_once "resources/footer.php";
?>

View File

@ -0,0 +1,55 @@
<?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) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
if (permission_exists('access_control_view')) {
//access granted
}
else {
echo "access denied";
exit;
}
//set the variables
$search = $_REQUEST['search'] ?? '';
//run the command
$result = rtrim(event_socket::api('reloadacl'));
//add message
message::add($result, 'alert');
//redirect
$search = preg_replace('#[^a-zA-Z0-9_\-\.]# ', '', $search);
$location = 'access_controls.php'.($search != '' ? "?search=".urlencode($search) : null);
header("Location: ".$location);
?>

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "Gérer les listes de contrôle d'accès";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "წვდომის კონტროლის სიების მართვა";
$apps[$x]['description']['nl-nl'] = "Beheer toegangs controle lijsten";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "";
@ -54,7 +55,6 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = "access_control_node_delete";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
//cache details
$apps[$x]['cache']['key'] = "configuration.acl.conf";
@ -72,7 +72,7 @@
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "access_control_name";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the name.";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "access_control_default";
@ -84,6 +84,30 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the 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'] = "";
$y++;
$apps[$x]['db'][$y]['table']['name'] = "v_access_control_nodes";
@ -111,12 +135,32 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the IP CIDR range.";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "node_domain";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the domain.";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "node_description";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the 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

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2016 - 2022
Portions created by the Initial Developer are Copyright (C) 2016 - 2023
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -29,13 +29,14 @@
//add the access control list to the database
$sql = "select count(*) from v_access_controls ";
$database = new database;
$num_rows = $database->select($sql, null, 'column');
if ($num_rows == 0) {
//set the directory
$xml_dir = $_SESSION["switch"]["conf"]["dir"].'/autoload_configs';
$xml_dir = $settings->get('switch','conf').'/autoload_configs';
$xml_file = $xml_dir."/acl.conf.xml";
$xml_file_alt = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH.'/resources/templates/conf/autoload_configs/acl.conf';
$xml_file_alt = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH.'/app/switch/resources/conf/autoload_configs/acl.conf';
//load the xml and save it into an array
if (file_exists($xml_file)) {
$xml_string = file_get_contents($xml_file);
@ -46,13 +47,12 @@
else {
$xml_string = "<configuration name=\"acl.conf\" description=\"Network Lists\">\n";
$xml_string .= " <network-lists>\n";
$xml_string .= " <list name=\"rfc1918\" default=\"allow\">\n";
$xml_string .= " <list name=\"rfc1918\" default=\"deny\">\n";
$xml_string .= " <node type=\"allow\" cidr=\"10.0.0.0/8\"/>\n";
$xml_string .= " <node type=\"allow\" cidr=\"172.16.0.0/12\"/>\n";
$xml_string .= " <node type=\"allow\" cidr=\"192.168.0.0/16\"/>\n";
$xml_string .= " </list>\n";
$xml_string .= " <list name=\"domains\" default=\"deny\">\n";
$xml_string .= " <node type=\"allow\" domain=\"".$_SESSION['domain_name']."\"/>\n";
$xml_string .= " <list name=\"providers\" default=\"deny\">\n";
$xml_string .= " </list>\n";
$xml_string .= " </network-lists>\n";
$xml_string .= "</configuration>\n";
@ -62,21 +62,21 @@
$conf_array = json_decode($json, true);
//process the array
foreach($conf_array['network-lists']['list'] as $list) {
//get the attributes
if (is_array($conf_array['network-lists']['list'])) {
foreach($conf_array['network-lists']['list'] as $list) {
//get the attributes
$access_control_name = $list['@attributes']['name'];
$access_control_default = $list['@attributes']['default'];
//insert the name, description
//insert the name, description
$access_control_uuid = uuid();
$array['access_controls'][0]['access_control_uuid'] = $access_control_uuid;
$array['access_controls'][0]['access_control_name'] = $access_control_name;
$array['access_controls'][0]['access_control_default'] = $access_control_default;
$p = new permissions;
$p = permissions::new();
$p->add('access_control_add', 'temp');
$database = new database;
$database->app_name = 'access_controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array, false);
@ -84,42 +84,39 @@
$p->delete('access_control_add', 'temp');
//normalize the array - needed because the array is inconsistent when there is only one row vs multiple
if (strlen($list['node']['@attributes']['type']) > 0) {
//normalize the array - needed because the array is inconsistent when there is only one row vs multiple
if (!empty($list['node']['@attributes']['type'])) {
$list['node'][]['@attributes'] = $list['node']['@attributes'];
unset($list['node']['@attributes']);
}
//add the nodes
foreach ($list['node'] as $row) {
//get the name and value pair
$node_type = $row['@attributes']['type'];
$node_cidr = $row['@attributes']['cidr'];
$node_domain = $row['@attributes']['domain'];
$node_description = $row['@attributes']['description'];
//replace $${domain}
if (strlen($node_domain) > 0) {
$node_domain = str_replace("\$\${domain}", $domain_name, $node_domain);
//add the nodes
if (is_array($list['node'])) {
foreach ($list['node'] as $row) {
//get the name and value pair
$node_type = $row['@attributes']['type'];
$node_cidr = $row['@attributes']['cidr'];
$node_description = $row['@attributes']['description'];
//add the profile settings into the database
$access_control_node_uuid = uuid();
$array['access_control_nodes'][0]['access_control_node_uuid'] = $access_control_node_uuid;
$array['access_control_nodes'][0]['access_control_uuid'] = $access_control_uuid;
$array['access_control_nodes'][0]['node_type'] = $node_type;
$array['access_control_nodes'][0]['node_cidr'] = $node_cidr;
$array['access_control_nodes'][0]['node_description'] = $node_description;
$p = permissions::new();
$p->add('access_control_node_add', 'temp');
$database->app_name = 'access_controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array, false);
unset($array);
$p->delete('access_control_node_add', 'temp');
}
//add the profile settings into the database
$access_control_node_uuid = uuid();
$array['access_control_nodes'][0]['access_control_node_uuid'] = $access_control_node_uuid;
$array['access_control_nodes'][0]['access_control_uuid'] = $access_control_uuid;
$array['access_control_nodes'][0]['node_type'] = $node_type;
$array['access_control_nodes'][0]['node_cidr'] = $node_cidr;
$array['access_control_nodes'][0]['node_domain'] = $node_domain;
$array['access_control_nodes'][0]['node_description'] = $node_description;
$p = new permissions;
$p->add('access_control_node_add', 'temp');
$database = new database;
$database->app_name = 'access_controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array, false);
unset($array);
$p->delete('access_control_node_add', 'temp');
}
}
}
@ -130,6 +127,59 @@
}
unset($sql, $num_rows);
//rename domains access control to providers
$sql = "select count(*) from v_access_controls ";
$sql .= "where access_control_name = 'domains' ";
$num_rows = $database->select($sql, null, 'column');
if ($num_rows > 0) {
//update the access control name
$sql = "update v_access_controls set access_control_name = 'providers' ";
$sql .= "where access_control_name = 'domains' ";
$database->execute($sql, null);
unset($sql);
//update the sip profile settings
$sql = "update v_sip_profile_settings set sip_profile_setting_value = 'providers' ";
$sql .= "where (sip_profile_setting_name = 'apply-inbound-acl' or sip_profile_setting_name = 'apply-register-acl') ";
$sql .= "and sip_profile_setting_value = 'domains'; ";
$database->execute($sql, null);
unset($sql);
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
$cache->delete("configuration:sofia.conf:".gethostname());
//create the event socket connection
$esl = event_socket::create();
//reload the acl
event_socket::async("reloadacl");
//rescan each sip profile
$sql = "select sip_profile_name from v_sip_profiles ";
$sql .= "where sip_profile_enabled = 'true'; ";
$sip_profiles = $database->select($sql, null, 'all');
if (is_array($sip_profiles)) {
foreach ($sip_profiles as $row) {
if ($esl->is_connected()) {
$command = "sofia profile '".$row['sip_profile_name']."' rescan";
//echo $command."\n";
$result = event_socket::api($command);
//echo $result."\n";
}
}
}
}
//remove orphaned access control nodes
$sql = "delete from v_access_control_nodes ";
$sql .= "where access_control_uuid not in ( ";
$sql .= " select access_control_uuid from v_access_controls ";
$sql .= ")";
$database->execute($sql, null);
unset($sql);
}
?>

View File

@ -1,438 +1,613 @@
<?php
#This file was last reorganized on 19th of September 2017 08:54:24 AM UTC
$text['title-access_controls']['en-us'] = "Access Controls";
$text['title-access_controls']['en-gb'] = "Access Controls";
$text['title-access_controls']['ar-eg'] = "عناصر التحكم في الوصول";
$text['title-access_controls']['de-at'] = " Zugriffskontrolle"; //copied from de-de
$text['title-access_controls']['de-ch'] = " Zugriffskontrolle"; //copied from de-de
$text['title-access_controls']['de-de'] = " Zugriffskontrolle";
$text['title-access_controls']['de-at'] = "Zugriffskontrolle";
$text['title-access_controls']['de-ch'] = "Zugriffskontrolle";
$text['title-access_controls']['de-de'] = "Zugriffskontrolle";
$text['title-access_controls']['el-gr'] = "Έλεγχοι πρόσβασης";
$text['title-access_controls']['es-cl'] = "Controles de acceso";
$text['title-access_controls']['es-mx'] = "Controles de acceso"; //copied from es-cl
$text['title-access_controls']['fr-ca'] = "Contrôle d'accès"; //copied from fr-fr
$text['title-access_controls']['es-mx'] = "Controles de acceso";
$text['title-access_controls']['fr-ca'] = "Contrôle d'accès";
$text['title-access_controls']['fr-fr'] = "Contrôle d'accès";
$text['title-access_controls']['he-il'] = "בקרת גישה";
$text['title-access_controls']['it-it'] = "Controllo Accessi";
$text['title-access_controls']['ka-ge'] = "წვდომების კონტროლი";
$text['title-access_controls']['nl-nl'] = "Toegangs Controle";
$text['title-access_controls']['pl-pl'] = "Kontrola dostępu";
$text['title-access_controls']['pt-br'] = "Controles de Acesso"; //copied from pt-pt
$text['title-access_controls']['pt-br'] = "Controles de Acesso";
$text['title-access_controls']['pt-pt'] = "Controles de Acesso";
$text['title-access_controls']['ro-ro'] = "Controale de acces";
$text['title-access_controls']['ru-ru'] = "Контроль доступа";
$text['title-access_controls']['sv-se'] = "Åtkomstkontroll";
$text['title-access_controls']['uk-ua'] = "контроль доступу";
$text['title-access_controls']['tr-tr'] = "Erişim Kontrolleri";
$text['title-access_controls']['zh-cn'] = "访问控制";
$text['title-access_controls']['ja-jp'] = "アクセス制御";
$text['title-access_controls']['ko-kr'] = "액세스 제어";
$text['title-access_control_nodes']['en-us'] = "Nodes";
$text['title-access_control_nodes']['en-gb'] = "Nodes";
$text['title-access_control_nodes']['ar-eg'] = "العقد";
$text['title-access_control_nodes']['de-at'] = "Knoten"; //copied from de-de
$text['title-access_control_nodes']['de-ch'] = "Knoten"; //copied from de-de
$text['title-access_control_nodes']['de-at'] = "Knoten";
$text['title-access_control_nodes']['de-ch'] = "Knoten";
$text['title-access_control_nodes']['de-de'] = "Knoten";
$text['title-access_control_nodes']['el-gr'] = "Κόμβοι";
$text['title-access_control_nodes']['es-cl'] = "Nodos";
$text['title-access_control_nodes']['es-mx'] = "Nodos"; //copied from es-cl
$text['title-access_control_nodes']['fr-ca'] = " nœuds"; //copied from fr-fr
$text['title-access_control_nodes']['fr-fr'] = " nœuds";
$text['title-access_control_nodes']['es-mx'] = "Nodos";
$text['title-access_control_nodes']['fr-ca'] = "nœuds";
$text['title-access_control_nodes']['fr-fr'] = "nœuds";
$text['title-access_control_nodes']['he-il'] = "בלוטות";
$text['title-access_control_nodes']['it-it'] = "Nodi";
$text['title-access_control_nodes']['ka-ge'] = "კვანძები";
$text['title-access_control_nodes']['nl-nl'] = "Knooppunten";
$text['title-access_control_nodes']['pl-pl'] = "węzły";
$text['title-access_control_nodes']['pt-br'] = "Nodes";
$text['title-access_control_nodes']['pt-pt'] = " Nodes";
$text['title-access_control_nodes']['pt-pt'] = "Nodes";
$text['title-access_control_nodes']['ro-ro'] = "Noduri";
$text['title-access_control_nodes']['ru-ru'] = "Узлы";
$text['title-access_control_nodes']['sv-se'] = "Noder";
$text['title-access_control_nodes']['uk-ua'] = "вузли";
$text['title-access_control_nodes']['tr-tr'] = "Düğümler";
$text['title-access_control_nodes']['zh-cn'] = "节点";
$text['title-access_control_nodes']['ja-jp'] = "ノード";
$text['title-access_control_nodes']['ko-kr'] = "노드";
$text['title-access_control_node']['en-us'] = "Node";
$text['title-access_control_node']['en-gb'] = "Node";
$text['title-access_control_node']['ar-eg'] = "العقدة";
$text['title-access_control_node']['de-at'] = "Netzknoten"; //copied from de-de
$text['title-access_control_node']['de-ch'] = "Netzknoten"; //copied from de-de
$text['title-access_control_node']['de-at'] = "Netzknoten";
$text['title-access_control_node']['de-ch'] = "Netzknoten";
$text['title-access_control_node']['de-de'] = "Netzknoten";
$text['title-access_control_node']['el-gr'] = "Κόμβος";
$text['title-access_control_node']['es-cl'] = "Nodo";
$text['title-access_control_node']['es-mx'] = "Nodo"; //copied from es-cl
$text['title-access_control_node']['fr-ca'] = " noeud"; //copied from fr-fr
$text['title-access_control_node']['fr-fr'] = " noeud";
$text['title-access_control_node']['es-mx'] = "Nodo";
$text['title-access_control_node']['fr-ca'] = "noeud";
$text['title-access_control_node']['fr-fr'] = "noeud";
$text['title-access_control_node']['he-il'] = "צומת";
$text['title-access_control_node']['it-it'] = "Nodo";
$text['title-access_control_node']['ka-ge'] = "კვანძი";
$text['title-access_control_node']['nl-nl'] = "Knooppunt";
$text['title-access_control_node']['pl-pl'] = "węzeł";
$text['title-access_control_node']['pt-br'] = ""; //copied from pt-pt
$text['title-access_control_node']['pt-br'] = "";
$text['title-access_control_node']['pt-pt'] = "";
$text['title-access_control_node']['ro-ro'] = "Nod";
$text['title-access_control_node']['ru-ru'] = "Узел";
$text['title-access_control_node']['sv-se'] = "Nod";
$text['title-access_control_node']['uk-ua'] = "вузол";
$text['title-access_control_node']['tr-tr'] = "Düğüm";
$text['title-access_control_node']['zh-cn'] = "节点";
$text['title-access_control_node']['ja-jp'] = "ノード";
$text['title-access_control_node']['ko-kr'] = "마디";
$text['title-access_control']['en-us'] = "Access Control";
$text['title-access_control']['en-gb'] = "Access Control";
$text['title-access_control']['ar-eg'] = "التحكم في الوصول";
$text['title-access_control']['de-at'] = " Zugangskontrolle"; //copied from de-de
$text['title-access_control']['de-ch'] = " Zugangskontrolle"; //copied from de-de
$text['title-access_control']['de-de'] = " Zugangskontrolle";
$text['title-access_control']['de-at'] = "Zugangskontrolle";
$text['title-access_control']['de-ch'] = "Zugangskontrolle";
$text['title-access_control']['de-de'] = "Zugangskontrolle";
$text['title-access_control']['el-gr'] = "Έλεγχος πρόσβασης";
$text['title-access_control']['es-cl'] = "Control de acceso";
$text['title-access_control']['es-mx'] = "Control de acceso"; //copied from es-cl
$text['title-access_control']['fr-ca'] = "Contrôle d'accès"; //copied from fr-fr
$text['title-access_control']['es-mx'] = "Control de acceso";
$text['title-access_control']['fr-ca'] = "Contrôle d'accès";
$text['title-access_control']['fr-fr'] = "Contrôle d'accès";
$text['title-access_control']['he-il'] = "בקרת גישה";
$text['title-access_control']['it-it'] = "Controllo Accesso";
$text['title-access_control']['ka-ge'] = "წვდომის კონტროლი";
$text['title-access_control']['nl-nl'] = "Toegangs Controle";
$text['title-access_control']['pl-pl'] = "Kontrola dostępu";
$text['title-access_control']['pt-br'] = "Controle de acesso"; //copied from pt-pt
$text['title-access_control']['pt-br'] = "Controle de acesso";
$text['title-access_control']['pt-pt'] = "Controle de acesso";
$text['title-access_control']['ro-ro'] = "Controlul accesului";
$text['title-access_control']['ru-ru'] = "Управление доступом";
$text['title-access_control']['sv-se'] = "Åtkomstkontroll";
$text['title-access_control']['uk-ua'] = "Управління доступом";
$text['title-access_control']['tr-tr'] = "Giriş kontrolu";
$text['title-access_control']['zh-cn'] = "访问控制";
$text['title-access_control']['ja-jp'] = "アクセス制御";
$text['title-access_control']['ko-kr'] = "액세스 제어";
$text['title_description-access_controls']['en-us'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['en-gb'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['ar-eg'] = "قائمة التحكم بالوصول يمكن السماح أو الرفض نطاقات العناوين.";
$text['title_description-access_controls']['de-at'] = " Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen."; //copied from de-de
$text['title_description-access_controls']['de-ch'] = " Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen."; //copied from de-de
$text['title_description-access_controls']['de-de'] = " Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['es-cl'] = " Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['es-mx'] = " Lista de control de acceso puede permitir o denegar los rangos de direcciones IP."; //copied from es-cl
$text['title_description-access_controls']['fr-ca'] = " Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP."; //copied from fr-fr
$text['title_description-access_controls']['fr-fr'] = " Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['he-il'] = " רשימת בקרת גישה יכולה לאפשר או למנוע טווחים של כתובות IP.";
$text['title_description-access_controls']['it-it'] = "Le liste per il controllo di accesso permettono o negano l'accesso a range di IP.";
$text['title_description-access_controls']['nl-nl'] = "Toegang Controle lijst kan IP adres reeks toestaan of verbieden.";
$text['title_description-access_controls']['pl-pl'] = "Lista kontroli dostępu może umożliwić lub zablokować zakresy adresów IP.";
$text['title_description-access_controls']['pt-br'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP."; //copied from pt-pt
$text['title_description-access_controls']['pt-pt'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['ro-ro'] = "Lista de control al accesului poate permite sau refuza intervale de adrese IP.";
$text['title_description-access_controls']['ru-ru'] = "Контроль доступа может разрешить или запретить диапазоны IP адресов.";
$text['title_description-access_controls']['sv-se'] = "Åtkomstkontrollista kan tillåta eller neka intervall av IP-adresser.";
$text['title_description-access_controls']['uk-ua'] = "Список контролю доступу може дозволити або заборонити діапазони IP-адрес.";
$text['title-access_control_export']['en-us'] = "Access Control Export";
$text['title-access_control_export']['en-gb'] = "Access Control Export";
$text['title-access_control_export']['ar-eg'] = "";
$text['title-access_control_export']['de-at'] = "";
$text['title-access_control_export']['de-ch'] = "";
$text['title-access_control_export']['de-de'] = "";
$text['title-access_control_export']['ek-gr'] = "";
$text['title-access_control_export']['es-cl'] = "";
$text['title-access_control_export']['es-mx'] = "";
$text['title-access_control_export']['fr-ca'] = "";
$text['title-access_control_export']['fr-fr'] = "";
$text['title-access_control_export']['he-il'] = "";
$text['title-access_control_export']['it-it'] = "";
$text['title-access_control_export']['ka-ge'] = "";
$text['title-access_control_export']['nl-nl'] = "";
$text['title-access_control_export']['pl-pl'] = "";
$text['title-access_control_export']['pt-br'] = "";
$text['title-access_control_export']['pt-pt'] = "";
$text['title-access_control_export']['ro-ro'] = "";
$text['title-access_control_export']['ru-ru'] = "";
$text['title-access_control_export']['sv-se'] = "";
$text['title-access_control_export']['uk-ua'] = "";
$text['title-access_control_export']['tr-tr'] = "";
$text['title-access_control_export']['zh-cn'] = "";
$text['title-access_control_export']['ja-jp'] = "";
$text['title-access_control_export']['ko-kr'] = "";
$text['header-access_control_export']['en-us'] = "Access Control Export";
$text['header-access_control_export']['en-gb'] = "Access Control Export";
$text['header-access_control_export']['ar-eg'] = "";
$text['header-access_control_export']['de-at'] = "";
$text['header-access_control_export']['de-ch'] = "";
$text['header-access_control_export']['de-de'] = "";
$text['header-access_control_export']['ek-gr'] = "";
$text['header-access_control_export']['es-cl'] = "";
$text['header-access_control_export']['es-mx'] = "";
$text['header-access_control_export']['fr-ca'] = "";
$text['header-access_control_export']['fr-fr'] = "";
$text['header-access_control_export']['he-il'] = "";
$text['header-access_control_export']['it-it'] = "";
$text['header-access_control_export']['ka-ge'] = "";
$text['header-access_control_export']['nl-nl'] = "";
$text['header-access_control_export']['pl-pl'] = "";
$text['header-access_control_export']['pt-br'] = "";
$text['header-access_control_export']['pt-pt'] = "";
$text['header-access_control_export']['ro-ro'] = "";
$text['header-access_control_export']['ru-ru'] = "";
$text['header-access_control_export']['sv-se'] = "";
$text['header-access_control_export']['uk-ua'] = "";
$text['header-access_control_export']['tr-tr'] = "";
$text['header-access_control_export']['zh-cn'] = "";
$text['header-access_control_export']['ja-jp'] = "";
$text['header-access_control_export']['ko-kr'] = "";
$text['label-node_type']['en-us'] = "Type";
$text['label-node_type']['en-gb'] = "Type";
$text['label-node_type']['ar-eg'] = "اكتب";
$text['label-node_type']['de-at'] = "Art"; //copied from de-de
$text['label-node_type']['de-ch'] = "Art"; //copied from de-de
$text['label-node_type']['de-at'] = "Art";
$text['label-node_type']['de-ch'] = "Art";
$text['label-node_type']['de-de'] = "Art";
$text['label-node_type']['el-gr'] = "Τύπος";
$text['label-node_type']['es-cl'] = "Escribe";
$text['label-node_type']['es-mx'] = "Escribe"; //copied from es-cl
$text['label-node_type']['fr-ca'] = "Type"; //copied from fr-fr
$text['label-node_type']['es-mx'] = "Escribe";
$text['label-node_type']['fr-ca'] = "Type";
$text['label-node_type']['fr-fr'] = "Type";
$text['label-node_type']['he-il'] = "סוג";
$text['label-node_type']['it-it'] = "Tipo";
$text['label-node_type']['ka-ge'] = "ტიპი";
$text['label-node_type']['nl-nl'] = "Type";
$text['label-node_type']['pl-pl'] = "typ";
$text['label-node_type']['pt-br'] = "Tipo"; //copied from pt-pt
$text['label-node_type']['pt-br'] = "Tipo";
$text['label-node_type']['pt-pt'] = "Tipo";
$text['label-node_type']['ro-ro'] = "Tip";
$text['label-node_type']['ru-ru'] = "Тип";
$text['label-node_type']['sv-se'] = "Typ";
$text['label-node_type']['uk-ua'] = "Тип";
$text['label-node_type']['tr-tr'] = "Tip";
$text['label-node_type']['zh-cn'] = "类型";
$text['label-node_type']['ja-jp'] = "タイプ";
$text['label-node_type']['ko-kr'] = "유형";
$text['label-node_domain']['en-us'] = "Domain";
$text['label-node_domain']['en-gb'] = "Domain";
$text['label-node_domain']['ar-eg'] = "مجال";
$text['label-node_domain']['de-at'] = " Domäne"; //copied from de-de
$text['label-node_domain']['de-ch'] = " Domäne"; //copied from de-de
$text['label-node_domain']['de-de'] = " Domäne";
$text['label-node_domain']['de-at'] = "Domäne";
$text['label-node_domain']['de-ch'] = "Domäne";
$text['label-node_domain']['de-de'] = "Domäne";
$text['label-node_domain']['el-gr'] = "Τομέα";
$text['label-node_domain']['es-cl'] = "Dominio";
$text['label-node_domain']['es-mx'] = "Dominio"; //copied from es-cl
$text['label-node_domain']['fr-ca'] = "Domaine"; //copied from fr-fr
$text['label-node_domain']['es-mx'] = "Dominio";
$text['label-node_domain']['fr-ca'] = "Domaine";
$text['label-node_domain']['fr-fr'] = "Domaine";
$text['label-node_domain']['he-il'] = "תחום";
$text['label-node_domain']['it-it'] = "Dominio";
$text['label-node_domain']['ka-ge'] = "დომენი";
$text['label-node_domain']['nl-nl'] = "Domein";
$text['label-node_domain']['pl-pl'] = "domeny";
$text['label-node_domain']['pt-br'] = "Domínio"; //copied from pt-pt
$text['label-node_domain']['pt-br'] = "Domínio";
$text['label-node_domain']['pt-pt'] = "Domínio";
$text['label-node_domain']['ro-ro'] = "Domeniu";
$text['label-node_domain']['ru-ru'] = "Домен";
$text['label-node_domain']['sv-se'] = "Domän";
$text['label-node_domain']['uk-ua'] = "домен";
$text['label-node_domain']['tr-tr'] = "İhtisas";
$text['label-node_domain']['zh-cn'] = "领域";
$text['label-node_domain']['ja-jp'] = "ドメイン";
$text['label-node_domain']['ko-kr'] = "도메인";
$text['label-node_description']['en-us'] = "Description";
$text['label-node_description']['en-gb'] = "Description";
$text['label-node_description']['ar-eg'] = "وصف";
$text['label-node_description']['de-at'] = "Beschreibung"; //copied from de-de
$text['label-node_description']['de-ch'] = "Beschreibung"; //copied from de-de
$text['label-node_description']['de-at'] = "Beschreibung";
$text['label-node_description']['de-ch'] = "Beschreibung";
$text['label-node_description']['de-de'] = "Beschreibung";
$text['label-node_description']['el-gr'] = "Περιγραφή";
$text['label-node_description']['es-cl'] = "Descripción";
$text['label-node_description']['es-mx'] = "Descripción"; //copied from es-cl
$text['label-node_description']['fr-ca'] = "Description"; //copied from fr-fr
$text['label-node_description']['es-mx'] = "Descripción";
$text['label-node_description']['fr-ca'] = "Description";
$text['label-node_description']['fr-fr'] = "Description";
$text['label-node_description']['he-il'] = "תיאור";
$text['label-node_description']['it-it'] = "Descrizione";
$text['label-node_description']['ka-ge'] = "აღწერა";
$text['label-node_description']['nl-nl'] = "Beschrijving";
$text['label-node_description']['pl-pl'] = "opis";
$text['label-node_description']['pt-br'] = "Descrição"; //copied from pt-pt
$text['label-node_description']['pt-br'] = "Descrição";
$text['label-node_description']['pt-pt'] = "Descrição";
$text['label-node_description']['ro-ro'] = "Descriere";
$text['label-node_description']['ru-ru'] = "Описание";
$text['label-node_description']['sv-se'] = "Beskrivning";
$text['label-node_description']['uk-ua'] = "опис";
$text['label-node_description']['tr-tr'] = "Tanım";
$text['label-node_description']['zh-cn'] = "描述";
$text['label-node_description']['ja-jp'] = "説明";
$text['label-node_description']['ko-kr'] = "설명";
$text['label-node_cidr']['en-us'] = "CIDR";
$text['label-node_cidr']['en-gb'] = "CIDR";
$text['label-node_cidr']['ar-eg'] = "CIDR";
$text['label-node_cidr']['de-at'] = "CIDR"; //copied from de-de
$text['label-node_cidr']['de-ch'] = "CIDR"; //copied from de-de
$text['label-node_cidr']['de-at'] = "CIDR";
$text['label-node_cidr']['de-ch'] = "CIDR";
$text['label-node_cidr']['de-de'] = "CIDR";
$text['label-node_cidr']['el-gr'] = "CIDR";
$text['label-node_cidr']['es-cl'] = "CIDR";
$text['label-node_cidr']['es-mx'] = "CIDR"; //copied from es-cl
$text['label-node_cidr']['fr-ca'] = "CIDR"; //copied from fr-fr
$text['label-node_cidr']['es-mx'] = "CIDR";
$text['label-node_cidr']['fr-ca'] = "CIDR";
$text['label-node_cidr']['fr-fr'] = "CIDR";
$text['label-node_cidr']['he-il'] = "CIDR";
$text['label-node_cidr']['it-it'] = "CIDR";
$text['label-node_cidr']['ka-ge'] = "CIRD";
$text['label-node_cidr']['nl-nl'] = "CIDR";
$text['label-node_cidr']['pl-pl'] = "CIDR";
$text['label-node_cidr']['pt-br'] = "CIDR"; //copied from pt-pt
$text['label-node_cidr']['pt-br'] = "CIDR";
$text['label-node_cidr']['pt-pt'] = "CIDR";
$text['label-node_cidr']['ro-ro'] = "CIDR";
$text['label-node_cidr']['ru-ru'] = "CIDR";
$text['label-node_cidr']['sv-se'] = "CIDR";
$text['label-node_cidr']['uk-ua'] = "CIDR";
$text['label-node_cidr']['tr-tr'] = "CIDR";
$text['label-node_cidr']['zh-cn'] = "CIDR";
$text['label-node_cidr']['ja-jp'] = "CIDR";
$text['label-node_cidr']['ko-kr'] = "CIDR";
$text['label-deny']['en-us'] = "deny";
$text['label-deny']['en-gb'] = "deny";
$text['label-deny']['ar-eg'] = "تنكر";
$text['label-deny']['de-at'] = " verbieten"; //copied from de-de
$text['label-deny']['de-ch'] = " verbieten"; //copied from de-de
$text['label-deny']['de-de'] = " verbieten";
$text['label-deny']['de-at'] = "verbieten";
$text['label-deny']['de-ch'] = "verbieten";
$text['label-deny']['de-de'] = "verbieten";
$text['label-deny']['el-gr'] = "αρνούμαι";
$text['label-deny']['es-cl'] = "Negar";
$text['label-deny']['es-mx'] = "Negar"; //copied from es-cl
$text['label-deny']['fr-ca'] = " nier"; //copied from fr-fr
$text['label-deny']['fr-fr'] = " nier";
$text['label-deny']['es-mx'] = "Negar";
$text['label-deny']['fr-ca'] = "nier";
$text['label-deny']['fr-fr'] = "nier";
$text['label-deny']['he-il'] = "להכחיש";
$text['label-deny']['it-it'] = "nega";
$text['label-deny']['ka-ge'] = "უარყოფა";
$text['label-deny']['nl-nl'] = "verbieden";
$text['label-deny']['pl-pl'] = "odrzuć";
$text['label-deny']['pt-br'] = "negar"; //copied from pt-pt
$text['label-deny']['pt-br'] = "negar";
$text['label-deny']['pt-pt'] = "negar";
$text['label-deny']['ro-ro'] = "Nega";
$text['label-deny']['ru-ru'] = "запретить";
$text['label-deny']['sv-se'] = "förneka";
$text['label-deny']['uk-ua'] = "правда";
$text['label-deny']['tr-tr'] = "reddetmek";
$text['label-deny']['zh-cn'] = "否定";
$text['label-deny']['ja-jp'] = "拒否";
$text['label-deny']['ko-kr'] = "부인하다";
$text['label-allow']['en-us'] = "allow";
$text['label-allow']['en-gb'] = "allow";
$text['label-allow']['ar-eg'] = "السماح";
$text['label-allow']['de-at'] = "erlauben"; //copied from de-de
$text['label-allow']['de-ch'] = "erlauben"; //copied from de-de
$text['label-allow']['de-at'] = "erlauben";
$text['label-allow']['de-ch'] = "erlauben";
$text['label-allow']['de-de'] = "erlauben";
$text['label-allow']['el-gr'] = "επιτρέπω";
$text['label-allow']['es-cl'] = "Permitir";
$text['label-allow']['es-mx'] = "Permitir"; //copied from es-cl
$text['label-allow']['fr-ca'] = " permettre"; //copied from fr-fr
$text['label-allow']['fr-fr'] = " permettre";
$text['label-allow']['es-mx'] = "Permitir";
$text['label-allow']['fr-ca'] = "permettre";
$text['label-allow']['fr-fr'] = "permettre";
$text['label-allow']['he-il'] = "לאפשר";
$text['label-allow']['it-it'] = "permetti";
$text['label-allow']['ka-ge'] = "დაშვება";
$text['label-allow']['nl-nl'] = "toestaan";
$text['label-allow']['pl-pl'] = "zezwól";
$text['label-allow']['pt-br'] = "permitir"; //copied from pt-pt
$text['label-allow']['pt-br'] = "permitir";
$text['label-allow']['pt-pt'] = "permitir";
$text['label-allow']['ro-ro'] = "Permite";
$text['label-allow']['ru-ru'] = "разрешить";
$text['label-allow']['sv-se'] = "tillåta";
$text['label-allow']['uk-ua'] = "дозволяти";
$text['label-allow']['tr-tr'] = "izin vermek";
$text['label-allow']['zh-cn'] = "允许";
$text['label-allow']['ja-jp'] = "許可する";
$text['label-allow']['ko-kr'] = "허용하다";
$text['label-access_control_name']['en-us'] = "Name";
$text['label-access_control_name']['en-gb'] = "Name";
$text['label-access_control_name']['ar-eg'] = "اسم";
$text['label-access_control_name']['de-at'] = "Name"; //copied from de-de
$text['label-access_control_name']['de-ch'] = "Name"; //copied from de-de
$text['label-access_control_name']['de-at'] = "Name";
$text['label-access_control_name']['de-ch'] = "Name";
$text['label-access_control_name']['de-de'] = "Name";
$text['label-access_control_name']['el-gr'] = "Ονομα";
$text['label-access_control_name']['es-cl'] = "Nombre";
$text['label-access_control_name']['es-mx'] = "Nombre"; //copied from es-cl
$text['label-access_control_name']['fr-ca'] = "Nom"; //copied from fr-fr
$text['label-access_control_name']['es-mx'] = "Nombre";
$text['label-access_control_name']['fr-ca'] = "Nom";
$text['label-access_control_name']['fr-fr'] = "Nom";
$text['label-access_control_name']['he-il'] = "שם";
$text['label-access_control_name']['it-it'] = "Nome";
$text['label-access_control_name']['ka-ge'] = "სახელი";
$text['label-access_control_name']['nl-nl'] = "Naam";
$text['label-access_control_name']['pl-pl'] = " Imię";
$text['label-access_control_name']['pt-br'] = "Nome"; //copied from pt-pt
$text['label-access_control_name']['pl-pl'] = "Imię";
$text['label-access_control_name']['pt-br'] = "Nome";
$text['label-access_control_name']['pt-pt'] = "Nome";
$text['label-access_control_name']['ro-ro'] = "Nume";
$text['label-access_control_name']['ru-ru'] = "Имя";
$text['label-access_control_name']['sv-se'] = "namn";
$text['label-access_control_name']['uk-ua'] = "ім'я";
$text['label-access_control_name']['tr-tr'] = "İsim";
$text['label-access_control_name']['zh-cn'] = "姓名";
$text['label-access_control_name']['ja-jp'] = "名前";
$text['label-access_control_name']['ko-kr'] = "이름";
$text['label-access_control_default']['en-us'] = "Default";
$text['label-access_control_default']['en-gb'] = "Default";
$text['label-access_control_default']['ar-eg'] = "افتراضي";
$text['label-access_control_default']['de-at'] = "Standard"; //copied from de-de
$text['label-access_control_default']['de-ch'] = "Standard"; //copied from de-de
$text['label-access_control_default']['de-at'] = "Standard";
$text['label-access_control_default']['de-ch'] = "Standard";
$text['label-access_control_default']['de-de'] = "Standard";
$text['label-access_control_default']['el-gr'] = "Προκαθορισμένο";
$text['label-access_control_default']['es-cl'] = "Defecto";
$text['label-access_control_default']['es-mx'] = "Defecto"; //copied from es-cl
$text['label-access_control_default']['fr-ca'] = "Par défaut"; //copied from fr-fr
$text['label-access_control_default']['es-mx'] = "Defecto";
$text['label-access_control_default']['fr-ca'] = "Par défaut";
$text['label-access_control_default']['fr-fr'] = "Par défaut";
$text['label-access_control_default']['he-il'] = " ברירת מחדל";
$text['label-access_control_default']['he-il'] = "ברירת מחדל";
$text['label-access_control_default']['it-it'] = "Predefinito";
$text['label-access_control_default']['ka-ge'] = "ნაგულისხმევი";
$text['label-access_control_default']['nl-nl'] = "Standaard";
$text['label-access_control_default']['pl-pl'] = "Domyślnie";
$text['label-access_control_default']['pt-br'] = "Padrão"; //copied from pt-pt
$text['label-access_control_default']['pt-br'] = "Padrão";
$text['label-access_control_default']['pt-pt'] = "Padrão";
$text['label-access_control_default']['ro-ro'] = "Implicit";
$text['label-access_control_default']['ru-ru'] = "По умолчанию";
$text['label-access_control_default']['sv-se'] = "Standard";
$text['label-access_control_default']['uk-ua'] = "дефолт";
$text['label-access_control_default']['tr-tr'] = "Varsayılan";
$text['label-access_control_default']['zh-cn'] = "默认";
$text['label-access_control_default']['ja-jp'] = "デフォルト";
$text['label-access_control_default']['ko-kr'] = "기본";
$text['label-access_control_nodes']['en-us'] = "Nodes";
$text['label-access_control_nodes']['en-gb'] = "Nodes";
$text['label-access_control_nodes']['ar-eg'] = "العقد";
$text['label-access_control_nodes']['de-at'] = "Knoten"; //copied from de-de
$text['label-access_control_nodes']['de-ch'] = "Knoten"; //copied from de-de
$text['label-access_control_nodes']['de-at'] = "Knoten";
$text['label-access_control_nodes']['de-ch'] = "Knoten";
$text['label-access_control_nodes']['de-de'] = "Knoten";
$text['label-access_control_nodes']['el-gr'] = "Κόμβοι";
$text['label-access_control_nodes']['es-cl'] = "Nodos";
$text['label-access_control_nodes']['es-mx'] = "Nodos"; //copied from es-cl
$text['label-access_control_nodes']['fr-ca'] = " nœuds"; //copied from fr-fr
$text['label-access_control_nodes']['fr-fr'] = " nœuds";
$text['label-access_control_nodes']['es-mx'] = "Nodos";
$text['label-access_control_nodes']['fr-ca'] = "nœuds";
$text['label-access_control_nodes']['fr-fr'] = "nœuds";
$text['label-access_control_nodes']['he-il'] = "בלוטות";
$text['label-access_control_nodes']['it-it'] = "Nodi";
$text['label-access_control_nodes']['ka-ge'] = "კვანძები";
$text['label-access_control_nodes']['nl-nl'] = "Knooppunten";
$text['label-access_control_nodes']['pl-pl'] = "węzły";
$text['label-access_control_nodes']['pt-br'] = "Nodes";
$text['label-access_control_nodes']['pt-pt'] = " Nodes";
$text['label-access_control_nodes']['pt-pt'] = "Nodes";
$text['label-access_control_nodes']['ro-ro'] = "Noduri";
$text['label-access_control_nodes']['ru-ru'] = "Узлы";
$text['label-access_control_nodes']['sv-se'] = "Noder";
$text['label-access_control_nodes']['uk-ua'] = "вузли";
$text['label-access_control_nodes']['tr-tr'] = "Düğümler";
$text['label-access_control_nodes']['zh-cn'] = "节点";
$text['label-access_control_nodes']['ja-jp'] = "ノード";
$text['label-access_control_nodes']['ko-kr'] = "노드";
$text['label-access_control_description']['en-us'] = "Description";
$text['label-access_control_description']['en-gb'] = "Description";
$text['label-access_control_description']['ar-eg'] = "وصف";
$text['label-access_control_description']['de-at'] = "Beschreibung"; //copied from de-de
$text['label-access_control_description']['de-ch'] = "Beschreibung"; //copied from de-de
$text['label-access_control_description']['de-at'] = "Beschreibung";
$text['label-access_control_description']['de-ch'] = "Beschreibung";
$text['label-access_control_description']['de-de'] = "Beschreibung";
$text['label-access_control_description']['el-gr'] = "Περιγραφή";
$text['label-access_control_description']['es-cl'] = "Descripción";
$text['label-access_control_description']['es-mx'] = "Descripción"; //copied from es-cl
$text['label-access_control_description']['fr-ca'] = "Description"; //copied from fr-fr
$text['label-access_control_description']['es-mx'] = "Descripción";
$text['label-access_control_description']['fr-ca'] = "Description";
$text['label-access_control_description']['fr-fr'] = "Description";
$text['label-access_control_description']['he-il'] = "תיאור";
$text['label-access_control_description']['it-it'] = "Descrizione";
$text['label-access_control_description']['ka-ge'] = "აღწერა";
$text['label-access_control_description']['nl-nl'] = "Omschrijving";
$text['label-access_control_description']['pl-pl'] = "opis";
$text['label-access_control_description']['pt-br'] = "Descrição"; //copied from pt-pt
$text['label-access_control_description']['pt-br'] = "Descrição";
$text['label-access_control_description']['pt-pt'] = "Descrição";
$text['label-access_control_description']['ro-ro'] = "Descriere";
$text['label-access_control_description']['ru-ru'] = "Описание";
$text['label-access_control_description']['sv-se'] = "Beskrivning";
$text['label-access_control_description']['uk-ua'] = "опис";
$text['label-access_control_description']['tr-tr'] = "Tanım";
$text['label-access_control_description']['zh-cn'] = "描述";
$text['label-access_control_description']['ja-jp'] = "説明";
$text['label-access_control_description']['ko-kr'] = "설명";
$text['title_description-access_controls']['en-us'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['en-gb'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['ar-eg'] = "قائمة التحكم بالوصول يمكن السماح أو الرفض نطاقات العناوين.";
$text['title_description-access_controls']['de-at'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-ch'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-de'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['el-gr'] = "Access control list can allow or deny ranges of IP addresses";
$text['title_description-access_controls']['es-cl'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['es-mx'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['fr-ca'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['fr-fr'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['he-il'] = " רשימת בקרת גישה יכולה לאפשר או למנוע טווחים של כתובות IP.";
$text['title_description-access_controls']['it-it'] = "Le liste per il controllo di accesso permettono o negano l'accesso a range di IP.";
$text['title_description-access_controls']['ka-ge'] = "წვდომის კონტროლის სიას IP მისამართების შუალედების დაშვება ან აკრძალვა შეუძლია";
$text['title_description-access_controls']['nl-nl'] = "Toegang Controle lijst kan IP adres reeks toestaan of verbieden.";
$text['title_description-access_controls']['pl-pl'] = "Lista kontroli dostępu może umożliwić lub zablokować zakresy adresów IP.";
$text['title_description-access_controls']['pt-br'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['pt-pt'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['ro-ro'] = "Lista de control al accesului poate permite sau refuza intervale de adrese IP.";
$text['title_description-access_controls']['ru-ru'] = "Контроль доступа может разрешить или запретить диапазоны IP адресов.";
$text['title_description-access_controls']['sv-se'] = "Åtkomstkontrollista kan tillåta eller neka intervall av IP-adresser.";
$text['title_description-access_controls']['uk-ua'] = "Список контролю доступу може дозволити або заборонити діапазони IP-адрес.";
$text['title_description-access_controls']['tr-tr'] = "Erişim kontrol listesi IP adres aralıklarına izin verebilir veya reddedebilir.";
$text['title_description-access_controls']['zh-cn'] = "访问控制列表可以允许或拒绝 IP 地址范围。";
$text['title_description-access_controls']['ja-jp'] = "アクセス コントロール リストでは、IP アドレスの範囲を許可または拒否できます。";
$text['title_description-access_controls']['ko-kr'] = "액세스 제어 목록은 IP 주소 범위를 허용하거나 거부할 수 있습니다.";
$text['description-node_type']['en-us'] = "Select the type.";
$text['description-node_type']['en-gb'] = "Select the type.";
$text['description-node_type']['ar-eg'] = "حدد نوع.";
$text['description-node_type']['de-at'] = " Wählen Sie den Typ."; //copied from de-de
$text['description-node_type']['de-ch'] = " Wählen Sie den Typ."; //copied from de-de
$text['description-node_type']['de-de'] = " Wählen Sie den Typ.";
$text['description-node_type']['de-at'] = "Wählen Sie den Typ.";
$text['description-node_type']['de-ch'] = "Wählen Sie den Typ.";
$text['description-node_type']['de-de'] = "Wählen Sie den Typ.";
$text['description-node_type']['el-gr'] = "Επιλέξτε τον τύπο";
$text['description-node_type']['es-cl'] = "Seleccione el tipo.";
$text['description-node_type']['es-mx'] = "Seleccione el tipo."; //copied from es-cl
$text['description-node_type']['fr-ca'] = " Sélectionnez le type"; //copied from fr-fr
$text['description-node_type']['fr-fr'] = " Sélectionnez le type";
$text['description-node_type']['he-il'] = " בחר את הסוג.";
$text['description-node_type']['es-mx'] = "Seleccione el tipo.";
$text['description-node_type']['fr-ca'] = "Sélectionnez le type";
$text['description-node_type']['fr-fr'] = "Sélectionnez le type";
$text['description-node_type']['he-il'] = "בחר את הסוג.";
$text['description-node_type']['it-it'] = "Seleziona il tipo.";
$text['description-node_type']['ka-ge'] = "აირჩიეთ ტიპი.";
$text['description-node_type']['nl-nl'] = "Selecteer het type.";
$text['description-node_type']['pl-pl'] = "Wybierz rodzaj.";
$text['description-node_type']['pt-br'] = "Selecione o tipo."; //copied from pt-pt
$text['description-node_type']['pt-br'] = "Selecione o tipo.";
$text['description-node_type']['pt-pt'] = "Selecione o tipo.";
$text['description-node_type']['ro-ro'] = "Selectați tipul.";
$text['description-node_type']['ru-ru'] = "Выберите тип.";
$text['description-node_type']['sv-se'] = "Välj typ.";
$text['description-node_type']['uk-ua'] = "Виберіть тип.";
$text['description-node_type']['tr-tr'] = "Türü seçin.";
$text['description-node_type']['zh-cn'] = "选择类型。";
$text['description-node_type']['ja-jp'] = "タイプを選択してください。";
$text['description-node_type']['ko-kr'] = "유형을 선택합니다.";
$text['description-node_domain']['en-us'] = "Enter the domain name.";
$text['description-node_domain']['en-gb'] = "Enter the domain name.";
$text['description-node_domain']['ar-eg'] = "أدخل اسم المجال.";
$text['description-node_domain']['de-at'] = "Geben Sie den Domain-Namen."; //copied from de-de
$text['description-node_domain']['de-ch'] = "Geben Sie den Domain-Namen."; //copied from de-de
$text['description-node_domain']['de-at'] = "Geben Sie den Domain-Namen.";
$text['description-node_domain']['de-ch'] = "Geben Sie den Domain-Namen.";
$text['description-node_domain']['de-de'] = "Geben Sie den Domain-Namen.";
$text['description-node_domain']['el-gr'] = "Εισαγάγετε το όνομα τομέα.";
$text['description-node_domain']['es-cl'] = "Introduzca el nombre de dominio.";
$text['description-node_domain']['es-mx'] = "Introduzca el nombre de dominio."; //copied from es-cl
$text['description-node_domain']['fr-ca'] = "Entrez le nom de domaine."; //copied from fr-fr
$text['description-node_domain']['es-mx'] = "Introduzca el nombre de dominio.";
$text['description-node_domain']['fr-ca'] = "Entrez le nom de domaine.";
$text['description-node_domain']['fr-fr'] = "Entrez le nom de domaine.";
$text['description-node_domain']['he-il'] = " הזן את שם הדומיין.";
$text['description-node_domain']['it-it'] = "Inserisci il dominio.";
$text['description-node_domain']['ka-ge'] = "შეიყვანეთ დომენის სახელი";
$text['description-node_domain']['nl-nl'] = "Voer de domeinnaam in.";
$text['description-node_domain']['pl-pl'] = " Wprowadź nazwę domeny.";
$text['description-node_domain']['pt-br'] = "Digite o nome de domínio."; //copied from pt-pt
$text['description-node_domain']['pl-pl'] = "Wprowadź nazwę domeny.";
$text['description-node_domain']['pt-br'] = "Digite o nome de domínio.";
$text['description-node_domain']['pt-pt'] = "Digite o nome de domínio.";
$text['description-node_domain']['ro-ro'] = "Introduceți numele de domeniu.";
$text['description-node_domain']['ru-ru'] = "Введите имя домена.";
$text['description-node_domain']['sv-se'] = "Ange domännamnet.";
$text['description-node_domain']['uk-ua'] = "Введіть ім'я домену.";
$text['description-node_domain']['tr-tr'] = "Alan adını girin.";
$text['description-node_domain']['zh-cn'] = "输入域名。";
$text['description-node_domain']['ja-jp'] = "ドメイン名を入力します。";
$text['description-node_domain']['ko-kr'] = "도메인 이름을 입력합니다.";
$text['description-node_description']['en-us'] = "Enter the description.";
$text['description-node_description']['en-gb'] = "Enter the description.";
$text['description-node_description']['ar-eg'] = "أدخل الوصف.";
$text['description-node_description']['de-at'] = "Geben Sie die Beschreibung ein."; //copied from de-de
$text['description-node_description']['de-ch'] = "Geben Sie die Beschreibung ein."; //copied from de-de
$text['description-node_description']['de-at'] = "Geben Sie die Beschreibung ein.";
$text['description-node_description']['de-ch'] = "Geben Sie die Beschreibung ein.";
$text['description-node_description']['de-de'] = "Geben Sie die Beschreibung ein.";
$text['description-node_description']['es-cl'] = " Introduzca la descripción.";
$text['description-node_description']['es-mx'] = " Introduzca la descripción."; //copied from es-cl
$text['description-node_description']['fr-ca'] = "Entrez la description."; //copied from fr-fr
$text['description-node_description']['el-gr'] = "Εισαγάγετε την περιγραφή.";
$text['description-node_description']['es-cl'] = "Introduzca la descripción.";
$text['description-node_description']['es-mx'] = "Introduzca la descripción.";
$text['description-node_description']['fr-ca'] = "Entrez la description.";
$text['description-node_description']['fr-fr'] = "Entrez la description.";
$text['description-node_description']['he-il'] = " הזן את התיאור.";
$text['description-node_description']['it-it'] = "Inserisci la descrizione.";
$text['description-node_description']['ka-ge'] = "შეიყვანეთ აღწერა";
$text['description-node_description']['nl-nl'] = "Voer de beschrijving in.";
$text['description-node_description']['pl-pl'] = " Wprowadź opis.";
$text['description-node_description']['pl-pl'] = "Wprowadź opis.";
$text['description-node_description']['pt-br'] = "Digite a descrição.";
$text['description-node_description']['pt-pt'] = " Digite a descrição.";
$text['description-node_description']['pt-pt'] = "Digite a descrição.";
$text['description-node_description']['ro-ro'] = "Introduceți descrierea.";
$text['description-node_description']['ru-ru'] = "Введите описание.";
$text['description-node_description']['sv-se'] = "Ange beskrivningen.";
$text['description-node_description']['uk-ua'] = "Введіть опис.";
$text['description-node_description']['tr-tr'] = "ıklamayı girin.";
$text['description-node_description']['zh-cn'] = "输入说明。";
$text['description-node_description']['ja-jp'] = "説明を入力します。";
$text['description-node_description']['ko-kr'] = "설명을 입력합니다.";
$text['description-node_cidr']['en-us'] = "Enter the IP CIDR range.";
$text['description-node_cidr']['en-gb'] = "Enter the IP CIDR range.";
$text['description-node_cidr']['ar-eg'] = "أدخل نطاق IP CIDR.";
$text['description-node_cidr']['de-at'] = " Geben Sie die IP CIDR-Bereich an."; //copied from de-de
$text['description-node_cidr']['de-ch'] = " Geben Sie die IP CIDR-Bereich an."; //copied from de-de
$text['description-node_cidr']['de-de'] = " Geben Sie die IP CIDR-Bereich an.";
$text['description-node_cidr']['es-cl'] = " Introduzca el rango de direcciones IP CIDR.";
$text['description-node_cidr']['es-mx'] = " Introduzca el rango de direcciones IP CIDR."; //copied from es-cl
$text['description-node_cidr']['fr-ca'] = "Entrez la plage IP CIDR."; //copied from fr-fr
$text['description-node_cidr']['de-at'] = "Geben Sie die IP CIDR-Bereich an.";
$text['description-node_cidr']['de-ch'] = "Geben Sie die IP CIDR-Bereich an.";
$text['description-node_cidr']['de-de'] = "Geben Sie die IP CIDR-Bereich an.";
$text['description-node_cidr']['el-gr'] = "Εισαγάγετε το εύρος IP CIDR.";
$text['description-node_cidr']['es-cl'] = "Introduzca el rango de direcciones IP CIDR.";
$text['description-node_cidr']['es-mx'] = "Introduzca el rango de direcciones IP CIDR.";
$text['description-node_cidr']['fr-ca'] = "Entrez la plage IP CIDR.";
$text['description-node_cidr']['fr-fr'] = "Entrez la plage IP CIDR.";
$text['description-node_cidr']['he-il'] = " הזן את טווח ה- IP CIDR.";
$text['description-node_cidr']['it-it'] = "Inserisci il range IP CIDR.";
$text['description-node_cidr']['ka-ge'] = "შეიყვანეთ IP CIDR შუალედი(Range)";
$text['description-node_cidr']['nl-nl'] = "Voer het IP CIDR reeks in.";
$text['description-node_cidr']['pl-pl'] = "Wprowadź zakres IP CIDR.";
$text['description-node_cidr']['pt-br'] = "Digite o intervalo IP CIDR."; //copied from pt-pt
$text['description-node_cidr']['pt-br'] = "Digite o intervalo IP CIDR.";
$text['description-node_cidr']['pt-pt'] = "Digite o intervalo IP CIDR.";
$text['description-node_cidr']['ro-ro'] = "Introduceți intervalul de IP CIDR.";
$text['description-node_cidr']['ru-ru'] = "Введите диапазон IP CIDR.";
$text['description-node_cidr']['sv-se'] = "Ange IP CIDR sortimentet.";
$text['description-node_cidr']['uk-ua'] = "Введіть діапазон IP-CIDR.";
$text['description-node_cidr']['tr-tr'] = "IP CIDR aralığını girin.";
$text['description-node_cidr']['zh-cn'] = "输入 IP CIDR 范围。";
$text['description-node_cidr']['ja-jp'] = "IP CIDR 範囲を入力します。";
$text['description-node_cidr']['ko-kr'] = "IP CIDR 범위를 입력합니다.";
$text['description-access_control_name']['en-us'] = "Enter the name.";
$text['description-access_control_name']['en-gb'] = "Enter the name.";
$text['description-access_control_name']['ar-eg'] = "أدخل اسم.";
$text['description-access_control_name']['de-at'] = "Namen eingeben."; //copied from de-de
$text['description-access_control_name']['de-ch'] = "Namen eingeben."; //copied from de-de
$text['description-access_control_name']['de-at'] = "Namen eingeben.";
$text['description-access_control_name']['de-ch'] = "Namen eingeben.";
$text['description-access_control_name']['de-de'] = "Namen eingeben.";
$text['description-access_control_name']['es-cl'] = " Introduzca el nombre.";
$text['description-access_control_name']['es-mx'] = " Introduzca el nombre."; //copied from es-cl
$text['description-access_control_name']['fr-ca'] = "Entrez le nom."; //copied from fr-fr
$text['description-access_control_name']['el-gr'] = "Εισαγάγετε το όνομα.";
$text['description-access_control_name']['es-cl'] = "Introduzca el nombre.";
$text['description-access_control_name']['es-mx'] = "Introduzca el nombre.";
$text['description-access_control_name']['fr-ca'] = "Entrez le nom.";
$text['description-access_control_name']['fr-fr'] = "Entrez le nom.";
$text['description-access_control_name']['he-il'] = " הזן את השם.";
$text['description-access_control_name']['it-it'] = "Inserisci il nome.";
$text['description-access_control_name']['ka-ge'] = "შეიყვანეთ სახელი.";
$text['description-access_control_name']['nl-nl'] = "Voer de naam in.";
$text['description-access_control_name']['pl-pl'] = " Wpisz nazwę.";
$text['description-access_control_name']['pt-br'] = "Digite o nome."; //copied from pt-pt
$text['description-access_control_name']['pl-pl'] = "Wpisz nazwę.";
$text['description-access_control_name']['pt-br'] = "Digite o nome.";
$text['description-access_control_name']['pt-pt'] = "Digite o nome.";
$text['description-access_control_name']['ro-ro'] = "Introduceți numele.";
$text['description-access_control_name']['ru-ru'] = "Введите имя.";
$text['description-access_control_name']['sv-se'] = "Ange namnet.";
$text['description-access_control_name']['uk-ua'] = "Введіть ім'я.";
$text['description-access_control_name']['tr-tr'] = "Adı girin.";
$text['description-access_control_name']['zh-cn'] = "输入名称。";
$text['description-access_control_name']['ja-jp'] = "名前を入力します。";
$text['description-access_control_name']['ko-kr'] = "이름을 입력하세요.";
$text['description-access_control_description']['en-us'] = "Enter the description";
$text['description-access_control_description']['en-gb'] = "Enter the description";
$text['description-access_control_description']['ar-eg'] = "دخل وصف";
$text['description-access_control_description']['de-at'] = "Beschreibung eingeben."; //copied from de-de
$text['description-access_control_description']['de-ch'] = "Beschreibung eingeben."; //copied from de-de
$text['description-access_control_description']['de-at'] = "Beschreibung eingeben.";
$text['description-access_control_description']['de-ch'] = "Beschreibung eingeben.";
$text['description-access_control_description']['de-de'] = "Beschreibung eingeben.";
$text['description-access_control_description']['el-gr'] = "Εισαγάγετε την περιγραφή";
$text['description-access_control_description']['es-cl'] = "Introduzca la descripción";
$text['description-access_control_description']['es-mx'] = "Introduzca la descripción"; //copied from es-cl
$text['description-access_control_description']['fr-ca'] = "Entrez la description."; //copied from fr-fr
$text['description-access_control_description']['es-mx'] = "Introduzca la descripción";
$text['description-access_control_description']['fr-ca'] = "Entrez la description.";
$text['description-access_control_description']['fr-fr'] = "Entrez la description.";
$text['description-access_control_description']['he-il'] = " הזן את התיאור";
$text['description-access_control_description']['it-it'] = "Inserisci la descrizione";
$text['description-access_control_description']['ka-ge'] = "შეიყვანეთ აღწერა";
$text['description-access_control_description']['nl-nl'] = "Voer de omschrijving in.";
$text['description-access_control_description']['pl-pl'] = "Wprowadź opis";
$text['description-access_control_description']['pt-br'] = "Digite a descrição.";
@ -441,26 +616,63 @@ $text['description-access_control_description']['ro-ro'] = "Introduceți descrie
$text['description-access_control_description']['ru-ru'] = "Введите описание";
$text['description-access_control_description']['sv-se'] = "Ange en beskrivning";
$text['description-access_control_description']['uk-ua'] = "Введіть опис";
$text['description-access_control_description']['tr-tr'] = "ıklamayı girin";
$text['description-access_control_description']['zh-cn'] = "输入描述";
$text['description-access_control_description']['ja-jp'] = "説明を入力してください";
$text['description-access_control_description']['ko-kr'] = "설명을 입력하세요";
$text['description-access_control_default']['en-us'] = "Select the default type.";
$text['description-access_control_default']['en-gb'] = "Select the default type.";
$text['description-access_control_default']['ar-eg'] = "حدد نوع الافتراضي.";
$text['description-access_control_default']['de-at'] = " Wählen Sie den Standardtyp."; //copied from de-de
$text['description-access_control_default']['de-ch'] = " Wählen Sie den Standardtyp."; //copied from de-de
$text['description-access_control_default']['de-de'] = " Wählen Sie den Standardtyp.";
$text['description-access_control_default']['de-at'] = "Wählen Sie den Standardtyp.";
$text['description-access_control_default']['de-ch'] = "Wählen Sie den Standardtyp.";
$text['description-access_control_default']['de-de'] = "Wählen Sie den Standardtyp.";
$text['description-access_control_default']['el-gr'] = "Επιλέξτε τον προεπιλεγμένο τύπο.";
$text['description-access_control_default']['es-cl'] = "Seleccione el tipo de defecto.";
$text['description-access_control_default']['es-mx'] = "Seleccione el tipo de defecto."; //copied from es-cl
$text['description-access_control_default']['fr-ca'] = "Sélectionnez le type de défaut"; //copied from fr-fr
$text['description-access_control_default']['es-mx'] = "Seleccione el tipo de defecto.";
$text['description-access_control_default']['fr-ca'] = "Sélectionnez le type de défaut";
$text['description-access_control_default']['fr-fr'] = "Sélectionnez le type de défaut";
$text['description-access_control_default']['he-il'] = " בחר את סוג ברירת המחדל.";
$text['description-access_control_default']['it-it'] = "Scegli il tipo di default.";
$text['description-access_control_default']['ka-ge'] = "აირჩიეთ ნაგულისხმევი ტიპი.";
$text['description-access_control_default']['nl-nl'] = "Selecteer het standaard type.";
$text['description-access_control_default']['pl-pl'] = "Wybierz typ domyślny.";
$text['description-access_control_default']['pt-br'] = "Selecione o tipo de padrão."; //copied from pt-pt
$text['description-access_control_default']['pt-br'] = "Selecione o tipo de padrão.";
$text['description-access_control_default']['pt-pt'] = "Selecione o tipo de padrão.";
$text['description-access_control_default']['ro-ro'] = "Selectați tipul implicit.";
$text['description-access_control_default']['ru-ru'] = "Выберите тип по умолчанию.";
$text['description-access_control_default']['sv-se'] = "Välj standardtypen.";
$text['description-access_control_default']['uk-ua'] = "Вибір типу за замовчуванням.";
$text['description-access_control_default']['tr-tr'] = "Varsayılan türü seçin.";
$text['description-access_control_default']['zh-cn'] = "选择默认类型。";
$text['description-access_control_default']['ja-jp'] = "デフォルトのタイプを選択します。";
$text['description-access_control_default']['ko-kr'] = "기본 유형을 선택합니다.";
$text['description-access_control_export']['en-us'] = "Select the fields you wish to include in the export.";
$text['description-access_control_export']['en-gb'] = "Select the fields you wish to include in the export.";
$text['description-access_control_export']['ar-eg'] = "حدد الحقول التي ترغب في تضمينها في التصدير.";
$text['description-access_control_export']['de-at'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['de-ch'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['de-de'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['ek-gr'] = "Επιλέξτε τα πεδία που θέλετε να συμπεριλάβετε στην εξαγωγή.";
$text['description-access_control_export']['es-cl'] = "Seleccione los campos que desea incluir en la exportación.";
$text['description-access_control_export']['es-mx'] = "Seleccione los campos que desea incluir en la exportación.";
$text['description-access_control_export']['fr-ca'] = "Sélectionnez les champs que vous souhaitez inclure dans l'exportation.";
$text['description-access_control_export']['fr-fr'] = "Sélectionnez les champs que vous souhaitez inclure dans l'exportation.";
$text['description-access_control_export']['he-il'] = "בחר את השדות שברצונך לכלול בייצוא.";
$text['description-access_control_export']['it-it'] = "Seleziona i campi che desideri includere nell'esportazione.";
$text['description-access_control_export']['ka-ge'] = "აირჩიეთ ექსპორტში ჩასასმელი ველები.";
$text['description-access_control_export']['nl-nl'] = "Selecteer de velden die u in de export wilt opnemen.";
$text['description-access_control_export']['pl-pl'] = "Wybierz pola, które chcesz uwzględnić w eksporcie.";
$text['description-access_control_export']['pt-br'] = "Selecione os campos que deseja incluir na exportação.";
$text['description-access_control_export']['pt-pt'] = "Selecione os campos que deseja incluir na exportação.";
$text['description-access_control_export']['ro-ro'] = "Selectați câmpurile pe care doriți să le includeți în export.";
$text['description-access_control_export']['ru-ru'] = "Выберите поля, которые вы хотите включить в экспорт.";
$text['description-access_control_export']['sv-se'] = "Välj de fält du vill inkludera i exporten.";
$text['description-access_control_export']['uk-ua'] = "Виберіть поля, які потрібно включити в експорт.";
$text['description-access_control_export']['tr-tr'] = "Dışa aktarmaya dahil etmek istediğiniz alanları seçin.";
$text['description-access_control_export']['zh-cn'] = "选择您希望包含在导出中的字段。";
$text['description-access_control_export']['ja-jp'] = "エクスポートに含めるフィールドを選択します。";
$text['description-access_control_export']['ko-kr'] = "내보내기에 포함할 필드를 선택합니다.";
?>

View File

@ -4,15 +4,16 @@
$apps[$x]['menu'][$y]['title']['en-us'] = "Access Controls";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Access Controls";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "عناصر التحكم في الوصول";
$apps[$x]['menu'][$y]['title']['de-at'] = " Zugriffskontrolle";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-de'] = " Zugriffskontrolle";
$apps[$x]['menu'][$y]['title']['de-at'] = "Zugriffskontrolle";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Zugriffskontrollen";
$apps[$x]['menu'][$y]['title']['de-de'] = "Zugriffskontrolle";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Controles de acceso";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Controles de acceso";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Contrôles d'accès";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Contrôles d'accès";
$apps[$x]['menu'][$y]['title']['he-il'] = "בקרת גישה";
$apps[$x]['menu'][$y]['title']['it-it'] = "Controlli Accesso";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "წვდომების კონტროლი";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Toegangs Controle";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Kontrola dostępu";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Controles de Acesso";
@ -21,10 +22,16 @@
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Контроль доступа";
$apps[$x]['menu'][$y]['title']['uk-ua'] = "контроль доступу";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Åtkomstkontroll";
$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'] = "bd47c972-5498-4541-b44a-d4bbfac69496";
$apps[$x]['menu'][$y]['parent_uuid'] = "594d99c5-6128-9c88-ca35-4b33392cec0f";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/access_controls/access_controls.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

View File

@ -2,10 +2,7 @@
/**
* access controls class
*
* @method null download
*/
if (!class_exists('access_controls')) {
class access_controls {
/**
@ -24,20 +21,9 @@ if (!class_exists('access_controls')) {
public function __construct() {
//assign private variables
$this->app_name = 'access_controls';
$this->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$this->list_page = 'access_controls.php';
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
$this->app_name = 'access_controls';
$this->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$this->list_page = 'access_controls.php';
}
/**
@ -46,126 +32,120 @@ if (!class_exists('access_controls')) {
public function delete($records) {
//assign private variables
$this->permission_prefix = 'access_control_';
$this->table = 'access_controls';
$this->uuid_prefix = 'access_control_';
$this->permission_prefix = 'access_control_';
$this->table = 'access_controls';
$this->uuid_prefix = 'access_control_';
if (permission_exists($this->permission_prefix.'delete')) {
if (permission_exists($this->permission_prefix . 'delete')) {
//add multi-lingual support
$language = new text;
$text = $language->get();
$language = new text;
$text = $language->get();
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: '.$this->list_page);
exit;
}
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'], 'negative');
header('Location: ' . $this->list_page);
exit;
}
//delete multiple records
if (is_array($records) && @sizeof($records) != 0) {
if (is_array($records) && @sizeof($records) != 0) {
//build the delete array
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
$array['access_control_nodes'][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
}
}
//delete the checked rows
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p->add('access_control_node_delete', 'temp');
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
unset($array);
//revoke temporary permissions
$p->delete('access_control_node_delete', 'temp');
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
event_socket_request($fp, "api reloadacl");
}
//set message
message::add($text['message-delete']);
}
unset($records);
//build the delete array
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix . 'uuid'] = $record['uuid'];
$array['access_control_nodes'][$x][$this->uuid_prefix . 'uuid'] = $record['uuid'];
}
}
//delete the checked rows
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = permissions::new();
$p->add('access_control_node_delete', 'temp');
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
unset($array);
//revoke temporary permissions
$p->delete('access_control_node_delete', 'temp');
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
event_socket::async("reloadacl");
//set message
message::add($text['message-delete']);
}
unset($records);
}
}
}
public function delete_nodes($records) {
//assign private variables
$this->permission_prefix = 'access_control_node_';
$this->table = 'access_control_nodes';
$this->uuid_prefix = 'access_control_node_';
$this->permission_prefix = 'access_control_node_';
$this->table = 'access_control_nodes';
$this->uuid_prefix = 'access_control_node_';
if (permission_exists($this->permission_prefix.'delete')) {
if (permission_exists($this->permission_prefix . 'delete')) {
//add multi-lingual support
$language = new text;
$text = $language->get();
$language = new text;
$text = $language->get();
//validate the token
$token = new token;
if (!$token->validate('/app/access_controls/access_control_nodes.php')) {
message::add($text['message-invalid_token'],'negative');
header('Location: '.$this->list_page);
exit;
}
$token = new token;
if (!$token->validate('/app/access_controls/access_control_nodes.php')) {
message::add($text['message-invalid_token'], 'negative');
header('Location: ' . $this->list_page);
exit;
}
//delete multiple records
if (is_array($records) && @sizeof($records) != 0) {
if (is_array($records) && @sizeof($records) != 0) {
//build the delete array
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
}
}
//delete the checked rows
if (is_array($array) && @sizeof($array) != 0) {
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
unset($array);
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
event_socket_request($fp, "api reloadacl");
}
//set message
message::add($text['message-delete']);
}
unset($records);
//build the delete array
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix . 'uuid'] = $record['uuid'];
}
}
//delete the checked rows
if (is_array($array) && @sizeof($array) != 0) {
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
unset($array);
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
event_socket::async("reloadacl");
//set message
message::add($text['message-delete']);
}
unset($records);
}
}
}
@ -175,118 +155,108 @@ if (!class_exists('access_controls')) {
public function copy($records) {
//assign private variables
$this->permission_prefix = 'access_control_';
$this->table = 'access_controls';
$this->uuid_prefix = 'access_control_';
$this->permission_prefix = 'access_control_';
$this->table = 'access_controls';
$this->uuid_prefix = 'access_control_';
if (permission_exists($this->permission_prefix.'add')) {
if (permission_exists($this->permission_prefix . 'add')) {
//add multi-lingual support
$language = new text;
$text = $language->get();
$language = new text;
$text = $language->get();
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: '.$this->list_page);
exit;
}
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'], 'negative');
header('Location: ' . $this->list_page);
exit;
}
//copy the checked records
if (is_array($records) && @sizeof($records) != 0) {
if (is_array($records) && @sizeof($records) != 0) {
//get checked records
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
//create insert array from existing data
if (is_array($uuids) && @sizeof($uuids) != 0) {
//primary table
$sql = "select * from v_".$this->table." ";
$sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
$y = 0;
foreach ($rows as $x => $row) {
$primary_uuid = uuid();
//copy data
$array[$this->table][$x] = $row;
//overwrite
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $primary_uuid;
$array[$this->table][$x]['access_control_description'] = trim($row['access_control_description'].' ('.$text['label-copy'].')');
//nodes sub table
$sql_2 = "select * from v_access_control_nodes where access_control_uuid = :access_control_uuid";
$parameters_2['access_control_uuid'] = $row['access_control_uuid'];
$database = new database;
$rows_2 = $database->select($sql_2, $parameters_2, 'all');
if (is_array($rows_2) && @sizeof($rows_2) != 0) {
foreach ($rows_2 as $row_2) {
//copy data
$array['access_control_nodes'][$y] = $row_2;
//overwrite
$array['access_control_nodes'][$y]['access_control_node_uuid'] = uuid();
$array['access_control_nodes'][$y]['access_control_uuid'] = $primary_uuid;
//increment
$y++;
}
}
unset($sql_2, $parameters_2, $rows_2, $row_2);
}
}
unset($sql, $parameters, $rows, $row);
}
//save the changes and set the message
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p->add('access_control_node_add', 'temp');
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('access_control_node_add', 'temp');
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
event_socket_request($fp, "api reloadacl");
}
//set message
message::add($text['message-copy']);
}
unset($records);
//get checked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'" . $record['uuid'] . "'";
}
}
//create insert array from existing data
if (is_array($uuids) && @sizeof($uuids) != 0) {
//primary table
$sql = "select * from v_" . $this->table . " ";
$sql .= "where " . $this->uuid_prefix . "uuid in (" . implode(', ', $uuids) . ") ";
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
$y = 0;
foreach ($rows as $x => $row) {
$primary_uuid = uuid();
//copy data
$array[$this->table][$x] = $row;
//overwrite
$array[$this->table][$x][$this->uuid_prefix . 'uuid'] = $primary_uuid;
$array[$this->table][$x]['access_control_description'] = trim($row['access_control_description'] . ' (' . $text['label-copy'] . ')');
//nodes sub table
$sql_2 = "select * from v_access_control_nodes where access_control_uuid = :access_control_uuid";
$parameters_2['access_control_uuid'] = $row['access_control_uuid'];
$database = new database;
$rows_2 = $database->select($sql_2, $parameters_2, 'all');
if (is_array($rows_2) && @sizeof($rows_2) != 0) {
foreach ($rows_2 as $row_2) {
//copy data
$array['access_control_nodes'][$y] = $row_2;
//overwrite
$array['access_control_nodes'][$y]['access_control_node_uuid'] = uuid();
$array['access_control_nodes'][$y]['access_control_uuid'] = $primary_uuid;
//increment
$y++;
}
}
unset($sql_2, $parameters_2, $rows_2, $row_2);
}
}
unset($sql, $parameters, $rows, $row);
}
//save the changes and set the message
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = permissions::new();
$p->add('access_control_node_add', 'temp');
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('access_control_node_add', 'temp');
//clear the cache
$cache = new cache;
$cache->delete("configuration:acl.conf");
//create the event socket connection
event_socket::async("reloadacl");
//set message
message::add($text['message-copy']);
}
unset($records);
}
}
}
}
}
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

204
app/avaya/app_config.php Normal file
View File

@ -0,0 +1,204 @@
<?php
//application details
$apps[$x]['name'] = "Avaya";
$apps[$x]['uuid'] = "194d9272-2fd9-4b42-8992-63915d18f8eb";
$apps[$x]['category'] = "Vendor";
$apps[$x]['subcategory'] = "";
$apps[$x]['version'] = "1.0";
$apps[$x]['license'] = "";
$apps[$x]['url'] = "http://www.fusionpbx.com";
$apps[$x]['description']['en-us'] = "";
$apps[$x]['description']['en-gb'] = "";
$apps[$x]['description']['ar-eg'] = "";
$apps[$x]['description']['de-at'] = "";
$apps[$x]['description']['de-ch'] = "";
$apps[$x]['description']['de-de'] = "";
$apps[$x]['description']['es-cl'] = "";
$apps[$x]['description']['es-mx'] = "";
$apps[$x]['description']['fr-ca'] = "";
$apps[$x]['description']['fr-fr'] = "";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "";
$apps[$x]['description']['nl-nl'] = "";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "";
$apps[$x]['description']['pt-pt'] = "";
$apps[$x]['description']['ro-ro'] = "";
$apps[$x]['description']['ru-ru'] = "";
$apps[$x]['description']['sv-se'] = "";
$apps[$x]['description']['uk-ua'] = "";
//default settings
$y=0;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "c58b1c0f-b0c9-42a2-a971-4da25fa9fafa";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j139_firmware_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Firmware filename URL for J139 Phone";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "98c04df8-35c8-4465-a52b-f1b7cdf08c30";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j179_firmware_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Firmware filename URL for J179 Phone";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "d2e19a7d-d3b3-4b49-b267-938f66845bdf";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j169_firmware_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Firmware filename URL for J169 Phone";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "053f9829-1f4d-4292-a308-e447dc4483b9";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_jem24_firmware_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Firmware filename URL for JEM 24 Expansion Module";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "bbc7f7c7-d8a9-4f13-bf1d-a16ee0855c36";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_dialplan";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "XXX|XXXX,*XX,1XXXXXXXXXX,XXXXXXXXXX";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "|:Pattern separator, X: any single digit, []: used to specify one digit with valid digits inside the brackets. a - dash may be used for ranges.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "ab3fc35c-fb8b-4dd0-ba0d-b0883cd31c45";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_time_zone";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "-5:00";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Timezone offset";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "0c3b36b2-a638-4d8e-8619-8fde234e6349";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_dst_start";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "2SunMar2L";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Example, 2SunMar2L which corresponds to the second Sunday in March at 2 AM local time";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "09922e2a-6d3f-4833-8a50-40b1942a7bb0";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_dst_stop";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "1SunNov2L";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Example, 1SunNov2L which corresponds to the first Sunday in November at 2 AM local time";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "cd9143fb-54f7-4bf7-acea-d7ea775c9876";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_key_customization";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "0";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Setting to allow or disallow users to change the buttons on the phone. 0 - Blocked, 1 - Limited (User customization is allowed for Applications and Contacts), 2 - Full";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b67d14cb-5d1f-46bf-baa5-2500a9135b5d";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j189_wallpaper_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "800 x 480 pixels max. JPG only. Max file size is 256KB";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "554de3b3-444a-4221-9d15-524be3ef71a8";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j189_wallpaper_filename";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The filename of the default wallpaper to be displayed";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "90222f45-3996-4b74-89bc-68f12ad78afe";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j189_secondary_wallpaper_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "240 x 320 pixels max. JPG only. Max file size is 256KB";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "1b08fd61-246f-4053-a053-568e7128e3e1";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j189_secondary_wallpaper_filename";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The filename of the default wallpaper to be displayed";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "75d92d17-6096-47ec-89f6-bbf17479fb85";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j179_wallpaper_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "320 x 240 pixels max. JPG only. Max file size is 256KB";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "7b45e899-53ac-41b5-94c6-b485a41f66ff";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j179_wallpaper_filename";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The filename of the default wallpaper to be displayed";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "4244f3b6-78cd-46a2-bdbd-e0d8452c4de3";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j139_wallpaper_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "320 x 240 pixels max. JPG only. Max file size is 256KB";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "234e2429-11dc-4a62-be81-79737085284c";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j139_wallpaper_filename";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The filename of the default wallpaper to be displayed";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "30cbfda7-f068-463f-80a4-aeecf8c48eaf";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j169_wallpaper_url";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "320 x 240 pixels max. JPG only. Max file size is 256KB";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "7e29deec-d19a-4ff2-ab5b-513fa824e4ed";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_j169_wallpaper_filename";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The filename of the default wallpaper to be displayed";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "a53f2369-19fb-449d-8daa-189707b79cc6";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_ntp_server";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "4f4641c3-7398-421e-a0b3-5d7960813728";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_blf_subscription_expiry";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "60";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The expiry that Avaya phones will populate in their SUBSCRIBE messages. This should be set to equal or less than the nonce-ttl value that is set in your SIP profile.";
$y++;
?>

View File

@ -0,0 +1 @@
For Provisioning to work propery you will need to be on firmware 4.1.4.0.5 and greater

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "ოპერატორის პანელი სტატუსს აჩვენებს.";
$apps[$x]['description']['nl-nl'] = "Bedieningspaneel laat de status zien";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "";
@ -72,9 +73,17 @@
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "group_extensions";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "boolean";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set if extensions are grouped by call_group when viewing all extensions.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "0d3b16b0-5cd6-4d0e-8b58-967972362ef8";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "operator_panel";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "show_unregistered";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "boolean";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set whether unregistered extensions are displayed or not.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "a9ccd174-5ae1-4f90-8ee2-b79a183a04f8";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "operator_panel_main_background_color";

View File

@ -1,424 +1,570 @@
<?php
#This file was last reorganized on 19th of September 2017 08:54:24 AM UTC
$text['title-operator_panel']['en-us'] = "Operator Panel";
$text['title-operator_panel']['en-gb'] = "Operator Panel";
$text['title-operator_panel']['ar-eg'] = "";
$text['title-operator_panel']['de-at'] = "Bedienfeld"; //copied from de-de
$text['title-operator_panel']['de-ch'] = "Bedienfeld"; //copied from de-de
$text['title-operator_panel']['ar-eg'] = "لوحة المشغل";
$text['title-operator_panel']['de-at'] = "Bedienfeld";
$text['title-operator_panel']['de-ch'] = "Bedienfeld";
$text['title-operator_panel']['de-de'] = "Bedienfeld";
$text['title-operator_panel']['el-gr'] = "Πίνακας χειριστή";
$text['title-operator_panel']['es-cl'] = "Panel de Operador";
$text['title-operator_panel']['es-mx'] = "Panel de Operador"; //copied from es-cl
$text['title-operator_panel']['fr-ca'] = "Operator Panel"; //copied from fr-fr
$text['title-operator_panel']['fr-fr'] = "Operator Panel";
$text['title-operator_panel']['es-mx'] = "Panel de Operador";
$text['title-operator_panel']['fr-ca'] = "Panneau de commande";
$text['title-operator_panel']['fr-fr'] = "Panneau de commande";
$text['title-operator_panel']['he-il'] = "לוח מפעיל";
$text['title-operator_panel']['it-it'] = "Pannello Operatore";
$text['title-operator_panel']['ka-ge'] = "ოპერატორის პანელი";
$text['title-operator_panel']['nl-nl'] = "Operator paneel";
$text['title-operator_panel']['pl-pl'] = "Panel operatora";
$text['title-operator_panel']['pt-br'] = "Painel do operador";
$text['title-operator_panel']['pt-pt'] = "Painel do Operador";
$text['title-operator_panel']['ro-ro'] = "";
$text['title-operator_panel']['ro-ro'] = "Panoul operator";
$text['title-operator_panel']['ru-ru'] = "Панель Оператора";
$text['title-operator_panel']['sv-se'] = "Telefonist Panel";
$text['title-operator_panel']['uk-ua'] = "Панель оператора";
$text['title-operator_panel']['uk-ua'] = "Оператори";
$text['title-operator_panel']['tr-tr'] = "Operatör Paneli";
$text['title-operator_panel']['zh-cn'] = "操作面板";
$text['title-operator_panel']['ja-jp'] = "オペレーターパネル";
$text['title-operator_panel']['ko-kr'] = "운영자 패널";
$text['label-status_on_demand']['en-us'] = "On Demand";
$text['label-status_on_demand']['en-gb'] = "On Demand";
$text['label-status_on_demand']['ar-eg'] = "";
$text['label-status_on_demand']['de-at'] = "Bei Bedarf"; //copied from de-de
$text['label-status_on_demand']['de-ch'] = "Bei Bedarf"; //copied from de-de
$text['label-status_on_demand']['ar-eg'] = "على الطلب";
$text['label-status_on_demand']['de-at'] = "Bei Bedarf";
$text['label-status_on_demand']['de-ch'] = "Bei Bedarf";
$text['label-status_on_demand']['de-de'] = "Bei Bedarf";
$text['label-status_on_demand']['el-gr'] = "Κατα παραγγελια";
$text['label-status_on_demand']['es-cl'] = "A Pedido";
$text['label-status_on_demand']['es-mx'] = "A Pedido"; //copied from es-cl
$text['label-status_on_demand']['fr-ca'] = "Sur Demande"; //copied from fr-fr
$text['label-status_on_demand']['es-mx'] = "A Pedido";
$text['label-status_on_demand']['fr-ca'] = "Sur Demande";
$text['label-status_on_demand']['fr-fr'] = "Sur Demande";
$text['label-status_on_demand']['he-il'] = "על פי דרישה";
$text['label-status_on_demand']['it-it'] = "Su Richiesta";
$text['label-status_on_demand']['ka-ge'] = "მოთხოვნით";
$text['label-status_on_demand']['nl-nl'] = "Op Aanvraag";
$text['label-status_on_demand']['pl-pl'] = "Na żądanie";
$text['label-status_on_demand']['pt-br'] = "A pedido";
$text['label-status_on_demand']['pt-pt'] = "A Pedido";
$text['label-status_on_demand']['ro-ro'] = "";
$text['label-status_on_demand']['ro-ro'] = "La cerere";
$text['label-status_on_demand']['ru-ru'] = "По требованию";
$text['label-status_on_demand']['sv-se'] = "På Begäran";
$text['label-status_on_demand']['uk-ua'] = "На вимогу";
$text['label-status_on_demand']['uk-ua'] = "На Демі";
$text['label-status_on_demand']['tr-tr'] = "Talep üzerine";
$text['label-status_on_demand']['zh-cn'] = "一经请求";
$text['label-status_on_demand']['ja-jp'] = "オンデマンド";
$text['label-status_on_demand']['ko-kr'] = "주문형";
$text['label-status_on_break']['en-us'] = "On Break";
$text['label-status_on_break']['en-gb'] = "On Break";
$text['label-status_on_break']['ar-eg'] = "";
$text['label-status_on_break']['de-at'] = "In Pause"; //copied from de-de
$text['label-status_on_break']['de-ch'] = "In Pause"; //copied from de-de
$text['label-status_on_break']['ar-eg'] = "في استراحة";
$text['label-status_on_break']['de-at'] = "In Pause";
$text['label-status_on_break']['de-ch'] = "In Pause";
$text['label-status_on_break']['de-de'] = "In Pause";
$text['label-status_on_break']['el-gr'] = "Σε διάλειμμα";
$text['label-status_on_break']['es-cl'] = "En Pausa";
$text['label-status_on_break']['es-mx'] = "En Pausa"; //copied from es-cl
$text['label-status_on_break']['fr-ca'] = "En Pause"; //copied from fr-fr
$text['label-status_on_break']['es-mx'] = "En Pausa";
$text['label-status_on_break']['fr-ca'] = "En Pause";
$text['label-status_on_break']['fr-fr'] = "En Pause";
$text['label-status_on_break']['he-il'] = "בהפסקה";
$text['label-status_on_break']['it-it'] = "In Pausa";
$text['label-status_on_break']['ka-ge'] = "შესვენებაზე";
$text['label-status_on_break']['nl-nl'] = "In de wacht";
$text['label-status_on_break']['pl-pl'] = "Na przerwie";
$text['label-status_on_break']['pt-br'] = "Em pausa";
$text['label-status_on_break']['pt-pt'] = "Em Pausa";
$text['label-status_on_break']['ro-ro'] = "";
$text['label-status_on_break']['ro-ro'] = "In pauza";
$text['label-status_on_break']['ru-ru'] = "Пауза";
$text['label-status_on_break']['sv-se'] = "På Rast";
$text['label-status_on_break']['uk-ua'] = "На перерві";
$text['label-status_on_break']['uk-ua'] = "Прорив";
$text['label-status_on_break']['tr-tr'] = "Molada";
$text['label-status_on_break']['zh-cn'] = "休息时";
$text['label-status_on_break']['ja-jp'] = "休んで";
$text['label-status_on_break']['ko-kr'] = "쉬는 중";
$text['label-status_logged_out_or_unknown']['en-us'] = "Logged Out / Unknown";
$text['label-status_logged_out_or_unknown']['en-gb'] = "Logged Out / Unknown";
$text['label-status_logged_out_or_unknown']['ar-eg'] = "";
$text['label-status_logged_out_or_unknown']['de-at'] = "Abgemeldet / Unbekannt"; //copied from de-de
$text['label-status_logged_out_or_unknown']['de-ch'] = "Abgemeldet / Unbekannt"; //copied from de-de
$text['label-status_logged_out_or_unknown']['ar-eg'] = "تم تسجيل الخروج / غير معروف";
$text['label-status_logged_out_or_unknown']['de-at'] = "Abgemeldet / Unbekannt";
$text['label-status_logged_out_or_unknown']['de-ch'] = "Abgemeldet / Unbekannt";
$text['label-status_logged_out_or_unknown']['de-de'] = "Abgemeldet / Unbekannt";
$text['label-status_logged_out_or_unknown']['el-gr'] = "Αποσυνδέθηκε / άγνωστο";
$text['label-status_logged_out_or_unknown']['es-cl'] = "Desconectado / Desconocido";
$text['label-status_logged_out_or_unknown']['es-mx'] = "Desconectado / Desconocido"; //copied from es-cl
$text['label-status_logged_out_or_unknown']['fr-ca'] = "Déconnexion / Unknown"; //copied from fr-fr
$text['label-status_logged_out_or_unknown']['es-mx'] = "Desconectado / Desconocido";
$text['label-status_logged_out_or_unknown']['fr-ca'] = "Déconnexion / Unknown";
$text['label-status_logged_out_or_unknown']['fr-fr'] = "Déconnexion / Unknown";
$text['label-status_logged_out_or_unknown']['he-il'] = "";
$text['label-status_logged_out_or_unknown']['he-il'] = "מנותק / לא ידוע";
$text['label-status_logged_out_or_unknown']['it-it'] = "Sloggato/Sconosciuto";
$text['label-status_logged_out_or_unknown']['ka-ge'] = "გასული / უცნობია";
$text['label-status_logged_out_or_unknown']['nl-nl'] = "Afgelogged / Onbekend";
$text['label-status_logged_out_or_unknown']['pl-pl'] = "Wylogowany / Nieznany";
$text['label-status_logged_out_or_unknown']['pt-br'] = "Desligar / Desconhecido";
$text['label-status_logged_out_or_unknown']['pt-pt'] = "Desligado / Unknown";
$text['label-status_logged_out_or_unknown']['ro-ro'] = "";
$text['label-status_logged_out_or_unknown']['ro-ro'] = "Deconectat/Necunoscut";
$text['label-status_logged_out_or_unknown']['ru-ru'] = "Вышел из системы / Неизвестен";
$text['label-status_logged_out_or_unknown']['sv-se'] = "Utloggad / Okänd";
$text['label-status_logged_out_or_unknown']['uk-ua'] = "Вийшов/невідомо";
$text['label-status_logged_out_or_unknown']['uk-ua'] = "Увійти / Невідомо";
$text['label-status_logged_out_or_unknown']['tr-tr'] = "Çıkış Yapıldı / Bilinmiyor";
$text['label-status_logged_out_or_unknown']['zh-cn'] = "注销/未知";
$text['label-status_logged_out_or_unknown']['ja-jp'] = "ログアウト/不明";
$text['label-status_logged_out_or_unknown']['ko-kr'] = "로그아웃됨/알 수 없음";
$text['label-status_logged_out']['en-us'] = "Logged Out";
$text['label-status_logged_out']['en-gb'] = "Logged Out";
$text['label-status_logged_out']['ar-eg'] = "";
$text['label-status_logged_out']['de-at'] = "Abgemeldet"; //copied from de-de
$text['label-status_logged_out']['de-ch'] = "Abgemeldet"; //copied from de-de
$text['label-status_logged_out']['ar-eg'] = "تسجيل الخروج";
$text['label-status_logged_out']['de-at'] = "Abgemeldet";
$text['label-status_logged_out']['de-ch'] = "Abgemeldet";
$text['label-status_logged_out']['de-de'] = "Abgemeldet";
$text['label-status_logged_out']['el-gr'] = "Αποσυνδέθηκα";
$text['label-status_logged_out']['es-cl'] = "Desconectado";
$text['label-status_logged_out']['es-mx'] = "Desconectado"; //copied from es-cl
$text['label-status_logged_out']['fr-ca'] = "Déconnexion"; //copied from fr-fr
$text['label-status_logged_out']['es-mx'] = "Desconectado";
$text['label-status_logged_out']['fr-ca'] = "Déconnexion";
$text['label-status_logged_out']['fr-fr'] = "Déconnexion";
$text['label-status_logged_out']['he-il'] = "";
$text['label-status_logged_out']['he-il'] = "התנתק";
$text['label-status_logged_out']['it-it'] = "Sloggato";
$text['label-status_logged_out']['ka-ge'] = "გასული";
$text['label-status_logged_out']['nl-nl'] = "Afgelogged";
$text['label-status_logged_out']['pl-pl'] = "Wylogowany";
$text['label-status_logged_out']['pt-br'] = "Desligado"; //copied from pt-pt
$text['label-status_logged_out']['pt-br'] = "Desligado";
$text['label-status_logged_out']['pt-pt'] = "Desligado";
$text['label-status_logged_out']['ro-ro'] = "";
$text['label-status_logged_out']['ro-ro'] = "Delogat";
$text['label-status_logged_out']['ru-ru'] = "Вышел из системы";
$text['label-status_logged_out']['sv-se'] = "Utloggad";
$text['label-status_logged_out']['uk-ua'] = "Вийшов";
$text['label-status_logged_out']['uk-ua'] = "Увійти";
$text['label-status_logged_out']['tr-tr'] = "Çıkış yapıldı";
$text['label-status_logged_out']['zh-cn'] = "登出";
$text['label-status_logged_out']['ja-jp'] = "ログアウトしました";
$text['label-status_logged_out']['ko-kr'] = "로그아웃됨";
$text['label-status_do_not_disturb']['en-us'] = "Do Not Disturb";
$text['label-status_do_not_disturb']['en-gb'] = "Do Not Disturb";
$text['label-status_do_not_disturb']['ar-eg'] = "";
$text['label-status_do_not_disturb']['de-at'] = "Bitte nicht Stören"; //copied from de-de
$text['label-status_do_not_disturb']['de-ch'] = "Bitte nicht Stören"; //copied from de-de
$text['label-status_do_not_disturb']['ar-eg'] = "لا تخل";
$text['label-status_do_not_disturb']['de-at'] = "Bitte nicht Stören";
$text['label-status_do_not_disturb']['de-ch'] = "Bitte nicht Stören";
$text['label-status_do_not_disturb']['de-de'] = "Bitte nicht Stören";
$text['label-status_do_not_disturb']['el-gr'] = "Μην ενοχλείτε";
$text['label-status_do_not_disturb']['es-cl'] = "No Molestar";
$text['label-status_do_not_disturb']['es-mx'] = "No Molestar"; //copied from es-cl
$text['label-status_do_not_disturb']['fr-ca'] = "Ne pas Déranger"; //copied from fr-fr
$text['label-status_do_not_disturb']['es-mx'] = "No Molestar";
$text['label-status_do_not_disturb']['fr-ca'] = "Ne pas Déranger";
$text['label-status_do_not_disturb']['fr-fr'] = "Ne pas Déranger";
$text['label-status_do_not_disturb']['he-il'] = "נא לא להפריע";
$text['label-status_do_not_disturb']['it-it'] = "Non Disturbare";
$text['label-status_do_not_disturb']['ka-ge'] = "არ შემაწუხო";
$text['label-status_do_not_disturb']['nl-nl'] = "Niet Storen";
$text['label-status_do_not_disturb']['pl-pl'] = "Nie przeszkadzać (DND)";
$text['label-status_do_not_disturb']['pt-br'] = "Não perturbe";
$text['label-status_do_not_disturb']['pt-pt'] = "Não perturbe (DND)";
$text['label-status_do_not_disturb']['ro-ro'] = "";
$text['label-status_do_not_disturb']['ro-ro'] = "Nu deranjați";
$text['label-status_do_not_disturb']['ru-ru'] = "Просьба не беспокоить";
$text['label-status_do_not_disturb']['sv-se'] = "Stör Ej";
$text['label-status_do_not_disturb']['uk-ua'] = "Не турбувати";
$text['label-status_do_not_disturb']['uk-ua'] = "Не турбувати";
$text['label-status_do_not_disturb']['tr-tr'] = "Rahatsız etmeyin";
$text['label-status_do_not_disturb']['zh-cn'] = "请勿打扰";
$text['label-status_do_not_disturb']['ja-jp'] = "邪魔しないでください";
$text['label-status_do_not_disturb']['ko-kr'] = "방해하지 마";
$text['label-status_available_on_demand']['en-us'] = "Available (On Demand)";
$text['label-status_available_on_demand']['en-gb'] = "Available (On Demand)";
$text['label-status_available_on_demand']['ar-eg'] = "";
$text['label-status_available_on_demand']['de-at'] = "Verfügbar (Bei Bedarf)"; //copied from de-de
$text['label-status_available_on_demand']['de-ch'] = "Verfügbar (Bei Bedarf)"; //copied from de-de
$text['label-status_available_on_demand']['ar-eg'] = "متاح (عند الطلب)";
$text['label-status_available_on_demand']['de-at'] = "Verfügbar (Bei Bedarf)";
$text['label-status_available_on_demand']['de-ch'] = "Verfügbar (Bei Bedarf)";
$text['label-status_available_on_demand']['de-de'] = "Verfügbar (Bei Bedarf)";
$text['label-status_available_on_demand']['el-gr'] = "Διαθέσιμο (κατόπιν αιτήματος)";
$text['label-status_available_on_demand']['es-cl'] = "Disponible (A Pedido)";
$text['label-status_available_on_demand']['es-mx'] = "Disponible (A Pedido)"; //copied from es-cl
$text['label-status_available_on_demand']['fr-ca'] = "Disponible (sur demande)"; //copied from fr-fr
$text['label-status_available_on_demand']['es-mx'] = "Disponible (A Pedido)";
$text['label-status_available_on_demand']['fr-ca'] = "Disponible (sur demande)";
$text['label-status_available_on_demand']['fr-fr'] = "Disponible (sur demande)";
$text['label-status_available_on_demand']['he-il'] = "";
$text['label-status_available_on_demand']['he-il'] = "זמין (לפי דרישה)";
$text['label-status_available_on_demand']['it-it'] = "Disponibile (Su Richiesta)";
$text['label-status_available_on_demand']['ka-ge'] = "ხელმისაწვდომია (მოთხოვნით)";
$text['label-status_available_on_demand']['nl-nl'] = "Beschikbaar (Op Aaanvraag)";
$text['label-status_available_on_demand']['pl-pl'] = "Dostępny (na żądanie)";
$text['label-status_available_on_demand']['pt-br'] = "Disponivel (A pedido)";
$text['label-status_available_on_demand']['pt-pt'] = "Disponível (A Pedido)";
$text['label-status_available_on_demand']['ro-ro'] = "";
$text['label-status_available_on_demand']['ro-ro'] = "Disponibil (la cerere)";
$text['label-status_available_on_demand']['ru-ru'] = "Доступен (по требованию)";
$text['label-status_available_on_demand']['sv-se'] = "Tillgänglig (På Begäran)";
$text['label-status_available_on_demand']['uk-ua'] = "Доступний (на вимогу)";
$text['label-status_available_on_demand']['uk-ua'] = "Доступний (на вимогу)";
$text['label-status_available_on_demand']['tr-tr'] = "Mevcut (Talep Üzerine)";
$text['label-status_available_on_demand']['zh-cn'] = "可用(按需)";
$text['label-status_available_on_demand']['ja-jp'] = "あり(オンデマンド)";
$text['label-status_available_on_demand']['ko-kr'] = "사용 가능(주문형)";
$text['label-status_available']['en-us'] = "Available";
$text['label-status_available']['en-gb'] = "Available";
$text['label-status_available']['ar-eg'] = "";
$text['label-status_available']['de-at'] = "Verfügbar"; //copied from de-de
$text['label-status_available']['de-ch'] = "Verfügbar"; //copied from de-de
$text['label-status_available']['ar-eg'] = "متاح";
$text['label-status_available']['de-at'] = "Verfügbar";
$text['label-status_available']['de-ch'] = "Verfügbar";
$text['label-status_available']['de-de'] = "Verfügbar";
$text['label-status_available']['el-gr'] = "Διαθέσιμος";
$text['label-status_available']['es-cl'] = "Disponible";
$text['label-status_available']['es-mx'] = "Disponible"; //copied from es-cl
$text['label-status_available']['fr-ca'] = "Disponible"; //copied from fr-fr
$text['label-status_available']['es-mx'] = "Disponible";
$text['label-status_available']['fr-ca'] = "Disponible";
$text['label-status_available']['fr-fr'] = "Disponible";
$text['label-status_available']['he-il'] = "זמין";
$text['label-status_available']['it-it'] = "Disponibile";
$text['label-status_available']['ka-ge'] = "ხელმისაწვდომია";
$text['label-status_available']['nl-nl'] = "Beschikbaar";
$text['label-status_available']['pl-pl'] = "Dostępny";
$text['label-status_available']['pt-br'] = "Disponível";
$text['label-status_available']['pt-br'] = "Disponível";
$text['label-status_available']['pt-pt'] = "Disponível";
$text['label-status_available']['ro-ro'] = "";
$text['label-status_available']['ro-ro'] = "Disponibil";
$text['label-status_available']['ru-ru'] = "Доступен";
$text['label-status_available']['sv-se'] = "Tillgänglig";
$text['label-status_available']['uk-ua'] = "Доступний";
$text['label-status_available']['uk-ua'] = "В наявності";
$text['label-status_available']['tr-tr'] = "Mevcut";
$text['label-status_available']['zh-cn'] = "可用的";
$text['label-status_available']['ja-jp'] = "利用可能";
$text['label-status_available']['ko-kr'] = "사용 가능";
$text['label-refresh_pause']['en-us'] = "Pause Refresh";
$text['label-refresh_pause']['en-gb'] = "Pause Refresh";
$text['label-refresh_pause']['ar-eg'] = "";
$text['label-refresh_pause']['de-at'] = "Seite neu laden deaktivieren"; //copied from de-de
$text['label-refresh_pause']['de-ch'] = "Seite neu laden deaktivieren"; //copied from de-de
$text['label-refresh_pause']['ar-eg'] = "وقفة التحديث";
$text['label-refresh_pause']['de-at'] = "Seite neu laden deaktivieren";
$text['label-refresh_pause']['de-ch'] = "Seite neu laden deaktivieren";
$text['label-refresh_pause']['de-de'] = "Seite neu laden deaktivieren";
$text['label-refresh_pause']['el-gr'] = "Ανανέωση";
$text['label-refresh_pause']['es-cl'] = "Actualizar Pausa";
$text['label-refresh_pause']['es-mx'] = "Actualizar Pausa"; //copied from es-cl
$text['label-refresh_pause']['fr-ca'] = "Pause Actualiser"; //copied from fr-fr
$text['label-refresh_pause']['es-mx'] = "Actualizar Pausa";
$text['label-refresh_pause']['fr-ca'] = "Pause Actualiser";
$text['label-refresh_pause']['fr-fr'] = "Pause Actualiser";
$text['label-refresh_pause']['he-il'] = "עצור רענון";
$text['label-refresh_pause']['it-it'] = "Interrompi";
$text['label-refresh_pause']['ka-ge'] = "განახლების შეჩერება";
$text['label-refresh_pause']['nl-nl'] = "Stop verversen";
$text['label-refresh_pause']['pl-pl'] = "Pauzuj odświeżanie";
$text['label-refresh_pause']['pt-br'] = "Pausar atualização";
$text['label-refresh_pause']['pt-pt'] = "Pausa Atualizar";
$text['label-refresh_pause']['ro-ro'] = "";
$text['label-refresh_pause']['ro-ro'] = "Întrerupeți reîmprospătarea";
$text['label-refresh_pause']['ru-ru'] = "Приостановить обновление";
$text['label-refresh_pause']['sv-se'] = "Paus Uppdatera";
$text['label-refresh_pause']['uk-ua'] = "Припинити оновлення";
$text['label-refresh_pause']['uk-ua'] = "Пауза Refresh";
$text['label-refresh_pause']['tr-tr'] = "Yenilemeyi Duraklat";
$text['label-refresh_pause']['zh-cn'] = "暂停刷新";
$text['label-refresh_pause']['ja-jp'] = "リフレッシュを一時停止";
$text['label-refresh_pause']['ko-kr'] = "새로고침 일시중지";
$text['label-refresh_enable']['en-us'] = "Enable Refresh";
$text['label-refresh_enable']['en-gb'] = "Enable Refresh";
$text['label-refresh_enable']['ar-eg'] = "";
$text['label-refresh_enable']['de-at'] = "Seite neu laden aktivieren"; //copied from de-de
$text['label-refresh_enable']['de-ch'] = "Seite neu laden aktivieren"; //copied from de-de
$text['label-refresh_enable']['ar-eg'] = "تمكين التحديث";
$text['label-refresh_enable']['de-at'] = "Seite neu laden aktivieren";
$text['label-refresh_enable']['de-ch'] = "Seite neu laden aktivieren";
$text['label-refresh_enable']['de-de'] = "Seite neu laden aktivieren";
$text['label-refresh_enable']['el-gr'] = "Ενεργοποίηση ανανέωσης";
$text['label-refresh_enable']['es-cl'] = "Activar Actualizar";
$text['label-refresh_enable']['es-mx'] = "Activar Actualizar"; //copied from es-cl
$text['label-refresh_enable']['fr-ca'] = "Activer Actualiser"; //copied from fr-fr
$text['label-refresh_enable']['es-mx'] = "Activar Actualizar";
$text['label-refresh_enable']['fr-ca'] = "Activer Actualiser";
$text['label-refresh_enable']['fr-fr'] = "Activer Actualiser";
$text['label-refresh_enable']['he-il'] = "אפשר רענון";
$text['label-refresh_enable']['it-it'] = "Abilita Aggiornamento";
$text['label-refresh_enable']['ka-ge'] = "განახლების ჩართვა";
$text['label-refresh_enable']['nl-nl'] = "Start verversen";
$text['label-refresh_enable']['pl-pl'] = "Włącz odświeżanie";
$text['label-refresh_enable']['pt-br'] = "Habilitar atualização";
$text['label-refresh_enable']['pt-pt'] = "Habilitar Atualização";
$text['label-refresh_enable']['ro-ro'] = "";
$text['label-refresh_enable']['ro-ro'] = "Activați Reîmprospătare";
$text['label-refresh_enable']['ru-ru'] = "Включить обновление";
$text['label-refresh_enable']['sv-se'] = "Aktivera Uppdatering";
$text['label-refresh_enable']['uk-ua'] = "Включити оновлення";
$text['label-refresh_enable']['uk-ua'] = "Увімкнути Refresh";
$text['label-refresh_enable']['tr-tr'] = "Yenilemeyi Etkinleştir";
$text['label-refresh_enable']['zh-cn'] = "启用刷新";
$text['label-refresh_enable']['ja-jp'] = "リフレッシュを有効にする";
$text['label-refresh_enable']['ko-kr'] = "새로 고침 활성화";
$text['label-recording']['en-us'] = "Recording";
$text['label-recording']['en-gb'] = "Recording";
$text['label-recording']['ar-eg'] = "";
$text['label-recording']['de-at'] = "Aufnahme"; //copied from de-de
$text['label-recording']['de-ch'] = "Aufnahme"; //copied from de-de
$text['label-recording']['ar-eg'] = "تسجيل";
$text['label-recording']['de-at'] = "Aufnahme";
$text['label-recording']['de-ch'] = "Aufnahme";
$text['label-recording']['de-de'] = "Aufnahme";
$text['label-recording']['el-gr'] = "Εγγραφή";
$text['label-recording']['es-cl'] = "Grabación de Llamadas";
$text['label-recording']['es-mx'] = "Grabación de Llamadas"; //copied from es-cl
$text['label-recording']['fr-ca'] = "Enregistrement de L'appel"; //copied from fr-fr
$text['label-recording']['es-mx'] = "Grabación de Llamadas";
$text['label-recording']['fr-ca'] = "Enregistrement de L'appel";
$text['label-recording']['fr-fr'] = "Enregistrement de L'appel";
$text['label-recording']['he-il'] = "מקליט";
$text['label-recording']['it-it'] = "Registrazione";
$text['label-recording']['ka-ge'] = "ჩაწერა";
$text['label-recording']['nl-nl'] = "Opnemend";
$text['label-recording']['pl-pl'] = "Nagrywanie";
$text['label-recording']['pt-br'] = "Gravação de chamadas";
$text['label-recording']['pt-pt'] = "Gravação de Chamadas";
$text['label-recording']['ro-ro'] = "";
$text['label-recording']['ro-ro'] = "Înregistrare";
$text['label-recording']['ru-ru'] = "Запись";
$text['label-recording']['sv-se'] = "Inspelning";
$text['label-recording']['uk-ua'] = "Запис";
$text['label-recording']['uk-ua'] = "Запис";
$text['label-recording']['tr-tr'] = "Kayıt";
$text['label-recording']['zh-cn'] = "记录";
$text['label-recording']['ja-jp'] = "録音";
$text['label-recording']['ko-kr'] = "녹음";
$text['label-record']['en-us'] = "Record";
$text['label-record']['en-gb'] = "Record";
$text['label-record']['ar-eg'] = "";
$text['label-record']['de-at'] = "Aufnehmen"; //copied from de-de
$text['label-record']['de-ch'] = "Aufnehmen"; //copied from de-de
$text['label-record']['ar-eg'] = "سِجِلّ";
$text['label-record']['de-at'] = "Aufnehmen";
$text['label-record']['de-ch'] = "Aufnehmen";
$text['label-record']['de-de'] = "Aufnehmen";
$text['label-record']['el-gr'] = "Ρεκόρ";
$text['label-record']['es-cl'] = "Registro";
$text['label-record']['es-mx'] = "Registro"; //copied from es-cl
$text['label-record']['fr-ca'] = "Enregistrer"; //copied from fr-fr
$text['label-record']['es-mx'] = "Registro";
$text['label-record']['fr-ca'] = "Enregistrer";
$text['label-record']['fr-fr'] = "Enregistrer";
$text['label-record']['he-il'] = "הקלטה";
$text['label-record']['it-it'] = "Registrazione";
$text['label-record']['ka-ge'] = "ჩაწერა";
$text['label-record']['nl-nl'] = "Opnemen";
$text['label-record']['pl-pl'] = "Nagrywanie";
$text['label-record']['pt-br'] = "Registro"; //copied from pt-pt
$text['label-record']['pt-br'] = "Registro";
$text['label-record']['pt-pt'] = "Registro";
$text['label-record']['ro-ro'] = "";
$text['label-record']['ro-ro'] = "Record";
$text['label-record']['ru-ru'] = "Воспроизведение";
$text['label-record']['sv-se'] = "Spela In";
$text['label-record']['uk-ua'] = "Запис";
$text['label-record']['uk-ua'] = "Запис";
$text['label-record']['tr-tr'] = "Kayıt";
$text['label-record']['zh-cn'] = "记录";
$text['label-record']['ja-jp'] = "記録";
$text['label-record']['ko-kr'] = "기록";
$text['label-other_extensions']['en-us'] = "Other Extensions";
$text['label-other_extensions']['en-gb'] = "Other Extensions";
$text['label-other_extensions']['ar-eg'] = "";
$text['label-other_extensions']['de-at'] = "Andere Nebenstellen"; //copied from de-de
$text['label-other_extensions']['de-ch'] = "Andere Nebenstellen"; //copied from de-de
$text['label-other_extensions']['ar-eg'] = "ملحقات أخرى";
$text['label-other_extensions']['de-at'] = "Andere Nebenstellen";
$text['label-other_extensions']['de-ch'] = "Andere Nebenstellen";
$text['label-other_extensions']['de-de'] = "Andere Nebenstellen";
$text['label-other_extensions']['el-gr'] = "Άλλες επεκτάσεις";
$text['label-other_extensions']['es-cl'] = "Otras Extensiones";
$text['label-other_extensions']['es-mx'] = "Otras Extensiones"; //copied from es-cl
$text['label-other_extensions']['fr-ca'] = "Autres Extensions"; //copied from fr-fr
$text['label-other_extensions']['es-mx'] = "Otras Extensiones";
$text['label-other_extensions']['fr-ca'] = "Autres Extensions";
$text['label-other_extensions']['fr-fr'] = "Autres Extensions";
$text['label-other_extensions']['he-il'] = "שלוחות אחרות";
$text['label-other_extensions']['it-it'] = "Altri Interni";
$text['label-other_extensions']['ka-ge'] = "სხვა გაფართოებები";
$text['label-other_extensions']['nl-nl'] = "Andere toestellen";
$text['label-other_extensions']['pl-pl'] = "Inne numery wewnętrzne";
$text['label-other_extensions']['pt-br'] = "Outras extensões";
$text['label-other_extensions']['pt-pt'] = "Outros Extensions";
$text['label-other_extensions']['ro-ro'] = "";
$text['label-other_extensions']['ro-ro'] = "Alte extensii";
$text['label-other_extensions']['ru-ru'] = "Другие внутренние номера";
$text['label-other_extensions']['sv-se'] = "Annan Anknytning";
$text['label-other_extensions']['uk-ua'] = "Інші розширення";
$text['label-other_extensions']['uk-ua'] = "Інші розширення";
$text['label-other_extensions']['tr-tr'] = "Diğer Uzantılar";
$text['label-other_extensions']['zh-cn'] = "其他扩展";
$text['label-other_extensions']['ja-jp'] = "その他の拡張子";
$text['label-other_extensions']['ko-kr'] = "기타 확장";
$text['label-no_extensions_found']['en-us'] = "No extensions found.";
$text['label-no_extensions_found']['en-gb'] = "No extensions found.";
$text['label-no_extensions_found']['ar-eg'] = "";
$text['label-no_extensions_found']['de-at'] = "Keine Nebenstellen gefunden."; //copied from de-de
$text['label-no_extensions_found']['de-ch'] = "Keine Nebenstellen gefunden."; //copied from de-de
$text['label-no_extensions_found']['ar-eg'] = "لم يتم العثور على ملحقات.";
$text['label-no_extensions_found']['de-at'] = "Keine Nebenstellen gefunden.";
$text['label-no_extensions_found']['de-ch'] = "Keine Nebenstellen gefunden.";
$text['label-no_extensions_found']['de-de'] = "Keine Nebenstellen gefunden.";
$text['label-no_extensions_found']['el-gr'] = "Δεν βρέθηκαν επεκτάσεις.";
$text['label-no_extensions_found']['es-cl'] = "No hay extensiones encontrados.";
$text['label-no_extensions_found']['es-mx'] = "No hay extensiones encontrados."; //copied from es-cl
$text['label-no_extensions_found']['fr-ca'] = "Aucun extensions trouvés."; //copied from fr-fr
$text['label-no_extensions_found']['es-mx'] = "No hay extensiones encontrados.";
$text['label-no_extensions_found']['fr-ca'] = "Aucun extensions trouvés.";
$text['label-no_extensions_found']['fr-fr'] = "Aucun extensions trouvés.";
$text['label-no_extensions_found']['he-il'] = "לא נמצאו שלוחות";
$text['label-no_extensions_found']['it-it'] = "Nessun interno trovato.";
$text['label-no_extensions_found']['ka-ge'] = "გაფართოებები აღმოჩენილი არაა";
$text['label-no_extensions_found']['nl-nl'] = "Geen toestellen gevonden.";
$text['label-no_extensions_found']['pl-pl'] = "Nie znaleziono numerów wewnętrznych";
$text['label-no_extensions_found']['pt-br'] = "Não foi encontrada nenhuma extensão";
$text['label-no_extensions_found']['pt-pt'] = "Sem extensões encontrado.";
$text['label-no_extensions_found']['ro-ro'] = "";
$text['label-no_extensions_found']['ro-ro'] = "Nu s-au găsit extensii.";
$text['label-no_extensions_found']['ru-ru'] = "Внутренних номеров не найдено.";
$text['label-no_extensions_found']['sv-se'] = "Ingen anknytning funnen.";
$text['label-no_extensions_found']['uk-ua'] = "Не знайдено розширень";
$text['label-no_extensions_found']['uk-ua'] = "Не знайдено розширення.";
$text['label-no_extensions_found']['tr-tr'] = "Uzantı bulunamadı.";
$text['label-no_extensions_found']['zh-cn'] = "未找到扩展。";
$text['label-no_extensions_found']['ja-jp'] = "拡張子が見つかりません。";
$text['label-no_extensions_found']['ko-kr'] = "확장 프로그램이 없습니다.";
$text['label-hangup']['en-us'] = "Hangup";
$text['label-hangup']['en-gb'] = "Hangup";
$text['label-hangup']['ar-eg'] = "";
$text['label-hangup']['de-at'] = "Abwürgen"; //copied from de-de
$text['label-hangup']['de-ch'] = "Abwürgen"; //copied from de-de
$text['label-hangup']['ar-eg'] = "تشبث";
$text['label-hangup']['de-at'] = "Abwürgen";
$text['label-hangup']['de-ch'] = "Abwürgen";
$text['label-hangup']['de-de'] = "Abwürgen";
$text['label-hangup']['el-gr'] = "Κονάνθρωπος";
$text['label-hangup']['es-cl'] = "Finalizar Llamada";
$text['label-hangup']['es-mx'] = "Finalizar Llamada"; //copied from es-cl
$text['label-hangup']['fr-ca'] = "Tuer Appel"; //copied from fr-fr
$text['label-hangup']['es-mx'] = "Finalizar Llamada";
$text['label-hangup']['fr-ca'] = "Tuer Appel";
$text['label-hangup']['fr-fr'] = "Tuer Appel";
$text['label-hangup']['he-il'] = "הפסק";
$text['label-hangup']['it-it'] = "Abbatti";
$text['label-hangup']['ka-ge'] = "გათიშვა";
$text['label-hangup']['nl-nl'] = "Ophangen";
$text['label-hangup']['pl-pl'] = "Rozłączenie się";
$text['label-hangup']['pt-br'] = "Chamada final";
$text['label-hangup']['pt-pt'] = "Chamada Final";
$text['label-hangup']['ro-ro'] = "";
$text['label-hangup']['ro-ro'] = "Rezistă";
$text['label-hangup']['ru-ru'] = "Убить";
$text['label-hangup']['sv-se'] = "Lägg På";
$text['label-hangup']['uk-ua'] = "вбити";
$text['label-hangup']['tr-tr'] = "Telefonu kapatmak";
$text['label-hangup']['zh-cn'] = "不挂断";
$text['label-hangup']['ja-jp'] = "ちょっとまって";
$text['label-hangup']['ko-kr'] = "잠깐만";
$text['label-eavesdrop']['en-us'] = "Eavesdrop";
$text['label-eavesdrop']['en-gb'] = "Eavesdrop";
$text['label-eavesdrop']['ar-eg'] = "";
$text['label-eavesdrop']['de-at'] = "Mithören"; //copied from de-de
$text['label-eavesdrop']['de-ch'] = "Mithören"; //copied from de-de
$text['label-eavesdrop']['ar-eg'] = "التنصت";
$text['label-eavesdrop']['de-at'] = "Mithören";
$text['label-eavesdrop']['de-ch'] = "Mithören";
$text['label-eavesdrop']['de-de'] = "Mithören";
$text['label-eavesdrop']['el-gr'] = "Αφουγκράζομαι";
$text['label-eavesdrop']['es-cl'] = "Escuchar";
$text['label-eavesdrop']['es-mx'] = "Escuchar"; //copied from es-cl
$text['label-eavesdrop']['fr-ca'] = "Espionner"; //copied from fr-fr
$text['label-eavesdrop']['es-mx'] = "Escuchar";
$text['label-eavesdrop']['fr-ca'] = "Espionner";
$text['label-eavesdrop']['fr-fr'] = "Espionner";
$text['label-eavesdrop']['he-il'] = "";
$text['label-eavesdrop']['he-il'] = "לְצוֹתֵת";
$text['label-eavesdrop']['it-it'] = "Ascolta";
$text['label-eavesdrop']['ka-ge'] = "მიყურადება";
$text['label-eavesdrop']['nl-nl'] = "Afluisteren";
$text['label-eavesdrop']['pl-pl'] = "Podsłuchiwanie";
$text['label-eavesdrop']['pt-br'] = "Investigar";
$text['label-eavesdrop']['pt-pt'] = "Bisbilhotar";
$text['label-eavesdrop']['ro-ro'] = "";
$text['label-eavesdrop']['ro-ro'] = "Trage cu urechea";
$text['label-eavesdrop']['ru-ru'] = "Подслушивать";
$text['label-eavesdrop']['sv-se'] = "Medlyssning";
$text['label-eavesdrop']['uk-ua'] = "підслуховувати";
$text['label-eavesdrop']['tr-tr'] = "Kulak misafiri olmak";
$text['label-eavesdrop']['zh-cn'] = "窃听";
$text['label-eavesdrop']['ja-jp'] = "盗聴";
$text['label-eavesdrop']['ko-kr'] = "엿듣다";
$text['label-call_group']['en-us'] = "Call Group";
$text['label-call_group']['en-gb'] = "Call Group";
$text['label-call_group']['ar-eg'] = "";
$text['label-call_group']['de-at'] = "Rufgruppe"; //copied from de-de
$text['label-call_group']['de-ch'] = "Rufgruppe"; //copied from de-de
$text['label-call_group']['ar-eg'] = "مجموعة الاتصال";
$text['label-call_group']['de-at'] = "Rufgruppe";
$text['label-call_group']['de-ch'] = "Rufgruppe";
$text['label-call_group']['de-de'] = "Rufgruppe";
$text['label-call_group']['el-gr'] = "Ομάδα κλήσεων";
$text['label-call_group']['es-cl'] = "Llamar a Grupo";
$text['label-call_group']['es-mx'] = "Llamar a Grupo"; //copied from es-cl
$text['label-call_group']['fr-ca'] = "Groupe d'appel"; //copied from fr-fr
$text['label-call_group']['es-mx'] = "Llamar a Grupo";
$text['label-call_group']['fr-ca'] = "Groupe d'appel";
$text['label-call_group']['fr-fr'] = "Groupe d'appel";
$text['label-call_group']['he-il'] = "קבוצת חיוג";
$text['label-call_group']['it-it'] = "Gruppo di Chiamata";
$text['label-call_group']['ka-ge'] = "ჯგუფური დარეკვა";
$text['label-call_group']['nl-nl'] = "Oproep Groep";
$text['label-call_group']['pl-pl'] = "Grupa odbiorców rozmowy";
$text['label-call_group']['pt-br'] = "Grupo"; //copied from pt-pt
$text['label-call_group']['pt-br'] = "Grupo";
$text['label-call_group']['pt-pt'] = "Grupo";
$text['label-call_group']['ro-ro'] = "";
$text['label-call_group']['ro-ro'] = "Grup de apeluri";
$text['label-call_group']['ru-ru'] = "Группы вызова";
$text['label-call_group']['sv-se'] = "Ring Grupp";
$text['label-call_group']['uk-ua'] = "груповий виклик";
$text['label-call_group']['tr-tr'] = "Çağrı Grubu";
$text['label-call_group']['zh-cn'] = "呼叫组";
$text['label-call_group']['ja-jp'] = "通話グループ";
$text['label-call_group']['ko-kr'] = "통화 그룹";
$text['label-call_direction']['en-us'] = "Call Direction";
$text['label-call_direction']['en-gb'] = "Call Direction";
$text['label-call_direction']['ar-eg'] = "";
$text['label-call_direction']['de-at'] = "Anruf Richtung"; //copied from de-de
$text['label-call_direction']['de-ch'] = "Anruf Richtung"; //copied from de-de
$text['label-call_direction']['ar-eg'] = "اتجاه الاتصال";
$text['label-call_direction']['de-at'] = "Anruf Richtung";
$text['label-call_direction']['de-ch'] = "Anruf Richtung";
$text['label-call_direction']['de-de'] = "Anruf Richtung";
$text['label-call_direction']['el-gr'] = "Κατεύθυνση κλήσεων";
$text['label-call_direction']['es-cl'] = "Dirección de la llamada";
$text['label-call_direction']['es-mx'] = "Dirección de la llamada"; //copied from es-cl
$text['label-call_direction']['fr-ca'] = "Sens de l'appel"; //copied from fr-fr
$text['label-call_direction']['es-mx'] = "Dirección de la llamada";
$text['label-call_direction']['fr-ca'] = "Sens de l'appel";
$text['label-call_direction']['fr-fr'] = "Sens de l'appel";
$text['label-call_direction']['he-il'] = "כיוון שיחה";
$text['label-call_direction']['it-it'] = "Direzione Chiamata";
$text['label-call_direction']['ka-ge'] = "ზარის მიმართულება";
$text['label-call_direction']['nl-nl'] = "Oproep richting";
$text['label-call_direction']['pl-pl'] = "Kierunek rozmowy";
$text['label-call_direction']['pt-br'] = "Direção da chamada";
$text['label-call_direction']['pt-pt'] = "Direção da chamada";
$text['label-call_direction']['ro-ro'] = "";
$text['label-call_direction']['ro-ro'] = "Direcția de apel";
$text['label-call_direction']['ru-ru'] = "Направление вызова";
$text['label-call_direction']['sv-se'] = "Samtals Riktning";
$text['label-call_direction']['uk-ua'] = "напрямок виклику";
$text['label-call_direction']['tr-tr'] = "Çağrı Yönü";
$text['label-call_direction']['zh-cn'] = "呼叫方向";
$text['label-call_direction']['ja-jp'] = "通話方向";
$text['label-call_direction']['ko-kr'] = "통화 방향";
$text['label-filter']['en-us'] = "Filter...";
$text['label-filter']['en-gb'] = "Filter...";
$text['label-filter']['ar-eg'] = "فيلم";
$text['label-filter']['de-at'] = "Filter...";
$text['label-filter']['de-ch'] = "Filter...";
$text['label-filter']['de-de'] = "Filter...";
$text['label-filter']['el-gr'] = "Φίλτρο...";
$text['label-filter']['es-cl'] = "Filtro...";
$text['label-filter']['es-mx'] = "Filtro...";
$text['label-filter']['fr-ca'] = "Filtre...";
$text['label-filter']['fr-fr'] = "Filtre...";
$text['label-filter']['he-il'] = "לְסַנֵן...";
$text['label-filter']['it-it'] = "Filtro...";
$text['label-filter']['ka-ge'] = "გაფილტვრა...";
$text['label-filter']['nl-nl'] = "Filter...";
$text['label-filter']['pl-pl'] = "Filter...";
$text['label-filter']['pt-br'] = "Filtro...";
$text['label-filter']['pt-pt'] = "Filtro...";
$text['label-filter']['ro-ro'] = "Filtru...";
$text['label-filter']['ru-ru'] = "Фильтр";
$text['label-filter']['sv-se'] = "Filter...";
$text['label-filter']['uk-ua'] = "Фільтри";
$text['label-filter']['tr-tr'] = "Filtrele...";
$text['label-filter']['zh-cn'] = "筛选";
$text['label-filter']['ja-jp'] = "フィルター";
$text['label-filter']['ko-kr'] = "필터";
$text['description-eavesdrop_destination']['en-us'] = "Select the Eavesdrop Destination";
$text['description-eavesdrop_destination']['en-gb'] = "Select the Eavesdrop Destination";
$text['description-eavesdrop_destination']['ar-eg'] = "";
$text['description-eavesdrop_destination']['de-at'] = "Wählen Sie ein Ziel zum Mithören"; //copied from de-de
$text['description-eavesdrop_destination']['de-ch'] = "Wählen Sie ein Ziel zum Mithören"; //copied from de-de
$text['description-eavesdrop_destination']['ar-eg'] = "حدد وجهة Eavesdrop";
$text['description-eavesdrop_destination']['de-at'] = "Wählen Sie ein Ziel zum Mithören";
$text['description-eavesdrop_destination']['de-ch'] = "Wählen Sie ein Ziel zum Mithören";
$text['description-eavesdrop_destination']['de-de'] = "Wählen Sie ein Ziel zum Mithören";
$text['description-eavesdrop_destination']['el-gr'] = "Επιλέξτε τον προορισμό EAVESDROP";
$text['description-eavesdrop_destination']['es-cl'] = "Seleccione el Eavesdrop Destino";
$text['description-eavesdrop_destination']['es-mx'] = "Seleccione el Eavesdrop Destino"; //copied from es-cl
$text['description-eavesdrop_destination']['fr-ca'] = "Sélectionnez la destination d'espionnage"; //copied from fr-fr
$text['description-eavesdrop_destination']['es-mx'] = "Seleccione el Eavesdrop Destino";
$text['description-eavesdrop_destination']['fr-ca'] = "Sélectionnez la destination d'espionnage";
$text['description-eavesdrop_destination']['fr-fr'] = "Sélectionnez la destination d'espionnage";
$text['description-eavesdrop_destination']['he-il'] = "";
$text['description-eavesdrop_destination']['he-il'] = "בחר ביעד האזנת סתר";
$text['description-eavesdrop_destination']['it-it'] = "Seleziona la Destinazione d'Ascolto";
$text['description-eavesdrop_destination']['ka-ge'] = "აირჩიეთ მოსმენის სამიზნე";
$text['description-eavesdrop_destination']['nl-nl'] = "Kies afluister bestemming";
$text['description-eavesdrop_destination']['pl-pl'] = "Wybierz destynację podsłuchiwanych rozmów";
$text['description-eavesdrop_destination']['pt-br'] = "Selecione o eavesdrop de destino";
$text['description-eavesdrop_destination']['pt-pt'] = "Selecione o Eavesdrop Destino";
$text['description-eavesdrop_destination']['ro-ro'] = "";
$text['description-eavesdrop_destination']['ro-ro'] = "Selectați Destinația Eavesdrop";
$text['description-eavesdrop_destination']['ru-ru'] = "Выберите подслушивание пункта назначения";
$text['description-eavesdrop_destination']['sv-se'] = "Välj Medlyssning Destination";
$text['description-eavesdrop_destination']['uk-ua'] = "Виберіть пункт призначення підслуховувати";
$text['description-eavesdrop_destination']['tr-tr'] = "Dinleme Hedefini Seçin";
$text['description-eavesdrop_destination']['zh-cn'] = "选择窃听目的地";
$text['description-eavesdrop_destination']['ja-jp'] = "盗聴先を選択";
$text['description-eavesdrop_destination']['ko-kr'] = "도청 대상 선택";
$text['button-all']['en-us'] = "All";
$text['button-all']['en-gb'] = "All";
$text['button-all']['ar-eg'] = "";
$text['button-all']['de-at'] = "Alle"; //copied from de-de
$text['button-all']['de-ch'] = "Alle"; //copied from de-de
$text['button-all']['ar-eg'] = "الجميع";
$text['button-all']['de-at'] = "Alle";
$text['button-all']['de-ch'] = "Alle";
$text['button-all']['de-de'] = "Alle";
$text['button-all']['el-gr'] = "Ολα";
$text['button-all']['es-cl'] = "Todos";
$text['button-all']['es-mx'] = "Todos"; //copied from es-cl
$text['button-all']['fr-ca'] = "Tous"; //copied from fr-fr
$text['button-all']['es-mx'] = "Todos";
$text['button-all']['fr-ca'] = "Tous";
$text['button-all']['fr-fr'] = "Tous";
$text['button-all']['he-il'] = "הכל";
$text['button-all']['it-it'] = "Tutti";
$text['button-all']['ka-ge'] = "ყველა";
$text['button-all']['nl-nl'] = "Alle";
$text['button-all']['pl-pl'] = "Wszyscy";
$text['button-all']['pt-br'] = "Tudo"; //copied from pt-pt
$text['button-all']['pt-br'] = "Tudo";
$text['button-all']['pt-pt'] = "Tudo";
$text['button-all']['ro-ro'] = "";
$text['button-all']['ro-ro'] = "Toate";
$text['button-all']['ru-ru'] = "Все";
$text['button-all']['sv-se'] = "Alla";
$text['button-all']['uk-ua'] = "Всі";
$text['button-all']['uk-ua'] = "Всі";
$text['button-all']['tr-tr'] = "Tüm";
$text['button-all']['zh-cn'] = "全部";
$text['button-all']['ja-jp'] = "全て";
$text['button-all']['ko-kr'] = "모두";
?>

View File

@ -3,28 +3,36 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Operator Panel";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Operator Panel";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "لوحة المشغل";
$apps[$x]['menu'][$y]['title']['de-at'] = "Bedienfeld";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Bedienfeld";
$apps[$x]['menu'][$y]['title']['de-de'] = "Bedienfeld";
$apps[$x]['menu'][$y]['title']['es-cl'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Panel del operador";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Panel del operador";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Panneau de commande";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Panneau Operateur";
$apps[$x]['menu'][$y]['title']['he-il'] = "לוח מפעיל";
$apps[$x]['menu'][$y]['title']['it-it'] = "Pannello Operatore";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ოპერატორის პანელი";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Bedienings paneel";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Panel operatora";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Painel do operador";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Painel operador";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Panoul operator";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Панель оператора";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Telefonist Panel";
$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'] = "dd3d173a-5d51-4231-ab22-b18c5b712bb2";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/basic_operator_panel/index.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$y++;
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -182,8 +181,8 @@
}
//output suggestions, if any
if (sizeof($suggestions) > 0) {
$resp .= "[\n";
if (!empty($suggestions) && is_array($suggestions) && @sizeof($suggestions) > 0) {
$resp = "[\n";
$resp .= implode(",\n", $suggestions)."\n";
$resp .= "]";
@ -192,4 +191,4 @@
if (isset($_GET['debug'])) { echo "</pre>"; }
}
?>
?>

View File

@ -2,7 +2,7 @@
/* $Id$ */
/*
v_exec.php
Copyright (C) 2008-2019 Mark J Crane
Copyright (C) 2008-2023 Mark J Crane
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -27,9 +27,8 @@
POSSIBILITY OF SUCH DAMAGE.
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -52,16 +51,16 @@
//process the requests
if (count($_GET) > 0) {
//set the variables
$switch_cmd = trim($_GET["cmd"]);
$action = trim($_GET["action"]);
$data = trim($_GET["data"]);
$direction = trim($_GET["direction"]);
$switch_cmd = trim($_GET["cmd"] ?? '');
$action = trim($_GET["action"] ?? '');
$data = trim($_GET["data"] ?? '');
$direction = trim($_GET["direction"] ?? '');
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//allow specific commands
if (strlen($switch_cmd) > 0) {
if (!empty($switch_cmd)) {
$api_cmd = '';
$uuid_pattern = '/[^-A-Fa-f0-9]/';
$num_pattern = '/[^-A-Za-z0-9()*#]/';
@ -70,14 +69,17 @@ if (count($_GET) > 0) {
$source = preg_replace($num_pattern,'',$_GET['source']);
$destination = preg_replace($num_pattern,'',$_GET['destination']);
$api_cmd = 'bgapi originate {sip_auto_answer=true,origination_caller_id_number=' . $source . ',sip_h_Call-Info=_undef_}user/' . $source . '@' . $_SESSION['domain_name'] . ' ' . $destination . ' XML ' . trim($_SESSION['user_context']);
} elseif ($switch_cmd == 'uuid_record') {
}
else if ($switch_cmd == 'uuid_record') {
$uuid = preg_replace($uuid_pattern,'',$_GET['uuid']);
$api_cmd = 'uuid_record ' . $uuid . ' start ' . $_SESSION['switch']['recordings']['dir'] . '/' . $_SESSION['domain_name'] . '/archive/' . date('Y/M/d') . '/' . $uuid . '.wav';
} elseif ($switch_cmd == 'uuid_transfer') {
}
else if ($switch_cmd == 'uuid_transfer') {
$uuid = preg_replace($uuid_pattern,'',$_GET['uuid']);
$destination = preg_replace($num_pattern,'',$_GET['destination']);
$api_cmd = 'uuid_transfer ' . $uuid . ' ' . $destination . ' XML ' . trim($_SESSION['user_context']);
} elseif ($switch_cmd == 'uuid_eavesdrop') {
}
else if ($switch_cmd == 'uuid_eavesdrop') {
$chan_uuid = preg_replace($uuid_pattern,'',$_GET['chan_uuid']);
$ext = preg_replace($num_pattern,'',$_GET['ext']);
$destination = preg_replace($num_pattern,'',$_GET['destination']);
@ -86,16 +88,18 @@ if (count($_GET) > 0) {
$text = $language->get();
$api_cmd = 'bgapi originate {origination_caller_id_name=' . $text['label-eavesdrop'] . ',origination_caller_id_number=' . $ext . '}user/' . $destination . '@' . $_SESSION['domain_name'] . ' &eavesdrop(' . $chan_uuid . ')';
} elseif ($switch_cmd == 'uuid_kill') {
}
else if ($switch_cmd == 'uuid_kill') {
$call_id = preg_replace($uuid_pattern,'',$_GET['call_id']);
$api_cmd = 'uuid_kill ' . $call_id;
} else {
}
else {
echo 'access denied';
return;
}
//run the command
$switch_result = event_socket_request($fp, 'api '.$api_cmd);
$switch_result = event_socket::api($api_cmd);
/*
//record stop
@ -121,4 +125,4 @@ if (count($_GET) > 0) {
}
}
?>
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -66,7 +65,7 @@
//update the status
if (permission_exists("user_setting_edit")) {
//add the user_edit permission
$p = new permissions;
$p = permissions::new();
$p->add("user_edit", "temp");
//update the database user_status
@ -98,21 +97,21 @@
//update the user_status
if (is_uuid($call_center_agent_uuid)) {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$switch_cmd .= "callcenter_config agent set status ".$call_center_agent_uuid." '".$user_status."'";
$switch_result = event_socket_request($fp, 'api '.$switch_cmd);
$esl = event_socket::create();
$switch_cmd = "callcenter_config agent set status ".$call_center_agent_uuid." '".$user_status."'";
$switch_result = event_socket::api($switch_cmd);
}
//update the user state
if (is_uuid($call_center_agent_uuid)) {
$cmd = "api callcenter_config agent set state ".$call_center_agent_uuid." Waiting";
$response = event_socket_request($fp, $cmd);
$response = event_socket::api($cmd);
}
//update do not disturb
if ($user_status == "Do Not Disturb") {
$x = 0;
foreach($_SESSION['user']['extension'] as $row) {
foreach ($_SESSION['user']['extension'] as $row) {
//build the array
$array['extensions'][$x]['extension_uuid'] = $row['extension_uuid'];
$array['extensions'][$x]['dial_string'] = '!USER_BUSY';
@ -120,8 +119,10 @@
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:".$row['extension']."@".$_SESSION['user']['domain_name']);
if(strlen($number_alias) > 0){
if (!empty($row['extension'])) {
$cache->delete("directory:".$row['extension']."@".$_SESSION['user']['domain_name']);
}
if (!empty($number_alias)) {
$cache->delete("directory:".$row['number_alias']."@".$_SESSION['user']['domain_name']);
}
@ -139,8 +140,10 @@
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:".$row['extension']."@".$_SESSION['user']['domain_name']);
if(strlen($number_alias) > 0){
if (!empty($row['extension'])) {
$cache->delete("directory:".$row['extension']."@".$_SESSION['user']['domain_name']);
}
if (!empty($number_alias)) {
$cache->delete("directory:".$row['number_alias']."@".$_SESSION['user']['domain_name']);
}
@ -150,7 +153,7 @@
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//execute update
@ -165,8 +168,10 @@
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:".$extension."@".$this->domain_name);
if(strlen($number_alias) > 0){
if (!empty($extension)) {
$cache->delete("directory:".$extension."@".$this->domain_name);
}
if (!empty($number_alias)) {
$cache->delete("directory:".$number_alias."@".$this->domain_name);
}
}
@ -255,7 +260,7 @@ unset($refresh_default);
if (this.xmlHttp.readyState == 4 && (this.xmlHttp.status == 200 || !/^http/.test(window.location.href)))
//this.el.innerHTML = this.xmlHttp.responseText;
document.getElementById('ajax_reponse').innerHTML = this.xmlHttp.responseText;
document.getElementById('ajax_response').innerHTML = this.xmlHttp.responseText;
if (document.getElementById('sort')) {
if (document.getElementById('sort').value != "")
document.getElementById('sort1').value=document.getElementById('sort').value;
@ -267,8 +272,7 @@ unset($refresh_default);
url += '&vd_ext_from=' + document.getElementById('vd_ext_from').value;
url += '&vd_ext_to=' + document.getElementById('vd_ext_to').value;
url += '&group=' + ((document.getElementById('group')) ? document.getElementById('group').value : '');
url += '&extension_filter=' + ((document.getElementById('extension_filter')) ? document.getElementById('extension_filter').value : '');
url += '&name_filter=' + ((document.getElementById('name_filter')) ? document.getElementById('name_filter').value : '');
url += '&filter=' + ((document.getElementById('search')) ? document.getElementById('search').value : '');
url += '&eavesdrop_dest=' + ((document.getElementById('eavesdrop_dest')) ? document.getElementById('eavesdrop_dest').value : '');
if (document.getElementById('sort1'))
if (document.getElementById('sort1').value == '1') url += '&sort';
@ -277,7 +281,7 @@ unset($refresh_default);
echo "url += '&debug';";
}
?>
new loadXmlHttp(url, 'ajax_reponse');
new loadXmlHttp(url, 'ajax_response');
refresh_start();
}
@ -345,19 +349,18 @@ unset($refresh_default);
//refresh controls
function refresh_stop() {
clearInterval(interval_timer_id);
if (document.getElementById('refresh_state')) { document.getElementById('refresh_state').innerHTML = "<img src='resources/images/refresh_paused.png' style='width: 16px; height: 16px; border: none; margin-top: 1px; cursor: pointer;' onclick='refresh_start();' alt=\"<?php echo $text['label-refresh_enable']?>\" title=\"<?php echo $text['label-refresh_enable']?>\">"; }
if (document.getElementById('refresh_state')) { document.getElementById('refresh_state').innerHTML = "<?php echo button::create(['type'=>'button','title'=>$text['label-refresh_enable'],'icon'=>'pause','onclick'=>'refresh_start()']); ?>"; }
}
function refresh_start() {
if (document.getElementById('refresh_state')) { document.getElementById('refresh_state').innerHTML = "<img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; margin-top: 3px; cursor: pointer;' alt=\"<?php echo $text['label-refresh_pause']?>\" title=\"<?php echo $text['label-refresh_pause']?>\">"; }
if (document.getElementById('refresh_state')) { document.getElementById('refresh_state').innerHTML = "<?php echo button::create(['type'=>'button','title'=>$text['label-refresh_pause'],'icon'=>'sync-alt fa-spin','onclick'=>'refresh_stop()']); ?>"; }
refresh_stop();
interval_timer_id = setInterval( function() {
url = source_url;
url += '&vd_ext_from=' + document.getElementById('vd_ext_from').value;
url += '&vd_ext_to=' + document.getElementById('vd_ext_to').value;
url += '&group=' + ((document.getElementById('group')) ? document.getElementById('group').value : '');
url += '&extension_filter=' + ((document.getElementById('extension_filter')) ? document.getElementById('extension_filter').value : '');
url += '&name_filter=' + ((document.getElementById('name_filter')) ? document.getElementById('name_filter').value : '');
url += '&filter=' + ((document.getElementById('search')) ? document.getElementById('search').value : '');
url += '&eavesdrop_dest=' + ((document.getElementById('eavesdrop_dest')) ? document.getElementById('eavesdrop_dest').value : '');
if (document.getElementById('sort1'))
if (document.getElementById('sort1').value == '1') url += '&sort';
@ -366,7 +369,7 @@ unset($refresh_default);
echo "url += '&debug';";
}
?>
new loadXmlHttp(url, 'ajax_reponse');
new loadXmlHttp(url, 'ajax_response');
}, refresh);
}
@ -402,7 +405,7 @@ unset($refresh_default);
if (ext != '' && chan_uuid != '') {
cmd = get_eavesdrop_cmd(ext, chan_uuid, document.getElementById('eavesdrop_dest').value);
if (cmd != '') {
send_cmd(cmd)
send_cmd(cmd);
}
}
}
@ -427,7 +430,7 @@ unset($refresh_default);
}
xmlhttp.open("GET",url,false);
xmlhttp.send(null);
document.getElementById('cmd_reponse').innerHTML=xmlhttp.responseText;
document.getElementById('cmd_response').innerHTML=xmlhttp.responseText;
}
//hide/show destination input field
@ -585,15 +588,11 @@ if (is_array($_SESSION['user']['extension'])) {
}
}
?>
<div id='ajax_reponse'></div>
<div id='cmd_reponse' style='display: none;'></div>
<br><br>
<?php
echo "<div id='ajax_response'></div>\n";
echo "<div id='cmd_response' style='display: none;'></div>\n";
echo "<br><br>\n";
//include the footer
require_once "resources/footer.php";
?>
?>

View File

@ -27,7 +27,6 @@
/**
* Define the operator_panel class
*/
if (!class_exists('basic_operator_panel')) {
class basic_operator_panel {
/**
@ -44,16 +43,6 @@ if (!class_exists('basic_operator_panel')) {
}
}
/**
* Called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* Get the call activity
*/
@ -67,7 +56,6 @@ if (!class_exists('basic_operator_panel')) {
$sql .= "e.extension, ";
$sql .= "e.number_alias, ";
$sql .= "e.effective_caller_id_name, ";
$sql .= "lower(e.effective_caller_id_name) as filter_name, ";
$sql .= "e.effective_caller_id_number, ";
$sql .= "e.call_group, ";
$sql .= "e.description, ";
@ -88,7 +76,7 @@ if (!class_exists('basic_operator_panel')) {
//store extension status by user uuid
if (isset($extensions)) {
foreach($extensions as &$row) {
foreach ($extensions as $row) {
if ($row['user_uuid'] != '') {
$ext_user_status[$row['user_uuid']] = $row['user_status'];
unset($row['user_status']);
@ -97,18 +85,20 @@ if (!class_exists('basic_operator_panel')) {
}
//send the command
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$switch_result = event_socket_request($fp, 'api show channels as json');
$switch_result = event_socket::api('show channels as json');
if ($switch_result !== false) {
$fp = true;
$json_array = json_decode($switch_result, true);
} else {
$fp = false;
}
//build the response
$x = 0;
if (isset($extensions)) {
foreach($extensions as &$row) {
foreach ($extensions as $row) {
$user = $row['extension'];
if (strlen($row['number_alias']) >0 ) {
if (!empty($row['number_alias'])) {
$user = $row['number_alias'];
}
@ -152,11 +142,11 @@ if (!class_exists('basic_operator_panel')) {
//add the active call details
$found = false;
if (isset($json_array['rows'])) {
foreach($json_array['rows'] as &$field) {
foreach ($json_array['rows'] as $field) {
$presence_id = $field['presence_id'];
$presence = explode("@", $presence_id);
$presence_id = $presence[0];
$presence_domain = $presence[1];
$presence_domain = $presence[1] ?? '';
if ($user == $presence_id) {
if ($presence_domain == $_SESSION['domain_name']) {
$found = true;
@ -216,8 +206,10 @@ if (!class_exists('basic_operator_panel')) {
if ($fp) {
if (is_uuid($field['uuid'])) {
$switch_cmd = 'uuid_dump '.$field['uuid'].' json';
$dump_result = event_socket_request($fp, 'api '.$switch_cmd);
$dump_array = json_decode($dump_result, true);
$dump_result = event_socket::api($switch_cmd);
if ($dump_result !== false) {
$dump_array = json_decode($dump_result, true);
}
if (is_array($dump_array)) {
foreach ($dump_array as $dump_var_name => $dump_var_value) {
$array[$x][$dump_var_name] = $dump_var_value;
@ -252,6 +244,3 @@ if (!class_exists('basic_operator_panel')) {
return $result;
}
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -3,9 +3,9 @@
//application details
$apps[$x]['name'] = 'Bridges';
$apps[$x]['uuid'] = 'a6a7c4c5-340a-43ce-bcbc-2ed9bab8659d';
$apps[$x]['category'] = '';
$apps[$x]['category'] = 'switch';
$apps[$x]['subcategory'] = '';
$apps[$x]['version'] = '';
$apps[$x]['version'] = '1.2';
$apps[$x]['license'] = 'Mozilla Public License 1.1';
$apps[$x]['url'] = 'http://www.fusionpbx.com';
$apps[$x]['description']['en-us'] = '';
@ -36,6 +36,9 @@
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
$apps[$x]['permissions'][$y]['groups'][] = 'admin';
$y++;
$apps[$x]['permissions'][$y]['name'] = 'bridge_import';
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
$y++;
//destination details
$y = 0;
@ -46,6 +49,7 @@
$apps[$x]['destinations'][$y]['where'] = "where domain_uuid = '\${domain_uuid}' and bridge_enabled = 'true'";
$apps[$x]['destinations'][$y]['order_by'] = "bridge_name asc";
$apps[$x]['destinations'][$y]['field']['bridge_uuid'] = "bridge_uuid";
$apps[$x]['destinations'][$y]['field']['uuid'] = "bridge_uuid";
$apps[$x]['destinations'][$y]['field']['name'] = "bridge_name";
$apps[$x]['destinations'][$y]['field']['description'] = "bridge_description";
$apps[$x]['destinations'][$y]['field']['destination'] = "bridge_destination";
@ -93,5 +97,86 @@
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the 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'] = "";
//default settings
$y=0;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "ebe37151-bbd0-4bf3-9c01-7a831943cb86";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "action";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'user';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "9a64c041-0dcd-4eee-b196-6f300b87dff8";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "action";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'gateway';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "a082511d-cc2f-4b8a-a49c-f505971ef80f";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "action";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'profile';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "f5b659a5-a375-4207-b3d1-cad5b3336f2e";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "action";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'loopback';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b97e4810-8a04-4305-9cd8-a43c57c71703";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "variable";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'accountcode';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "0d1b5374-9c7a-46a5-9a08-d32fd42d6f06";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "variable";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'effective_caller_id_number';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "bdf5e430-ac50-4a15-b59d-b0c8a78fd410";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "bridge";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "variable";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = 'call_direction=outbound';
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
?>

View File

@ -1,257 +1,625 @@
<?php
//Bridges
$text['title-bridges']['en-us'] = 'Bridges';
$text['title-bridges']['en-gb'] = 'Bridges';
$text['title-bridges']['ar-eg'] = '';
$text['title-bridges']['de-at'] = '';
$text['title-bridges']['de-ch'] = '';
$text['title-bridges']['de-de'] = '';
$text['title-bridges']['es-cl'] = '';
$text['title-bridges']['es-mx'] = '';
$text['title-bridges']['fr-ca'] = 'Ponts';
$text['title-bridges']['fr-fr'] = 'Ponts';
$text['title-bridges']['he-il'] = '';
$text['title-bridges']['it-it'] = '';
$text['title-bridges']['nl-nl'] = 'Bruggen';
$text['title-bridges']['pl-pl'] = 'Mostki';
$text['title-bridges']['pt-br'] = '';
$text['title-bridges']['pt-pt'] = '';
$text['title-bridges']['ro-ro'] = '';
$text['title-bridges']['ru-ru'] = '';
$text['title-bridges']['sv-se'] = '';
$text['title-bridges']['uk-ua'] = '';
$text['title-bridges']['en-us'] = "Bridges";
$text['title-bridges']['en-gb'] = "Bridges";
$text['title-bridges']['ar-eg'] = "الجسور";
$text['title-bridges']['de-at'] = "Brücken";
$text['title-bridges']['de-ch'] = "Brücken";
$text['title-bridges']['de-de'] = "Brücken";
$text['title-bridges']['el-gr'] = "Γέφυρες";
$text['title-bridges']['es-cl'] = "Puentes";
$text['title-bridges']['es-mx'] = "Puentes";
$text['title-bridges']['fr-ca'] = "Ponts";
$text['title-bridges']['fr-fr'] = "Ponts";
$text['title-bridges']['he-il'] = "גשרים";
$text['title-bridges']['it-it'] = "Ponti";
$text['title-bridges']['ka-ge'] = "ხიდები";
$text['title-bridges']['nl-nl'] = "Bruggen";
$text['title-bridges']['pl-pl'] = "Mostki";
$text['title-bridges']['pt-br'] = "pontes";
$text['title-bridges']['pt-pt'] = "pontes";
$text['title-bridges']['ro-ro'] = "Poduri";
$text['title-bridges']['ru-ru'] = "Мосты";
$text['title-bridges']['sv-se'] = "Broar";
$text['title-bridges']['uk-ua'] = "Мости";
$text['title-bridges']['tr-tr'] = "Köprüler";
$text['title-bridges']['zh-cn'] = "桥梁";
$text['title-bridges']['ja-jp'] = "";
$text['title-bridges']['ko-kr'] = "교량";
$text['title-bridge']['en-us'] = 'Bridge';
$text['title-bridge']['en-gb'] = 'Bridge';
$text['title-bridge']['ar-eg'] = '';
$text['title-bridge']['de-at'] = '';
$text['title-bridge']['de-ch'] = '';
$text['title-bridge']['de-de'] = '';
$text['title-bridge']['es-cl'] = '';
$text['title-bridge']['es-mx'] = '';
$text['title-bridge']['fr-ca'] = 'Pont';
$text['title-bridge']['fr-fr'] = 'Pont';
$text['title-bridge']['he-il'] = '';
$text['title-bridge']['it-it'] = '';
$text['title-bridge']['nl-nl'] = 'Brug';
$text['title-bridge']['pl-pl'] = 'Mostek';
$text['title-bridge']['pt-br'] = '';
$text['title-bridge']['pt-pt'] = '';
$text['title-bridge']['ro-ro'] = '';
$text['title-bridge']['ru-ru'] = '';
$text['title-bridge']['sv-se'] = '';
$text['title-bridge']['uk-ua'] = '';
$text['title-bridge']['en-us'] = "Bridge";
$text['title-bridge']['en-gb'] = "Bridge";
$text['title-bridge']['ar-eg'] = "كوبري";
$text['title-bridge']['de-at'] = "Brücke";
$text['title-bridge']['de-ch'] = "Brücke";
$text['title-bridge']['de-de'] = "Brücke";
$text['title-bridge']['el-gr'] = "Γέφυρα";
$text['title-bridge']['es-cl'] = "Puente";
$text['title-bridge']['es-mx'] = "Puente";
$text['title-bridge']['fr-ca'] = "Pont";
$text['title-bridge']['fr-fr'] = "Pont";
$text['title-bridge']['he-il'] = "לְגַשֵׁר";
$text['title-bridge']['it-it'] = "Ponte";
$text['title-bridge']['ka-ge'] = "ხიდი";
$text['title-bridge']['nl-nl'] = "Brug";
$text['title-bridge']['pl-pl'] = "Mostek";
$text['title-bridge']['pt-br'] = "Ponte";
$text['title-bridge']['pt-pt'] = "Ponte";
$text['title-bridge']['ro-ro'] = "Pod";
$text['title-bridge']['ru-ru'] = "Мост";
$text['title-bridge']['sv-se'] = "Bro";
$text['title-bridge']['uk-ua'] = "Міст";
$text['title-bridge']['tr-tr'] = "Köprü";
$text['title-bridge']['zh-cn'] = "";
$text['title-bridge']['ja-jp'] = "";
$text['title-bridge']['ko-kr'] = "다리";
$text['title_description-bridge']['en-us'] = 'Add bridge statements to destination select list.';
$text['title_description-bridge']['en-gb'] = 'Add bridge statements to destination select list.';
$text['title_description-bridge']['ar-eg'] = '';
$text['title_description-bridge']['de-at'] = '';
$text['title_description-bridge']['de-ch'] = '';
$text['title_description-bridge']['de-de'] = '';
$text['title_description-bridge']['es-cl'] = '';
$text['title_description-bridge']['es-mx'] = '';
$text['title_description-bridge']['fr-ca'] = 'Ajouter des déclarations de pont à la liste de sélection';
$text['title_description-bridge']['fr-fr'] = 'Ajouter des déclarations de pont à la liste de sélection';
$text['title_description-bridge']['he-il'] = '';
$text['title_description-bridge']['it-it'] = '';
$text['title_description-bridge']['nl-nl'] = 'Voeg brug opdrachten toe aan bestemmings lijst.';
$text['title_description-bridge']['pl-pl'] = 'Dodaj wyrażenia mostkowania do listy wyboru destynacji.';
$text['title_description-bridge']['pt-br'] = '';
$text['title_description-bridge']['pt-pt'] = '';
$text['title_description-bridge']['ro-ro'] = '';
$text['title_description-bridge']['ru-ru'] = '';
$text['title_description-bridge']['sv-se'] = '';
$text['title_description-bridge']['uk-ua'] = '';
$text['title_description-bridge']['en-us'] = "Add bridge statements to destination select list.";
$text['title_description-bridge']['en-gb'] = "Add bridge statements to destination select list.";
$text['title_description-bridge']['ar-eg'] = "إضافة عبارات الجسر إلى قائمة تحديد الوجهة.";
$text['title_description-bridge']['de-at'] = "Bridge-Anweisungen zur Zielauswahlliste hinzufügen.";
$text['title_description-bridge']['de-ch'] = "Bridge-Anweisungen zur Zielauswahlliste hinzufügen.";
$text['title_description-bridge']['de-de'] = "Bridge-Anweisungen zur Zielauswahlliste hinzufügen.";
$text['title_description-bridge']['el-gr'] = "Προσθέστε δηλώσεις γέφυρας στη λίστα επιλογής προορισμού.";
$text['title_description-bridge']['es-cl'] = "Agregue declaraciones de puente a la lista de selección de destino.";
$text['title_description-bridge']['es-mx'] = "Agregue declaraciones de puente a la lista de selección de destino.";
$text['title_description-bridge']['fr-ca'] = "Ajouter des déclarations de pont à la liste de sélection";
$text['title_description-bridge']['fr-fr'] = "Ajouter des déclarations de pont à la liste de sélection";
$text['title_description-bridge']['he-il'] = "הוסף הצהרות גשר לרשימת בחירת היעד.";
$text['title_description-bridge']['it-it'] = "Aggiungi istruzioni bridge allelenco di selezione della destinazione.";
$text['title_description-bridge']['ka-ge'] = "დაამატეთ ხიდის ოპერატორები სამიზნის არჩევის სიაში";
$text['title_description-bridge']['nl-nl'] = "Voeg bridge opdrachten toe aan bestemmings lijst.";
$text['title_description-bridge']['pl-pl'] = "Dodaj wyrażenia mostkowania do listy wyboru destynacji.";
$text['title_description-bridge']['pt-br'] = "Adicione instruções de ponte à lista de seleção de destino.";
$text['title_description-bridge']['pt-pt'] = "Adicione instruções de ponte à lista de seleção de destino.";
$text['title_description-bridge']['ro-ro'] = "Adăugați declarații bridge la lista de selectare a destinației.";
$text['title_description-bridge']['ru-ru'] = "Добавьте операторы моста в список выбора места назначения.";
$text['title_description-bridge']['sv-se'] = "Lägg till bryggsatser till destinationsvallistan.";
$text['title_description-bridge']['uk-ua'] = "Додайте оператори моста до списку вибору призначення.";
$text['title_description-bridge']['tr-tr'] = "Hedef seçim listesine köprü ifadeleri ekleyin.";
$text['title_description-bridge']['zh-cn'] = "将桥接语句添加到目标选择列表。";
$text['title_description-bridge']['ja-jp'] = "宛先選択リストにブリッジ ステートメントを追加します。";
$text['title_description-bridge']['ko-kr'] = "대상 선택 목록에 브리지 문을 추가합니다.";
$text['label-bridge_name']['en-us'] = 'Name';
$text['label-bridge_name']['en-gb'] = 'Name';
$text['label-bridge_name']['ar-eg'] = '';
$text['label-bridge_name']['de-at'] = '';
$text['label-bridge_name']['de-ch'] = '';
$text['label-bridge_name']['de-de'] = '';
$text['label-bridge_name']['es-cl'] = '';
$text['label-bridge_name']['es-mx'] = '';
$text['label-bridge_name']['fr-ca'] = 'Nom';
$text['label-bridge_name']['fr-fr'] = 'Nom';
$text['label-bridge_name']['he-il'] = '';
$text['label-bridge_name']['it-it'] = '';
$text['label-bridge_name']['nl-nl'] = 'Naam';
$text['label-bridge_name']['pl-pl'] = 'Nazwa';
$text['label-bridge_name']['pt-br'] = '';
$text['label-bridge_name']['pt-pt'] = '';
$text['label-bridge_name']['ro-ro'] = '';
$text['label-bridge_name']['ru-ru'] = '';
$text['label-bridge_name']['sv-se'] = '';
$text['label-bridge_name']['uk-ua'] = '';
$text['label-bridge_import']['en-us'] = "Bridge Import";
$text['label-bridge_import']['en-gb'] = "Bridge Import";
$text['label-bridge_import']['ar-eg'] = "استيراد الجسر";
$text['label-bridge_import']['de-at'] = "Bridge-Import";
$text['label-bridge_import']['de-ch'] = "Bridge-Import";
$text['label-bridge_import']['de-de'] = "Bridge-Import";
$text['label-bridge_import']['el-gr'] = "Εισαγωγή Γέφυρας";
$text['label-bridge_import']['es-cl'] = "Importación de puente";
$text['label-bridge_import']['es-mx'] = "Importación de puente";
$text['label-bridge_import']['fr-ca'] = "Importation de pont";
$text['label-bridge_import']['fr-fr'] = "Importation de pont";
$text['label-bridge_import']['he-il'] = "ייבוא גשר";
$text['label-bridge_import']['it-it'] = "Importazione del ponte";
$text['label-bridge_import']['ka-ge'] = "ხიდის იმპორტი";
$text['label-bridge_import']['nl-nl'] = "Bridge importeren";
$text['label-bridge_import']['pl-pl'] = "Import mostu";
$text['label-bridge_import']['pt-br'] = "Importação de ponte";
$text['label-bridge_import']['pt-pt'] = "Importação de ponte";
$text['label-bridge_import']['ro-ro'] = "Import de pod";
$text['label-bridge_import']['ru-ru'] = "Импорт моста";
$text['label-bridge_import']['sv-se'] = "Bridge Import";
$text['label-bridge_import']['uk-ua'] = "Імпорт міст";
$text['label-bridge_import']['tr-tr'] = "Köprü İçe Aktarımı";
$text['label-bridge_import']['zh-cn'] = "桥导入";
$text['label-bridge_import']['ja-jp'] = "ブリッジインポート";
$text['label-bridge_import']['ko-kr'] = "브릿지 임포트";
$text['description-bridge_name']['en-us'] = 'Enter the name.';
$text['description-bridge_name']['en-gb'] = 'Enter the name.';
$text['description-bridge_name']['ar-eg'] = '';
$text['description-bridge_name']['de-at'] = '';
$text['description-bridge_name']['de-ch'] = '';
$text['description-bridge_name']['de-de'] = '';
$text['description-bridge_name']['es-cl'] = '';
$text['description-bridge_name']['es-mx'] = '';
$text['description-bridge_name']['fr-ca'] = 'Entrez le nom';
$text['description-bridge_name']['fr-fr'] = 'Entrez le nom';
$text['description-bridge_name']['he-il'] = '';
$text['description-bridge_name']['it-it'] = '';
$text['description-bridge_name']['nl-nl'] = 'Voer naam in.';
$text['description-bridge_name']['pl-pl'] = 'Wprowadź nazwę.';
$text['description-bridge_name']['pt-br'] = '';
$text['description-bridge_name']['pt-pt'] = '';
$text['description-bridge_name']['ro-ro'] = '';
$text['description-bridge_name']['ru-ru'] = '';
$text['description-bridge_name']['sv-se'] = '';
$text['description-bridge_name']['uk-ua'] = '';
$text['label-bridge_name']['en-us'] = "Name";
$text['label-bridge_name']['en-gb'] = "Name";
$text['label-bridge_name']['ar-eg'] = "اسم";
$text['label-bridge_name']['de-at'] = "Name";
$text['label-bridge_name']['de-ch'] = "Name";
$text['label-bridge_name']['de-de'] = "Name";
$text['label-bridge_name']['el-gr'] = "Ονομα";
$text['label-bridge_name']['es-cl'] = "Nombre";
$text['label-bridge_name']['es-mx'] = "Nombre";
$text['label-bridge_name']['fr-ca'] = "Nom";
$text['label-bridge_name']['fr-fr'] = "Nom";
$text['label-bridge_name']['he-il'] = "שֵׁם";
$text['label-bridge_name']['it-it'] = "Nome";
$text['label-bridge_name']['ka-ge'] = "სახელი";
$text['label-bridge_name']['nl-nl'] = "Naam";
$text['label-bridge_name']['pl-pl'] = "Nazwa";
$text['label-bridge_name']['pt-br'] = "Nome";
$text['label-bridge_name']['pt-pt'] = "Nome";
$text['label-bridge_name']['ro-ro'] = "Nume";
$text['label-bridge_name']['ru-ru'] = "Имя";
$text['label-bridge_name']['sv-se'] = "namn";
$text['label-bridge_name']['uk-ua'] = "Імя";
$text['label-bridge_name']['tr-tr'] = "İsim";
$text['label-bridge_name']['zh-cn'] = "姓名";
$text['label-bridge_name']['ja-jp'] = "名前";
$text['label-bridge_name']['ko-kr'] = "이름";
$text['label-bridge_destination']['en-us'] = 'Destination';
$text['label-bridge_destination']['en-gb'] = 'Destination';
$text['label-bridge_destination']['ar-eg'] = '';
$text['label-bridge_destination']['de-at'] = '';
$text['label-bridge_destination']['de-ch'] = '';
$text['label-bridge_destination']['de-de'] = '';
$text['label-bridge_destination']['es-cl'] = '';
$text['label-bridge_destination']['es-mx'] = '';
$text['label-bridge_destination']['fr-ca'] = 'Destination';
$text['label-bridge_destination']['fr-fr'] = 'Destination';
$text['label-bridge_destination']['he-il'] = '';
$text['label-bridge_destination']['it-it'] = '';
$text['label-bridge_destination']['nl-nl'] = 'Bestemming';
$text['label-bridge_destination']['pl-pl'] = 'Destynacja';
$text['label-bridge_destination']['pt-br'] = '';
$text['label-bridge_destination']['pt-pt'] = '';
$text['label-bridge_destination']['ro-ro'] = '';
$text['label-bridge_destination']['ru-ru'] = '';
$text['label-bridge_destination']['sv-se'] = '';
$text['label-bridge_destination']['uk-ua'] = '';
$text['description-bridge_name']['en-us'] = "Enter the name.";
$text['description-bridge_name']['en-gb'] = "Enter the name.";
$text['description-bridge_name']['ar-eg'] = "أدخل الاسم.";
$text['description-bridge_name']['de-at'] = "Geben Sie den Namen ein.";
$text['description-bridge_name']['de-ch'] = "Geben Sie den Namen ein.";
$text['description-bridge_name']['de-de'] = "Geben Sie den Namen ein.";
$text['description-bridge_name']['el-gr'] = "Εισαγάγετε το όνομα.";
$text['description-bridge_name']['es-cl'] = "Introduzca el nombre.";
$text['description-bridge_name']['es-mx'] = "Introduzca el nombre.";
$text['description-bridge_name']['fr-ca'] = "Entrez le nom";
$text['description-bridge_name']['fr-fr'] = "Entrez le nom";
$text['description-bridge_name']['he-il'] = "הזן את השם.";
$text['description-bridge_name']['it-it'] = "Inserisci il nome.";
$text['description-bridge_name']['ka-ge'] = "შეიყვანეთ სახელი";
$text['description-bridge_name']['nl-nl'] = "Voer naam in.";
$text['description-bridge_name']['pl-pl'] = "Wprowadź nazwę.";
$text['description-bridge_name']['pt-br'] = "Digite o nome.";
$text['description-bridge_name']['pt-pt'] = "Digite o nome.";
$text['description-bridge_name']['ro-ro'] = "Introduceți numele.";
$text['description-bridge_name']['ru-ru'] = "Введите имя.";
$text['description-bridge_name']['sv-se'] = "Ange namnet.";
$text['description-bridge_name']['uk-ua'] = "Введіть назву.";
$text['description-bridge_name']['tr-tr'] = "Adı girin.";
$text['description-bridge_name']['zh-cn'] = "输入名称。";
$text['description-bridge_name']['ja-jp'] = "名前を入力します。";
$text['description-bridge_name']['ko-kr'] = "이름을 입력하세요.";
$text['description-bridge_destination']['en-us'] = 'Enter the destination.';
$text['description-bridge_destination']['en-gb'] = 'Enter the destination.';
$text['description-bridge_destination']['ar-eg'] = '';
$text['description-bridge_destination']['de-at'] = '';
$text['description-bridge_destination']['de-ch'] = '';
$text['description-bridge_destination']['de-de'] = '';
$text['description-bridge_destination']['es-cl'] = '';
$text['description-bridge_destination']['es-mx'] = '';
$text['description-bridge_destination']['fr-ca'] = 'Entrer la destination';
$text['description-bridge_destination']['fr-fr'] = 'Entrer la destination';
$text['description-bridge_destination']['he-il'] = '';
$text['description-bridge_destination']['it-it'] = '';
$text['description-bridge_destination']['nl-nl'] = 'Voer de bestemming in.';
$text['description-bridge_destination']['pl-pl'] = 'Wprowadź destynację.';
$text['description-bridge_destination']['pt-br'] = '';
$text['description-bridge_destination']['pt-pt'] = '';
$text['description-bridge_destination']['ro-ro'] = '';
$text['description-bridge_destination']['ru-ru'] = '';
$text['description-bridge_destination']['sv-se'] = '';
$text['description-bridge_destination']['uk-ua'] = '';
$text['label-bridge_action']['en-us'] = "Action";
$text['label-bridge_action']['en-gb'] = "Action";
$text['label-bridge_action']['ar-eg'] = "الإجراء";
$text['label-bridge_action']['de-at'] = "Aktion";
$text['label-bridge_action']['de-ch'] = "Aktion";
$text['label-bridge_action']['de-de'] = "Aktion";
$text['label-bridge_action']['el-gr'] = "Δράση";
$text['label-bridge_action']['es-cl'] = "Acción";
$text['label-bridge_action']['es-mx'] = "Acción";
$text['label-bridge_action']['fr-ca'] = "Action";
$text['label-bridge_action']['fr-fr'] = "Action";
$text['label-bridge_action']['he-il'] = "פעולה";
$text['label-bridge_action']['it-it'] = "Azione";
$text['label-bridge_action']['ka-ge'] = "ქმედება";
$text['label-bridge_action']['nl-nl'] = "Aktie";
$text['label-bridge_action']['pl-pl'] = "Operacja";
$text['label-bridge_action']['pt-br'] = "Ação";
$text['label-bridge_action']['pt-pt'] = "Acção";
$text['label-bridge_action']['ro-ro'] = "Acțiune";
$text['label-bridge_action']['ru-ru'] = "Действие";
$text['label-bridge_action']['sv-se'] = "Aktion";
$text['label-bridge_action']['uk-ua'] = "Дія";
$text['label-bridge_action']['tr-tr'] = "Aksiyon";
$text['label-bridge_action']['zh-cn'] = "行动";
$text['label-bridge_action']['ja-jp'] = "アクション";
$text['label-bridge_action']['ko-kr'] = "행동";
$text['label-bridge_enabled']['en-us'] = 'Enabled';
$text['label-bridge_enabled']['en-gb'] = 'Enabled';
$text['label-bridge_enabled']['ar-eg'] = '';
$text['label-bridge_enabled']['de-at'] = '';
$text['label-bridge_enabled']['de-ch'] = '';
$text['label-bridge_enabled']['de-de'] = '';
$text['label-bridge_enabled']['es-cl'] = '';
$text['label-bridge_enabled']['es-mx'] = '';
$text['label-bridge_enabled']['fr-ca'] = 'Activé';
$text['label-bridge_enabled']['fr-fr'] = 'Activé';
$text['label-bridge_enabled']['he-il'] = '';
$text['label-bridge_enabled']['it-it'] = '';
$text['label-bridge_enabled']['nl-nl'] = 'Geactiveerd';
$text['label-bridge_enabled']['pl-pl'] = 'Aktywny';
$text['label-bridge_enabled']['pt-br'] = '';
$text['label-bridge_enabled']['pt-pt'] = '';
$text['label-bridge_enabled']['ro-ro'] = '';
$text['label-bridge_enabled']['ru-ru'] = '';
$text['label-bridge_enabled']['sv-se'] = '';
$text['label-bridge_enabled']['uk-ua'] = '';
$text['description-bridge_action']['en-us'] = "Select the bridge action.";
$text['description-bridge_action']['en-gb'] = "Select the bridge action.";
$text['description-bridge_action']['ar-eg'] = "حدد إجراء الجسر.";
$text['description-bridge_action']['de-at'] = "Wählen Sie die Bridge-Aktion aus.";
$text['description-bridge_action']['de-ch'] = "Wählen Sie die Bridge-Aktion aus.";
$text['description-bridge_action']['de-de'] = "Wählen Sie die Bridge-Aktion aus.";
$text['description-bridge_action']['el-gr'] = "Επιλέξτε τη δράση γέφυρας.";
$text['description-bridge_action']['es-cl'] = "Seleccione la acción del puente.";
$text['description-bridge_action']['es-mx'] = "Seleccione la acción del puente.";
$text['description-bridge_action']['fr-ca'] = "Sélectionnez l'action de pont.";
$text['description-bridge_action']['fr-fr'] = "Sélectionnez l'action de pont.";
$text['description-bridge_action']['he-il'] = "בחר את פעולת הגשר.";
$text['description-bridge_action']['it-it'] = "Seleziona l'azione del ponte.";
$text['description-bridge_action']['ka-ge'] = "აირჩიეთ ხიდის ქმედება.";
$text['description-bridge_action']['nl-nl'] = "Selecteer de brugactie.";
$text['description-bridge_action']['pl-pl'] = "Wybierz akcję mostu.";
$text['description-bridge_action']['pt-br'] = "Selecione a ação da ponte.";
$text['description-bridge_action']['pt-pt'] = "Selecione a ação da ponte.";
$text['description-bridge_action']['ro-ro'] = "Selectați acțiunea bridge.";
$text['description-bridge_action']['ru-ru'] = "Выберите действие моста.";
$text['description-bridge_action']['sv-se'] = "Välj broåtgärd.";
$text['description-bridge_action']['uk-ua'] = "Виберіть дію моста.";
$text['description-bridge_action']['tr-tr'] = "Köprü eylemini seçin.";
$text['description-bridge_action']['zh-cn'] = "选择桥接动作。";
$text['description-bridge_action']['ja-jp'] = "ブリッジアクションを選択します。";
$text['description-bridge_action']['ko-kr'] = "브리지 작업을 선택합니다.";
$text['description-bridge_enabled']['en-us'] = 'Select to enable or disable.';
$text['description-bridge_enabled']['en-gb'] = 'Select to enable or disable.';
$text['description-bridge_enabled']['ar-eg'] = '';
$text['description-bridge_enabled']['de-at'] = '';
$text['description-bridge_enabled']['de-ch'] = '';
$text['description-bridge_enabled']['de-de'] = '';
$text['description-bridge_enabled']['es-cl'] = '';
$text['description-bridge_enabled']['es-mx'] = '';
$text['description-bridge_enabled']['fr-ca'] = 'Sélectionnez pour activer ou désactiver';
$text['description-bridge_enabled']['fr-fr'] = 'Sélectionnez pour activer ou désactiver';
$text['description-bridge_enabled']['he-il'] = '';
$text['description-bridge_enabled']['it-it'] = '';
$text['description-bridge_enabled']['nl-nl'] = 'Kies aktiveer/deactiveer.';
$text['description-bridge_enabled']['pl-pl'] = 'Wybierz czy aktywować lub dezaktywować.';
$text['description-bridge_enabled']['pt-br'] = '';
$text['description-bridge_enabled']['pt-pt'] = '';
$text['description-bridge_enabled']['ro-ro'] = '';
$text['description-bridge_enabled']['ru-ru'] = '';
$text['description-bridge_enabled']['sv-se'] = '';
$text['description-bridge_enabled']['uk-ua'] = '';
$text['label-bridge_destination']['en-us'] = "Destination";
$text['label-bridge_destination']['en-gb'] = "Destination";
$text['label-bridge_destination']['ar-eg'] = "وجهة";
$text['label-bridge_destination']['de-at'] = "Ziel";
$text['label-bridge_destination']['de-ch'] = "Ziel";
$text['label-bridge_destination']['de-de'] = "Ziel";
$text['label-bridge_destination']['el-gr'] = "Προορισμός";
$text['label-bridge_destination']['es-cl'] = "Destino";
$text['label-bridge_destination']['es-mx'] = "Destino";
$text['label-bridge_destination']['fr-ca'] = "Destination";
$text['label-bridge_destination']['fr-fr'] = "Destination";
$text['label-bridge_destination']['he-il'] = "יַעַד";
$text['label-bridge_destination']['it-it'] = "Destinazione";
$text['label-bridge_destination']['ka-ge'] = "დანიშნულების პუნქტი";
$text['label-bridge_destination']['nl-nl'] = "Bestemming";
$text['label-bridge_destination']['pl-pl'] = "Destynacja";
$text['label-bridge_destination']['pt-br'] = "Destino";
$text['label-bridge_destination']['pt-pt'] = "Destino";
$text['label-bridge_destination']['ro-ro'] = "Destinaţie";
$text['label-bridge_destination']['ru-ru'] = "Место назначения";
$text['label-bridge_destination']['sv-se'] = "Destination";
$text['label-bridge_destination']['uk-ua'] = "Пункт призначення";
$text['label-bridge_destination']['tr-tr'] = "Varış noktası";
$text['label-bridge_destination']['zh-cn'] = "目的地";
$text['label-bridge_destination']['ja-jp'] = "行き先";
$text['label-bridge_destination']['ko-kr'] = "목적지";
$text['label-bridge_description']['en-us'] = 'Description';
$text['label-bridge_description']['en-gb'] = 'Description';
$text['label-bridge_description']['ar-eg'] = '';
$text['label-bridge_description']['de-at'] = '';
$text['label-bridge_description']['de-ch'] = '';
$text['label-bridge_description']['de-de'] = '';
$text['label-bridge_description']['es-cl'] = '';
$text['label-bridge_description']['es-mx'] = '';
$text['label-bridge_description']['fr-ca'] = 'La description';
$text['label-bridge_description']['fr-fr'] = 'La description';
$text['label-bridge_description']['he-il'] = '';
$text['label-bridge_description']['it-it'] = '';
$text['label-bridge_description']['nl-nl'] = 'Omschrijving';
$text['label-bridge_description']['pl-pl'] = 'Opis';
$text['label-bridge_description']['pt-br'] = '';
$text['label-bridge_description']['pt-pt'] = '';
$text['label-bridge_description']['ro-ro'] = '';
$text['label-bridge_description']['ru-ru'] = '';
$text['label-bridge_description']['sv-se'] = '';
$text['label-bridge_description']['uk-ua'] = '';
$text['description-bridge_destination']['en-us'] = "Enter the destination.";
$text['description-bridge_destination']['en-gb'] = "Enter the destination.";
$text['description-bridge_destination']['ar-eg'] = "أدخل الوجهة.";
$text['description-bridge_destination']['de-at'] = "Geben Sie das Ziel ein.";
$text['description-bridge_destination']['de-ch'] = "Geben Sie das Ziel ein.";
$text['description-bridge_destination']['de-de'] = "Geben Sie das Ziel ein.";
$text['description-bridge_destination']['el-gr'] = "Εισαγάγετε τον προορισμό.";
$text['description-bridge_destination']['es-cl'] = "Introduce el destino.";
$text['description-bridge_destination']['es-mx'] = "Introduce el destino.";
$text['description-bridge_destination']['fr-ca'] = "Entrer la destination";
$text['description-bridge_destination']['fr-fr'] = "Entrer la destination";
$text['description-bridge_destination']['he-il'] = "הזן את היעד.";
$text['description-bridge_destination']['it-it'] = "Inserisci la destinazione.";
$text['description-bridge_destination']['ka-ge'] = "შეიყვანეთ დანიშნულების პუნქტი";
$text['description-bridge_destination']['nl-nl'] = "Voer de bestemming in.";
$text['description-bridge_destination']['pl-pl'] = "Wprowadź destynację.";
$text['description-bridge_destination']['pt-br'] = "Insira o destino.";
$text['description-bridge_destination']['pt-pt'] = "Insira o destino.";
$text['description-bridge_destination']['ro-ro'] = "Introduceți destinația.";
$text['description-bridge_destination']['ru-ru'] = "Введите пункт назначения.";
$text['description-bridge_destination']['sv-se'] = "Ange destinationen.";
$text['description-bridge_destination']['uk-ua'] = "Введіть пункт призначення.";
$text['description-bridge_destination']['tr-tr'] = "Hedefi girin.";
$text['description-bridge_destination']['zh-cn'] = "输入目的地。";
$text['description-bridge_destination']['ja-jp'] = "目的地を入力します。";
$text['description-bridge_destination']['ko-kr'] = "목적지를 입력하세요.";
$text['description-bridge_description']['en-us'] = 'Enter the description. ';
$text['description-bridge_description']['en-gb'] = 'Enter the description. ';
$text['description-bridge_description']['ar-eg'] = '';
$text['description-bridge_description']['de-at'] = '';
$text['description-bridge_description']['de-ch'] = '';
$text['description-bridge_description']['de-de'] = '';
$text['description-bridge_description']['es-cl'] = '';
$text['description-bridge_description']['es-mx'] = '';
$text['description-bridge_description']['fr-ca'] = 'Entrez la description';
$text['description-bridge_description']['fr-fr'] = 'Entrez la description';
$text['description-bridge_description']['he-il'] = '';
$text['description-bridge_description']['it-it'] = '';
$text['description-bridge_description']['nl-nl'] = 'Voer omschrijving in.';
$text['description-bridge_description']['pl-pl'] = 'Wprowadź opis.';
$text['description-bridge_description']['pt-br'] = '';
$text['description-bridge_description']['pt-pt'] = '';
$text['description-bridge_description']['ro-ro'] = '';
$text['description-bridge_description']['ru-ru'] = '';
$text['description-bridge_description']['sv-se'] = '';
$text['description-bridge_description']['uk-ua'] = '';
$text['label-bridge_enabled']['en-us'] = "Enabled";
$text['label-bridge_enabled']['en-gb'] = "Enabled";
$text['label-bridge_enabled']['ar-eg'] = "ممكن";
$text['label-bridge_enabled']['de-at'] = "Aktiviert";
$text['label-bridge_enabled']['de-ch'] = "Aktiviert";
$text['label-bridge_enabled']['de-de'] = "Aktiviert";
$text['label-bridge_enabled']['el-gr'] = "Ενεργοποιημένος";
$text['label-bridge_enabled']['es-cl'] = "Activada";
$text['label-bridge_enabled']['es-mx'] = "Activada";
$text['label-bridge_enabled']['fr-ca'] = "Activé";
$text['label-bridge_enabled']['fr-fr'] = "Activé";
$text['label-bridge_enabled']['he-il'] = "מופעל";
$text['label-bridge_enabled']['it-it'] = "Abilitato";
$text['label-bridge_enabled']['ka-ge'] = "ჩართულია";
$text['label-bridge_enabled']['nl-nl'] = "Geactiveerd";
$text['label-bridge_enabled']['pl-pl'] = "Aktywny";
$text['label-bridge_enabled']['pt-br'] = "Habilitado";
$text['label-bridge_enabled']['pt-pt'] = "Habilitado";
$text['label-bridge_enabled']['ro-ro'] = "Activat";
$text['label-bridge_enabled']['ru-ru'] = "Включено";
$text['label-bridge_enabled']['sv-se'] = "Aktiverad";
$text['label-bridge_enabled']['uk-ua'] = "Увімкнено";
$text['label-bridge_enabled']['tr-tr'] = "Etkinleştirilmiş";
$text['label-bridge_enabled']['zh-cn'] = "启用";
$text['label-bridge_enabled']['ja-jp'] = "有効";
$text['label-bridge_enabled']['ko-kr'] = "사용";
$text['label-bridge_description']['en-us'] = "Description";
$text['label-bridge_description']['en-gb'] = "Description";
$text['label-bridge_description']['ar-eg'] = "";
$text['label-bridge_description']['de-at'] = "Beschreibung"; //copied from de-de
$text['label-bridge_description']['de-ch'] = "Beschreibung"; //copied from de-de
$text['label-bridge_description']['de-de'] = "Beschreibung";
$text['label-bridge_description']['es-cl'] = "Descripción";
$text['label-bridge_description']['es-mx'] = "Descripción"; //copied from es-cl
$text['label-bridge_description']['fr-ca'] = "Description"; //copied from fr-fr
$text['label-bridge_description']['fr-fr'] = "Description";
$text['label-bridge_description']['he-il'] = "";
$text['label-bridge_description']['it-it'] = "Descrizione";
$text['label-bridge_description']['nl-nl'] = "Omschrijving";
$text['label-bridge_description']['pl-pl'] = "Opis";
$text['label-bridge_description']['pt-br'] = "Descrição";
$text['label-bridge_description']['pt-pt'] = "Descripção";
$text['label-bridge_description']['ro-ro'] = "";
$text['label-bridge_description']['ru-ru'] = "Описание";
$text['label-bridge_description']['sv-se'] = "Beskrivning";
$text['label-bridge_description']['uk-ua'] = "Опис";
$text['label-bridge_description']['tr-tr'] = "ıklama";
$text['description-bridge_enabled']['en-us'] = "Select to enable or disable.";
$text['description-bridge_enabled']['en-gb'] = "Select to enable or disable.";
$text['description-bridge_enabled']['ar-eg'] = "حدد للتمكين أو التعطيل.";
$text['description-bridge_enabled']['de-at'] = "Wählen Sie zum Aktivieren oder Deaktivieren.";
$text['description-bridge_enabled']['de-ch'] = "Wählen Sie zum Aktivieren oder Deaktivieren.";
$text['description-bridge_enabled']['de-de'] = "Wählen Sie zum Aktivieren oder Deaktivieren.";
$text['description-bridge_enabled']['el-gr'] = "Επιλέξτε για να ενεργοποιήσετε ή να απενεργοποιήσετε.";
$text['description-bridge_enabled']['es-cl'] = "Seleccione para habilitar o deshabilitar.";
$text['description-bridge_enabled']['es-mx'] = "Seleccione para habilitar o deshabilitar.";
$text['description-bridge_enabled']['fr-ca'] = "Sélectionnez pour activer ou désactiver";
$text['description-bridge_enabled']['fr-fr'] = "Sélectionnez pour activer ou désactiver";
$text['description-bridge_enabled']['he-il'] = "בחר כדי להפעיל או להשבית.";
$text['description-bridge_enabled']['it-it'] = "Selezionare per abilitare o disabilitare.";
$text['description-bridge_enabled']['ka-ge'] = "მონიშნეთ, რათა ჩართოთ, ან გამორთოთ";
$text['description-bridge_enabled']['nl-nl'] = "Kies aktiveer/deactiveer.";
$text['description-bridge_enabled']['pl-pl'] = "Wybierz czy aktywować lub dezaktywować.";
$text['description-bridge_enabled']['pt-br'] = "Selecione para habilitar ou desabilitar.";
$text['description-bridge_enabled']['pt-pt'] = "Selecione para habilitar ou desabilitar.";
$text['description-bridge_enabled']['ro-ro'] = "Selectați pentru a activa sau dezactiva.";
$text['description-bridge_enabled']['ru-ru'] = "Выберите, чтобы включить или отключить.";
$text['description-bridge_enabled']['sv-se'] = "Välj för att aktivera eller inaktivera.";
$text['description-bridge_enabled']['uk-ua'] = "Виберіть, щоб увімкнути або вимкнути.";
$text['description-bridge_enabled']['tr-tr'] = "Etkinleştirmek veya devre dışı bırakmak için seçin.";
$text['description-bridge_enabled']['zh-cn'] = "选择启用或禁用。";
$text['description-bridge_enabled']['ja-jp'] = "有効または無効を選択します。";
$text['description-bridge_enabled']['ko-kr'] = "활성화 또는 비활성화를 선택합니다.";
$text['label-bridge_description']['en-us'] = "Description";
$text['label-bridge_description']['en-gb'] = "Description";
$text['label-bridge_description']['ar-eg'] = "وصف";
$text['label-bridge_description']['de-at'] = "Beschreibung";
$text['label-bridge_description']['de-ch'] = "Beschreibung";
$text['label-bridge_description']['de-de'] = "Beschreibung";
$text['label-bridge_description']['el-gr'] = "Περιγραφή";
$text['label-bridge_description']['es-cl'] = "Descripción";
$text['label-bridge_description']['es-mx'] = "Descripción";
$text['label-bridge_description']['fr-ca'] = "Description";
$text['label-bridge_description']['fr-fr'] = "Description";
$text['label-bridge_description']['he-il'] = "תיאור";
$text['label-bridge_description']['it-it'] = "Descrizione";
$text['label-bridge_description']['ka-ge'] = "აღწერა";
$text['label-bridge_description']['nl-nl'] = "Omschrijving";
$text['label-bridge_description']['pl-pl'] = "Opis";
$text['label-bridge_description']['pt-br'] = "Descrição";
$text['label-bridge_description']['pt-pt'] = "Descripção";
$text['label-bridge_description']['ro-ro'] = "Descriere";
$text['label-bridge_description']['ru-ru'] = "Описание";
$text['label-bridge_description']['sv-se'] = "Beskrivning";
$text['label-bridge_description']['uk-ua'] = "Опис";
$text['label-bridge_description']['tr-tr'] = "ıklama";
$text['label-bridge_description']['tr-tr'] = "Tanım";
$text['label-bridge_description']['zh-cn'] = "描述";
$text['label-bridge_description']['ja-jp'] = "説明";
$text['label-bridge_description']['ko-kr'] = "설명";
$text['description-bridge_description']['en-us'] = "Enter the description. ";
$text['description-bridge_description']['en-gb'] = "Enter the description. ";
$text['description-bridge_description']['ar-eg'] = "أدخل الوصف.";
$text['description-bridge_description']['de-at'] = "Geben Sie die Beschreibung ein.";
$text['description-bridge_description']['de-ch'] = "Geben Sie die Beschreibung ein.";
$text['description-bridge_description']['de-de'] = "Geben Sie die Beschreibung ein.";
$text['description-bridge_description']['el-gr'] = "Εισαγάγετε την περιγραφή.";
$text['description-bridge_description']['es-cl'] = "Introduce la descripción.";
$text['description-bridge_description']['es-mx'] = "Introduce la descripción.";
$text['description-bridge_description']['fr-ca'] = "Entrez la description";
$text['description-bridge_description']['fr-fr'] = "Entrez la description";
$text['description-bridge_description']['he-il'] = "הזן את התיאור.";
$text['description-bridge_description']['it-it'] = "Inserisci la descrizione.";
$text['description-bridge_description']['ka-ge'] = "შეიყვანეთ აღწერა";
$text['description-bridge_description']['nl-nl'] = "Voer omschrijving in.";
$text['description-bridge_description']['pl-pl'] = "Wprowadź opis.";
$text['description-bridge_description']['pt-br'] = "Digite a descrição.";
$text['description-bridge_description']['pt-pt'] = "Digite a descrição.";
$text['description-bridge_description']['ro-ro'] = "Introduceți descrierea.";
$text['description-bridge_description']['ru-ru'] = "Введите описание.";
$text['description-bridge_description']['sv-se'] = "Ange beskrivningen.";
$text['description-bridge_description']['uk-ua'] = "Введіть опис.";
$text['description-bridge_description']['tr-tr'] = "ıklamayı girin.";
$text['description-bridge_description']['zh-cn'] = "输入说明。";
$text['description-bridge_description']['ja-jp'] = "説明を入力します。";
$text['description-bridge_description']['ko-kr'] = "설명을 입력합니다.";
$text['label-bridge_profile']['en-us'] = "Profile";
$text['label-bridge_profile']['en-gb'] = "Profile";
$text['label-bridge_profile']['ar-eg'] = "موجز";
$text['label-bridge_profile']['de-at'] = "Profil";
$text['label-bridge_profile']['de-ch'] = "Profil";
$text['label-bridge_profile']['de-de'] = "Profil";
$text['label-bridge_profile']['el-gr'] = "Προφίλ";
$text['label-bridge_profile']['es-cl'] = "Perfil";
$text['label-bridge_profile']['es-mx'] = "Perfil";
$text['label-bridge_profile']['fr-ca'] = "Profile";
$text['label-bridge_profile']['fr-fr'] = "Profile";
$text['label-bridge_profile']['he-il'] = "פרופיל";
$text['label-bridge_profile']['it-it'] = "Profilo";
$text['label-bridge_profile']['ka-ge'] = "პროფილი";
$text['label-bridge_profile']['nl-nl'] = "Profiel";
$text['label-bridge_profile']['pl-pl'] = "Profil";
$text['label-bridge_profile']['pt-br'] = "Perfil";
$text['label-bridge_profile']['pt-pt'] = "Perfil";
$text['label-bridge_profile']['ro-ro'] = "Profil";
$text['label-bridge_profile']['ru-ru'] = "Профиль";
$text['label-bridge_profile']['sv-se'] = "Profil";
$text['label-bridge_profile']['uk-ua'] = "Профіль";
$text['label-bridge_profile']['tr-tr'] = "Profil";
$text['label-bridge_profile']['zh-cn'] = "轮廓";
$text['label-bridge_profile']['ja-jp'] = "プロフィール";
$text['label-bridge_profile']['ko-kr'] = "프로필";
$text['description-bridge_profile']['en-us'] = "Enter the profile here.";
$text['description-bridge_profile']['en-gb'] = "Enter the profile here.";
$text['description-bridge_profile']['ar-eg'] = "أدخل ملف التعريف هنا.ا";
$text['description-bridge_profile']['de-at'] = "Definieren Sie die Einstellungen für dieses Profil.";
$text['description-bridge_profile']['de-ch'] = "Definieren Sie die Einstellungen für dieses Profil.";
$text['description-bridge_profile']['de-de'] = "Definieren Sie die Einstellungen für dieses Profil.";
$text['description-bridge_profile']['el-gr'] = "Εισαγάγετε το προφίλ εδώ.";
$text['description-bridge_profile']['es-cl'] = "Ingrese el perfil aquí.";
$text['description-bridge_profile']['es-mx'] = "Ingrese el perfil aquí.";
$text['description-bridge_profile']['fr-ca'] = "Sélectionnez le profil à utiliser pour cette passerelle";
$text['description-bridge_profile']['fr-fr'] = "Sélectionnez le profil à utiliser pour cette passerelle";
$text['description-bridge_profile']['he-il'] = "היכנסו לפרופיל כאן.";
$text['description-bridge_profile']['it-it'] = "Inserire qui il profilo.";
$text['description-bridge_profile']['ka-ge'] = "შეიყვანეთ პროფილი აქ.";
$text['description-bridge_profile']['nl-nl'] = "Voer het profiel hier in.";
$text['description-bridge_profile']['pl-pl'] = "Zdefiniuj ustawienia tego profilu";
$text['description-bridge_profile']['pt-br'] = "Defina as configurações para este perfil";
$text['description-bridge_profile']['pt-pt'] = "Insira o perfil aqui.";
$text['description-bridge_profile']['ro-ro'] = "Introduceți profilul aici.";
$text['description-bridge_profile']['ru-ru'] = "Выберите профиль, используемый для этого шлюза.";
$text['description-bridge_profile']['sv-se'] = "Definiera inställningar för denna profil.";
$text['description-bridge_profile']['uk-ua'] = "Введіть профіль тут.";
$text['description-bridge_profile']['tr-tr'] = "Profili buraya girin.";
$text['description-bridge_profile']['zh-cn'] = "在此处输入个人资料。";
$text['description-bridge_profile']['ja-jp'] = "ここにプロフィールを入力します。";
$text['description-bridge_profile']['ko-kr'] = "여기에 프로필을 입력하세요.";
$text['label-bridge_variables']['en-us'] = "Variables";
$text['label-bridge_variables']['en-gb'] = "Variables";
$text['label-bridge_variables']['ar-eg'] = "المتغيرات";
$text['label-bridge_variables']['de-at'] = "Variablen";
$text['label-bridge_variables']['de-ch'] = "Variablen";
$text['label-bridge_variables']['de-de'] = "Variablen";
$text['label-bridge_variables']['el-gr'] = "Μεταβλητές";
$text['label-bridge_variables']['es-cl'] = "variables";
$text['label-bridge_variables']['es-mx'] = "variables";
$text['label-bridge_variables']['fr-ca'] = "Variables";
$text['label-bridge_variables']['fr-fr'] = "Variables";
$text['label-bridge_variables']['he-il'] = "משתנים";
$text['label-bridge_variables']['it-it'] = "Variabili";
$text['label-bridge_variables']['ka-ge'] = "ცვლადები";
$text['label-bridge_variables']['nl-nl'] = "Variabelen";
$text['label-bridge_variables']['pl-pl'] = "Zmienne";
$text['label-bridge_variables']['pt-br'] = "Variáveis";
$text['label-bridge_variables']['pt-pt'] = "Variáveis";
$text['label-bridge_variables']['ro-ro'] = "Variabile";
$text['label-bridge_variables']['ru-ru'] = "Переменные";
$text['label-bridge_variables']['sv-se'] = "Variabler";
$text['label-bridge_variables']['uk-ua'] = "Змінні";
$text['label-bridge_variables']['tr-tr'] = "Değişkenler";
$text['label-bridge_variables']['zh-cn'] = "变量";
$text['label-bridge_variables']['ja-jp'] = "変数";
$text['label-bridge_variables']['ko-kr'] = "변수";
$text['description-bridge_variables']['en-us'] = "Set a value for the variable.";
$text['description-bridge_variables']['en-gb'] = "Set a value for the variable.";
$text['description-bridge_variables']['ar-eg'] = "قم بتعيين قيمة للمتغير.";
$text['description-bridge_variables']['de-at'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['de-ch'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['de-de'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['el-gr'] = "Ορίστε μια τιμή για τη μεταβλητή.";
$text['description-bridge_variables']['es-cl'] = "Establezca un valor para la variable.";
$text['description-bridge_variables']['es-mx'] = "Establezca un valor para la variable.";
$text['description-bridge_variables']['fr-ca'] = "Définissez une valeur pour la variable.";
$text['description-bridge_variables']['fr-fr'] = "Définissez une valeur pour la variable.";
$text['description-bridge_variables']['he-il'] = "הגדר ערך עבור המשתנה.";
$text['description-bridge_variables']['it-it'] = "Impostare un valore per la variabile.";
$text['description-bridge_variables']['ka-ge'] = "დააყენეთ ცვლადის მნიშვნელობა";
$text['description-bridge_variables']['nl-nl'] = "Stel een waarde in voor de variabele.";
$text['description-bridge_variables']['pl-pl'] = "Ustaw wartość zmiennej.";
$text['description-bridge_variables']['pt-br'] = "Defina um valor para a variável.";
$text['description-bridge_variables']['pt-pt'] = "Defina um valor para a variável.";
$text['description-bridge_variables']['ro-ro'] = "Setați o valoare pentru variabilă.";
$text['description-bridge_variables']['ru-ru'] = "Установите значение для переменной.";
$text['description-bridge_variables']['sv-se'] = "Ställ in ett värde för variabeln.";
$text['description-bridge_variables']['uk-ua'] = "Установіть значення для змінної.";
$text['description-bridge_variables']['tr-tr'] = "Değişken için bir değer belirleyin.";
$text['description-bridge_variables']['zh-cn'] = "为变量设置一个值。";
$text['description-bridge_variables']['ja-jp'] = "変数の値を設定します。";
$text['description-bridge_variables']['ko-kr'] = "변수의 값을 설정합니다.";
$text['label-bridge_gateways']['en-us'] = "Gateways";
$text['label-bridge_gateways']['en-gb'] = "Gateways";
$text['label-bridge_gateways']['ar-eg'] = "البوابات";
$text['label-bridge_gateways']['de-at'] = "Gateways";
$text['label-bridge_gateways']['de-ch'] = "Gateways";
$text['label-bridge_gateways']['de-de'] = "Gateways";
$text['label-bridge_gateways']['el-gr'] = "Πύλες";
$text['label-bridge_gateways']['es-cl'] = "Pasarelas";
$text['label-bridge_gateways']['es-mx'] = "Pasarelas";
$text['label-bridge_gateways']['fr-ca'] = "Passerelles";
$text['label-bridge_gateways']['fr-fr'] = "Passerelles";
$text['label-bridge_gateways']['he-il'] = "שערות";
$text['label-bridge_gateways']['it-it'] = "Gateways";
$text['label-bridge_gateways']['ka-ge'] = "კვანძები";
$text['label-bridge_gateways']['nl-nl'] = "Gateways";
$text['label-bridge_gateways']['pl-pl'] = "Bramy wyjściowe (gateways)";
$text['label-bridge_gateways']['pt-br'] = "Troncos";
$text['label-bridge_gateways']['pt-pt'] = "Gateways";
$text['label-bridge_gateways']['ro-ro'] = "portal";
$text['label-bridge_gateways']['ru-ru'] = "Шлюзы";
$text['label-bridge_gateways']['sv-se'] = "Gateways";
$text['label-bridge_gateways']['uk-ua'] = "Шлюзи";
$text['label-bridge_gateways']['tr-tr'] = "Ağ geçitleri";
$text['label-bridge_gateways']['zh-cn'] = "网关";
$text['label-bridge_gateways']['ja-jp'] = "ゲートウェイ";
$text['label-bridge_gateways']['ko-kr'] = "게이트웨이";
$text['description-bridge_gateways']['en-us'] = "Select the gateway.";
$text['description-bridge_gateways']['en-gb'] = "Select the gateway.";
$text['description-bridge_gateways']['ar-eg'] = "حدد البوابة.";
$text['description-bridge_gateways']['de-at'] = "Wählen Sie das Gateway aus.";
$text['description-bridge_gateways']['de-ch'] = "Wählen Sie das Gateway aus.";
$text['description-bridge_gateways']['de-de'] = "Wählen Sie das Gateway aus.";
$text['description-bridge_gateways']['el-gr'] = "Επιλέξτε την πύλη.";
$text['description-bridge_gateways']['es-cl'] = "Seleccione la puerta de enlace.";
$text['description-bridge_gateways']['es-mx'] = "Seleccione la puerta de enlace.";
$text['description-bridge_gateways']['fr-ca'] = "Sélectionnez la passerelle.";
$text['description-bridge_gateways']['fr-fr'] = "Sélectionnez la passerelle.";
$text['description-bridge_gateways']['he-il'] = "בחר את השער.";
$text['description-bridge_gateways']['it-it'] = "Seleziona il gateway.";
$text['description-bridge_gateways']['ka-ge'] = "აირჩიეთ კვანძი";
$text['description-bridge_gateways']['nl-nl'] = "Selecteer de gateway.";
$text['description-bridge_gateways']['pl-pl'] = "Wybierz bramę.";
$text['description-bridge_gateways']['pt-br'] = "Selecione o gateway.";
$text['description-bridge_gateways']['pt-pt'] = "Selecione o gateway.";
$text['description-bridge_gateways']['ro-ro'] = "Selectați poarta de acces.";
$text['description-bridge_gateways']['ru-ru'] = "Выберите шлюз.";
$text['description-bridge_gateways']['sv-se'] = "Välj gateway.";
$text['description-bridge_gateways']['uk-ua'] = "Виберіть шлюз.";
$text['description-bridge_gateways']['tr-tr'] = "Ağ geçidini seçin.";
$text['description-bridge_gateways']['zh-cn'] = "选择网关。";
$text['description-bridge_gateways']['ja-jp'] = "ゲートウェイを選択します。";
$text['description-bridge_gateways']['ko-kr'] = "게이트웨이를 선택합니다.";
$text['description-bridge_variables']['en-us'] = "Set a value for the variable.";
$text['description-bridge_variables']['en-gb'] = "Set a value for the variable.";
$text['description-bridge_variables']['ar-eg'] = "قم بتعيين قيمة للمتغير.";
$text['description-bridge_variables']['de-at'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['de-ch'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['de-de'] = "Legen Sie einen Wert für die Variable fest.";
$text['description-bridge_variables']['el-gr'] = "Ορίστε μια τιμή για τη μεταβλητή.";
$text['description-bridge_variables']['es-cl'] = "Establezca un valor para la variable.";
$text['description-bridge_variables']['es-mx'] = "Establezca un valor para la variable.";
$text['description-bridge_variables']['fr-ca'] = "Définissez une valeur pour la variable.";
$text['description-bridge_variables']['fr-fr'] = "Définissez une valeur pour la variable.";
$text['description-bridge_variables']['he-il'] = "הגדר ערך עבור המשתנה.";
$text['description-bridge_variables']['it-it'] = "Impostare un valore per la variabile.";
$text['description-bridge_variables']['ka-ge'] = "დააყენეთ მნიშვნელობა ცვლადისთვის.";
$text['description-bridge_variables']['nl-nl'] = "Stel een waarde in voor de variabele.";
$text['description-bridge_variables']['pl-pl'] = "Ustaw wartość zmiennej.";
$text['description-bridge_variables']['pt-br'] = "Defina um valor para a variável.";
$text['description-bridge_variables']['pt-pt'] = "Defina um valor para a variável.";
$text['description-bridge_variables']['ro-ro'] = "Setați o valoare pentru variabilă.";
$text['description-bridge_variables']['ru-ru'] = "Установите значение для переменной.";
$text['description-bridge_variables']['sv-se'] = "Ställ in ett värde för variabeln.";
$text['description-bridge_variables']['uk-ua'] = "Установіть значення для змінної.";
$text['description-bridge_variables']['tr-tr'] = "Değişken için bir değer belirleyin.";
$text['description-bridge_variables']['zh-cn'] = "为变量设置一个值。";
$text['description-bridge_variables']['ja-jp'] = "変数の値を設定します。";
$text['description-bridge_variables']['ko-kr'] = "변수의 값을 설정합니다.";
$text['label-destination_number']['en-us'] = "Destination Number";
$text['label-destination_number']['en-gb'] = "Destination Number";
$text['label-destination_number']['ar-eg'] = "رقم الوجهة";
$text['label-destination_number']['de-at'] = "Zielnummer";
$text['label-destination_number']['de-ch'] = "Zielnummer";
$text['label-destination_number']['de-de'] = "Zielnummer";
$text['label-destination_number']['el-gr'] = "Αριθμός προορισμού";
$text['label-destination_number']['es-cl'] = "Número de destino";
$text['label-destination_number']['es-mx'] = "Número de destino";
$text['label-destination_number']['fr-ca'] = "Numéro du destinataire";
$text['label-destination_number']['fr-fr'] = "Numéro du destinataire";
$text['label-destination_number']['he-il'] = "מספר יעד";
$text['label-destination_number']['it-it'] = "Numero di destinazione";
$text['label-destination_number']['ka-ge'] = "დანიშნულების პუნქტის ნომერი";
$text['label-destination_number']['nl-nl'] = "Bestemmings nummer";
$text['label-destination_number']['pl-pl'] = "Numer docelowy";
$text['label-destination_number']['pt-br'] = "Número de destino";
$text['label-destination_number']['pt-pt'] = "Número de destino";
$text['label-destination_number']['ro-ro'] = "Numarul destinatiei";
$text['label-destination_number']['ru-ru'] = "Номер назначения";
$text['label-destination_number']['sv-se'] = "Destinationsnummer";
$text['label-destination_number']['uk-ua'] = "Номер призначення";
$text['label-destination_number']['tr-tr'] = "Hedef numara";
$text['label-destination_number']['zh-cn'] = "目的地号码";
$text['label-destination_number']['ja-jp'] = "宛先番号";
$text['label-destination_number']['ko-kr'] = "대상 번호";
$text['description-destination_number']['en-us'] = "Set the destination number for the action.";
$text['description-destination_number']['en-gb'] = "Set the destination number for the action.";
$text['description-destination_number']['ar-eg'] = "قم بتعيين رقم الوجهة للإجراء.";
$text['description-destination_number']['de-at'] = "Legen Sie die Zielnummer für die Aktion fest.";
$text['description-destination_number']['de-ch'] = "Legen Sie die Zielnummer für die Aktion fest.";
$text['description-destination_number']['de-de'] = "Legen Sie die Zielnummer für die Aktion fest.";
$text['description-destination_number']['el-gr'] = "Ρυθμίστε τον αριθμό προορισμού για τη δράση.";
$text['description-destination_number']['es-cl'] = "Establezca el número de destino de la acción.";
$text['description-destination_number']['es-mx'] = "Establezca el número de destino de la acción.";
$text['description-destination_number']['fr-ca'] = "Définissez le numéro de destination de l'action.";
$text['description-destination_number']['fr-fr'] = "Définissez le numéro de destination de l'action.";
$text['description-destination_number']['he-il'] = "הגדר את מספר היעד לפעולה.";
$text['description-destination_number']['it-it'] = "Imposta il numero di destinazione per l'azione.";
$text['description-destination_number']['ka-ge'] = "დააყენეთ დანიშნულების პუნქტის ნომერი ქმედებისთვის.";
$text['description-destination_number']['nl-nl'] = "Stel het bestemmingsnummer voor de actie in.";
$text['description-destination_number']['pl-pl'] = "Ustaw numer docelowy akcji.";
$text['description-destination_number']['pt-br'] = "Defina o número de destino para a ação.";
$text['description-destination_number']['pt-pt'] = "Defina o número de destino para a ação.";
$text['description-destination_number']['ro-ro'] = "Setați numărul de destinație pentru acțiune.";
$text['description-destination_number']['ru-ru'] = "Установите номер назначения для действия.";
$text['description-destination_number']['sv-se'] = "Ställ in destinationsnumret för åtgärden.";
$text['description-destination_number']['uk-ua'] = "Встановіть номер призначення для дії.";
$text['description-destination_number']['tr-tr'] = "Eylemin hedef numarasını ayarlayın.";
$text['description-destination_number']['zh-cn'] = "设置操作的目标号码。";
$text['description-destination_number']['ja-jp'] = "アクションの宛先番号を設定します。";
$text['description-destination_number']['ko-kr'] = "작업의 대상 번호를 설정합니다.";
?>

View File

@ -1,21 +1,37 @@
<?php
$apps[$x]['menu'][0]['title']['en-us'] = 'Bridges';
$apps[$x]['menu'][0]['title']['en-gb'] = 'Bridges';
$apps[$x]['menu'][0]['title']['es-cl'] = '';
$apps[$x]['menu'][0]['title']['fr-fr'] = '';
$apps[$x]['menu'][0]['title']['fr-ca'] = '';
$apps[$x]['menu'][0]['title']['nl-nl'] = 'Bruggen';
$apps[$x]['menu'][0]['title']['pl'] = 'Mostkowania';
$apps[$x]['menu'][0]['title']['sv-se'] = '';
$apps[$x]['menu'][0]['title']['uk'] = '';
$apps[$x]['menu'][0]['title']['de-at'] = '';
$apps[$x]['menu'][0]['uuid'] = '345f0aad-8321-4a8b-9f08-c4730297660c';
$apps[$x]['menu'][0]['parent_uuid'] = 'fd29e39c-c936-f5fc-8e2b-611681b266b5';
$apps[$x]['menu'][0]['category'] = 'internal';
$apps[$x]['menu'][0]['path'] = '/app/bridges/bridges.php';
$apps[$x]['menu'][0]['groups'][] = 'superadmin';
//$apps[$x]['menu'][0]['groups'][] = 'admin';
//$apps[$x]['menu'][0]['groups'][] = 'user';
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Bridges";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Bridges";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "الجسور";
$apps[$x]['menu'][$y]['title']['de-at'] = "Brücken";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Brücken";
$apps[$x]['menu'][$y]['title']['de-de'] = "Brücken";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Puentes";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Puentes";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Ponts";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Ponts";
$apps[$x]['menu'][$y]['title']['he-il'] = "גשרים";
$apps[$x]['menu'][$y]['title']['it-it'] = "Ponti";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ხიდები";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Bridges";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Mostkowania";
$apps[$x]['menu'][$y]['title']['pt-br'] = "pontes";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "pontes";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Poduri";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Мосты";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Broar";
$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'] = "345f0aad-8321-4a8b-9f08-c4730297660c";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/bridges/bridges.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

View File

@ -17,13 +17,12 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2018 - 2019
Portions created by the Initial Developer are Copyright (C) 2018-2024
the Initial Developer. All Rights Reserved.
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -37,7 +36,7 @@
$text = $language->get();
//action add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$bridge_uuid = $_REQUEST["id"];
$id = $_REQUEST["id"];
@ -46,17 +45,29 @@
$action = "add";
}
//set the defaults
$bridge_uuid = '';
$bridge_name = '';
$bridge_destination = '';
$bridge_enabled = '';
$bridge_description = '';
//get http post variables and set them to php variables
if (is_array($_POST)) {
if (!empty($_POST)) {
$bridge_uuid = $_POST["bridge_uuid"];
$bridge_name = $_POST["bridge_name"];
$bridge_action = $_POST["bridge_action"];
$bridge_profile = $_POST["bridge_profile"];
$bridge_variables = $_POST["bridge_variables"];
$bridge_gateways = $_POST["bridge_gateways"];
$destination_number = $_POST["destination_number"];
$bridge_destination = $_POST["bridge_destination"];
$bridge_enabled = $_POST["bridge_enabled"];
$bridge_enabled = $_POST["bridge_enabled"] ?? 'false';
$bridge_description = $_POST["bridge_description"];
}
//process the user data and save it to the database
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//delete the bridge
if (permission_exists('bridge_delete')) {
@ -88,10 +99,10 @@
//check for all required data
$msg = '';
if (strlen($bridge_name) == 0) { $msg .= $text['message-required']." ".$text['label-bridge_name']."<br>\n"; }
if (strlen($bridge_destination) == 0) { $msg .= $text['message-required']." ".$text['label-bridge_destination']."<br>\n"; }
if (strlen($bridge_enabled) == 0) { $msg .= $text['message-required']." ".$text['label-bridge_enabled']."<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (empty($bridge_name)) { $msg .= $text['message-required']." ".$text['label-bridge_name']."<br>\n"; }
//if (empty($bridge_destination)) { $msg .= $text['message-required']." ".$text['label-bridge_destination']."<br>\n"; }
if (empty($bridge_enabled)) { $msg .= $text['message-required']." ".$text['label-bridge_enabled']."<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -104,11 +115,49 @@
return;
}
//add the bridge_uuid
if (strlen($bridge_uuid) == 0) {
//add the bridge_uuid
if (empty($bridge_uuid)) {
$bridge_uuid = uuid();
}
//build the bridge statement for action user
if ($bridge_action == 'user' || $bridge_action == 'loopback') {
$bridge_destination = $bridge_action.'/'.$destination_number;
}
//build the bridge statement for gateway, or profiles - build the bridge statement
if ($bridge_action == 'gateway' || $bridge_action == 'profile') {
//create the main bridge statement
$bridge_base = '';
if (!empty($bridge_gateways)) {
foreach($bridge_gateways as $gateway) {
if (!empty($gateway)) {
$gateway_array = explode(':', $gateway);
$bridge_base .= ',sofia/gateway/'.$gateway_array[0].'/'.$destination_number;
}
}
if (!empty($bridge_base)) {
$bridge_destination = trim($bridge_base, ',');
}
}
if ($bridge_action == 'profile' && empty($bridge_destination)) {
$bridge_destination = 'sofia/'.$bridge_profile.'/'.$destination_number;
}
//add the variables back into the bridge_destination value
if (!empty($bridge_variables)) {
$variables = '';
foreach($bridge_variables as $key => $value) {
if (!empty($value)) {
$variables .= ','.trim($key).'='.trim($value);
}
}
if (!empty($variables)) {
$bridge_destination = '{'.trim($variables, ',').'}'.$bridge_destination;
}
}
}
//prepare the array
$array['bridges'][0]['bridge_uuid'] = $bridge_uuid;
$array['bridges'][0]['domain_uuid'] = $_SESSION["domain_uuid"];
@ -143,14 +192,14 @@
}
//pre-populate the form
if (is_array($_GET) && $_POST["persistformvar"] != "true") {
if (!empty($_GET) && is_array($_GET) && (empty($_POST["persistformvar"]) || $_POST["persistformvar"] != "true")) {
$bridge_uuid = $_GET["id"];
$sql = "select * from v_bridges ";
$sql .= "where bridge_uuid = :bridge_uuid ";
$parameters['bridge_uuid'] = $bridge_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && sizeof($row) != 0) {
$row = $database->select($sql, $parameters ?? null, 'row');
if (!empty($row)) {
$bridge_name = $row["bridge_name"];
$bridge_destination = $row["bridge_destination"];
$bridge_enabled = $row["bridge_enabled"];
@ -159,6 +208,158 @@
unset($sql, $parameters, $row);
}
//build the bridge_actions array from the session actions
$i = 0;
foreach($_SESSION['bridge']['action'] as $variable) {
$bridge_actions[$i]['action'] = $variable;
$bridge_actions[$i]['label'] = ucwords($variable);
$i++;
}
//initialize the bridge_variables array from session bridge variables
$session_variables = []; $i = 0;
if (!empty($_SESSION['bridge']['variable'])) {
foreach($_SESSION['bridge']['variable'] as $variable) {
if (!empty($variable)) {
$variable = explode("=", $variable);
$session_variables[$i]['name'] = $variable[0];
$session_variables[$i]['value'] = $variable[1] ?? '';
$session_variables[$i]['label'] = ucwords(str_replace('_', ' ', $variable[0]));
$session_variables[$i]['label'] = str_replace('Effective Caller Id', 'Caller ID', $session_variables[$i]['label']);
$i++;
}
}
}
//get the bridge variables from the database bridge_destination value
$database_variables = []; $x = 0;
if (!empty($bridge_destination)) {
//get the variables from inside the { and } brackets
preg_match('/^\{([^}]+)\}/', $bridge_destination, $matches);
if (!empty($matches) && is_array($matches) && @sizeof($matches) != 0) {
//create a variables array from the comma delimitted string
$variables = explode(",", $matches[1]);
//strip the variables from the $bridge_destination variable
$bridge_destination = str_replace("{$matches[0]}", '', $bridge_destination);
}
//build a bridge variables data set
$x = 0;
if (!empty($variables) && is_array($variables)) {
foreach($variables as $variable) {
$pairs = explode("=", $variable);
$database_variables[$x]['name'] = $pairs[0];
$database_variables[$x]['value'] = $pairs[1];
$database_variables[$x]['label'] = ucwords(str_replace('_', ' ', $pairs[0]));
$database_variables[$x]['label'] = str_replace('Effective Caller Id', 'Caller ID', $database_variables[$x]['label']);
$x++;
}
}
}
//get the bridge_action from the bridge_destination
if (!empty($bridge_destination)) {
if (substr($bridge_destination, 0, 1) == '{') {
$bridge_parts = explode('}', $bridge_destination);
//get the variables from inside the { and } brackets
preg_match('/^\{([^}]+)\}/', $bridge_destination, $matches);
//strip the variables from the $bridge_destination variable
$bridge_destination = str_replace("{$matches[0]}", '', $bridge_destination);
}
$bridge_array = explode("/", $bridge_destination);
if ($bridge_array[0] == 'sofia') {
if ($bridge_array[1] == 'gateway') {
$bridge_action = 'gateway';
}
else {
$bridge_action = 'profile';
$bridge_profile = $bridge_array[1];
$destination_number = $bridge_array[2];
}
}
elseif ($bridge_array[0] == 'user') {
$bridge_action = 'user';
$destination_number = $bridge_array[1];
}
elseif ($bridge_array[0] == 'loopback') {
$bridge_action = 'loopback';
$destination_number = $bridge_array[1];
}
}
//merge the session and database bridge arrays together
$bridge_variables = $session_variables;
foreach($database_variables as $row) {
$found = false;
$i = 0;
foreach($bridge_variables as $field) {
if ($row['name'] == $field['name']) {
//matching row found
$found = true;
//override session value with the value from the database
if (!empty($row['value'])) {
$bridge_variables[$i]['value'] = $row['value'];
}
}
$i++;
}
if (!$found) {
if (!empty($row['name'])) {
$bridge_variables[] = $row;
}
}
}
//get the gateways
$actions = explode(',', $bridge_destination);
foreach ($actions as $action) {
$action_array = explode('/',$action);
if (!empty($action_array) && is_array($action_array) && !empty($action_array[1]) && $action_array[1] == 'gateway') {
$bridge_gateways[] = $action_array[2];
$destination_number = $action_array[3];
}
}
//get the gateways
$sql = "select * from v_gateways ";
$sql .= "where enabled = 'true' ";
if (permission_exists('outbound_route_any_gateway')) {
$sql .= "order by domain_uuid = :domain_uuid DESC, gateway ";
}
else {
$sql .= "and domain_uuid = :domain_uuid ";
}
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$gateways = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//get the domains
$sql = "select * from v_domains ";
$sql .= "where domain_enabled = 'true' ";
$database = new database;
$domains = $database->select($sql, null, 'all');
unset($sql);
//get the sip profiles
$sql = "select sip_profile_name ";
$sql .= "from v_sip_profiles ";
$sql .= "where sip_profile_enabled = 'true' ";
$sql .= "order by sip_profile_name asc ";
$database = new database;
$sip_profiles = $database->select($sql, null, 'all');
unset($sql);
//set the defaults
if (empty($bridge_enabled)) { $bridge_enabled = 'true'; }
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
@ -167,6 +368,39 @@
$document['title'] = $text['title-bridge'];
require_once "resources/header.php";
//show or hide form elements based on the bridge action
echo "<script type='text/javascript'>\n";
echo " function action_control(action) {\n";
echo " if (action == 'gateway') {\n";
echo " if (document.getElementById('tr_bridge_gateways')) { document.getElementById('tr_bridge_gateways').style.display = ''; }\n";
echo " if (document.getElementById('tr_bridge_profile')) { document.getElementById('tr_bridge_profile').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_variables')) { document.getElementById('tr_bridge_variables').style.display = ''; }\n";
echo " }\n";
echo " else if (action == 'user') {\n";
echo " if (document.getElementById('tr_bridge_gateways')) { document.getElementById('tr_bridge_gateways').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_profile')) { document.getElementById('tr_bridge_profile').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_variables')) { document.getElementById('tr_bridge_variables').style.display = 'none'; }\n";
echo " }\n";
echo " else if (action == 'profile') {\n";
echo " if (document.getElementById('tr_bridge_gateways')) { document.getElementById('tr_bridge_gateways').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_profile')) { document.getElementById('tr_bridge_profile').style.display = ''; }\n";
echo " if (document.getElementById('tr_bridge_variables')) { document.getElementById('tr_bridge_variables').style.display = ''; }\n";
echo " }\n";
echo " else if (action == 'loopback') {\n";
echo " if (document.getElementById('tr_bridge_gateways')) { document.getElementById('tr_bridge_gateways').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_profile')) { document.getElementById('tr_bridge_profile').style.display = 'none'; }\n";
echo " if (document.getElementById('tr_bridge_variables')) { document.getElementById('tr_bridge_variables').style.display = 'none'; }\n";
echo " }\n";
echo " ";
echo " }\n";
echo "\n";
if (!empty($bridge_action)) {
echo " window.onload = function() {\n";
echo " action_control('".$bridge_action."');\n";
echo " };\n";
}
echo "</script>\n";
//show the content
echo "<form name='frm' id='frm' method='post'>\n";
@ -186,6 +420,7 @@
echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'delete','onclick'=>"modal_close();"])]);
}
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -200,35 +435,155 @@
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-bridge_destination']."\n";
echo "<td width='30%' class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-bridge_action']."\n";
echo "</td>\n";
echo "<td class='vtable' style='position: relative;' align='left'>\n";
echo " <input class='formfld' type='text' name='bridge_destination' maxlength='255' value='".escape($bridge_destination)."'>\n";
echo "<td width='70%' class='vtable' style='position: relative;' align='left'>\n";
echo " <select class='formfld' id='bridge_action' name='bridge_action' onchange='action_control(this.options[this.selectedIndex].value);'>\n";
echo " <option value=''></option>\n";
$i = 0;
foreach($bridge_actions as $row) {
echo " <option value='".$row['action']."' ".(!empty($bridge_action) && $bridge_action == $row['action'] ? "selected='selected'" : null).">".$row['label']."</option>\n";
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-bridge_destination']."\n";
echo $text['description-bridge_action']."\n";
echo "</td>\n";
echo "</tr>\n";
if (!empty($bridge_variables)) {
echo "<tr id='tr_bridge_variables'>\n";
echo "<td width='30%' class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-bridge_variables']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
$i = 0;
foreach($bridge_variables as $row) {
if ($i > 0) { echo "<br >\n"; }
echo " <input class='formfld' type='text' name='bridge_variables[".$row['name']."]' placeholder='".$row['label']."' maxlength='255' value='".escape($row['value'])."'>\n";
$i++;
}
echo "<br />\n";
echo $text['description-bridge_variables']."\n";
echo "</td>\n";
echo "</tr>\n";
}
echo "<tr id='tr_bridge_profile'>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-bridge_profile']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='bridge_profile'>\n";
echo " <option value=''></option>\n";
foreach ($sip_profiles as $row) {
if (!empty($bridge_profile) && $bridge_profile == $row["sip_profile_name"]) {
echo " <option value='".$row['sip_profile_name']."' selected='selected'>".escape($row["sip_profile_name"])."</option>\n";
}
else {
echo " <option value='".escape($row["sip_profile_name"])."'>".escape($row["sip_profile_name"])."</option>\n";
}
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-bridge_profile']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr id='tr_bridge_gateways'>\n";
echo "<td width='30%' class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-bridge_gateways']."\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' style='position: relative;' align='left'>\n";
for ($x = 0; $x <= 2; $x++) {
if ($x > 0) { echo "<br />\n"; }
echo "<select name='bridge_gateways[]' id='gateway' class='formfld' ".($onchange ?? '').">\n";
echo "<option value=''></option>\n";
echo "<optgroup label='".$text['label-bridge_gateways']."'>\n";
$previous_domain_uuid = '';
foreach($gateways as $row) {
if (permission_exists('outbound_route_any_gateway')) {
if ($previous_domain_uuid != $row['domain_uuid']) {
$domain_name = '';
foreach($domains as $field) {
if ($row['domain_uuid'] == $field['domain_uuid']) {
$domain_name = $field['domain_name'];
break;
}
}
if (empty($domain_name)) { $domain_name = $text['label-global']; }
echo "</optgroup>";
echo "<optgroup label='&nbsp; &nbsp;".$domain_name."'>\n";
}
if (!empty($bridge_gateways) && is_array($bridge_gateways) && $row['gateway_uuid'] == $bridge_gateways[$x]) {
echo "<option value=\"".escape($row['gateway_uuid']).":".escape($row['gateway'])."\" selected=\"selected\">".escape($row['gateway'])."</option>\n"; //." db:".$row['gateway_uuid']." bg:".$bridge_gateways[$x]
}
else {
echo "<option value=\"".escape($row['gateway_uuid']).":".escape($row['gateway'])."\">".escape($row['gateway'])."</option>\n";
}
}
else {
if (!empty($bridge_gateways) && is_array($bridge_gateways) && $row['gateway_uuid'] == $bridge_gateways[$x]) {
echo "<option value=\"".escape($row['gateway_uuid']).":".escape($row['gateway'])."\" $onchange selected=\"selected\">".escape($row['gateway'])."</option>\n";
}
else {
echo "<option value=\"".escape($row['gateway_uuid']).":".escape($row['gateway'])."\">".escape($row['gateway'])."</option>\n";
}
}
$previous_domain_uuid = $row['domain_uuid'];
}
//echo " </optgroup>\n";
//echo " <optgroup label='".$text['label-add-options']."Options'>\n";
//echo " <option value=\"loopback\">loopback</option>\n";
//echo " <option value=\"freetdm\">freetdm</option>\n";
//echo " <option value=\"xmpp\">xmpp</option>\n";
//echo " </optgroup>\n";
echo "</select>\n";
}
echo "<br />\n";
echo $text['description-bridge_gateways']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-destination_number']."\n";
echo "</td>\n";
echo "<td class='vtable' style='position: relative;' align='left'>\n";
echo " <textarea class='formfld' name='destination_number'>".escape($destination_number ?? '')."</textarea>\n";
echo "<br />\n";
echo $text['description-destination_number']."\n";
echo "</td>\n";
echo "</tr>\n";
//echo "<tr>\n";
//echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
//echo " ".$text['label-bridge_destination']."\n";
//echo "</td>\n";
//echo "<td class='vtable' style='position: relative;' align='left'>\n";
//echo " <textarea class='formfld' name='bridge_destination'>".escape($bridge_destination)."</textarea>\n";
//echo "<br />\n";
//echo $text['description-bridge_destination']."\n";
//echo "</td>\n";
//echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-bridge_enabled']."\n";
echo "</td>\n";
echo "<td class='vtable' style='position: relative;' align='left'>\n";
echo " <select class='formfld' name='bridge_enabled'>\n";
if ($bridge_enabled == "true") {
echo " <option value='true' selected='selected'>".$text['label-true']."</option>\n";
if (substr($_SESSION['theme']['input_toggle_style']['text'], 0, 6) == 'switch') {
echo " <label class='switch'>\n";
echo " <input type='checkbox' id='bridge_enabled' name='bridge_enabled' value='true' ".(!empty($bridge_enabled) && $bridge_enabled == 'true' ? "checked='checked'" : null).">\n";
echo " <span class='slider'></span>\n";
echo " </label>\n";
}
else {
echo " <option value='true'>".$text['label-true']."</option>\n";
echo " <select class='formfld' id='bridge_enabled' name='bridge_enabled'>\n";
echo " <option value='true' ".($bridge_enabled == 'true' ? "selected='selected'" : null).">".$text['option-true']."</option>\n";
echo " <option value='false' ".($bridge_enabled == 'false' ? "selected='selected'" : null).">".$text['option-false']."</option>\n";
echo " </select>\n";
}
if ($bridge_enabled == "false") {
echo " <option value='false' selected='selected'>".$text['label-false']."</option>\n";
}
else {
echo " <option value='false'>".$text['label-false']."</option>\n";
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-bridge_enabled']."\n";
echo "</td>\n";
@ -245,10 +600,11 @@
echo "</td>\n";
echo "</tr>\n";
echo "</table>";
echo "<br /><br />";
echo "</table>\n";
echo "</div>\n";
echo "<br /><br />\n";
if ($action == "update") {
if (!empty($bridge_uuid)) {
echo "<input type='hidden' name='bridge_uuid' value='".escape($bridge_uuid)."'>\n";
}
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
@ -258,4 +614,4 @@
//include the footer
require_once "resources/footer.php";
?>
?>

View File

@ -0,0 +1,440 @@
<?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) 2019-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
if (permission_exists('bridge_import')) {
//access granted
}
else {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//built in str_getcsv requires PHP 5.3 or higher, this function can be used to reproduct the functionality but requirs PHP 5.1.0 or higher
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
$fp = fopen("php://memory", 'r+');
fputs($fp, $input);
rewind($fp);
$data = fgetcsv($fp, null, $delimiter, $enclosure); // $escape only got added in 5.3.0
fclose($fp);
return $data;
}
}
//set the max php execution time
ini_set('max_execution_time', 7200);
//get the http get values and set them as php variables
$action = $_POST["action"] ?? '';
$from_row = $_POST["from_row"] ?? '';
$delimiter = $_POST["data_delimiter"] ?? '';
$enclosure = $_POST["data_enclosure"] ?? '';
//save the data to the csv file
if (isset($_POST['data'])) {
$file = $_SESSION['server']['temp']['dir']."/bridges-".$_SESSION['domain_name'].".csv";
file_put_contents($file, $_POST['data']);
$_SESSION['file'] = $file;
}
//copy the csv file
if (!empty($_FILES['ulfile']['tmp_name']) && is_uploaded_file($_FILES['ulfile']['tmp_name']) && permission_exists('bridge_import')) {
if ($_POST['type'] == 'csv') {
move_uploaded_file($_FILES['ulfile']['tmp_name'], $_SESSION['server']['temp']['dir'].'/'.$_FILES['ulfile']['name']);
$save_msg = "Uploaded file to ".$_SESSION['server']['temp']['dir']."/". htmlentities($_FILES['ulfile']['name']);
//system('chmod -R 744 '.$_SESSION['server']['temp']['dir'].'*');
unset($_POST['txtCommand']);
$file = $_SESSION['server']['temp']['dir'].'/'.$_FILES['ulfile']['name'];
$_SESSION['file'] = $file;
}
}
//get the schema
if (!empty($delimiter)) {
//get the first line
$line = fgets(fopen($_SESSION['file'], 'r'));
$line_fields = explode($delimiter, $line);
//get the schema
$x = 0;
include ("app/bridges/app_config.php");
$i = 0;
foreach ($apps[0]['db'] as $table) {
//get the table name and parent name
if (is_array($table["table"]['name'])) {
$table_name = $table["table"]['name']['text'];
}
else {
$table_name = $table["table"]['name'];
}
$parent_name = $table["table"]['parent'];
//remove the v_ table prefix
if (substr($table_name, 0, 2) == 'v_') {
$table_name = substr($table_name, 2);
}
if (substr($parent_name, 0, 2) == 'v_') {
$parent_name = substr($parent_name, 2);
}
//filter for specific tables and build the schema array
if ($table_name == "bridges") {
$schema[$i]['table'] = $table_name;
$schema[$i]['parent'] = $parent_name;
foreach($table['fields'] as $row) {
$row['deprecated'] = $row['deprecated'] ?? '';
if ($row['deprecated'] !== 'true') {
if (is_array($row['name'])) {
$field_name = $row['name']['text'];
}
else {
$field_name = $row['name'];
}
$schema[$i]['fields'][] = $field_name;
}
}
$i++;
}
}
}
//match the column names to the field names
if (!empty($delimiter) && file_exists($_SESSION['file']) && $action != 'import') {
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include header
$document['title'] = $text['label-bridge_import'];
require_once "resources/header.php";
//form to match the fields to the column names
echo "<form name='frmUpload' method='post' enctype='multipart/form-data'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['label-bridge_import']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'bridges.php']);
echo button::create(['type'=>'submit','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'id'=>'btn_save']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-import']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
//loop through user columns
$x = 0;
foreach ($line_fields as $line_field) {
$line_field = preg_replace('#[^a-zA-Z0-9_]#', '', $line_field);
echo "<tr>\n";
echo " <td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
//echo " ".$text['label-zzz']."\n";
echo $line_field;
echo " </td>\n";
echo " <td width='70%' class='vtable' align='left'>\n";
echo " <select class='formfld' style='' name='fields[$x]'>\n";
echo " <option value=''></option>\n";
foreach($schema as $row) {
echo " <optgroup label='".$row['table']."'>\n";
foreach($row['fields'] as $field) {
$selected = '';
if ($field == $line_field) {
$selected = "selected='selected'";
}
if ($field !== 'domain_uuid') {
echo " <option value='".$row['table'].".".$field."' ".$selected.">".$field."</option>\n";
}
}
echo " </optgroup>\n";
}
echo " </select>\n";
//echo "<br />\n";
//echo $text['description-zzz']."\n";
echo " </td>\n";
echo "</tr>\n";
$x++;
}
echo "</table>\n";
echo "</div>\n";
echo "<br /><br />\n";
echo "<input name='action' type='hidden' value='import'>\n";
echo "<input name='from_row' type='hidden' value='$from_row'>\n";
echo "<input name='data_delimiter' type='hidden' value='$delimiter'>\n";
echo "<input name='data_enclosure' type='hidden' value='$enclosure'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
require_once "resources/footer.php";
//normalize the column names
//$line = strtolower($line);
//$line = str_replace("-", "_", $line);
//$line = str_replace($delimiter."title".$delimiter, $delimiter."contact_title".$delimiter, $line);
//$line = str_replace("firstname", "name_given", $line);
//$line = str_replace("lastname", "name_family", $line);
//$line = str_replace("company", "organization", $line);
//$line = str_replace("company", "contact_email", $line);
//end the script
exit;
}
//get the parent table
function get_parent($schema,$table_name) {
foreach ($schema as $row) {
if ($row['table'] == $table_name) {
return $row['parent'];
}
}
}
//upload the csv
if (file_exists($_SESSION['file'] ?? '') && $action == 'import') {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: extension_imports.php');
exit;
}
//user selected fields
$fields = $_POST['fields'];
//set the domain_uuid
$domain_uuid = $_SESSION['domain_uuid'];
//get the contents of the csv file and convert them into an array
$handle = @fopen($_SESSION['file'], "r");
if ($handle) {
//set the starting identifiers
$row_id = 0;
$row_number = 1;
//loop through the array
while (($line = fgets($handle, 4096)) !== false) {
if ($from_row <= $row_number) {
//format the data
$y = 0;
foreach ($fields as $key => $value) {
//get the line
$result = str_getcsv($line, $delimiter, $enclosure);
//get the table and field name
$field_array = explode(".",$value);
$table_name = $field_array[0];
$field_name = $field_array[1];
//echo "value: $value<br />\n";
//echo "table_name: $table_name<br />\n";
//echo "field_name: $field_name<br />\n";
//get the parent table name
$parent = get_parent($schema, $table_name);
//remove formatting from the phone number
if ($field_name == "phone_number") {
$result[$key] = preg_replace('{\D}', '', $result[$key]);
}
//set the voicemail_local_after_email, voicemail_tutorial, and voicemail_enabled to lower case
if ($field_name == 'voicemail_local_after_email' || $field_name == 'voicemail_tutorial' || $field_name == 'voicemail_enabled') {
$result[$key] = strtolower($result[$key]);
}
//build the data array
if (!empty($table_name)) {
if (empty($parent)) {
$array[$table_name][$row_id]['domain_uuid'] = $domain_uuid;
$array[$table_name][$row_id][$field_name] = $result[$key];
}
else {
$array[$parent][$row_id][$table_name][$y]['domain_uuid'] = $domain_uuid;
$array[$parent][$row_id][$table_name][$y][$field_name] = $result[$key];
}
}
}
//process a chunk of the array
if ($row_id === 1000) {
//save to the data
$database = new database;
$database->app_name = 'bridges';
$database->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
$database->save($array);
//clear the array
unset($array);
//set the row id back to 0
$row_id = 0;
}
} //if ($from_row <= $row_number)
$row_number++;
$row_id++;
} //end while
fclose($handle);
//save to the data
if (!empty($array) && is_array($array)) {
$database = new database;
$database->app_name = 'bridges';
$database->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
$database->save($array);
unset($array);
}
//send the redirect header
header("Location: bridges.php");
exit;
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include the header
$document['title'] = $text['label-bridge_import'];
require_once "resources/header.php";
//show content
echo "<form name='frmUpload' method='post' enctype='multipart/form-data'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['label-bridge_import']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'bridges.php']);
echo button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>$_SESSION['theme']['button_icon_upload'],'id'=>'btn_save']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-import']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table border='0' cellpadding='0' cellspacing='0' width='100%'>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_data']."\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <textarea name='data' id='data' class='formfld' style='width: 100%; min-height: 150px;' wrap='off'></textarea>\n";
echo "<br />\n";
echo $text['description-import_data']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-from_row']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='from_row'>\n";
$i=2;
while($i<=99) {
$selected = ($i == $from_row) ? "selected" : null;
echo " <option value='$i' ".$selected.">$i</option>\n";
$i++;
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-from_row']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_delimiter']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' style='width:40px;' name='data_delimiter'>\n";
echo " <option value=','>,</option>\n";
echo " <option value='|'>|</option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-import_delimiter']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_enclosure']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' style='width:40px;' name='data_enclosure'>\n";
echo " <option value='\"'>\"</option>\n";
echo " <option value=''></option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-import_enclosure']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-import_file_upload']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input name='ulfile' type='file' class='formfld fileinput' id='ulfile'>\n";
echo "<br />\n";
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
echo "</div>\n";
echo "<br><br>";
echo "<input name='type' type='hidden' value='csv'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>";
//include the footer
require_once "resources/footer.php";
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2018 - 2019
Portions created by the Initial Developer are Copyright (C) 2018-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,15 +42,22 @@
$language = new text;
$text = $language->get();
//set additional variables
$search = $_GET["search"] ?? '';
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (is_array($_POST['bridges'])) {
if (!empty($_POST['bridges'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$bridges = $_POST['bridges'];
}
//process the http post data by action
if ($action != '' && is_array($bridges) && @sizeof($bridges) != 0) {
if (!empty($action) && !empty($bridges)) {
switch ($action) {
case 'copy':
if (permission_exists('bridge_add')) {
@ -73,16 +79,16 @@
break;
}
header('Location: bridges.php'.($search != '' ? '?search='.urlencode($search) : null));
header('Location: bridges.php'.(!empty($search) ? '?search='.urlencode($search) : null));
exit;
}
//get order and order by
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//add the search string
if (isset($_GET["search"])) {
if (!empty($search)) {
$search = strtolower($_GET["search"]);
$sql_search = " (";
$sql_search .= " lower(bridge_name) like :search ";
@ -95,7 +101,7 @@
//get the count
$sql = "select count(bridge_uuid) from v_bridges ";
if ($_GET['show'] == "all" && permission_exists('bridge_all')) {
if (!empty($show) && $show == "all" && permission_exists('bridge_all')) {
if (isset($sql_search)) {
$sql .= "where ".$sql_search;
}
@ -108,23 +114,37 @@
$parameters['domain_uuid'] = $domain_uuid;
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = $search ? "&search=".$search : null;
$param = ($_GET['show'] == 'all' && permission_exists('bridge_all')) ? "&show=all" : null;
$page = is_numeric($_GET['page']) ? $_GET['page'] : 0;
$param = !empty($search) ? "&search=".$search : null;
$param = (isset($_GET['show']) && $_GET['show'] == 'all' && permission_exists('bridge_all')) ? "&show=all" : null;
$page = isset($_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;
//get the list
$sql = str_replace('count(bridge_uuid)', '*', $sql);
$sql = "select d.domain_uuid, b.bridge_uuid, d.domain_name, b.bridge_name, b.bridge_destination, bridge_enabled, bridge_description ";
$sql .= "from v_bridges as b, v_domains as d ";
$sql .= "where b.domain_uuid = d.domain_uuid ";
if (!empty($show) && $show == "all" && permission_exists('bridge_all')) {
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
}
}
else {
$sql .= "and (b.domain_uuid = :domain_uuid or b.domain_uuid is null) ";
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
}
$parameters['domain_uuid'] = $domain_uuid;
}
$sql .= order_by($order_by, $order, 'bridge_name', 'asc');
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$bridges = $database->select($sql, $parameters, 'all');
$bridges = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -137,8 +157,11 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-bridges']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['title-bridges']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if (permission_exists('bridge_import')) {
echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'style'=>'margin-right: 15px;','link'=>'bridge_imports.php']);
}
if (permission_exists('bridge_add')) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','link'=>'bridge_edit.php']);
}
@ -153,7 +176,7 @@
}
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('bridge_all')) {
if ($_GET['show'] == 'all') {
if (isset($show) && $show == 'all') {
echo " <input type='hidden' name='show' value='all'>\n";
}
else {
@ -184,6 +207,7 @@
echo $text['title_description-bridge']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\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";
@ -192,26 +216,30 @@
echo "<tr class='list-header'>\n";
if (permission_exists('bridge_add') || permission_exists('bridge_edit') || permission_exists('bridge_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($bridges ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(empty($bridges) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
}
if ($_GET['show'] == 'all' && permission_exists('bridge_all')) {
if (!empty($show) && $show == 'all' && permission_exists('bridge_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order);
}
echo th_order_by('bridge_name', $text['label-bridge_name'], $order_by, $order);
echo th_order_by('bridge_destination', $text['label-bridge_destination'], $order_by, $order);
echo th_order_by('bridge_enabled', $text['label-bridge_enabled'], $order_by, $order, null, "class='center'");
echo " <th class='hide-sm-dn'>".$text['label-bridge_description']."</th>\n";
if (permission_exists('bridge_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('bridge_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($bridges) && @sizeof($bridges) != 0) {
if (!empty($bridges)) {
$x = 0;
foreach ($bridges as $row) {
$list_row_url = '';
if (permission_exists('bridge_edit')) {
$list_row_url = "bridge_edit.php?id=".urlencode($row['bridge_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('bridge_add') || permission_exists('bridge_edit') || permission_exists('bridge_delete')) {
@ -220,8 +248,8 @@
echo " <input type='hidden' name='bridges[$x][uuid]' value='".escape($row['bridge_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == 'all' && permission_exists('bridge_all')) {
echo " <td>".escape($_SESSION['domains'][$row['domain_uuid']]['domain_name'])."</td>\n";
if (!empty($_GET['show']) && $_GET['show'] == 'all' && permission_exists('bridge_all')) {
echo " <td>".escape($row['domain_name'])."</td>\n";
}
echo " <td>\n";
if (permission_exists('bridge_edit')) {
@ -242,7 +270,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['bridge_description'])."</td>\n";
if (permission_exists('bridge_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('bridge_edit') && $list_row_edit_button) {
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";
@ -258,6 +286,7 @@
echo "<div align='center'>".$paging_controls."</div>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
echo "</div>\n";
//include the footer
require_once "resources/footer.php";

View File

@ -25,7 +25,6 @@
*/
//define the bridges class
if (!class_exists('bridges')) {
class bridges {
/**
@ -57,16 +56,6 @@ if (!class_exists('bridges')) {
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* delete records
*/
@ -90,7 +79,7 @@ if (!class_exists('bridges')) {
//build the delete array
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
}
@ -142,7 +131,7 @@ if (!class_exists('bridges')) {
//get current toggle state
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -216,7 +205,7 @@ if (!class_exists('bridges')) {
//get checked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -265,6 +254,3 @@ if (!class_exists('bridges')) {
}
}
}
?>

View File

@ -1,90 +0,0 @@
<?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) 2018
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -5,7 +5,7 @@
$apps[$x]['uuid'] = "9ed63276-e085-4897-839c-4f2e36d92d6c";
$apps[$x]['category'] = "Switch";
$apps[$x]['subcategory'] = "";
$apps[$x]['version'] = "1.0";
$apps[$x]['version'] = "1.1";
$apps[$x]['license'] = "Mozilla Public License 1.1";
$apps[$x]['url'] = "http://www.fusionpbx.com";
$apps[$x]['description']['en-us'] = "A tool to block incoming numbers.";
@ -21,6 +21,7 @@
$apps[$x]['description']['fr-fr'] = "Outil pour bloquer des numéros d'appelant.";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "ხელსაწყო შემომავალი ნომრების დასაბლოკად";
$apps[$x]['description']['nl-nl'] = "Gereedschap om inkommende nummers te blokkeren.";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "Uma ferramenta para bloquear números que entram.";
@ -39,6 +40,14 @@
$apps[$x]['default_settings'][$y]['default_setting_value'] = "50";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Number of recent calls to show.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "47914bd9-e1c0-4e3d-87e0-41f95d58ce98";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_block";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "save_call_detail_record";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "boolean";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Choose whether to save the call detail record when the call is blocked.";
//permission details
$y=0;
@ -65,7 +74,6 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_block_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_block_extension";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
@ -83,6 +91,9 @@
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_block_domain";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "view_call_block";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
@ -166,5 +177,29 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the 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

@ -27,22 +27,20 @@
if ($domains_processed == 1) {
//create a view for call block
$database = new database;
$database->execute("DROP VIEW view_call_block;", null);
$sql = "CREATE VIEW view_call_block AS ( \n";
$sql .= " select c.domain_uuid, call_block_uuid, c.call_block_direction, c.extension_uuid, c.call_block_name, c.call_block_country_code, \n";
$sql .= " c.call_block_number, e.extension, e.number_alias, c.call_block_count, c.call_block_app, c.call_block_data, c.date_added, c.call_block_enabled, c.call_block_description \n";
$sql .= " c.call_block_number, e.extension, e.number_alias, c.call_block_count, c.call_block_app, c.call_block_data, c.date_added, \n";
$sql .= " c.call_block_enabled, c.call_block_description, c.insert_date, c.insert_user, c.update_date, c.update_user \n";
$sql .= " from v_call_block as c \n";
$sql .= " left join v_extensions as e \n";
$sql .= " on c.extension_uuid = e.extension_uuid \n";
$sql .= "); \n";
$database = new database;
$database->execute($sql, null);
unset($sql);
//set call blocks to inbound if no direction defined
$sql = "update v_call_block set call_block_direction = 'inbound' where call_block_direction is null ";
$database = new database;
$database->execute($sql, null);
unset($sql);

File diff suppressed because it is too large Load Diff

View File

@ -5,15 +5,16 @@
$apps[$x]['menu'][$y]['title']['en-gb'] = "Call Block";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "حظر المكالمات";
$apps[$x]['menu'][$y]['title']['de-at'] = "Sperrlisten";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Einloggen";
$apps[$x]['menu'][$y]['title']['de-de'] = "Sperrlisten";
$apps[$x]['menu'][$y]['title']['el-gr'] = "Λίστα απορρίψεων";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Bloqueo de llamadas";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Call Block";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Call Block";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Liste Noire";
$apps[$x]['menu'][$y]['title']['he-il'] = "חסימת מספר";
$apps[$x]['menu'][$y]['title']['it-it'] = "Blocco Chiamate";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ზარების დაბლოკვა";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Oproep blokkade";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Blokowanie rozmów";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Bloqueio de chamadas";
@ -22,12 +23,18 @@
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Черный список";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Blockera Samtal";
$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'] = "29295c90-b1b9-440b-9c7E-c8363c6e8975";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/call_block/call_block.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$apps[$x]['menu'][$y]['groups'][] = "user";
$y++;
?>

View File

@ -17,19 +17,18 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
The original Call Block was written by Gerrit Visser <gerrit308@gmail.com>
The original Call Block was written by Gerrit Visser <gerrit308@gmail.com>
All of it has been rewritten over years.
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -42,15 +41,22 @@
$language = new text;
$text = $language->get();
//set additional variables
$search = $_GET["search"] ?? '';
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (is_array($_POST['call_blocks'])) {
if (!empty($_POST['call_blocks'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$call_blocks = $_POST['call_blocks'];
}
//process the http post data by action
if ($action != '' && is_array($call_blocks) && @sizeof($call_blocks) != 0) {
if (!empty($action) && !empty($call_blocks)) {
switch ($action) {
case 'copy':
if (permission_exists('call_block_add')) {
@ -77,33 +83,38 @@
}
//get variables used to control the order
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$sql_search = " (";
$sql_search .= "lower(call_block_name) like :search ";
$sql_search .= "or call_block_country_code like :search ";
$sql_search .= "or lower(call_block_number) like :search ";
$sql_search .= "or lower(call_block_description) like :search ";
$sql_search .= ") ";
$parameters['search'] = '%'.$search.'%';
if (!empty($_GET["search"])) {
$search = strtolower($_GET["search"]);
}
//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();
}
//prepare to page the results
$sql = "select count(*) from view_call_block ";
$sql .= "where true ";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
if ($show == "all" && permission_exists('call_block_all')) {
//show all records across all domains
}
else {
$sql .= "and (domain_uuid = :domain_uuid) ";
$sql .= "and ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!permission_exists('call_block_all') && is_array($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
if (!permission_exists('call_block_extension') && !empty($_SESSION['user']['extension'])) {
$sql .= "and extension_uuid in (";
$x = 0;
foreach ($_SESSION['user']['extension'] as $field) {
@ -114,37 +125,62 @@
}
$sql .= ") ";
}
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(call_block_name) like :search ";
$sql .= " or lower(call_block_direction) like :search ";
$sql .= " or lower(call_block_number) like :search ";
$sql .= " or lower(call_block_app) like :search ";
$sql .= " or lower(call_block_data) like :search ";
$sql .= " or lower(call_block_description) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
unset($parameters);
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$rows_per_page = (!empty($_SESSION['domain']['paging']['numeric'])) ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".$search;
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
if ($show == "all" && permission_exists('call_block_all')) {
$param .= "&show=all";
}
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
$page = $_GET['page'] ?? '';
if (empty($page)) { $page = 0; $_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;
//get the list
$sql = "select * from view_call_block ";
$sql .= "where true ";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$sql = "select domain_uuid, call_block_uuid, call_block_direction, extension_uuid, call_block_name, ";
$sql .= " call_block_country_code, call_block_number, extension, number_alias, call_block_count, ";
$sql .= " call_block_app, call_block_data, ";
$sql .= " to_char(timezone(:time_zone, insert_date), 'DD Mon YYYY') as date_formatted, \n";
if (date(!empty($_SESSION['domain']['time_format']['text']) == '12h')) {
$sql .= " to_char(timezone(:time_zone, insert_date), 'HH12:MI:SS am') as time_formatted, \n";
}
else {
$sql .= "and (domain_uuid = :domain_uuid) ";
$sql .= " to_char(timezone(:time_zone, insert_date), 'HH24:MI:SS am') as time_formatted, \n";
}
$sql .= " call_block_enabled, call_block_description, insert_date, insert_user, update_date, update_user ";
$sql .= "from view_call_block ";
$sql .= "where true ";
$parameters['time_zone'] = $time_zone;
if ($show == "all" && permission_exists('call_block_all')) {
//$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
//$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
else {
$sql .= "and ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!permission_exists('call_block_all') && is_array($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
if (!permission_exists('call_block_extension') && !empty($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
$sql .= "and extension_uuid in (";
$x = 0;
foreach ($_SESSION['user']['extension'] as $field) {
@ -155,26 +191,42 @@
}
$sql .= ") ";
}
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(call_block_name) like :search ";
$sql .= " or lower(call_block_direction) like :search ";
$sql .= " or lower(call_block_number) like :search ";
$sql .= " or lower(call_block_app) like :search ";
$sql .= " or lower(call_block_data) like :search ";
$sql .= " or lower(call_block_description) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$sql .= order_by($order_by, $order, ['call_block_country_code','call_block_number']);
$sql .= order_by($order_by, $order, ['domain_uuid','call_block_country_code','call_block_number']);
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$result = $database->select($sql, $parameters, 'all');
$result = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//determine if any global
$global_call_blocks = false;
if (permission_exists('call_block_domain') && !empty($result) && is_array($result) && @sizeof($result) != 0) {
foreach ($result as $row) {
if (!is_uuid($row['domain_uuid'])) { $global_call_blocks = true; break; }
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include the header
$document['title'] = $text['title-call-block'];
$document['title'] = $text['title-call_block'];
require_once "resources/header.php";
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-call-block']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['title-call_block']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if (permission_exists('call_block_add')) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','link'=>'call_block_edit.php']);
@ -189,18 +241,18 @@
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('call_forward_all')) {
if ($_GET['show'] == 'all') {
if (permission_exists('call_block_all')) {
if ($show == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
else {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?type='.urlencode($destination_type).'&show=all'.($search != '' ? "&search=".urlencode($search) : null)]);
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?type='.urlencode($destination_type ?? '').'&show=all'.($search != '' ? "&search=".urlencode($search ?? '') : null)]);
}
}
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']);
//echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','link'=>'call_block.php','style'=>($search == '' ? 'display: none;' : null)]);
if ($paging_controls_mini != '') {
if (!empty($paging_controls_mini)) {
echo "<span style='margin-left: 15px;'>".$paging_controls_mini."</span>";
}
echo " </form>\n";
@ -225,16 +277,20 @@
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_block_add') || permission_exists('call_block_edit') || permission_exists('call_block_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($result ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($result) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
if ($_GET['show'] == 'all' && permission_exists('domain_all')) {
if ($show == 'all' && permission_exists('domain_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order);
}
else if (permission_exists('call_block_domain') && $global_call_blocks) {
echo th_order_by('domain_uuid', $text['label-domain'], $order_by, $order, null, "style='width: 1%;' class='center'");
}
echo th_order_by('call_block_direction', $text['label-direction'], $order_by, $order, null, "style='width: 1%;' class='center'");
echo th_order_by('extension', $text['label-extension'], $order_by, $order, null, "class='center'");
echo th_order_by('call_block_name', $text['label-name'], $order_by, $order);
@ -243,18 +299,22 @@
echo th_order_by('call_block_count', $text['label-count'], $order_by, $order, '', "class='center hide-sm-dn'");
echo th_order_by('call_block_action', $text['label-action'], $order_by, $order);
echo th_order_by('call_block_enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('date_added', $text['label-date-added'], $order_by, $order, null, "class='shrink no-wrap'");
echo th_order_by('insert_date', $text['label-date-added'], $order_by, $order, null, "class='shrink no-wrap'");
echo "<th class='hide-md-dn pct-20'>".$text['label-description']."</th>\n";
if (permission_exists('call_block_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_block_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($result)) {
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
foreach ($result as $row) {
$list_row_url = '';
if (permission_exists('call_block_edit')) {
$list_row_url = "call_block_edit.php?id=".urlencode($row['call_block_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_block_add') || permission_exists('call_block_edit') || permission_exists('call_block_delete')) {
@ -263,8 +323,23 @@
echo " <input type='hidden' name='call_blocks[".$x."][uuid]' value='".escape($row['call_block_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == 'all' && permission_exists('domain_all')) {
echo " <td>".escape($_SESSION['domains'][$row['domain_uuid']]['domain_name'])."</td>\n";
if (!empty($show) && $show == 'all' && permission_exists('domain_all')) {
if (!empty($row['domain_uuid']) && is_uuid($row['domain_uuid'])) {
echo " <td>".escape($_SESSION['domains'][$row['domain_uuid']]['domain_name'])."</td>\n";
}
else {
echo " <td>".$text['label-global']."</td>\n";
}
}
else if ($global_call_blocks) {
if (permission_exists('call_block_domain') && !is_uuid($row['domain_uuid'])) {
echo " <td>".$text['label-global'];
}
else {
echo " <td class='overflow'>";
echo escape($_SESSION['domains'][$row['domain_uuid']]['domain_name']);
}
echo "</td>\n";
}
echo " <td class='center'>";
switch ($row['call_block_direction']) {
@ -273,7 +348,7 @@
}
echo " </td>\n";
echo " <td class='center'>";
if (strlen($row['extension']) == 0) {
if (empty($row['extension'])) {
echo $text['label-all'];
}
else {
@ -308,9 +383,9 @@
echo $text['label-'.$row['call_block_enabled']];
}
echo " </td>\n";
echo " <td class='no-wrap'>".date('j M Y', $row['date_added'])." <span class='hide-sm-dn'>".date(($_SESSION['domain']['time_format']['text'] == '12h' ? 'h:i:s a' : 'H:i:s'), $row['date_added'])."</span></td>\n";
echo " <td class='no-wrap'>".$row['date_formatted']." <span class='hide-sm-dn'>".$row['time_formatted']."</span></td>\n";
echo " <td class='description overflow hide-md-dn'>".escape($row['call_block_description'])."</td>\n";
if (permission_exists('call_block_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_block_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -322,6 +397,7 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
@ -333,3 +409,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -27,9 +27,8 @@
Original version of Call Block was written by Gerrit Visser <gerrit308@gmail.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -41,8 +40,17 @@
$language = new text;
$text = $language->get();
//initialize the database object
$database = new database;
//set the defaults
$call_block_name = '';
$call_block_country_code = '';
$call_block_number = '';
$call_block_description = '';
//action add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$call_block_uuid = $_REQUEST["id"];
}
@ -50,26 +58,38 @@
$action = "add";
}
//get order and order by and sanitize the values
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//get http post variables and set them to php variables
if (count($_POST) > 0) {
if (!empty($_POST)) {
//get the variables from the http post
$domain_uuid = permission_exists('call_block_domain') ? $_POST["domain_uuid"] : $_SESSION['domain_uuid'];
$call_block_direction = $_POST["call_block_direction"];
$extension_uuid = $_POST["extension_uuid"];
$call_block_name = $_POST["call_block_name"];
$call_block_country_code = $_POST["call_block_country_code"];
$call_block_number = $_POST["call_block_number"];
$call_block_enabled = $_POST["call_block_enabled"];
$call_block_description = $_POST["call_block_description"];
$call_block_name = $_POST["call_block_name"] ?? null;
$call_block_country_code = $_POST["call_block_country_code"] ?? null;
$call_block_number = $_POST["call_block_number"] ?? null;
$call_block_enabled = $_POST["call_block_enabled"] ?? 'false';
$call_block_description = $_POST["call_block_description"] ?? null;
//get the call block app and data
$action_array = explode(':', $_POST["call_block_action"]);
$call_block_app = $action_array[0];
$call_block_data = $action_array[1];
$call_block_data = $action_array[1] ?? null;
//sanitize the data
$extension_uuid = preg_replace("#[^a-fA-F0-9./]#", "", $extension_uuid);
$call_block_country_code = preg_replace('#[^0-9./]#', '', $call_block_country_code ?? '');
$call_block_number = preg_replace('#[^0-9./]#', '', $call_block_number ?? '');
}
//handle the http post
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//handle action
if ($_POST['action'] != '') {
if (!empty($_POST['action'])) {
switch ($_POST['action']) {
case 'delete':
if (permission_exists('call_block_delete') && is_uuid($call_block_uuid)) {
@ -82,8 +102,8 @@
}
break;
case 'add':
$xml_cdrs = $_POST['xml_cdrs'];
if (permission_exists('call_block_add') && is_array($xml_cdrs) && @sizeof($xml_cdrs) != 0) {
$xml_cdrs = $_POST['xml_cdrs'] ?? null;
if (!empty($xml_cdrs) && permission_exists('call_block_add')) {
$obj = new call_block;
$obj->call_block_direction = $call_block_direction;
$obj->extension_uuid = $extension_uuid;
@ -108,10 +128,10 @@
//check for all required data
$msg = '';
//if (strlen($call_block_name) == 0) { $msg .= $text['label-provide-name']."<br>\n"; }
//if (strlen($call_block_number) == 0) { $msg .= $text['label-provide-number']."<br>\n"; }
if (strlen($call_block_enabled) == 0) { $msg .= $text['label-provide-enabled']."<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
//if (empty($call_block_name)) { $msg .= $text['label-provide-name']."<br>\n"; }
//if (empty($call_block_number)) { $msg .= $text['label-provide-number']."<br>\n"; }
if (empty($call_block_enabled)) { $msg .= $text['label-provide-enabled']."<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -125,28 +145,30 @@
}
//add or update the database
if (is_array($_POST) && sizeof($_POST) != 0 && $_POST["persistformvar"] != "true") {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//ensure call block is enabled in the dialplan
if ($action == "add" || $action == "update") {
$sql = "select dialplan_uuid from v_dialplans where true ";
$sql .= "and domain_uuid = :domain_uuid ";
if (!empty($domain_uuid) && is_uuid($domain_uuid)) {
$sql .= "and domain_uuid = :domain_uuid ";
}
$sql .= "and app_uuid = 'b1b31930-d0ee-4395-a891-04df94599f1f' ";
$sql .= "and dialplan_enabled <> 'true' ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
if (!empty($domain_uuid) && is_uuid($domain_uuid)) {
$parameters['domain_uuid'] = $domain_uuid;
}
$rows = $database->select($sql, $parameters);
if (is_array($rows) && sizeof($rows) != 0) {
if (!empty($rows)) {
foreach ($rows as $index => $row) {
$array['dialplans'][$index]['dialplan_uuid'] = $row['dialplan_uuid'];
$array['dialplans'][$index]['dialplan_enabled'] = 'true';
}
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
$database = new database;
$database->save($array);
unset($array);
@ -155,16 +177,16 @@
}
//if user doesn't have call block all then use the assigned extension_uuid
if (!permission_exists('call_block_all')) {
if (!permission_exists('call_block_extension')) {
$extension_uuid = $_SESSION['user']['extension'][0]['extension_uuid'];
}
//save the data to the database
if ($action == "add") {
$array['call_block'][0]['call_block_uuid'] = uuid();
$array['call_block'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
$array['call_block'][0]['domain_uuid'] = $domain_uuid;
$array['call_block'][0]['call_block_direction'] = $call_block_direction;
if (is_uuid($extension_uuid)) {
if (!empty($extension_uuid) && is_uuid($extension_uuid)) {
$array['call_block'][0]['extension_uuid'] = $extension_uuid;
}
$array['call_block'][0]['call_block_name'] = $call_block_name;
@ -177,11 +199,9 @@
$array['call_block'][0]['date_added'] = time();
$array['call_block'][0]['call_block_description'] = $call_block_description;
$database = new database;
$database->app_name = 'call_block';
$database->app_uuid = '9ed63276-e085-4897-839c-4f2e36d92d6c';
$database->save($array);
$response = $database->message;
unset($array);
message::add($text['label-add-complete']);
@ -189,16 +209,23 @@
return;
}
if ($action == "update") {
$sql = "select c.call_block_country_code, c.call_block_number, d.domain_name ";
$sql .= "from v_call_block as c ";
$sql .= "join v_domains as d on c.domain_uuid = d.domain_uuid ";
$sql .= "where c.domain_uuid = :domain_uuid ";
$sql .= "and c.call_block_uuid = :call_block_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
if (!empty($domain_uuid) && is_uuid($domain_uuid)) {
$sql = "select c.call_block_country_code, c.call_block_number, d.domain_name ";
$sql .= "from v_call_block as c ";
$sql .= "join v_domains as d on c.domain_uuid = d.domain_uuid ";
$sql .= "where c.domain_uuid = :domain_uuid ";
$sql .= "and c.call_block_uuid = :call_block_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
else {
$sql = "select c.call_block_country_code, c.call_block_number, domain_name as 'global' ";
$sql .= "from v_call_block as c ";
$sql .= "where c.domain_uuid is null ";
$sql .= "and c.call_block_uuid = :call_block_uuid ";
}
$parameters['call_block_uuid'] = $call_block_uuid;
$database = new database;
$result = $database->select($sql, $parameters);
if (is_array($result) && sizeof($result) != 0) {
if (!empty($result)) {
//set the domain_name
$domain_name = $result[0]["domain_name"];
@ -209,9 +236,9 @@
unset($sql, $parameters);
$array['call_block'][0]['call_block_uuid'] = $call_block_uuid;
$array['call_block'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
$array['call_block'][0]['domain_uuid'] = $domain_uuid;
$array['call_block'][0]['call_block_direction'] = $call_block_direction;
if (is_uuid($extension_uuid)) {
if (!empty($extension_uuid) && is_uuid($extension_uuid)) {
$array['call_block'][0]['extension_uuid'] = $extension_uuid;
}
$array['call_block'][0]['call_block_name'] = $call_block_name;
@ -223,11 +250,9 @@
$array['call_block'][0]['date_added'] = time();
$array['call_block'][0]['call_block_description'] = $call_block_description;
$database = new database;
$database->app_name = 'call_block';
$database->app_uuid = '9ed63276-e085-4897-839c-4f2e36d92d6c';
$database->save($array);
$response = $database->message;
unset($array);
message::add($text['label-update-complete']);
@ -238,16 +263,21 @@
}
//pre-populate the form
if (count($_GET) > 0 && $_POST["persistformvar"] != "true") {
if (!empty($_GET) && empty($_POST["persistformvar"])) {
$call_block_uuid = $_GET["id"];
$sql = "select * from v_call_block ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$sql .= "and call_block_uuid = :call_block_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['call_block_uuid'] = $call_block_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && sizeof($row) != 0) {
if (!empty($row)) {
$domain_uuid = $row["domain_uuid"];
$call_block_direction = $row["call_block_direction"];
$extension_uuid = $row["extension_uuid"];
$call_block_name = $row["call_block_name"];
@ -261,47 +291,66 @@
unset($sql, $parameters, $row);
}
//set the defaults
if (empty($call_block_enabled)) { $call_block_enabled = 'true'; }
//get the extensions
if (permission_exists('call_block_all') || permission_exists('call_block_extension')) {
$sql = "select extension_uuid, extension, number_alias, user_context, description from v_extensions ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$sql .= "and enabled = 'true' ";
$sql .= "order by extension asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$extensions = $database->select($sql, $parameters);
}
//get the ivr's
if (permission_exists('call_block_all') || permission_exists('call_block_ivr')) {
$sql = "select ivr_menu_uuid,ivr_menu_name, ivr_menu_extension, ivr_menu_description from v_ivr_menus ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
// $sql .= "and enabled = 'true' ";
$sql .= "order by ivr_menu_extension asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$ivrs = $database->select($sql, $parameters);
}
//get the ring groups
if (permission_exists('call_block_all') || permission_exists('call_block_ring_group')) {
$sql = "select ring_group_uuid,ring_group_name, ring_group_extension, ring_group_description from v_ring_groups ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
// $sql .= "and ring_group_enabled = 'true' ";
$sql .= "order by ring_group_extension asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$ring_groups = $database->select($sql, $parameters);
}
//get the voicemails
$sql = "select voicemail_uuid, voicemail_id, voicemail_description ";
$sql .= "from v_voicemails ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$sql .= "and voicemail_enabled = 'true' ";
$sql .= "order by voicemail_id asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$voicemails = $database->select($sql, $parameters);
//create token
@ -309,7 +358,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
$token = $object->create($_SERVER['PHP_SELF']);
//show the header
$document['title'] = $text['title-call-block'];
$document['title'] = $text['title-call_block'];
require_once "resources/header.php";
//show the content
@ -347,6 +396,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -356,7 +406,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='call_block_direction'>\n";
echo " <option value='inbound'>".$text['label-inbound']."</option>\n";
echo " <option value='outbound' ".($call_block_direction == "outbound" ? "selected" : null).">".$text['label-outbound']."</option>\n";
echo " <option value='outbound' ".(!empty($call_block_direction) && $call_block_direction == "outbound" ? "selected" : null).">".$text['label-outbound']."</option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-direction']."\n";
@ -364,7 +414,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "</td>\n";
echo "</tr>\n";
if (permission_exists('call_block_all')) {
if (permission_exists('call_block_extension')) {
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-extension']."\n";
@ -372,9 +422,9 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <select class='formfld' name='extension_uuid'>\n";
echo " <option value=''>".$text['label-all']."</option>\n";
if (is_array($extensions) && sizeof($extensions) != 0) {
if (!empty($extensions)) {
foreach ($extensions as $row) {
$selected = $extension_uuid == $row['extension_uuid'] ? "selected='selected'" : null;
$selected = !empty($extension_uuid) && $extension_uuid == $row['extension_uuid'] ? "selected='selected'" : null;
echo " <option value='".urlencode($row["extension_uuid"])."' ".$selected.">".escape($row['extension'])." ".escape($row['description'])."</option>\n";
}
}
@ -440,9 +490,9 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo " <option value='hold'>".$text['label-hold']."</option>\n";
}
if (permission_exists('call_block_extension')) {
if (is_array($extensions) && sizeof($extensions) != 0) {
if (!empty($extensions)) {
echo " <optgroup label='".$text['label-extension']."'>\n";
foreach ($extensions as &$row) {
foreach ($extensions as $row) {
$selected = ($call_block_app == 'extension' && $call_block_data == $row['extension']) ? "selected='selected'" : null;
echo " <option value='extension:".urlencode($row["extension"])."' ".$selected.">".escape($row['extension'])." ".escape($row['description'])."</option>\n";
}
@ -450,9 +500,9 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
}
if (permission_exists('call_block_ivr')) {
if (is_array($ivrs) && sizeof($ivrs) != 0) {
if (!empty($ivrs)) {
echo " <optgroup label='".$text['label-ivr_menus']."'>\n";
foreach ($ivrs as &$row) {
foreach ($ivrs as $row) {
$selected = ($call_block_app == 'ivr' && $call_block_data == $row['ivr_menu_extension']) ? "selected='selected'" : null;
echo " <option value='ivr:".urlencode($row["ivr_menu_extension"])."' ".$selected.">".escape($row['ivr_menu_name'])." ".escape($row['ivr_menu_extension'])."</option>\n";
}
@ -460,9 +510,9 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
}
if (permission_exists('call_block_ring_group')) {
if (is_array($ring_groups) && sizeof($ring_groups) != 0) {
if (!empty($ring_groups)) {
echo " <optgroup label='".$text['label-ring_groups']."'>\n";
foreach ($ring_groups as &$row) {
foreach ($ring_groups as $row) {
$selected = ($call_block_app == 'ring_group' && $call_block_data == $row['ring_group_extension']) ? "selected='selected'" : null;
echo " <option value='ring_group:".urlencode($row["ring_group_extension"])."' ".$selected.">".escape($row['ring_group_name'])." ".escape($row['ring_group_extension'])."</option>\n";
}
@ -470,9 +520,9 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
}
if (permission_exists('call_block_voicemail')) {
if (is_array($voicemails) && sizeof($voicemails) != 0) {
if (!empty($voicemails)) {
echo " <optgroup label='".$text['label-voicemail']."'>\n";
foreach ($voicemails as &$row) {
foreach ($voicemails as $row) {
$selected = ($call_block_app == 'voicemail' && $call_block_data == $row['voicemail_id']) ? "selected='selected'" : null;
echo " <option value='voicemail:".urlencode($row["voicemail_id"])."' ".$selected.">".escape($row['voicemail_id'])." ".escape($row['voicemail_description'])."</option>\n";
}
@ -488,15 +538,41 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "</td>\n";
echo "</tr>\n";
if (permission_exists('call_block_domain')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-domain']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='domain_uuid'>\n";
echo " <option value=''>".$text['label-global']."</option>\n";
foreach ($_SESSION['domains'] as $row) {
echo " <option value='".escape($row['domain_uuid'])."' ".($row['domain_uuid'] == $domain_uuid ? "selected='selected'" : null).">".escape($row['domain_name'])."</option>\n";
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-domain_name']."\n";
echo "</td>\n";
echo "</tr>\n";
}
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-enabled']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='call_block_enabled'>\n";
echo " <option value='true' ".(($call_block_enabled == "true") ? "selected" : null).">".$text['label-true']."</option>\n";
echo " <option value='false' ".(($call_block_enabled == "false") ? "selected" : null).">".$text['label-false']."</option>\n";
echo " </select>\n";
if (substr($_SESSION['theme']['input_toggle_style']['text'], 0, 6) == 'switch') {
echo " <label class='switch'>\n";
echo " <input type='checkbox' id='call_block_enabled' name='call_block_enabled' value='true' ".($call_block_enabled == 'true' ? "checked='checked'" : null).">\n";
echo " <span class='slider'></span>\n";
echo " </label>\n";
}
else {
echo " <select class='formfld' id='call_block_enabled' name='call_block_enabled'>\n";
echo " <option value='true' ".($call_block_enabled == 'true' ? "selected='selected'" : null).">".$text['option-true']."</option>\n";
echo " <option value='false' ".($call_block_enabled == 'false' ? "selected='selected'" : null).">".$text['option-false']."</option>\n";
echo " </select>\n";
}
echo "<br />\n";
echo $text['description-enable']."\n";
echo "\n";
@ -515,6 +591,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "</tr>\n";
echo "</table>";
echo "</div>\n";
echo "<br><br>";
if ($action == "update") {
@ -525,37 +602,36 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "</form>";
//get recent calls from the db (if not editing an existing call block record)
if (!is_uuid($_REQUEST["id"])) {
if (empty($_REQUEST["id"])) {
//without block all permission, limit to assigned extension(s)
if (!permission_exists('call_block_all') && is_array($_SESSION['user']['extension'])) {
if (!permission_exists('call_block_extension') && !empty($_SESSION['user']['extension'])) {
foreach ($_SESSION['user']['extension'] as $assigned_extension) {
$assigned_extensions[$assigned_extension['extension_uuid']] = $assigned_extension['user'];
}
if (is_array($assigned_extensions) && sizeof($assigned_extensions) != 0) {
if (!empty($assigned_extensions)) {
$x = 0;
foreach ($assigned_extensions as $assigned_extension_uuid => $assigned_extension) {
$sql_where_array[] = "extension_uuid = :extension_uuid_".$x;
$parameters['extension_uuid_'.$x] = $assigned_extension_uuid;
$x++;
}
if (is_array($sql_where_array) && sizeof($sql_where_array) != 0) {
if (!empty($sql_where_array)) {
$sql_where .= "and (".implode(' or ', $sql_where_array).") ";
}
unset($sql_where_array);
}
}
//get recent calls
//get the recent calls
$sql = "select caller_id_name, caller_id_number, caller_destination, start_epoch, direction, hangup_cause, duration, billsec, xml_cdr_uuid ";
$sql .= "from v_xml_cdr where domain_uuid = :domain_uuid ";
$sql .= "and direction <> 'local' ";
$sql .= $sql_where;
$sql .= $sql_where ?? null;
$sql .= "order by start_stamp desc ";
$sql .= limit_offset($_SESSION['call_block']['recent_call_limit']['text']);
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$result = $database->select($sql, $parameters);
$recent_calls = $database->select($sql, $parameters);
unset($sql, $parameters);
echo "<form id='form_list' method='post'>\n";
@ -572,15 +648,15 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo " </div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','id'=>'action_bar_sub_button_back','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'collapse'=>'hide-xs','style'=>'display: none;','link'=>'call_block.php']);
if ($result) {
if ($recent_calls) {
$select_margin = 'margin-left: 15px;';
if (permission_exists('call_block_all')) {
if (permission_exists('call_block_extension')) {
echo "<select class='formfld' style='".$select_margin."' name='extension_uuid'>\n";
echo " <option value='' disabled='disabled'>".$text['label-extension']."</option>\n";
echo " <option value='' selected='selected'>".$text['label-all']."</option>\n";
if (is_array($extensions) && sizeof($extensions) != 0) {
if (!empty($extensions)) {
foreach ($extensions as $row) {
$selected = $extension_uuid == $row['extension_uuid'] ? "selected='selected'" : null;
$selected = !empty($extension_uuid) && $extension_uuid == $row['extension_uuid'] ? "selected='selected'" : null;
echo " <option value='".urlencode($row["extension_uuid"])."' ".$selected.">".escape($row['extension'])." ".escape($row['description'])."</option>\n";
}
}
@ -594,37 +670,39 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if ($result) {
if ($recent_calls) {
echo modal::create(['id'=>'modal-block','type'=>'general','message'=>$text['confirm-block'],'actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_block','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_form_submit('form_list');"])]);
}
echo "<div class='card'>\n";
foreach (['inbound','outbound'] as $direction) {
echo "<table class='list' id='list_".$direction."' ".($direction == 'outbound' ? "style='display: none;'" : null).">\n";
echo "<tr class='list-header'>\n";
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all_".$direction."' name='checkbox_all' onclick=\"list_all_toggle('".$direction."');\" ".($result ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all_".$direction."' name='checkbox_all' onclick=\"list_all_toggle('".$direction."');\" ".(empty($result) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
echo "<th style='width: 1%;'>&nbsp;</th>\n";
echo th_order_by('caller_id_name', $text['label-name'], $order_by, $order);
echo th_order_by('caller_id_number', $text['label-number'], $order_by, $order);
echo th_order_by('caller_id_number', $text['label-destination'], $order_by, $order);
echo th_order_by('caller_destination', $text['label-destination'], $order_by, $order);
echo th_order_by('start_stamp', $text['label-called'], $order_by, $order);
echo th_order_by('duration', $text['label-duration'], $order_by, $order, null, "class='right hide-sm-dn'");
echo "</tr>";
if (is_array($result) && @sizeof($result) != 0) {
foreach ($result as $x => $row) {
if (!empty($recent_calls)) {
foreach ($recent_calls as $x => $row) {
if ($row['direction'] == $direction) {
$list_row_onclick_uncheck = "if (!this.checked) { document.getElementById('checkbox_all_".$direction."').checked = false; }";
$list_row_onclick_toggle = "onclick=\"document.getElementById('checkbox_".$x."').checked = document.getElementById('checkbox_".$x."').checked ? false : true; ".$list_row_onclick_uncheck."\"";
if (strlen($row['caller_id_number']) >= 7) {
if ($_SESSION['domain']['time_format']['text'] == '24h') {
if (!empty($_SESSION['domain']['time_format']['text']) && $_SESSION['domain']['time_format']['text'] == '24h') {
$tmp_start_epoch = date('j M Y', $row['start_epoch'])." <span class='hide-sm-dn'>".date('H:i:s', $row['start_epoch']).'</span>';
}
else {
$tmp_start_epoch = date('j M Y', $row['start_epoch'])." <span class='hide-sm-dn'>".date('h:i:s a', $row['start_epoch']).'</span>';
}
echo "<tr class='list-row row_".$row['direction']."' href='".$list_row_url."'>\n";
echo "<tr class='list-row row_".$row['direction']."' href=''>\n";
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' class='checkbox_".$row['direction']."' name='xml_cdrs[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"".$list_row_onclick_uncheck."\">\n";
echo " <input type='hidden' name='xml_cdrs[$x][uuid]' value='".escape($row['xml_cdr_uuid'])."' />\n";
@ -635,6 +713,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
file_exists($_SERVER["DOCUMENT_ROOT"]."/themes/".$_SESSION['domain']['template']['name']."/images/icon_cdr_outbound_failed.png") &&
file_exists($_SERVER["DOCUMENT_ROOT"]."/themes/".$_SESSION['domain']['template']['name']."/images/icon_cdr_outbound_answered.png")
) {
$title_mod = null;
echo " <td class='center' ".$list_row_onclick_toggle.">";
switch ($row['direction']) {
case "inbound":
@ -676,7 +755,8 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
echo "</table>\n";
}
unset($result);
echo "</div>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
@ -692,7 +772,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo " document.getElementById('list_' + direction_other).style.display='none';\n";
echo " //uncheck all checkboxes\n";
echo " var checkboxes = document.querySelectorAll(\"input[type='checkbox']\")\n";
echo " var checkboxes = document.querySelectorAll(\"input[type='checkbox']:not(#call_block_enabled)\")\n";
echo " if (checkboxes.length > 0) {\n";
echo " for (var i = 0; i < checkboxes.length; ++i) {\n";
echo " checkboxes[i].checked = false;\n";

View File

@ -2,10 +2,7 @@
/**
* call block class
*
* @method null download
*/
if (!class_exists('call_block')) {
class call_block {
/**
@ -19,6 +16,7 @@ if (!class_exists('call_block')) {
private $uuid_prefix;
private $toggle_field;
private $toggle_values;
private $database;
/**
* declare public variables
@ -33,6 +31,9 @@ if (!class_exists('call_block')) {
*/
public function __construct() {
//initialize the database
$this->database = new database;
//assign private variables
$this->app_name = 'call_block';
$this->app_uuid = '9ed63276-e085-4897-839c-4f2e36d92d6c';
@ -45,16 +46,6 @@ if (!class_exists('call_block')) {
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* delete records
*/
@ -78,7 +69,7 @@ if (!class_exists('call_block')) {
//filter out unchecked, build where clause for below
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -86,11 +77,15 @@ if (!class_exists('call_block')) {
//get necessary call block details
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, call_block_number from v_".$this->table." ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "where ( ";
$sql .= " domain_uuid = :domain_uuid ";
if (permission_exists('call_block_domain')) {
$sql .= " or domain_uuid is null ";
}
$sql .= ") ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
$rows = $this->database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$call_block_numbers[$row['uuid']] = $row['call_block_number'];
@ -103,7 +98,9 @@ if (!class_exists('call_block')) {
$x = 0;
foreach ($call_block_numbers as $call_block_uuid => $call_block_number) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $call_block_uuid;
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
if (!permission_exists('call_block_domain')) {
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
}
$x++;
}
@ -111,10 +108,9 @@ if (!class_exists('call_block')) {
if (is_array($array) && @sizeof($array) != 0) {
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
$this->database->app_name = $this->app_name;
$this->database->app_uuid = $this->app_uuid;
$this->database->delete($array);
unset($array);
//clear the cache
@ -154,7 +150,7 @@ if (!class_exists('call_block')) {
//get current toggle state
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -163,8 +159,7 @@ if (!class_exists('call_block')) {
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
$rows = $this->database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$states[$row['uuid']] = $row['toggle'];
@ -186,10 +181,9 @@ if (!class_exists('call_block')) {
if (is_array($array) && @sizeof($array) != 0) {
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
$this->database->app_name = $this->app_name;
$this->database->app_uuid = $this->app_uuid;
$this->database->save($array);
unset($array);
//clear the cache
@ -230,7 +224,7 @@ if (!class_exists('call_block')) {
//get checked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -241,8 +235,7 @@ if (!class_exists('call_block')) {
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
$rows = $this->database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $x => $row) {
@ -262,10 +255,9 @@ if (!class_exists('call_block')) {
if (is_array($array) && @sizeof($array) != 0) {
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
$this->database->app_name = $this->app_name;
$this->database->app_uuid = $this->app_uuid;
$this->database->save($array);
unset($array);
//set message
@ -301,26 +293,73 @@ if (!class_exists('call_block')) {
//filter checked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
//get the caller id info from cdrs
//get the caller id info from call detail records
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select caller_id_name, caller_id_number, caller_destination from v_xml_cdr ";
$sql .= "where xml_cdr_uuid in (".implode(', ', $uuids).") ";
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
unset($sql);
$rows = $this->database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
}
//get the caller id info from call detail records
if (isset($_SESSION['domain_uuid']) && is_uuid($_SESSION['domain_uuid'])) {
//get the destination country code
$sql = "select distinct(destination_prefix), ";
$sql .= "(select count(destination_prefix) from v_destinations where domain_uuid = :domain_uuid and destination_prefix = d.destination_prefix) as count ";
$sql .= "from v_destinations as d ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and destination_prefix <> '' ";
$sql .= "and destination_enabled = 'true' ";
$sql .= "order by count desc limit 1; ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$destination_country_code = $this->database->select($sql, $parameters ?? null, 'column');
unset($sql, $parameters);
//use the the destination country code to set the country code
if (!empty($destination_country_code)) {
$destination_country_code = trim($destination_country_code, "+ ");
$country_code = $destination_country_code;
}
}
//get the users that are assigned to the extension
if (!permission_exists('call_block_extension')) {
$sql = "select extension_uuid from v_extension_users ";
$sql .= "where user_uuid = :user_uuid ";
$parameters['user_uuid'] = $_SESSION['user_uuid'];
$user_extensions = $this->database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
}
//get the country code from default settings
if (!empty($_SESSION['domain']['country_code']['numeric'])) {
$country_code = $_SESSION['domain']['country_code']['numeric'];
}
//loop through records
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $x => $row) {
//remove e.164 and country code
if (substr($row["caller_id_number"],0,1) == "+") {
//format e.164
$call_block_number = str_replace("+".trim($country_code), "", trim($row["caller_id_number"]));
}
elseif (!empty($row["caller_id_number"])) {
//remove the country code if its the first in the string
$call_block_number = ltrim(trim($row["caller_id_number"]), $country_code ?? '');
}
else {
$call_block_number = '';
}
//build insert array
if (permission_exists('call_block_all')) {
if (permission_exists('call_block_extension')) {
$array['call_block'][$x]['call_block_uuid'] = uuid();
$array['call_block'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
$array['call_block'][$x]['call_block_direction'] = $this->call_block_direction;
@ -328,12 +367,8 @@ if (!class_exists('call_block')) {
$array['call_block'][$x]['extension_uuid'] = $this->extension_uuid;
}
if ($this->call_block_direction == 'inbound') {
//remove e.164 and country code
$call_block_number = str_replace("+".trim($_SESSION['domain']['country_code']['numeric']), "", trim($row["caller_id_number"]));
//build the array
$array['call_block'][$x]['call_block_country_code'] = trim($_SESSION['domain']['country_code']['numeric']);
$array['call_block'][$x]['call_block_name'] = trim($row["caller_id_name"]);
$array['call_block'][$x]['call_block_name'] = '';
$array['call_block'][$x]['call_block_country_code'] = trim($country_code ?? '');
$array['call_block'][$x]['call_block_number'] = $call_block_number;
$array['call_block'][$x]['call_block_description'] = trim($row["caller_id_name"]);
}
@ -348,19 +383,16 @@ if (!class_exists('call_block')) {
$x++;
}
else {
if (is_array($_SESSION['user']['extension'])) {
foreach ($_SESSION['user']['extension'] as $field) {
if (is_array($user_extensions)) {
foreach ($user_extensions as $field) {
if (is_uuid($field['extension_uuid'])) {
$array['call_block'][$x]['call_block_uuid'] = uuid();
$array['call_block'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
$array['call_block'][$x]['call_block_direction'] = $this->call_block_direction;
$array['call_block'][$x]['extension_uuid'] = $field['extension_uuid'];
if ($this->call_block_direction == 'inbound') {
//remove e.164 and country code
$call_block_number = str_replace("+".trim($_SESSION['domain']['country_code']['numeric']), "", trim($row["caller_id_number"]));
//build the array
$array['call_block'][$x]['call_block_name'] = trim($row["caller_id_name"]);
$array['call_block'][$x]['call_block_name'] = '';
$array['call_block'][$x]['call_block_country_code'] = trim($country_code ?? '');
$array['call_block'][$x]['call_block_number'] = $call_block_number;
$array['call_block'][$x]['call_block_description'] = trim($row["caller_id_name"]);
}
@ -390,8 +422,7 @@ if (!class_exists('call_block')) {
$sql .= "and app_uuid = '".$this->app_uuid."' ";
$sql .= "and dialplan_enabled <> 'true' ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters);
$rows = $this->database->select($sql, $parameters);
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $x => $row) {
$array['dialplans'][$x]['dialplan_uuid'] = $row['dialplan_uuid'];
@ -401,15 +432,14 @@ if (!class_exists('call_block')) {
unset($rows, $parameters);
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
$response = $database->message;
$this->database->app_name = $this->app_name;
$this->database->app_uuid = $this->app_uuid;
$this->database->save($array);
$response = $this->database->message;
unset($array);
//revoke temporary permissions
@ -426,6 +456,3 @@ if (!class_exists('call_block')) {
} //method
} //class
}
?>

View File

@ -0,0 +1,48 @@
<?php
//call block icon
$array['dashboard'][$x]['dashboard_uuid'] = 'e75f04ff-6d1b-4b39-af0f-e1d1860327c1';
$array['dashboard'][$x]['dashboard_name'] = 'Call Block';
$array['dashboard'][$x]['dashboard_path'] = 'dashboard/icon';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-ban';
$array['dashboard'][$x]['dashboard_icon_color'] = '#EA4C46';
$array['dashboard'][$x]['dashboard_url'] = '/app/call_block/call_block.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
$array['dashboard'][$x]['dashboard_height'] = '';
$array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '1';
$array['dashboard'][$x]['dashboard_details_state'] = 'disabled';
$array['dashboard'][$x]['dashboard_order'] = '50';
$array['dashboard'][$x]['dashboard_enabled'] = 'false';
$array['dashboard'][$x]['dashboard_description'] = '';
$y = 0;
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_group_uuid'] = '7919f503-397c-4f98-a661-a60a738a1b1c';
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_uuid'] = 'e75f04ff-6d1b-4b39-af0f-e1d1860327c1';
$array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'superadmin';
$y++;
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_group_uuid'] = '8f9f1b96-660b-469c-ab02-fbdf65f994f1';
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_uuid'] = 'e75f04ff-6d1b-4b39-af0f-e1d1860327c1';
$array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'admin';
$y++;
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_group_uuid'] = '2f8cb6c2-c4cb-4602-af3e-713196c4965b';
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_uuid'] = 'e75f04ff-6d1b-4b39-af0f-e1d1860327c1';
$array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'user';
$y++;
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -5,7 +5,7 @@
$apps[$x]['uuid'] = "efc11f6b-ed73-9955-4d4d-3a1bed75a056";
$apps[$x]['category'] = "Switch";;
$apps[$x]['subcategory'] = "";
$apps[$x]['version'] = "1.0";
$apps[$x]['version'] = "1.1";
$apps[$x]['license'] = "Mozilla Public License 1.1";
$apps[$x]['url'] = "http://www.fusionpbx.com";
$apps[$x]['description']['en-us'] = "Schedule to immediately make multiple calls to the extension, an IVR Menu, Conference Room, or any other number.";
@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "Programmation de campagnes d'appels vers des extensions, IVR, salles de conferences ou tout autre numéro.";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "დაგეგმეთ მრავალჯერადი ზარების განხორციელება შიდა ნომერთან, IVR მენიუ, საკონფერებციო ოთახი, ან ნებისმერი სხვა ნომერი";
$apps[$x]['description']['nl-nl'] = "Methode om direct meerdere parallele oproepen naar toestellen, IVR menu, Conferentie, of een ander nummer te maken.";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "Programação para imediatamente realizar várias chamadas para uma extensão, um menu IVR, Sala de Conferência ou qualquer outro número.";
@ -44,10 +45,24 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_delete";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_send";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_start_time";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_accountcode";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_timeout";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
@ -64,7 +79,7 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_phone_number_list";
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_phone_numbers";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
@ -72,18 +87,7 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "broadcast_toll_allow";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_delete";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_send";
$apps[$x]['permissions'][$y]['name'] = "call_broadcast_toll_allow";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
@ -92,14 +96,6 @@
$apps[$x]['db'][$y]['table']['name'] = "v_call_broadcasts";
$apps[$x]['db'][$y]['table']['parent'] = "";
$z=0;
$apps[$x]['db'][$y]['fields'][$z]['name']['text'] = "id";
$apps[$x]['db'][$y]['fields'][$z]['name']['deprecated'] = "call_broadcast_id";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "serial";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "integer";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "INT NOT NULL AUTO_INCREMENT";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$apps[$x]['db'][$y]['fields'][$z]['deprecated'] = "true";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name']['text'] = "call_broadcast_uuid";
//$apps[$x]['db'][$y]['fields'][$z]['name']['deprecated'][0] = "call_call_broadcast_uuid";
//$apps[$x]['db'][$y]['fields'][$z]['name']['deprecated'][1] = "broadcast_uuid";
@ -118,11 +114,6 @@
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['field'] = "domain_uuid";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "v_id";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$apps[$x]['db'][$y]['fields'][$z]['deprecated'] = "true";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "broadcast_name";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
@ -191,4 +182,27 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$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'] = "";
?>

File diff suppressed because it is too large Load Diff

View File

@ -3,29 +3,36 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Call Broadcast";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Call Broadcast";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "اتصل بالإذاعة";
$apps[$x]['menu'][$y]['title']['de-at'] = "Rundrufe";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Rundrufe";
$apps[$x]['menu'][$y]['title']['de-de'] = "Rundrufe";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Llamada Broadcast";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Call Broadcast";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Téléphone";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Campagne d'Appels";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "שידור שיחה";
$apps[$x]['menu'][$y]['title']['it-it'] = "Chiamate Multiple";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ზარების მაუწყებლობა";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Omroep";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Rozsyłanie rozmów";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Chamada em broadcast";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Chamada em Broadcast";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Apel Broadcast";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Массовые вызовы";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Samtalsdistribution";
$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'] = "50153bbf-78c5-b49e-7bd9-4b3e4b1134e6";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/call_broadcast/call_broadcast.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$apps[$x]['menu'][$y]['path'] = "/app/call_broadcast/call_broadcast.php";
$y++;
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2020
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,15 +42,22 @@
$language = new text;
$text = $language->get();
//set additional variables
$search = $_GET["search"] ?? '';
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (is_array($_POST['call_broadcasts'])) {
if (!empty($_POST['call_broadcasts'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$call_broadcasts = $_POST['call_broadcasts'];
}
//process the http post data by action
if ($action != '' && is_array($call_broadcasts) && @sizeof($call_broadcasts) != 0) {
if (!empty($action) && is_array($call_broadcasts)) {
switch ($action) {
case 'copy':
if (permission_exists('call_broadcast_add')) {
@ -72,53 +78,75 @@
}
//get the http get variables and set them to php variables
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$sql_search = " (";
$sql_search .= " lower(broadcast_name) like :search ";
$sql_search .= " or lower(broadcast_description) like :search ";
$sql_search .= " or lower(broadcast_caller_id_name) like :search ";
$sql_search .= " or lower(broadcast_caller_id_number) like :search ";
$sql_search .= " or lower(broadcast_phone_numbers) like :search ";
$sql_search .= ") ";
$parameters['search'] = '%'.$search.'%';
if (!empty($search)) {
$search = strtolower($_GET["search"]);
}
//get the count
$sql = "select count(*) from v_call_broadcasts ";
$sql .= "where true ";
if ($_GET['show'] != "all" || !permission_exists('call_broadcast_all')) {
if ($show != "all" || !permission_exists('call_broadcast_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(broadcast_name) like :search ";
$sql .= " or lower(broadcast_description) like :search ";
$sql .= " or lower(broadcast_caller_id_name) like :search ";
$sql .= " or lower(broadcast_caller_id_number) like :search ";
$sql .= " or lower(broadcast_phone_numbers) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//prepare the paging
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".urlencode($search);
if ($_GET['show'] == "all" && permission_exists('call_broadcast_all')) {
$param = '';
$rows_per_page = (!empty($_SESSION['domain']['paging']['numeric'])) ? $_SESSION['domain']['paging']['numeric'] : 50;
if (!empty($search)) {
$param .= "&search=".urlencode($search);
}
if ($show == "all" && permission_exists('call_broadcast_all')) {
$param .= "&show=all";
}
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_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);
$page = $_GET['page'] ?? '';
if (empty($page)) { $page = 0; $_GET['page'] = 0; }
list($paging_controls, $rows_per_page) = paging($num_rows, $param ?? null, $rows_per_page);
list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param ?? null, $rows_per_page, true);
$offset = $rows_per_page * $page;
//get the call broadcasts
$sql = str_replace('count(*)','*', $sql);
$sql .= order_by($order_by, $order);
$sql = "select call_broadcast_uuid, domain_uuid, broadcast_name, ";
$sql .= "broadcast_description, broadcast_start_time, broadcast_timeout, ";
$sql .= "broadcast_concurrent_limit, recording_uuid, broadcast_caller_id_name, ";
$sql .= "broadcast_caller_id_number, broadcast_destination_type, broadcast_phone_numbers, ";
$sql .= "broadcast_avmd, broadcast_destination_data, broadcast_accountcode, broadcast_toll_allow ";
$sql .= "from v_call_broadcasts ";
$sql .= "where true ";
if ($show != "all" || !permission_exists('call_broadcast_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(broadcast_name) like :search ";
$sql .= " or lower(broadcast_description) like :search ";
$sql .= " or lower(broadcast_caller_id_name) like :search ";
$sql .= " or lower(broadcast_caller_id_number) like :search ";
$sql .= " or lower(broadcast_phone_numbers) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
}
$sql .= order_by($order_by, $order, 'broadcast_name', 'asc');
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$result = $database->select($sql, $parameters, 'all');
$result = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -131,7 +159,7 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-call_broadcast']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['title-call_broadcast']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if (permission_exists('call_broadcast_add')) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','link'=>'call_broadcast_edit.php']);
@ -144,11 +172,11 @@
}
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('call_broadcast_all')) {
if ($_GET['show'] == 'all') {
if ($show == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
else {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?type='.urlencode($destination_type).'&show=all'.($search != '' ? "&search=".urlencode($search) : null)]);
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?type='.urlencode($destination_type ?? '').'&show=all'.(!empty($search) ? "&search=".urlencode($search ?? '') : null)]);
}
}
echo "<input type='text' class='txt list-search' name='search' id='search' value=\"".escape($search)."\" placeholder=\"".$text['label-search']."\" onkeydown=''>";
@ -176,29 +204,35 @@
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_broadcast_add') || permission_exists('call_broadcast_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($result ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($result) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_broadcast_all')) {
if ($show == "all" && permission_exists('call_broadcast_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, $param, "class='shrink'");
}
echo th_order_by('broadcast_name', $text['label-name'], $order_by, $order);
echo th_order_by('broadcast_concurrent_limit', $text['label-concurrent-limit'], $order_by, $order);
echo th_order_by('broadcast_start_time', $text['label-start_time'], $order_by, $order);
echo th_order_by('broadcast_description', $text['label-description'], $order_by, $order);
if (permission_exists('call_broadcast_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_broadcast_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($result) && @sizeof($result) != 0) {
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_broadcast_edit')) {
$list_row_url = "call_broadcast_edit.php?id=".urlencode($row['call_broadcast_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_broadcast_add') || permission_exists('call_broadcast_delete')) {
@ -207,8 +241,8 @@
echo " <input type='hidden' name='call_broadcasts[$x][uuid]' value='".escape($row['call_broadcast_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_broadcast_all')) {
if (strlen($_SESSION['domains'][$row['domain_uuid']]['domain_name']) > 0) {
if ($show == "all" && permission_exists('call_broadcast_all')) {
if (!empty($_SESSION['domains'][$row['domain_uuid']]['domain_name'])) {
$domain = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
}
else {
@ -218,15 +252,21 @@
}
echo " <td>";
if (permission_exists('call_broadcast_edit')) {
echo "<a href='".$list_row_url."'>".escape($row['broadcast_name'])."</a>";
echo "<a href='".$list_row_url."'>".escape($row['broadcast_name'] ?? '')."</a>";
}
else {
echo escape($row['broadcast_name']);
}
echo " </td>\n";
echo " <td>".escape($row['broadcast_concurrent_limit'])."</td>\n";
//determine start date and time
$broadcast_start_reference = !empty($row['update_date']) ?: !empty($row['insert_date']);
if ($row['broadcast_start_time'] && $broadcast_start_reference) {
$broadcast_start_time = date('Y-m-d H:i', strtotime($broadcast_start_reference) + $row['broadcast_start_time']);
}
echo " <td>".escape($broadcast_start_time ?? '')."</td>\n";
echo " <td class='description overflow hide-xs'>".escape($row['broadcast_description'])."</td>\n";
if (permission_exists('call_broadcast_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_broadcast_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -238,6 +278,7 @@
unset($result);
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
@ -249,3 +290,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -44,7 +43,7 @@
$text = $language->get();
//set the action with add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$call_broadcast_uuid = $_REQUEST["id"];
}
@ -52,6 +51,18 @@
$action = "add";
}
//set the defaults
$broadcast_name = '';
$broadcast_start_time = '';
$broadcast_timeout = '';
$broadcast_concurrent_limit = '';
$broadcast_caller_id_name = '';
$broadcast_caller_id_number = '';
$broadcast_accountcode = '';
$broadcast_destination_data = '';
$broadcast_description = '';
$broadcast_toll_allow = '';
//function to Upload CSV/TXT file
function upload_file($sql, $broadcast_phone_numbers) {
$upload_csv = $sql = '';
@ -69,7 +80,7 @@
$separator = $getData[0];
$separator .= (isset($getData[1]) && $getData[1] != '')? '|'.$getData[1] : '';
$separator .= (isset($getData[2]) && $getData[2] != '')? ','.$getData[2] : '';
$separator .= '\n';
$separator .= PHP_EOL;
$upload_csv .= $separator;
}
fclose($file);
@ -91,14 +102,14 @@
}
//get the http post variables and set them to php variables
if (count($_POST)>0) {
if (!empty($_POST)) {
$broadcast_name = $_POST["broadcast_name"];
$broadcast_start_time = $_POST["broadcast_start_time"];
$broadcast_timeout = $_POST["broadcast_timeout"];
$broadcast_concurrent_limit = $_POST["broadcast_concurrent_limit"];
$broadcast_caller_id_name = $_POST["broadcast_caller_id_name"];
$broadcast_caller_id_number = $_POST["broadcast_caller_id_number"];
$broadcast_destination_type = $_POST["broadcast_destination_type"];
//$broadcast_destination_type = $_POST["broadcast_destination_type"];
$broadcast_phone_numbers = $_POST["broadcast_phone_numbers"];
$broadcast_avmd = $_POST["broadcast_avmd"];
$broadcast_destination_data = $_POST["broadcast_destination_data"];
@ -125,11 +136,11 @@
}
}
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//delete the call broadcast
if (permission_exists('call_broadcast_delete')) {
if ($_POST['action'] == 'delete' && is_uuid($call_broadcast_uuid)) {
if (!empty($_POST['action']) && $_POST['action'] == 'delete' && is_uuid($call_broadcast_uuid)) {
//prepare
$call_broadcasts[0]['checked'] = 'true';
$call_broadcasts[0]['uuid'] = $call_broadcast_uuid;
@ -156,18 +167,18 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
}
//check for all required data
if (strlen($broadcast_name) == 0) { $msg .= "".$text['confirm-name']."<br>\n"; }
//if (strlen($broadcast_description) == 0) { $msg .= "Please provide: Description<br>\n"; }
//if (strlen($broadcast_timeout) == 0) { $msg .= "Please provide: Timeout<br>\n"; }
//if (strlen($broadcast_concurrent_limit) == 0) { $msg .= "Please provide: Concurrent Limit<br>\n"; }
//if (strlen($recording_uuid) == 0) { $msg .= "Please provide: Recording<br>\n"; }
//if (strlen($broadcast_caller_id_name) == 0) { $msg .= "Please provide: Caller ID Name<br>\n"; }
//if (strlen($broadcast_caller_id_number) == 0) { $msg .= "Please provide: Caller ID Number<br>\n"; }
//if (strlen($broadcast_destination_type) == 0) { $msg .= "Please provide: Type<br>\n"; }
//if (strlen($broadcast_phone_numbers) == 0) { $msg .= "Please provide: Phone Number List<br>\n"; }
//if (strlen($broadcast_avmd) == 0) { $msg .= "Please provide: Voicemail Detection<br>\n"; }
//if (strlen($broadcast_destination_data) == 0) { $msg .= "Please provide: Destination<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (empty($broadcast_name)) { $msg .= "".$text['confirm-name']."<br>\n"; }
//if (empty($broadcast_description)) { $msg .= "Please provide: Description<br>\n"; }
//if (empty($broadcast_timeout)) { $msg .= "Please provide: Timeout<br>\n"; }
//if (empty($broadcast_concurrent_limit)) { $msg .= "Please provide: Concurrent Limit<br>\n"; }
//if (empty($recording_uuid)) { $msg .= "Please provide: Recording<br>\n"; }
//if (empty($broadcast_caller_id_name)) { $msg .= "Please provide: Caller ID Name<br>\n"; }
//if (empty($broadcast_caller_id_number)) { $msg .= "Please provide: Caller ID Number<br>\n"; }
//if (empty($broadcast_destination_type)) { $msg .= "Please provide: Type<br>\n"; }
//if (empty($broadcast_phone_numbers)) { $msg .= "Please provide: Phone Number List<br>\n"; }
//if (empty($broadcast_avmd)) { $msg .= "Please provide: Voicemail Detection<br>\n"; }
//if (empty($broadcast_destination_data)) { $msg .= "Please provide: Destination<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -181,7 +192,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
}
//add or update the database
if ($_POST["persistformvar"] != "true") {
if (empty($_POST["persistformvar"])) {
//prep insert
if ($action == "add" && permission_exists('call_broadcast_add')) {
@ -209,10 +220,10 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
}
//execute
if (is_array($array) && @sizeof($array) != 0) {
if (!empty($array)) {
//add file selection and download sample
$file_res = upload_file($sql, $broadcast_phone_numbers);
$file_res = upload_file($sql ?? '', $broadcast_phone_numbers);
if ($file_res['code'] != true) {
$_SESSION["message_mood"] = "negative";
$_SESSION["message"] = $text['file-error'];
@ -221,21 +232,39 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
}
$broadcast_phone_numbers = $file_res['sql'];
//common array items
//build the database array
$array['call_broadcasts'][0]['domain_uuid'] = $domain_uuid;
$array['call_broadcasts'][0]['broadcast_name'] = $broadcast_name;
$array['call_broadcasts'][0]['broadcast_start_time'] = $broadcast_start_time;
$array['call_broadcasts'][0]['broadcast_timeout'] = strlen($broadcast_timeout) != 0 ? $broadcast_timeout : null;
$array['call_broadcasts'][0]['broadcast_concurrent_limit'] = strlen($broadcast_concurrent_limit) != 0 ? $broadcast_concurrent_limit : null;
$array['call_broadcasts'][0]['broadcast_caller_id_name'] = $broadcast_caller_id_name;
$array['call_broadcasts'][0]['broadcast_caller_id_number'] = $broadcast_caller_id_number;
$array['call_broadcasts'][0]['broadcast_destination_type'] = $broadcast_destination_type;
$array['call_broadcasts'][0]['broadcast_phone_numbers'] = $broadcast_phone_numbers;
$array['call_broadcasts'][0]['broadcast_avmd'] = $broadcast_avmd;
$array['call_broadcasts'][0]['broadcast_destination_data'] = $broadcast_destination_data;
$array['call_broadcasts'][0]['broadcast_accountcode'] = $broadcast_accountcode;
if (permission_exists('call_broadcast_start_time')) {
$array['call_broadcasts'][0]['broadcast_start_time'] = strtotime($broadcast_start_time) - strtotime('now') >= 0 ? strtotime($broadcast_start_time) - strtotime('now') : null;
}
if (permission_exists('call_broadcast_accountcode')) {
$array['call_broadcasts'][0]['broadcast_accountcode'] = $broadcast_accountcode;
}
if (permission_exists('call_broadcast_timeout')) {
$array['call_broadcasts'][0]['broadcast_timeout'] = strlen($broadcast_timeout) != 0 ? $broadcast_timeout : null;
}
if (permission_exists('call_broadcast_concurrent_limit')) {
$array['call_broadcasts'][0]['broadcast_concurrent_limit'] = strlen($broadcast_concurrent_limit) != 0 ? $broadcast_concurrent_limit : null;
}
if (permission_exists("call_broadcast_caller_id")) {
$array['call_broadcasts'][0]['broadcast_caller_id_name'] = $broadcast_caller_id_name;
$array['call_broadcasts'][0]['broadcast_caller_id_number'] = $broadcast_caller_id_number;
}
if (permission_exists('call_broadcast_destination_number')) {
$array['call_broadcasts'][0]['broadcast_destination_data'] = $broadcast_destination_data;
}
//$array['call_broadcasts'][0]['broadcast_destination_type'] = $broadcast_destination_type;
if (permission_exists('call_broadcast_phone_numbers')) {
$array['call_broadcasts'][0]['broadcast_phone_numbers'] = $broadcast_phone_numbers;
}
if (permission_exists('call_broadcast_voicemail_detection')) { //broadcast_avmd
$array['call_broadcasts'][0]['broadcast_avmd'] = $broadcast_avmd;
}
if (permission_exists('call_broadcast_toll_allow')) {
$array['call_broadcasts'][0]['broadcast_toll_allow'] = $broadcast_toll_allow;
}
$array['call_broadcasts'][0]['broadcast_description'] = $broadcast_description;
$array['call_broadcasts'][0]['broadcast_toll_allow'] = $broadcast_toll_allow;
//execute
$database = new database;
@ -254,7 +283,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
}
//pre-populate the form
if (count($_GET) > 0 && $_POST["persistformvar"] != "true") {
if (!empty($_GET) && empty($_POST["persistformvar"])) {
$call_broadcast_uuid = $_GET["id"];
$sql = "select * from v_call_broadcasts ";
$sql .= "where domain_uuid = :domain_uuid ";
@ -263,20 +292,29 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
$parameters['call_broadcast_uuid'] = $call_broadcast_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
if (!empty($row)) {
$broadcast_name = $row["broadcast_name"];
$broadcast_start_time = $row["broadcast_start_time"];
$broadcast_timeout = $row["broadcast_timeout"];
$broadcast_concurrent_limit = $row["broadcast_concurrent_limit"];
$broadcast_caller_id_name = $row["broadcast_caller_id_name"];
$broadcast_caller_id_number = $row["broadcast_caller_id_number"];
$broadcast_destination_type = $row["broadcast_destination_type"];
//$broadcast_destination_type = $row["broadcast_destination_type"];
$broadcast_phone_numbers = $row["broadcast_phone_numbers"];
$broadcast_avmd = $row["broadcast_avmd"];
$broadcast_destination_data = $row["broadcast_destination_data"];
$broadcast_accountcode = $row["broadcast_accountcode"];
$broadcast_description = $row["broadcast_description"];
$broadcast_toll_allow = $row["broadcast_toll_allow"];
$insert_date = $row["insert_date"];
$update_date = $row["update_date"];
//determine start date and time based on insert or update date and 'start time' delay (in seconds)
$broadcast_start_reference = $update_date ?: $insert_date;
if ($broadcast_start_time && $broadcast_start_reference) {
$broadcast_start_time = date('Y-m-d H:i', strtotime($broadcast_start_reference) + $broadcast_start_time);
}
}
unset($sql, $parameters, $row);
}
@ -312,6 +350,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'delete','onclick'=>"modal_close();"])]);
}
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -330,15 +369,15 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-start_time']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='number' name='broadcast_start_time' value=\"".escape($broadcast_start_time)."\">\n";
echo "<td class='vtable' align='left' style='position: relative;'>\n";
echo " <input class='formfld datetimepicker-future' type='text' id='broadcast_start_time' name='broadcast_start_time' value=\"".escape($broadcast_start_time)."\" data-toggle='datetimepicker' data-target='#broadcast_start_time' onblur=\"$(this).datetimepicker('hide');\">\n";
echo "<br />\n";
echo "".$text['description-start_time']."\n";
echo "</td>\n";
echo "</tr>\n";
}
if (if_group("superadmin")){
if (permission_exists('call_broadcast_accountcode')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-accountcode']."\n";
@ -364,6 +403,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('call_broadcast_concurrent_limit')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
@ -390,7 +430,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
//$parameters['domain_uuid'] = $domain_uuid;
//$database = new database;
//$rows = $database->select($sql, $parameters, 'all');
//if (is_array($rows) && @sizeof($rows) != 0) {
//if (!empty($rows)) {
// foreach ($rows as $row) {
// if ($recording_uuid == $row['recording_uuid']) {
// echo " <option value='".$row['recording_uuid']."' selected='yes'>".escape($row['recordingname'])."</option>\n";
@ -431,7 +471,8 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</td>\n";
echo "</tr>\n";
}
/*
/*
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " Type\n";
@ -457,7 +498,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "transfer (external number): 12081231234 XML default <br />\n";
echo "</td>\n";
echo "</tr>\n";
*/
*/
if (permission_exists('call_broadcast_destination_number')) {
echo "<tr>\n";
@ -471,14 +512,14 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('call_broadcast_phone_number_list')) {
if (permission_exists('call_broadcast_phone_numbers')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-phone']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <textarea class='formfld' style='width: 300px; height: 200px;' type='text' name='broadcast_phone_numbers' placeholder=\"".$text['label-list_example']."\">".str_replace('\n', "\n", $broadcast_phone_numbers)."</textarea>";
echo " <textarea class='formfld' style='width: 300px; height: 200px;' type='text' name='broadcast_phone_numbers' placeholder=\"".$text['label-list_example']."\">".str_replace('\n', "\n", $broadcast_phone_numbers ?? '')."</textarea>";
echo "<br><br>";
echo " <input type='file' name='broadcast_phone_numbers_file' accept='.csv,.txt' style=\"display:inline-block;\"><a href='sample.csv' download><i class='fas fa-cloud-download-alt' style='margin-right: 5px;'></i>".$text['label-sample_file']."</a>";
echo "<br /><br />";
@ -494,16 +535,15 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='broadcast_avmd'>\n";
echo " <option value='false' ".(($broadcast_avmd == "false") ? "selected='selected'" : null).">".$text['option-false']."</option>\n";
echo " <option value='true' ".(($broadcast_avmd == "true") ? "selected='selected'" : null).">".$text['option-true']."</option>\n";
echo " <option value='false'>".$text['option-false']."</option>\n";
echo " <option value='true' ".(!empty($broadcast_avmd) && $broadcast_avmd == "true" ? "selected='selected'" : null).">".$text['option-true']."</option>\n";
echo " </select>\n";
echo "<br />\n";
echo "<br />\n";
echo $text['description-avmd']."\n";
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('broadcast_toll_allow')) {
if (permission_exists('call_broadcast_toll_allow')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-broadcast_toll_allow']."\n";
@ -515,7 +555,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</td>\n";
echo "</tr>\n";
}
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-description']."\n";
@ -528,6 +568,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</tr>\n";
echo "</table>";
echo "</div>\n";
echo "<br><br>";
if ($action == "update") {
@ -537,163 +578,6 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
echo "</form>";
/*
if ($action == "update") {
echo "<table width='100%' border='0'>\n";
echo "<tr>\n";
echo "<td width='50%' nowrap><b>Call Broadcast</b></td>\n";
echo "<td width='50%' align='right'>&nbsp;</td>\n";
echo "</tr>\n";
echo "</table>\n";
echo "<form method='get' name='frm' action='call_broadcast_send.php'>\n";
echo "<div align='center'>\n";
echo "<table width='100%' border='0' cellpadding='6' cellspacing='0'>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap>\n";
echo " Category\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <select name='user_category' class='formfld'>\n";
echo " <option></option>\n";
$sql = "";
$sql .= "select distinct user_category as user_category from v_users ";
//$sql .= "where domain_uuid = :domain_uuid ";
//$parameters['domain_uuid'] = $domain_uuid;
$database = new database;
$rows = $database->select($sql, null, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
if ($user_category == $row['user_category']) {
echo " <option value='".escape($row['user_category'])."' selected='yes'>".escape($row['user_category'])."</option>\n";
}
else {
echo " <option value='".escape($row['user_category'])."'>".escape($row['user_category'])."</option>\n";
}
}
}
unset($sql, $parameters, $rows, $row);
echo " </select>\n";
echo "<br />\n";
echo "\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap>\n";
echo " Group\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <select name='group_name' class='formfld'>\n";
echo " <option></option>\n";
$sql = "";
$sql .= "select * from v_groups ";
//$sql .= "where domain_uuid = :domain_uuid ";
//$parameters['domain_uuid'] = $domain_uuid;
$database = new database;
$rows = $database->select($sql, null, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
if ($recording_uuid == $row['group_name']) {
echo " <option value='".escape($row['group_name'])."' selected='yes'>".escape($row['group_name'])."</option>\n";
}
else {
echo " <option value='".escape($row['group_name'])."'>".escape($row['group_name'])."</option>\n";
}
}
}
unset($sql, $parameters, $rows, $row);
echo " </select>\n";
echo "<br />\n";
echo "\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncell' valign='top' align='left' nowrap>\n";
echo " Gateway\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <select name='gateway' class='formfld'>\n";
echo " <option></option>\n";
$sql = "";
$sql .= "select * from v_gateways ";
//$sql .= "where domain_uuid = :domain_uuid ";
//$parameters['domain_uuid'] = $domain_uuid;
$database = new database;
$rows = $database->select($sql, null, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
if ($gateway == $row['gateway']) {
echo " <option value='".escape($row['gateway'])."' selected='yes'>".escape($row['gateway'])."</option>\n";
}
else {
echo " <option value='".escape($row['gateway'])."'>".escape($row['gateway'])."</option>\n";
}
}
}
unset($sql, $parameters, $rows, $row);
echo " <option value='loopback'>loopback</option>\n";
echo " </select>\n";
echo "<br />\n";
//echo "zzz.<br />\n";
echo "\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " Phone Type\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select name='phonetype1' class='formfld'>\n";
echo " <option></option>\n";
echo " <option value='phone1'>phone1</option>\n";
echo " <option value='phone2'>phone2</option>\n";
echo " <option value='cell'>cell</option>\n";
//echo " <option value='zzz'>cell</option>\n";
echo " </select>\n";
echo "<br />\n";
echo "\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " Phone Type\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select name='phonetype2' class='formfld'>\n";
echo " <option></option>\n";
echo " <option value='phone1'>phone1</option>\n";
echo " <option value='phone2'>phone2</option>\n";
echo " <option value='cell'>cell</option>\n";
//echo " <option value='zzz'>cell</option>\n";
echo " </select>\n";
echo "<br />\n";
echo "\n";
echo "</td>\n";
echo "</tr>\n";
echo " <tr>\n";
echo " <td colspan='2' align='right'>\n";
echo " <input type='hidden' name='call_broadcast_uuid' value='".escape($call_broadcast_uuid)."'>\n";
echo " <input type='submit' name='submit' class='btn' value='Send Broadcast'>\n";
echo " </td>\n";
echo " </tr>";
echo "</table>";
echo "</form>";
}
*/
//include the footer
require_once "resources/footer.php";

View File

@ -25,9 +25,8 @@
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//chec permissions
@ -44,7 +43,7 @@
$text = $language->get();
//set the max execution time to 1 hour
ini_set(max_execution_time,3600);
ini_set('max_execution_time',3600);
//define the asynchronous command function
function cmd_async($cmd) {
@ -65,12 +64,12 @@
}
//get the http get values and set as php variables
$group_name = $_GET["group_name"];
$call_broadcast_uuid = $_GET["id"];
$user_category = $_GET["user_category"];
$gateway = $_GET["gateway"];
$phonetype1 = $_GET["phonetype1"];
$phonetype2 = $_GET["phonetype2"];
$group_name = $_GET["group_name"] ?? '';
$call_broadcast_uuid = $_GET["id"] ?? '';
$user_category = $_GET["user_category"] ?? '';
$gateway = $_GET["gateway"] ?? '';
$phonetype1 = $_GET["phonetype1"] ?? '';
$phonetype2 = $_GET["phonetype2"] ?? '';
//get the call broadcast details from the database
$sql = "select * from v_call_broadcasts ";
@ -80,12 +79,12 @@
$parameters['call_broadcast_uuid'] = $call_broadcast_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && sizeof($row) != 0) {
if (!empty($row)) {
$broadcast_name = $row["broadcast_name"];
$broadcast_start_time = $row["broadcast_start_time"];
$broadcast_timeout = $row["broadcast_timeout"];
$broadcast_concurrent_limit = $row["broadcast_concurrent_limit"];
$recordingid = $row["recordingid"];
$recordingid = $row["recordingid"] ?? '';
$broadcast_caller_id_name = $row["broadcast_caller_id_name"];
$broadcast_caller_id_number = $row["broadcast_caller_id_number"];
$broadcast_destination_type = $row["broadcast_destination_type"];
@ -94,7 +93,7 @@
$broadcast_avmd = $row["broadcast_avmd"];
$broadcast_accountcode = $row["broadcast_accountcode"];
$broadcast_description = $row["broadcast_description"];
//if (strlen($row["broadcast_destination_data"]) == 0) {
//if (empty($row["broadcast_destination_data"])) {
// $broadcast_destination_application = '';
// $broadcast_destination_data = '';
//}
@ -107,13 +106,13 @@
unset($sql, $parameters, $row);
//set the defaults
if (strlen($broadcast_caller_id_name) == 0) {
if (empty($broadcast_caller_id_name)) {
$broadcast_caller_id_name = "anonymous";
}
if (strlen($broadcast_caller_id_number) == 0) {
if (empty($broadcast_caller_id_number)) {
$broadcast_caller_id_number = "0000000000";
}
if (strlen($broadcast_accountcode) == 0) {
if (empty($broadcast_accountcode)) {
$broadcast_accountcode = $_SESSION['domain_name'];;
}
if (isset($broadcast_start_time) && is_numeric($broadcast_start_time)) {
@ -131,7 +130,7 @@
$broadcast_name = str_replace("'", "", $broadcast_name);
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$fp = event_socket::create();
//get information over event socket
if (!$fp) {
@ -154,7 +153,7 @@
require_once "resources/header.php";
//send the call broadcast
if (strlen($broadcast_phone_numbers) > 0) {
if (!empty($broadcast_phone_numbers)) {
$broadcast_phone_number_array = explode ("\n", $broadcast_phone_numbers);
$count = 1;
foreach ($broadcast_phone_number_array as $tmp_value) {
@ -197,17 +196,17 @@
//if the event socket connection is lost then re-connect
if (!$fp) {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$fp = event_socket::create();
}
//method 1
$response = trim(event_socket_request($fp, 'api '.$cmd));
$response = event_socket::command($cmd);
//method 2
//cmd_async($_SESSION['switch']['bin']['dir']."/fs_cli -x \"".$cmd."\";");
//spread the calls out so that they are scheduled with different times
if (strlen($broadcast_concurrent_limit) > 0 && strlen($broadcast_timeout) > 0) {
if (strlen($broadcast_concurrent_limit) > 0 && !empty($broadcast_timeout)) {
if ($broadcast_concurrent_limit == $count) {
$sched_seconds = $sched_seconds + $broadcast_timeout;
$count=0;
@ -217,8 +216,7 @@
$count++;
}
}
fclose($fp);
echo "<div align='center'>\n";
echo "<table width='50%'>\n";
echo "<tr>\n";

View File

@ -23,8 +23,9 @@
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
if (permission_exists('call_broadcast_send')) {
//access granted
@ -44,10 +45,10 @@ else {
if (is_uuid($uuid)) {
//show the result
if (count($_GET) > 0) {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$fp = event_socket::create();
if ($fp !== false) {
$cmd = "sched_del ".$uuid;
$result = event_socket_request($fp, 'api '.$cmd);
$result = event_socket::api($cmd);
message::add(htmlentities($result));
}
}

View File

@ -1,11 +1,33 @@
<?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) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
/**
* call broadcast class
*
* @method null download
*/
if (!class_exists('call_broadcast')) {
class call_broadcast {
/**
@ -33,16 +55,6 @@ if (!class_exists('call_broadcast')) {
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* delete records
*/
@ -66,7 +78,7 @@ if (!class_exists('call_broadcast')) {
//build the delete array
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
}
@ -113,7 +125,7 @@ if (!class_exists('call_broadcast')) {
//get checked records
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -162,6 +174,3 @@ if (!class_exists('call_broadcast')) {
}
}
}
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "Affiche les appels actifs et les agents en queue sur le centre d'appel.";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "აჩვენებს აქტიურ ზარებს და აყენებს ქოლცენტრის რიგში";
$apps[$x]['description']['nl-nl'] = "Laat actieve oproepen en agenten in het Call-Center wachtrij zien";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "Mostra as chamadas ativas, e os agentes na fila do Call Center.";

File diff suppressed because it is too large Load Diff

View File

@ -3,29 +3,36 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Active Call Center";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Active Call Center";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "مركز الاتصال النشط";
$apps[$x]['menu'][$y]['title']['de-at'] = "Aktive Callcenter";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Active Call Center";
$apps[$x]['menu'][$y]['title']['de-de'] = "Aktive Callcenter";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Centro de Llamada Activo";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Active Call Center";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Centre d'Appels Active";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Centre d'Appel Actif";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "מרכז קריאה פעיל";
$apps[$x]['menu'][$y]['title']['it-it'] = "Call Center Attivi";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Actieve Call-Center";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "აქტიური ქოლცენტრები";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Aktieve Callcenter";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Aktywność w Call Center ";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Call Center ativos";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Centro de Chamadas Activo";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Centru de apeluri activ";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Активные Колл-центры";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Aktivt Call Center";
$apps[$x]['menu'][$y]['title']['uk-ua'] = "";
$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'] = "7fb0dd87-e984-9980-c512-2c76b887aeb2";
$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/call_center_active/call_center_queue.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -44,7 +43,7 @@
//get the queue_name and set it as a variable
$queue_name = $_GET['queue_name'];
$name = $_GET['name'];
$name = $_GET['name'] ?? null;
//get a new session array
unset($_SESSION['queues']);
@ -86,36 +85,53 @@
loadXmlHttp.prototype.stateChanged=function () {
var url = new URL(this.xmlHttp.responseURL);
if (/login\.php$/.test(url.pathname)) {
// You are logged out. Stop refresh!
//logged out stop the refresh
if (/login\.php$/.test(url.pathname)) {
url.searchParams.set('path', '<?php echo $_SERVER['REQUEST_URI']; ?>');
window.location.href = url.href;
return;
}
if (this.xmlHttp.readyState == 4 && (this.xmlHttp.status == 200 || !/^http/.test(window.location.href)))
if (this.xmlHttp.readyState == 4 && (this.xmlHttp.status == 200 || !/^http/.test(window.location.href))) {
//this.el.innerHTML = this.xmlHttp.responseText;
document.getElementById('ajax_response').innerHTML = this.xmlHttp.responseText;
}
//link table rows (except the last - the list_control_icons cell) on a table with a class of 'tr_hover', according to the href attribute of the <tr> tag
$('.tr_hover tr,.list tr').each(function(i,e) {
$(e).children('td:not(.list_control_icon,.list_control_icons,.tr_link_void,.list-row > .no-link,.list-row > .checkbox,.list-row > .button,.list-row > .action-button)').on('click', function() {
var href = $(this).closest('tr').attr('href');
var target = $(this).closest('tr').attr('target');
if (href) {
if (target) { window.open(href, target); }
else { window.location = href; }
}
});
$('.tr_hover tr,.list tr').each(function(i,e) {
$(e).children('td:not(.list_control_icon,.list_control_icons,.tr_link_void,.list-row > .no-link,.list-row > .checkbox,.list-row > .button,.list-row > .action-button)').on('click', function() {
var href = $(this).closest('tr').attr('href');
var target = $(this).closest('tr').attr('target');
if (href) {
if (target) { window.open(href, target); }
else { window.location = href; }
}
});
});
}
var requestTime = function() {
var url = 'call_center_active_inc.php?queue_name=<?php echo escape($queue_name); ?>&name=<?php echo urlencode(escape($name)); ?>';
new loadXmlHttp(url, 'ajax_response');
<?php
if (strlen($_SESSION["ajax_refresh_rate"]) == 0) { $_SESSION["ajax_refresh_rate"] = "1777"; }
echo "setInterval(function(){new loadXmlHttp(url, 'ajax_reponse');}, ".$_SESSION["ajax_refresh_rate"].");";
//determine refresh rate
$refresh_default = 1500; //milliseconds
$refresh = is_numeric($_SESSION['call_center']['refresh']['numeric']) ? $_SESSION['call_center']['refresh']['numeric'] : $refresh_default;
if ($refresh >= 0.5 && $refresh <= 120) { //convert seconds to milliseconds
$refresh = $refresh * 1000;
}
else if ($refresh < 0.5 || ($refresh > 120 && $refresh < 500)) {
$refresh = $refresh_default; //use default
}
else {
//>= 500, must be milliseconds
}
//set the value for the refresh
echo "setInterval(function(){new loadXmlHttp(url, 'ajax_reponse');}, ".$refresh.");";
?>
}
@ -149,4 +165,4 @@
//include the footer
require_once "resources/footer.php";
?>
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2021
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
James Rose <james.o.rose@gmail.com>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -39,6 +38,9 @@
exit;
}
//initialize the database object
$database = new database;
//add multi-lingual support
$language = new text;
$text = $language->get();
@ -47,12 +49,11 @@
$queue_uuid = $_GET['queue_name'];
//get the queues from the database
if (!is_array($_SESSION['queues'])) {
if (empty($_SESSION['queues']) || !is_array($_SESSION['queues'])) {
$sql = "select * from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by queue_name asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$_SESSION['queues'] = $database->select($sql, $parameters, 'all');
}
@ -91,10 +92,10 @@
}
//create an event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//get the call center queue, agent and tiers list
if (!$fp) {
if (!$esl->is_connected()) {
$msg = "<div align='center'>Connection to Event Socket failed.<br /></div>";
echo "<div align='center'>\n";
echo "<table width='40%'>\n";
@ -118,7 +119,7 @@
//send the event socket command and get the response
//callcenter_config queue list tiers [queue_name] |
$switch_command = 'callcenter_config queue list tiers '.$queue_extension."@".$_SESSION["domain_name"];
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_command));
$event_socket_str = trim(event_socket::api($switch_command));
$result = str_to_named_array($event_socket_str, '|');
//prepare the result for array_multisort
@ -140,27 +141,28 @@
//send the event socket command and get the response
//callcenter_config queue list agents [queue_name] [status] |
$switch_command = 'callcenter_config queue list agents '.$queue_extension."@".$_SESSION["domain_name"];
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_command));
$event_socket_str = trim(event_socket::api($switch_command));
$agent_result = str_to_named_array($event_socket_str, '|');
//get the agents from the database
if (!is_array($_SESSION['agents'])) {
if (empty($_SESSION['agents']) || !is_array($_SESSION['agents'])) {
$sql = "select * from v_call_center_agents ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by agent_name asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$_SESSION['agents'] = $database->select($sql, $parameters, 'all');
}
//list the agents
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo "<th>".$text['label-name']."</th>\n";
echo "<th>".$text['label-extension']."</th>\n";
echo "<th>".$text['label-status']."</th>\n";
echo "<th>".$text['label-state']."</th>\n";
echo "<th title=\"".$text['description-status']."\">".$text['label-status']."</th>\n";
echo "<th title=\"".$text['description-state']."\">".$text['label-state']."</th>\n";
echo "<th>".$text['label-status_change']."</th>\n";
echo "<th>".$text['label-last_bridge_end']."</th>\n";
echo "<th class='center'>".$text['label-missed']."</th>\n";
echo "<th class='center'>".$text['label-answered']."</th>\n";
echo "<th>".$text['label-tier_state']."</th>\n";
@ -219,13 +221,18 @@
$talk_time = $agent_row['talk_time'];
$ready_time = $agent_row['ready_time'];
$last_status_change_seconds = time() - $last_status_change;
$last_status_change_length_hour = floor($last_status_change_seconds/3600);
$last_status_change_length_min = floor($last_status_change_seconds/60 - ($last_status_change_length_hour * 60));
$last_status_change_length_sec = $last_status_change_seconds - (($last_status_change_length_hour * 3600) + ($last_status_change_length_min * 60));
$last_status_change_length_min = sprintf("%02d", $last_status_change_length_min);
$last_status_change_length_sec = sprintf("%02d", $last_status_change_length_sec);
$last_status_change_length = $last_status_change_length_hour.':'.$last_status_change_length_min.':'.$last_status_change_length_sec;
//calcudate the length since status change and bridge end
$last_status_change_length = time() - $last_status_change;
$last_bridge_end_length = time() - $last_bridge_end;
//set the state to wrap up time
if ($last_bridge_end_length < $wrap_up_time) {
$state = 'Wrap Up Time';
}
//format the seconds to hh:mm:ss
$last_status_change_length_formatted = format_seconds($last_status_change_length);
$last_bridge_end_length_formatted = format_seconds($last_bridge_end_length);
if (permission_exists('call_center_agent_edit')) {
$list_row_url = "../call_centers/call_center_agent_edit.php?id=".$agent_uuid;
@ -243,7 +250,8 @@
echo "<td>".escape($agent_extension)."</td>\n";
echo "<td>".escape($status)."</td>\n";
echo "<td>".escape($state)."</td>\n";
echo "<td>".escape($last_status_change_length)."</td>\n";
echo "<td>".escape($last_status_change_length_formatted)."</td>\n";
echo "<td>".escape($last_bridge_end_length_formatted)."</td>\n";
echo "<td class='center'>".escape($no_answer_count)."</td>\n";
echo "<td class='center'>".escape($calls_answered)."</td>\n";
echo "<td>".escape($tier_state)."</td>\n";
@ -261,7 +269,7 @@
}
else {
//$orig_call="{origination_caller_id_name=c2c-".urlencode(escape($name)).",origination_caller_id_number=".escape($agent_extension)."}user/".$_SESSION['user']['extension'][0]['user']."@".$_SESSION['domain_name']." %26bridge(user/".escape($agent_extension)."@".$_SESSION['domain_name'].")";
echo button::create(['type'=>'button','class'=>'link','label'=>$text['label-call'],'onclick'=>"if (confirm('".$text['message-confirm']."')) { send_command('call_center_exec.php?command=bridge&extension=".urlencode($agent_extension)."&caller_id_name=".urlencode($name)."'); } else { this.blur(); return false; }"]);
echo button::create(['type'=>'button','class'=>'link','label'=>$text['label-call'],'onclick'=>"if (confirm('".$text['message-confirm']."')) { send_command('call_center_exec.php?command=bridge&extension=".urlencode($agent_extension)."&caller_id_name=".urlencode($name ?? '')."'); } else { this.blur(); return false; }"]);
}
echo "</td>";
}
@ -272,6 +280,7 @@
} //foreach
} //if
echo "</table>\n\n";
echo "</div>\n";
//add vertical spacing
echo "<br /><br /><br />";
@ -281,7 +290,7 @@
//callcenter_config queue list members [queue_name]
if (is_uuid($queue_uuid)) {
$switch_command = 'callcenter_config queue list members '.$queue_extension."@".$_SESSION["domain_name"];
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_command));
$event_socket_str = trim(event_socket::api($switch_command));
$result = str_to_named_array($event_socket_str, '|');
if (!is_array($result)) { unset($result); }
}
@ -312,6 +321,7 @@
echo $text['description-queue']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo "<th>".$text['label-time']."</th>\n";
@ -319,7 +329,7 @@
echo "<th>".$text['label-name']."</th>\n";
echo "<th>".$text['label-number']."</th>\n";
echo "<th>".$text['label-status']."</th>\n";
if ((if_group("admin") || if_group("superadmin"))) {
if (permission_exists('call_center_active_options')) {
echo "<th>".$text['label-options']."</th>\n";
}
echo "<th>".$text['label-agent']."</th>\n";
@ -328,7 +338,7 @@
if (is_array($result)) {
foreach ($result as $row) {
$queue = $row['queue'];
$system = $row['system'];
$system = $row['system'] ?? null;
$uuid = $row['uuid'];
$session_uuid = $row['session_uuid'];
$caller_number = $row['cid_number'];
@ -367,11 +377,12 @@
echo "<td>".escape($caller_name)."&nbsp;</td>\n";
echo "<td>".escape($caller_number)."&nbsp;</td>\n";
echo "<td>".escape($state)."</td>\n";
if (if_group("admin") || if_group("superadmin")) {
if (permission_exists('call_center_active_options')) {
echo "<td>";
if ($state != "Abandoned") {
$orig_command="{origination_caller_id_name=eavesdrop,origination_caller_id_number=".escape($q_caller_number)."}user/".escape($_SESSION['user']['extension'][0]['user'])."@".escape($_SESSION['domain_name'])." %26eavesdrop(".escape($session_uuid).")";
$orig_command = "{origination_caller_id_name=eavesdrop,origination_caller_id_number=".escape($q_caller_number ?? '')."}user/".escape($_SESSION['user']['extension'][0]['user'] ?? '')."@".escape($_SESSION['domain_name'])." %26eavesdrop(".escape($session_uuid).")";
echo button::create(['type'=>'button','class'=>'link','label'=>$text['label-eavesdrop'],'onclick'=>"if (confirm('".$text['message-confirm']."')) { send_command('call_center_exec.php?command=eavesdrop&caller_id_number=".urlencode($caller_number)."&uuid=".urlencode($session_uuid)."'); } else { this.blur(); return false; }"]);
echo button::create(['type'=>'button','class'=>'link','label'=>$text['label-transfer'],'style'=>'margin-left: 15px;','onclick'=>"if (confirm('".$text['message-confirm']."')) { send_command('call_center_exec.php?command=uuid_pickup&uuid=".urlencode($session_uuid)."'); } else { this.blur(); return false; }"]);
}
else {
echo "&nbsp;";
@ -383,6 +394,7 @@
}
}
echo "</table>\n";
echo "</div>\n";
}

View File

@ -27,13 +27,12 @@
POSSIBILITY OF SUCH DAMAGE.
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
if (permission_exists('call_center_active_view')) {
if (permission_exists('call_center_active_options')) {
//access granted
}
else {
@ -78,6 +77,9 @@
case "uuid_transfer":
$switch_command = "uuid_transfer ".$uuid." -bleg ".$_SESSION['user']['extension'][0]['user']." XML ".$_SESSION['domain_name'];
break;
case "uuid_pickup":
$switch_command = "uuid_transfer ".$uuid." ".$_SESSION['user']['extension'][0]['user']." XML ".$_SESSION['domain_name'];
break;
case "bridge":
$switch_command = "originate {origination_caller_id_name=".$caller_id_name.",origination_caller_id_number=".$caller_id_number."}user/".$_SESSION['user']['extension'][0]['user']."@".$_SESSION['domain_name']." bridge(user/".$extension."@".$_SESSION['domain_name'].")";
break;
@ -88,8 +90,7 @@
//run the command
if (isset($switch_command)) {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$response = event_socket_request($fp, 'api '.$switch_command);
$response = event_socket::api($switch_command);
}
/*
@ -130,16 +131,16 @@
}
//fs cmd
if (strlen($switch_cmd) > 0) {
if (!empty($switch_cmd)) {
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//ensure the connection exists
if ($fp) {
if ($esl) {
//send the command
$switch_result = event_socket_request($fp, 'api '.$switch_cmd);
$switch_result = event_socket::api($switch_cmd);
//set the user state
$cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting";
$response = event_socket_request($fp, $cmd);
$response = event_socket::command($cmd);
}
}
}

View File

@ -17,15 +17,14 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,12 +42,12 @@
$text = $language->get();
//get the variables
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? null;
$order = $_GET["order"] ?? null;
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$search = strtolower($_GET["search"] ?? '');
if (!empty($search)) {
$sql_search = " (";
$sql_search .= "lower(queue_name) like :search ";
$sql_search .= "or lower(queue_description) like :search ";
@ -69,7 +68,7 @@
//paging the records
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".$search;
$page = is_numeric($_GET['page']) ? $_GET['page'] : 0;
$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;
@ -88,7 +87,7 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-active_call_center']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['header-active_call_center']."</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";
echo "<input type='text' class='txt list-search' name='search' id='search' value=\"".escape($search)."\" placeholder=\"".$text['label-search']."\" onkeydown='list_search_reset();'>";
@ -105,6 +104,7 @@
echo $text['description-active_call_center']."\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo th_order_by('queue_name', $text['label-queue_name'], $order_by, $order);
@ -128,6 +128,9 @@
$x = 0;
foreach($call_center_queues as $row) {
$list_row_url = PROJECT_PATH."/app/call_center_active/call_center_active.php?queue_name=".escape($row['call_center_queue_uuid'])."&name=".urlencode(escape($row['queue_name']));
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
echo " <td><a href='".$list_row_url."'>".escape($row['queue_name'])."</a></td>\n";
echo " <td>".escape($row['queue_extension'])."</td>\n";
@ -151,10 +154,12 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
//show the footer
require_once "resources/footer.php";
?>
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -21,6 +21,7 @@
$apps[$x]['description']['fr-fr'] = "Files d'attente d'appels entrants distribu%uFFFDs aux agents disponibles.";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "რიგები შემომავალი ზარების სამართავად და ამ ზარების ხელმისაწვდომ აგენტებთან გადასამისამართებლად.";
$apps[$x]['description']['nl-nl'] = "Wachtrijen voor beheer van inkomede gesprekken en routering naar beschikbare agenten.";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "As filas servem para gerenciar as chamadas que entram e encaminhar as mesmas para os agentes disponíveis.";
@ -35,13 +36,15 @@
$apps[$x]['destinations'][$y]['type'] = "sql";
$apps[$x]['destinations'][$y]['label'] = "call_centers";
$apps[$x]['destinations'][$y]['name'] = "call_centers";
$apps[$x]['destinations'][$y]['sql'] = "select queue_name as name, queue_extension as destination, queue_extension as extension, queue_description as description from v_call_center_queues";
$apps[$x]['destinations'][$y]['sql'] = "select call_center_queue_uuid, call_center_queue_uuid as uuid, queue_name as name, queue_extension as destination, ";
$apps[$x]['destinations'][$y]['sql'] .= "queue_extension as extension, queue_context as context, queue_description as description from v_call_center_queues ";
$apps[$x]['destinations'][$y]['where'] = "where domain_uuid = '\${domain_uuid}' ";
$apps[$x]['destinations'][$y]['order_by'] = "queue_name asc";
$apps[$x]['destinations'][$y]['order_by'] = "natural_sort(queue_extension) asc";
$apps[$x]['destinations'][$y]['field']['name'] = "queue_name";
$apps[$x]['destinations'][$y]['field']['destination'] = "queue_extension";
$apps[$x]['destinations'][$y]['field']['extension'] = "queue_extension";
$apps[$x]['destinations'][$y]['field']['description'] = "queue_description";
$apps[$x]['destinations'][$y]['field']['destination'] = "extension";
$apps[$x]['destinations'][$y]['field']['extension'] = "extension";
$apps[$x]['destinations'][$y]['field']['description'] = "description";
$apps[$x]['destinations'][$y]['field']['context'] = "context";
$apps[$x]['destinations'][$y]['select_value']['dialplan'] = "transfer:\${destination} XML \${context}";
$apps[$x]['destinations'][$y]['select_value']['ivr'] = "menu-exec-app:transfer \${destination} XML \${context}";
$apps[$x]['destinations'][$y]['select_label'] = "\${destination} \${name} \${description}";
@ -66,6 +69,9 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_center_queue_context";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_center_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
@ -144,6 +150,9 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_center_email_address";
//$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
//default settings
$y = 0;
@ -178,6 +187,46 @@
$apps[$x]['default_settings'][$y]['default_setting_value'] = "user";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Options: user (default)";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b8f8a95c-0167-4768-8aab-c386f64bdd06";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "refresh";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "1500";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the refresh rate in seconds (<=120) or milliseconds (>=500).";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "ca34cbc0-e071-432e-afd6-b587aa52bd85";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "queue_login";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "static";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Agent queue login options: dynamic, static";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "1bdf7b53-356f-4a81-85de-eeed4d26b7c5";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "export_vars";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "array";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "hold_music";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Pass through hold_music variable.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "f7ecaf4b-8228-4f15-9df1-c694a8259aab";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "record_name";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "\${sip_from_user}-\${sip_to_user}-\${strftime(%Y)}\${strftime(%b)}\${strftime(%d)}-\${uuid}.\${record_ext}";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Custom name for call recording. Options: \${record_ext}, \${sip_from_user}, \${sip_to_user}, \${caller_id_number}, \${uuid}";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "4c939d81-7192-4d9a-b7c4-76695a005d4f";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "extension_range";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "400-499";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the suggested extension range(s) for call center queues";
//cache details
$apps[$x]['cache']['key'] = "dialplan.\${domain_name}";
@ -280,6 +329,30 @@
$apps[$x]['db'][$y]['fields'][$z]['name'] = "agent_record";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$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'] = "";
$y++;
$apps[$x]['db'][$y]['table']['name'] = "v_call_center_queues";
@ -424,23 +497,48 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "queue_email_address";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "queue_context";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "queue_description";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$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'] = "";
$y++;
$apps[$x]['db'][$y]['table']['name'] = "v_call_center_tiers";
$apps[$x]['db'][$y]['table']['parent'] = "";
$z=0;
$apps[$x]['db'][$y]['fields'][$z]['name']['text'] = "id";
$apps[$x]['db'][$y]['fields'][$z]['name']['deprecated'] = "call_center_tier_id";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "serial";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "integer";
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "INT NOT NULL AUTO_INCREMENT";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$apps[$x]['db'][$y]['fields'][$z]['deprecated'] = "true";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "call_center_tier_uuid";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "uuid";
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
@ -476,11 +574,6 @@
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['field'] = "call_center_agent_uuid";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "v_id";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$apps[$x]['db'][$y]['fields'][$z]['deprecated'] = "true";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "agent_name";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
@ -496,5 +589,29 @@
$apps[$x]['db'][$y]['fields'][$z]['name'] = "tier_position";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "numeric";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$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

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2018 - 2021
Portions created by the Initial Developer are Copyright (C) 2018 - 2022
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -26,6 +26,16 @@
if ($domains_processed == 1) {
//add the domain_name as the context
$sql = "UPDATE v_call_center_queues as c ";
$sql .= "SET queue_context = ( ";
$sql .= " SELECT domain_name FROM v_domains as d ";
$sql .= " WHERE d.domain_uuid = c.domain_uuid ";
$sql .= ") ";
$sql .= "WHERE queue_context is null; ";
$database->execute($sql);
unset($sql);
//list the missing call center queue and agent uuids
$sql = "select t.call_center_tier_uuid, t.call_center_queue_uuid, t.call_center_agent_uuid, t.queue_name, t.agent_name, d.domain_name, ";
$sql .= "(select call_center_queue_uuid from v_call_center_queues where replace(queue_name, ' ', '-') = t.queue_name and domain_uuid = t.domain_uuid) as queue_uuid, ";
@ -33,26 +43,24 @@ if ($domains_processed == 1) {
$sql .= "from v_call_center_tiers as t, v_domains as d ";
$sql .= "where t.domain_uuid = d.domain_uuid ";
$sql .= "and (t.call_center_queue_uuid is null or t.call_center_agent_uuid is null) ";
$database = new database;
$tiers = $database->select($sql, null, 'all');
if (is_array($tiers) && @sizeof($tiers) != 0) {
foreach ($tiers as $index => &$row) {
if (!empty($tiers)) {
foreach ($tiers as $index => $row) {
if ($row['call_center_queue_uuid'] == null && $row['queue_uuid'] != null) {
$array['call_center_tiers'][$index]['call_center_queue_uuid'] = $row['queue_uuid'];
}
if ($row['call_center_agent_uuid'] == null && $row['agent_uuid'] != null) {
$array['call_center_tiers'][$index]['call_center_agent_uuid'] = $row['agent_uuid'];
}
if (is_array($array['call_center_tiers'][$index]) && @sizeof($array['call_center_tiers'][$index]) != 0) {
if (!empty($array['call_center_tiers'][$index])) {
$array['call_center_tiers'][$index]['call_center_tier_uuid'] = $row['call_center_tier_uuid'];
}
}
if (is_array($array) && @sizeof($array) != 0) {
$p = new permissions;
if (!empty($array)) {
$p = permissions::new();
$p->add('call_center_tier_edit', 'temp');
$database = new database;
$database->app_name = 'call_centers';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array, false);
@ -65,27 +73,28 @@ if ($domains_processed == 1) {
unset($sql);
//update all callcenter dialplans to have the @domain in the queue name
$sql = "select q.domain_uuid, d.domain_name, q.call_center_queue_uuid, q.dialplan_uuid, ";
/*
$sql = "select q.domain_uuid, d.domain_name, q.call_center_queue_uuid, q.dialplan_uuid, dp.dialplan_xml, ";
$sql .= "q.queue_name, q.queue_extension, q.queue_timeout_action, q.queue_cid_prefix, q.queue_cc_exit_keys, ";
$sql .= "q.queue_description, q.queue_time_base_score_sec, q.queue_greeting ";
$sql .= "from v_call_center_queues as q, v_domains as d ";
$sql .= "from v_call_center_queues as q, v_dialplans as dp, v_domains as d ";
$sql .= "where q.domain_uuid = d.domain_uuid ";
$database = new database;
$sql .= "and (q.dialplan_uuid = dp.dialplan_uuid or q.dialplan_uuid is null) ";
$call_center_queues = $database->select($sql, null, 'all');
$id = 0;
if (is_array($call_center_queues)) {
if (!empty($call_center_queues)) {
foreach ($call_center_queues as $row) {
//get the application and data
$action_array = explode(":",$row['queue_timeout_action']);
$action_array = explode(":",$row['queue_timeout_action'] ?? '');
$queue_timeout_app = $action_array[0];
unset($action_array[0]);
$queue_timeout_data = implode($action_array);
//add the recording path if needed
if ($row['queue_greeting'] != '') {
if (file_exists($_SESSION['switch']['recordings']['dir'].'/'.$row['domain_name'].'/'.$row['queue_greeting'])) {
$queue_greeting_path = $_SESSION['switch']['recordings']['dir'].'/'.$_SESSION['domain_name'].'/'.$row['queue_greeting'];
if (file_exists($settings->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'])) {
$queue_greeting_path = $settings->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'];
}
else {
$queue_greeting_path = trim($row['queue_greeting']);
@ -93,59 +102,61 @@ if ($domains_processed == 1) {
}
//build the xml dialplan
$dialplan_xml = "<extension name=\"".$row["queue_name"]."\" continue=\"\" uuid=\"".$row["dialplan_uuid"]."\">\n";
$dialplan_xml = "<extension name=\"".xml::sanitize($row["queue_name"])."\" continue=\"\" uuid=\"".xml::sanitize($row["dialplan_uuid"])."\">\n";
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^([^#]+#)(.*)\$\" break=\"never\">\n";
$dialplan_xml .= " <action application=\"set\" data=\"caller_id_name=\$2\"/>\n";
$dialplan_xml .= " </condition>\n";
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^".$row["queue_extension"]."$\">\n";
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^(callcenter\+)?".xml::sanitize($row["queue_extension"])."$\">\n";
$dialplan_xml .= " <action application=\"answer\" data=\"\"/>\n";
if (is_uuid($row['call_center_queue_uuid'])) {
$dialplan_xml .= " <action application=\"set\" data=\"call_center_queue_uuid=".$row['call_center_queue_uuid']."\"/>\n";
if (!empty($row['call_center_queue_uuid']) && is_uuid($row['call_center_queue_uuid'])) {
$dialplan_xml .= " <action application=\"set\" data=\"call_center_queue_uuid=".xml::sanitize($row['call_center_queue_uuid'])."\"/>\n";
}
if (is_numeric($queue_extension)) {
$dialplan_xml .= " <action application=\"set\" data=\"queue_extension=".$row['queue_extension']."\"/>\n";
if (is_numeric($row['queue_extension'])) {
$dialplan_xml .= " <action application=\"set\" data=\"queue_extension=".xml::sanitize($row['queue_extension'])."\"/>\n";
}
$dialplan_xml .= " <action application=\"set\" data=\"cc_export_vars=call_center_queue_uuid\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"cc_export_vars=\${cc_export_vars},call_center_queue_uuid,sip_h_Alert-Info\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"hangup_after_bridge=true\"/>\n";
if ($row['queue_time_base_score_sec'] != '') {
$dialplan_xml .= " <action application=\"set\" data=\"cc_base_score=".$row['queue_time_base_score_sec']."\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"cc_base_score=".xml::sanitize($row['queue_time_base_score_sec'])."\"/>\n";
}
if ($row['queue_greeting_path'] != '') {
$greeting_array = explode(':', $row['queue_greeting_path']);
if (!empty($row['queue_greeting'])) {
$greeting_array = explode(':', $row['queue_greeting']);
if (count($greeting_array) == 1) {
$dialplan_xml .= " <action application=\"playback\" data=\"".$row['queue_greeting_path']."\"/>\n";
$dialplan_xml .= " <action application=\"playback\" data=\"".xml::sanitize($queue_greeting_path)."\"/>\n";
}
else {
if ($greeting_array[0] == 'say' || $greeting_array[0] == 'tone_stream' || $greeting_array[0] == 'phrase') {
$dialplan_xml .= " <action application=\"".$greeting_array[0]."\" data=\"".$greeting_array[1]."\"/>\n";
$dialplan_xml .= " <action application=\"".xml::sanitize($greeting_array[0])."\" data=\"".xml::sanitize($greeting_array[1])."\"/>\n";
}
}
}
if (strlen($row['queue_cid_prefix']) > 0) {
$dialplan_xml .= " <action application=\"set\" data=\"effective_caller_id_name=".$row['queue_cid_prefix']."#\${caller_id_name}\"/>\n";
if (!empty($row['queue_cid_prefix'])) {
$dialplan_xml .= " <action application=\"set\" data=\"effective_caller_id_name=".xml::sanitize($row['queue_cid_prefix'])."#\${caller_id_name}\"/>\n";
}
if (strlen($row['queue_cc_exit_keys']) > 0) {
$dialplan_xml .= " <action application=\"set\" data=\"cc_exit_keys=".$row['queue_cc_exit_keys']."\"/>\n";
if (!empty($row['queue_cc_exit_keys'])) {
$dialplan_xml .= " <action application=\"set\" data=\"cc_exit_keys=".xml::sanitize($row['queue_cc_exit_keys'])."\"/>\n";
}
$dialplan_xml .= " <action application=\"callcenter\" data=\"".$row['queue_extension']."@".$row['domain_name']."\"/>\n";
$dialplan_xml .= " <action application=\"callcenter\" data=\"".xml::sanitize($row['queue_extension'])."@".xml::sanitize($row['domain_name'])."\"/>\n";
//if ($destination->valid($queue_timeout_app.':'.$queue_timeout_data)) {
$dialplan_xml .= " <action application=\"".$queue_timeout_app."\" data=\"".$queue_timeout_data."\"/>\n";
$dialplan_xml .= " <action application=\"".xml::sanitize($queue_timeout_app)."\" data=\"".xml::sanitize($queue_timeout_data)."\"/>\n";
//}
$dialplan_xml .= " </condition>\n";
$dialplan_xml .= "</extension>\n";
$dialplan_xml .= "</extension>";
//build the dialplan array
$array['dialplans'][$id]["domain_uuid"] = $row["domain_uuid"];
$array['dialplans'][$id]["dialplan_uuid"] = $row["dialplan_uuid"];
$array['dialplans'][$id]["dialplan_name"] = $row["queue_name"];
$array['dialplans'][$id]["dialplan_number"] = $row["queue_extension"];
$array['dialplans'][$id]["dialplan_context"] = $row['domain_name'];
$array['dialplans'][$id]["dialplan_continue"] = "false";
$array['dialplans'][$id]["dialplan_xml"] = $dialplan_xml;
$array['dialplans'][$id]["dialplan_order"] = "230";
$array['dialplans'][$id]["dialplan_enabled"] = "true";
$array['dialplans'][$id]["dialplan_description"] = $row["queue_description"];
$array['dialplans'][$id]["app_uuid"] = "95788e50-9500-079e-2807-fd530b0ea370";
if (md5($row["dialplan_xml"]) != md5($dialplan_xml)) {
$array['dialplans'][$id]["domain_uuid"] = $row["domain_uuid"];
$array['dialplans'][$id]["dialplan_uuid"] = $row["dialplan_uuid"];
$array['dialplans'][$id]["dialplan_name"] = $row["queue_name"];
$array['dialplans'][$id]["dialplan_number"] = $row["queue_extension"];
$array['dialplans'][$id]["dialplan_context"] = $row['domain_name'];
$array['dialplans'][$id]["dialplan_continue"] = "false";
$array['dialplans'][$id]["dialplan_xml"] = $dialplan_xml;
$array['dialplans'][$id]["dialplan_order"] = "230";
$array['dialplans'][$id]["dialplan_enabled"] = "true";
$array['dialplans'][$id]["dialplan_description"] = $row["queue_description"];
$array['dialplans'][$id]["app_uuid"] = "95788e50-9500-079e-2807-fd530b0ea370";
}
//increment the array id
$id++;
@ -154,15 +165,14 @@ if ($domains_processed == 1) {
}
unset ($prep_statement);
//save the array to the database
if (is_array($array)) {
//save the array to the database
if (!empty($array)) {
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");
//save to the data
$database = new database;
$database->app_name = 'call_centers';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array, false);
@ -172,6 +182,7 @@ if ($domains_processed == 1) {
$p->delete("dialplan_add", "temp");
$p->delete("dialplan_edit", "temp");
}
*/
}

File diff suppressed because it is too large Load Diff

View File

@ -3,56 +3,69 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Call Centers";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Call Centers";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['de-at'] = "Callcenter";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-de'] = "Callcenter";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "مراكز الاتصال";
$apps[$x]['menu'][$y]['title']['de-at'] = "Call-Center";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Call-Center";
$apps[$x]['menu'][$y]['title']['de-de'] = "Call-Center";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Centro de Llamadas";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Call Centers";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Centre d' appels";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Centre d'appel";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "מוקדים טלפוניים";
$apps[$x]['menu'][$y]['title']['it-it'] = "Stato Agenti";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Call-Centers";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Call Center ";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Call Center";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ქოლცენტრი";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Telefooncentrales";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Centra telefoniczne ";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Centros de chamada";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Centro de Chamadas";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Centre de apeluri";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Колл-центр";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Call Center";
$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'] = "6c072b29-5b6c-49fc-008e-95e24c77de99";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/call_centers/call_center_queues.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$y++;
$apps[$x]['menu'][$y]['title']['en-us'] = "Agent Status";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Agent Status";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "الوكيل";
$apps[$x]['menu'][$y]['title']['de-at'] = "Agenten Status";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Status";
$apps[$x]['menu'][$y]['title']['de-de'] = "Agenten Status";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Estado de Agente";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Agente Status";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Agent Status";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "État de l'agent";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['it-it'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "מצב הסוכן";
$apps[$x]['menu'][$y]['title']['it-it'] = "Stato dell'agente";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "აგენტის სტატუსი";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Agent status";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Status agenta";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Estado do agente";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Estado do Agente";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Statutul agentului";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Статус агента";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Agent Status";
$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'] = "597c483a-51a9-f95a-8d54-ea7d87ada2b8";
$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/call_centers/call_center_agent_status.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2020
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -43,33 +42,16 @@
$language = new text;
$text = $language->get();
//check for duplicates
if ($_GET["check"] == 'duplicate') {
//agent id
if ($_GET["agent_id"] != '') {
$sql = "select agent_name ";
$sql .= "from v_call_center_agents ";
$sql .= "where agent_id = :agent_id ";
$sql .= "and domain_uuid = :domain_uuid ";
if (is_uuid($_GET["agent_uuid"])) {
$sql .= " and call_center_agent_uuid <> :call_center_agent_uuid ";
$parameters['call_center_agent_uuid'] = $_GET["agent_uuid"];
}
$parameters['agent_id'] = $_GET["agent_id"];
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && sizeof($row) != 0 && $row['agent_name'] != '') {
echo $text['message-duplicate_agent_id'].(if_group("superadmin") ? ": ".$row["agent_name"] : null);
}
unset($sql, $parameters);
}
//connect to the database
$database = new database;
exit;
}
//set the defaults
$agent_id = '';
$agent_name = '';
$agent_password = '';
//action add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$call_center_agent_uuid = $_REQUEST["id"];
}
@ -77,9 +59,17 @@
$action = "add";
}
//get the users array
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//get http post variables and set them to php variables
if (is_array($_POST)) {
$call_center_agent_uuid = $_POST["call_center_agent_uuid"];
if (!empty($_POST)) {
$call_center_agent_uuid = $_POST["call_center_agent_uuid"] ?? null;
$user_uuid = $_POST["user_uuid"];
$agent_name = $_POST["agent_name"];
$agent_type = $_POST["agent_type"];
@ -98,7 +88,7 @@
}
//process the user data and save it to the database
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//validate the token
$token = new token;
@ -110,23 +100,18 @@
//check for all required data
$msg = '';
//if (strlen($call_center_agent_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-call_center_agent_uuid']."<br>\n"; }
//if (strlen($domain_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-domain_uuid']."<br>\n"; }
//if (strlen($user_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-user_uuid']."<br>\n"; }
if (strlen($agent_name) == 0) { $msg .= $text['message-required']." ".$text['label-agent_name']."<br>\n"; }
if (strlen($agent_type) == 0) { $msg .= $text['message-required']." ".$text['label-agent_type']."<br>\n"; }
if (strlen($agent_call_timeout) == 0) { $msg .= $text['message-required']." ".$text['label-agent_call_timeout']."<br>\n"; }
//if (strlen($agent_id) == 0) { $msg .= $text['message-required']." ".$text['label-agent_id']."<br>\n"; }
//if (strlen($agent_password) == 0) { $msg .= $text['message-required']." ".$text['label-agent_password']."<br>\n"; }
//if (strlen($agent_status) == 0) { $msg .= $text['message-required']." ".$text['label-agent_status']."<br>\n"; }
if (strlen($agent_contact) == 0) { $msg .= $text['message-required']." ".$text['label-agent_contact']."<br>\n"; }
if (strlen($agent_no_answer_delay_time) == 0) { $msg .= $text['message-required']." ".$text['label-agent_no_answer_delay_time']."<br>\n"; }
if (strlen($agent_max_no_answer) == 0) { $msg .= $text['message-required']." ".$text['label-agent_max_no_answer']."<br>\n"; }
if (strlen($agent_wrap_up_time) == 0) { $msg .= $text['message-required']." ".$text['label-agent_wrap_up_time']."<br>\n"; }
if (strlen($agent_reject_delay_time) == 0) { $msg .= $text['message-required']." ".$text['label-agent_reject_delay_time']."<br>\n"; }
if (strlen($agent_busy_delay_time) == 0) { $msg .= $text['message-required']." ".$text['label-agent_busy_delay_time']."<br>\n"; }
//if (strlen($agent_logout) == 0) { $msg .= $text['message-required']." ".$text['label-agent_logout']."<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
//if (empty($call_center_agent_uuid)) { $msg .= $text['message-required']." ".$text['label-call_center_agent_uuid']."<br>\n"; }
//if (empty($domain_uuid)) { $msg .= $text['message-required']." ".$text['label-domain_uuid']."<br>\n"; }
//if (empty($user_uuid)) { $msg .= $text['message-required']." ".$text['label-user_uuid']."<br>\n"; }
if (empty($agent_name)) { $msg .= $text['message-required']." ".$text['label-agent_name']."<br>\n"; }
if (empty($agent_type)) { $msg .= $text['message-required']." ".$text['label-agent_type']."<br>\n"; }
if (empty($agent_call_timeout)) { $msg .= $text['message-required']." ".$text['label-agent_call_timeout']."<br>\n"; }
//if (empty($agent_id)) { $msg .= $text['message-required']." ".$text['label-agent_id']."<br>\n"; }
//if (empty($agent_password)) { $msg .= $text['message-required']." ".$text['label-agent_password']."<br>\n"; }
//if (empty($agent_status)) { $msg .= $text['message-required']." ".$text['label-agent_status']."<br>\n"; }
if (empty($agent_contact)) { $msg .= $text['message-required']." ".$text['label-agent_contact']."<br>\n"; }
//if (empty($agent_logout)) { $msg .= $text['message-required']." ".$text['label-agent_logout']."<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -139,26 +124,28 @@
return;
}
//set default values
if (empty($agent_call_timeout)) { $agent_call_timeout = "20"; }
if (empty($agent_max_no_answer)) { $agent_max_no_answer = "0"; }
if (empty($agent_wrap_up_time)) { $agent_wrap_up_time = "10"; }
if (empty($agent_no_answer_delay_time)) { $agent_no_answer_delay_time = "30"; }
if (empty($agent_reject_delay_time)) { $agent_reject_delay_time = "90"; }
if (empty($agent_busy_delay_time)) { $agent_busy_delay_time = "90"; }
//add the call_center_agent_uuid
if (strlen($call_center_agent_uuid) == 0) {
if (empty($call_center_agent_uuid)) {
$call_center_agent_uuid = uuid();
}
//get the users array
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//change the contact string to loopback - Not recommended added for backwards comptability causes multiple problems
if ($_SESSION['call_center']['agent_contact_method']['text'] == 'loopback') {
$agent_contact = str_replace("user/", "loopback/", $agent_contact);
$agent_contact = str_replace("@", "/", $agent_contact);
}
//freeswitch expands the contact string, so we need to sanitize it.
$agent_contact = str_replace('$', '', $agent_contact);
//prepare the array
$array['call_center_agents'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
$array['call_center_agents'][0]['call_center_agent_uuid'] = $call_center_agent_uuid;
@ -183,11 +170,9 @@
}
//save to the data
$database = new database;
$database->app_name = 'call_center';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array);
//$message = $database->message;
//syncrhonize configuration
save_call_center_xml();
@ -228,37 +213,37 @@
//add the agent
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//add the agent using event socket
if ($fp) {
if ($esl->connected()) {
//add the agent
$cmd = "api callcenter_config agent add ".$call_center_agent_uuid." ".$agent_type;
$response = event_socket_request($fp, $cmd);
$cmd = "callcenter_config agent add ".$call_center_agent_uuid." '".$agent_type."'";
$response = event_socket::api($cmd);
usleep(200);
//agent set contact
$cmd = "api callcenter_config agent set contact ".$call_center_agent_uuid." ".$agent_contact;
$response = event_socket_request($fp, $cmd);
$cmd = "callcenter_config agent set contact ".$call_center_agent_uuid." '".$agent_contact."'";
$response = event_socket::api($cmd);
usleep(200);
//agent set status
$cmd = "api callcenter_config agent set status ".$call_center_agent_uuid." '".$agent_status."'";
$response = event_socket_request($fp, $cmd);
$cmd = "callcenter_config agent set status ".$call_center_agent_uuid." '".$agent_status."'";
$response = event_socket::api($cmd);
usleep(200);
//agent set reject_delay_time
$cmd = "api callcenter_config agent set reject_delay_time ".$call_center_agent_uuid." ".$agent_reject_delay_time;
$response = event_socket_request($fp, $cmd);
$cmd = 'callcenter_config agent set reject_delay_time '.$call_center_agent_uuid.' '. $agent_reject_delay_time;
$response = event_socket::api($cmd);
usleep(200);
//agent set busy_delay_time
$cmd = "api callcenter_config agent set busy_delay_time ".$call_center_agent_uuid." ".$agent_busy_delay_time;
$response = event_socket_request($fp, $cmd);
$cmd = 'callcenter_config agent set busy_delay_time '.$call_center_agent_uuid.' '.$agent_busy_delay_time;
$response = event_socket::api($cmd);
//agent set no_answer_delay_time
$cmd = "api callcenter_config agent set no_answer_delay_time ".$call_center_agent_uuid." ".$agent_no_answer_delay_time;
$response = event_socket_request($fp, $cmd);
$cmd = 'callcenter_config agent set no_answer_delay_time '.$call_center_agent_uuid.' '.$agent_no_answer_delay_time;
$response = event_socket::api($cmd);
//agent set max_no_answer
$cmd = "api callcenter_config agent set max_no_answer ".$call_center_agent_uuid." ".$agent_max_no_answer;
$response = event_socket_request($fp, $cmd);
$cmd = 'callcenter_config agent set max_no_answer '.$call_center_agent_uuid.' '.$agent_max_no_answer;
$response = event_socket::api($cmd);
//agent set wrap_up_time
$cmd = "api callcenter_config agent set wrap_up_time ".$call_center_agent_uuid." ".$agent_wrap_up_time;
$response = event_socket_request($fp, $cmd);
$cmd = 'callcenter_config agent set wrap_up_time '.$call_center_agent_uuid.' '.$agent_wrap_up_time;
$response = event_socket::api($cmd);
}
//redirect the user
@ -272,22 +257,21 @@
header("Location: call_center_agents.php");
return;
}
} //(is_array($_POST) && strlen($_POST["persistformvar"]) == 0)
} //(is_array($_POST) && empty($_POST["persistformvar"]))
//initialize the destinations object
$destination = new destinations;
//pre-populate the form
if (is_uuid($_GET["id"]) && $_POST["persistformvar"] != "true") {
if (!empty($_GET["id"]) && is_uuid($_GET["id"]) && empty($_POST["persistformvar"])) {
$call_center_agent_uuid = $_GET["id"];
$sql = "select * from v_call_center_agents ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and call_center_agent_uuid = :call_center_agent_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['call_center_agent_uuid'] = $call_center_agent_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
if (!empty($row)) {
$call_center_agent_uuid = $row["call_center_agent_uuid"];
$user_uuid = $row["user_uuid"];
$agent_name = $row["agent_name"];
@ -309,13 +293,13 @@
}
//set default values
if (strlen($agent_type) == 0) { $agent_type = "callback"; }
if (strlen($agent_call_timeout) == 0) { $agent_call_timeout = "20"; }
if (strlen($agent_max_no_answer) == 0) { $agent_max_no_answer = "0"; }
if (strlen($agent_wrap_up_time) == 0) { $agent_wrap_up_time = "10"; }
if (strlen($agent_no_answer_delay_time) == 0) { $agent_no_answer_delay_time = "30"; }
if (strlen($agent_reject_delay_time) == 0) { $agent_reject_delay_time = "90"; }
if (strlen($agent_busy_delay_time) == 0) { $agent_busy_delay_time = "90"; }
if (empty($agent_type)) { $agent_type = "callback"; }
if (empty($agent_call_timeout)) { $agent_call_timeout = "20"; }
if (empty($agent_max_no_answer)) { $agent_max_no_answer = "0"; }
if (empty($agent_wrap_up_time)) { $agent_wrap_up_time = "10"; }
if (empty($agent_no_answer_delay_time)) { $agent_no_answer_delay_time = "30"; }
if (empty($agent_reject_delay_time)) { $agent_reject_delay_time = "90"; }
if (empty($agent_busy_delay_time)) { $agent_busy_delay_time = "90"; }
//create token
$object = new token;
@ -328,47 +312,12 @@
if ($action == "update") {
$document['title'] = $text['title-call_center_agent_edit'];
}
//include the header
require_once "resources/header.php";
//get the list of users for this domain
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and user_enabled = 'true' ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//javascript to check for duplicates
?>
<script language="javascript">
function check_duplicates() {
//check agent id
var agent_id = document.getElementById('agent_id').value;
$("#duplicate_agent_id_response").load("call_center_agent_edit.php?check=duplicate&agent_id="+agent_id+"&agent_uuid=<?php echo escape($call_center_agent_uuid); ?>", function() {
var duplicate_agent_id = false;
if ($("#duplicate_agent_id_response").html() != '') {
$('#agent_id').addClass('formfld_highlight_bad');
display_message($("#duplicate_agent_id_response").html(), 'negative'<?php if (if_group("superadmin")) { echo ', 3000'; } ?>);
duplicate_agent_id = true;
}
else {
$("#duplicate_agent_id_response").html('');
$('#agent_id').removeClass('formfld_highlight_bad');
duplicate_agent_id = false;
}
if (duplicate_agent_id == false) {
document.getElementById('frm').submit();
}
});
}
</script>
<?php
//show the content
echo "<form method='post' name='frm' id='frm' onsubmit='check_duplicates(); return false;'>\n";
echo "<form method='post' name='frm' id='frm' onsubmit=''>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'>";
@ -386,6 +335,7 @@
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
echo "<td width='30%' class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
@ -393,21 +343,6 @@
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='agent_name' maxlength='255' value=\"".escape($agent_name)."\" />\n";
/*
echo "<select id=\"agent_name\" name=\"agent_name\" class='formfld'>\n";
echo "<option value=\"\"></option>\n";
if (is_array($users)) {
foreach($users as $field) {
if ($field[username] == $agent_name) {
echo "<option value='".escape($field[username])."' selected='selected'>".escape($field[username])."</option>\n";
}
else {
echo "<option value='".escape($field[username])."'>".escape($field[username])."</option>\n";
}
}
}
echo "</select>";
*/
echo "<br />\n";
echo $text['description-agent_name']."\n";
echo "</td>\n";
@ -440,18 +375,13 @@
echo " <td class='vtable' align='left'>";
echo " <select name=\"user_uuid\" class='formfld' style='width: auto;'>\n";
echo " <option value=\"\"></option>\n";
foreach($users as $field) {
if ($user_uuid == $field['user_uuid']) {
echo " <option value='".escape($field['user_uuid'])."' selected='selected'>".escape($field['username'])."</option>\n";
}
else {
echo " <option value='".escape($field['user_uuid'])."' $selected>".escape($field['username'])."</option>\n";
}
foreach ($users as $field) {
echo " <option value='".escape($field['user_uuid'])."' ".(!empty($user_uuid) && $user_uuid == $field['user_uuid'] ? "selected='selected'" : null).">".escape($field['username'])."</option>\n";
}
echo " </select>";
unset($users);
echo " <br>\n";
echo " ".$text['description-users']."\n";
echo " ".!empty($text['description-users'])."\n";
echo " </td>";
echo " </tr>";
@ -461,7 +391,6 @@
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='number' name='agent_id' id='agent_id' maxlength='255' min='1' step='1' value='".escape($agent_id)."'>\n";
echo " <div style='display: none;' id='duplicate_agent_id_response'></div>\n";
echo "<br />\n";
echo $text['description-agent_id']."\n";
echo "</td>\n";
@ -472,7 +401,7 @@
echo " ".$text['label-agent_password']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='password' name='agent_password' autocomplete='off' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!\$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" maxlength='255' min='1' step='1' value='".escape($agent_password)."'>\n";
echo " <input class='formfld password' type='password' name='agent_password' autocomplete='off' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!\$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" maxlength='255' min='1' step='1' value='".escape($agent_password)."'>\n";
echo "<br />\n";
echo $text['description-agent_password']."\n";
echo "</td>\n";
@ -483,7 +412,7 @@
echo " ".$text['label-contact']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo $destination->select('user_contact', 'agent_contact', $agent_contact);
echo $destination->select('user_contact', 'agent_contact', ($agent_contact ?? null));
echo "<br />\n";
echo $text['description-contact']."\n";
echo "</td>\n";
@ -495,31 +424,11 @@
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='agent_status'>\n";
echo " <option value=''></option>\n";
if ($agent_status == "Logged Out") {
echo " <option value='Logged Out' SELECTED >".$text['option-logged_out']."</option>\n";
}
else {
echo " <option value='Logged Out'>".$text['option-logged_out']."</option>\n";
}
if ($agent_status == "Available") {
echo " <option value='Available' SELECTED >".$text['option-available']."</option>\n";
}
else {
echo " <option value='Available'>".$text['option-available']."</option>\n";
}
if ($agent_status == "Available (On Demand)") {
echo " <option value='Available (On Demand)' SELECTED >".$text['option-available_on_demand']."</option>\n";
}
else {
echo " <option value='Available (On Demand)'>".$text['option-available_on_demand']."</option>\n";
}
if ($agent_status == "On Break") {
echo " <option value='On Break' SELECTED >".$text['option-on_break']."</option>\n";
}
else {
echo " <option value='On Break'>".$text['option-on_break']."</option>\n";
}
echo " <option value=''></option>\n";
echo " <option value='Logged Out' ".(!empty($agent_status) && $agent_status == "Logged Out" ? "selected='selected'" : null).">".$text['option-logged_out']."</option>\n";
echo " <option value='Available' ".(!empty($agent_status) && $agent_status == "Available" ? "selected='selected'" : null).">".$text['option-available']."</option>\n";
echo " <option value='Available (On Demand)' ".(!empty($agent_status) && $agent_status == "Available (On Demand)" ? "selected='selected'" : null).">".$text['option-available_on_demand']."</option>\n";
echo " <option value='On Break' ".(!empty($agent_status) && $agent_status == "On Break" ? "selected='selected'" : null).">".$text['option-on_break']."</option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-status']."\n";
@ -587,8 +496,8 @@
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='agent_record'>\n";
echo " <option value='true' ".($agent_record == "true" ? "selected='selected'" : '')." >".$text['option-true']."</option>\n";
echo " <option value='false' ".($agent_record != "true" ? "selected='selected'" : '').">".$text['option-false']."</option>\n";
echo " <option value='true'>".$text['option-true']."</option>\n";
echo " <option value='false' ".(!empty($agent_record) && $agent_record != "true" ? "selected='selected'" : null).">".$text['option-false']."</option>\n";
echo " </select>\n";
echo "<br />\n";
echo $text['description-record_template']."\n";
@ -609,6 +518,7 @@
*/
echo "</table>";
echo "</div>\n";
echo "<br /><br />";
if ($action == "update") {

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -49,7 +48,7 @@
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$tiers = $database->select($sql, $parameters, 'all');
if (is_array($tiers) && count($tiers) == 0) {
if (!empty($_SESSION['call_center']['queue_login']['text']) && $_SESSION['call_center']['queue_login']['text'] == 'dynamic') {
$per_queue_login = true;
}
else {
@ -58,7 +57,7 @@
unset($sql, $parameters);
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//get the agents from the database
$sql = "select * from v_call_center_agents ";
@ -71,12 +70,12 @@
//get the agent list from event socket
$switch_cmd = 'callcenter_config agent list';
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
$event_socket_str = trim(event_socket::api($switch_cmd));
$agent_list = csv_to_named_array($event_socket_str, '|');
//get the agent list from event socket
$switch_cmd = 'callcenter_config tier list';
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
$event_socket_str = trim(event_socket::api($switch_cmd));
$call_center_tiers = csv_to_named_array($event_socket_str, '|');
//get the call center queues from the database
@ -94,14 +93,14 @@
//add the status to the call_center_queues array
$x = 0;
if (is_array($call_center_queues)) {
if (!empty($call_center_queues)) {
foreach ($call_center_queues as $queue) {
//set the queue id
$queue_id = $queue['queue_extension'].'@'.$queue['domain_name'];
//get the queue list from event socket
$switch_cmd = "callcenter_config queue list agents ".$queue_id;
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
$event_socket_str = trim(event_socket::api($switch_cmd));
$queue_list = csv_to_named_array($event_socket_str, '|');
$call_center_queues[$x]['queue_list'] = $queue_list;
$x++;
@ -110,7 +109,7 @@
//get the agent status from mod_callcenter and update the agent status in the agents array
$x = 0;
if (is_array($agents)) {
if (!empty($agents)) {
foreach ($agents as $row) {
//add the domain name
$domain_name = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
@ -118,14 +117,14 @@
//update the queue status
$i = 0;
if (is_array($call_center_queues)) {
if (!empty($call_center_queues)) {
foreach ($call_center_queues as $queue) {
$agents[$x]['queues'][$i]['agent_name'] = $row['agent_name'];
$agents[$x]['queues'][$i]['queue_name'] = $queue['queue_name'];
$agents[$x]['queues'][$i]['call_center_agent_uuid'] = $row['call_center_agent_uuid'];
$agents[$x]['queues'][$i]['call_center_queue_uuid'] = $queue['call_center_queue_uuid'];
$agents[$x]['queues'][$i]['queue_status'] = 'Logged Out';
if (is_array($queue['queue_list'])) {
if (!empty($queue['queue_list'])) {
foreach ($queue['queue_list'] as $queue_list) {
if ($row['call_center_agent_uuid'] == $queue_list['name']) {
$agents[$x]['queues'][$i]['queue_status'] = 'Available';
@ -137,7 +136,7 @@
}
//update the agent status
if (is_array($agent_list)) {
if (!empty($agent_list)) {
foreach ($agent_list as $r) {
if ($r['name'] == $row['call_center_agent_uuid']) {
$agents[$x]['agent_status'] = $r['status'];
@ -151,7 +150,7 @@
}
//remove rows from the http post array where the status has not changed
if (is_array($_POST['agents']) && !$per_queue_login) {
if (!empty($_POST['agents']) && !$per_queue_login) {
foreach($_POST['agents'] as $key => $row) {
foreach($agents as $k => $field) {
if ($field['agent_name'] === $row['agent_name'] && $field['agent_status'] === $row['agent_status']) {
@ -162,18 +161,18 @@
}
//use the http post array to change the status
if (is_array($_POST['agents'])) {
if (!empty($_POST['agents'])) {
foreach($_POST['agents'] as $row) {
if (isset($row['agent_status'])) {
if (!empty($row['agent_status'])) {
//agent set status
if ($fp) {
if ($esl->is_connected()) {
//set the user_status
if (!isset($row['queue_name'])) {
$array['users'][0]['user_uuid'] = $row['user_uuid'];
$array['users'][0]['user_uuid'] = $row['user_uuid'] ?? null;
$array['users'][0]['user_status'] = $row['agent_status'];
$array['users'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
$p = new permissions;
$p = permissions::new();
$p->add('user_edit', 'temp');
$database = new database;
@ -208,24 +207,34 @@
if (!isset($row['queue_name'])) {
if ($agent_status == "Do Not Disturb") {
//set the default dnd action
$dnd_action = "add";
$dnd_action = "add";
//set the call center status to Logged Out
if (is_uuid($row['agent_uuid'])) {
$command = "api callcenter_config agent set status ".$row['agent_uuid']." 'Logged Out' ";
}
if (is_uuid($row['agent_uuid'])) {
$command = "callcenter_config agent set status ".$row['agent_uuid']." 'Logged Out' ";
$response = event_socket::api($command);
}
}
else {
if (is_uuid($row['agent_uuid'])) {
$command = "api callcenter_config agent set status ".$row['agent_uuid']." '".$agent_status."'";
//set the agent status
$command = "callcenter_config agent set status ".$row['agent_uuid']." '".$agent_status."'";
$response = event_socket::api($command);
//set the agent state
if ($agent_status == 'Available' || $agent_status == 'Logged Out') {
$command = "callcenter_config agent set state ".$row['agent_uuid']." 'Waiting'";
$response = event_socket::api($command);
}
}
}
$response = event_socket_request($fp, $command);
}
//echo $command."\n";
//get the queue_id
if (isset($row['queue_uuid']) && is_uuid($row['queue_uuid'])) {
if (is_array($call_center_queues)) {
if (!empty($call_center_queues)) {
foreach ($call_center_queues as $queue) {
if ($queue['call_center_queue_uuid'] == $row['queue_uuid']) {
$queue_id = $queue['queue_extension'].'@'.$queue['domain_name'];
@ -238,22 +247,21 @@
if (isset($row['queue_uuid']) && $row['agent_status'] == 'Available') {
//set the call center status
//$command = "api callcenter_config agent set status ".$row['agent_name']."@".$_SESSION['domain_name']." '".$row['agent_status']."'";
//$response = event_socket_request($fp, $command);
//$response = event_socket::command($command);
//assign the agent to the queue
if (is_uuid($row['queue_uuid']) && is_uuid($row['agent_uuid'])) {
$command = "api callcenter_config tier add ".$queue_id." ".$row['agent_uuid']." 1 1";
//echo $command."<br />\n";
$response = event_socket_request($fp, $command);
$command = "callcenter_config tier add ".$queue_id." ".$row['agent_uuid']." 1 1";
$response = event_socket::api($command);
}
}
//un-assign the agent from the queue
if (isset($row['queue_uuid']) && $row['agent_status'] == 'Logged Out') {
if (is_uuid($row['queue_uuid']) && is_uuid($row['agent_uuid'])) {
$command = "api callcenter_config tier del ".$queue_id." ".$row['agent_uuid'];
$command = "callcenter_config tier del ".$queue_id." ".$row['agent_uuid'];
//echo $command."<br />\n";
$response = event_socket_request($fp, $command);
$response = event_socket::api($command);
}
}
usleep(200);
@ -288,11 +296,15 @@
} //foreach
//send a message
message::add($text['confirm-add']);
message::add($text['message-status_set']);
header("Location: call_center_agent_status.php");
return;
} //post
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//includes the header
$document['title'] = $text['title-call_center_agent_status'];
require_once "resources/header.php";
@ -329,13 +341,14 @@
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if (is_array($_POST['agents']) && !$per_queue_login) {
if (!empty($_POST['agents']) && !$per_queue_login) {
echo $text['description-call_center_agent_status']."\n";
echo "<br /><br />\n";
}
echo "<form id='form_list' method='post'>\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo " <th class='pct-20'>".$text['label-agent']."</th>\n";
@ -345,15 +358,16 @@
echo " <th class='pct-20 hide-sm-dn'>&nbsp;</th>\n";
if ($per_queue_login) {
echo " <th class='pct-40'>".$text['label-options']."</th>\n";
echo " <th class='pct-40' style='width=50%;'>&nbsp</th>\n";
}
echo "</tr>\n";
if (is_array($agents) && @sizeof($agents) != 0) {
if (!empty($agents)) {
$x = 0;
foreach ($agents as $row) {
$onclick = "onclick=\"cycle('agents[".$x."][agent_status]');\"";
$html = "<tr class='list-row'>\n";
$html .= " <td ".$onclick.">".escape($row['agent_name'])."&nbsp;</td>\n";
$html .= " <td style='vertical-align: top;' ".$onclick.">".escape($row['agent_name'])."&nbsp;</td>\n";
if (!$per_queue_login) {
$html .= " <td class='no-wrap'>";
@ -368,15 +382,15 @@
$html .= " <td ".$onclick." class='hide-sm-dn'>&nbsp;</td>\n";
if ($per_queue_login) {
$html .= " <td class='description'>";
if (is_array($row['queues'])) {
$html .= " <td class='description' style='width: 30%;'>";
if (!empty($row['queues'])) {
$html .= " <table class='list' >\n";
$html .= " <tr>\n";
$html .= " <th>".$text['label-queue']."</th>\n";
$html .= " <th>".$text['label-status']."</th>\n";
$html .= " <th>".$text['label-options']."</th>\n";
$html .= " </tr>\n";
if (is_array($row['queues'])) {
if (!empty($row['queues'])) {
foreach ($row['queues'] as $queue) {
$x++;
$onclick = "onclick=\"cycle('agents[".$x."][agent_status]');\"";
@ -397,7 +411,8 @@
$html .= " <input type='hidden' name='agents[".$x."][queue_uuid]' value='".escape($queue['call_center_queue_uuid'])."'>\n";
$html .= " <input type='hidden' name='agents[".$x."][agent_uuid]' value='".escape($row['call_center_agent_uuid'])."'>\n";
$html .= " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Available' ".($queue['queue_status'] == 'Available' ? "checked='checked'" : null).">&nbsp;".$text['option-available']."</label>&nbsp;\n";
$html .= " <label style='margin: 0; cursor: pointer;'><input type='radio' name='agents[".$x."][agent_status]' value='Logged Out' ".($queue['queue_status'] == 'Logged Out' ? "checked='checked'" : null).">&nbsp;".$text['option-logged_out']."</label>\n";
$html .= " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Logged Out' ".($queue['queue_status'] == 'Logged Out' ? "checked='checked'" : null).">&nbsp;".$text['option-logged_out']."</label>\n";
//$html .= " <label style='margin: 0; cursor: pointer;'><input type='radio' name='agents[".$x."][agent_status]' value='On Break' ".($queue['queue_status'] == 'On Break' ? "checked='checked'" : null).">&nbsp;".$text['option-on_break']."</label>\n";
$html .= " </td>\n";
$html .= " </tr>\n";
}
@ -405,6 +420,7 @@
$html .= " </table>\n";
}
$html .= " </td>\n";
$html .= " <td>&nbsp;&nbsp;&nbsp;</td>\n";
}
$html .= "</tr>\n";
if (count($_SESSION['domains']) > 1) {
@ -421,6 +437,7 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2018
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,15 +42,18 @@
$language = new text;
$text = $language->get();
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (is_array($_POST['call_center_agents'])) {
if (!empty($_POST['call_center_agents'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$call_center_agents = $_POST['call_center_agents'];
}
//process the http post data by action
if ($action != '' && is_array($call_center_agents) && @sizeof($call_center_agents) != 0) {
if (!empty($action) && !empty($call_center_agents)) {
switch ($action) {
case 'delete':
if (permission_exists('call_center_agent_delete')) {
@ -66,50 +68,64 @@
}
//get http variables and set them to php variables
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$sql_search = " (";
$sql_search .= "lower(agent_name) like :search ";
$sql_search .= "or lower(agent_id) like :search ";
$sql_search .= ") ";
$parameters['search'] = '%'.$search.'%';
}
//add the search and show variables
$search = $_GET["search"] ?? '';
$show = $_GET["show"] ?? '';
//get total call center agent count from the database
$sql = "select count(*) from v_call_center_agents ";
$sql .= "where true ";
if ($_GET['show'] != "all" || !permission_exists('call_center_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
if ($show == "all" && permission_exists('call_center_all')) {
$sql .= "where true ";
}
else {
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (isset($sql_search)) {
$sql .= "and ".$sql_search;
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(agent_name) like :search ";
$sql .= " or lower(agent_id) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.strtolower($search).'%';
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$rows_per_page = (!empty($_SESSION['domain']['paging']['numeric'])) ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".urlencode($search);
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if ($show == "all" && permission_exists('call_center_all')) {
$param .= "&show=all";
}
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
$page = !empty($_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;
//get the list
$sql = str_replace('count(*)', '*', $sql);
$sql = "select * ";
$sql .= "from v_call_center_agents ";
if ($show == "all" && permission_exists('call_center_all')) {
$sql .= "where true ";
}
else {
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (!empty($search)) {
$sql .= "and (";
$sql .= " lower(agent_name) like :search ";
$sql .= " or lower(agent_id) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.strtolower($search).'%';
}
$sql .= order_by($order_by, $order, 'agent_name', 'asc');
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$result = $database->select($sql, $parameters, 'all');
$result = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -122,7 +138,7 @@
//show content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-call_center_agents']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['header-call_center_agents']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'call_center_queues.php','style'=>'margin-right: 15px;']);
if (permission_exists('call_center_imports')) {
@ -139,7 +155,7 @@
}
echo "<form id='form_search' class='inline' method='get'>";
if (permission_exists('call_center_all')) {
if ($_GET['show'] == 'all') {
if (!empty($_GET['show']) && $_GET['show'] == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
else {
@ -168,14 +184,15 @@
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_center_agent_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($result ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($result) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if ($show == "all" && permission_exists('call_center_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, $param, "class='shrink'");
}
//echo th_order_by('domain_uuid', 'domain_uuid', $order_by, $order);
@ -189,16 +206,20 @@
//echo th_order_by('agent_wrap_up_time', $text['label-wrap_up_time'], $order_by, $order);
//echo th_order_by('agent_reject_delay_time', $text['label-reject_delay_time'], $order_by, $order);
//echo th_order_by('agent_busy_delay_time', $text['label-busy_delay_time'], $order_by, $order);
if (permission_exists('call_center_agent_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_center_agent_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($result)) {
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_center_agent_edit')) {
$list_row_url = "call_center_agent_edit.php?id=".urlencode($row['call_center_agent_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_center_agent_delete')) {
@ -207,8 +228,8 @@
echo " <input type='hidden' name='call_center_agents[$x][uuid]' value='".escape($row['call_center_agent_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if (strlen($_SESSION['domains'][$row['domain_uuid']]['domain_name']) > 0) {
if ($show == "all" && permission_exists('call_center_all')) {
if (!empty($_SESSION['domains'][$row['domain_uuid']]['domain_name'])) {
$domain = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
}
else {
@ -236,7 +257,7 @@
$sql .= "where gateway_uuid = :gateway_uuid ";
$parameters['gateway_uuid'] = $bridge_statement[2];
$database = new database;
$result = $database->select($sql, $parameters, 'all');
$result = $database->select($sql, $parameters ?? null, 'all');
if (count($result) > 0) {
$gateway_name = $result[0]['gateway'];
$agent_contact = str_replace($bridge_statement[2], $gateway_name, $agent_contact);
@ -249,7 +270,7 @@
//echo " <td>".$row[agent_wrap_up_time]."</td>\n";
//echo " <td>".$row[agent_reject_delay_time]."</td>\n";
//echo " <td>".$row[agent_busy_delay_time]."</td>\n";
if (permission_exists('call_center_agent_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_center_agent_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -261,6 +282,7 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
@ -272,3 +294,4 @@
require_once "resources/footer.php";
?>

File diff suppressed because it is too large Load Diff

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2020
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,15 +42,21 @@
$language = new text;
$text = $language->get();
//set additional variables
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (is_array($_POST['call_center_queues'])) {
if (!empty($_POST['call_center_queues']) && is_array($_POST['call_center_queues'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$call_center_queues = $_POST['call_center_queues'];
}
//process the http post data by action
if ($action != '' && is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
if (!empty($action) && is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
switch ($action) {
case 'copy':
if (permission_exists('call_center_queue_add')) {
@ -72,12 +77,13 @@
}
//get http variables and set as php variables
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
$sort = $order_by == 'queue_extension' ? 'natural' : null;
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$search = strtolower($_GET["search"] ?? '');
if (!empty($search)) {
$sql_search = " (";
$sql_search .= "lower(queue_name) like :search ";
$sql_search .= "or lower(queue_description) like :search ";
@ -88,34 +94,34 @@
//get total call center queues count from the database
$sql = "select count(*) from v_call_center_queues ";
$sql .= "where true ";
if ($_GET['show'] != "all" || !permission_exists('call_center_all')) {
if ($show != "all" || !permission_exists('call_center_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (isset($sql_search)) {
if (!empty($sql_search)) {
$sql .= "and ".$sql_search;
}
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".urlencode($search);
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if ($show == "all" && permission_exists('call_center_all')) {
$param .= "&show=all";
}
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
$page = $_GET['page'] ?? '';
if (empty($page)) { $page = 0; $_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;
//get the list
$sql = str_replace('count(*)', '*', $sql);
$sql .= order_by($order_by, $order, 'queue_name', 'asc');
$sql = str_replace('count(*)', '*', $sql ?? '');
$sql .= order_by($order_by, $order, 'queue_name', 'asc', $sort);
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$result = $database->select($sql, $parameters, 'all');
$result = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -128,7 +134,7 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-call_center_queues']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['header-call_center_queues']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if (permission_exists('call_center_imports')) {
echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'link'=>PROJECT_PATH.'/app/call_center_imports/call_center_imports.php?import_type=call_center_queues']);
@ -140,21 +146,21 @@
echo button::create(['type'=>'button','label'=>$text['button-wallboard'],'icon'=>'th','link'=>PROJECT_PATH.'/app/call_center_wallboard/call_center_wallboard.php']);
}
$margin_left = permission_exists('call_center_agent_view') || permission_exists('call_center_wallboard') ? 'margin-left: 15px;' : null;
if (permission_exists('call_center_queue_add') && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric']) || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
if (permission_exists('call_center_queue_add') && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric'] ?? '') || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','style'=>$margin_left,'link'=>'call_center_queue_edit.php']);
unset($margin_left);
}
if (permission_exists('call_center_queue_add') && $result && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric']) || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none; '.$margin_left,'onclick'=>"modal_open('modal-copy','btn_copy');"]);
if (permission_exists('call_center_queue_add') && $result && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric'] ?? '') || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none; '.!empty($margin_left),'onclick'=>"modal_open('modal-copy','btn_copy');"]);
unset($margin_left);
}
if (permission_exists('call_center_queue_delete') && $result) {
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; '.$margin_left,'onclick'=>"modal_open('modal-delete','btn_delete');"]);
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; '.!empty($margin_left),'onclick'=>"modal_open('modal-delete','btn_delete');"]);
unset($margin_left);
}
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('call_center_all')) {
if ($_GET['show'] == 'all') {
if ($show == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
else {
@ -172,7 +178,7 @@
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if (permission_exists('call_center_queue_add') && $result && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric']) || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
if (permission_exists('call_center_queue_add') && $result && (!is_numeric($_SESSION['limit']['call_center_queues']['numeric'] ?? '') || $num_rows <= $_SESSION['limit']['call_center_queues']['numeric'])) {
echo modal::create(['id'=>'modal-copy','type'=>'copy','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_copy','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('copy'); list_form_submit('form_list');"])]);
}
if (permission_exists('call_center_queue_delete') && $result) {
@ -186,14 +192,15 @@
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_center_queue_add') || permission_exists('call_center_queue_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($result ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($result) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if ($show == "all" && permission_exists('call_center_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, $param, "class='shrink'");
}
echo th_order_by('queue_name', $text['label-queue_name'], $order_by, $order);
@ -212,16 +219,20 @@
//echo th_order_by('queue_abandoned_resume_allowed', $text['label-abandoned_resume_allowed'], $order_by, $order);
//echo th_order_by('queue_tier_rule_wait_multiply_level', $text['label-tier_rule_wait_multiply_level'], $order_by, $order);
echo th_order_by('queue_description', $text['label-description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('call_center_queue_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_center_queue_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($result)) {
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_center_queue_edit')) {
$list_row_url = "call_center_queue_edit.php?id=".urlencode($row['call_center_queue_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_center_queue_add') || permission_exists('call_center_queue_delete')) {
@ -230,8 +241,8 @@
echo " <input type='hidden' name='call_center_queues[$x][uuid]' value='".escape($row['call_center_queue_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_center_all')) {
if (strlen($_SESSION['domains'][$row['domain_uuid']]['domain_name']) > 0) {
if ($show == "all" && permission_exists('call_center_all')) {
if (!empty($_SESSION['domains'][$row['domain_uuid']]['domain_name'])) {
$domain = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
}
else {
@ -262,7 +273,7 @@
//echo " <td>".escape($row[queue_abandoned_resume_allowed])."&nbsp;</td>\n";
//echo " <td>".escape($row[queue_tier_rule_wait_multiply_level])."&nbsp;</td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['queue_description'])."</td>\n";
if (permission_exists('call_center_queue_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_center_queue_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -274,6 +285,7 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
@ -285,3 +297,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
include "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -40,19 +39,9 @@
//get the variables
$cmd = $_GET['cmd'];
//pre-populate the form
if (is_array($_GET) && is_uuid($_GET["id"]) && $_POST["persistformvar"] != "true") {
$call_center_queue_uuid = $_GET["id"];
$sql = "select queue_extension from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and call_center_queue_uuid = :call_center_queue_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['call_center_queue_uuid'] = $call_center_queue_uuid;
$database = new database;
$queue_extension = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
}
$call_center_queue_uuid = $_GET["id"];
$agent_uuid = $_GET['agent_uuid'];
$agent_status = $_GET['agent_status'];
//validate the variables
switch ($cmd) {
@ -69,13 +58,24 @@
unset($cmd);
}
//connect to event socket
//get the queue extension
if (is_uuid($call_center_queue_uuid)) {
$sql = "select queue_extension from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and call_center_queue_uuid = :call_center_queue_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['call_center_queue_uuid'] = $call_center_queue_uuid;
$database = new database;
$queue_extension = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
}
//run call center commands load, unload or reload
if (isset($queue_extension) && isset($cmd)) {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$response = event_socket_request($fp, 'api reloadxml');
$response = event_socket_request($fp, 'api callcenter_config queue '.$cmd. ' '.$queue_extension."@".$_SESSION["domain_name"]);
fclose($fp);
$event_socket = event_socket::create();
if ($event_socket->is_connected()) {
$response = event_socket::api('reloadxml');
$response = event_socket::api('callcenter_config queue '.$cmd.' '.$queue_extension.'@'.$_SESSION['domain_name']);
}
else {
$response = '';

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Copyright (C) 2015 - 2021
Copyright (C) 2015 - 2023
All Rights Reserved.
Contributor(s):
@ -26,11 +26,8 @@
/**
* cache class provides an abstracted cache
*
* @method string dialplan - builds the dialplan for call center
*/
//define the call center class
if (!class_exists('call_center')) {
class call_center {
/**
* define the variables
@ -62,16 +59,6 @@
$this->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
}
/**
* Called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* Add a dialplan for call center
* @var string $domain_uuid the multi-tenant id
@ -88,7 +75,7 @@
$array['dialplan_details'][0]['domain_uuid'] = $this->domain_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -156,7 +143,7 @@
$dialplan["dialplan_details"][$y]["dialplan_detail_order"] = $y * 10;
$y++;
if (strlen($this->queue_cid_prefix) > 0) {
if (!empty($this->queue_cid_prefix)) {
$dialplan["dialplan_details"][$y]["domain_uuid"] = $this->domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set";
@ -166,7 +153,7 @@
$y++;
}
if (strlen($this->queue_greeting) > 0) {
if (!empty($this->queue_greeting)) {
$dialplan["dialplan_details"][$y]["domain_uuid"] = $this->domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "sleep";
@ -176,7 +163,7 @@
$y++;
}
if (strlen($this->queue_greeting) > 0) {
if (!empty($this->queue_greeting)) {
$dialplan["dialplan_details"][$y]["domain_uuid"] = $this->domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "playback";
@ -186,7 +173,7 @@
$y++;
}
if (strlen($this->queue_cc_exit_keys) > 0) {
if (!empty($this->queue_cc_exit_keys)) {
$dialplan["dialplan_details"][$y]["domain_uuid"] = $this->domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set";
@ -204,7 +191,7 @@
$dialplan["dialplan_details"][$y]["dialplan_detail_order"] = $y * 10;
$y++;
if (strlen($this->queue_timeout_action) > 0) {
if (!empty($this->queue_timeout_action)) {
$action_array = explode(":",$this->queue_timeout_action);
$dialplan["dialplan_details"][$y]["domain_uuid"] = $this->domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
@ -226,7 +213,7 @@
$array["dialplans"][0] = $dialplan;
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", 'temp');
$p->add("dialplan_detail_add", 'temp');
$p->add("dialplan_edit", 'temp');
@ -252,7 +239,7 @@
$array['call_center_queues'][0]['dialplan_uuid'] = $this->dialplan_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_queue_edit', 'temp');
//execute update
@ -304,8 +291,8 @@
//filter out unchecked, build where clause for below
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = $record['uuid'];
}
}
@ -313,7 +300,7 @@
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, dialplan_uuid, queue_name, queue_extension from v_".$this->table." ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$sql .= "and ".$this->uuid_prefix."uuid in ('".implode("','", $uuids)."') ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
@ -348,18 +335,18 @@
if (is_array($array) && @sizeof($array) != 0) {
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//delete the queue in the switch
if ($fp) {
if ($esl->is_connected()) {
foreach ($uuids as $uuid) {
$cmd = "api callcenter_config queue unload ".$call_center_queues[$uuid]['queue_extension']."@".$_SESSION["domin_name"];
$response = event_socket_request($fp, $cmd);
$cmd = "callcenter_config queue unload ".$call_center_queues[$uuid]['queue_extension']."@".$_SESSION['domain_name'];
$response = event_socket::api($cmd);
}
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_delete', 'temp');
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -427,7 +414,7 @@
//filter out unchecked
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = $record['uuid'];
}
}
@ -446,18 +433,17 @@
if (is_array($array) && @sizeof($array) != 0) {
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//delete the agent in the switch
if ($fp) {
if ($esl->is_connected()) {
foreach ($uuids as $uuid) {
$cmd = "api callcenter_config agent del ".$uuid;
$response = event_socket_request($fp, $cmd);
event_socket::async("callcenter_config agent del $uuid");
}
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_delete', 'temp');
//execute delete
@ -513,8 +499,8 @@
//get checked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = $record['uuid'];
}
}
@ -523,7 +509,7 @@
//primary table
$sql = "select * from v_".$this->table." ";
$sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$sql .= "where ".$this->uuid_prefix."uuid in ('".implode("','", $uuids)."') ";
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
@ -589,7 +575,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_add', 'temp');
$p->add('dialplan_add', 'temp');
@ -622,7 +608,6 @@
} //method
} //class
}
/*
$o = new call_center;
@ -636,5 +621,3 @@ $c->destination_number = "";
$c->queue_cc_exit_keys = "";
$c->dialplan();
*/
?>

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2017-2019
Portions created by the Initial Developer are Copyright (C) 2017-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 4) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -43,45 +42,86 @@
$text = $language->get($_SESSION['domain']['language']['code'], 'app/call_centers');
//get http variables and set as php variables
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? null;
$order = $_GET["order"] ?? null;
//connect to the database
if (!isset($database)) {
$database = new database;
}
//setup the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
$esl = event_socket::create();
//get the http post values and set them as php variables
if (count($_POST) > 0) {
if (!empty($_POST['agents'])) {
//get the agent id
if (is_uuid($_POST['agents'][0]['id'])) {
$agent_uuid = $_POST['agents'][0]['id'];
}
//get the agent details from event socket
if (is_uuid($agent_uuid)) {
$switch_cmd = 'callcenter_config agent list '.$agent['call_center_agent_uuid'];
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
$call_center_agent = csv_to_named_array($event_socket_str, '|');
$agent['agent_status'] = $call_center_agent[1]['status'];
}
//find the agent_status - used for mod_call_center as there is only one agent status not one per queue
$agent_status = 'Logged Out';
foreach ($_POST['agents'] as $row) {
if (strlen($row['agent_status']) > 0) {
//agent set status
if ($fp) {
// update the database
$array['call_center_agents'][0]['call_center_agent_uuid'] = $row['id'];
$array['call_center_agents'][0]['domain_uuid'] = $_SESSION['user']['domain_uuid'];
$array['call_center_agents'][0]['agent_status'] = $row['agent_status'];
$database = new database;
$database->app_name = 'call_centers_dashboard';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array);
if ($row['agent_status'] == 'Available') {
$agent_status = 'Available';
break;
}
if ($row['agent_status'] == 'On Break') {
$agent_status = 'On Break';
break;
}
}
//set the call center status
$cmd = "api callcenter_config agent set status ".$row['id']." '".$row['agent_status']."'";
$response = event_socket_request($fp, $cmd);
//set the agent status to available and assign the agent to the queue with the tier
if ($row['agent_status'] == 'Available') {
//assign the agent to the queue
$cmd = "api callcenter_config tier add ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id']." 1 1";
$response = event_socket_request($fp, $cmd);
}
//save the agent_stat change to the database
$array['call_center_agents'][0]['call_center_agent_uuid'] = $agent_uuid;
$array['call_center_agents'][0]['domain_uuid'] = $_SESSION['user']['domain_uuid'];
$array['call_center_agents'][0]['agent_status'] = $agent_status;
$database->app_name = 'call_centers_dashboard';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$result = $database->save($array);
//un-assign the agent from the queue
if ($row['agent_status'] == 'Logged Out') {
$cmd = "api callcenter_config tier del ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id'];
$response = event_socket_request($fp, $cmd);
}
usleep(200);
unset($parameters);
}
//send the agent status status to mod_call_center
$cmd = "callcenter_config agent set status ".$agent_uuid." '".$agent_status."'";
$response = event_socket::api($cmd);
//add or delete agents from the queue assigned by the tier
foreach ($_POST['agents'] as $row) {
//agent set status
if ($fp && is_numeric($row['queue_extension']) && is_uuid($row['id'])) {
//set the agent status to available and assign the agent to the queue with the tier
if ($row['agent_status'] == 'Available') {
//assign the agent to the queue
$cmd = "callcenter_config tier add ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id']." 1 1";
$response = event_socket::api($cmd);
}
//set the agent status to available and assign the agent to the queue with the tier
if ($row['agent_status'] == 'On Break') {
//assign the agent to the queue
$cmd = "callcenter_config tier add ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id']." 1 1";
$response = event_socket::api($cmd);
}
//un-assign the agent from the queue
if ($row['agent_status'] == 'Logged Out') {
$cmd = "callcenter_config tier del ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id'];
$response = event_socket::api($cmd);
}
//small sleep
usleep(200);
}
}
@ -92,42 +132,57 @@
//get the agent list from event socket
$switch_cmd = 'callcenter_config tier list';
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
$event_socket_str = trim(event_socket::api($switch_cmd));
$call_center_tiers = csv_to_named_array($event_socket_str, '|');
//get the call center queues from the database
$sql = "select * from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by queue_extension asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$call_center_queues = $database->select($sql, $parameters, 'all');
$num_rows = !is_array($call_center_queues) ? 0 : @sizeof($call_center_queues);
unset($sql, $parameters);
//get the agents from the database
$sql = "select * from v_call_center_agents ";
$sql .= "where user_uuid = :user_uuid ";
$sql .= "and domain_uuid = :domain_uuid";
$parameters['user_uuid'] = $_SESSION['user_uuid'];
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$agents = $database->select($sql, $parameters, 'all');
if (count($agents) > 0) {
if (!empty($agents)) {
$agent = $agents[0];
}
unset($sql, $parameters);
//get the call center queues from the database
if (!empty($_SESSION['call_center']['queue_login']['text']) && $_SESSION['call_center']['queue_login']['text'] == 'dynamic') {
$sql = "select * from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and call_center_queue_uuid in ( ";
$sql .= " select call_center_queue_uuid from v_call_center_tiers ";
$sql .= " where call_center_agent_uuid = :call_center_agent_uuid ";
$sql .= ") ";
$parameters['call_center_agent_uuid'] = $agent['call_center_agent_uuid'];
$sql .= "order by queue_extension asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$call_center_queues = $database->select($sql, $parameters, 'all');
$num_rows = !is_array($call_center_queues) ? 0 : @sizeof($call_center_queues);
unset($sql, $parameters);
}
//get the agent details from event socket
$switch_cmd = 'callcenter_config agent list '.($agent['call_center_agent_uuid'] ?? null);
$event_socket_str = trim(event_socket_request($fp ?? null, 'api '.$switch_cmd));
$call_center_agent = csv_to_named_array($event_socket_str, '|');
//set the agent status
$agent['agent_status'] = $call_center_agent[1]['status'];
//update the queue status
$x = 0;
foreach ($call_center_queues as $queue) {
$call_center_queues[$x]['queue_status'] = 'Logged Out';
foreach ($call_center_tiers as $tier) {
if ($queue['queue_extension'] .'@'. $_SESSION['user']['domain_name'] == $tier['queue'] && $agent['call_center_agent_uuid'] == $tier['agent']) {
$call_center_queues[$x]['queue_status'] = $agent['agent_status'];
if (!empty($call_center_queues) && is_array($call_center_queues)) {
foreach ($call_center_queues as $queue) {
$call_center_queues[$x]['queue_status'] = 'Logged Out';
foreach ($call_center_tiers as $tier) {
if ($queue['queue_extension'] .'@'. $_SESSION['user']['domain_name'] == $tier['queue'] && $agent['call_center_agent_uuid'] == $tier['agent']) {
$call_center_queues[$x]['queue_status'] = $agent['agent_status'];
}
}
$x++;
}
$x++;
}
//includes the header
@ -135,12 +190,15 @@
//radio button cycle script
echo "<script>\n";
echo "\n";
echo " function get_selected(radio_group) {\n";
echo " for (var i = 0; i < radio_group.length; i++) {\n";
echo " if (radio_group[i].checked) { return i; }\n";
echo " }\n";
echo " return 0;\n";
echo " }\n";
echo "\n";
echo " function cycle(radio_group_name) {\n";
echo " var radios = document.getElementsByName(radio_group_name);\n";
@ -152,58 +210,100 @@
echo " radios[i+1].checked = true;\n";
echo " }\n";
echo " }\n";
echo "\n";
echo " function handle_status_change(agent_index) {\n";
echo " var agent_status = document.querySelector('input[name=\"agents[' + agent_index + '][agent_status]\"]:checked').value;\n";
echo " var radio_buttons = document.querySelectorAll('#form_list_call_center_agent_dashboard input[type=\"radio\"]');\n";
//echo "console.log('status: '+agent_status);\n";
//echo " radio_checked_value = '';\n";
echo " radio_buttons.forEach(function(radio_button) {\n";
//echo " if (radio_button.checked == true && radio_button.value === 'Available') {\n";
//echo " radio_checked_value = 'Available';\n";
//echo " }\n";
//echo " if (radio_button.checked == true && radio_button.value === 'On Break') {\n";
//echo " radio_checked_value = 'On Break';\n";
//echo " }\n";
//echo " if (radio_button.value === 'Logged Out') {\n";
//echo " radio_checked_value = 'Logged Out';\n";
//echo " }\n";
echo " if (radio_button.checked) { console.log('checked: '+radio_button.value) }\n";
echo " if (radio_button.value === 'Available' && agent_status === 'Available') {\n"; // radio_checked_value == 'On Break' &&
//echo " radio_button.checked = true;\n";
//echo " radio_button.value = 'Available';\n";
//echo " radio_button[agent_status]\"]:checked').value == 'On Break';\n";
//echo " console.log('--'+radio_button.value+'--');\n";
//echo " console.log('need to change status On Break to Available');\n";
//echo " console.log('---');\n";
echo " }\n";
echo " if (radio_button.value === 'On Break' && agent_status === 'On Break') {\n"; // radio_checked_value == 'Available' &&
//echo " radio_button.checked = true;\n";
//echo " radio_button.value = 'On Break';\n";
//echo " radio_button[agent_status]\"]:checked').value == 'On Break';\n";
//echo " console.log('--'+radio_button.value+'--');\n";
//echo " console.log('need to change status Available to On Break');\n";
//echo " console.log('---');\n";
echo " }\n";
//echo " console.log('checked: '+radio_button.checked+' value:'+radio_button.value);\n";
//echo " console.log('radio checked value: '+ radio_checked_value +' checked: '+radio_button.checked+' value:'+radio_button.value);\n";
//else if (agent_status === 'Available') {\n";
//echo " radio_button.checked = true;\n";
//echo " }\n";
echo " });\n";
echo " }\n";
echo "\n";
echo "</script>\n";
//show the content
echo "<div class='action_bar sub'>\n";
echo " <div class='heading'><b>".$text['header-call_center_queues'].($agent['agent_name'] != '' ? "&nbsp;&nbsp;&nbsp;</b> Agent: <strong>".$agent['agent_name']."</strong>" : "</b>")."</div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'collapse'=>false,'onclick'=>"list_form_submit('form_list_call_center_agent_dashboard');"]);
echo "<div class='hud_box'>";
echo "<div class='hud_content' style='display: block;'>\n";
echo " <div class='action_bar sub'>\n";
echo " <div class='heading' style='padding-left: 5px;'><b>".$text['header-call_center_queues'].(!empty($agent['agent_name']) ? "&nbsp;&nbsp;&nbsp;</b> Agent: <strong>".$agent['agent_name']."</strong>" : "</b>")."</div>\n";
echo " <div class='actions' style='padding-top: 2px;'>\n";
echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'collapse'=>false,'onclick'=>"document.getElementById('form_list_call_center_agent_dashboard').submit();"]);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo "<form id='form_list_call_center_agent_dashboard' method='post'>\n";
echo " <form id='form_list_call_center_agent_dashboard' method='post'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo " <th>".$text['label-queue_name']."</th>\n";
echo " <th class='shrink'>".$text['label-status']."</th>\n";
// echo " <th>".$text['label-options']."</th>\n";
echo "</tr>\n";
echo " <table class='list' style='padding: 0 5px;'>\n";
echo " <tr class='list-header'>\n";
echo " <th>".$text['label-queue_name']."</th>\n";
echo " <th class='shrink'>".$text['label-status']."</th>\n";
echo " </tr>\n";
if (is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
if (!empty($call_center_queues) && is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
$x = 0;
foreach ($call_center_queues as $row) {
$onclick = "onclick=\"cycle('agents[".$x."][agent_status]');\"";
$onclick = '';
echo "<tr class='list-row'>\n";
echo " <td ".$onclick.">".escape($row['queue_name'])."</td>\n";
// echo " <td>";
// if ($row['queue_status'] == "Available") {
// echo $text['option-available'];
// }
// if ($row['queue_status'] == "Logged Out") {
// echo $text['option-logged_out'];
// }
// echo " </td>\n";
echo " <td class='no-wrap right'>\n";
echo " <input type='hidden' name='agents[".$x."][queue_extension]' value='".escape($row['queue_extension'])."'>\n";
echo " <input type='hidden' name='agents[".$x."][agent_name]' value='".escape($agent['agent_name'])."'>\n";
echo " <input type='hidden' name='agents[".$x."][id]' value='".escape($agent['call_center_agent_uuid'])."'>\n";
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Available' ".($row['queue_status'] == 'Available' ? "checked='checked'" : null).">&nbsp;".$text['option-available']."</label>\n";
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Logged Out' ".($row['queue_status'] == 'Logged Out' ? "checked='checked'" : null).">&nbsp;".$text['option-logged_out']."</label>\n";
echo " <label style='margin: 0; cursor: pointer;'><input type='radio' name='agents[".$x."][agent_status]' value='On Break' ".($row['queue_status'] == 'On Break' ? "checked='checked'" : null).">&nbsp;".$text['option-on_break']."</label>\n";
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Available' ".($row['queue_status'] == 'Available' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'>&nbsp;".$text['option-available']."</label>\n";
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Logged Out' ".($row['queue_status'] == 'Logged Out' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'>&nbsp;".$text['option-logged_out']."</label>\n";
echo " <label style='margin: 0; cursor: pointer;'><input type='radio' name='agents[".$x."][agent_status]' value='On Break' ".($row['queue_status'] == 'On Break' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'>&nbsp;".$text['option-on_break']."</label>\n";
echo " </td>\n";
echo "</tr>\n";
$x++;
}
unset($call_center_queues);
}
echo "</table>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
echo " </table>\n";
echo " <br />\n";
echo " <input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo " </form>\n";
echo "</div>\n";
echo "</div>\n";
?>

View File

@ -2,7 +2,30 @@
$array['dashboard'][$x]['dashboard_uuid'] = '9083305a-ebb4-4b67-bb9b-8c09cf030261';
$array['dashboard'][$x]['dashboard_name'] = 'Call Center Agents';
$array['dashboard'][$x]['dashboard_path'] = 'app/call_centers/resources/dashboard/call_center_agents.php';
$array['dashboard'][$x]['dashboard_path'] = 'call_centers/call_center_agents';
$array['dashboard'][$x]['dashboard_icon'] = '';
$array['dashboard'][$x]['dashboard_url'] = '';
$array['dashboard'][$x]['dashboard_target'] = '';
$array['dashboard'][$x]['dashboard_width'] = '';
$array['dashboard'][$x]['dashboard_height'] = '';
$array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#3164AD';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '2';
$array['dashboard'][$x]['dashboard_details_state'] = 'none';
$array['dashboard'][$x]['dashboard_order'] = '180';
$array['dashboard'][$x]['dashboard_enabled'] = 'false';
$array['dashboard'][$x]['dashboard_description'] = 'Status for agent in a call center.';

View File

@ -0,0 +1,118 @@
<?php
//check the permission
if (defined('STDIN')) {
require_once dirname(__DIR__, 4) . "/resources/require.php";
}
else {
exit;
}
//increase limits
set_time_limit(300);
ini_set('max_execution_time',300); //5 minutes
ini_set('memory_limit', '256M');
//save the arguments to variables
$script_name = $argv[0];
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
//get the primary key
if (Is_array($_GET)) {
$hostname = urldecode($_GET['hostname']);
$debug = $_GET['debug'];
$sleep_seconds = $_GET['sleep'];
}
else {
//invalid uuid
exit;
}
//connect to event socket
$esl = event_socket::create();
//get the agent list from event socket
$switch_cmd = 'callcenter_config agent list';
$event_socket_str = trim(event_socket::api($switch_cmd));
$agent_list = csv_to_named_array($event_socket_str, '|');
//get the agents from the database
$sql = "select a.*, d.domain_name \n";
$sql .= "from v_call_center_agents as a, v_domains as d \n";
$sql .= "where a.domain_uuid = d.domain_uuid \n";
$sql .= "order by agent_name asc \n";
//echo $sql;
$database = new database;
$agents = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//view_array($results);
foreach($agents as $row) {
//update the agent status
if (is_array($agent_list)) {
foreach ($agent_list as $r) {
if ($r['name'] == $row['call_center_agent_uuid']) {
$agent_status = $r['status'];
}
}
}
//answer_state options: confirmed, early, and terminated
if ($agent_status == 'Available') {
$answer_state = 'confirmed';
}
else {
$answer_state = 'terminated';
}
//build the event
if ($esl->is_connected()) {
$event = "sendevent PRESENCE_IN\n";
$event .= "proto: agent\n";
$event .= "from: ".$row['agent_name']."@".$row['domain_name']."\n";
$event .= "login: ".$row['agent_name']."@".$row['domain_name']."\n";
$event .= "status: Active (1 waiting)\n";
$event .= "rpid: unknown\n";
$event .= "event_type: presence\n";
$event .= "alt_event_type: dialog\n";
$event .= "event_count: 1\n";
$event .= "unique-id: ".uuid()."\n";
$event .= "Presence-Call-Direction: outbound\n";
$event .= "answer-state: ".$answer_state."\n";
$event = "sendevent PRESENCE_IN\n";
$event .= "proto: agent\n";
$event .= "from: ".$row['agent_id']."@".$row['domain_name']."\n";
$event .= "login: ".$row['agent_id']."@".$row['domain_name']."\n";
$event .= "status: Active (1 waiting)\n";
$event .= "rpid: unknown\n";
$event .= "event_type: presence\n";
$event .= "alt_event_type: dialog\n";
$event .= "event_count: 1\n";
$event .= "unique-id: ".uuid()."\n";
$event .= "Presence-Call-Direction: outbound\n";
$event .= "answer-state: ".$answer_state."\n";
}
//send message to the console
if (isset($debug)) {
echo "\n";
echo "[presence][call_center] agent+".$row['agent_name']."@".$row['domain_name']." agent_status ".$agent_status." answer_state ".$answer_state."\n";
}
//send the event
$result = event_socket::command($event);
if (isset($debug)) {
print_r($result, false);
}
}
/*
* * * * * cd /var/www/fusionpbx && php /var/www/fusionpbx/app/call_centers/resources/jobs/call_center_agents.php
*/
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -0,0 +1,131 @@
<?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) 2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
use maximal\audio\Waveform;
//check permisions
if (permission_exists('recording_play')) {
//access granted
}
else {
echo "access denied";
exit;
}
//create the waveform file
if ($_GET['id'] && !empty($_GET['data']) && !empty($_GET['type'])) {
//determine path of audio file by type
if ($_GET['type'] == 'recordings') {
$slash = substr($_GET['data'],0,1) != '/' ? '/' : null;
$full_file_path = $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].$slash.str_replace($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'], '', $_GET['data']);
}
else if ($_GET['type'] == 'sounds') {
//get first installed language (like en/us/callie)
$language_paths = glob($_SESSION["switch"]['sounds']['dir']."/*/*/*");
foreach ($language_paths as $key => $path) {
$path = str_replace($_SESSION["switch"]['sounds']['dir'].'/', "", $path);
$path_array = explode('/', $path);
if (count($path_array) <> 3 || strlen($path_array[0]) <> 2 || strlen($path_array[1]) <> 2) {
unset($language_paths[$key]);
}
$language_paths[$key] = str_replace($_SESSION["switch"]['sounds']['dir']."/","",$language_paths[$key] ?? '');
if (empty($language_paths[$key])) {
unset($language_paths[$key]);
}
}
$language_path = $language_paths[0];
//determine the path for sound file
$filename_parts = explode('/', str_replace('..', '', $_GET['data']));
if (!is_array($filename_parts) || @sizeof($filename_parts) != 2) { exit; }
$path = $_SESSION['switch']['sounds']['dir'].'/'.$language_path.'/'.$filename_parts[0].'/8000/';
//build full path to sound file
$full_file_path = $path.$filename_parts[1];
}
//stream waveform file
if (file_exists($full_file_path)) {
//temporary waveform image filename
$temp_filename = 'waveform_'.$_GET['id'].'_'.rand(0000,9999).'.png';
//create temporary waveform image, if doesn't exist
if (file_exists($temp_filename)) {
$wf = true;
}
else {
//create temporary waveform image
$waveform = new Waveform($full_file_path);
Waveform::$linesPerPixel = 1; // default: 8
Waveform::$samplesPerLine = 512; // default: 512
Waveform::$colorA = !empty($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) : [32,134,37,0.6]; // array rgba, left (a-leg) wave color
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}
//stream image to browser
if ($wf === true && file_exists($temp_filename)) {
ob_clean();
$fd = fopen($temp_filename, 'rb');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Type: image/png");
header('Content-Disposition: attachment; filename="'.$temp_filename.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Length: ".filesize($temp_filename));
ob_clean();
fpassthru($fd);
}
}
//delete temp waveform image
@unlink($temp_filename);
}
?>

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "გადართეთ ზარები ორ დანიშნულებას შორის სპეციალური კოდის აკრეფით.";
$apps[$x]['description']['nl-nl'] = "Directe oproepen tussen twee bestemmingen via een feature code.";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "";
@ -34,9 +35,9 @@
$apps[$x]['destinations'][$y]['type'] = "sql";
$apps[$x]['destinations'][$y]['label'] = "call_flows";
$apps[$x]['destinations'][$y]['name'] = "call_flows";
$apps[$x]['destinations'][$y]['sql'] = "select call_flow_name as name, call_flow_uuid as uuid, call_flow_extension as destination, call_flow_context as context from v_call_flows ";
$apps[$x]['destinations'][$y]['sql'] = "select call_flow_name as name, call_flow_uuid, call_flow_uuid as uuid, call_flow_extension as destination, call_flow_extension as extension, call_flow_context as context from v_call_flows ";
$apps[$x]['destinations'][$y]['where'] = "where domain_uuid = '\${domain_uuid}' and call_flow_enabled = 'true' ";
$apps[$x]['destinations'][$y]['order_by'] = "call_flow_name asc";
$apps[$x]['destinations'][$y]['order_by'] = "natural_sort(call_flow_extension) asc";
$apps[$x]['destinations'][$y]['field']['call_flow_uuid'] = "call_flow_uuid";
$apps[$x]['destinations'][$y]['field']['name'] = "call_flow_name";
$apps[$x]['destinations'][$y]['field']['destination'] = "destination";
@ -49,9 +50,9 @@
$apps[$x]['destinations'][$y]['type'] = "sql";
$apps[$x]['destinations'][$y]['label'] = "call_flows";
$apps[$x]['destinations'][$y]['name'] = "call_flows";
$apps[$x]['destinations'][$y]['sql'] = "select call_flow_name as name, call_flow_uuid as uuid, call_flow_extension as extension, call_flow_feature_code as destination, call_flow_context as context from v_call_flows ";
$apps[$x]['destinations'][$y]['where'] = "where domain_uuid = '\${domain_uuid}' and call_flow_enabled = 'true' ";
$apps[$x]['destinations'][$y]['order_by'] = "call_flow_extension asc";
$apps[$x]['destinations'][$y]['sql'] = "select call_flow_name as name, call_flow_uuid, call_flow_uuid as uuid, call_flow_feature_code as extension, call_flow_feature_code as destination, call_flow_context as context from v_call_flows ";
$apps[$x]['destinations'][$y]['where'] = "where domain_uuid = '\${domain_uuid}' and call_flow_feature_code is not null and call_flow_enabled = 'true' ";
$apps[$x]['destinations'][$y]['order_by'] = "natural_sort(call_flow_feature_code) asc";
$apps[$x]['destinations'][$y]['field']['uuid'] = "uuid";
$apps[$x]['destinations'][$y]['field']['name'] = "name";
$apps[$x]['destinations'][$y]['field']['destination'] = "destination";
@ -91,6 +92,16 @@
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$y++;
//default settings
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "425b6aed-5039-490a-ba31-e49aa57b5902";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_flow";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "extension_range";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "30-39";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the suggested extension range(s) for call flows";
//cache details
$apps[$x]['cache']['key'] = "dialplan.\${call_flow_context}";
@ -197,5 +208,29 @@
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the 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

@ -28,7 +28,6 @@
if ($domains_processed == 1) {
//update the dialplan order
$database = new database;
$sql = "update v_call_flows set call_flow_enabled = 'true' where call_flow_enabled is null;\n";
$database->execute($sql);
unset($sql);

File diff suppressed because it is too large Load Diff

View File

@ -3,29 +3,36 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Call Flows";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Call Flows";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "اتصل بالتدفقات";
$apps[$x]['menu'][$y]['title']['de-at'] = "Anruf Steuerung";
$apps[$x]['menu'][$y]['title']['de-ch'] = "";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Call Flows";
$apps[$x]['menu'][$y]['title']['de-de'] = "Anruf Steuerung";
$apps[$x]['menu'][$y]['title']['es-cl'] = "Flujo de Llamada";
$apps[$x]['menu'][$y]['title']['es-mx'] = "";
$apps[$x]['menu'][$y]['title']['es-mx'] = "Call Flows";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Circulation d'Appel";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "cinématiques d'Appel";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "התקשר זרימות";
$apps[$x]['menu'][$y]['title']['it-it'] = "Deviatori di Chiamata";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ზარების მიმდინარეობა";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Oproep besturing";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Przepływ rozmów";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Fluxo de chamadas";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Fluxos de chamadas";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Fluxuri de apeluri";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Переключатель вызовов";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Samtalsflöden";
$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'] = "b0939384-7055-44e8-8b4c-9f72293e1878";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/call_flows/call_flows.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$y++;
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2019
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
Lewis Hallam <lewishallam80@gmail.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
//check permissions
require_once "resources/check_auth.php";
@ -43,8 +42,20 @@
$language = new text;
$text = $language->get();
//set the defaults
$call_flow_sound = '';
$call_flow_alternate_sound = '';
$call_flow_name = '';
$call_flow_extension = '';
$call_flow_feature_code = '';
$call_flow_pin_number = '';
$call_flow_label = '';
$call_flow_alternate_label = '';
$call_flow_description = '';
$call_flow_status = '';
//action add or update
if (is_uuid($_REQUEST["id"])) {
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
$call_flow_uuid = $_REQUEST["id"];
}
@ -56,11 +67,11 @@
$destination = new destinations;
//get http post variables and set them to php variables
if (is_array($_POST)) {
if (!empty($_POST)) {
//set the variables from the http values
$call_flow_uuid = $_POST["call_flow_uuid"];
$dialplan_uuid = $_POST["dialplan_uuid"];
$call_flow_uuid = $_POST["call_flow_uuid"] ?? null;
$dialplan_uuid = $_POST["dialplan_uuid"] ?? null;
$call_flow_name = $_POST["call_flow_name"];
$call_flow_extension = $_POST["call_flow_extension"];
$call_flow_feature_code = $_POST["call_flow_feature_code"];
@ -73,7 +84,7 @@
$call_flow_alternate_sound = $_POST["call_flow_alternate_sound"];
$call_flow_alternate_destination = $_POST["call_flow_alternate_destination"];
$call_flow_context = $_POST["call_flow_context"];
$call_flow_enabled = $_POST["call_flow_enabled"];
$call_flow_enabled = $_POST["call_flow_enabled"] ?? 'false';
$call_flow_description = $_POST["call_flow_description"];
//seperate the action and the param
@ -88,7 +99,7 @@
}
//process the user data and save it to the database
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//get the uuid from the POST
if ($action == "update") {
@ -105,25 +116,25 @@
//check for all required data
$msg = '';
//if (strlen($domain_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-domain_uuid']."<br>\n"; }
//if (strlen($call_flow_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_uuid']."<br>\n"; }
//if (strlen($dialplan_uuid) == 0) { $msg .= $text['message-required']." ".$text['label-dialplan_uuid']."<br>\n"; }
//if (strlen($call_flow_name) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_name']."<br>\n"; }
if (strlen($call_flow_extension) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_extension']."<br>\n"; }
if (strlen($call_flow_feature_code) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_feature_code']."<br>\n"; }
//if (strlen($call_flow_context) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_context']."<br>\n"; }
//if (strlen($call_flow_status) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_status']."<br>\n"; }
//if (strlen($call_flow_pin_number) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_pin_number']."<br>\n"; }
//if (strlen($call_flow_label) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_label']."<br>\n"; }
//if (strlen($call_flow_sound) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_sound']."<br>\n"; }
if (strlen($call_flow_app) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_app']."<br>\n"; }
if (strlen($call_flow_data) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_data']."<br>\n"; }
//if (strlen($call_flow_alternate_label) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_label']."<br>\n"; }
//if (strlen($call_flow_alternate_sound) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_sound']."<br>\n"; }
//if (strlen($call_flow_alternate_app) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_app']."<br>\n"; }
//if (strlen($call_flow_alternate_data) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_data']."<br>\n"; }
//if (strlen($call_flow_description) == 0) { $msg .= $text['message-required']." ".$text['label-call_flow_description']."<br>\n"; }
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
//if (empty($domain_uuid)) { $msg .= $text['message-required']." ".$text['label-domain_uuid']."<br>\n"; }
//if (empty($call_flow_uuid)) { $msg .= $text['message-required']." ".$text['label-call_flow_uuid']."<br>\n"; }
//if (empty($dialplan_uuid)) { $msg .= $text['message-required']." ".$text['label-dialplan_uuid']."<br>\n"; }
//if (empty($call_flow_name)) { $msg .= $text['message-required']." ".$text['label-call_flow_name']."<br>\n"; }
if (empty($call_flow_extension)) { $msg .= $text['message-required']." ".$text['label-call_flow_extension']."<br>\n"; }
//if (empty($call_flow_feature_code)) { $msg .= $text['message-required']." ".$text['label-call_flow_feature_code']."<br>\n"; }
//if (empty($call_flow_context)) { $msg .= $text['message-required']." ".$text['label-call_flow_context']."<br>\n"; }
//if (empty($call_flow_status)) { $msg .= $text['message-required']." ".$text['label-call_flow_status']."<br>\n"; }
//if (empty($call_flow_pin_number)) { $msg .= $text['message-required']." ".$text['label-call_flow_pin_number']."<br>\n"; }
//if (empty($call_flow_label)) { $msg .= $text['message-required']." ".$text['label-call_flow_label']."<br>\n"; }
//if (empty($call_flow_sound)) { $msg .= $text['message-required']." ".$text['label-call_flow_sound']."<br>\n"; }
if (empty($call_flow_app)) { $msg .= $text['message-required']." ".($text['label-call_flow_app'] ?? '')."<br>\n"; }
if (empty($call_flow_data)) { $msg .= $text['message-required']." ".($text['label-call_flow_data'] ?? '')."<br>\n"; }
//if (empty($call_flow_alternate_label)) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_label']."<br>\n"; }
//if (empty($call_flow_alternate_sound)) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_sound']."<br>\n"; }
//if (empty($call_flow_alternate_app)) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_app']."<br>\n"; }
//if (empty($call_flow_alternate_data)) { $msg .= $text['message-required']." ".$text['label-call_flow_alternate_data']."<br>\n"; }
//if (empty($call_flow_description)) { $msg .= $text['message-required']." ".$text['label-call_flow_description']."<br>\n"; }
if (!empty($msg) && empty($_POST["persistformvar"])) {
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -137,12 +148,12 @@
}
//add the call_flow_uuid
if (!is_uuid($call_flow_uuid)) {
if (empty($call_flow_uuid)) {
$call_flow_uuid = uuid();
}
//add the dialplan_uuid
if (!is_uuid($dialplan_uuid)) {
if (empty($dialplan_uuid)) {
$dialplan_uuid = uuid();
}
@ -169,16 +180,18 @@
$destination_feature = str_replace("+", "\+", $destination_feature);
//build the xml dialplan
$dialplan_xml = "<extension name=\"".$call_flow_name."\" continue=\"\" uuid=\"".$dialplan_uuid."\">\n";
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^".$destination_feature."$\" break=\"on-true\">\n";
$dialplan_xml .= " <action application=\"answer\" data=\"\"/>\n";
$dialplan_xml .= " <action application=\"sleep\" data=\"200\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"feature_code=true\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"call_flow_uuid=".$call_flow_uuid."\"/>\n";
$dialplan_xml .= " <action application=\"lua\" data=\"call_flow.lua\"/>\n";
$dialplan_xml .= " </condition>\n";
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^".$destination_extension."$\">\n";
$dialplan_xml .= " <action application=\"set\" data=\"call_flow_uuid=".$call_flow_uuid."\"/>\n";
$dialplan_xml = "<extension name=\"".xml::sanitize($call_flow_name)."\" continue=\"\" uuid=\"".xml::sanitize($dialplan_uuid)."\">\n";
if (!empty($call_flow_feature_code)) {
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^".xml::sanitize($destination_feature)."$\" break=\"on-true\">\n";
$dialplan_xml .= " <action application=\"answer\" data=\"\"/>\n";
$dialplan_xml .= " <action application=\"sleep\" data=\"200\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"feature_code=true\"/>\n";
$dialplan_xml .= " <action application=\"set\" data=\"call_flow_uuid=".xml::sanitize($call_flow_uuid)."\"/>\n";
$dialplan_xml .= " <action application=\"lua\" data=\"call_flow.lua\"/>\n";
$dialplan_xml .= " </condition>\n";
}
$dialplan_xml .= " <condition field=\"destination_number\" expression=\"^".xml::sanitize($destination_extension)."$\">\n";
$dialplan_xml .= " <action application=\"set\" data=\"call_flow_uuid=".xml::sanitize($call_flow_uuid)."\"/>\n";
$dialplan_xml .= " <action application=\"lua\" data=\"call_flow.lua\"/>\n";
$dialplan_xml .= " </condition>\n";
$dialplan_xml .= "</extension>\n";
@ -224,7 +237,7 @@
$array["call_flows"][$i]["call_flow_description"] = $call_flow_description;
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");
@ -232,7 +245,7 @@
$database = new database;
$database->app_name = 'call_flows';
$database->app_uuid = 'b1b70f85-6b42-429b-8c5a-60c8b02b7d14';
if (strlen($call_flow_uuid) > 0) {
if (!empty($call_flow_uuid)) {
$database->uuid($call_flow_uuid);
}
$database->save($array);
@ -242,6 +255,29 @@
$p->delete("dialplan_add", "temp");
$p->delete("dialplan_edit", "temp");
// Update subscribed endpoints
if (!empty($call_flow_feature_code)) {
$esl = event_socket::create();
if ($esl->is_connected()) {
//send the event
$event = "sendevent PRESENCE_IN\n";
$event .= "proto: flow\n";
$event .= "event_type: presence\n";
$event .= "alt_event_type: dialog\n";
$event .= "Presence-Call-Direction: outbound\n";
$event .= "state: Active (1 waiting)\n";
$event .= "from: flow+".$call_flow_feature_code."@".$_SESSION['domain_name']."\n";
$event .= "login: flow+".$call_flow_feature_code."@".$_SESSION['domain_name']."\n";
$event .= "unique-id: ".$call_flow_uuid."\n";
if ($call_flow_status == "true") {
$event .= "answer-state: confirmed\n";
} else {
$event .= "answer-state: terminated\n";
}
event_socket::command($event);
}
}
//debug info
//echo "<pre>";
//print_r($message);
@ -271,10 +307,10 @@
header("Location: call_flows.php");
return;
}
} //(is_array($_POST) && strlen($_POST["persistformvar"]) == 0)
} //(is_array($_POST) && empty($_POST["persistformvar"]))
//pre-populate the form
if (is_array($_GET) && $_POST["persistformvar"] != "true") {
if (!empty($_GET) && empty($_POST["persistformvar"])) {
$call_flow_uuid = $_GET["id"];
$sql = "select * from v_call_flows ";
$sql .= "where domain_uuid = :domain_uuid ";
@ -324,155 +360,16 @@
}
//set the context for users that are not in the superadmin group
if (strlen($call_flow_context) == 0) {
if (empty($call_flow_context)) {
$call_flow_context = $_SESSION['domain_name'];
}
//get the recordings
$sql = "select recording_name, recording_filename from v_recordings ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by recording_name asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$recordings = $database->select($sql, $parameters, 'all');
unset($parameters, $sql);
//set the defaults
if (empty($call_flow_enabled)) { $call_flow_enabled = 'true'; }
if (if_group("superadmin")) {
echo "<script>\n";
echo "var Objs;\n";
echo "\n";
echo "function changeToInput(obj){\n";
echo " tb=document.createElement('INPUT');\n";
echo " tb.type='text';\n";
echo " tb.name=obj.name;\n";
echo " tb.setAttribute('class', 'formfld');\n";
//echo " tb.setAttribute('style', 'width: 380px;');\n";
echo " tb.value=obj.options[obj.selectedIndex].value;\n";
echo " tbb=document.createElement('INPUT');\n";
echo " tbb.setAttribute('class', 'btn');\n";
echo " tbb.setAttribute('style', 'margin-left: 4px;');\n";
echo " tbb.type='button';\n";
echo " tbb.value=$('<div />').html('&#9665;').text();\n";
echo " tbb.objs=[obj,tb,tbb];\n";
echo " tbb.onclick=function(){ Replace(this.objs); }\n";
echo " obj.parentNode.insertBefore(tb,obj);\n";
echo " obj.parentNode.insertBefore(tbb,obj);\n";
echo " obj.parentNode.removeChild(obj);\n";
echo "}\n";
echo "\n";
echo "function Replace(obj){\n";
echo " obj[2].parentNode.insertBefore(obj[0],obj[2]);\n";
echo " obj[0].parentNode.removeChild(obj[1]);\n";
echo " obj[0].parentNode.removeChild(obj[2]);\n";
echo "}\n";
echo "</script>\n";
echo "\n";
}
function sound_select_list($var, $name, $description_name, $load_sound=false) {
global $text, $recordings, $db;
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-' . $description_name]."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo "<select name='".escape($name)."' class='formfld' ".((if_group("superadmin")) ? "onchange='changeToInput(this);'" : null).">\n";
echo " <option value=''></option>\n";
//misc optgroup
if (if_group("superadmin")) {
echo "<optgroup label=".$text['miscellaneous'].">\n";
echo " <option value='say:'>say:</option>\n";
echo " <option value='tone_stream:'>tone_stream:</option>\n";
echo "</optgroup>\n";
}
//recordings
$tmp_selected = false;
if (count($recordings) > 0) {
echo "<optgroup label=".$text['recordings'].">\n";
foreach ($recordings as &$row) {
$recording_name = $row["recording_name"];
$recording_filename = $row["recording_filename"];
if ($var == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$recording_filename && strlen($var) > 0) {
$tmp_selected = true;
echo " <option value='".$_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".escape($recording_filename)."' selected='selected'>".escape($recording_name)."</option>\n";
}
else if ($var == $recording_filename && strlen($var) > 0) {
$tmp_selected = true;
echo " <option value='".escape($recording_filename)."' selected='selected'>".escape($recording_name)."</option>\n";
}
else {
echo " <option value='".escape($recording_filename)."'>".escape($recording_name)."</option>\n";
}
}
echo "</optgroup>\n";
}
//phrases
$sql = "select * from v_phrases where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$result = $database->select($sql, $parameters, 'all');
unset($parameters, $sql);
if (is_array($result)) {
echo "<optgroup label='Phrases'>\n";
foreach ($result as &$row) {
if ($var == "phrase:".$row["phrase_uuid"]) {
$tmp_selected = true;
echo " <option value='phrase:".escape($row["phrase_uuid"])."' selected='selected'>".escape($row["phrase_name"])."</option>\n";
}
else {
echo " <option value='phrase:".escape($row["phrase_uuid"])."'>".escape($row["phrase_name"])."</option>\n";
}
}
echo "</optgroup>\n";
}
//sounds
if ($load_sound) {
$file = new file;
$sound_files = $file->sounds();
if (is_array($sound_files)) {
echo "<optgroup label=".$text["sounds"].">\n";
foreach ($sound_files as $value) {
if (strlen($value) > 0) {
if (substr($var, 0, 71) == "\$\${sounds_dir}/\${default_language}/\${default_dialect}/\${default_voice}/") {
$var = substr($var, 71);
}
if ($var == $value) {
$tmp_selected = true;
echo " <option value='".escape($value)."' selected='selected'>".escape($value)."</option>\n";
}
else {
echo " <option value='".escape($value)."'>".escape($value)."</option>\n";
}
}
}
echo "</optgroup>\n";
}
}
//select
if (if_group("superadmin")) {
if (!$tmp_selected && strlen($var) > 0) {
echo "<optgroup label='Selected'>\n";
if (file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$var)) {
echo " <option value='".$_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".escape($var)."' selected='selected'>".escape($var)."</option>\n";
}
else if (substr($var, -3) == "wav" || substr($var, -3) == "mp3") {
echo " <option value='".escape($var)."' selected='selected'>".escape($var)."</option>\n";
}
else {
echo " <option value='".escape($var)."' selected='selected'>".escape($var)."</option>\n";
}
echo "</optgroup>\n";
}
unset($tmp_selected);
}
echo " </select>\n";
echo " <br />\n";
echo $text['description-' . $description_name]."\n";
echo "</td>\n";
echo "</tr>\n";
}
//get the sounds
$sounds = new sounds;
$audio_files = $sounds->get();
//create token
$object = new token;
@ -483,6 +380,73 @@
require_once "resources/header.php";
//show the content
if (permission_exists('recording_play') || permission_exists('recording_download')) {
echo "<script type='text/javascript' language='JavaScript'>\n";
echo " function set_playable(id, audio_selected, audio_type) {\n";
echo " file_ext = audio_selected.split('.').pop();\n";
echo " var mime_type = '';\n";
echo " switch (file_ext) {\n";
echo " case 'wav': mime_type = 'audio/wav'; break;\n";
echo " case 'mp3': mime_type = 'audio/mpeg'; break;\n";
echo " case 'ogg': mime_type = 'audio/ogg'; break;\n";
echo " }\n";
echo " if (mime_type != '' && (audio_type == 'recordings' || audio_type == 'sounds')) {\n";
echo " if (audio_type == 'recordings') {\n";
echo " $('#recording_audio_' + id).attr('src', '../recordings/recordings.php?action=download&type=rec&filename=' + audio_selected);\n";
echo " }\n";
echo " else if (audio_type == 'sounds') {\n";
echo " $('#recording_audio_' + id).attr('src', '../switch/sounds.php?action=download&filename=' + audio_selected);\n";
echo " }\n";
echo " $('#recording_audio_' + id).attr('type', mime_type);\n";
echo " $('#recording_button_' + id).show();\n";
echo " }\n";
echo " else {\n";
echo " $('#recording_button_' + id).hide();\n";
echo " $('#recording_audio_' + id).attr('src','').attr('type','');\n";
echo " }\n";
echo " }\n";
echo "</script>\n";
}
if (if_group("superadmin")) {
echo "<script type='text/javascript' language='JavaScript'>\n";
echo " var objs;\n";
echo " function toggle_select_input(obj, instance_id){\n";
echo " tb=document.createElement('INPUT');\n";
echo " tb.type='text';\n";
echo " tb.name=obj.name;\n";
echo " tb.className='formfld';\n";
echo " tb.setAttribute('id', instance_id);\n";
echo " tb.setAttribute('style', 'width: ' + obj.offsetWidth + 'px;');\n";
if (!empty($on_change)) {
echo " tb.setAttribute('onchange', \"".$on_change."\");\n";
echo " tb.setAttribute('onkeyup', \"".$on_change."\");\n";
}
echo " tb.value=obj.options[obj.selectedIndex].value;\n";
echo " document.getElementById('btn_select_to_input_' + instance_id).style.display = 'none';\n";
echo " tbb=document.createElement('INPUT');\n";
echo " tbb.setAttribute('class', 'btn');\n";
echo " tbb.setAttribute('style', 'margin-left: 4px;');\n";
echo " tbb.type='button';\n";
echo " tbb.value=$('<div />').html('&#9665;').text();\n";
echo " tbb.objs=[obj,tb,tbb];\n";
echo " tbb.onclick=function(){ replace_element(this.objs, instance_id); }\n";
echo " obj.parentNode.insertBefore(tb,obj);\n";
echo " obj.parentNode.insertBefore(tbb,obj);\n";
echo " obj.parentNode.removeChild(obj);\n";
echo " replace_element(this.objs, instance_id);\n";
echo " }\n";
echo " function replace_element(obj, instance_id){\n";
echo " obj[2].parentNode.insertBefore(obj[0],obj[2]);\n";
echo " obj[0].parentNode.removeChild(obj[1]);\n";
echo " obj[0].parentNode.removeChild(obj[2]);\n";
echo " document.getElementById('btn_select_to_input_' + instance_id).style.display = 'inline';\n";
if (!empty($on_change)) {
echo " ".$on_change.";\n";
}
echo " }\n";
echo "</script>\n";
}
echo "<form name='frm' id='frm' method='post'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
@ -494,6 +458,7 @@
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -512,14 +477,14 @@
echo " ".$text['label-call_flow_extension']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='call_flow_extension' maxlength='255' value=\"".escape($call_flow_extension)."\">\n";
echo " <input class='formfld' type='text' name='call_flow_extension' maxlength='255' value=\"".escape($call_flow_extension)."\" required='required' placeholder=\"".($_SESSION['call_flow']['extension_range']['text'] ?? '')."\">\n";
echo "<br />\n";
echo $text['description-call_flow_extension']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_feature_code']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
@ -537,7 +502,7 @@
echo " <select class='formfld' name='call_flow_status'>\n";
echo " <option value=''></option>\n";
if ($call_flow_status == "true") {
if (strlen($call_flow_label) > 0) {
if (!empty($call_flow_label)) {
echo " <option value='true' selected='selected'>".escape($call_flow_label)."</option>\n";
}
else {
@ -545,7 +510,7 @@
}
}
else {
if (strlen($call_flow_label) > 0) {
if (!empty($call_flow_label)) {
echo " <option value='true'>".escape($call_flow_label)."</option>\n";
}
else {
@ -553,7 +518,7 @@
}
}
if ($call_flow_status == "false") {
if (strlen($call_flow_alternate_label) > 0) {
if (!empty($call_flow_alternate_label)) {
echo " <option value='false' selected='selected'>".escape($call_flow_alternate_label)."</option>\n";
}
else {
@ -561,7 +526,7 @@
}
}
else {
if (strlen($call_flow_alternate_label) > 0) {
if (!empty($call_flow_alternate_label)) {
echo " <option value='false'>".escape($call_flow_alternate_label)."</option>\n";
}
else {
@ -592,33 +557,91 @@
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='call_flow_label' maxlength='255' value=\"".escape($call_flow_label)."\">\n";
echo "<br />\n";
echo $text['description-call_flow_label']."\n";
echo !empty($text['description-call_flow_label'])."\n";
echo "</td>\n";
echo "</tr>\n";
sound_select_list($call_flow_sound, 'call_flow_sound', 'call_flow_sound', true);
/*
$instance_id = 'call_flow_sound';
$instance_label = 'call_flow_sound';
$instance_value = $call_flow_sound;
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_sound']."\n";
echo "<td class='vncell' rowspan='2' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-'.$instance_label]."\n";
echo "</td>\n";
echo "<td class='vtable playback_progress_bar_background' id='recording_progress_bar_".$instance_id."' onclick=\"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'));\" style='display: none; border-bottom: none; padding-top: 0 !important; padding-bottom: 0 !important;' align='left'><span class='playback_progress_bar' id='recording_progress_".$instance_id."'></span></td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='call_flow_sound' maxlength='255' value=\"".escape($call_flow_sound)."\">\n";
echo "<select name='".$instance_id."' id='".$instance_id."' class='formfld' ".(permission_exists('recording_play') || permission_exists('recording_download') ? "onchange=\"recording_reset('".$instance_id."'); set_playable('".$instance_id."', this.value, this.options[this.selectedIndex].parentNode.getAttribute('data-type'));\"" : null).">\n";
echo " <option value=''></option>\n";
$found = $playable = false;
if (!empty($audio_files) && is_array($audio_files) && @sizeof($audio_files) != 0) {
foreach ($audio_files as $key => $value) {
echo "<optgroup label=".$text['label-'.$key]." data-type='".$key."'>\n";
foreach ($value as $row) {
if ($key == 'recordings') {
if (
!empty($instance_value) &&
($instance_value == $row["value"] || $instance_value == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.$row["value"]) &&
file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.pathinfo($row["value"], PATHINFO_BASENAME))
) {
$selected = "selected='selected'";
$playable = '../recordings/recordings.php?action=download&type=rec&filename='.pathinfo($row["value"], PATHINFO_BASENAME);
$found = true;
}
else {
unset($selected);
}
}
else if ($key == 'sounds') {
if (!empty($instance_value) && $instance_value == $row["value"]) {
$selected = "selected='selected'";
$playable = '../switch/sounds.php?action=download&filename='.$row["value"];
$found = true;
}
else {
unset($selected);
}
}
else {
unset($selected);
}
echo " <option value='".escape($row["value"])."' ".($selected ?? '').">".escape($row["name"])."</option>\n";
}
echo "</optgroup>\n";
}
}
if (if_group("superadmin") && !empty($instance_value) && !$found) {
echo " <option value='".escape($instance_value)."' selected='selected'>".escape($instance_value)."</option>\n";
}
unset($selected);
echo " </select>\n";
if (if_group("superadmin")) {
echo "<input type='button' id='btn_select_to_input_".$instance_id."' class='btn' name='' alt='back' onclick='toggle_select_input(document.getElementById(\"".$instance_id."\"), \"".$instance_id."\"); this.style.visibility=\"hidden\";' value='&#9665;'>";
}
if ((permission_exists('recording_play') || permission_exists('recording_download')) && !empty($playable)) {
switch (pathinfo($playable, PATHINFO_EXTENSION)) {
case 'wav' : $mime_type = 'audio/wav'; break;
case 'mp3' : $mime_type = 'audio/mpeg'; break;
case 'ogg' : $mime_type = 'audio/ogg'; break;
}
echo "<audio id='recording_audio_".$instance_id."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".$instance_id."')\" onended=\"recording_reset('".$instance_id."');\" src='".($playable ?? '')."' type='".($mime_type ?? '')."'></audio>";
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'));"]);
unset($playable, $mime_type);
}
echo "<br />\n";
echo $text['description-call_flow_sound']."\n";
echo $text['description-'.$instance_label]."\n";
echo "</td>\n";
echo "</tr>\n";
*/
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_destination']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
$select_value = '';
//set the selected value
if (strlen($call_flow_app.$call_flow_data) > 0) {
$select_value = '';
if (!empty($call_flow_app) && !empty($call_flow_data)) {
$select_value = $call_flow_app.':'.$call_flow_data;
}
//show the destination list
@ -640,28 +663,86 @@
echo "</td>\n";
echo "</tr>\n";
sound_select_list($call_flow_alternate_sound, 'call_flow_alternate_sound', 'call_flow_alternate_sound', true);
/*
$instance_id = 'call_flow_alternate_sound';
$instance_label = 'call_flow_alternate_sound';
$instance_value = $call_flow_alternate_sound;
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_alternate_sound']."\n";
echo "<td class='vncell' rowspan='2' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-'.$instance_label]."\n";
echo "</td>\n";
echo "<td class='vtable playback_progress_bar_background' id='recording_progress_bar_".$instance_id."' onclick=\"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'));\" style='display: none; border-bottom: none; padding-top: 0 !important; padding-bottom: 0 !important;' align='left'><span class='playback_progress_bar' id='recording_progress_".$instance_id."'></span></td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='call_flow_alternate_sound' maxlength='255' value=\"".escape($call_flow_alternate_sound)."\">\n";
echo "<select name='".$instance_id."' id='".$instance_id."' class='formfld' ".(permission_exists('recording_play') || permission_exists('recording_download') ? "onchange=\"recording_reset('".$instance_id."'); set_playable('".$instance_id."', this.value, this.options[this.selectedIndex].parentNode.getAttribute('data-type'));\"" : null).">\n";
echo " <option value=''></option>\n";
$found = $playable = false;
if (!empty($audio_files) && is_array($audio_files) && @sizeof($audio_files) != 0) {
foreach ($audio_files as $key => $value) {
echo "<optgroup label=".$text['label-'.$key]." data-type='".$key."'>\n";
foreach ($value as $row) {
if ($key == 'recordings') {
if (
!empty($instance_value) &&
($instance_value == $row["value"] || $instance_value == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.$row["value"]) &&
file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.pathinfo($row["value"], PATHINFO_BASENAME))
) {
$selected = "selected='selected'";
$playable = '../recordings/recordings.php?action=download&type=rec&filename='.pathinfo($row["value"], PATHINFO_BASENAME);
$found = true;
}
else {
unset($selected);
}
}
else if ($key == 'sounds') {
if (!empty($instance_value) && $instance_value == $row["value"]) {
$selected = "selected='selected'";
$playable = '../switch/sounds.php?action=download&filename='.$row["value"];
$found = true;
}
else {
unset($selected);
}
}
else {
unset($selected);
}
echo " <option value='".escape($row["value"])."' ".($selected ?? '').">".escape($row["name"])."</option>\n";
}
echo "</optgroup>\n";
}
}
if (if_group("superadmin") && !empty($instance_value) && !$found) {
echo " <option value='".escape($instance_value)."' selected='selected'>".escape($instance_value)."</option>\n";
}
unset($selected);
echo " </select>\n";
if (if_group("superadmin")) {
echo "<input type='button' id='btn_select_to_input_".$instance_id."' class='btn' name='' alt='back' onclick='toggle_select_input(document.getElementById(\"".$instance_id."\"), \"".$instance_id."\"); this.style.visibility=\"hidden\";' value='&#9665;'>";
}
if ((permission_exists('recording_play') || permission_exists('recording_download')) && (!empty($playable) || empty($instance_value))) {
switch (pathinfo($playable, PATHINFO_EXTENSION)) {
case 'wav' : $mime_type = 'audio/wav'; break;
case 'mp3' : $mime_type = 'audio/mpeg'; break;
case 'ogg' : $mime_type = 'audio/ogg'; break;
}
echo "<audio id='recording_audio_".$instance_id."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".$instance_id."')\" onended=\"recording_reset('".$instance_id."');\" src='".($playable ?? '')."' type='".($mime_type ?? '')."'></audio>";
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'));"]);
unset($playable, $mime_type);
}
echo "<br />\n";
echo $text['description-call_flow_alternate_sound']."\n";
echo $text['description-'.$instance_label]."\n";
echo "</td>\n";
echo "</tr>\n";
*/
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_alternate_destination']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
$select_value = '';
if (strlen($call_flow_alternate_app.$call_flow_alternate_data) > 0) {
if (!empty($call_flow_alternate_app) && !empty($call_flow_alternate_data)) {
$select_value = $call_flow_alternate_app.':'.$call_flow_alternate_data;
}
echo $destination->select('dialplan', 'call_flow_alternate_destination', $select_value);
@ -689,21 +770,18 @@
echo " ".$text['label-enabled']."\n";
echo "</td>\n";
echo "<td width=\"70%\" class='vtable' align='left'>\n";
echo " <select class='formfld' name='call_flow_enabled'>\n";
if ($call_flow_enabled == "true") {
echo " <option value='true' selected='selected'>".$text['option-true']."</option>\n";
if (substr($_SESSION['theme']['input_toggle_style']['text'], 0, 6) == 'switch') {
echo " <label class='switch'>\n";
echo " <input type='checkbox' id='call_flow_enabled' name='call_flow_enabled' value='true' ".($call_flow_enabled == 'true' ? "checked='checked'" : null).">\n";
echo " <span class='slider'></span>\n";
echo " </label>\n";
}
else {
echo " <option value='true'>".$text['option-true']."</option>\n";
echo " <select class='formfld' id='call_flow_enabled' name='call_flow_enabled'>\n";
echo " <option value='true' ".($call_flow_enabled == 'true' ? "selected='selected'" : null).">".$text['option-true']."</option>\n";
echo " <option value='false' ".($call_flow_enabled == 'false' ? "selected='selected'" : null).">".$text['option-false']."</option>\n";
echo " </select>\n";
}
if ($call_flow_enabled == "false") {
echo " <option value='false' selected='selected'>".$text['option-false']."</option>\n";
}
else {
echo " <option value='false'>".$text['option-false']."</option>\n";
}
echo " </select>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-call_flow_description']."\n";
@ -711,11 +789,12 @@
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='call_flow_description' maxlength='255' value=\"".escape($call_flow_description)."\">\n";
echo "<br />\n";
echo $text['description-call_flow_description']."\n";
echo !empty($text['description-call_flow_description'])."\n";
echo "</td>\n";
echo "</tr>\n";
echo "</table>";
echo "</div>\n";
echo "<br /><br />";
if ($action == "update") {

View File

@ -17,16 +17,15 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2020
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/paging.php";
require_once "resources/check_auth.php";
@ -43,16 +42,24 @@
$language = new text;
$text = $language->get();
//set additional variables
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get search
$search = $_REQUEST['search'] ?? null;
//get posted data
if (is_array($_POST['call_flows'])) {
if (!empty($_POST['call_flows'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$call_flows = $_POST['call_flows'];
$toggle_field = $_POST['toggle_field'];
}
//process the http post data by action
if ($action != '' && is_array($call_flows) && @sizeof($call_flows) != 0) {
if (!empty($action) && !empty($call_flows)) {
switch ($action) {
case 'copy':
if (permission_exists('call_flow_add')) {
@ -80,12 +87,13 @@
}
//get variables used to control the order
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? '';
$order = $_GET["order"] ?? '';
$sort = $order_by == 'call_flow_extension' ? 'natural' : null;
//add the search term
$search = strtolower($_GET["search"]);
if (strlen($search) > 0) {
$search = strtolower($search ?? '');
if (!empty($search)) {
$sql_search = "and (";
$sql_search .= "lower(call_flow_name) like :search ";
$sql_search .= "or lower(call_flow_extension) like :search ";
@ -102,32 +110,32 @@
//prepare to page the results
$sql = "select count(*) from v_call_flows ";
$sql .= "where true ";
if ($_GET['show'] != "all" || !permission_exists('call_flow_all')) {
if ($show != "all" || !permission_exists('call_flow_all')) {
$sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
$sql .= $sql_search;
$sql .= $sql_search ?? '';
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$rows_per_page = (!empty($_SESSION['domain']['paging']['numeric'])) ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "&search=".urlencode($search);
if ($_GET['show'] == "all" && permission_exists('call_flow_all')) {
if ($show == "all" && permission_exists('call_flow_all')) {
$param .= "&show=all";
}
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
$page = $_GET['page'] ?? '';
if (empty($page)) { $page = 0; $_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;
//get the list
$sql = str_replace('count(*)', '*', $sql);
$sql .= order_by($order_by, $order, 'call_flow_name', 'asc');
$sql = str_replace('count(*)', '*', $sql ?? '');
$sql .= order_by($order_by, $order, 'call_flow_name', 'asc', $sort);
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$call_flows = $database->select($sql, $parameters, 'all');
$call_flows = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//create token
@ -150,7 +158,7 @@
//show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-call_flows']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>".$text['title-call_flows']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if (permission_exists('call_flow_add')) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','link'=>'call_flow_edit.php']);
@ -171,7 +179,7 @@
}
echo "<form id='form_search' class='inline' method='get'>\n";
if (permission_exists('call_flow_all')) {
if ($_GET['show'] == 'all') {
if ($show == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
else {
@ -207,14 +215,15 @@
echo "<input type='hidden' id='toggle_field' name='toggle_field' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_flow_add') || permission_exists('call_flow_edit') || permission_exists('call_flow_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".($call_flows ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(!empty($call_flows) ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_flow_all')) {
if ($show == "all" && permission_exists('call_flow_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, $param, "class='shrink'");
}
echo th_order_by('call_flow_name', $text['label-call_flow_name'], $order_by, $order);
@ -226,16 +235,20 @@
}
echo th_order_by('call_flow_enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('call_flow_description', $text['label-call_flow_description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('call_flow_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_flow_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($call_flows)) {
if (!empty($call_flows)) {
$x = 0;
foreach ($call_flows as $row) {
$list_row_url = '';
if (permission_exists('call_flow_edit')) {
$list_row_url = "call_flow_edit.php?id=".urlencode($row['call_flow_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_flow_add') || permission_exists('call_flow_edit') || permission_exists('call_flow_delete')) {
@ -244,8 +257,8 @@
echo " <input type='hidden' name='call_flows[$x][uuid]' value='".escape($row['call_flow_uuid'])."' />\n";
echo " </td>\n";
}
if ($_GET['show'] == "all" && permission_exists('call_flow_all')) {
if (strlen($_SESSION['domains'][$row['domain_uuid']]['domain_name']) > 0) {
if ($show == "all" && permission_exists('call_flow_all')) {
if (!empty($_SESSION['domains'][$row['domain_uuid']]['domain_name'])) {
$domain = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
}
else {
@ -278,7 +291,7 @@
echo escape($row['call_flow_enabled']);
}
echo " <td class='description overflow hide-sm-dn'>".escape($row['call_flow_description'])."&nbsp;</td>\n";
if (permission_exists('call_flow_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('call_flow_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -290,6 +303,7 @@
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
@ -301,3 +315,4 @@
require_once "resources/footer.php";
?>

View File

@ -25,7 +25,6 @@
*/
//define the call_flows class
if (!class_exists('call_flows')) {
class call_flows {
/**
@ -60,16 +59,6 @@ if (!class_exists('call_flows')) {
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* delete records
*/
@ -131,7 +120,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -197,17 +186,20 @@ if (!class_exists('call_flows')) {
$uuids[] = "'".$record['uuid']."'";
}
}
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, ".$this->toggle_field." as toggle, dialplan_uuid, call_flow_context from v_".$this->table." ";
if (!empty($uuids)) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, ".$this->toggle_field." as toggle, ";
$sql .= "dialplan_uuid, call_flow_feature_code, call_flow_context from v_".$this->table." ";
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
if (!empty($rows)) {
foreach ($rows as $row) {
$call_flows[$row['uuid']]['state'] = $row['toggle'];
$call_flows[$row['uuid']]['dialplan_uuid'] = $row['dialplan_uuid'];
$call_flows[$row['uuid']]['call_flow_feature_code'] = $row['call_flow_feature_code'];
$call_flow_contexts[] = $row['call_flow_context'];
}
}
@ -230,7 +222,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
//save the array
@ -263,7 +255,36 @@ if (!class_exists('call_flows')) {
//set message
message::add($text['message-toggle']);
}
unset($records, $call_flows);
unset($records);
//toggle the presence
if ($this->toggle_field != 'call_flow_enabled') {
foreach($call_flows as $uuid => $row) {
//prepare the event
$cmd = "sendevent PRESENCE_IN\n";
$cmd .= "proto: flow\n";
$cmd .= "login: ".$row['call_flow_feature_code']."@".$_SESSION['domain_name']."\n";
$cmd .= "from: ".$row['call_flow_feature_code']."@".$_SESSION['domain_name']."\n";
$cmd .= "status: Active (1 waiting)\n";
$cmd .= "rpid: unknown\n";
$cmd .= "event_type: presence\n";
$cmd .= "alt_event_type: dialog\n";
$cmd .= "event_count: 1\n";
$cmd .= "unique-id: ".uuid()."\n";
$cmd .= "Presence-Call-Direction: outbound\n";
if ($call_flow['state'] == 'true') {
$cmd .= "answer-state: confirmed\n";
}
else {
$cmd .= "answer-state: terminated\n";
}
//send the event
$switch_result = event_socket::command($cmd);
}
}
unset($call_flows);
}
}
@ -352,7 +373,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_add', 'temp');
//save the array
@ -388,6 +409,3 @@ if (!class_exists('call_flows')) {
} //method
} //class
}
?>

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

131
app/call_flows/waveform.php Normal file
View File

@ -0,0 +1,131 @@
<?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) 2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
use maximal\audio\Waveform;
//check permisions
if (permission_exists('recording_play')) {
//access granted
}
else {
echo "access denied";
exit;
}
//create the waveform file
if ($_GET['id'] && !empty($_GET['data']) && !empty($_GET['type'])) {
//determine path of audio file by type
if ($_GET['type'] == 'recordings') {
$slash = substr($_GET['data'],0,1) != '/' ? '/' : null;
$full_file_path = $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].$slash.str_replace($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'], '', $_GET['data']);
}
else if ($_GET['type'] == 'sounds') {
//get first installed language (like en/us/callie)
$language_paths = glob($_SESSION["switch"]['sounds']['dir']."/*/*/*");
foreach ($language_paths as $key => $path) {
$path = str_replace($_SESSION["switch"]['sounds']['dir'].'/', "", $path);
$path_array = explode('/', $path);
if (count($path_array) <> 3 || strlen($path_array[0]) <> 2 || strlen($path_array[1]) <> 2) {
unset($language_paths[$key]);
}
$language_paths[$key] = str_replace($_SESSION["switch"]['sounds']['dir']."/","",$language_paths[$key] ?? '');
if (empty($language_paths[$key])) {
unset($language_paths[$key]);
}
}
$language_path = $language_paths[0];
//determine the path for sound file
$filename_parts = explode('/', str_replace('..', '', $_GET['data']));
if (!is_array($filename_parts) || @sizeof($filename_parts) != 2) { exit; }
$path = $_SESSION['switch']['sounds']['dir'].'/'.$language_path.'/'.$filename_parts[0].'/8000/';
//build full path to sound file
$full_file_path = $path.$filename_parts[1];
}
//stream waveform file
if (file_exists($full_file_path)) {
//temporary waveform image filename
$temp_filename = 'waveform_'.$_GET['id'].'_'.rand(0000,9999).'.png';
//create temporary waveform image, if doesn't exist
if (file_exists($temp_filename)) {
$wf = true;
}
else {
//create temporary waveform image
$waveform = new Waveform($full_file_path);
Waveform::$linesPerPixel = 1; // default: 8
Waveform::$samplesPerLine = 512; // default: 512
Waveform::$colorA = !empty($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) : [32,134,37,0.6]; // array rgba, left (a-leg) wave color
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}
//stream image to browser
if ($wf === true && file_exists($temp_filename)) {
ob_clean();
$fd = fopen($temp_filename, 'rb');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Type: image/png");
header('Content-Disposition: attachment; filename="'.$temp_filename.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Length: ".filesize($temp_filename));
ob_clean();
fpassthru($fd);
}
}
//delete temp waveform image
@unlink($temp_filename);
}
?>

View File

@ -20,6 +20,7 @@
$apps[$x]['description']['fr-fr'] = "Renvoi d'appel, Follow Me et ne pas deranger.";
$apps[$x]['description']['he-il'] = "";
$apps[$x]['description']['it-it'] = "";
$apps[$x]['description']['ka-ge'] = "ზარის გადამისამართება, მომყევი და არ შემაწუხო.";
$apps[$x]['description']['nl-nl'] = "Oproep doorsturen, Volg mij en Niet storen";
$apps[$x]['description']['pl-pl'] = "";
$apps[$x]['description']['pt-br'] = "Desvio de chamadas, Siga-me e Não perturbe (DND).";
@ -80,5 +81,37 @@
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_order'] = "0";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the default Follow Me Timeout value.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "408becd6-35ec-46f8-bca9-452d0fc474b6";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "dashboard_call_forward_chart_color_call_forward";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "#2a9df4";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "d385b1f4-76b0-4454-a9b8-11899f6407dd";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "dashboard_call_forward_chart_color_follow_me";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "#03c04a";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "32ef2f93-6fde-409f-82cd-aabe506892df";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "dashboard_call_forward_chart_color_do_not_disturb";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "#ea4c46";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "d0c9bb4c-5d7b-46c2-8651-b0324db6f26f";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "dashboard_call_forward_chart_color_active";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "#d4d4d4";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
?>

View File

@ -1,31 +0,0 @@
<?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) 2008-2016
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//process this only one time
if ($domains_processed == 1) {
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
$y=0;
$apps[$x]['menu'][$y]['title']['en-us'] = "Call Forward";
$apps[$x]['menu'][$y]['title']['en-gb'] = "Call Forward";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "";
$apps[$x]['menu'][$y]['title']['ar-eg'] = "نداء إلى الأمام";
$apps[$x]['menu'][$y]['title']['de-at'] = "Rufumleitung";
$apps[$x]['menu'][$y]['title']['de-ch'] = "Rufumleitung";
$apps[$x]['menu'][$y]['title']['de-de'] = "Rufumleitung";
@ -11,23 +11,29 @@
$apps[$x]['menu'][$y]['title']['es-mx'] = "Reenvio de Llamadas";
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Renvoi d'appel";
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Renvoi d'appel";
$apps[$x]['menu'][$y]['title']['he-il'] = "";
$apps[$x]['menu'][$y]['title']['he-il'] = "העבר שיחה";
$apps[$x]['menu'][$y]['title']['it-it'] = "Inoltro";
$apps[$x]['menu'][$y]['title']['ka-ge'] = "ზარის გადამისამართება";
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Oproep doorsturen";
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Przekierowanie";
$apps[$x]['menu'][$y]['title']['pt-br'] = "Encaminhamento de chamadas";
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Encaminhamento de Chamadas";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "";
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Redirectionare apel";
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Переадресация";
$apps[$x]['menu'][$y]['title']['sv-se'] = "Vidarekoppling";
$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'] = "4e4df00b-aafb-45a8-82c1-cdabc921889c";
$apps[$x]['menu'][$y]['parent_uuid'] = "fd29e39c-c936-f5fc-8e2b-611681b266b5";
$apps[$x]['menu'][$y]['category'] = "internal";
$apps[$x]['menu'][$y]['icon'] = "";
$apps[$x]['menu'][$y]['path'] = "/app/call_forward/call_forward.php";
$apps[$x]['menu'][$y]['order'] = "";
$apps[$x]['menu'][$y]['groups'][] = "user";
$apps[$x]['menu'][$y]['groups'][] = "admin";
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
$y++;
?>

View File

@ -1,32 +1,35 @@
<?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/
/*
FusionPBX
Version: MPL 1.1
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 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/
The Original Code is FusionPBX
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 Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2021
the Initial Developer. All Rights Reserved.
The Original Code is FusionPBX
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
//includes
include "root.php";
require_once "resources/require.php";
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//set default
$is_included = false;
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
@ -43,15 +46,13 @@
$language = new text;
$text = $language->get($_SESSION['domain']['language']['code'], 'app/call_forward');
//get posted data
if (is_array($_POST['extensions'])) {
$action = $_POST['action'];
$search = $_POST['search'];
$extensions = $_POST['extensions'];
}
//get posted data and set defaults
$action = $_POST['action'] ?? '';
$search = $_POST['search'] ?? '';
$extensions = $_POST['extensions'] ?? [];
//process the http post data by action
if ($action != '' && is_array($extensions) && @sizeof($extensions) != 0) {
if (!empty($action) && count($extensions) > 0) {
switch ($action) {
case 'toggle_call_forward':
if (permission_exists('call_forward')) {
@ -73,101 +74,111 @@
break;
}
header('Location: call_forward.php'.($search != '' ? '?search='.urlencode($search) : null));
header('Location: call_forward.php' . ($search != '' ? '?search=' . urlencode($search) : null));
exit;
}
//get order and order by
$order_by = $_GET["order_by"];
$order = $_GET["order"];
$order_by = $_GET["order_by"] ?? 'extension';
$order = $_GET["order"] ?? 'asc';
$sort = $order_by == 'extension' ? 'natural' : null;
//get the search
$search = strtolower($_GET["search"]);
$search = strtolower($_GET["search"] ?? '');
//set the show variable
$show = $_GET['show'] ?? '';
//define select count query
$sql = "select count(*) from v_extensions ";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
if ($show === "all" && permission_exists('call_forward_all')) {
$sql .= "where true ";
}
else {
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (strlen($search) > 0) {
if (!empty($search)) {
$sql .= "and ( ";
$sql .= "extension like :search ";
$sql .= "or lower(description) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
$parameters['search'] = '%' . $search . '%';
}
$sql .= "and enabled = 'true' ";
if (!permission_exists('extension_edit')) {
if (is_array($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
if (!empty($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
$sql .= "and (";
$x = 0;
foreach($_SESSION['user']['extension'] as $row) {
if ($x > 0) { $sql .= "or "; }
$sql .= "extension = '".$row['user']."' ";
foreach ($_SESSION['user']['extension'] as $row) {
if ($x > 0) {
$sql .= "or ";
}
$sql .= "extension = '" . $row['user'] . "' ";
$x++;
}
$sql .= ")";
}
else {
} else {
//used to hide any results when a user has not been assigned an extension
$sql .= "and extension = 'disabled' ";
}
}
$sql .= $sql_search;
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
$num_rows = $database->select($sql, $parameters ?? null, 'column');
unset($parameters);
//prepare the paging
if ($is_included) {
$rows_per_page = 10;
$rows_per_page = !empty($_SESSION['domain']['paging']['numeric']) ? $_SESSION['domain']['paging']['numeric'] : 50;
if ($search) {
$params[] = "search=" . $search;
}
else {
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
if ($order_by) {
$params[] = "order_by=" . $order_by;
}
$params[] = "app_uuid=".$app_uuid;
if ($search) { $params[] = "search=".$search; }
if ($order_by) { $params[] = "order_by=".$order_by; }
if ($order) { $params[] = "order=".$order; }
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
$params[] .= "show=all";
if ($order) {
$params[] = "order=" . $order;
}
$param = $params ? implode('&', $params) : null;
if ($show == "all" && permission_exists('call_forward_all')) {
$params[] = "show=all";
}
$param = !empty($params) ? implode('&', $params) : '';
unset($params);
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
$page = $_GET['page'] ?? '';
if (empty($page)) {
$page = 0;
$_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;
//get the list
$sql = "select * from v_extensions ";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
if ($show == "all" && permission_exists('call_forward_all')) {
$sql .= "where true ";
}
else {
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
if (strlen($search) > 0) {
if (!empty($search)) {
$sql .= "and ( ";
$sql .= "extension like :search ";
$sql .= "or lower(description) like :search ";
$sql .= ") ";
$parameters['search'] = '%'.$search.'%';
$parameters['search'] = '%' . $search . '%';
}
$sql .= "and enabled = 'true' ";
if (!permission_exists('extension_edit')) {
if (is_array($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
if (!empty($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
$sql .= "and (";
$x = 0;
foreach($_SESSION['user']['extension'] as $row) {
if ($x > 0) { $sql .= "or "; }
$sql .= "extension = '".$row['user']."' ";
foreach ($_SESSION['user']['extension'] as $row) {
if ($x > 0) {
$sql .= "or ";
}
$sql .= "extension = '" . $row['user'] . "' ";
$x++;
}
$sql .= ")";
@ -177,13 +188,17 @@
$sql .= "and extension = 'disabled' ";
}
}
$sql .= $sql_search;
$sql .= order_by($order_by, $order, 'extension', 'asc');
$sql .= order_by($order_by, $order, 'extension', 'asc', $sort);
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$extensions = $database->select($sql, $parameters, 'all');
$extensions = $database->select($sql, $parameters ?? null, 'all');
unset($parameters);
//if there are no extensions then set to empty array
if ($extensions === false) {
$extensions = [];
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
@ -194,13 +209,16 @@
}
require_once "resources/header.php";
//set the back button
$_SESSION['call_forward_back'] = $_SERVER['PHP_SELF'];
//show the content
if ($is_included) {
echo "<div class='action_bar sub'>\n";
echo " <div class='heading'><b>".$text['header-call_forward']."</b></div>\n";
echo " <div class='heading'><b>" . $text['header-call_forward'] . "</b></div>\n";
echo " <div class='actions'>\n";
if ($num_rows > 10) {
echo button::create(['type'=>'button','label'=>$text['button-view_all'],'icon'=>'project-diagram','collapse'=>false,'link'=>PROJECT_PATH.'/app/call_forward/call_forward.php']);
echo button::create(['type' => 'button', 'label' => $text['button-view_all'], 'icon' => 'diagram-project', 'collapse' => false, 'link' => PROJECT_PATH . '/app/call_forward/call_forward.php']);
}
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
@ -208,10 +226,10 @@
}
else {
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-call_forward']." (".$num_rows.")</b></div>\n";
echo " <div class='heading'><b>" . $text['header-call_forward'] . "</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if ($extensions) {
if (count($extensions) > 0) {
if (permission_exists('call_forward')) {
echo button::create(['type' => 'button', 'label' => $text['label-call_forward'], 'icon' => $_SESSION['theme']['button_icon_toggle'], 'collapse' => false, 'name' => 'btn_toggle_cfwd', 'onclick' => "list_action_set('toggle_call_forward'); modal_open('modal-toggle','btn_toggle');"]);
}
@ -222,87 +240,92 @@
echo button::create(['type' => 'button', 'label' => $text['label-dnd'], 'icon' => $_SESSION['theme']['button_icon_toggle'], 'collapse' => false, 'name' => 'btn_toggle_dnd', 'onclick' => "list_action_set('toggle_do_not_disturb'); modal_open('modal-toggle','btn_toggle');"]);
}
}
if ($_GET['show'] !== 'all' && permission_exists('call_forward_all')) {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?show=all'.($params ? '&'.implode('&', $params) : null)]);
if ($show !== 'all' && permission_exists('call_forward_all')) {
echo button::create(['type' => 'button', 'label' => $text['button-show_all'], 'icon' => $_SESSION['theme']['button_icon_all'], 'link' => '?show=all' . (!empty($params) ? '&'.implode('&', $params) : null)]);
}
echo "<form id='form_search' class='inline' method='get'>\n";
if ($_GET['show'] == 'all' && permission_exists('call_forward_all')) {
echo "<form id='form_search' class='inline' method='get'>\n";
if ($show == 'all' && permission_exists('call_forward_all')) {
echo " <input type='hidden' name='show' value='all'>";
}
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']);
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']);
//echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','link'=>'call_forward.php','style'=>($search == '' ? 'display: none;' : null)]);
if ($paging_controls_mini != '') {
echo "<span style='margin-left: 15px;'>".$paging_controls_mini."</span>";
if (!empty($paging_controls_mini)) {
echo "<span style='margin-left: 15px;'>" . $paging_controls_mini . "</span>";
}
echo " </form>\n";
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if ($extensions) {
echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_form_submit('form_list');"])]);
if (count($extensions) > 0) {
echo modal::create(['id' => 'modal-toggle', 'type' => 'toggle', 'actions' => button::create(['type' => 'button', 'label' => $text['button-continue'], 'icon' => 'check', 'id' => 'btn_toggle', 'style' => 'float: right; margin-left: 15px;', 'collapse' => 'never', 'onclick' => "modal_close(); list_form_submit('form_list');"])]);
}
echo $text['description-call_routing']."\n";
echo $text['description-call_routing'] . "\n";
echo "<br /><br />\n";
echo "<form id='form_list' method='post'>\n";
if ($_GET['show'] == 'all' && permission_exists('call_forward_all')) {
if ($show == 'all' && permission_exists('call_forward_all')) {
echo " <input type='hidden' name='show' value='all'>";
}
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
echo "<input type='hidden' name='search' value=\"" . escape($search) . "\">\n";
}
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (!$is_included) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle();' ".($extensions ?: "style='visibility: hidden;'").">\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle();' " . (empty($extensions) ?: "style='visibility: hidden;'") . ">\n";
echo " </th>\n";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
echo "<th>".$text['label-domain']."</th>\n";
if ($show == "all" && permission_exists('call_forward_all')) {
echo "<th>" . $text['label-domain'] . "</th>\n";
}
}
echo " <th>".$text['label-extension']."</th>\n";
echo th_order_by('extension', $text['label-extension'], $order_by, $order);
// echo " <th>" . $text['label-extension'] . "</th>\n";
if (permission_exists('call_forward')) {
echo " <th>".$text['label-call_forward']."</th>\n";
echo " <th>" . $text['label-call_forward'] . "</th>\n";
}
if (permission_exists('follow_me')) {
echo " <th>".$text['label-follow_me']."</th>\n";
echo " <th>" . $text['label-follow_me'] . "</th>\n";
}
if (permission_exists('do_not_disturb')) {
echo " <th>".$text['label-dnd']."</th>\n";
echo " <th>" . $text['label-dnd'] . "</th>\n";
}
echo " <th class='".($is_included ? 'hide-md-dn' : 'hide-sm-dn')."'>".$text['label-description']."</th>\n";
if ($_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
echo " <th class='" . ($is_included ? 'hide-md-dn' : 'hide-sm-dn') . "'>" . $text['label-description'] . "</th>\n";
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
if ($list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
if (is_array($extensions)) {
if (!empty($extensions)) {
$x = 0;
foreach($extensions as $row) {
$list_row_url = PROJECT_PATH."/app/call_forward/call_forward_edit.php?id=".$row['extension_uuid']."&return_url=".urlencode($_SERVER['REQUEST_URI']);
echo "<tr class='list-row' href='".$list_row_url."'>\n";
foreach ($extensions as $row) {
$list_row_url = PROJECT_PATH . "/app/call_forward/call_forward_edit.php?id=" . $row['extension_uuid'] . "&return_url=" . urlencode($_SERVER['REQUEST_URI']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
echo "<tr class='list-row' href='" . $list_row_url . "'>\n";
if (!$is_included && $extensions) {
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='extensions[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"if (!this.checked) { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='extensions[$x][uuid]' value='".escape($row['extension_uuid'])."' />\n";
echo " <input type='checkbox' name='extensions[$x][checked]' id='checkbox_" . $x . "' value='true' onclick=\"if (!this.checked) { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='extensions[$x][uuid]' value='" . escape($row['extension_uuid']) . "' />\n";
echo " </td>\n";
if ($_GET['show'] == "all" && permission_exists('call_forward_all')) {
if (strlen($_SESSION['domains'][$row['domain_uuid']]['domain_name']) > 0) {
if ($show == "all" && permission_exists('call_forward_all')) {
if (!empty($_SESSION['domains'][$row['domain_uuid']]['domain_name'])) {
$domain = $_SESSION['domains'][$row['domain_uuid']]['domain_name'];
}
else {
} else {
$domain = $text['label-global'];
}
echo " <td>".escape($domain)."</td>\n";
echo " <td>" . escape($domain) . "</td>\n";
}
}
echo " <td><a href='".$list_row_url."' title=\"".$text['button-edit']."\">".escape($row['extension'])."</a></td>\n";
echo " <td><a href='" . $list_row_url . "' title=\"" . $text['button-edit'] . "\">" . escape($row['extension']) . "</a></td>\n";
if (permission_exists('call_forward')) {
//-- inline toggle -----------------
//$button_label = $row['forward_all_enabled'] == 'true' ? ($row['forward_all_destination'] != '' ? escape(format_phone($row['forward_all_destination'])) : '('.$text['label-invalid'].')') : null;
@ -345,7 +368,6 @@
//}
//unset($button_label);
//----------------------------------
//get destination count
$follow_me_destination_count = 0;
if ($row['follow_me_enabled'] == 'true' && is_uuid($row['follow_me_uuid'])) {
@ -355,11 +377,11 @@
$parameters['follow_me_uuid'] = $row['follow_me_uuid'];
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$follow_me_destination_count = $database->select($sql, $parameters, 'column');
$follow_me_destination_count = $database->select($sql, $parameters ?? null, 'column');
unset($sql, $parameters);
}
echo " <td>\n";
echo $follow_me_destination_count ? $text['label-enabled'].' ('.$follow_me_destination_count.')' : '&nbsp;';
echo $follow_me_destination_count ? $text['label-enabled'] . ' (' . $follow_me_destination_count . ')' : '&nbsp;';
echo " </td>\n";
}
if (permission_exists('do_not_disturb')) {
@ -379,10 +401,10 @@
echo $row['do_not_disturb'] == 'true' ? $text['label-enabled'] : '&nbsp;';
echo " </td>\n";
}
echo " <td class='description overflow ".($is_included ? 'hide-md-dn' : 'hide-sm-dn')."'>".escape($row['description'])."&nbsp;</td>\n";
if ($_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
echo " <td class='description overflow " . ($is_included ? 'hide-md-dn' : 'hide-sm-dn') . "'>" . escape($row['description']) . "&nbsp;</td>\n";
if ($list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
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";
@ -392,16 +414,16 @@
}
echo "</table>\n";
echo "</div>\n";
if (!$is_included) {
echo "<br />\n";
echo "<div align='center'>".$paging_controls."</div>\n";
echo "<div align='center'>" . $paging_controls . "</div>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "<input type='hidden' name='" . $token['name'] . "' value='" . $token['hash'] . "'>\n";
echo "</form>\n";
require_once "resources/footer.php";
}
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2021
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -25,9 +25,8 @@
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
//check permissions
@ -45,7 +44,7 @@
//define the destination_select function
function destination_select($select_name, $select_value, $select_default) {
if (strlen($select_value) == 0) { $select_value = $select_default; }
if (empty($select_value)) { $select_value = $select_default; }
echo " <select class='formfld' style='width: 55px;' name='$select_name'>\n";
$i = 0;
while($i <= 100) {
@ -83,7 +82,7 @@
$parameters['extension_uuid'] = $extension_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && sizeof($row) != 0) {
if (!empty($row)) {
$extension = $row["extension"];
$number_alias = $row["number_alias"];
$accountcode = $row["accountcode"];
@ -91,7 +90,7 @@
$effective_caller_id_number = $row["effective_caller_id_number"];
$outbound_caller_id_name = $row["outbound_caller_id_name"];
$outbound_caller_id_number = $row["outbound_caller_id_number"];
$do_not_disturb = $row["do_not_disturb"] != '' ? $row["do_not_disturb"] : 'false';
$do_not_disturb = !empty($row["do_not_disturb"]) ? $row["do_not_disturb"] : 'false';
$forward_all_destination = $row["forward_all_destination"];
$forward_all_enabled = $row["forward_all_enabled"];
$forward_busy_destination = $row["forward_busy_destination"];
@ -109,10 +108,10 @@
unset($sql, $parameters, $row);
//process post vars
if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
if (!empty($_POST) && empty($_POST["persistformvar"])) {
//get http post variables and set them to php variables
if (count($_POST) > 0) {
if (!empty($_POST)) {
$forward_all_enabled = $_POST["forward_all_enabled"];
$forward_all_destination = $_POST["forward_all_destination"];
$forward_busy_enabled = $_POST["forward_busy_enabled"];
@ -122,8 +121,8 @@
$forward_user_not_registered_enabled = $_POST["forward_user_not_registered_enabled"];
$forward_user_not_registered_destination = $_POST["forward_user_not_registered_destination"];
$cid_name_prefix = $_POST["cid_name_prefix"];
$cid_number_prefix = $_POST["cid_number_prefix"];
$cid_name_prefix = $_POST["cid_name_prefix"] ?? '';
$cid_number_prefix = $_POST["cid_number_prefix"] ?? '';
$follow_me_enabled = $_POST["follow_me_enabled"];
$follow_me_ignore_busy = $_POST["follow_me_ignore_busy"];
@ -135,7 +134,7 @@
$destinations[$n]['delay'] = $field['delay'];
$destinations[$n]['prompt'] = $field['prompt'];
$destinations[$n]['timeout'] = $field['timeout'];
if ($field['destination'] != '') {
if (!empty($field['destination'])) {
$destination_found = true;
}
$n++;
@ -152,8 +151,8 @@
}
//check for all required data
if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
$document['title'] = $text['title-call_routing'];
if (!empty($msg) && empty($_POST["persistformvar"])) {
$document['title'] = $text['title-call_forward'];
require_once "resources/header.php";
require_once "resources/persist_form_var.php";
echo "<div align='center'>\n";
@ -166,11 +165,6 @@
return;
}
//include the classes
include "resources/classes/call_forward.php";
include "resources/classes/follow_me.php";
include "resources/classes/do_not_disturb.php";
//call forward config
if (permission_exists('call_forward')) {
//sanitize the destinations
@ -231,7 +225,7 @@
$d = 0;
$destination_found = false;
foreach ($destinations as $field) {
if ($field['destination'] != '') {
if (!empty($field['destination'])) {
//sanitize the destination
$field['destination'] = preg_replace('#[^\*0-9]#', '', $field['destination']);
@ -254,27 +248,26 @@
}
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("extension_edit", "temp");
//save the data
$database = new database;
$database->app_name = 'call_routing';
$database->app_name = 'call_forward';
$database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d';
$database->save($array);
unset($array);
//$message = $database->message;
//remove the temporary permission
$p->delete("extension_edit", "temp");
//delete empty destination records
if (is_array($follow_me_delete_uuids) && sizeof($follow_me_delete_uuids) > 0) {
if (!empty($follow_me_delete_uuids)) {
foreach ($follow_me_delete_uuids as $follow_me_delete_uuid) {
$array['follow_me_destinations'][]['follow_me_destination_uuid'] = $follow_me_delete_uuid;
}
$database = new database;
$database->app_name = 'call_routing';
$database->app_name = 'call_forward';
$database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d';
$database->delete($array);
unset($array);
@ -348,7 +341,7 @@
*/
//send feature event notify to the phone
if ($_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
$ring_count = ceil($call_timeout / 6);
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -365,7 +358,7 @@
else {
$feature_event_notify->forward_all_destination = $forward_all_destination;
}
if ($forward_busy_destination == "") {
$feature_event_notify->forward_busy_destination = "0";
}
@ -383,9 +376,51 @@
unset($feature_event_notify);
}
//send presence event
if (permission_exists('do_not_disturb')) {
if ($dnd_enabled == 'true') {
//build the event
$cmd = "sendevent PRESENCE_IN\n";
$cmd .= "proto: sip\n";
$cmd .= "login: ".$extension."@".$_SESSION['domain_name']."\n";
$cmd .= "from: ".$extension."@".$_SESSION['domain_name']."\n";
$cmd .= "status: Active (1 waiting)\n";
$cmd .= "rpid: unknown\n";
$cmd .= "event_type: presence\n";
$cmd .= "alt_event_type: dialog\n";
$cmd .= "event_count: 1\n";
$cmd .= "unique-id: ".uuid()."\n";
$cmd .= "Presence-Call-Direction: outbound\n";
$cmd .= "answer-state: confirmed\n";
//send the event
$switch_result = event_socket::command($cmd);
}
else {
$presence = new presence;
if (!$presence->active($extension."@".$_SESSION['domain_name'])) {
//build the event
$cmd = "sendevent PRESENCE_IN\n";
$cmd .= "proto: sip\n";
$cmd .= "login: ".$extension."@".$_SESSION['domain_name']."\n";
$cmd .= "from: ".$extension."@".$_SESSION['domain_name']."\n";
$cmd .= "status: Active (1 waiting)\n";
$cmd .= "rpid: unknown\n";
$cmd .= "event_type: presence\n";
$cmd .= "alt_event_type: dialog\n";
$cmd .= "event_count: 1\n";
$cmd .= "unique-id: ".uuid()."\n";
$cmd .= "Presence-Call-Direction: outbound\n";
$cmd .= "answer-state: terminated\n";
//send the event
$switch_result = event_socket::command($cmd);
}
}
}
//synchronize configuration
if (is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
$ext = new extension;
$ext->xml();
unset($ext);
@ -394,7 +429,7 @@
//clear the cache
$cache = new cache;
$cache->delete("directory:".$extension."@".$_SESSION['domain_name']);
if (strlen($number_alias) > 0) {
if (!empty($number_alias)) {
$cache->delete("directory:".$number_alias."@".$_SESSION['domain_name']);
}
@ -403,11 +438,11 @@
}
//show the header
$document['title'] = $text['title-call_routing'];
$document['title'] = $text['title-call_forward'];
require_once "resources/header.php";
//pre-populate the form
if (is_uuid($follow_me_uuid)) {
if (!empty($follow_me_uuid) && is_uuid($follow_me_uuid)) {
$sql = "select * from v_follow_me ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and follow_me_uuid = :follow_me_uuid ";
@ -417,7 +452,7 @@
$row = $database->select($sql, $parameters, 'row');
unset($sql, $parameters);
if (is_array($row) && sizeof($row) != 0) {
if (!empty($row)) {
$cid_name_prefix = $row["cid_name_prefix"];
$cid_number_prefix = $row["cid_number_prefix"];
$follow_me_enabled = $row["follow_me_enabled"];
@ -432,7 +467,7 @@
$result = $database->select($sql, $parameters, 'all');
unset($destinations);
foreach ($result as $x => &$row) {
foreach ($result as $x => $row) {
$destinations[$x]['uuid'] = $row["follow_me_destination_uuid"];
$destinations[$x]['destination'] = $row["follow_me_destination"];
$destinations[$x]['delay'] = $row["follow_me_delay"];
@ -442,6 +477,15 @@
unset($sql, $parameters, $result, $row);
}
}
//add the pre-defined follow me destinations
for ($n = 0; $n <= (((!empty($_SESSION['follow_me']['max_destinations']['numeric'])) ? $_SESSION['follow_me']['max_destinations']['numeric'] : 5) - 1); $n++) {
if (empty($destinations[$n]['uuid'])) { $destinations[$n]['uuid'] = null; }
if (empty($destinations[$n]['destination'])) { $destinations[$n]['destination'] = null; }
if (empty($destinations[$n]['delay'])) { $destinations[$n]['delay'] = null; }
if (empty($destinations[$n]['prompt'])) { $destinations[$n]['prompt'] = null; }
if (empty($destinations[$n]['timeout'])) { $destinations[$n]['timeout'] = 30; }
}
//get the extensions array - used with autocomplete
$sql = "select * from v_extensions ";
@ -453,49 +497,51 @@
unset($sql, $parameters, $row);
//set the default
if (!isset($dnd_enabled)) {
if (empty($dnd_enabled)) {
//set the value from the database
$dnd_enabled = $do_not_disturb;
}
//prepare the autocomplete
if($_SESSION['follow_me']['follow_me_autocomplete']['boolean'] == 'true') {
echo "<link rel=\"stylesheet\" href=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.css\" />\n";
echo "<script src=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.js\"></script>\n";
echo "<script type=\"text/javascript\">\n";
echo "\$(function() {\n";
echo " var extensions = [\n";
foreach ($extensions as &$row) {
if (strlen($number_alias) == 0) {
echo " \"".escape($row["extension"])."\",\n";
if(filter_var($_SESSION['follow_me']['follow_me_autocomplete']['boolean'] ?? false, FILTER_VALIDATE_BOOLEAN)) {
echo "<link rel=\"stylesheet\" href=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.css\" />\n";
echo "<script src=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.js\"></script>\n";
echo "<script type=\"text/javascript\">\n";
echo "\$(function() {\n";
echo " var extensions = [\n";
foreach ($extensions as $row) {
if (empty($number_alias)) {
echo " \"".escape($row["extension"])."\",\n";
}
else {
echo " \"".escape($row["number_alias"])."\",\n";
}
}
else {
echo " \"".escape($row["number_alias"])."\",\n";
echo " ];\n";
for ($n = 0; $n <= (((!empty($_SESSION['follow_me']['max_destinations']['numeric'])) ? $_SESSION['follow_me']['max_destinations']['numeric'] : 5) - 1); $n++) {
echo " \$(\"#destination_".$n."\").autocomplete({\n";
echo " source: extensions\n";
echo " });\n";
}
}
echo " ];\n";
for ($n = 0; $n <= ((($_SESSION['follow_me']['max_destinations']['numeric'] != '') ? $_SESSION['follow_me']['max_destinations']['numeric'] : 5) - 1); $n++) {
echo " \$(\"#destination_".$n."\").autocomplete({\n";
echo " source: extensions\n";
echo " });\n";
}
echo "});\n";
echo "</script>\n";
echo "});\n";
echo "</script>\n";
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//save the back button location using referer
$back_destination = "window.location.href='" . ($_SESSION['call_forward_back'] ?? "/app/call_forward/call_forward.php") . "'";
//show the content
echo "<form method='post' name='frm' id='frm'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-call_forward']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'call_forward.php']);
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','onclick'=>$back_destination]);
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
@ -504,6 +550,7 @@
echo $text['description']." <strong>".escape($extension)."</strong>\n";
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
@ -511,10 +558,10 @@
echo " <strong>".$text['label-call_forward']."</strong>\n";
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
$on_click .= "$('#tr_follow_me_settings').slideUp('fast'); ";
$on_click = "$('#tr_follow_me_settings').slideUp('fast'); ";
$on_click .= "document.getElementById('dnd_disabled').checked=true; ";
$on_click .= "document.getElementById('forward_all_destination').focus(); ";
$on_click2 .= "(document.getElementById('follow_me_enabled').checked) ? $('#tr_follow_me_settings').slideDown('fast') : '' ";
$on_click2 = "(document.getElementById('follow_me_enabled').checked) ? $('#tr_follow_me_settings').slideDown('fast') : '' ";
echo " <label for='forward_all_disabled'><input type='radio' name='forward_all_enabled' id='forward_all_disabled' onclick=\"$on_click2\" value='false' ".(($forward_all_enabled == "false" || $forward_all_enabled == "") ? "checked='checked'" : null)." /> ".$text['label-disabled']."</label> \n";
echo " <label for='forward_all_enabled'><input type='radio' name='forward_all_enabled' id='forward_all_enabled' onclick=\"$on_click\" value='true' ".(($forward_all_enabled == "true") ? "checked='checked'" : null)." /> ".$text['label-enabled']."</label> \n";
unset($on_click);
@ -580,14 +627,14 @@
echo "<td class='vtable' align='left'>\n";
$on_click = "document.getElementById('forward_all_disabled').checked=true; ";
$on_click .= "document.getElementById('dnd_disabled').checked=true; ";
echo " <label for='follow_me_disabled'><input type='radio' name='follow_me_enabled' id='follow_me_disabled' onclick=\"$('#tr_follow_me_settings').slideUp('fast');\" value='false' ".(($follow_me_enabled == "false" || $follow_me_enabled == "") ? "checked='checked'" : null)." /> ".$text['label-disabled']."</label> \n";
echo " <label for='follow_me_enabled'><input type='radio' name='follow_me_enabled' id='follow_me_enabled' onclick=\"$('#tr_follow_me_settings').slideDown('fast'); $on_click\" value='true' ".(($follow_me_enabled == "true") ? "checked='checked'" : null)."/> ".$text['label-enabled']."</label> \n";
echo " <label for='follow_me_disabled'><input type='radio' name='follow_me_enabled' id='follow_me_disabled' onclick=\"$('#tr_follow_me_settings').slideUp('fast');\" value='false' ".((!empty($follow_me_enabled) && $follow_me_enabled == "false" || empty($follow_me_enabled)) ? "checked='checked'" : null)." /> ".$text['label-disabled']."</label> \n";
echo " <label for='follow_me_enabled'><input type='radio' name='follow_me_enabled' id='follow_me_enabled' onclick=\"$('#tr_follow_me_settings').slideDown('fast'); $on_click\" value='true' ".((!empty($follow_me_enabled) && $follow_me_enabled == "true") ? "checked='checked'" : null)."/> ".$text['label-enabled']."</label> \n";
unset($on_click);
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
if ($follow_me_enabled == "true" && $dnd_enabled != "true" && $forward_all_enabled != "true") { $style = ''; } else { $style = 'display: none;'; }
if (!empty($follow_me_enabled) && $follow_me_enabled == "true" && $dnd_enabled != "true" && $forward_all_enabled != "true") { $style = ''; } else { $style = 'display: none;'; }
echo "<div id='tr_follow_me_settings' style='$style'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
@ -608,21 +655,22 @@
echo " </tr>\n";
//output destinations
for ($n = 0; $n <= ((($_SESSION['follow_me']['max_destinations']['numeric'] != '') ? $_SESSION['follow_me']['max_destinations']['numeric'] : 5) - 1); $n++) {
echo " <input type='hidden' name='destinations[".$n."][uuid]' value='".(($destinations[$n]['uuid'] != '') ? $destinations[$n]['uuid'] : uuid())."'>\n";
$on_click = "";
foreach ($destinations as $n => $destination) {
echo " <input type='hidden' name='destinations[".$n."][uuid]' value='".((!empty($destination['uuid'])) ? $destination['uuid'] : uuid())."'>\n";
echo " <tr>\n";
echo " <td><input class='formfld' style='min-width: 135px;' type='text' name='destinations[".$n."][destination]' id='destination_".$n."' maxlength='255' value=\"".escape($destinations[$n]['destination'])."\"></td>\n";
echo " <td><input class='formfld' style='min-width: 135px;' type='text' name='destinations[".$n."][destination]' id='destination_".$n."' maxlength='255' value=\"".escape($destination['destination'])."\"></td>\n";
echo " <td>\n";
destination_select('destinations['.$n.'][delay]', $destinations[$n]['delay'], '0');
destination_select('destinations['.$n.'][delay]', $destination['delay'], '0');
echo " </td>\n";
echo " <td>\n";
destination_select('destinations['.$n.'][timeout]', $destinations[$n]['timeout'], (($_SESSION['follow_me']['timeout']['numeric'] != '') ? $_SESSION['follow_me']['timeout']['numeric'] : 30));
destination_select('destinations['.$n.'][timeout]', $destination['timeout'], ((!empty($_SESSION['follow_me']['timeout']['numeric'])) ? $_SESSION['follow_me']['timeout']['numeric'] : 30));
echo " </td>\n";
if (permission_exists('follow_me_prompt')) {
echo " <td>\n";
echo " <select class='formfld' style='width: 90px;' name='destinations[".$n."][prompt]'>\n";
echo " <option value=''></option>\n";
echo " <option value='1' ".(($destinations[$n]['prompt'])?"selected='selected'":null).">".$text['label-destination_prompt_confirm']."</option>\n";
echo " <option value='1' ".(($destination['prompt']) ? "selected='selected'" : null).">".$text['label-destination_prompt_confirm']."</option>\n";
//echo " <option value='2'>".$text['label-destination_prompt_announce]."</option>\n";
echo " </select>\n";
echo " </td>\n";
@ -640,8 +688,8 @@
echo $text['label-ignore_busy'];
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <label for='follow_me_ignore_busy_false'><input type='radio' name='follow_me_ignore_busy' id='follow_me_ignore_busy_false' value='false' onclick=\"\" ".(($follow_me_ignore_busy == "false" || $follow_me_ignore_busy == "") ? "checked='checked'" : null)." /> ".$text['label-disabled']."</label> \n";
echo " <label for='follow_me_ignore_busy_true'><input type='radio' name='follow_me_ignore_busy' id='follow_me_ignore_busy_true' value='true' onclick=\"$on_click\" ".(($follow_me_ignore_busy == "true") ? "checked='checked'" : null)." /> ".$text['label-enabled']."</label> \n";
echo " <label for='follow_me_ignore_busy_false'><input type='radio' name='follow_me_ignore_busy' id='follow_me_ignore_busy_false' value='false' onclick=\"\" ".(empty($follow_me_ignore_busy) || $follow_me_ignore_busy == "false" ? "checked='checked'" : null)." /> ".$text['label-disabled']."</label> \n";
echo " <label for='follow_me_ignore_busy_true'><input type='radio' name='follow_me_ignore_busy' id='follow_me_ignore_busy_true' value='true' onclick=\"".$on_click."\" ".(!empty($follow_me_ignore_busy) && $follow_me_ignore_busy == "true" ? "checked='checked'" : null)." /> ".$text['label-enabled']."</label> \n";
echo " <br />\n";
echo $text['description-ignore_busy']."\n";
echo " </td>\n";
@ -694,9 +742,10 @@
echo "</tr>\n";
echo "</table>";
echo "</div>\n";
echo "<br /><br />";
if ($action == "update") {
if (!empty($action) && $action == "update") {
echo "<input type='hidden' name='id' value='".escape($extension_uuid)."'>\n";
}
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";

View File

@ -1,279 +1,276 @@
<?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/
/*
FusionPBX
Version: MPL 1.1
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 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/
The Original Code is FusionPBX
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 Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Copyright (C) 2010 - 2016
All Rights Reserved.
The Original Code is FusionPBX
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
Errol Samuels <voiptology@gmail.com>
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Copyright (C) 2010 - 2023
All Rights Reserved.
*/
include "root.php";
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
Errol Samuels <voiptology@gmail.com>
*/
//define the call_forward class
class call_forward {
// set class constants
const APP_NAME = 'calls';
const APP_UUID = '19806921-e8ed-dcff-b325-dd3e5da4959d';
const PERMISSION = 'call_forward';
const LIST_PAGE = 'calls.php';
const TABLE = 'extensions';
const UUID_PREFIX = 'extension_';
const TOGGLE_FIELD = 'forward_all_enabled';
const TOGGLE_VALUES = ['true', 'false'];
public $debug;
public $domain_uuid;
public $domain_name;
public $extension_uuid;
private $extension;
private $number_alias;
public $forward_all_destination;
public $forward_all_enabled;
private $toll_allow;
public $accountcode;
public $outbound_caller_id_name;
public $outbound_caller_id_number;
public function set() {
//determine whether to update the dial string
$sql = "select * from v_extensions ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and extension_uuid = :extension_uuid ";
$parameters['domain_uuid'] = $this->domain_uuid;
$parameters['extension_uuid'] = $this->extension_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
$this->extension = $row["extension"];
$this->number_alias = $row["number_alias"];
$this->accountcode = $row["accountcode"];
$this->toll_allow = $row["toll_allow"];
$this->outbound_caller_id_name = $row["outbound_caller_id_name"];
$this->outbound_caller_id_number = $row["outbound_caller_id_number"];
}
unset($sql, $parameters, $row);
//build extension update array
$array['extensions'][0]['extension_uuid'] = $this->extension_uuid;
$array['extensions'][0]['forward_all_destination'] = strlen($this->forward_all_destination) != 0 ? $this->forward_all_destination : null;
if (strlen($this->forward_all_destination) == 0 || $this->forward_all_enabled == "false") {
$array['extensions'][0]['forward_all_enabled'] = 'false';
}
else {
$array['extensions'][0]['forward_all_enabled'] = 'true';
}
//grant temporary permissions
$p = new permissions;
$p->add('extension_add', 'temp');
//execute update
$database = new database;
$database->app_name = 'calls';
$database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d';
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('extension_add', 'temp');
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:".$this->extension."@".$this->domain_name);
if(strlen($this->number_alias) > 0){
$cache->delete("directory:".$this->number_alias."@".$this->domain_name);
}
}
/**
* declare private variables
*/
private $app_name;
private $app_uuid;
private $permission;
private $list_page;
private $table;
private $uuid_prefix;
private $toggle_field;
private $toggle_values;
private $extension;
private $number_alias;
private $toll_allow;
/**
* toggle records
*/
public function toggle($records) {
public function set() {
//create the database connection
$database = new database;
//assign private variables
$this->app_name = 'calls';
$this->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d';
$this->permission = 'call_forward';
$this->list_page = 'calls.php';
$this->table = 'extensions';
$this->uuid_prefix = 'extension_';
$this->toggle_field = 'forward_all_enabled';
$this->toggle_values = ['true','false'];
if (permission_exists($this->permission)) {
//add multi-lingual support
$language = new text;
$text = $language->get();
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: '.$this->list_page);
exit;
}
//toggle the checked records
if (is_array($records) && @sizeof($records) != 0) {
//get current toggle state
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, extension, number_alias, ";
$sql .= "call_timeout, do_not_disturb, ";
$sql .= "forward_all_enabled, forward_all_destination, ";
$sql .= "forward_busy_enabled, forward_busy_destination, ";
$sql .= "forward_no_answer_enabled, forward_no_answer_destination, ";
$sql .= $this->toggle_field." as toggle, follow_me_uuid ";
$sql .= "from v_".$this->table." ";
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$extensions[$row['uuid']]['extension'] = $row['extension'];
$extensions[$row['uuid']]['number_alias'] = $row['number_alias'];
$extensions[$row['uuid']]['call_timeout'] = $row['call_timeout'];
$extensions[$row['uuid']]['do_not_disturb'] = $row['do_not_disturb'];
$extensions[$row['uuid']]['forward_all_enabled'] = $row['forward_all_enabled'];
$extensions[$row['uuid']]['forward_all_destination'] = $row['forward_all_destination'];
$extensions[$row['uuid']]['forward_busy_enabled'] = $row['forward_busy_enabled'];
$extensions[$row['uuid']]['forward_busy_destination'] = $row['forward_busy_destination'];
$extensions[$row['uuid']]['forward_no_answer_enabled'] = $row['forward_no_answer_enabled'];
$extensions[$row['uuid']]['forward_no_answer_destination'] = $row['forward_no_answer_destination'];
$extensions[$row['uuid']]['state'] = $row['toggle'];
$extensions[$row['uuid']]['follow_me_uuid'] = $row['follow_me_uuid'];
}
}
unset($sql, $parameters, $rows, $row);
}
//build update array
$x = 0;
foreach ($extensions as $uuid => $extension) {
//check destination
$destination_exists = $extension['forward_all_destination'] != '' ? true : false;
//determine new state
$new_state = $extension['state'] == $this->toggle_values[1] && $destination_exists ? $this->toggle_values[0] : $this->toggle_values[1];
//toggle feature
if ($new_state != $extension['state']) {
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $uuid;
$array[$this->table][$x][$this->toggle_field] = $new_state;
}
//disable other features
if ($new_state == $this->toggle_values[0]) { //true
$array[$this->table][$x]['do_not_disturb'] = $this->toggle_values[1]; //false
$array[$this->table][$x]['follow_me_enabled'] = $this->toggle_values[1]; //false
if (is_uuid($extension['follow_me_uuid'])) {
$array['follow_me'][$x]['follow_me_uuid'] = $extension['follow_me_uuid'];
$array['follow_me'][$x]['follow_me_enabled'] = $this->toggle_values[1]; //false
}
}
//increment counter
$x++;
}
//save the changes
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p->add('extension_edit', 'temp');
//save the array
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('extension_edit', 'temp');
//send feature event notify to the phone
if ($_SESSION['device']['feature_sync']['boolean'] == "true") {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
$feature_event_notify->extension = $extension['extension'];
$feature_event_notify->do_not_disturb = $extension['do_not_disturb'];
$feature_event_notify->ring_count = ceil($extension['call_timeout'] / 6);
$feature_event_notify->forward_all_enabled = $extension['forward_all_enabled'];
$feature_event_notify->forward_busy_enabled = $extension['forward_busy_enabled'];
$feature_event_notify->forward_no_answer_enabled = $extension['forward_no_answer_enabled'];
//workarounds: send 0 as freeswitch doesn't send NOTIFY when destination values are nil
$feature_event_notify->forward_all_destination = $extension['forward_all_destination'] != '' ? $extension['forward_all_destination'] : '0';
$feature_event_notify->forward_busy_destination = $extension['forward_busy_destination'] != '' ? $extension['forward_busy_destination'] : '0';
$feature_event_notify->forward_no_answer_destination = $extension['forward_no_answer_destination'] != '' ? $extension['forward_no_answer_destination'] : '0';
$feature_event_notify->send_notify();
unset($feature_event_notify);
}
}
//synchronize configuration
if (is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
$ext = new extension;
$ext->xml();
unset($ext);
}
//clear the cache
$cache = new cache;
foreach ($extensions as $uuid => $extension) {
$cache->delete("directory:".$extension['extension']."@".$_SESSION['domain_name']);
if ($extension['number_alias'] != '') {
$cache->delete("directory:".$extension['number_alias']."@".$_SESSION['domain_name']);
}
}
//set message
message::add($text['message-toggle']);
}
unset($records, $extensions, $extension);
}
//determine whether to update the dial string
$sql = "select * from v_extensions ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and extension_uuid = :extension_uuid ";
$parameters['domain_uuid'] = $this->domain_uuid;
$parameters['extension_uuid'] = $this->extension_uuid;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
$this->extension = $row["extension"];
$this->number_alias = $row["number_alias"];
$this->accountcode = $row["accountcode"];
$this->toll_allow = $row["toll_allow"];
$this->outbound_caller_id_name = $row["outbound_caller_id_name"];
$this->outbound_caller_id_number = $row["outbound_caller_id_number"];
}
unset($sql, $parameters, $row);
//build extension update array
$array['extensions'][0]['extension_uuid'] = $this->extension_uuid;
$array['extensions'][0]['forward_all_destination'] = strlen($this->forward_all_destination) != 0 ? $this->forward_all_destination : null;
if (empty($this->forward_all_destination) || $this->forward_all_enabled == "false") {
$array['extensions'][0]['forward_all_enabled'] = 'false';
} else {
$array['extensions'][0]['forward_all_enabled'] = 'true';
}
} //function
//grant temporary permissions
$p = permissions::new();
$p->add('extension_add', 'temp');
}// class
//execute update
$database->app_name = 'calls';
$database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d';
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('extension_add', 'temp');
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:" . $this->extension . "@" . $this->domain_name);
if (!empty($this->number_alias)) {
$cache->delete("directory:" . $this->number_alias . "@" . $this->domain_name);
}
}
/**
* Toggle an array of call_forward records
* @param array $records array of records to toggle
*/
public function toggle(array $records) {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'], 'negative');
header('Location: ' . self::LIST_PAGE);
exit;
}
//validate there are records to process
if (count($records) < 1) return;
//check we have permission for this action
if (permission_exists(self::PERMISSION)) {
//create the database connection
$database = new database;
//add multi-lingual support
$language = new text;
$text = $language->get();
// initialize an empty array
$uuids = [];
$extensions = [];
//get current toggle state
foreach ($records as $x => $record) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'" . $record['uuid'] . "'";
}
}
//toggle the checked records
if (count($uuids) > 0) {
$sql = "select " . self::UUID_PREFIX . "uuid as uuid, extension, number_alias, ";
$sql .= "call_timeout, do_not_disturb, ";
$sql .= "forward_all_enabled, forward_all_destination, ";
$sql .= "forward_busy_enabled, forward_busy_destination, ";
$sql .= "forward_no_answer_enabled, forward_no_answer_destination, ";
$sql .= self::TOGGLE_FIELD . " as toggle, follow_me_uuid ";
$sql .= "from v_" . self::TABLE . " ";
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
$sql .= "and " . self::UUID_PREFIX . "uuid in (" . implode(', ', $uuids) . ") ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$extensions[$row['uuid']]['extension'] = $row['extension'];
$extensions[$row['uuid']]['number_alias'] = $row['number_alias'];
$extensions[$row['uuid']]['call_timeout'] = $row['call_timeout'];
$extensions[$row['uuid']]['do_not_disturb'] = $row['do_not_disturb'];
$extensions[$row['uuid']]['forward_all_enabled'] = $row['forward_all_enabled'];
$extensions[$row['uuid']]['forward_all_destination'] = $row['forward_all_destination'];
$extensions[$row['uuid']]['forward_busy_enabled'] = $row['forward_busy_enabled'];
$extensions[$row['uuid']]['forward_busy_destination'] = $row['forward_busy_destination'];
$extensions[$row['uuid']]['forward_no_answer_enabled'] = $row['forward_no_answer_enabled'];
$extensions[$row['uuid']]['forward_no_answer_destination'] = $row['forward_no_answer_destination'];
$extensions[$row['uuid']]['state'] = $row['toggle'];
$extensions[$row['uuid']]['follow_me_uuid'] = $row['follow_me_uuid'];
}
}
unset($sql, $parameters, $rows, $row);
}
//build update array
$x = 0;
foreach ($extensions as $uuid => $extension) {
//check destination
$destination_exists = $extension['forward_all_destination'] != '' ? true : false;
//determine new state
$new_state = $extension['state'] == self::TOGGLE_VALUES[1] && $destination_exists ? self::TOGGLE_VALUES[0] : self::TOGGLE_VALUES[1];
//toggle feature
if ($new_state != $extension['state']) {
$array[self::TABLE][$x][self::UUID_PREFIX . 'uuid'] = $uuid;
$array[self::TABLE][$x][self::TOGGLE_FIELD] = $new_state;
}
//disable other features
if ($new_state == self::TOGGLE_VALUES[0]) { //true
$array[self::TABLE][$x]['do_not_disturb'] = self::TOGGLE_VALUES[1]; //false
$array[self::TABLE][$x]['follow_me_enabled'] = self::TOGGLE_VALUES[1]; //false
if (is_uuid($extension['follow_me_uuid'])) {
$array['follow_me'][$x]['follow_me_uuid'] = $extension['follow_me_uuid'];
$array['follow_me'][$x]['follow_me_enabled'] = self::TOGGLE_VALUES[1]; //false
}
}
//increment counter
$x++;
}
//save the changes
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = permissions::new();
$p->add('extension_edit', 'temp');
//save the array
$database->app_name = self::APP_NAME;
$database->app_uuid = self::APP_UUID;
$database->save($array);
unset($array);
//revoke temporary permissions
$p->delete('extension_edit', 'temp');
//send feature event notify to the phone
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
$feature_event_notify->extension = $extension['extension'];
$feature_event_notify->do_not_disturb = $extension['do_not_disturb'];
$feature_event_notify->ring_count = ceil($extension['call_timeout'] / 6);
$feature_event_notify->forward_all_enabled = $extension['forward_all_enabled'];
$feature_event_notify->forward_busy_enabled = $extension['forward_busy_enabled'];
$feature_event_notify->forward_no_answer_enabled = $extension['forward_no_answer_enabled'];
//workarounds: send 0 as freeswitch doesn't send NOTIFY when destination values are nil
$feature_event_notify->forward_all_destination = $extension['forward_all_destination'] != '' ? $extension['forward_all_destination'] : '0';
$feature_event_notify->forward_busy_destination = $extension['forward_busy_destination'] != '' ? $extension['forward_busy_destination'] : '0';
$feature_event_notify->forward_no_answer_destination = $extension['forward_no_answer_destination'] != '' ? $extension['forward_no_answer_destination'] : '0';
$feature_event_notify->send_notify();
unset($feature_event_notify);
}
}
//synchronize configuration
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
$ext = new extension;
$ext->xml();
unset($ext);
}
//clear the cache
$cache = new cache;
foreach ($extensions as $uuid => $extension) {
$cache->delete("directory:" . $extension['extension'] . "@" . $_SESSION['domain_name']);
if ($extension['number_alias'] != '') {
$cache->delete("directory:" . $extension['number_alias'] . "@" . $_SESSION['domain_name']);
}
}
//set message
message::add($text['message-toggle']);
}
unset($records, $extensions, $extension);
}
}
//function
}
// class
?>

View File

@ -17,13 +17,12 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Copyright (C) 2010 - 2016
Copyright (C) 2010 - 2023
All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
include "root.php";
//define the dnd class
class do_not_disturb {
@ -40,10 +39,10 @@ include "root.php";
if ($this->enabled == "true") {
//update the call center status
$user_status = "Logged Out";
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$esl = event_socket::create();
if ($esl->is_connected()) {
$switch_cmd .= "callcenter_config agent set status ".$_SESSION['username']."@".$this->domain_name." '".$user_status."'";
$switch_result = event_socket_request($fp, 'api '.$switch_cmd);
$switch_result = event_socket::api($switch_cmd);
}
//update the database user_status
@ -80,8 +79,8 @@ include "root.php";
if (is_uuid($this->extension_uuid)) {
$this->extension_uuid = $row["extension_uuid"];
}
if (strlen($this->extension) == 0) {
if (strlen($row["number_alias"]) == 0) {
if (empty($this->extension)) {
if (empty($row["number_alias"])) {
$this->extension = $row["extension"];
}
else {
@ -96,7 +95,7 @@ include "root.php";
$array['extensions'][0]['do_not_disturb'] = $this->enabled;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//execute update
@ -112,7 +111,7 @@ include "root.php";
//delete extension from the cache
$cache = new cache;
$cache->delete("directory:".$this->extension."@".$this->domain_name);
if(strlen($this->number_alias) > 0){
if(!empty($this->number_alias)){
$cache->delete("directory:".$this->number_alias."@".$this->domain_name);
}
@ -164,7 +163,7 @@ include "root.php";
//get current toggle state
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -227,7 +226,7 @@ include "root.php";
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//save the array
@ -241,12 +240,12 @@ include "root.php";
$p->delete('extension_edit', 'temp');
//send feature event notify to the phone
if ($_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
$feature_event_notify->extension = $extension['extension'];
$feature_event_notify->do_not_disturb = $extension['do_not_disturb'];
$feature_event_notify->do_not_disturb = $extension['do_not_disturb'] == "true" ? "false" : "true";
$feature_event_notify->ring_count = ceil($extension['call_timeout'] / 6);
$feature_event_notify->forward_all_enabled = $extension['forward_all_enabled'];
$feature_event_notify->forward_busy_enabled = $extension['forward_busy_enabled'];
@ -261,8 +260,7 @@ include "root.php";
}
//synchronize configuration
if (is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
$ext = new extension;
$ext->xml();
unset($ext);
@ -290,4 +288,4 @@ include "root.php";
} //class
?>
?>

View File

@ -24,7 +24,6 @@
Mark J Crane <markjcrane@fusionpbx.com>
KonradSC <konrd@yahoo.com>
*/
include "root.php";
//define the feature_event_notify class
class feature_event_notify {
@ -43,11 +42,11 @@ include "root.php";
//feature_event method
public function send_notify() {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$esl = event_socket::create();
if ($esl->is_connected()) {
// Get the SIP profiles for the extension
$command = "sofia_contact */{$this->extension}@{$this->domain_name}";
$contact_string = event_socket_request($fp, "api ".$command);
$contact_string = event_socket::api($command);
// The first value in the array will be full matching text, the second one will be the array of profile matches
preg_match_all('/sofia\/([^,]+)\/(?:[^,]+)/', $contact_string, $matches);
if (sizeof($matches) != 2 || sizeof($matches[1]) < 1) {
@ -73,12 +72,11 @@ include "root.php";
$event .= "forward_no_answer: " . $this->forward_no_answer_destination . "\n";
$event .= "doNotDisturbOn: " . $this->do_not_disturb . "\n";
$event .= "ringCount: " . $this->ring_count . "\n";
event_socket_request($fp, $event);
event_socket::command($event);
}
fclose($fp);
}
} //function
} //class
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Copyright (C) 2010 - 2019
Copyright (C) 2010 - 2023
All Rights Reserved.
Contributor(s):
@ -27,7 +27,6 @@
Riccardo Granchi <riccardo.granchi@nems.it>
Errol Samuels <voiptology@gmail.com>
*/
include "root.php";
//define the follow me class
class follow_me {
@ -85,14 +84,14 @@ include "root.php";
$array['follow_me'][0]['follow_me_uuid'] = $this->follow_me_uuid;
$array['follow_me'][0]['domain_uuid'] = $this->domain_uuid;
$array['follow_me'][0]['cid_name_prefix'] = $this->cid_name_prefix;
if (strlen($this->cid_number_prefix) > 0) {
if (!empty($this->cid_number_prefix)) {
$array['follow_me'][0]['cid_number_prefix'] = $this->cid_number_prefix;
}
$array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled;
$array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_add', 'temp');
//execute insert
$database = new database;
@ -116,7 +115,7 @@ include "root.php";
$array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled;
$array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_add', 'temp');
//execute update
$database = new database;
@ -136,7 +135,7 @@ include "root.php";
//delete related follow me destinations
$array['follow_me_destinations'][0]['follow_me_uuid'] = $this->follow_me_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_destination_delete', 'temp');
//execute delete
$database = new database;
@ -149,7 +148,7 @@ include "root.php";
//build follow me destinations insert array
$x = 0;
if (strlen($this->destination_data_1) > 0) {
if (!empty($this->destination_data_1)) {
$array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid();
$array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid;
$array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid;
@ -161,7 +160,7 @@ include "root.php";
$this->destination_order++;
$x++;
}
if (strlen($this->destination_data_2) > 0) {
if (!empty($this->destination_data_2)) {
$array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid();
$array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid;
$array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid;
@ -173,7 +172,7 @@ include "root.php";
$this->destination_order++;
$x++;
}
if (strlen($this->destination_data_3) > 0) {
if (!empty($this->destination_data_3)) {
$array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid();
$array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid;
$array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid;
@ -185,7 +184,7 @@ include "root.php";
$this->destination_order++;
$x++;
}
if (strlen($this->destination_data_4) > 0) {
if (!empty($this->destination_data_4)) {
$array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid();
$array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid;
$array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid;
@ -197,7 +196,7 @@ include "root.php";
$this->destination_order++;
$x++;
}
if (strlen($this->destination_data_5) > 0) {
if (!empty($this->destination_data_5)) {
$array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid();
$array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid;
$array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid;
@ -211,7 +210,7 @@ include "root.php";
}
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_destination_add', 'temp');
//execute insert
$database = new database;
@ -235,7 +234,7 @@ include "root.php";
$extension_uuid = $result[0]['extension_uuid'];
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add("follow_me_edit", 'temp');
$p->add("extension_edit", 'temp');
@ -308,7 +307,7 @@ include "root.php";
//get current toggle state
foreach($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
@ -354,7 +353,7 @@ include "root.php";
$extension['state'] == $this->toggle_values[1] //false becoming true
&& is_uuid($extension['follow_me_uuid'])
) {
$sql .= "select count(*) from v_follow_me_destinations where follow_me_uuid = :follow_me_uuid";
$sql = "select count(*) from v_follow_me_destinations where follow_me_uuid = :follow_me_uuid";
$parameters['follow_me_uuid'] = $extension['follow_me_uuid'];
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
@ -390,7 +389,7 @@ include "root.php";
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
$p->add('follow_me_edit', 'temp');
@ -406,7 +405,7 @@ include "root.php";
$p->delete('follow_me_edit', 'temp');
//send feature event notify to the phone
if ($_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -426,8 +425,7 @@ include "root.php";
}
//synchronize configuration
if (is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
$ext = new extension;
$ext->xml();
unset($ext);

View File

@ -1,35 +1,10 @@
<?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) 2021
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes
//require_once "root.php";
require_once "resources/require.php";
require_once "resources/check_auth.php";
//includes files
require_once dirname(__DIR__, 4) . "/resources/require.php";
//check permissions
require_once "resources/check_auth.php";
if (permission_exists('follow_me') || permission_exists('call_forward') || permission_exists('do_not_disturb')) {
//access granted
}
@ -38,14 +13,243 @@
exit;
}
//connect to the database
if (!isset($database)) {
$database = new database;
}
//add multi-lingual support
$language = new text;
$text = $language->get($_SESSION['domain']['language']['code'], 'app/call_forward');
//set a variable for the included code to know its included
$is_included = true;
//extensions link
$extension_link = '#';
if (permission_exists('extension_view')) {
$extension_link = PROJECT_PATH."/app/extensions/extensions.php";
}
$call_forward_link = PROJECT_PATH."/app/call_forward/call_forward.php";
//include the call forward
require_once "app/call_forward/call_forward.php";
//set the row style
$c = 0;
$row_style["0"] = "row_style0";
$row_style["1"] = "row_style1";
//get data
$sql = "select ";
$sql .= "extension_uuid,";
$sql .= "extension, ";
$sql .= "forward_all_enabled, ";
$sql .= "forward_all_destination, ";
$sql .= "follow_me_enabled, ";
$sql .= "follow_me_uuid, ";
$sql .= "do_not_disturb ";
$sql .= "from ";
$sql .= "v_extensions ";
if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('call_forward_all')) {
$sql .= "where true ";
}
else {
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
$sql .= "and enabled = 'true' ";
if (!permission_exists('extension_edit')) {
if (is_array($_SESSION['user']['extension']) && count($_SESSION['user']['extension']) > 0) {
$sql .= "and (";
$x = 0;
foreach($_SESSION['user']['extension'] as $row) {
if ($x > 0) { $sql .= "or "; }
$sql .= "extension = '".$row['user']."' ";
$x++;
}
$sql .= ")";
}
else {
//used to hide any results when a user has not been assigned an extension
$sql .= "and extension = 'disabled' ";
}
}
$sql .= order_by($order_by ?? null, $order ?? null, 'extension', 'asc');
$database = new database;
$extensions = $database->select($sql, $parameters, 'all');
unset($parameters);
//determine keys and stats
unset($stats);
//set defaults
$stats['dnd'] = $stats['follow_me'] = $stats['call_forward'] = $stats['active'] = 0;
$show_stat = false;
if (is_array($extensions) && @sizeof($extensions) != 0) {
foreach ($extensions as $row) {
if (permission_exists('call_forward')) {
$stats['call_forward'] += $row['forward_all_enabled'] == 'true' && $row['forward_all_destination'] ? 1 : 0;
}
if (permission_exists('follow_me')) {
$stats['follow_me'] += $row['follow_me_enabled'] == 'true' && is_uuid($row['follow_me_uuid']) ? 1 : 0;
}
if (permission_exists('do_not_disturb')) {
$stats['dnd'] += $row['do_not_disturb'] == 'true' ? 1 : 0;
}
}
$stats['active'] = @sizeof($extensions) - $stats['call_forward'] - $stats['follow_me'] - $stats['dnd'];
}
if (is_array($stats) && @sizeof($stats) != 0) {
$show_stat = true;
}
//begin widget
echo "<div class='hud_box'>\n";
echo " <div class='hud_content' ".($dashboard_details_state == "disabled" ?: "onclick=\"$('#hud_call_forward_details').slideToggle('fast'); toggle_grid_row_end('".$dashboard_name."')\"").">\n";
echo " <span class='hud_title'>".$text['header-call_forward']."</span>\n";
//doughnut chart
if (!isset($dashboard_chart_type) || $dashboard_chart_type == "doughnut") {
echo "<div class='hud_chart' style='width: 275px;'><canvas id='call_forward_chart'></canvas></div>\n";
echo "<script>\n";
echo " const call_forward_chart = new Chart(\n";
echo " document.getElementById('call_forward_chart').getContext('2d'),\n";
echo " {\n";
echo " type: 'doughnut',\n";
echo " data: {\n";
echo " labels: [\n";
if (permission_exists('do_not_disturb')) {
echo " '".$text['label-dnd'].": ".$stats['dnd']."',\n";
}
if (permission_exists('follow_me')) {
echo " '".$text['label-follow_me'].": ".$stats['follow_me']."',\n";
}
if (permission_exists('call_forward')) {
echo " '".$text['label-call_forward'].": ".$stats['call_forward']."',\n";
}
echo " '".$text['label-active'].": ".$stats['active']."',\n";
echo " ],\n";
echo " datasets: [{\n";
echo " data: [\n";
if (permission_exists('do_not_disturb')) {
echo " '".$stats['dnd']."',\n";
}
if (permission_exists('follow_me')) {
echo " '".$stats['follow_me']."',\n";
}
if (permission_exists('call_forward')) {
echo " '".$stats['call_forward']."',\n";
}
echo " '".$stats['active']."',\n";
echo " 0.00001,\n";
echo " ],\n";
echo " backgroundColor: [\n";
if (permission_exists('do_not_disturb')) {
echo " '".($settings->get('theme', 'dashboard_call_forward_chart_color_do_not_disturb') ?? '#ea4c46')."',\n";
}
if (permission_exists('follow_me')) {
echo " '".($settings->get('theme', 'dashboard_call_forward_chart_color_follow_me') ?? '#03c04a')."',\n";
}
if (permission_exists('call_forward')) {
echo " '".($settings->get('theme', 'dashboard_call_forward_chart_color_call_forward') ?? '#2a9df4')."',\n";
}
echo " '".($settings->get('theme', 'dashboard_call_forward_chart_color_active') ?? '#d4d4d4')."',\n";
echo " '".($settings->get('theme', 'dashboard_call_forward_chart_color_active') ?? '#d4d4d4')."'\n";
echo " ],\n";
echo " borderColor: '".$settings->get('theme', 'dashboard_chart_border_color')."',\n";
echo " borderWidth: '".$settings->get('theme', 'dashboard_chart_border_width')."'\n";
echo " }]\n";
echo " },\n";
echo " options: {\n";
echo " plugins: {\n";
echo " chart_number: {\n";
echo " text: '".$stats['call_forward']."'\n";
echo " },\n";
echo " legend: {\n";
echo " display: true,\n";
echo " position: 'right',\n";
echo " reverse: true,\n";
echo " labels: {\n";
echo " usePointStyle: true,\n";
echo " pointStyle: 'rect',\n";
echo " color: '".$dashboard_label_text_color."'\n";
echo " }\n";
echo " }\n";
echo " }\n";
echo " },\n";
echo " plugins: [{\n";
echo " id: 'chart_number',\n";
echo " beforeDraw(chart, args, options){\n";
echo " const {ctx, chartArea: {top, right, bottom, left, width, height} } = chart;\n";
echo " ctx.font = chart_text_size + ' ' + chart_text_font;\n";
echo " ctx.textBaseline = 'middle';\n";
echo " ctx.textAlign = 'center';\n";
echo " ctx.fillStyle = '".$dashboard_number_text_color."';\n";
echo " ctx.fillText(options.text, width / 2, top + (height / 2));\n";
echo " ctx.save();\n";
echo " }\n";
echo " }]\n";
echo " }\n";
echo " );\n";
echo "</script>\n";
}
if ($dashboard_chart_type == "number") {
echo " <span class='hud_stat'>".$stats['call_forward']."</span>";
}
echo " </div>\n";
//details
if ($dashboard_details_state != 'disabled') {
echo "<div class='hud_details hud_box' id='hud_call_forward_details'>";
echo "<table class='tr_hover' width='100%' cellpadding='0' cellspacing='0' border='0'>\n";
echo "<tr style='position: -webkit-sticky; position: sticky; z-index: 5; top: 0;'>\n";
echo "<th class='hud_heading'><a href='".$extension_link."'>".$text['label-extension']."</a></th>\n";
if (permission_exists('call_forward')) {
echo " <th class='hud_heading' style='text-align: center;'><a href='".$call_forward_link."'>".$text['label-call_forward']."</a></th>\n";
}
if (permission_exists('follow_me')) {
echo " <th class='hud_heading' style='text-align: center;'><a href='".$call_forward_link."'>".$text['label-follow_me']."</a></th>\n";
}
if (permission_exists('do_not_disturb')) {
echo " <th class='hud_heading' style='text-align: center;'><a href='".$call_forward_link."'>".$text['label-dnd']."</a></th>\n";
}
echo "</tr>\n";
if (is_array($extensions) && @sizeof($extensions) != 0) {
foreach ($extensions as $row) {
$tr_link = PROJECT_PATH."/app/call_forward/call_forward_edit.php?id=".$row['extension_uuid'];
echo "<tr href='".$tr_link."'>\n";
echo " <td valign='top' class='".$row_style[$c]." hud_text'><a href='".$tr_link."' title=\"".$text['button-edit']."\">".escape($row['extension'])."</a></td>\n";
if (permission_exists('call_forward')) {
echo " <td valign='top' class='".$row_style[$c]." hud_text' style='text-align: center;'>".($row['forward_all_enabled'] == 'true' ? escape(format_phone($row['forward_all_destination'])) : '&nbsp;')."</td>\n";
}
if (permission_exists('follow_me')) {
//get destination count
$follow_me_destination_count = 0;
if ($row['follow_me_enabled'] == 'true' && is_uuid($row['follow_me_uuid'])) {
$sql = "select count(*) from v_follow_me_destinations ";
$sql .= "where follow_me_uuid = :follow_me_uuid ";
$sql .= "and domain_uuid = :domain_uuid ";
$parameters['follow_me_uuid'] = $row['follow_me_uuid'];
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$follow_me_destination_count = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
}
echo " <td valign='top' class='".$row_style[$c]." hud_text' style='text-align: center;'>".($follow_me_destination_count ? $text['label-enabled'].' ('.$follow_me_destination_count.')' : '&nbsp;')."</td>\n";
}
if (permission_exists('do_not_disturb')) {
echo " <td valign='top' class='".$row_style[$c]." hud_text' style='text-align: center;'>".($row['do_not_disturb'] == 'true' ? $text['label-enabled'] : '&nbsp;')."</td>\n";
}
echo "</tr>\n";
$c = ($c) ? 0 : 1;
}
unset($extensions);
}
echo "</table>\n";
echo "</div>";
//$n++;
echo "<span class='hud_expander' onclick=\"$('#hud_call_forward_details').slideToggle('fast'); toggle_grid_row_end('".$dashboard_name."')\"><span class='fas fa-ellipsis-h'></span></span>\n";
}
echo "</div>\n";
?>

View File

@ -1,8 +1,33 @@
<?php
//call forward
$array['dashboard'][$x]['dashboard_uuid'] = 'ba60799a-1c40-44a8-80ef-c2be4f4692fb';
$array['dashboard'][$x]['dashboard_name'] = 'Call Forward';
$array['dashboard'][$x]['dashboard_path'] = 'app/call_forward/resources/dashboard/call_forward.php';
$array['dashboard'][$x]['dashboard_path'] = 'call_forward/call_forward';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-forward';
$array['dashboard'][$x]['dashboard_icon_color'] = '';
$array['dashboard'][$x]['dashboard_url'] = '/app/call_forward/call_forward.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
$array['dashboard'][$x]['dashboard_height'] = '';
$array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '2';
$array['dashboard'][$x]['dashboard_details_state'] = 'hidden';
$array['dashboard'][$x]['dashboard_order'] = '130';
$array['dashboard'][$x]['dashboard_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_description'] = 'Call routing for extension using Call forward, Follow Me and Do Not Disturb.';
@ -18,5 +43,42 @@ $y++;
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_group_uuid'] = '6d04646f-54cf-49f4-a3ce-a16e7adda2b9';
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_uuid'] = 'ba60799a-1c40-44a8-80ef-c2be4f4692fb';
$array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'user';
$x++;
//follow me icon
$array['dashboard'][$x]['dashboard_uuid'] = '714e513d-be78-4c63-8f8d-951d48a7fc0e';
$array['dashboard'][$x]['dashboard_name'] = 'Follow Me';
$array['dashboard'][$x]['dashboard_path'] = 'core/dashboard/resources/dashboard/icon.php';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-forward';
$array['dashboard'][$x]['dashboard_url'] = '/app/call_forward/call_forward.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
$array['dashboard'][$x]['dashboard_height'] = '';
$array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#0292ff';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '1';
$array['dashboard'][$x]['dashboard_details_state'] = 'disabled';
$array['dashboard'][$x]['dashboard_order'] = '50';
$array['dashboard'][$x]['dashboard_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_description'] = '';
$y = 0;
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_group_uuid'] = '57a49ce1-6985-4c9e-b59c-38ecd1d6bf7f';
$array['dashboard'][$x]['dashboard_groups'][$y]['dashboard_uuid'] = '714e513d-be78-4c63-8f8d-951d48a7fc0e';
$array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'user';
$y++;
?>

View File

@ -0,0 +1,93 @@
<?php
//check the permission
if (defined('STDIN')) {
//includes files
require_once dirname(__DIR__, 4) . "/resources/require.php";
}
else {
exit;
}
//increase limits
set_time_limit(0);
//ini_set('max_execution_time',1800); //30 minutes
//ini_set('memory_limit', '512M');
//save the arguments to variables
$script_name = $argv[0];
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
//get the primary key
if (Is_array($_GET)) {
$hostname = urldecode($_GET['hostname']);
$debug = $_GET['debug'];
$sleep_seconds = $_GET['sleep'];
}
else {
//invalid uuid
exit;
}
//use global conf created from require.php
global $conf;
//set the event socket connection settings
$host = $conf['switch.event_socket.host'] ?? $conf['event_socket.ip_address'] ?? '127.0.0.1';
$port = $conf['switch.event_socket.port'] ?? $conf['event_socket.port'] ?? '8021';
$pass = $conf['switch.event_socket.password'] ?? $conf['event_socket.password'] ?? 'ClueCon';
//connect to event socket using a lower timeout because we are on cli
$esl = event_socket::create($host, $port, $pass, 10000);
//ensure we are connected
if ($esl->is_connected()) {
//get the list
$sql = "select domain_name, extension, user_context, do_not_disturb, description ";
$sql .= "from v_extensions as e, v_domains as d ";
$sql .= "where do_not_disturb = 'true' ";
$sql .= "and e.domain_uuid = d.domain_uuid ";
$sql .= "and enabled = 'true' ";
$database = new database;
$results = $database->select($sql, $parameters, 'all');
unset($parameters);
foreach ($results as $row) {
//build the event
$cmd = "sendevent PRESENCE_IN\n";
$cmd .= "proto: sip\n";
$cmd .= "login: " . $row['extension'] . "@" . $row['domain_name'] . "\n";
$cmd .= "from: " . $row['extension'] . "@" . $row['domain_name'] . "\n";
$cmd .= "status: Active (1 waiting)\n";
$cmd .= "rpid: unknown\n";
$cmd .= "event_type: presence\n";
$cmd .= "alt_event_type: dialog\n";
$cmd .= "event_count: 1\n";
$cmd .= "unique-id: " . uuid() . "\n";
$cmd .= "Presence-Call-Direction: outbound\n";
$cmd .= "answer-state: confirmed\n";
//$cmd .= "answer-state: early\n";
//$cmd .= "answer-state: terminated\n";
//send message to the console
if (isset($debug)) {
echo "\n";
echo "[presence] dnd " . $row['extension'] . "@" . $row['domain_name'] . "\n";
}
//send the event
$result = event_socket::command($cmd);
if (isset($debug)) {
print_r($result, false);
}
}
}
else {
trigger_error("Unable to connect to FreeSWITCH using $host, $port, $password", E_USER_ERROR);
}
/*
* * * * * cd /var/www/fusionpbx && php /var/www/fusionpbx/app/call_forward/resources/jobs/dnd.php
*/

View File

@ -1,90 +0,0 @@
<?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) 2008-2012
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
// make sure the PATH_SEPARATOR is defined
umask(2);
if (!defined("PATH_SEPARATOR")) {
if (strpos($_ENV["OS"], "Win") !== false) {
define("PATH_SEPARATOR", ";");
} else {
define("PATH_SEPARATOR", ":");
}
}
if (!isset($output_format)) $output_format = (PHP_SAPI == 'cli') ? 'text' : 'html';
// make sure the document_root is set
$_SERVER["SCRIPT_FILENAME"] = str_replace("\\", '/', $_SERVER["SCRIPT_FILENAME"]);
if(PHP_SAPI == 'cli'){
chdir(pathinfo(realpath($_SERVER["PHP_SELF"]), PATHINFO_DIRNAME));
$script_full_path = str_replace("\\", '/', getcwd() . '/' . $_SERVER["SCRIPT_FILENAME"]);
$dirs = explode('/', pathinfo($script_full_path, PATHINFO_DIRNAME));
if (file_exists('/project_root.php')) {
$path = '/';
} else {
$i = 1;
$path = '';
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
}
$_SERVER["DOCUMENT_ROOT"] = $path;
}else{
$_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]);
}
$_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]);
// try to detect if a project path is being used
if (!defined('PROJECT_PATH')) {
if (is_dir($_SERVER["DOCUMENT_ROOT"]. '/fusionpbx')) {
define('PROJECT_PATH', '/fusionpbx');
} elseif (file_exists($_SERVER["DOCUMENT_ROOT"]. '/project_root.php')) {
define('PROJECT_PATH', '');
} else {
$dirs = explode('/', str_replace('\\', '/', pathinfo($_SERVER["PHP_SELF"], PATHINFO_DIRNAME)));
$i = 1;
$path = $_SERVER["DOCUMENT_ROOT"];
while ($i < count($dirs)) {
$path .= '/' . $dirs[$i];
if (file_exists($path. '/project_root.php')) {
break;
}
$i++;
}
if(!file_exists($path. '/project_root.php')){
die("Failed to locate the Project Root by searching for project_root.php please contact support for assistance");
}
$project_path = str_replace($_SERVER["DOCUMENT_ROOT"], "", $path);
define('PROJECT_PATH', $project_path);
}
$_SERVER["PROJECT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER["PROJECT_ROOT"]);
}
?>

View File

@ -5,7 +5,7 @@
$apps[$x]['uuid'] = '56165644-598d-4ed8-be01-d960bcb8ffed';
$apps[$x]['category'] = '';
$apps[$x]['subcategory'] = '';
$apps[$x]['version'] = '';
$apps[$x]['version'] = '1.1';
$apps[$x]['license'] = 'Mozilla Public License 1.1';
$apps[$x]['url'] = 'http://www.fusionpbx.com';
$apps[$x]['description']['en-us'] = 'Call Recordings';
@ -34,57 +34,24 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = 'call_recording_download';
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
//Call Recordings
$y = 2;
$apps[$x]['db'][$y]['table']['name'] = 'v_call_recordings';
$apps[$x]['db'][$y]['table']['parent'] = '';
$z = 0;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_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'] = 'primary';
$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'] = 'call_recording_name';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_path';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_length';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_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'] = 'call_direction';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_description';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'call_recording_base64';
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = '';
$z++;
$y++;
$apps[$x]['permissions'][$y]['name'] = 'call_recording_transcribe';
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
$y = 0;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "95cb740e-e377-4852-8894-06441c61e78b";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_recordings";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "filesystem_retention_days";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "90";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Number of days to retain the maintenance logs in the database.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "e329db05-2967-422a-a71f-d0175b083828";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_recordings";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "record_extension";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "mp3";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Call recording file format options: wav, mp3";
?>

View File

@ -0,0 +1,47 @@
<?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) 2022-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
if ($domains_processed == 1) {
//create the user view combines username, organization, contact first and last name
$database->execute("DROP VIEW view_call_recordings;", null);
$sql = "CREATE VIEW view_call_recordings AS ( \n";
$sql .= " select domain_uuid, xml_cdr_uuid as call_recording_uuid, \n";
$sql .= " caller_id_name, caller_id_number, caller_destination, destination_number, \n";
$sql .= " record_name as call_recording_name, record_path as call_recording_path, \n";
$sql .= " record_transcription as call_recording_transcription, \n";
$sql .= " duration as call_recording_length, start_stamp as call_recording_date, direction as call_direction \n";
$sql .= " from v_xml_cdr \n";
$sql .= " where record_name is not null \n";
$sql .= " and record_path is not null \n";
$sql .= " order by start_stamp desc \n";
$sql .= "); \n";
$database->execute($sql, null);
unset($sql);
}
?>

View File

@ -2,422 +2,626 @@
$text['title-call_recordings']['en-us'] = "Call Recordings";
$text['title-call_recordings']['en-gb'] = "Call Recordings";
$text['title-call_recordings']['ar-eg'] = "";
$text['title-call_recordings']['de-at'] = "";
$text['title-call_recordings']['de-ch'] = "";
$text['title-call_recordings']['de-de'] = "";
$text['title-call_recordings']['es-cl'] = "";
$text['title-call_recordings']['es-mx'] = "";
$text['title-call_recordings']['ar-eg'] = "تسجيلات المكالمات";
$text['title-call_recordings']['de-at'] = "Anrufaufzeichnungen";
$text['title-call_recordings']['de-ch'] = "Anrufaufzeichnungen";
$text['title-call_recordings']['de-de'] = "Anrufaufzeichnungen";
$text['title-call_recordings']['el-gr'] = "Ηχογραφήσεις κλήσεων";
$text['title-call_recordings']['es-cl'] = "Grabaciones de llamadas";
$text['title-call_recordings']['es-mx'] = "Grabaciones de llamadas";
$text['title-call_recordings']['fr-ca'] = "Enregistrements d'appels";
$text['title-call_recordings']['fr-fr'] = "Enregistrements d'appels";
$text['title-call_recordings']['he-il'] = "";
$text['title-call_recordings']['it-it'] = "";
$text['title-call_recordings']['he-il'] = "הקלטות שיחות";
$text['title-call_recordings']['it-it'] = "Grabaciones de llamadas";
$text['title-call_recordings']['ka-ge'] = "ზარის ჩანაწერები";
$text['title-call_recordings']['nl-nl'] = "Gespreksopnamen";
$text['title-call_recordings']['pl-pl'] = "Nagrania Rozmów";
$text['title-call_recordings']['pt-br'] = "";
$text['title-call_recordings']['pt-pt'] = "";
$text['title-call_recordings']['ro-ro'] = "";
$text['title-call_recordings']['pt-br'] = "Gravações de chamadas";
$text['title-call_recordings']['pt-pt'] = "Gravações de chamadas";
$text['title-call_recordings']['ro-ro'] = "Înregistrări de apeluri";
$text['title-call_recordings']['ru-ru'] = "Записи разговоров";
$text['title-call_recordings']['sv-se'] = "";
$text['title-call_recordings']['uk-ua'] = "";
$text['title-call_recordings']['sv-se'] = "Samtalsinspelningar";
$text['title-call_recordings']['uk-ua'] = "Записи дзвінків";
$text['title-call_recordings']['zh-cn'] = "通话录音";
$text['title-call_recordings']['ja-jp'] = "通話録音";
$text['title-call_recordings']['ko-kr'] = "통화 녹음";
$text['title-call_recording']['en-us'] = "Call Recording";
$text['title-call_recording']['en-gb'] = "Call Recording";
$text['title-call_recording']['ar-eg'] = "";
$text['title-call_recording']['de-at'] = "";
$text['title-call_recording']['de-ch'] = "";
$text['title-call_recording']['de-de'] = "";
$text['title-call_recording']['es-cl'] = "";
$text['title-call_recording']['es-mx'] = "";
$text['title-call_recording']['ar-eg'] = "تسجيل المكالمات";
$text['title-call_recording']['de-at'] = "Anrufaufzeichnung";
$text['title-call_recording']['de-ch'] = "Anrufaufzeichnung";
$text['title-call_recording']['de-de'] = "Anrufaufzeichnung";
$text['title-call_recording']['el-gr'] = "Καταγραφή κλήσεων";
$text['title-call_recording']['es-cl'] = "Grabacion de llamada";
$text['title-call_recording']['es-mx'] = "Grabacion de llamada";
$text['title-call_recording']['fr-ca'] = "Enregistrement d'appel";
$text['title-call_recording']['fr-fr'] = "Enregistrement d'appel";
$text['title-call_recording']['he-il'] = "";
$text['title-call_recording']['it-it'] = "";
$text['title-call_recording']['he-il'] = "הקלטת שיחה";
$text['title-call_recording']['it-it'] = "Registrazione delle chiamate";
$text['title-call_recording']['ka-ge'] = "საუბრის ჩაწერა";
$text['title-call_recording']['nl-nl'] = "Gespreksopname";
$text['title-call_recording']['pl-pl'] = "";
$text['title-call_recording']['pt-br'] = "";
$text['title-call_recording']['pt-pt'] = "";
$text['title-call_recording']['ro-ro'] = "";
$text['title-call_recording']['pl-pl'] = "Nagranie rozmowy";
$text['title-call_recording']['pt-br'] = "Gravação de chamadas";
$text['title-call_recording']['pt-pt'] = "Gravação de chamadas";
$text['title-call_recording']['ro-ro'] = "Înregistrare apel";
$text['title-call_recording']['ru-ru'] = "Запись разговора";
$text['title-call_recording']['sv-se'] = "";
$text['title-call_recording']['uk-ua'] = "";
$text['title-call_recording']['sv-se'] = "Samtalsinspelning";
$text['title-call_recording']['uk-ua'] = "Запис дзвінків";
$text['title-call_recording']['zh-cn'] = "通话录音";
$text['title-call_recording']['ja-jp'] = "通話録音";
$text['title-call_recording']['ko-kr'] = "통화 녹음";
$text['title_description-call_recordings']['en-us'] = "Shows the call recordings with name, length, date and time, and call direction.";
$text['title_description-call_recordings']['en-gb'] = "Shows the call recordings with name, length, date and time, and call direction.";
$text['title_description-call_recordings']['ar-eg'] = "";
$text['title_description-call_recordings']['de-at'] = "";
$text['title_description-call_recordings']['de-ch'] = "";
$text['title_description-call_recordings']['de-de'] = "";
$text['title_description-call_recordings']['es-cl'] = "";
$text['title_description-call_recordings']['es-mx'] = "";
$text['title_description-call_recordings']['ar-eg'] = "يظهر تسجيلات المكالمة بالاسم والطول والتاريخ والوقت واتجاه المكالمة.";
$text['title_description-call_recordings']['de-at'] = "Zeigt die Anrufaufzeichnungen mit Name, Dauer, Datum und Uhrzeit sowie Anrufrichtung an.";
$text['title_description-call_recordings']['de-ch'] = "Zeigt die Anrufaufzeichnungen mit Name, Dauer, Datum und Uhrzeit sowie Anrufrichtung an.";
$text['title_description-call_recordings']['de-de'] = "Zeigt die Anrufaufzeichnungen mit Name, Dauer, Datum und Uhrzeit sowie Anrufrichtung an.";
$text['title_description-call_recordings']['el-gr'] = "Εμφανίζει τις εγγραφές κλήσεων με όνομα, διάρκεια, ημερομηνία και ώρα και κατεύθυνση κλήσης.";
$text['title_description-call_recordings']['es-cl'] = "Muestra las grabaciones de llamadas con nombre, duración, fecha y hora, y dirección de la llamada.";
$text['title_description-call_recordings']['es-mx'] = "Muestra las grabaciones de llamadas con nombre, duración, fecha y hora, y dirección de la llamada.";
$text['title_description-call_recordings']['fr-ca'] = "Affiche les enregistrements d'appel avec nom, durée, date et heure, et direction de l'appel";
$text['title_description-call_recordings']['fr-fr'] = "Affiche les enregistrements d'appel avec nom, durée, date et heure, et direction de l'appel";
$text['title_description-call_recordings']['he-il'] = "";
$text['title_description-call_recordings']['it-it'] = "";
$text['title_description-call_recordings']['he-il'] = "מציג את הקלטות השיחה עם שם, אורך, תאריך ושעה וכיוון השיחה.";
$text['title_description-call_recordings']['it-it'] = "Mostra le registrazioni delle chiamate con nome, durata, data e ora e direzione della chiamata.";
$text['title_description-call_recordings']['ka-ge'] = "აჩვენებს ხელმისაწვდომ ზარის ჩანაწერებს სახელით, ხანგრძლივობით, თარიღითა და დროით და ზარის მიმართულებით.";
$text['title_description-call_recordings']['nl-nl'] = "Toont de gespreksopnamen met naam, lengte, datum/tijd en oproep richting.";
$text['title_description-call_recordings']['pl-pl'] = "Wyświetla nagrania połączeń wraz z nazwą, długością, datą i godziną oraz kierunkiem połączenia.";
$text['title_description-call_recordings']['pt-br'] = "";
$text['title_description-call_recordings']['pt-pt'] = "";
$text['title_description-call_recordings']['ro-ro'] = "";
$text['title_description-call_recordings']['pt-br'] = "Mostra as gravações de chamadas com nome, duração, data e hora e direção da chamada.";
$text['title_description-call_recordings']['pt-pt'] = "Mostra as gravações de chamadas com nome, duração, data e hora e direção da chamada.";
$text['title_description-call_recordings']['ro-ro'] = "Afișează înregistrările apelurilor cu nume, lungime, dată și oră și direcția apelului.";
$text['title_description-call_recordings']['ru-ru'] = "Показывает доступные записи разговоров с именем, датой, временем и направлением вызова.";
$text['title_description-call_recordings']['sv-se'] = "";
$text['title_description-call_recordings']['uk-ua'] = "";
$text['title_description-call_recordings']['sv-se'] = "Visar samtalsinspelningarna med namn, längd, datum och tid samt samtalsriktning.";
$text['title_description-call_recordings']['uk-ua'] = "Показує записи дзвінків із назвою, тривалістю, датою та часом, а також напрямком дзвінка.";
$text['title_description-call_recordings']['zh-cn'] = "显示带有名称、长度、日期和时间以及呼叫方向的通话录音。";
$text['title_description-call_recordings']['ja-jp'] = "通話録音を名前、長さ、日付と時刻、通話方向とともに表示します。";
$text['title_description-call_recordings']['ko-kr'] = "이름, 길이, 날짜 및 시간, 통화 방향과 함께 통화 녹음을 표시합니다.";
$text['label-call_recording_name']['en-us'] = "Name";
$text['label-call_recording_name']['en-gb'] = "Name";
$text['label-call_recording_name']['ar-eg'] = "";
$text['label-call_recording_name']['de-at'] = "";
$text['label-call_recording_name']['de-ch'] = "";
$text['label-call_recording_name']['de-de'] = "";
$text['label-call_recording_name']['es-cl'] = "";
$text['label-call_recording_name']['es-mx'] = "";
$text['label-call_recording_name']['ar-eg'] = "اسم";
$text['label-call_recording_name']['de-at'] = "Name";
$text['label-call_recording_name']['de-ch'] = "Name";
$text['label-call_recording_name']['de-de'] = "Name";
$text['label-call_recording_name']['el-gr'] = "Ονομα";
$text['label-call_recording_name']['es-cl'] = "Nombre";
$text['label-call_recording_name']['es-mx'] = "Nombre";
$text['label-call_recording_name']['fr-ca'] = "Nom";
$text['label-call_recording_name']['fr-fr'] = "Nom";
$text['label-call_recording_name']['he-il'] = "";
$text['label-call_recording_name']['it-it'] = "";
$text['label-call_recording_name']['he-il'] = "שֵׁם";
$text['label-call_recording_name']['it-it'] = "Nome";
$text['label-call_recording_name']['ka-ge'] = "სახელი";
$text['label-call_recording_name']['nl-nl'] = "Naam";
$text['label-call_recording_name']['pl-pl'] = "Nazwa";
$text['label-call_recording_name']['pt-br'] = "";
$text['label-call_recording_name']['pt-pt'] = "";
$text['label-call_recording_name']['ro-ro'] = "";
$text['label-call_recording_name']['pt-br'] = "Nome";
$text['label-call_recording_name']['pt-pt'] = "Nome";
$text['label-call_recording_name']['ro-ro'] = "Nume";
$text['label-call_recording_name']['ru-ru'] = "Имя";
$text['label-call_recording_name']['sv-se'] = "";
$text['label-call_recording_name']['uk-ua'] = "";
$text['label-call_recording_name']['sv-se'] = "namn";
$text['label-call_recording_name']['uk-ua'] = "Ім'я";
$text['label-call_recording_name']['zh-cn'] = "姓名";
$text['label-call_recording_name']['ja-jp'] = "名前";
$text['label-call_recording_name']['ko-kr'] = "이름";
$text['description-call_recording_name']['en-us'] = "";
$text['description-call_recording_name']['en-gb'] = "";
$text['description-call_recording_name']['ar-eg'] = "";
$text['description-call_recording_name']['de-at'] = "";
$text['description-call_recording_name']['de-ch'] = "";
$text['description-call_recording_name']['de-de'] = "";
$text['description-call_recording_name']['es-cl'] = "";
$text['description-call_recording_name']['es-mx'] = "";
$text['description-call_recording_name']['fr-ca'] = "";
$text['description-call_recording_name']['fr-fr'] = "";
$text['description-call_recording_name']['he-il'] = "";
$text['description-call_recording_name']['it-it'] = "";
$text['label-caller_id_name']['en-us'] = "Caller Name";
$text['label-caller_id_name']['en-gb'] = "Caller Name";
$text['label-caller_id_name']['ar-eg'] = "اسم المتصل";
$text['label-caller_id_name']['de-at'] = "Anrufer Name";
$text['label-caller_id_name']['de-ch'] = "Anrufer Name";
$text['label-caller_id_name']['de-de'] = "Anrufer Name";
$text['label-caller_id_name']['el-gr'] = "Όνομα καλούντος";
$text['label-caller_id_name']['es-cl'] = "Nombre CID";
$text['label-caller_id_name']['es-mx'] = "Nombre CID";
$text['label-caller_id_name']['fr-ca'] = "Nom de l'Appelant";
$text['label-caller_id_name']['fr-fr'] = "Nom de l'Appelant";
$text['label-caller_id_name']['he-il'] = "שם המתקשר";
$text['label-caller_id_name']['it-it'] = "Nome CID";
$text['label-caller_id_name']['ka-ge'] = "დამრეკავის სახელი";
$text['label-caller_id_name']['nl-nl'] = "Naam beller";
$text['label-caller_id_name']['pl-pl'] = "Prezentacja nazwy dzwoniącego";
$text['label-caller_id_name']['pt-br'] = "Nome CID";
$text['label-caller_id_name']['pt-pt'] = "Nome CID";
$text['label-caller_id_name']['ro-ro'] = "Numele apelantului";
$text['label-caller_id_name']['ru-ru'] = "CID Имя";
$text['label-caller_id_name']['sv-se'] = "CID Namn";
$text['label-caller_id_name']['uk-ua'] = "CID Ім’я";
$text['label-caller_id_name']['zh-cn'] = "来电者姓名";
$text['label-caller_id_name']['ja-jp'] = "発信者名";
$text['label-caller_id_name']['ko-kr'] = "발신자 이름";
$text['label-caller_id_number']['en-us'] = "Caller Number";
$text['label-caller_id_number']['en-gb'] = "Caller Number";
$text['label-caller_id_number']['ar-eg'] = "رقم المتصل";
$text['label-caller_id_number']['de-at'] = "Anrufer Nummer";
$text['label-caller_id_number']['de-ch'] = "Anrufer Nummer";
$text['label-caller_id_number']['de-de'] = "Anrufer Nummer";
$text['label-caller_id_number']['el-gr'] = "Αριθμός καλούντος";
$text['label-caller_id_number']['es-cl'] = "Número CID";
$text['label-caller_id_number']['es-mx'] = "Número CID";
$text['label-caller_id_number']['fr-ca'] = "Numéro de l'Appelant";
$text['label-caller_id_number']['fr-fr'] = "Numéro de l'Appelant";
$text['label-caller_id_number']['he-il'] = "מספר מתקשר";
$text['label-caller_id_number']['it-it'] = "Numero CID";
$text['label-caller_id_number']['ka-ge'] = "დამრეკავის ნომერი";
$text['label-caller_id_number']['nl-nl'] = "Beller nummer";
$text['label-caller_id_number']['pl-pl'] = "Prezentacja numeru dzwoniącego";
$text['label-caller_id_number']['pt-br'] = "Número CID";
$text['label-caller_id_number']['pt-pt'] = "Número CID";
$text['label-caller_id_number']['ro-ro'] = "Numărul apelantului";
$text['label-caller_id_number']['ru-ru'] = "CID номера";
$text['label-caller_id_number']['sv-se'] = "CID, Nummer";
$text['label-caller_id_number']['uk-ua'] = "CID Номер";
$text['label-caller_id_number']['zh-cn'] = "来电号码";
$text['label-caller_id_number']['ja-jp'] = "発信者番号";
$text['label-caller_id_number']['ko-kr'] = "발신자 번호";
$text['label-caller_destination']['en-us'] = "Caller Destination";
$text['label-caller_destination']['en-gb'] = "Caller Destination";
$text['label-caller_destination']['ar-eg'] = "وجهة المتصل";
$text['label-caller_destination']['de-at'] = "Rufziel";
$text['label-caller_destination']['de-ch'] = "Rufziel";
$text['label-caller_destination']['de-de'] = "Rufziel";
$text['label-caller_destination']['el-gr'] = "Προορισμός καλούντος";
$text['label-caller_destination']['es-cl'] = "Destino de la persona que llama";
$text['label-caller_destination']['es-mx'] = "Destino de la persona que llama";
$text['label-caller_destination']['fr-ca'] = "Destination de l'appelant";
$text['label-caller_destination']['fr-fr'] = "Destination de l'appelant";
$text['label-caller_destination']['he-il'] = "Destino de la persona que llama";
$text['label-caller_destination']['it-it'] = "Destinazione del chiamante";
$text['label-caller_destination']['ka-ge'] = "დამრეკავის დანიშნულება";
$text['label-caller_destination']['nl-nl'] = "Bestemming van de beller";
$text['label-caller_destination']['pl-pl'] = "Miejsce docelowe dzwoniącego";
$text['label-caller_destination']['pt-br'] = "Destino do chamador";
$text['label-caller_destination']['pt-pt'] = "Destino do chamador";
$text['label-caller_destination']['ro-ro'] = "Destinația apelantului";
$text['label-caller_destination']['ru-ru'] = "Вызывающий абонент";
$text['label-caller_destination']['sv-se'] = "Uppringarens destination";
$text['label-caller_destination']['uk-ua'] = "Пункт призначення абонента";
$text['label-caller_destination']['zh-cn'] = "来电目的地";
$text['label-caller_destination']['ja-jp'] = "発信者の宛先";
$text['label-caller_destination']['ko-kr'] = "발신자 목적지";
$text['label-destination_number']['en-us'] = "Destination";
$text['label-destination_number']['en-gb'] = "Destination";
$text['label-destination_number']['ar-eg'] = "وجهة";
$text['label-destination_number']['de-at'] = "Ziel";
$text['label-destination_number']['de-ch'] = "Ziel";
$text['label-destination_number']['de-de'] = "Ziel";
$text['label-destination_number']['el-gr'] = "Προορισμός";
$text['label-destination_number']['es-cl'] = "Destino";
$text['label-destination_number']['es-mx'] = "Destino";
$text['label-destination_number']['fr-ca'] = "Destination";
$text['label-destination_number']['fr-fr'] = "Destination";
$text['label-destination_number']['he-il'] = "יַעַד";
$text['label-destination_number']['it-it'] = "Destinazione";
$text['label-destination_number']['ka-ge'] = "დანიშნულება";
$text['label-destination_number']['nl-nl'] = "Bestemming";
$text['label-destination_number']['pl-pl'] = "Miejsce docelowe";
$text['label-destination_number']['pt-br'] = "Destino";
$text['label-destination_number']['pt-pt'] = "Destino";
$text['label-destination_number']['ro-ro'] = "Destinaţie";
$text['label-destination_number']['ru-ru'] = "Место назначения";
$text['label-destination_number']['sv-se'] = "Destination";
$text['label-destination_number']['uk-ua'] = "Пункт призначення";
$text['label-destination_number']['zh-cn'] = "目的地";
$text['label-destination_number']['ja-jp'] = "行き先";
$text['label-destination_number']['ko-kr'] = "목적지";
$text['description-call_recording_name']['en-us'] = "Call Recording Name";
$text['description-call_recording_name']['en-gb'] = "Call Recording Name";
$text['description-call_recording_name']['ar-eg'] = "اسم تسجيل المكالمات";
$text['description-call_recording_name']['de-at'] = "Name der Anrufaufzeichnung";
$text['description-call_recording_name']['de-ch'] = "Name der Anrufaufzeichnung";
$text['description-call_recording_name']['de-de'] = "Name der Anrufaufzeichnung";
$text['description-call_recording_name']['el-gr'] = "Όνομα εγγραφής κλήσης";
$text['description-call_recording_name']['es-cl'] = "Nombre de grabación de llamada";
$text['description-call_recording_name']['es-mx'] = "Nombre de grabación de llamada";
$text['description-call_recording_name']['fr-ca'] = "Nom de l'enregistrement d'appel";
$text['description-call_recording_name']['fr-fr'] = "Nom de l'enregistrement d'appel";
$text['description-call_recording_name']['he-il'] = "שם הקלטת שיחה";
$text['description-call_recording_name']['it-it'] = "Nome della registrazione della chiamata";
$text['description-call_recording_name']['ka-ge'] = "ზარის ჩანაწერის სახელი";
$text['description-call_recording_name']['nl-nl'] = "Gespreksopname naam";
$text['description-call_recording_name']['pl-pl'] = "";
$text['description-call_recording_name']['pt-br'] = "";
$text['description-call_recording_name']['pt-pt'] = "";
$text['description-call_recording_name']['ro-ro'] = "";
$text['description-call_recording_name']['ru-ru'] = "";
$text['description-call_recording_name']['sv-se'] = "";
$text['description-call_recording_name']['uk-ua'] = "";
$text['description-call_recording_name']['pl-pl'] = "Nazwa nagrania rozmowy";
$text['description-call_recording_name']['pt-br'] = "Nome da gravação de chamada";
$text['description-call_recording_name']['pt-pt'] = "Nome da gravação de chamada";
$text['description-call_recording_name']['ro-ro'] = "Numele înregistrării apelului";
$text['description-call_recording_name']['ru-ru'] = "Имя записи звонка";
$text['description-call_recording_name']['sv-se'] = "Namn på samtalsinspelning";
$text['description-call_recording_name']['uk-ua'] = "Назва запису виклику";
$text['description-call_recording_name']['zh-cn'] = "通话录音名称";
$text['description-call_recording_name']['ja-jp'] = "通話録音名";
$text['description-call_recording_name']['ko-kr'] = "통화 녹음 이름";
$text['label-call_recording_path']['en-us'] = "Path";
$text['label-call_recording_path']['en-gb'] = "Path";
$text['label-call_recording_path']['ar-eg'] = "";
$text['label-call_recording_path']['de-at'] = "";
$text['label-call_recording_path']['de-ch'] = "";
$text['label-call_recording_path']['de-de'] = "";
$text['label-call_recording_path']['es-cl'] = "";
$text['label-call_recording_path']['es-mx'] = "";
$text['label-call_recording_path']['ar-eg'] = "طريق";
$text['label-call_recording_path']['de-at'] = "Weg";
$text['label-call_recording_path']['de-ch'] = "Weg";
$text['label-call_recording_path']['de-de'] = "Weg";
$text['label-call_recording_path']['el-gr'] = "Μονοπάτι";
$text['label-call_recording_path']['es-cl'] = "Camino";
$text['label-call_recording_path']['es-mx'] = "Camino";
$text['label-call_recording_path']['fr-ca'] = "Chemin";
$text['label-call_recording_path']['fr-fr'] = "Chemin";
$text['label-call_recording_path']['he-il'] = "";
$text['label-call_recording_path']['it-it'] = "";
$text['label-call_recording_path']['he-il'] = "נָתִיב";
$text['label-call_recording_path']['it-it'] = "Sentiero";
$text['label-call_recording_path']['ka-ge'] = "ბილიკი";
$text['label-call_recording_path']['nl-nl'] = "Pad";
$text['label-call_recording_path']['pl-pl'] = "Scieżka";
$text['label-call_recording_path']['pt-br'] = "";
$text['label-call_recording_path']['pt-pt'] = "";
$text['label-call_recording_path']['ro-ro'] = "";
$text['label-call_recording_path']['pt-br'] = "Caminho";
$text['label-call_recording_path']['pt-pt'] = "Caminho";
$text['label-call_recording_path']['ro-ro'] = "cale";
$text['label-call_recording_path']['ru-ru'] = "Путь";
$text['label-call_recording_path']['sv-se'] = "";
$text['label-call_recording_path']['uk-ua'] = "";
$text['label-call_recording_path']['sv-se'] = "Väg";
$text['label-call_recording_path']['uk-ua'] = "шлях";
$text['label-call_recording_path']['zh-cn'] = "小路";
$text['label-call_recording_path']['ja-jp'] = "";
$text['label-call_recording_path']['ko-kr'] = "";
$text['description-call_recording_path']['en-us'] = "";
$text['description-call_recording_path']['en-gb'] = "";
$text['description-call_recording_path']['ar-eg'] = "";
$text['description-call_recording_path']['de-at'] = "";
$text['description-call_recording_path']['de-ch'] = "";
$text['description-call_recording_path']['de-de'] = "";
$text['description-call_recording_path']['es-cl'] = "";
$text['description-call_recording_path']['es-mx'] = "";
$text['description-call_recording_path']['fr-ca'] = "";
$text['description-call_recording_path']['fr-fr'] = "";
$text['description-call_recording_path']['he-il'] = "";
$text['description-call_recording_path']['it-it'] = "";
$text['description-call_recording_path']['en-us'] = "Conversation recording path";
$text['description-call_recording_path']['en-gb'] = "Conversation recording path";
$text['description-call_recording_path']['ar-eg'] = "مسار تسجيل المحادثة";
$text['description-call_recording_path']['de-at'] = "Konversationsaufzeichnungspfad";
$text['description-call_recording_path']['de-ch'] = "Konversationsaufzeichnungspfad";
$text['description-call_recording_path']['de-de'] = "Konversationsaufzeichnungspfad";
$text['description-call_recording_path']['el-gr'] = "Διαδρομή εγγραφής συνομιλίας";
$text['description-call_recording_path']['es-cl'] = "Ruta de grabación de conversaciones";
$text['description-call_recording_path']['es-mx'] = "Ruta de grabación de conversaciones";
$text['description-call_recording_path']['fr-ca'] = "Chemin d'enregistrement des conversations";
$text['description-call_recording_path']['fr-fr'] = "Chemin d'enregistrement des conversations";
$text['description-call_recording_path']['he-il'] = "נתיב הקלטת שיחות";
$text['description-call_recording_path']['it-it'] = "Percorso di registrazione della conversazione";
$text['description-call_recording_path']['ka-ge'] = "საუბრის ჩანაწერის ბილიკი";
$text['description-call_recording_path']['nl-nl'] = "Gespreksopname pad";
$text['description-call_recording_path']['pl-pl'] = "";
$text['description-call_recording_path']['pt-br'] = "";
$text['description-call_recording_path']['pt-pt'] = "";
$text['description-call_recording_path']['ro-ro'] = "";
$text['description-call_recording_path']['ru-ru'] = "";
$text['description-call_recording_path']['sv-se'] = "";
$text['description-call_recording_path']['uk-ua'] = "";
$text['description-call_recording_path']['pl-pl'] = "Ścieżka nagrywania rozmowy";
$text['description-call_recording_path']['pt-br'] = "Caminho de gravação de conversa";
$text['description-call_recording_path']['pt-pt'] = "Caminho de gravação de conversa";
$text['description-call_recording_path']['ro-ro'] = "Calea de înregistrare a conversației";
$text['description-call_recording_path']['ru-ru'] = "Путь записи разговора";
$text['description-call_recording_path']['sv-se'] = "Konversationsinspelningsväg";
$text['description-call_recording_path']['uk-ua'] = "Шлях запису розмови";
$text['description-call_recording_path']['zh-cn'] = "对话录音路径";
$text['description-call_recording_path']['ja-jp'] = "会話録音パス";
$text['description-call_recording_path']['ko-kr'] = "대화 녹음 경로";
$text['label-call_recording_length']['en-us'] = "Length";
$text['label-call_recording_length']['en-gb'] = "Length";
$text['label-call_recording_length']['ar-eg'] = "";
$text['label-call_recording_length']['de-at'] = "";
$text['label-call_recording_length']['de-ch'] = "";
$text['label-call_recording_length']['de-de'] = "";
$text['label-call_recording_length']['es-cl'] = "";
$text['label-call_recording_length']['es-mx'] = "";
$text['label-call_recording_length']['ar-eg'] = "طول";
$text['label-call_recording_length']['de-at'] = "Länge";
$text['label-call_recording_length']['de-ch'] = "Länge";
$text['label-call_recording_length']['de-de'] = "Länge";
$text['label-call_recording_length']['el-gr'] = "Μήκος";
$text['label-call_recording_length']['es-cl'] = "Longitud";
$text['label-call_recording_length']['es-mx'] = "Longitud";
$text['label-call_recording_length']['fr-ca'] = "Longueur";
$text['label-call_recording_length']['fr-fr'] = "Longueur";
$text['label-call_recording_length']['he-il'] = "";
$text['label-call_recording_length']['it-it'] = "";
$text['label-call_recording_length']['he-il'] = "אורך";
$text['label-call_recording_length']['it-it'] = "Lunghezza";
$text['label-call_recording_length']['ka-ge'] = "ხანგრძლივობა";
$text['label-call_recording_length']['nl-nl'] = "Lengte";
$text['label-call_recording_length']['pl-pl'] = "Długość";
$text['label-call_recording_length']['pt-br'] = "";
$text['label-call_recording_length']['pt-pt'] = "";
$text['label-call_recording_length']['ro-ro'] = "";
$text['label-call_recording_length']['pt-br'] = "Comprimento";
$text['label-call_recording_length']['pt-pt'] = "Comprimento";
$text['label-call_recording_length']['ro-ro'] = "Lungime";
$text['label-call_recording_length']['ru-ru'] = "Длительность";
$text['label-call_recording_length']['sv-se'] = "";
$text['label-call_recording_length']['uk-ua'] = "";
$text['label-call_recording_length']['sv-se'] = "Längd";
$text['label-call_recording_length']['uk-ua'] = "Довжина";
$text['label-call_recording_length']['zh-cn'] = "长度";
$text['label-call_recording_length']['ja-jp'] = "長さ";
$text['label-call_recording_length']['ko-kr'] = "길이";
$text['description-call_recording_length']['en-us'] = "";
$text['description-call_recording_length']['en-gb'] = "";
$text['description-call_recording_length']['ar-eg'] = "";
$text['description-call_recording_length']['de-at'] = "";
$text['description-call_recording_length']['de-ch'] = "";
$text['description-call_recording_length']['de-de'] = "";
$text['description-call_recording_length']['es-cl'] = "";
$text['description-call_recording_length']['es-mx'] = "";
$text['description-call_recording_length']['fr-ca'] = "";
$text['description-call_recording_length']['fr-fr'] = "";
$text['description-call_recording_length']['he-il'] = "";
$text['description-call_recording_length']['it-it'] = "";
$text['description-call_recording_length']['en-us'] = "Call Recording Duration";
$text['description-call_recording_length']['en-gb'] = "Call Recording Duration";
$text['description-call_recording_length']['ar-eg'] = "مدة تسجيل المكالمات";
$text['description-call_recording_length']['de-at'] = "Anrufaufzeichnungsdauer";
$text['description-call_recording_length']['de-ch'] = "Anrufaufzeichnungsdauer";
$text['description-call_recording_length']['de-de'] = "Anrufaufzeichnungsdauer";
$text['description-call_recording_length']['el-gr'] = "Διάρκεια εγγραφής κλήσης";
$text['description-call_recording_length']['es-cl'] = "Duración de la grabación de llamadas";
$text['description-call_recording_length']['es-mx'] = "Duración de la grabación de llamadas";
$text['description-call_recording_length']['fr-ca'] = "Durée d'enregistrement des appels";
$text['description-call_recording_length']['fr-fr'] = "Durée d'enregistrement des appels";
$text['description-call_recording_length']['he-il'] = "משך הקלטת השיחה";
$text['description-call_recording_length']['it-it'] = "Durata della registrazione delle chiamate";
$text['description-call_recording_length']['ka-ge'] = "ზარის ჩანაწერის ხანგრძლივობა";
$text['description-call_recording_length']['nl-nl'] = "Gespreksopname duur";
$text['description-call_recording_length']['pl-pl'] = "";
$text['description-call_recording_length']['pt-br'] = "";
$text['description-call_recording_length']['pt-pt'] = "";
$text['description-call_recording_length']['ro-ro'] = "";
$text['description-call_recording_length']['ru-ru'] = "";
$text['description-call_recording_length']['sv-se'] = "";
$text['description-call_recording_length']['uk-ua'] = "";
$text['description-call_recording_length']['pl-pl'] = "Czas nagrywania rozmowy";
$text['description-call_recording_length']['pt-br'] = "Durata înregistrării apelului";
$text['description-call_recording_length']['pt-pt'] = "Durata înregistrării apelului";
$text['description-call_recording_length']['ro-ro'] = "Durata înregistrării apelului";
$text['description-call_recording_length']['ru-ru'] = "Продолжительность записи разговора";
$text['description-call_recording_length']['sv-se'] = "Samtalsinspelningslängd";
$text['description-call_recording_length']['uk-ua'] = "Тривалість запису розмови";
$text['description-call_recording_length']['zh-cn'] = "通话录音时长";
$text['description-call_recording_length']['ja-jp'] = "通話録音時間";
$text['description-call_recording_length']['ko-kr'] = "통화 녹음 시간";
$text['label-call_recording_date']['en-us'] = "Date";
$text['label-call_recording_date']['en-gb'] = "Date";
$text['label-call_recording_date']['ar-eg'] = "";
$text['label-call_recording_date']['de-at'] = "";
$text['label-call_recording_date']['de-ch'] = "";
$text['label-call_recording_date']['de-de'] = "";
$text['label-call_recording_date']['es-cl'] = "";
$text['label-call_recording_date']['es-mx'] = "";
$text['label-call_recording_date']['ar-eg'] = "تاريخ";
$text['label-call_recording_date']['de-at'] = "Datum";
$text['label-call_recording_date']['de-ch'] = "Datum";
$text['label-call_recording_date']['de-de'] = "Datum";
$text['label-call_recording_date']['el-gr'] = "Ημερομηνία";
$text['label-call_recording_date']['es-cl'] = "Fecha";
$text['label-call_recording_date']['es-mx'] = "Fecha";
$text['label-call_recording_date']['fr-ca'] = "Date";
$text['label-call_recording_date']['fr-fr'] = "Date";
$text['label-call_recording_date']['he-il'] = "";
$text['label-call_recording_date']['it-it'] = "";
$text['label-call_recording_date']['he-il'] = "תַאֲרִיך";
$text['label-call_recording_date']['it-it'] = "תַאֲרִיך";
$text['label-call_recording_date']['ka-ge'] = "თარიღი";
$text['label-call_recording_date']['nl-nl'] = "Datum";
$text['label-call_recording_date']['pl-pl'] = "Data";
$text['label-call_recording_date']['pt-br'] = "";
$text['label-call_recording_date']['pt-pt'] = "";
$text['label-call_recording_date']['ro-ro'] = "";
$text['label-call_recording_date']['pt-br'] = "Data";
$text['label-call_recording_date']['pt-pt'] = "Data";
$text['label-call_recording_date']['ro-ro'] = "Data";
$text['label-call_recording_date']['ru-ru'] = "Дата";
$text['label-call_recording_date']['sv-se'] = "";
$text['label-call_recording_date']['uk-ua'] = "";
$text['label-call_recording_date']['sv-se'] = "Datum";
$text['label-call_recording_date']['uk-ua'] = "Дата";
$text['label-call_recording_date']['zh-cn'] = "日期";
$text['label-call_recording_date']['ja-jp'] = "日にち";
$text['label-call_recording_date']['ko-kr'] = "날짜";
$text['description-call_recording_date']['en-us'] = "";
$text['description-call_recording_date']['en-gb'] = "";
$text['description-call_recording_date']['ar-eg'] = "";
$text['description-call_recording_date']['de-at'] = "";
$text['description-call_recording_date']['de-ch'] = "";
$text['description-call_recording_date']['de-de'] = "";
$text['description-call_recording_date']['es-cl'] = "";
$text['description-call_recording_date']['es-mx'] = "";
$text['description-call_recording_date']['fr-ca'] = "";
$text['description-call_recording_date']['fr-fr'] = "";
$text['description-call_recording_date']['he-il'] = "";
$text['description-call_recording_date']['it-it'] = "";
$text['description-call_recording_date']['en-us'] = "Call Recording Date";
$text['description-call_recording_date']['en-gb'] = "Call Recording Date";
$text['description-call_recording_date']['ar-eg'] = "تاريخ تسجيل المكالمة";
$text['description-call_recording_date']['de-at'] = "Anrufaufzeichnungsdatum";
$text['description-call_recording_date']['de-ch'] = "Anrufaufzeichnungsdatum";
$text['description-call_recording_date']['de-de'] = "Anrufaufzeichnungsdatum";
$text['description-call_recording_date']['el-gr'] = "Ημερομηνία εγγραφής κλήσης";
$text['description-call_recording_date']['es-cl'] = "Fecha de grabación de llamadas";
$text['description-call_recording_date']['es-mx'] = "Fecha de grabación de llamadas";
$text['description-call_recording_date']['fr-ca'] = "Date d'enregistrement de l'appel";
$text['description-call_recording_date']['fr-fr'] = "Date d'enregistrement de l'appel";
$text['description-call_recording_date']['he-il'] = "תאריך הקלטת שיחה";
$text['description-call_recording_date']['it-it'] = "Data di registrazione della chiamata";
$text['description-call_recording_date']['ka-ge'] = "ზარის ჩაწერის თარიღი";
$text['description-call_recording_date']['nl-nl'] = "Gespreksopname datum";
$text['description-call_recording_date']['pl-pl'] = "";
$text['description-call_recording_date']['pt-br'] = "";
$text['description-call_recording_date']['pt-pt'] = "";
$text['description-call_recording_date']['ro-ro'] = "";
$text['description-call_recording_date']['ru-ru'] = "";
$text['description-call_recording_date']['sv-se'] = "";
$text['description-call_recording_date']['uk-ua'] = "";
$text['description-call_recording_date']['pl-pl'] = "Data nagrania rozmowy";
$text['description-call_recording_date']['pt-br'] = "Data de gravação da chamada";
$text['description-call_recording_date']['pt-pt'] = "Data de gravação da chamada";
$text['description-call_recording_date']['ro-ro'] = "Data înregistrării apelului";
$text['description-call_recording_date']['ru-ru'] = "Дата записи звонка";
$text['description-call_recording_date']['sv-se'] = "Samtalsinspelningsdatum";
$text['description-call_recording_date']['uk-ua'] = "Дата запису дзвінка";
$text['description-call_recording_date']['zh-cn'] = "通话录音日期";
$text['description-call_recording_date']['ja-jp'] = "通話録音日";
$text['description-call_recording_date']['ko-kr'] = "통화 녹음 날짜";
$text['label-call_direction']['en-us'] = "Direction";
$text['label-call_direction']['en-gb'] = "Direction";
$text['label-call_direction']['ar-eg'] = "";
$text['label-call_direction']['de-at'] = "";
$text['label-call_direction']['de-ch'] = "";
$text['label-call_direction']['de-de'] = "";
$text['label-call_direction']['es-cl'] = "";
$text['label-call_direction']['es-mx'] = "";
$text['label-call_direction']['ar-eg'] = "اتجاه";
$text['label-call_direction']['de-at'] = "Richtung";
$text['label-call_direction']['de-ch'] = "Richtung";
$text['label-call_direction']['de-de'] = "Richtung";
$text['label-call_direction']['el-gr'] = "Κατεύθυνση";
$text['label-call_direction']['es-cl'] = "Dirección";
$text['label-call_direction']['es-mx'] = "Dirección";
$text['label-call_direction']['fr-ca'] = "Direction";
$text['label-call_direction']['fr-fr'] = "Direction";
$text['label-call_direction']['he-il'] = "";
$text['label-call_direction']['it-it'] = "";
$text['label-call_direction']['he-il'] = "כיוון";
$text['label-call_direction']['it-it'] = "Direzione";
$text['label-call_direction']['ka-ge'] = "მიმართულება";
$text['label-call_direction']['nl-nl'] = "Richting";
$text['label-call_direction']['pl-pl'] = "Kierunek";
$text['label-call_direction']['pt-br'] = "";
$text['label-call_direction']['pt-pt'] = "";
$text['label-call_direction']['ro-ro'] = "";
$text['label-call_direction']['pt-br'] = "Direção";
$text['label-call_direction']['pt-pt'] = "Direção";
$text['label-call_direction']['ro-ro'] = "Direcţie";
$text['label-call_direction']['ru-ru'] = "Направление";
$text['label-call_direction']['sv-se'] = "";
$text['label-call_direction']['uk-ua'] = "";
$text['label-call_direction']['sv-se'] = "Riktning";
$text['label-call_direction']['uk-ua'] = "Напрямок";
$text['label-call_direction']['zh-cn'] = "方向";
$text['label-call_direction']['ja-jp'] = "方向";
$text['label-call_direction']['ko-kr'] = "방향";
$text['description-call_direction']['en-us'] = "";
$text['description-call_direction']['en-gb'] = "";
$text['description-call_direction']['ar-eg'] = "";
$text['description-call_direction']['de-at'] = "";
$text['description-call_direction']['de-ch'] = "";
$text['description-call_direction']['de-de'] = "";
$text['description-call_direction']['es-cl'] = "";
$text['description-call_direction']['es-mx'] = "";
$text['description-call_direction']['fr-ca'] = "";
$text['description-call_direction']['fr-fr'] = "";
$text['description-call_direction']['he-il'] = "";
$text['description-call_direction']['it-it'] = "";
$text['description-call_direction']['en-us'] = "Call recording call direction";
$text['description-call_direction']['en-gb'] = "Call recording call direction";
$text['description-call_direction']['ar-eg'] = "تسجيل المكالمات اتجاه المكالمة";
$text['description-call_direction']['de-at'] = "Anrufaufzeichnung, Anrufrichtung";
$text['description-call_direction']['de-ch'] = "Anrufaufzeichnung, Anrufrichtung";
$text['description-call_direction']['de-de'] = "Anrufaufzeichnung, Anrufrichtung";
$text['description-call_direction']['el-gr'] = "Κατεύθυνση κλήσης καταγραφής κλήσης";
$text['description-call_direction']['es-cl'] = "Dirección de llamada de grabación de llamadas.";
$text['description-call_direction']['es-mx'] = "Dirección de llamada de grabación de llamadas.";
$text['description-call_direction']['fr-ca'] = "Direction d'appel d'enregistrement d'appel";
$text['description-call_direction']['fr-fr'] = "Direction d'appel d'enregistrement d'appel";
$text['description-call_direction']['he-il'] = "הקלטת שיחה כיוון שיחה";
$text['description-call_direction']['it-it'] = "Direzione della chiamata per la registrazione delle chiamate";
$text['description-call_direction']['ka-ge'] = "ზარების ჩაწერა. ზარის მიმართულება";
$text['description-call_direction']['nl-nl'] = "Gespreksopname oproeprichting";
$text['description-call_direction']['pl-pl'] = "";
$text['description-call_direction']['pt-br'] = "";
$text['description-call_direction']['pt-pt'] = "";
$text['description-call_direction']['ro-ro'] = "";
$text['description-call_direction']['ru-ru'] = "";
$text['description-call_direction']['sv-se'] = "";
$text['description-call_direction']['uk-ua'] = "";
$text['description-call_direction']['pl-pl'] = "Nagrywanie połączeń Kierunek połączenia";
$text['description-call_direction']['pt-br'] = "Direção de chamada de gravação de chamada";
$text['description-call_direction']['pt-pt'] = "Direção de chamada de gravação de chamada";
$text['description-call_direction']['ro-ro'] = "Înregistrarea apelului direcția apelului";
$text['description-call_direction']['ru-ru'] = "Запись звонков, направление звонка";
$text['description-call_direction']['sv-se'] = "Samtalsinspelning samtalsriktning";
$text['description-call_direction']['uk-ua'] = "Напрямок виклику запису дзвінка";
$text['description-call_direction']['zh-cn'] = "通话录音 通话方向";
$text['description-call_direction']['ja-jp'] = "通話録音の通話方向";
$text['description-call_direction']['ko-kr'] = "통화 녹음 통화 방향";
$text['label-call_recording_description']['en-us'] = "Description";
$text['label-call_recording_description']['en-gb'] = "Description";
$text['label-call_recording_description']['ar-eg'] = "";
$text['label-call_recording_description']['de-at'] = "";
$text['label-call_recording_description']['de-ch'] = "";
$text['label-call_recording_description']['de-de'] = "";
$text['label-call_recording_description']['es-cl'] = "";
$text['label-call_recording_description']['es-mx'] = "";
$text['label-call_recording_description']['ar-eg'] = "وصف";
$text['label-call_recording_description']['de-at'] = "Beschreibung";
$text['label-call_recording_description']['de-ch'] = "Beschreibung";
$text['label-call_recording_description']['de-de'] = "Beschreibung";
$text['label-call_recording_description']['el-gr'] = "Περιγραφή";
$text['label-call_recording_description']['es-cl'] = "Descripción";
$text['label-call_recording_description']['es-mx'] = "Descripción";
$text['label-call_recording_description']['fr-ca'] = "Description";
$text['label-call_recording_description']['fr-fr'] = "Description";
$text['label-call_recording_description']['he-il'] = "";
$text['label-call_recording_description']['it-it'] = "";
$text['label-call_recording_description']['he-il'] = "תיאור";
$text['label-call_recording_description']['it-it'] = "Descrizione";
$text['label-call_recording_description']['ka-ge'] = "აღწერა";
$text['label-call_recording_description']['nl-nl'] = "Omschrijving";
$text['label-call_recording_description']['pl-pl'] = "Opis";
$text['label-call_recording_description']['pt-br'] = "";
$text['label-call_recording_description']['pt-pt'] = "";
$text['label-call_recording_description']['ro-ro'] = "";
$text['label-call_recording_description']['pt-br'] = "Descrição";
$text['label-call_recording_description']['pt-pt'] = "Descrição";
$text['label-call_recording_description']['ro-ro'] = "Descriere";
$text['label-call_recording_description']['ru-ru'] = "Описание";
$text['label-call_recording_description']['sv-se'] = "";
$text['label-call_recording_description']['uk-ua'] = "";
$text['label-call_recording_description']['sv-se'] = "Beskrivning";
$text['label-call_recording_description']['uk-ua'] = "опис";
$text['label-call_recording_description']['zh-cn'] = "描述";
$text['label-call_recording_description']['ja-jp'] = "説明";
$text['label-call_recording_description']['ko-kr'] = "설명";
$text['description-call_recording_description']['en-us'] = "";
$text['description-call_recording_description']['en-gb'] = "";
$text['description-call_recording_description']['ar-eg'] = "";
$text['description-call_recording_description']['de-at'] = "";
$text['description-call_recording_description']['de-ch'] = "";
$text['description-call_recording_description']['de-de'] = "";
$text['description-call_recording_description']['es-cl'] = "";
$text['description-call_recording_description']['es-mx'] = "";
$text['description-call_recording_description']['fr-ca'] = "";
$text['description-call_recording_description']['fr-fr'] = "";
$text['description-call_recording_description']['he-il'] = "";
$text['description-call_recording_description']['it-it'] = "";
$text['description-call_recording_description']['en-us'] = "Call recording direction";
$text['description-call_recording_description']['en-gb'] = "Call recording direction";
$text['description-call_recording_description']['ar-eg'] = "اتجاه تسجيل المكالمات";
$text['description-call_recording_description']['de-at'] = "Richtung der Anrufaufzeichnung";
$text['description-call_recording_description']['de-ch'] = "Richtung der Anrufaufzeichnung";
$text['description-call_recording_description']['de-de'] = "Richtung der Anrufaufzeichnung";
$text['description-call_recording_description']['el-gr'] = "Κατεύθυνση εγγραφής κλήσης";
$text['description-call_recording_description']['es-cl'] = "Dirección de grabación de llamadas";
$text['description-call_recording_description']['es-mx'] = "Dirección de grabación de llamadas";
$text['description-call_recording_description']['fr-ca'] = "Direction d'enregistrement des appels";
$text['description-call_recording_description']['fr-fr'] = "Direction d'enregistrement des appels";
$text['description-call_recording_description']['he-il'] = "כיוון הקלטת שיחות";
$text['description-call_recording_description']['it-it'] = "Direzione di registrazione della chiamata";
$text['description-call_recording_description']['ka-ge'] = "ზარის ჩანაწერების მიმართულება";
$text['description-call_recording_description']['nl-nl'] = "Gespreksopname richting";
$text['description-call_recording_description']['pl-pl'] = "";
$text['description-call_recording_description']['pt-br'] = "";
$text['description-call_recording_description']['pt-pt'] = "";
$text['description-call_recording_description']['ro-ro'] = "";
$text['description-call_recording_description']['ru-ru'] = "";
$text['description-call_recording_description']['sv-se'] = "";
$text['description-call_recording_description']['uk-ua'] = "";
$text['description-call_recording_description']['pl-pl'] = "Kierunek nagrywania połączeń";
$text['description-call_recording_description']['pt-br'] = "Direção de gravação de chamadas";
$text['description-call_recording_description']['pt-pt'] = "Direção de gravação de chamadas";
$text['description-call_recording_description']['ro-ro'] = "Direcția de înregistrare a apelurilor";
$text['description-call_recording_description']['ru-ru'] = "Направление записи звонков";
$text['description-call_recording_description']['sv-se'] = "Riktning för samtalsinspelning";
$text['description-call_recording_description']['uk-ua'] = "Напрямок запису дзвінка";
$text['description-call_recording_description']['zh-cn'] = "通话录音方向";
$text['description-call_recording_description']['ja-jp'] = "通話録音の方向";
$text['description-call_recording_description']['ko-kr'] = "통화 녹음 방향";
$text['label-call_recording_base64']['en-us'] = "Base64";
$text['label-call_recording_base64']['en-gb'] = "Base64";
$text['label-call_recording_base64']['ar-eg'] = "";
$text['label-call_recording_base64']['de-at'] = "";
$text['label-call_recording_base64']['de-ch'] = "";
$text['label-call_recording_base64']['de-de'] = "";
$text['label-call_recording_base64']['es-cl'] = "";
$text['label-call_recording_base64']['es-mx'] = "";
$text['label-call_recording_base64']['ar-eg'] = "قاعدة64";
$text['label-call_recording_base64']['de-at'] = "Base64";
$text['label-call_recording_base64']['de-ch'] = "Base64";
$text['label-call_recording_base64']['de-de'] = "Base64";
$text['label-call_recording_base64']['el-gr'] = "Βάση64";
$text['label-call_recording_base64']['es-cl'] = "Base64";
$text['label-call_recording_base64']['es-mx'] = "Base64";
$text['label-call_recording_base64']['fr-ca'] = "Base64";
$text['label-call_recording_base64']['fr-fr'] = "Base64";
$text['label-call_recording_base64']['he-il'] = "";
$text['label-call_recording_base64']['it-it'] = "";
$text['label-call_recording_base64']['he-il'] = "64בסיס";
$text['label-call_recording_base64']['it-it'] = "Base64";
$text['label-call_recording_base64']['ka-ge'] = "Base64";
$text['label-call_recording_base64']['nl-nl'] = "Base64";
$text['label-call_recording_base64']['pl-pl'] = "Base64";
$text['label-call_recording_base64']['pt-br'] = "";
$text['label-call_recording_base64']['pt-pt'] = "";
$text['label-call_recording_base64']['ro-ro'] = "";
$text['label-call_recording_base64']['ru-ru'] = "";
$text['label-call_recording_base64']['sv-se'] = "";
$text['label-call_recording_base64']['uk-ua'] = "";
$text['label-call_recording_base64']['pt-br'] = "Base64";
$text['label-call_recording_base64']['pt-pt'] = "Base64";
$text['label-call_recording_base64']['ro-ro'] = "Base64";
$text['label-call_recording_base64']['ru-ru'] = "Base64";
$text['label-call_recording_base64']['sv-se'] = "Base64";
$text['label-call_recording_base64']['uk-ua'] = "Base64";
$text['label-call_recording_base64']['zh-cn'] = "基地64";
$text['label-call_recording_base64']['ja-jp'] = "ベース64";
$text['label-call_recording_base64']['ko-kr'] = "베이스64";
$text['description-call_recording_base64']['en-us'] = "";
$text['description-call_recording_base64']['en-gb'] = "";
$text['description-call_recording_base64']['ar-eg'] = "";
$text['description-call_recording_base64']['de-at'] = "";
$text['description-call_recording_base64']['de-ch'] = "";
$text['description-call_recording_base64']['de-de'] = "";
$text['description-call_recording_base64']['es-cl'] = "";
$text['description-call_recording_base64']['es-mx'] = "";
$text['description-call_recording_base64']['fr-ca'] = "";
$text['description-call_recording_base64']['fr-fr'] = "";
$text['description-call_recording_base64']['he-il'] = "";
$text['description-call_recording_base64']['it-it'] = "";
$text['description-call_recording_base64']['nl-nl'] = "Base64";
$text['description-call_recording_base64']['pl-pl'] = "";
$text['description-call_recording_base64']['pt-br'] = "";
$text['description-call_recording_base64']['pt-pt'] = "";
$text['description-call_recording_base64']['ro-ro'] = "";
$text['description-call_recording_base64']['ru-ru'] = "";
$text['description-call_recording_base64']['sv-se'] = "";
$text['description-call_recording_base64']['uk-ua'] = "";
$text['description-call_recording_base64']['en-us'] = "Base64";
$text['description-call_recording_base64']['en-gb'] = "Base64";
$text['description-call_recording_base64']['ar-eg'] = "قاعدة64";
$text['description-call_recording_base64']['de-at'] = "Base64";
$text['description-call_recording_base64']['de-ch'] = "Base64";
$text['description-call_recording_base64']['de-de'] = "Base64";
$text['description-call_recording_base64']['el-gr'] = "Βάση64";
$text['description-call_recording_base64']['es-cl'] = "Base64";
$text['description-call_recording_base64']['es-mx'] = "Base64";
$text['description-call_recording_base64']['fr-ca'] = "Base64";
$text['description-call_recording_base64']['fr-fr'] = "Base64";
$text['description-call_recording_base64']['he-il'] = "בסיס 64";
$text['description-call_recording_base64']['it-it'] = "Base64";
$text['description-call_recording_base64']['ka-ge'] = "Base64";
$text['description-call_recording_base64']['nl-nl'] = "Baseren64";
$text['description-call_recording_base64']['pl-pl'] = "Baza64";
$text['description-call_recording_base64']['pt-br'] = "Base64";
$text['description-call_recording_base64']['pt-pt'] = "Base64";
$text['description-call_recording_base64']['ro-ro'] = "Baza64";
$text['description-call_recording_base64']['ru-ru'] = "База64";
$text['description-call_recording_base64']['sv-se'] = "Bas64";
$text['description-call_recording_base64']['uk-ua'] = "База64";
$text['description-call_recording_base64']['zh-cn'] = "基地64";
$text['description-call_recording_base64']['ja-jp'] = "ベース64";
$text['description-call_recording_base64']['ko-kr'] = "베이스64";
$text['label-inbound']['en-us'] = "Inbound";
$text['label-inbound']['en-gb'] = "Inbound";
$text['label-inbound']['ar-eg'] = "Inbound";
$text['label-inbound']['de-at'] = "Inbound";
$text['label-inbound']['de-ch'] = "Inbound";
$text['label-inbound']['de-de'] = "Inbound";
$text['label-inbound']['es-cl'] = "Inbound";
$text['label-inbound']['es-mx'] = "Inbound";
$text['label-inbound']['fr-ca'] = "Inbound";
$text['label-inbound']['fr-fr'] = "Inbound";
$text['label-inbound']['he-il'] = "Inbound";
$text['label-inbound']['it-it'] = "Inbound";
$text['label-inbound']['ar-eg'] = "واردة";
$text['label-inbound']['de-at'] = "Eingehende";
$text['label-inbound']['de-ch'] = "Eingehende";
$text['label-inbound']['de-de'] = "Eingehende";
$text['label-inbound']['el-gr'] = "Εισερχόμενος";
$text['label-inbound']['es-cl'] = "Entrante";
$text['label-inbound']['es-mx'] = "Entrante";
$text['label-inbound']['fr-ca'] = "Entrant";
$text['label-inbound']['fr-fr'] = "Entrant";
$text['label-inbound']['he-il'] = "נכנסת";
$text['label-inbound']['it-it'] = "In entrata";
$text['label-inbound']['ka-ge'] = "შემომავალი";
$text['label-inbound']['nl-nl'] = "Inkomend";
$text['label-inbound']['pl-pl'] = "Przychodzący";
$text['label-inbound']['pt-br'] = "Inbound";
$text['label-inbound']['pt-pt'] = "Inbound";
$text['label-inbound']['ro-ro'] = "Inbound";
$text['label-inbound']['ru-ru'] = "Inbound";
$text['label-inbound']['sv-se'] = "Inbound";
$text['label-inbound']['uk-ua'] = "Inbound";
$text['label-inbound']['pt-br'] = "Entrada";
$text['label-inbound']['pt-pt'] = "Entrada";
$text['label-inbound']['ro-ro'] = "Intrare";
$text['label-inbound']['ru-ru'] = "Входящий";
$text['label-inbound']['sv-se'] = "Inkommande";
$text['label-inbound']['uk-ua'] = "Вхідний";
$text['label-inbound']['zh-cn'] = "入境";
$text['label-inbound']['ja-jp'] = "インバウンド";
$text['label-inbound']['ko-kr'] = "인바운드";
$text['label-outbound']['en-us'] = "Outbound";
$text['label-outbound']['en-gb'] = "Outbound";
$text['label-outbound']['ar-eg'] = "Outbound";
$text['label-outbound']['de-at'] = "Outbound";
$text['label-outbound']['de-ch'] = "Outbound";
$text['label-outbound']['de-de'] = "Outbound";
$text['label-outbound']['es-cl'] = "Outbound";
$text['label-outbound']['es-mx'] = "Outbound";
$text['label-outbound']['fr-ca'] = "Outbound";
$text['label-outbound']['fr-fr'] = "Outbound";
$text['label-outbound']['he-il'] = "Outbound";
$text['label-outbound']['it-it'] = "Outbound";
$text['label-outbound']['ar-eg'] = "الصادرة";
$text['label-outbound']['de-at'] = "Ausgehend";
$text['label-outbound']['de-ch'] = "Ausgehend";
$text['label-outbound']['de-de'] = "Ausgehend";
$text['label-outbound']['el-gr'] = "Εξερχόμενος";
$text['label-outbound']['es-cl'] = "Saliente";
$text['label-outbound']['es-mx'] = "Saliente";
$text['label-outbound']['fr-ca'] = "Sortant";
$text['label-outbound']['fr-fr'] = "Sortant";
$text['label-outbound']['he-il'] = "יוצא";
$text['label-outbound']['it-it'] = "In uscita";
$text['label-outbound']['ka-ge'] = "გამავალი";
$text['label-outbound']['nl-nl'] = "Uitgaand";
$text['label-outbound']['pl-pl'] = "Wychodzący";
$text['label-outbound']['pt-br'] = "Outbound";
$text['label-outbound']['pt-pt'] = "Outbound";
$text['label-outbound']['pt-br'] = "Saída";
$text['label-outbound']['pt-pt'] = "Saída";
$text['label-outbound']['ro-ro'] = "Outbound";
$text['label-outbound']['ru-ru'] = "Outbound";
$text['label-outbound']['sv-se'] = "Outbound";
$text['label-outbound']['uk-ua'] = "Outbound";
$text['label-outbound']['ru-ru'] = "Исходящий";
$text['label-outbound']['sv-se'] = "Utgående";
$text['label-outbound']['uk-ua'] = "Вихідний";
$text['label-outbound']['zh-cn'] = "出站";
$text['label-outbound']['ja-jp'] = "アウトバウンド";
$text['label-outbound']['ko-kr'] = "배 밖으로";
$text['label-local']['en-us'] = "Local";
$text['label-local']['en-gb'] = "Local";
$text['label-local']['ar-eg'] = "Local";
$text['label-local']['de-at'] = "Local";
$text['label-local']['de-ch'] = "Local";
$text['label-local']['de-de'] = "Local";
$text['label-local']['ar-eg'] = "محلي";
$text['label-local']['de-at'] = "Lokal";
$text['label-local']['de-ch'] = "Lokal";
$text['label-local']['de-de'] = "Lokal";
$text['label-local']['el-gr'] = "Τοπικός";
$text['label-local']['es-cl'] = "Local";
$text['label-local']['es-mx'] = "Local";
$text['label-local']['fr-ca'] = "Local";
$text['label-local']['fr-fr'] = "Local";
$text['label-local']['he-il'] = "Local";
$text['label-local']['it-it'] = "Local";
$text['label-local']['he-il'] = "מְקוֹמִי";
$text['label-local']['it-it'] = "Locale";
$text['label-local']['ka-ge'] = "ლოკალური";
$text['label-local']['nl-nl'] = "Lokaal";
$text['label-local']['pl-pl'] = "Lokalny";
$text['label-local']['pt-br'] = "Local";
$text['label-local']['pt-pt'] = "Local";
$text['label-local']['ro-ro'] = "Local";
$text['label-local']['ru-ru'] = "Local";
$text['label-local']['sv-se'] = "Local";
$text['label-local']['uk-ua'] = "Local";
$text['label-local']['ru-ru'] = "Местный";
$text['label-local']['sv-se'] = "Lokal";
$text['label-local']['uk-ua'] = "Місцевий";
$text['label-local']['zh-cn'] = "当地的";
$text['label-local']['ja-jp'] = "地元";
$text['label-local']['ko-kr'] = "현지의";
?>

Some files were not shown because too many files have changed in this diff Show More