MoK: Bug gefixt, der das Speichern bzw. Anlegen von Gruppenbuchungen verhindert hat.

This commit is contained in:
2024-08-02 12:11:53 +02:00
parent 9e9e0f1dcd
commit d02c2d4a1d
24 changed files with 1000 additions and 312 deletions

View File

@@ -696,7 +696,7 @@
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>False</UseIIS>
<UseIIS>True</UseIIS>
<AutoAssignPort>False</AutoAssignPort>
<DevelopmentServerPort>8808</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>

View File

@@ -142,6 +142,7 @@ textarea {
--danger: #dc3545;
--light: #f8f9fa;
--dark: #343a40;
--bewo-organisation: #C8C000;
--bewo-custom-goal: #4682B4;
--service-record-marked: #c5e3ff;
--bewo-teams: #565999;
@@ -1827,6 +1828,26 @@ pre code {
background-color: #b9bbbe;
}
.table-bewo-organisation,
.table-bewo-organisation > th,
.table-bewo-organisation > td {
background-color: #f0edb8;
}
.table-bewo-organisation th,
.table-bewo-organisation td,
.table-bewo-organisation thead th,
.table-bewo-organisation tbody + tbody {
border-color: #e2de7a;
}
.table-hover .table-bewo-organisation:hover {
background-color: #ece8a3;
}
.table-hover .table-bewo-organisation:hover > td,
.table-hover .table-bewo-organisation:hover > th {
background-color: #ece8a3;
}
.table-bewo-custom-goal,
.table-bewo-custom-goal > th,
.table-bewo-custom-goal > td {
@@ -2935,6 +2956,36 @@ fieldset:disabled a.btn {
box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
}
.btn-bewo-organisation {
color: #212529;
background-color: #C8C000;
border-color: #C8C000;
}
.btn-bewo-organisation:hover {
color: #fff;
background-color: #a29b00;
border-color: #958f00;
}
.btn-bewo-organisation:focus, .btn-bewo-organisation.focus {
color: #fff;
background-color: #a29b00;
border-color: #958f00;
box-shadow: 0 0 0 0.2rem rgba(175, 169, 6, 0.5);
}
.btn-bewo-organisation.disabled, .btn-bewo-organisation:disabled {
color: #212529;
background-color: #C8C000;
border-color: #C8C000;
}
.btn-bewo-organisation:not(:disabled):not(.disabled):active, .btn-bewo-organisation:not(:disabled):not(.disabled).active, .show > .btn-bewo-organisation.dropdown-toggle {
color: #fff;
background-color: #958f00;
border-color: #888300;
}
.btn-bewo-organisation:not(:disabled):not(.disabled):active:focus, .btn-bewo-organisation:not(:disabled):not(.disabled).active:focus, .show > .btn-bewo-organisation.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2rem rgba(175, 169, 6, 0.5);
}
.btn-bewo-custom-goal {
color: #fff;
background-color: #4682B4;
@@ -3615,6 +3666,31 @@ fieldset:disabled a.btn {
box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
}
.btn-outline-bewo-organisation {
color: #C8C000;
border-color: #C8C000;
}
.btn-outline-bewo-organisation:hover {
color: #212529;
background-color: #C8C000;
border-color: #C8C000;
}
.btn-outline-bewo-organisation:focus, .btn-outline-bewo-organisation.focus {
box-shadow: 0 0 0 0.2rem rgba(200, 192, 0, 0.5);
}
.btn-outline-bewo-organisation.disabled, .btn-outline-bewo-organisation:disabled {
color: #C8C000;
background-color: transparent;
}
.btn-outline-bewo-organisation:not(:disabled):not(.disabled):active, .btn-outline-bewo-organisation:not(:disabled):not(.disabled).active, .show > .btn-outline-bewo-organisation.dropdown-toggle {
color: #212529;
background-color: #C8C000;
border-color: #C8C000;
}
.btn-outline-bewo-organisation:not(:disabled):not(.disabled):active:focus, .btn-outline-bewo-organisation:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-bewo-organisation.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2rem rgba(200, 192, 0, 0.5);
}
.btn-outline-bewo-custom-goal {
color: #4682B4;
border-color: #4682B4;
@@ -5886,6 +5962,19 @@ a.badge-dark:focus, a.badge-dark.focus {
box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
}
.badge-bewo-organisation {
color: #212529;
background-color: #C8C000;
}
a.badge-bewo-organisation:hover, a.badge-bewo-organisation:focus {
color: #212529;
background-color: #958f00;
}
a.badge-bewo-organisation:focus, a.badge-bewo-organisation.focus {
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(200, 192, 0, 0.5);
}
.badge-bewo-custom-goal {
color: #fff;
background-color: #4682B4;
@@ -6235,6 +6324,18 @@ a.badge-bewo-report:focus, a.badge-bewo-report.focus {
color: #040505;
}
.alert-bewo-organisation {
color: #686400;
background-color: #f4f2cc;
border-color: #f0edb8;
}
.alert-bewo-organisation hr {
border-top-color: #ece8a3;
}
.alert-bewo-organisation .alert-link {
color: #353300;
}
.alert-bewo-custom-goal {
color: #24445e;
background-color: #dae6f0;
@@ -6784,6 +6885,20 @@ a.badge-bewo-report:focus, a.badge-bewo-report.focus {
border-color: #1b1e21;
}
.list-group-item-bewo-organisation {
color: #686400;
background-color: #f0edb8;
}
.list-group-item-bewo-organisation.list-group-item-action:hover, .list-group-item-bewo-organisation.list-group-item-action:focus {
color: #686400;
background-color: #ece8a3;
}
.list-group-item-bewo-organisation.list-group-item-action.active {
color: #fff;
background-color: #686400;
border-color: #686400;
}
.list-group-item-bewo-custom-goal {
color: #24445e;
background-color: #cbdcea;
@@ -7837,6 +7952,16 @@ button.bg-dark:focus {
background-color: #1d2124 !important;
}
.bg-bewo-organisation {
background-color: #C8C000 !important;
}
a.bg-bewo-organisation:hover, a.bg-bewo-organisation:focus,
button.bg-bewo-organisation:hover,
button.bg-bewo-organisation:focus {
background-color: #958f00 !important;
}
.bg-bewo-custom-goal {
background-color: #4682B4 !important;
}
@@ -8077,6 +8202,10 @@ button.bg-bewo-report:focus {
border-color: #343a40 !important;
}
.border-bewo-organisation {
border-color: #C8C000 !important;
}
.border-bewo-custom-goal {
border-color: #4682B4 !important;
}
@@ -11180,6 +11309,14 @@ a.text-dark:hover, a.text-dark:focus {
color: #121416 !important;
}
.text-bewo-organisation {
color: #C8C000 !important;
}
a.text-bewo-organisation:hover, a.text-bewo-organisation:focus {
color: #7c7700 !important;
}
.text-bewo-custom-goal {
color: #4682B4 !important;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
$theme-colors: ("bewo-custom-goal": #4682B4, "service-record-marked": #c5e3ff, "bewo-teams": #565999, "bewo-goal-rating": #0000ff,"bewo-dev": #00cf7c, "primary": #FF5A00, "bewo-customers": #3b7799, "bewo-service-records": #c80000, "bewo-calendar": #04b4d0, "bewo-is-about-to-expire": #FF0000, "bewo-expires-in-three-months": #FF9400, "bewo-group-booking": #f9e79f, "bewo-customer-card-header": #AB4A07, "bewo-employee": #45993B, "bewo-resource": #04B4D0, "bewo-task-red": #993B3B, "bewo-report": #995E3B);
$theme-colors: ("bewo-organisation" : #C8C000, "bewo-custom-goal": #4682B4, "service-record-marked": #c5e3ff, "bewo-teams": #565999, "bewo-goal-rating": #0000ff,"bewo-dev": #00cf7c, "primary": #FF5A00, "bewo-customers": #3b7799, "bewo-service-records": #c80000, "bewo-calendar": #04b4d0, "bewo-is-about-to-expire": #FF0000, "bewo-expires-in-three-months": #FF9400, "bewo-group-booking": #f9e79f, "bewo-customer-card-header": #AB4A07, "bewo-employee": #45993B, "bewo-resource": #04B4D0, "bewo-task-red": #993B3B, "bewo-report": #995E3B);
textarea {
min-height: 150px !important;

View File

@@ -1875,7 +1875,7 @@ namespace BeWoPlanerMobil.Controllers
}
}
if(firstNode.ServiceAccountings.Count == 0)
if(firstNode.ServiceAccountings.Count == 0 || result.Count == 0)
{
var allServiceDescriptions = OperationsService.GetAllServiceDescriptions().Where(sd => sd.Category.OhneHilfeplan != AccountingvisibilityType.NichtKlientenbezogen).ToList();

View File

@@ -12,6 +12,8 @@ using BeWoPlanerMobil.Util;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.XtraEditors.Filtering.Templates;
namespace BeWoPlanerMobil.Controllers
{
@@ -61,6 +63,8 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedYear = Model.SelectedYear ?? first.Year;
Model.SelectedMonth = Model.SelectedMonth ?? first.Month;
Model.AllEmployees = AbstractModel.HasRightMitarbeiterstundenkontoViewAll
? EmployeeService.GetAllActiveEmployeesCompact()
: new List<CompactEmployeeDC> { MobileSessionFacade.LoggedInCompactEmployee };
@@ -81,30 +85,17 @@ namespace BeWoPlanerMobil.Controllers
Model.ReportTypes = new List<SelectListItem>();
#if DEBUG
//if(AbstractModel.HasRightToViewReports)
//{
// Model.ReportTypes.Add(new SelectListItem
// {
// Text = "Berichte",
// Value = "0"
// });
//}
#endif
if(AbstractModel.HasRightToViewMitarbeiterstundenkonto)
if(AbstractModel.HasRightToViewReports)
{
Model.ReportTypes.Add(new SelectListItem
{
Text = "Mitarbeiterstundenkonto",
Value = "1"
Text = "Berichte",
Value = "0"
});
}
Model.SelectedReportType = ReportType.Mitarbeiterstundenkonto;
#if DEBUG
//Model.SelectedReportType = ReportType.Berichte;
#endif
Model.AllEmployeesForQueries = EmployeeService.GetAllActiveEmployeesCompact();
Model.AllCustomersForQueries = EmployeeService.GetActiveCompactCustomersForEmployee(null);
Model.Queries = QueryService.GetAllQueriesOfType(QueryType.Public);
@@ -117,20 +108,32 @@ namespace BeWoPlanerMobil.Controllers
Model.SupportConcepts = new List<SupportConceptDC>();
}
Model.SupportConcepts.DoForEach(sc => Model.CostBearer2SupportConceptRels.AddRangeIfElementsNotIn(sc.CostBearerRelations));
if(Model.SelectedCostBearer2SupportConceptRelListObject is null)
{
Model.SelectedCostBearer2SupportConceptRelListObject = Model.CostBearer2SupportConceptRelListObjects.FirstOrDefault(f => f.CostBearer2SupportConceptOid == "-1") ?? Model.CostBearer2SupportConceptRelListObjects.First();
}
if(Model.SelectedMonthForBericht is null)
{
Model.SelectedMonthForBericht = Model.Months.FirstOrDefault(m => m.Value.Equals(DateTime.Today.Month.ToString()));
}
Model.AllOrganisationForQuery = CustomerService.GetAllActiveOrganisationsCompact();
Model.AllTeamsForQueries = EmployeeService.GetAllActiveCompactTeamsForEmployee(null);
#endif
if(Model.SelectedYearForBericht is null || Model.SelectedYearForBericht.Value < DateTime.Today.AddYears(-10).Year)
if(AbstractModel.HasRightToViewMitarbeiterstundenkonto)
{
Model.SelectedYearForBericht = DateTime.Today.Year;
Model.ReportTypes.Add(new SelectListItem
{
Text = "Mitarbeiterstundenkonto",
Value = "1"
});
}
#if !DEBUG
Model.SelectedReportType = ReportType.Mitarbeiterstundenkonto;
#endif
#if DEBUG
//Model.SelectedReportType = ReportType.Berichte;
#endif
return View(Model);
}
@@ -210,6 +213,26 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedQuery = selectedQuery;
foreach(var parameter in selectedQuery?.Parameter ?? new List<QueryParamDC>())
{
if(parameter.QueryParameterOid is null)
{
continue;
}
if(parameter.ParamType == QueryParameterType.Year)
{
Model.SelectedValues.AddOrUpdate(parameter.QueryParameterOid.Value, new SelectedValue(QueryParameterType.Year, DateTime.Today.Year));
}
if(parameter.ParamType == QueryParameterType.Month)
{
Model.SelectedValues.AddOrUpdate(parameter.QueryParameterOid.Value, new SelectedValue(QueryParameterType.Month, DateTime.Today.AddMonths(-1)));
}
}
return PartialView("BerichteFormPartialView", Model);
}
catch(Exception exception)
@@ -416,7 +439,7 @@ namespace BeWoPlanerMobil.Controllers
}
[Authorize]
public ActionResult SelectMonth(string selectedMonth)
public ActionResult SelectQueryCustomValue(string customValue, long? paramOid)
{
if(Model?.SelectedQuery is null)
{
@@ -424,18 +447,11 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("BerichteFormPartialView");
}
var month = Model.Months.FirstOrDefault(f => f.Value.Equals(selectedMonth));
if(month != null)
{
Model.SelectedMonthForBericht = month;
}
return PartialView("BerichteFormPartialView", Model);
}
[Authorize]
public ActionResult SelectYear(string selectedYear)
public ActionResult SelectValueListEntry(long? valueListEntryOid, int paramType, int index)
{
if(Model?.SelectedQuery is null)
{
@@ -443,9 +459,103 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("BerichteFormPartialView");
}
if(int.TryParse(selectedYear, out var year))
if(valueListEntryOid.HasValue)
{
Model.SelectedYearForBericht = year;
var type = (QueryParameterType)paramType;
var valueListEntry = Model.AllValueListEntriesForQuery.FirstOrDefault(vle => vle.ValueListEntryOid.HasValue && vle.ValueListEntryOid.Value.Equals(valueListEntryOid));
if(valueListEntry != null)
{
var selectedValue = new SelectedValue(type, valueListEntry);
Model.SelectedValues.AddOrUpdate(index, selectedValue);
}
}
return PartialView("BerichteFormPartialView", Model);
}
// ToDo: Was bei Datumsangaben etc. machen? -> String
[Authorize]
public ActionResult SelectQueryParameter(long? objectOid, int parameterType, long? parameterOid, string textValue)
{
if(Model?.SelectedQuery is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("BerichteFormPartialView");
}
if(objectOid.HasValue && parameterOid.HasValue)
{
var queryParameterType = (QueryParameterType)parameterType;
switch(queryParameterType)
{
case QueryParameterType.Custom:
throw new NotImplementedException("Der QueryParameterType.Custom wird noch nicht unterstützt!");
break;
case QueryParameterType.Customer:
var selectedCustomer = Model.AllCustomersForQueries.FirstOrDefault(customer => customer.CustomerOid.Equals(objectOid.Value));
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedCustomer));
break;
case QueryParameterType.Employee:
var selectedEmployee = Model.AllEmployeesForQueries.FirstOrDefault(employee => employee.EmployeeOid.Equals(objectOid.Value));
if(selectedEmployee != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedEmployee));
}
break;
case QueryParameterType.Organisation:
var selectedOrganisation = Model.AllOrganisationForQuery.FirstOrDefault(organisation => organisation.OrganisationOid.Equals(objectOid.Value));
if(selectedOrganisation != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedOrganisation));
}
break;
case QueryParameterType.Text:
break;
case QueryParameterType.Date:
break;
case QueryParameterType.DateRange:
break;
case QueryParameterType.Month:
break;
case QueryParameterType.ServiceCategory:
var selectedServiceCategory = Model.AllServiceCategoriesForQueries.FirstOrDefault(serviceCategory => serviceCategory.ServiceCategoryOid.HasValue && serviceCategory.ServiceCategoryOid.Value.Equals(objectOid));
if(selectedServiceCategory != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedServiceCategory));
}
break;
case QueryParameterType.SupportConcept:
var costBearer2SupportConceptRelListObj = Model.CostBearer2SupportConceptRelListObjects.FirstOrDefault(costBearer2SupportConceptRelListObject => costBearer2SupportConceptRelListObject.CostBearer2SupportConceptOid.Equals(objectOid.ToString()));
if(costBearer2SupportConceptRelListObj != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, costBearer2SupportConceptRelListObj));
}
break;
case QueryParameterType.Team:
var selectedTeam = Model.AllTeamsForQueries.FirstOrDefault(team => team.TeamOid.Equals(objectOid.Value));
if(selectedTeam != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedTeam));
}
break;
case QueryParameterType.ValueListEntryType:
var selectedValueListEntry = Model.AllValueListEntriesForQuery.FirstOrDefault(valueListEntry => valueListEntry.ValueListEntryOid?.Equals(objectOid.Value) ?? false);
if(selectedValueListEntry != null)
{
Model.SelectedValues.AddOrUpdate(parameterOid.Value, new SelectedValue(queryParameterType, selectedValueListEntry));
}
break;
case QueryParameterType.Year:
break;
}
}
return PartialView("BerichteFormPartialView", Model);

