Merge branch 'master' of ssh://float.ownsoft.de/git/beyondSoft/BeWo

This commit is contained in:
2025-11-25 11:06:37 +01:00
16 changed files with 750 additions and 12409 deletions

View File

@@ -331,7 +331,7 @@
<Compile Include="Models\ReportViewerModel.cs" />
<Compile Include="Models\SchedulerModel.cs" />
<Compile Include="Util\DcToMokMapper.cs" />
<Compile Include="Util\ISignaturePopup.cs" />
<Compile Include="Util\ISignable.cs" />
<Compile Include="Util\MokSettings.cs" />
<Compile Include="Util\AppointmentListItem.cs" />
<Compile Include="Util\BeWoLoginState.cs" />

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -244,3 +244,8 @@ $font-family-sans-serif: 'Signika Negative', sans-serif;
.btn-group-dropdown-toggle {
@include border-right-radius(0);
}
.bewo-dev-bg {
background-color: #000000;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='25' height='25' viewBox='0 0 20 20'%3E%3Cg %3E%3Cpolygon fill='%23FFCA00' points='20 10 10 0 0 0 20 20'/%3E%3Cpolygon fill='%23FFCA00' points='0 10 0 20 10 20'/%3E%3C/g%3E%3C/svg%3E");
}

View File

@@ -124,7 +124,6 @@ namespace BeWoPlanerMobil.Controllers
[Authorize]
public ActionResult UpdateApplicationSettings(string pKey, string pValue)
{
var userSettings = LoggedInUser.Settings;
UserSettingsUtils.SetSettingValue(SettingsType.ApplicationSettings, pKey, pValue, userSettings);

View File

@@ -99,9 +99,11 @@ namespace BeWoPlanerMobil.Controllers
return;
}
var customerFilter = MobileUserSettingsUtils.GetSettingValueAsEnum(Model.UserSettings, SettingsKeys.CustomerFilterCustomers, CustomerFilterEnum.MyCustomer);
if (Model.LoggedInEmployee?.EmployeeOid.HasValue ?? false)
Model.SelectedCustomerFilter = customerFilter;
if(Model.LoggedInEmployee?.EmployeeOid.HasValue ?? false)
{
Model.Customers = EmployeeService.GetActiveCustomersForEmployee(Model.LoggedInEmployee.EmployeeOid.Value, Model.SelectedCustomerFilter).OrderBy(customer => customer.LastName).ToList();
}
@@ -110,34 +112,30 @@ namespace BeWoPlanerMobil.Controllers
Model.Customers = new List<CompactCustomerDC>();
}
if (Model.CustomerSessionModel.SelectedCustomerOid.HasValue)
if(Model.CustomerSessionModel.SelectedCustomerOid.HasValue)
{
Model.SelectedCustomer = CustomerService.LoadCustomer(Model.CustomerSessionModel.SelectedCustomerOid.Value);
}
if (Model.IsAllowedToSeeMedikamentenliste)
if(Model.IsAllowedToSeeMedikamentenliste)
{
Model.ReportTypes = new List<CustomerReportType> { CustomerReportType.Medikamentenliste, CustomerReportType.Bedarfsmedikation, CustomerReportType.Historie };
}
Model.AllAbsenceReasons = Model.HasRightToViewCustomerAbsenceTimes ? CustomerService.GetAllAbsenceReasons().Where(a => !a.Sichtbarkeit.HasValue || a.Sichtbarkeit.Value == AbsenceReasonVisibilityType.All || a.Sichtbarkeit.Value == AbsenceReasonVisibilityType.Customer).ToList() : new List<AbsenceReasonDC>();
if (Model.CustomerSessionModel.SelectedAbsenceTimeOid.HasValue && Model.SelectedCustomer != null)
if(Model.CustomerSessionModel.SelectedAbsenceTimeOid.HasValue && Model.SelectedCustomer != null)
{
Model.SelectedAbsenceTime = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Value.Equals(Model.CustomerSessionModel.SelectedAbsenceTimeOid.Value));
}
ReloadBargeldkassen();
if (Model.CustomerSessionModel.SelectedBargeldkasseOid.HasValue && Model.Bargeldkassen != null)
if(Model.CustomerSessionModel.SelectedBargeldkasseOid.HasValue && Model.Bargeldkassen != null)
{
Model.SelectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(Model.CustomerSessionModel.SelectedBargeldkasseOid.Value));
}
if (Model.CustomerSessionModel.SelectedBargeldtransaktionOid.HasValue)
if(Model.CustomerSessionModel.SelectedBargeldtransaktionOid.HasValue)
{
var kassenbuch = GetBargeldkasseByTransaktionsOid(Model.CustomerSessionModel.SelectedBargeldtransaktionOid.Value);
@@ -146,17 +144,11 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedBargeldtransaktion = zahlung;
}
if (Model.SelectedCustomer != null)
if(Model.SelectedCustomer != null)
{
Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomer.CustomerOid.Value);
Model.ICD10Diagnosen = OperationsService.GetDiagiosisStringsForICD10Codes(Model.SelectedCustomer.ICD10DiagnosisCodes);
}
var customerFilter = MobileUserSettingsUtils.GetSettingValueAsEnum(Model.UserSettings, SettingsKeys.CustomerFilterCustomers, CustomerFilterEnum.MyCustomer);
Model.SelectedCustomerFilter = customerFilter;
}
private void LoadCustomerToModel(long? customerOid)
@@ -166,29 +158,17 @@ namespace BeWoPlanerMobil.Controllers
return;
}
if (customerOid == -1)
if(customerOid == -1)
{
Model.CustomerSessionModel.ResetValues();
//Model.SelectedCustomer = null;
//Model.SelectedCustomerOid = null;
//Model.SelectedAbsenceTimeOid = null;
//Model.SelectedAbsenceReason = null;
//Model.FolderTree = null;
//Model.ICD10Diagnosen = null;
//Model.Bargeldkassen = new List<BargeldkassenDC>();
//Model.BargeldtransaktionshistoryEntries = new List<BargeldtransaktionshistoryDC>();
//Model.TransaktionsOid2HasHistoryEntries = new Dictionary<long, bool>();
//Model.SelectedBargeldtransaktion = null;
}
else
{
if (Model.SelectedCustomerOid.HasValue && Model.SelectedCustomerOid != customerOid)
if(Model.SelectedCustomerOid.HasValue && Model.SelectedCustomerOid != customerOid)
{
Model.CustomerSessionModel.ResetValues();
}
Model.SelectedCustomerOid = customerOid;
}
}
@@ -240,6 +220,8 @@ namespace BeWoPlanerMobil.Controllers
UpdateApplicationSettings(SettingsKeys.CustomerFilterCustomers, customerFilter.ToString());
Model.SelectedCustomerFilter = customerFilter;
return RedirectToActionPermanent("Customer");
}

