MoK: Pagination zur Zeiterfassung hinzugefügt und die Bargeldkassen weiterentwickelt.

This commit is contained in:
2024-01-12 17:16:52 +01:00
parent 5c1512828c
commit 6a4cdc845d
21 changed files with 4237 additions and 3300 deletions

View File

@@ -5099,6 +5099,15 @@
<ItemGroup>
<Content Include="Views\Customer\CustomerBetreuungPartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Customer\CustomerBargeldkassenFormPartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Customer\CustomerBargeldtransaktionenFormPartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Main\ServiceRecordListPartial.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -441,6 +441,37 @@ namespace BeWoPlanerMobil.Controllers
// DownloadTransactionPdf
// SaveTransactionSignature
[Authorize]
public string SelectBargeldkasse(long oid)
{
if(Model is null)
{
Logout();
return LeerzeichenFuerGetMethoden;
}
var selectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(oid));
Model.SelectedBargeldkasse = selectedBargeldkasse;
return LeerzeichenFuerGetMethoden;
}
[Authorize]
public string UnselectBargeldkasse()
{
if(Model is null)
{
Logout();
return LeerzeichenFuerGetMethoden;
}
Model.SelectedBargeldkasse = null;
return LeerzeichenFuerGetMethoden;
}
[Authorize]
public string GetBargeldkassenName(long oid)
{
@@ -455,6 +486,19 @@ namespace BeWoPlanerMobil.Controllers
return bargeldkassenname ?? LeerzeichenFuerGetMethoden;
}
[Authorize]
public ActionResult LoadFormPartial()
{
return PartialView("CustomerBargeldkassenFormPartial", Model);
}
// ToDo: Erstmal durch Get
[Authorize]
public string SaveBargeldkassenName(string newName, long oid)
@@ -505,6 +549,53 @@ namespace BeWoPlanerMobil.Controllers
return RedirectToActionPermanent("Customer");
}
[Authorize]
[HttpPost]
public ActionResult CreateOrUpdateBargeldkasse(FormCollection formCollection)
{
if(Model is null)
{
return Logout();
}
var name = formCollection["bargeldkassenname"];
var rawAnfangsbestand = formCollection["bargeldkassenanfangsbestand"];
var isSuccessful = decimal.TryParse(rawAnfangsbestand, out var anfangsbestand);
if(Model.SelectedBargeldkasse is null)
{
var rawAuszahlungsintervall = formCollection["auszahlungsintervall-select"];
var newBargeldkasse = new BargeldkassenDC
{
Anfangsbestand = anfangsbestand,
Kassenname = name
};
}
else
{
var bargeldkasse = Model.SelectedBargeldkasse;
if(!string.IsNullOrWhiteSpace(name))
{
bargeldkasse.Kassenname = name;
}
bargeldkasse.Anfangsbestand = anfangsbestand;
OperationsService.UpdateBargeldkasse(bargeldkasse);
}
Model.SelectedBargeldkasse = null;
return RedirectToActionPermanent("Customer");
}
#endregion
#region Abwesenheiten

View File

@@ -44,6 +44,7 @@ namespace BeWoPlanerMobil.Controllers
if(loginState.Message != null && loginState.State > -1)
{
TempData[MobileUtils.TempDataLoginStateKey] = loginState;
return Logout();
}
Log.Info($"LoginController.Index(): Loggedin User: {MobileSessionFacade.LoggedInUser.LoginName}");

View File