View File

@@ -5,6 +5,7 @@ using BeWoPlanerMobil.Util;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.XtraReports.UI;
namespace BeWoPlanerMobil.Models
@@ -242,5 +243,9 @@ namespace BeWoPlanerMobil.Models
return result;
}
public List<CompactEmployeeDC> Employees { get; set; } = new List<CompactEmployeeDC>();
public List<CompactCustomerDC> Customers { get; set; } = new List<CompactCustomerDC>();
}
}

View File

@@ -188,8 +188,6 @@ namespace BeWoPlanerMobil.Models
public long ServiceRecordOid { get; set; }
public List<SupportConceptDC> SupportConcepts { get; set; }
// ToDo: Veraltet!
public List<ServiceCategoryModel> ServiceCategories { get; set; }
public List<TextModuleDC> Textbausteine { get; set; } = new List<TextModuleDC>();
@@ -290,18 +288,6 @@ namespace BeWoPlanerMobil.Models
}
}
public IEnumerable<SelectListItem> ServiceCategoryListItems
{
get
{
var result = new List<SelectListItem>();
result.AddRange(ServiceCategories.Select(item => new SelectListItem {Value = item.ServiceCategoryOid.Value.ToString(), Text = item.Name}).ToList());
return result;
}
}
public IEnumerable<SelectListItem> GroupOfPeopleListItems
{
get
@@ -390,14 +376,11 @@ namespace BeWoPlanerMobil.Models
{
var result = new List<ServiceDescriptionDC>();
foreach(var serviceCategoryModel in ServiceCategories)
{
foreach(var serviceDescription in serviceCategoryModel.ServiceDescriptions)
{
result.AddIfNotIn(serviceDescription);
}
}
foreach(var category2Descriptions in Categories2Descriptions)
{
result.AddRangeIfElementsNotIn(category2Descriptions.Value);
}
return result;
}

View File

@@ -4,8 +4,10 @@ using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using BeWo.Report;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.XtraRichEdit.Import.Html;
namespace BeWoPlanerMobil.Models
{
@@ -177,8 +179,37 @@ namespace BeWoPlanerMobil.Models
}
}
public SelectListItem SelectedMonthForBericht { get; set; }
public int? SelectedYearForBericht { get; set; }
public List<ServiceCategoryDC> AllServiceCategoriesForQueries { get; set; } = new List<ServiceCategoryDC>();
public List<CompactCustomerDC> AllCustomersForQueries { get; set; } = new List<CompactCustomerDC>();
public List<CompactEmployeeDC> AllEmployeesForQueries { get; set; } = new List<CompactEmployeeDC>();
public List<CompactTeamDC> AllTeamsForQueries { get; set; } = new List<CompactTeamDC>();
public List<CompactOrganisationDC> AllOrganisationForQuery { get; set; } = new List<CompactOrganisationDC>();
public List<ValueListEntryDC> AllValueListEntriesForQuery { get; set; } = new List<ValueListEntryDC>();
public List<string> AllCustomValuesForQuery { get; set; } = new List<string>();
public Dictionary<long, SelectedValue> SelectedValues { get; set; } = new Dictionary<long, SelectedValue>();
public List<SupportConceptCostBearerRelDC> CostBearer2SupportConceptRels { get; set; } = new List<SupportConceptCostBearerRelDC>();
}
public struct SelectedValue
{
public QueryParameterType ParameterType { get; }
public object Parameter { get; }
public SelectedValue(QueryParameterType parameterType, object parameter)
{
ParameterType = parameterType;
Parameter = parameter;
}
}
public enum ReportType

