diff --git a/BeWoPlanerMobil/Controllers/MainController.cs b/BeWoPlanerMobil/Controllers/MainController.cs index aaf240883..4ba8b8a31 100644 --- a/BeWoPlanerMobil/Controllers/MainController.cs +++ b/BeWoPlanerMobil/Controllers/MainController.cs @@ -3583,19 +3583,23 @@ namespace BeWoPlanerMobil.Controllers var ts = new TranscriptionService(); var avd = ts.InitTranskription(MobileSessionFacade.Tenant, false); - externalUrl = avd.ResultUrl; + externalUrl = avd.OwnChatUrl; if (!string.IsNullOrEmpty(callId) && !string.IsNullOrEmpty(avd.Token)) { _externalCallTokens[callId] = ts.MapAiVoiceDataDC(avd); } + Log.Info($"GetExternalCallUrl: {callId}. Url = {externalUrl}, Transkription startet!"); //var externalBaseUrl = "https://example.com/external-service"; //var externalUrl = externalBaseUrl // + "?callbackUrl=" + Uri.EscapeDataString(callbackUrl) // + "&callId=" + Uri.EscapeDataString(callId); } - + else + { + Log.Info($"GetExternalCallUrl: {callId}. Url = {callbackUrl}, Transkription starten hat nicht geklappt. Kein OwnChatCode vorhanden!"); + } return Json(new { success = true, url = externalUrl }, JsonRequestBehavior.AllowGet); } @@ -3655,24 +3659,49 @@ namespace BeWoPlanerMobil.Controllers } string statusMessage = null; - if(!string.IsNullOrEmpty(callId) && _externalCallTokens.TryRemove(callId, out var avddc)) + + //Log.Info($"CheckExternalCallStatus: Start {callId}."); + + if (!string.IsNullOrEmpty(callId) && _externalCallTokens.TryRemove(callId, out var avddc)) { var ts = new TranscriptionService(); var avd = ts.MapAiVoiceData(avddc); - avd = ts.GetTranskription(avd); + statusMessage = avd.StatusMessage; + + + if (!String.IsNullOrEmpty(avd.TranskriptionText)) + { + statusMessage = "Transkription erfolgreich durchgeführt"; + Log.Info($"CheckExternalCallStatus: {callId}. Transkription erfolgreich durchgeführt!"); + ExternalCallCallback(callId, avd.TranskriptionText); + } + else if (!String.IsNullOrEmpty(avd.Error)) + { + statusMessage = avd.Error; + Log.Info($"CheckExternalCallStatus: {callId}. Transkription mit Fehler beendet: {avd.Error}"); + ExternalCallCallback(callId, ""); + } + else + { + //Log.Info($"CheckExternalCallStatus: {callId}. Status: {statusMessage}"); + } avddc = ts.MapAiVoiceDataDC(avd); _externalCallTokens[callId] = avddc; - //_externalCallStatusMessages.TryGetValue(callId, out statusMessage); + } + else + { + Log.Info($"CheckExternalCallStatus: {callId}. Kein Token gefunden."); } return Json(new { completed = false, statusMessage }, JsonRequestBehavior.AllowGet); } + /// /// Wird aufgerufen, wenn der Benutzer den externen Aufruf abbricht. /// Räumt den Eintrag auf, falls vorhanden. diff --git a/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml b/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml index fe0cced43..ed1808564 100644 --- a/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml +++ b/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml @@ -250,14 +250,21 @@ } function onExternalCallCompleted(data) { - // sb-doku-textarea-0 bevorzugen (nur sichtbar wenn mehrere Dokutypes vorhanden), - // sonst auf sb-doku-textarea-5 (Dokumentation6) zurückfallen - var $target = $('#sb-doku-textarea-0'); - var targetIndex = 0; - if ($target.length === 0 || !$target.is(':visible')) { + var $target; + var targetIndex; + + // Prüfen ob die Tab-Ansicht sichtbar ist (mehrere Dokutypes vorhanden) + var $activeTabTextarea = $('#dokufelderTab .tab-pane.active textarea'); + if ($activeTabTextarea.length > 0) { + // Das aktive Tab-Textarea verwenden; Index aus der ID auslesen (sb-doku-textarea-{i}) + $target = $activeTabTextarea; + targetIndex = parseInt($target.attr('id').replace('sb-doku-textarea-', ''), 10); + } else { + // Fallback: Einzelfeld Dokumentation6 $target = $('#sb-doku-textarea-5'); targetIndex = 5; } + if ($target.length > 0) { $target.val(data); window.updateDokuText('sb', data, targetIndex); diff --git a/Data/Entities/AiVoiceData.cs b/Data/Entities/AiVoiceData.cs index c5ef2c450..6e4f13092 100644 --- a/Data/Entities/AiVoiceData.cs +++ b/Data/Entities/AiVoiceData.cs @@ -18,5 +18,6 @@ namespace BeWo.Data.Entities public virtual String Token { get; set; } public virtual String UploadUrl { get; set; } public virtual String ResultUrl { get; set; } + public virtual String OwnChatUrl { get; set; } } } diff --git a/Service/ai/TranscriptionService.cs b/Service/ai/TranscriptionService.cs index 276f70d93..86ff93d4e 100644 --- a/Service/ai/TranscriptionService.cs +++ b/Service/ai/TranscriptionService.cs @@ -37,18 +37,14 @@ namespace BeWo.Service.AI if (!String.IsNullOrEmpty(avd.Token)) { - var url = String.Format("ownchat://voice/?token={0}", avd.Token); + avd.OwnChatUrl = String.Format("ownchat://voice/?token={0}", avd.Token); if (sendOwnChatMessage) { - var msg = String.Format("Bitte klicken Sie auf folgenden Link um die Aufnahme zu starten:\n\n{0}", url); + var msg = String.Format("Bitte klicken Sie auf folgenden Link um die Aufnahme zu starten:\n\n{0}", avd.OwnChatUrl); OwnChatHelper.SendOwnChatMessage(msg, UserRightHelper.GetLoggedInUser().Employee); } - else - { - avd.ResultUrl = url; - } } @@ -215,8 +211,9 @@ namespace BeWo.Service.AI StatusMessage = data.StatusMessage, Token = data.Token, TranskriptionText = data.TranskriptionText, - UploadUrl = data.UploadUrl - }; + UploadUrl = data.UploadUrl, + OwnChatUrl = data.OwnChatUrl + }; } public AiVoiceData MapAiVoiceData(AiVoiceDataDC data) @@ -230,7 +227,8 @@ namespace BeWo.Service.AI StatusMessage = data.StatusMessage, Token = data.Token, TranskriptionText = data.TranskriptionText, - UploadUrl = data.UploadUrl + UploadUrl = data.UploadUrl, + OwnChatUrl = data.OwnChatUrl }; } } diff --git a/Shared/DataContracts/AiVoiceDataDC.cs b/Shared/DataContracts/AiVoiceDataDC.cs index 2de080c2d..dfec476d1 100644 --- a/Shared/DataContracts/AiVoiceDataDC.cs +++ b/Shared/DataContracts/AiVoiceDataDC.cs @@ -21,5 +21,7 @@ namespace BS.Shared.DataContracts public string UploadUrl { get; set; } [DataMember] public string ResultUrl { get; set; } + [DataMember] + public string OwnChatUrl { get; set; } } } \ No newline at end of file