@@ -281,7 +281,8 @@ namespace BeWoPlanerMobil.Controllers
if(!(Model.CostBearer2SupportConceptOid is null) && Model.CostBearer2SupportConceptOid != -1)
{
LoadRecordsToModel();
LoadPaginatedServiceRecordsToModel(Model.CurrentPage);
//LoadRecordsToModel();
}
Model.IsEndDateVisible = UserSettingsUtils.GetSettingValueAsBool(mandatorSettings, SettingsKeys.IsEndDateVisible);
@@ -770,6 +771,8 @@ namespace BeWoPlanerMobil.Controllers
return LeerzeichenFuerGetMethoden;
}
long? oid = null;
using(var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1]))
{
var isValid = SignatureUtils.ValidateSignature(signatureBitmap);
@@ -781,15 +784,15 @@ namespace BeWoPlanerMobil.Controllers
var date = DateTime.Parse(timeStamp);
OperationsService.InsertSignature(new SignatureDC
oid = OperationsService.InsertSignature(new SignatureDC
{
DataBild = blob,
Zeitstempel = date,
ServiceRecordOid = serviceRecordOid
});
}).SignatureOid;
}
return LeerzeichenFuerGetMethoden;
return oid.HasValue ? "1" : "0";
}
catch(Exception e)
{
@@ -2626,6 +2629,7 @@ namespace BeWoPlanerMobil.Controllers
return LeerzeichenFuerGetMethoden;
}
#region Menü
// Menünavigation
[Authorize]
public ActionResult RedirectToScheduler()
@@ -2677,6 +2681,7 @@ namespace BeWoPlanerMobil.Controllers
return RedirectToMain();
}
#endregion
// Gruppenbuchungen
[HttpPost]
@@ -3959,6 +3964,95 @@ namespace BeWoPlanerMobil.Controllers
return RedirectToActionPermanent("Main");
}
#region ServiceRecord-Pagination
[Authorize]
public ActionResult LoadServiceRecordPage(int selectedPage)
{
if(Model.SelectedZeitraum?.StartDate is null || Model.SelectedZeitraum.EndDate is null)
{
Model.SelectedZeitraum = new NullableDateTimeSpan(DateTime.Today.GetFirstOfMonth(), DateTime.Today);
}
LoadPaginatedServiceRecordsToModel(selectedPage);
return PartialView("ServiceRecordListPartial", Model);
}
private void LoadPaginatedServiceRecordsToModel(int selectedPage)
{
var records = new List<ServiceRecordDC>();
if(selectedPage < 1)
{
selectedPage = 1;
}
var selectedDayCount = (long?) (Model.SelectedDayCount == 0 ? null : (int?) Model.SelectedDayCount);
Model.CurrentPage = selectedPage;
int totalServiceRecords;
var firstResult = (selectedPage - 1) * Model.MaxResults;
// Ohne Hilfeplan
if(Model.CostBearer2SupportConceptOid is null || Model.CostBearer2SupportConceptOid < 1)
{
records = Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.ZeitraumWaehlen || Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.Monatsauswahl ?
//Zeitraum oder Monat gewählt
OperationsService.GetEmployeesServiceRecordsWithStartEndDatePaginated(Model.Employee.EmployeeOid.Value, Model.SelectedZeitraum.StartDate.Value, Model.SelectedZeitraum.EndDate.Value, firstResult, Model.MaxResults, out totalServiceRecords).ToList() :
OperationsService.GetEmployeesServiceRecords2Paginated(Model.Employee.EmployeeOid.Value, selectedDayCount, firstResult, Model.MaxResults, out totalServiceRecords).ToList();
}
else
{
records = Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.ZeitraumWaehlen || Model.ServiceRecordTimeInterval == ServiceRecordTimeInterval.Monatsauswahl ?
//Zeitraum oder Monat gewählt
OperationsService.GetCustomerServiceRecordsWithStartEndDatePaginated(Model.SelectedSupportConcept.Customer.CustomerOid, Model.CostBearer2SupportConceptOid.Value, Model.SelectedZeitraum.StartDate.Value, Model.SelectedZeitraum.EndDate.Value, firstResult, Model.MaxResults, out totalServiceRecords) :
OperationsService.FindServiceRecordsForLastDaysPaginated(Model.CostBearer2SupportConceptOid, Model.SelectedDayCount, Model.Employee.EmployeeOid.Value, firstResult, Model.MaxResults, out totalServiceRecords).ToList();
}
var pages = Math.DivRem(totalServiceRecords, Model.MaxResults, out var remainder);
if(remainder > 0)
{
pages++;
}
Model.ServiceRecordCount = totalServiceRecords;
Model.ServiceRecordPageCount = pages;
var recordsOhneDuplikate = new List<ServiceRecordDC>();
foreach(var r in records.Where(r => !recordsOhneDuplikate.Any(a => a.GroupOid.HasValue && a.GroupOid.Value.Equals(r.GroupOid))))
{
recordsOhneDuplikate.Add(r);
}
Model.ServiceRecords = recordsOhneDuplikate.Where(serviceRecord => serviceRecord.Start.HasValue && serviceRecord.End.HasValue)
.OrderBy(serviceRecord => serviceRecord.Start.Value.Date)
.ThenBy(serviceRecord => serviceRecord.Start.Value.Hour)
.ThenBy(serviceRecord => serviceRecord.Start.Value.Minute)
.ThenBy(serviceRecord => serviceRecord.End.Value.Date)
.ThenBy(serviceRecord => serviceRecord.End.Value.Hour)
.ThenBy(serviceRecord => serviceRecord.End.Value.Minute)
.ThenByDescending(serviceRecord => serviceRecord.InsertedOn.Value).ToList();
}
[Authorize]
public ActionResult GoToFirstPage()
{
return LoadServiceRecordPage(1);
}
[Authorize]
public ActionResult GoToLastPage()
{
return LoadServiceRecordPage(Model.ServiceRecordPageCount);
}
#endregion
}
public class ServiceRecord2Monatsunterschrift

View File

@@ -210,5 +210,7 @@ namespace BeWoPlanerMobil.Models
public static bool HasRightToProvideEmployeeSignatureForOthers => CheckRight(UserRightType.Signature_ProvideMonthlySignatureByProxy);
public static bool HasRightToViewBetreuung => CheckRight(UserRightType.Customer_ViewBetreuung);
public static string UserMessage { get; set; }
}
}

View File

@@ -163,5 +163,7 @@ namespace BeWoPlanerMobil.Models
}
public AbsenceTimeDC SelectedAbsenceTime { get; set; }
public BargeldkassenDC SelectedBargeldkasse { get; set; }
}
}

View File

@@ -730,6 +730,17 @@ namespace BeWoPlanerMobil.Models
public bool IsPasswordSecurityEnabled { get; set; }
public bool ShowMarker { get; set; }
#region ServiceRecord-Pagination
public int ServiceRecordCount { get; set; }
public int CurrentPage { get; set; }
public int MaxResults { get; set; } = 10;
public int ServiceRecordPageCount { get; set; }
#endregion
}
public class CustomSelectListItem

View File