View File

@@ -414,20 +414,7 @@ function getStartAndEndDate(prefix) {
return [startDate, endDate];
}
function textCategoryOnClick(categoryId) {
var childrenContainer = $("#" + categoryId + "-children-container");
var iconSpan = $("#" + categoryId + "-icon-span");
var displayValue = childrenContainer.css("display");
var classToRemove = displayValue === "block" ? "fa-angle-down" : "fa-angle-up";
var classToAdd = displayValue === "block" ? "fa-angle-up" : "fa-angle-down";
iconSpan.removeClass(classToRemove);
iconSpan.addClass(classToAdd);
childrenContainer.toggle();
}
function supportConceptSearchOnChange() {
try {

View File

@@ -7,7 +7,7 @@ namespace BeWoPlanerMobil.Util
{
public string Name { get; set; }
public long Oid { get; set; }
public long Oid { get; }
public long? ParentOid { get; set; }
@@ -32,5 +32,15 @@ namespace BeWoPlanerMobil.Util
{
return $"{Name}; Text: {Text}";
}
public override bool Equals(object obj)
{
if(obj is TextbausteinDisplayItem y)
{
return Oid.Equals(y.Oid);
}
return false;
}
}
}

View File

@@ -70,45 +70,7 @@
return "@Model.EinheitZeiterfassung" === "0";
}
function textModuleOnClick(textModuleOid) {
var focusedDokuFeld;
var dokufeldId = "#dokufeld";
var dokuTextareaId = "#doku-textarea-";
var textareaContainerId = "#doku_";
if("@Model.IsInMultiBookingMode".toLocaleLowerCase() === "true") {
dokufeldId = "#mb-dokufeld";
dokuTextareaId = "#mb-doku-textarea-";
textareaContainerId = "#mb-doku_";
}
$.get(getLoadCompleteTextbausteinByOidUrl(), { pTextbausteinOid: textModuleOid }).done(function(textModuleText) {
if ($(dokufeldId).length > 0) {
focusedDokuFeld = $(dokufeldId);
} else {
var numberOfDokutypes = getNumberOfDokutypes();
for (var i = 0; i < numberOfDokutypes; i++) {
var currentElement = $("#doku_" + i);
if (currentElement.css("display") !== "none") {
focusedDokuFeld = $(dokuTextareaId + i);
break;
}
}
}
var cursorPosition = focusedDokuFeld.prop("selectionStart");
var v = focusedDokuFeld.val();
var textBefore = v.substring(0, cursorPosition);
var textAfter = v.substring(cursorPosition, v.length);
focusedDokuFeld.val(textBefore + textModuleText + textAfter);
$("#textbausteine-popup").modal("hide");
});
}
$(function() {
$("#start-date-picker").datetimepicker({
@@ -427,10 +389,6 @@
return "@Url.Action("SetServiceDescription")";
}
function getLoadCompleteTextbausteinByOidUrl() {
return "@Url.Action("LoadCompleteTextbausteinByOid")";
}
function getNumberOfDokutypes() {
return @Model.NumberOfDokuTypes;
}

View File

@@ -12,12 +12,69 @@
}
}
<script type="text/javascript">
function textCategoryOnClick(categoryId) {
var childrenContainer = $(`#${categoryId}-children-container`);
var iconSpan = $(`#${categoryId}-icon-span`);
var displayValue = childrenContainer.css("display");
var classToRemove = displayValue === "block" ? "fa-angle-up" : "fa-angle-down";
var classToAdd = displayValue === "block" ? "fa-angle-down" : "fa-angle-up";
iconSpan.removeClass(classToRemove);
iconSpan.addClass(classToAdd);
childrenContainer.toggle();
}
function textModuleOnClick(textModuleOid) {
var focusedDokuFeld;
var dokufeldId = "#dokufeld";
var dokuTextareaId = "#doku-textarea-";
var textareaContainerId = "#doku_";
if("@Model.IsInMultiBookingMode".toLocaleLowerCase() === "true") {
dokufeldId = "#mb-dokufeld";
dokuTextareaId = "#mb-doku-textarea-";
textareaContainerId = "#mb-doku_";
}
$.get("@Url.Action("LoadCompleteTextbausteinByOid")", { pTextbausteinOid: textModuleOid }).done(function(textModuleText) {
if ($(dokufeldId).length > 0) {
focusedDokuFeld = $(dokufeldId);
} else {
var numberOfDokutypes = getNumberOfDokutypes();
for (var i = 0; i < numberOfDokutypes; i++) {
var currentElement = $(`#doku_${i}`);
if (currentElement.css("display") !== "none") {
focusedDokuFeld = $(dokuTextareaId + i);
break;
}
}
}
var cursorPosition = focusedDokuFeld.prop("selectionStart");
var v = focusedDokuFeld.val();
var textBefore = v.substring(0, cursorPosition);
var textAfter = v.substring(cursorPosition, v.length);
focusedDokuFeld.val(textBefore + textModuleText + textAfter);
$("#textbausteine-popup").modal("hide");
});
}
</script>
@helper BuildTextModuleTree(TextbausteinDisplayItem textModule)
{
if(textModule.IsParent)
{
<a href="#" class="list-group-item list-group-item-action mx-0 px-1" onclick="textCategoryOnClick('@textModule.Oid')">
<span id="@textModule.Oid-icon-span" class="fas fa-angle-up mr-1"></span>
<span id="@textModule.Oid-icon-span" class="fas fa-angle-down mr-1"></span>
@textModule.Name
</a>
<div id="@textModule.Oid-children-container" style="display: none;" class="list-group list-group-item mx-0 px-1">

View File

@@ -219,7 +219,7 @@
</button>
</div>
<!-- w-auto -->
<div class="btn-group role="group" style="width: 150px !important;">
<div class="btn-group" role="group" style="width: 150px !important;">
@if(AbstractModel.HasRightToDeleteReceiptSignatures && result.EmployeeSignatureOids.Any())
{
<button class="btn btn-danger mx-0" type="button" onclick="deleteEmployeeSignature('#collapse-result-@result.Identifier', '@result.Identifier', '@employeeName', '@result.CustomerName', '@timeSpan_ssp')">

View File

@@ -1,5 +1,7 @@
@using BeWoPlanerMobil.Util
@using BS.Shared
@using BS.Shared.DataContracts
@using BS.Shared.DataContracts.Compact
@model BeWoPlanerMobil.Models.ReportViewerModel
@{
@@ -37,29 +39,147 @@
*@
<script type="text/javascript">
function selectCostBearer2SupportConceptRel(relOid) {
$(function () {
$("#query-date-picker").datetimepicker({
locale: "de",
format: "L"
});
$("#query-date-range-start-picker").datetimepicker({
locale: "de",
format: "L"
});
$("#query-date-range-end-picker").datetimepicker({
locale: "de",
format: "L"
});
});
function selectCostBearer2SupportConceptRel(relOid, parameterType, parameterOid) {
try {
$("#berichte-form-container").load("@Url.Action("SelectCostBearer2SupportConceptRel")", {relOid: relOid});
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: relOid, parameterType: parameterType, parameterOid: parameterOid});
} catch (error) {
showErrorPopup(error);
}
}
function selectMonth() {
function selectMonth(parameterType, parameterOid) {
try {
var selectedMonth = $("#month-select").find(":selected").val();
$("#berichte-form-container").load("@Url.Action("SelectMonth")", {selectedMonth: selectedMonth});
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: null, parameterType: parameterType, parameterOid: parameterOid, textValue: selectedMonth.toString()});
} catch(error) {
showErrorPopup(error);
}
}
function selectYear() {
function selectYear(parameterType, parameterOid) {
try {
var selectedYear = $("#year-select").find(":selected").val();
var selectedYear = $("#month-year-select").find(":selected").val();
$("#berichte-form-container").load("@Url.Action("SelectYear")", {selectedYear: selectedYear});
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: null, parameterType: parameterType, parameterOid: parameterOid, textValue: selectedYear.toString()});
} catch(error) {
showErrorPopup(error);
}
}
function onDropdownParameterInput(element) {
try {
var searchText = $(element).val();
var id = $(element).attr("id");
var prefix = "";
if (id !== undefined && id !== null && id.includes("-")) {
var splitId = id.split("-");
if (splitId.length > 1) {
prefix = splitId[1];
}
}
if(searchText === null || searchText === undefined || searchText.length === 0) {
$(`#query-${prefix}-dropdown-menu .dropdown-item`).show();
return;
}
var menuItems = $(`#query-${prefix}-dropdown-menu .dropdown-item`);
menuItems.hide();
$.each(menuItems,
function (index, item) {
var itemText = $(item).text();
if(itemText.includes(searchText)) {
$(item).show();
}
});
} catch(error) {
showErrorPopup(error);
}
}
function resetDropdownParameterSearch(prefix) {
try {
$(`#query-${prefix}-search-input`).val("");
$(`#query-${prefix}-dropdown-menu .dropdown-item`).show();
var e = window.event;
e.cancelBubble = true;
if(e.stopPropagation) {
e.stopPropagation();
}
} catch(error) {
showErrorPopup(error);
}
}
function selectEmployeeParameter(element, employeeOid, parameterType, parameterOid) {
try {
$("#dropdownEmployeesMenu").text($(element).text());
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: employeeOid, parameterType: parameterType, parameterOid: parameterOid});
} catch(error) {
showErrorPopup(error);
}
}
function selectCustomerParameter(element, customerOid, parameterType, parameterOid) {
try {
$("#dropdownCustomersMenu").text($(element).text());
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: customerOid, parameterType: parameterType, parameterOid: parameterOid});
} catch(error) {
showErrorPopup(error);
}
}
function selectOrganisationParameter(element, organisationOid, parameterType, parameterOid) {
try {
$("#dropdownOrganisationsMenu").text($(element).text());
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: organisationOid, parameterType: parameterType, parameterOid: parameterOid});
} catch(error) {
showErrorPopup(error);
}
}
function selectServiceCategoryParameter(element, parameterType, parameterOid) {
try {
var serviceCategoryOid = $(element).find(":selected").val();
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: serviceCategoryOid, parameterType: parameterType, parameterOid: parameterOid});
} catch(error) {
showErrorPopup(error);
}
}
function selectTeamParameter(element, teamOid, parameterType, parameterOid) {
try {
$("#berichte-form-container").load("@Url.Action("SelectQueryParameter")", {objectOid: teamOid, parameterType: parameterType, parameterOid: parameterOid});
} catch(error) {
showErrorPopup(error);
}
@@ -69,141 +189,461 @@
@if(Model.SelectedQuery != null && Model.SelectedQuery.Parameter != null && Model.SelectedQuery.Parameter.Count > 0)
{
<div class="mt-3">
@foreach(var parameter in Model.SelectedQuery.Parameter)
{
switch(parameter.ParamType)
<hr />
@for(var i = 0; i < Model.SelectedQuery.Parameter.Count; i++)
{
case QueryParameterType.SupportConcept:
var selectedSuportConceptTimeSpanColorClass = Model.SelectedCostBearer2SupportConceptRelListObject.IsAboutToExpire ? "text-bewo-is-about-to-expire" : Model.SelectedCostBearer2SupportConceptRelListObject.ExpiresInThreeMonthsOrLess ? "text-bewo-expires-in-three-months" : "text-dark";
<div class="form-row">
<div>
<div class="container p-0">
<div class="row">
<div class="col mt-3">
var parameter = Model.SelectedQuery.Parameter[i];
var parameterType = (int) parameter.ParamType;
var parameterOid = parameter.QueryParameterOid;
switch(parameter.ParamType)
{
case QueryParameterType.SupportConcept:
var selectedSuportConceptTimeSpanColorClass = Model.SelectedCostBearer2SupportConceptRelListObject.IsAboutToExpire ? "text-bewo-is-about-to-expire" : Model.SelectedCostBearer2SupportConceptRelListObject.ExpiresInThreeMonthsOrLess ? "text-bewo-expires-in-three-months" : "text-dark";
<div class="form-row">
<div class="col-md">
<div class="container p-0">
<div class="row">
<div class="col mt-3">
<div class="list-group">
<a href="#" class="list-group-item flex-column align-items-start no-underline" data-toggle="modal" data-target="#supportConceptList">
<div class="d-flex">
<h5 class="mb-1 text-dark text-left" id="selectedSupportConceptCustomerInfo">@Model.SelectedCostBearer2SupportConceptRelListObject.NameAndDateOfBirth</h5>
</div>
<p class="mb-1 text-left @selectedSuportConceptTimeSpanColorClass" id="selectedSupportConceptInfo">
@Model.SelectedCostBearer2SupportConceptRelListObject.SupportConceptTimeSpan
</p>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal" role="dialog" tabindex="-1" id="supportConceptList">
<div class="modal-dialog text-center modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Hilfeplanauswahl</h5>
<button type="button" class="close" data-dismiss="modal" onclick="resetSupportConceptSearch()">
<span>&times;</span>
</button>
</div>
<div class="modal-body">
<!-- Hilfeplansuche -->
<div class="input-group mb-3">
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="supportConceptSearchOnChange()" id="support-concept-search-input" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetSupportConceptSearch()">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<hr />
<!-- Hilfeplanliste -->
<div class="list-group">
<a href="#" class="list-group-item flex-column align-items-start no-underline" data-toggle="modal" data-target="#supportConceptList">
<div class="d-flex">
<h5 class="mb-1 text-dark text-left" id="selectedSupportConceptCustomerInfo">@Model.SelectedCostBearer2SupportConceptRelListObject.NameAndDateOfBirth</h5>
</div>
<p class="mb-1 text-left @selectedSuportConceptTimeSpanColorClass" id="selectedSupportConceptInfo">
@Model.SelectedCostBearer2SupportConceptRelListObject.SupportConceptTimeSpan
</p>
</a>
@foreach(var supportConceptListObject in Model.CostBearer2SupportConceptRelListObjects)
{
var timeSpanColorClass = supportConceptListObject.IsAboutToExpire ? "text-bewo-is-about-to-expire" : supportConceptListObject.ExpiresInThreeMonthsOrLess ? "text-bewo-expires-in-three-months" : "text-dark";
<a href="#" class="list-group-item flex-column align-items-start no-underline blubb-test" onclick="selectCostBearer2SupportConceptRel(@supportConceptListObject.CostBearer2SupportConceptOid, @parameterType, @parameterOid)" data-dismiss="modal">
<div class="justify-content-between">
<h5 class="mb-1 text-dark text-left supportconcept-name-header">
@supportConceptListObject.NameAndDateOfBirth
</h5>
</div>
<p class="mb-1 text-left @timeSpanColorClass">
@supportConceptListObject.SupportConceptTimeSpan
</p>
</a>
}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal" role="dialog" tabindex="-1" id="supportConceptList">
<div class="modal-dialog text-center modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Hilfeplanauswahl</h5>
<button type="button" class="close" data-dismiss="modal" onclick="resetSupportConceptSearch()">
<span>&times;</span>
break;
case QueryParameterType.Employee:
<div class="form-row">
<div class="col-md">
<div class="dropdown mt-3">
@{
var employeeButtonValue = "Mitarbeiter";
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value) && Model.SelectedValues[parameterOid.Value].Parameter is CompactEmployeeDC selectedEmployee)
{
employeeButtonValue = selectedEmployee.DetailDescription;
}
}
<button class="btn btn-bewo-employee dropdown-toggle w-100" type="button" id="dropdownEmployeesMenu" data-toggle="dropdown">
@employeeButtonValue
</button>
</div>
<div class="modal-body">
<!-- Hilfeplansuche -->
<div class="input-group mb-3">
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="supportConceptSearchOnChange()" id="support-concept-search-input" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetSupportConceptSearch()">
<span class="fas fa-times-circle"></span>
</button>
<div class="dropdown-menu" id="query-employee-dropdown-menu" style="max-height: 90vh !important; overflow-y: auto !important;">
<div class="input-group px-2">
<input class="form-control w-100" id="query-employee-search-input" type="text" placeholder="Suchen ..." oninput="onDropdownParameterInput(this)" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetDropdownParameterSearch('employee')">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
</div>
<hr />
<!-- Hilfeplanliste -->
<div class="list-group">
@foreach(var supportConceptListObject in Model.CostBearer2SupportConceptRelListObjects)
<div class="dropdown-divider"></div>
@foreach(var employee in Model.AllEmployeesForQueries)
{
var timeSpanColorClass = supportConceptListObject.IsAboutToExpire ? "text-bewo-is-about-to-expire" : supportConceptListObject.ExpiresInThreeMonthsOrLess ? "text-bewo-expires-in-three-months" : "text-dark";
<a class="dropdown-item" style="cursor: pointer;" id="query-employee-@employee.EmployeeOid" onclick="selectEmployeeParameter(this, @employee.EmployeeOid, @parameterType, @parameterOid)">@employee.DetailDescription</a>
}
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Customer:
if(Model.AllCustomersForQueries.Any())
{
<div class="form-row">
<div class="col-md">
<div class="dropdown mt-3">
@{
var customerButtonValue = "Klient";
<a href="#" class="list-group-item flex-column align-items-start no-underline blubb-test" onclick="selectCostBearer2SupportConceptRel(@supportConceptListObject.CostBearer2SupportConceptOid)" data-dismiss="modal">
<div class="justify-content-between">
<h5 class="mb-1 text-dark text-left supportconcept-name-header">
@supportConceptListObject.NameAndDateOfBirth
</h5>
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is CompactCustomerDC selectedCustomer)
{
customerButtonValue = selectedCustomer.DetailDescription;
}
}
}
<button class="btn btn-bewo-customers dropdown-toggle w-100" type="button" id="dropdownCustomersMenu" data-toggle="dropdown">
@customerButtonValue
</button>
<div class="dropdown-menu" id="query-customer-dropdown-menu" style="max-height: 90vh !important; overflow-y: auto !important;">
<div class="input-group px-2">
<input class="form-control w-100" id="query-customer-search-input" type="text" placeholder="Suchen ..." oninput="onDropdownParameterInput(this)" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetDropdownParameterSearch('customer')">
<span class="fas fa-times-circle"></span>
</button>
</div>
<p class="mb-1 text-left @timeSpanColorClass">
@supportConceptListObject.SupportConceptTimeSpan
</p>
</a>
}
</div>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Employee:
break;
case QueryParameterType.Customer:
break;
case QueryParameterType.Month:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Monat
</div>
<div class="dropdown-divider"></div>
@foreach(var customer in Model.AllCustomersForQueries)
{
<a class="dropdown-item" style="cursor: pointer;" id="query-customer-@customer.CustomerOid" onclick="selectCustomerParameter(this, @customer.CustomerOid, @parameterType, @parameterOid)">@customer.DetailDescription</a>
}
</div>
</div>
<select class="custom-select" id="month-select" onchange="selectMonth()">
@foreach(var month in Model.Months)
{
var selected = Model.SelectedMonthForBericht != null && month.Equals(Model.SelectedMonthForBericht) ? " selected" : string.Empty;
<option value="@month.Value"@selected>@month.Text</option>
}
</select>
<select class="custom-select" id="year-select" onchange="selectYear()">
@foreach(var year in MobileUtils.Years)
{
var selected = Model.SelectedYearForBericht.HasValue && year.Equals(Model.SelectedYearForBericht.Value) ? " selected" : string.Empty;
<option value="@MobileUtils.Years.IndexOf(year)"@selected>@year</option>
}
</select>
</div>
</div>
}
break;
case QueryParameterType.Month:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Monat
</div>
</div>
<select class="custom-select" id="month-select" onchange="selectMonth()">
@foreach(var month in Model.Months)
{
var selected = string.Empty;
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is string monthAsString && Model.Months.Any(m => m.Value.Equals(monthAsString)))
{
selected = "selected";
}
}
<option value="@month.Value" @selected>@month.Text</option>
}
</select>
<select class="custom-select" id="month-year-select" onchange="selectYear()">
@foreach(var year in MobileUtils.Years)
{
var selected = string.Empty;
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is int selectedYear && year.Equals(selectedYear))
{
selected = "selected";
}
}
<option value="@MobileUtils.Years.IndexOf(year)" @selected>@year</option>
}
</select>
</div>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Date:
break;
case QueryParameterType.DateRange:
break;
case QueryParameterType.Team:
break;
case QueryParameterType.CostCenter:
break;
case QueryParameterType.ServiceCategory:
break;
case QueryParameterType.ServiceDescription:
break;
case QueryParameterType.Text:
break;
case QueryParameterType.Year:
break;
case QueryParameterType.CurrentUser:
break;
case QueryParameterType.CurrentEmployee:
break;
case QueryParameterType.ValueListEntryType:
break;
case QueryParameterType.Organisation:
break;
case QueryParameterType.Custom:
break;
break;
case QueryParameterType.Date:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group date" id="query-date-picker" data-target-input="nearest">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Datum
</div>
</div>
<input type="text" id="query-date" name="query-date" class="form-control datetimepicker-input" data-target="#query-date-picker" data-toggle="datetimepicker" />
<div class="input-group-append" data-target="#query-date-picker" data-toggle="datetimepicker">
<div class="input-group-text px-2">
<i class="fas fa-calendar-alt"></i>
</div>
</div>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.DateRange:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group date" id="query-date-range-start-picker" data-target-input="nearest">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Zeitraum
</div>
</div>
<input type="text" id="query-date-range-start" name="query-date-range-start" class="form-control datetimepicker-input" data-target="#query-date-range-start-picker" data-toggle="datetimepicker" />
<div class="input-group-append" data-target="#query-date-range-start-picker" data-toggle="datetimepicker">
<div class="input-group-text px-2">
<i class="fas fa-calendar-alt"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md">
<div class="form-group my-2">
<div class="input-group date" id="query-date-range-end-picker" data-target-input="nearest">
<input type="text" id="query-date-range-end" name="query-date-range-end" class="form-control datetimepicker-input" data-target="#query-date-range-end-picker" data-toggle="datetimepicker" />
<div class="input-group-append" data-target="#query-date-range-end-picker" data-toggle="datetimepicker">
<div class="input-group-text px-2">
<i class="fas fa-calendar-alt"></i>
</div>
</div>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Team:
<div class="form-row">
<div class="col-md">
<div class="dropdown mt-3">
@{
var teamButtonValue = "Team";
if(parameterOid.HasValue && Model.SelectedValues[parameterOid.Value].Parameter is CompactTeamDC selectedTeam)
{
teamButtonValue = selectedTeam.Name;
}
}
<button class="btn btn-bewo-teams dropdown-toggle w-100" type="button" id="dropdownTeamsMenu" data-toggle="dropdown">
@teamButtonValue
</button>
<div class="dropdown-menu" id="query-team-dropdown-menu" style="max-height: 90vh !important; overflow-y: auto !important;">
<div class="input-group px-2">
<input class="form-control w-100" id="query-team-search-input" type="text" placeholder="Suchen ..." oninput="onDropdownParameterInput(this)" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetDropdownParameterSearch('team')">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<div class="dropdown-divider"></div>
@foreach(var team in Model.AllTeamsForQueries)
{
<a class="dropdown-item" style="cursor: pointer;" id="query-team-@team.TeamOid" onclick="selectTeamParameter(this, @team.TeamOid, @parameterType, @parameterOid)">@team.Name</a>
}
</div>
</div>
</div>
</div>
break;
case QueryParameterType.ServiceCategory:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Kategorie
</div>
</div>
<select class="custom-select" id="category-@i-select" onchange="selectServiceCategoryParameter(this, @parameterType, @parameterOid)">
@foreach(var category in Model.AllServiceCategoriesForQueries)
{
var selected = string.Empty;
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is ServiceCategoryDC serviceCategory && serviceCategory.Equals(category))
{
selected = "selected";
}
}
<option value="@category.ServiceCategoryOid" @selected>@category.Name</option>
}
</select>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Text:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Text
</div>
</div>
<input class="form-control w-100" type="text" id="query-text" name="query-text" />
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Year:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
Jahr
</div>
</div>
<select class="custom-select" id="year-select" onchange="selectYear()">
@foreach(var year in MobileUtils.Years)
{
var selected = string.Empty;
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is int selectedYear && year.Equals(selectedYear))
{
selected = "selected";
}
}
<option value="@MobileUtils.Years.IndexOf(year)" @selected>@year</option>
}
</select>
</div>
</div>
</div>
</div>
break;
case QueryParameterType.ValueListEntryType:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
@parameter.Name
</div>
</div>
@*<select class="custom-select" id="category-@i-select" onchange="selectServiceCategoryParameter(this, @parameterType, @parameterOid)">
@foreach(var category in Model.AllServiceCategoriesForQueries)
{
var selected = string.Empty;
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is ServiceCategoryDC serviceCategory && serviceCategory.Equals(category))
{
selected = "selected";
}
}
<option value="@category.ServiceCategoryOid" @selected>@category.Name</option>
}
</select>*@
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Organisation:
<div class="form-row">
<div class="col-md">
<div class="dropdown mt-3">
@{
var organisationButtonValue = "Organisation";
if(parameterOid.HasValue && Model.SelectedValues.ContainsKey(parameterOid.Value))
{
if(Model.SelectedValues[parameterOid.Value].Parameter is CompactOrganisationDC selectedOrganisation)
{
organisationButtonValue = selectedOrganisation.DetailDescription;
}
}
}
<button class="btn btn-bewo-organisation dropdown-toggle w-100" type="button" id="dropdownOrganisationsMenu" data-toggle="dropdown">
@organisationButtonValue
</button>
<div class="dropdown-menu" id="query-organisation-dropdown-menu" style="max-height: 90vh !important; overflow-y: auto !important;">
<div class="input-group px-2">
<input class="form-control w-100" id="query-organisation-search-input" type="text" placeholder="Suchen ..." oninput="onDropdownParameterInput(this)" />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="resetDropdownParameterSearch('organisation')">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<div class="dropdown-divider"></div>
@foreach(var organisation in Model.AllOrganisationForQuery)
{
<a class="dropdown-item" style="cursor: pointer;" id="query-team-@organisation.OrganisationOid" onclick="selectOrganisationParameter(this, @organisation.OrganisationOid, @parameterType, @parameterOid)">@organisation.Name</a>
}
</div>
</div>
</div>
</div>
break;
case QueryParameterType.Custom:
<div class="form-row">
<div class="col-md">
<div class="form-group my-2">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text prepend-input-group-text">
@parameter.Name
</div>
</div>
<select class="custom-select" id="query-custom-parameter-select" name="query-custom-parameter-select">
@foreach(var x in parameter.CustomValues)
{
<option value="@x">@x</option>
}
</select>
</div>
</div>
</div>
</div>
break;
}
}
}
</div>
}