View File

@@ -1142,15 +1142,15 @@ namespace BeWoPlanerMobil.Controllers
var serviceRecord = GetServiceRecordDC(serviceRecordOid, false);
if (serviceRecordOid < 1 || serviceRecord is null)
if(serviceRecordOid < 1 || serviceRecord is null)
{
var message2Log = string.Empty;
if (serviceRecordOid < 1)
if(serviceRecordOid < 1)
{
message2Log = $"Einzelunterschrift konnte nicht gespeichert werden, da die ServiceRecordOid {serviceRecordOid} ungültig ist.";
}
else if (serviceRecord is null)
else if(serviceRecord is null)
{
message2Log = "Einzelunterschrift konnte nicht gespeichert werden, da der Zeiterfassungseintrag im Model nicht gefunden werden konnte.";
}
@@ -1163,11 +1163,11 @@ namespace BeWoPlanerMobil.Controllers
long? oid;
using (var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1]))
using(var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1]))
{
var isValid = SignatureUtils.ValidateSignature(signatureBitmap);
if (!isValid)
if(!isValid)
{
TempData[TempDataConstants.ErrorMessageKey] = "Das Unterschriftenfeld darf nicht leer sein.";
return RedirectToActionPermanent("Main", "Main");
@@ -1181,7 +1181,7 @@ namespace BeWoPlanerMobil.Controllers
}).SignatureOid;
}
if (oid is null)
if(oid is null)
{
TempData[TempDataConstants.ErrorMessageKey] = "Beim Speichern der Unterschrift ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator.";
}
@@ -1190,11 +1190,10 @@ namespace BeWoPlanerMobil.Controllers
TempData[TempDataConstants.InfoMessageKey] = $"Die Unterschrift von {serviceRecord.Customer} für den Eintrag vom {MainModel.GetServiceRecordTimeHeader(serviceRecord, false)} wurde erfolgreich gespeichert.";
}
}
catch (Exception ex)
catch(Exception ex)
{
Log.Error("Fehler beim Speichern der Einzelunterschrift: " + ex.Message, ex);
}
return RedirectToActionPermanent("Main", "Main");
}

