Files
BeWoPlaner/BeWoPlanerMobil/Views/Main/SingleBookingPartial.cshtml

931 lines
46 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@using BeWoPlanerMobil.Models
@using BeWoPlanerMobil.Util
@using BS.Shared
@using BS.Shared.Extensions
@model MainModel
@{
if(TempData[TempDataConstants.DoLogoutKey] is true)
{
<text>
<script type="text/javascript">
$("#second-logout-form").submit();
</script>
</text>
}
}
<script type="text/javascript">
window.addEventListener("load", function() {
@if(TempData[TempDataConstants.SupportConceptRelSelectedKey] is true)
{
<text>
window.updateCategory("@Model.BookingModePrefix", @Model.SelectedServiceCategoryOid);
window.updateServiceDescription("@Model.BookingModePrefix", @Model.SelectedServiceDescriptionOid);
window.updateEmployeeOids("@Model.BookingModePrefix", $("#sb-employee-input").val());
window.updateStartDate("@Model.BookingModePrefix", $(`#@Model.BookingModePrefix-start-date-input`).val());
window.updateStartTime("@Model.BookingModePrefix", $(`#@Model.BookingModePrefix-start-time-input`).val());
window.updateEndDate("@Model.BookingModePrefix", $(`#@Model.BookingModePrefix-end-date-input`).val());
window.updateEndTime("@Model.BookingModePrefix", $(`#@Model.BookingModePrefix-end-time-input`).val());
window.updateDurationUnit("sb", ($("#sb-hours-minutes-dropdown-btn").text().trim() === "Stunden" ? "h" : "m"));
</text>
}
});
$(document).ready(function() {
const dropdownBtn = $("#sb-hours-minutes-dropdown-btn");
dropdownBtn.on("click", function() {
dropdownBtn.data("text", dropdownBtn.text().replaceAll(/\s/g, ""));
});
$(".hours-minutes-link").on("click", function () {
const previousText = dropdownBtn.data("text");
const currentText = $(this).text().replaceAll(/\s/g, "");
if(previousText === currentText) {
return;
}
const buttonText = $(this).text();
dropdownBtn.text(buttonText);
window.setInputFilter();
window.updateDurationUnit("sb", (buttonText === "Stunden" ? "h" : "m"));
$.get('@Url.Action("ToggleDurationUnit")', { isInHoursMode: buttonText === "Stunden" });
calcDuration("sb", true, false, false);
});
@{
if(Model.SelectedSupportConcept != null || Model.SelectedCostBearerSupportConceptOid == -2)
{
<text>
initializeIntervalSelection();
</text>
}
}
window.calcPrependWidth();
});
function deleteSigntarue(signatureOid, serviceRecordOid, customerName, dateOfRecord) {
showMessagePopupWithCallback("Unterschrift löschen",
`Sind Sie sicher, dass Sie die Unterschrift von ${customerName} vom ${dateOfRecord} löschen möchten?`,
function () {
$("#sr-signature-to-del-oid-input").val(signatureOid);
$("#sr-sig-to-del-record-oid-input").val(serviceRecordOid);
showSpinner();
$("#delete-signature-form").submit();
},
false);
}
function resetSingleBookingForm() {
showSpinner();
$("#singleBookingForm").trigger("reset");
if($("#has-any-rating-types").val().toLowerCase() === "true") {
$(".goal-rating-badge").text("Bewerten");
} else {
$(".goal-rating-badge").text("");
}
$("#reset-single-booking-form-form").submit();
}
function setSelectedEmployeeForSingleBooking(selectedListElement, employeeOid) {
if(employeeOid !== null && employeeOid !== undefined && $.isNumeric(employeeOid) === true && employeeOid > 0) {
window.updateEmployeeOids('sb', employeeOid);
$.get("@Url.Action("SetServiceRecordEmployee")", {employeeOid: parseFloat(employeeOid)}, function (employeeName) {
$("#single-booking-employee-modal-popup").parent().find(".dropdown-toggle").text(employeeName);
$("#single-booking-employee-modal-popup").modal("hide");
window.loadServiceRecords();
});
}
}
function initializeIntervalSelection() {
const selectedOption = $("#timeFrameSelect option:selected").val();
switch (selectedOption) {
case "0":
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
break;
case "1":
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
break;
case "2":
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
break;
case "3":
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
break;
case "4":
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
break;
case "5":
$("#last-x-interval-container").show();
$("#custom-interval-container, #month-interval-container").hide();
break;
case "6":
$("#custom-interval-container").show();
$("#last-x-interval-container, #month-interval-container").hide();
break;
case "7":
$("#month-interval-container").show();
$("#last-x-interval-container, #custom-interval-container").hide();
break;
}
}
function changeServiceRecordIntervalSelection(select) {
const selectedOption = $(select).val();
showSpinner();
if(["0", "1", "2", "3", "4"].includes(selectedOption)) {
$("#last-x-interval-container, #custom-interval-container, #month-interval-container").hide();
}
else if(selectedOption === "5") {
$("#last-x-interval-container").show();
$("#custom-interval-container, #month-interval-container").hide();
}
else if(selectedOption === "6") {
$("#custom-interval-container").show();
$("#last-x-interval-container, #month-interval-container").hide();
}
else if(selectedOption === "7") {
$("#month-interval-container").show();
$("#last-x-interval-container, #custom-interval-container").hide();
}
window.loadServiceRecords();
}
</script>
<script type="text/javascript">
var _externalCallPollingTimer = null;
var _externalCallId = null;
function startExternalCall() {
// Eindeutige ID für diesen Aufruf generieren
_externalCallId = 'ext-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
// Callback-URL für das externe System
var callbackUrl = window.location.origin + '@Url.Action("ExternalCallCallback", "Main")' + '?callId=' + encodeURIComponent(_externalCallId);
// Externe URL vom Server ermitteln lassen
$.ajax({
url: '@Url.Action("GetExternalCallUrl", "Main")',
data: { callId: _externalCallId, callbackUrl: callbackUrl },
type: 'GET',
success: function(result) {
if (result && result.success && result.url) {
// Overlay anzeigen und Statustext zurücksetzen
$('#external-call-status-text').text('Um die Aufnahme zu starten, klicken Sie auf den Link, den wir an Ihren ownChat Account gesendet haben.');
document.getElementById('external-call-overlay').style.display = 'flex';
// Custom URL Scheme (ownchat://) per temporärem Anchor-Element öffnen
// zuverlässiger als window.open() für alle Browser inkl. Safari
var $a = $('<a>').attr('href', result.url).css('display', 'none').appendTo('body');
$a[0].click();
$a.remove();
// Polling starten - prüft regelmäßig ob der Callback aufgerufen wurde
_externalCallPollingTimer = setInterval(function() {
$.ajax({
url: '@Url.Action("CheckExternalCallStatus", "Main")',
data: { callId: _externalCallId },
type: 'GET',
success: function(pollResult) {
if (pollResult && pollResult.completed) {
stopExternalCallPolling();
onExternalCallCompleted(pollResult.data);
} else if (pollResult && pollResult.statusMessage) {
$('#external-call-status-text').text(pollResult.statusMessage);
}
},
error: function() {
// Bei Fehler weiter pollen
}
});
}, 3000);
} else {
// Fehler beim Ermitteln der URL
var errorMsg = (result && result.message) ? result.message : 'Die externe URL konnte nicht ermittelt werden.';
showAlertMessageBox(errorMsg);
_externalCallId = null;
}
},
error: function() {
showAlertMessageBox('Fehler bei der Kommunikation mit dem Server.');
_externalCallId = null;
}
});
}
function cancelExternalCall() {
// callId merken BEVOR stopExternalCallPolling() sie auf null setzt
var callIdToCancel = _externalCallId;
stopExternalCallPolling();
// Server informieren, dass abgebrochen wurde
if (callIdToCancel) {
$.ajax({
url: '@Url.Action("CancelExternalCall", "Main")',
data: { callId: callIdToCancel },
type: 'POST'
});
}
}
function stopExternalCallPolling() {
if (_externalCallPollingTimer) {
clearInterval(_externalCallPollingTimer);
_externalCallPollingTimer = null;
}
_externalCallId = null;
document.getElementById('external-call-overlay').style.display = 'none';
}
function onExternalCallCompleted(data) {
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);
}
}
</script>
@using(Html.BeginForm("ResetSingleBookingForm", "Main", FormMethod.Post, new { Id = "reset-single-booking-form-form" })) { }
<div class="row">
@* ----- Einzelbuchungsformular ----- *@
<div class="col col-12 col-md-5 booking-form-container">
@if (Model != null)
{
using (Html.BeginForm("SelectSupportConcept", "Main", FormMethod.Post, new { Id = "selectSupportConceptForm", onreset = "resetSingleBookingForm()" }))
{
var selectedSuportConceptTimeSpanColorClass = (Model.SelectedSupportConceptListObject?.IsAboutToExpire ?? false)
? "text-bewo-is-about-to-expire"
: (Model.SelectedSupportConceptListObject?.ExpiresInThreeMonthsOrLess ?? false)
? "text-bewo-expires-in-three-months"
: "text-light";
var isFormDisabled = Model.SelectedCostBearerSupportConceptOid.HasValue ? string.Empty : "disabled";
var nameAndDateOfBirth = Model.SelectedSupportConceptListObject?.NameAndDateOfBirth ?? string.Empty;
var supportConceptTimeSpan = Model.SelectedSupportConceptListObject?.SupportConceptTimeSpan ?? string.Empty;
<div>
<div class="container p-0">
<div class="row">
<div class="col mt-3">
<div class="list-group">
<a href="#" class="list-group-item flex-column align-items-start no-underline bg-bewo-task-red" data-toggle="modal" data-target="#supportConceptList">
<div class="d-flex">
<h5 class="mb-1 text-light text-left" id="selectedSupportConceptCustomerInfo">@nameAndDateOfBirth</h5>
</div>
@if(Model.SelectedCostBearerSupportConceptOid > 0)
{
<div class="dropdown-divider my-0 py-0"></div>
}
<p class="mb-1 text-left small @selectedSuportConceptTimeSpanColorClass" id="selectedSupportConceptInfo">
@supportConceptTimeSpan
</p>
</a>
</div>
</div>
@if(Model.SelectedCostBearerSupportConceptOid is > 0)
{
<div class="col-md-auto mt-3">
<button type="button" class="btn btn-outline-primary w-100 h-100" id="statistics-button" data-toggle="modal" data-target="#statistics-popup" onclick="showPieChart()">
<span class="d-md-none align-middle">Statistik</span>
<span class="fas fa-chart-pie align-middle" style="font-size: 2rem;"></span>
</button>
</div>
}
</div>
</div>
</div>
@* Hilfeplanauswahlpopup *@
<div class="modal" role="dialog" tabindex="-1" id="supportConceptList">
<div class="modal-dialog text-center modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title font-weight-bold">Hilfeplanauswahl</h5>
<button type="button" class="close" data-dismiss="modal" onclick="resetSupportConceptSearch()">
<span>&times;</span>
</button>
</div>
<div class="modal-body">
@* Hilfeplansuche *@
<div class="input-group mb-3">
<input class="form-control w-100" autocomplete="on" type="text" placeholder="Suchen..." oninput="supportConceptSearchOnChange()" id="support-concept-search-input" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetSupportConceptSearch()">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<hr />
@* Hilfeplanliste *@
<div class="list-group">
@foreach (var supportConceptListObject in Model.SupportConceptListObjects)
{
var nameAndDoBColorClass = "text-dark";
var timeSpanColorClass = supportConceptListObject.IsAboutToExpire ?
"text-bewo-is-about-to-expire" :
supportConceptListObject.ExpiresInThreeMonthsOrLess ?
"text-bewo-expires-in-three-months" :
"text-dark";
if(supportConceptListObject.IsArchived)
{
timeSpanColorClass = "text-bewo-archived-sc";
nameAndDoBColorClass = timeSpanColorClass;
}
else if(supportConceptListObject.IsDeleted)
{
timeSpanColorClass = "text-bewo-deleted-sc";
nameAndDoBColorClass = timeSpanColorClass;
}
<a href="#" class="list-group-item flex-column align-items-start no-underline blubb-test" onclick="selectSupportConcept(@supportConceptListObject.CostBearer2SupportConceptOid)" data-dismiss="modal">
<div class="justify-content-between">
<h5 class="mb-1 text-dark text-left supportconcept-name-header @nameAndDoBColorClass">
@supportConceptListObject.NameAndDateOfBirth
</h5>
</div>
<p class="mb-1 text-left @timeSpanColorClass">
@supportConceptListObject.SupportConceptTimeSpan
</p>
</a>
}
</div>
</div>
</div>
</div>
</div>
@* /Hilfeplanauswahlpopup *@
<input type="hidden" name="CostBearer2SupportConceptOid" id="sb-cb2ScRelOid" value="@Model.SelectedSupportConceptListObject.CostBearer2SupportConceptOid">
}
if(Model.IsCustomerAbsence)
{
<div class="container my-1 mb-0 mx-auto p-0 w-100 text-center">
<span>
<i class="fas fa-exclamation-triangle text-warning"></i>
<div class="text-danger d-inline">Klient ist abwesend</div>
<p class="text-danger mb-0 pb-0">@Model.CustomerAbsenceInfo</p>
</span>
</div>
}
using(Html.BeginForm("CreateOrUpdateServiceRecord", "Main", FormMethod.Post, new { id = "singleBookingForm" }))
{
<div>
@* ----- Einzelbuchung: Mitarbeiter ----- *@
<div class="form-row">
<div class="col-md">
<div class="mt-2" id="single-booking-employee-container">
@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}\"";
}
}
<input type="hidden" id="sb-employee-input" onchange="window.updateEmployeeOids('sb', $(this).val())" @sbEmployeeInputValue />
</div>
</div>
</div>
@* ----- Einzelbuchung: Ziele ----- *@
@if(Model.SelectedSupportConcept != null && Model.SelectedSupportConcept.Goals.Any())
{
<div class="form-row">
<div class="col-md mt-2">
<div class="card w-100">
<div class="card-header py-0" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas @Html.GetCollapsibleChevron(Model, "goals-container") h-100 text-dark"></i>
</div>
<div class="d-inline-flex h-100">
<button type="button" class="btn btn-link text-dark">
Ziele
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "goals-container")" id="goals-container">
<div class="card-body p-1">
<div class="input-group input-group-sm mb-1">
<input type="text" class="form-control" placeholder="Suchen ..." id="goal-search-input" oninput="goalTreeSearchOnChangeV2($(this))" />
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" onclick="resetGoalTreeSearch()">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<div class="btn-group btn-group-sm mb-1 w-100" role="group">
<button type="button" class="btn btn-outline-primary" onclick="window.showAllGoals()">Alle auf</button>
<button type="button" class="btn btn-outline-primary" onclick="window.hideAllGoals()">Alle zu</button>
</div>
<div class="container p-0 m-0" id="goals-tree">
@Html.Partial("GoalTreePartial", Model)
</div>
</div>
</div>
</div>
</div>
</div>
}
@* ----- Einzelbuchung: Kategorie & Leistung ----- *@
<div id="category-to-description-container">
@Html.Partial("Category2ServiceDescriptionPartial", Model)
</div>
@* ----- Marker ----- *@
@if(Model.ShowMarker)
{
var markerCheckedValue = Model.SelectedServiceRecord?.ServiceRecordType == ServiceRecordTypeId.Content ? "checked" : string.Empty;
<div class="form-row">
<div class="col-md mt-1">
<div class=" custom-control custom-checkbox custom-control-inline my-0">
<input type="checkbox" class="custom-control-input" onchange="window.updateMarker('sb', $(this).val());" name="@FormCollectionConstants.MarkerKey" id="sb-marker-cb" @markerCheckedValue />
<label class="custom-control-label" for="sb-marker-cb">Marker</label>
</div>
</div>
</div>
}
@* ----- Betrag ----- *@
@if(Model.ShowBetrag)
{
var betrag = string.Empty;
if(Model.SelectedServiceRecord?.Betrag is > 0)
{
betrag = Model.SelectedServiceRecord.Betrag.Value.ToString("#.00");
}
<div class="form-row mt-1">
<div class="col-md">
<div class="form-group my-0">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Betrag
</div>
</div>
<input class="form-control" autocomplete="on" onchange="window.updateBetrag('sb', $(this).val())" type="text" id="sb-betrag" name="betrag" value="@betrag" />
<div class="input-group-append">
<div class="input-group-text">€</div>
</div>
</div>
</div>
</div>
</div>
}
<hr class="mt-2 mb-0" />
@* ----- 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)
{
durationValue = Model.NewDuration?.ToString();
if(Model.NewDuration.HasValue)
{
durationValue = (Model.NewDuration / divisor).ToString();
}
}
var columnWidth = Model.IsEndDateVisible ? "col-md-6" : "col";
}
<div class="form-row">
<div class="@columnWidth mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text prepend-input-group-text">
Startdatum
</span>
</div>
<input class="form-control" type="date" name="Datum" id="sb-start-date-input" onchange="calcDuration('sb', false, true, false); window.updateStartDate('sb', $(this).val());" value="@Model.StartDateToEditJSFormat" />
</div>
</div>
@if(Model.IsEndDateVisible)
{
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text prepend-input-group-text">
Enddatum
</span>
</div>
<input class="form-control" type="date" name="Enddatum" id="sb-end-date-input" onchange="calcDuration('sb', false, false, true); window.updateEndDate('sb', $(this).val());" value="@Model.EndDateToEditJSFormat" />
</div>
</div>
}
</div>
<div class="form-row">
@{
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;
}
<div class="col mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Von
</span>
</div>
<input class="form-control" type="time" name="Start" id="sb-start-time-input" onchange="calcDuration('sb', false, true, false);window.updateStartTime('sb', $(this).val());" value="@von"/>
<span class="input-group-text rounded-0 border-left-0 border-right-0">
Bis
</span>
<input class="form-control" type="time" name="Ende" id="sb-end-time-input" onchange="calcDuration('sb', false, false, true);window.updateEndTime('sb', $(this).val());" value="@bis"/>
</div>
</div>
</div>
@* ----- Einzelbuchung: Dauer ----- *@
<div class="form-row mt-2">
<div class="col-md">
<div class="form-group my-0">
<div class="input-group">
<div class="input-group-prepend">
@{
var labelText = Model.EinheitZeiterfassung == 1 ? "Dauer (h)" : "Dauer";
}
<div class="input-group-text prepend-input-group-text" id="sb-duration-label">
@labelText
</div>
</div>
<input type="text" class="form-control" id="sb-duration-input" name="Dauer" onchange="beiDaueraenderung('sb'); window.updateDuration('sb', $(this).val());" value="@durationValue">
@if(Model.IsZeiterfassungInStdMin)
{
<div class="input-group-append">
<button id="sb-hours-minutes-dropdown-btn" class="btn btn-outline-primary dropdown-toggle w-100" type="button" data-toggle="dropdown">
@Model.SelectedDurationUnit
</button>
<div class="dropdown-menu">
<a class="dropdown-item hours-minutes-link" href="#">Minuten</a>
<a class="dropdown-item hours-minutes-link" href="#">Stunden</a>
</div>
</div>
}
</div>
</div>
</div>
</div>
@* ----- Einzelbuchung: Distanz ----- *@
@if(Model.ShowDistanceField)
{
<div class="form-row mt-2">
<div class="col-md">
<div class="form-group my-0">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
Gefahrene Kilometer
</div>
</div>
<input class="form-control" autocomplete="on" id="sb-distance-input" name="Distanz" onchange="validateDistanceInput(); window.updateDistance('sb', $(this).val());" value="@Model.DistanceToEdit">
</div>
</div>
</div>
</div>
}
@* ----- Einzelbuchung: Textbausteine ----- *@
@if(Model.HasRightToSeeTextModules)
{
<script type="text/javascript">
function textModuleButtonOnClick() {
$('#tree').load('@Url.Action("LoadUpToDateTextModules")');
}
</script>
<div class="form-row mt-2" id="textmodule-container">
<div class="col-md">
<button type="button" class="btn btn-primary form-control" data-toggle="modal" data-target="#textbausteine-popup" id="sb-textbausteine-btn" onclick="textModuleButtonOnClick()">Textbausteine</button>
</div>
</div>
}
@* ----- Einzelbuchung: Dokumentation ----- *@
<div class="form-row">
<div class="col-md mt-3">
@if(Model.NumberOfDokuTypes == 0)
{
<div class="form-group my-0">
<label for="sb-doku-textarea-5">Dokumentation</label>
<textarea class="form-control" autocomplete="on" style="overflow: scroll;" onchange="window.updateDokuText('sb', $(this).val(), 5)" name="Dokumentation6" id="sb-doku-textarea-5">@Model.NoticeToEdit</textarea>
</div>
}
else
{
<ul class="nav nav-tabs" role="tab-list">
@for(var i = 0; i < Model.Dokutypes.Length; i++)
{
var currentDokuType = Model.Dokutypes[i];
<li class="nav-item">
<a href="#sb-doku_@i" id="sb-doku_@i-tab" onchange="window.updateDokuText('sb', $(this).val(), @i)" data-toggle="tab" role="tab" class="nav-link@(i == 0 ? " active" : string.Empty)">
@currentDokuType.DisplayName
</a>
</li>
}
</ul>
<div class="tab-content" id="dokufelderTab">
@for(var i = 0; i < Model.Dokutypes.Length; i++)
{
var textareaName = i + 1 < 1 ? "Dokumentation" : "Dokumentation" + (i + 1);
<div class="tab-pane show@(i == 0 ? " active" : string.Empty)" id="sb-doku_@i" role="tabpanel">
<textarea class="form-control doku-form-control" onchange="window.updateDokuText('sb', $(this).val(), @i)" autocomplete="on" style="overflow: scroll;" id="sb-doku-textarea-@i" name="@textareaName">@Model.NoticeListToEdit[i]</textarea>
</div>
}
</div>
}
</div>
</div>
</div>
}
<div class="w-100 mt-2">
<button type="button" class="btn btn-primary float-right ml-1" id="create-button" onclick="submitSingleBookingForm()">@Model.SubmitButtonValue</button>
@if (Model.IsInEditingMode)
{
using (Html.BeginForm("ResetEditingMode", "Main", FormMethod.Post))
{
<button type="submit" class="btn btn-primary float-right" onclick="showSpinner()">Abbrechen</button>
}
}
else if (Model.IsInTransferMode)
{
using (Html.BeginForm("ResetTransferMode", "Main", FormMethod.Post))
{
<button type="submit" class="btn btn-primary float-right" onclick="showSpinner()">Abbrechen</button>
}
}
else
{
<button type="button" class="btn btn-primary float-right" id="reset-button" onclick="resetSingleBookingForm();">Abbrechen</button>
}
@if (Model.HasRightToUseAiVoice)
{
<button type="button" class="btn btn-primary float-right mr-1" id="aivoice-button" onclick="startExternalCall();" title="KI-Spracheingabe & Transkription" style="padding: 0 0.6em; overflow: hidden; line-height: 0;"><img src="@Url.Content("~/Content/images/Icon_Mikro_Weiss.png")" alt="KI-Spracheingabe & Transkription" style="height:2.25em; display: block;" /></button>
}
@Html.Partial("RestoreServiceRecordInputsPartial", Model)
</div>
@* Waiting-Overlay für externen Aufruf *@
<div id="external-call-overlay" style="display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.6); z-index:9999; justify-content:center; align-items:center;">
<div style="background:white; border-radius:8px; padding:30px; text-align:center; box-shadow:0 4px 20px rgba(0,0,0,0.3);">
<div class="mb-3">
<i class="fa fa-spinner fa-spin fa-2x"></i>
</div>
<p class="mb-3" id="external-call-status-text">Warte auf Rückmeldung vom externen System...</p>
<button type="button" class="btn btn-danger" onclick="cancelExternalCall();">Abbrechen</button>
</div>
</div>
}
</div>
@* /Einzelbuchungsformular *@
@* ----- Liste mit den Einträgen und dem Auswahl-Select ----- *@
<div class="col col-12 col-md-7">
@if(Model != null)
{
if(Model.SelectedSupportConcept != null || Model.SelectedCostBearerSupportConceptOid == -2)
{
var defaultStartDate = DateTime.Now.GetFirstOfMonth().ToString("yyyy-MM-dd");
var defaultEndDate = DateTime.Today.ToString("yyyy-MM-dd");
if (Model.SelectedZeitraum != null && Model.SelectedZeitraum.StartDate.HasValue && Model.SelectedZeitraum.EndDate.HasValue)
{
defaultStartDate = Model.SelectedZeitraum.StartDate.Value.ToString("yyyy-MM-dd");
defaultEndDate = Model.SelectedZeitraum.EndDate.Value.ToString("yyyy-MM-dd");
}
<div class="container-fluid w-100 mt-3 p-0">
<div class="form-row">
<div class="col">
<div class="form-group">
<select name="Records" class="custom-select" onchange="changeServiceRecordIntervalSelection(this)" id="timeFrameSelect">
<option value="5"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.XTage) { @Html.Raw("selected") }}>
Letzten x Tage
</option>
<option value="0"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.LastWeek) { @Html.Raw("selected") }}>
Letzten 7 Tage
</option>
<option value="1"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.LastMonth) { @Html.Raw("selected") }}>
Letzten 30 Tage
</option>
<option value="2"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.Last3Month) { @Html.Raw("selected") }}>
Letzten 90 Tage
</option>
<option value="3"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.All) { @Html.Raw("selected") }}>
Alle
</option>
<option value="6"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.ZeitraumWaehlen) { @Html.Raw("selected") }}>
Zeitraum wählen
</option>
<option value="7"
@{if(Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.Monatsauswahl) { @Html.Raw("selected") }}>
Monat wählen
</option>
</select>
</div>
</div>
<div class="col-auto">
<button type="button" class="btn btn-success w-100" onclick="loadServiceRecords()">
<span class="fas fa-sync-alt"></span>
</button>
</div>
</div>
@*----- Anzahl Tage: [Nummern-Input] ----- *@
<div class="form-row" id="last-x-interval-container">
<div class="col-12">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Anzahl Tage:</span>
</div>
<input class="form-control" id="day-count-number" type="number" name="day-count-number" min="0" value="@Model.LastSelectedServiceRecordTimeIntervalDays" />
</div>
</div>
</div>
</div>
@*----- Zeitraum wählen: [Von-Datum] bis [Bis-Datum] erster des Monats bis aktuelles Datum ----- *@
<div class="form-row" id="custom-interval-container">
<div class="col-12">
<div class="form-group">
<div class="form-row">
<div class="col mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Von
</span>
</div>
<input class="form-control" type="date" name="von" id="time-frame-start-date" onfocusout="loadServiceRecords()" value="@defaultStartDate"/>
<span class="input-group-text rounded-0 border-left-0 border-right-0">
Bis
</span>
<input class="form-control" type="date" name="bis" id="time-frame-end-date" onfocusout="loadServiceRecords()" value="@defaultEndDate"/>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="form-row" id="month-interval-container">
<div class="col-6">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Monat</span>
</div>
<select name="month-select" class="custom-select" id="month-select" onchange="loadServiceRecords()">
<option value="1"
@{if(Model.LastSelectedServiceRecordMonth.Month == 1) { @Html.Raw("selected") } }>
Januar
</option>
<option value="2"
@{if(Model.LastSelectedServiceRecordMonth.Month == 2) { @Html.Raw("selected") } }>
Februar
</option>
<option value="3"
@{ if(Model.LastSelectedServiceRecordMonth.Month == 3) { @Html.Raw("selected") } }>
März
</option>
<option value="4"
@{if(Model.LastSelectedServiceRecordMonth.Month == 4) { @Html.Raw("selected") }}>
April
</option>
<option value="5"
@{if(Model.LastSelectedServiceRecordMonth.Month == 5) { @Html.Raw("selected") }}>
Mai
</option>
<option value="6"
@{if(Model.LastSelectedServiceRecordMonth.Month == 6) { @Html.Raw("selected") }}>
Juni
</option>
<option value="7"
@{if(Model.LastSelectedServiceRecordMonth.Month == 7) { @Html.Raw("selected") }}>
Juli
</option>
<option value="8"
@{if(Model.LastSelectedServiceRecordMonth.Month == 8) { @Html.Raw("selected") }}>
August
</option>
<option value="9"
@{if(Model.LastSelectedServiceRecordMonth.Month == 9) { @Html.Raw("selected") }}>
September
</option>
<option value="10"
@{if(Model.LastSelectedServiceRecordMonth.Month == 10) { @Html.Raw("selected") }}>
Oktober
</option>
<option value="11"
@{if(Model.LastSelectedServiceRecordMonth.Month == 11) { @Html.Raw("selected") }}>
November
</option>
<option value="12"
@{if(Model.LastSelectedServiceRecordMonth.Month == 12) { @Html.Raw("selected") }}>
Dezember
</option>
</select>
</div>
</div>
</div>
<div class="col-6">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Jahr</span>
</div>
<select class="custom-select" name="year-select" id="year-select" onchange="loadServiceRecords()">
@{
var heuer = DateTime.Today.Year;
for(var year = heuer + 1; year >= heuer - 10; year--)
{
<option value="@year"
@{if(Model.LastSelectedServiceRecordMonth.Year == year) { @Html.Raw("selected") }}>
@year
</option>
}
}
</select>
</div>
</div>
</div>
</div>
</div>
}
<hr class="mt-2"/>
<div class="container-fluid mt-3" id="service-record-list-container">
@Html.Partial("ServiceRecordListPartial", Model)
</div>
}
</div>
@* ----- /Liste mit den Einträgen und dem Auswahl-Select ----- *@
</div>
@using(Html.BeginForm("DeleteSignature", "Main", FormMethod.Post, new { id = "delete-signature-form" }))
{
<input type="hidden" name="sr-signature-to-del-oid" id="sr-signature-to-del-oid-input" />
<input type="hidden" name="sr-sig-to-del-record-oid" id="sr-sig-to-del-record-oid-input" />
}