View File

@@ -52,21 +52,18 @@
}
</script>
<div class="container-fluid my-3">
<div class="container my-3">
<div class="row h-auto" id="abc-def">
<div class="col-sm-12 col-md-4 col-lg-4 col-xl-3">
<div class="row">
<div class="col">
@Html.DropDownListFor(model => model.SelectedReportType, Model.ReportTypes, new { @class = "custom-select", onchange = "updateForm()", id = "msk-report-type-select" })
<hr />
</div>
</div>
<div class="row">
<div class="col" id="msk-form-col">
@Html.Partial("ReportViewerFormPartial", Model)
</div>
</div>
</div>
<div class="col" id="msk-form-col">
@Html.Partial("ReportViewerFormPartial", Model)
</div>
</div>
</div>

View File

@@ -36,7 +36,7 @@
</button>
</div>
</div>
<!-- !Suche -->
<!-- /Suche -->
@foreach(var customer in Model.AllCustomers)
{
var customerNameWithAlias = string.IsNullOrEmpty(customer.CustomerAlias) ?

View File

@@ -0,0 +1 @@
DevExpress.XtraReports.UI.XtraReport, DevExpress.XtraReports.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

View File

@@ -80,6 +80,7 @@
<Reference Include="DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.Data.Desktop.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.Utils.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraGauges.v23.2.Core, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraPrinting.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.Charts.v23.2.Core, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraCharts.v23.2.Wizard, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
@@ -215,6 +216,8 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Service\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -20,7 +20,7 @@ namespace BeWo.Service.Plugins
#if DEBUG
var t = "demo";
t = "irgendwaswasesnichtgibt";
//t = "irgendwaswasesnichtgibt";
//t = "5473568546"; //Interner Chat
//t = "2356097460"; // Lebenshilfe Würzburg
//t = "1234567890"; // Präsentationsdatenbank
@@ -109,7 +109,7 @@ namespace BeWo.Service.Plugins
//t = "8677523325"; // BeWo Richartz
//t = "1765854593"; // Mein Betreutes Wohnen
//t = "6802909544"; // Lebenshilfe Coburg
t = "9417634361"; // Synprax
//t = "9417634361"; // Synprax
//t = "5761861730"; // Lebenshilfe Warendorf
//t = "6712648331"; // BeWo Färber
//t = "4982295287"; // ASB Hamm

View File

@@ -32,13 +32,18 @@ namespace BeWo.Service.Plugins
List<QueryParamDC> parameter = new List<QueryParamDC>();
foreach (var item in q.Parameter)
{
QueryParamDC param = new QueryParamDC();
param.ParamType = item.Type;
param.Name = item.Name;
if (item.Type == QueryParameterType.Custom)
var param = new QueryParamDC
{
QueryParameterOid = item.Oid,
ParamType = item.Type,
Name = item.Name
};
if (item.Type == QueryParameterType.Custom)
{
param.CustomValues = new List<string>();
}
parameter.Add(param);
}

View File

@@ -1279,11 +1279,13 @@ namespace BeWo.Service.ServiceImplementations
// ToDo: Hat man das Rechte "Alles Ansehen", wird nicht anonymisiert, da CheckSchedulerRights true zurückgibt!
//var hasRightToSeeAll = user.HasRight(UserRightType.ViewAll);
appointmentsToCheckForAnonymization =
pSelectedResources.Any() || pResourcesOnly ?
result.Where(w =>
w.ResourceList.Any() && false == SUtils.CheckSchedulerRights(w, SchedulerRightsCheckType.View, user, relatedCustomerOids, true)).ToList() :
new List<SchedulerAppointmentDC>();
//appointmentsToCheckForAnonymization =
// pSelectedResources.Any() || pResourcesOnly ?
// result.Where(w =>
// w.ResourceList.Any() && false == SUtils.CheckSchedulerRights(w, SchedulerRightsCheckType.View, user, relatedCustomerOids, true)).ToList() :
// new List<SchedulerAppointmentDC>();
AnonymizeAppointments(result.Where(w => false == SUtils.CheckSchedulerRights(w, SchedulerRightsCheckType.View, user, relatedCustomerOids, true)).ToList());
if(pSelectedResources?.Any() ?? false)
{

View File

@@ -708,58 +708,17 @@ namespace BS.Shared.Core
if(hasCustomers)
{
if(isAllowedToViewCustomers)
if(isAllowedToViewAllCustomerAppointments && isAllowedToViewCustomers)
{
result = hasOnlyOwnCustomers || isAllowedToViewAllCustomerAppointments;
}
else
return true;
}
if(isAllowedToViewMyTeamsCustomers && hasOnlyTeamMembersCustomers)
{
return false;
return true;
}
//if(!isAllowedToViewAllCustomerAppointments)
//{
// return false;
//}
// ToDo: Prüfen, ob eigene Klienten, die des Teams oder fremde Klienten in der Liste sind
/*
* isAllowedToViewAllCustomerAppointments darf Kliententermine sehen. Sind Klienten in der Liste, die der Mitarbeiter nicht sehen darf, müssen diese anonymisiert werden.
*/
// Alle Klienten ansehen
//if(isAllowedToViewCustomers)
//{
// result = hasOnlyOwnCustomers || isAllowedToViewAllCustomerAppointments;
//}
//else
//{
// // ToDo: Gucken, ob CustomerOids in der Klientenliste sind, die nicht in der relatedCustomerOids-Liste sind
// if(pCustomerList.Any(a => !relatedCustomerOids.Contains(a.CustomerOid)))
// {
// result = false;
// }
// // Sind nur die eigenen
// if(isAllowedToViewOwnCustomers && hasOnlyOwnCustomers)
// {
// result = true;
// }
// // Sind nur Klienten aus eigenen Teams
// if(isAllowedToViewMyTeamsCustomers && hasOnlyTeamMembersCustomers)
// {
// result = true;
// }
// //if()
// //{
// //}
//}
return isAllowedToViewOwnCustomers && hasOnlyOwnCustomers;
}
if(!result)

View File

@@ -21,5 +21,8 @@ namespace BS.Shared.DataContracts
[DataMember]
public IList<String> CustomValues { get; set; }
[DataMember]
public long? QueryParameterOid { get; set; }
}
}