Gruppenbuchung im Mobilklienten -> Validierung serverseitig fertig. Die Meldungen im JavaScript müssen noch angepasst werden.

This commit is contained in:
Lyndon Jetten
2018-11-30 16:47:57 -04:00
parent 78492b8edc
commit f49f833db3
9 changed files with 388 additions and 218 deletions

View File

@@ -80,6 +80,7 @@
<Reference Include="System.Web" />
<Reference Include="System.Web.Abstractions" />
<Reference Include="System.Web.Routing" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
@@ -176,8 +177,10 @@
</Compile>
<Compile Include="Util\JSONCustomer.cs" />
<Compile Include="Util\MobileUtils.cs" />
<Compile Include="Util\ServiceRecord2Validation.cs" />
<Compile Include="Util\TextbausteinDisplayItem.cs" />
<Compile Include="Util\Umfeldsperson.cs" />
<Compile Include="Util\ValidationResult.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Content\BeWoMobileStyle.css" />

View File

@@ -4,7 +4,7 @@ using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.ServiceImplementations;
using BeWoPlanerMobil.Models;
@@ -23,6 +23,7 @@ using BS.Shared.Services;
using DevExpress.XtraScheduler;
using DevExpress.XtraScheduler.Compatibility;
using ServiceRecordDC = BS.Shared.DataContracts.ServiceRecordDC;
namespace BeWoPlanerMobil.Controllers
{
@@ -623,23 +624,22 @@ namespace BeWoPlanerMobil.Controllers
}
}
public void SetSaveSignature(bool save)
public string SetSaveSignature(bool save)
{
try
{
if (Model == null)
{
SerializeObject("SessionTimeout");
}
else
{
Model.SaveSignature = save;
return SerializeObject("SessionTimeout");
}
Model.SaveSignature = save;
return " ";
}
catch (Exception e)
{
log.Error(e.Message, e);
SerializeObject("Fehler 777: Fail Error Compilation");
return SerializeObject("Fehler 777: Fail Error Compilation");
}
}
@@ -1137,8 +1137,8 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedSupportConcepts = new List<SupportConceptDC>();
Model.SelectedEmployees = new List<CompactEmployeeDC>();
//TODO: Die Dauer neuberechnen und die einzelnen ServiceRecords an die Änderungen, die gemacht wurden, anpassen. (Model.SelectedServiceRecord)
//TODO: Fast alle Eigenschaften von Model.NewServiceRecord kopieren
ResetGroupBookingMode(false);
Model.IsInEditingMode = false;
return RedirectToActionPermanent("Main");
}
@@ -1621,13 +1621,15 @@ namespace BeWoPlanerMobil.Controllers
[HttpPost]
[Authorize]
public ActionResult DeleteServiceRecord()
public ActionResult DeleteServiceRecord(FormCollection formCollection)
{
if (Model == null)
{
return RedirectToActionPermanent("Index", "Login");
}
Model.ServiceRecordOidToDelete = long.Parse(formCollection["serviceRecordOidHolder"]);
if (Model.ServiceRecordOidToDelete != null && Model.ServiceRecordOidToDelete > 0 && MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecordView_Delete))))
{
var serviceRecordDC = Model.ServiceRecords.FirstOrDefault(f => f.ServiceRecordOid != null && f.ServiceRecordOid.Value.Equals(Model.ServiceRecordOidToDelete));
@@ -1641,6 +1643,8 @@ namespace BeWoPlanerMobil.Controllers
}
}
ResetGroupBookingMode(false);
return RedirectToActionPermanent("Main");
}
@@ -1690,15 +1694,16 @@ namespace BeWoPlanerMobil.Controllers
}
}
public void SetServiceDescription(long pServiceDescriptionOid)
public string SetServiceDescription(long pServiceDescriptionOid)
{
if (Model == null)
{
RedirectToActionPermanent("Index", "Login");
return;
return " ";
}
Model.SelectedServiceDescriptionOid = pServiceDescriptionOid;
return " ";
}
[HttpPost]
@@ -1789,6 +1794,9 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedServiceRecord = serviceRecord;
Model.SelectedSupportConcepts.Clear();
Model.SelectedEmployees.Clear();
Model.SelectedCostbearerRelOids.Clear();
var relationOids = new List<long>();
if (serviceRecord?.GroupOid != null)
{
@@ -1797,7 +1805,7 @@ namespace BeWoPlanerMobil.Controllers
if(serviceRecordGroup != null)
{
employees.AddRangeIfElementsNotIn(serviceRecordGroup.ServiceRecordList.Select(s => s.Employee));
var relationOids = serviceRecordGroup.ServiceRecordList.Select(s => s.CostBearer2SupportConceptOid.Value).ToList();
relationOids = serviceRecordGroup.ServiceRecordList.Select(s => s.CostBearer2SupportConceptOid.Value).ToList();
var costBearerRelations = CustomerService.GetSupportConceptCostBearerRelationsById(relationOids);
foreach(var rel in costBearerRelations)
@@ -1812,12 +1820,12 @@ namespace BeWoPlanerMobil.Controllers
}
}
}
Model.SelectedCostbearerRelOids.AddRangeIfElementsNotIn(relationOids);
Model.SelectedSupportConcepts = supportConcepts;
Model.SelectedEmployees = employees;
// TODO: Wie bei SetGroupBooking
//LoadServiceCategoriesForGroupBooking();
Model.ServiceCategories = CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions());
return RedirectToActionPermanent("Main");
@@ -1923,11 +1931,11 @@ namespace BeWoPlanerMobil.Controllers
checkSR.ServiceDescription = OperationsService.GetServiceDescription(Model.SelectedServiceDescriptionOid.Value);
var man = OperationsService.GetMandator();
var s = man.Settings ?? string.Empty;
var einzeln = s.Split(';');
var g = einzeln.ToList().FirstOrDefault(f => f.Contains("MaxDaysEditServiceRecordsAllowed"));
var t = g != null ? int.Parse(g.Split('=')[1]) : 0;
var mandator = OperationsService.GetMandator();
var settings = mandator.Settings ?? string.Empty;
var splitSettings = settings.Split(';');
var maxDaysEditSRsAllowedSetting = splitSettings.ToList().FirstOrDefault(f => f.Contains("MaxDaysEditServiceRecordsAllowed"));
var maxDaysEditSRsAllowed = maxDaysEditSRsAllowedSetting != null ? int.Parse(maxDaysEditSRsAllowedSetting.Split('=')[1]) : 0;
SupportConceptStatisticsDC stats = null;
@@ -1936,21 +1944,69 @@ namespace BeWoPlanerMobil.Controllers
stats = OperationsService.CreateSupportConceptStatistics(Model.CostBearer2SupportConceptOid.Value, DateTime.Now);
}
var result = OperationsService.ValidateServiceRecordEntry(checkSR, stats, t, false, new List<long> { checkSR.Employee.EmployeeOid });
var valStruct = new ValidationStruct
{
ValidationResults = result,
Rights = new Dictionary<int, bool>(),
MaxDaysEditServiceRecordsAllowed = t.ToString()
};
var employees = new List<long> {checkSR.Employee.EmployeeOid};
valStruct.Rights.Add(0, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecord_AllowCreateOverlappingFLS))));
valStruct.Rights.Add(1, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecord_AllowCreateMoreFLSThanApproved))));
valStruct.Rights.Add(2, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.BookServiceRecordAfterSettlementInvoice))));
var newResult = new ValidationResult();
//if (checkSR.GroupOid.HasValue)
if(Model.IsInGroupBookingMode)
{
if (checkSR.GroupOid.HasValue)
{
var serviceRecordGroup = OperationsService.GetServiceRecordGroup(checkSR.GroupOid.Value);
serviceRecordGroup.ServiceRecordList.DoForEach(sr => employees.AddIfNotIn(sr.Employee.EmployeeOid));
}
else
{
Model.SelectedEmployees.DoForEach(e => employees.AddIfNotIn(e.EmployeeOid));
}
var cb2scOids = (from scDc in Model.SelectedSupportConcepts where scDc.CostBearerRelations != null && scDc.CostBearerRelations.Count > 0 select scDc.CostBearerRelations[0].CostBearer2SupportConceptOid.Value).ToList();
var nodes = new List<FlatSupportConceptTreeNodeDC>();
foreach (var sc in CustomerService.LoadCompactSupportConceptsById(Model.SelectedSupportConcepts.Select(s => s.SupportConceptOid.Value)))
{
nodes.Add(CreateFlatSupportConceptItem(sc, null));
}
foreach (var node in nodes)
{
if (node?.SupportConceptTreeNodeDC != null)
{
var scDc = node.SupportConceptTreeNodeDC.SupportConcept;
var cbDc = node.SupportConceptTreeNodeDC.CostBearer;
var relDc = node.SupportConceptTreeNodeDC.SupportConceptCostBearerRelDC;
checkSR.SupportConcept = scDc;
checkSR.CostBearer = cbDc;
if (relDc != null)
{
checkSR.CostBearer2SupportConceptOid = relDc.CostBearer2SupportConceptOid;
}
}
var result = OperationsService.ValidateServiceRecord(checkSR, stats, maxDaysEditSRsAllowed, employees, cb2scOids);
newResult.ServiceRecord2Validations.Add(new ServiceRecord2Validation(checkSR, result));
}
}
else
{
var result = OperationsService.ValidateServiceRecordEntry(checkSR, stats, maxDaysEditSRsAllowed, checkSR.GroupOid.HasValue, employees);
newResult.ServiceRecord2Validations.Add(new ServiceRecord2Validation(checkSR, result));
}
newResult.Rights = new Dictionary<int, bool>();
newResult.MaxDaysEditServiceRecordsAllowed = maxDaysEditSRsAllowed.ToString();
newResult.Rights.Add(0, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecord_AllowCreateOverlappingFLS))));
newResult.Rights.Add(1, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecord_AllowCreateMoreFLSThanApproved))));
newResult.Rights.Add(2, MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.BookServiceRecordAfterSettlementInvoice))));
Model.NewServiceRecord = new ServiceRecordDC();
return SerializeObject(valStruct);
return SerializeObject(newResult);
}
public bool CheckRightsAfterCrash(string von, string bis, bool inEditMode, string dateString, string startString, string endString, long costbearerOId, string leistung)
@@ -2074,13 +2130,6 @@ namespace BeWoPlanerMobil.Controllers
return true;
}
private struct ValidationStruct
{
public List<ServiceRecordValidationResultDC> ValidationResults { get; set; }
public Dictionary<int, bool> Rights { get; set; }
public string MaxDaysEditServiceRecordsAllowed { get; set; }
}
public void SetViewMode()
{
if (Model == null)
@@ -2170,22 +2219,48 @@ namespace BeWoPlanerMobil.Controllers
{
var isInGroupBookingMode = "true,false" == pFormCollection["IsInGroupBookingMode"];
Model.IsInGroupBookingMode = isInGroupBookingMode;
ResetGroupBookingMode(isInGroupBookingMode);
if(isInGroupBookingMode)
return RedirectToAction("Main");
}
private void ResetGroupBookingMode(bool pIsInGroupBookingMode)
{
Model.IsInGroupBookingMode = pIsInGroupBookingMode;
if (pIsInGroupBookingMode)
{
Model.SelectedSupportConcept = null;
Model.SelectedEmployee = null;
Model.SelectedEmployeeOid = null;
Model.ServiceCategories = CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions());
Model.SelectedEmployees.Add(MobileSessionFacade.LoggedInCompactEmployee);
}
else
{
Model.ServiceCategories.Clear();
}
Model.SelectedCostbearerRelOids.Clear();
Model.SelectedEmployees.Clear();
Model.SelectedSupportConcepts.Clear();
return RedirectToAction("Main");
if (Model.SelectedSupportConcept != null)
{
var details = OperationsService.GetSupportConceptTreeNodeDetailInfo(Model.SelectedSupportConcept.Customer.CustomerOid, Model.SelectedSupportConcept.SupportConceptOid, Model.CostBearer2SupportConceptOid);
Model.ServiceCategories = details.ServiceAccountings.Count > 0
? CreateServiceCategoryModels(details.ServiceAccountings.Select(sa => sa.ServiceDescription).ToList())
: CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions());
Model.ServiceCategories = Model.ServiceCategories.Where(c => !c.OhneHilfeplan.HasValue || c.OhneHilfeplan.Value == AccountingvisibilityType.Beides || c.OhneHilfeplan.Value == AccountingvisibilityType.NurKlientenbezogen).ToList();
}
else if (Model.CostBearer2SupportConceptOid == -2)
{
Model.ServiceCategories = CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions());
Model.ServiceCategories = Model.ServiceCategories.Where(c => !c.OhneHilfeplan.HasValue || c.OhneHilfeplan.Value == AccountingvisibilityType.Beides || c.OhneHilfeplan.Value == AccountingvisibilityType.NichtKlientenbezogen).ToList();
}
}
}
[HttpPost]
@@ -2204,6 +2279,11 @@ namespace BeWoPlanerMobil.Controllers
public string LoadCategoryAndDescription()
{
if (Model.SelectedServiceRecord == null)
{
return null;
}
var serviceDescriptionOid = Model.SelectedServiceRecord.ServiceDescription.ServiceDescriptionOid.ToString();
var serviceCategoryOid = Model.SelectedServiceRecord.ServiceDescription.Category.ServiceCategoryOid.ToString();
@@ -2297,5 +2377,16 @@ namespace BeWoPlanerMobil.Controllers
return RedirectToAction("Main");
}
[Authorize]
public string ResetGroupBookingModeViaGET()
{
Model.IsInGroupBookingMode = false;
Model.SelectedCostbearerRelOids.Clear();
Model.SelectedEmployees.Clear();
Model.SelectedSupportConcepts.Clear();
return MainModel.IsEmployeeSelectionVisible.ToString();
}
}
}

