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

625 lines
29 KiB
Plaintext

@using BeWoPlanerMobil.Models
@using BeWoPlanerMobil.Util
@using BS.Shared
@model MainModel
@{
if(TempData[TempDataConstants.DoLogoutKey] is bool doLogout && doLogout)
{
<text>
<script type="text/javascript">
$("#second-logout-form").submit();
</script>
</text>
}
}
<script type="text/javascript">
function generateExternalLink(serviceRecordOid) {
$("#external-signature-link-container").load("@Url.Action("GenerateOneTimeLinkForSignature", "Main")", {serviceRecordOid: serviceRecordOid}, function() {
hideSpinner();
$("#external-signature-link-popup").modal("show");
});
}
function cancelExternalLink() {
showSpinner();
$("#external-signature-link-container").load("@Url.Action("CancelLinkCreation")", function () {
hideSpinner();
$("#external-signature-link-popup").modal("hide");
});
}
function goToFirstServiceRecordListPage() {
showSpinner();
$("#service-record-list-container").load("@Url.Action("GoToFirstPage")", function () {
hideSpinner();
});
}
function goToLastServiceRecordListPage() {
showSpinner();
$("#service-record-list-container").load("@Url.Action("GoToLastPage")", function () {
hideSpinner();
});
}
function goToServiceRecordListPage(selectedPage) {
showSpinner();
$("#service-record-list-container").load("@Url.Action("LoadServiceRecordPage")", { selectedPage: selectedPage }, function() {
hideSpinner();
});
}
function submitServiceRecordEditForm(serviceRecordOid) {
const form = document.getElementById(`select-record-to-edit-form-${serviceRecordOid}`);
if(hasEmptyRequiredFields($(form))) {
return;
}
showSpinner();
form.submit();
}
</script>
@{
if(Model.ServiceRecordPageCount > 1)
{
var previousPage1 = Model.CurrentPage - 1 <= 0 ? 1 : Model.CurrentPage - 1;
var nextPage1 = Model.CurrentPage + 1 > Model.ServiceRecordPageCount ? Model.ServiceRecordPageCount : Model.CurrentPage + 1;
var page1 = 1;
if(Model.CurrentPage > 3 && Model.ServiceRecordPageCount > 5)
{
page1 = Model.CurrentPage - 2;
if(page1 > Model.ServiceRecordPageCount - 4)
{
page1 = Model.ServiceRecordPageCount - 4;
}
if(page1 < 1)
{
page1 = 1;
}
}
var lastPage1 = page1 + 4;
if(lastPage1 > Model.ServiceRecordPageCount)
{
lastPage1 = Model.ServiceRecordPageCount;
}
<nav>
<ul class="pagination justify-content-center">
@{
var previousButtonsClass = Model.CurrentPage == 1 ? "disabled" : string.Empty;
}
<li class="page-item @previousButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToFirstServiceRecordListPage()">
<span class="fas fa-angle-double-left"></span>
</button>
</li>
<li class="page-item @previousButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToServiceRecordListPage(@previousPage1)">
<span class="fas fa-angle-left"></span>
</button>
</li>
@for(; page1 <= lastPage1; page1++)
{
var isActive = Model.CurrentPage == page1;
var activeClass = isActive ? "active" : string.Empty;
<li class="page-item @activeClass">
@if(isActive)
{
<span class="page-link" onclick="goToServiceRecordListPage(@page1)">
@page1
<span class="sr-only">(current)</span>
</span>
}
else
{
<button type="button" class="page-link" onclick="goToServiceRecordListPage(@page1)">@page1</button>
}
</li>
}
@{
var nextButtonsClass = Model.CurrentPage == Model.ServiceRecordPageCount ? "disabled" : string.Empty;
}
<li class="page-item @nextButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToServiceRecordListPage(@nextPage1)">
<span class="fas fa-angle-right"></span>
</button>
</li>
<li class="page-item @nextButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToLastServiceRecordListPage()">
<span class="fas fa-angle-double-right"></span>
</button>
</li>
</ul>
</nav>
}
foreach(var serviceRecord in Model.ServiceRecords)
{
if(serviceRecord.Start is null || serviceRecord.End is null)
{
continue;
}
var start = serviceRecord.Start.Value;
var end = serviceRecord.End.Value;
var hasSignatureStr = serviceRecord.SignatureOid.HasValue ? "JA" : "NEIN";
var duration = (end - start).TotalMinutes;
var roundedDuration = MobileUtils.GetDecimalValueWithMaxDecimal(serviceRecord.RoundedDuration, 2);
if(serviceRecord.ServiceDescription.Category.Percentage > 0 && serviceRecord.ServiceDescription.Category.Percentage < 100)
{
roundedDuration = roundedDuration * serviceRecord.ServiceDescription.Category.Percentage / 100;
}
var durationStr = serviceRecord.GroupOid.HasValue ? string.Format("{0:###0.#} ({0:###0.#})", roundedDuration) : $"{duration:###0.#} ({roundedDuration:###0.#})";
var massnahmenString = string.Empty;
var zieleString = string.Empty;
if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
{
foreach(var goal in serviceRecord.Goals.Where(g => g.Type == ValueListEntryType.SupportConceptGoalType || g.Type == ValueListEntryType.SupportConceptIndividualGoalType))
{
if(goal.Abbreviation != null && goal.TypeDescription != null)
{
massnahmenString += $"{goal.Abbreviation}: {goal.TypeDescription}";
}
else if(goal.Abbreviation is null && goal.TypeDescription != null)
{
massnahmenString += goal.TypeDescription;
}
else if(goal.Abbreviation != null && goal.TypeDescription is null)
{
massnahmenString += goal.Abbreviation;
}
#if DEBUG
if(goal.RatingTypeOid.HasValue)
{
var goalRating = Model.GoalRatingTypes.FirstOrDefault(g => g.RatingTypeOid.HasValue && g.RatingTypeOid.Equals(goal.RatingTypeOid.Value));
if(goalRating?.DisplayName != null && goalRating.DisplayName.Length > 0)
{
massnahmenString += $" <strong style='color: blue;'>({goalRating.DisplayName})</strong>";
}
}
#endif
if(serviceRecord.Goals.IndexOf(goal) < serviceRecord.Goals.Count - 1)
{
massnahmenString += ", ";
}
}
if(serviceRecord.ServiceRecordOid.HasValue && Model.ServiceRecordOids2GoalHeader.ContainsKey(serviceRecord.ServiceRecordOid.Value))
{
var ziele = serviceRecord.Goals.Where(g => g.Type == ValueListEntryType.SupportConceptIndividualGoalCategoryType || g.Type == ValueListEntryType.SupportConceptGoalCategoryType).ToList();
foreach(var ziel in ziele)
{
if(ziel.Abbreviation != null && ziel.TypeDescription != null)
{
zieleString += $"{ziel.Abbreviation}: {ziel.TypeDescription} ";
}
else if(ziel.Abbreviation is null && ziel.TypeDescription != null)
{
zieleString += ziel.TypeDescription;
}
else if(ziel.Abbreviation != null && ziel.TypeDescription is null)
{
zieleString += ziel.Abbreviation;
}
#if DEBUG
if(ziel.RatingTypeOid.HasValue)
{
var zielbewertung = Model.GoalRatingTypes.FirstOrDefault(goalRatingType => goalRatingType.RatingTypeOid.HasValue && goalRatingType.RatingTypeOid.Equals(ziel.RatingTypeOid.Value));
if(zielbewertung?.DisplayName != null && zielbewertung.DisplayName.Length > 0)
{
zieleString += $" <strong style='color: blue;'>({zielbewertung.DisplayName})</strong>";
}
}
#endif
zieleString += ", ";
}
}
zieleString = zieleString.TrimEnd(' ').TrimEnd(',');
}
var cardBackground = serviceRecord.ServiceRecordType == ServiceRecordTypeId.Content ? "bg-service-record-marked" : serviceRecord.GroupOid.HasValue ? "bg-bewo-group-booking" : string.Empty;
<div class="row mb-3">
<div class="card w-100 @cardBackground">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas @Html.GetCollapsibleChevron(Model, $"collapse-service-record-{serviceRecord.ServiceRecordOid}") h-100 text-primary" id="chevron-@serviceRecord.ServiceRecordOid"></i>
</div>
<div class="d-inline-flex text-primary h-100">
<button type="button" class="btn btn-link">
@MainModel.GetServiceRecordTimeHeader(serviceRecord, true)
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, $"collapse-service-record-{serviceRecord.ServiceRecordOid}")" id="collapse-service-record-@serviceRecord.ServiceRecordOid">
<div class="card-body p-1">
<div class="container p-0">
<div class="row m-1 mb-2">
@if(Model.HasRightToEditServiceRecord(serviceRecord))
{
using(Html.BeginForm("SelectRecordToEdit", "Main", FormMethod.Post, new { id = "select-record-to-edit-form-" + serviceRecord.ServiceRecordOid.Value }))
{
<input type="hidden" name="service-record-oid-holder" value="@serviceRecord.ServiceRecordOid" />
}
}
@if(Model.ShowSignature && !serviceRecord.SignatureOid.HasValue && serviceRecord.Customer != null)
{
using(Html.BeginForm("SaveSignature", "Main", FormMethod.Post, new { id = $"save-signature-form-{serviceRecord.ServiceRecordOid.Value}" }))
{
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureBlobKey" id="sr-sig-blob-@serviceRecord.ServiceRecordOid.Value" />
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureDateKey" id="sr-sig-date-@serviceRecord.ServiceRecordOid.Value" />
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureRecordOidKey" id="sr-sig-sr-oid-@serviceRecord.ServiceRecordOid.Value" value="@serviceRecord.ServiceRecordOid.Value" />
}
}
<div class="btn-group" role="group">
@* Edit-Button *@
@if(Model.HasRightToEditServiceRecord(serviceRecord))
{
<button type="button" onclick="submitServiceRecordEditForm(@serviceRecord.ServiceRecordOid)" class="btn btn-outline-primary">
<span class="fas fa-edit"></span>
</button>
}
@* Löschen-Button *@
@if(Model.IsAllowedToDeleteServiceRecord(serviceRecord))
{
<button type="button" class="btn btn-outline-danger" onclick="deleteServiceRecord(@serviceRecord.ServiceRecordOid)">
<span class="fas fa-trash-alt"></span>
</button>
}
@* Unterschrift-Anlegen-Button *@
@if(Model.ShowSignature && !serviceRecord.SignatureOid.HasValue && serviceRecord.Customer != null)
{
<button type="button" class="btn btn-outline-primary" onclick="initializeSignature(@serviceRecord.ServiceRecordOid)">
<span class="fas fa-signature"></span>
</button>
if(Html.IsInDebugMode())
{
<button class="btn btn-outline-primary" type="button" onclick="generateExternalLink(@serviceRecord.ServiceRecordOid)">
<span class="fas fa-external-link-alt"></span>
</button>
}
}@* Unterschrift-Anzeigen-Button *@
else if(Model.ShowSignature && serviceRecord.SignatureOid.HasValue)
{
<button type="button" data-toggle="modal" class="btn btn-outline-primary" onclick="getSignatureImage(@serviceRecord.ServiceRecordOid.Value, @serviceRecord.SignatureOid.Value)">
<span class="fas fa-file-contract"></span>
</button>
if(Model.HasRightToDeleteReceiptSignatures)
{
<button type="button" class="btn btn-outline-danger" onclick="deleteSigntarue(@serviceRecord.SignatureOid.Value, @serviceRecord.ServiceRecordOid.Value, '@serviceRecord.Customer', '@MainModel.GetServiceRecordTimeHeader(serviceRecord, false)')">
<i class="fas fa-file-contract"></i>
<i class="fas fa-arrow-right"></i>
<i class="fas fa-trash-alt"></i>
</button>
}
}
</div>
</div>
<table class="table table-sm table-striped service-record-table m-1">
@* Dauer *@
<tr>
<td class="text-secondary">
Minuten (gerundet):
</td>
<td class="text-info">
@durationStr
</td>
</tr>
@* Gefahrene Kilometer *@
@if(Model.ShowDistanceField && serviceRecord.DistanceInMeterDecimal != null && serviceRecord.DistanceInMeterDecimal.Value > 0)
{
<tr>
<td class="text-secondary">
Gefahrene Kilometer:
</td>
<td>
@($"{serviceRecord.DistanceInMeterDecimal:0.##}")
</td>
</tr>
}
@* Ziele & Maßnahmen *@
@if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
{
if(!string.IsNullOrEmpty(zieleString))
{
<tr>
<td class="text-secondary">
Ziele:
</td>
<td>
@(new HtmlString(zieleString))
</td>
</tr>
}
if(serviceRecord.Goals.Any(goal => goal.Type == ValueListEntryType.SupportConceptGoalType || goal.Type == ValueListEntryType.SupportConceptIndividualGoalType))
{
<tr>
<td class="text-secondary">
Maßnahmen:
</td>
<td>
@(new HtmlString(massnahmenString))
</td>
</tr>
}
}
@* Leistungskategorie *@
<tr>
<td class="text-secondary">
Leistungskategorie:
</td>
<td>
@serviceRecord.ServiceDescription.CategoryName
</td>
</tr>
@* Leistung *@
<tr>
<td class="text-secondary">
Leistung:
</td>
<td>
@serviceRecord.ServiceDescription.Name
</td>
</tr>
@* Angelegt für *@
<tr>
<td class="text-secondary">
Angelegt für:
</td>
<td>
@serviceRecord.Employee.FirstNameLastName
</td>
</tr>
@* Angelegt von & angelegt am *@
@if(Model.ShowServiceRecordInsertedOn)
{
<tr>
<td class="text-secondary">
Angelegt von:
</td>
<td>
@serviceRecord.InsUser
</td>
</tr>
<tr>
<td class="text-secondary">
Angelegt am:
</td>
<td>
@serviceRecord.InsertedOn
</td>
</tr>
}
@* Betrag *@
@if(Model.ShowBetrag && serviceRecord.Betrag.HasValue && serviceRecord.Betrag.Value > 0)
{
var betrag = serviceRecord.Betrag.Value.ToString("#.00") + " €";
<tr>
<td class="text-secondary">
Betrag:
</td>
<td>
@betrag
</td>
</tr>
}
@* Doku *@
@{
var header1 = "Dokumentation";
if(Model.NumberOfDokuTypes >= 1)
{
header1 = Model.Dokutypes[0].TypeDescription;
}
<tr>
<td class="text-secondary">
@header1:
</td>
<td>
@Html.Raw(MobileUtils.ToHtml(serviceRecord.Notice, false))
</td>
</tr>
for(var i = 1; i < serviceRecord.NoticeList.Count; i++)
{
var notice = serviceRecord.NoticeList[i];
if(string.IsNullOrWhiteSpace(notice) || Model.NumberOfDokuTypes <= i)
{
continue;
}
var header = $"Dokumentation {i + 1}";
if(Model.NumberOfDokuTypes >= 2)
{
if(Model.NumberOfDokuTypes <= i)
{
continue;
}
header = Model.Dokutypes[i].TypeDescription;
}
<tr>
<td class="text-secondary">
@header:
</td>
<td>
@Html.Raw(MobileUtils.ToHtml(notice, false))
</td>
</tr>
}
}
@* Unterschrieben *@
<tr>
<td class="text-secondary">
Unterschrieben:
</td>
<td>
@hasSignatureStr
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
}
if(Model.ServiceRecordPageCount > 1)
{
var previousPage = Model.CurrentPage - 1 <= 0 ? 1 : Model.CurrentPage - 1;
var nextPage = Model.CurrentPage + 1 > Model.ServiceRecordPageCount ? Model.ServiceRecordPageCount : Model.CurrentPage + 1;
var page = 1;
if(Model.CurrentPage > 3 && Model.ServiceRecordPageCount > 5)
{
page = Model.CurrentPage - 2;
if(page > Model.ServiceRecordPageCount - 4)
{
page = Model.ServiceRecordPageCount - 4;
}
if(page < 1)
{
page = 1;
}
}
var lastPage = page + 4;
if(lastPage > Model.ServiceRecordPageCount)
{
lastPage = Model.ServiceRecordPageCount;
}
<nav>
<ul class="pagination justify-content-center">
@{
var previousButtonsClass = Model.CurrentPage == 1 ? "disabled" : string.Empty;
}
<li class="page-item @previousButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToFirstServiceRecordListPage()">
<span class="fas fa-angle-double-left"></span>
</button>
</li>
<li class="page-item @previousButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToServiceRecordListPage(@previousPage)">
<span class="fas fa-angle-left"></span>
</button>
</li>
@for(; page <= lastPage; page++)
{
var isActive = Model.CurrentPage == page;
var activeClass = isActive ? "active" : string.Empty;
<li class="page-item @activeClass">
@if(isActive)
{
<span class="page-link" onclick="goToServiceRecordListPage(@page)">
@page
<span class="sr-only">(current)</span>
</span>
}
else
{
<button type="button" class="page-link" onclick="goToServiceRecordListPage(@page)">@page</button>
}
</li>
}
@{
//var nextButtonsClass = Model.CurrentPage == Model.ServiceRecordPageCount || Model.ServiceRecordPageCount < 6 ? "disabled" : string.Empty;
var nextButtonsClass = Model.CurrentPage == Model.ServiceRecordPageCount ? "disabled" : string.Empty;
}
<li class="page-item @nextButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToServiceRecordListPage(@nextPage)">
<span class="fas fa-angle-right"></span>
</button>
</li>
<li class="page-item @nextButtonsClass">
<button type="button" class="page-link" tabindex="-1" onclick="goToLastServiceRecordListPage()">
<span class="fas fa-angle-double-right"></span>
</button>
</li>
</ul>
</nav>
}
}
@* Die externe Unterschrift *@
<div id="external-signature-link-popup" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title font-weight-bold">Einmal-Unterschrift</h6>
<button type="button" class="close" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container">
<div id="external-signature-link-container">
</div>
</div>
</div>
<div class="modal-footer justify-content-between">
<a tabindex="0" class="btn btn-primary text-white float-left" role="button" data-placement="top" data-toggle="popover" data-trigger="focus" data-content="Link kopiert!" onclick="copyExternalLinkToClipboard()">
<i class="fas fa-copy"></i>
</a>
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal" onclick="cancelExternalLink()">Abbrechen</button>
</div>
</div>
</div>
</div>