@@ -6,14 +6,11 @@ function hideSignature() {
function resizeCanvas(sketchPadId, canvasRoId) {
if($(sketchPadId).length !== 0) {
var rowWidth = $(canvasRoId).innerWidth();
var canvasWidth = $(sketchPadId).innerWidth();
var sourceCanvas = document.getElementById(sketchPadId.split("#")[1]);
var h = $(window).height();
var w = $(window).width();
var canvasWidth = sourceCanvas.scrollWidth;
var isInPortraitMode = h > w;
var newWidth = rowWidth * (isInPortraitMode === true ? 1.0 : 0.85);
var newWidth = rowWidth;
var parsedNewWidth = parseInt(newWidth, 10);
var parsedCanvasWidth = parseInt(canvasWidth, 10);
@@ -27,19 +24,31 @@ function resizeCanvas(sketchPadId, canvasRoId) {
}
if(isMinDifferenceMet) {
var sourceCanvas = document.getElementById(sketchPadId.split("#")[1]);
var trimmedCanvas = trimCanvas(cloneCanvas(sourceCanvas));
var canvasContext = sourceCanvas.getContext("2d", {willReadFrequently: true});
var imageData = sourceCanvas.toDataURL("image/png");
$(sketchPadId).prop("width", newWidth);
if(trimmedCanvas.width <= 0 || trimmedCanvas.height <= 0) {
return;
}
var img = new Image;
img.onload = function() {
canvasContext.drawImage(img, 0, 0);
img.onload = function () {
if(trimmedCanvas.width > parsedNewWidth) {
var factor = trimmedCanvas.height / trimmedCanvas.width;
var newHeight = parsedNewWidth * factor;
canvasContext.drawImage(img, 0, 0, parsedNewWidth - 1, newHeight - 1);
} else {
canvasContext.drawImage(img, 0, 0);
}
};
img.src = imageData;
img.src = trimmedCanvas.toDataURL();
}
}
}

View File

@@ -1,4 +1,5 @@
@using BS.Shared
@using BeWoPlanerMobil.Models
@using BS.Shared
@model BeWoPlanerMobil.Models.CustomerModel
@@ -61,99 +62,188 @@
}
}
function editBtnClickTest() {
function deselectBargeldkasse() {
try {
event.stopPropagation();
$.get("@Url.Action("UnselectBargeldkasse")");
} catch(error) {
showErrorPopup(error);
}
}
function deleteBtnClickTest() {
function editBtnClickTest(bargeldkassenOid, bargeldkassenname) {
try {
event.stopPropagation();
// ToDo: Abfragen, ob wirklich gelöscht werden soll.
$.get("@Url.Action("SelectBargeldkasse")", {oid: bargeldkassenOid}).success(function () {
$("#customer-absence-time-modal-body").load("@Url.Action("LoadFormPartial")", function() {
$("#customer-bargeldkassen-form-popup-title").text(bargeldkassenname + " bearbeiten");
$("#customer-bargeldkassen-form-popup").modal("show");
calcBargeldkassenFormPrependWidth();
});
});
} catch(error) {
showErrorPopup(error);
}
}
function deleteBtnClickTest(bargeldkassenOid, bargeldkassenname) {
try {
event.stopPropagation();
showMessagePopupWithHtmlAndCallback("Bargeldkasse l&ouml;schen", "M&ouml;chten Sie die Bargeldkasse \"" + bargeldkassenname + "\" wirklich l&ouml;schen?", function () {
showSpinner();
$("#bk-to-delete-oid").val(bargeldkassenOid);
document.getElementById("bargeldkassendeleteform").submit();
}, false);
} catch(error) {
showErrorPopup(error);
}
}
function addNewBargeldkasse() {
try {
$.get("@Url.Action("UnselectBargeldkasse")").success(function () {
$("#customer-absence-time-modal-body").load("@Url.Action("LoadFormPartial")", function() {
$("#customer-bargeldkassen-form-popup-title").text("");
$("#customer-bargeldkassen-form-popup").modal("show");
calcBargeldkassenFormPrependWidth();
});
});
} catch(error) {
showErrorPopup(error);
}
}
</script>
@foreach(var bargeldkasse in Model.Bargeldkassen)
{
<!-- Breite < lg -->
<div class="col-sm-12 d-lg-none mx-0 px-0">
<div class="card w-100 h-100">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-bewo-customer-card-header chevron-identifier-class"></i>
<button type="button" class="btn btn-primary mb-3" onclick="addNewBargeldkasse()">Neue Kasse hinzuf&uuml;gen</button>
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4">
@foreach(var bargeldkasse in Model.Bargeldkassen)
{
<div class="col mb-3">
<div class="card h-100">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-bewo-customer-card-header chevron-identifier-class"></i>
</div>
<div class="d-inline d-inline-flex text-bewo-customer-card-header h-100">
<button class="btn btn-link text-bewo-customer-card-header" type="button">
@bargeldkasse.Kassenname
</button>
</div>
<div class="d-inline d-inline-flex float-right">
<button class="btn btn-primary" type="button" modal="#customer-bargeldkassen-form-popup" onclick="editBtnClickTest(@bargeldkasse.BargeldkassenOid, '@bargeldkasse.Kassenname')">
<i class="fas fa-edit"></i>
</button>
<button class="btn btn-danger ml-1" type="button" onclick="deleteBtnClickTest(@bargeldkasse.BargeldkassenOid, '@bargeldkasse.Kassenname')">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</div>
<div class="d-inline d-inline-flex text-bewo-customer-card-header h-100">
<button class="btn btn-link text-bewo-customer-card-header" type="button">
@bargeldkasse.Kassenname
</button>
</div>
<div class="d-inline d-inline-flex float-right">
<button class="btn btn-primary" type="button" onclick="editBtnClickTest()">
<i class="fas fa-edit"></i>
</button>
<button class="btn btn-danger ml-1" type="button" onclick="deleteBtnClickTest()">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</div>
<div class="collapse">
<div class="card-body">
<div class="container-fluid px-0">
@{
var anfangsbestand = bargeldkasse.Anfangsbestand?.ToString("#.## €") ?? "0,00 €";
@{
var einzahlungen = bargeldkasse.Bargeldtransaktionen.Where(bkt => bkt.Zahlungstyp == Zahlungstyp.Einzahlung).Sum(bkt => bkt.Betrag) ?? 0m;
var auszahlungen = bargeldkasse.Bargeldtransaktionen.Where(bkt => bkt.Zahlungstyp == Zahlungstyp.Auszahlung).Sum(bkt => bkt.Betrag) ?? 0m;
var anfangsbestand = bargeldkasse.Anfangsbestand?.ToString("0.00 €") ?? "0,00 €";
var kassenbestand = ((bargeldkasse.Anfangsbestand ?? 0m) + einzahlungen - auszahlungen).ToString("#.## €");
}
<div class="row">
<div class="col-auto mr-auto text-secondary">
Kassenbestand:
</div>
<div class="col-auto">
@kassenbestand
</div>
</div>
<div class="row">
<div class="col-auto mr-auto text-secondary">
Anfangsbestand:
</div>
<div class="col-auto">
@anfangsbestand
</div>
</div>
<div class="row">
<div class="col-auto mr-auto text-secondary">
Startdatum:
</div>
<div class="col-auto">
</div>
</div>
<div class="row">
<div class="col-auto mr-auto text-secondary">
Enddatum:
</div>
<div class="col-auto">
</div>
</div>
<hr/>
var einzahlungen = bargeldkasse.Bargeldtransaktionen.Where(bkt => bkt.Zahlungstyp == Zahlungstyp.Einzahlung).Sum(bkt => bkt.Betrag) ?? 0m;
var auszahlungen = bargeldkasse.Bargeldtransaktionen.Where(bkt => bkt.Zahlungstyp == Zahlungstyp.Auszahlung).Sum(bkt => bkt.Betrag) ?? 0m;
var kassenbestand = ((bargeldkasse.Anfangsbestand ?? 0m) + einzahlungen - auszahlungen).ToString("0.00 €");
}
<div class="w-100">
<table class="w-100">
<tbody>
<tr>
<td class="text-secondary">
Kassenbestand:
</td>
<td class="text-primary float-right">
@kassenbestand
</td>
</tr>
<tr>
<td class="text-secondary">
Anfangsbestand:
</td>
<td class="text-primary float-right">
@anfangsbestand
</td>
</tr>
<tr>
<td class="text-secondary">
Startdatum:
</td>
<td class="text-primary">
</td>
</tr>
<tr>
<td class="text-secondary">
Enddatum:
</td>
<td class="text-primary">
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Breite >= lg -->
<div class="col-12 d-none d-lg-block mx-0 px-0"></div>
}
</div>
@using(Html.BeginForm("DeleteBargeldkasse", "Customer", FormMethod.Post, new {id = "bargeldkassendeleteform" }))
{
<input type="hidden" id="bk-to-delete-oid"/>
}
@*
ToDos:
1. Edit-Popup für Bargeldkasse an sich (Name + Anfangsbestand)
2. Formularpopup für Transaktionen (Datum, Art, Betrag, Belegnummer, Notiz)
*@
@if(AbstractModel.HasRightToCreateCustomerBargeldkassen || AbstractModel.HasRightToEditCustomerBargeldkassen)
{
<div class="modal" tabindex="-1" role="dialog" id="customer-bargeldkassen-form-popup">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="customer-bargeldkassen-form-popup-title">Bargeldkasse hinzufügen</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="close" onclick="deselectBargeldkasse()">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="customer-absence-time-modal-body">
@Html.Partial("CustomerBargeldkassenFormPartial", Model)
</div>
<div class="modal-footer">
<button class="btn btn-primary" type="button" onclick="submitCustomerBargeldkassenForm()">OK</button>
<button class="btn btn-secondary" type="button" data-dismiss="modal" onclick="clearCustomerBargeldkassenForm()">Abbrechen</button>
</div>
</div>
</div>
</div>
<div class="modal" tabindex="-1" role="dialog" id="customer-bargeldtransaktions-form-popup">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Neue Zahlung hinzufügen</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="customer-absence-time-modal-body">
@Html.Partial("CustomerBargeldtransaktionenFormPartial", Model)
</div>
<div class="modal-footer">
<button class="btn btn-primary" type="button" onclick="submitCustomerBargeldtransaktionenForm()">OK</button>
<button class="btn btn-secondary" type="button" data-dismiss="modal" onclick="clearCustomerBargeldtransaktionenForm()">Abbrechen</button>
</div>
</div>
</div>
</div>
}

View File

@@ -0,0 +1,138 @@
@using BeWoPlanerMobil.Models;
@model CustomerModel
<script type="text/javascript">
(function ($) {
$.fn.inputFilter = function (inputFilter) {
return this.on("input keydown keyup mouseup select mousedown contextmenu drop", function () {
if(inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if(this.hasOwnProperty("oldValue")) {
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
} else {
this.value = "";
}
});
}
}(jQuery));
var initialDatePrependWidth = 0;
function calcBargeldkassenFormPrependWidth() {
try {
if(initialDatePrependWidth <= 0 && $.isNumeric(getMaxWidth("customer-bargeldkassen-prepend"))) {
initialDatePrependWidth = getMaxWidth("customer-bargeldkassen-prepend");
}
if(initialDatePrependWidth <= 0) {
return;
}
$(".customer-bargeldkassen-prepend").width(getMaxWidth("customer-bargeldkassen-prepend"));
} catch(error) {
showErrorPopup(error);
}
}
function submitCustomerBargeldkassenForm() {
try {
showSpinner();
document.getElementById("create-bargeldkasse-form").submit();
} catch(error) {
showErrorPopup(error);
}
}
$("#create-bargeldkasse-form").ready(function () {
try {
calcBargeldkassenFormPrependWidth();
} catch(error) {
showErrorPopup(error);
}
});
$(document).ready(function () {
setInputFilter();
});
function setInputFilter() {
$("#bargeldkassenanfangsbestand").inputFilter(function (value) {
return /^-?\d*[.,]?\d*$/.test(value);
});
}
function clearCustomerBargeldkassenForm() {
try {
$("#bargeldkassenname").val("");
$("#bargeldkassenanfangsbestand").val("");
} catch(error) {
showErrorPopup(error);
}
}
</script>
@using(Html.BeginForm("CreateOrUpdateBargeldkasse", "Customer", FormMethod.Post, new { id = "create-bargeldkasse-form" }))
{
<input type="hidden" name="customer-bargeldkassen-oid" value="@Model.SelectedBargeldkasse?.BargeldkassenOid" />
var kassenname = Model.SelectedBargeldkasse?.Kassenname ?? string.Empty;
var anfangsbestand = Model.SelectedBargeldkasse?.Anfangsbestand?.ToString("0.00") ?? "0.00";
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text customer-bargeldkassen-prepend">
Name
</div>
</div>
<input class="form-control" type="text" name="bargeldkassenname" id="bargeldkassenname" value="@kassenname" />
</div>
</div>
</div>
</div>
if(Model.SelectedBargeldkasse is null)
{
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text customer-bargeldkassen-prepend">
Auszahlungsintervall
</div>
</div>
<select class="form-control" name="auszahlungsintervall-select">
<option value="0" selected>Kein</option>
<option value="1">Monatlich</option>
<option value="2">W&ouml;chentlich</option>
<option value="3">T&auml;glich</option>
</select>
</div>
</div>
</div>
</div>
}
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text customer-bargeldkassen-prepend">
Anfangsbestand
</div>
</div>
<input class="form-control" type="text" name="bargeldkassenanfangsbestand" id="bargeldkassenanfangsbestand" value="@anfangsbestand" />
<div class="input-group-append">
<span class="input-group-text">€</span>
</div>
</div>
</div>
</div>
</div>
}

View File

@@ -31,6 +31,15 @@
@ViewData[AbstractBaseController.IsSessionTimedOut]
</div>
}
@if(AbstractModel.UserMessage != null)
{
<div class="alert alert-danger mx-3" role="alert">
@AbstractModel.UserMessage;
</div>
AbstractModel.UserMessage = null;
}
@using(Html.BeginForm("Index", "Login", FormMethod.Post, new { @class = "px-3 col-12", id = "loginForm" }))
{
@@ -53,7 +62,7 @@
{
<div class="form-group">
<label for="pinFormControl">PIN</label>
<input id="pinFormControl" name="tb_pin" type="text" class="form-control" placeholder="PIN"/>
<input id="pinFormControl" name="tb_pin" type="text" class="form-control" placeholder="PIN" />
</div>
}

View File

@@ -0,0 +1,447 @@
@using BeWoPlanerMobil.Models
@using BeWoPlanerMobil.Util
@using BS.Shared
@model MainModel
<script type="text/javascript">
function goToFirstServiceRecordListPage() {
try {
showSpinner();
$("#service-record-list-container").load("@Url.Action("GoToFirstPage")", function () {
hideSpinner();
});
} catch(error) {
showErrorPopup(error);
}
}
function goToLastServiceRecordListPage() {
try {
showSpinner();
$("#service-record-list-container").load("@Url.Action("GoToLastPage")", function () {
hideSpinner();
});
} catch(error) {
showErrorPopup(error);
}
}
function goToServiceRecordListPage(selectedPage) {
try {
showSpinner();
$("#service-record-list-container").load("@Url.Action("LoadServiceRecordPage")", { selectedPage: selectedPage }, function() {
hideSpinner();
});
} catch(error) {
showErrorPopup(error);
}
}
</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 || Model.ServiceRecordPageCount < 6 ? "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 == null || serviceRecord.End == 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 goalsString = string.Empty;
if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
{
foreach(var goal in serviceRecord.Goals)
{
goalsString += goal.TypeDescription;
if(serviceRecord.Goals.IndexOf(goal) < serviceRecord.Goals.Count - 1)
{
goalsString += ", ";
}
}
}
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="cardHeaderClick('#chevron-@serviceRecord.ServiceRecordOid', '#collapse-service-record-@serviceRecord.ServiceRecordOid')">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-primary" id="chevron-@serviceRecord.ServiceRecordOid"></i>
</div>
<div class="p2 d-inline-flex text-primary h-100">
<button type="button" class="btn btn-link">
@MainModel.GetServiceRecordTimeHeader(serviceRecord, true)
</button>
</div>
</div>
<div id="collapse-service-record-@serviceRecord.ServiceRecordOid" class="collapse">
<div class="card-body">
<div class="container">
<div class="row mb-3">
@if(Model.HasRightToEditServiceRecord(serviceRecord))
{
using(Html.BeginForm("SelectRecordToEdit", "Main", FormMethod.Post))
{
<div class="col-auto">
<button type="button" onclick="submitForm(this)" class="btn btn-primary">
<span class="fas fa-edit"></span>
</button>
<input type="hidden" name="service-record-oid-holder" value="@serviceRecord.ServiceRecordOid" />
</div>
}
}
@if(MainModel.IsAllowedToDeleteServiceRecord(serviceRecord))
{
<div class="col-auto">
<button type="button" class="btn btn-primary" onclick="deleteServiceRecord(@serviceRecord.ServiceRecordOid)">
<span class="fas fa-trash-alt"></span>
</button>
</div>
}
@if(Model.ShowSignature && !serviceRecord.SignatureOid.HasValue)
{
<div class="col-auto">
<button type="button" class="btn btn-primary" onclick="initializeSignature(@serviceRecord.ServiceRecordOid)">
<span class="fas fa-signature"></span>
</button>
</div>
}
else if(Model.ShowSignature && serviceRecord.SignatureOid.HasValue)
{
<div class="col-auto">
<button type="button" data-toggle="modal" class="btn btn-primary" onclick="getSignatureImage(@serviceRecord.ServiceRecordOid.Value, @serviceRecord.SignatureOid.Value)">
<span class="fas fa-file-contract"></span>
</button>
</div>
if(AbstractModel.HasRightToDeleteReceiptSignatures)
{
<div class="col-auto">
<button type="button" class="btn btn-primary" onclick="deleteSigntarue(@serviceRecord.SignatureOid.Value, @serviceRecord.ServiceRecordOid.Value, '@serviceRecord.Customer', '@MainModel.GetServiceRecordTimeHeader(serviceRecord, false)')">
<i class="fas fa-file-contract"></i>
löschen
</button>
</div>
}
}
</div>
<div class="row">
<div class="col text-secondary">
Minuten (gerundet):
</div>
<div class="col text-info">
@durationStr
</div>
</div>
@if(Model.ShowDistanceField && serviceRecord.DistanceInMeterDecimal != null && serviceRecord.DistanceInMeterDecimal.Value > 0)
{
<div class="row">
<div class="col text-secondary">
Gefahrene Kilometer:
</div>
<div class="col">
@($"{serviceRecord.DistanceInMeterDecimal:0.##}")
</div>
</div>
}
@if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
{
<div class="row">
<div class="col text-secondary">
Ziele:
</div>
<div class="col">
@goalsString
</div>
</div>
}
<div class="row">
<div class="col text-secondary">
Leistungskategorie:
</div>
<div class="col">
@serviceRecord.ServiceDescription.CategoryName
</div>
</div>
<div class="row">
<div class="col text-secondary">
Leistung:
</div>
<div class="col">
@serviceRecord.ServiceDescription.Name
</div>
</div>
<div class="row">
<div class="col text-secondary">
Angelegt für:
</div>
<div class="col">
@($"{serviceRecord.Employee.FirstName} {serviceRecord.Employee.LastName}")
</div>
</div>
@if(AbstractModel.ShowServiceRecordInsertedOn)
{
<div class="row">
<div class="col text-secondary">
Angelegt von:
</div>
<div class="col">
@serviceRecord.InsUser
</div>
</div>
<div class="row">
<div class="col text-secondary">
Angelegt am:
</div>
<div class="col">
@serviceRecord.InsertedOn
</div>
</div>
}
@{
var header1 = "Dokumentation";
if(Model.NumberOfDokuTypes >= 1)
{
header1 = Model.Dokutypes[0].TypeDescription;
}
<div class="row">
<div class="col text-secondary">
@header1:
</div>
<div class="col">
@Html.Raw(MobileUtils.ToHtml(serviceRecord.Notice, false))
</div>
</div>
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;
}
<div class="row">
<div class="col text-secondary">
@header:
</div>
<div class="col">
@Html.Raw(MobileUtils.ToHtml(notice, false))
</div>
</div>
}
}
<div class="row">
<div class="col text-secondary">
Unterschrieben:
</div>
<div class="col">
@hasSignatureStr
</div>
</div>
</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;
}
<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>
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -76,301 +76,301 @@
@*<script src="@Url.Content("~/Scripts/ownSoft-Scripts/utils/password-security.js")" type="text/javascript"></script>*@
<script type="text/javascript">
class PasswordSecurity {
numbers = "0123456789";
lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
uppercaseLetters = "ABDEFGHIJKLMNOPQRSTUVWXYZ";
lowercaseUmlauts = "äöüß";
uppercaseUmlauts = "ÄÖÜ";
specialChars1 = "\\\"\'µ@€!";
specialChars2 = "&/()=?+*";
specialChars3 = ",.-;:_><|";
specialChars4 = "§$%'{[]}´";
specialChars5 = "`^°~²³";
class PasswordSecurity {
numbers = "0123456789";
lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
uppercaseLetters = "ABDEFGHIJKLMNOPQRSTUVWXYZ";
lowercaseUmlauts = "äöüß";
uppercaseUmlauts = "ÄÖÜ";
specialChars1 = "\\\"\'µ@@€!";
specialChars2 = "&/()=?+*";
specialChars3 = ",.-;:_><|";
specialChars4 = "§$%'{[]}´";
specialChars5 = "`^°~²³";
isPartial = false;
partialPassword = "";
passwordLengthDifference = 0;
score = 0;
previousValue = 0;
schalter = false;
previousValues = [];
isPartial = false;
partialPassword = "";
passwordLengthDifference = 0;
score = 0;
previousValue = 0;
schalter = false;
previousValues = [];
passwordLabelId = "";
passwordLabelId = "";
constructor(pwLabelId) {
this.passwordLabelId = pwLabelId;
}
constructor(pwLabelId) {
this.passwordLabelId = pwLabelId;
}
validatePassword(password) {
if (false === isUndefinedOrNull(password) && password.length > 0) {
var sx = "";
var passwordStrength = -1;
validatePassword(password) {
if (false === isUndefinedOrNull(password) && password.length > 0) {
var sx = "";
var passwordStrength = -1;
for (var i = 0; i < password.length; i++) {
sx += password[i];
for (var i = 0; i < password.length; i++) {
sx += password[i];
if (sx.length < this.partialPassword.length) {
this.isPartial = true;
this.passwordLengthDifference = this.partialPassword.length - sx.length;
if (sx.length < this.partialPassword.length) {
this.isPartial = true;
this.passwordLengthDifference = this.partialPassword.length - sx.length;
}
if (this.partialPassword !== sx) {
this.partialPassword = sx;
}
passwordStrength = this.calculatePasswordStrength(sx);
}
if (this.partialPassword !== sx) {
this.partialPassword = sx;
}
passwordStrength = this.calculatePasswordStrength(sx);
this.displayPasswordStrength(passwordStrength);
return;
}
this.displayPasswordStrength(passwordStrength);
return;
this.score = 0;
this.previousValue = 0;
this.displayPasswordStrength(-1);
}
this.score = 0;
this.previousValue = 0;
getIntegerFromArray(arr, index) {
if (arr === undefined || arr === null || arr.length < index) {
return 0;
}
this.displayPasswordStrength(-1);
}
var intValue = $.parseInt(arr[index], 10);
getIntegerFromArray(arr, index) {
if (arr === undefined || arr === null || arr.length < index) {
return 0;
return $.isNumeric(intValue) ? intValue : 0;
}
var intValue = $.parseInt(arr[index], 10);
getLastValue() {
if (this.previousValues === undefined || this.previousValues === null || this.previousValues.length === 0) {
return 0;
}
return $.isNumeric(intValue) ? intValue : 0;
}
getLastValue() {
if (this.previousValues === undefined || this.previousValues === null || this.previousValues.length === 0) {
return 0;
return this.previousValues[this.previousValues.length - 1];
}
return this.previousValues[this.previousValues.length - 1];
}
calculatePasswordStrength(passwordToValidate) {
var passwordStrength = 0;
this.previousValue = 0;
calculatePasswordStrength(passwordToValidate) {
var passwordStrength = 0;
this.previousValue = 0;
if (this.isPartial === true) {
if (this.passwordLengthDifference === 1) {
this.score -= this.getLastValue();
this.previousValues.pop();
} else {
for (var i = 0; i < this.passwordLengthDifference; i++) {
if (this.isPartial === true) {
if (this.passwordLengthDifference === 1) {
this.score -= this.getLastValue();
this.previousValues.pop();
} else {
for (var i = 0; i < this.passwordLengthDifference; i++) {
this.score -= this.getLastValue();
this.previousValues.pop();
}
}
}
this.isPartial = false;
} else {
var passwordLength = passwordToValidate.length;
this.isPartial = false;
} else {
var passwordLength = passwordToValidate.length;
if (passwordLength >= 6 && passwordLength < 9) {
this.score += 1;
this.previousValue = 1;
this.schalter = true;
}
if (passwordLength >= 9 && passwordLength < 12) {
this.score += 2;
this.previousValue = 2;
this.schalter = true;
}
if (passwordLength >= 12 && passwordLength < 18) {
this.score += 3;
this.previousValue = 3;
this.schalter = true;
}
if (passwordLength >= 18) {
this.score += 4;
this.previousValue = 4;
this.schalter = true;
}
var passwordAsArray = Array.from(passwordToValidate);
// Zahlen
var containsNumbers = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.numbers.includes(passwordAsArray[i])) {
containsNumbers = true;
break;
if (passwordLength >= 6 && passwordLength < 9) {
this.score += 1;
this.previousValue = 1;
this.schalter = true;
}
}
// Kleinbuchstaben
var containsLowercaseLetters = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.lowercaseLetters.includes(passwordAsArray[i])) {
containsLowercaseLetters = true;
break;
if (passwordLength >= 9 && passwordLength < 12) {
this.score += 2;
this.previousValue = 2;
this.schalter = true;
}
}
// Großbuchstaben
var containsUppercaseLetters = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.uppercaseLetters.includes(passwordAsArray[i])) {
containsUppercaseLetters = true;
break;
if (passwordLength >= 12 && passwordLength < 18) {
this.score += 3;
this.previousValue = 3;
this.schalter = true;
}
}
// Kleinumlaute
var containsLowercaseUmlauts = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.lowercaseUmlauts.includes(passwordAsArray[i])) {
containsLowercaseUmlauts = true;
break;
if (passwordLength >= 18) {
this.score += 4;
this.previousValue = 4;
this.schalter = true;
}
}
// Großumlaute
var containsUppercaseUmlauts = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.uppercaseUmlauts.includes(passwordAsArray[i])) {
containsUppercaseUmlauts = true;
break;
var passwordAsArray = Array.from(passwordToValidate);
// Zahlen
var containsNumbers = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.numbers.includes(passwordAsArray[i])) {
containsNumbers = true;
break;
}
}
}
// Sonderzeichen 1
var containsSpecialCharacters1 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars1.includes(passwordAsArray[i])) {
containsSpecialCharacters1 = true;
break;
// Kleinbuchstaben
var containsLowercaseLetters = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.lowercaseLetters.includes(passwordAsArray[i])) {
containsLowercaseLetters = true;
break;
}
}
}
var containsSpecialCharacters2 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars2.includes(passwordAsArray[i])) {
containsSpecialCharacters2 = true;
break;
// Großbuchstaben
var containsUppercaseLetters = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.uppercaseLetters.includes(passwordAsArray[i])) {
containsUppercaseLetters = true;
break;
}
}
}
var containsSpecialCharacters3 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars3.includes(passwordAsArray[i])) {
containsSpecialCharacters3 = true;
break;
// Kleinumlaute
var containsLowercaseUmlauts = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.lowercaseUmlauts.includes(passwordAsArray[i])) {
containsLowercaseUmlauts = true;
break;
}
}
}
var containsSpecialCharacters4 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars4.includes(passwordAsArray[i])) {
containsSpecialCharacters4 = true;
break;
// Großumlaute
var containsUppercaseUmlauts = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.uppercaseUmlauts.includes(passwordAsArray[i])) {
containsUppercaseUmlauts = true;
break;
}
}
}
var containsSpecialCharacters5 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars5.includes(passwordAsArray[i])) {
containsSpecialCharacters5 = true;
break;
// Sonderzeichen 1
var containsSpecialCharacters1 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars1.includes(passwordAsArray[i])) {
containsSpecialCharacters1 = true;
break;
}
}
var containsSpecialCharacters2 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars2.includes(passwordAsArray[i])) {
containsSpecialCharacters2 = true;
break;
}
}
var containsSpecialCharacters3 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars3.includes(passwordAsArray[i])) {
containsSpecialCharacters3 = true;
break;
}
}
var containsSpecialCharacters4 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars4.includes(passwordAsArray[i])) {
containsSpecialCharacters4 = true;
break;
}
}
var containsSpecialCharacters5 = false;
for (var i = 0; i < passwordAsArray.length; i++) {
if (this.specialChars5.includes(passwordAsArray[i])) {
containsSpecialCharacters5 = true;
break;
}
}
if (containsNumbers === true) {
this.addScoreValue(3);
}
if (containsLowercaseLetters === true) {
this.addScoreValue(2);
}
if (containsUppercaseLetters === true) {
this.addScoreValue(3);
}
if (containsLowercaseUmlauts === true) {
this.addScoreValue(2);
}
if (containsUppercaseUmlauts === true) {
this.addScoreValue(2);
}
if (containsSpecialCharacters1 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters2 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters3 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters4 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters5 === true) {
this.addScoreValue(4);
}
this.previousValues.push(this.previousValue);
}
if (containsNumbers === true) {
this.addScoreValue(3);
if (this.score <= 15) {
passwordStrength = 0;
}
if (containsLowercaseLetters === true) {
this.addScoreValue(2);
if (this.score > 15 && this.score <= 55) {
passwordStrength = 1;
}
if (containsUppercaseLetters === true) {
this.addScoreValue(3);
if (this.score > 55 && this.score <= 115) {
passwordStrength = 2;
}
if (containsLowercaseUmlauts === true) {
this.addScoreValue(2);
if (this.score > 115 && this.score <= 155) {
passwordStrength = 3;
}
if (containsUppercaseUmlauts === true) {
this.addScoreValue(2);
if (this.score > 155) {
passwordStrength = 4;
}
if (containsSpecialCharacters1 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters2 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters3 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters4 === true) {
this.addScoreValue(4);
}
if (containsSpecialCharacters5 === true) {
this.addScoreValue(4);
}
this.previousValues.push(this.previousValue);
return passwordStrength;
}
if (this.score <= 15) {
passwordStrength = 0;
addScoreValue(defaultValue) {
if (defaultValue === undefined || defaultValue === null || false === $.isNumeric(defaultValue)) {
return;
}
this.score += defaultValue;
if (this.schalter === true) {
this.previousValue += defaultValue;
} else {
this.previousValue = defaultValue;
}
}
if (this.score > 15 && this.score <= 55) {
passwordStrength = 1;
}
displayPasswordStrength(passwordStrength) {
var passwordLabel = $("#" + this.passwordLabelId);
if (this.score > 55 && this.score <= 115) {
passwordStrength = 2;
}
if (passwordStrength === undefined || !$.isNumeric(passwordStrength) || !passwordLabel.length) {
return;
}
if (this.score > 115 && this.score <= 155) {
passwordStrength = 3;
}
passwordLabel.removeClass("text-success text-danger text-warning");
if (this.score > 155) {
passwordStrength = 4;
}
return passwordStrength;
}
addScoreValue(defaultValue) {
if (defaultValue === undefined || defaultValue === null || false === $.isNumeric(defaultValue)) {
return;
}
this.score += defaultValue;
if (this.schalter === true) {
this.previousValue += defaultValue;
} else {
this.previousValue = defaultValue;
}
}
displayPasswordStrength(passwordStrength) {
var passwordLabel = $("#" + this.passwordLabelId);
if (passwordStrength === undefined || !$.isNumeric(passwordStrength) || !passwordLabel.length) {
return;
}
passwordLabel.removeClass("text-success text-danger text-warning");
switch (passwordStrength) {
switch (passwordStrength) {
case -1:
passwordLabel.addClass("d-none");
passwordLabel.html("");
@@ -400,9 +400,9 @@
passwordLabel.html("Passwortstärke: Sehr stark");
passwordLabel.addClass("text-success");
break;
}
}
}
}
</script>
<script type="text/javascript">
@@ -741,6 +741,25 @@
Passwort &auml;ndern
</button>
</li>
@if(Html.IsInDebugMode())
{
<script type="text/javascript">
function showDownlink() {
try {
showMessagePopupWithHtml("Downlink", `Der Downlink betr&auml;gt laut Browser ${navigator.connection.downlink} mbps`);
} catch (error) {
showErrorPopup(error);
}
}
</script>
<li class="nav-item">
<button class="btn btn-link text-light no-underline" onclick="showDownlink()">
<i class="fas fa-tachometer-alt"></i>
Downlink anzeigen
</button>
</li>
}
<li class="nav-item">
@using(Html.BeginForm("Logout", "Main", FormMethod.Post))