diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/__init__.py b/api/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/base_api.py b/api/base_api.py
new file mode 100644
index 0000000..5c6c621
--- /dev/null
+++ b/api/base_api.py
@@ -0,0 +1,78 @@
+import os
+import time
+
+import requests
+
+
+class BaseAPI:
+ CONNECTION_TEST_INTERVAL = 10
+ CONNECTION_TEST_ATTEMPTS = 10
+
+ def __init__(self, app_domain, **kwargs):
+ self.app_domain = app_domain
+ self.token = None
+ self.api_tenant_login_url = f"https://tenant-login-api.{self.app_domain}"
+ self.url = None
+ self.params = {**kwargs}
+
+ def __get_connection_test_url(self):
+ return f"{self.url}/check_connection"
+
+ def wait_for_start(self, url=None):
+ i = 0
+ if not url:
+ url = self.__get_connection_test_url()
+ for i in range(self.CONNECTION_TEST_ATTEMPTS):
+ try:
+ self._get(url)
+ except Exception:
+ time.sleep(self.CONNECTION_TEST_INTERVAL)
+ continue
+ break
+ if i == self.CONNECTION_TEST_ATTEMPTS - 1:
+ raise Exception(f"Connection to {url} failed.")
+
+ def _headers(self, content_type='application/json'):
+ headers = {'Content-Type': content_type}
+ if self.token:
+ headers['Authorization'] = self.token
+ return headers
+
+ def _get(self, endpoint):
+ try:
+ response = requests.get(endpoint, headers=self._headers())
+ response.raise_for_status()
+ return response.json()
+ except requests.exceptions.HTTPError as e:
+ raise requests.exceptions.HTTPError(e.response.text)
+
+ def _post(self, endpoint, payload):
+ try:
+ response = requests.post(endpoint, json=payload, headers=self._headers())
+ response.raise_for_status()
+ return response.json()
+ except requests.exceptions.HTTPError as e:
+ raise requests.exceptions.HTTPError(e.response.text)
+
+ def _put(self, endpoint, payload):
+ try:
+ response = requests.put(endpoint, json=payload, headers=self._headers())
+ response.raise_for_status()
+ return response.json()
+ except requests.exceptions.HTTPError as e:
+ raise requests.exceptions.HTTPError(e.response.text)
+
+ def _delete(self, endpoint):
+ response = requests.delete(endpoint, headers=self._headers())
+ response.raise_for_status()
+ return response.status_code
+
+ def _upload_file(self, endpoint, file_path, params=None):
+ try:
+ with open(file_path, 'rb') as file:
+ files = {'file': (os.path.basename(file_path), file, 'application/octet-stream')}
+ response = requests.post(endpoint, files=files, data=params, headers=self._headers(content_type=None))
+ response.raise_for_status()
+ return response.json()
+ except requests.exceptions.HTTPError as e:
+ raise requests.exceptions.HTTPError(e.response.text)
diff --git a/api/operator_api.py b/api/operator_api.py
new file mode 100644
index 0000000..a2fa089
--- /dev/null
+++ b/api/operator_api.py
@@ -0,0 +1,115 @@
+import base64
+import hashlib
+import json
+
+from .base_api import BaseAPI
+
+
+class OperatorAPI(BaseAPI):
+ def login(self, operator_user, operator_password):
+ endpoint = f"{self.api_tenant_login_url}/operator/login"
+ nonce = self._post(endpoint, {
+ "login": operator_user
+ }).get('nonce')
+
+ # get token
+ salted_password = str(hashlib.sha256(hashlib.sha256(operator_password.encode()).hexdigest().encode() + nonce.encode()).hexdigest())
+
+ self.token = self._post(endpoint, {
+ "login": operator_user,
+ "password": salted_password
+ }).get('token')
+
+ aa = base64.b64decode(self.token.split(".")[1] + "===")
+ decoded_token = json.loads(aa.decode("utf-8"))
+ self.url = decoded_token["url"]["api"]
+
+ def login_as_user(self, tenant_id, tenant_user_id):
+ endpoint = f"{self.api_tenant_login_url}/operator/tenant/{tenant_id}/user/{tenant_user_id}/login"
+ return self._get(endpoint)
+
+ def create_user(self, tenant_id, params):
+ endpoint = f"{self.url}/tenant/{tenant_id}/user"
+ return self._post(endpoint, params).get('data')
+
+ def get_user(self, tenant_id, tenant_user_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/user/{tenant_user_id}"
+ return self._get(endpoint).get('data')
+
+ def get_users(self, tenant_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/user"
+ return self._get(endpoint).get('data')
+
+ def get_license_packages(self, tenant_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/operator_license_package"
+ return self._get(endpoint).get('data')
+
+ def get_package_agreements(self, tenant_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/tenant_package_agreement"
+ return self._get(endpoint).get('data')
+
+ def create_package_activation_request(self, tenant_id, params):
+ endpoint = f"{self.url}/tenant/{tenant_id}/package_activation_request"
+ return self._post(endpoint, params).get('data')
+
+ def create_tenant(self, params):
+ endpoint = f"{self.url}/tenant"
+ return self._post(endpoint, params).get('data')[0]
+
+ def get_tenants(self):
+ endpoint = f"{self.url}/tenant"
+ return self._get(endpoint).get('data')
+
+ def get_ddi(self, tenant_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/ddi"
+ return self._get(endpoint).get('data')
+
+ def create_ddi(self, tenant_id, params):
+ endpoint = f"{self.url}/tenant/{tenant_id}/ddi"
+ return self._post(endpoint, params).get('data')[0]
+
+ def get_tenant_telco_networks(self, tenant_id):
+ endpoint = f"{self.url}/tenant/{tenant_id}/telco_network"
+ return self._get(endpoint).get('data')
+
+ def create_tenant_telco_network(self, tenant_id, params):
+ endpoint = f"{self.url}/tenant/{tenant_id}/telco_network"
+ return self._post(endpoint, params).get('data')
+
+ def get_operator_routing(self):
+ endpoint = f"{self.url}/operator_routing"
+ return self._get(endpoint).get('data')
+
+ def create_operator_routing(self, params):
+ endpoint = f"{self.url}/operator_routing"
+ return self._post(endpoint, params).get('data')
+
+ def create_operator_gateway(self, params):
+ endpoint = f"{self.url}/operator_gateway"
+ return self._post(endpoint, params).get('data')
+
+ def get_operator_gateways(self):
+ endpoint = f"{self.url}/operator_gateway"
+ return self._get(endpoint).get('data')
+
+ def create_operator_gateway_normalization(self, operator_gateway_id, params):
+ endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization"
+ return self._post(endpoint, params).get('data')
+
+ def get_operator_gateway_normalization(self, operator_gateway_id):
+ endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization"
+ return self._get(endpoint).get('data')
+
+ def delete_operator_gateway_normalization(self, operator_gateway_id, normalization_id):
+ endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization/{normalization_id}"
+ return self._delete(endpoint)
+
+ def get_speech_integrations(self):
+ endpoint = f"{self.url}/text_to_speech/integration"
+ return self._get(endpoint).get('data')
+
+ def add_speech_integration(self, params):
+ endpoint = f"{self.url}/tenant/speech/integration"
+ return self._post(endpoint, params).get('data')
+
+
diff --git a/api/tenant_api.py b/api/tenant_api.py
new file mode 100644
index 0000000..5b8e61a
--- /dev/null
+++ b/api/tenant_api.py
@@ -0,0 +1,148 @@
+from .base_api import BaseAPI
+
+
+class TenantAPI(BaseAPI):
+
+ def initialize_user_login(self, params):
+ self.token = params.get('token')
+ self.url = params.get('urls').get('api')
+ self.file_server_url = params.get('urls').get('fileserver')
+
+ # USER
+
+ def update_feature_tenant_user_call(self, tenant_user_id, params):
+ endpoint = f"{self.url}/user/{tenant_user_id}/feature/call"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_tenant_user_consultant(self, tenant_user_id, params):
+ endpoint = f"{self.url}/user/{tenant_user_id}/feature/consultant"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_tenant_user_recording(self, tenant_user_id, params):
+ endpoint = f"{self.url}/user/{tenant_user_id}/feature/recording"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_tenant_user_hotdesk(self, tenant_user_id, params):
+ endpoint = f"{self.url}/user/{tenant_user_id}/feature/hotdesk"
+ return self._put(endpoint, params).get('data')
+
+ def create_web_link(self, params):
+ endpoint = f"{self.url}/weblink"
+ return self._post(endpoint, params).get('data')
+
+ # PROJECT
+
+ def create_project(self, params):
+ endpoint = f"{self.url}/project"
+ return self._post(endpoint, params).get('data')
+
+ def get_projects(self):
+ endpoint = f"{self.url}/project"
+ return self._get(endpoint).get('data')
+
+ def update_project(self, project_id, params):
+ endpoint = f"{self.url}/project/{project_id}"
+ return self._put(endpoint, params).get('data')
+
+ def add_user_to_project(self, project_id, params):
+ endpoint = f"{self.url}/project/{project_id}/user"
+ return self._post(endpoint, params).get('data')
+
+ def update_feature_project_recording(self, project_id, params):
+ endpoint = f"{self.url}/project/{project_id}/feature/recording"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_project_aaa(self, project_id, params):
+ endpoint = f"{self.url}/project/{project_id}/feature/aaa"
+ return self._put(endpoint, params).get('data')
+
+ def add_target_to_project(self, project_id, params):
+ endpoint = f"{self.url}/project/{project_id}/target"
+ return self._post(endpoint, params).get('data')
+
+ def add_target_to_user(self, tenant_user_id, params):
+ endpoint = f"{self.url}/user/{tenant_user_id}/target"
+ return self._post(endpoint, params).get('data')
+
+ # FILES
+ def get_announcements(self):
+ endpoint = f"{self.file_server_url}/announcement"
+ return self._get(endpoint).get('data')
+
+ def add_announcement(self, file_path, params):
+ endpoint = f"{self.file_server_url}/announcement"
+ return self._upload_file(endpoint, file_path, params=params).get('data')
+
+ # IVR
+
+ def get_ivrs(self):
+ endpoint = f"{self.url}/ivr"
+ return self._get(endpoint).get('data')
+
+ def create_ivr(self, params):
+ endpoint = f"{self.url}/ivr"
+ return self._post(endpoint, params).get('data')
+
+ def update_ivr(self, ivr_id, params):
+ endpoint = f"{self.url}/ivr/{ivr_id}"
+ return self._put(endpoint, params).get('data')
+
+ def add_target_to_ivr(self, ivr_id, params):
+ endpoint = f"{self.url}/ivr/{ivr_id}/target"
+ return self._post(endpoint, params).get('data')
+
+ # IWRS
+
+ def get_iwrss(self):
+ endpoint = f"{self.url}/iwrs"
+ return self._get(endpoint).get('data')
+
+ def create_iwrs(self, params):
+ endpoint = f"{self.url}/iwrs"
+ return self._post(endpoint, params).get('data')
+
+ def update_iwrs(self, iwrs_id, params):
+ endpoint = f"{self.url}/iwrs/{iwrs_id}"
+ return self._put(endpoint, params).get('data')
+
+ # TENANT
+
+ def update_feature_tenant_api(self, params):
+ endpoint = f"{self.url}/tenant/feature/api"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_tenant_crm(self, params):
+ endpoint = f"{self.url}/tenant/feature/crm"
+ return self._put(endpoint, params).get('data')
+
+ def update_feature_tenant_ticketing(self, params):
+ endpoint = f"{self.url}/tenant/feature/ticketing"
+ return self._put(endpoint, params).get('data')
+
+ def get_bss_apis(self):
+ endpoint = f"{self.url}/tenant/bss_api"
+ return self._get(endpoint).get('data')
+
+ def get_tenant_applications(self):
+ endpoint = f"{self.url}/tenant/application"
+ return self._get(endpoint).get('data')
+
+ def create_tenant_application(self, params):
+ endpoint = f"{self.url}/tenant/application"
+ return self._post(endpoint, params).get('data')
+
+ def get_plugin_templates(self):
+ endpoint = f"{self.url}/tenant/plugin/template"
+ return self._get(endpoint).get('data')
+
+ def create_plugin_template(self, params):
+ endpoint = f"{self.url}/tenant/plugin/template"
+ return self._post(endpoint, params).get('data')
+
+ def get_plugin_url_configurations(self):
+ endpoint = f"{self.url}/tenant/plugin/url_configuration"
+ return self._get(endpoint).get('data')
+
+ def create_plugin_url_configuration(self, params):
+ endpoint = f"{self.url}/tenant/plugin/url_configuration"
+ return self._post(endpoint, params).get('data')
\ No newline at end of file
diff --git a/file_generator/__init__.py b/file_generator/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/file_generator/generate_bind9.py b/file_generator/generate_bind9.py
new file mode 100644
index 0000000..e46ecbe
--- /dev/null
+++ b/file_generator/generate_bind9.py
@@ -0,0 +1,124 @@
+import os
+import shutil
+from datetime import datetime
+
+from conpeek_setup import util
+from jinja2 import Template
+
+
+def get_serial():
+ current_date = datetime.now()
+ bind_serial_number = int(current_date.timestamp())
+ return bind_serial_number
+
+
+def prepare_access_zone_config(external_ip, app_installation_domain, output_directory, template_file_dir, script_dir, internal_ip, developer_mode, kamailio_nat):
+ util.print_black_light(f"Preparing access zone (External IP:{external_ip}) (Core IP: {internal_ip})")
+ template_file_path = os.path.join(script_dir, template_file_dir)
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "app_installation_domain": app_installation_domain,
+ "access_ip": external_ip,
+ "serial_number": get_serial(),
+ "core_ip": internal_ip,
+ "developer_mode": developer_mode,
+ "kamailio_nat": kamailio_nat == '1'
+ }
+
+ output_text = template.render(data)
+ output_file = output_directory + "/db." + app_installation_domain
+ output_file_path = os.path.join(script_dir, output_file)
+
+ with open(output_file_path, "w") as file:
+ file.write(output_text + "\n")
+
+
+def prepare_system_zone_config(core_ip, output_directory, template_file_dir, script_dir, system_app_installation_domain):
+ util.print_black_light(f"Preparing system zone (Core IP:{core_ip})")
+ template_file_path = os.path.join(script_dir, template_file_dir)
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "system_app_installation_domain": system_app_installation_domain,
+ "core_ip": core_ip,
+ "serial_number": get_serial()
+ }
+
+ output_text = template.render(data)
+ output_file = output_directory + "/db." + system_app_installation_domain
+ output_file_path = os.path.join(script_dir, output_file)
+
+ with open(output_file_path, "w") as file:
+ file.write(output_text + "\n")
+
+
+def create_config(data, template_path, output_path, script_dir):
+ template_file_path = os.path.join(script_dir, template_path)
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ output_text = template.render(data)
+
+ output_file_path = os.path.join(script_dir, output_path)
+
+ with open(output_file_path, "w") as file:
+ file.write(output_text + "\n")
+
+
+def run(config, developer_mode=False):
+ util.print_black_light("Preparing bind configs")
+
+ internal_ip = config["new_machine_network"]["internal_ip"]
+ external_ip = config["new_machine_network"]["external_ip"]
+ app_installation_domain = config["new_machine_network"]["app_installation_domain"]
+ system_app_installation_domain = config["new_machine_network"]["system_app_installation_domain"]
+
+ var_bind_directory = os.path.join(util.get_output_path(), "var", "cache", "bind")
+ shutil.rmtree(var_bind_directory, ignore_errors=True)
+ os.makedirs(var_bind_directory, exist_ok=True)
+
+ etc_bind_directory = os.path.join(util.get_output_path(), "etc", "bind")
+ shutil.rmtree(etc_bind_directory, ignore_errors=True)
+ os.makedirs(etc_bind_directory, exist_ok=True)
+
+ template_directory = os.path.join(util.get_templates_path(), "bind9")
+
+ kamailio_nat = '1'
+ if config.has_option('kamailio', 'nat'):
+ kamailio_nat = config["kamailio"]["nat"]
+
+ # /var/cache configs
+ prepare_access_zone_config(external_ip, app_installation_domain, var_bind_directory, "access_zone.tmpl", template_directory, internal_ip, developer_mode, kamailio_nat)
+ prepare_system_zone_config(internal_ip, var_bind_directory, "system_zone.tmpl", template_directory, system_app_installation_domain)
+
+ forwarders = config["bind9"]["forwarders"]
+ if not forwarders:
+ forwarders = "1.1.1.1;"
+
+ if ";" not in forwarders:
+ util.print_yellow("; not in bind9 forwarders... dynamically add to end")
+ forwarders += ";"
+
+ # /etc/configs
+ data = {"forward_dns": forwarders}
+ create_config(data, "named.conf.options.tmpl", os.path.join(etc_bind_directory, "named.conf.options"), template_directory)
+ data = {"NETWORK_DOMAIN": app_installation_domain}
+ create_config(data, "named.conf.access_network.tmpl", os.path.join(etc_bind_directory, "named.conf.access_network"), template_directory)
+ data = {"NETWORK_DOMAIN": system_app_installation_domain}
+ create_config(data, "named.conf.system_network.tmpl", os.path.join(etc_bind_directory, "named.conf.system_network"), template_directory)
+
+ files_to_copy = [
+ "named.conf"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_directory, file), etc_bind_directory)
diff --git a/file_generator/generate_cert.py b/file_generator/generate_cert.py
new file mode 100644
index 0000000..8476a56
--- /dev/null
+++ b/file_generator/generate_cert.py
@@ -0,0 +1,13 @@
+import os
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing certificates directories")
+
+ certs_directory = os.path.join(util.get_output_path(), "etc/ssl/certs")
+ private_directory = os.path.join(util.get_output_path(), "etc/ssl/private")
+
+ os.makedirs(certs_directory, exist_ok=True)
+ os.makedirs(private_directory, exist_ok=True)
diff --git a/file_generator/generate_env.py b/file_generator/generate_env.py
new file mode 100644
index 0000000..d4d48b5
--- /dev/null
+++ b/file_generator/generate_env.py
@@ -0,0 +1,64 @@
+import os
+import shutil
+
+from jinja2 import Template
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing env file")
+
+ output_directory = os.path.join(util.get_output_path(), "env")
+ template_env_directory = os.path.join(util.get_templates_path(), "env")
+
+ compose_prod = os.path.join(util.get_output_path(), "compose_prod")
+ template_compose_prod = os.path.join(util.get_templates_path(), "compose_prod")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+ os.makedirs(os.path.join(util.get_output_path(), "etc"), exist_ok=True)
+
+ shutil.rmtree(compose_prod, ignore_errors=True)
+ shutil.copytree(template_compose_prod, compose_prod)
+
+ file = open(os.path.join(template_env_directory, "config.env"), 'r')
+ template_content = file.read()
+ template = Template(template_content)
+ tenant_data = util.get_minimal_configuration()
+
+ util.copy_file(os.path.join(template_env_directory, "basic_conpeek.ini"), util.get_output_path())
+
+ kamailio_private_ip = config["new_machine_network"]["internal_ip"]
+ if config.has_option('kamailio', 'private_ip'):
+ kamailio_private_ip = config["kamailio"]["private_ip"]
+
+ kamailio_public_ip = config["new_machine_network"]["external_ip"]
+ if config.has_option('kamailio', 'public_ip'):
+ kamailio_public_ip = config["kamailio"]["public_ip"]
+
+ kamailio_nat = '1'
+ if config.has_option('kamailio', 'nat'):
+ kamailio_nat = config["kamailio"]["nat"]
+
+ data = {
+ "MASTER_PASSWORD": config["machine_secrets"]["master_password"],
+ "DEPLOYMENT_TAG": config["deployment_purpose"]["deployment_tag"],
+ "APP_INSTALLATION_DOMAIN": config["new_machine_network"]["app_installation_domain"],
+ "SYSTEM_APP_INSTALLATION_DOMAIN": config["new_machine_network"]["system_app_installation_domain"],
+ "INTERNAL_IP": config["new_machine_network"]["internal_ip"],
+ "EXTERNAL_IP": config["new_machine_network"]["external_ip"],
+ "REPLICASET": config["new_machine_network"]["cluster_name"],
+ "SYSTEM_TOKEN_SECRETKEY": util.get_token("system_token_secretkey"),
+ "KAMAILIO_PRIVATE_IP": kamailio_private_ip,
+ "KAMAILIO_PUBLIC_IP": kamailio_public_ip,
+ "KAMAILIO_NAT": kamailio_nat
+ }
+
+ data.update(tenant_data)
+
+ output_text = template.render(data)
+ output_file = os.path.join(output_directory, "config.env")
+
+ with open(output_file, "w") as file:
+ file.write(output_text)
diff --git a/file_generator/generate_freeswitch.py b/file_generator/generate_freeswitch.py
new file mode 100644
index 0000000..7a06e50
--- /dev/null
+++ b/file_generator/generate_freeswitch.py
@@ -0,0 +1,83 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def subnet_mask_to_cidr(mask):
+ # Split the subnet mask into its octets
+ octets = mask.split('.')
+ # Convert each octet from string to integer, then to binary, count the '1' bits
+ try:
+ cidr = str(sum(bin(int(octet)).count('1') for octet in octets))
+ except Exception:
+ util.print_red(f"Mask {mask} is invalid")
+ raise Exception("Mask {mask} is invalid")
+
+ return cidr
+
+
+def run(config):
+ util.print_black_light("Preparing freeswitch file")
+
+ output_directory = os.path.join(util.get_output_path(), "freeswitch")
+ template_freeswitch_directory = os.path.join(util.get_templates_path(), "freeswitch/conf")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ util.copy_directory(template_freeswitch_directory, os.path.join(output_directory, "conf"))
+
+ mod_verto_replacements = {
+ 'VERTO_IP': config["new_machine_network"]["internal_ip"],
+ 'EXTERNAL_IP': config["new_machine_network"]["external_ip"],
+ 'EXTERNAL_NET_ADDRESS': config["new_machine_network"]["external_net_address"],
+ 'EXTERNAL_NET_MASK': subnet_mask_to_cidr(config["new_machine_network"]['external_mask']),
+ 'INTERNAL_IP': config["new_machine_network"]["internal_ip"],
+ 'INTERNAL_NET_ADDRESS': config["new_machine_network"]["internal_net_address"],
+ 'INTERNAL_NET_MASK': subnet_mask_to_cidr(config["new_machine_network"]['internal_mask']),
+ }
+
+ for name in mod_verto_replacements.keys():
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/verto.conf.xml"), name, mod_verto_replacements[name])
+
+ tenant_data = util.get_minimal_configuration()
+
+ # mod_event_socket
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/event_socket.conf.xml"), "ES_PORT", "9900")
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/event_socket.conf.xml"), "ES_IP", config["new_machine_network"]["internal_ip"])
+
+ # switch
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "FS_DOMAIN", f"{tenant_data['freeswitch_name']}.{config['new_machine_network']['system_app_installation_domain']}")
+
+ if config.has_option("freeswitch", "rtp_start_port") and config.has_option("freeswitch", "rtp_end_port"):
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_START_PORT", config["freeswitch"]["rtp_start_port"])
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_END_PORT", config["freeswitch"]["rtp_end_port"])
+ else:
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_START_PORT", "16384")
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_END_PORT", "32767")
+
+ # vars.xml
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/vars.xml"), "XML_RPC_PASSWORD", "works")
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/vars.xml"), "DEFAULT_PASSWORD", "Q3G2omiUNgD67fgwP6Xa")
+
+ # dialplan
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/dialplan/virtual_contact.xml"), "GATEWAY_NAME", tenant_data["gateway_server_name"])
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/dialplan/virtual_contact.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip'])
+
+ # sip profiles
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/gateway0.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip'])
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip'])
+
+ is_nat = True
+ if config.has_option('kamailio', 'nat'):
+ is_nat = config["kamailio"]['nat'] == '1'
+
+ if is_nat == '1':
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "LOCAL_NETWORK_ACL", 'nat.auto')
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "EXT_RTP_IP", config["new_machine_network"]['external_ip'])
+ else:
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "LOCAL_NETWORK_ACL", 'localnet.auto')
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "EXT_RTP_IP", config["new_machine_network"]['internal_ip'])
+
+ util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/gw1_internal0.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip'])
diff --git a/file_generator/generate_kamailio.py b/file_generator/generate_kamailio.py
new file mode 100644
index 0000000..02ecccb
--- /dev/null
+++ b/file_generator/generate_kamailio.py
@@ -0,0 +1,39 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing kamailio file")
+
+ output_directory = os.path.join(util.get_output_path(), "kamailio")
+ template_kamailio_directory = os.path.join(util.get_templates_path(), "kamailio")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ tenant_data = util.get_minimal_configuration()
+
+ files_to_copy = [
+ "kamailio.cfg",
+ "kamailio-python.cfg"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_kamailio_directory, file), output_directory)
+
+ kamailio_replacements = {
+ 'MASTER_PASSWORD': config["machine_secrets"]["master_password"],
+ 'KAMAILIO_NAME': tenant_data["kamailio_name"],
+ 'DB_HOST': config["new_machine_network"]["internal_ip"]
+ }
+
+ for name in kamailio_replacements.keys():
+ util.basic_on_location_sed(os.path.join(output_directory, "kamailio-python.cfg"), name, kamailio_replacements[name])
+
+ public_ip = config["new_machine_network"]["external_ip"]
+ if config.has_option('kamailio', 'public_ip'):
+ public_ip = config["kamailio"]["public_ip"]
+
+ util.basic_on_location_sed(os.path.join(output_directory, "kamailio.cfg"), 'KAMAILIO_PUBLIC_IP', public_ip)
diff --git a/file_generator/generate_mail_relay.py b/file_generator/generate_mail_relay.py
new file mode 100644
index 0000000..100a622
--- /dev/null
+++ b/file_generator/generate_mail_relay.py
@@ -0,0 +1,32 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing mail relay file")
+ output_directory = os.path.join(util.get_output_path(), "mail_relay")
+ template_mail_relay_directory = os.path.join(util.get_templates_path(), "mail_relay")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ files_to_copy = [
+ "000-default.conf",
+ "ports.conf",
+ "main.cf"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_mail_relay_directory, file), output_directory)
+
+ replacements = {
+ 'ACCESS_DOMAIN_NAME': config["new_machine_network"]["app_installation_domain"],
+ }
+
+ if "mail_relay" in config:
+ replacements["POSTFIX_MYNETWORKS"] = config["mail_relay"]["mynetworks"]
+
+ for name in replacements.keys():
+ util.basic_on_location_sed(os.path.join(output_directory, "main.cf"), name, replacements[name])
\ No newline at end of file
diff --git a/file_generator/generate_mariadb.py b/file_generator/generate_mariadb.py
new file mode 100644
index 0000000..a41f3db
--- /dev/null
+++ b/file_generator/generate_mariadb.py
@@ -0,0 +1,55 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing mariadb file")
+
+ output_directory = os.path.join(util.get_output_path(), "mariadb")
+ template_mariadb_directory = os.path.join(util.get_templates_path(), "mariadb")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ shutil.copytree(template_mariadb_directory, output_directory, dirs_exist_ok=True)
+ topology_data_file_path = os.path.join(output_directory, "07_topology_data_for_1_tenant.sql")
+
+ tenant_data = util.get_minimal_configuration()
+
+ topology_replacements = {
+ # machine secrets
+ 'MASTER_PASSWORD': config["machine_secrets"]["master_password"],
+ # new machine network
+ 'KAMAILIO_NAME': tenant_data["kamailio_name"],
+ 'INSTANCE_NAME': config["new_machine_network"]["app_installation_domain"],
+ 'ACCESS_DOMAIN_NAME': config["new_machine_network"]["app_installation_domain"],
+ 'SYSTEM_DOMAIN_NAME': config["new_machine_network"]["system_app_installation_domain"],
+ 'CORE_IP': config["new_machine_network"]["internal_ip"],
+ 'CORE_MASK': config["new_machine_network"]["internal_mask"],
+ 'CORE_NET_ADDRESS': config["new_machine_network"]["internal_net_address"],
+ 'ACCESS_IP': config["new_machine_network"]["external_ip"],
+ 'ACCESS_MASK': config["new_machine_network"]["external_mask"],
+ 'ACCESS_NET_ADDRESS': config["new_machine_network"]["external_net_address"],
+ 'TELCO_IP': config["new_machine_network"]["telco_ip"],
+ 'TELCO_GATEWAY': config["new_machine_network"]["telco_gateway"],
+ 'TELCO_MASK': config["new_machine_network"]["telco_mask"],
+ 'TELCO_NET_ADDRESS': config["new_machine_network"]["telco_net_address"],
+ 'MONGO_REPLICASET_NAME': config["new_machine_network"]["cluster_name"],
+ 'SYSTEM_TOKEN_SECRETKEY': util.get_token("system_token_secretkey"),
+ }
+
+ for name in topology_replacements.keys():
+ util.basic_on_location_sed(topology_data_file_path, name, topology_replacements[name])
+
+ manager_data_file_path = os.path.join(output_directory, "06_manager_data_for_1_tenant.sql")
+
+ manager_replacements = {
+ 'OPERATOR_DOMAIN': config["operator"]["domain"],
+ 'OPERATOR_USERNAME': config["operator"]["username"],
+ 'OPERATOR_PASSWORD': config["operator"]["password"]
+ }
+
+ for name in manager_replacements.keys():
+ util.basic_on_location_sed(manager_data_file_path, name, manager_replacements[name])
diff --git a/file_generator/generate_metrics.py b/file_generator/generate_metrics.py
new file mode 100644
index 0000000..0a8f625
--- /dev/null
+++ b/file_generator/generate_metrics.py
@@ -0,0 +1,20 @@
+import os
+import shutil
+
+import bcrypt
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing metrics file")
+ output_directory = os.path.join(util.get_output_path(), "metrics")
+ template_env_directory = os.path.join(util.get_templates_path(), "metrics")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ util.copy_file(os.path.join(template_env_directory, "node_exporter.yml"), output_directory)
+ hashed_password = bcrypt.hashpw(config["machine_secrets"]["prometheus_password"].encode("utf-8"), bcrypt.gensalt()).decode()
+
+ util.basic_on_location_sed(os.path.join(output_directory, "node_exporter.yml"), 'PROMETHEUS_PASSWORD', hashed_password)
diff --git a/file_generator/generate_mongodb.py b/file_generator/generate_mongodb.py
new file mode 100644
index 0000000..f6392d3
--- /dev/null
+++ b/file_generator/generate_mongodb.py
@@ -0,0 +1,24 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing mongodb file")
+
+ output_directory = os.path.join(util.get_output_path(), "mongodb")
+ template_mongodb_directory = os.path.join(util.get_templates_path(), "mongodb")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ files_to_copy = [
+ "mongo_init.sh",
+ "text_to_speech.js"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_mongodb_directory, file), output_directory)
+
+ util.basic_on_location_sed(os.path.join(output_directory, "mongo_init.sh"), 'MASTER_PASSWORD', config["machine_secrets"]["master_password"])
diff --git a/file_generator/generate_nginx.py b/file_generator/generate_nginx.py
new file mode 100644
index 0000000..22a2f82
--- /dev/null
+++ b/file_generator/generate_nginx.py
@@ -0,0 +1,280 @@
+import hashlib
+import os
+import random
+import shutil
+
+from jinja2 import Template
+
+from conpeek_setup import util
+
+
+def generate_upstream_name():
+ # Define a helper function to generate a 7-character MD5 hash from a random number
+ def generate_part():
+ random_number = str(random.randint(0, 32767)) # Equivalent to $RANDOM in bash
+ md5_hash = hashlib.md5(random_number.encode()).hexdigest()
+ return md5_hash[:7]
+
+ # Generate the upstream name by concatenating four parts with hyphens
+ upstream_name = f"{generate_part()}-{generate_part()}-{generate_part()}-{generate_part()}"
+ return upstream_name
+
+def generate_custom_settings(template_file_path, config_location, app_installation_domain):
+ util.print_black_light(f"Preparing custom settings")
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "app_installation_domain": app_installation_domain[1:].replace(".", "\.")
+ }
+
+ output_text = template.render(data)
+ output_file = os.path.join(config_location, "custom_settings.conf")
+
+ with open(output_file, "w") as file:
+ file.write(output_text)
+
+
+def generate_default_config(template_file_path, config_location, access_ip, cert_name):
+ util.print_black_light(f"Preparing default.conf")
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "nginx_ip": access_ip,
+ "network_domain": cert_name,
+ }
+
+ output_text = template.render(data)
+
+ output_file = os.path.join(config_location, "default.conf")
+
+ with open(output_file, "w") as file:
+ file.write(output_text)
+
+
+def generate_config(template_file_path, config_location, listening_port, internal_ip, access_ip, external_ip, server_name, cert_name, app_installation_domain):
+ util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
+
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "upstream_name": generate_upstream_name(),
+ "service_port": listening_port, # Example list of ports
+ "ip_v4": internal_ip,
+ "nginx_ip": access_ip,
+ "server_name": server_name + app_installation_domain,
+ "network_domain": cert_name,
+ "app_installation_domain": app_installation_domain[1:]
+ }
+
+ output_text = template.render(data)
+
+ output_file = os.path.join(config_location, server_name + app_installation_domain + ".conf")
+
+ with open(output_file, "w") as file:
+ file.write(output_text)
+
+
+def generate_frontend_config(template_file_path, ready_config_location, internal_ip, server_name, app_name, app_installation_domain, service_port='brak_portu'):
+ util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
+ file = open(template_file_path, 'r')
+ template_content = file.read()
+ template = Template(template_content)
+
+ data = {
+ "internal_ip": internal_ip,
+ "server_name": server_name + app_installation_domain,
+ "app_name": app_name,
+ "service_port": service_port,
+ "app_installation_domain": app_installation_domain[1:]
+ }
+
+ output_text = template.render(data)
+ output_file = os.path.join(ready_config_location, server_name + app_installation_domain + ".conf")
+
+ with open(output_file, "w") as file:
+ file.write(output_text)
+
+
+def run(config, developer_mode=False):
+ util.print_black_light("Preparing nginx file")
+
+ output_directory = os.path.join(util.get_output_path(), "etc/nginx")
+ template_nginx_directory = os.path.join(util.get_templates_path(), "nginx")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ internal_ip = config["new_machine_network"]["internal_ip"]
+ external_ip = config["new_machine_network"]["internal_ip"] # listen IP same as redirectIP, due to NAT in universal inteface in ŁDZ cloud
+
+ access_ip = config["new_machine_network"]["internal_ip"]
+ if config.has_option('new_machine_network', 'access_ip'):
+ access_ip = config["new_machine_network"]["access_ip"]
+
+ app_installation_domain = "." + config["new_machine_network"]["app_installation_domain"] # code fault, it must be this dot here, for fix in the future
+ cert_name = "conpeek_ssl"
+
+ tenant_data = util.get_minimal_configuration()
+
+ reverse_proxy_directory = os.path.join(util.get_output_path(), "etc/nginx/reverse_proxy")
+ shutil.rmtree(reverse_proxy_directory, ignore_errors=True)
+ os.makedirs(reverse_proxy_directory, exist_ok=True)
+
+ frontend_directory = os.path.join(util.get_output_path(), "etc/nginx/frontend")
+ shutil.rmtree(frontend_directory, ignore_errors=True)
+ os.makedirs(frontend_directory, exist_ok=True)
+
+ reverse_proxy_replacements = {
+ # api tenant login
+ f"{tenant_data['tenant_login_api_server_name']}": tenant_data['tenant_login_api_server_port'],
+ # api tenant
+ f"api-{tenant_data['api_tenant_name']}": tenant_data['api_tenant_port'],
+ # api operator
+ f"api-{tenant_data['operator_api_server_response_name']}": tenant_data['operator_api_server_response_port'],
+ # session_server
+ f"{tenant_data['session_server_name']}": tenant_data['private_api_port'],
+ f"public-api-{tenant_data['session_server_name']}": tenant_data['public_api_port'],
+ f"api-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_api_port'],
+ # cdr_server
+ f"api-{tenant_data['cdr_server_name']}": tenant_data['cdr_server_api_port'],
+ # report server
+ f"api-{tenant_data['report_server_name']}": tenant_data['report_server_api_port'],
+ # local contact db server
+ f"api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_api_port'],
+ f"public-api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_public_api_port'],
+ # hubspot server
+ f"api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_api_port'],
+ f"public-api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_public_api_port'],
+ # ticketing server
+ f"api-{tenant_data['ticketing_server_name']}": tenant_data['ticketing_server_api_port'],
+ # gus server
+ f"api-{tenant_data['gus_server_name']}": tenant_data['gus_server_public_api_port'],
+ # meets
+ f"{tenant_data['meets_server_name']}": tenant_data['meets_server_port'],
+ # bss api server
+ f"api-{tenant_data['tenant_bss_api_server_name']}": tenant_data['tenant_bss_api_server_initial_application_port'],
+ # sms server
+ f"api-{tenant_data['sms_server_name']}": tenant_data['sms_server_api_port'],
+ f"public-api-{tenant_data['sms_server_name']}": tenant_data['sms_server_public_api_port'],
+ # mailbox server
+ f"api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_api_port'],
+ f"public-api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_public_api_port'],
+ # facebook server
+ f"api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_api_port'],
+ f"public-api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_public_api_port'],
+ # messagebird server
+ f"api-{tenant_data['messagebird_server_name']}": tenant_data['messagebird_server_api_port'],
+ # tenant_web_polling_server
+ f"{tenant_data['api_tenant_web_polling_name']}": tenant_data['api_tenant_web_polling_port'],
+ # bot server
+ f"api-{tenant_data['bot_server_name']}": tenant_data['bot_server_api_port'],
+
+ # verto
+ f"api-{tenant_data['freeswitch_name']}": 6900,
+ f"verto-routing-{tenant_data['freeswitch_name']}": 9800,
+ f"verto-stun-{tenant_data['freeswitch_name']}": 9801,
+ f"verto-no-stun-{tenant_data['freeswitch_name']}": 9802,
+ f"verto-ext-stun-{tenant_data['freeswitch_name']}": 9803,
+ f"verto-ext-no-stun-{tenant_data['freeswitch_name']}": 9804,
+
+ # metrics
+ "invitation": 3900,
+ "conpeek-exporter": 9850,
+ "statsd-exporter": 9851,
+ "statsd-api-exporter": 9852,
+ "ping-exporter": 9853,
+ "node-exporter": 9854,
+ "freeswitch-exporter": 9855,
+ "process-exporter": 9856,
+ "docker-exporter": 9857,
+
+ # frontend
+ "app": 81,
+ "wallboard": 81,
+ "device": 81,
+ "operator": 81,
+ "docs": 81,
+ "desk": 81
+ }
+
+ if developer_mode:
+ reverse_proxy_replacements["app-prod"] = 81
+
+ for name in reverse_proxy_replacements.keys():
+ generate_config(os.path.join(template_nginx_directory, "nginx-proxy.tmpl"), reverse_proxy_directory, reverse_proxy_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
+
+ generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), reverse_proxy_directory, app_installation_domain)
+ generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), frontend_directory, app_installation_domain)
+ generate_default_config(os.path.join(template_nginx_directory, "default.tmpl"), reverse_proxy_directory, access_ip, cert_name)
+
+ reverse_proxy_wss_replacements = {
+ f"wss-{tenant_data['session_server_name']}": tenant_data['wss_port'],
+ f"wss-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_wss_port'],
+ f"wss-monitoring-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
+ f"wss-{tenant_data['user_notification_server_name']}": tenant_data['user_notification_server_wss_port'],
+ f"wss-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
+ }
+
+ for name in reverse_proxy_wss_replacements.keys():
+ generate_config(os.path.join(template_nginx_directory, "nginx-web-socket.tmpl"), reverse_proxy_directory, reverse_proxy_wss_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
+
+ frontend_replacements = {
+ "app": "app_tenant",
+ "wallboard": "app_wallboard",
+ "device": "app_device",
+ "operator": "app_operator"
+ }
+
+ if developer_mode:
+ generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_production_template.tmpl"), frontend_directory, internal_ip, "app-prod", "app_tenant", app_installation_domain)
+
+ for name in frontend_replacements.keys():
+ generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_template.tmpl"), frontend_directory, internal_ip, name, frontend_replacements[name], app_installation_domain)
+
+ # server specific
+
+ # docs
+ generate_frontend_config(os.path.join(template_nginx_directory, "docker_docs_template.tmpl"), frontend_directory, internal_ip, "docs", "docs", app_installation_domain)
+ # desk
+ generate_frontend_config(os.path.join(template_nginx_directory, "docker_desk_template.tmpl"), frontend_directory, internal_ip, "desk", "app_desk", app_installation_domain)
+ # api tenant plugin frontend
+ generate_frontend_config(os.path.join(template_nginx_directory, "tenant_plugin_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['tenant_plugin_api_server_name'], None, app_installation_domain, tenant_data['tenant_plugin_api_server_initial_application_port'])
+ # api tenant plugin reverse proxy
+ generate_config(os.path.join(template_nginx_directory, "tenant_plugin_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['tenant_plugin_api_server_initial_application_port'], internal_ip, access_ip, external_ip, tenant_data['tenant_plugin_api_server_name'], cert_name, app_installation_domain)
+ # file server
+ generate_config(os.path.join(template_nginx_directory, "nginx-file-server.tmpl"), reverse_proxy_directory, tenant_data['file_server_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['file_server_name']}", cert_name, app_installation_domain)
+ # messaging server
+ generate_config(os.path.join(template_nginx_directory, "nginx-messaging-server.tmpl"), reverse_proxy_directory, tenant_data['messaging_server_public_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['messaging_server_name']}", cert_name, app_installation_domain)
+ # api tenant plugin frontend
+ generate_frontend_config(os.path.join(template_nginx_directory, "tenant_web_polling_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['api_tenant_web_polling_name'], None, app_installation_domain, tenant_data['api_tenant_web_polling_port'])
+ # api tenant plugin reverse proxy
+ generate_config(os.path.join(template_nginx_directory, "tenant_web_polling_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['api_tenant_web_polling_port'], internal_ip, access_ip, external_ip, tenant_data['api_tenant_web_polling_name'], cert_name, app_installation_domain)
+
+ files_to_copy = [
+ "nginx.conf",
+ "nginx.conf_frontend"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_nginx_directory, file), output_directory)
+
+ # custom docker entrypoint scripts
+
+ frontend_custom_template_directory = os.path.join(util.get_templates_path(), "nginx")
+ frontend_custom_directory = os.path.join(util.get_output_path(), "custom/frontend")
+ os.makedirs(frontend_custom_directory, exist_ok=True)
+ util.copy_file(os.path.join(frontend_custom_template_directory, "custom.sh"), frontend_custom_directory)
+
+ if config.has_option("custom", "operator_name"):
+ util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', config["custom"]["operator_name"])
+ else:
+ util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', 'Conpeek')
+
diff --git a/file_generator/generate_rabbitmq.py b/file_generator/generate_rabbitmq.py
new file mode 100644
index 0000000..d91aca2
--- /dev/null
+++ b/file_generator/generate_rabbitmq.py
@@ -0,0 +1,27 @@
+import os
+import shutil
+
+from conpeek_setup import util
+
+
+def run(config):
+ util.print_black_light("Preparing rabbitmq file")
+
+ output_directory = os.path.join(util.get_output_path(), "rabbitmq")
+ template_rabbitmq_directory = os.path.join(util.get_templates_path(), "rabbitmq")
+
+ shutil.rmtree(output_directory, ignore_errors=True)
+ os.makedirs(output_directory, exist_ok=True)
+
+ rabbitmq_directory = os.path.join(util.get_output_path(), "etc/rabbitmq")
+ os.makedirs(rabbitmq_directory, exist_ok=True)
+
+ files_to_copy = [
+ "rabbit_init.sh"
+ ]
+
+ for file in files_to_copy:
+ util.copy_file(os.path.join(template_rabbitmq_directory, file), output_directory)
+
+ util.basic_on_location_sed(os.path.join(template_rabbitmq_directory, "rabbit_init.sh"), 'MASTER_PASSWORD', config["machine_secrets"]["master_password"])
+ util.copy_file(os.path.join(template_rabbitmq_directory, "rabbitmq.config"), rabbitmq_directory)
diff --git a/file_generator/generate_tokens.py b/file_generator/generate_tokens.py
new file mode 100644
index 0000000..5538819
--- /dev/null
+++ b/file_generator/generate_tokens.py
@@ -0,0 +1,40 @@
+import os
+import random
+import string
+
+from conpeek_setup import util
+
+
+def generate_password(length=64, lowercase=True, uppercase=True, digits=True):
+
+ basic_characters = ""
+ if lowercase:
+ basic_characters += string.ascii_lowercase
+
+ if uppercase:
+ basic_characters += string.ascii_uppercase
+
+ if digits:
+ basic_characters += string.digits
+
+ if not lowercase and not uppercase and not digits:
+ util.print_red("Password must contain at least lowercase, uppercase or digits.")
+
+ password = ''.join(random.choices(basic_characters, k=length))
+ return password
+
+
+def run(config):
+ output_directory = os.path.join(util.get_output_path(), "tokens")
+ os.makedirs(output_directory, exist_ok=True)
+
+ passwords = {
+ "system_token_secretkey": 64,
+ ".erlang.cookie": 56,
+ }
+
+ for key in passwords.keys():
+ token_path = os.path.join(output_directory, key)
+ if not os.path.exists(token_path):
+ with open(token_path, "w") as file:
+ file.write(generate_password(length=passwords[key]))
diff --git a/lib/__init__.py b/lib/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/lib/create_sip_trunk.py b/lib/create_sip_trunk.py
new file mode 100644
index 0000000..3dd63e0
--- /dev/null
+++ b/lib/create_sip_trunk.py
@@ -0,0 +1,292 @@
+import argparse
+import configparser
+import os
+import pathlib
+import re
+import sys
+from itertools import product
+
+from conpeek_setup import util
+from conpeek_setup.api import operator_api
+
+
+def unpack_regex(regex):
+ # Helper function to expand ranges and lists within square brackets, e.g., [2-5] or [234]
+ def expand_square_brackets(pattern):
+ expanded = []
+ content = pattern[1:-1] # Remove the square brackets
+ if '-' in content:
+ # Handle ranges like [2-5]
+ start, end = content.split('-')
+ expanded = [str(i) for i in range(int(start), int(end) + 1)]
+ elif pattern == '\\d':
+ return [str(i) for i in range(10)]
+ else:
+ # Handle specific digits like [234]
+ expanded = list(content)
+ return expanded
+
+ # Split the regex into parts of digits and square bracket patterns
+ # This regex splits on digits and square brackets with their content
+ parts = re.findall(r'\[\d+-\d+\]|\[\d+\]|\d+|\\d', regex)
+
+ # Process parts to generate all possible values
+ expanded_parts = []
+
+ for part in parts:
+ if part.startswith('[') and part.endswith(']'):
+ # Handle square brackets
+ expanded_parts.append(expand_square_brackets(part))
+ elif part == '\d':
+ expanded_parts.append(expand_square_brackets(part))
+
+ else:
+ # Handle digits
+ expanded_parts.append([part])
+
+ for combination in product(*expanded_parts):
+ print(''.join(combination))
+
+ # Generate all combinations of expanded parts
+ possible_values = [''.join(combination) for combination in product(*expanded_parts)]
+
+ print(possible_values)
+
+ return possible_values
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="")
+ parser.add_argument("--config", type=str, required=True, help="Path to the config file")
+ parser.add_argument("--user", type=str, required=True, help="Operator login")
+ parser.add_argument("--password", type=str, required=True, help="Operator password")
+ parser.add_argument("--output-path", type=str, required=False, help="Path to the output")
+
+ args = parser.parse_args()
+ config = configparser.ConfigParser()
+
+ config_directory = args.config
+ if not os.path.abspath(config_directory):
+ config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory)
+ config.read(config_directory)
+ if args.output_path:
+ util.Settings.output_directory = args.output_path
+
+ output_directory = os.path.join(util.get_output_path(), "freeswitch")
+ template_freeswitch_directory = os.path.join(util.get_templates_path(), "freeswitch/conf")
+
+ app_domain = config["new_machine_network"]["app_installation_domain"]
+ api = operator_api.OperatorAPI(app_domain)
+ api.login(args.user, args.password)
+
+ tenant = None
+ tenants = api.get_tenants()
+ for o_tenant in tenants:
+ tenant = o_tenant
+ break
+
+ if not tenant:
+ util.print_red("Tenant not exists. First you need to create tenant and the run this script.")
+ sys.exit()
+
+ # sip trunks
+ for section in config:
+ if not section.startswith("sip_trunk_"):
+ continue
+
+ operator = "default"
+ if config.has_option(section, "operator") and config[section]["operator"]:
+ if config[section]["operator"] not in util.Constants.sip_trunk_operators:
+ util.print_red(f'Operator does not exists {config[section]["operator"]}. Using default sip trunk!')
+ else:
+ operator = config[section]["operator"]
+
+ siptrunk_number = section[10:]
+ proxy = config[section]["proxy"]
+
+ SIP_TRUNK_NUMBER = str(int(siptrunk_number) + 1)
+ SIP_TRUNK_INTERNAL_PORT = 5100 + int(siptrunk_number)
+ SIP_TRUNK_NAME = f"ic{siptrunk_number}"
+ SIP_TRUNK_NAME_WITH_PORT = f"{SIP_TRUNK_NAME}_{SIP_TRUNK_INTERNAL_PORT}"
+ SIP_PROFILE_NAME = f"gw1_external_{siptrunk_number}_{SIP_TRUNK_INTERNAL_PORT}"
+
+ template_freeswitch_directory_operator = os.path.join(util.get_templates_path(), f"freeswitch/{operator}")
+
+ sip_profile_template_path = os.path.join(template_freeswitch_directory_operator, "sip_profiles/gw_external.xml")
+ if not os.path.exists(sip_profile_template_path):
+ sip_profile_template_path = os.path.join(template_freeswitch_directory, "sip_profiles/gw_external.xml")
+
+ sip_profile_output_path = os.path.join(output_directory, f"conf/sip_profiles/{SIP_PROFILE_NAME}.xml")
+ if os.path.exists(sip_profile_output_path):
+ util.print_red(f"SIP profile {sip_profile_output_path} exists.")
+ continue
+ else:
+ util.copy_file(sip_profile_template_path, sip_profile_output_path)
+
+ SIP_TRUNK_USERNAME = ""
+ if config.has_option(section, "username"):
+ SIP_TRUNK_USERNAME = config[section]["username"]
+
+ SIP_TRUNK_PASSWORD = ""
+ if config.has_option(section, "password"):
+ SIP_TRUNK_PASSWORD = config[section]["password"]
+
+ sip_profile_replacements = {
+ 'SIP_PROFILE_NAME': SIP_PROFILE_NAME,
+ 'SIP_TRUNK_NAME_WITH_PORT': SIP_TRUNK_NAME_WITH_PORT,
+ 'SIP_TRUNK_PROXY': proxy,
+ 'SIP_TRUNK_INTERNAL_PORT': str(SIP_TRUNK_INTERNAL_PORT),
+ 'SIP_TRUNK_USERNAME': SIP_TRUNK_USERNAME,
+ 'SIP_TRUNK_PASSWORD': SIP_TRUNK_PASSWORD,
+ 'EXTERNAL_IP': config["new_machine_network"]["external_ip"],
+ 'INTERNAL_IP': config["new_machine_network"]["internal_ip"],
+ }
+
+ for name in sip_profile_replacements.keys():
+ util.basic_on_location_sed(sip_profile_output_path, name, sip_profile_replacements[name])
+
+ operator_gateways = api.get_operator_gateways()
+ operator_gateway = None
+ for o_gateway in operator_gateways:
+ if o_gateway["name"] == SIP_TRUNK_NAME:
+ operator_gateway = o_gateway
+ break
+
+ tenant_telco_networks = api.get_tenant_telco_networks(tenant["id"])
+ tenant_has_telco_network_exists = False
+ for tenant_has_telco_network in tenant_telco_networks:
+ if tenant_has_telco_network["gateway_external_sip_port"] == SIP_TRUNK_INTERNAL_PORT:
+ tenant_has_telco_network_exists = True
+ break
+
+ if not tenant_has_telco_network_exists:
+ api.create_tenant_telco_network(tenant["id"], {
+ "8021q_vlan_id": 0,
+ "gateway_external_sip_port": SIP_TRUNK_INTERNAL_PORT,
+ "telco_network_id": 1
+ })
+
+ if not operator_gateway:
+ util.print_black_light(f"Creating operator gateway {SIP_TRUNK_NAME}")
+ operator_gateway = api.create_operator_gateway({
+ "name": SIP_TRUNK_NAME,
+ "validate_e164": True,
+ "presentation_preservation_policy": "DISABLED",
+ "telco_network_id": 1,
+ "username": SIP_TRUNK_USERNAME,
+ "password": SIP_TRUNK_PASSWORD
+ })
+
+ if not operator_gateway:
+ util.print_red(f"Cant insert to operator_gateway {SIP_TRUNK_NAME}.")
+ continue
+
+ normalization_to_create = [{
+ "direction": "outbound",
+ "peer": "caller",
+ "pattern": '^48([0-9]{9})$',
+ "replacement": '\\1',
+ "priority": 10
+ }, {
+ "direction": "inbound",
+ "peer": "callee",
+ "pattern": '^([0-9]{9})$',
+ "replacement": '48\\1',
+ "priority": 10
+ }, {
+ "direction": "inbound",
+ "peer": "caller",
+ "pattern": '^([0-9]{9})$',
+ "replacement": '48\\1',
+ "priority": 10
+ }, {
+ "direction": "inbound",
+ "peer": "caller",
+ "pattern": '^\\+([0-9]*)$',
+ "replacement": '\\1',
+ "priority": 10
+ }, {
+ "direction": "inbound",
+ "peer": "caller",
+ "pattern": '^00([0-9]*)$',
+ "replacement": '\\1',
+ "priority": 10
+ }, {
+ "direction": "outbound",
+ "peer": "callee",
+ "pattern": '^([0-9]*)$',
+ "replacement": '+\\1',
+ "priority": 10
+ }]
+
+ for normalization in normalization_to_create:
+ api.create_operator_gateway_normalization(operator_gateway["id"], normalization)
+
+ ddi = config[section]["ddi"]
+ ddi = ddi.replace(",", ";")
+ ddi_patterns = ddi.split(";")
+ for ddi_pattern in ddi_patterns:
+ if ddi_pattern.startswith("^") and ddi_pattern.endswith("$"):
+ api.create_operator_routing({
+ "priority": 100,
+ "src_number_to_charge": ddi_pattern,
+ "src_presentation_number": ".*",
+ "dst": ".*",
+ "operator_gateway_id": operator_gateway["id"]
+ })
+
+ ddi_list = unpack_regex(ddi_pattern)
+ if len(ddi_list) > 1000:
+ util.print_red("There cannot be more than 1000 numbers -- invalid regexp pattern")
+ sys.exit()
+
+ for ddi_number in ddi_list:
+ api.create_ddi(tenant["id"], {
+ "e164number": ddi_number,
+ "fax_enabled": 1,
+ "voice_enabled": 1,
+ "sms_enabled": 0,
+ "operator_gateway_id": operator_gateway["id"]
+ })
+
+ elif "-" in ddi_pattern:
+ from_number = int(ddi_pattern.split("-")[0])
+ to_number = int(ddi_pattern.split("-")[1])
+
+ numbers = set(range(from_number, to_number + 1))
+ if len(numbers) > 1000:
+ util.print_red("There cannot be more than 1000 numbers")
+ sys.exit()
+
+ for number in numbers:
+ api.create_operator_routing({
+ "priority": 100,
+ "src_number_to_charge": f"^{number}$",
+ "src_presentation_number": ".*",
+ "dst": ".*",
+ "operator_gateway_id": operator_gateway["id"]
+ })
+
+ api.create_ddi(tenant["id"], {
+ "e164number": number,
+ "fax_enabled": 1,
+ "voice_enabled": 1,
+ "sms_enabled": 0,
+ "operator_gateway_id": operator_gateway["id"]
+ })
+ else:
+ api.create_operator_routing({
+ "priority": 100,
+ "src_number_to_charge": f"^{ddi_pattern}$",
+ "src_presentation_number": ".*",
+ "dst": ".*",
+ "operator_gateway_id": operator_gateway["id"]
+ })
+
+ api.create_ddi(tenant["id"], {
+ "e164number": ddi_pattern,
+ "fax_enabled": 1,
+ "voice_enabled": 1,
+ "sms_enabled": 0,
+ "operator_gateway_id": operator_gateway["id"]
+ })
\ No newline at end of file
diff --git a/lib/create_tenant.py b/lib/create_tenant.py
new file mode 100644
index 0000000..0fc7efe
--- /dev/null
+++ b/lib/create_tenant.py
@@ -0,0 +1,228 @@
+import argparse
+import configparser
+import os
+import pathlib
+import sys
+from datetime import datetime
+
+import pytz
+
+from conpeek_setup import util
+from conpeek_setup.api import operator_api
+from conpeek_setup.api.tenant_api import TenantAPI
+
+
+def validate_config(config):
+ sections_to_validate = [
+ "tenant"
+ ]
+
+ for section in sections_to_validate:
+ if not config.has_section(section):
+ util.print_red(f"No {section} section in config")
+ raise Exception(f"No {section} section in config")
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="")
+ parser.add_argument("--config", type=str, required=True, help="Path to the config file")
+ parser.add_argument("--user", type=str, required=True, help="Operator login")
+ parser.add_argument("--password", type=str, required=True, help="Operator password")
+
+ args = parser.parse_args()
+ config = configparser.ConfigParser()
+
+ config_directory = args.config
+ if not os.path.abspath(config_directory):
+ config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory)
+
+ config.read(config_directory)
+
+ validate_config(config)
+
+ app_domain = config["new_machine_network"]["app_installation_domain"]
+
+ api = operator_api.OperatorAPI(app_domain)
+ util.print_black_light(f"Wait for start TenantLoginAPI")
+ api.wait_for_start(f"{api.api_tenant_login_url}/tenant/check_connection")
+ util.print_green(f"TenantLoginAPI Started")
+ api.login(args.user, args.password)
+ util.print_black_light(f"Wait for start OperatorAPI")
+ api.wait_for_start()
+ util.print_green(f"OperatorAPI Started")
+
+ tenant = None
+ tenants = api.get_tenants()
+ for o_tenant in tenants:
+ tenant = o_tenant
+ break
+
+ if not tenant:
+ # Create Tenant if not exists
+ print("Creating tenant...")
+ tenant = api.create_tenant({
+ "name": config["tenant"]["domain"],
+ "domain": config["tenant"]["domain"],
+ "time_zone": "Europe/Warsaw",
+ "language": "pl",
+ "active": 1,
+ "estimated_number_of_users": 100,
+ "allow_to_exceed_concurrent_packages": 0,
+ "create_recording_checksum_file": 1,
+ "video_recording_enabled": 0,
+ "simultaneous_calls_limit": 100,
+ "anonymous_sessions": 1,
+ "access_network_id": 1,
+ "plugin_enabled_domain_id": 1,
+ "telco_network_id": 1
+ })
+
+ util.print_black_light(f"Created tenant ({tenant['id']}) {tenant['name']}.")
+ else:
+ util.print_yellow(f"Tenant {config['tenant']['domain']} exists, id={tenant['id']}.")
+
+ license_packages = api.get_license_packages(tenant_id=tenant["id"])
+ packages_count = {
+ "Super Admin": 3,
+ }
+
+ license_package_agreements = api.get_package_agreements(tenant_id=tenant["id"])
+ for license_package in license_package_agreements:
+ if license_package["operator_license_package_name"] in packages_count:
+ if license_package["commercial_license_package_amount"] >= packages_count[license_package["operator_license_package_name"]]:
+ util.print_black_light(f'Licenses {license_package["operator_license_package_name"]} exists.')
+ del packages_count[license_package["operator_license_package_name"]]
+
+ super_admin_package_id = None
+ package_activation_item_list = []
+ for package_license in license_packages:
+ if package_license["name"] == "Super Admin":
+ super_admin_package_id = package_license["id"]
+ if package_license["name"] in packages_count:
+ package_activation_item_list.append({
+ "license_package_amount": packages_count[package_license["name"]],
+ "license_package_type": "COMMERCIAL",
+ "concurrent_usage_limit": 0,
+ "operator_license_package_id": package_license["id"]
+ })
+
+ local_tz = pytz.timezone(tenant["time_zone"])
+ local_now = datetime.now(local_tz)
+ local_start_of_day = local_tz.localize(datetime(local_now.year, local_now.month, local_now.day, 0, 0, 0))
+ utc_start_of_day = local_start_of_day.astimezone(pytz.utc)
+
+ if package_activation_item_list:
+ api.create_package_activation_request(tenant_id=tenant["id"], params={
+ "activate_date": utc_start_of_day.strftime("%Y-%m-%d %H:%M:%S"),
+ "note": "Auto generated",
+ "package_activation_item_list": package_activation_item_list
+ })
+
+ # Create super administrators
+ util.print_black_light("Creating super administrators...")
+ super_admin_users_to_create = [
+ {
+ "username": "super1",
+ "extension": "1001"
+ },
+ {
+ "username": "super2",
+ "extension": "1002"
+ },
+ {
+ "username": "super3",
+ "extension": "1003"
+ }
+ ]
+
+ super_admin_users_to_create_list = []
+ for user in super_admin_users_to_create:
+ super_admin_users_to_create_list.append(user["username"])
+
+ users_in_tenant = []
+ super_tenant_user_id = None
+ tenant_api = None
+ user_mapping = {}
+
+ users = api.get_users(tenant_id=tenant["id"])
+ for user in users:
+ if not super_tenant_user_id:
+ super_tenant_user_id = user["id"]
+
+ user_mapping[user["username"]] = user["id"]
+ if not tenant_api:
+ login_data = api.login_as_user(tenant_id=tenant["id"], tenant_user_id=super_tenant_user_id)
+ tenant_api = TenantAPI(app_domain)
+ tenant_api.initialize_user_login(login_data)
+ util.print_black_light(f"Wait for start TenantAPI")
+ tenant_api.wait_for_start()
+ util.print_green(f"TenantAPI Started")
+ users_in_tenant.append(user["username"])
+
+ if super_admin_package_id:
+ for user in super_admin_users_to_create:
+
+ if user["username"] in users_in_tenant:
+ util.print_black_light(f'User {user["username"]} exists.')
+ continue
+ d_user = api.create_user(tenant_id=tenant["id"], params={
+ "active": 1,
+ "username": user["username"],
+ "password": args.password,
+ "main_license_package_id": super_admin_package_id,
+ "language": "pl",
+ "change_avatar_allowed": 1,
+ "change_on_leave_allowed": 1,
+ "on_leave": 0,
+ "system_role": [],
+ "tenant_role": []
+ })
+
+ user_mapping[user["username"]] = d_user["id"]
+
+ if not super_tenant_user_id:
+ super_tenant_user_id = d_user["id"]
+
+ if not tenant_api:
+ login_data = api.login_as_user(tenant_id=tenant["id"], tenant_user_id=super_tenant_user_id)
+ tenant_api = TenantAPI(app_domain)
+ tenant_api.initialize_user_login(login_data)
+ util.print_black_light(f"Wait for start TenantAPI")
+ tenant_api.wait_for_start()
+ util.print_green(f"TenantAPI Started")
+
+ tenant_api.update_feature_tenant_user_call(d_user["id"], {
+ "call_enabled": 1,
+ "extension": user["extension"],
+ "click_to_dial_auto_answer": 1
+ })
+
+ tenant_api.update_feature_tenant_user_consultant(d_user["id"], {
+ "work_state": "ONLINE"
+ })
+
+ tenant_api.update_feature_tenant_user_consultant(d_user["id"], {
+ "audio_enabled": 1,
+ "file_enabled": 1,
+ "chat_enabled": 1
+ })
+
+ tenant_api.update_feature_tenant_user_hotdesk(d_user["id"], {
+ "hotdesk_enabled": 1,
+ "hotdesk_identifier": user["extension"],
+ "hotdesk_pin": user["extension"],
+ })
+
+ tenant_api.create_web_link({
+ "name": "Web",
+ "tenant_user_id": d_user["id"],
+ "audio": 1,
+ "chat": 1,
+ "video": 1,
+ "call_timeout": 30,
+ "priority": 100,
+ "state": "ON",
+ "user_device_type": "WEBAPP"
+ })
+
+ if not tenant_api:
+ sys.exit()
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..99948dc
--- /dev/null
+++ b/main.py
@@ -0,0 +1,72 @@
+import argparse
+import configparser
+import os
+import pathlib
+
+from conpeek_setup.file_generator import (generate_bind9, generate_env, generate_freeswitch,
+ generate_kamailio, generate_mariadb,
+ generate_metrics, generate_mongodb, generate_nginx,
+ generate_mail_relay, generate_rabbitmq,
+ generate_tokens, generate_cert)
+
+from conpeek_setup import util
+
+
+def validate_config(config):
+ sections_to_validate = [
+ "deployment_purpose",
+ "bind9",
+ "new_machine_network",
+ "machine_secrets",
+ "operator"
+ ]
+
+ for section in sections_to_validate:
+ if not config.has_section(section):
+ util.print_red(f"No {section} section in config")
+ raise Exception(f"No {section} section in config")
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="")
+ parser.add_argument("--action", type=str, required=True, help="Action")
+ parser.add_argument("--config", type=str, required=True, help="Path to the config file")
+ parser.add_argument("--output-path", type=str, required=False, help="Path to the output")
+ parser.add_argument("--dev", help="Developer mode", action="store_true")
+
+ args = parser.parse_args()
+ action = args.action
+ config = configparser.ConfigParser()
+
+ config_directory = args.config
+ if not os.path.abspath(config_directory):
+ config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory)
+
+ config.read(config_directory)
+ if args.output_path:
+ util.Settings.output_directory = args.output_path
+
+ validate_config(config)
+ generate_tokens.run(config)
+
+ if action == "mariadb" or action == "all":
+ generate_mariadb.run(config)
+ if action == "mongodb" or action == "all":
+ generate_mongodb.run(config)
+ if action == "rabbitmq" or action == "all":
+ generate_rabbitmq.run(config)
+ if action == "bind9" or action == "all":
+ generate_bind9.run(config, args.dev)
+ if action == "nginx" or action == "all":
+ generate_nginx.run(config, args.dev)
+ if action == "freeswitch" or action == "all":
+ generate_freeswitch.run(config)
+ if action == "kamailio" or action == "all":
+ generate_kamailio.run(config)
+ if action == "metrics" or action == "all":
+ generate_metrics.run(config)
+ if action == "mail_relay" or action == "all":
+ generate_mail_relay.run(config)
+ if action == "cert" or action == "all":
+ generate_cert.run(config)
+ if action == "env" or action == "all":
+ generate_env.run(config)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..ce22a0a
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,20 @@
+from setuptools import setup, find_packages
+setup(
+ name='conpeek_setup',
+ version='0.1.0',
+ packages=find_packages(),
+ include_package_data=True,
+ description='Conpeek Setup',
+ classifiers=[
+ 'Programming Language :: Python :: 3',
+ 'License :: OSI Approved :: MIT License',
+ 'Operating System :: OS Independent',
+ ],
+ python_requires='>=3.6',
+ entry_points={
+ 'console_scripts': [
+ 'conpeek_setup=conpeek_setup.main:main',
+ ],
+ },
+ install_requires=['']
+)
\ No newline at end of file
diff --git a/templates/basic_indexes_tenant_data.json b/templates/basic_indexes_tenant_data.json
new file mode 100644
index 0000000..1c61eb5
--- /dev/null
+++ b/templates/basic_indexes_tenant_data.json
@@ -0,0 +1,78 @@
+{
+ "session_server_name": "sessionserver1",
+ "state_machine_server_name": "statemachine01",
+ "private_api_port": 9100,
+ "public_api_port": 9000,
+ "wss_port": 9200,
+ "monitoring_initial_api_port": 9300,
+ "monitoring_initial_wss_port": 9400,
+ "file_server_name": "fileserver1",
+ "file_server_api_port": 10000,
+ "cdr_server_name": "cdrserver1",
+ "cdr_server_api_port": 9700,
+ "api_tenant_name": "tenantapiserver1",
+ "api_tenant_port": 7100,
+ "api_tenant_web_polling_name": "poll1",
+ "api_tenant_web_polling_port": 7200,
+ "operator_api_server_response_name": "operatorapiserver1",
+ "operator_api_server_response_port": 7400,
+ "report_server_name": "reportserver1",
+ "report_server_api_port": 13000,
+ "local_contact_db_name": "localcontactdb1",
+ "local_contact_db_api_port": 8600,
+ "local_contact_db_public_api_port": 14700,
+ "hubspot_server_name": "hubspotserver1",
+ "hubspot_server_api_port": 8300,
+ "hubspot_server_public_api_port": 8400,
+ "messaging_server_name": "messagingserver1",
+ "messaging_server_public_api_port": 15500,
+ "messaging_server_private_api_port": "15200",
+ "messaging_server_wss_port": "15100",
+ "ticketing_server_name": "ticketingserver1",
+ "ticketing_server_api_port": "16100",
+ "gus_server_name": "gusserver1",
+ "gus_server_public_api_port": "10400",
+ "meets_server_name": "meets",
+ "meets_server_port": "7001",
+ "tenant_login_api_server_name": "tenant-login-api",
+ "tenant_login_api_server_port": 7000,
+ "tenant_login_api_server_service_name": "tenantloginapiserver1",
+ "user_notification_server_name": "usernotification1",
+ "user_notification_server_wss_port": 8100,
+ "freeswitch_name": "fs1",
+ "tenant_plugin_api_server_name": "tenantpluginapiserver1",
+ "tenant_plugin_api_server_initial_application_port": "7600",
+ "tenant_bss_api_server_name": "bssserver1",
+ "tenant_bss_api_server_initial_application_port": "8000",
+ "mongo_replset_name": "conpeek",
+ "mongo_domain_name": "mongo1",
+ "gateway_server_name": "gw1",
+ "gw_pool_name": "gwpool1",
+ "sms_server_name": "smsserver1",
+ "sms_server_api_port": "14600",
+ "sms_server_public_api_port": "14500",
+ "bot_server_id": 1,
+ "bot_server_name": "botserver1",
+ "bot_server_api_port": "16700",
+ "bot_train_server_id": 1,
+ "bot_train_server_name": "bottrainserver1",
+ "kamailio_name": "kamailio1",
+ "fs_pool_name": "fspool1",
+ "facebook_server_name": "facebookserver1",
+ "facebook_server_api_port": "7800",
+ "facebook_server_public_api_port": "15600",
+ "mailbox_server_name": "mailboxserver1",
+ "mailbox_server_api_port": "11700",
+ "mailbox_server_public_api_port": "16400",
+ "provisioning_server_name": "provisioning1",
+ "provisioning_server_initial_application_port": 7700,
+ "provisioning_server_initial_management_port": 4600,
+ "messagebird_server_name": "messagebirdserver1",
+ "messagebird_server_public_api_port": 11800,
+ "messagebird_server_api_port": 11900,
+ "messagebird_server_private_api_port": 12000,
+ "coturn_min_port": 12288,
+ "coturn_max_port": 16383,
+ "coturn_realm": "conpeek.com"
+
+}
diff --git a/templates/bind9/access_zone.tmpl b/templates/bind9/access_zone.tmpl
new file mode 100644
index 0000000..76ed559
--- /dev/null
+++ b/templates/bind9/access_zone.tmpl
@@ -0,0 +1,105 @@
+$TTL 300
+@ IN SOA ns1.{{ app_installation_domain }}. root.{{ app_installation_domain }}. (
+ {{ serial_number }} ; serial
+ 300 ; refresh, seconds
+ 300 ; retry, seconds
+ 300 ; expire, seconds
+ 300 ) ; minimum TTL, seconds
+
+@ IN NS ns1.{{ app_installation_domain }}.
+ns1 IN A {{ access_ip }}
+
+
+; SIP for Kamailio components
+
+sip-kamailio1 IN A {{ access_ip }};
+*.sip-kamailio1 IN A {{ access_ip }};
+
+
+ntp IN A {{ access_ip }}
+docs IN A {{ access_ip }}
+
+; NAPTR
+line-fspool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.line-fspool1;
+
+; SRV fs1
+_sip._udp.line-fspool1 SRV 10 100 5070 line-fs1
+
+; A fs1
+{% if kamailio_nat %}line-fs1 IN A {{ core_ip }};{% else %}line-fs1 IN A {{ access_ip }};{% endif %}
+verto-routing-fs1 IN A {{ access_ip }};
+verto-stun-fs1 IN A {{ access_ip }};
+verto-no-stun-fs1 IN A {{ access_ip }};
+verto-ext-stun-fs1 IN A {{ access_ip }};
+verto-ext-no-stun-fs1 IN A {{ access_ip }};
+stun-fs1 IN A {{ access_ip }};
+
+gen-provisioning1 IN A {{ access_ip }};
+files IN A {{ access_ip }};
+f4c27bf2-912b-4aa7-ade9-b158bebcb349-prov IN A {{ access_ip }};
+
+app IN A {{ access_ip }};
+{% if developer_mode %}app-prod IN A {{ access_ip }};{% endif -%}
+desk IN A {{ access_ip }};
+operator IN A {{ access_ip }};
+systemapp IN A {{ access_ip }};
+device IN A {{ access_ip }};
+wallboard IN A {{ access_ip }};
+tenant-login-api IN A {{ access_ip }};
+invitation IN A {{ access_ip }};
+meets IN A {{ access_ip }};
+poll1 IN A {{ access_ip }};
+tenantpluginapiserver1 IN A {{ access_ip }};
+public-api-sessionserver1 IN A {{ access_ip }};
+public-api-mailboxserver1 IN A {{ access_ip }};
+wss-sessionserver1 IN A {{ access_ip }};
+wss-monitoring-sessionserver1 IN A {{ access_ip }};
+api-monitoring-sessionserver1 IN A {{ access_ip }};
+api-messagingserver1 IN A {{ access_ip }};
+wss-messagingserver1 IN A {{ access_ip }};
+api-botserver1 IN A {{ access_ip }};
+api-tenantapiserver1 IN A {{ access_ip }};
+api-bssserver1 IN A {{ access_ip }};
+api-gusserver1 IN A {{ access_ip }};
+api-teamviewerserver1 IN A {{ access_ip }};
+api-localcontactdb1 IN A {{ access_ip }};
+public-api-localcontactdb1 IN A {{ access_ip }};
+api-idenfyserver1 IN A {{ access_ip }};
+api-hubspotserver1 IN A {{ access_ip }};
+api-system IN A {{ access_ip }};
+api-operatorapiserver1 IN A {{ access_ip }};
+api-fileserver1 IN A {{ access_ip }};
+api-cdrserver1 IN A {{ access_ip }};
+api-reportserver1 IN A {{ access_ip }};
+api-messagingserver1 IN A {{ access_ip }};
+api-messagebirdserver1 IN A {{ access_ip }};
+api-facebookserver1 IN A {{ access_ip }};
+api-smsserver1 IN A {{ access_ip }};
+public-api-smsserver1 IN A {{ access_ip }};
+wss-messagingserver1 IN A {{ access_ip }};
+api-bookingsync-messagingserver1 IN A {{ access_ip }};
+public-api-bookingsync-messagingserver1 IN A {{ access_ip }};
+wss-usernotification1 IN A {{ access_ip }};
+{{ app_installation_domain }} IN MX 20 {{ app_installation_domain }}
+{{ app_installation_domain }} IN A {{ access_ip }};
+docs IN A {{ access_ip }};
+grafana IN A {{ access_ip }};
+api-ticketingserver1 IN A {{ access_ip }};
+api-mailboxserver1 IN A {{ access_ip }};
+api-mailboxserver1 IN A {{ access_ip }};
+desk IN A {{ access_ip }};
+conpeek-exporter IN A {{ access_ip }};
+statsd-exporter IN A {{ access_ip }};
+statsd-api-exporter IN A {{ access_ip }};
+ping-exporter IN A {{ access_ip }};
+node-exporter IN A {{ access_ip }};
+freeswitch-exporter IN A {{ access_ip }};
+process-exporter IN A {{ access_ip }};
+docker-exporter IN A {{ access_ip }};
+
+;releay configuration
+* IN TXT "v=spf1 a mx ip4:{{ access_ip }} ~all"
+@ IN TXT "v=spf1 a mx ip4:{{ access_ip }} ~all"
+* IN MX 20 mail
+@ IN MX 20 mail
+mail IN A {{ access_ip }};
diff --git a/templates/bind9/named.conf b/templates/bind9/named.conf
new file mode 100644
index 0000000..1af7f73
--- /dev/null
+++ b/templates/bind9/named.conf
@@ -0,0 +1,13 @@
+// This is the primary configuration file for the BIND DNS server named.
+//
+// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
+// structure of BIND configuration files in Debian, *BEFORE* you customize
+// this configuration file.
+//
+// If you are just adding zones, please do that in /etc/bind/named.conf.local
+
+include "/etc/bind/named.conf.options";
+include "/etc/bind/named.conf.local";
+include "/etc/bind/named.conf.access_network";
+include "/etc/bind/named.conf.system_network";
+include "/etc/bind/named.conf.default-zones";
diff --git a/templates/bind9/named.conf.access_network.tmpl b/templates/bind9/named.conf.access_network.tmpl
new file mode 100644
index 0000000..e0378b4
--- /dev/null
+++ b/templates/bind9/named.conf.access_network.tmpl
@@ -0,0 +1,5 @@
+zone "{{ NETWORK_DOMAIN }}" IN {
+ type master;
+ file "db.{{ NETWORK_DOMAIN }}";
+ allow-update { none; };
+};
diff --git a/templates/bind9/named.conf.options.tmpl b/templates/bind9/named.conf.options.tmpl
new file mode 100644
index 0000000..692ed73
--- /dev/null
+++ b/templates/bind9/named.conf.options.tmpl
@@ -0,0 +1,18 @@
+options {
+ directory "/var/cache/bind";
+
+ forwarders {
+ {{ forward_dns }}
+ };
+
+ recursion yes;
+
+ allow-query { any; };
+ allow-recursion { localhost; localnets; };
+ allow-transfer { none; };
+
+ dnssec-validation auto;
+
+ auth-nxdomain no; # conform to RFC1035
+ listen-on-v6 { any; };
+};
diff --git a/templates/bind9/named.conf.system_network.tmpl b/templates/bind9/named.conf.system_network.tmpl
new file mode 100644
index 0000000..e38aeae
--- /dev/null
+++ b/templates/bind9/named.conf.system_network.tmpl
@@ -0,0 +1,6 @@
+zone "{{ NETWORK_DOMAIN }}" IN {
+ type master;
+ file "db.{{ NETWORK_DOMAIN }}";
+ allow-update { none; };
+ check-names ignore;
+};
diff --git a/templates/bind9/system_zone.tmpl b/templates/bind9/system_zone.tmpl
new file mode 100644
index 0000000..2de94a2
--- /dev/null
+++ b/templates/bind9/system_zone.tmpl
@@ -0,0 +1,42 @@
+$TTL 300
+@ IN SOA ns1.{{ system_app_installation_domain }}. root.{{ system_app_installation_domain }}. (
+ {{ serial_number }} ; serial
+ 300 ; refresh, seconds
+ 300 ; retry, seconds
+ 300 ; expire, seconds
+ 300 ) ; minimum TTL, seconds
+
+
+@ IN NS ns1.{{ system_app_installation_domain }}.
+ns1 IN A {{ core_ip }}
+
+; NAPTR
+gateway-fspool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.gateway-fspool1;
+
+; SRV fs1
+_sip._udp.gateway-fspool1 SRV 10 100 5080 gateway-fs1
+
+; A fs1
+gateway-fs1 IN A {{ core_ip }};
+mi-fs1 IN A {{ core_ip }};
+api-fs1 IN A {{ core_ip }};
+; NAPTR
+internal-gwpool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.internal-gwpool1;
+_sip._udp.internal-gwpool1 SRV 10 100 5090 internal-gw1
+
+internal-gw1 IN A {{ core_ip }};
+mi-gw1 IN A {{ core_ip }};
+
+mi-tenantloginapiserver1 IN A {{ core_ip }};
+private-api-sessionserver1 IN A {{ core_ip }};
+mi-sessionserver1 IN A {{ core_ip }};
+private-api-api-monitoring-sessionserver1 IN A {{ core_ip }};
+mi-api-monitoring-sessionserver1 IN A {{ core_ip }};
+mi-tenantapiserver1 IN A {{ core_ip }};
+mi-systemapiserver1 IN A {{ core_ip }};
+mi-operatorapiserver1 IN A {{ core_ip }};
+mi-fileserver1 IN A {{ core_ip }};
+mi-cdrserver1 IN A {{ core_ip }};
+mi-localcontactdb1 IN A {{ core_ip }};
+mi-hubspotserver1 IN A {{ core_ip }};
+mongo-mongo1 IN A {{ core_ip }};
diff --git a/templates/compose_dev/10_proxy_compose.yml b/templates/compose_dev/10_proxy_compose.yml
new file mode 100644
index 0000000..22c3248
--- /dev/null
+++ b/templates/compose_dev/10_proxy_compose.yml
@@ -0,0 +1,47 @@
+version: '3.8'
+
+x-default_config: &default_config
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+
+services:
+ frontend:
+ image: ${REGISTRY_NAME}frontend:${TAG}
+ container_name: frontend
+ network_mode: host
+ volumes:
+ - ${CONFIG_FOLDER}/custom/frontend:/custom
+ - ${CONFIG_FOLDER}/custom/frontend/custom.sh:/docker-entrypoint.d/90-conpeek-custom.sh
+ - ${CONFIG_FOLDER}/nginx/frontend:/srv/conpeek/app
+ - ${CONFIG_FOLDER}/nginx/frontend/app_desk:/srv/conpeek/app_desk
+ - ${CONFIG_FOLDER}/nginx/frontend/app_tenant:/srv/conpeek/app_tenant
+ - ${CONFIG_FOLDER}/nginx/frontend/app_operator:/srv/conpeek/app_operator
+ - ${CONFIG_FOLDER}/nginx/frontend/app_wallboard:/srv/conpeek/app_wallboard
+ - ${SOURCE_CODE_LOCATION}/apis:/srv/conpeek/apis
+ - ${SOURCE_CODE_LOCATION}/documentation/sdk/site:/srv/conpeek/docs/sdk
+ - ${SOURCE_CODE_LOCATION}/documentation/api/v1_3/site:/srv/conpeek/docs/api_v1_3
+ - ${SOURCE_CODE_LOCATION}/documentation/instruction/site:/srv/conpeek/docs/instruction
+ - ${SOURCE_CODE_LOCATION}/documentation/troubleshooting/site:/srv/conpeek/docs/troubleshooting
+ - ${NGINX_CONF_LOCATION}/nginx.conf_frontend:/etc/nginx/nginx.conf
+ - ${NGINX_CONF_LOCATION}/frontend:/etc/nginx/conf.d
+ <<: *default_config
+ reverse_proxy:
+ image: docker.io/library/nginx:latest
+ network_mode: host
+ container_name: reverse_proxy
+ volumes:
+ - ${NGINX_CONF_LOCATION}/nginx.conf:/etc/nginx/nginx.conf
+ - ${NGINX_CONF_LOCATION}/reverse_proxy:/etc/nginx/sites-enabled
+ - type: bind
+ source: ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt
+ target: /etc/ssl/certs/conpeek_ssl.crt
+ - type: bind
+ source: ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key
+ target: /etc/ssl/private/conpeek_ssl.key
+ command: ['nginx', '-g daemon off;']
+ <<: *default_config
+
diff --git a/templates/compose_dev/20_server_compose.yml b/templates/compose_dev/20_server_compose.yml
new file mode 100644
index 0000000..ab609dd
--- /dev/null
+++ b/templates/compose_dev/20_server_compose.yml
@@ -0,0 +1,93 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+
+services:
+ api_tenant_login:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: api_tenant_login
+ entrypoint: ["python", "apis/api_tenant_login/main.py"]
+ command: ['-P', '7000', '-n', '${API_TENANT_LOGIN_SERVER_NAME}']
+ <<: *default_config
+ api_operator:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: api_operator
+ entrypoint: ["python", "apis/api_operator/main.py"]
+ command: ['-P', '7400', '-n', '${API_OPERATOR_SERVER_NAME}']
+ <<: *default_config
+ sms_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: sms_server
+ entrypoint: [ "python", "services/messaging/sms_server/main.py" ]
+ command: ['-n', '${SMS_SERVER_NAME}']
+ <<: *default_config
+ facebook_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: facebook_server
+ entrypoint: [ "python", "services/messaging/facebook_server/main.py" ]
+ command: ['-n', '${FACEBOOK_SERVER_NAME}']
+ <<: *default_config
+ gus_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: gus_server
+ entrypoint: [ "python", "services/gus_server/main.py" ]
+ command: ['-n', '${GUS_SERVER_NAME}']
+ <<: *default_config
+ hubspot_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: hubspot_server
+ entrypoint: [ "python", "contact_database/hubspot/hubspot_server/main.py" ]
+ command: ['-n', '${HUBSPOT_SERVER_NAME}']
+ <<: *default_config
+ user_notification_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: user_notification_server
+ entrypoint: [ "python", "services/user_notification_server/main.py" ]
+ command: ['-n', '${USER_NOTIFICATION_NAME}']
+ <<: *default_config
+ ticketing_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: ticketing_server
+ entrypoint: [ "python", "services/ticketing_server/main.py" ]
+ command: [ '-n', '${TICKETING_SERVER_NAME}' ]
+ <<: *default_config
+ meets_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: meets_server
+ entrypoint: [ "python", "services/meets_server/main.py" ]
+ command: [ '-n', '${MEETS_SERVER_NAME}' ]
+ <<: *default_config
+ mail_relay:
+ image: ${REGISTRY_NAME}mail_transport_agent:${TAG}
+ container_name: mail_relay
+ volumes:
+ - ${CONFIG_FOLDER}/mail_relay/main.cf:/etc/postfix/main.cf
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key
+ <<: *default_config
+ bot_server:
+ image: ${REGISTRY_NAME}python_dev:bot_server_latest
+ container_name: bot_server
+ entrypoint: [ "python", "services/bot_server/main.py" ]
+ command: [ '-n', '${BOT_SERVER_NAME}' ]
+ volumes:
+ - /data/conpeek_data:/data
+ <<: *default_config
+ bot_train_server:
+ image: ${REGISTRY_NAME}python_dev:bot_train_server_latest
+ container_name: bot_train_server
+ entrypoint: [ "python", "services/bot_train_server/main.py" ]
+ command: [ '-n', '${BOT_TRAIN_SERVER_NAME}' ]
+ volumes:
+ - /data/conpeek_data:/data
+ <<: *default_config
diff --git a/templates/compose_dev/30_tenant_compose.yml b/templates/compose_dev/30_tenant_compose.yml
new file mode 100644
index 0000000..0bf9c3c
--- /dev/null
+++ b/templates/compose_dev/30_tenant_compose.yml
@@ -0,0 +1,138 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+
+services:
+ api_tenant:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: api_tenant
+ entrypoint: [ "python", "apis/api_tenant/main.py" ]
+ command: ['-n', '${API_TENANT_SERVER_NAME}', '-P', '${API_TENANT_PORT}']
+ <<: *default_config
+ session_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: session_server
+ entrypoint: [ "python", "services/session_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /data/conpeek_data:/data
+ - /tmp:/tmp
+ report_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: report_server
+ entrypoint: [ "python", "services/report_server/main.py" ]
+ command: ['-n', '${REPORT_SERVER_NAME}']
+ mem_limit: 2G
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /tmp:/tmp
+ file_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: file_server
+ entrypoint: [ "python", "services/file_server/main.py" ]
+ command: ['-n', '${FILE_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /tmp:/tmp
+ - /data/recording:/recording
+ - /files/recording:/data
+ monitoring_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: monitoring_server
+ entrypoint: [ "python", "services/monitoring_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ messaging_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: messaging_server
+ entrypoint: [ "python", "services/messaging/messaging_server/main.py" ]
+ command: ['-n', '${MESSAGING_SERVER_NAME}']
+ <<: *default_config
+ mailbox_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: mailbox_server
+ entrypoint: [ "python", "services/messaging/mailbox_server/main.py" ]
+ command: ['-n', '${MAILBOX_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /tmp:/tmp
+ - /data/conpeek_data:/data
+ messagebird_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: messagebird_server
+ entrypoint: [ "python", "services/messaging/messagebird_server/main.py" ]
+ command: ['-n', '${MESSAGEBIRD_SERVER_NAME}']
+ <<: *default_config
+ bss_api_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: bss_api_server
+ entrypoint: [ "python", "services/bss_api_server/main.py" ]
+ command: ['-n', '${BSS_SERVER_NAME}', '-P', '${BSS_SERVER_PORT}']
+ <<: *default_config
+ cdr_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: cdr_server
+ entrypoint: [ "python", "services/cdr_server/main.py" ]
+ command: ['-n', '${CDR_SERVER_NAME}']
+ <<: *default_config
+ local_contact_db_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: local_contact_db_server
+ entrypoint: [ "python", "contact_database/local/local_contact_db_server/main.py" ]
+ command: ['-n', '${LOCAL_CONTACT_DB_SERVER_NAME}']
+ <<: *default_config
+ provisioning_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: provisioning_server
+ entrypoint: [ "python", "services/provisioning_server/main.py" ]
+ command: ['-n', '${PROVISIONING_SERVER_NAME}', '-P', '${PROVISIONING_SERVER_PORT}']
+ <<: *default_config
+ api_tenant_plugin:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: api_tenant_plugin
+ entrypoint: [ "python", "apis/api_tenant_plugin/main.py" ]
+ command: ['-n', '${API_TENANT_PLUGIN_SERVER_NAME}', '-P', '${API_TENANT_PLUGIN_SERVER_PORT}']
+ <<: *default_config
diff --git a/templates/compose_dev/40_calling_compose.yml b/templates/compose_dev/40_calling_compose.yml
new file mode 100644
index 0000000..f42a7ba
--- /dev/null
+++ b/templates/compose_dev/40_calling_compose.yml
@@ -0,0 +1,110 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+
+services:
+ fs_amqp_connector:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: fs_amqp_connector
+ entrypoint: ["python", "services/fs_amqp_connector/main.py"]
+ command: ['-n', '${FS_NAME}']
+ <<: *default_config
+ fs_directory_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: fs_directory_server
+ entrypoint: [ "python", "services/fs_directory_server/main.py" ]
+ command: ['-n', '${FS_NAME}']
+ <<: *default_config
+ gateway_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: gateway_server
+ entrypoint: [ "python", "services/gateway_server/main.py" ]
+ command: ['-n', '${GW_NAME}']
+ <<: *default_config
+ kamailio:
+ image: ${REGISTRY_NAME}kamailio:clear
+ container_name: kamailio
+ command: ['-l', 'udp:${INTERNAL_IP}:5060', '-l', 'tcp:${INTERNAL_IP}:5060', '-l', 'tls:${INTERNAL_IP}:5061']
+ volumes:
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek.key
+ - ${CONFIG_FOLDER}/kamailio/kamailio_server.py:/usr/local/conpeek/kamailio/kamailio_server.py
+ - ${CONFIG_FOLDER}/kamailio/kamailio.cfg:/usr/local/conpeek/kamailio/kamailio.cfg
+ - ${CONFIG_FOLDER}/kamailio/kamailio-python.cfg:/etc/kamailio/kamailio-python.cfg
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ freeswitch:
+ image: ${REGISTRY_NAME}freeswitch:v1.10.11
+ container_name: freeswitch
+ volumes:
+ - ${CONFIG_FOLDER}/freeswitch/conf:/usr/local/freeswitch/conf
+ - /tmp:/tmp
+ - /data/recording:/recording
+ - /data/conpeek_data:/data
+ - /data/pcaps:/data/pcaps
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ coturn:
+ image: docker.io/coturn/coturn
+ container_name: coturn
+ network_mode: host
+ environment:
+ - TURNSERVER_ENABLED=1
+ command: [ '-n', '--listening-ip=${INTERNAL_IP}', '--min-port=${COTURN_MIN_PORT}', '--max-port=${COTURN_MAX_PORT}', '--fingerprint', '--use-auth-secret', '--static-auth-secret=${COTURN_STATIC_SECRET}', '--realm=${COTURN_REALM}', '--no-stun', '--no-tlsv1', '--no-tlsv1_1', '--relay-ip=${INTERNAL_IP}' ]
+ <<: *default_config
+ fs_amd_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: fs_amd_server
+ entrypoint: [ "python", "services/fs_amd_server/main.py" ]
+ command: [ '-n', '${FS_NAME}', '-i', 'lo', '--save-recording=0' ]
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ cap_add:
+ - NET_ADMIN
+ - NET_RAW
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /data/recording:/recording
+ fs_bot_recorder:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: fs_bot_recorder
+ command: ['-n', '${FS_NAME}', '-i', 'lo', '--deep-logging=1', '--save-recording=1']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+ - /data/recording:/recording
diff --git a/templates/compose_dev/50_statistic_compose.yml b/templates/compose_dev/50_statistic_compose.yml
new file mode 100644
index 0000000..5f1d4c0
--- /dev/null
+++ b/templates/compose_dev/50_statistic_compose.yml
@@ -0,0 +1,51 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek
+
+services:
+ project_statistic_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: project_statistics_server
+ entrypoint: [ "python", "services/project_statistics_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ ivr_statistics_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: ivr_statistics_server
+ entrypoint: [ "python", "services/ivr_statistics_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ voice_campaign_statistics_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: voice_campaign_statistics_server
+ entrypoint: [ "python", "services/voice_campaign_statistics_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ consultant_statistics_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: consultant_statistics_server
+ entrypoint: [ "python", "services/consultant_statistics_server/main.py" ]
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ conversation_statistics_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: conversation_statistics_server
+ entrypoint: [ "python", "services/conversation_statistics_server/main.py" ]
+ command: ['-n', '${MESSAGING_SERVER_NAME}']
+ <<: *default_config
+ ticketing_statistics_server:
+ image: ${REGISTRY_NAME}python_dev:${TAG}
+ container_name: ticketing_statistics_server
+ entrypoint: [ "python", "services/ticketing_statistics_server/main.py" ]
+ command: ['-n', '${TICKETING_SERVER_NAME}']
+ <<: *default_config
\ No newline at end of file
diff --git a/templates/compose_dev/60_metrics_compose.yml b/templates/compose_dev/60_metrics_compose.yml
new file mode 100644
index 0000000..109fef7
--- /dev/null
+++ b/templates/compose_dev/60_metrics_compose.yml
@@ -0,0 +1,58 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ log-opt:
+ max-size: "5m"
+ max-file: "3"
+
+services:
+ node_exporter:
+ image: docker.io/prom/node-exporter:latest
+ container_name: node_exporter
+ command:
+ - '--path.procfs=/host/proc'
+ - '--path.rootfs=/rootfs'
+ - '--path.sysfs=/host/sys'
+ - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)(2278805|/)'
+ - '--web.config.file=/etc/node_exporter/config.yml'
+ - '--web.listen-address=:9854'
+ volumes:
+ - /proc:/host/proc:ro
+ - /sys:/host/sys:ro
+ - /:/rootfs:ro
+ - ${CONFIG_FOLDER}/metrics/node_exporter.yml:/etc/node_exporter/config.yml
+ <<: *default_config
+ statsd_exporter:
+ image: docker.io/statsd/statsd:latest
+ container_name: statsd
+ command:
+ - '--web.listen-address=${INTERNAL_IP}:9851'
+ - '--statsd.listen-udp=127.0.0.1:9852'
+ - '--statsd.listen-tcp=127.0.0.1:9852'
+ - '--log.level=error'
+ - '--web.telemetry-path=/QuFreT5ESqu8d2DsxpyH'
+ <<: *default_config
+ docker_exporter:
+ image: gcr.io/cadvisor/cadvisor:latest
+ container_name: docker_exporter
+ command:
+ - '--port=9857'
+ - '--podman=unix:///var/run/podman/podman.sock'
+ volumes:
+ - /:/rootfs:ro
+ - /var/run:/var/run:ro
+ - /sys:/sys:ro
+ - /var/lib/docker/:/var/lib/docker:ro
+ - /dev/disk/:/dev/disk:ro
+ <<: *default_config
+ prometheus_exporter:
+ image: ${REGISTRY_NAME}prometheus_exporter:${TAG}
+ container_name: prometheus_exporter
+ command: [ '-n', '${PROMETHEUS_EXPORTER_NAME}' ]
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ <<: *default_config
\ No newline at end of file
diff --git a/templates/compose_dev/notatki b/templates/compose_dev/notatki
new file mode 100644
index 0000000..9df3847
--- /dev/null
+++ b/templates/compose_dev/notatki
@@ -0,0 +1,38 @@
+dla dev:
+
+1. dodatkowe directory: `/files/conpeek_setup/nginx/frontend` - linkowane jest tutaj `/data/conpeek/web/app`
+2. dodatkowy wpis w pliku config.env: `SOURCE_CODE_LOCATION` - domyślnie powinno być do `/data/conpeek`
+3. pobranie exta z naszego cepha
+
+```
+aws configure set aws_access_key_id KLFTL3QDGULEC53UDWAV
+aws confifure set aws_secres_access_key P6ojz6CFWAtAUvGfsFFIwx2vdzqLFuTjcdJYEz4
+aws configure set s3.endpoint_url 10.103.10.1:7480
+aws s3 cp s3://build-static-files/extjs/7.4.0.45/ext.tar.gz . --endpoint=http://10.103.10.1:7480
+
+tar -xzvf ext.tar.gz
+rm -f ext.tar.gz
+```
+
+4. instalator powinien budować frontend:
+
+```
+export OPENSSL_CONF=/dev/null
+mkdir /opt/repo
+chown -R developer:super /opt/repo
+chmod 775 /opt/repo
+cd ${SOURCE_CODE_LOCATION}/web/app/app_tenant
+sencha app build production
+sencha app build development
+cd ${SOURCE_CODE_LOCATION}/web/app/app_operator
+sencha app build production
+sencha app build development
+cd ${SOURCE_CODE_LOCATION}/web/app/app_desk
+sencha app build production
+sencha app build development
+cd ${SOURCE_CODE_LOCAITON}/web/app/app_wallboard
+sencha app build production
+sencha app build development
+```
+
+5. dodać logowanie do s3 przy instalacji developerskiej
\ No newline at end of file
diff --git a/templates/compose_prod/10_proxy_compose.yml b/templates/compose_prod/10_proxy_compose.yml
new file mode 100644
index 0000000..4becf46
--- /dev/null
+++ b/templates/compose_prod/10_proxy_compose.yml
@@ -0,0 +1,37 @@
+version: '3.8'
+
+x-default_config: &default_config
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+
+services:
+ frontend:
+ image: ${REGISTRY_NAME}/frontend:${TAG}
+ container_name: frontend
+ network_mode: host
+ volumes:
+ - ${NGINX_CONF_LOCATION}/nginx.conf_frontend:/etc/nginx/nginx.conf
+ - ${NGINX_CONF_LOCATION}/frontend:/etc/nginx/conf.d
+ - ${CONFIG_FOLDER}/custom/frontend:/custom
+ - ${CONFIG_FOLDER}/custom/frontend/custom.sh:/docker-entrypoint.d/90-conpeek-custom.sh
+ <<: *default_config
+ reverse_proxy:
+ image: docker.io/library/nginx:latest
+ network_mode: host
+ container_name: reverse_proxy
+ volumes:
+ - ${NGINX_CONF_LOCATION}/nginx.conf:/etc/nginx/nginx.conf
+ - ${NGINX_CONF_LOCATION}/reverse_proxy:/etc/nginx/sites-enabled
+ - type: bind
+ source: ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt
+ target: /etc/ssl/certs/conpeek_ssl.crt
+ - type: bind
+ source: ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key
+ target: /etc/ssl/private/conpeek_ssl.key
+ command: ['nginx', '-g daemon off;']
+ <<: *default_config
+
diff --git a/templates/compose_prod/20_server_compose.yml b/templates/compose_prod/20_server_compose.yml
new file mode 100644
index 0000000..1f58f57
--- /dev/null
+++ b/templates/compose_prod/20_server_compose.yml
@@ -0,0 +1,95 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+
+services:
+ api_tenant_login:
+ image: ${REGISTRY_NAME}/api_tenant_login:${TAG}
+ container_name: api_tenant_login
+ command: ['-P', '7000', '-n', '${API_TENANT_LOGIN_SERVER_NAME}']
+ <<: *default_config
+ api_operator:
+ image: ${REGISTRY_NAME}/api_operator:${TAG}
+ container_name: api_operator
+ command: ['-P', '7400', '-n', '${API_OPERATOR_SERVER_NAME}']
+ <<: *default_config
+ sms_server:
+ image: ${REGISTRY_NAME}/sms_server:${TAG}
+ container_name: sms_server
+ command: ['-n', '${SMS_SERVER_NAME}']
+ <<: *default_config
+ facebook_server:
+ image: ${REGISTRY_NAME}/facebook_server:${TAG}
+ container_name: facebook_server
+ command: ['-n', '${FACEBOOK_SERVER_NAME}']
+ <<: *default_config
+ gus_server:
+ image: ${REGISTRY_NAME}/gus_server:${TAG}
+ container_name: gus_server
+ command: ['-n', '${GUS_SERVER_NAME}']
+ <<: *default_config
+ hubspot_server:
+ image: ${REGISTRY_NAME}/hubspot_server:${TAG}
+ container_name: hubspot_server
+ command: ['-n', '${HUBSPOT_SERVER_NAME}']
+ <<: *default_config
+ user_notification_server:
+ image: ${REGISTRY_NAME}/user_notification_server:${TAG}
+ container_name: user_notification_server
+ command: ['-n', '${USER_NOTIFICATION_NAME}']
+ <<: *default_config
+ ticketing_server:
+ image: ${REGISTRY_NAME}/ticketing_server:${TAG}
+ container_name: ticketing_server
+ command: [ '-n', '${TICKETING_SERVER_NAME}' ]
+ <<: *default_config
+ meets_server:
+ image: ${REGISTRY_NAME}/meets_server:${TAG}
+ container_name: meets_server
+ command: [ '-n', '${MEETS_SERVER_NAME}' ]
+ <<: *default_config
+ mail_relay:
+ image: ${REGISTRY_NAME}/mail_transport_agent:${TAG}
+ container_name: mail_relay
+ volumes:
+ - ${CONFIG_FOLDER}/mail_relay/main.cf:/etc/postfix/main.cf
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key
+ <<: *default_config
+ bot_server:
+ image: ${REGISTRY_NAME}/bot_server:${TAG}
+ container_name: bot_server
+ command: [ '-n', '${BOT_SERVER_NAME}' ]
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - /data/conpeek_data:/data
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ bot_train_server:
+ image: ${REGISTRY_NAME}/bot_train_server:${TAG}
+ container_name: bot_train_server
+ command: [ '-n', '${BOT_TRAIN_SERVER_NAME}' ]
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - /data/conpeek_data:/data
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
diff --git a/templates/compose_prod/30_tenant_compose.yml b/templates/compose_prod/30_tenant_compose.yml
new file mode 100644
index 0000000..e0c47bb
--- /dev/null
+++ b/templates/compose_prod/30_tenant_compose.yml
@@ -0,0 +1,125 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+
+services:
+ api_tenant:
+ image: ${REGISTRY_NAME}/api_tenant:${TAG}
+ container_name: api_tenant
+ command: ['-n', '${API_TENANT_SERVER_NAME}', '-P', '${API_TENANT_PORT}']
+ <<: *default_config
+ session_server:
+ image: ${REGISTRY_NAME}/session_server:${TAG}
+ container_name: session_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - /data/conpeek_data:/data
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /tmp:/tmp
+ report_server:
+ image: ${REGISTRY_NAME}/report_server:${TAG}
+ container_name: report_server
+ command: ['-n', '${REPORT_SERVER_NAME}']
+ mem_limit: 2G
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /tmp:/tmp
+ file_server:
+ image: ${REGISTRY_NAME}/file_server:${TAG}
+ container_name: file_server
+ command: ['-n', '${FILE_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /tmp:/tmp
+ - /data/recording:/recording
+ - /data/conpeek_data:/data
+ monitoring_server:
+ image: ${REGISTRY_NAME}/monitoring_server:${TAG}
+ container_name: monitoring_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ messaging_server:
+ image: ${REGISTRY_NAME}/messaging_server:${TAG}
+ container_name: messaging_server
+ command: ['-n', '${MESSAGING_SERVER_NAME}']
+ <<: *default_config
+ mailbox_server:
+ image: ${REGISTRY_NAME}/mailbox_server:${TAG}
+ container_name: mailbox_server
+ command: ['-n', '${MAILBOX_SERVER_NAME}']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /tmp:/tmp
+ - /data/conpeek_data:/data
+ messagebird_server:
+ image: ${REGISTRY_NAME}/messagebird_server:${TAG}
+ container_name: messagebird_server
+ command: ['-n', '${MESSAGEBIRD_SERVER_NAME}']
+ <<: *default_config
+ bss_api_server:
+ image: ${REGISTRY_NAME}/bss_api_server:${TAG}
+ container_name: bss_api_server
+ command: ['-n', '${BSS_SERVER_NAME}', '-P', '${BSS_SERVER_PORT}']
+ <<: *default_config
+ cdr_server:
+ image: ${REGISTRY_NAME}/cdr_server:${TAG}
+ container_name: cdr_server
+ command: ['-n', '${CDR_SERVER_NAME}']
+ <<: *default_config
+ local_contact_db_server:
+ image: ${REGISTRY_NAME}/local_contact_db_server:${TAG}
+ container_name: local_contact_db_server
+ command: ['-n', '${LOCAL_CONTACT_DB_SERVER_NAME}']
+ <<: *default_config
+ provisioning_server:
+ image: ${REGISTRY_NAME}/provisioning_server:${TAG}
+ container_name: provisioning_server
+ command: ['-n', '${PROVISIONING_SERVER_NAME}', '-P', '${PROVISIONING_SERVER_PORT}']
+ <<: *default_config
+ api_tenant_plugin:
+ image: ${REGISTRY_NAME}/api_tenant_plugin:${TAG}
+ container_name: api_tenant_plugin
+ command: ['-n', '${API_TENANT_PLUGIN_SERVER_NAME}', '-P', '${API_TENANT_PLUGIN_SERVER_PORT}']
+ <<: *default_config
+ api_tenant_web_polling:
+ image: ${REGISTRY_NAME}/api_tenant_web_polling:${TAG}
+ container_name: api_tenant_web_polling
+ command: ['-n', '${API_TENANT_WEB_POLLING_SERVER_NAME}', '-P', '${API_TENANT_WEB_POLLING_PORT}']
+ <<: *default_config
diff --git a/templates/compose_prod/40_calling_compose.yml b/templates/compose_prod/40_calling_compose.yml
new file mode 100644
index 0000000..f488a08
--- /dev/null
+++ b/templates/compose_prod/40_calling_compose.yml
@@ -0,0 +1,103 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+
+services:
+ fs_amqp_connector:
+ image: ${REGISTRY_NAME}/fs_amqp_connector:${TAG}
+ container_name: fs_amqp_connector
+ command: ['-n', '${FS_NAME}']
+ <<: *default_config
+ fs_directory_server:
+ image: ${REGISTRY_NAME}/fs_directory_server:${TAG}
+ container_name: fs_directory_server
+ command: ['-n', '${FS_NAME}']
+ <<: *default_config
+ gateway_server:
+ image: ${REGISTRY_NAME}/gateway_server:${TAG}
+ container_name: gateway_server
+ command: ['-n', '${GW_NAME}']
+ <<: *default_config
+ kamailio:
+ image: ${REGISTRY_NAME}/kamailio:clear
+ container_name: kamailio
+ command: ['-l', 'udp:${INTERNAL_IP}:5060', '-l', 'tcp:${INTERNAL_IP}:5060', '-l', 'tls:${INTERNAL_IP}:5061']
+ volumes:
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek.key
+ - ${CONFIG_FOLDER}/kamailio/kamailio_server.py:/usr/local/conpeek/kamailio/kamailio_server.py
+ - ${CONFIG_FOLDER}/kamailio/kamailio.cfg:/etc/kamailio.cfg
+ - ${CONFIG_FOLDER}/kamailio/kamailio-python.cfg:/etc/kamailio/kamailio-python.cfg
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ freeswitch:
+ image: ${REGISTRY_NAME}/freeswitch:${TAG}
+ container_name: freeswitch
+ volumes:
+ - ${CONFIG_FOLDER}/freeswitch/conf:/usr/local/freeswitch/conf
+ - /tmp:/tmp
+ - /data/recording:/recording
+ - /data/conpeek_data:/data
+ - /data/pcaps:/data/pcaps
+ - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt
+ - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ coturn:
+ image: docker.io/coturn/coturn:4.6.2
+ container_name: coturn
+ network_mode: host
+ environment:
+ - TURNSERVER_ENABLED=1
+ command: [ '-n', '--listening-ip=${INTERNAL_IP}', '--min-port=${COTURN_MIN_PORT}', '--max-port=${COTURN_MAX_PORT}', '--fingerprint', '--use-auth-secret', '--static-auth-secret=${COTURN_STATIC_SECRET}', '--realm=${COTURN_REALM}', '--no-stun', '--no-tlsv1', '--no-tlsv1_1', '--relay-ip=${INTERNAL_IP}' ]
+ <<: *default_config
+ fs_amd_server:
+ image: ${REGISTRY_NAME}/fs_amd_server:${TAG}
+ container_name: fs_amd_server
+ command: [ '-n', '${FS_NAME}', '-i', 'lo', '--save-recording=0' ]
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ cap_add:
+ - NET_ADMIN
+ - NET_RAW
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /data/recording:/recording
+ fs_bot_recorder:
+ image: ${REGISTRY_NAME}/fs_bot_recorder:${TAG}
+ container_name: fs_bot_recorder
+ command: ['-n', '${FS_NAME}', '-i', 'lo', '--deep-logging=1', '--save-recording=1']
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ - /data/recording:/recording
diff --git a/templates/compose_prod/50_statistic_compose.yml b/templates/compose_prod/50_statistic_compose.yml
new file mode 100644
index 0000000..66b3bf9
--- /dev/null
+++ b/templates/compose_prod/50_statistic_compose.yml
@@ -0,0 +1,46 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+
+services:
+ project_statistic_server:
+ image: ${REGISTRY_NAME}/project_statistics_server:${TAG}
+ container_name: project_statistics_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ ivr_statistics_server:
+ image: ${REGISTRY_NAME}/ivr_statistics_server:${TAG}
+ container_name: ivr_statistics_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ voice_campaign_statistics_server:
+ image: ${REGISTRY_NAME}/voice_campaign_statistics_server:${TAG}
+ container_name: voice_campaign_statistics_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ consultant_statistics_server:
+ image: ${REGISTRY_NAME}/consultant_statistics_server:${TAG}
+ container_name: consultant_statistics_server
+ command: ['-n', '${SESSION_SERVER_NAME}']
+ <<: *default_config
+ conversation_statistics_server:
+ image: ${REGISTRY_NAME}/conversation_statistics_server:${TAG}
+ container_name: conversation_statistics_server
+ command: ['-n', '${MESSAGING_SERVER_NAME}']
+ <<: *default_config
+ ticketing_statistics_server:
+ image: ${REGISTRY_NAME}/ticketing_statistics_server:${TAG}
+ container_name: ticketing_statistics_server
+ command: ['-n', '${TICKETING_SERVER_NAME}']
+ <<: *default_config
+
+
diff --git a/templates/compose_prod/60_metrics_compose.yml b/templates/compose_prod/60_metrics_compose.yml
new file mode 100644
index 0000000..a6b08dc
--- /dev/null
+++ b/templates/compose_prod/60_metrics_compose.yml
@@ -0,0 +1,45 @@
+version: '3.8'
+
+x-default_config: &default_config
+ network_mode: host
+ restart: always
+ env_file: ${ENV_FILE}
+ logging:
+ options:
+ max-size: "5m"
+ max-file: "3"
+
+services:
+ node_exporter:
+ image: docker.io/prom/node-exporter:v1.9.1
+ container_name: node_exporter
+ command:
+ - '--path.procfs=/host/proc'
+ - '--path.rootfs=/rootfs'
+ - '--path.sysfs=/host/sys'
+ - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)(2278805|/)'
+ - '--web.config.file=/etc/node_exporter/config.yml'
+ - '--web.listen-address=:9854'
+ volumes:
+ - /proc:/host/proc:ro
+ - /sys:/host/sys:ro
+ - /:/rootfs:ro
+ - ${CONFIG_FOLDER}/metrics/node_exporter.yml:/etc/node_exporter/config.yml
+ <<: *default_config
+ statsd_exporter:
+ image: docker.io/statsd/statsd:latest
+ container_name: statsd
+ command:
+ - '--web.listen-address=${INTERNAL_IP}:9851'
+ - '--statsd.listen-udp=127.0.0.1:9852'
+ - '--statsd.listen-tcp=127.0.0.1:9852'
+ - '--log.level=error'
+ - '--web.telemetry-path=/QuFreT5ESqu8d2DsxpyH'
+ <<: *default_config
+ prometheus_exporter:
+ image: ${REGISTRY_NAME}/prometheus_exporter:${TAG}
+ container_name: prometheus_exporter
+ command: [ '-n', '${PROMETHEUS_EXPORTER_NAME}' ]
+ volumes:
+ - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc
+ <<: *default_config
diff --git a/templates/env/basic_conpeek.ini b/templates/env/basic_conpeek.ini
new file mode 100644
index 0000000..cb63cd0
--- /dev/null
+++ b/templates/env/basic_conpeek.ini
@@ -0,0 +1,49 @@
+[RECORDING]
+RecordAllAudioRecording = no
+RecordAllVideoRecording = no
+RecordAllChatRecording = no
+EncryptRecording = no
+rocky =
+
+[SYSTEM]
+Name = conpeek
+LoggingLevel = DEBUG
+RecordingFilenameTemplate =
+VideoRecordingFilenameTemplate =
+SQLPoolRecycle = 900
+SipProfileNameForGeneratingMRCPAnnouncement = technical
+SipProfilePortForGeneratingMRCPAnnouncement = 5066
+ConsultantStatisticsServerProcessNumberInPool = 1
+IVRStatisticsServerProcessNumberInPool = 1
+ProjectStatisticsServerProcessNumberInPool = 1
+VoiceCampaignStatisticsServerProcessNumberInPool = 1
+UseStun = yes
+SSHUser = remote
+SSHMaxConnection = 1
+CapsLimiter = 10
+
+[SIMULATOR]
+TenantID = 1
+OperatorID = 1
+TelcoNetworkID = 1
+Consultants = 100
+Projects = 1
+Contacts = 1000
+Distribution = ROUND_ROBIN
+RejectBreak = 10
+TimeoutBreak = 10
+GeneratingCallsIntervalTime = 5
+GeneratingNumberOfCalls = 1
+ConsultantAnswerTime = 3
+ConsultantCallTime = 30
+FreeswitchESLPort = 8021
+FreeswitchESLPassword = ClueCon
+PlaybackSourceForClient = silence_stream://-1
+PlaybackSourceForConsultant = silence_stream://-1
+ProfileName = simulator
+ProfileIPv4 =
+SipProxy =
+SipProfilePath = /usr/local/freeswitch/conf/sip_profiles
+GatewayIPv4 =
+GatewayPort = 5100
+
diff --git a/templates/env/config.env b/templates/env/config.env
new file mode 100644
index 0000000..106a649
--- /dev/null
+++ b/templates/env/config.env
@@ -0,0 +1,111 @@
+#lab settings
+REGISTRY_NAME=docker.io/conpeekspzoo
+TAG={{DEPLOYMENT_TAG}}
+DOMAIN_NAME={{APP_INSTALLATION_DOMAIN}}
+
+SYSTEM_DOMAIN={{SYSTEM_APP_INSTALLATION_DOMAIN}}
+
+CONFIG_FOLDER=/files/conpeek_setup/
+ENV_FILE=/files/conpeek_setup/env/config.env
+NGINX_CONF_LOCATION=/files/conpeek_setup/etc/nginx
+
+#system services variables
+SYS_NAME=conpeek.com
+
+INTERNAL_IP={{INTERNAL_IP}}
+INTERNAL_MASK=24
+
+EXTERNAL_IP={{EXTERNAL_IP}}
+EXTERNAL_MASK=32
+
+SERVICES_ID=1
+SERVICES_HOST={{INTERNAL_IP}}
+
+#variables for core services
+MYSQL_ROOT_PASSWORD={{MASTER_PASSWORD}}
+
+MONGO_INITDB_DATABASE=admin
+MONGO_INITDB_ROOT_USERNAME=root_init
+MONGO_INITDB_ROOT_PASSWORD={{MASTER_PASSWORD}}
+REPL_SET_NAME={{REPLICASET}}
+
+RABBITMQ_USER=root
+RABBITMQ_PASSWORD={{MASTER_PASSWORD}}
+
+DB_USER=root
+DB_PASS={{MASTER_PASSWORD}}
+DB_HOST={{INTERNAL_IP}}
+DB_PORT=3306
+
+AMQP_HOST={{INTERNAL_IP}}
+AMQP_USER=root
+AMQP_PASS={{MASTER_PASSWORD}}
+
+
+#conpeek services variables
+CONPEEK_INI_FILE_LOCATION=/data/conpeek/basic_conpeek.ini
+CONPEEK_ETC_CATALOG_LOCATION=/data/conpeek/etc
+LOGGING_LEVEL=DEBUG
+
+SESSION_SERVER_NAME={{session_server_name}}
+SESSION_SERVER_TEST_MODE=True
+STATE_MACHINE_SERVER_NAME={{state_machine_server_name}}
+
+API_TENANT_SERVER_NAME={{api_tenant_name}}
+API_TENANT_PORT={{api_tenant_port}}
+
+API_TENANT_WEB_POLLING_SERVER_NAME={{api_tenant_web_polling_name}}
+API_TENANT_WEB_POLLING_PORT={{api_tenant_web_polling_port}}
+
+API_TENANT_LOGIN_SERVER_NAME={{tenant_login_api_server_service_name}}
+API_OPERATOR_SERVER_NAME={{operator_api_server_response_name}}
+FILE_SERVER_NAME={{file_server_name}}
+REPORT_SERVER_NAME={{report_server_name}}
+MESSAGING_SERVER_NAME={{messaging_server_name}}
+MAILBOX_SERVER_NAME={{mailbox_server_name}}
+CDR_SERVER_NAME={{cdr_server_name}}
+LOCAL_CONTACT_DB_SERVER_NAME={{local_contact_db_name}}
+
+PROVISIONING_SERVER_NAME={{provisioning_server_name}}
+PROVISIONING_SERVER_PORT={{provisioning_server_initial_application_port}}
+
+MESSAGEBIRD_SERVER_NAME={{messagebird_server_name}}
+SMS_SERVER_NAME={{sms_server_name}}
+FACEBOOK_SERVER_NAME={{facebook_server_name}}
+GUS_SERVER_NAME={{gus_server_name}}
+HUBSPOT_SERVER_NAME={{hubspot_server_name}}
+CDR_SERVER_NAME={{cdr_server_name}}
+USER_NOTIFICATION_NAME={{user_notification_server_name}}
+TICKETING_SERVER_NAME={{ticketing_server_name}}
+MEETS_SERVER_NAME={{meets_server_name}}
+
+BSS_SERVER_NAME={{tenant_bss_api_server_name}}
+BSS_SERVER_PORT={{tenant_bss_api_server_initial_application_port}}
+
+BOT_SERVER_NAME={{bot_server_name}}
+BOT_TRAIN_SERVER_NAME={{bot_train_server_name}}
+
+API_TENANT_PLUGIN_SERVER_NAME={{tenant_plugin_api_server_name}}
+API_TENANT_PLUGIN_SERVER_PORT={{tenant_plugin_api_server_initial_application_port}}
+
+FS_NAME={{freeswitch_name}}
+GW_NAME={{gateway_server_name}}
+
+#coturn
+COTURN_MIN_PORT={{coturn_min_port}}
+COTURN_MAX_PORT={{coturn_max_port}}
+COTURN_REALM={{coturn_realm}}
+COTURN_STATIC_SECRET={{SYSTEM_TOKEN_SECRETKEY}}
+
+#kamailio
+KAMAILIO_NAT={{KAMAILIO_NAT}}
+KAMAILIO_PRIVATE_IP={{KAMAILIO_PRIVATE_IP}}
+KAMAILIO_PUBLIC_IP={{KAMAILIO_PUBLIC_IP}}
+
+#dev_variables:
+CONPEEK_SOURCE_CODE_LOCATION=/data/conpeek
+CONPEEK_FRONTEND_LOCATION=/data/conpeek/web/app
+
+
+#unbuffer stdout
+PYTHONUNBUFFERED=1
diff --git a/templates/freeswitch/conf/autoload_configs/acl.conf.xml b/templates/freeswitch/conf/autoload_configs/acl.conf.xml
new file mode 100644
index 0000000..a93c2dc
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/acl.conf.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml b/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml
new file mode 100644
index 0000000..448a671
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}");
+ "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}"
+ "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${call_clientcode}","${sip_rtp_rxstat}","${sip_rtp_txstat}","${sofia_record_file}"
+ "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${sip_p_rtp_stat}"
+ "${accountcode}","${caller_id_number}","${destination_number}","${context}","${caller_id}","${channel_name}","${bridge_channel}","${last_app}","${last_arg}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${amaflags}","${uuid}","${userfield}"
+ "${uuid}","${signal_bond}","${direction}","${ani}","${destination_number}","${answer_stamp}","${end_stamp}","${billsec}","${accountcode}","${userfield}","${network_addr}","${regex('${original_caller_id_name}'|^.)}","${sip_gateway_name}"
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/conference.conf.xml b/templates/freeswitch/conf/autoload_configs/conference.conf.xml
new file mode 100644
index 0000000..400ef0d
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/conference.conf.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/console.conf.xml b/templates/freeswitch/conf/autoload_configs/console.conf.xml
new file mode 100644
index 0000000..0c3345d
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/console.conf.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/db.conf.xml b/templates/freeswitch/conf/autoload_configs/db.conf.xml
new file mode 100644
index 0000000..712fdcc
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/db.conf.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml b/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml
new file mode 100644
index 0000000..cbe12a5
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/httapi.conf.xml b/templates/freeswitch/conf/autoload_configs/httapi.conf.xml
new file mode 100644
index 0000000..627d57f
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/httapi.conf.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml b/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml
new file mode 100644
index 0000000..60aed8a
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/freeswitch/conf/autoload_configs/logfile.conf.xml b/templates/freeswitch/conf/autoload_configs/logfile.conf.xml
new file mode 100644
index 0000000..8e3d991
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/logfile.conf.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/modules.conf.xml b/templates/freeswitch/conf/autoload_configs/modules.conf.xml
new file mode 100644
index 0000000..bdff845
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/modules.conf.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/sofia.conf.xml b/templates/freeswitch/conf/autoload_configs/sofia.conf.xml
new file mode 100644
index 0000000..496df7c
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/sofia.conf.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/switch.conf.xml b/templates/freeswitch/conf/autoload_configs/switch.conf.xml
new file mode 100644
index 0000000..d103a4d
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/switch.conf.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/timezones.conf.xml b/templates/freeswitch/conf/autoload_configs/timezones.conf.xml
new file mode 100644
index 0000000..9ddded7
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/timezones.conf.xml
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/verto.conf.xml b/templates/freeswitch/conf/autoload_configs/verto.conf.xml
new file mode 100644
index 0000000..3fe896b
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/verto.conf.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml b/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml
new file mode 100644
index 0000000..2623317
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml b/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml
new file mode 100644
index 0000000..5a8a1ff
--- /dev/null
+++ b/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/bridge_failed.xml b/templates/freeswitch/conf/dialplan/bridge_failed.xml
new file mode 100644
index 0000000..1af7334
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/bridge_failed.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/external.xml b/templates/freeswitch/conf/dialplan/external.xml
new file mode 100644
index 0000000..6e72686
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/external.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/gateway.xml b/templates/freeswitch/conf/dialplan/gateway.xml
new file mode 100644
index 0000000..41a7e41
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/gateway.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/internal.xml b/templates/freeswitch/conf/dialplan/internal.xml
new file mode 100644
index 0000000..659d743
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/internal.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/line.xml b/templates/freeswitch/conf/dialplan/line.xml
new file mode 100644
index 0000000..9c43161
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/line.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/line_verto.xml b/templates/freeswitch/conf/dialplan/line_verto.xml
new file mode 100644
index 0000000..23d4b91
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/line_verto.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/lineredirect.xml b/templates/freeswitch/conf/dialplan/lineredirect.xml
new file mode 100644
index 0000000..206763d
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/lineredirect.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/linetransfer.xml b/templates/freeswitch/conf/dialplan/linetransfer.xml
new file mode 100644
index 0000000..9cca28e
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/linetransfer.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/systemtransfer.xml b/templates/freeswitch/conf/dialplan/systemtransfer.xml
new file mode 100644
index 0000000..1c69280
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/systemtransfer.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/virtual_contact.xml b/templates/freeswitch/conf/dialplan/virtual_contact.xml
new file mode 100644
index 0000000..de3eabf
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/virtual_contact.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/dialplan/virtual_endpoint.xml b/templates/freeswitch/conf/dialplan/virtual_endpoint.xml
new file mode 100644
index 0000000..c6222b9
--- /dev/null
+++ b/templates/freeswitch/conf/dialplan/virtual_endpoint.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/freeswitch.xml b/templates/freeswitch/conf/freeswitch.xml
new file mode 100644
index 0000000..20f7782
--- /dev/null
+++ b/templates/freeswitch/conf/freeswitch.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/freeswitch/conf/mime.types b/templates/freeswitch/conf/mime.types
new file mode 100644
index 0000000..456a221
--- /dev/null
+++ b/templates/freeswitch/conf/mime.types
@@ -0,0 +1,1610 @@
+#
+# MIME type configs overriden by the FreeSWITCH project.
+#
+audio/mpeg mp3 mpga mp2 mp2a m2a m3a
+image/jpeg jpg jpeg jpe
+#
+# Additional MIME types added by the FreeSWITCH project. Any duplicate file extensions listed here will only be
+# used to map from MIME -> extension and not extension -> MIME
+audio/x-mpeg mp3
+audio/mp3 mp3
+audio/x-mp3 mp3
+audio/mpeg3 mp3
+audio/x-mpeg3 mp3
+audio/mpg mp3
+audio/x-mpegaudio mp3
+audio/x-wave wav
+audio/wave wav
+audio/wav wav
+#
+# The section below was taken from Apache httpd Project at
+#
+#
+# This file maps Internet media types to unique file extension(s).
+# Although created for httpd, this file is used by many software systems
+# and has been placed in the public domain for unlimited redisribution.
+#
+# The table below contains both registered and (common) unregistered types.
+# A type that has no unique extension can be ignored -- they are listed
+# here to guide configurations toward known types and to make it easier to
+# identify "new" types. File extensions are also commonly used to indicate
+# content languages and encodings, so choose them carefully.
+#
+# Internet media types should be registered as described in RFC 4288.
+# The registry is at .
+#
+# MIME type (lowercased) Extensions
+# ============================================ ==========
+# application/1d-interleaved-parityfec
+# application/3gpp-ims+xml
+# application/activemessage
+application/andrew-inset ez
+# application/applefile
+application/applixware aw
+application/atom+xml atom
+application/atomcat+xml atomcat
+# application/atomicmail
+application/atomsvc+xml atomsvc
+# application/auth-policy+xml
+# application/batch-smtp
+# application/beep+xml
+# application/calendar+xml
+# application/cals-1840
+# application/ccmp+xml
+application/ccxml+xml ccxml
+application/cdmi-capability cdmia
+application/cdmi-container cdmic
+application/cdmi-domain cdmid
+application/cdmi-object cdmio
+application/cdmi-queue cdmiq
+# application/cea-2018+xml
+# application/cellml+xml
+# application/cfw
+# application/cnrp+xml
+# application/commonground
+# application/conference-info+xml
+# application/cpl+xml
+# application/csta+xml
+# application/cstadata+xml
+application/cu-seeme cu
+# application/cybercash
+application/davmount+xml davmount
+# application/dca-rft
+# application/dec-dx
+# application/dialog-info+xml
+# application/dicom
+# application/dns
+application/docbook+xml dbk
+# application/dskpp+xml
+application/dssc+der dssc
+application/dssc+xml xdssc
+# application/dvcs
+application/ecmascript ecma
+# application/edi-consent
+# application/edi-x12
+# application/edifact
+application/emma+xml emma
+# application/epp+xml
+application/epub+zip epub
+# application/eshop
+# application/example
+application/exi exi
+# application/fastinfoset
+# application/fastsoap
+# application/fits
+application/font-tdpfr pfr
+# application/framework-attributes+xml
+application/gml+xml gml
+application/gpx+xml gpx
+application/gxf gxf
+# application/h224
+# application/held+xml
+# application/http
+application/hyperstudio stk
+# application/ibe-key-request+xml
+# application/ibe-pkg-reply+xml
+# application/ibe-pp-data
+# application/iges
+# application/im-iscomposing+xml
+# application/index
+# application/index.cmd
+# application/index.obj
+# application/index.response
+# application/index.vnd
+application/inkml+xml ink inkml
+# application/iotp
+application/ipfix ipfix
+# application/ipp
+# application/isup
+application/java-archive jar
+application/java-serialized-object ser
+application/java-vm class
+application/javascript js
+application/json json
+application/jsonml+json jsonml
+# application/kpml-request+xml
+# application/kpml-response+xml
+application/lost+xml lostxml
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+# application/macwriteii
+application/mads+xml mads
+application/marc mrc
+application/marcxml+xml mrcx
+application/mathematica ma nb mb
+# application/mathml-content+xml
+# application/mathml-presentation+xml
+application/mathml+xml mathml
+# application/mbms-associated-procedure-description+xml
+# application/mbms-deregister+xml
+# application/mbms-envelope+xml
+# application/mbms-msk+xml
+# application/mbms-msk-response+xml
+# application/mbms-protection-description+xml
+# application/mbms-reception-report+xml
+# application/mbms-register+xml
+# application/mbms-register-response+xml
+# application/mbms-user-service-description+xml
+application/mbox mbox
+# application/media_control+xml
+application/mediaservercontrol+xml mscml
+application/metalink+xml metalink
+application/metalink4+xml meta4
+application/mets+xml mets
+# application/mikey
+application/mods+xml mods
+# application/moss-keys
+# application/moss-signature
+# application/mosskey-data
+# application/mosskey-request
+application/mp21 m21 mp21
+application/mp4 mp4s
+# application/mpeg4-generic
+# application/mpeg4-iod
+# application/mpeg4-iod-xmt
+# application/msc-ivr+xml
+# application/msc-mixer+xml
+application/msword doc dot
+application/mxf mxf
+# application/nasdata
+# application/news-checkgroups
+# application/news-groupinfo
+# application/news-transmission
+# application/nss
+# application/ocsp-request
+# application/ocsp-response
+application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy
+application/oda oda
+application/oebps-package+xml opf
+application/ogg ogx
+application/omdoc+xml omdoc
+application/onenote onetoc onetoc2 onetmp onepkg
+application/oxps oxps
+# application/parityfec
+application/patch-ops-error+xml xer
+application/pdf pdf
+application/pgp-encrypted pgp
+# application/pgp-keys
+application/pgp-signature asc sig
+application/pics-rules prf
+# application/pidf+xml
+# application/pidf-diff+xml
+application/pkcs10 p10
+application/pkcs7-mime p7m p7c
+application/pkcs7-signature p7s
+application/pkcs8 p8
+application/pkix-attr-cert ac
+application/pkix-cert cer
+application/pkix-crl crl
+application/pkix-pkipath pkipath
+application/pkixcmp pki
+application/pls+xml pls
+# application/poc-settings+xml
+application/postscript ai eps ps
+# application/prs.alvestrand.titrax-sheet
+application/prs.cww cww
+# application/prs.nprend
+# application/prs.plucker
+# application/prs.rdf-xml-crypt
+# application/prs.xsf+xml
+application/pskc+xml pskcxml
+# application/qsig
+application/rdf+xml rdf
+application/reginfo+xml rif
+application/relax-ng-compact-syntax rnc
+# application/remote-printing
+application/resource-lists+xml rl
+application/resource-lists-diff+xml rld
+# application/riscos
+# application/rlmi+xml
+application/rls-services+xml rs
+application/rpki-ghostbusters gbr
+application/rpki-manifest mft
+application/rpki-roa roa
+# application/rpki-updown
+application/rsd+xml rsd
+application/rss+xml rss
+application/rtf rtf
+# application/rtx
+# application/samlassertion+xml
+# application/samlmetadata+xml
+application/sbml+xml sbml
+application/scvp-cv-request scq
+application/scvp-cv-response scs
+application/scvp-vp-request spq
+application/scvp-vp-response spp
+application/sdp sdp
+# application/set-payment
+application/set-payment-initiation setpay
+# application/set-registration
+application/set-registration-initiation setreg
+# application/sgml
+# application/sgml-open-catalog
+application/shf+xml shf
+# application/sieve
+# application/simple-filter+xml
+# application/simple-message-summary
+# application/simplesymbolcontainer
+# application/slate
+# application/smil
+application/smil+xml smi smil
+# application/soap+fastinfoset
+# application/soap+xml
+application/sparql-query rq
+application/sparql-results+xml srx
+# application/spirits-event+xml
+application/srgs gram
+application/srgs+xml grxml
+application/sru+xml sru
+application/ssdl+xml ssdl
+application/ssml+xml ssml
+# application/tamp-apex-update
+# application/tamp-apex-update-confirm
+# application/tamp-community-update
+# application/tamp-community-update-confirm
+# application/tamp-error
+# application/tamp-sequence-adjust
+# application/tamp-sequence-adjust-confirm
+# application/tamp-status-query
+# application/tamp-status-response
+# application/tamp-update
+# application/tamp-update-confirm
+application/tei+xml tei teicorpus
+application/thraud+xml tfi
+# application/timestamp-query
+# application/timestamp-reply
+application/timestamped-data tsd
+# application/tve-trigger
+# application/ulpfec
+# application/vcard+xml
+# application/vemmi
+# application/vividence.scriptfile
+# application/vnd.3gpp.bsf+xml
+application/vnd.3gpp.pic-bw-large plb
+application/vnd.3gpp.pic-bw-small psb
+application/vnd.3gpp.pic-bw-var pvb
+# application/vnd.3gpp.sms
+# application/vnd.3gpp2.bcmcsinfo+xml
+# application/vnd.3gpp2.sms
+application/vnd.3gpp2.tcap tcap
+application/vnd.3m.post-it-notes pwn
+application/vnd.accpac.simply.aso aso
+application/vnd.accpac.simply.imp imp
+application/vnd.acucobol acu
+application/vnd.acucorp atc acutc
+application/vnd.adobe.air-application-installer-package+zip air
+application/vnd.adobe.formscentral.fcdt fcdt
+application/vnd.adobe.fxp fxp fxpl
+# application/vnd.adobe.partial-upload
+application/vnd.adobe.xdp+xml xdp
+application/vnd.adobe.xfdf xfdf
+# application/vnd.aether.imp
+# application/vnd.ah-barcode
+application/vnd.ahead.space ahead
+application/vnd.airzip.filesecure.azf azf
+application/vnd.airzip.filesecure.azs azs
+application/vnd.amazon.ebook azw
+application/vnd.americandynamics.acc acc
+application/vnd.amiga.ami ami
+# application/vnd.amundsen.maze+xml
+application/vnd.android.package-archive apk
+application/vnd.anser-web-certificate-issue-initiation cii
+application/vnd.anser-web-funds-transfer-initiation fti
+application/vnd.antix.game-component atx
+application/vnd.apple.installer+xml mpkg
+application/vnd.apple.mpegurl m3u8
+# application/vnd.arastra.swi
+application/vnd.aristanetworks.swi swi
+application/vnd.astraea-software.iota iota
+application/vnd.audiograph aep
+# application/vnd.autopackage
+# application/vnd.avistar+xml
+application/vnd.blueice.multipass mpm
+# application/vnd.bluetooth.ep.oob
+application/vnd.bmi bmi
+application/vnd.businessobjects rep
+# application/vnd.cab-jscript
+# application/vnd.canon-cpdl
+# application/vnd.canon-lips
+# application/vnd.cendio.thinlinc.clientconf
+application/vnd.chemdraw+xml cdxml
+application/vnd.chipnuts.karaoke-mmd mmd
+application/vnd.cinderella cdy
+# application/vnd.cirpack.isdn-ext
+application/vnd.claymore cla
+application/vnd.cloanto.rp9 rp9
+application/vnd.clonk.c4group c4g c4d c4f c4p c4u
+application/vnd.cluetrust.cartomobile-config c11amc
+application/vnd.cluetrust.cartomobile-config-pkg c11amz
+# application/vnd.collection+json
+# application/vnd.commerce-battelle
+application/vnd.commonspace csp
+application/vnd.contact.cmsg cdbcmsg
+application/vnd.cosmocaller cmc
+application/vnd.crick.clicker clkx
+application/vnd.crick.clicker.keyboard clkk
+application/vnd.crick.clicker.palette clkp
+application/vnd.crick.clicker.template clkt
+application/vnd.crick.clicker.wordbank clkw
+application/vnd.criticaltools.wbs+xml wbs
+application/vnd.ctc-posml pml
+# application/vnd.ctct.ws+xml
+# application/vnd.cups-pdf
+# application/vnd.cups-postscript
+application/vnd.cups-ppd ppd
+# application/vnd.cups-raster
+# application/vnd.cups-raw
+# application/vnd.curl
+application/vnd.curl.car car
+application/vnd.curl.pcurl pcurl
+# application/vnd.cybank
+application/vnd.dart dart
+application/vnd.data-vision.rdz rdz
+application/vnd.dece.data uvf uvvf uvd uvvd
+application/vnd.dece.ttml+xml uvt uvvt
+application/vnd.dece.unspecified uvx uvvx
+application/vnd.dece.zip uvz uvvz
+application/vnd.denovo.fcselayout-link fe_launch
+# application/vnd.dir-bi.plate-dl-nosuffix
+application/vnd.dna dna
+application/vnd.dolby.mlp mlp
+# application/vnd.dolby.mobile.1
+# application/vnd.dolby.mobile.2
+application/vnd.dpgraph dpg
+application/vnd.dreamfactory dfac
+application/vnd.ds-keypoint kpxx
+application/vnd.dvb.ait ait
+# application/vnd.dvb.dvbj
+# application/vnd.dvb.esgcontainer
+# application/vnd.dvb.ipdcdftnotifaccess
+# application/vnd.dvb.ipdcesgaccess
+# application/vnd.dvb.ipdcesgaccess2
+# application/vnd.dvb.ipdcesgpdd
+# application/vnd.dvb.ipdcroaming
+# application/vnd.dvb.iptv.alfec-base
+# application/vnd.dvb.iptv.alfec-enhancement
+# application/vnd.dvb.notif-aggregate-root+xml
+# application/vnd.dvb.notif-container+xml
+# application/vnd.dvb.notif-generic+xml
+# application/vnd.dvb.notif-ia-msglist+xml
+# application/vnd.dvb.notif-ia-registration-request+xml
+# application/vnd.dvb.notif-ia-registration-response+xml
+# application/vnd.dvb.notif-init+xml
+# application/vnd.dvb.pfr
+application/vnd.dvb.service svc
+# application/vnd.dxr
+application/vnd.dynageo geo
+# application/vnd.easykaraoke.cdgdownload
+# application/vnd.ecdis-update
+application/vnd.ecowin.chart mag
+# application/vnd.ecowin.filerequest
+# application/vnd.ecowin.fileupdate
+# application/vnd.ecowin.series
+# application/vnd.ecowin.seriesrequest
+# application/vnd.ecowin.seriesupdate
+# application/vnd.emclient.accessrequest+xml
+application/vnd.enliven nml
+# application/vnd.eprints.data+xml
+application/vnd.epson.esf esf
+application/vnd.epson.msf msf
+application/vnd.epson.quickanime qam
+application/vnd.epson.salt slt
+application/vnd.epson.ssf ssf
+# application/vnd.ericsson.quickcall
+application/vnd.eszigno3+xml es3 et3
+# application/vnd.etsi.aoc+xml
+# application/vnd.etsi.cug+xml
+# application/vnd.etsi.iptvcommand+xml
+# application/vnd.etsi.iptvdiscovery+xml
+# application/vnd.etsi.iptvprofile+xml
+# application/vnd.etsi.iptvsad-bc+xml
+# application/vnd.etsi.iptvsad-cod+xml
+# application/vnd.etsi.iptvsad-npvr+xml
+# application/vnd.etsi.iptvservice+xml
+# application/vnd.etsi.iptvsync+xml
+# application/vnd.etsi.iptvueprofile+xml
+# application/vnd.etsi.mcid+xml
+# application/vnd.etsi.overload-control-policy-dataset+xml
+# application/vnd.etsi.sci+xml
+# application/vnd.etsi.simservs+xml
+# application/vnd.etsi.tsl+xml
+# application/vnd.etsi.tsl.der
+# application/vnd.eudora.data
+application/vnd.ezpix-album ez2
+application/vnd.ezpix-package ez3
+# application/vnd.f-secure.mobile
+application/vnd.fdf fdf
+application/vnd.fdsn.mseed mseed
+application/vnd.fdsn.seed seed dataless
+# application/vnd.ffsns
+# application/vnd.fints
+application/vnd.flographit gph
+application/vnd.fluxtime.clip ftc
+# application/vnd.font-fontforge-sfd
+application/vnd.framemaker fm frame maker book
+application/vnd.frogans.fnc fnc
+application/vnd.frogans.ltf ltf
+application/vnd.fsc.weblaunch fsc
+application/vnd.fujitsu.oasys oas
+application/vnd.fujitsu.oasys2 oa2
+application/vnd.fujitsu.oasys3 oa3
+application/vnd.fujitsu.oasysgp fg5
+application/vnd.fujitsu.oasysprs bh2
+# application/vnd.fujixerox.art-ex
+# application/vnd.fujixerox.art4
+# application/vnd.fujixerox.hbpl
+application/vnd.fujixerox.ddd ddd
+application/vnd.fujixerox.docuworks xdw
+application/vnd.fujixerox.docuworks.binder xbd
+# application/vnd.fut-misnet
+application/vnd.fuzzysheet fzs
+application/vnd.genomatix.tuxedo txd
+# application/vnd.geocube+xml
+application/vnd.geogebra.file ggb
+application/vnd.geogebra.tool ggt
+application/vnd.geometry-explorer gex gre
+application/vnd.geonext gxt
+application/vnd.geoplan g2w
+application/vnd.geospace g3w
+# application/vnd.globalplatform.card-content-mgt
+# application/vnd.globalplatform.card-content-mgt-response
+application/vnd.gmx gmx
+application/vnd.google-earth.kml+xml kml
+application/vnd.google-earth.kmz kmz
+application/vnd.grafeq gqf gqs
+# application/vnd.gridmp
+application/vnd.groove-account gac
+application/vnd.groove-help ghf
+application/vnd.groove-identity-message gim
+application/vnd.groove-injector grv
+application/vnd.groove-tool-message gtm
+application/vnd.groove-tool-template tpl
+application/vnd.groove-vcard vcg
+# application/vnd.hal+json
+application/vnd.hal+xml hal
+application/vnd.handheld-entertainment+xml zmm
+application/vnd.hbci hbci
+# application/vnd.hcl-bireports
+application/vnd.hhe.lesson-player les
+application/vnd.hp-hpgl hpgl
+application/vnd.hp-hpid hpid
+application/vnd.hp-hps hps
+application/vnd.hp-jlyt jlt
+application/vnd.hp-pcl pcl
+application/vnd.hp-pclxl pclxl
+# application/vnd.httphone
+application/vnd.hydrostatix.sof-data sfd-hdstx
+# application/vnd.hzn-3d-crossword
+# application/vnd.ibm.afplinedata
+# application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay mpy
+application/vnd.ibm.modcap afp listafp list3820
+application/vnd.ibm.rights-management irm
+application/vnd.ibm.secure-container sc
+application/vnd.iccprofile icc icm
+application/vnd.igloader igl
+application/vnd.immervision-ivp ivp
+application/vnd.immervision-ivu ivu
+# application/vnd.informedcontrol.rms+xml
+# application/vnd.informix-visionary
+# application/vnd.infotech.project
+# application/vnd.infotech.project+xml
+# application/vnd.innopath.wamp.notification
+application/vnd.insors.igm igm
+application/vnd.intercon.formnet xpw xpx
+application/vnd.intergeo i2g
+# application/vnd.intertrust.digibox
+# application/vnd.intertrust.nncp
+application/vnd.intu.qbo qbo
+application/vnd.intu.qfx qfx
+# application/vnd.iptc.g2.conceptitem+xml
+# application/vnd.iptc.g2.knowledgeitem+xml
+# application/vnd.iptc.g2.newsitem+xml
+# application/vnd.iptc.g2.newsmessage+xml
+# application/vnd.iptc.g2.packageitem+xml
+# application/vnd.iptc.g2.planningitem+xml
+application/vnd.ipunplugged.rcprofile rcprofile
+application/vnd.irepository.package+xml irp
+application/vnd.is-xpr xpr
+application/vnd.isac.fcs fcs
+application/vnd.jam jam
+# application/vnd.japannet-directory-service
+# application/vnd.japannet-jpnstore-wakeup
+# application/vnd.japannet-payment-wakeup
+# application/vnd.japannet-registration
+# application/vnd.japannet-registration-wakeup
+# application/vnd.japannet-setstore-wakeup
+# application/vnd.japannet-verification
+# application/vnd.japannet-verification-wakeup
+application/vnd.jcp.javame.midlet-rms rms
+application/vnd.jisp jisp
+application/vnd.joost.joda-archive joda
+application/vnd.kahootz ktz ktr
+application/vnd.kde.karbon karbon
+application/vnd.kde.kchart chrt
+application/vnd.kde.kformula kfo
+application/vnd.kde.kivio flw
+application/vnd.kde.kontour kon
+application/vnd.kde.kpresenter kpr kpt
+application/vnd.kde.kspread ksp
+application/vnd.kde.kword kwd kwt
+application/vnd.kenameaapp htke
+application/vnd.kidspiration kia
+application/vnd.kinar kne knp
+application/vnd.koan skp skd skt skm
+application/vnd.kodak-descriptor sse
+application/vnd.las.las+xml lasxml
+# application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop lbd
+application/vnd.llamagraphics.life-balance.exchange+xml lbe
+application/vnd.lotus-1-2-3 123
+application/vnd.lotus-approach apr
+application/vnd.lotus-freelance pre
+application/vnd.lotus-notes nsf
+application/vnd.lotus-organizer org
+application/vnd.lotus-screencam scm
+application/vnd.lotus-wordpro lwp
+application/vnd.macports.portpkg portpkg
+# application/vnd.marlin.drm.actiontoken+xml
+# application/vnd.marlin.drm.conftoken+xml
+# application/vnd.marlin.drm.license+xml
+# application/vnd.marlin.drm.mdcf
+application/vnd.mcd mcd
+application/vnd.medcalcdata mc1
+application/vnd.mediastation.cdkey cdkey
+# application/vnd.meridian-slingshot
+application/vnd.mfer mwf
+application/vnd.mfmp mfm
+application/vnd.micrografx.flo flo
+application/vnd.micrografx.igx igx
+application/vnd.mif mif
+# application/vnd.minisoft-hp3000-save
+# application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf daf
+application/vnd.mobius.dis dis
+application/vnd.mobius.mbk mbk
+application/vnd.mobius.mqy mqy
+application/vnd.mobius.msl msl
+application/vnd.mobius.plc plc
+application/vnd.mobius.txf txf
+application/vnd.mophun.application mpn
+application/vnd.mophun.certificate mpc
+# application/vnd.motorola.flexsuite
+# application/vnd.motorola.flexsuite.adsi
+# application/vnd.motorola.flexsuite.fis
+# application/vnd.motorola.flexsuite.gotap
+# application/vnd.motorola.flexsuite.kmr
+# application/vnd.motorola.flexsuite.ttc
+# application/vnd.motorola.flexsuite.wem
+# application/vnd.motorola.iprm
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry cil
+# application/vnd.ms-asf
+application/vnd.ms-cab-compressed cab
+# application/vnd.ms-color.iccprofile
+application/vnd.ms-excel xls xlm xla xlc xlt xlw
+application/vnd.ms-excel.addin.macroenabled.12 xlam
+application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb
+application/vnd.ms-excel.sheet.macroenabled.12 xlsm
+application/vnd.ms-excel.template.macroenabled.12 xltm
+application/vnd.ms-fontobject eot
+application/vnd.ms-htmlhelp chm
+application/vnd.ms-ims ims
+application/vnd.ms-lrm lrm
+# application/vnd.ms-office.activex+xml
+application/vnd.ms-officetheme thmx
+# application/vnd.ms-opentype
+# application/vnd.ms-package.obfuscated-opentype
+application/vnd.ms-pki.seccat cat
+application/vnd.ms-pki.stl stl
+# application/vnd.ms-playready.initiator+xml
+application/vnd.ms-powerpoint ppt pps pot
+application/vnd.ms-powerpoint.addin.macroenabled.12 ppam
+application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm
+application/vnd.ms-powerpoint.slide.macroenabled.12 sldm
+application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm
+application/vnd.ms-powerpoint.template.macroenabled.12 potm
+# application/vnd.ms-printing.printticket+xml
+application/vnd.ms-project mpp mpt
+# application/vnd.ms-tnef
+# application/vnd.ms-wmdrm.lic-chlg-req
+# application/vnd.ms-wmdrm.lic-resp
+# application/vnd.ms-wmdrm.meter-chlg-req
+# application/vnd.ms-wmdrm.meter-resp
+application/vnd.ms-word.document.macroenabled.12 docm
+application/vnd.ms-word.template.macroenabled.12 dotm
+application/vnd.ms-works wps wks wcm wdb
+application/vnd.ms-wpl wpl
+application/vnd.ms-xpsdocument xps
+application/vnd.mseq mseq
+# application/vnd.msign
+# application/vnd.multiad.creator
+# application/vnd.multiad.creator.cif
+# application/vnd.music-niff
+application/vnd.musician mus
+application/vnd.muvee.style msty
+application/vnd.mynfc taglet
+# application/vnd.ncd.control
+# application/vnd.ncd.reference
+# application/vnd.nervana
+# application/vnd.netfpx
+application/vnd.neurolanguage.nlu nlu
+application/vnd.nitf ntf nitf
+application/vnd.noblenet-directory nnd
+application/vnd.noblenet-sealer nns
+application/vnd.noblenet-web nnw
+# application/vnd.nokia.catalogs
+# application/vnd.nokia.conml+wbxml
+# application/vnd.nokia.conml+xml
+# application/vnd.nokia.isds-radio-presets
+# application/vnd.nokia.iptv.config+xml
+# application/vnd.nokia.landmark+wbxml
+# application/vnd.nokia.landmark+xml
+# application/vnd.nokia.landmarkcollection+xml
+# application/vnd.nokia.n-gage.ac+xml
+application/vnd.nokia.n-gage.data ngdat
+application/vnd.nokia.n-gage.symbian.install n-gage
+# application/vnd.nokia.ncd
+# application/vnd.nokia.pcd+wbxml
+# application/vnd.nokia.pcd+xml
+application/vnd.nokia.radio-preset rpst
+application/vnd.nokia.radio-presets rpss
+application/vnd.novadigm.edm edm
+application/vnd.novadigm.edx edx
+application/vnd.novadigm.ext ext
+# application/vnd.ntt-local.file-transfer
+# application/vnd.ntt-local.sip-ta_remote
+# application/vnd.ntt-local.sip-ta_tcp_stream
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template odft
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+# application/vnd.obn
+# application/vnd.oftn.l10n+json
+# application/vnd.oipf.contentaccessdownload+xml
+# application/vnd.oipf.contentaccessstreaming+xml
+# application/vnd.oipf.cspg-hexbinary
+# application/vnd.oipf.dae.svg+xml
+# application/vnd.oipf.dae.xhtml+xml
+# application/vnd.oipf.mippvcontrolmessage+xml
+# application/vnd.oipf.pae.gem
+# application/vnd.oipf.spdiscovery+xml
+# application/vnd.oipf.spdlist+xml
+# application/vnd.oipf.ueprofile+xml
+# application/vnd.oipf.userprofile+xml
+application/vnd.olpc-sugar xo
+# application/vnd.oma-scws-config
+# application/vnd.oma-scws-http-request
+# application/vnd.oma-scws-http-response
+# application/vnd.oma.bcast.associated-procedure-parameter+xml
+# application/vnd.oma.bcast.drm-trigger+xml
+# application/vnd.oma.bcast.imd+xml
+# application/vnd.oma.bcast.ltkm
+# application/vnd.oma.bcast.notification+xml
+# application/vnd.oma.bcast.provisioningtrigger
+# application/vnd.oma.bcast.sgboot
+# application/vnd.oma.bcast.sgdd+xml
+# application/vnd.oma.bcast.sgdu
+# application/vnd.oma.bcast.simple-symbol-container
+# application/vnd.oma.bcast.smartcard-trigger+xml
+# application/vnd.oma.bcast.sprov+xml
+# application/vnd.oma.bcast.stkm
+# application/vnd.oma.cab-address-book+xml
+# application/vnd.oma.cab-feature-handler+xml
+# application/vnd.oma.cab-pcc+xml
+# application/vnd.oma.cab-user-prefs+xml
+# application/vnd.oma.dcd
+# application/vnd.oma.dcdc
+application/vnd.oma.dd2+xml dd2
+# application/vnd.oma.drm.risd+xml
+# application/vnd.oma.group-usage-list+xml
+# application/vnd.oma.pal+xml
+# application/vnd.oma.poc.detailed-progress-report+xml
+# application/vnd.oma.poc.final-report+xml
+# application/vnd.oma.poc.groups+xml
+# application/vnd.oma.poc.invocation-descriptor+xml
+# application/vnd.oma.poc.optimized-progress-report+xml
+# application/vnd.oma.push
+# application/vnd.oma.scidm.messages+xml
+# application/vnd.oma.xcap-directory+xml
+# application/vnd.omads-email+xml
+# application/vnd.omads-file+xml
+# application/vnd.omads-folder+xml
+# application/vnd.omaloc-supl-init
+application/vnd.openofficeorg.extension oxt
+# application/vnd.openxmlformats-officedocument.custom-properties+xml
+# application/vnd.openxmlformats-officedocument.customxmlproperties+xml
+# application/vnd.openxmlformats-officedocument.drawing+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chart+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml
+# application/vnd.openxmlformats-officedocument.extended-properties+xml
+# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml
+# application/vnd.openxmlformats-officedocument.presentationml.comments+xml
+# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml
+application/vnd.openxmlformats-officedocument.presentationml.slide sldx
+# application/vnd.openxmlformats-officedocument.presentationml.slide+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml
+application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
+# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tags+xml
+application/vnd.openxmlformats-officedocument.presentationml.template potx
+# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml
+# application/vnd.openxmlformats-officedocument.theme+xml
+# application/vnd.openxmlformats-officedocument.themeoverride+xml
+# application/vnd.openxmlformats-officedocument.vmldrawing
+# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml
+# application/vnd.openxmlformats-package.core-properties+xml
+# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml
+# application/vnd.openxmlformats-package.relationships+xml
+# application/vnd.quobject-quoxdocument
+# application/vnd.osa.netdeploy
+application/vnd.osgeo.mapguide.package mgp
+# application/vnd.osgi.bundle
+application/vnd.osgi.dp dp
+application/vnd.osgi.subsystem esa
+# application/vnd.otps.ct-kip+xml
+application/vnd.palm pdb pqa oprc
+# application/vnd.paos.xml
+application/vnd.pawaafile paw
+application/vnd.pg.format str
+application/vnd.pg.osasli ei6
+# application/vnd.piaccess.application-licence
+application/vnd.picsel efif
+application/vnd.pmi.widget wg
+# application/vnd.poc.group-advertisement+xml
+application/vnd.pocketlearn plf
+application/vnd.powerbuilder6 pbd
+# application/vnd.powerbuilder6-s
+# application/vnd.powerbuilder7
+# application/vnd.powerbuilder7-s
+# application/vnd.powerbuilder75
+# application/vnd.powerbuilder75-s
+# application/vnd.preminet
+application/vnd.previewsystems.box box
+application/vnd.proteus.magazine mgz
+application/vnd.publishare-delta-tree qps
+application/vnd.pvi.ptid1 ptid
+# application/vnd.pwg-multiplexed
+# application/vnd.pwg-xhtml-print+xml
+# application/vnd.qualcomm.brew-app-res
+application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
+# application/vnd.radisys.moml+xml
+# application/vnd.radisys.msml+xml
+# application/vnd.radisys.msml-audit+xml
+# application/vnd.radisys.msml-audit-conf+xml
+# application/vnd.radisys.msml-audit-conn+xml
+# application/vnd.radisys.msml-audit-dialog+xml
+# application/vnd.radisys.msml-audit-stream+xml
+# application/vnd.radisys.msml-conf+xml
+# application/vnd.radisys.msml-dialog+xml
+# application/vnd.radisys.msml-dialog-base+xml
+# application/vnd.radisys.msml-dialog-fax-detect+xml
+# application/vnd.radisys.msml-dialog-fax-sendrecv+xml
+# application/vnd.radisys.msml-dialog-group+xml
+# application/vnd.radisys.msml-dialog-speech+xml
+# application/vnd.radisys.msml-dialog-transform+xml
+# application/vnd.rainstor.data
+# application/vnd.rapid
+application/vnd.realvnc.bed bed
+application/vnd.recordare.musicxml mxl
+application/vnd.recordare.musicxml+xml musicxml
+# application/vnd.renlearn.rlprint
+application/vnd.rig.cryptonote cryptonote
+application/vnd.rim.cod cod
+application/vnd.rn-realmedia rm
+application/vnd.rn-realmedia-vbr rmvb
+application/vnd.route66.link66+xml link66
+# application/vnd.rs-274x
+# application/vnd.ruckus.download
+# application/vnd.s3sms
+application/vnd.sailingtracker.track st
+# application/vnd.sbm.cid
+# application/vnd.sbm.mid2
+# application/vnd.scribus
+# application/vnd.sealed.3df
+# application/vnd.sealed.csf
+# application/vnd.sealed.doc
+# application/vnd.sealed.eml
+# application/vnd.sealed.mht
+# application/vnd.sealed.net
+# application/vnd.sealed.ppt
+# application/vnd.sealed.tiff
+# application/vnd.sealed.xls
+# application/vnd.sealedmedia.softseal.html
+# application/vnd.sealedmedia.softseal.pdf
+application/vnd.seemail see
+application/vnd.sema sema
+application/vnd.semd semd
+application/vnd.semf semf
+application/vnd.shana.informed.formdata ifm
+application/vnd.shana.informed.formtemplate itp
+application/vnd.shana.informed.interchange iif
+application/vnd.shana.informed.package ipk
+application/vnd.simtech-mindmapper twd twds
+application/vnd.smaf mmf
+# application/vnd.smart.notebook
+application/vnd.smart.teacher teacher
+# application/vnd.software602.filler.form+xml
+# application/vnd.software602.filler.form-xml-zip
+application/vnd.solent.sdkm+xml sdkm sdkd
+application/vnd.spotfire.dxp dxp
+application/vnd.spotfire.sfs sfs
+# application/vnd.sss-cod
+# application/vnd.sss-dtf
+# application/vnd.sss-ntf
+application/vnd.stardivision.calc sdc
+application/vnd.stardivision.draw sda
+application/vnd.stardivision.impress sdd
+application/vnd.stardivision.math smf
+application/vnd.stardivision.writer sdw vor
+application/vnd.stardivision.writer-global sgl
+application/vnd.stepmania.package smzip
+application/vnd.stepmania.stepchart sm
+# application/vnd.street-stream
+application/vnd.sun.xml.calc sxc
+application/vnd.sun.xml.calc.template stc
+application/vnd.sun.xml.draw sxd
+application/vnd.sun.xml.draw.template std
+application/vnd.sun.xml.impress sxi
+application/vnd.sun.xml.impress.template sti
+application/vnd.sun.xml.math sxm
+application/vnd.sun.xml.writer sxw
+application/vnd.sun.xml.writer.global sxg
+application/vnd.sun.xml.writer.template stw
+# application/vnd.sun.wadl+xml
+application/vnd.sus-calendar sus susp
+application/vnd.svd svd
+# application/vnd.swiftview-ics
+application/vnd.symbian.install sis sisx
+application/vnd.syncml+xml xsm
+application/vnd.syncml.dm+wbxml bdm
+application/vnd.syncml.dm+xml xdm
+# application/vnd.syncml.dm.notification
+# application/vnd.syncml.ds.notification
+application/vnd.tao.intent-module-archive tao
+application/vnd.tcpdump.pcap pcap cap dmp
+application/vnd.tmobile-livetv tmo
+application/vnd.trid.tpt tpt
+application/vnd.triscape.mxs mxs
+application/vnd.trueapp tra
+# application/vnd.truedoc
+# application/vnd.ubisoft.webplayer
+application/vnd.ufdl ufd ufdl
+application/vnd.uiq.theme utz
+application/vnd.umajin umj
+application/vnd.unity unityweb
+application/vnd.uoml+xml uoml
+# application/vnd.uplanet.alert
+# application/vnd.uplanet.alert-wbxml
+# application/vnd.uplanet.bearer-choice
+# application/vnd.uplanet.bearer-choice-wbxml
+# application/vnd.uplanet.cacheop
+# application/vnd.uplanet.cacheop-wbxml
+# application/vnd.uplanet.channel
+# application/vnd.uplanet.channel-wbxml
+# application/vnd.uplanet.list
+# application/vnd.uplanet.list-wbxml
+# application/vnd.uplanet.listcmd
+# application/vnd.uplanet.listcmd-wbxml
+# application/vnd.uplanet.signal
+application/vnd.vcx vcx
+# application/vnd.vd-study
+# application/vnd.vectorworks
+# application/vnd.verimatrix.vcas
+# application/vnd.vidsoft.vidconference
+application/vnd.visio vsd vst vss vsw
+application/vnd.visionary vis
+# application/vnd.vividence.scriptfile
+application/vnd.vsf vsf
+# application/vnd.wap.sic
+# application/vnd.wap.slc
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo wtb
+# application/vnd.wfa.wsc
+# application/vnd.wmc
+# application/vnd.wmf.bootstrap
+# application/vnd.wolfram.mathematica
+# application/vnd.wolfram.mathematica.package
+application/vnd.wolfram.player nbp
+application/vnd.wordperfect wpd
+application/vnd.wqd wqd
+# application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf stf
+# application/vnd.wv.csp+wbxml
+# application/vnd.wv.csp+xml
+# application/vnd.wv.ssp+xml
+application/vnd.xara xar
+application/vnd.xfdl xfdl
+# application/vnd.xfdl.webform
+# application/vnd.xmi+xml
+# application/vnd.xmpie.cpkg
+# application/vnd.xmpie.dpkg
+# application/vnd.xmpie.plan
+# application/vnd.xmpie.ppkg
+# application/vnd.xmpie.xlim
+application/vnd.yamaha.hv-dic hvd
+application/vnd.yamaha.hv-script hvs
+application/vnd.yamaha.hv-voice hvp
+application/vnd.yamaha.openscoreformat osf
+application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg
+# application/vnd.yamaha.remote-setup
+application/vnd.yamaha.smaf-audio saf
+application/vnd.yamaha.smaf-phrase spf
+# application/vnd.yamaha.through-ngn
+# application/vnd.yamaha.tunnel-udpencap
+application/vnd.yellowriver-custom-menu cmp
+application/vnd.zul zir zirz
+application/vnd.zzazz.deck+xml zaz
+application/voicexml+xml vxml
+# application/vq-rtcpxr
+# application/watcherinfo+xml
+# application/whoispp-query
+# application/whoispp-response
+application/widget wgt
+application/winhlp hlp
+# application/wita
+# application/wordperfect5.1
+application/wsdl+xml wsdl
+application/wspolicy+xml wspolicy
+application/x-7z-compressed 7z
+application/x-abiword abw
+application/x-ace-compressed ace
+# application/x-amf
+application/x-apple-diskimage dmg
+application/x-authorware-bin aab x32 u32 vox
+application/x-authorware-map aam
+application/x-authorware-seg aas
+application/x-bcpio bcpio
+application/x-bittorrent torrent
+application/x-blorb blb blorb
+application/x-bzip bz
+application/x-bzip2 bz2 boz
+application/x-cbr cbr cba cbt cbz cb7
+application/x-cdlink vcd
+application/x-cfs-compressed cfs
+application/x-chat chat
+application/x-chess-pgn pgn
+application/x-conference nsc
+# application/x-compress
+application/x-cpio cpio
+application/x-csh csh
+application/x-debian-package deb udeb
+application/x-dgc-compressed dgc
+application/x-director dir dcr dxr cst cct cxt w3d fgd swa
+application/x-doom wad
+application/x-dtbncx+xml ncx
+application/x-dtbook+xml dtb
+application/x-dtbresource+xml res
+application/x-dvi dvi
+application/x-envoy evy
+application/x-eva eva
+application/x-font-bdf bdf
+# application/x-font-dos
+# application/x-font-framemaker
+application/x-font-ghostscript gsf
+# application/x-font-libgrx
+application/x-font-linux-psf psf
+application/x-font-otf otf
+application/x-font-pcf pcf
+application/x-font-snf snf
+# application/x-font-speedo
+# application/x-font-sunos-news
+application/x-font-ttf ttf ttc
+application/x-font-type1 pfa pfb pfm afm
+application/font-woff woff
+# application/x-font-vfont
+application/x-freearc arc
+application/x-futuresplash spl
+application/x-gca-compressed gca
+application/x-glulx ulx
+application/x-gnumeric gnumeric
+application/x-gramps-xml gramps
+application/x-gtar gtar
+# application/x-gzip
+application/x-hdf hdf
+application/x-install-instructions install
+application/x-iso9660-image iso
+application/x-java-jnlp-file jnlp
+application/x-latex latex
+application/x-lzh-compressed lzh lha
+application/x-mie mie
+application/x-mobipocket-ebook prc mobi
+application/x-ms-application application
+application/x-ms-shortcut lnk
+application/x-ms-wmd wmd
+application/x-ms-wmz wmz
+application/x-ms-xbap xbap
+application/x-msaccess mdb
+application/x-msbinder obd
+application/x-mscardfile crd
+application/x-msclip clp
+application/x-msdownload exe dll com bat msi
+application/x-msmediaview mvb m13 m14
+application/x-msmetafile wmf wmz emf emz
+application/x-msmoney mny
+application/x-mspublisher pub
+application/x-msschedule scd
+application/x-msterminal trm
+application/x-mswrite wri
+application/x-netcdf nc cdf
+application/x-nzb nzb
+application/x-pkcs12 p12 pfx
+application/x-pkcs7-certificates p7b spc
+application/x-pkcs7-certreqresp p7r
+application/x-rar-compressed rar
+application/x-research-info-systems ris
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-silverlight-app xap
+application/x-sql sql
+application/x-stuffit sit
+application/x-stuffitx sitx
+application/x-subrip srt
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-t3vm-image t3
+application/x-tads gam
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-tex-tfm tfm
+application/x-texinfo texinfo texi
+application/x-tgif obj
+application/x-ustar ustar
+application/x-wais-source src
+application/x-x509-ca-cert der crt
+application/x-xfig fig
+application/x-xliff+xml xlf
+application/x-xpinstall xpi
+application/x-xz xz
+application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8
+# application/x400-bp
+application/xaml+xml xaml
+# application/xcap-att+xml
+# application/xcap-caps+xml
+application/xcap-diff+xml xdf
+# application/xcap-el+xml
+# application/xcap-error+xml
+# application/xcap-ns+xml
+# application/xcon-conference-info-diff+xml
+# application/xcon-conference-info+xml
+application/xenc+xml xenc
+application/xhtml+xml xhtml xht
+# application/xhtml-voice+xml
+application/xml xml xsl
+application/xml-dtd dtd
+# application/xml-external-parsed-entity
+# application/xmpp+xml
+application/xop+xml xop
+application/xproc+xml xpl
+application/xslt+xml xslt
+application/xspf+xml xspf
+application/xv+xml mxml xhvml xvml xvm
+application/yang yang
+application/yin+xml yin
+application/zip zip
+# audio/1d-interleaved-parityfec
+# audio/32kadpcm
+# audio/3gpp
+# audio/3gpp2
+# audio/ac3
+audio/adpcm adp
+# audio/amr
+# audio/amr-wb
+# audio/amr-wb+
+# audio/asc
+# audio/atrac-advanced-lossless
+# audio/atrac-x
+# audio/atrac3
+audio/basic au snd
+# audio/bv16
+# audio/bv32
+# audio/clearmode
+# audio/cn
+# audio/dat12
+# audio/dls
+# audio/dsr-es201108
+# audio/dsr-es202050
+# audio/dsr-es202211
+# audio/dsr-es202212
+# audio/dv
+# audio/dvi4
+# audio/eac3
+# audio/evrc
+# audio/evrc-qcp
+# audio/evrc0
+# audio/evrc1
+# audio/evrcb
+# audio/evrcb0
+# audio/evrcb1
+# audio/evrcwb
+# audio/evrcwb0
+# audio/evrcwb1
+# audio/example
+# audio/fwdred
+# audio/g719
+# audio/g722
+# audio/g7221
+# audio/g723
+# audio/g726-16
+# audio/g726-24
+# audio/g726-32
+# audio/g726-40
+# audio/g728
+# audio/g729
+# audio/g7291
+# audio/g729d
+# audio/g729e
+# audio/gsm
+# audio/gsm-efr
+# audio/gsm-hr-08
+# audio/ilbc
+# audio/ip-mr_v2.5
+# audio/isac
+# audio/l16
+# audio/l20
+# audio/l24
+# audio/l8
+# audio/lpc
+audio/midi mid midi kar rmi
+# audio/mobile-xmf
+audio/mp4 mp4a
+# audio/mp4a-latm
+# audio/mpa
+# audio/mpa-robust
+audio/mpeg mpga mp2 mp2a mp3 m2a m3a
+# audio/mpeg4-generic
+# audio/musepack
+audio/ogg oga ogg spx
+# audio/opus
+# audio/parityfec
+# audio/pcma
+# audio/pcma-wb
+# audio/pcmu-wb
+# audio/pcmu
+# audio/prs.sid
+# audio/qcelp
+# audio/red
+# audio/rtp-enc-aescm128
+# audio/rtp-midi
+# audio/rtx
+audio/s3m s3m
+audio/silk sil
+# audio/smv
+# audio/smv0
+# audio/smv-qcp
+# audio/sp-midi
+# audio/speex
+# audio/t140c
+# audio/t38
+# audio/telephone-event
+# audio/tone
+# audio/uemclip
+# audio/ulpfec
+# audio/vdvi
+# audio/vmr-wb
+# audio/vnd.3gpp.iufp
+# audio/vnd.4sb
+# audio/vnd.audiokoz
+# audio/vnd.celp
+# audio/vnd.cisco.nse
+# audio/vnd.cmles.radio-events
+# audio/vnd.cns.anp1
+# audio/vnd.cns.inf1
+audio/vnd.dece.audio uva uvva
+audio/vnd.digital-winds eol
+# audio/vnd.dlna.adts
+# audio/vnd.dolby.heaac.1
+# audio/vnd.dolby.heaac.2
+# audio/vnd.dolby.mlp
+# audio/vnd.dolby.mps
+# audio/vnd.dolby.pl2
+# audio/vnd.dolby.pl2x
+# audio/vnd.dolby.pl2z
+# audio/vnd.dolby.pulse.1
+audio/vnd.dra dra
+audio/vnd.dts dts
+audio/vnd.dts.hd dtshd
+# audio/vnd.dvb.file
+# audio/vnd.everad.plj
+# audio/vnd.hns.audio
+audio/vnd.lucent.voice lvp
+audio/vnd.ms-playready.media.pya pya
+# audio/vnd.nokia.mobile-xmf
+# audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800 ecelp4800
+audio/vnd.nuera.ecelp7470 ecelp7470
+audio/vnd.nuera.ecelp9600 ecelp9600
+# audio/vnd.octel.sbc
+# audio/vnd.qcelp
+# audio/vnd.rhetorex.32kadpcm
+audio/vnd.rip rip
+# audio/vnd.sealedmedia.softseal.mpeg
+# audio/vnd.vmx.cvsd
+# audio/vorbis
+# audio/vorbis-config
+audio/webm weba
+audio/x-aac aac
+audio/x-aiff aif aiff aifc
+audio/x-caf caf
+audio/x-flac flac
+audio/x-matroska mka
+audio/x-mpegurl m3u
+audio/x-ms-wax wax
+audio/x-ms-wma wma
+audio/x-pn-realaudio ram ra
+audio/x-pn-realaudio-plugin rmp
+# audio/x-tta
+audio/x-wav wav
+audio/xm xm
+chemical/x-cdx cdx
+chemical/x-cif cif
+chemical/x-cmdf cmdf
+chemical/x-cml cml
+chemical/x-csml csml
+# chemical/x-pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+# image/example
+# image/fits
+image/g3fax g3
+image/gif gif
+image/ief ief
+# image/jp2
+image/jpeg jpeg jpg jpe
+# image/jpm
+# image/jpx
+image/ktx ktx
+# image/naplps
+image/png png
+image/prs.btif btif
+# image/prs.pti
+image/sgi sgi
+image/svg+xml svg svgz
+# image/t38
+image/tiff tiff tif
+# image/tiff-fx
+image/vnd.adobe.photoshop psd
+# image/vnd.cns.inf2
+image/vnd.dece.graphic uvi uvvi uvg uvvg
+image/vnd.dvb.subtitle sub
+image/vnd.djvu djvu djv
+image/vnd.dwg dwg
+image/vnd.dxf dxf
+image/vnd.fastbidsheet fbs
+image/vnd.fpx fpx
+image/vnd.fst fst
+image/vnd.fujixerox.edmics-mmr mmr
+image/vnd.fujixerox.edmics-rlc rlc
+# image/vnd.globalgraphics.pgb
+# image/vnd.microsoft.icon
+# image/vnd.mix
+image/vnd.ms-modi mdi
+image/vnd.ms-photo wdp
+image/vnd.net-fpx npx
+# image/vnd.radiance
+# image/vnd.sealed.png
+# image/vnd.sealedmedia.softseal.gif
+# image/vnd.sealedmedia.softseal.jpg
+# image/vnd.svf
+image/vnd.wap.wbmp wbmp
+image/vnd.xiff xif
+image/webp webp
+image/x-3ds 3ds
+image/x-cmu-raster ras
+image/x-cmx cmx
+image/x-freehand fh fhc fh4 fh5 fh7
+image/x-icon ico
+image/x-mrsid-image sid
+image/x-pcx pcx
+image/x-pict pic pct
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-tga tga
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+# message/cpim
+# message/delivery-status
+# message/disposition-notification
+# message/example
+# message/external-body
+# message/feedback-report
+# message/global
+# message/global-delivery-status
+# message/global-disposition-notification
+# message/global-headers
+# message/http
+# message/imdn+xml
+# message/news
+# message/partial
+message/rfc822 eml mime
+# message/s-http
+# message/sip
+# message/sipfrag
+# message/tracking-status
+# message/vnd.si.simp
+# model/example
+model/iges igs iges
+model/mesh msh mesh silo
+model/vnd.collada+xml dae
+model/vnd.dwf dwf
+# model/vnd.flatland.3dml
+model/vnd.gdl gdl
+# model/vnd.gs-gdl
+# model/vnd.gs.gdl
+model/vnd.gtw gtw
+# model/vnd.moml+xml
+model/vnd.mts mts
+# model/vnd.parasolid.transmit.binary
+# model/vnd.parasolid.transmit.text
+model/vnd.vtu vtu
+model/vrml wrl vrml
+model/x3d+binary x3db x3dbz
+model/x3d+vrml x3dv x3dvz
+model/x3d+xml x3d x3dz
+# multipart/alternative
+# multipart/appledouble
+# multipart/byteranges
+# multipart/digest
+# multipart/encrypted
+# multipart/example
+# multipart/form-data
+# multipart/header-set
+# multipart/mixed
+# multipart/parallel
+# multipart/related
+# multipart/report
+# multipart/signed
+# multipart/voice-message
+# text/1d-interleaved-parityfec
+text/cache-manifest appcache
+text/calendar ics ifb
+text/css css
+text/csv csv
+# text/directory
+# text/dns
+# text/ecmascript
+# text/enriched
+# text/example
+# text/fwdred
+text/html html htm
+# text/javascript
+text/n3 n3
+# text/parityfec
+text/plain txt text conf def list log in
+# text/prs.fallenstein.rst
+text/prs.lines.tag dsc
+# text/vnd.radisys.msml-basic-layout
+# text/red
+# text/rfc822-headers
+text/richtext rtx
+# text/rtf
+# text/rtp-enc-aescm128
+# text/rtx
+text/sgml sgml sgm
+# text/t140
+text/tab-separated-values tsv
+text/troff t tr roff man me ms
+text/turtle ttl
+# text/ulpfec
+text/uri-list uri uris urls
+text/vcard vcard
+# text/vnd.abc
+text/vnd.curl curl
+text/vnd.curl.dcurl dcurl
+text/vnd.curl.scurl scurl
+text/vnd.curl.mcurl mcurl
+# text/vnd.dmclientscript
+text/vnd.dvb.subtitle sub
+# text/vnd.esmertec.theme-descriptor
+text/vnd.fly fly
+text/vnd.fmi.flexstor flx
+text/vnd.graphviz gv
+text/vnd.in3d.3dml 3dml
+text/vnd.in3d.spot spot
+# text/vnd.iptc.newsml
+# text/vnd.iptc.nitf
+# text/vnd.latex-z
+# text/vnd.motorola.reflex
+# text/vnd.ms-mediapackage
+# text/vnd.net2phone.commcenter.command
+# text/vnd.si.uricatalogue
+text/vnd.sun.j2me.app-descriptor jad
+# text/vnd.trolltech.linguist
+# text/vnd.wap.si
+# text/vnd.wap.sl
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/x-asm s asm
+text/x-c c cc cxx cpp h hh dic
+text/x-fortran f for f77 f90
+text/x-java-source java
+text/x-opml opml
+text/x-pascal p pas
+text/x-nfo nfo
+text/x-setext etx
+text/x-sfv sfv
+text/x-uuencode uu
+text/x-vcalendar vcs
+text/x-vcard vcf
+# text/xml
+# text/xml-external-parsed-entity
+# video/1d-interleaved-parityfec
+video/3gpp 3gp
+# video/3gpp-tt
+video/3gpp2 3g2
+# video/bmpeg
+# video/bt656
+# video/celb
+# video/dv
+# video/example
+video/h261 h261
+video/h263 h263
+# video/h263-1998
+# video/h263-2000
+video/h264 h264
+# video/h264-rcdo
+# video/h264-svc
+video/jpeg jpgv
+# video/jpeg2000
+video/jpm jpm jpgm
+video/mj2 mj2 mjp2
+# video/mp1s
+# video/mp2p
+# video/mp2t
+video/mp4 mp4 mp4v mpg4
+# video/mp4v-es
+video/mpeg mpeg mpg mpe m1v m2v
+# video/mpeg4-generic
+# video/mpv
+# video/nv
+video/ogg ogv
+# video/parityfec
+# video/pointer
+video/quicktime qt mov
+# video/raw
+# video/rtp-enc-aescm128
+# video/rtx
+# video/smpte292m
+# video/ulpfec
+# video/vc1
+# video/vnd.cctv
+video/vnd.dece.hd uvh uvvh
+video/vnd.dece.mobile uvm uvvm
+# video/vnd.dece.mp4
+video/vnd.dece.pd uvp uvvp
+video/vnd.dece.sd uvs uvvs
+video/vnd.dece.video uvv uvvv
+# video/vnd.directv.mpeg
+# video/vnd.directv.mpeg-tts
+# video/vnd.dlna.mpeg-tts
+video/vnd.dvb.file dvb
+video/vnd.fvt fvt
+# video/vnd.hns.video
+# video/vnd.iptvforum.1dparityfec-1010
+# video/vnd.iptvforum.1dparityfec-2005
+# video/vnd.iptvforum.2dparityfec-1010
+# video/vnd.iptvforum.2dparityfec-2005
+# video/vnd.iptvforum.ttsavc
+# video/vnd.iptvforum.ttsmpeg2
+# video/vnd.motorola.video
+# video/vnd.motorola.videop
+video/vnd.mpegurl mxu m4u
+video/vnd.ms-playready.media.pyv pyv
+# video/vnd.nokia.interleaved-multimedia
+# video/vnd.nokia.videovoip
+# video/vnd.objectvideo
+# video/vnd.sealed.mpeg1
+# video/vnd.sealed.mpeg4
+# video/vnd.sealed.swf
+# video/vnd.sealedmedia.softseal.mov
+video/vnd.uvvu.mp4 uvu uvvu
+video/vnd.vivo viv
+video/webm webm
+video/x-f4v f4v
+video/x-fli fli
+video/x-flv flv
+video/x-m4v m4v
+video/x-matroska mkv mk3d mks
+video/x-mng mng
+video/x-ms-asf asf asx
+video/x-ms-vob vob
+video/x-ms-wm wm
+video/x-ms-wmv wmv
+video/x-ms-wmx wmx
+video/x-ms-wvx wvx
+video/x-msvideo avi
+video/x-sgi-movie movie
+video/x-smv smv
+x-conference/x-cooltalk ice
diff --git a/templates/freeswitch/conf/modules.conf b/templates/freeswitch/conf/modules.conf
new file mode 100644
index 0000000..7b521c2
--- /dev/null
+++ b/templates/freeswitch/conf/modules.conf
@@ -0,0 +1,21 @@
+languages/mod_python3
+applications/mod_commands
+applications/mod_conference
+applications/mod_db
+applications/mod_dptools
+applications/mod_hash
+applications/mod_httapi
+applications/mod_spandsp
+asr_tts/mod_unimrcp
+dialplans/mod_dialplan_xml
+event_handlers/mod_event_socket
+formats/mod_local_stream
+formats/mod_shout
+formats/mod_tone_stream
+formats/mod_sndfile
+loggers/mod_console
+endpoints/mod_rtc
+endpoints/mod_sofia
+endpoints/mod_verto
+xml_int/mod_xml_curl
+loggers/mod_logfile
\ No newline at end of file
diff --git a/templates/freeswitch/conf/sip_profiles/gateway0.xml b/templates/freeswitch/conf/sip_profiles/gateway0.xml
new file mode 100644
index 0000000..6eb75d4
--- /dev/null
+++ b/templates/freeswitch/conf/sip_profiles/gateway0.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml b/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml
new file mode 100644
index 0000000..986e062
--- /dev/null
+++ b/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/sip_profiles/line0_an1.xml b/templates/freeswitch/conf/sip_profiles/line0_an1.xml
new file mode 100644
index 0000000..a64ed44
--- /dev/null
+++ b/templates/freeswitch/conf/sip_profiles/line0_an1.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/conf/vars.xml b/templates/freeswitch/conf/vars.xml
new file mode 100644
index 0000000..687f6c7
--- /dev/null
+++ b/templates/freeswitch/conf/vars.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/default/sip_profiles/gw_external.xml b/templates/freeswitch/default/sip_profiles/gw_external.xml
new file mode 100644
index 0000000..e49a57c
--- /dev/null
+++ b/templates/freeswitch/default/sip_profiles/gw_external.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/freeswitch/tmobile/sip_profiles/gw_external.xml b/templates/freeswitch/tmobile/sip_profiles/gw_external.xml
new file mode 100644
index 0000000..2d281eb
--- /dev/null
+++ b/templates/freeswitch/tmobile/sip_profiles/gw_external.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/kamailio/kamailio-python.cfg b/templates/kamailio/kamailio-python.cfg
new file mode 100644
index 0000000..a116f4e
--- /dev/null
+++ b/templates/kamailio/kamailio-python.cfg
@@ -0,0 +1,14 @@
+[main]
+name = KAMAILIO_NAME
+
+[topology-db]
+user = root
+password = MASTER_PASSWORD
+host = DB_HOST
+pool_size = 4
+
+[manager-db]
+pool_size = 4
+
+[kamailio-db]
+pool_size = 4
diff --git a/templates/kamailio/kamailio.cfg b/templates/kamailio/kamailio.cfg
new file mode 100644
index 0000000..f202733
--- /dev/null
+++ b/templates/kamailio/kamailio.cfg
@@ -0,0 +1,78 @@
+#!KAMAILIO
+#
+log_facility=LOG_LOCAL0
+log_stderror=yes
+debug=0
+
+fork=yes
+children=4
+
+memdbg=5
+memlog=5
+
+auto_aliases=no
+alias=KAMAILIO_PUBLIC_IP:5060
+
+disable_tcp=no
+enable_tls=yes
+
+#use_dns_cache = off
+#use_dns_failover = on
+#dns_srv_lb = on
+#dns_try_naptr = on
+
+dns_try_ipv6=no
+dns_retr_time=1
+dns_retr_no=1
+dns_use_search_list=no
+use_dns_cache=on
+use_dns_failover=on
+dns_srv_lb=on
+
+mpath="/usr/local/kamailio/lib64/kamailio/modules/"
+
+server_signature=no
+
+loadmodule "kex.so"
+loadmodule "corex.so"
+loadmodule "tm.so"
+loadmodule "tmx.so"
+loadmodule "sl.so"
+loadmodule "tls.so"
+loadmodule "rr.so"
+loadmodule "pv.so"
+loadmodule "maxfwd.so"
+loadmodule "textops.so"
+loadmodule "siputils.so"
+loadmodule "xlog.so"
+loadmodule "sanity.so"
+loadmodule "cfg_rpc.so"
+loadmodule "counters.so"
+loadmodule "path.so"
+loadmodule "app_python.so"
+loadmodule "nathelper.so"
+
+modparam("tls", "config", "/etc/kamailio/tls.cfg")
+
+
+# ----- tm params -----
+# auto-discard branches from previous serial forking leg
+modparam("tm", "failure_reply_mode", 3)
+# default retransmission timeout: 30sec
+modparam("tm", "fr_timer", 30000)
+# default invite retransmission timeout after 1xx: 120sec
+modparam("tm", "fr_inv_timer", 120000)
+
+# ----- rr params -----
+# set next param to 1 to add value to ;lr param (helps with some UAs)
+modparam("rr", "enable_full_lr", 0)
+# do not append from tag to the RR (no need for this script)
+modparam("rr", "append_fromtag", 0)
+
+####### Routing Logic ########
+
+modparam("app_python", "script_name", "/usr/local/conpeek/kamailio/kamailio_server.py")
+
+cfgengine "python"
+
+#include_file "/usr/local/kamailio/etc/kamailio/kamailio-local.cfg"
diff --git a/templates/kamailio/kamailio_server.py b/templates/kamailio/kamailio_server.py
new file mode 100644
index 0000000..4cb62e8
--- /dev/null
+++ b/templates/kamailio/kamailio_server.py
@@ -0,0 +1,754 @@
+import re
+import uuid
+
+import ConfigParser
+import KSR as KSR
+import mysql.connector
+import logging
+import os
+#import threading
+
+#threading.current_thread()
+
+#formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
+
+logging.basicConfig(
+ level=logging.DEBUG,
+ format='%(asctime)s.%(msecs)03d - %(levelname)s - %(funcName)s():%(lineno)i - %(message)s',
+ datefmt='%Y-%m-%d %H:%M:%S' # Format daty
+)
+#logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
+#logging.getLogger().handlers[0].setFormatter(formatter)
+
+def mod_init():
+ # logging.basicConfig(filename='/var/log/kamailio/app_python.log', level=logging.INFO)
+ logging.debug('APP_PYTHON starting...')
+ return KamailioServer()
+
+
+ENV_KAMAILIO_NAT = "KAMAILIO_NAT"
+ENV_KAMAILIO_PUBLIC_IP = "KAMAILIO_PUBLIC_IP"
+ENV_KAMAILIO_PRIVATE_IP = "KAMAILIO_PRIVATE_IP"
+
+KAMAILIO_NAT = True if os.getenv(ENV_KAMAILIO_NAT) == "1" else False
+PRIVATE_IP = os.getenv(ENV_KAMAILIO_PRIVATE_IP)
+PUBLIC_IP = os.getenv(ENV_KAMAILIO_PUBLIC_IP)
+
+if KAMAILIO_NAT:
+ if not PRIVATE_IP:
+ logging.error("Parameter ENV_KAMAILIO_PRIVATE_IP not exists!")
+ exit(0)
+
+ if not PUBLIC_IP:
+ logging.error("Parameter ENV_KAMAILIO_PUBLIC_IP not exists!")
+ exit(0)
+
+
+class KamailioServer:
+ SIP_PORT = 5060
+
+ def __init__(self):
+
+ logging.debug('Kamailio object initializing...')
+
+ if os.path.exists('/etc/kamailio/kamailio-python.cfg'):
+
+ logging.debug("getting config from /etc/kamailio/kamailio-python.cfg")
+
+ configParser = ConfigParser.RawConfigParser()
+ configParser.read('/etc/kamailio/kamailio-python.cfg')
+
+ self.kamailio_name = configParser.get('main', 'name')
+ self.topology_config = {
+ 'user': configParser.get('topology-db', 'user'),
+ 'password': configParser.get('topology-db', 'password'),
+ 'host': configParser.get('topology-db', 'host'),
+ 'database': 'topology',
+ 'raw': True
+ }
+ else:
+ logging.debug("nie podano pliku /etc/kamailio/kamailio-python.cfg, pobieram dane ze zmiennych srodowiskowych")
+ self.kamailio_name = os.environ.get("KAMAILIO_NAME")
+ self.topology_config = {
+ 'user': os.environ.get("DB_USER"),
+ 'password': os.environ.get("DB_PASS"),
+ 'host': os.environ.get("DB_HOST"),
+ 'database': 'topology',
+ 'raw': True
+ }
+
+ # Get System and kamailio info
+ #
+ try:
+ topology_cnx = mysql.connector.connect(**self.topology_config)
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Topology DB connection error.')
+ exit(0)
+
+ try:
+ cursor = topology_cnx.cursor()
+ query = 'SELECT S.id, S.name, S.manager_db_user, S.manager_db_password, S.manager_db_host, K.kamailio_db_ipv4, K.kamailio_db_user, K.kamailio_db_password FROM system S, kamailio K WHERE K.system_id = S.id AND K.name = %s'
+ cursor.execute(query, [self.kamailio_name])
+ row = cursor.fetchone()
+ cursor.close()
+ if not row:
+ logging.error('Kamailio server "{}" not found in topology database.'.format(self.kamailio_name))
+ topology_cnx.close()
+ exit(0)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Topology DB operation error.')
+ exit(0)
+
+ self.system_id = row[0]
+ self.system_name = row[1]
+
+ # Initialize manager database
+ #
+ self.manager_config = {
+ 'user': str(row[2]),
+ 'password': str(row[3]),
+ 'host': str(row[4]),
+ 'database': 'manager',
+ 'raw': True
+ }
+
+ # Initialize kamailio database
+ #
+ self.kamailio_config = {
+ 'user': str(row[6]),
+ 'password': str(row[7]),
+ 'host': str(row[5]),
+ 'database': 'kamailio',
+ 'raw': True
+ }
+
+ # Get Freeswitch and FreeswitchPool info:
+ #
+ try:
+ topology_cnx = mysql.connector.connect(**self.topology_config)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Topology DB connection error.')
+ exit(0)
+
+ try:
+ cursor = topology_cnx.cursor()
+ query = 'SELECT F.name, SAN.ipv4_address, SA.domain FROM freeswitch F, freeswitch_pool P, server_node_has_access_network SAN, access_network SA WHERE F.freeswitch_pool_id = P.id AND ' \
+ 'F.server_node_id=SAN.server_node_id AND SAN.access_network_id = SA.id AND P.system_id = %s'
+ cursor.execute(query, [int(self.system_id)])
+ self.freeswitch_ipv4_list = []
+ self.freeswitch_switchname_list = []
+ rows = cursor.fetchall()
+ cursor.close()
+ for row in rows:
+ self.freeswitch_switchname_list.append('{}.{}'.format(str(row[0]), row[2]))
+ self.freeswitch_ipv4_list.append(str(row[1]))
+ topology_cnx.close()
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Topology DB operation error.')
+ exit(0)
+
+ # self.realm = 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd'))
+
+ def child_init(self, rank):
+ logging.debug('Kamailio child starting ...')
+ return 0
+
+ def ksr_onsend_route(self, msg):
+ return 0
+
+ def ksr_request_route(self, msg):
+ #logging.debug('Request arrived.')
+
+ if KSR.pv.get("$ua") in ("sipcli", "sipvicious", "sip-scan", "sipsak", "sundayddr", "friendly-scanner", "iWar", "CSipSimple", "SIVuS", "Gulp", "sipv", "smap", "friendly-request", "VaxIPUserAgent", "VaxSIPUserAgent", "siparmyknife", "Test Agent"):
+ logging.debug('Suspicious User-Agent blocked.')
+ KSR.sl.send_reply(404, 'Not Found')
+ return -255
+
+ if KSR.maxfwd.process_maxfwd(10) < 0:
+ KSR.sl.sl_send_reply(483, "Too Many Hops")
+ return -255
+
+ if KSR.pv.get('$si') in self.freeswitch_ipv4_list:
+ self.softswitch_request_route(msg)
+ else:
+ self.terminal_request_route(msg)
+ return 1
+
+# !!!!!!! POPRAWKA do rolki
+# def ksr_reply_route(self, msg):
+# try:
+# logging.debug('Reply arrived.')
+# if KSR.nathelper.nat_uac_test(2):
+# logging.warning('NATed UAC REPLY')
+# KSR.nathelper.fix_nated_contact()
+#
+# else:
+# logging.warning('Not NATed UAC REPLY')
+#
+# except:
+# logging.warning('Exception in ksr_reply')
+#
+# return 1
+
+ def softswitch_request_route(self, msg):
+
+ #logging.debug('Processing request from Freeswitch .')
+
+ # Process INVITE request
+ #
+ if KSR.pv.get('$rm') == 'INVITE':
+
+ # Different processing for reInvite and new dialog requests
+ #
+ if KSR.rr.loose_route() == 1:
+ KSR.tm.t_relay()
+ return
+ else:
+ if not KAMAILIO_NAT:
+ KSR.rr.record_route()
+ KSR.tm.t_relay()
+ else:
+ KSR.tm.t_on_reply("ksr_onreply_route_three")
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.rr.record_route_advertised_address("{}:5060".format(PUBLIC_IP))
+ KSR.tm.t_relay()
+ return
+
+ # Process ACK request
+ #
+ if KSR.pv.get('$rm') == 'ACK':
+ KSR.rr.loose_route()
+ if KAMAILIO_NAT:
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.tm.t_relay()
+ return
+
+ # Process BYE request
+ #
+ if KSR.pv.get('$rm') == 'BYE':
+ KSR.rr.loose_route()
+ if KAMAILIO_NAT:
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.tm.t_relay()
+ return
+
+ # Process UPDATE request
+ #
+ if KSR.pv.get('$rm') == 'UPDATE':
+ pai_hdr = KSR.pv.get('$hdr(P-Asserted-Identity)')
+ display_pattern = re.compile('^\s*"(.+)\s<(.+)@(.+)>"\s*<(.+)>\s*$')
+ m = display_pattern.match(pai_hdr)
+ if m:
+ KSR.hdr.remove('P-Asserted-Identity')
+ KSR.hdr.append('P-Asserted-Identity: "{}" <{}@{}>\r\n'.format(m.group(1), m.group(2), 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd'))))
+ KSR.rr.loose_route()
+ # !!!!!!! POPRAWKA do rolki
+ KSR.tm.t_on_reply("ksr_onreply_route_three")
+ if KAMAILIO_NAT:
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.tm.t_relay()
+ return
+
+ # Process NOTIFY request
+ #
+ if KSR.pv.get('$rm') == 'NOTIFY':
+ KSR.rr.loose_route()
+ if KAMAILIO_NAT:
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.tm.t_relay()
+ return
+
+ # Process CANCEL request
+ #
+ if KSR.pv.get('$rm') == 'CANCEL':
+ if KAMAILIO_NAT:
+ KSR.set_advertised_address(PUBLIC_IP)
+ KSR.tm.t_relay()
+ return
+
+ # Deny other requests
+ #
+ logging.warning('FREESWITCH Method not allowed')
+ KSR.sl.send_reply(405, 'Method Not Allowed')
+ return
+
+ def terminal_request_route(self, msg):
+
+ unique_id = uuid.uuid4()
+ logging.debug('{} Processing {} request from Terminal'.format(unique_id, KSR.pv.get('$rm')))
+
+ # Test UAC is NATed
+ #
+ if KSR.nathelper.nat_uac_test(2):
+ logging.warning('NATed UAC REQUEST')
+ KSR.nathelper.fix_nated_contact()
+ KSR.force_rport()
+ else:
+ logging.warning('Not NATed UAC REQUEST')
+
+ # Process REGISTER request
+ #
+ if KSR.pv.get('$rm') == 'REGISTER':
+ from_user = KSR.pv.get('$fU')
+ sip_username_pattern = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{12,}$')
+ m = sip_username_pattern.match(from_user)
+ if not m:
+ KSR.sl.send_reply(403, "Forbidden")
+ logging.debug('From User {} does not fulfil validation rules'.format(KSR.pv.get('$fU')))
+ return
+
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ logging.debug('Call-ID: {}'.format(call_id))
+ try:
+ kamailio_cnx = mysql.connector.connect(**self.kamailio_config)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB connection error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ try:
+ cursor = kamailio_cnx.cursor()
+ query = 'SELECT freeswitch_ipv4, freeswitch_port FROM selected_freeswitch WHERE call_id = %s'
+ cursor.execute(query, [call_id])
+ row = cursor.fetchone()
+ logging.debug('row: {}'.format(row))
+ cursor.close()
+ if row:
+ freeswitch_ipv4 = row[0]
+ freeswitch_port = row[1]
+ msg.rewrite_ruri('sip:{}:{}'.format(freeswitch_ipv4, freeswitch_port))
+ logging.debug('rewrite_ruri: sip:{}:{}'.format(freeswitch_ipv4, freeswitch_port))
+ else:
+ realm = self.get_fspool_realm()
+ if not realm:
+ KSR.sl.send_reply(404, 'Not Found')
+ logging.debug('send_reply 404 Not Found')
+ return
+ msg.rewrite_ruri('sip:{}'.format(realm))
+ logging.debug('rewrite_ruri sip:{}'.format(realm))
+
+ KSR.tm.t_on_reply("ksr_onreply_route_one")
+ KSR.hdr.append('Path: '.format(KSR.pv.get('$Ri'), KamailioServer.SIP_PORT))
+ logging.debug('append Path: '.format(KSR.pv.get('$Ri'), KamailioServer.SIP_PORT))
+ KSR.tm.t_relay()
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB operation error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ finally:
+ kamailio_cnx.close()
+ return
+
+ # Process INVITE request
+ #
+ if KSR.pv.get('$rm') == 'INVITE':
+ from_user = KSR.pv.get('$fU')
+ sip_username_pattern = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{12,}$')
+ m = sip_username_pattern.match(from_user)
+ if not m:
+ KSR.sl.send_reply(403, "Forbidden")
+ logging.debug('From User {} does not fulfil validation rules'.format(KSR.pv.get('$fU')))
+ return
+
+ if KSR.rr.loose_route() == 1:
+ KSR.tm.t_relay()
+ return
+
+ else:
+ user = self.normalize(KSR.pv.get('$rU'))
+ if not user:
+ logging.error('Kamailio normalize error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ try:
+ kamailio_cnx = mysql.connector.connect(**self.kamailio_config)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB connection error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+ try:
+ cursor = kamailio_cnx.cursor()
+ query = 'SELECT freeswitch_ipv4, freeswitch_port FROM selected_freeswitch WHERE call_id = %s'
+ cursor.execute(query, [call_id])
+ row = cursor.fetchone()
+ cursor.close()
+ if row:
+ freeswitch_ipv4 = row[0]
+ freeswitch_port = row[1]
+ realm = '{}:{}'.format(freeswitch_ipv4, freeswitch_port)
+
+ else:
+ realm = self.get_fspool_realm()
+ if not realm:
+ KSR.sl.send_reply(404, 'Not Found')
+ return
+
+ msg.rewrite_ruri("sip:{}@{}".format(user, realm))
+ KSR.tm.t_on_reply("ksr_onreply_route_two")
+ KSR.rr.record_route()
+ KSR.tm.t_relay()
+ return
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB operation error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ finally:
+ kamailio_cnx.close()
+ return
+
+ # Process SUBSCRIBE request
+ #
+ if KSR.pv.get('$rm') == 'SUBSCRIBE':
+ if KSR.rr.loose_route() == 1:
+ KSR.tm.t_relay()
+ return
+ else:
+ user = self.normalize(KSR.pv.get('$rU'))
+ if not user:
+ logging.error('Kamailio normalize error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+ realm = self.get_fspool_realm()
+ if not realm:
+ KSR.sl.send_reply(404, 'Not Found')
+ return
+ msg.rewrite_ruri("sip:{}@{}".format(user, realm))
+ KSR.rr.record_route()
+ KSR.tm.t_relay()
+ return
+
+ # Process ACK request
+ #
+ if KSR.pv.get('$rm') == 'ACK':
+ KSR.rr.loose_route()
+ KSR.tm.t_relay()
+ return
+
+ # Process BYE request
+ #
+ if KSR.pv.get('$rm') == 'BYE':
+ KSR.rr.loose_route()
+ KSR.tm.t_relay()
+ return
+
+ # Process CANCEL request
+ #
+ if KSR.pv.get('$rm') == 'CANCEL':
+ KSR.tm.t_relay()
+ return
+
+ # Process OPTIONS request
+ #
+ if KSR.pv.get("$rm") == "OPTIONS":
+ KSR.sl.sl_send_reply(200, "Keepalive")
+ return -255
+
+ # Process REFER request
+ #
+ if KSR.pv.get('$rm') == 'REFER':
+ # Relay request
+ #
+ KSR.rr.loose_route()
+ KSR.tm.t_relay()
+ return
+
+ # Deny other requests
+ #
+ logging.warning('TERMINAL Method not allowed')
+ KSR.tm.t_reply(405, 'Method Not Allowed')
+ return
+
+ def ksr_onreply_route_one(self, msg):
+
+ #logging.debug('Processing onreply_route_first_register...')
+
+ # Get kamailio db connection
+ #
+ try:
+ kamailio_cnx = mysql.connector.connect(**self.kamailio_config)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB connection error.')
+ return
+
+ # Process reply
+ #
+ try:
+ # Process 401 Unauthorized
+ #
+ if msg.Status == '401':
+ freeswitch_ipv4 = KSR.pv.get('$si')
+ freeswitch_port = KSR.pv.get('$sp')
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ cursor = kamailio_cnx.cursor()
+ cursor.execute('DELETE FROM selected_freeswitch where call_id = %s', [call_id])
+ query = 'INSERT INTO selected_freeswitch (call_id, freeswitch_ipv4, freeswitch_port) VALUES (%s, %s, %s)'
+ cursor.execute(query, [call_id, freeswitch_ipv4, freeswitch_port])
+ cursor.close()
+ kamailio_cnx.commit()
+ # Process any other reply
+ #
+ else:
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ cursor = kamailio_cnx.cursor()
+ query = 'DELETE FROM selected_freeswitch WHERE call_id = %s'
+ cursor.execute(query, [call_id])
+ cursor.close()
+ kamailio_cnx.commit()
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio onreply_route_one operation error.')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ finally:
+ kamailio_cnx.close()
+
+ def ksr_onreply_route_two(self, msg):
+
+ #logging.debug('Processing onreply_route_first_invite...')
+
+ # Get kamailio db connection
+ #
+ try:
+ kamailio_cnx = mysql.connector.connect(**self.kamailio_config)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio DB connection error.')
+ return
+
+ # Process reply
+ #
+ try:
+ # Process 407 ProxyAuthenticationRequired
+ #
+ if msg.Status == '407':
+ freeswitch_ipv4 = KSR.pv.get('$si')
+ freeswitch_port = KSR.pv.get('$sp')
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ cursor = kamailio_cnx.cursor()
+ query = 'INSERT INTO selected_freeswitch (call_id, freeswitch_ipv4, freeswitch_port) VALUES (%s, %s, %s)'
+ cursor.execute(query, [call_id, freeswitch_ipv4, freeswitch_port])
+ cursor.close()
+ kamailio_cnx.commit()
+
+ # Process 100 Trying
+ elif msg.Status != '100':
+ call_id = KSR.pv.get('$hdr(Call-ID)')
+ cursor = kamailio_cnx.cursor()
+ query = 'DELETE FROM selected_freeswitch WHERE call_id = %s'
+ cursor.execute(query, [call_id])
+ cursor.close()
+ kamailio_cnx.commit()
+ # raise Exception('Test')
+
+ # Process redirect from Freeswitch
+ #
+ if msg.Status == '302':
+ hContact = KSR.pv.get('$hdr(Contact)')
+ contact_pattern = re.compile('(.*)(.*)')
+ m = contact_pattern.match(hContact)
+ if m:
+ new_header = 'Contact: {}{}\r\n'.format(m.group(1), m.group(2), m.group(3), 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd')), m.group(4))
+ KSR.hdr.remove('Contact')
+ KSR.hdr.append(new_header)
+
+ # Process 200 from Freeswitch
+ #
+ elif msg.Status == '200':
+ if KAMAILIO_NAT:
+ new_header = 'Record-Route: \r\n'.format(PUBLIC_IP)
+ KSR.hdr.remove('Record-Route')
+ KSR.hdr.append(new_header)
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio onreply_route_two operation error.\n')
+ KSR.sl.send_reply(500, 'Server Internal Error')
+ return
+
+ finally:
+ kamailio_cnx.close()
+
+ def ksr_onreply_route_three(self, msg):
+ # !!!!!!! POPRAWKA do rolki
+ KSR.nathelper.fix_nated_contact()
+ if msg.Status == '200':
+ if KAMAILIO_NAT:
+ new_header = 'Record-Route: \r\n'.format(PRIVATE_IP)
+ KSR.hdr.remove('Record-Route')
+ KSR.hdr.append(new_header)
+
+ def normalize(self, request_number):
+
+ # logging.debug('Processing normalize...')
+
+ # Get manager db connection
+ #
+ try:
+ manager_cnx = mysql.connector.connect(**self.manager_config)
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Manager DB connection error.')
+ return
+
+ # Process normalization
+ #
+ try:
+ cursor = manager_cnx.cursor()
+ sip_username = KSR.pv.get("$fU")
+ query = 'SELECT T.id, T.domain FROM tenant T, line_link L WHERE L.tenant_id = T.id AND L.sip_username = %s LIMIT 1'
+ cursor.execute(query, [sip_username])
+ row = cursor.fetchone()
+ cursor.close()
+ if not row:
+ logging.error('Tenant data not found in manager database for user {}'.format(sip_username))
+ return
+
+ tenant_id = str(row[0])
+ # tenant_domain = str(row[1])
+ cursor = manager_cnx.cursor()
+ query = "SELECT pattern, replacement, priority FROM normalization WHERE tenant_id = %s ORDER BY priority ASC"
+ cursor.execute(query, [tenant_id])
+ rows = cursor.fetchall()
+ cursor.close()
+ logging.debug('Normalization for number')
+ target_user = request_number
+ if rows:
+ rules = []
+ for row in rows:
+ try:
+ rules.append({'pattern': re.compile(str(row[0])), 'replacement': str(row[1])})
+ except Exception as e:
+ logging.exception(e)
+ logging.error("Normalization error")
+ continue
+
+ limit = 10
+ while 1:
+ matched = False
+ for rule in rules:
+ result = rule['pattern'].sub(rule['replacement'], target_user)
+ if target_user != result:
+ matched = True
+ target_user = result
+ break
+
+ if not matched:
+ break
+
+ limit -= 1
+ if limit == 0:
+ break
+
+ return target_user
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio normalize operation error.')
+ return
+
+ finally:
+ manager_cnx.close()
+
+ def get_fspool_realm(self):
+
+ # logging.debug('Processing get_fspool_realm...')
+
+ # Get manager db connection
+ #
+ try:
+ manager_cnx = mysql.connector.connect(**self.manager_config)
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Manager DB connection error.')
+ return
+
+ # Process request
+ #
+ try:
+ subrealm_pattern = re.compile('([a-z0-9\.]+)\.{}'.format('sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd'))))
+ m = subrealm_pattern.match(KSR.pv.get('$rd'))
+ if m:
+ switchname = m.group(1)
+ if switchname in self.freeswitch_switchname_list:
+ return 'line-{}'.format(switchname)
+
+ else:
+ logging.error('Switch "{}" not found in topology database.'.format(switchname))
+ return
+
+ cursor = manager_cnx.cursor()
+ sip_username = KSR.pv.get("$fU")
+ query = 'SELECT T.domain FROM tenant T, line_link L WHERE L.tenant_id = T.id AND L.sip_username = %s LIMIT 1'
+ cursor.execute(query, [sip_username])
+ row = cursor.fetchone()
+ cursor.close()
+ if not row:
+ logging.error('Tenant data not found in manager database for user "{}"'.format(sip_username))
+ return
+
+ tenant_domain = str(row[0])
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio get_fspool_realm operation error.')
+ return
+
+ finally:
+ manager_cnx.close()
+
+ # Get topology db connection
+ #
+ try:
+ topology_cnx = mysql.connector.connect(**self.topology_config)
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Topology DB connection error.')
+ return
+
+ # Process request
+ #
+ try:
+ cursor = topology_cnx.cursor()
+ query = 'SELECT P.name,A.domain FROM freeswitch_pool P, tenant T, access_network A WHERE T.freeswitch_pool_id = P.id AND A.id = T.access_network_id AND T.domain = %s LIMIT 1'
+ cursor.execute(query, [tenant_domain])
+ row = cursor.fetchone()
+ if not row:
+ logging.error('FreeswitchPool data not found in topology database for user in domain {}'.format(tenant_domain))
+ cursor.close()
+ return
+
+ realm = 'line-{}.{}'.format(row[0], row[1])
+ cursor.close()
+ return realm
+
+ except Exception as e:
+ logging.exception(e)
+ logging.error('Kamailio get_fspool_realm operation error.')
+ return
+
+ finally:
+ topology_cnx.close()
diff --git a/templates/mail_relay/000-default.conf b/templates/mail_relay/000-default.conf
new file mode 100644
index 0000000..7b2a864
--- /dev/null
+++ b/templates/mail_relay/000-default.conf
@@ -0,0 +1,7 @@
+
+ ServerAdmin webmaster@localhost
+ DocumentRoot ${APACHE_DOCUMENT_ROOT}
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
diff --git a/templates/mail_relay/main.cf b/templates/mail_relay/main.cf
new file mode 100644
index 0000000..768d1c3
--- /dev/null
+++ b/templates/mail_relay/main.cf
@@ -0,0 +1,21 @@
+smtpd_banner = ACCESS_DOMAIN_NAME
+biff = no
+append_dot_mydomain = no
+readme_directory = no
+smtpd_tls_cert_file=/etc/ssl/certs/conpeek_ssl.crt
+smtpd_tls_key_file=/etc/ssl/private/conpeek_ssl.key
+smtpd_tls_security_level=may
+smtp_tls_CApath=/etc/ssl/certs
+smtp_tls_security_level=may
+smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
+smtp_bind_address = 0.0.0.0
+smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
+myhostname = ACCESS_DOMAIN_NAME
+alias_maps = hash:/etc/aliases
+alias_database = hash:/etc/aliases
+mydestination = $myhostname, mail.$myhostname, localhost.localdomain, localhost
+mynetworks = POSTFIX_MYNETWORKS
+mailbox_size_limit = 0
+recipient_delimiter = +
+inet_protocols = ipv4
+debug_peer_level = 10
diff --git a/templates/mail_relay/ports.conf b/templates/mail_relay/ports.conf
new file mode 100644
index 0000000..443ad1e
--- /dev/null
+++ b/templates/mail_relay/ports.conf
@@ -0,0 +1,9 @@
+Listen 83
+
+
+ Listen 443
+
+
+
+ Listen 443
+
diff --git a/templates/mariadb/01_create_db_topology.sql b/templates/mariadb/01_create_db_topology.sql
new file mode 100644
index 0000000..6f52584
--- /dev/null
+++ b/templates/mariadb/01_create_db_topology.sql
@@ -0,0 +1,1886 @@
+-- MySQL Script generated by MySQL Workbench
+-- Thu Jun 9 15:32:24 2022
+-- Model: New Model Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
+
+-- -----------------------------------------------------
+-- Schema topology
+-- -----------------------------------------------------
+DROP SCHEMA IF EXISTS `topology` ;
+
+-- -----------------------------------------------------
+-- Schema topology
+-- -----------------------------------------------------
+CREATE SCHEMA IF NOT EXISTS `topology` DEFAULT CHARACTER SET utf8 ;
+USE `topology` ;
+
+-- -----------------------------------------------------
+-- Table `topology`.`system`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`system` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`system` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `network_domain` VARCHAR(100) NOT NULL,
+ `ipv4_network_address` VARCHAR(45) NOT NULL,
+ `ipv4_network_mask` VARCHAR(45) NOT NULL,
+ `manager_db_host` VARCHAR(45) NOT NULL,
+ `manager_db_user` VARCHAR(45) NOT NULL,
+ `manager_db_password` VARCHAR(45) NOT NULL,
+ `amqp_host` VARCHAR(45) NOT NULL,
+ `amqp_user` VARCHAR(45) NOT NULL,
+ `amqp_password` VARCHAR(45) NOT NULL,
+ `token_secretkey` VARCHAR(100) NOT NULL,
+ `token_issuer` VARCHAR(45) NOT NULL,
+ `token_audience` VARCHAR(45) NOT NULL,
+ `user_token_expiration_time` INT NOT NULL,
+ `tenant_token_expiration_time` INT NULL,
+ `remote_public_key` TEXT NOT NULL,
+ `remote_private_key` TEXT NOT NULL,
+ `facebook_app_id` TEXT NULL DEFAULT NULL,
+ `facebook_app_secret` TEXT NULL DEFAULT NULL,
+ `facebook_app_token` TEXT NULL DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ UNIQUE INDEX `manager_db_host_UNIQUE` (`manager_db_host` ASC),
+ UNIQUE INDEX `amqp_host_UNIQUE` (`amqp_host` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`server_node`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`server_node` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`server_node` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_ipv4_address` VARCHAR(45) NOT NULL,
+ `system_ipv4_mask` VARCHAR(45) NOT NULL,
+ `data_ipv4_address` VARCHAR(45) NULL,
+ `data_ipv4_mask` VARCHAR(45) NULL,
+ `management_ipv4_address` VARCHAR(45) NULL,
+ `management_ipv4_mask` VARCHAR(45) NULL,
+ `console_ipv4_address` VARCHAR(45) NULL,
+ `console_ipv4_mask` VARCHAR(45) NULL,
+ `access_network_interface` VARCHAR(45) NULL,
+ `telco_network_interface` VARCHAR(45) NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_server_node_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`nginx`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`nginx` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`nginx` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_nginx_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_nginx_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_operator_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`access_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`access_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`access_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `ipv4_network_address` VARCHAR(45) NOT NULL,
+ `ipv4_network_mask` VARCHAR(45) NOT NULL,
+ `ipv4_gateway_address` VARCHAR(45) NOT NULL,
+ `8021q_vlan_id` INT NOT NULL,
+ `ssl_certificate` TEXT NOT NULL,
+ `ssl_key` TEXT NOT NULL,
+ `site_ssl_certificate` TEXT NULL,
+ `site_ssl_key` TEXT NULL,
+ `core_smtp_port` INT NULL,
+ `operator_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_access_network_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`hubspot_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`hubspot_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`hubspot_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `application_id` VARCHAR(45) NOT NULL,
+ `client_id` VARCHAR(45) NOT NULL,
+ `client_secret` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `developer_api_key` VARCHAR(45) NOT NULL,
+ `developer_user_id` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`mongodb_replicaset`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`mongodb_replicaset` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`mongodb_replicaset` (
+ `id` INT NOT NULL,
+ `name` VARCHAR(45) NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `operator_api_server_id` INT NOT NULL,
+ `hubspot_server_id` INT NULL,
+ `system_id` INT NOT NULL,
+ `mongodb_replicaset_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `domain_UNIQUE` (`domain` ASC),
+ INDEX `fk_operator_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_operator_operator_api_server1_idx` (`operator_api_server_id` ASC),
+ INDEX `fk_operator_hubspot_server1_idx` (`hubspot_server_id` ASC),
+ INDEX `fk_operator_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`session_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`session_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`session_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `wss_port` INT NOT NULL,
+ `state_machine_private_api_port` INT NOT NULL,
+ `state_machine_mi_port` INT NOT NULL,
+ `monitoring_api_port` INT NOT NULL,
+ `monitoring_wss_port` INT NOT NULL,
+ `session_server_db_host` VARCHAR(45) NOT NULL,
+ `session_server_db_user` VARCHAR(45) NOT NULL,
+ `session_server_db_password` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_session_server_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`file_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`file_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`file_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `directory` VARCHAR(100) NOT NULL,
+ `aws_region_name` VARCHAR(45) NULL,
+ `aws_access_key_identifier` VARCHAR(128) NULL,
+ `aws_access_key_secret` VARCHAR(128) NULL,
+ `google_application_credentials_file` VARCHAR(255) NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_file_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_file_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_file_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`cdr_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`cdr_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`cdr_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_cdr_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_cdr_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_cdr_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`freeswitch`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`freeswitch` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`freeswitch` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL DEFAULT 'fs1',
+ `event_socket_password` VARCHAR(45) NOT NULL DEFAULT 'aR3H2vxs',
+ `sip_profile_line_count` INT NOT NULL DEFAULT 1,
+ `line_srv_priority` INT NOT NULL DEFAULT 100,
+ `line_srv_weight` INT NOT NULL DEFAULT 100,
+ `sip_profile_gateway_count` INT NOT NULL DEFAULT 1,
+ `gateway_srv_priority` INT NOT NULL DEFAULT 100,
+ `gateway_srv_weight` INT ZEROFILL NOT NULL DEFAULT 100,
+ `recording_path` VARCHAR(255) NOT NULL DEFAULT '/recording',
+ `max_fs_db_handles` INT NOT NULL DEFAULT 64,
+ `max_sessions` INT NOT NULL DEFAULT 1000,
+ `max_sps` INT NOT NULL DEFAULT 30,
+ `amd_license_limit` INT NOT NULL DEFAULT 0,
+ `rtp_port_min` INT NOT NULL DEFAULT 16384,
+ `rtp_port_max` INT NOT NULL DEFAULT 32767,
+ `recording_pcap_path` VARCHAR(255) NOT NULL DEFAULT '/data/pcaps',
+ `bot_recorder_port` INT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `switchname_UNIQUE` (`name` ASC),
+ INDEX `fk_freeswitch_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC),
+ INDEX `fk_freeswitch_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_freeswitch_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`freeswitch_pool`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`freeswitch_pool` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`freeswitch_pool` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ `presence_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_softswitch_pool_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_freeswitch_pool_freeswitch1_idx` (`presence_server_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`kamailio`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`kamailio` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`kamailio` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `kamailio_db_ipv4` VARCHAR(45) NOT NULL,
+ `kamailio_db_user` VARCHAR(45) NOT NULL,
+ `kamailio_db_password` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_kamailio_system1_idx` (`system_id` ASC),
+ INDEX `fk_kamailio_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `initial_application_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_tenant_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`provisioning_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`provisioning_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`provisioning_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `initial_application_port` INT NOT NULL,
+ `initial_management_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_provisioning_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`gateway_pool`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`gateway_pool` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`gateway_pool` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_gateway_pool_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`telco_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`telco_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`telco_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `ipv4_network_address` VARCHAR(45) NOT NULL,
+ `ipv4_network_mask` VARCHAR(45) NOT NULL,
+ `ipv4_gateway_address` VARCHAR(45) NOT NULL,
+ `8021q_vlan_id` INT NOT NULL,
+ `presentation_preservation_policy` VARCHAR(45) NOT NULL DEFAULT 'DIRECT' COMMENT 'DIRECT|DIVERSION',
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_telco_network_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`sms_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`sms_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`sms_server` (
+ `id` INT NOT NULL,
+ `name` VARCHAR(45) NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `sms_protocol` VARCHAR(45) NULL,
+ `json_config` TEXT NULL,
+ `sms_server_db_host` VARCHAR(45) NOT NULL,
+ `sms_server_db_user` VARCHAR(45) NOT NULL,
+ `sms_server_db_password` VARCHAR(45) NOT NULL,
+ `smsapi_client_id` VARCHAR(255) NULL,
+ `smsapi_client_secret` VARCHAR(255) NULL,
+ `nginx_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `mongodb_replicaset_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_sms_server_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_sms_server_server_node1_idx` (`server_node_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_sms_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_sms_server_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC),
+ INDEX `fk_sms_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_plugin_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_plugin_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_plugin_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `initial_application_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_plugin_api_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_tenant_plugin_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_tenant_plugin_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`anti_fraud_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`anti_fraud_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`anti_fraud_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_anti_fraud_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_anti_fraud_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`report_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`report_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`report_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `process_count` INT NOT NULL DEFAULT 3,
+ `api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_report_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_report_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_report_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_bss_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_bss_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_bss_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `initial_application_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_bss_api_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_tenant_bss_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_tenant_bss_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`local_contact_db_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`local_contact_db_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`local_contact_db_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `public_api_port` INT NULL,
+ `mi_port` INT NOT NULL,
+ `bookingsync_client_id` VARCHAR(255) NULL,
+ `bookingsync_client_secret` VARCHAR(255) NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_local_contact_db_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`team_viewer_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`team_viewer_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`team_viewer_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `public_api_port` INT NOT NULL,
+ `api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_team_viewer_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_team_viewer_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_team_viewer_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`zammad_contact_db_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`zammad_contact_db_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`zammad_contact_db_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_zammad_contact_db_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_zammad_contact_db_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_zammad_contact_db_server_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_zammad_contact_db_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`livespace_contact_db_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`livespace_contact_db_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`livespace_contact_db_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_livespace_contact_db_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_livespace_contact_db_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_livespace_contact_db_server_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_livespace_contact_db_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`salesforce_contact_db_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`salesforce_contact_db_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`salesforce_contact_db_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_salesforce_contact_db_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_salesforce_contact_db_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_salesforce_contact_db_server_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_salesforce_contact_db_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`dynamics_contact_db_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`dynamics_contact_db_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`dynamics_contact_db_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_dynamics_contact_db_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_dynamics_contact_db_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_dynamics_contact_db_server_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_dynamics_contact_db_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`idenfy_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`idenfy_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`idenfy_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_idenfy_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_idenfy_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_idenfy_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`fully_verified_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`fully_verified_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`fully_verified_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_fully_verified_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_fully_verified_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_fully_verified_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`talkieai_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`talkieai_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`talkieai_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_talkieai_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_talkieai_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_talkieai_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`mailbox_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`mailbox_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`mailbox_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `json_config` TEXT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`messaging_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`messaging_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`messaging_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `bookingsync_public_api_port` INT NULL,
+ `bookingsync_api_port` INT NULL,
+ `bookingsync_private_api_port` INT NULL,
+ `bookingsync_client_id` VARCHAR(255) NULL,
+ `bookingsync_client_secret` VARCHAR(255) NULL,
+ `wss_port` INT NOT NULL,
+ `mi_port` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_messaging_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`techmo_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`techmo_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`techmo_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `techmo_server_address` VARCHAR(255) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_messaging_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`ldap_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`ldap_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`ldap_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `login` VARCHAR(255) NOT NULL,
+ `password` VARCHAR(255) NOT NULL,
+ `port` INT NOT NULL DEFAULT 389,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`login` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`facebook_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`facebook_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`facebook_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `app_id` VARCHAR(255) NOT NULL,
+ `app_secret` VARCHAR(255) NOT NULL,
+ `verify_token` VARCHAR(255) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_fb_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_fb_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_fb_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`messagebird_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`messagebird_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`messagebird_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `public_api_port` INT NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_whatsapp_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_whatsapp_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_whatsapp_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`user_notification_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`user_notification_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`user_notification_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_api_port` INT NULL,
+ `wss_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_web_polling_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_web_polling_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_web_polling_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `initial_application_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`ticketing_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`ticketing_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`ticketing_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_port` INT NOT NULL,
+ `private_api_port` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `anti_fraud_lock` INT NOT NULL DEFAULT 0,
+ `session_server_id` INT NOT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ `gateway_pool_id` INT NOT NULL,
+ `kamailio_id` INT NOT NULL,
+ `anti_fraud_server_id` INT NOT NULL,
+ `file_server_id` INT NOT NULL,
+ `cdr_server_id` INT NOT NULL,
+ `tenant_api_server_id` INT NOT NULL,
+ `tenant_plugin_api_server_id` INT NOT NULL,
+ `tenant_bss_api_server_id` INT NOT NULL,
+ `provisioning_server_id` INT NOT NULL,
+ `facebook_server_id` INT NULL,
+ `messagebird_server_id` INT NULL,
+ `sms_server_id` INT NULL,
+ `telco_network_id` INT NULL,
+ `access_network_id` INT NOT NULL,
+ `mongodb_replicaset_id` INT NOT NULL,
+ `report_server_id` INT NOT NULL,
+ `mailbox_server_id` INT NULL,
+ `team_viewer_server_id` INT NULL,
+ `local_contact_db_server_id` INT NOT NULL,
+ `zammad_contact_db_server_id` INT NULL,
+ `livespace_contact_db_server_id` INT NULL,
+ `salesforce_contact_db_server_id` INT NULL,
+ `dynamics_contact_db_server_id` INT NULL,
+ `fully_verified_server_id` INT NULL,
+ `idenfy_server_id` INT NULL,
+ `talkieai_server_id` INT NULL,
+ `techmo_server_id` INT NULL,
+ `ldap_server_id` INT NULL,
+ `messaging_server_id` INT NOT NULL,
+ `user_notification_server_id` INT NULL,
+ `tenant_web_polling_api_server_id` INT NOT NULL,
+ `ticketing_server_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_session_server1_idx` (`session_server_id` ASC),
+ INDEX `fk_tenant_file_server1_idx` (`file_server_id` ASC),
+ INDEX `fk_tenant_cdr_server1_idx` (`cdr_server_id` ASC),
+ UNIQUE INDEX `domain_UNIQUE` (`domain` ASC),
+ INDEX `fk_tenant_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC),
+ INDEX `fk_tenant_system1_idx` (`system_id` ASC),
+ INDEX `fk_tenant_kamailio1_idx` (`kamailio_id` ASC),
+ INDEX `fk_tenant_tenant_api_server1_idx` (`tenant_api_server_id` ASC),
+ INDEX `fk_tenant_provisioning_server1_idx` (`provisioning_server_id` ASC),
+ INDEX `fk_tenant_gateway_pool1_idx` (`gateway_pool_id` ASC),
+ INDEX `fk_tenant_telco_network1_idx` (`telco_network_id` ASC),
+ INDEX `fk_tenant_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_tenant_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC),
+ INDEX `fk_tenant_sms_server1_idx` (`sms_server_id` ASC),
+ INDEX `fk_tenant_tenant_plugin_api_server1_idx` (`tenant_plugin_api_server_id` ASC),
+ INDEX `fk_tenant_anti_fraud_server1_idx` (`anti_fraud_server_id` ASC),
+ INDEX `fk_tenant_report_server1_idx` (`report_server_id` ASC),
+ INDEX `fk_tenant_tenant_bss_api_server1_idx` (`tenant_bss_api_server_id` ASC),
+ INDEX `fk_tenant_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_tenant_local_contact_db_server1_idx` (`local_contact_db_server_id` ASC),
+ INDEX `fk_tenant_team_viewer_server1_idx` (`team_viewer_server_id` ASC),
+ INDEX `fk_tenant_zammad_contact_db_server1_idx` (`zammad_contact_db_server_id` ASC),
+ INDEX `fk_tenant_livespace_contact_db_server1_idx` (`livespace_contact_db_server_id` ASC),
+ INDEX `fk_tenant_salesforce_contact_db_server1_idx` (`salesforce_contact_db_server_id` ASC),
+ INDEX `fk_tenant_dynamics_contact_db_server1_idx` (`dynamics_contact_db_server_id` ASC),
+ INDEX `fk_tenant_idenfy_server1_idx` (`idenfy_server_id` ASC),
+ INDEX `fk_tenant_fully_verified_server1_idx` (`fully_verified_server_id` ASC),
+ INDEX `fk_tenant_talkieai_server1_idx` (`talkieai_server_id` ASC),
+ INDEX `fk_tenant_mailbox_server1_idx` (`mailbox_server_id` ASC),
+ INDEX `fk_tenant_messaging_server1_idx` (`messaging_server_id` ASC),
+ INDEX `fk_tenant_techmo_server1_idx` (`techmo_server_id` ASC),
+ INDEX `fk_tenant_ldap_server1_idx` (`ldap_server_id` ASC),
+ INDEX `fk_tenant_facebook_server1_idx` (`facebook_server_id` ASC),
+ INDEX `fk_tenant_messagebird_server1_idx` (`messagebird_server_id` ASC),
+ INDEX `fk_tenant_user_notification_server1_idx` (`user_notification_server_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_tenant_tenant_web_polling_api_server1_idx` (`tenant_web_polling_api_server_id` ASC),
+ INDEX `fk_tenant_ticketing_server1_idx` (`ticketing_server_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_gateway`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_gateway` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_gateway` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `username` VARCHAR(90) NULL,
+ `realm` VARCHAR(90) NULL,
+ `from_user` VARCHAR(90) NULL,
+ `from_domain` VARCHAR(90) NULL,
+ `password` VARCHAR(90) NULL,
+ `extension` VARCHAR(90) NULL,
+ `proxy` VARCHAR(90) NULL,
+ `register_proxy` VARCHAR(90) NULL,
+ `expire_seconds` INT NULL,
+ `register` TINYINT(1) NULL DEFAULT 0,
+ `register_transport` VARCHAR(45) NULL DEFAULT 'udp',
+ `retry_seconds` INT NULL,
+ `caller_id_in_from` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_params` VARCHAR(255) NULL,
+ `ping` INT NULL,
+ `validate_e164` TINYINT(1) NOT NULL DEFAULT 1,
+ `presentation_preservation_policy` VARCHAR(45) NOT NULL DEFAULT 'DIRECT' COMMENT 'DIRECT | DIVERSION | DISABLED',
+ `diversion_header_format` VARCHAR(255) NOT NULL DEFAULT '{}',
+ `sip_cid_type` VARCHAR(45) NOT NULL DEFAULT 'pid' COMMENT '\'pid | rpid | none\'',
+ `telco_network_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_gateway_telco_network1_idx` (`telco_network_id` ASC),
+ INDEX `fk_operator_gateway_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`normalization`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`normalization` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`normalization` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `direction` VARCHAR(45) NOT NULL DEFAULT 'OUTBOUND' COMMENT 'INBOUND | OUTBOUND',
+ `peer` VARCHAR(45) NOT NULL DEFAULT 'caller' COMMENT 'caller | calee',
+ `pattern` VARCHAR(255) NOT NULL,
+ `replacement` VARCHAR(45) NOT NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `operator_gateway_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_normalization_operator_gateway1_idx` (`operator_gateway_id` ASC),
+ INDEX `fk_normalization_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`gateway`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`gateway` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`gateway` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `event_socket_password` VARCHAR(45) NOT NULL,
+ `sip_profile_internal_count` INT NOT NULL,
+ `internal_srv_priority` INT NOT NULL DEFAULT 100,
+ `internal_srv_weight` INT NOT NULL DEFAULT 100,
+ `sip_profile_external_count` INT NOT NULL,
+ `external_srv_priority` INT NOT NULL DEFAULT 100,
+ `external_srv_weight` INT NOT NULL DEFAULT 100,
+ `gateway_pool_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_gateway_gateway_pool1_idx` (`gateway_pool_id` ASC),
+ INDEX `fk_gateway_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`country_acl`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`country_acl` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`country_acl` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `list_type` VARCHAR(45) NOT NULL COMMENT 'BLACK|WHITE',
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `operator_id`),
+ INDEX `fk_country_acl_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`country_acl_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`country_acl_item` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`country_acl_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `iso_code` VARCHAR(2) NOT NULL,
+ `country_acl_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_country_acl_item_country_acl1_idx` (`country_acl_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_login_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_login_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_login_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_login_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`system_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`system_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`system_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `api_listener_count` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_system_api_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_tenant_app_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`system_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`system_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`system_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_system_app_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_system_app_server_nginx1_idx` (`nginx_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_reseller_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_reseller_app_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`sip_profile_param`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`sip_profile_param` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`sip_profile_param` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`sip_profile_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`sip_profile_setting` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`sip_profile_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `value` VARCHAR(45) NOT NULL,
+ `sip_profile_param_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_sip_profile_setting_sip_profile_param1_idx` (`sip_profile_param_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`line_has_profile_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`line_has_profile_setting` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`line_has_profile_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ `sip_profile_setting_id` INT NOT NULL,
+ INDEX `fk_freeswitch_pool_has_sip_profile_setting_sip_profile_sett_idx` (`sip_profile_setting_id` ASC),
+ INDEX `fk_freeswitch_pool_has_sip_profile_setting_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`gateway_has_profile_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`gateway_has_profile_setting` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`gateway_has_profile_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ `sip_profile_setting_id` INT NOT NULL,
+ INDEX `fk_freeswitch_pool_has_sip_profile_setting_sip_profile_sett_idx` (`sip_profile_setting_id` ASC),
+ INDEX `fk_freeswitch_pool_has_sip_profile_setting_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`internal_has_profile_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`internal_has_profile_setting` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`internal_has_profile_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL,
+ `gateway_pool_id` INT NOT NULL,
+ `sip_profile_setting_id` INT NOT NULL,
+ INDEX `fk_gateway_pool_has_sip_profile_setting_sip_profile_setting_idx` (`sip_profile_setting_id` ASC),
+ INDEX `fk_gateway_pool_has_sip_profile_setting_gateway_pool1_idx` (`gateway_pool_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`external_has_profile_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`external_has_profile_setting` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`external_has_profile_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL,
+ `gateway_pool_id` INT NOT NULL,
+ `sip_profile_setting_id` INT NOT NULL,
+ INDEX `fk_gateway_pool_has_sip_profile_setting_sip_profile_setting_idx` (`sip_profile_setting_id` ASC),
+ INDEX `fk_gateway_pool_has_sip_profile_setting_gateway_pool1_idx` (`gateway_pool_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`server_node_has_access_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`server_node_has_access_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`server_node_has_access_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ipv4_address` VARCHAR(45) NOT NULL,
+ `ext_ipv4_address` VARCHAR(45) NULL,
+ `server_node_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_server_node_has_access_network_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_server_node_has_access_network_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`server_node_has_telco_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`server_node_has_telco_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`server_node_has_telco_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ipv4_address` VARCHAR(45) NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `telco_network_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_server_node_has_telco_network_telco_network1_idx` (`telco_network_id` ASC),
+ INDEX `fk_server_node_has_telco_network_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_freeswitch_pool`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_freeswitch_pool` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_freeswitch_pool` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_freeswitch_pool_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC),
+ INDEX `fk_operator_has_freeswitch_pool_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_gateway_pool`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_gateway_pool` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_gateway_pool` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `gateway_pool_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_gateway_pool_gateway_pool1_idx` (`gateway_pool_id` ASC),
+ INDEX `fk_operator_has_gateway_pool_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`mongodb_node`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`mongodb_node` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`mongodb_node` (
+ `id` INT NOT NULL,
+ `name` VARCHAR(45) NULL,
+ `db_user` VARCHAR(45) NULL,
+ `db_password` VARCHAR(45) NULL,
+ `db_path` VARCHAR(45) NULL,
+ `arbiter_only` TINYINT(1) NULL,
+ `mongodb_replicaset_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_mongodb_node_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC),
+ INDEX `fk_mongodb_node_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`domain_name_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`domain_name_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`domain_name_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `server_node_id`),
+ INDEX `fk_domain_name_server_system1_idx` (`system_id` ASC),
+ INDEX `fk_domain_name_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_kamailio`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_kamailio` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_kamailio` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `kamailio_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_kamailio_kamailio1_idx` (`kamailio_id` ASC),
+ INDEX `fk_operator_has_kamailio_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_file_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_file_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_file_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `file_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_file_server_file_server1_idx` (`file_server_id` ASC),
+ INDEX `fk_operator_has_file_server_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_cdr_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_cdr_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_cdr_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `cdr_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_cdr_server_cdr_server1_idx` (`cdr_server_id` ASC),
+ INDEX `fk_operator_has_cdr_server_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_tenant_api_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_tenant_api_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_api_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `tenant_api_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_tenant_api_server_tenant_api_server1_idx` (`tenant_api_server_id` ASC),
+ INDEX `fk_operator_has_tenant_api_server_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_prov_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_prov_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_prov_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `provisioning_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_provisioning_server_provisioning_server1_idx` (`provisioning_server_id` ASC),
+ INDEX `fk_operator_has_provisioning_server_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_sms_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_sms_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_sms_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `sms_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_sms_server_sms_server1_idx` (`sms_server_id` ASC),
+ INDEX `fk_operator_has_sms_server_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_anti_fraud_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_anti_fraud_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_anti_fraud_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `anti_fraud_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_anti_fraud_server_anti_fraud_server1_idx` (`anti_fraud_server_id` ASC),
+ INDEX `fk_operator_has_anti_fraud_server_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_plugin_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_plugin_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_plugin_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `tenant_plugin_api_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_tenant_plugin_api_server_tenant_plugin_api__idx` (`tenant_plugin_api_server_id` ASC),
+ INDEX `fk_operator_has_tenant_plugin_api_server_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_mail_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_mail_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_mail_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `mail_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_mail_server_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_fb_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_fb_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_fb_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `fb_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_fb_server_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_operator_has_fb_server_fb_server1_idx` (`fb_server_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_report_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_report_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_report_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `report_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_report_server_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_operator_has_report_server_report_server1_idx` (`report_server_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`communicator_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`communicator_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`communicator_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_communicator_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_communicator_app_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`device_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`device_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`device_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_device_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_device_app_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`wallboard_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`wallboard_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`wallboard_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_wallboard_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_wallboard_app_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_tenant_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_tenant_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `tenant_app_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_tenant_app_server_tenant_app_server1_idx` (`tenant_app_server_id` ASC),
+ INDEX `fk_operator_has_tenant_app_server_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_tenant_bss_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_tenant_bss_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_bss_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `tenant_bss_api_server_id` INT NOT NULL,
+ INDEX `fk_operator_has_tenant_bss_api_server_tenant_bss_api_server_idx` (`tenant_bss_api_server_id` ASC),
+ INDEX `fk_operator_has_tenant_bss_api_server_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`invitation_app_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`invitation_app_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`invitation_app_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `app_listener_count` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_invitation_app_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_invitation_app_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_invitation_app_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`model_version`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`model_version` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`model_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `serial` VARCHAR(45) NOT NULL,
+ `dirty` TINYINT(1) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_routing`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_routing` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_routing` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `src_number_to_charge` VARCHAR(45) NULL,
+ `src_presentation_number` VARCHAR(45) NULL,
+ `dst` VARCHAR(45) NULL,
+ `priority` INT NULL,
+ `operator_gateway_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_routing_operator_gateway1_idx` (`operator_gateway_id` ASC),
+ INDEX `fk_operator_routing_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_access_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_access_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_access_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `access_network_id` INT NOT NULL,
+ INDEX `fk_operator_has_access_network_access_network1_idx` (`access_network_id` ASC),
+ INDEX `fk_operator_has_access_network_operator1_idx` (`operator_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`operator_has_telco_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`operator_has_telco_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`operator_has_telco_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `operator_id` INT NOT NULL,
+ `telco_network_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_has_telco_network_telco_network1_idx` (`telco_network_id` ASC),
+ INDEX `fk_operator_has_telco_network_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`gus_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`gus_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`gus_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `wsdl` VARCHAR(200) NULL,
+ `service_url` VARCHAR(200) NULL,
+ `service_key` VARCHAR(100) NULL,
+ `public_api_port` INT NOT NULL,
+ `nginx_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_gus_server_nginx1_idx` (`nginx_id` ASC),
+ INDEX `fk_gus_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_gus_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`tenant_has_telco_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`tenant_has_telco_network` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`tenant_has_telco_network` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `gateway_external_sip_port` INT NOT NULL,
+ `telco_network_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_has_telco_network_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_has_telco_network_telco_network1_idx` (`telco_network_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`storage`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`storage` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`storage` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `storage_type` VARCHAR(45) NOT NULL DEFAULT 'LOCAL' COMMENT 'LOCAL|NFS|S3',
+ `path` VARCHAR(255) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `file_server_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_storage_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_storage_file_server1_idx` (`file_server_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`mail_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`mail_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`mail_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `directory` VARCHAR(255) NOT NULL,
+ `system_id` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_session_server_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`mrcp_profile`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`mrcp_profile` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`mrcp_profile` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `version` INT NOT NULL DEFAULT 2,
+ `rtp_port_min` INT NOT NULL DEFAULT 4000,
+ `rtp_port_max` INT NOT NULL DEFAULT 5000,
+ `speechsynth` VARCHAR(45) NULL,
+ `speechrecog` VARCHAR(45) NULL,
+ `sip_transport` VARCHAR(45) NULL,
+ `server_ip` VARCHAR(45) NULL,
+ `server_port` INT NULL,
+ `freeswitch_pool_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_mrcp_profile_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`bot_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`bot_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`bot_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_port` INT NOT NULL,
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_bot_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_bot_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `topology`.`bot_train_server`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `topology`.`bot_train_server` ;
+
+CREATE TABLE IF NOT EXISTS `topology`.`bot_train_server` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `private_port` INT NOT NULL,
+ `pool_process_limit` INT NOT NULL DEFAULT (3),
+ `server_node_id` INT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_bot_train_server_server_node1_idx` (`server_node_id` ASC),
+ INDEX `fk_bot_train_server_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/templates/mariadb/02_create_db_manager.sql b/templates/mariadb/02_create_db_manager.sql
new file mode 100644
index 0000000..355efd0
--- /dev/null
+++ b/templates/mariadb/02_create_db_manager.sql
@@ -0,0 +1,6054 @@
+-- MySQL Script generated by MySQL Workbench
+-- Wed Jul 20 08:48:19 2022
+-- Model: New Model Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
+
+-- -----------------------------------------------------
+-- Schema manager
+-- -----------------------------------------------------
+DROP SCHEMA IF EXISTS `manager` ;
+
+-- -----------------------------------------------------
+-- Schema manager
+-- -----------------------------------------------------
+CREATE SCHEMA IF NOT EXISTS `manager` DEFAULT CHARACTER SET utf8 ;
+USE `manager` ;
+
+-- -----------------------------------------------------
+-- Table `manager`.`system`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `domain` VARCHAR(45) NULL,
+ `description` VARCHAR(255) NULL,
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en',
+ `default_tenant_id` INT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ UNIQUE INDEX `domain_UNIQUE` (`domain` ASC),
+ INDEX `fk_system_tenant1_idx` (`default_tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `domain` VARCHAR(45) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `email` VARCHAR(100) NOT NULL,
+ `phone` VARCHAR(45) NULL,
+ `country` VARCHAR(45) NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address_1` VARCHAR(100) NULL,
+ `address_2` VARCHAR(100) NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_operator_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dealer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dealer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dealer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NULL,
+ `firstname` VARCHAR(45) NULL,
+ `surname` VARCHAR(45) NULL,
+ `phone` VARCHAR(45) NULL,
+ `dealer_type` VARCHAR(45) NOT NULL COMMENT 'PERSON|BUSINESS',
+ `active` TINYINT(1) NOT NULL,
+ `email` VARCHAR(100) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address_1` VARCHAR(100) NULL,
+ `address_2` VARCHAR(100) NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `email_UNIQUE` (`email` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_dealer_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`special_service_zone`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`special_service_zone` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`special_service_zone` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `zone_code` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `country_iso_alpha2_code` VARCHAR(45) NOT NULL,
+ `province` VARCHAR(45) NULL,
+ `city` VARCHAR(45) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `district` VARCHAR(45) NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_emergency_zones_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `uuid` VARCHAR(36) NOT NULL,
+ `name` VARCHAR(100) NOT NULL,
+ `domain` VARCHAR(45) NOT NULL,
+ `time_zone` VARCHAR(100) NOT NULL DEFAULT 'Europe/Warsaw',
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en',
+ `deleted` TINYINT(1) NOT NULL DEFAULT 0,
+ `active` TINYINT(1) NOT NULL DEFAULT 1,
+ `anonymous_sessions` TINYINT(1) NOT NULL,
+ `last_resort_ddi` VARCHAR(45) NULL,
+ `country` VARCHAR(45) NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `city` VARCHAR(45) NULL,
+ `address_1` VARCHAR(100) NULL,
+ `address_2` VARCHAR(100) NULL,
+ `user_device_verification` TINYINT(1) NOT NULL DEFAULT 0,
+ `external_call_timeout` INT NOT NULL DEFAULT 120,
+ `pro_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `note` TEXT NULL,
+ `simultaneous_calls_limit` INT NOT NULL DEFAULT 100,
+ `dealer_id` INT NULL,
+ `default_special_service_zone_id` INT NULL,
+ `system_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `domain_UNIQUE` (`domain` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ UNIQUE INDEX `api_id_domain_UNIQUE` (`domain` ASC),
+ UNIQUE INDEX `uuid_UNIQUE` (`uuid` ASC),
+ INDEX `fk_tenant_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_tenant_dealer1_idx` (`dealer_id` ASC),
+ INDEX `fk_tenant_special_service_zone1_idx` (`default_special_service_zone_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_wallet`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_wallet` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_wallet` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `debit_enable` TINYINT(1) NOT NULL,
+ `debit_limit` DECIMAL(17,2) NULL,
+ `balance` DECIMAL(17,2) NOT NULL,
+ `min_withdraw` DECIMAL(17,2) NOT NULL DEFAULT 0,
+ `withdraw_cost` DECIMAL(17,2) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_wallet_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `account_number` VARCHAR(100) NULL,
+ `account_type` VARCHAR(45) NOT NULL COMMENT 'CUSTOMER|PARTNER',
+ `company` TINYINT(1) NOT NULL COMMENT 'COMPANY|PERSON',
+ `company_name` VARCHAR(100) NULL,
+ `tax_identification_number` VARCHAR(45) NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `country` VARCHAR(45) NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `city` VARCHAR(45) NULL,
+ `address_1` VARCHAR(100) NULL,
+ `address_2` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_client_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `customer_number_UNIQUE` (`account_number` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`team`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`team` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`team` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `target_identifier` VARCHAR(45) NOT NULL,
+ `tag_for_cdr` VARCHAR(255) NULL,
+ `show_only_assigned_projects` TINYINT(1) NOT NULL DEFAULT 0,
+ `limit_coffee_break_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `limit_coffee_break_per_day_count` INT NOT NULL DEFAULT 30,
+ `coffee_break_exceed_notify_user` TINYINT(1) NOT NULL DEFAULT 0,
+ `coffee_break_exceed_notify_managers` TINYINT(1) NOT NULL DEFAULT 0,
+ `limit_business_break_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `limit_business_break_per_day_count` INT NOT NULL DEFAULT 30,
+ `business_break_exceed_notify_user` TINYINT(1) NOT NULL DEFAULT 0,
+ `business_break_exceed_notify_managers` TINYINT(1) NOT NULL DEFAULT 0,
+ `team_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_team_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_team_team1_idx` (`team_id` ASC),
+ UNIQUE INDEX `uq_tenant_name` (`tenant_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `username` VARCHAR(45) NOT NULL,
+ `password` VARCHAR(100) NOT NULL,
+ `password_change_enforce` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_expiration_date` DATETIME NULL,
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en',
+ `deleted` TINYINT(1) NOT NULL DEFAULT 0,
+ `active` TINYINT(1) NOT NULL DEFAULT 1,
+ `on_leave` TINYINT(1) NOT NULL DEFAULT 0,
+ `leave_cause` VARCHAR(45) NULL COMMENT 'VACATION|SICK',
+ `email` VARCHAR(45) NULL,
+ `phone_number_notification` VARCHAR(45) NULL,
+ `firstname` VARCHAR(45) NULL,
+ `surname` VARCHAR(45) NULL,
+ `avatar_id` VARCHAR(100) NULL,
+ `terminal_display` VARCHAR(45) NULL,
+ `team_id` INT NULL,
+ `change_avatar_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_on_leave_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `api_key` VARCHAR(100) NULL,
+ `main_license_package_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_user_team_idx` (`team_id` ASC),
+ UNIQUE INDEX `uk_tenant_id_username_idx` (`tenant_id` ASC, `username` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_role`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_role` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_role` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `available` TINYINT(1) NOT NULL DEFAULT 1,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`schedule`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`schedule` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`schedule` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `default_rule` VARCHAR(45) NOT NULL DEFAULT 'DENY' COMMENT 'ALLOW|DENY',
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_schedule_tenant_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `uk_tenant_id_name_idx` (`tenant_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`calling_policy`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`calling_policy` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`calling_policy` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `default_rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_outbound_policy_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_ddi_pool`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_ddi_pool` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_ddi_pool` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_ddi_pool_project1_idx` (`project_id` ASC),
+ INDEX `fk_project_ddi_pool_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL COMMENT 'Dla usługo Konsultacje jeśli jest wielu agentów podpiętych pod projekt, wybieramy roundrobin jednego agenta i kierujemy połączenie do jego kolejki personalnej.',
+ `active` TINYINT(1) NOT NULL DEFAULT 1,
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en',
+ `service_type` VARCHAR(45) NOT NULL COMMENT 'DIRECT_CALL|CONTACT_CENTER|BROADCAST',
+ `service_id` INT NOT NULL,
+ `target_identifier` VARCHAR(45) NOT NULL,
+ `transfer_preserve_presentation` TINYINT(1) NOT NULL DEFAULT 1,
+ `voice_presentation_ddi` VARCHAR(45) NULL,
+ `voice_primary_ddi` VARCHAR(45) NULL,
+ `sms_presentation_type` VARCHAR(45) NOT NULL DEFAULT 'DDI' COMMENT 'DDI|ALPHANUM',
+ `sms_presentation_ddi` VARCHAR(45) NULL,
+ `sms_presentation_alphanum` VARCHAR(45) NULL,
+ `sms_primary_ddi` VARCHAR(45) NULL,
+ `fax_presentation_ddi` VARCHAR(45) NULL,
+ `fax_primary_ddi` VARCHAR(45) NULL,
+ `email_signature` TEXT NULL,
+ `display_name` VARCHAR(45) NULL,
+ `avatar_id` VARCHAR(45) NULL,
+ `access_mode` VARCHAR(45) NOT NULL DEFAULT 'PUBLIC' COMMENT 'PUBLIC|IDENTIFIED|CUSTOMER|PARTNER|ACL',
+ `inbound_webapp_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `inbound_consultants_reserve_count` INT NOT NULL DEFAULT 0,
+ `expected_service_time` INT NULL DEFAULT 10,
+ `permitted_service_time` INT NULL DEFAULT 120,
+ `show_service_time_notification` TINYINT(1) NULL DEFAULT 0,
+ `expected_service_ratio` INT NULL DEFAULT 95,
+ `permitted_service_ratio` INT NULL DEFAULT 80,
+ `show_service_ratio_notification` TINYINT(1) NULL DEFAULT 0,
+ `expected_predictive_drop_rate` INT NULL DEFAULT 5,
+ `permitted_predictive_drop_rate` INT NULL DEFAULT 10,
+ `show_predictive_drop_rate_notification` TINYINT(1) NULL DEFAULT 0,
+ `expected_predictive_answer_time` INT NULL DEFAULT 3,
+ `permitted_predictive_answer_time` INT NULL DEFAULT 10,
+ `show_predictive_answer_time_notification` TINYINT(1) NULL DEFAULT 0,
+ `expected_inbound_staff` INT NULL,
+ `permitted_inbound_staff` INT NULL,
+ `show_inbound_staff_notification` TINYINT(1) NULL DEFAULT 0,
+ `show_inbound_consultant_waiting_notification` TINYINT(1) NULL DEFAULT 0,
+ `expected_outbound_staff` INT NULL,
+ `permitted_outbound_staff` INT NULL,
+ `show_outbound_staff_notification` TINYINT(1) NULL DEFAULT 0,
+ `permitted_inbound_consultant_waiting` INT NULL,
+ `expected_inbound_consultant_waiting` INT NULL,
+ `expected_predictive_answer_time_ratio` INT NULL DEFAULT 90,
+ `permitted_predictive_answer_time_ratio` INT NULL DEFAULT 70,
+ `sla_predictive_answer_time` INT NULL DEFAULT 5,
+ `expected_service_time_ratio` INT NULL DEFAULT 90,
+ `permitted_service_time_ratio` INT NULL DEFAULT 70,
+ `show_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0,
+ `sla_service_time` INT NULL DEFAULT 20,
+ `show_sla_service_time_notification` TINYINT(1) NULL DEFAULT 0,
+ `show_sla_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0,
+ `show_sla_inbound_consultant_waiting_notification` TINYINT(1) NULL DEFAULT 0,
+ `show_predictive_sla_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0,
+ `sla_dialer_call_time` INT NULL DEFAULT 300,
+ `expected_dialer_call_time_ratio` INT NULL DEFAULT 90,
+ `permitted_dialer_call_time_ratio` INT NULL DEFAULT 70,
+ `sla_dialer_connect_time` INT NULL DEFAULT 900,
+ `expected_dialer_connect_time_ratio` INT NULL DEFAULT 90,
+ `permitted_dialer_connect_time_ratio` INT NOT NULL DEFAULT 70,
+ `acw_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `acw_time` INT NOT NULL DEFAULT 30,
+ `acw_lock_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `acw_notify_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `acw_recommended_time` INT NOT NULL DEFAULT 30,
+ `contact_fail_acw_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `reject_break_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `reject_break_time` INT NOT NULL DEFAULT 10,
+ `timeout_break_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `timeout_break_time` INT NOT NULL DEFAULT 10,
+ `noanswer_limit_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `noanswer_limit` INT NOT NULL DEFAULT 10,
+ `tier_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tier_timeout` INT ZEROFILL NOT NULL DEFAULT 120,
+ `tier_timeout_multiply` TINYINT(1) NOT NULL DEFAULT 0,
+ `tier_noagent_skip` TINYINT(1) NOT NULL DEFAULT 0,
+ `dedicated_user_transfer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `dedicated_user_transfer_timeout` INT NOT NULL DEFAULT 30,
+ `consultant_call_timeout` INT NOT NULL DEFAULT 30,
+ `enable_video` TINYINT(1) NULL DEFAULT 0,
+ `enable_audio` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_chat` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_sms` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_email` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_facebook` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_whatsapp` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_webmessage` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_voicemail` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_fax` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_bookingsync` TINYINT(1) NOT NULL DEFAULT 0,
+ `enable_instagram` TINYINT(1) NOT NULL DEFAULT 0,
+ `sms_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `close_sms_on_out_message` INT NOT NULL DEFAULT 0,
+ `unassign_sms_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `email_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `close_email_on_out_message` INT NOT NULL DEFAULT 0,
+ `unassign_email_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 0,
+ `facebook_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `unassign_facebook_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `whatsapp_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN',
+ `unassign_whatsapp_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `close_whatsapp_on_out_message` INT NOT NULL DEFAULT 0,
+ `webmessage_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `unassign_webmessage_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `voicemail_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `unassign_voicemail_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `fax_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST',
+ `unassign_fax_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `close_fax_on_out_message` INT NOT NULL DEFAULT 0,
+ `bookingsync_distribution_method` VARCHAR(45) NOT NULL DEFAULT 'ROUND_ROBIN',
+ `unassign_bookingsync_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `instagram_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN',
+ `unassign_instagram_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1,
+ `state` VARCHAR(45) NOT NULL DEFAULT 'STARTED' COMMENT 'STARTED|STOPPED',
+ `prioritized_predictive_overcalling` TINYINT(1) NOT NULL DEFAULT 0,
+ `work_schedule_id` INT NULL,
+ `out_of_schedule_announcement_id` VARCHAR(45) NULL,
+ `out_of_schedule_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `out_of_schedule_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `out_of_schedule_diversion_number` VARCHAR(45) NULL,
+ `outbound_presentation_strategy` VARCHAR(45) NOT NULL DEFAULT 'PROJECT' COMMENT 'USER|PROJECT',
+ `outbound_policy_id` INT NULL,
+ `inbound_policy_id` INT NULL,
+ `project_ddi_pool_id` INT NULL,
+ `show_number_history` TINYINT(1) NOT NULL DEFAULT 1,
+ `show_number_recording` TINYINT(1) NOT NULL DEFAULT 1,
+ `dialog_info_template` TEXT NULL,
+ `conversation_send_without_assign` TINYINT(1) NOT NULL DEFAULT 0,
+ `block_assigned_conversation` TINYINT(1) NOT NULL DEFAULT 0,
+ `default_priority_sms` INT NOT NULL DEFAULT 100,
+ `default_priority_email` INT NOT NULL DEFAULT 100,
+ `default_priority_facebook` INT NOT NULL DEFAULT 100,
+ `default_priority_whatsapp` INT NOT NULL DEFAULT 100,
+ `default_priority_webmessage` INT NOT NULL DEFAULT 100,
+ `default_priority_voicemail` INT NOT NULL DEFAULT 100,
+ `default_priority_fax` INT NOT NULL DEFAULT 100,
+ `default_priority_bookingsync` INT NOT NULL DEFAULT 100,
+ `default_priority_instagram` INT NOT NULL DEFAULT 100,
+ `call_request_process_mode` VARCHAR(45) NOT NULL DEFAULT 'FIFO' COMMENT 'FIFO|LIFO',
+ `close_conversation_after_days_of_inactivity` INT NULL,
+ `conversation_prefer_manager` TINYINT(1) NOT NULL DEFAULT 0,
+ `conversation_distribution_login_required` TINYINT(1) NOT NULL DEFAULT 1,
+ `lock_change_to_break_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `lock_change_to_break_members_limit` INT NOT NULL DEFAULT 1,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_project_schedule_idx` (`work_schedule_id` ASC),
+ UNIQUE INDEX `uk_tenant_id_target_identifier` (`tenant_id` ASC, `target_identifier` ASC),
+ INDEX `fk_project_inbound_policy1_idx` (`inbound_policy_id` ASC),
+ INDEX `fk_project_project_ddi_pool1_idx` (`project_ddi_pool_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`credit_offer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`credit_offer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`credit_offer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `launched` TINYINT(1) NOT NULL,
+ `launch_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `active` TINYINT(1) NOT NULL,
+ `visible` TINYINT(1) NOT NULL,
+ `credit_currency` VARCHAR(45) NOT NULL,
+ `credit_value` DECIMAL(17,2) NOT NULL,
+ `offer_expire_time` VARCHAR(45) NULL,
+ `min_purchase` INT NULL,
+ `max_purchase` INT NULL,
+ `credit_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `credit_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `purse_limit` INT NULL,
+ `purse_amount` INT NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_credit_offer_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`credit_purse`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`credit_purse` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`credit_purse` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `active` TINYINT(1) NOT NULL,
+ `credit_currency` VARCHAR(45) NOT NULL,
+ `credit_value` DECIMAL(17,2) NOT NULL COMMENT 'zniżka w wysokości procet wartości zwykłej monety typu C w przedzialei 0-100% (w przypadku monety tenanta)',
+ `purse_volume` INT NOT NULL,
+ `balance` INT NOT NULL,
+ `expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `customer_id` INT NOT NULL,
+ `credit_offer_id` INT NOT NULL,
+ `customer_supply_transaction_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_credit_purse_customer1_idx` (`customer_id` ASC),
+ INDEX `fk_credit_purse_credit_offer1_idx` (`credit_offer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_center_service`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_center_service` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_center_service` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `distribution_strategy` VARCHAR(45) NOT NULL DEFAULT 'TOP_DOWN',
+ `prefer_recent_agent` TINYINT(1) NOT NULL DEFAULT 0,
+ `prefer_recent_agent_grace_period` INT NOT NULL DEFAULT 30,
+ `prefer_manager` TINYINT(1) NOT NULL DEFAULT 0,
+ `multichat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `according_to_score` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_cc_queue_service_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_has_service`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_has_service` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_service` (
+ `id` INT NOT NULL,
+ `name` VARCHAR(45) NULL,
+ `description` VARCHAR(255) NULL,
+ `margin` FLOAT NULL,
+ `minimum_credit_cost` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_service_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`broadcast_service`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`broadcast_service` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`broadcast_service` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `anonymous_limit` INT NOT NULL DEFAULT 0,
+ `customer_limit` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_broadcast_service_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_contact_person`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_contact_person` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_contact_person` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `firstname` VARCHAR(45) NOT NULL,
+ `surname` VARCHAR(45) NOT NULL,
+ `contact_type` VARCHAR(45) NULL,
+ `email` VARCHAR(45) NULL,
+ `phone` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_contact_person_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_system_role`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_system_role` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_system_role` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_user_id` INT NOT NULL,
+ `system_role_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `tenant_user_id`, `system_role_id`),
+ INDEX `fk_user_has_role_role1_idx` (`system_role_id` ASC),
+ INDEX `fk_user_has_role_user1_idx` (`tenant_user_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_wallet`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_wallet` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_wallet` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `balance` DECIMAL(17,2) NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_system_wallet_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dealer_wallet`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dealer_wallet` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dealer_wallet` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `balance` DECIMAL(17,2) NOT NULL,
+ `min_withdraw` DECIMAL(17,2) NOT NULL DEFAULT 0,
+ `withdraw_cost` DECIMAL(17,2) NOT NULL DEFAULT 0,
+ `dealer_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_dealer_wallet_dealer1_idx` (`dealer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dealer_withdraw_bank_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dealer_withdraw_bank_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dealer_withdraw_bank_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `iban` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `dealer_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_dealer_withdraw_bank_account_dealer1_idx` (`dealer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_withdraw_bank_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_withdraw_bank_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_withdraw_bank_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `iban` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_bank_account_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `iban_UNIQUE` (`iban` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`task_service`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`task_service` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`task_service` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `offer_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `persistent` TINYINT(1) NOT NULL COMMENT 'session, tenant, user\n',
+ `autocreate` TINYINT(1) NOT NULL,
+ `piggybank` TINYINT(1) NOT NULL,
+ `charge_negotiation` TINYINT(1) NOT NULL,
+ `credit_charge_amount` INT NULL,
+ `min_credit_charge_amount` INT NULL,
+ `max_credit_charge_amount` INT NULL,
+ `min_piggybank_credit_charge_amount` INT NULL,
+ `dtmf_approve_code` VARCHAR(10) NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_task_service_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`task_agreement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`task_agreement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`task_agreement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL,
+ `agreement_uuid` VARCHAR(100) NOT NULL,
+ `agreement_file` VARCHAR(100) NULL,
+ `offer_create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `offer_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `piggybank_progress` DECIMAL(4,2) NULL,
+ `payment_status` VARCHAR(45) NULL COMMENT 'requested, pending, done',
+ `payment_status_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `execution_status` VARCHAR(45) NULL,
+ `execution_status_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `task_service_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_task_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_task_task_service1_idx` (`task_service_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_task_service`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_task_service` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_task_service` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `project_id` INT NOT NULL,
+ `task_service_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `project_id`, `task_service_id`),
+ INDEX `fk_project_has_task_service_task_service1_idx` (`task_service_id` ASC),
+ INDEX `fk_project_has_task_service_project1_idx` (`project_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_withdraw_bank_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_withdraw_bank_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_withdraw_bank_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `iban` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_system_bank_account_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`task_agreement_has_customer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`task_agreement_has_customer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`task_agreement_has_customer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `task_agreement_id` INT NOT NULL,
+ `customer_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `task_agreement_id`, `customer_id`),
+ INDEX `fk_task_agreement_has_customer_customer1_idx` (`customer_id` ASC),
+ INDEX `fk_task_agreement_has_customer_task_agreement1_idx` (`task_agreement_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_contact_person`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_contact_person` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_contact_person` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `firstname` VARCHAR(45) NOT NULL,
+ `surname` VARCHAR(45) NOT NULL,
+ `job_title` VARCHAR(45) NULL,
+ `email` VARCHAR(100) NULL,
+ `phone` VARCHAR(45) NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_reseller_contact_person_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `username` VARCHAR(45) NOT NULL,
+ `password` VARCHAR(100) NOT NULL,
+ `email` VARCHAR(100) NOT NULL,
+ `role` VARCHAR(45) NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `username_UNIQUE` (`username` ASC),
+ INDEX `fk_system_user_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`voucher_offer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`voucher_offer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`voucher_offer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `launched` TINYINT(1) NOT NULL,
+ `launch_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `active` TINYINT(1) NOT NULL,
+ `visible` TINYINT(1) NOT NULL,
+ `voucher_currency` VARCHAR(45) NOT NULL,
+ `nominal_value` DECIMAL(17,2) NOT NULL,
+ `purchase_value` DECIMAL(17,2) NOT NULL,
+ `offer_expire_time` VARCHAR(45) NULL,
+ `voucher_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `voucher_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_voucher_offer_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`voucher`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`voucher` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`voucher` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `active` TINYINT(1) NOT NULL,
+ `voucher_currency` VARCHAR(45) NOT NULL,
+ `nominal_value` VARCHAR(45) NOT NULL,
+ `purchase_value` VARCHAR(45) NOT NULL,
+ `balance` DECIMAL(17,2) NOT NULL,
+ `expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `customer_id` INT NOT NULL,
+ `voucher_offer_id` INT NOT NULL,
+ `customer_supply_transaction_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_voucher_customer1_idx` (`customer_id` ASC),
+ INDEX `fk_voucher_voucher_offer1_idx` (`voucher_offer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`routing`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`routing` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`routing` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `routing_type` VARCHAR(45) NOT NULL COMMENT 'SYSTEM | USER',
+ `src` VARCHAR(100) NOT NULL COMMENT 'PSTN unikalny globalnie zawiera CC\nWEB unikalny w ramach tenanta\nEMAIL\nSMS',
+ `dst` VARCHAR(100) NOT NULL,
+ `target_type` VARCHAR(45) NOT NULL COMMENT 'CALL | SMS | EMAIL',
+ `priority` INT NOT NULL DEFAULT 100,
+ `application_type` VARCHAR(45) NOT NULL COMMENT 'PROJECT | CALL_USER| IVR',
+ `application_id` VARCHAR(100) NULL,
+ `selection_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_target_project1_idx` (`dst` ASC),
+ INDEX `fk_routing_tenant1_idx` (`tenant_id` ASC),
+ INDEX `idx_tenant_type_src_dst_priority` (`tenant_id` ASC, `target_type` ASC, `src` ASC, `dst` ASC, `priority` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_currency_cost`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_currency_cost` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_currency_cost` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `currency_charge_amount` DECIMAL(17,2) NOT NULL,
+ `project_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_currency_cost_project1_idx` (`project_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`task_service_currency_cost`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`task_service_currency_cost` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`task_service_currency_cost` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `task_service_id` INT NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `currency_charge_amount` DECIMAL(17,2) NOT NULL,
+ `min_currency_charge_amount` DECIMAL(17,2) NULL,
+ `max_currency_charge_amount` DECIMAL(17,2) NULL,
+ `min_piggybank_currency_charge_amount` DECIMAL(17,2) NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_task_currency_cost_task_service1_idx` (`task_service_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`task_agreement_currency_cost`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`task_agreement_currency_cost` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`task_agreement_currency_cost` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `currency_charge_amount` DECIMAL(17,2) NOT NULL,
+ `min_piggybank_currency_charge_amount` DECIMAL(17,2) NULL,
+ `task_agreement_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_task_agreement_currency_cost_task_agreement1_idx` (`task_agreement_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `user_type` VARCHAR(45) NOT NULL COMMENT 'OPERATOR|DEALER',
+ `username` VARCHAR(45) NOT NULL,
+ `password` VARCHAR(255) NOT NULL,
+ `active` TINYINT(1) NOT NULL DEFAULT 1,
+ `firstname` VARCHAR(45) NOT NULL,
+ `surname` VARCHAR(45) NOT NULL,
+ `email` VARCHAR(100) NOT NULL,
+ `phone` VARCHAR(45) NULL,
+ `role` VARCHAR(45) NOT NULL COMMENT 'ADMINISTRATOR|OPERATOR|INSPECTOR',
+ `dealer_id` INT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `username_UNIQUE` (`username` ASC),
+ INDEX `fk_reseller_user_operator1_idx` (`operator_id` ASC),
+ INDEX `fk_operator_user_dealer1_idx` (`dealer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_wallet`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_wallet` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_wallet` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `wallet_currency_balance` DECIMAL(17,2) NOT NULL,
+ `account_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_account_wallet_account1_idx` (`account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`paypal_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`paypal_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`paypal_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `app_id` VARCHAR(100) NOT NULL,
+ `account` VARCHAR(100) NULL,
+ `client_id` VARCHAR(100) NOT NULL,
+ `secret` VARCHAR(100) NOT NULL,
+ `access_token` VARCHAR(200) NULL,
+ `expire_date` TIMESTAMP NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `clinet_id_UNIQUE` (`client_id` ASC),
+ UNIQUE INDEX `secret_UNIQUE` (`secret` ASC),
+ INDEX `fk_paypal_account_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`paypal_webhook`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`paypal_webhook` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`paypal_webhook` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `webhook_url` VARCHAR(100) NULL,
+ `webhook_id` VARCHAR(100) NULL,
+ `paypal_account_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_paypal_webhook_paypal_account1_idx` (`paypal_account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`login`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`login` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`login` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `username` VARCHAR(45) NULL,
+ `nonce` VARCHAR(45) NULL,
+ `ip` TEXT NULL,
+ `time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `scope` VARCHAR(45) NULL COMMENT 'system\ntenant\noperator\ndealer\ncustomer',
+ `login_type` VARCHAR(45) NULL COMMENT 'nonce\npass',
+ `token_uuid` VARCHAR(64) NULL,
+ `token_valid` TINYINT(1) NULL,
+ `tenant_id` INT NULL,
+ `system_id` INT NULL,
+ `operator_id` INT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_login_system1_idx` (`system_id` ASC),
+ INDEX `fk_login_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_login_operator1_idx` (`operator_id` ASC),
+ INDEX `idx_token_uuid_scope` (`token_uuid` ASC, `scope` ASC),
+ INDEX `idx_system_id_username` (`system_id` ASC, `username` ASC),
+ INDEX `idx_operator_id_username` (`operator_id` ASC, `username` ASC),
+ INDEX `idx_time` (`time` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_consultant`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_consultant` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_consultant` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `score` INT NOT NULL DEFAULT 100,
+ `priority` INT NOT NULL DEFAULT 100,
+ `position` INT NOT NULL DEFAULT 1,
+ `tier` INT NOT NULL DEFAULT 1,
+ `accept_chat` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_audio` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_video` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_sms` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_email` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_facebook` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_whatsapp` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_webmessage` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_fax` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_voicemail` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_bookingsync` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_instagram` TINYINT(1) NOT NULL DEFAULT 0,
+ `fax2email_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `email2fax_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `voice_presentation_ddi` VARCHAR(45) NULL,
+ `voice_primary_ddi` VARCHAR(45) NULL,
+ `sms_presentation_type` VARCHAR(45) NOT NULL DEFAULT 'DDI' COMMENT 'DDI | ALPHANUM',
+ `sms_presentation_ddi` VARCHAR(45) NULL,
+ `sms_presentation_alphanum` VARCHAR(45) NULL,
+ `sms_primary_ddi` VARCHAR(45) NULL,
+ `fax_presentation_ddi` VARCHAR(45) NULL,
+ `fax_primary_ddi` VARCHAR(45) NULL,
+ `display_name` VARCHAR(45) NULL,
+ `avatar_id` VARCHAR(45) NULL,
+ `state` VARCHAR(45) NOT NULL DEFAULT 'BLENDING' COMMENT 'INBOUND|OUTBOUND|BLENDING|DISABLED',
+ `work_schedule_state` VARCHAR(45) NULL COMMENT 'INBOUND|OUTBOUND|BLENDING',
+ `work_schedule_id` INT NULL,
+ `priority_sms` INT NOT NULL DEFAULT 100,
+ `priority_email` INT NOT NULL DEFAULT 100,
+ `priority_facebook` INT NOT NULL DEFAULT 100,
+ `priority_whatsapp` INT NOT NULL DEFAULT 100,
+ `priority_webmessage` INT NOT NULL DEFAULT 100,
+ `priority_voicemail` INT NOT NULL DEFAULT 100,
+ `priority_fax` INT NOT NULL DEFAULT 100,
+ `priority_bookingsync` INT NOT NULL DEFAULT 100,
+ `priority_instagram` INT NOT NULL DEFAULT 100,
+ `automatic_sms_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_email_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_facebook_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_whatsapp_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_webmessage_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_voicemail_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_fax_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_bookingsync_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_instagram_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `automatic_ticketing_pickup` TINYINT(1) NOT NULL DEFAULT 1,
+ `default_signature_from` VARCHAR(45) NULL,
+ `email_signature` TEXT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ INDEX `fk_project_has_consultant_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_project_has_consultant_project_idx` (`project_id` ASC),
+ UNIQUE INDEX `uk_project_id_tenant_user_id_idx` (`project_id` ASC, `tenant_user_id` ASC),
+ INDEX `fk_project_has_consultant_schedule_idx` (`work_schedule_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`resource_privilege`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`resource_privilege` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`resource_privilege` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `module` VARCHAR(45) NULL,
+ `resource` VARCHAR(45) NULL,
+ `privilege` VARCHAR(45) NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_role_has_privilege`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_role_has_privilege` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_role_has_privilege` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `scope` VARCHAR(45) NOT NULL DEFAULT 'ALL' COMMENT 'ALL|SELF|PROJECT_SUPERVISOR|PROJECT_CONSULTANT|TEAM',
+ `super` TINYINT(1) NOT NULL DEFAULT 0,
+ `resource_privilege_id` INT NOT NULL,
+ `system_role_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_privilege_resource_privilege1_idx` (`resource_privilege_id` ASC),
+ INDEX `fk_role_has_privilege_role1_idx` (`system_role_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`schedule_item_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`schedule_item_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`schedule_item_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_schedule_item_group_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_schedule_item_group_system_idx` (`system_id` ASC),
+ UNIQUE INDEX `uk_tenant_id_name_idx` (`tenant_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`schedule_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`schedule_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`schedule_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priority` INT NOT NULL DEFAULT 100,
+ `day_match_type` VARCHAR(45) NOT NULL DEFAULT 'EVERYDAY' COMMENT 'EVERYDAY|DAY_OF_YEAR|DAY_OF_MONTH|DAY_OF_WEEK|DATE',
+ `start_date` DATE NULL,
+ `stop_date` DATE NULL,
+ `start_time` TIME NOT NULL,
+ `stop_time` TIME NOT NULL,
+ `match_day_of_month` INT NULL,
+ `match_day_of_week` INT NULL,
+ `match_day_of_year` DATE NULL,
+ `schedule_item_group_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_schedule_item_chedule_item_group_idx` (`schedule_item_group_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`schedule_has_item_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`schedule_has_item_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`schedule_has_item_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priority` INT NOT NULL DEFAULT 100,
+ `rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW' COMMENT 'ALLOW|DENY',
+ `schedule_id` INT NOT NULL,
+ `schedule_item_group_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_schedule_has_item_group_schedule_item_group_idx` (`schedule_item_group_id` ASC),
+ INDEX `fk_schedule_has_item_group_schedule_idx` (`schedule_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`web_link`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`web_link` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`web_link` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `state` VARCHAR(45) NOT NULL DEFAULT 'OFF' COMMENT 'ON|OFF',
+ `priority` INT NOT NULL DEFAULT 100,
+ `call_timeout` INT NULL,
+ `chat` TINYINT(1) NOT NULL DEFAULT 0,
+ `audio` TINYINT(1) NOT NULL DEFAULT 0,
+ `video` TINYINT(1) NOT NULL DEFAULT 0,
+ `video_hq` TINYINT(1) NOT NULL DEFAULT 0,
+ `user_device_type` VARCHAR(45) NOT NULL DEFAULT 'WEBAPP' COMMENT 'WEBAPP|COMMUNICATOR|DESKTOP',
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_web_link_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`external_link`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`external_link` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`external_link` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `state` VARCHAR(45) NOT NULL DEFAULT 'OFF' COMMENT 'ON|OFF',
+ `priority` INT NOT NULL DEFAULT 100,
+ `call_timeout` INT NULL,
+ `external_number` VARCHAR(45) NOT NULL,
+ `presentation_method` VARCHAR(45) NOT NULL DEFAULT 'PRESERVE',
+ `presentation_number` VARCHAR(45) NULL,
+ `mobile_agent_redirect_ddi` VARCHAR(45) NULL,
+ `mobile_operator` VARCHAR(45) NULL COMMENT 'Operator sieci komórkowej dla aplikacji mobilnej call redirect',
+ `turn_on_redirect_code` VARCHAR(45) NULL COMMENT 'Kod do włączenia przekierowania dla aplikacji call redirect dla konkretnego operatora mobilnego',
+ `turn_off_redirect_code` VARCHAR(45) NULL,
+ `mobile_agent_change_work_mode_allowed` INT NOT NULL DEFAULT 1,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_external_link_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`sip_terminal_firmware_version`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`sip_terminal_firmware_version` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_firmware_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `version` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `version_UNIQUE` (`version` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`sip_terminal_model`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`sip_terminal_model` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_model` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `vendor` VARCHAR(45) NOT NULL,
+ `model` VARCHAR(45) NOT NULL,
+ `product_key` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `default_config_template_file` VARCHAR(255) NOT NULL,
+ `line_key_count` INT NOT NULL DEFAULT 0,
+ `line_key_features` VARCHAR(500) NULL,
+ `expansion_key_count` INT NOT NULL DEFAULT 0,
+ `expansion_key_features` VARCHAR(500) NULL,
+ `soft_key_count` INT NOT NULL DEFAULT 0,
+ `soft_key_features` VARCHAR(500) NULL,
+ `video` TINYINT(1) NOT NULL DEFAULT 0,
+ `sip_terminal_firmware_version_id` INT NULL COMMENT 'DEFAULT FIRMWARE VERSION',
+ PRIMARY KEY (`id`),
+ INDEX `fk_sip_terminal_model_sip_terminal_model_version1_idx` (`sip_terminal_firmware_version_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`sip_terminal`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`sip_terminal` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `mac` VARCHAR(45) NOT NULL,
+ `serial` VARCHAR(100) NULL,
+ `nis` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `sip_terminal_model_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `sip_terminal_firmware_version_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_sip_terminal_sip_terminal_model1_idx` (`sip_terminal_model_id` ASC),
+ INDEX `fk_sip_terminal_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_sip_terminal_sip_terminal_firmware_version1_idx` (`sip_terminal_firmware_version_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`line_link`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`line_link` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`line_link` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `state` VARCHAR(45) NOT NULL DEFAULT 'OFF',
+ `priority` INT NOT NULL DEFAULT 100,
+ `call_timeout` INT NULL,
+ `video` TINYINT(1) NOT NULL DEFAULT 1,
+ `sip_username` VARCHAR(45) NOT NULL,
+ `sip_password` VARCHAR(45) NOT NULL,
+ `custom` TINYINT(1) NOT NULL DEFAULT 0,
+ `confidential` TINYINT(1) NOT NULL DEFAULT 1,
+ `portnumber` INT NULL,
+ `network_ip` VARCHAR(45) NULL,
+ `last_autoprov_date` DATETIME NULL,
+ `sip_terminal_id` INT NULL,
+ `tenant_user_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_line_link_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_line_link_sip_terminal1_idx` (`sip_terminal_id` ASC),
+ INDEX `idx_sip_username` (`sip_username` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`break_cause`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`break_cause` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`break_cause` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `break_type` VARCHAR(45) NOT NULL COMMENT 'BUSINESS|COFFEE',
+ `break_cause` VARCHAR(45) NOT NULL,
+ `break_identifier` VARCHAR(45) NOT NULL,
+ `allow_internal_calls` TINYINT(1) NOT NULL DEFAULT 0,
+ `supervisor_only` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ `team_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_break_cause_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `UNIQUE_break_identifier_tenant` (`tenant_id` ASC, `break_identifier` ASC),
+ INDEX `fk_break_cause_team1_idx` (`team_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_login`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_login` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_login` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(45) NOT NULL,
+ `nonce` VARCHAR(45) NULL,
+ `ip` VARCHAR(15) NULL,
+ `time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
+ `login_type` VARCHAR(45) NULL COMMENT 'nonce/pass',
+ `token_uuid` VARCHAR(64) NULL,
+ `token_valid` TINYINT(1) NULL,
+ `tenant_id` INT NULL,
+ PRIMARY KEY (`id`, `domain`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_tenant_login_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`portal_template`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`portal_template` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`portal_template` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `source` VARCHAR(45) NULL,
+ `thumbnail_id` VARCHAR(45) NULL,
+ `description` VARCHAR(45) NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`subpage`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`subpage` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`subpage` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `style` VARCHAR(45) NULL,
+ `published` TINYINT(1) NOT NULL DEFAULT 0,
+ `connection_manager_hide` TINYINT(1) NOT NULL DEFAULT 0,
+ `connection_manager_dst_type` VARCHAR(45) NULL,
+ `connection_manager_dst_id` INT NULL,
+ `connection_manager_selection_strategy` VARCHAR(45) NULL,
+ `connection_manager_selection_id` INT NULL,
+ `tenant_portal_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_subpage_tenant_portal1_idx` (`tenant_portal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_portal`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_portal` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_portal` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_portal_name` VARCHAR(45) NULL,
+ `title` VARCHAR(45) NULL,
+ `subtitle` VARCHAR(45) NULL,
+ `name` VARCHAR(45) NULL,
+ `description` VARCHAR(45) NULL,
+ `address` VARCHAR(45) NULL,
+ `email` VARCHAR(45) NULL,
+ `phone_number` VARCHAR(45) NULL,
+ `fax_number` VARCHAR(45) NULL,
+ `logo_source` VARCHAR(45) NULL,
+ `enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `main_subpage_id` INT NOT NULL,
+ `portal_template_id` INT NOT NULL,
+ `tenant_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_portal_portal_template1_idx` (`portal_template_id` ASC),
+ INDEX `fk_tenant_portal_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_portal_subpage1_idx` (`main_subpage_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_portal_domain`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_portal_domain` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_portal_domain` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(45) NOT NULL,
+ `external` TINYINT(1) NOT NULL,
+ `enabled` TINYINT(1) NOT NULL,
+ `tenant_id` INT NULL,
+ `tenant_portal_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_portal_domain_tenant_portal1_idx` (`tenant_portal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`virtual_terminal`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`virtual_terminal` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `display_type` VARCHAR(45) NOT NULL DEFAULT 'USER' COMMENT 'USER/EXTENSION/DDI/USER_LOGIN/USER_NAME/CUSTOM',
+ `custom_display_name` VARCHAR(45) NULL,
+ `vlan_id` VARCHAR(45) NULL,
+ `prov_url` VARCHAR(255) NULL,
+ `certificate_url` VARCHAR(255) NULL,
+ `ntp_server` VARCHAR(90) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_virtual_terminal_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`virtual_terminal_key_setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`virtual_terminal_key_setting` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_key_setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `key_type` VARCHAR(45) NOT NULL,
+ `key_position` INT NOT NULL,
+ `key_feature` VARCHAR(45) NOT NULL,
+ `key_config` ENUM('user', 'terminal') NOT NULL,
+ `label` VARCHAR(45) NULL,
+ `value` VARCHAR(45) NULL,
+ `extension` VARCHAR(45) NULL,
+ `virtual_terminal_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_virtual_terminal_key_setting_virtual_terminal1_idx` (`virtual_terminal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`target`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`target` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`target` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `type` VARCHAR(45) NOT NULL COMMENT 'TEXT | DDI | EXTENSION',
+ `location` VARCHAR(100) NULL,
+ `dst_type` VARCHAR(45) NULL COMMENT 'SYSTEM|PROJECT | USER | TRUNK',
+ `dst_id` VARCHAR(45) NULL,
+ `selection_id` INT NULL,
+ `routing_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_target_routing1_idx` (`routing_id` ASC),
+ INDEX `fk_target_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_target_location_idx` (`location` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`setting_param`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`setting_param` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`setting_param` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`setting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`setting` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`setting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `value` VARCHAR(100) NOT NULL,
+ `scope` VARCHAR(45) NOT NULL DEFAULT 'global' COMMENT 'GLOBAL|TENANT|TENANT_USER|CUSTOMER',
+ `scope_id` INT NULL,
+ `setting_param_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_setting_tenant_setting_param1_idx` (`setting_param_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`normalization`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`normalization` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`normalization` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `pattern` VARCHAR(255) NOT NULL,
+ `replacement` VARCHAR(45) NOT NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_normalization_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `label` VARCHAR(45) NOT NULL,
+ `license_type` VARCHAR(45) NOT NULL COMMENT 'TENANT|USER',
+ `position` INT NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_has_license`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_has_license` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_license` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_limit` INT NULL,
+ `used` INT NULL,
+ `tenant_id` INT NOT NULL,
+ `license_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_has_license_license1_idx` (`license_id` ASC),
+ INDEX `fk_tenant_has_license_tenant1_idx` (`tenant_id` ASC),
+ INDEX `tenant_has_license_tenant1_id_license1_idx` (`tenant_id` ASC, `license_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_license`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_license` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_license` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_limit` INT NOT NULL DEFAULT 0,
+ `used` INT NOT NULL DEFAULT 0,
+ `license_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_has_license_license_idx` (`license_id` ASC),
+ INDEX `fk_tenant_user_has_license_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `tenant_user_has_license_tenant_user_id_license_idx` (`tenant_user_id` ASC, `license_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`buddy_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`buddy_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`buddy_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `position` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_buddy_group_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`buddy_relation`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`buddy_relation` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`buddy_relation` (
+ `id` INT NOT NULL,
+ `left_tenant_user_id` INT NOT NULL,
+ `right_tenant_user_id` INT NOT NULL,
+ `left_accepted` TINYINT(1) NOT NULL,
+ `right_accepted` TINYINT(1) NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_buddy_relation_tenant_user1_idx` (`left_tenant_user_id` ASC),
+ INDEX `fk_buddy_relation_tenant_user2_idx` (`right_tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`buddy_group_has_buddy_relation`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`buddy_group_has_buddy_relation` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`buddy_group_has_buddy_relation` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NOT NULL,
+ `buddy_group_id` INT NOT NULL,
+ `buddy_relation_id` INT NOT NULL,
+ INDEX `fk_buddy_group_has_buddy_relation_buddy_relation1_idx` (`buddy_relation_id` ASC),
+ INDEX `fk_buddy_group_has_buddy_relation_buddy_group1_idx` (`buddy_group_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_tariff`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_tariff` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_tariff` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NULL,
+ `deactivate_date` DATETIME NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_license_tariff_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_contract`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_contract` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_contract` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `active` TINYINT(1) NOT NULL,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NULL,
+ `deactivate_date` DATETIME NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `operator_tariff_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_contract_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_contract_operator_tariff1_idx` (`operator_tariff_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_wallet`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_wallet` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_wallet` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `currency` VARCHAR(45) NOT NULL,
+ `balance` DECIMAL(17,2) NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_wallet_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_wallet_bank_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_wallet_bank_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_wallet_bank_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `iban` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_wallet_bank_account_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_withdraw_bank_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_withdraw_bank_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_withdraw_bank_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `iban` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NULL,
+ `postcode` VARCHAR(10) NULL,
+ `city` VARCHAR(45) NULL,
+ `address` VARCHAR(100) NULL,
+ `description` VARCHAR(255) NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_withdraw_bank_account_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_contract`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_contract` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_contract` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `agreement_no` VARCHAR(100) NOT NULL,
+ `active` TINYINT(1) NOT NULL,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NULL,
+ `deactivate_date` DATETIME NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_contract_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`product_category`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`product_category` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`product_category` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_product_category_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`product_template`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`product_template` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`product_template` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `template` TEXT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_product_definition_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`product`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`product` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`product` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `product_template_id` INT NULL,
+ `product_data` TEXT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_product_product_template1_idx` (`product_template_id` ASC),
+ INDEX `fk_product_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_has_manager`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_has_manager` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_has_manager` (
+ `id` INT NOT NULL,
+ `product_category_id` INT NULL,
+ `product_id` INT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `account_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_customer_has_manager_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_customer_has_manager_product_category1_idx` (`product_category_id` ASC),
+ INDEX `fk_customer_has_manager_product1_idx` (`product_id` ASC),
+ INDEX `fk_customer_has_manager_account1_idx` (`account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`main_menu`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`main_menu` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`main_menu` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `dst_type` VARCHAR(45) NULL,
+ `dst_value` VARCHAR(45) NULL,
+ `position` INT NULL,
+ `tenant_portal_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_portal_main_menu_tenant_portal1_idx` (`tenant_portal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`pstn_tariff`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`pstn_tariff` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`pstn_tariff` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `destination` VARCHAR(45) NOT NULL,
+ `destination_regexp` VARCHAR(45) NOT NULL,
+ `rate` VARCHAR(45) NOT NULL,
+ `currency` VARCHAR(45) NOT NULL,
+ `fraud_risk` TINYINT(1) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tarif_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`virtual_terminal_setting_param`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`virtual_terminal_setting_param` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_setting_param` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `param` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`virtual_terminal_has_param`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`virtual_terminal_has_param` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_has_param` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `value` VARCHAR(255) NOT NULL,
+ `virtual_terminal_id` INT NOT NULL,
+ `virtual_terminal_setting_param_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_virtual_sip_terminal_has_param_virtual_terminal1_idx` (`virtual_terminal_id` ASC),
+ INDEX `fk_virtual_sip_terminal_has_param_virtual_sip_terminal_sett_idx` (`virtual_terminal_setting_param_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`language`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`language` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`language` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(45) NULL,
+ `iso_code` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`system_announcement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`system_announcement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`system_announcement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en' COMMENT 'iso language',
+ `label` VARCHAR(100) NOT NULL,
+ `audio_path` VARCHAR(255) NULL,
+ `video_path` VARCHAR(255) NULL,
+ `message` TEXT NULL,
+ `category` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_system_announcement_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `UNIQUE_language_label_tenant` (`language` ASC, `label` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`portal_widget`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`portal_widget` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`portal_widget` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `type` VARCHAR(45) NULL,
+ `content_type` VARCHAR(45) NULL,
+ `tenant_portal_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_portal_widget_tenant_portal1_idx` (`tenant_portal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`subpage_widget`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`subpage_widget` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`subpage_widget` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NULL,
+ `priority` INT NULL,
+ `subpage_id` INT NOT NULL,
+ `portal_widget_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_subpage_widget_subpage1_idx` (`subpage_id` ASC),
+ INDEX `fk_subpage_widget_portal_widget1_idx` (`portal_widget_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`widget_project_routes`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`widget_project_routes` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`widget_project_routes` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dst_type` VARCHAR(45) NULL,
+ `dst_id` INT NULL,
+ `target_id` INT NOT NULL,
+ `portal_widget_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_widget_project_routes_portal_widget1_idx` (`portal_widget_id` ASC),
+ INDEX `fk_widget_project_routes_target1_idx` (`target_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`widget_html`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`widget_html` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`widget_html` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `html_value` VARCHAR(45) NULL,
+ `portal_widget_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_widget_html_portal_widget1_idx` (`portal_widget_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_status`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_status` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_status` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `close_status` TINYINT(1) NOT NULL,
+ `delivery_progress` INT NULL,
+ `case_definition_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_status_case_definition1_idx` (`case_definition_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_definition`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_definition` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_definition` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `case_type` VARCHAR(45) NOT NULL COMMENT 'PROCESS|TASK',
+ `case_number_pattern` VARCHAR(45) NOT NULL,
+ `sla_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `estimated_delivery_time` INT NULL,
+ `due_delivery_time` INT NULL,
+ `open_case_status_id` INT NULL,
+ `force_close_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `force_close_case_status_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_definition_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_case_definition_case_status1_idx` (`force_close_case_status_id` ASC),
+ INDEX `fk_case_definition_case_status2_idx` (`open_case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_definition_has_project`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_definition_has_project` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_project` (
+ `case_definition_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ PRIMARY KEY (`case_definition_id`, `project_id`),
+ INDEX `fk_case_definition_has_project_project1_idx` (`project_id` ASC),
+ INDEX `fk_case_definition_has_project_case_definition1_idx` (`case_definition_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`script`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`script` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`script` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_definition_has_script`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_definition_has_script` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_script` (
+ `case_definition_id` INT NOT NULL,
+ `script_id` INT NOT NULL,
+ `case_status_id` INT NULL,
+ PRIMARY KEY (`case_definition_id`, `script_id`),
+ INDEX `fk_case_definition_has_script_script1_idx` (`script_id` ASC),
+ INDEX `fk_case_definition_has_script_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_definition_has_script_case_status1_idx` (`case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_user_change_priv`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_user_change_priv` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_user_change_priv` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE',
+ `case_definition_id` INT NOT NULL,
+ `role_id` INT NULL,
+ `case_status_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC),
+ INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_project_change_priv`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_project_change_priv` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_project_change_priv` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE',
+ `case_definition_id` INT NOT NULL,
+ `role_id` INT NULL,
+ `case_status_id` INT NULL,
+ `project_id` INT NULL,
+ `new_project_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC),
+ INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC),
+ INDEX `fk_case_project_change_priv_project1_idx` (`project_id` ASC),
+ INDEX `fk_case_project_change_priv_project2_idx` (`new_project_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_subcase_create_priv`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_subcase_create_priv` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_subcase_create_priv` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE',
+ `case_definition_id` INT NOT NULL,
+ `role_id` INT NULL,
+ `case_status_id` INT NULL,
+ `subcase_definition_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC),
+ INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC),
+ INDEX `fk_case_subcase_create_change_priv_case_definition1_idx` (`subcase_definition_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_status_change_priv`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_status_change_priv` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_status_change_priv` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE',
+ `case_definition_id` INT NOT NULL,
+ `role_id` INT NULL,
+ `case_status_id` INT NULL,
+ `new_case_status_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC),
+ INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC),
+ INDEX `fk_case_project_change_priv_copy1_case_status1_idx` (`new_case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`action_definition`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`action_definition` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`action_definition` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `definition` TEXT NOT NULL,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_action_definition_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_status_time_trigger`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_status_time_trigger` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_status_time_trigger` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `trigger_time` INT NOT NULL,
+ `cyclic` TINYINT(1) NOT NULL,
+ `action_definition_id` INT NOT NULL,
+ `action_data` TEXT NOT NULL,
+ `case_definition_id` INT NOT NULL,
+ `case_status_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_scheduled_trigger_action_definition1_idx` (`action_definition_id` ASC),
+ INDEX `fk_case_scheduled_trigger_copy1_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_status_time_trigger_case_status1_idx` (`case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_status_flow_trigger`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_status_flow_trigger` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_status_flow_trigger` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `action_definition_id` INT NOT NULL,
+ `action_data` TEXT NOT NULL,
+ `case_definition_id` INT NOT NULL,
+ `case_status_id` INT NULL,
+ `new_case_status_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_case_scheduled_trigger_action_definition1_idx` (`action_definition_id` ASC),
+ INDEX `fk_case_scheduled_trigger_copy1_case_definition1_idx` (`case_definition_id` ASC),
+ INDEX `fk_case_status_time_trigger_case_status1_idx` (`case_status_id` ASC),
+ INDEX `fk_case_status_flow_trigger_case_status1_idx` (`new_case_status_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_location`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_location` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_location` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `country` VARCHAR(45) NOT NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `city` VARCHAR(45) NOT NULL,
+ `address_1` VARCHAR(100) NOT NULL,
+ `address_2` VARCHAR(100) NULL,
+ `account_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_account_location_account1_idx` (`account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `role` VARCHAR(45) NOT NULL COMMENT 'ADMIN|PRIVILEGED|CONTACT',
+ `language` VARCHAR(45) NOT NULL,
+ `firstname` VARCHAR(45) NULL,
+ `surname` VARCHAR(45) NULL,
+ `nick` VARCHAR(45) NULL,
+ `department` VARCHAR(45) NULL,
+ `job_title` VARCHAR(45) NULL,
+ `avatar_id` VARCHAR(45) NULL,
+ `phone_account_enabled` TINYINT(1) NOT NULL,
+ `phone_account_login` VARCHAR(45) NULL,
+ `phone_account_password` VARCHAR(100) NULL,
+ `web_account_enabled` TINYINT(1) NOT NULL,
+ `web_account_login` VARCHAR(45) NULL,
+ `web_account_email` VARCHAR(45) NULL,
+ `web_account_facebook` VARCHAR(45) NULL,
+ `web_account_password` VARCHAR(100) NULL,
+ `country` VARCHAR(45) NULL,
+ `province` VARCHAR(45) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `city` VARCHAR(45) NULL,
+ `address_1` VARCHAR(100) NULL,
+ `address_2` VARCHAR(100) NULL,
+ `account_id` INT NULL,
+ `account_location_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_contact_person_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `login_name_UNIQUE` (`web_account_login` ASC, `tenant_id` ASC),
+ UNIQUE INDEX `login_email_UNIQUE` (`web_account_email` ASC, `tenant_id` ASC),
+ INDEX `fk_contact_account1_idx` (`account_id` ASC),
+ INDEX `fk_contact_account_location1_idx` (`account_location_id` ASC),
+ UNIQUE INDEX `login_facebook` (`web_account_facebook` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_customer_contact_group_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`connection_manager_widget`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`connection_manager_widget` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`connection_manager_widget` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `dst_type` VARCHAR(45) NULL,
+ `dst_id` INT NULL,
+ `selection_strategy` VARCHAR(45) NULL,
+ `selection_id` INT NULL,
+ `tenant_portal_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_connection_manager_widget_tenant_portal1_idx` (`tenant_portal_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`communication_channel`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`communication_channel` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`communication_channel` (
+ `id` INT NOT NULL,
+ `channel_type` VARCHAR(45) NOT NULL COMMENT 'MOBILE|FIXED|FAX|EMAIL|FACEBOOK|TWITTER',
+ `channel_identifier` VARCHAR(100) NOT NULL,
+ `trusted` TINYINT(1) NOT NULL DEFAULT 0,
+ `default` TINYINT(1) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`service_level_agreement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`service_level_agreement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`service_level_agreement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `recovery_point_objective` INT NULL,
+ `recovery_time_objective` INT NULL,
+ `availability` DECIMAL(11,7) NULL,
+ `schedule_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_service_level_agreement_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_service_level_agreement_schedule1_idx` (`schedule_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_contract`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_contract` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_contract` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `contract_number` VARCHAR(100) NOT NULL,
+ `sign_date` DATETIME NOT NULL,
+ `end_date` DATETIME NULL,
+ `account_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_account_contract_account1_idx` (`account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_has_product`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_has_product` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_has_product` (
+ `account_id` INT NOT NULL,
+ `product_id` INT NOT NULL,
+ `delivery_date` DATETIME NULL,
+ `life_end_date` DATETIME NULL,
+ `service_end_date` VARCHAR(45) NULL,
+ `service_level_agreement_id` INT NULL,
+ `customer_contract_id` INT NULL,
+ PRIMARY KEY (`account_id`, `product_id`),
+ INDEX `fk_customer_has_product_product1_idx` (`product_id` ASC),
+ INDEX `fk_customer_has_product_service_level_agreement1_idx` (`service_level_agreement_id` ASC),
+ INDEX `fk_customer_has_product_customer_contract1_idx` (`customer_contract_id` ASC),
+ INDEX `fk_account_has_product_account1_idx` (`account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`case_definition_has_subcase_definition`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`case_definition_has_subcase_definition` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_subcase_definition` (
+ `case_definition_id` INT NOT NULL,
+ `subcase_definition_id` INT NOT NULL,
+ PRIMARY KEY (`case_definition_id`, `subcase_definition_id`),
+ INDEX `fk_case_definition_has_case_definition_case_definition2_idx` (`subcase_definition_id` ASC),
+ INDEX `fk_case_definition_has_case_definition_case_definition1_idx` (`case_definition_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_has_channel`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_has_channel` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_has_channel` (
+ `contact_id` INT NOT NULL,
+ `communication_channel_id` INT NOT NULL,
+ PRIMARY KEY (`contact_id`, `communication_channel_id`),
+ INDEX `fk_contact_has_communication_channel_communication_channel1_idx` (`communication_channel_id` ASC),
+ INDEX `fk_contact_has_communication_channel_contact1_idx` (`contact_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`account_location_has_channel`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`account_location_has_channel` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`account_location_has_channel` (
+ `account_location_id` INT NOT NULL,
+ `communication_channel_id` INT NOT NULL,
+ PRIMARY KEY (`account_location_id`, `communication_channel_id`),
+ INDEX `fk_account_location_has_communication_channel_communication_idx` (`communication_channel_id` ASC),
+ INDEX `fk_account_location_has_communication_channel_account_locat_idx` (`account_location_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_has_product`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_has_product` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_has_product` (
+ `contact_id` INT NOT NULL,
+ `product_id` INT NOT NULL,
+ PRIMARY KEY (`contact_id`, `product_id`),
+ INDEX `fk_contact_has_product_product1_idx` (`product_id` ASC),
+ INDEX `fk_contact_has_product_contact1_idx` (`contact_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_has_product_category`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_has_product_category` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_has_product_category` (
+ `contact_id` INT NOT NULL,
+ `product_category_id` INT NOT NULL,
+ PRIMARY KEY (`contact_id`, `product_category_id`),
+ INDEX `fk_contact_has_product_category_product_category1_idx` (`product_category_id` ASC),
+ INDEX `fk_contact_has_product_category_contact1_idx` (`contact_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`request_level`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`request_level` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`request_level` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `response_time` INT NULL,
+ `bypass_time` INT NULL,
+ `solution_time` INT NULL,
+ `service_level_agreement_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_request_level_service_level_agreement1_idx` (`service_level_agreement_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`contact_group_has_contact`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`contact_group_has_contact` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`contact_group_has_contact` (
+ `contact_group_id` INT NOT NULL,
+ `contact_id` INT NOT NULL,
+ PRIMARY KEY (`contact_group_id`, `contact_id`),
+ INDEX `fk_contact_group_has_contact_contact1_idx` (`contact_id` ASC),
+ INDEX `fk_contact_group_has_contact_contact_group1_idx` (`contact_group_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_recording`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_recording` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_recording` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_recording_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_recording_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_recording_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `file_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `internal_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `mode_inbound` VARCHAR(45) NOT NULL DEFAULT 'ALWAYS' COMMENT 'ALWAYS | ON_DEMAND | NEVER',
+ `mode_outbound` VARCHAR(45) NOT NULL DEFAULT 'ALWAYS' COMMENT 'ALWAYS | ON_DEMAND | NEVER',
+ `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `announcement_scope` VARCHAR(45) NOT NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `announcement_id` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_recording_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_recording_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_diversion`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_diversion` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_diversion` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_diversion_always_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_diversion_busy_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_diversion_unavailable_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_diversion_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_diversion_selective_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_diversion_schedule_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `always_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `always_diversion_number` VARCHAR(100) NULL,
+ `always_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `busy_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `busy_diversion_number` VARCHAR(100) NULL,
+ `busy_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `unavailable_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `unavailable_diversion_number` VARCHAR(100) NULL,
+ `unavailable_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `timeout_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `timeout_diversion_number` VARCHAR(100) NULL,
+ `timeout_diversion_seconds` INT NULL DEFAULT 20,
+ `timeout_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `selective_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `selective_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `schedule_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `schedule_diversion_number` VARCHAR(100) NULL,
+ `schedule_diversion_schedule_id` INT NULL,
+ `schedule_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `change_diversion_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_diversion_schedule1_idx` (`schedule_diversion_schedule_id` ASC),
+ INDEX `fk_feature_tenant_user_diversion_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_diversion_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`selective_diversion`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`selective_diversion` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`selective_diversion` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `source_pattern` VARCHAR(100) NOT NULL,
+ `destination` VARCHAR(100) NOT NULL,
+ `feature_tenant_user_diversion_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_selective_diversion_feature_tenant_user_diversion_idx` (`feature_tenant_user_diversion_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_hotdesk`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_hotdesk` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_hotdesk` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_hotdesk_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `hotdesk_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `hotdesk_identifier` VARCHAR(45) NULL,
+ `hotdesk_pin` VARCHAR(100) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_hotdesk_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_hotdesk_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_consultant`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_consultant` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_consultant` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_consultant_dialer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_sms_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_email_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_facebook_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_whatsapp_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_webmessage_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_fax_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_bookingsync_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_consultant_channel_instagram_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `work_state` VARCHAR(45) NOT NULL DEFAULT 'OFFLINE' COMMENT 'ONLINE|OFFLINE|ONBREAK',
+ `break_type` VARCHAR(45) NULL COMMENT 'BUSINESS|COFFEE',
+ `break_cause` VARCHAR(45) NULL,
+ `break_note` VARCHAR(255) NULL,
+ `work_schedule_id` INT NULL,
+ `break_schedule_id` INT NULL,
+ `break_schedule_type` VARCHAR(45) NULL COMMENT 'BUSINESS|COFFEE',
+ `break_schedule_cause` VARCHAR(45) NULL,
+ `outbound_project_id` INT NULL,
+ `change_work_state_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_project_state_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_project_media_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_outbound_project_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `email_signature` TEXT NULL,
+ `max_auto_assigned_conversation` INT NOT NULL DEFAULT 10 COMMENT 'Liczba maksymalnej ilości przypisanych konwersacji dla użytkownika sprawdzana tylko przez system dystrybucji. Użytkownik ręcznie może sobie przypisać ile chce konwersacji.',
+ `max_auto_assigned_ticket` INT NOT NULL DEFAULT 10,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_consultant_schedule_work_idx` (`work_schedule_id` ASC),
+ INDEX `fk_feature_tenant_user_consultant_schedule_break_idx` (`break_schedule_id` ASC),
+ INDEX `fk_feature_tenant_user_consultant_project_idx` (`outbound_project_id` ASC),
+ INDEX `fk_feature_tenant_user_consultant_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_consultant_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_adhocconf`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_adhocconf` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_adhocconf` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `adhoc_conference_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `member_limit` INT NOT NULL DEFAULT 5,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_adhocconf_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_adhocconf_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_voicemail`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_voicemail` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_voicemail` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `beep_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `custom_announcement_id` VARCHAR(45) NULL,
+ `recording_time` INT NOT NULL DEFAULT 30,
+ `change_announcement_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_voicemail_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_voicemail_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_queue`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_queue` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_queue` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_queue_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `queue_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `queue_priority` INT NOT NULL DEFAULT 100,
+ `queue_limit` INT NOT NULL DEFAULT 5,
+ `queue_timeout` INT NOT NULL DEFAULT 900,
+ `queue_member_resume_time` INT NOT NULL DEFAULT 60,
+ `queue_time_base` VARCHAR(45) NOT NULL DEFAULT 'SYSTEM' COMMENT 'SYSTEM|QUEUE',
+ `message_interval` INT NOT NULL DEFAULT 30,
+ `message_delay` INT NOT NULL DEFAULT 15,
+ `moh_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `comfort_message_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `position_message_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `ewt_message_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `alerting_signal_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `custom_announcement_id` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_queue_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_queue_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_queue`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_queue` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_queue` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `queue_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `queue_priority` INT NOT NULL DEFAULT 100,
+ `default_inbound_member_priority` INT NOT NULL DEFAULT 100,
+ `queue_limit` INT NOT NULL DEFAULT 10,
+ `queue_timeout` INT NOT NULL DEFAULT 3600,
+ `queue_member_resume_time` INT NOT NULL DEFAULT 60,
+ `queue_time_base` VARCHAR(45) NOT NULL DEFAULT 'SYSTEM' COMMENT 'SYSTEM|QUEUE',
+ `queue_noagent_abandon` TINYINT(1) NOT NULL DEFAULT 0,
+ `queue_noagent_timeout` INT NOT NULL DEFAULT 60,
+ `expected_service_time_priority_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `expected_service_time_priority` INT NOT NULL DEFAULT 100,
+ `permitted_service_time_priority_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `permitted_service_time_priority` INT NOT NULL DEFAULT 100,
+ `message_interval` INT NOT NULL DEFAULT 30,
+ `message_delay` INT NOT NULL DEFAULT 15,
+ `moh_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `comfort_message_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `position_message_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `ewt_message_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `voicemail_on_demand_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `alerting_signal_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `custom_announcement_id` VARCHAR(45) NULL,
+ `custom_moh_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `custom_moh_id` VARCHAR(45) NULL,
+ `call_me_enabled` INT NOT NULL DEFAULT 0,
+ `call_me_custom_announcement_id` VARCHAR(45) NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_queue_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_queue_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_upresence`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_upresence` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_upresence` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_user_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_user_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_user_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_user_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_user_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `user_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_upresence_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_upresence_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`presence_has_tenant_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`presence_has_tenant_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`presence_has_tenant_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `label` VARCHAR(45) NOT NULL,
+ `position` INT NOT NULL,
+ `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL DEFAULT 0,
+ `feature_tenant_user_upresence_id` INT NOT NULL,
+ INDEX `fk_presence_has_tenant_user_tenant_user_idx` (`tenant_user_id` ASC),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `uk_feature_tenant_user_upresence_id_tenant_user_id_idx` (`feature_tenant_user_upresence_id` ASC, `tenant_user_id` ASC),
+ INDEX `fk_presence_has_tenant_user_feature_tenant_user_upresence_idx` (`feature_tenant_user_upresence_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_ppresence`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ppresence` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ppresence` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_project_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_project_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_project_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_project_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_project_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_ppresence_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_ppresence_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`presence_has_project`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`presence_has_project` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`presence_has_project` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `label` VARCHAR(45) NOT NULL,
+ `position` INT NOT NULL,
+ `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `pickup_mode` VARCHAR(45) NOT NULL DEFAULT 'LIFO' COMMENT 'FIFO|LIFO',
+ `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `feature_tenant_user_ppresence_id` INT NOT NULL,
+ INDEX `fk_presence_has_project_project_idx` (`project_id` ASC),
+ INDEX `fk_presence_has_project_feature_tenant_user_ppresence_idx` (`feature_tenant_user_ppresence_id` ASC),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `uk_feature_tenant_user_ppresence_id_project_id_idx` (`project_id` ASC, `feature_tenant_user_ppresence_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_prepaid`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_prepaid` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_prepaid` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `prepaid_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `prepaid_model` VARCHAR(45) NOT NULL DEFAULT 'CURRENCY' COMMENT 'CURRENCY|CREDIT',
+ `charge_period` INT NOT NULL DEFAULT 60,
+ `charge_credit_amount` INT NULL DEFAULT 0,
+ `charge_currency_amount` DECIMAL(17,2) NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_prepaid_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_prepaid_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_supervisor`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_supervisor` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_supervisor` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_supervisor_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `supervisor_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_supervisor_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_supervisor_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_supervisor`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_supervisor` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_supervisor` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `project_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ INDEX `fk_project_has_tenant_user_tenant_user2_idx` (`tenant_user_id` ASC),
+ INDEX `fk_project_has_tenant_user_project2_idx` (`project_id` ASC),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `project_user_UNIQUE` (`project_id` ASC, `tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_call`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_call` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_call` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_link_web_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_link_web_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_link_web_video_hq_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_link_web_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_link_web_limit` INT NOT NULL DEFAULT 0,
+ `license_link_line_limit` INT NOT NULL DEFAULT 0,
+ `license_link_external_limit` INT NOT NULL DEFAULT 0,
+ `link_call_timeout` INT NOT NULL DEFAULT 30,
+ `call_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `transfer_preserve_presentation` TINYINT(1) NOT NULL DEFAULT 1,
+ `show_contact` TINYINT(1) NOT NULL DEFAULT 1,
+ `clir_always_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `clir_on_demand_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `target_identifier` VARCHAR(45) NOT NULL,
+ `voice_presentation_ddi` VARCHAR(45) NULL,
+ `voice_primary_ddi` VARCHAR(45) NULL,
+ `display_name` VARCHAR(45) NULL,
+ `multichat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `meeting_limit` INT NOT NULL DEFAULT 2,
+ `do_not_disturb` TINYINT(1) NOT NULL DEFAULT 0,
+ `extension` VARCHAR(45) NULL,
+ `virtual_terminal_id` INT NULL,
+ `change_do_not_disturb_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_link_state_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_clir_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_auto_answer_allowed` TINYINT(1) NULL DEFAULT 0,
+ `auto_answer` TINYINT(1) NOT NULL DEFAULT 0,
+ `click_to_dial_auto_answer` TINYINT(1) NOT NULL DEFAULT 0,
+ `send_basic_presence_info` TINYINT(1) NOT NULL DEFAULT 1,
+ `outbound_policy_id` INT NULL,
+ `inbound_policy_id` INT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `special_service_zone_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_call_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_call_tenant_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `uk_tenant_id_target_identifier_idx` (`tenant_id` ASC, `target_identifier` ASC),
+ UNIQUE INDEX `uk_tenant_id_extension_idx` (`tenant_id` ASC, `extension` ASC),
+ INDEX `fk_feature_tenant_user_call_virtual_terminal1_idx` (`virtual_terminal_id` ASC),
+ INDEX `fk_feature_tenant_user_call_inbound_policy1_idx` (`inbound_policy_id` ASC),
+ INDEX `fk_feature_tenant_user_call_special_service_zone1_idx` (`special_service_zone_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_sip_terminal_autoprov`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_sip_terminal_autoprov` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_sip_terminal_autoprov` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `config_filename` VARCHAR(90) NULL,
+ `config_template_file_source` VARCHAR(255) NULL,
+ `sip_terminal_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_sip_terminal_hotdesk_sip_terminal1_idx` (`sip_terminal_id` ASC),
+ INDEX `fk_feature_sip_terminal_hotdesk_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_api`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_api` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_api` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_api_limit` INT NOT NULL DEFAULT 0,
+ `api_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `requests_per_hour` INT NOT NULL DEFAULT 10000,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_antifraud`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_antifraud` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_antifraud` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_antifraud_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `antifraud_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `antifraud_lock` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_autoprov`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_autoprov` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_autoprov` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `autogenerate_terminal` TINYINT(1) NOT NULL DEFAULT 0,
+ `autogenerate_line_link` TINYINT(1) NOT NULL DEFAULT 0,
+ `config_filename` VARCHAR(90) NULL,
+ `config_template_file_source` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_crm`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_crm` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_crm` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `crm_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `authenticate_private_calls_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `default_crm_id` VARCHAR(45) NULL,
+ `restricted_crm` TINYINT(1) NOT NULL DEFAULT 0,
+ `ldap_login` VARCHAR(45) NULL,
+ `ldap_password` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_recording`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_recording` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_recording` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `file_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `internal_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `announcement_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL | ALL',
+ `announcement_id` VARCHAR(45) NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_recording_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_recording_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_jsplugin`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_jsplugin` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_jsplugin` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `jsplugin_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND',
+ `connect_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `connect_member_priority` INT NOT NULL DEFAULT 100,
+ `connect_schedule_id` INT NULL,
+ `snapshot_frame_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `geolocation_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `welcome_message` TEXT NULL,
+ `goodbye_message` TEXT NULL,
+ `download_audio_recording` TINYINT(1) NOT NULL DEFAULT 0,
+ `download_video_recording` TINYINT(1) NOT NULL DEFAULT 0,
+ `download_chat_recording` TINYINT(1) NOT NULL DEFAULT 0,
+ `download_file_recording` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `callme_days_ahead` INT NOT NULL DEFAULT 4,
+ `callme_monday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_monday_from_time` INT NULL,
+ `callme_monday_to_time` INT NULL,
+ `callme_tuesday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_tuesday_from_time` INT NULL,
+ `callme_tuesday_to_time` INT NULL,
+ `callme_wednesday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_wednesday_from_time` INT NULL,
+ `callme_wednesday_to_time` INT NULL,
+ `callme_thursday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_thursday_from_time` INT NULL,
+ `callme_thursday_to_time` INT NULL,
+ `callme_friday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_friday_from_time` INT NULL,
+ `callme_friday_to_time` INT NULL,
+ `callme_saturday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_saturday_from_time` INT NULL,
+ `callme_saturday_to_time` INT NULL,
+ `callme_sunday_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `callme_sunday_from_time` INT NULL,
+ `callme_sunday_to_time` INT NULL,
+ `callme_any_day_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `callme_any_day_from_time` INT NULL DEFAULT 28800,
+ `callme_any_day_to_time` INT NULL DEFAULT 57600,
+ `callme_title` TEXT NULL,
+ `webmessage_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `webmessage_definition_id` VARCHAR(100) NULL,
+ `web_poll_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `web_poll_id` VARCHAR(100) NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `tenant_id`),
+ INDEX `fk_feature_project_jsplugin_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_jsplugin_schedule1_idx` (`connect_schedule_id` ASC),
+ INDEX `fk_feature_project_jsplugin_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_wizard`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_wizard` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_wizard` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_wizard_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `wizard_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `show_admission` VARCHAR(45) NOT NULL DEFAULT 'PUBLIC' COMMENT 'PUBLIC|IDENTIFIED|CUSTOMER|PARTNER|ACL',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_pstatistics`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_pstatistics` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_pstatistics` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_project_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_ustatistics`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ustatistics` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ustatistics` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_user_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `user_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_ustatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_ustatistics_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`statistics_has_project`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`statistics_has_project` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_project` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NOT NULL,
+ `reset_time` TIME NOT NULL DEFAULT '00:00:00',
+ `project_id` INT NOT NULL,
+ `feature_tenant_user_pstatistics_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_statistics_has_project_project1_idx` (`project_id` ASC),
+ INDEX `fk_statistics_has_project_feature_tenant_user_pstatistics1_idx` (`feature_tenant_user_pstatistics_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`statistics_has_tenant_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`statistics_has_tenant_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_tenant_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NOT NULL,
+ `reset_time` TIME NOT NULL DEFAULT '00:00:00',
+ `tenant_user_id` INT NOT NULL,
+ `feature_tenant_user_ustatistics_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_statistics_has_user_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_statistics_has_user_feature_tenant_user_ustatistics1_idx` (`feature_tenant_user_ustatistics_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`schedule_has_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`schedule_has_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`schedule_has_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW' COMMENT 'ALLOW|DENY',
+ `schedule_id` INT NOT NULL,
+ `schedule_item_id` INT NOT NULL,
+ INDEX `fk_schedule_has_schedule_item_schedule_item_idx` (`schedule_item_id` ASC),
+ INDEX `fk_schedule_has_schedule_item_schedule_idx` (`schedule_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_istatistics`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_istatistics` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_istatistics` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_ivr_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `ivr_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`statistics_has_ivr`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`statistics_has_ivr` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_ivr` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NOT NULL,
+ `reset_time` TIME NOT NULL DEFAULT '00:00:00',
+ `ivr_id` VARCHAR(45) NOT NULL,
+ `feature_tenant_user_istatistics_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_statistics_has_ivr_feature_tenant_user_istatistics1_idx` (`feature_tenant_user_istatistics_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_cannouncements`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_cannouncements` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_cannouncements` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_custom_announcements_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `custom_announcements_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dashboard`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dashboard` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dashboard` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `type` VARCHAR(45) NOT NULL DEFAULT 'monitoring',
+ `tab_position` INT NULL,
+ `dashboard_tabpanel_id` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `dashboard_uid` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_dashboard_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dashboard_window`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dashboard_window` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dashboard_window` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `default_window` TINYINT(1) NOT NULL DEFAULT 0,
+ `window_type` VARCHAR(45) NOT NULL,
+ `x_cord` INT NULL DEFAULT 0,
+ `y_cord` INT NULL,
+ `width` INT NULL DEFAULT 4,
+ `height` INT NULL,
+ `dashboard_uid` VARCHAR(45) NOT NULL,
+ `dashboard_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_dashboard_window_dashboard1_idx` (`dashboard_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_speed_dial`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_speed_dial` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_speed_dial` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_speed_dial_enabled` INT NOT NULL DEFAULT 0,
+ `speed_dial_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`speed_dial_has_tenant_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`speed_dial_has_tenant_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`speed_dial_has_tenant_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `value` VARCHAR(45) NOT NULL,
+ `position` INT NOT NULL DEFAULT 1,
+ `label` VARCHAR(45) NOT NULL,
+ `feature_tenant_user_speed_dial_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_speed_dial_has_tenant_user_feature_tenant_user_speed_dia_idx` (`feature_tenant_user_speed_dial_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_conference`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_conference` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_conference` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_conference_bridge_limit` INT NOT NULL DEFAULT 0,
+ `license_conference_room_limit` INT NOT NULL DEFAULT 0,
+ `license_conference_chat_port_limit` INT NOT NULL DEFAULT 0,
+ `license_conference_audio_port_limit` INT NOT NULL DEFAULT 0,
+ `license_conference_video_port_limit` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`conference_bridge`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`conference_bridge` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`conference_bridge` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `primary_ddi` VARCHAR(45) NULL,
+ `conference_bridge_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `target_identifier` VARCHAR(45) NOT NULL,
+ `feature_tenant_conference_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_conference_bridge_feature_tenant_conference1_idx` (`feature_tenant_conference_id` ASC),
+ UNIQUE INDEX `uk_feature_tenant_conference_id_name_idx` (`feature_tenant_conference_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`conference_room`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`conference_room` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`conference_room` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `room_identifier` VARCHAR(45) NOT NULL,
+ `port_limit` INT NOT NULL DEFAULT 0,
+ `chat_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `audio_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `video_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `target_identifier` VARCHAR(45) NOT NULL,
+ `schedule_id` INT NULL,
+ `jsplugin_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `jsplugin_welcome_message` TEXT NULL,
+ `jsplugin_goodbye_message` TEXT NULL,
+ `limit_hours_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `limit_hours_from` VARCHAR(45) NULL,
+ `limit_hours_to` VARCHAR(45) NULL,
+ `conference_bridge_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_conference_room_conference_bridge1_idx` (`conference_bridge_id` ASC),
+ UNIQUE INDEX `uk_conference_bridge_id_name_idx` (`conference_bridge_id` ASC, `name` ASC),
+ UNIQUE INDEX `uk_conference_bridge_id_room_identifier_idx` (`conference_bridge_id` ASC, `room_identifier` ASC),
+ INDEX `fk_conference_room_schedule1_idx` (`schedule_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`conference_room_acl`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`conference_room_acl` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`conference_room_acl` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `check_mode` VARCHAR(45) NOT NULL COMMENT 'USER|DDI|PIN',
+ `check_value` VARCHAR(45) NOT NULL,
+ `access_mode` VARCHAR(45) NOT NULL COMMENT 'MEMBER|MODERATOR',
+ `conference_room_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_conference_room_acl_conference_room1_idx` (`conference_room_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_address_book`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_address_book` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_address_book` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `address_book_enabled` TINYINT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_voicemail`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_voicemail` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voicemail` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `beep_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'INTERNAL|EXTERNAL|ALL',
+ `custom_announcement_id` VARCHAR(45) NULL,
+ `recording_time` INT NOT NULL DEFAULT 30,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`address_book`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`address_book` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`address_book` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `address_book_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `type` VARCHAR(45) NOT NULL DEFAULT 'TENANT' COMMENT 'TENANT|TENANT_USER',
+ `ldap_synchronization_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `feature_tenant_address_book_id` INT NOT NULL,
+ `tenant_user_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_address_book_feature_tenant_address_book1_idx` (`feature_tenant_address_book_id` ASC),
+ INDEX `fk_address_book_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`address_book_entry`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`address_book_entry` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`address_book_entry` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NULL,
+ `firstname` VARCHAR(255) NULL,
+ `surname` VARCHAR(255) NULL,
+ `job_title` VARCHAR(255) NULL,
+ `country` VARCHAR(255) NULL,
+ `province` VARCHAR(255) NULL,
+ `postcode` VARCHAR(45) NULL,
+ `city` VARCHAR(255) NULL,
+ `address_1` VARCHAR(255) NULL,
+ `address_2` VARCHAR(255) NULL,
+ `phone_fixed` VARCHAR(45) NULL,
+ `phone_mobile` VARCHAR(45) NULL,
+ `email` VARCHAR(255) NULL,
+ `facebook` VARCHAR(45) NULL,
+ `extension_number` VARCHAR(45) NULL,
+ `address_book_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_address_book_entry_address_book1_idx` (`address_book_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_license_price`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_license_price` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_license_price` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `unit_price` DECIMAL(17,2) NOT NULL,
+ `license_id` INT NOT NULL,
+ `operator_tariff_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operatore_license_price_license1_idx` (`license_id` ASC),
+ INDEX `fk_operatore_license_price_operator_tariff1_idx` (`operator_tariff_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_license_agreement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_license_agreement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_license_agreement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `license_amount` INT NOT NULL,
+ `license_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `operator_license_price_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_agreement_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_license_agreement_license1_idx` (`license_id` ASC),
+ INDEX `fk_tenant_license_agreement_operatore_license_price1_idx` (`operator_license_price_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`dealer_contact_person`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`dealer_contact_person` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`dealer_contact_person` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `firstname` VARCHAR(45) NOT NULL,
+ `surname` VARCHAR(45) NOT NULL,
+ `contact_type` VARCHAR(45) NULL,
+ `email` VARCHAR(100) NULL,
+ `phone` VARCHAR(45) NULL,
+ `dealer_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_dealer_contact_person_dealer1_idx` (`dealer_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_billing`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_billing` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_billing` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_billing_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `billing_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`hunting_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`hunting_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`hunting_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `distribution_strategy` VARCHAR(45) NOT NULL,
+ `user_call_timeout` INT NOT NULL DEFAULT 30,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_hunting_group_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`hunting_group_has_tenant_user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`hunting_group_has_tenant_user` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`hunting_group_has_tenant_user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `position` INT NOT NULL,
+ `hunting_group_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_hunting_group_has_tenant_user_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_hunting_group_has_tenant_user_hunting_group1_idx` (`hunting_group_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_hgroup`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_hgroup` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_hgroup` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_hunting_group_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `hunting_group_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`ddi`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`ddi` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`ddi` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `e164number` VARCHAR(45) NOT NULL,
+ `voice_enabled` TINYINT(1) NOT NULL,
+ `sms_enabled` TINYINT(1) NOT NULL,
+ `fax_enabled` TINYINT(1) NOT NULL,
+ `voice_used` TINYINT(1) NOT NULL DEFAULT 0,
+ `sms_used` TINYINT(1) NOT NULL,
+ `fax_used` TINYINT(1) NOT NULL,
+ `sms_integration_id` VARCHAR(45) NULL,
+ `system_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_ddi_system1_idx` (`system_id` ASC),
+ INDEX `fk_ddi_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `e164number_UNIQUE` (`e164number` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`sms_alphanum`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`sms_alphanum` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`sms_alphanum` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `alphanum` VARCHAR(45) NOT NULL,
+ `used` TINYINT(1) NOT NULL DEFAULT 0,
+ `sms_integration_id` VARCHAR(45) NULL,
+ `system_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_ddi_system1_idx` (`system_id` ASC),
+ INDEX `fk_ddi_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_voice_campaign`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_voice_campaign` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voice_campaign` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `preview_auto_answer` INT NULL DEFAULT NULL,
+ `predictive_auto_answer` INT NULL,
+ `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `user_reservation_timeout` INT NOT NULL DEFAULT 900,
+ `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800,
+ `user_reservation_attempts` INT NOT NULL DEFAULT 5,
+ `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1,
+ `set_recall_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `set_recall_days_ahead` INT NULL,
+ `request_confirmation_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `request_confirmation_url` VARCHAR(100) NULL,
+ `request_confirmation_apphash` VARCHAR(100) NULL,
+ `request_confirmation_interval` INT NOT NULL DEFAULT 1800,
+ `consultant_retry_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `consultant_retry_count` INT NOT NULL DEFAULT 5,
+ `consultant_retry_time` INT NOT NULL DEFAULT 30,
+ `contact_retry_count` INT NOT NULL DEFAULT 1,
+ `contact_retry_time` INT NOT NULL DEFAULT 1800,
+ `contact_retry_count_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `contact_retry_count_per_day` INT NOT NULL DEFAULT 5,
+ `contact_no_answer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_no_answer_time` INT NOT NULL DEFAULT 300,
+ `contact_no_answer_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_no_answer_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_user_busy_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_user_busy_time` INT NOT NULL DEFAULT 300,
+ `contact_user_busy_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_user_busy_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_routing_not_found_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `contact_routing_not_found_time` INT NOT NULL DEFAULT 0,
+ `contact_routing_not_found_status` VARCHAR(45) NOT NULL DEFAULT 'CLOSED' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_routing_not_found_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_abandoned_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_abandoned_time` INT NOT NULL DEFAULT 60,
+ `contact_abandoned_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_abandoned_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_abandoned_change_dialing_method_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_abandoned_change_dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW',
+ `contact_machine_detected_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_machine_detected_time` INT NOT NULL DEFAULT 600,
+ `contact_machine_detected_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_machine_detected_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_error_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `contact_error_time` INT NOT NULL DEFAULT 240,
+ `contact_error_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED',
+ `contact_error_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_priority_recall_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_priority_recall` INT NOT NULL DEFAULT 150,
+ `auto_change_priority_retry_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_priority_retry` INT NOT NULL DEFAULT 250,
+ `auto_change_required_skill_recall_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_required_skill_recall` VARCHAR(45) NULL,
+ `auto_change_required_skill_retry_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_required_skill_retry` VARCHAR(45) NULL,
+ `first_change_retry_interval_time_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `first_change_retry_interval_time_after_try` INT NOT NULL DEFAULT 0,
+ `first_change_retry_interval_time` INT NOT NULL DEFAULT 0,
+ `second_change_retry_interval_time_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `second_change_retry_interval_time_after_try` INT NOT NULL DEFAULT 0,
+ `second_change_retry_interval_time` INT NOT NULL DEFAULT 0,
+ `predictive_aggressiveness_control_method` VARCHAR(45) NOT NULL DEFAULT 'contact_abandoned_rate' COMMENT 'contact_abandoned_rate|call_number|aggressiveness_constant',
+ `predictive_aggressiveness_regulator_min` FLOAT NOT NULL DEFAULT 0.1,
+ `predictive_aggressiveness_regulator_max` FLOAT NOT NULL DEFAULT 5,
+ `predictive_aggressiveness_regulator_default` FLOAT NOT NULL DEFAULT 0.2,
+ `predictive_aggressiveness_inc_step` FLOAT NOT NULL DEFAULT 0.1,
+ `predictive_aggressiveness_dec_step` FLOAT NOT NULL DEFAULT 0.3,
+ `predictive_expected_waiting_time_value` INT NOT NULL DEFAULT 5,
+ `predictive_expected_waiting_time_ratio_goal` INT NOT NULL DEFAULT 90,
+ `predictive_contact_abandoned_rate_goal` INT NOT NULL DEFAULT 5,
+ `predictive_aggressiveness_constant` FLOAT NOT NULL DEFAULT 2,
+ `predictive_call_number_goal` INT NOT NULL DEFAULT 10,
+ `predictive_consultant_call_timeout` INT NOT NULL DEFAULT 30,
+ `predictive_contact_call_timeout` INT NOT NULL DEFAULT 120,
+ `disable_acw_on_transfer` TINYINT(1) NOT NULL DEFAULT 1,
+ `auto_change_dialing_method_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `auto_change_dialing_method_after_try` INT NOT NULL DEFAULT 3,
+ `auto_change_dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW',
+ `auto_change_dialing_method_no_consultant_talks` TINYINT(1) NOT NULL DEFAULT 1,
+ `state_after_acw` VARCHAR(45) NOT NULL DEFAULT 'CLOSED',
+ `change_dialing_method_after_acw_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `change_dialing_method_after_acw` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW',
+ `change_mode_after_acw_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `change_mode_after_acw` VARCHAR(45) NOT NULL DEFAULT 'MANUAL',
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_voice_campaign_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_voice_campaign_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`fb_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`fb_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`fb_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `email` VARCHAR(500) NOT NULL,
+ `name` VARCHAR(255) NULL,
+ `user_id` VARCHAR(255) NOT NULL,
+ `access_token` TEXT NOT NULL,
+ `data_access_expire_date` DATETIME NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `created_by_tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_fb_page_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC, `tenant_id` ASC),
+ INDEX `fk_fb_account_tenant_user1_idx` (`created_by_tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`fb_page`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`fb_page` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`fb_page` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(255) NOT NULL,
+ `page_id` VARCHAR(255) NOT NULL,
+ `sync_after` DATETIME NULL,
+ `project_id` INT NULL,
+ `imrs_id` VARCHAR(255) NULL,
+ `fb_account_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_fb_page_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_fb_page_project1_idx` (`project_id` ASC),
+ UNIQUE INDEX `page_id_UNIQUE` (`page_id` ASC, `tenant_id` ASC),
+ INDEX `fk_fb_page_fb_account1_idx` (`fb_account_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`custom_announcement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`custom_announcement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`custom_announcement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `language` VARCHAR(45) NOT NULL DEFAULT 'en' COMMENT 'iso language',
+ `label` VARCHAR(100) NOT NULL,
+ `audio_path` VARCHAR(255) NULL,
+ `video_path` VARCHAR(255) NULL,
+ `message` TEXT NULL,
+ `category` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `system_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_custom_announcement_system1_idx` (`system_id` ASC),
+ UNIQUE INDEX `UNIQUE_language_label_tenant` (`language` ASC, `label` ASC, `tenant_id` ASC),
+ INDEX `fk_custom_announcement_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`team_has_manager`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`team_has_manager` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`team_has_manager` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `team_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_team_has_manager_team1_idx` (`team_id` ASC),
+ INDEX `fk_team_has_manager_tenant_user1_idx` (`tenant_user_id` ASC),
+ UNIQUE INDEX `team_user_UNIQUE` (`team_id` ASC, `tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`user_device`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`user_device` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`user_device` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `user_agent` VARCHAR(255) NOT NULL,
+ `name` VARCHAR(45) NOT NULL,
+ `uuid` VARCHAR(100) NOT NULL,
+ `create_date` DATETIME NOT NULL,
+ `create_ip` VARCHAR(45) NOT NULL,
+ `verify_key` VARCHAR(100) NOT NULL,
+ `verified` TINYINT(1) NOT NULL DEFAULT 0,
+ `verified_by_tenant_user_id` INT NULL,
+ `verify_date` DATETIME NULL,
+ `verify_ip` VARCHAR(45) NULL,
+ `webapp_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `communicator_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `wallboard_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `description` VARCHAR(255) NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_user_device_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_user_device_tenant_user2_idx` (`verified_by_tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_license_demo`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_license_demo` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_license_demo` (
+ `id` INT NOT NULL,
+ `license_limit` INT NOT NULL,
+ `license_id` INT NOT NULL,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_license_demo_license1_idx` (`license_id` ASC),
+ INDEX `fk_operator_license_demo_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_activation_request`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_activation_request` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_activation_request` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `note` TEXT NULL,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NOT NULL,
+ `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_activation_request_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_deactivation_request`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_deactivation_request` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_deactivation_request` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `note` TEXT NULL,
+ `create_date` DATETIME NOT NULL,
+ `deactivate_date` DATETIME NOT NULL,
+ `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_deactivation_request_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_deactivation_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_deactivation_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_deactivation_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_amount` INT NOT NULL,
+ `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `system_verification_info` VARCHAR(255) NULL,
+ `verification_info` VARCHAR(100) NULL,
+ `license_id` INT NOT NULL,
+ `license_deactivation_request_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_deactivation_request_license1_idx` (`license_id` ASC),
+ INDEX `fk_license_deactivation_item_license_deactivation_request1_idx` (`license_deactivation_request_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_contract_activation_request`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_contract_activation_request` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_contract_activation_request` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NOT NULL,
+ `tenant_contract_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_contract_activation_request_tenant_contract1_idx` (`tenant_contract_id` ASC),
+ INDEX `fk_tenant_contract_activation_request_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_activation_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_activation_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_activation_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_amount` INT NOT NULL,
+ `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `system_verification_info` VARCHAR(255) NULL,
+ `verification_info` VARCHAR(100) NULL,
+ `license_id` INT NOT NULL,
+ `license_activation_request_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_license_activation_item_license1_idx` (`license_id` ASC),
+ INDEX `fk_license_activation_item_license_activation_request1_idx` (`license_activation_request_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_wallboard`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_wallboard` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_wallboard` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_wallboard_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `wallboard_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_hotdesk_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_hotdesk_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`shift`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`shift` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`shift` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NULL,
+ `description` VARCHAR(100) NULL,
+ `dynamic_break_minutes_per_hour` INT NOT NULL DEFAULT 0,
+ `dynamic_break_after_hours` INT NOT NULL DEFAULT 0,
+ `static_break_minutes` INT NOT NULL DEFAULT 30,
+ `static_break_after_hours` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_shift_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `unique_name_tenant` (`tenant_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_work_agenda`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_work_agenda` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_work_agenda` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_work_agenda_enabled` INT NOT NULL DEFAULT 0,
+ `work_agenda_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `change_planned_work_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `change_planned_break_allowed` TINYINT(1) NOT NULL DEFAULT 1,
+ `shift_id` INT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_tenant_user_work_agenda_shift1_idx` (`shift_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_work_agenda`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_work_agenda` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_work_agenda` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `work_agenda_enabled` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`billing_group`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`billing_group` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`billing_group` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(100) NULL,
+ `billing_period` INT NOT NULL DEFAULT 1,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_billing_group_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`billing_group_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`billing_group_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`billing_group_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `country_iso_alpha2_code` VARCHAR(45) NOT NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `regexp` VARCHAR(100) NULL,
+ `billing_group_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_billing_item_billing_group1_idx` (`billing_group_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`billing_ruleset`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`billing_ruleset` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`billing_ruleset` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NULL,
+ `deactivate_date` DATETIME NULL,
+ `tenant_id` INT NOT NULL,
+ `feature_tenant_billing_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_billing_ruleset_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_billing_ruleset_feature_tenant_billing1_idx` (`feature_tenant_billing_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`billing_ruleset_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`billing_ruleset_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`billing_ruleset_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `free_minutes_limit` INT NOT NULL DEFAULT 0,
+ `price` DECIMAL(4,2) NOT NULL DEFAULT 0,
+ `billing_group_id` INT NOT NULL,
+ `billing_ruleset_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_billing_ruleset_item_billing_group1_idx` (`billing_group_id` ASC),
+ INDEX `fk_billing_ruleset_item_billing_ruleset1_idx` (`billing_ruleset_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_calling_policy`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_calling_policy` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_calling_policy` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `outbound_policy_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `inbound_policy_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `default_outbound_policy_id` INT NULL,
+ `default_inbound_policy_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_tenant_inbound_policy_inbound_policy1_idx` (`default_inbound_policy_id` ASC),
+ INDEX `fk_feature_tenant_calling_policy_inbound_policy1_idx` (`default_outbound_policy_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`policy_fraction`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`policy_fraction` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`policy_fraction` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_outbound_policy_group_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`policy_fraction_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`policy_fraction_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`policy_fraction_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `country_iso_alpha2_code` VARCHAR(45) NOT NULL,
+ `e164_regexp` VARCHAR(100) NOT NULL,
+ `policy_fraction_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_policy_fraction_item_policy_fraction1_idx` (`policy_fraction_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`policy_has_fraction`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`policy_has_fraction` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`policy_has_fraction` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `rule` VARCHAR(45) NOT NULL DEFAULT 'DENY',
+ `priority` INT NOT NULL DEFAULT 100,
+ `calling_policy_id` INT NOT NULL,
+ `policy_fraction_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_policy_has_fraction_calling_policy1_idx` (`calling_policy_id` ASC),
+ INDEX `fk_policy_has_fraction_policy_fraction1_idx` (`policy_fraction_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_email`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_email` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_email` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `email_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `integration_method` VARCHAR(45) NOT NULL DEFAULT 'MAILBOX' COMMENT 'SMTP|MAILBOX',
+ `mailbox_refresh_time` INT NOT NULL DEFAULT 300,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_fax`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_fax` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fax` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `fax_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `max_concurrent_outbound_calls` INT NOT NULL DEFAULT 5,
+ `send_tries_limit` INT NOT NULL DEFAULT 3,
+ `send_retry_timeout` INT NOT NULL DEFAULT 300,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_email_domain`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_email_domain` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_domain` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(45) NOT NULL,
+ `enabled` TINYINT(1) NOT NULL,
+ `relay_address` VARCHAR(45) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_fax_domain`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_fax_domain` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_fax_domain` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(45) NOT NULL,
+ `external` TINYINT(1) NOT NULL,
+ `enabled` TINYINT(1) NOT NULL,
+ `relay_address` VARCHAR(15) NULL,
+ `fax2email` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ `feature_tenant_fax_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_fax_domain_feature_tenant_fax1_idx` (`feature_tenant_fax_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`special_service_number`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`special_service_number` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`special_service_number` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dial_number` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `emergency` TINYINT(1) NOT NULL DEFAULT 0,
+ `operator_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_emergency_numbers_operator1_idx` (`operator_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`special_service_mapping`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`special_service_mapping` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`special_service_mapping` (
+ `id` INT NOT NULL,
+ `e164_process_number` VARCHAR(45) NOT NULL,
+ `special_service_number_id` INT NOT NULL,
+ `special_service_zone_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_special_number_number_mapping_special_service_number1_idx` (`special_service_number_id` ASC),
+ INDEX `fk_special_service_mapping_special_service_zone1_idx` (`special_service_zone_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_call_info`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_call_info` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_call_info` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `call_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `outbound_call_info_definition_id` VARCHAR(100) NULL,
+ `inbound_call_info_definition_id` VARCHAR(100) NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_talk_script`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_talk_script` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_talk_script` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `talk_script_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_callback`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_callback` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_callback` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `callback_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `call_duration_min` INT NOT NULL DEFAULT 5,
+ `webapp_required` TINYINT(1) NOT NULL DEFAULT 1,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `mode` VARCHAR(45) NOT NULL DEFAULT 'AUTO' COMMENT 'MANUAL|AUTO',
+ `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PROGRESSIVE' COMMENT 'PREVIEW|PROGRESSIVE',
+ `active_calls_limit` INT NOT NULL DEFAULT 5,
+ `progressive_wait_time` INT NOT NULL DEFAULT 30,
+ `consultant_retry_count` INT NOT NULL DEFAULT 5,
+ `consultant_retry_time` INT NOT NULL DEFAULT 30,
+ `contact_retry_count` INT NOT NULL DEFAULT 1,
+ `contact_retry_time` INT NOT NULL DEFAULT 1800,
+ `member_priority` INT NOT NULL DEFAULT 200,
+ `call_info_definition_id` VARCHAR(100) NULL,
+ `schedule_id` INT NULL,
+ `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `user_reservation_timeout` INT NOT NULL DEFAULT 900,
+ `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800,
+ `user_reservation_attempts` INT NOT NULL DEFAULT 5,
+ `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1,
+ `register_system_drop` TINYINT(1) NOT NULL DEFAULT 1,
+ `preview_auto_answer` INT NULL,
+ `default_info` TEXT NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_project_callback_schedule1_idx` (`schedule_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_callme`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_callme` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_callme` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `webapp_required` TINYINT(1) NOT NULL DEFAULT 1,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `mode` VARCHAR(45) NOT NULL DEFAULT 'AUTO' COMMENT 'AUTO|MANUAL',
+ `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PROGRESSIVE' COMMENT 'PREVIEW|PROGRESSIVE',
+ `active_calls_limit` INT NOT NULL DEFAULT 5,
+ `progressive_wait_time` INT NOT NULL DEFAULT 30,
+ `consultant_retry_count` INT NOT NULL DEFAULT 5,
+ `consultant_retry_time` INT NOT NULL DEFAULT 30,
+ `contact_retry_count` INT NOT NULL DEFAULT 1,
+ `contact_retry_time` INT NOT NULL DEFAULT 1800,
+ `member_priority` INT NOT NULL DEFAULT 200,
+ `call_info_definition_id` VARCHAR(100) NULL,
+ `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `user_reservation_timeout` INT NOT NULL DEFAULT 900,
+ `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800,
+ `user_reservation_attempts` INT NOT NULL DEFAULT 5,
+ `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1,
+ `preview_auto_answer` INT NULL,
+ `default_info` TEXT NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_jsplugin_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_jsplugin_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`bss_api`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`bss_api` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`bss_api` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `version` VARCHAR(45) NOT NULL,
+ `active` TINYINT(1) NOT NULL DEFAULT 1,
+ `system_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_bss_api_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_application`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_application` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_application` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `token_key` VARCHAR(100) NOT NULL,
+ `application_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `application_config_id` VARCHAR(100) NOT NULL,
+ `bss_api_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_application_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_application_bss_api1_idx` (`bss_api_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`sip_terminal_model_has_version`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`sip_terminal_model_has_version` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_model_has_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `sip_terminal_model_id` INT NOT NULL,
+ `sip_terminal_firmware_version_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_sip_terminal_model_has_version_sip_terminal_model1_idx` (`sip_terminal_model_id` ASC),
+ INDEX `fk_sip_terminal_model_has_version_sip_terminal_model_versio_idx` (`sip_terminal_firmware_version_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_jsplugin`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_jsplugin` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_jsplugin` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `uuid` VARCHAR(64) NULL,
+ `default_language` VARCHAR(45) NULL DEFAULT 'pl',
+ `color` VARCHAR(45) NULL DEFAULT 'blue',
+ `type` VARCHAR(45) NULL,
+ `json_config` TEXT NULL,
+ `iwrs_id` VARCHAR(45) NULL,
+ `project_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_tenant_jsplugin_project1_idx` (`project_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`ddi_pool_number`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`ddi_pool_number` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`ddi_pool_number` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ddi` VARCHAR(45) NOT NULL,
+ `inbound` TINYINT(1) NOT NULL DEFAULT 1,
+ `outbound` TINYINT(1) NOT NULL DEFAULT 1,
+ `default_number` TINYINT(1) NOT NULL DEFAULT 0,
+ `prefix` VARCHAR(45) NULL,
+ `project_ddi_pool_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_ddi_pool_number_project_ddi_pool1_idx` (`project_ddi_pool_id` ASC),
+ INDEX `uk_pool_prefix` (`project_ddi_pool_id` ASC, `prefix` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`voice_campaign_trigger`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`voice_campaign_trigger` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`voice_campaign_trigger` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(64) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `code` VARCHAR(64) NOT NULL,
+ `voice_campaign_trigger_definition_id` VARCHAR(100) NULL,
+ `project_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_trigger_code_project1_idx` (`project_id` ASC),
+ UNIQUE INDEX `code_project_UNIQUE` (`project_id` ASC, `code` ASC),
+ UNIQUE INDEX `name_project_UNIQUE` (`project_id` ASC, `name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`model_version`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`model_version` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`model_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `serial` VARCHAR(45) NOT NULL,
+ `dirty` TINYINT(1) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_voice_polling`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_polling` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_polling` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active_calls_limit` INT NOT NULL DEFAULT 3,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`address_book_assign`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`address_book_assign` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`address_book_assign` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `scope` VARCHAR(45) NOT NULL DEFAULT 'tenant_user' COMMENT 'tenant_user | project | team',
+ `scope_id` VARCHAR(45) NOT NULL DEFAULT 0,
+ `address_book_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_address_book_assign_address_book1_idx` (`address_book_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_addressbook`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_addressbook` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_addressbook` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `address_book_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_address_book_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_address_book_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`crm_contact_job`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`crm_contact_job` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_job` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `crm_id` VARCHAR(45) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `name_tenant_id` (`name` ASC, `crm_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`custom_tag`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`custom_tag` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`custom_tag` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `type` VARCHAR(45) NOT NULL COMMENT 'CRM/TICKETING',
+ `position` INT NULL,
+ `crm_id` VARCHAR(45) NULL,
+ `color_hex` VARCHAR(45) NULL,
+ `tenant_user_id` INT NULL,
+ `used_count` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_blf`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_blf` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_blf` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `blf_enabled` INT NOT NULL DEFAULT 3,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`internal_network`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`internal_network` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`internal_network` (
+ `id` INT NOT NULL,
+ `network_address` VARCHAR(18) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_internal_network_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_license_package`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_license_package` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_license_package` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `licence_package_variant` VARCHAR(45) NOT NULL COMMENT 'TENANT_USER_MAIN|TENANT_USER_VAS|TENANT_MAIN|TENANT_VAS',
+ `unit_price` DECIMAL(17,2) NOT NULL,
+ `operator_tariff_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_license_package_operator_tariff1_idx` (`operator_tariff_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_package_agreement`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_package_agreement` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_package_agreement` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `license_package_amount` INT NOT NULL,
+ `operator_license_package_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_agreement_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_package_agreement_operator_license_package1_idx` (`operator_license_package_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_package_has_license`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_package_has_license` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_package_has_license` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `amount` INT NOT NULL,
+ `license_package_id` INT NOT NULL,
+ `license_id` INT NOT NULL,
+ INDEX `fk_license_package_has_license_license1_idx` (`license_id` ASC),
+ INDEX `fk_license_package_has_license_license_package1_idx` (`license_package_id` ASC),
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`operator_package_demo`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`operator_package_demo` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`operator_package_demo` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `package_limit` INT NOT NULL,
+ `operator_license_package_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_operator_package_demo_operator_package_price1_idx` (`operator_license_package_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`package_activation_request`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`package_activation_request` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`package_activation_request` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `create_date` DATETIME NOT NULL,
+ `activate_date` DATETIME NOT NULL,
+ `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_license_activation_request_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`package_deactivation_request`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`package_deactivation_request` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`package_deactivation_request` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `create_date` DATETIME NOT NULL,
+ `deactivate_date` DATETIME NOT NULL COMMENT 'COMMERCIAL|DEMO',
+ `status` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`, `tenant_id`),
+ INDEX `fk_package_deactivation_request_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`package_activation_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`package_activation_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`package_activation_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_package_amount` INT NOT NULL,
+ `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `system_verification_info` VARCHAR(255) NULL,
+ `verification_info` VARCHAR(100) NULL,
+ `operator_license_package_id` INT NOT NULL,
+ `package_activation_request_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_package_activation_item_operator_license_package1_idx` (`operator_license_package_id` ASC),
+ INDEX `fk_package_activation_item_package_activation_request1_idx` (`package_activation_request_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`package_deactivation_item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`package_deactivation_item` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`package_deactivation_item` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_package_amount` INT NOT NULL,
+ `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO',
+ `system_verification_info` VARCHAR(255) NULL,
+ `verification_info` VARCHAR(100) NULL,
+ `operator_license_package_id` INT NOT NULL,
+ `package_deactivation_request_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_package_deactivation_item_operator_license_package1_idx` (`operator_license_package_id` ASC),
+ INDEX `fk_package_deactivation_item_package_deactivation_item1_idx` (`package_deactivation_request_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_has_license_package`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_has_license_package` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_license_package` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_package_limit` INT NOT NULL,
+ `used` INT NOT NULL,
+ `operator_license_package_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_has_license_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_has_license_package_operator_license_package1_idx` (`operator_license_package_id` ASC),
+ INDEX `tenant_has_license_package_tenant1_id_license_package1_idx` (`tenant_id` ASC, `operator_license_package_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_license_package`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_license_package` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_license_package` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_user_id` INT NOT NULL,
+ `operator_license_package_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_has_operator_license_package_operator_licens_idx` (`operator_license_package_id` ASC),
+ INDEX `fk_tenant_user_has_operator_license_package_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_aaa`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_aaa` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_aaa` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `inbound_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `inbound_authentication_method` VARCHAR(45) NULL DEFAULT 'PHONE_NUMBER' COMMENT 'PHONE_NUMBER | TELE_ID',
+ `inbound_authentication_pin_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `outbound_authentication_enabled` TINYINT(1) NULL,
+ `sms_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `email_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `voicemail_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `facebook_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `fax_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `webmessage_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `whatsapp_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `instagram_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `crm_id` VARCHAR(45) NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_aaa_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_aaa_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`crm_contact_database`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`crm_contact_database` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_database` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` TEXT NULL,
+ `public` TINYINT(1) NOT NULL DEFAULT 0,
+ `system_id` INT NOT NULL,
+ `tenant_id` INT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC),
+ INDEX `fk_tenant_contact_database_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_contact_database_system1_idx` (`system_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_ad`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_ad` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_ad` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `adfs_sso_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `adfs_sso_prefix` VARCHAR(255) NULL,
+ `idp_entity_id` VARCHAR(255) NULL,
+ `idp_sso_url` VARCHAR(255) NULL,
+ `x509_cert` TEXT NULL,
+ `ldap_host` VARCHAR(45) NULL,
+ `ldap_port` INT NULL,
+ `ldap_username` VARCHAR(45) NULL,
+ `ldap_password` VARCHAR(45) NULL,
+ `ldap_users_base_dn` VARCHAR(255) NULL,
+ `ldap_users_filter` VARCHAR(255) NULL,
+ `ad_login_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `ad_login_host` VARCHAR(255) NULL,
+ `ad_login_domain` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `adfs_sso_prefix_UNIQUE` (`adfs_sso_prefix` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_ad`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ad` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ad` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ad_login` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_ustatistics_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_ustatistics_tenant_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `ad_login_UNIQUE` (`ad_login` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`global_property`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`global_property` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`global_property` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NULL,
+ `value` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_global_properties_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`crm_contact_stage_flag`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`crm_contact_stage_flag` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_stage_flag` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `required` TINYINT(1) NOT NULL DEFAULT 0,
+ `flag_type` VARCHAR(45) NOT NULL COMMENT 'SINGLE | MULTI',
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`crm_contact_lifecycle_stage`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`crm_contact_lifecycle_stage` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_lifecycle_stage` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `stage` VARCHAR(100) NOT NULL,
+ `kanban_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `kanban_position` INT NULL DEFAULT 1,
+ `kanban_color` VARCHAR(45) NULL DEFAULT '#CCCCCC',
+ `crm_id` VARCHAR(45) NOT NULL,
+ `crm_contact_stage_flag_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `name_tenant_id` (`stage` ASC, `crm_id` ASC),
+ INDEX `fk_crm_contact_lifecycle_stage_crm_contact_stage_flag1_idx` (`crm_contact_stage_flag_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_crm`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_crm` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_crm` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `show_crm_tab_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `crm_id` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_crm_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_crm_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_voice_sms`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_sms` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_sms` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `active_calls_limit` INT NOT NULL DEFAULT 30,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_sms_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_voice_sms`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_voice_sms` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voice_sms` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `voice_sms_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_project_voice_sms_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_voice_sms_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_ticketing`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_ticketing` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_ticketing` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ticketing_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `ticket_number_format_type` VARCHAR(100) NULL DEFAULT 'GLOBAL' COMMENT 'GLOBAL|YEARLY|MONTHLY|DAYLY - auto increment',
+ `ticket_number_format` VARCHAR(100) NULL DEFAULT '%NUMBER' COMMENT '%NUMBER - kolejny numer zgłoszenia\n%YEAR - rok\n%MONTH - miesiac\n%DAY - dzien',
+ `phone_number_notification` VARCHAR(45) NULL,
+ `email_notification` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_ticketing_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_ticketing`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_ticketing` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_ticketing` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN',
+ `distribution_login_required` TINYINT(1) NOT NULL DEFAULT 1,
+ `expected_processing_time` INT NULL DEFAULT 3600,
+ `permitted_processing_time` INT NULL DEFAULT 86400,
+ `show_notification_sla_changed` TINYINT(1) NOT NULL DEFAULT 0,
+ `require_tasks_completed_to_close` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_project_ticketing_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_project_ticketing_project1_idx` (`project_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_role`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_role` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_role` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `available` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_role_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_tenant_role`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_tenant_role` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_tenant_role` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_role_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_has_tenant_role_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_tenant_user_has_tenant_role_tenant_role1_idx` (`tenant_role_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_role_has_privilege`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_role_has_privilege` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_role_has_privilege` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `scope` VARCHAR(45) NULL,
+ `super` TINYINT(1) NULL,
+ `resource_privilege_id` INT NOT NULL,
+ `tenant_role_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_role_has_privilege_tenant_role1_idx` (`tenant_role_id` ASC),
+ INDEX `fk_tenant_role_has_privilege_resource_privilege1_idx` (`resource_privilege_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_email_mailbox`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_email_mailbox` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_mailbox` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `email_address` VARCHAR(100) NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `mailbox_type` VARCHAR(45) NOT NULL DEFAULT 'STANDARD',
+ `login` VARCHAR(45) NOT NULL,
+ `password` VARCHAR(45) NOT NULL,
+ `imap_host_name` VARCHAR(45) NOT NULL,
+ `imap_tcp_port` INT NOT NULL DEFAULT 143,
+ `imap_authentication_method` VARCHAR(45) NOT NULL DEFAULT 'NORMAL_PASSWORD' COMMENT 'NORMAL_PASSWORD|SECURED_PASSWORD',
+ `imap_security_protocol` VARCHAR(45) NULL DEFAULT NULL COMMENT 'NULL|STARTTLS|SSL_TLS',
+ `smtp_host_name` VARCHAR(45) NOT NULL,
+ `smtp_tcp_port` INT NOT NULL DEFAULT 25,
+ `smtp_security_protocol` VARCHAR(45) NULL DEFAULT NULL COMMENT 'NULL|STARTTLS|SSL_TLS',
+ `smtp_authentication_method` VARCHAR(45) NOT NULL DEFAULT 'NORMAL_PASSWORD' COMMENT 'NORMAL_PASSWORD|SECURED_PASSWORD',
+ `sync_not_before` DATETIME NULL,
+ `sync_only_crm_contacts` TINYINT(1) NOT NULL DEFAULT 1,
+ `mark_messages_as_seen` TINYINT(1) NOT NULL DEFAULT 0,
+ `copy_email_to_folder` VARCHAR(255) NULL,
+ `imap_connection_state` VARCHAR(255) NULL,
+ `imap_connection_info` VARCHAR(255) NULL,
+ `smtp_connection_info` VARCHAR(255) NULL,
+ `smtp_connection_state` VARCHAR(255) NULL,
+ `imrs_id` VARCHAR(255) NULL,
+ `project_id` INT NULL,
+ `tenant_user_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_email_mailbox_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_tenant_email_mailbox_project1_idx` (`project_id` ASC),
+ INDEX `fk_tenant_email_mailbox_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_team_viewer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_team_viewer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_team_viewer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `client_id` VARCHAR(64) NULL,
+ `client_secret` VARCHAR(64) NULL,
+ `group_id` VARCHAR(45) NULL,
+ `access_token` VARCHAR(64) NULL,
+ `refresh_token` VARCHAR(64) NULL,
+ `expires_in` DATETIME NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_team_viewer_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_team_viewer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_team_viewer` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_team_viewer` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `team_viewer_user_id` VARCHAR(45) NULL,
+ `team_viewer_group_id` VARCHAR(45) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_team_viewer_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_team_viewer_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_gus`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_gus` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_gus` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `gus_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_gus_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_webapp`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_webapp` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_webapp` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_webapp_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `webapp_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `double_verification_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `email_for_verification` VARCHAR(135) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_crm_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_crm_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_tpresence`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_tpresence` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_tpresence` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_team_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_team_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_team_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_team_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_team_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `team_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_user_upresence_tenant_user_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_upresence_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`presence_has_team`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`presence_has_team` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`presence_has_team` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `label` VARCHAR(45) NOT NULL,
+ `position` INT NOT NULL,
+ `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `team_id` INT NOT NULL DEFAULT 0,
+ `feature_tenant_user_tpresence_id` INT NOT NULL,
+ INDEX `fk_presence_has_tenant_user_tenant_user_idx` (`team_id` ASC),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `uk_feature_tenant_user_upresence_id_tenant_user_id_idx` (`feature_tenant_user_tpresence_id` ASC, `team_id` ASC),
+ INDEX `fk_presence_has_tenant_user_feature_tenant_user_upresence_idx` (`feature_tenant_user_tpresence_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_call_meeting`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_call_meeting` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_call_meeting` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `webapp_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW',
+ `active_calls_limit` INT NOT NULL DEFAULT 5,
+ `progressive_wait_time` INT NOT NULL DEFAULT 30,
+ `consultant_retry_count` INT NOT NULL DEFAULT 5,
+ `consultant_retry_time` INT NOT NULL DEFAULT 30,
+ `contact_retry_count` INT NOT NULL DEFAULT 1,
+ `contact_retry_time` INT NOT NULL DEFAULT 1800,
+ `member_priority` INT NOT NULL DEFAULT 50,
+ `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `user_reservation_timeout` INT NOT NULL DEFAULT 900,
+ `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800,
+ `user_reservation_attempts` INT NOT NULL DEFAULT 5,
+ `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1,
+ `preview_auto_answer` INT NULL,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_project_call_meeting_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_call_meeting_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_amd`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_amd` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_amd` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `amd_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `license_limit` INT NOT NULL DEFAULT 0,
+ `maximum_word_length` INT NOT NULL DEFAULT 1500,
+ `minimum_word_length` INT NOT NULL DEFAULT 120,
+ `maximum_number_of_words` INT NOT NULL DEFAULT 3,
+ `between_words_silence` INT NOT NULL DEFAULT 40,
+ `total_analysis_time` INT NOT NULL DEFAULT 5000,
+ `after_greeting_silence` INT NOT NULL DEFAULT 500,
+ `maximum_greeting_length` INT NOT NULL DEFAULT 1500,
+ `maximum_initial_silence` INT NOT NULL DEFAULT 1250,
+ `treat_initial_silence_as_machine` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_amd_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_mobile_agent`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_mobile_agent` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_mobile_agent` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `outgoing_call_ddi` VARCHAR(45) NULL,
+ `alternative_outgoing_call_ddi` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_fac`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_fac` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fac` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `login` VARCHAR(45) NULL DEFAULT '23',
+ `logout` VARCHAR(45) NULL DEFAULT '24',
+ `work_state_online` VARCHAR(45) NULL DEFAULT '11',
+ `work_state_offline` VARCHAR(45) NULL DEFAULT '12',
+ `work_state_onbreak` VARCHAR(45) NULL DEFAULT '13',
+ `diversion_always_enable` VARCHAR(45) NULL DEFAULT '71',
+ `diversion_always_disable` VARCHAR(45) NULL DEFAULT '72',
+ `diversion_timeout_enable` VARCHAR(45) NULL DEFAULT '73',
+ `diversion_timeout_disable` VARCHAR(45) NULL DEFAULT '74',
+ `diversion_busy_enable` VARCHAR(45) NULL DEFAULT '75',
+ `diversion_busy_disable` VARCHAR(45) NULL DEFAULT '76',
+ `diversion_unavailable_enable` VARCHAR(45) NULL DEFAULT '77',
+ `diversion_unavailable_disable` VARCHAR(45) NULL DEFAULT '78',
+ `diversion_schedule_enable` VARCHAR(45) NULL DEFAULT '79',
+ `diversion_schedule_disable` VARCHAR(45) NULL DEFAULT '80',
+ `recording_enable` VARCHAR(45) NULL DEFAULT '41',
+ `recording_disable` VARCHAR(45) NULL DEFAULT '42',
+ `clir` VARCHAR(45) NULL DEFAULT '31\*',
+ `call_prefix` VARCHAR(45) NULL DEFAULT '50\*',
+ `echo` VARCHAR(45) NULL DEFAULT '00',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_fac_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`custom_priority`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`custom_priority` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`custom_priority` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `priority` INT(11) NOT NULL,
+ `color_hex` VARCHAR(45) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `name_tenant_id` (`name` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`custom_ticket_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`custom_ticket_state` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`custom_ticket_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(100) NOT NULL,
+ `color_hex` VARCHAR(45) NULL,
+ `system_state` VARCHAR(45) NOT NULL,
+ `flag_name` VARCHAR(45) NULL,
+ `kanban_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `kanban_position` INT NULL DEFAULT 1,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `name_tenant_id` (`name` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_recording`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_recording` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_recording` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `recording_encryption` TINYINT(1) NOT NULL DEFAULT 0,
+ `recording_public_key` TEXT NULL,
+ `recording_private_key` TEXT NULL,
+ `recording_private_key_hash` TEXT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_recording_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_web_poll`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_web_poll` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_web_poll` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `web_poll_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_project_web_poll_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_web_poll_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_livespace`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_livespace` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_livespace` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `livespace_user_id` VARCHAR(100) NULL,
+ `livespace_api_key` TEXT NULL,
+ `livespace_api_secret` TEXT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_user_livespace_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_feature_tenant_user_livespace_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`license_package_has_system_role`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`license_package_has_system_role` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`license_package_has_system_role` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `license_package_id` INT NOT NULL,
+ `system_role_id` INT NOT NULL,
+ INDEX `fk_license_package_has_license_license_package1_idx` (`license_package_id` ASC),
+ PRIMARY KEY (`id`),
+ INDEX `fk_license_package_has_system_role_system_role1_idx` (`system_role_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_idenfy`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_idenfy` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_idenfy` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `idenfy_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `api_url` VARCHAR(100) NULL DEFAULT 'https://ivs.idenfy.com/api/v2/',
+ `api_key` VARCHAR(100) NULL,
+ `api_secret` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_idenfy_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_identity_verify`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_identity_verify` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_identity_verify` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `verification_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `verification_type` VARCHAR(45) NOT NULL DEFAULT 'IDENFY',
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_project_identity_verification_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_identity_verify_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_fully_verified`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_fully_verified` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fully_verified` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `fully_verified_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `api_url` VARCHAR(100) NULL,
+ `api_email` VARCHAR(100) NULL,
+ `api_password` VARCHAR(100) NULL,
+ `api_customer_name` VARCHAR(100) NULL,
+ `api_customer_secret_key` VARCHAR(100) NULL,
+ `api_verification_secret_key` VARCHAR(100) NULL,
+ `verification_type` VARCHAR(100) NULL DEFAULT 'with_operator' COMMENT 'with_operator|without_operator|mix_with_operator_first',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_fully_verified_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_talkieai`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_talkieai` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_talkieai` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `talkieai_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `sip_host` VARCHAR(100) NULL,
+ `sip_port` VARCHAR(100) NULL,
+ `auth_key` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_talkieai_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`ddi_info`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`ddi_info` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`ddi_info` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `information` TEXT NULL,
+ `operator` VARCHAR(45) NULL,
+ `ddi_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_ddi_info_ddi1_idx` (`ddi_id` ASC),
+ INDEX `fk_ddi_info_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`skill`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`skill` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`skill` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `description` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_skill_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_skill`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_skill` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_skill` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `skill_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_user_has_skill_skill1_idx` (`skill_id` ASC),
+ INDEX `fk_tenant_user_has_skill_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`black_list`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`black_list` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`black_list` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(255) NOT NULL,
+ `type` VARCHAR(45) NOT NULL COMMENT 'GLOBAL|PROJECT',
+ `manual_call_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `voice_campaign_call_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `voice_sms_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `callback_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `voice_polling_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `call_meeting_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `callme_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_voice_opt_out_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_black_list`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_black_list` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_black_list` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `project_id` INT NOT NULL,
+ `black_list_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_voice_opt_out_project1_idx` (`project_id` ASC),
+ INDEX `fk_project_has_black_list_black_list1_idx` (`black_list_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_mrcp`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_mrcp` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_mrcp` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `enabled` TINYINT NOT NULL DEFAULT 0,
+ `profile_name` VARCHAR(225) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_voice_component`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_voice_component` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_voice_component` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `direction` VARCHAR(45) NOT NULL DEFAULT 'BOTH',
+ `project_id` INT NOT NULL,
+ `voice_component_id` VARCHAR(45) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ INDEX `fk_project_has_tenant_user_tenant_user2_idx` (`voice_component_id` ASC),
+ INDEX `fk_project_has_tenant_user_project2_idx` (`project_id` ASC),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `project_user_UNIQUE` (`project_id` ASC, `voice_component_id` ASC),
+ INDEX `fk_project_has_voice_component_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_voice_verify`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_verify` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_verify` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `enabled` TINYINT NOT NULL DEFAULT 0,
+ `verify_type` VARCHAR(45) NOT NULL DEFAULT 'PHONEXIA',
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_voice_verify_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_phonexia`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_phonexia` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_phonexia` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `enabled` TINYINT NOT NULL DEFAULT 0,
+ `gateway_name` VARCHAR(45) NOT NULL DEFAULT 'phonexia',
+ `api_url` VARCHAR(100) NULL,
+ `api_key` VARCHAR(100) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_phonexia_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`facebook_server_url_mapping`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`facebook_server_url_mapping` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`facebook_server_url_mapping` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `page_id` VARCHAR(255) NULL,
+ `instagram_account_id` VARCHAR(255) NULL,
+ `facebook_server_url` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`black_list_entry`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`black_list_entry` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`black_list_entry` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `ddi` VARCHAR(255) NOT NULL,
+ `note` VARCHAR(255) NULL,
+ `tenant_id` INT NOT NULL,
+ `black_list_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_voice_opt_out_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_black_list_entry_black_list1_idx` (`black_list_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_has_cdr_tag`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_has_cdr_tag` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_cdr_tag` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tag` VARCHAR(255) NOT NULL,
+ `play_recording_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `download_recording_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_user_has_cdr_tag_user1_idx` (`tenant_user_id` ASC),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_has_mailbox`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_has_mailbox` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_has_mailbox` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_email_mailbox_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ INDEX `fk_project_has_consultant_project_idx` (`project_id` ASC),
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_has_consultant_tenant_email_mailbox1_idx` (`tenant_email_mailbox_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`team_has_project_basic_presence`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`team_has_project_basic_presence` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`team_has_project_basic_presence` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `team_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_team_has_project_basic_presence_team1_idx` (`team_id` ASC),
+ INDEX `fk_team_has_project_basic_presence_project1_idx` (`project_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_email_mailbox_has_folder`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_email_mailbox_has_folder` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_mailbox_has_folder` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `folder_name` VARCHAR(255) NOT NULL DEFAULT 0,
+ `last_synced_uid` INT NULL,
+ `uidvalidity` INT NULL,
+ `attribute_list` VARCHAR(510) NULL,
+ `delimiter` VARCHAR(10) NULL,
+ `tenant_email_mailbox_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_tenant_email_mailbox_has_folder_tenant_email_mailbox1_idx` (`tenant_email_mailbox_id` ASC),
+ UNIQUE INDEX `tenant_email_mailbox_id_UNIQUE` (`tenant_email_mailbox_id` ASC, `folder_name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_messaging_sla`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_messaging_sla` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_messaging_sla` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `expected_waiting_time_for_consultant_response` INT NULL DEFAULT 3600,
+ `permitted_waiting_time_for_consultant_response` INT NULL DEFAULT 86400,
+ `unassign_user_if_exceeded_sla_wtfcr` TINYINT(1) NOT NULL DEFAULT 0,
+ `show_notification_sla_wtfcr_changed` TINYINT(1) NOT NULL DEFAULT 0,
+ `expected_client_waiting_time_for_first_response` INT NULL DEFAULT 3600,
+ `permitted_client_waiting_time_for_first_response` INT NULL DEFAULT 7200,
+ `show_notification_sla_cwtffr_changed` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_messaging_sla_project_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_messaging_sla_tenant_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`messagebird_integration`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`messagebird_integration` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`messagebird_integration` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `api_key` VARCHAR(255) NOT NULL,
+ `name` VARCHAR(45) NOT NULL,
+ `webhook_id` VARCHAR(255) NOT NULL,
+ `namespace_id` VARCHAR(255) NULL,
+ `verify_token` VARCHAR(255) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_messagebird_integration_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`messagebird_integration_channel`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`messagebird_integration_channel` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`messagebird_integration_channel` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `channel_id` VARCHAR(255) NOT NULL,
+ `channel_name` VARCHAR(45) NOT NULL,
+ `channel_type` VARCHAR(45) NOT NULL,
+ `sync_after` DATETIME NULL,
+ `tenant_id` INT NOT NULL,
+ `tenant_user_id` INT NULL,
+ `project_id` INT NOT NULL,
+ `messagebird_integration_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `channel_id_UNIQUE` (`channel_id` ASC, `tenant_id` ASC),
+ INDEX `fk_messagebird_integration_channel_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_messagebird_integration_channel_project1_idx` (`project_id` ASC),
+ INDEX `fk_messagebird_integration_channel_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_messagebird_integration_channel_messagebird_integration1_idx` (`messagebird_integration_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_bot`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_bot` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_bot` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `min_word_voice_time` INT NOT NULL DEFAULT 200,
+ `sentence_end_silence_time` INT NOT NULL DEFAULT 500,
+ `sentence_start_timeout` INT NOT NULL DEFAULT 10000,
+ `sentence_time_max` INT NOT NULL DEFAULT 30000,
+ `min_confidence_level` INT NOT NULL DEFAULT 50,
+ `with_nlu_processing_time` TINYINT(1) NOT NULL DEFAULT 1,
+ `duplex_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `prefix_time` INT NOT NULL DEFAULT 700,
+ `license_bot_voice_limit` INT NOT NULL DEFAULT 0,
+ `license_bot_chat_limit` INT NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_bot_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`bookingsync_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`bookingsync_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`bookingsync_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `access_token` VARCHAR(255) NOT NULL,
+ `refresh_token` VARCHAR(255) NOT NULL,
+ `bookingsync_account_id` VARCHAR(255) NOT NULL,
+ `sync_after` DATETIME NULL,
+ `project_id` INT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_bookingsync_account_project1_idx` (`project_id` ASC),
+ INDEX `fk_bookingsync_account_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`project_consultant_bookingsync`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`project_consultant_bookingsync` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`project_consultant_bookingsync` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `bookingsync_user_id` INT NOT NULL,
+ `bookingsync_user_fullname` VARCHAR(100) NOT NULL,
+ `bookingsync_account_id` INT NOT NULL,
+ `project_has_consultant_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_project_consultant_bookingsync_bookingsync_account1_idx` (`bookingsync_account_id` ASC),
+ INDEX `fk_project_consultant_bookingsync_project_has_consultant1_idx` (`project_has_consultant_id` ASC),
+ INDEX `fk_project_consultant_bookingsync_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_msal`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_msal` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_msal` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `msal_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `client_id` VARCHAR(64) NULL,
+ `client_credential` VARCHAR(64) NULL,
+ `client_tenant_id` VARCHAR(64) NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_tenant_msal_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_user_msal`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_user_msal` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_msal` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `username` VARCHAR(128) NULL,
+ `tenant_user_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_user_msal_tenant1_idx` (`tenant_id` ASC),
+ INDEX `fk_feature_tenant_user_msal_tenant_user1_idx` (`tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`instagram_account`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`instagram_account` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`instagram_account` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `instagram_account_id` VARCHAR(255) NOT NULL,
+ `name` VARCHAR(45) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `page_id` VARCHAR(255) NOT NULL,
+ `sync_after` DATETIME NULL,
+ `project_id` INT NULL,
+ `imrs_id` VARCHAR(255) NULL,
+ `fb_account_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_instagram_account_project1_idx` (`project_id` ASC),
+ INDEX `fk_instagram_account_fb_account1_idx` (`fb_account_id` ASC),
+ INDEX `fk_instagram_account_tenant1_idx` (`tenant_id` ASC),
+ UNIQUE INDEX `instagram_account_id_UNIQUE` (`instagram_account_id` ASC, `tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_project_sms_campaign`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_project_sms_campaign` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_project_sms_campaign` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `sms_campaign_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `project_id` INT NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_feature_project_sms_campaign_project1_idx` (`project_id` ASC),
+ INDEX `fk_feature_project_sms_campaign_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`feature_tenant_local_authentication`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`feature_tenant_local_authentication` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_local_authentication` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `local_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 1,
+ `password_expiration_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_expiration_days` INT NOT NULL DEFAULT 30,
+ `password_history_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_history` INT NOT NULL DEFAULT 6,
+ `password_min_length` INT NOT NULL DEFAULT 6,
+ `password_max_length` INT NOT NULL DEFAULT 16,
+ `password_symbol_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_digit_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_letter_mix_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `first_password_change_required` TINYINT(1) NOT NULL DEFAULT 0,
+ `send_first_password_via_email` TINYINT(1) NOT NULL DEFAULT 0,
+ `password_change_notification` TINYINT(1) NOT NULL DEFAULT 0,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_feature_tenant_local_authentication_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `manager`.`tenant_user_password_history`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `manager`.`tenant_user_password_history` ;
+
+CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_password_history` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `password` VARCHAR(100) NOT NULL,
+ `created_date` DATETIME NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `id_UNIQUE` (`id` ASC),
+ INDEX `fk_tenant_user_password_history_tenant_user1_idx` (`tenant_user_id` ASC),
+ INDEX `fk_tenant_user_password_history_tenant1_idx` (`tenant_id` ASC))
+ENGINE = InnoDB;
+
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/templates/mariadb/03_create_db_freeswitch.sql b/templates/mariadb/03_create_db_freeswitch.sql
new file mode 100644
index 0000000..02405fc
--- /dev/null
+++ b/templates/mariadb/03_create_db_freeswitch.sql
@@ -0,0 +1,85 @@
+-- MySQL Script generated by MySQL Workbench
+-- 09/11/17 15:53:27
+-- Model: New Model Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
+
+-- -----------------------------------------------------
+-- Schema freeswitch
+-- -----------------------------------------------------
+DROP SCHEMA IF EXISTS `freeswitch` ;
+
+-- -----------------------------------------------------
+-- Schema freeswitch
+-- -----------------------------------------------------
+CREATE SCHEMA IF NOT EXISTS `freeswitch` DEFAULT CHARACTER SET utf8 ;
+USE `freeswitch` ;
+
+-- -----------------------------------------------------
+-- Table `freeswitch`.`domain`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `freeswitch`.`domain` ;
+
+CREATE TABLE IF NOT EXISTS `freeswitch`.`domain` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(45) NOT NULL,
+ `sofia_template` VARCHAR(45) NOT NULL,
+ `verto_template` VARCHAR(45) NOT NULL,
+ `session_server` VARCHAR(45) NOT NULL,
+ `realm` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `name_UNIQUE` (`name` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `freeswitch`.`user`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `freeswitch`.`user` ;
+
+CREATE TABLE IF NOT EXISTS `freeswitch`.`user` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `link_type` VARCHAR(45) NOT NULL COMMENT 'SOFIA|VERTO',
+ `username` VARCHAR(45) NOT NULL,
+ `password` VARCHAR(45) NOT NULL,
+ `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `domain_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `username_UNIQUE` (`username` ASC),
+ INDEX `fk_user_domain_idx` (`domain_id` ASC),
+ CONSTRAINT `fk_user_domain`
+ FOREIGN KEY (`domain_id`)
+ REFERENCES `freeswitch`.`domain` (`id`)
+ ON DELETE NO ACTION
+ ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
+
+-- -----------------------------------------------------
+-- Data for table `freeswitch`.`domain`
+-- -----------------------------------------------------
+START TRANSACTION;
+USE `freeswitch`;
+INSERT INTO `freeswitch`.`domain` (`id`, `name`, `sofia_template`, `verto_template`, `session_server`, `realm`) VALUES (1, 'conpeek', 'sofia', 'verto', 'session_server01', 'fspool01.conpeek.com');
+
+COMMIT;
+
+
+-- -----------------------------------------------------
+-- Data for table `freeswitch`.`user`
+-- -----------------------------------------------------
+START TRANSACTION;
+USE `freeswitch`;
+INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (1, 'SOFIA', '225957801', '225957801', DEFAULT, 1);
+INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (2, 'SOFIA', '225957802', '225957802', DEFAULT, 1);
+INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (3, 'SOFIA', '225957803', '225957803', DEFAULT, 1);
+
+COMMIT;
+
diff --git a/templates/mariadb/04_create_db_session_server.sql b/templates/mariadb/04_create_db_session_server.sql
new file mode 100644
index 0000000..a530a34
--- /dev/null
+++ b/templates/mariadb/04_create_db_session_server.sql
@@ -0,0 +1,583 @@
+-- MySQL Script generated by MySQL Workbench
+-- Thu Jul 7 17:59:49 2022
+-- Model: New Model Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
+
+-- -----------------------------------------------------
+-- Schema sessionserver1
+-- -----------------------------------------------------
+DROP SCHEMA IF EXISTS `sessionserver1` ;
+
+-- -----------------------------------------------------
+-- Schema sessionserver1
+-- -----------------------------------------------------
+CREATE SCHEMA IF NOT EXISTS `sessionserver1` DEFAULT CHARACTER SET utf8 ;
+USE `sessionserver1` ;
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_system_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_system_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_system_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `user_id` INT NOT NULL,
+ `username` VARCHAR(100) NOT NULL,
+ `system_state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE',
+ `system_state_inactive_cause` VARCHAR(45) NULL,
+ `system_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `work_state` VARCHAR(45) NOT NULL,
+ `work_state_inactive_cause` VARCHAR(45) NULL,
+ `work_state_break_cause` VARCHAR(100) NULL,
+ `work_state_break_started` TINYINT NULL,
+ `work_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `webapp_state` VARCHAR(45) NOT NULL,
+ `webapp_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `call_state` VARCHAR(45) NOT NULL COMMENT 'IDLE|BUSY',
+ `call_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `meeting_limit` INT NOT NULL,
+ `serving_chat` TINYINT NOT NULL DEFAULT 1,
+ `serving_audio` TINYINT NOT NULL DEFAULT 1,
+ `serving_video` TINYINT NOT NULL DEFAULT 1,
+ `serving_media_cav` VARCHAR(45) NOT NULL DEFAULT '111',
+ `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `break_set_time` TIMESTAMP NULL,
+ `business_break_set_time` TIMESTAMP NULL,
+ `coffee_break_set_time` TIMESTAMP NULL,
+ `indicator_talk_count` INT NOT NULL DEFAULT 0,
+ `indicator_talk_time` INT NOT NULL DEFAULT 0,
+ `indicator_last_talk` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `online_count` INT NOT NULL DEFAULT 0,
+ `coffee_break_count` INT NOT NULL DEFAULT 0,
+ `coffee_break_exceeded_notified` TINYINT NOT NULL DEFAULT 0,
+ `business_break_count` INT NOT NULL DEFAULT 0,
+ `business_break_exceeded_notified` TINYINT NOT NULL DEFAULT 0,
+ `break_count` INT NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `UNIQUE_tenant_user` (`tenant_id` ASC, `user_id` ASC),
+ INDEX `user_system_state_idx_user_id_webapp_state` (`user_id` ASC, `webapp_state` ASC),
+ INDEX `user_system_state_idx_user_id` (`user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_project_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_project_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_project_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `user_id` INT NOT NULL,
+ `username` VARCHAR(100) NOT NULL,
+ `project_id` INT NOT NULL,
+ `project` VARCHAR(45) NOT NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE',
+ `state_inactive_cause` VARCHAR(45) NULL,
+ `state_inactive_break_cause` VARCHAR(45) NULL,
+ `position` INT NOT NULL,
+ `score` INT NOT NULL,
+ `tier` INT NOT NULL,
+ `mode` VARCHAR(45) NOT NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `serving_chat` TINYINT NOT NULL DEFAULT 1,
+ `serving_audio` TINYINT NOT NULL DEFAULT 1,
+ `serving_video` TINYINT NOT NULL DEFAULT 1,
+ `serving_media_cav` VARCHAR(45) NOT NULL DEFAULT '111',
+ `accept_sms` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_email` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_facebook` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_whatsapp` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_webmessage` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_fax` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_voicemail` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_bookingsync` TINYINT(1) NOT NULL DEFAULT 0,
+ `accept_instagram` TINYINT(1) NOT NULL DEFAULT 0,
+ `noanswer_counter` INT NULL DEFAULT 0,
+ `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ INDEX `user_project_state_idx_id_state_tier` (`project_id` ASC, `state` ASC, `tier` ASC),
+ INDEX `user_project_state_project_user_state_mode` (`project_id` ASC, `user_id` ASC, `state` ASC, `mode` ASC),
+ INDEX `user_project_state_project_state_mode` (`project_id` ASC, `state` ASC, `mode` ASC),
+ INDEX `idx_user_id_project_id_state_tier_mode` (`user_id` ASC, `project_id` ASC, `state` ASC, `tier` ASC, `mode` ASC),
+ INDEX `user_project_state_idx_id_state_mode_chat_audio_video` (`project_id` ASC, `state` ASC, `mode` ASC, `serving_chat` ASC, `serving_audio` ASC, `serving_video` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_reservation`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_reservation` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `reservation_uuid` VARCHAR(100) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NULL,
+ `user_id` INT NOT NULL,
+ `username` VARCHAR(100) NULL,
+ `project` VARCHAR(45) NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'WORK|ACW',
+ `mode` VARCHAR(45) NOT NULL COMMENT 'INBOUND|OUTBOUND',
+ `break_expire_time` TIMESTAMP NULL,
+ `break_task_uuid` VARCHAR(100) NULL,
+ `confirm_expire_time` TIMESTAMP NULL,
+ `confirm_task_uuid` VARCHAR(100) NULL,
+ `meeting_uuid` VARCHAR(100) NULL,
+ `reserved_chat` TINYINT NOT NULL,
+ `reserved_audio` TINYINT NOT NULL COMMENT 'CHAT|VOICE|VIDEO',
+ `reserved_video` TINYINT NOT NULL,
+ `reservation_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `information` TEXT NULL,
+ `project_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `user_reservation_idx_user_id` (`user_id` ASC),
+ INDEX `user_reservation_idx_reservation_uuid` (`reservation_uuid` ASC),
+ INDEX `idx_state` (`state` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`contact_session_data`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`contact_session_data` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`contact_session_data` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `contact_id` VARCHAR(100) NULL,
+ `session_id` VARCHAR(45) NOT NULL,
+ `session_pass` VARCHAR(45) NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `token_id` VARCHAR(45) NULL,
+ `token_valid` VARCHAR(45) NULL,
+ `nonce` VARCHAR(45) NULL,
+ `contact_ip` VARCHAR(45) NULL,
+ `expiration_time` TIMESTAMP NULL,
+ `tenant_id` INT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `customer_session_id_UNIQUE` (`session_id` ASC),
+ INDEX `idx_tenant_contact` (`tenant_id` ASC, `contact_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`tenant_user_session_data`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`tenant_user_session_data` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`tenant_user_session_data` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `tenant_user_id` INT NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'CREATED|CONNECTED|DISCONNECTED|DESTROYED',
+ `weblink_id` INT NULL,
+ `weblink_name` VARCHAR(45) NULL,
+ `session_id` VARCHAR(45) NOT NULL,
+ `session_pass` VARCHAR(45) NOT NULL,
+ `device_available_chat` TINYINT NOT NULL DEFAULT 0,
+ `device_available_audio` TINYINT NOT NULL DEFAULT 0,
+ `device_available_video` TINYINT NOT NULL DEFAULT 0,
+ `device_available_media_cav` VARCHAR(3) NOT NULL DEFAULT '000',
+ `token_id` VARCHAR(45) NULL,
+ `token_valid` VARCHAR(45) NULL,
+ `nonce` VARCHAR(45) NULL,
+ `device_uuid` VARCHAR(100) NULL,
+ `tenant_user_ip` VARCHAR(45) NULL,
+ `user_agent` VARCHAR(200) NULL,
+ `expiration_time` TIMESTAMP NULL,
+ `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `session_type` VARCHAR(45) NOT NULL DEFAULT 'WEBAPP' COMMENT 'WEBAPP|COMMUNICATOR',
+ `operator_user_id` INT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `consultant_session_id_UNIQUE` (`session_id` ASC),
+ INDEX `idx_tenant_id_tenant_user_weblink_id` (`tenant_id` ASC, `tenant_user_id` ASC, `weblink_id` ASC, `session_type` ASC),
+ INDEX `idx_tenant_id_user_id` (`tenant_id` ASC, `tenant_user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`reservation_queue`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`reservation_queue` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`reservation_queue` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `queue_uuid` VARCHAR(100) NOT NULL,
+ `tenant_id` INT NOT NULL,
+ `project_id` INT NULL,
+ `user_id` INT NULL,
+ `queue_type` VARCHAR(45) NOT NULL COMMENT 'PROJECT_ANYONE|PROJECT_USER|USER',
+ `queue_priority` INT NOT NULL DEFAULT 100,
+ `time_base` VARCHAR(45) NOT NULL COMMENT 'SYSTEM|QUEUE',
+ `queue_member_resume_time` INT NOT NULL DEFAULT 0,
+ `avg_waiting_time` INT NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ INDEX `reservation_queue_idx_uuid` (`queue_uuid` ASC),
+ INDEX `reservation_queue_type_project_user` (`queue_type` ASC, `project_id` ASC, `user_id` ASC),
+ INDEX `reservation_queue_typet_user` (`queue_type` ASC, `user_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`queue_member`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`queue_member` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`queue_member` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `member_uuid` VARCHAR(100) NOT NULL,
+ `member_type` VARCHAR(45) NOT NULL,
+ `member_id` INT NULL,
+ `target_identifier` VARCHAR(100) NOT NULL,
+ `member_display_name` VARCHAR(100) NULL,
+ `member_priority` INT NOT NULL,
+ `member_mode` VARCHAR(45) NOT NULL,
+ `system_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `process_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `queue_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `calculated_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `state` VARCHAR(45) NOT NULL COMMENT 'WAITING|ABANDONED',
+ `member_expire_time` TIMESTAMP NULL,
+ `member_expire_task_uuid` VARCHAR(100) NULL,
+ `member_transfer_time` TIMESTAMP NULL,
+ `member_transfer_task_uuid` VARCHAR(100) NULL,
+ `noagent_expire_time` TIMESTAMP NULL,
+ `noagent_expire_task_uuid` VARCHAR(100) NULL,
+ `member_resume_time` TIMESTAMP NULL,
+ `member_resume_task_uuid` VARCHAR(100) NULL,
+ `current_tier` INT NOT NULL,
+ `next_tier_time` TIMESTAMP NULL,
+ `next_tier_task_uuid` VARCHAR(100) NULL,
+ `required_chat` TINYINT NOT NULL,
+ `required_audio` TINYINT NOT NULL,
+ `required_video` TINYINT NOT NULL,
+ `required_media_cav` VARCHAR(45) NOT NULL,
+ `webapp_required` TINYINT NOT NULL,
+ `information` VARCHAR(255) NULL,
+ `event_queue_uuid` VARCHAR(100) NULL,
+ `skill_name` VARCHAR(45) NOT NULL DEFAULT 'ANY',
+ `reservation_queue_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_queue_member_queue_idx` (`reservation_queue_id` ASC),
+ INDEX `queue_member_idx_state_id_priorit_time` (`state` ASC, `reservation_queue_id` ASC, `member_priority` ASC, `calculated_join_time` ASC),
+ INDEX `queue_member_idx_reservation_queue_id_state_mode` (`reservation_queue_id` ASC, `state` ASC, `member_mode` ASC),
+ INDEX `queue_member_idx_reservation_queue_id_current_tier` (`reservation_queue_id` ASC, `current_tier` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_reservation_statistics`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_reservation_statistics` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation_statistics` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `period` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_reservation_log`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_reservation_log` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation_log` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(100) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `start_time` TIMESTAMP NOT NULL,
+ `stop_time` TIMESTAMP NULL,
+ `duration` TIMESTAMP NULL,
+ `chat` TINYINT NOT NULL,
+ `audio` TINYINT NOT NULL,
+ `video` TINYINT NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`acd`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`acd` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`acd` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `domain` VARCHAR(45) NOT NULL,
+ `project` VARCHAR(45) NOT NULL,
+ `strategy` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_link_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_link_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_link_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `user_id` INT NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `link_id` INT NOT NULL,
+ `link_type` VARCHAR(45) NOT NULL COMMENT 'WEB|PSTN|LINE',
+ `link_name` VARCHAR(45) NOT NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE',
+ `state_inactive_cause` VARCHAR(45) NULL,
+ `priority` INT NOT NULL DEFAULT 100,
+ `available_chat` TINYINT NOT NULL,
+ `available_audio` TINYINT NOT NULL,
+ `available_video` TINYINT NOT NULL,
+ `available_media_cav` VARCHAR(45) NOT NULL,
+ `change_time` TIMESTAMP NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `idx_user_link_type_id` (`user_id` ASC, `link_type` ASC, `link_id` ASC),
+ INDEX `idx_user_id_link_type` (`user_id` ASC, `link_type` ASC),
+ INDEX `idx_user_id_state` (`user_id` ASC, `state` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`project_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`project_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`project_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NOT NULL,
+ `project_id` INT NOT NULL,
+ `project` VARCHAR(45) NOT NULL,
+ `service_type` VARCHAR(45) NOT NULL,
+ `service_id` INT NOT NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE',
+ `state_inactive_cause` VARCHAR(45) NULL,
+ `inbound_consultants_reserve_count` INT NOT NULL DEFAULT 0,
+ `multichat` TINYINT NOT NULL,
+ `recently_reserved_position` INT NOT NULL DEFAULT 0,
+ `inbound_users_count` INT NOT NULL DEFAULT 0,
+ `inbound_chat_users_count` INT NOT NULL DEFAULT 0,
+ `inbound_audio_users_count` INT NOT NULL DEFAULT 0,
+ `inbound_video_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_chat_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_audio_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_video_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_webapp_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_webapp_chat_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_webapp_audio_users_count` INT NOT NULL DEFAULT 0,
+ `outbound_webapp_video_users_count` INT NOT NULL DEFAULT 0,
+ `inbound_serving_media_cav` VARCHAR(45) NOT NULL,
+ `outbound_serving_media_cav` VARCHAR(45) NOT NULL,
+ `outbound_webapp_serving_media_cav` VARCHAR(45) NOT NULL,
+ `queue_enabled` TINYINT(1) NOT NULL,
+ `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `inbound_staff_sla_indicator` VARCHAR(45) NOT NULL DEFAULT 'regular' COMMENT 'regular|increased',
+ `outbound_staff_sla_indicator` VARCHAR(45) NOT NULL DEFAULT 'regular' COMMENT 'regular|increased',
+ `webapp_online_users_count` INT NOT NULL DEFAULT 0,
+ `webapp_online_chat_users_count` INT NOT NULL DEFAULT 0,
+ `webapp_online_audio_users_count` INT NOT NULL DEFAULT 0,
+ `webapp_online_video_users_count` INT NOT NULL DEFAULT 0,
+ `lock_change_to_break_enabled` TINYINT(1) NOT NULL DEFAULT 0,
+ `lock_change_to_break_members_limit` INT NOT NULL DEFAULT 1,
+ PRIMARY KEY (`id`),
+ INDEX `idx_tenant_project_multichat` (`tenant_id` ASC, `project_id` ASC, `multichat` ASC),
+ INDEX `idx_project_state` (`project_id` ASC, `state` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`sip_location`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`sip_location` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`sip_location` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `sip_username` VARCHAR(45) NOT NULL,
+ `status` VARCHAR(45) NOT NULL,
+ `contact` VARCHAR(255) NOT NULL,
+ `expires` INT NOT NULL,
+ `network_ip` VARCHAR(45) NOT NULL,
+ `network_port` INT NOT NULL,
+ `user_agent` VARCHAR(100) NOT NULL,
+ `freeswitch_hostname` VARCHAR(45) NOT NULL,
+ `freeswitch_switchname` VARCHAR(45) NOT NULL,
+ `freeswitch_ipv4` VARCHAR(45) NOT NULL,
+ `freeswitch_ipv6` VARCHAR(45) NOT NULL,
+ `profile_name` VARCHAR(45) NOT NULL,
+ `rpid` VARCHAR(45) NOT NULL,
+ `change_time` TIMESTAMP NOT NULL,
+ `user_link_state_id` INT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `fk_sip_location_user_link_state1_idx` (`user_link_state_id` ASC),
+ INDEX `sip_location_idx_sip_username` (`sip_username` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_dialog_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_dialog_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_dialog_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `dialog_uuid` VARCHAR(45) NOT NULL,
+ `user_id` INT NOT NULL,
+ `team_id` INT NULL,
+ `project_id` INT NULL,
+ `state` VARCHAR(45) NOT NULL COMMENT 'ALERTING|RINGING|TALKING|HOLD',
+ `state_complete` TINYINT(1) NOT NULL DEFAULT 0,
+ `media_cav` VARCHAR(45) NOT NULL,
+ `chat` TINYINT(1) NOT NULL DEFAULT 0,
+ `audio` TINYINT(1) NOT NULL DEFAULT 0,
+ `video` TINYINT(1) NOT NULL DEFAULT 0,
+ `direction` VARCHAR(45) NOT NULL,
+ `self_username` VARCHAR(45) NULL,
+ `self_firstname` VARCHAR(45) NULL,
+ `self_surname` VARCHAR(45) NULL,
+ `self_type` VARCHAR(45) NULL COMMENT 'TENANT_USER|CONSULTANT',
+ `self_name` VARCHAR(100) NULL,
+ `self_target` VARCHAR(100) NULL,
+ `self_project_name` VARCHAR(45) NULL,
+ `peer_username` VARCHAR(45) NULL,
+ `peer_firstname` VARCHAR(45) NULL,
+ `peer_surname` VARCHAR(45) NULL,
+ `peer_type` VARCHAR(45) NULL,
+ `peer_name` VARCHAR(100) NULL,
+ `peer_target` VARCHAR(100) NULL,
+ `peer_project_name` VARCHAR(45) NULL,
+ `start_time` TIMESTAMP NOT NULL,
+ `need_help` TINYINT(1) NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ INDEX `idx_tenant_user_media_state` (`tenant_id` ASC, `user_id` ASC, `media_cav` ASC, `state` ASC),
+ INDEX `idx_project_state` (`project_id` ASC, `state` ASC),
+ INDEX `idx_tenant_user_state` (`user_id` ASC, `state` ASC),
+ INDEX `idx_tenant_project_media_state` (`tenant_id` ASC, `project_id` ASC, `media_cav` ASC, `state` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`voice_campaign_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`voice_campaign_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`voice_campaign_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ `voice_campaign_id` VARCHAR(100) NOT NULL,
+ `active` TINYINT(1) NOT NULL DEFAULT 0,
+ `records_number` INT NOT NULL DEFAULT 0,
+ `state_new_number` INT NOT NULL DEFAULT 0,
+ `state_recall_number` INT NOT NULL DEFAULT 0,
+ `state_retry_number` INT NOT NULL DEFAULT 0,
+ `state_closed_number` INT NOT NULL DEFAULT 0,
+ `close_reason_timeout_number` INT NOT NULL DEFAULT 0,
+ `close_reason_callback_number` INT NOT NULL DEFAULT 0,
+ `close_reason_cancelled_number` INT NOT NULL DEFAULT 0,
+ `close_reason_unconfirmed_number` INT NOT NULL DEFAULT 0,
+ `close_reason_tries_exceeded_number` INT NOT NULL DEFAULT 0,
+ `close_reason_done_number` INT NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`model_version`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`model_version` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`model_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `serial` VARCHAR(45) NOT NULL,
+ `dirty` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`recent_agent_log`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`recent_agent_log` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`recent_agent_log` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `project_id` INT NOT NULL,
+ `user_id` INT NOT NULL,
+ `channel` VARCHAR(45) NOT NULL,
+ `address` VARCHAR(100) NULL,
+ `contact_id` VARCHAR(100) NULL,
+ `assign_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ INDEX `idx_channel_project_id_address_assign_time` (`channel` ASC, `project_id` ASC, `address` ASC, `assign_time` ASC),
+ INDEX `idx_channel_project_id_contact_id_assign_time` (`channel` ASC, `project_id` ASC, `contact_id` ASC, `assign_time` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`hunting_group_state`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`hunting_group_state` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`hunting_group_state` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `domain` VARCHAR(100) NULL,
+ `hunting_group_id` INT NOT NULL,
+ `recently_reserved_position` INT NOT NULL DEFAULT 0,
+ `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`user_skill`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`user_skill` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_skill` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `tenant_id` INT NOT NULL,
+ `user_id` INT NOT NULL,
+ `skill_id` INT NULL,
+ `skill_name` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `sessionserver1`.`tts_cache_recording`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `sessionserver1`.`tts_cache_recording` ;
+
+CREATE TABLE IF NOT EXISTS `sessionserver1`.`tts_cache_recording` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `md5_hash` VARCHAR(45) NOT NULL,
+ `recording_source` VARCHAR(1000) NOT NULL,
+ `last_usage_date` TIMESTAMP NOT NULL,
+ `tenant_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `md5_hash_index` (`md5_hash` ASC),
+ INDEX `index3` (`last_usage_date` ASC))
+ENGINE = InnoDB;
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/templates/mariadb/05_create_db_kamailio.sql b/templates/mariadb/05_create_db_kamailio.sql
new file mode 100644
index 0000000..b4471bd
--- /dev/null
+++ b/templates/mariadb/05_create_db_kamailio.sql
@@ -0,0 +1,46 @@
+-- MySQL Script generated by MySQL Workbench
+-- Wed Oct 31 16:34:07 2018
+-- Model: New Model Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
+
+-- -----------------------------------------------------
+-- Schema kamailio
+-- -----------------------------------------------------
+
+-- -----------------------------------------------------
+-- Schema kamailio
+-- -----------------------------------------------------
+CREATE SCHEMA IF NOT EXISTS `kamailio` DEFAULT CHARACTER SET utf8 ;
+USE `kamailio` ;
+
+-- -----------------------------------------------------
+-- Table `kamailio`.`selected_freeswitch`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `kamailio`.`selected_freeswitch` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `call_id` VARCHAR(100) NOT NULL,
+ `freeswitch_ipv4` VARCHAR(45) NOT NULL,
+ `freeswitch_port` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `call_id_UNIQUE` (`call_id` ASC))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `kamailio`.`model_version`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `kamailio`.`model_version` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `serial` VARCHAR(45) NOT NULL,
+ `dirty` TINYINT NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/templates/mariadb/06_manager_data_for_1_tenant.sql b/templates/mariadb/06_manager_data_for_1_tenant.sql
new file mode 100644
index 0000000..41376a8
--- /dev/null
+++ b/templates/mariadb/06_manager_data_for_1_tenant.sql
@@ -0,0 +1,21 @@
+use manager;
+SET @operator_domain = 'OPERATOR_DOMAIN';
+SET @operator_username = 'OPERATOR_USERNAME';
+SET @operator_password = 'OPERATOR_PASSWORD';
+
+INSERT INTO `setting` VALUES (1,'1','GLOBAL',NULL,1),(2,'4','GLOBAL',NULL,2),(3,'20','GLOBAL',NULL,3),(4,'10','GLOBAL',NULL,4),(5,'10','GLOBAL',NULL,5),(6,'30','GLOBAL',NULL,6),(7,'60','GLOBAL',NULL,7),(8,'60','GLOBAL',NULL,8),(9,'10','GLOBAL',NULL,9),(10,'0','GLOBAL',NULL,10),(11,'4','GLOBAL',NULL,11),(12,'5','GLOBAL',NULL,12),(13,'120','GLOBAL',NULL,13),(14,'3','GLOBAL',NULL,14),(15,'5','GLOBAL',NULL,15),(16,'0','GLOBAL',NULL,16),(17,'2','GLOBAL',NULL,17),(18,'2','GLOBAL',NULL,18),(19,'0','GLOBAL',NULL,19),(20,'1','GLOBAL',NULL,20);
+
+INSERT INTO `bss_api` VALUES (1,'v1_3',1,1);
+INSERT INTO `normalization` VALUES (1,'^([0-9]{9})$','48\\1',100,1),(2,'^\\\\+(48[0-9]{9})$','\\1',100,1),(3,'^00(48[0-9]{9})$','\\1',100,1);
+INSERT INTO `operator` VALUES (1,'Conpeek',@operator_domain,'PLN','support@conpeek.com','48223574199','Polska',NULL,'96-500','Sochaczew','ul. 1-go Maja','24/3',1);
+INSERT INTO `operator_contact_person` VALUES (1,'Adam','Kuśmirek','CEO','adam.kusmirek@conpeek.com','48223574199',1);
+INSERT INTO `operator_contract` VALUES (1,'XChs67',1,'2016-10-10 10:00:00','2016-10-10 10:00:00',NULL,1);
+INSERT INTO `operator_tariff` VALUES (1,'taryfa 1',1,'2023-01-01 00:00:00','2023-01-01 00:00:00',NULL,1);
+INSERT INTO `operator_user` VALUES (1,'OPERATOR',@operator_username,@operator_password,1,'Admin','Admin','support@conpeek.com','48223574199','ADMINISTRATOR',NULL,1);
+
+INSERT INTO `system` VALUES (1,'produkcja','produkcja','produkcja','en',1),(2,'test','test','test','en',NULL);
+INSERT INTO `system_user` VALUES (1,'admin','8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918','admin@admin.pl','ADMIN',1),(2,'admin_test','cb9b36b102080fdd528586959f259535502519291b06d3ddfe76c8a74cecd638','admin_test@admin.pl','ADMIN',2);
+
+INSERT INTO `license_package_has_system_role` VALUES (1,1,2),(15,6,4),(16,6,39),(17,7,3),(18,7,4),(19,7,39),(21,8,4),(22,8,39),(23,9,3),(24,10,3),(25,11,3),(26,12,3),(27,13,3);
+INSERT INTO `license_package_has_license` VALUES (1,1,1,222),(2,1,1,203),(15,1,2,17),(16,1,2,18),(17,1,2,19),(18,1,2,20),(19,1,2,21),(21,1,2,23),(22,1,2,28),(23,1,2,30),(24,1,2,37),(25,1,2,38),(26,1,2,42),(27,1,2,45),(200,1,10,45),(232,1,13,4),(233,1,13,6),(234,1,13,7),(235,1,13,8),(236,1,13,9),(237,1,13,45),(238,1,13,203),(239,1,14,32),(240,1,14,33),(241,1,14,34),(242,1,14,35),(243,1,14,36),(244,1,14,37),(245,1,14,38),(248,1,14,41);
+INSERT INTO `operator_license_package` VALUES (1,'Admin','TENANT_USER_MAIN',1.00,1),(15,'WALLBOARD','TENANT_USER_VAS',1.00,1),(16,'WORK_AGENDA','TENANT_USER_VAS',1.00,1),(17,'TEAM_VIEWER','TENANT_USER_VAS',1.00,1),(18,'AUTOPROVISIONING','TENANT_VAS',1.00,1),(19,'ANTIFRAUD','TENANT_VAS',1.00,1),(21,'IVR','TENANT_VAS',1.00,1),(22,'CONFERENCE_BRIDGE','TENANT_VAS',1.00,1),(23,'CONFERENCE_ROOM','TENANT_VAS',1.00,1),(24,'CUSTOM_ANNOUNCEMENT','TENANT_VAS',1.00,1),(25,'Super Admin','TENANT_USER_MAIN',0.00,1),(26,'BOT_CHAT','TENANT_VAS',1.00,1),(27,'BOT_VOICE','TENANT_VAS',1.00,1),(200,'Main Supervisor','TENANT_USER_MAIN',1.00,1),(232,'Back Office Basic R','TENANT_USER_MAIN',1.00,1),(233,'Back Office Standard R','TENANT_USER_MAIN',1.00,1),(234,'Back Office UC R','TENANT_USER_MAIN',1.00,1),(235,'Contact Center Basic R','TENANT_USER_MAIN',1.00,1),(236,'Contact Center Standard R','TENANT_USER_MAIN',1.00,1),(237,'Contact Center Comfort R','TENANT_USER_MAIN',1.00,1),(238,'Contact Center Enterprise R','TENANT_USER_MAIN',1.00,1),(239,'Dialer CC R','TENANT_USER_VAS',1.00,1),(240,'Supervisor R','TENANT_USER_VAS',1.00,1),(241,'Administrator R','TENANT_USER_VAS',1.00,1),(242,'Video CC R','TENANT_USER_VAS',1.00,1),(243,'API R','TENANT_VAS',1.00,1),(244,'BSS R','TENANT_VAS',1.00,1),(245,'SLA Premium R','TENANT_VAS',1.00,1),(248,'Video CC Recording R','TENANT_USER_VAS',1.00,1);
diff --git a/templates/mariadb/07_topology_data_for_1_tenant.sql b/templates/mariadb/07_topology_data_for_1_tenant.sql
new file mode 100644
index 0000000..0dbace1
--- /dev/null
+++ b/templates/mariadb/07_topology_data_for_1_tenant.sql
@@ -0,0 +1,131 @@
+SET @tenant_access_network_name = 'ACCESS_DOMAIN_NAME';
+SET @tenant_system_network_name = 'SYSTEM_DOMAIN_NAME';
+SET @tenant_name='conpeek.com';
+SET @password = 'MASTER_PASSWORD';
+SET @root_name = 'root';
+
+/* internal network (core network) */
+SET @internal_ip = 'CORE_IP';
+SET @internal_mask = 'CORE_MASK';
+SET @internal_network_address = 'CORE_NET_ADDRESS';
+
+/* telco network (telco network) */
+SET @telco_ip = 'TELCO_IP';
+SET @telco_gateway = 'TELCO_GATEWAY';
+SET @telco_mask = 'TELCO_MASK';
+SET @telco_network_address = 'TELCO_NET_ADDRESS';
+
+/* external network (access network) */
+SET @external_ip = 'ACCESS_IP';
+SET @external_mask = 'ACCESS_MASK';
+SET @external_net_adrr = 'ACCESS_NET_ADDRESS';
+SET @mongo_password = 'MASTER_PASSWORD';
+SET @mongo_root_name = 'root';
+
+SET @mongodb_replicaset_name = 'MONGO_REPLICASET_NAME';
+SET @kamailio_name = 'KAMAILIO_NAME';
+
+SET @system_token_secretkey = 'SYSTEM_TOKEN_SECRETKEY';
+
+USE `topology`;
+
+CREATE TABLE IF NOT EXISTS `topology`.`grafana` (`id` INT NOT NULL,`name` VARCHAR(45) NOT NULL,`nginx_id` INT NOT NULL,`system_id` INT NOT NULL);
+INSERT INTO `grafana` VALUES (1,'grafana',1,1);
+INSERT INTO `access_network` VALUES (1, @tenant_access_network_name,@internal_network_address,@internal_mask,@internal_ip,170,'pusty_cert','pusty_klucz',NULL,NULL,2500,1);
+INSERT INTO `telco_network` VALUES (1,'telcodomain',@telco_network_address,@telco_mask ,@telco_gateway,170,'DIRECT',1);
+INSERT INTO `operator_has_access_network` VALUES (1,1,1);
+INSERT INTO `system` VALUES (1,'conpeek',@tenant_system_network_name,@internal_network_address,@internal_mask ,@internal_ip,@root_name,@password,@internal_ip,@root_name,@password,@system_token_secretkey,'conpeek','conpeek',72000,NULL,'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJ1YOv8xeMYsLW72bc5cZciONe43wWPhytJvqY4ok4GriDZimjqveb/jzE99A4S6tHLv9C02Mfg+ytLnzZWRVZ/cb5Y1phbbWS2mVCdZYvEs1JGKgB+TtrexylsjZyTyZZG4LQMUyYLzk5yLKx0dd7CMZyGBJRiYlCom0bXeiYo3n05RUnQNRKkD88mCcBid6d9PZQg22uQ6Tf6wlthohSXfEttRwmL1fpfyIV2+yMJtJail1gvsHO5qD9zbZ7rQoz7LoX/aj75Ig9Jsuz12C91qE6rx0KoXvU/QfgVdimOd8yOc4JFxe4E/pLkR9JjtgT03fEySjJpm3OzN8oFcoh','-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAydWDr/MXjGLC1u9m3OXGXIjjXuN8Fj4crSb6mOKJOBq4g2Yp\no6r3m/48xPfQOEurRy7/QtNjH4PsrS582VkVWf3G+WNaYW21ktplQnWWLxLNSRio\nAfk7a3scpbI2ck8mWRuC0DFMmC85OciysdHXewjGchgSUYmJQqJtG13omKN59OUV\nJ0DUSpA/PJgnAYnenfT2UINtrkOk3+sJbYaIUl3xLbUcJi9X6X8iFdvsjCbSWopd\nYL7Bzuag/c22e60KM+y6F/2o++SIPSbLs9dgvdahOq8dCqF71P0H4FXYpjnfMjnO\nCRcXuBP6S5EfSY7YE9N3xMkoyaZtzszfKBXKIQIDAQABAoIBAGy4LJVMlrSyRk3M\n61W2F+GkgwWL+D1q+7txsa9E57FnA1kUYP2ejH5ktotLCcgpSnuvnyR6BXzmbUjk\nL7BMQioVf2a60+aDWDlglwbznBCDSj1DoMxfWliNGmNO2fE9HWUGYrKOu7mGRocP\nyuHqLO5DTdILkWKGeX+BStBhB3egMUwhidWZdvPy2hBxfa2cmumxBGSkr2/kUC7s\nMmO+IvOsVvCOyjU0y0hZ5ixDPqjOGPFT6JMvE6Lh25L4IVLJ58bxbnkoiaAgzhHw\nvdO/oTrlDqemxzE9qDHrKI9bAObnwu97+iZzpsvkiIAR7R8JdwyYhzDKWoPAXOuT\nq+diLgECgYEA/ECVRN4/DAICrVmXWB7XgW/cWpB3ORaDs2oeVyK3p38mvSK0LoSr\nCQxTUcQzU2PVTcoCgfFyKiFhCfMOQwj28WXh9r2gQN2Lysqz70AbJ9iEiwjjEx7w\n8o0UvFXHm77pqTD1/ktZoDS1sH1n2CKK/Mv21lDXKoLmmd4xx8F4gXECgYEAzNUr\npG7dsZ5qKrqdRS6XU2cQ68SfeQBSQNQVaDlBUdoF27Ize0zpO97jc8zptkP4kfSV\nayfjB9VHhsrKNdwguNRbVXiCmjGtNOCcXyOQcZ1pG136hCBcIWGkI9d0uXljFMEJ\nfvCA5+66QG6FxaxerSjMbpC5MDm0UmGVTu1De7ECgYAlFsnbymGyvkjufBHInyBI\no83ecwdUmX7bzmqPnUcrlYJ4pLWhcVhEiE9n4lU5maAvQ9iCiqGimC3QbLBYIuVM\nMRK8WL1LTEfVlWBHeUGE5kz2tGPO1+nNf/jgiCxFNhjdC5nfvex7pcRhIs819D5D\nVSoB8PjyAzUswoLHQCcbwQKBgBUz+9CJqWk5fMPvjVgb+o4nnRjKwbdE0T7ktVKU\nmq5eYzzatXmN/Ja1+9WA4LB9WL3DE7SD7HxjF4RceZIZt0lqsgmm794GRmey2H0A\nsXMRWE/86nHC58aM1PDg3LRWXGtJkDITs0RO8fi5eB9+OE60anUHhiP31TKx50LE\nTLgBAoGBAIjoLxdSLV3L4y54npr8mxlQGzYU4jaLXgEtYWdZJKlr3mUi4T7dkO/X\nUNlTa5nG312H6kwRNs1h3R7lTOpet1Ic9lNYhgE1WCd+KB++2F+x0jtxFosu5y9A\nIVLJbQCGQLqkxHsVdsLeXWZ+YsO4KX22UkR6LVsD+uGHmCFz5OdZ\n-----END RSA PRIVATE KEY-----\n','372429333174375','efae96bfd24e2cd0add1b39cbfae8111','372429333174375|PpDhAJ7Ukr4Rz2KDQX_EdXoveKM');
+INSERT INTO `nginx` VALUES(1,'nginx1',1,1);
+INSERT INTO `mongodb_node` VALUES (1,'mongo1','root',@mongo_password,'/var/mongo',0,1,1);
+INSERT INTO `mongodb_replicaset` VALUES (1,@mongodb_replicaset_name);
+INSERT INTO `server_node` VALUES (1,'node1',@internal_ip,@internal_mask,@internal_ip,@internal_mask,@internal_ip,@internal_mask,NULL,NULL,'eth0','eth0',1);
+INSERT INTO `server_node_has_access_network` VALUES (1,@internal_ip,@external_ip,1,1);
+INSERT INTO `server_node_has_telco_network` VALUES (1,@telco_ip,1,1);
+INSERT INTO `tenant_bss_api_server` VALUES (1,'bssserver1',1,8000,1,1,1);
+INSERT INTO `tenant_api_server` VALUES (1,'tenantapiserver1',1,7100,1,1,1);
+INSERT INTO `tenant_app_server` VALUES (1,'app',1,1);
+INSERT INTO `session_server` VALUES (1,'sessionserver1',9100,9000,4200,9200,15300,16000,9300,9400,@internal_ip,@root_name,@password,1,1,1,1,1);
+INSERT INTO `file_server` VALUES (1,'fileserver1',10000,10100,10200,'/data','us-east-1','AKIAIIHQL6HHI2IXCWOQ','aVivMJwZBuvHzpzd7r0KUYidBgZ+DSFlOIjXUV+w',NULL,1,1,1);
+INSERT INTO `freeswitch` VALUES (1,'fs1','ClueCon',1,100,100,1,100,0000000100,'/recording',64,30,1000,0,16384,24574,'/data/pcaps',6800,1,1,1);
+INSERT INTO `freeswitch_pool` VALUES (1,'fspool1',1,1);
+INSERT INTO `gateway` VALUES (1,'gw1','ClueCon',1,100,100,1,100,100,1,1);
+INSERT INTO `gateway_has_profile_setting` VALUES
+(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12),
+(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22),
+(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29);
+INSERT INTO `gateway_pool` VALUES (1,'gwpool1',1);
+INSERT INTO `sip_profile_param` VALUES
+(1,'auth-all-packets'),(2,'auth-calls'),(3,'challenge-realm'),(4,'debug'),(5,'dtmf-duration'),(6,'forward-unsolicited-mwi-notify'),
+(7,'hold-music'),(8,'inbound-codec-negotiation'),(9,'inbound-codec-prefs'),(10,'inbound-late-negotiation'),
+(11,'inbound-reg-force-matching-username'),(12,'inbound-zrtp-passthru'),(13,'local-network-acl'),(14,'log-auth-failures'),
+(15,'manual-redirect'),(16,'nonce-ttl'),(17,'odbc-dsn'),(18,'outbound-codec-prefs'),
+(19,'rfc2833-pt'),(20,'rtp-timer-name'),(21,'sip-capture'),(22,'sip-trace'),(23,'watchdog-enabled'),(24,'watchdog-event-timeout'),
+(25,'watchdog-step-timeout'),(26,'vad'),(27,'suppress-cng');
+INSERT INTO `sip_profile_setting` VALUES (1,'false',1),(2,'true',1),(3,'false',2),(4,'true',2),(5,'auto_from',3),(6,'false',4),
+(7,'2000',5),(8,'false',6),(9,'$${hold_music}',7),(10,'generous',8),(11,'PCMA',9),(12,'true',10),(13,'true',11),
+(14,'true',12),(15,'localnet.auto',13),(16,'false',14),(17,'true',15),(18,'60',16),(20,'PCMA',18),(21,'101',19),
+(22,'soft',20),(23,'no',21),(24,'no',22),(25,'no',23),(26,'30000',24),(27,'30000',25),(28,'none',26),(29,'true',27),
+(30,'false',27),(31,'PCMA,H264',9),(32,'PCMA,H264',18);
+INSERT INTO `sms_server` VALUES (1,'smsserver1',14500,14600,7900,'SMPPv3.4',NULL,@internal_ip,@root_name,@password,NULL,NULL,1,1,1,1,1);
+INSERT INTO `operator_has_anti_fraud_server` VALUES (1,1,1);
+INSERT INTO `operator_has_cdr_server` VALUES (1,1,1);
+INSERT INTO `operator_has_file_server` VALUES (1,1,1);
+INSERT INTO `operator_has_freeswitch_pool` VALUES (1,1,1);
+INSERT INTO `operator_has_gateway_pool` VALUES (1,1,1);
+INSERT INTO `operator_has_kamailio` VALUES (1,1,1);
+INSERT INTO `operator_has_mail_server` VALUES (1,1,1);
+INSERT INTO `operator_has_plugin_server` VALUES (1,1,1);
+INSERT INTO `operator_has_prov_server` VALUES (1,1,1);
+INSERT INTO `operator_has_report_server` VALUES (1,1,1);
+INSERT INTO `operator_has_sms_server` VALUES (1,1,1);
+INSERT INTO `operator_has_telco_network` VALUES (1,1,1);
+INSERT INTO `provisioning_server` VALUES (1,'provisioning1',3,7700,4600,1,1,1);
+INSERT INTO `tenant_login_api_server` VALUES (1,'tenantloginapiserver1',1,1,1,1);
+INSERT INTO `tenant_plugin_api_server` VALUES (1,'tenantpluginapiserver1',1,7600,1,1,1);
+INSERT INTO `system_api_server` VALUES (1,'systemapiserver1',1,1,1,1);
+INSERT INTO `system_app_server` VALUES(1,'systemapp',1,1);
+INSERT INTO `wallboard_app_server` VALUES (1,'wallboard',1,1);
+INSERT INTO `report_server` VALUES (1,'reportserver1',3,13000,4700,1,1,1);
+INSERT INTO `salesforce_contact_db_server` VALUES (1,'salesforcecontactdb1',11200,11100,11300,1,1,1,1);
+INSERT INTO `team_viewer_server` VALUES (1,'teamviewerserver1',8900,10300,4800,1,1,1);
+INSERT INTO `zammad_contact_db_server` VALUES(1,'zammadcontactdb1',10700,10500,10600,1,1,1,1);
+INSERT INTO `anti_fraud_server` VALUES (1,'antifraud1',1,1);
+INSERT INTO `cdr_server` VALUES (1,'cdrserver1',9700,4400,1,1,1);
+INSERT INTO `communicator_app_server` VALUES (1,'communicator1',1,1);
+INSERT INTO `country_acl` VALUES (1,'Poland','WHITE',1);
+INSERT INTO `country_acl_item` VALUES (1,'PL',1);
+INSERT INTO `device_app_server` VALUES (1,'device',1,1);
+INSERT INTO `domain_name_server` VALUES (1,'dns1',1,1);
+INSERT INTO `facebook_server` VALUES (1,'facebookserver1',7800,15400,15600,'2059687944061341','3f31b7a9139e82064bf52395ec344e5a','575f96be-bdad-497d-81eb-8104bcb40414',1,1,1);
+INSERT INTO `gus_server` VALUES (1,'gusserver1','https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-test.wsdl','https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc','abcde12345abcde12345',10400,1,1,1);
+INSERT INTO `hubspot_server` VALUES (1,'hubspotserver1','192692','4cd84bbe-79ed-4c09-bbdb-4c5f9640284d','4cf812ad-dc5e-4158-995d-923c24fe13a9',8300,9500,8400,8500,'','',1,1,1,1);
+INSERT INTO `idenfy_server` VALUES (1,'idenfyserver1',13100,13200,1,1,1);
+INSERT INTO `internal_has_profile_setting` VALUES
+(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12),
+(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22),
+(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29);
+INSERT INTO `external_has_profile_setting` VALUES
+(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12),
+(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22),
+(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29);
+INSERT INTO `line_has_profile_setting` VALUES
+(1,1,1,1),(2,1,1,4),(3,1,1,6),(4,1,1,7),(5,1,1,9),(6,1,1,10),(7,1,1,31),
+(8,1,1,12),(9,1,1,13),(10,1,1,14),(11,1,1,16),(12,1,1,17),(13,1,1,18),
+(14,1,1,32),(15,1,1,21),(16,1,1,22),(17,1,1,23),(18,1,1,24),(19,1,1,25),
+(20,1,1,26),(21,1,1,27),(22,1,1,28),(23,1,1,29);
+INSERT INTO `invitation_app_server` VALUES (1,'invitationappserver1',1,1,1,1);
+INSERT INTO `livespace_contact_db_server` VALUES(1,'livespacecontactdb1',10900,10800,11000,1,1,1,1);
+INSERT INTO `local_contact_db_server` VALUES (1,'localcontactdb1',8600,14700,8700,1,NULL,1,1,1,1);
+INSERT INTO `mail_server` VALUES (1,'mail1','/data/emails',1,1);
+INSERT INTO `mailbox_server` VALUES (1,'mailboxserver1',8800,NULL,1,1);
+INSERT INTO `messagebird_server` VALUES (1,'messagebirdserver1',11800,11900,12000,1,1,1);
+INSERT INTO `messaging_server` VALUES (1,'messagingserver1',15500,15200,14200,14300,14400,NULL,NULL,15100,5000,1,1,1);
+INSERT INTO `operator` VALUES (1,'conpeek.com',1,1,1,1);
+INSERT INTO `operator_api_server` VALUES (1,'operatorapiserver1',1,1,1,1);
+INSERT INTO `operator_app_server` VALUES (1,'operatorappserver1',1,1);
+INSERT INTO `kamailio` VALUES (1,@kamailio_name,@internal_ip,@root_name,@password,1,1);
+INSERT INTO `user_notification_server` VALUES (1,'usernotification1',8200,8100,1,1,1);
+INSERT INTO `ticketing_server` VALUES (1, 'ticketingserver1', 16100, 16200, 1,1,1);
+INSERT INTO `tenant_web_polling_api_server` VALUES (1,'poll1',1,7200,1,1,1);
+INSERT INTO `bot_server` values (1,'botserver1',16500,1,1);
+INSERT INTO `bot_train_server` values (1,'bottrainserver1',16300,3,1,1);
diff --git a/templates/metrics/node_exporter.yml b/templates/metrics/node_exporter.yml
new file mode 100644
index 0000000..f595d4f
--- /dev/null
+++ b/templates/metrics/node_exporter.yml
@@ -0,0 +1,2 @@
+basic_auth_users:
+ prometheus: PROMETHEUS_PASSWORD
diff --git a/templates/mongodb/mongo_init.sh b/templates/mongodb/mongo_init.sh
new file mode 100644
index 0000000..88891b0
--- /dev/null
+++ b/templates/mongodb/mongo_init.sh
@@ -0,0 +1 @@
+docker exec mongo mongosh --authenticationDatabase admin -u root -p MASTER_PASSWORD --eval "use operator_1" --eval "$(cat text_to_speech.js)"
\ No newline at end of file
diff --git a/templates/mongodb/text_to_speech.js b/templates/mongodb/text_to_speech.js
new file mode 100644
index 0000000..07fd01c
--- /dev/null
+++ b/templates/mongodb/text_to_speech.js
@@ -0,0 +1,3 @@
+db.speech_integration.insertOne({"_id": ObjectId("633d2132840da20001127d7d"), "name": "Amazon (Conpeek)", "auto_add_to_new_tenant": 1, "text_to_speech": 1, "speech_to_text": 0, "type": "AMAZON_TEXT_TO_SPEECH", "options": {"default_voice": null, "region_name": "eu-central-1", "access_key_identifier": "AKIAIIHQL6HHI2IXCWOQ"}, "vulnerable_options": {"access_key_secret": "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"}, "tenant_list": []});
+db.voice_definition.insertOne({ "_id" : ObjectId("633d2160840da20001127d7e"), "name" : "Ewa (Conpeek)", "tts_integration_id" : ObjectId("633d2132840da20001127d7d"), "tts_integration_type" : "AMAZON", "voice" : "pl-PL-Ewa", "speaking_rate" : 100, "pitch" : 0, "volume" : 0 });
+db.voice_definition.insertOne({ "_id" : ObjectId("633d216f840da20001127d7f"), "name" : "Jacek (Conpeek)", "tts_integration_id" : ObjectId("633d2132840da20001127d7d"), "tts_integration_type" : "AMAZON", "voice" : "pl-PL-Jacek", "speaking_rate" : 100, "pitch" : 0, "volume" : 0 });
diff --git a/templates/nginx/custom.sh b/templates/nginx/custom.sh
new file mode 100644
index 0000000..c659b3f
--- /dev/null
+++ b/templates/nginx/custom.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+sed -i "s/operatorLogoText: 'Conpeek'/operatorLogoText: 'OPERATOR_NAME'/g" /srv/conpeek/app_tenant/resources/Vars.js
+
+cp /custom/images/small_logo.png /srv/conpeek/app_tenant/resources/logo/bialy_64.png >/dev/null 2>&1
+cp /custom/images/login_logo.jpg /srv/conpeek/app_tenant/resources/images/lock-screen-logo.jpg >/dev/null 2>&1
+cp /custom/images/favicon.ico /srv/conpeek/app_tenant/favicon_none.ico >/dev/null 2>&1
+
+cp /custom/images/small_logo.png /srv/conpeek/app_wallboard/resources/logo/bialy_64.png >/dev/null 2>&1
+cp /custom/images/login_logo.jpg /srv/conpeek/app_wallboard/resources/images/lock-screen-logo.jpg >/dev/null 2>&1
+cp /custom/images/favicon.ico /srv/conpeek/app_wallboard/favicon.ico >/dev/null 2>&1
diff --git a/templates/nginx/custom_settings.tmpl b/templates/nginx/custom_settings.tmpl
new file mode 100644
index 0000000..17ff72e
--- /dev/null
+++ b/templates/nginx/custom_settings.tmpl
@@ -0,0 +1,21 @@
+map $http_upgrade $connection_upgrade {
+ default upgrade;
+ '' close;
+}
+
+map $http_origin $allow_origin {
+ ~^https?://(.*\.)?{{app_installation_domain}}(:\d+)?$ $http_origin;
+ ~^https?://(.*\.)?.conpeek.com(:\d+)?$ $http_origin;
+ default "";
+}
+
+map $allow_origin $allow_credentials {
+ default "";
+ "~." "true";
+}
+
+map $http_origin $is_allowed_websocket_origin {
+ ~^https?://(.*\.)?{{app_installation_domain}}(:\d+)?$ "yes";
+ ~^https?://(.*\.)?.conpeek.com(:\d+)?$ "yes";
+ default "no";
+}
\ No newline at end of file
diff --git a/templates/nginx/default.tmpl b/templates/nginx/default.tmpl
new file mode 100644
index 0000000..1fa2b0c
--- /dev/null
+++ b/templates/nginx/default.tmpl
@@ -0,0 +1,18 @@
+server {
+ listen {{ nginx_ip }}:80 default_server;
+ listen {{ nginx_ip }}:443 ssl default_server;
+ server_name _;
+
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ return 444;
+}
\ No newline at end of file
diff --git a/templates/nginx/docker_desk_template.tmpl b/templates/nginx/docker_desk_template.tmpl
new file mode 100644
index 0000000..00ac38f
--- /dev/null
+++ b/templates/nginx/docker_desk_template.tmpl
@@ -0,0 +1,51 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+ root /srv/conpeek/{{app_name}}/dist;
+ index index.html;
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *; frame-ancestors 'none';report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+
+ location / {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ try_files $uri @index;
+ }
+
+ location = /_csp {
+ access_log /var/log/nginx/csp.log CSP;
+ return 204;
+ }
+
+ location /index.html {
+ add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *;script-src 'self' 'unsafe-inline';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline' *;connect-src * blob;font-src 'self' * data:;frame-src 'self' blob:;frame-ancestors 'none';worker-src https://{{ server_name }};form-action 'self';report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Referrer-Policy "same-origin" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always;
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ expires 0;
+ try_files /index.html =404;
+ }
+
+ location @index {
+ add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *;script-src 'self' 'unsafe-inline';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline' *;connect-src * blob;font-src 'self' * data:;frame-src 'self' blob:;frame-ancestors 'none';worker-src https://{{ server_name }};form-action 'self';report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Referrer-Policy "same-origin" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always;
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ expires 0;
+ try_files /index.html =404;
+ }
+
+}
diff --git a/templates/nginx/docker_docs_template.tmpl b/templates/nginx/docker_docs_template.tmpl
new file mode 100644
index 0000000..49e5fff
--- /dev/null
+++ b/templates/nginx/docker_docs_template.tmpl
@@ -0,0 +1,6 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+ root /srv/conpeek/{{app_name}};
+ index index.html;
+}
diff --git a/templates/nginx/docker_frontend_production_template.tmpl b/templates/nginx/docker_frontend_production_template.tmpl
new file mode 100644
index 0000000..0e5b173
--- /dev/null
+++ b/templates/nginx/docker_frontend_production_template.tmpl
@@ -0,0 +1,111 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+
+ location = /robots.txt {
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag noindex;
+ add_header Content-Type text/plain;
+ return 200 "User-agent: *\nDisallow: /\n";
+ }
+
+ location = /sitemap.xml {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self';report-uri /_csp" always;
+ add_header X-Robots-Tag noindex;
+ add_header Content-Type "text/plain charset=UTF-8";
+ add_header Content-Length 0;
+ return 404;
+ }
+
+ location = /_csp {
+ access_log /var/log/nginx/csp.log CSP;
+ return 204;
+ }
+
+ location /ext/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /libs/ {
+ location ~ (.*\.map) {
+ return 404;
+ }
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /util/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /lang/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ root /srv/conpeek/app_tenant/build/production;
+ index index.html;
+
+ location /index.html {
+ add_header Content-Security-Policy-Report-Only "default-src 'self';script-src 'self' 'unsafe-inline' 'unsafe-eval';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline';frame-ancestors 'none';font-src 'self' 'unsafe-inline' data:;worker-src 'self' blob:;frame-src 'self' blob:;connect-src * blob;form-action 'self';report-uri /_csp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header Referrer-Policy "same-origin" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always;
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ expires 0;
+ try_files /index.html =404;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ }
+}
diff --git a/templates/nginx/docker_frontend_template.tmpl b/templates/nginx/docker_frontend_template.tmpl
new file mode 100644
index 0000000..8d78890
--- /dev/null
+++ b/templates/nginx/docker_frontend_template.tmpl
@@ -0,0 +1,111 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+
+ location = /robots.txt {
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag noindex;
+ add_header Content-Type text/plain;
+ return 200 "User-agent: *\nDisallow: /\n";
+ }
+
+ location = /sitemap.xml {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self'" always;
+ add_header X-Robots-Tag noindex;
+ add_header Content-Type "text/plain charset=UTF-8";
+ add_header Content-Length 0;
+ return 404;
+ }
+
+ location = /_csp {
+ access_log /var/log/nginx/csp.log CSP;
+ return 204;
+ }
+
+ location /ext/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /libs/ {
+ location ~ (.*\.map) {
+ return 404;
+ }
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /util/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ location /lang/ {
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ root /srv/conpeek/app;
+ }
+
+ root /srv/conpeek/{{app_name}};
+ index index.html;
+
+ location /index.html {
+ add_header Content-Security-Policy-Report-Only "default-src 'self';script-src 'self' 'unsafe-inline' 'unsafe-eval';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline';frame-ancestors 'none';font-src 'self' 'unsafe-inline' data:;worker-src 'self' blob:;frame-src 'self' blob:;connect-src * blob:;form-action 'self';report-uri /_csp" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header Cross-Origin-Opener-Policy "same-site" always;
+ add_header Cross-Origin-Resource-Policy "same-site" always;
+ add_header Cross-Origin-Embedder-Policy "require-corp" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header Referrer-Policy "same-origin" always;
+ add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
+ add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always;
+ add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
+ expires 0;
+ try_files /index.html =404;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ }
+}
diff --git a/templates/nginx/nginx-file-server.tmpl b/templates/nginx/nginx-file-server.tmpl
new file mode 100644
index 0000000..0806693
--- /dev/null
+++ b/templates/nginx/nginx-file-server.tmpl
@@ -0,0 +1,77 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+server {
+ listen {{ nginx_ip }}:443 ssl ;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+ client_max_body_size 0;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Cross-Origin-Resource-Policy' "cross-origin" always;
+
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Credentials;
+ proxy_hide_header Access-Control-Allow-Headers;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~^/audio-video-recording/.*/play$ {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control';
+ add_header 'Access-Control-Max-Age' 0;
+ add_header 'Content-Type' 'text/plain charset=UTF-8';
+ add_header 'Content-Length' 0;
+ add_header 'Pragma' 'no-cache';
+ add_header 'Expires' '0';
+ add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
+ return 204;
+ }
+ add_header Cross-Origin-Resource-Policy "cross-origin" always;
+ add_header 'Access-Control-Max-Age' 0;
+ add_header 'Pragma' 'no-cache';
+ add_header 'Expires' '0';
+ add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
+ add_header 'Vary' 'Origin' always;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_pass http://{{ upstream_name }};
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ }
+
+}
diff --git a/templates/nginx/nginx-messaging-server.tmpl b/templates/nginx/nginx-messaging-server.tmpl
new file mode 100644
index 0000000..f90721e
--- /dev/null
+++ b/templates/nginx/nginx-messaging-server.tmpl
@@ -0,0 +1,48 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+server {
+ listen {{ nginx_ip }}:443 ssl ;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ proxy_hide_header 'Strict-Transport-Security';
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Cross-Origin-Resource-Policy' "cross-origin" always;
+
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always;
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Credentials;
+ proxy_hide_header Access-Control-Allow-Headers;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+}
diff --git a/templates/nginx/nginx-prov.tmpl b/templates/nginx/nginx-prov.tmpl
new file mode 100644
index 0000000..4d60b92
--- /dev/null
+++ b/templates/nginx/nginx-prov.tmpl
@@ -0,0 +1,25 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+server {
+ listen {{ nginx_ip }}:80;
+ listen {{ nginx_ip }}:443 ssl;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Protocol $scheme;
+ }
+}
diff --git a/templates/nginx/nginx-proxy.tmpl b/templates/nginx/nginx-proxy.tmpl
new file mode 100644
index 0000000..6db893e
--- /dev/null
+++ b/templates/nginx/nginx-proxy.tmpl
@@ -0,0 +1,47 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+server {
+ listen {{ nginx_ip }}:443 ssl ;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ proxy_hide_header 'Strict-Transport-Security';
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always;
+ add_header 'Vary' 'Origin' always;
+
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always;
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Credentials;
+ proxy_hide_header Access-Control-Allow-Headers;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+}
diff --git a/templates/nginx/nginx-web-socket.tmpl b/templates/nginx/nginx-web-socket.tmpl
new file mode 100644
index 0000000..d1e6052
--- /dev/null
+++ b/templates/nginx/nginx-web-socket.tmpl
@@ -0,0 +1,34 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+server {
+ listen {{ nginx_ip }}:443 ssl ;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ if ($is_allowed_websocket_origin = "no") {
+ return 403;
+ }
+ proxy_pass http://{{ upstream_name }};
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection $connection_upgrade;
+ proxy_read_timeout 300;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Port $remote_port;
+ proxy_hide_header Access-Control-Allow-Origin;
+ add_header Access-Control-Allow-Origin $allow_origin always;
+ }
+}
diff --git a/templates/nginx/nginx.conf b/templates/nginx/nginx.conf
new file mode 100644
index 0000000..19f9f03
--- /dev/null
+++ b/templates/nginx/nginx.conf
@@ -0,0 +1,106 @@
+user www-data;
+worker_processes 8;
+pid /run/nginx.pid;
+worker_rlimit_nofile 8092;
+
+events {
+ worker_connections 32768;
+ # multi_accept on;
+}
+
+http {
+
+ ##
+ # Basic Settings
+ ##
+
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+
+ types_hash_max_size 2048;
+ server_tokens off;
+ client_max_body_size 100M;
+
+ server_names_hash_bucket_size 512;
+ # server_name_in_redirect off;
+
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ ##
+ # Timeout Settings
+ ##
+
+ keepalive_timeout 65;
+ proxy_send_timeout 600;
+ proxy_read_timeout 600;
+ proxy_connect_timeout 600;
+ send_timeout 600;
+
+ ##
+ # SSL Settings
+ ##
+
+ ssl_protocols TLSv1.2; # Dropping SSLv3, ref: POODLE
+ ssl_prefer_server_ciphers on;
+ ssl_session_cache shared:SSL:50m;
+ ssl_session_timeout 5m;
+
+ ##
+ # Logging Settings
+ ##
+ log_format apm 'timestamp="$time_local" client=$remote_addr '
+ 'request="$request" request_length=$request_length '
+ 'bytes_sent=$bytes_sent '
+ 'body_bytes_sent=$body_bytes_sent '
+ 'referer=$http_referer '
+ 'user_agent="$http_user_agent" '
+ 'upstream_addr=$upstream_addr '
+ 'upstream_status=$upstream_status '
+ 'request_time=$request_time '
+ 'upstream_response_time=$upstream_response_time '
+ 'upstream_connect_time=$upstream_connect_time '
+ 'upstream_header_time=$upstream_header_time '
+ 'app_db_read_time=$upstream_http_db_read_time '
+ 'app_db_write_time=$upstream_http_db_write_time '
+ 'app_analysis_time=$upstream_http_analysis_time '
+ 'app_other_time=$upstream_http_other_time ';
+
+ log_format CSP escape=json '{"date":"$time_local", "IP address":"$remote_addr", "http_x_forwarded_for":"$http_x_forwarded_for", "status":"$status", "http_user_agent":"$http_user_agent", "body_bytes_sent":"$body_bytes_sent", "request":"$request","request_body": "$request_body"}';
+
+ access_log /var/log/nginx/access.log apm;
+ error_log /var/log/nginx/error.log;
+
+ access_log syslog:server=localhost,facility=local7,tag=nginx,severity=info apm;
+ error_log syslog:server=localhost debug;
+
+ ##
+ # Gzip Settings
+ ##
+
+ gzip on;
+ gzip_disable "msie6";
+
+
+
+ # gzip_vary on;
+ # gzip_proxied any;
+ # gzip_comp_level 6;
+ # gzip_buffers 16 8k;
+ # gzip_http_version 1.1;
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
+
+ map $http_upgrade $connection_upgrade {
+ default upgrade;
+ '' close;
+ }
+
+ ##
+ # Virtual Host Configs
+ ##
+ proxy_cache_path /tmp/cache levels=1:2 keys_zone=file_server_wizard_cache:512m;
+
+ include /etc/nginx/conf.d/*.conf;
+ include /etc/nginx/sites-enabled/*;
+}
diff --git a/templates/nginx/nginx.conf_frontend b/templates/nginx/nginx.conf_frontend
new file mode 100644
index 0000000..cf4cc64
--- /dev/null
+++ b/templates/nginx/nginx.conf_frontend
@@ -0,0 +1,38 @@
+user nginx;
+worker_processes auto;
+
+error_log /var/log/nginx/error.log notice;
+pid /var/run/nginx.pid;
+
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ server_tokens off;
+ server_names_hash_bucket_size 512;
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ log_format CSP escape=json '{"date":"$time_local", "IP address":"$remote_addr", "http_x_forwarded_for":"$http_x_forwarded_for", "status":"$status", "http_user_agent":"$http_user_agent", "body_bytes_sent":"$body_bytes_sent", "request":"$request","request_body": "$request_body"}';
+
+ access_log /var/log/nginx/access.log main;
+
+ access_log syslog:server=localhost,facility=local7,tag=nginx_frontend,severity=info main;
+ error_log syslog:server=localhost debug;
+
+ sendfile on;
+ #tcp_nopush on;
+
+ keepalive_timeout 65;
+
+ #gzip on;
+
+ include /etc/nginx/conf.d/*.conf;
+}
diff --git a/templates/nginx/tenant_plugin_frontend_template.tmpl b/templates/nginx/tenant_plugin_frontend_template.tmpl
new file mode 100644
index 0000000..c312401
--- /dev/null
+++ b/templates/nginx/tenant_plugin_frontend_template.tmpl
@@ -0,0 +1,49 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+
+ location / {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ if ($request_method = 'OPTIONS') {
+ add_header 'Access-Control-Allow-Origin' $http_origin always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control';
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Type' 'text/plain charset=UTF-8';
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ proxy_pass http://{{ internal_ip }}:{{ service_port }} ;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /sdk {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Access-Control-Allow-Origin' $http_origin always;
+ alias /srv/conpeek/apis/api_tenant_plugin/static/sdk;
+ }
+
+ location /cdn {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Access-Control-Allow-Origin' $http_origin always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Type' 'text/plain; charset=utf-8';
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ location ~ (index.html|.*\.json) {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Pragma' 'no-cache';
+ add_header 'Expires' '0';
+ add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
+ }
+ add_header 'Access-Control-Allow-Origin' $http_origin always;
+ alias /srv/conpeek/apis/api_tenant_plugin/static/cdn;
+ }
+}
diff --git a/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl b/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl
new file mode 100644
index 0000000..c3b6771
--- /dev/null
+++ b/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl
@@ -0,0 +1,71 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+
+server {
+ listen {{ nginx_ip }}:443 ssl;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Vary' 'Origin' always;
+
+ if ($request_method = 'OPTIONS') {
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Credentials;
+ proxy_hide_header Access-Control-Allow-Headers;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /socket/connect {
+ proxy_pass http://{{ ip_v4 }}:{{ service_port }};
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection $connection_upgrade;
+ proxy_read_timeout 300;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /cdn {
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ proxy_pass http://{{ ip_v4 }}:81;
+ proxy_redirect http://{{ server_name }}:81 https://{{ server_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /sdk {
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ proxy_pass http://{{ ip_v4 }}:81;
+ proxy_redirect http://{{ server_name }}:81 https://{{ server_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+}
diff --git a/templates/nginx/tenant_web_polling_frontend_template.tmpl b/templates/nginx/tenant_web_polling_frontend_template.tmpl
new file mode 100644
index 0000000..2b683c7
--- /dev/null
+++ b/templates/nginx/tenant_web_polling_frontend_template.tmpl
@@ -0,0 +1,20 @@
+server {
+ listen {{ internal_ip }}:81;
+ server_name {{ server_name }};
+
+ location / {
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Type' 'text/plain; charset=utf-8';
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ alias /srv/conpeek/apis/api_tenant_web_polling;
+ }
+}
diff --git a/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl b/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl
new file mode 100644
index 0000000..aeecdf7
--- /dev/null
+++ b/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl
@@ -0,0 +1,55 @@
+upstream {{ upstream_name }} {
+ server {{ ip_v4 }}:{{ service_port }};
+}
+
+server {
+ listen {{ nginx_ip }}:443 ssl;
+ server_name {{ server_name }};
+ ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt;
+ ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key;
+
+ ssl_ecdh_curve secp384r1;
+ ssl_session_timeout 10m;
+ ssl_protocols TLSv1.3 TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256";
+ ssl_session_cache shared:TLS:2m;
+ ssl_buffer_size 4k;
+
+ location / {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ proxy_pass http://{{ ip_v4 }}:81;
+ proxy_redirect http://{{ server_name }}:81 https://{{ server_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /api {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Vary' 'Origin' always;
+
+ if ($request_method = 'OPTIONS') {
+ add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always;
+ add_header 'Vary' 'Origin' always;
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
+ add_header 'Access-Control-Allow-Credentials' $allow_credentials always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
+ add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always;
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Credentials;
+ proxy_hide_header Access-Control-Allow-Headers;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_pass http://{{ upstream_name }};
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+}
diff --git a/templates/rabbitmq/rabbit_init.sh b/templates/rabbitmq/rabbit_init.sh
new file mode 100644
index 0000000..0e25c7b
--- /dev/null
+++ b/templates/rabbitmq/rabbit_init.sh
@@ -0,0 +1,10 @@
+AMQP_USER=root
+AMQP_PASS=2cTZCL@oWXKA
+echo "AMQP Installation"
+echo "Add user $AMQP_USER"
+docker exec -i rabbitmq rabbitmqctl add_user $AMQP_USER $AMQP_PASS
+echo "Set Permissions to user $AMQP_USER"
+docker exec -i rabbitmq rabbitmqctl set_permissions $AMQP_USER ".*" ".*" ".*"
+echo "Set Administrator user tag to $AMQP_USER"
+docker exec -i rabbitmq rabbitmqctl set_user_tags $AMQP_USER administrator
+docker exec -i rabbitmq rabbitmqctl delete_user guest
diff --git a/templates/rabbitmq/rabbitmq.config b/templates/rabbitmq/rabbitmq.config
new file mode 100644
index 0000000..fd4c0b9
--- /dev/null
+++ b/templates/rabbitmq/rabbitmq.config
@@ -0,0 +1 @@
+[{rabbit, [{credit_flow_default_credit, {0, 0}}]}].
\ No newline at end of file
diff --git a/util.py b/util.py
new file mode 100644
index 0000000..d0a86b9
--- /dev/null
+++ b/util.py
@@ -0,0 +1,111 @@
+import json
+import os
+import pathlib
+import re
+import shutil
+
+DEFAULT = '\033[0m'
+
+
+class Constants:
+ sip_trunk_operators = ["default", "tmobile", "systegra"]
+
+class Settings:
+ output_directory = None
+
+
+def print_grey(*values):
+ print('\033[37m', *values, DEFAULT)
+
+
+def print_red(*values):
+ print('\033[91m', *values, DEFAULT)
+
+
+def print_black_light(*values):
+ print('\033[90m', *values, DEFAULT)
+
+
+def print_yellow(*values):
+ print('\033[93m', *values, DEFAULT)
+
+
+def print_green(*values):
+ print('\033[92m', *values, DEFAULT)
+
+
+def get_minimal_configuration():
+ with open(os.path.join(get_templates_path(), "basic_indexes_tenant_data.json"), 'rb') as file:
+ tenant_data = json.load(file)
+ return tenant_data
+
+
+def get_templates_path():
+ current_folder = pathlib.Path(__file__).parent.resolve()
+ return os.path.join(current_folder, "templates")
+
+
+def get_output_path():
+ if Settings.output_directory:
+ return Settings.output_directory
+ current_folder = pathlib.Path(__file__).parent.resolve()
+ return os.path.join(current_folder, "output")
+
+
+def copy_file(src_file, dest_dir):
+
+ dst = shutil.copy(src_file, dest_dir)
+
+ # CRLF TO LF LINE ENDING:
+ with open(dst, 'rb') as open_file:
+ content = open_file.read()
+
+ # Windows ➡ Unix
+ content = content.replace(b'\r\n', b'\n')
+
+ with open(dst, 'wb') as open_file:
+ open_file.write(content)
+
+
+def copy_directory(source_dir, destination_dir):
+ """
+ Copies the entire contents of 'source_dir' to 'destination_dir'.
+ Both the directories and files inside are copied.
+ If 'destination_dir' does not exist, it will be created.
+ """
+ # Check if the source directory exists
+ if not os.path.exists(source_dir):
+ print_red(f"The source directory {source_dir} does not exist.")
+ return
+
+ # Check if the destination directory already exists
+ if os.path.exists(destination_dir):
+ print_red(f"The destination directory {destination_dir} already exists.")
+ return
+
+ # Copy the directory
+ try:
+ shutil.copytree(source_dir, destination_dir)
+ print_black_light(f"Directory copied from {source_dir} to {destination_dir}")
+ except Exception as e:
+ print_red(f"Failed to copy directory: {e}")
+
+
+def basic_on_location_sed(inputfile, replaced_variable, new_variable):
+ file = open(inputfile, 'r')
+ output_text = file.read()
+ output_text = re.sub(replaced_variable, new_variable, output_text)
+ with open(inputfile, "w") as file:
+ file.write(output_text)
+
+
+def get_token(name):
+ token_path = os.path.join(get_output_path(), "tokens", name)
+
+ # Check if the destination directory already exists
+ if not os.path.exists(token_path):
+ print_red(f"The token {token_path} not exists.")
+ return
+
+ file = open(token_path, 'r')
+ return str(file.read())