diff --git a/BeWoAllReports.sln b/BeWoAllReports.sln index c40582164..0654196fb 100644 --- a/BeWoAllReports.sln +++ b/BeWoAllReports.sln @@ -1002,6 +1002,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CaritasAichachFriedberg", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerspektiveAnitaNelles", "ReportImp\PerspektiveAnitaNelles\PerspektiveAnitaNelles.csproj", "{D80E7BBD-F017-4FBB-B3D3-5AD9F43C418D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FabiansDatenbank", "ReportImp\FabiansDatenbank\FabiansDatenbank.csproj", "{2B6F428D-8F97-4638-AF6B-907CB98D9869}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|.NET = Debug|.NET @@ -12292,6 +12294,30 @@ Global {D80E7BBD-F017-4FBB-B3D3-5AD9F43C418D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D80E7BBD-F017-4FBB-B3D3-5AD9F43C418D}.Release|x86.ActiveCfg = Release|Any CPU {D80E7BBD-F017-4FBB-B3D3-5AD9F43C418D}.Release|x86.Build.0 = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|.NET.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|.NET.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Debug|x86.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|.NET.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|.NET.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|Mixed Platforms.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|x86.ActiveCfg = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.DebugRemote|x86.Build.0 = Debug|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|.NET.ActiveCfg = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|.NET.Build.0 = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|Any CPU.Build.0 = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|x86.ActiveCfg = Release|Any CPU + {2B6F428D-8F97-4638-AF6B-907CB98D9869}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -12787,6 +12813,7 @@ Global {A65F19C6-A523-4566-8855-9141B9435B95} = {D8A691C5-146D-4613-86CC-438F02FE9106} {279D4AEA-239C-4A2C-91DE-735EB7A72F96} = {D8A691C5-146D-4613-86CC-438F02FE9106} {D80E7BBD-F017-4FBB-B3D3-5AD9F43C418D} = {D8A691C5-146D-4613-86CC-438F02FE9106} + {2B6F428D-8F97-4638-AF6B-907CB98D9869} = {D8A691C5-146D-4613-86CC-438F02FE9106} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FBE985BB-9F0F-4DBB-8F94-ABC37A803FF9} diff --git a/BeWoPlanerMobil/BeWoPlanerMobil.csproj b/BeWoPlanerMobil/BeWoPlanerMobil.csproj index 5c7de565b..19c62cd72 100644 --- a/BeWoPlanerMobil/BeWoPlanerMobil.csproj +++ b/BeWoPlanerMobil/BeWoPlanerMobil.csproj @@ -186,7 +186,8 @@ ..\packages\EntityFramework.6.5.1\lib\net45\EntityFramework.SqlServer.dll - ..\packages\log4net.3.1.0\lib\net462\log4net.dll + False + ..\Lib\log4net.dll ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.4.1.0\lib\net472\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll @@ -237,7 +238,7 @@ ..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll - + False ..\Lib\System.Runtime.CompilerServices.Unsafe.dll diff --git a/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss+Gruen.png b/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss+Gruen.png new file mode 100644 index 000000000..597cdace2 Binary files /dev/null and b/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss+Gruen.png differ diff --git a/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss.png b/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss.png new file mode 100644 index 000000000..fce0f9288 Binary files /dev/null and b/BeWoPlanerMobil/Content/images/Icon_KI_Funktion_Weiss.png differ diff --git a/BeWoPlanerMobil/Controllers/AbstractBaseController.cs b/BeWoPlanerMobil/Controllers/AbstractBaseController.cs index 83b106271..a7113251d 100644 --- a/BeWoPlanerMobil/Controllers/AbstractBaseController.cs +++ b/BeWoPlanerMobil/Controllers/AbstractBaseController.cs @@ -1,23 +1,24 @@ -using System; -using System.Diagnostics; -using System.Web.Mvc; -using System.Web.Security; -using BeWo.Data.Access; +using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BeWo.Service.ServiceContracts; +using BeWo.Service.ServiceContracts.Enhanced; using BeWoPlanerMobil.Models; using BeWoPlanerMobil.Service; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using ReportingService.ServiceContracts; +using System; +using System.Diagnostics; +using System.Web.Mvc; +using System.Web.Security; namespace BeWoPlanerMobil.Controllers { public abstract class AbstractBaseController : Controller - { - protected readonly ICustomerService CustomerService = new MobileSessionFacade().CustomerService; + { + protected readonly ICustomerService CustomerService = new MobileSessionFacade().CustomerService; protected readonly IOperationsService OperationsService = new MobileSessionFacade().OperationsService; protected readonly IEmployeeService EmployeeService = new MobileSessionFacade().EmployeeService; protected readonly IValueListService ValueListService = new MobileSessionFacade().ValueListService; @@ -26,7 +27,8 @@ namespace BeWoPlanerMobil.Controllers protected readonly IDownloadService DownloadService = new MobileSessionFacade().DownloadService; protected readonly IReportService ReportService = new MobileSessionFacade().ReportService; protected readonly IQueryService QueryService = new MobileSessionFacade().QueryService; - + protected readonly IAiEnhancedService AiService = new MobileSessionFacade().AiService; + protected const string LeerzeichenFuerGetMethoden = " "; protected static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); diff --git a/BeWoPlanerMobil/Controllers/MainController.cs b/BeWoPlanerMobil/Controllers/MainController.cs index 303bbeb93..985bd4d36 100644 --- a/BeWoPlanerMobil/Controllers/MainController.cs +++ b/BeWoPlanerMobil/Controllers/MainController.cs @@ -11,6 +11,7 @@ using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.Feature.AI; using BS.Shared.Extensions; using BS.Shared.Services; using DevExpress.Utils.Extensions; @@ -316,8 +317,192 @@ namespace BeWoPlanerMobil.Controllers } } + [HttpGet] + [Authorize] + public ActionResult GetAiPromptbausteinFolder() + { + try + { + var folders = AiService.GetAiPromptbausteinFolder(AiActionType.ServiceRecordDocumentation).ToList(); + AddFavoriten(folders); + var projected = ProjectAiFolders(folders); + + return new JsonResult + { + Data = projected, + JsonRequestBehavior = JsonRequestBehavior.AllowGet, + MaxJsonLength = int.MaxValue + }; + } + catch (Exception ex) + { + Response.StatusCode = 500; + Response.TrySkipIisCustomErrors = true; + return Json(new + { + error = ex.GetType().Name, + message = ex.Message, + inner = ex.InnerException?.Message, + stack = ex.StackTrace + }, JsonRequestBehavior.AllowGet); + } + } + + [HttpPost] + [Authorize] + public ActionResult StartPrompt(long promptOid) + { + try + { + var conv = new AiConversationDC + { + Created = DateTime.Now, + Updated = DateTime.Now, + ActionType = AiActionType.ServiceRecordDocumentation + }; + + AiViewContextDC viewContext = CreateAiViewContext(); + + conv = AiService.CreateAiConversation(conv, viewContext); + + var messages = AiService.ExecuteAiConversationWithPrompt(conv.Oid.Value, viewContext, promptOid); + + // Die generierte Dokumentation ist die letzte Assistent-Nachricht. + var resultMessage = (messages ?? new AiConversationMessageDC[0]) + .LastOrDefault(m => m.Role == AiConversationMessageRole.Assistent) + ?? (messages ?? new AiConversationMessageDC[0]).LastOrDefault(); + + return Json(new + { + success = true, + text = resultMessage?.Message ?? string.Empty + }); + } + catch (Exception ex) + { + Log.Error("StartPrompt fehlgeschlagen", ex); + Response.StatusCode = 500; + Response.TrySkipIisCustomErrors = true; + return Json(new + { + success = false, + error = ex.GetType().Name, + message = ex.Message, + inner = ex.InnerException?.Message + }); + } + } + + /// + /// Baut den AI-Kontext für die aktuell bearbeitete Einzelbuchung auf: + /// Primary = ausgewähltes Betreuungskonzept, Secondary = aktueller Dokumentationstext. + /// + private AiViewContextDC CreateAiViewContext() + { + long customerOid = -1; + long scOid = -1; + long cbOid = -1; + var oids = new List(); + foreach (var record in Model.ServiceRecords) + { + oids.Add(record.ServiceRecordOid ?? -1); + } + + if (Model.SelectedCostBearerSupportConceptOid.HasValue) + { + var c2s = DAOFactory.GenericDAO.LoadByID(Model.SelectedCostBearerSupportConceptOid.Value); + customerOid = c2s.SupportConcept.Customer.Oid.Value; + scOid = c2s.SupportConcept.Oid.Value; + cbOid = c2s.CostBearer.Oid.Value; + } + + var rtn = new Dictionary() + { + {TableID.Customer, new long[]{ customerOid } }, + {TableID.SupportConcept, new long[]{ scOid } }, + {TableID.CostBearer, new long[]{ cbOid } }, + {TableID.ServiceRecord, oids.ToArray() } + }; + + + var dc = new AiViewContextDC() + { + Primary = scOid, + References = rtn + }; + + return dc; + } + + + private void AddFavoriten(List folders) + { + var favoriten = new AiPromptbausteinFolderDC() + { + Oid = -5, + Title = "Favoriten", + Description = "Eigene Favoriten", + SubPrompts = new List() + }; + + AddFavoritenPrompts(folders, favoriten); + + folders.Insert(0, favoriten); + + } + + private void AddFavoritenPrompts(List folders, AiPromptbausteinFolderDC favoriten) + { + foreach (var folder in folders) + { + + if (folder.SubFolders?.Any() ?? false) + AddFavoritenPrompts(folder.SubFolders, favoriten); + + foreach (var prompt in folder.SubPrompts) + { + if (prompt.IsFavorite) + favoriten.SubPrompts.Add(prompt); + } + + //foreach (var routine in folder.SubRoutines.VMList) + //{ + // if (routine.IsFavorite) + // favoriten.SubRoutines.VMList.Add(routine); + //} + } + } + + /// + /// Projiziert die AiPromptbausteinFolderDC-Baumstruktur auf ein schlankes, + /// zirkelbezugsfreies Objekt für die JSON-Serialisierung an das UI. + /// + private List ProjectAiFolders(List folders) + { + if (folders == null) + { + return new List(); + } + + return folders.Select(f => (object)new + { + f.Title, + f.Description, + SubFolders = ProjectAiFolders(f.SubFolders), + SubPrompts = (f.SubPrompts ?? new List()) + .Select(p => new + { + p.Oid, + p.Title, + p.Description, + p.Prompt + }).ToList() + }).ToList(); + } + private void InitSettings() { + //Mandator Settings Model.ShowBetrag = UserSettingsUtils.GetSettingValueAsBool(Model.Mandator.Settings, SettingsKeys.ShowBetrag); Model.ShowMarker = UserSettingsUtils.GetSettingValueAsBool(Model.Mandator.Settings, SettingsKeys.ShowMarker); diff --git a/BeWoPlanerMobil/Models/AbstractModel.cs b/BeWoPlanerMobil/Models/AbstractModel.cs index 519a69624..941e2d2e8 100644 --- a/BeWoPlanerMobil/Models/AbstractModel.cs +++ b/BeWoPlanerMobil/Models/AbstractModel.cs @@ -60,6 +60,8 @@ namespace BeWoPlanerMobil.Models public bool HasRightToInsertRessourceAppointments => CheckRight(UserRightType.KalenderRessourcentermineAnlegen) || CheckRight(UserRightType.CreateAll); + public bool HasRightToSeeAiPromptsInZeiterfassung => CheckRight(UserRightType.AiModulePromptbausteineView) && CheckRight(UserRightType.AiModuleServiceRecordDocu); + public bool HasRightToUseAiVoice { get diff --git a/BeWoPlanerMobil/Service/MobileSessionFacade.cs b/BeWoPlanerMobil/Service/MobileSessionFacade.cs index 50ff3d2c9..cd27e8d2a 100644 --- a/BeWoPlanerMobil/Service/MobileSessionFacade.cs +++ b/BeWoPlanerMobil/Service/MobileSessionFacade.cs @@ -1,9 +1,11 @@ -using System.Web; -using BeWo.Service.ServiceContracts; +using BeWo.Service.ServiceContracts; +using BeWo.Service.ServiceContracts.Enhanced; using BeWo.Service.ServiceImplementations; +using BeWo.Service.ServiceImplementations.Enhanced; using BeWoPlanerMobil.Models; using ReportingService.ServiceContracts; using ReportingService.ServiceImplementations; +using System.Web; namespace BeWoPlanerMobil.Service { @@ -21,6 +23,7 @@ namespace BeWoPlanerMobil.Service DownloadService = new DownloadServiceImp(); ReportService = new ReportServiceImp(); QueryService = new QueryServiceImp(); + AiService = new AiEnhancedServiceImp(); } public ICustomerService CustomerService { get; } @@ -33,6 +36,7 @@ namespace BeWoPlanerMobil.Service public IDownloadService DownloadService { get; } public IReportService ReportService { get; } public IQueryService QueryService { get; } + public IAiEnhancedService AiService { get; } public static long? LoggedInUserOid { diff --git a/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml b/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml index d4a34c8c5..5b6ed723c 100644 --- a/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml +++ b/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml @@ -423,287 +423,460 @@ using(Html.BeginForm("CreateOrUpdateServiceRecord", "Main", FormMethod.Post, new { id = "singleBookingForm" })) { - - @* ----- Einzelbuchung: Mitarbeiter ----- *@ - - - - @Html.PopupWithSearchForIFilterables(Model.Employees, "setSelectedEmployeeForSingleBooking", null, Model.SelectedEmployee?.DetailDescription, "single-booking-employee-modal-popup", false) - - @{ - var sbEmployeeInputValue = string.Empty; - - if(Model.SelectedEmployee?.EmployeeOid is not null) - { - sbEmployeeInputValue = $"value=\"{Model.SelectedEmployee.EmployeeOid}\""; - } - } - - - - - - - @* ----- Einzelbuchung: Ziele ----- *@ - @if(Model.SelectedSupportConcept != null && Model.SelectedSupportConcept.Goals.Any()) - { + + @* ----- Einzelbuchung: Mitarbeiter ----- *@ - - - - - - - - - Ziele - - - - - - - - - - - - - - - Alle auf - Alle zu - - - @Html.Partial("GoalTreePartial", Model) - - - - - - - } + + + @Html.PopupWithSearchForIFilterables(Model.Employees, "setSelectedEmployeeForSingleBooking", null, Model.SelectedEmployee?.DetailDescription, "single-booking-employee-modal-popup", false) - @* ----- Einzelbuchung: Kategorie & Leistung ----- *@ - - @Html.Partial("Category2ServiceDescriptionPartial", Model) - + @{ + var sbEmployeeInputValue = string.Empty; - @* ----- Marker ----- *@ - @if(Model.ShowMarker) - { - var markerCheckedValue = Model.SelectedServiceRecord?.ServiceRecordType == ServiceRecordTypeId.Content ? "checked" : string.Empty; + if (Model.SelectedEmployee?.EmployeeOid is not null) + { + sbEmployeeInputValue = $"value=\"{Model.SelectedEmployee.EmployeeOid}\""; + } + } - - - - - Marker + - } - @* ----- Betrag ----- *@ - @if(Model.ShowBetrag) - { - var betrag = string.Empty; - if(Model.SelectedServiceRecord?.Betrag is > 0) + @* ----- Einzelbuchung: Ziele ----- *@ + @if (Model.SelectedSupportConcept != null && Model.SelectedSupportConcept.Goals.Any()) { - betrag = Model.SelectedServiceRecord.Betrag.Value.ToString("#.00"); - } - - - - - - - - Betrag + + + + + + + + + + Ziele + - - - € + + + + + + + + + + + + Alle auf + Alle zu + + + @Html.Partial("GoalTreePartial", Model) + + + } + + @* ----- Einzelbuchung: Kategorie & Leistung ----- *@ + + @Html.Partial("Category2ServiceDescriptionPartial", Model) - } - - - @* ----- Einzelbuchung: Startdatum und gegebenenfalls Enddatum ----- *@ - @{ - var divisor = Model.SelectedDurationUnit == "Stunden" ? 60 : 1; - var durationValue = Model.DurationToEdit; - - var afterValidationState = TempData[TempDataConstants.AfterValidationStateKey]; - - if(Model.SetStartTimeToEndTimeAfterSave && !Model.IsInEditingMode && afterValidationState is false) + @* ----- Marker ----- *@ + @if (Model.ShowMarker) { - durationValue = Model.NewDuration?.ToString(); - if(Model.NewDuration.HasValue) + var markerCheckedValue = Model.SelectedServiceRecord?.ServiceRecordType == ServiceRecordTypeId.Content ? "checked" : string.Empty; + + + + + + Marker + + + + } + + @* ----- Betrag ----- *@ + @if (Model.ShowBetrag) + { + var betrag = string.Empty; + if (Model.SelectedServiceRecord?.Betrag is > 0) { - durationValue = (Model.NewDuration / divisor).ToString(); + betrag = Model.SelectedServiceRecord.Betrag.Value.ToString("#.00"); } + + + + + + + + Betrag + + + + + € + + + + + } - var columnWidth = Model.IsEndDateVisible ? "col-md-6" : "col"; - } + - - - - - - Startdatum - - - - - - @if(Model.IsEndDateVisible) - { - - - - - Enddatum - - - - - - } - - + @* ----- Einzelbuchung: Startdatum und gegebenenfalls Enddatum ----- *@ @{ - var von = Model.IsInTransferMode || Model.IsInEditingMode || afterValidationState is true ? Model.StartTimeToEdit : Model.NewStartTime; - var bis = Model.IsInTransferMode || Model.IsInEditingMode || afterValidationState is true ? Model.EndTimeToEdit : Model.NewEndTime; + var divisor = Model.SelectedDurationUnit == "Stunden" ? 60 : 1; + var durationValue = Model.DurationToEdit; - var x = von; + var afterValidationState = TempData[TempDataConstants.AfterValidationStateKey]; + + if (Model.SetStartTimeToEndTimeAfterSave && !Model.IsInEditingMode && afterValidationState is false) + { + durationValue = Model.NewDuration?.ToString(); + if (Model.NewDuration.HasValue) + { + durationValue = (Model.NewDuration / divisor).ToString(); + } + } + + var columnWidth = Model.IsEndDateVisible ? "col-md-6" : "col"; } - - - - - Von - - - - - Bis - - - - - - @* ----- Einzelbuchung: Dauer ----- *@ - - - + + - @{ - var labelText = Model.EinheitZeiterfassung == 1 ? "Dauer (h)" : "Dauer"; - } - - @labelText - + + Startdatum + - - @if(Model.IsZeiterfassungInStdMin) - { - - - @Model.SelectedDurationUnit - - - Minuten - Stunden - + + + + @if (Model.IsEndDateVisible) + { + + + + + Enddatum + - } + + + + } + + + @{ + var von = Model.IsInTransferMode || Model.IsInEditingMode || afterValidationState is true ? Model.StartTimeToEdit : Model.NewStartTime; + var bis = Model.IsInTransferMode || Model.IsInEditingMode || afterValidationState is true ? Model.EndTimeToEdit : Model.NewEndTime; + + var x = von; + } + + + + + Von + + + + + Bis + + - - @* ----- Einzelbuchung: Distanz ----- *@ - @if(Model.ShowDistanceField) - { + @* ----- Einzelbuchung: Dauer ----- *@ - - Gefahrene Kilometer + @{ + var labelText = Model.EinheitZeiterfassung == 1 ? "Dauer (h)" : "Dauer"; + } + + @labelText - + + @if (Model.IsZeiterfassungInStdMin) + { + + + @Model.SelectedDurationUnit + + + Minuten + Stunden + + + } - } - @* ----- Einzelbuchung: Textbausteine ----- *@ - @if(Model.HasRightToSeeTextModules) - { - - - - Textbausteine + + + + Textbausteine + + + } + @* ----- Einzelbuchung: KI Funktionen ----- *@ + @if (Model.HasRightToSeeAiPromptsInZeiterfassung) + { + + + + @if (Model.HasRightToUseAiVoice) + { + + } + + + + + + + + + + + + + KI-Promptbausteine auswählen + + × + + + + + + + Wird geladen… + + + + + Bitte einen Ordner auswählen. + + + + + + + + + + + } + @* ----- Einzelbuchung: Dokumentation ----- *@ + + + @if (Model.NumberOfDokuTypes == 0) + { + + Dokumentation + @Model.NoticeToEdit + + } + else + { + + @for (var i = 0; i < Model.Dokutypes.Length; i++) + { + var currentDokuType = Model.Dokutypes[i]; + + + + @currentDokuType.DisplayName + + + } + + + @for (var i = 0; i < Model.Dokutypes.Length; i++) + { + var textareaName = i + 1 < 1 ? "Dokumentation" : "Dokumentation" + (i + 1); + + + @Model.NoticeListToEdit[i] + + } + + } - } - - @* ----- Einzelbuchung: Dokumentation ----- *@ - - - @if(Model.NumberOfDokuTypes == 0) - { - - Dokumentation - @Model.NoticeToEdit - - } - else - { - - @for(var i = 0; i < Model.Dokutypes.Length; i++) - { - var currentDokuType = Model.Dokutypes[i]; - - - - @currentDokuType.DisplayName - - - } - - - @for(var i = 0; i < Model.Dokutypes.Length; i++) - { - var textareaName = i + 1 < 1 ? "Dokumentation" : "Dokumentation" + (i + 1); - - - @Model.NoticeListToEdit[i] - - } - - } - - } @@ -727,12 +900,7 @@ { Abbrechen } - - @if (Model.HasRightToUseAiVoice) - { - - } - + @Html.Partial("RestoreServiceRecordInputsPartial", Model) diff --git a/BeWoPlanerMobil/Web.config b/BeWoPlanerMobil/Web.config index 43f171232..35b21d985 100644 --- a/BeWoPlanerMobil/Web.config +++ b/BeWoPlanerMobil/Web.config @@ -170,6 +170,8 @@ + +