KI-AGENT: Easybell SIP-Trunk integrieren
This commit is contained in:
@@ -52,7 +52,7 @@ const applyTrunk = async () => {
|
||||
trunkStatus.value = res?.status || trunkStatus.value
|
||||
toast.add({
|
||||
title: res?.warning ? "Trunk-Konfiguration geschrieben" : "Trunk angewendet",
|
||||
description: res?.warning || (res?.status?.registered ? "Telekom-Registration ist aktiv." : "Asterisk wurde neu geladen."),
|
||||
description: res?.warning || (res?.status?.registered ? "Trunk-Registration ist aktiv." : "Asterisk wurde neu geladen."),
|
||||
color: res?.warning ? "orange" : "success"
|
||||
})
|
||||
} catch (error) {
|
||||
@@ -115,7 +115,7 @@ onMounted(async () => {
|
||||
Externe Telefonie
|
||||
</h2>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Telekom-Anbindung über den lokalen Asterisk-Trunk.
|
||||
SIP-Trunk-Anbindung über den lokalen Asterisk.
|
||||
</p>
|
||||
</div>
|
||||
<UBadge :color="config?.external?.enabled ? 'success' : 'neutral'" variant="soft">
|
||||
@@ -197,7 +197,7 @@ onMounted(async () => {
|
||||
<UAlert
|
||||
:color="trunkStatus?.registered ? 'success' : (trunkStatus?.reachable ? 'warning' : 'neutral')"
|
||||
:icon="trunkStatus?.registered ? 'i-heroicons-check-circle' : (trunkStatus?.reachable ? 'i-heroicons-exclamation-triangle' : 'i-heroicons-signal-slash')"
|
||||
:title="trunkStatus?.registered ? 'Telekom-Trunk registriert' : (trunkStatus?.hasRegistration ? 'Telekom-Trunk nicht registriert' : 'Keine Telekom-Registration aktiv')"
|
||||
:title="trunkStatus?.registered ? 'SIP-Trunk registriert' : (trunkStatus?.hasRegistration ? 'SIP-Trunk nicht registriert' : 'Keine Trunk-Registration aktiv')"
|
||||
:description="trunkStatus?.message || (trunkStatus?.reachable ? 'Asterisk-AMI ist erreichbar.' : 'Asterisk-AMI ist noch nicht erreichbar.')"
|
||||
/>
|
||||
<div class="flex flex-wrap gap-2 lg:justify-end">
|
||||
|
||||
@@ -135,9 +135,26 @@ const mcpTokenForm = reactive({
|
||||
const telephonyTrunkLoading = ref(false)
|
||||
const telephonyTrunkSaving = ref(false)
|
||||
const telephonyTrunkApplying = ref(false)
|
||||
const telephonyProviderOptions = [
|
||||
{ label: "Easybell", value: "easybell" },
|
||||
{ label: "Telekom", value: "telekom" }
|
||||
]
|
||||
const telephonyProviderDefaults = {
|
||||
easybell: {
|
||||
registrar: "voip.easybell.de",
|
||||
title: "Easybell SIP-Trunk",
|
||||
description: "Nutze SIP-Benutzername und SIP-Passwort aus dem Easybell-Kundenportal. Der Registrar ist für SIP-Trunks in der Regel voip.easybell.de."
|
||||
},
|
||||
telekom: {
|
||||
registrar: "tel.t-online.de",
|
||||
title: "Telekom Zugangsdaten",
|
||||
description: "Die SIP-ID ist meistens deine Rufnummer mit Vorwahl ohne Leerzeichen und Sonderzeichen. Falls dein Anschluss die klassischen Zugangsdaten nutzt, kannst du den Auth-User aus Anschlusskennung, Zugangsnummer, #, Mitbenutzernummer und @t-online.de bilden."
|
||||
}
|
||||
}
|
||||
const telephonyTrunkForm = reactive({
|
||||
provider: "easybell",
|
||||
enabled: false,
|
||||
registrar: "tel.t-online.de",
|
||||
registrar: "voip.easybell.de",
|
||||
sipUser: "",
|
||||
authUser: "",
|
||||
password: "",
|
||||
@@ -150,6 +167,7 @@ const telephonyTrunkForm = reactive({
|
||||
externalMediaAddress: "",
|
||||
localNetworks: "172.16.0.0/12,192.168.0.0/16,10.0.0.0/8"
|
||||
})
|
||||
const activeTelephonyProvider = computed(() => telephonyProviderDefaults[telephonyTrunkForm.provider] || telephonyProviderDefaults.easybell)
|
||||
|
||||
const setupPage = async () => {
|
||||
itemInfo.value = auth.activeTenantData
|
||||
@@ -215,9 +233,10 @@ const loadTelephonyTrunk = async () => {
|
||||
telephonyTrunkLoading.value = true
|
||||
|
||||
try {
|
||||
const res = await useNuxtApp().$api("/api/telephony/trunk-config")
|
||||
const res = await useNuxtApp().$api(`/api/telephony/trunk-config?provider=${telephonyTrunkForm.provider}`)
|
||||
telephonyTrunkForm.provider = res?.provider || telephonyTrunkForm.provider || "easybell"
|
||||
telephonyTrunkForm.enabled = Boolean(res?.enabled)
|
||||
telephonyTrunkForm.registrar = res?.registrar || "tel.t-online.de"
|
||||
telephonyTrunkForm.registrar = res?.registrar || activeTelephonyProvider.value.registrar
|
||||
telephonyTrunkForm.sipUser = res?.sipUser || ""
|
||||
telephonyTrunkForm.authUser = res?.authUser || ""
|
||||
telephonyTrunkForm.password = ""
|
||||
@@ -239,7 +258,7 @@ const loadTelephonyTrunk = async () => {
|
||||
const saveTelephonyTrunk = async () => {
|
||||
if (telephonyTrunkForm.enabled && (!telephonyTrunkForm.sipUser?.trim() || (!telephonyTrunkForm.password?.trim() && !telephonyTrunkForm.passwordConfigured))) {
|
||||
toast.add({
|
||||
title: "Telekom-Zugang unvollständig",
|
||||
title: "Trunk-Zugang unvollständig",
|
||||
description: "Bitte gib mindestens SIP-ID und Kennwort an.",
|
||||
color: "orange"
|
||||
})
|
||||
@@ -252,6 +271,7 @@ const saveTelephonyTrunk = async () => {
|
||||
const res = await useNuxtApp().$api("/api/telephony/trunk-config", {
|
||||
method: "PUT",
|
||||
body: {
|
||||
provider: telephonyTrunkForm.provider,
|
||||
enabled: telephonyTrunkForm.enabled,
|
||||
registrar: telephonyTrunkForm.registrar,
|
||||
sipUser: telephonyTrunkForm.sipUser,
|
||||
@@ -292,7 +312,7 @@ const applyTelephonyTrunk = async () => {
|
||||
|
||||
toast.add({
|
||||
title: res?.warning ? "Trunk-Konfiguration geschrieben" : "Telefonie-Trunk angewendet",
|
||||
description: res?.warning || (res?.status?.registered ? "Telekom-Registration ist aktiv." : "Asterisk wurde neu geladen."),
|
||||
description: res?.warning || (res?.status?.registered ? "Trunk-Registration ist aktiv." : "Asterisk wurde neu geladen."),
|
||||
color: res?.warning ? "orange" : "success"
|
||||
})
|
||||
} catch (error) {
|
||||
@@ -363,6 +383,14 @@ onMounted(() => {
|
||||
loadMcpTokens()
|
||||
loadTelephonyTrunk()
|
||||
})
|
||||
|
||||
watch(() => telephonyTrunkForm.provider, async (provider) => {
|
||||
const defaults = telephonyProviderDefaults[provider] || telephonyProviderDefaults.easybell
|
||||
if (!telephonyTrunkForm.registrar || ["tel.t-online.de", "voip.easybell.de"].includes(telephonyTrunkForm.registrar)) {
|
||||
telephonyTrunkForm.registrar = defaults.registrar
|
||||
}
|
||||
await loadTelephonyTrunk()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -476,7 +504,7 @@ onMounted(() => {
|
||||
<div class="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
||||
<div>
|
||||
<h3 class="text-base font-semibold text-highlighted">Telefonie-Trunk</h3>
|
||||
<p class="text-sm text-muted">Konfiguriere den Telekom-Anschluss für externe Anrufe über Asterisk.</p>
|
||||
<p class="text-sm text-muted">Konfiguriere den SIP-Trunk für externe Anrufe über Asterisk.</p>
|
||||
</div>
|
||||
<UBadge :color="telephonyTrunkForm.enabled ? 'success' : 'neutral'" variant="soft">
|
||||
{{ telephonyTrunkForm.enabled ? "Aktiv" : "Inaktiv" }}
|
||||
@@ -484,28 +512,34 @@ onMounted(() => {
|
||||
</div>
|
||||
|
||||
<UAlert
|
||||
title="Telekom Zugangsdaten"
|
||||
:title="activeTelephonyProvider.title"
|
||||
color="neutral"
|
||||
variant="outline"
|
||||
>
|
||||
<template #description>
|
||||
<p class="text-sm">
|
||||
Die SIP-ID ist meistens deine Rufnummer mit Vorwahl ohne Leerzeichen und Sonderzeichen.
|
||||
Falls dein Anschluss die klassischen Zugangsdaten nutzt, kannst du den Auth-User aus
|
||||
Anschlusskennung, Zugangsnummer, #, Mitbenutzernummer und @t-online.de bilden.
|
||||
{{ activeTelephonyProvider.description }}
|
||||
</p>
|
||||
</template>
|
||||
</UAlert>
|
||||
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<UFormField label="Provider">
|
||||
<USelectMenu
|
||||
v-model="telephonyTrunkForm.provider"
|
||||
:items="telephonyProviderOptions"
|
||||
label-key="label"
|
||||
value-key="value"
|
||||
/>
|
||||
</UFormField>
|
||||
<UFormField label="Trunk aktivieren">
|
||||
<USwitch v-model="telephonyTrunkForm.enabled" />
|
||||
</UFormField>
|
||||
<UFormField label="Registrar">
|
||||
<UInput v-model="telephonyTrunkForm.registrar" placeholder="tel.t-online.de" />
|
||||
<UInput v-model="telephonyTrunkForm.registrar" :placeholder="activeTelephonyProvider.registrar" />
|
||||
</UFormField>
|
||||
<UFormField label="SIP-ID / Rufnummer">
|
||||
<UInput v-model="telephonyTrunkForm.sipUser" placeholder="0301234567" />
|
||||
<UInput v-model="telephonyTrunkForm.sipUser" placeholder="SIP-Benutzername" />
|
||||
</UFormField>
|
||||
<UFormField label="Auth-User">
|
||||
<UInput v-model="telephonyTrunkForm.authUser" placeholder="Optional" />
|
||||
@@ -514,7 +548,7 @@ onMounted(() => {
|
||||
<UInput
|
||||
v-model="telephonyTrunkForm.password"
|
||||
type="password"
|
||||
:placeholder="telephonyTrunkForm.passwordConfigured ? 'Bereits gespeichert' : 'Persönliches Kennwort'"
|
||||
:placeholder="telephonyTrunkForm.passwordConfigured ? 'Bereits gespeichert' : 'SIP-Kennwort'"
|
||||
/>
|
||||
</UFormField>
|
||||
<UFormField label="Gespeichertes Kennwort löschen">
|
||||
@@ -524,7 +558,7 @@ onMounted(() => {
|
||||
/>
|
||||
</UFormField>
|
||||
<UFormField label="Absendernummer">
|
||||
<UInput v-model="telephonyTrunkForm.callerId" placeholder="Optional, z. B. 0301234567" />
|
||||
<UInput v-model="telephonyTrunkForm.callerId" placeholder="Optional, z. B. 49301234567" />
|
||||
</UFormField>
|
||||
<UFormField label="Eingehende Nebenstelle">
|
||||
<UInput v-model="telephonyTrunkForm.inboundExtension" placeholder="1001" />
|
||||
|
||||
Reference in New Issue
Block a user