View File

@@ -150,29 +150,6 @@ namespace BeWoPlanerMobil.Models
}
}
// TODO: KGW?
//public IEnumerable<SelectListItem> SelectedSupportConceptListItemsForGroupBooking
//{
// get
// {
// var selectedSCs = new List<SelectListItem>();
// if(SelectedSupportConcepts != null)
// {
// foreach(var sc in SelectedSupportConcepts.OrderBy(sc => sc.Customer.LastName))
// {
// selectedSCs.AddRange(sc.CostBearerRelations.Where(w => ShowExpiredSupportConcepts || w.EndDate == null || w.EndDate.Value >= DateTime.Now).Select(cb => new SelectListItem
// {
// Value = cb.CostBearer2SupportConceptOid.ToString(),
// Text = $"{sc.Customer.LastNameFirstName} | {cb.StartDate?.ToShortDateString().Remove(6, 2) ?? string.Empty}-{cb.EndDate?.ToShortDateString().Remove(6, 2) ?? string.Empty} {cb.CostBearer.Name}"
// }));
// }
// }
// return selectedSCs;
// }
//}
public IEnumerable<SelectListItem> ServiceCategoryListItems
{
get
@@ -199,26 +176,6 @@ namespace BeWoPlanerMobil.Models
}
}
// TODO: KGW?
// [Display(Name = "Textbaustein")]
// public long? SelectedTextbausteinOid { get; set; }
// TODO: KGW?
//public IEnumerable<SelectListItem> TextbausteinListItems
//{
// get
// {
// var result = new List<SelectListItem>();
// if (Textbausteine != null)
// {
// result.AddRange(Textbausteine.Select(item => new SelectListItem { Value = item.TextModuleOid.Value.ToString(), Text = item.Name }).ToList());
// }
// return result;
// }
//}
public List<CompactCustomerDC> Customers { get; set; }
public List<CompactEmployeeDC> Employees { get; set; }
@@ -252,10 +209,6 @@ namespace BeWoPlanerMobil.Models
public List<long> SelectedGroupOfPeopleOids { get; set; } = new List<long>();
// TODO: KGW
//[Display(Name = "Gruppen")]
//public string SelectedGroupInfo { get; set; }
public IEnumerable<SelectListItem> EmployeeListItems
{
get
@@ -292,16 +245,13 @@ namespace BeWoPlanerMobil.Models
public List<CompactEmployeeDC> SelectedEmployees { get; set; } = new List<CompactEmployeeDC>();
// TODO: KGW
//public List<long> SelectedCostbearer2SupportConceptOids { get; set; } = new List<long>();
[Display(Name = "Gruppenbuchung")]
public bool IsInGroupBookingMode
{
//get => _IsInGroupBookingMode;
get => false;
get => _IsInGroupBookingMode;
//get => false;
set
set
{
_IsInGroupBookingMode = value;

View File

@@ -170,10 +170,6 @@ function initBeWoMobile(actionPath) {
var value = (supportConceptTableHasEntries === 0 || employeesTableHasEntries === 0) ? false : true;
$("#anlegenEditierenBtn").prop("disabled", value);
hideElement($("#selectSCForm"));
} else {
showElement($("#selectSCForm"));
}
} catch(err) {
console.log('Fehler: ' + err.message);

View File

@@ -21,7 +21,7 @@ function buildCollapsibleSet(jsonString) {
actuallyBuildCollapsibleSet(kollektion, null);
} catch(exception) {
console.log('Fehler(BuildCollapsibleSet): ' + exception.message);
console.log("Fehler(BuildCollapsibleSet): " + exception.message);
}
}
@@ -66,9 +66,6 @@ function buildGoalTreeItem(goalItem, selectedGoalOids) {
collapsibleHtml += '<div style="margin-right: 0; padding-right: 0;display: block;"><input type="checkbox" style="width: auto;" onclick="updateGoals(' + goalOid + ')" id="' + goalOid + '" value="' + goalHeader + '" ' + isChecked + ' />' + goalHeader + '</div>';
}
}
function loadGoalsOnSuccess(json) {
@@ -132,7 +129,7 @@ function showAjaxError(jqXHR, textStatus, errorThrown) {
//else
if(jqXHR.status === 0) {
console.log("status is 0; ajax call aborted");
console.log("status is 0; ajax call aborted.\nError thrown: " + errorThrown + ";\nText status: " + textStatus);
return;
}
@@ -340,6 +337,28 @@ function selectServiceRecord(oid) {
$("#abbrechenBtn").prop("disabled", false);
if (isInGroupBookingMode()) {
$("#changeBookingModeCheckBox").prop("checked", false);
console.log("Gruppenbuchungsmodus abgewählt");
makeAjaxCall("GET", window.resetGroupBookingModeViaGETUrl, function (result) {
$("#changeBookingModeCheckBox").prop("checked", false);
$("#leftContent input[type=checkbox]").prop("checked", false);
$("#rightContent input[type=checkbox]").prop("checked", false);
$("#employeeCollapsible input[type=checkbox]").prop("checked", false);
showElement($("#selectSCForm"));
if (result === "True") {
showElement($("#singleSCEmployeeSelectionContainer"));
}
hideElement($("#groupBookingOpenPopupBtn"));
hideElement($("#groupBookingOpenEmployeeSelectionPopupBtn"));
}, null, null);
}
hideSanduhr();
},
error: showErrorMsg,
@@ -385,6 +404,12 @@ function resetRecordForm() {
clearZED();
if (isInGroupBookingMode()) {
$("#changeBookingModeCheckBox").prop("checked", false);
showSanduhr();
$("#groupBookingForm").submit();
}
$("#start_textbox").val("").trigger("change");
$("#ende_textbox").val("").trigger("change");
$("#notiz_textbox").val("").trigger("change");
@@ -403,7 +428,7 @@ function resetRecordForm() {
var selectedCategory = $("#kategorien_select").find(":selected").val();
if(isInEditingMode()) {
makeAjaxCall("POST", resetEditingModeUrl, function(response) { window.location.reload(); }, { pFormCollection: null }, null);
makeAjaxCall("POST", window.resetEditingModeUrl, function(response) { window.location.reload(); }, { pFormCollection: null }, null);
}
$.ajax({
@@ -471,9 +496,8 @@ function validateTimeField(id) {
}
}
recordToDelete = 0;
function togglePopup(serviceRecordOid) {
window.recordToDelete = serviceRecordOid;
$("#oidHolder").val(serviceRecordOid);
var isShowing = $(".modalWrapper").css("display") === "none";
var displayValue = $(".modalWrapper").css("display") === "block" ? "none" : "block";
@@ -505,25 +529,6 @@ function toggleModalWrapper() {
$(".modalWrapper").css("height", $(document).height());
}
$(function () {
$("#deletionForm").submit(function () {
$.ajax({
type: "GET",
url: setRecordForDeletionUrl,
data: { serviceRecordOid: recordToDelete },
success: function () {
return true;
},
error: function () {
showAjaxError();
return false;
}
});
return true;
});
});
function validateServiceRecordBeforeSubmit() {
function getLocation() {
if (navigator.geolocation) {
@@ -566,8 +571,10 @@ function validateServiceRecordBeforeSubmit() {
}
var meldungen = $.parseJSON(json);
console.log(meldungen);
var results = meldungen.ValidationResults;
var relations = meldungen.ServiceRecord2Validations;
var results = null;
var allowOverlappingFLS = false;
var allowMoreFLSThanApproved = false;
var bookAfterSettlementInvoice = false;
@@ -591,83 +598,90 @@ function validateServiceRecordBeforeSubmit() {
}
});
var exitLoop = false;
for (var i = 0; i < results.length; i++) {
if (exitLoop)
break;
switch (results[i].ResultType) {
case 0:
var msg1 = 'An dem gewählten Datum \'' + vonDatum + '\' existiert bereits ein Eintrag (' + results[i].Message + ' bei Klient/in ' + results[i].CustomerName + '). Speichern nicht möglich.';
if (allowOverlappingFLS === true) {
var r = confirm('An dem gewählten Datum \'' + vonDatum + '\' existiert bereits ein Eintrag (' + results[i].Message + ' bei Klient/in ' + results[i].CustomerName + '). Möchten Sie trotzdem speichern?');
isValidRecord = r;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg1);
isValidRecord = false;
exitLoop = true;
}
break;
case 1:
var msg2 = 'An dem gewählten Datum ' + vonDatum + ' existiert bereits ein Eintrag für den ausgewählten Mitarbeiter(' + results[i].EmployeeName + '). Speichern nicht möglich.';
if (allowOverlappingFLS === true) {
var r2 = confirm('An dem gewählten Datum ' + vonDatum + ' existiert bereits ein Eintrag für den ausgewählten Mitarbeiter(' + results[i].EmployeeName + '). Möchten Sie trotzdem speichern?');
isValidRecord = r2;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg2);
isValidRecord = false;
exitLoop = true;
}
break;
case 2:
writeFatalErrorMessage('Das gewählte Datum ' + vonDatum.slice(0, 10) + ' liegt außerhalb des Zeitraumes des gewählten Hilfeplans. Speichern nicht möglich.');
isValidRecord = false;
exitLoop = true;
break;
case 3:
var msg3 = 'Die für diesen Hilfeplan genehmigten FLS (' + results[i].ApprovedHours + ') werden mit diesem Eintrag überschritten. (' + results[i].HoursNew + ').';
if (allowMoreFLSThanApproved === true) {
var r3 = confirm(msg3 + " Möchten Sie trotzdem speichern?");
isValidRecord = r3;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg3);
isValidRecord = false;
exitLoop = true;
for (var j = 0; j < relations.length; j++) {
results = relations[j].ValidationResults;
var exitLoop = false;
for (var i = 0; i < results.length; i++) {
if (exitLoop) {
break;
}
break;
case 4:
writeFatalErrorMessage('Sie können keine neuen Leistungen für den ' + vonDatum + ' dokumentieren, da bereits der ' + meldungen.MaxDaysEditServiceRecordsAllowed + '. des nachfolgenden Monats überschritten ist.');
isValidRecord = false;
exitLoop = true;
break;
case 5:
writeFatalErrorMessage("Beim Speichern ist ein Fehler aufgetreten. Speichern nicht möglich.");
isValidRecord = false;
exitLoop = true;
break;
case 6:
var msg6 = "Es existiert bereits eine Spitzabrechnung. Um diesen Eintrag zu berücksichtigen, muss eventuell eine neue Spitzabrechnung erstellt werden. Das Speichern ist nicht möglich.";
if (bookAfterSettlementInvoice === true) {
msg6 = "Sie können den Eintrag nicht bearbeiten, da bereits eine Spitzabrechnung für diesen Hilfeplan erstellt wurde. Speichern nicht möglich.";
switch (results[i].ResultType) {
case 0:
var msg1 = 'An dem gewählten Datum \'' + vonDatum + '\' existiert bereits ein Eintrag (' + results[i].Message + ' bei Klient/in ' + results[i].CustomerName + '). Speichern nicht möglich.';
if (allowOverlappingFLS === true) {
var r = confirm('An dem gewählten Datum \'' + vonDatum + '\' existiert bereits ein Eintrag (' + results[i].Message + ' bei Klient/in ' + results[i].CustomerName + '). Möchten Sie trotzdem speichern?');
isValidRecord = r;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg1);
isValidRecord = false;
exitLoop = true;
}
break;
case 1:
var msg2 = 'An dem gewählten Datum ' + vonDatum + ' existiert bereits ein Eintrag für den ausgewählten Mitarbeiter(' + results[i].EmployeeName + '). Speichern nicht möglich.';
if (allowOverlappingFLS === true) {
var r2 = confirm('An dem gewählten Datum ' + vonDatum + ' existiert bereits ein Eintrag für den ausgewählten Mitarbeiter(' + results[i].EmployeeName + '). Möchten Sie trotzdem speichern?');
isValidRecord = r2;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg2);
isValidRecord = false;
exitLoop = true;
}
break;
case 2:
writeFatalErrorMessage('Das gewählte Datum ' + vonDatum.slice(0, 10) + ' liegt außerhalb des Zeitraumes des gewählten Hilfeplans. Speichern nicht möglich.');
isValidRecord = false;
exitLoop = true;
break;
case 3:
var msg3 = 'Die für diesen Hilfeplan genehmigten FLS (' + results[i].ApprovedHours + ') werden mit diesem Eintrag überschritten. (' + results[i].HoursNew + ').';
if (allowMoreFLSThanApproved === true) {
var r3 = confirm(msg3 + " Möchten Sie trotzdem speichern?");
isValidRecord = r3;
exitLoop = !isValidRecord;
} else {
writeFatalErrorMessage(msg3);
isValidRecord = false;
exitLoop = true;
}
break;
case 4:
writeFatalErrorMessage('Sie können keine neuen Leistungen für den ' + vonDatum + ' dokumentieren, da bereits der ' + meldungen.MaxDaysEditServiceRecordsAllowed + '. des nachfolgenden Monats überschritten ist.');
isValidRecord = false;
exitLoop = true;
break;
case 5:
writeFatalErrorMessage("Beim Speichern ist ein Fehler aufgetreten. Speichern nicht möglich.");
isValidRecord = false;
exitLoop = true;
break;
case 6:
var msg6 = "Es existiert bereits eine Spitzabrechnung. Um diesen Eintrag zu berücksichtigen, muss eventuell eine neue Spitzabrechnung erstellt werden. Das Speichern ist nicht möglich.";
if (bookAfterSettlementInvoice === true) {
msg6 = "Sie können den Eintrag nicht bearbeiten, da bereits eine Spitzabrechnung für diesen Hilfeplan erstellt wurde. Speichern nicht möglich.";
}
writeFatalErrorMessage(msg6);
isValidRecord = false;
exitLoop = true;
break;
case 7:
var msg7 = "Sie können keine neuen Leistungen dokumentieren, da die Frist zur Bearbeitung abgelaufen ist. Das Speichern ist nicht möglich.";
writeFatalErrorMessage(msg7);
isValidRecord = false;
exitLoop = true;
break;
default:
writeFatalErrorMessage(results[i].Message);
isValidRecord = false;
exitLoop = true;
break;
}
writeFatalErrorMessage(msg6);
isValidRecord = false;
exitLoop = true;
break;
case 7:
var msg7 = "Sie können keine neuen Leistungen dokumentieren, da die Frist zur Bearbeitung abgelaufen ist. Das Speichern ist nicht möglich.";
writeFatalErrorMessage(msg7);
isValidRecord = false;
exitLoop = true;
break;
default:
writeFatalErrorMessage(results[i].Message);
isValidRecord = false;
exitLoop = true;
break;
}
}

View File

@@ -5,10 +5,11 @@ using System.Text.RegularExpressions;
using BeWoPlanerMobil.Models;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.XtraScheduler;
using DevExpress.XtraScheduler.UI;
using Newtonsoft.Json;
using static System.Int32;
@@ -261,5 +262,71 @@ namespace BeWoPlanerMobil.Util
return list;
}
public static FlatSupportConceptTreeNodeDC CreateFlatSupportConceptItem(CompactSupportConceptDC dc, CompactOrganisationDC orga)
{
var flatNode = new FlatSupportConceptTreeNodeDC();
if (dc != null)
{
var treeNode = new SupportConceptTreeNodeDC {SupportConcept = dc, Customer = dc.Customer};
if (dc.CostBearerList.Count > 0)
{
CompactCostBearerDC cbDC = null;
if (orga != null)
{
foreach (var item in dc.CostBearerList)
{
if (orga.Equals(item.Organisation))
{
cbDC = item;
}
}
}
if (cbDC == null)
cbDC = dc.CostBearerList[0];
var orgDC = new CompactOrganisationDC();
var relDC = new SupportConceptCostBearerRelDC();
orgDC.CostBearerID = cbDC.CostBearerID;
orgDC.CostBearerOid = cbDC.CostBearerOid;
var o = orga ?? cbDC.Organisation;
if (o != null)
{
orgDC.OrganisationOid = o.OrganisationOid;
orgDC.Name = o.Name;
orgDC.ActualHourlyRate = o.ActualHourlyRate;
orgDC.ActualMinuteIntervall = o.ActualMinuteIntervall;
orgDC.ActualRateFactor = o.ActualRateFactor;
orgDC.CostRatePeriods = o.CostRatePeriods;
orgDC.IsCalculatingWithFactor = o.IsCalculatingWithFactor;
}
relDC.ApprovedEndDate = cbDC.ApprovedEndDate;
relDC.ApprovedStartDate = cbDC.ApprovedStartDate;
relDC.CostBearer = orgDC;
relDC.CostBearer2SupportConceptOid = cbDC.CostBearer2SupportConceptOid;
relDC.RequestedEndDate = cbDC.RequestedEndDate;
relDC.RequestedStartDate = cbDC.RequestedStartDate;
relDC.Status = cbDC.SupportConceptStatus;
relDC.SupportConcept = dc;
relDC.AuswahlBezeichnung = cbDC.Bezeichnung;
treeNode.SupportConceptCostBearerRelDC = relDC;
treeNode.CostBearer = orgDC;
}
flatNode.SupportConceptTreeNodeDC = treeNode;
}
return flatNode;
}
}
}

View File

@@ -53,7 +53,7 @@
}
@* , new { style = "display: none;"} *@
@using (Html.BeginForm("SetGroupBookingMode", "Main", FormMethod.Post, new { style = "display: none;" }))
@using (Html.BeginForm("SetGroupBookingMode", "Main", FormMethod.Post, new {id = "groupBookingForm"}))
{
@Html.CheckBoxFor(m => m.IsInGroupBookingMode, new { onchange = "showSanduhr();this.form.submit();", id = "changeBookingModeCheckBox" })
@Html.LabelFor(m => m.IsInGroupBookingMode, new { id = "labelForChangeBookingModeCheckBox" })
@@ -69,8 +69,15 @@
};" />
<input id="groupBookingOpenEmployeeSelectionPopupBtn" type="button" value="Mitarbeiter" onclick="openEmployeePopup()" style="display: @if (Model.IsInGroupBookingMode) { @Html.Raw("block") } else { @Html.Raw("none") };" />
@{
var shouldShowSingleBookingElements = "display: block";
@using (Html.BeginForm("SelectSupportConcept", "Main", FormMethod.Post, new { id = "selectSCForm" }))
if (Model.IsInGroupBookingMode)
{
shouldShowSingleBookingElements = "display: none";
}
}
@using (Html.BeginForm("SelectSupportConcept", "Main", FormMethod.Post, new { id = "selectSCForm", style= shouldShowSingleBookingElements }))
{
<table>
<tr>
@@ -88,8 +95,15 @@
</tr>
</table>
}
<div class="combobox-label-parent" style="@{ if(!MainModel.IsEmployeeSelectionVisible || Model.IsInGroupBookingMode) { @Html.Raw("display: none;") }}" id="singleSCEmployeeSelectionContainer">
@Html.LabelFor(m => m.SelectedEmployeeOid)
<div class="styled-select-div">
@Html.DropDownListFor(m => m.SelectedEmployeeOid, Model.EmployeeListItems, new { onchange = "setSelectedEmployee()", id = "employeesDropDown", @class = "dropdownlist-for" })
</div>
</div>
<div @{if (!MainModel.IsAllowedToCreateOrEditRecord) { @Html.Raw("style='height: 0; overflow: hidden; position: absolute;'") }}>
<div @{if (!MainModel.IsAllowedToCreateOrEditRecord) { @Html.Raw("style='height: 0; overflow: hidden; position: absolute;'") }}>
<input type="hidden" id="isInEditModeIndicator" value="@(Model.IsInEditingMode ? Html.Raw("true") : Html.Raw("false"))" />
@using (Html.BeginForm("CreateServiceRecord", "Main", FormMethod.Post, new { id = "createSRForm" }))
{
@@ -273,8 +287,17 @@
<input value="@Model.SaveSignature.ToString()" type="hidden" id="SaveSignature" />
<input type="hidden" id="Leistung" />
@{
var shouldShowServiceRecordList = "display: block";
@using (Html.BeginForm("LoadServiceRecords", "Main", FormMethod.Post, new { id = "selectSCForm2" }))
if (Model.IsInGroupBookingMode && !Model.IsInEditingMode)
{
shouldShowServiceRecordList = "display: none";
}
}
@using (Html.BeginForm("LoadServiceRecords", "Main", FormMethod.Post, new { id = "selectSCForm2", style = shouldShowServiceRecordList }))
{
<div class="combobox-label-parent" id="recordLoader_select_container" style="min-width: 120px">
<div class="styled-select-div" id="record-loader-select-container">
@@ -292,22 +315,29 @@
<hr />
<div class="margin-div" id="serviceRecords">
<div class="margin-div" id="serviceRecords" style="@shouldShowServiceRecordList">
@foreach(var record in Model.ServiceRecords)
{
<div class="collapsible-container">
<input type="button" class="toggle-btn" value="@{
if (record.Start.Value.Second == 0)
{
if(record.Start.Value.Date != record.End.Value.Date) {
@(record.Start.Value.ToString("dd.MM.yyyy") + " "+ record.Start.Value.ToString(" HH:mm") + " - " + record.End.Value.ToString("dd.MM.yyyy") + " " + record.End.Value.ToString("HH:mm"))
<input type="button" class="toggle-btn" value="@{
var gruppenInfo = "";
if (record.GroupOid != null)
{
gruppenInfo += " Gruppe (" + record.GroupPersonCount + " Teilnehmer, " + record.GroupEmployeeCount + " Betreuer) Dauer: " + (record.End.Value - record.Start.Value).TotalMinutes;
}
if (record.Start.Value.Second == 0)
{
if(record.Start.Value.Date != record.End.Value.Date) {
@(record.Start.Value.ToString("dd.MM.yyyy") + " "+ record.Start.Value.ToString(" HH:mm") + " - " + record.End.Value.ToString("dd.MM.yyyy") + " " + record.End.Value.ToString("HH:mm") + (record.GroupOid != null ? gruppenInfo : ""))
} else {
@(record.Start.Value.ToString("dd.MM.yyyy") + " " + record.Start.Value.ToString(" HH:mm") + " - " + record.End.Value.ToString("HH:mm"))
@(record.Start.Value.ToString("dd.MM.yyyy") + " " + record.Start.Value.ToString(" HH:mm") + " - " + record.End.Value.ToString("HH:mm") + (record.GroupOid != null ? gruppenInfo : ""))
}
}
else
{
@(record.Start.Value.ToShortDateString())
@(record.Start.Value.ToShortDateString() + (record.GroupOid != null ? gruppenInfo : ""))
}
}" @(record.GroupOid != null ? Html.Raw("style=\"background-color: #FDC784;\"") : Html.Raw("")) />
<div style="display: none;" @(record.GroupOid != null ? Html.Raw("class=\"kollabierbarGruppenbuchung\"") : Html.Raw("class=\"kollabierbar\""))>
@@ -319,8 +349,8 @@
{
<input type="text" value="@(record.ServiceRecordOid.Value)" name="hiddenElement" style="display: none"/>
}
@*<input type="button" class="edit-button" onclick="@("showSanduhr();" + (record.GroupOid == null ? "selectServiceRecord('" + record.ServiceRecordOid + "')" : "selectGroupBookingForEditing('" + record.ServiceRecordOid + "')"))" @{if(!MainModel.IsEditBtnVisible) { @Html.Raw("style=\"display: none;\"") }}/>*@
<input type="button" class="edit-button" onclick="@("showSanduhr();" + ("selectServiceRecord('" + record.ServiceRecordOid) + "')")" @{if(!MainModel.IsEditBtnVisible || record.GroupOid != null) { @Html.Raw("style=\"display: none;\"") }}/>
<input type="button" class="edit-button" onclick="@("showSanduhr();" + (record.GroupOid == null ? "selectServiceRecord('" + record.ServiceRecordOid + "')" : "selectGroupBookingForEditing('" + record.ServiceRecordOid + "')"))" @{if(!MainModel.IsEditBtnVisible) { @Html.Raw("style=\"display: none;\"") }}/>
@*<input type="button" class="edit-button" onclick="@("showSanduhr();" + ("selectServiceRecord('" + record.ServiceRecordOid) + "')")" @{if(!MainModel.IsEditBtnVisible || record.GroupOid != null) { @Html.Raw("style=\"display: none;\"") }}/>*@
<input type="button" onclick="@("togglePopup('" + record.ServiceRecordOid + "')")" class="delete-button" @{if(!MainModel.IsDeleteBtnVisible) { @Html.Raw("style=\"display: none;\"") }}/>
@{if((record.SignatureOid == null || record.SignatureOid.Equals("")) && Model.ShowSignature)
@@ -534,6 +564,7 @@
<div id="popupBtnDiv" class="center-aligned-text-element">
@using (Html.BeginForm("DeleteServiceRecord", "Main", FormMethod.Post, new { id = "deletionForm" }))
{
<input type="hidden" name="serviceRecordOidHolder" id="oidHolder" />
<input type="button" class="popupBtn" value="OK" onclick="submitDeletionForm()" />
<input type="button" class="popupBtn" value="Abbrechen" onclick="togglePopup()" />
}
@@ -1020,7 +1051,8 @@
setSelectedGroupServiceRecordUrl = '@Url.Action("SetSelectedGroupServiceRecord")';
resetEditingModeUrl = '@Url.Action("ResetEditingMode")';
loadCategoryAndDescriptionUrl = '@Url.Action("LoadCategoryAndDescription")';
addEmployeesToGroupBookingUrl = '@Url.Action("AddEmployeesToGroupBooking")';
addEmployeesToGroupBookingUrl = '@Url.Action("AddEmployeesToGroupBooking")';
resetGroupBookingModeViaGETUrl = '@Url.Action("ResetGroupBookingModeViaGET")';

View File

@@ -700,5 +700,9 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
List<SupportConceptCostBearerRelDC> GetSupportConceptCostBearerRelationsById(IEnumerable<long> relOids);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
List<CompactSupportConceptDC> LoadCompactSupportConceptsById(IEnumerable<long> pOids);
}
}

View File

@@ -3862,6 +3862,19 @@ namespace BeWo.Service.ServiceImplementations
throw Utils.CreateBeWoFaultException(e);
}
}
public List<CompactSupportConceptDC> LoadCompactSupportConceptsById(IEnumerable<long> pOids)
{
try
{
var originals = DAOFactory.GenericDAO.LoadByIDs<SupportConcept>(pOids);
return MapperFactory.CompactSupportConceptDC_SupportConcept.MapToNewDCs(originals);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
}
internal struct WohnheimbuchungsIntervallStruct