View File

@@ -11,7 +11,7 @@ using DevExpress.XtraReports.UI;
namespace BeWoPlanerMobil.Models
{
public class CustomerModel : AbstractModel, ISignaturePopup
public class CustomerModel : AbstractModel, ISignable
{
public CustomerModel()
{

View File

@@ -15,7 +15,7 @@ using System.Web.Mvc;
namespace BeWoPlanerMobil.Models
{
public class MainModel : AbstractModel, ISignaturePopup
public class MainModel : AbstractModel, ISignable
{
protected static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

View File

@@ -16,7 +16,7 @@ using System.Web.Mvc;
namespace BeWoPlanerMobil.Models
{
public class ReportModel : AbstractModel, ISignaturePopup
public class ReportModel : AbstractModel, ISignable
{
public ReportModel()
{

View File

@@ -0,0 +1,12 @@
using System.Web.Mvc;
using BS.Shared;
namespace BeWoPlanerMobil.Util
{
internal interface ISignable
{
string SignaturePopupTitle { get; set; }
//ActionResult SaveSignature(object blob, long objectOid, long objectTid, SignatureTable signatureTable);
}
}

View File

@@ -1,7 +0,0 @@
namespace BeWoPlanerMobil.Util
{
internal interface ISignaturePopup
{
string SignaturePopupTitle { get; set; }
}
}

View File

@@ -70,10 +70,13 @@
}
function showNewSignaturePopup(serviceRecordOid) {
showSpinner();
showSpinner();
$(`#single-signature-popup-container`).load(
"@Url.Action("GetSingleSignatureInfo")",
{serviceRecordOid: serviceRecordOid},
{
serviceRecordOid: serviceRecordOid
},
() => {
initializeSignatureCanvas(serviceRecordOid);
hideSpinner();

View File

@@ -2,14 +2,24 @@
@model BeWoPlanerMobil.Models.MainModel
<script type="text/javascript">
@*
Benötigt: SketchPad-Id, SketchPad-Container-Id
*@
$(document).ready(() => {
updateSingleSignatureCanvas("single-signature-canvas-row", "single-signature-sketch-pad");
});
@*
Benötigt: SketchPad-Container-Id, SketchPad-Id
*@
$(window).resize(() => {
updateSingleSignatureCanvas("single-signature-canvas-row", "single-signature-sketch-pad");
});
@*
Benötigt: SketchPad-Id, SketchPad-Container-Id
*@
function updateSingleSignatureCanvas(canvasContainerId, canvasId) {
const containerWidth = $(`#${canvasContainerId}`).innerWidth();
const sourceCanvas = document.getElementById(canvasId);
@@ -58,53 +68,54 @@
img.src = trimmedCanvas.toDataURL();
}
@*
Benötigt: ServiceRecord-Oid, Modal-Id, SketchPad-Container-Id, Ok-Button-Id, Neu-Button-Id, Abbrechen-Button-Id
*@
function initializeSignatureCanvas(serviceRecordOid) {
hideSpinner();
$.get(
"@Url.Action("GetSelectedRecordInformationWithOid")",
{
oid: serviceRecordOid
},
() => {
$("#single-signature-modal").modal("show");
$("#single-signature-modal").modal("show");
updateSingleSignatureCanvas("single-signature-canvas-row", "single-signature-sketch-pad");
updateSingleSignatureCanvas("single-signature-canvas-row", "single-signature-sketch-pad");
const canvas = document.getElementById("single-signature-sketch-pad");
const signaturePad = new SignaturePad(canvas, {backgroundColor: "rgba(255, 255, 255, 0)"});
const canvas = document.getElementById("single-signature-sketch-pad");
const signaturePad = new SignaturePad(canvas, {backgroundColor: "rgba(255, 255, 255, 0)"});
const saveButton = document.getElementById("single-signature-ok-btn");
const clearButton = document.getElementById("single-signature-clear-btn");
const closeButton = document.getElementById("single-signature-cancel-btn");
const saveButton = document.getElementById("single-signature-ok-btn");
const clearButton = document.getElementById("single-signature-clear-btn");
const closeButton = document.getElementById("single-signature-cancel-btn");
const saveButtonClone = saveButton.cloneNode(true);
const clearButtonClone = clearButton.cloneNode(true);
const closeButtonClone = closeButton.cloneNode(true);
const saveButtonClone = saveButton.cloneNode(true);
const clearButtonClone = clearButton.cloneNode(true);
const closeButtonClone = closeButton.cloneNode(true);
saveButton.parentNode.replaceChild(saveButtonClone, saveButton);
clearButton.parentNode.replaceChild(clearButtonClone, clearButton);
closeButton.parentNode.replaceChild(closeButtonClone, closeButton);
saveButton.parentNode.replaceChild(saveButtonClone, saveButton);
clearButton.parentNode.replaceChild(clearButtonClone, clearButton);
closeButton.parentNode.replaceChild(closeButtonClone, closeButton);
function saveBtnListener(event) {
singleSignatureSaveButtonEvent(serviceRecordOid);
}
function saveBtnListener(event) {
singleSignatureSaveButtonEvent(serviceRecordOid);
}
function clearBtnListener(event) {
singleSignatureClearButtonEvent(signaturePad);
}
function clearBtnListener(event) {
singleSignatureClearButtonEvent(signaturePad);
}
function closeBtnListener(event) {
singleSignatureCloseButtonEvent(signaturePad);
}
function closeBtnListener(event) {
singleSignatureCloseButtonEvent(signaturePad);
}
saveButtonClone.addEventListener("click", saveBtnListener);
clearButtonClone.addEventListener("click", clearBtnListener);
closeButtonClone.addEventListener("click", closeBtnListener);
});
saveButtonClone.addEventListener("click", saveBtnListener);
clearButtonClone.addEventListener("click", clearBtnListener);
closeButtonClone.addEventListener("click", closeBtnListener);
return;
}
function singleSignatureSaveButtonEvent(selectedServiceRecordOid) {
@*
Benötigt: sketchPad-Id, Form-Url, Container-Id, Modal-Id
*@
function singleSignatureSaveButtonEvent(selectedServiceRecordOid) {
const date = new Date();
const clonedCanvas = trimCanvas(cloneCanvas(document.getElementById("single-signature-sketch-pad")));
@@ -126,11 +137,11 @@
form.append(
$("<input>",
{
type: "hidden",
name: "@FormCollectionConstants.ServiceRecordSignatureBlobKey",
value: dataUrl
})
{
type: "hidden",
name: "@FormCollectionConstants.ServiceRecordSignatureBlobKey",
value: dataUrl
})
);
form.append($("<input>",
@@ -151,12 +162,15 @@
$("#sr-sg-container").append(form);
form.submit();
form.submit();
$("#single-signature-modal").modal("hide");
}
function singleSignatureCloseButtonEvent(signaturePad) {
@*
Benötigt: Modal-Id
*@
function singleSignatureCloseButtonEvent(signaturePad) {
$("#single-signature-modal").modal("hide");
signaturePad.clear();
@@ -164,7 +178,7 @@
return;
}
function singleSignatureClearButtonEvent(signaturePad) {
function singleSignatureClearButtonEvent(signaturePad) {
signaturePad.clear();
}
</script>
@@ -180,8 +194,11 @@
}
else
{
@*
ToDo: Über Klasse statt Id lösen?
*@
<script type="text/javascript">
$("#single-signature-modal").modal("show");
$("#single-signature-modal").modal("show");
</script>
var nameAndDateOfBirth = Model.SelectedSupportConceptListObject?.NameAndDateOfBirth ?? string.Empty;