MoK: Mitarbeiterabwesenheiten hinzugefügt.

This commit is contained in:
2026-01-28 17:21:08 +01:00
parent 990f2dc3b6
commit de5e7ff829
31 changed files with 1142 additions and 410 deletions

View File

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31729.503
# Visual Studio Version 17
VisualStudioVersion = 17.14.36908.2 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeWoPlanerMobil", "BeWoPlanerMobil\BeWoPlanerMobil.csproj", "{284B02ED-114A-426C-9162-31BB6CF05589}"
EndProject
@@ -27,6 +27,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeidPartnerReports", "Repor
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PaSMoenchengladbach", "ReportImp\PaSMoenchengladbach\PaSMoenchengladbach.csproj", "{EA3C4BE1-6128-4FC9-8194-3C4202233371}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Host", "Host\Host.csproj", "{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -100,6 +102,12 @@ Global
{EA3C4BE1-6128-4FC9-8194-3C4202233371}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{EA3C4BE1-6128-4FC9-8194-3C4202233371}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EA3C4BE1-6128-4FC9-8194-3C4202233371}.Release|Any CPU.Build.0 = Release|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1154C7B-BB77-4155-9854-DAD8FC5A8BC3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -307,7 +307,9 @@
<Compile Include="Controllers\CustomerController.cs" />
<Compile Include="Controllers\DevToolsController.cs" />
<Compile Include="Controllers\DevExpressSchedulerController.cs" />
<Compile Include="Controllers\EmployeeController.cs" />
<Compile Include="Controllers\ExternalSignatureController.cs" />
<Compile Include="Controllers\IAbsenceTimeController.cs" />
<Compile Include="Controllers\PersonController.cs" />
<Compile Include="Controllers\SignableController.cs" />
<Compile Include="Controllers\ReportBaseController.cs" />
@@ -316,6 +318,10 @@
<Compile Include="Controllers\SchedulerController.cs" />
<Compile Include="Models\AbstractModel.cs" />
<Compile Include="Models\DevExpressSchedulerSessionModel.cs" />
<Compile Include="Models\EmployeeModel.cs" />
<Compile Include="Models\EmployeeSessionModel.cs" />
<Compile Include="Models\IAbsenceTimeModel.cs" />
<Compile Include="Models\IAbsenceTimeSessionModel.cs" />
<Compile Include="Models\MokZiel.cs" />
<Compile Include="Models\MokSupportConceptListObject.cs" />
<Compile Include="Models\MokMandator.cs" />
@@ -688,6 +694,9 @@
<Content Include="Views\Main\Zeiterfassungspartial.cshtml" />
<Content Include="Views\Main\SingleSignaturePopupPartial.cshtml" />
<Content Include="Views\Person\Person.cshtml" />
<Content Include="Views\Employee\Employee.cshtml" />
<Content Include="Views\Shared\AbsenceTimeFormPartial.cshtml" />
<Content Include="Views\Shared\AbsenceTimePartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="packages.config" />
@@ -728,13 +737,13 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="Views\Customer\CustomerAbsenceTimePartial.cshtml" />
<Content Include="Views\Customer\ALT_CustomerAbsenceTimePartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Customer\CustomerBargeldkassen.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Customer\CustomerAbsenceTimeFormPartial.cshtml" />
<Content Include="Views\Customer\ALT_CustomerAbsenceTimeFormPartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Report\QuittierungsbelegsPreviewPartial.cshtml" />

View File

@@ -15,7 +15,7 @@
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
<WebStackScaffolding_ControllerDialogWidth>600</WebStackScaffolding_ControllerDialogWidth>
<WebStackScaffolding_IsLayoutPageSelected>False</WebStackScaffolding_IsLayoutPageSelected>
<WebStackScaffolding_IsPartialViewSelected>False</WebStackScaffolding_IsPartialViewSelected>
<WebStackScaffolding_IsPartialViewSelected>True</WebStackScaffolding_IsPartialViewSelected>
<WebStackScaffolding_IsReferencingScriptLibrariesSelected>False</WebStackScaffolding_IsReferencingScriptLibrariesSelected>
<WebStackScaffolding_LayoutPageFile>
</WebStackScaffolding_LayoutPageFile>

View File

@@ -18,44 +18,30 @@ using DevExpress.XtraReports.UI;
namespace BeWoPlanerMobil.Controllers
{
public class CustomerController : ReportBaseController
public class CustomerController : ReportBaseController, IAbsenceTimeController
{
public CustomerController()
{
public CustomerController() { }
}
private CustomerModel _Model;
public CustomerModel Model
{
get
{
if (!MobileSessionFacade.IsUserLoggedIn())
if(!MobileSessionFacade.IsUserLoggedIn())
{
Logout();
return null;
}
if (_Model == null)
if(_Model != null)
{
_Model = new CustomerModel();
InitModel(_Model);
InitViewModel();
return _Model;
}
//if (((CustomerModel) Session[ModelSessionConstants.CustomerModelKey])?.LoggedInEmployee is null)
//{
// _Model = new CustomerModel();
_Model = new CustomerModel();
// InitModel(_Model);
// Session[ModelSessionConstants.CustomerModelKey] = _Model;
//}
//else
//{
// _Model = (CustomerModel)Session[ModelSessionConstants.CustomerModelKey];
//}
InitModel(_Model);
InitViewModel();
return _Model;
}
@@ -112,9 +98,10 @@ namespace BeWoPlanerMobil.Controllers
Model.Customers = new List<CompactCustomerDC>();
}
if(Model.CustomerSessionModel.SelectedCustomerOid.HasValue)
var selectedCustomerOid = Model.CustomerSessionModel.SelectedAbsenceTimeObjectOid;
if(selectedCustomerOid.HasValue)
{
Model.SelectedCustomer = CustomerService.LoadCustomer(Model.CustomerSessionModel.SelectedCustomerOid.Value);
Model.SelectedCustomer = CustomerService.LoadCustomer(selectedCustomerOid.Value);
}
if(Model.IsAllowedToSeeMedikamentenliste)
@@ -1271,11 +1258,11 @@ namespace BeWoPlanerMobil.Controllers
var startDateString = formCollection["customer-absence-time-start-date"];
var startTimeString = formCollection["customer-absence-time-start-time"];
var endDateString = formCollection["customer-absence-time-end-date"];
var endTimeString = formCollection["customer-absence-time-end-time"];
var category = formCollection["customer-absence-time-category"];
var notice = formCollection["customer-absence-time-notice"];
var allDay = "on" == formCollection["customer-absence-time-allday-cb"];
var endDateString = formCollection["customer-absence-time-end-date"];
var endTimeString = formCollection["customer-absence-time-end-time"];
var category = formCollection["customer-absence-time-category"];
var notice = formCollection["customer-absence-time-notice"];
var allDay = "on" == formCollection["customer-absence-time-allday-cb"];
if(allDay)
{
@@ -1340,7 +1327,6 @@ namespace BeWoPlanerMobil.Controllers
if(absenceTimeOid == 0)
{
return RedirectToActionPermanent("Customer", Model);
//return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.<br />Bitte wenden Sie sich an Ihren Systemadministrator.";
}
var selectedAbsenceTime = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Value.Equals(absenceTimeOid));
@@ -1348,13 +1334,11 @@ namespace BeWoPlanerMobil.Controllers
if(selectedAbsenceTime is null)
{
return RedirectToActionPermanent("Customer", Model);
//return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.<br />Bitte wenden Sie sich an Ihren Systemadministrator.";
}
Model.SelectedAbsenceTimeOid = absenceTimeOid;
Model.SelectedAbsenceReasonOid = selectedAbsenceTime.Reason.AbsenceReasonOid;
//return LeerzeichenFuerGetMethoden;
return RedirectToActionPermanent("Customer", Model);
}
@@ -1382,7 +1366,7 @@ namespace BeWoPlanerMobil.Controllers
TempData[TempDataConstants.DoLogoutKey] = true;
}
return PartialView("CustomerAbsenceTimeFormPartial", Model);
return PartialView("AbsenceTimeFormPartial", Model);
}
[Authorize]
@@ -1400,7 +1384,7 @@ namespace BeWoPlanerMobil.Controllers
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("CustomerAbsenceTimePartial");
return PartialView("AbsenceTimePartial");
}
var absenceTime2Delete = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Equals(absenceTimeOid));
@@ -1418,7 +1402,7 @@ namespace BeWoPlanerMobil.Controllers
LoadCustomerToModel(customer.CustomerOid);
return PartialView("CustomerAbsenceTimePartial", Model);
return PartialView("AbsenceTimePartial", Model);
}
#endregion

View File

@@ -0,0 +1,280 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Web.Mvc;
using BeWoPlanerMobil.Models;
using BeWoPlanerMobil.Service;
using BeWoPlanerMobil.Util;
using BS.Shared;
using BS.Shared.DataContracts;
namespace BeWoPlanerMobil.Controllers
{
public class EmployeeController : AbstractBaseController, IAbsenceTimeController
{
public EmployeeController() { }
[Authorize]
public override string SaveCollapsibleStatus(bool isOpen, string identifier)
{
return SaveCollapsibleStatusToModel(Model, isOpen, identifier);
}
private EmployeeModel _Model;
public EmployeeModel Model
{
get
{
if(false == MobileSessionFacade.IsUserLoggedIn())
{
Logout();
return null;
}
if(_Model != null)
{
return _Model;
}
_Model = new EmployeeModel();
InitModel(_Model);
InitViewModel();
return _Model;
}
}
[Authorize]
public ActionResult Employee(long? id)
{
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
return Logout();
}
if(id.HasValue)
{
LoadEmployeeToModel(id);
}
return View(Model);
}
private void InitViewModel()
{
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
Logout();
return;
}
Model.AllAbsenceReasons = CustomerService.GetAllAbsenceReasons()
.Where(ar => ar.Sichtbarkeit is null ||
ar.Sichtbarkeit == AbsenceReasonVisibilityType.Employee ||
ar.Sichtbarkeit == AbsenceReasonVisibilityType.All)
.ToList();
if(Model.EmployeeSessionModel.SelectedAbsenceTimeObjectOid != null)
{
Model.SelectedEmployee = EmployeeService.LoadEmployee(Model.EmployeeSessionModel.SelectedAbsenceTimeObjectOid.Value);
Model.AbsenceTimeObject = Model.SelectedEmployee;
}
var selectedAbsenceTimeOid = Model.EmployeeSessionModel.SelectedAbsenceTimeOid;
if(selectedAbsenceTimeOid.HasValue && Model.SelectedEmployee != null)
{
Model.SelectedAbsenceTime = Model.SelectedEmployee.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid?.Equals(selectedAbsenceTimeOid.Value) ?? false);
}
}
private void LoadEmployeeToModel(long? employeeOid)
{
if(employeeOid == -1)
{
Model.EmployeeSessionModel.ResetValues();
return;
}
if(Model.SelectedEmployeeOid.HasValue && Model.SelectedEmployeeOid != employeeOid)
{
Model.EmployeeSessionModel.ResetValues();
}
Model.SelectedEmployeeOid = employeeOid;
if(employeeOid != null)
{
Model.SelectedEmployee = EmployeeService.LoadEmployee(Model.EmployeeSessionModel.SelectedAbsenceTimeObjectOid.Value);
Model.AbsenceTimeObject = Model.SelectedEmployee;
}
}
[Authorize]
[HttpPost]
public ActionResult CreateOrUpdateAbsenceTime(FormCollection formCollection)
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return Logout();
}
var selectedAbsenceTime = Model.SelectedAbsenceTime;
var oid = selectedAbsenceTime?.AbsenceTimeOid;
var isNew = oid is null;
var startDateString = formCollection["employee-absence-time-start-date"];
var startTimeString = formCollection["employee-absence-time-start-time"];
var endDateString = formCollection["employee-absence-time-end-date"];
var endTimeString = formCollection["employee-absence-time-end-time"];
var category = formCollection["employee-absence-time-category"];
var notice = formCollection["employee-absence-time-notice"];
var allDay = "on" == formCollection["employee-absence-time-allday-cb"];
if(allDay)
{
startTimeString = null;
endTimeString = null;
}
var startString = $"{startDateString} {startTimeString ?? "00:00"}";
var endString = $"{endDateString} {endTimeString ?? "00:00"}";
var start = DateTime.Parse(startString);
var end = string.IsNullOrWhiteSpace(endDateString) && string.IsNullOrWhiteSpace(endTimeString) ? null : (DateTime?) DateTime.Parse(endString);
var categoryOid = long.Parse(category);
var absenceReason = Model.AllAbsenceReasons.FirstOrDefault(ar => ar.AbsenceReasonOid.HasValue && ar.AbsenceReasonOid.Value.Equals(categoryOid));
var employee = Model.SelectedEmployee;
if(isNew)
{
var absenceTime = new AbsenceTimeDC
{
EmployeeOid = employee.EmployeeOid,
Reason = absenceReason,
Start = start,
End = end,
Notice = notice
};
OperationsService.InsertNewEmployeeAbsenceTime(employee.EmployeeOid.Value, absenceTime);
}
else
{
selectedAbsenceTime.Start = start;
selectedAbsenceTime.End = end;
selectedAbsenceTime.Reason = absenceReason;
selectedAbsenceTime.Notice = notice;
OperationsService.UpdateAbsenceTime(selectedAbsenceTime);
}
LoadEmployeeToModel(employee.EmployeeOid);
Model.SelectedAbsenceTime = null;
Model.SelectedAbsenceTimeOid = null;
Model.SelectedAbsenceReasonOid = -1;
return RedirectToActionPermanent("Employee");
}
[Authorize]
[HttpPost]
public ActionResult SelectAbsenceTime(long absenceTimeOid)
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return Logout();
}
if(absenceTimeOid == 0)
{
return RedirectToActionPermanent("Employee", Model);
}
var selectedAbsenceTime = Model.SelectedEmployee.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.EmployeeOid?.Equals(absenceTimeOid) ?? false);
if(selectedAbsenceTime is null)
{
return RedirectToActionPermanent("Employee", Model);
}
Model.SelectedAbsenceTimeOid = absenceTimeOid;
Model.SelectedAbsenceReasonOid = selectedAbsenceTime.Reason.AbsenceReasonOid;
return RedirectToActionPermanent("Employee", Model);
}
[Authorize]
public string SetSelectedAbsenceTimeOid(long absenceTimeOid)
{
var selectedAbsenceTime = Model.SelectedEmployee.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid?.Equals(absenceTimeOid) ?? false);
if(selectedAbsenceTime is null)
{
return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.<br />Bitte wenden Sie sich an Ihren Systemadministrator";
}
Model.SelectedAbsenceTimeOid = absenceTimeOid;
Model.SelectedAbsenceReasonOid = selectedAbsenceTime.Reason.AbsenceReasonOid;
return LeerzeichenFuerGetMethoden;
}
[Authorize]
public ActionResult LoadAbsenceTimeToForm()
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
}
return PartialView("AbsenceTimeFormPartial", Model);
}
[Authorize]
public string DeselectAbsenceTime()
{
Model.SelectedAbsenceTimeOid = null;
Model.SelectedAbsenceReasonOid = -1;
return LeerzeichenFuerGetMethoden;
}
[Authorize]
public ActionResult DeleteAbsenceTime(long absenceTimeOid)
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("AbsenceTimePartial");
}
var absenceTime2Delete = Model.SelectedEmployee.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid?.Equals(absenceTimeOid) ?? false);
if(absenceTime2Delete is null)
{
ViewData["AbsenceTimeError"] = "Beim Löschen der Abwesenheit ist ein Fehler aufgetreten!<br/><br/>Bitte wenden Sie sich an Ihren Administrator.";
}
var employee = Model.SelectedEmployee;
employee.AbsenceTimes.Remove(absenceTime2Delete);
EmployeeService.UpdateEmployee(employee);
LoadEmployeeToModel(employee.EmployeeOid);
return PartialView("AbsenceTimePartial", Model);
}
}
}

View File

@@ -0,0 +1,27 @@
using System.Web.Mvc;
namespace BeWoPlanerMobil.Controllers
{
internal interface IAbsenceTimeController
{
[Authorize]
[HttpPost]
ActionResult CreateOrUpdateAbsenceTime(FormCollection formCollection);
[Authorize]
[HttpPost]
ActionResult SelectAbsenceTime(long absenceTimeOid);
[Authorize]
string SetSelectedAbsenceTimeOid(long absenceTimeOid);
[Authorize]
ActionResult LoadAbsenceTimeToForm();
[Authorize]
string DeselectAbsenceTime();
[Authorize]
ActionResult DeleteAbsenceTime(long absenceTimeOid);
}
}

View File

@@ -3362,10 +3362,22 @@ namespace BeWoPlanerMobil.Controllers
return RedirectToMain();
}
/// <summary>
/// Leitet zur Mitarbeiter-Seite weiter, die bis jetzt aber nur die Abwesenheiten des angemeldeten Mitarbeiters anzeigt
/// </summary>
/// <returns>Aufruf zur Mitarbeiter-Seite</returns>
[Authorize]
public ActionResult RedirectToPersons()
{
return RedirectToActionPermanent("Person", "Person");
return RedirectToActionPermanent("Person", "Person", new { id = Model.LoggedInEmployee?.EmployeeOid });
}
[Authorize]
public ActionResult RedirectToEmployees()
{
var employeeOid = Model.LoggedInEmployee.EmployeeOid;
return RedirectToActionPermanent("Employee", "Employee", new { id = Model.LoggedInEmployee?.EmployeeOid });
}
[Authorize]

View File

@@ -0,0 +1,93 @@
using BeWoPlanerMobil.Models;
using BeWoPlanerMobil.Service;
using DevExpress.Web.Internal.XmlProcessor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BeWoPlanerMobil.Controllers
{
public class PersonController : AbstractBaseController
{
public PersonController() { }
private PersonModel _Model;
public PersonModel Model
{
get
{
if(!MobileSessionFacade.IsUserLoggedIn())
{
Logout();
return null;
}
if(_Model is null)
{
_Model = new PersonModel();
InitModel(_Model);
InitViewModel();
}
return _Model;
}
}
[Authorize]
public ActionResult Person(long? id)
{
try
{
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
return Logout();
}
if(id.HasValue)
{
LoadPersonToModel(id);
}
}
catch(Exception exception)
{
Log.Info("Exception: " + exception.Message + "\n" + exception.StackTrace);
if(exception.InnerException != null)
{
Log.Info("\n\nInnerException: " + exception.InnerException.Message + "\n" + exception.InnerException.StackTrace);
}
throw;
}
return View(Model);
}
private void InitViewModel()
{
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
Logout();
return;
}
}
private void LoadPersonToModel(long? personOid)
{
if(personOid is null || (personOid.Value > 0 && false == Model.Persons.Any(p => p.PersonOid.Equals(personOid.Value))))
{
return;
}
}
public override string SaveCollapsibleStatus(bool isOpen, string identifier)
{
throw new NotImplementedException();
}
}
}

View File

@@ -51,8 +51,8 @@ namespace BeWoPlanerMobil.Models
public static string TimeOfLastAction
{
get { return MobileSessionFacade.TimeOfLastAction; }
set { MobileSessionFacade.TimeOfLastAction = value; }
get => MobileSessionFacade.TimeOfLastAction;
set => MobileSessionFacade.TimeOfLastAction = value;
}
public bool HasRightToInsertRessourceAppointments => CheckRight(UserRightType.KalenderRessourcentermineAnlegen) || CheckRight(UserRightType.CreateAll);
@@ -223,6 +223,11 @@ namespace BeWoPlanerMobil.Models
public bool HasRightToViewCustomerDocuments => CheckForAtLeastOneRight(new[] { UserRightType.ViewAll, UserRightType.DokumenteKlienten });
public bool HasRightToViewOwnEmployee => CheckForAtLeastOneRight(new[] { UserRightType.ViewAll, UserRightType.Employee_AllowViewOwnEmployees }) &&
CheckForAtLeastOneRight(new[] { UserRightType.EditAll, UserRightType.Employee_AllowEditOwnEmployees });
//public string UserMessage { get; set; }
public XtraReport Report { get; set; }
@@ -260,7 +265,9 @@ namespace BeWoPlanerMobil.Models
public List<CompactPersonDC> Persons { get; set; } = new List<CompactPersonDC>();
public Dictionary<string, bool> Collapsibles2IsShown { get => SessionModel.Collapsibles2IsShown;
public Dictionary<string, bool> Collapsibles2IsShown
{
get => SessionModel.Collapsibles2IsShown;
set => SessionModel.Collapsibles2IsShown = value;
}

View File

@@ -11,23 +11,29 @@ using DevExpress.XtraReports.UI;
namespace BeWoPlanerMobil.Models
{
public class CustomerModel : AbstractModel, ISignable
public class CustomerModel : AbstractModel, ISignable, IAbsenceTimeModel
{
public string HtmlPrefix => "customer";
public IAbsenceTime AbsenceTimeObject
{
get => SelectedCustomer;
set => SelectedCustomer = (CustomerDC) value;
}
public CustomerModel()
{
SessionModel = new CustomerSessionModel();
}
public CustomerSessionModel CustomerSessionModel
{
get
{
return SessionModel as CustomerSessionModel;
}
}
public CustomerSessionModel CustomerSessionModel => SessionModel as CustomerSessionModel;
[Display(Name = "Klient")]
public long? SelectedCustomerOid { get { return CustomerSessionModel.SelectedCustomerOid; } set { CustomerSessionModel.SelectedCustomerOid = value; } }
public long? SelectedCustomerOid
{
get => CustomerSessionModel.SelectedAbsenceTimeObjectOid;
set => CustomerSessionModel.SelectedAbsenceTimeObjectOid = value;
}
public CustomerDC SelectedCustomer { get; set; }
@@ -47,7 +53,11 @@ namespace BeWoPlanerMobil.Models
public JsonCustomer SelectedJsonCustomer => SelectedCustomer != null ? new JsonCustomer(SelectedCustomer, FolderTree, ICD10Diagnosen) : null;
[Display(Name = "Filter")]
public CustomerFilterEnum SelectedCustomerFilter { get { return CustomerSessionModel.SelectedCustomerFilter; } set { CustomerSessionModel.SelectedCustomerFilter = value; } }
public CustomerFilterEnum SelectedCustomerFilter
{
get => CustomerSessionModel.SelectedCustomerFilter;
set => CustomerSessionModel.SelectedCustomerFilter = value;
}
public List<SelectListItem> CustomerFilter
{
@@ -93,7 +103,11 @@ namespace BeWoPlanerMobil.Models
public List<CustomerReportType> ReportTypes { get; set; }
[Display(Name = "Bericht")]
public CustomerReportType SelectedReportType { get { return CustomerSessionModel.SelectedReportType; } set { CustomerSessionModel.SelectedReportType = value; } }
public CustomerReportType SelectedReportType
{
get => CustomerSessionModel.SelectedReportType;
set => CustomerSessionModel.SelectedReportType = value;
}
public List<SelectListItem> ReportTypeItems
{
@@ -117,7 +131,11 @@ namespace BeWoPlanerMobil.Models
public List<BargeldkassenDC> Bargeldkassen { get; set; } = new List<BargeldkassenDC>();
[Display(Name = "Kategorie")]
public long? SelectedAbsenceReasonOid { get { return CustomerSessionModel.SelectedAbsenceReasonOid; } set { CustomerSessionModel.SelectedAbsenceReasonOid = value; } }
public long? SelectedAbsenceReasonOid
{
get => CustomerSessionModel.SelectedAbsenceReasonOid;
set => CustomerSessionModel.SelectedAbsenceReasonOid = value;
}
public List<AbsenceReasonDC> AllAbsenceReasons { get; set; }
@@ -145,7 +163,11 @@ namespace BeWoPlanerMobil.Models
}
}
public long? SelectedAbsenceTimeOid { get { return CustomerSessionModel.SelectedAbsenceTimeOid; } set { CustomerSessionModel.SelectedAbsenceTimeOid = value; } }
public long? SelectedAbsenceTimeOid
{
get => CustomerSessionModel.SelectedAbsenceTimeOid;
set => CustomerSessionModel.SelectedAbsenceTimeOid = value;
}
public AbsenceTimeDC SelectedAbsenceTime { get; set; }
//{
@@ -157,19 +179,28 @@ namespace BeWoPlanerMobil.Models
// }
//}
public long? SelectedBargeldkasseOid { get { return CustomerSessionModel.SelectedBargeldkasseOid; } set { CustomerSessionModel.SelectedBargeldkasseOid = value; } }
public long? SelectedBargeldkasseOid
{
get => CustomerSessionModel.SelectedBargeldkasseOid;
set => CustomerSessionModel.SelectedBargeldkasseOid = value;
}
public BargeldkassenDC SelectedBargeldkasse { get; set; }
[Display(Name="Auszahlunsintervall")]
public int SelectedAuszahlungsintervall { get { return CustomerSessionModel.SelectedAuszahlungsintervall; } set { CustomerSessionModel.SelectedAuszahlungsintervall = value; } }
public List<SelectListItem> Auszahlungsintervalle =>
[Display(Name = "Auszahlunsintervall")]
public int SelectedAuszahlungsintervall
{
get => CustomerSessionModel.SelectedAuszahlungsintervall;
set => CustomerSessionModel.SelectedAuszahlungsintervall = value;
}
public List<SelectListItem> Auszahlungsintervalle =>
new List<SelectListItem>
{
new SelectListItem{Value = ((int) Auszahlungsintervall.Kein).ToString(), Text = "Kein"},
new SelectListItem{Value = ((int) Auszahlungsintervall.Monatlich).ToString(), Text = "Monatlich"},
new SelectListItem{Value = ((int) Auszahlungsintervall.Woechentlich).ToString(), Text = "Wöchentlich"},
new SelectListItem{Value = ((int) Auszahlungsintervall.Taeglich).ToString(), Text = "Täglich"},
new SelectListItem { Value = ((int) Auszahlungsintervall.Kein).ToString(), Text = "Kein" },
new SelectListItem { Value = ((int) Auszahlungsintervall.Monatlich).ToString(), Text = "Monatlich" },
new SelectListItem { Value = ((int) Auszahlungsintervall.Woechentlich).ToString(), Text = "Wöchentlich" },
new SelectListItem { Value = ((int) Auszahlungsintervall.Taeglich).ToString(), Text = "Täglich" }
};
public XtraReport BargeldkassenReportObject { get; set; }
@@ -177,17 +208,26 @@ namespace BeWoPlanerMobil.Models
public XtraReport ZahlungsbelegsReportObject { get; set; }
public long? SelectedBargeldtransaktionOid { get { return CustomerSessionModel.SelectedBargeldtransaktionOid; } set { CustomerSessionModel.SelectedBargeldtransaktionOid = value; } }
public long? SelectedBargeldtransaktionOid
{
get => CustomerSessionModel.SelectedBargeldtransaktionOid;
set => CustomerSessionModel.SelectedBargeldtransaktionOid = value;
}
public BargeldtransaktionDC SelectedBargeldtransaktion { get; set; }
[Display(Name = "Art")]
public int SelectedTransaktionsart { get { return CustomerSessionModel.SelectedTransaktionsart; } set { CustomerSessionModel.SelectedTransaktionsart = value; } }
public int SelectedTransaktionsart
{
get => CustomerSessionModel.SelectedTransaktionsart;
set => CustomerSessionModel.SelectedTransaktionsart = value;
}
public List<SelectListItem> Transaktionsarten =>
new List<SelectListItem>
{
new SelectListItem{Value=((int) Zahlungstyp.Einzahlung).ToString(), Text = "Einzahlung"},
new SelectListItem{Value=((int) Zahlungstyp.Auszahlung).ToString(), Text = "Auszahlung"}
new SelectListItem { Value = ((int) Zahlungstyp.Einzahlung).ToString(), Text = "Einzahlung" },
new SelectListItem { Value = ((int) Zahlungstyp.Auszahlung).ToString(), Text = "Auszahlung" }
};
public List<BargeldtransaktionshistoryDC> BargeldtransaktionshistoryEntries { get; set; } = new List<BargeldtransaktionshistoryDC>();

View File

@@ -1,23 +1,13 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using BeWo.View.Navigation.Filter;
using BeWoPlanerMobil.Controllers;
using BeWoPlanerMobil.Service;
using BeWoPlanerMobil.Util;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.XtraReports.UI;
namespace BeWoPlanerMobil.Models
{
[Serializable]
public class CustomerSessionModel : BaseSessionModel
public class CustomerSessionModel : BaseSessionModel, IAbsenceTimeSessionModel
{
public long? SelectedCustomerOid { get; set; }
public long? SelectedAbsenceTimeObjectOid { get; set; }
public CustomerFilterEnum SelectedCustomerFilter { get; set; }
@@ -39,7 +29,7 @@ namespace BeWoPlanerMobil.Models
{
base.ResetValues();
SelectedCustomerOid = null;
SelectedAbsenceTimeObjectOid = null;
//SelectedCustomerFilter = CustomerFilterEnum.All;
//SelectedReportType = CustomerReportType.Medikamentenliste;
SelectedAbsenceReasonOid = null;

View File

@@ -0,0 +1,75 @@
using BS.Shared.DataContracts;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace BeWoPlanerMobil.Models
{
public class EmployeeModel : AbstractModel, IAbsenceTimeModel
{
public string HtmlPrefix => "employee";
public EmployeeSessionModel EmployeeSessionModel => SessionModel as EmployeeSessionModel;
public EmployeeDC SelectedEmployee { get; set; }
public IAbsenceTime AbsenceTimeObject
{
get => SelectedEmployee;
set => SelectedEmployee = (EmployeeDC) value;
}
public AbsenceTimeDC SelectedAbsenceTime { get; set; }
[Display(Name = "Mitarbeiter")]
public long? SelectedEmployeeOid
{
get => EmployeeSessionModel.SelectedAbsenceTimeObjectOid;
set => EmployeeSessionModel.SelectedAbsenceTimeObjectOid = value;
}
public EmployeeModel()
{
SessionModel = new EmployeeSessionModel();
}
public List<AbsenceReasonDC> AllAbsenceReasons { get; set; }
public List<SelectListItem> AbsenceReasonItems
{
get
{
var result = new List<SelectListItem> { new SelectListItem { Value = "-1", Text = string.Empty } };
foreach(var absenceReason in AllAbsenceReasons)
{
if(absenceReason.AbsenceReasonOid is null)
{
continue;
}
result.Add(new SelectListItem
{
Value = absenceReason.AbsenceReasonOid.Value.ToString(),
Text = absenceReason.Description
});
}
return result;
}
}
[Display(Name = "Kategorie")]
public long? SelectedAbsenceReasonOid
{
get => EmployeeSessionModel.SelectedAbsenceReasonOid;
set => EmployeeSessionModel.SelectedAbsenceReasonOid = value;
}
public long? SelectedAbsenceTimeOid
{
get => EmployeeSessionModel.SelectedAbsenceTimeOid;
set => EmployeeSessionModel.SelectedAbsenceTimeOid = value;
}
}
}

View File

@@ -0,0 +1,21 @@
using System;
namespace BeWoPlanerMobil.Models
{
[Serializable]
public class EmployeeSessionModel : BaseSessionModel, IAbsenceTimeSessionModel
{
public long? SelectedAbsenceTimeObjectOid { get; set; }
public long? SelectedAbsenceReasonOid { get; set; }
public long? SelectedAbsenceTimeOid { get; set; }
public override void ResetValues()
{
base.ResetValues();
SelectedAbsenceTimeObjectOid = null;
SelectedAbsenceReasonOid = null;
SelectedAbsenceTimeOid = null;
}
}
}

View File

@@ -0,0 +1,17 @@
using BS.Shared.DataContracts;
using System.Collections.Generic;
using System.Web.Mvc;
namespace BeWoPlanerMobil.Models
{
public interface IAbsenceTimeModel
{
string HtmlPrefix { get; }
long? SelectedAbsenceTimeOid { get; set; }
long? SelectedAbsenceReasonOid { get; set; }
AbsenceTimeDC SelectedAbsenceTime { get; set; }
IAbsenceTime AbsenceTimeObject { get; set; }
Dictionary<string, bool> Collapsibles2IsShown { get; set; }
List<SelectListItem> AbsenceReasonItems { get; }
}
}

View File

@@ -0,0 +1,7 @@
namespace BeWoPlanerMobil.Models
{
internal interface IAbsenceTimeSessionModel
{
long? SelectedAbsenceTimeObjectOid { get; set; }
}
}

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using BS.Shared.DataContracts;
namespace BeWoPlanerMobil.Models
{
public class PersonModel : AbstractModel
{
public PersonModel()
{
SessionModel = new PersonSessionModel();
}
public PersonSessionModel PersonSessionModel => SessionModel as PersonSessionModel;
[Display(Name = "Person")]
public long? SelectedPersonOid
{
get => PersonSessionModel.SelectedPersonOid;
set => PersonSessionModel.SelectedPersonOid = value;
}
public PersonDC SelectedPerson { get; set; }
}
}

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace BeWoPlanerMobil.Models
{
[Serializable]
public class PersonSessionModel : BaseSessionModel
{
public long? SelectedPersonOid { get; set; }
public override void ResetValues()
{
base.ResetValues();
SelectedPersonOid = null;
}
}
}

View File

@@ -1,7 +1,4 @@
using System.Web.Mvc;
using BS.Shared;
namespace BeWoPlanerMobil.Util
namespace BeWoPlanerMobil.Util
{
internal interface ISignable
{

View File

@@ -496,7 +496,7 @@
</div>
</div>
</div>
<div class="col-sm-12 col-md-6 col-lg-12 mt-2 px-1">
<div class="card w-100 h-100">
<div class="card-header">
@@ -803,32 +803,32 @@
@* ----- Dokumente ----- *@
if(Model.HasRightToViewCustomerDocuments)
{
<div class="col-12">
<div class="card w-100 h-100 my-1">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-bewo-customer-card-header"></i>
</div>
<div class="d-inline d-inline-flex text-bewo-customer-card-header h-100">
<button type="button" class="btn btn-link text-bewo-customer-card-header" style="font-size: 20px;">
Dokumente
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "customer-documents-collapsible")" id="customer-documents-collapsible">
<div class="card-body">
<div class="container-fluid px-0" id="customer-document-container">
@Html.Partial("DocumentPartial", Model)
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card w-100 h-100 my-1">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-bewo-customer-card-header"></i>
</div>
<div class="d-inline d-inline-flex text-bewo-customer-card-header h-100">
<button type="button" class="btn btn-link text-bewo-customer-card-header" style="font-size: 20px;">
Dokumente
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "customer-documents-collapsible")" id="customer-documents-collapsible">
<div class="card-body">
<div class="container-fluid px-0" id="customer-document-container">
@Html.Partial("DocumentPartial", Model)
</div>
</div>
</div>
</div>
</div>
}
@* ----- Medikamentenliste ----- *@
if (Model.IsAllowedToSeeMedikamentenliste && Model.SelectedCustomer.Medikamentenverordnungslisten.Any())
{
if(Model.IsAllowedToSeeMedikamentenliste && Model.SelectedCustomer.Medikamentenverordnungslisten.Any())
{
<div class="col-12">
<div class="card w-100 h-100 my-1">
<div class="card-header" onclick="cardHeaderClick2(this)">
@@ -1028,13 +1028,13 @@
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "customer-abwesenheiten-collapsible")" id="customer-abwesenheiten-collapsible">
<div class="card-body">
<div class="card-body p-2">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#customer-absence-times-form-popup" onclick="calcAbsenceTimePrependWidth()">
Abwesenheit hinzufügen
</button>
<hr />
<hr class="my-2" />
<div id="absence-times-container">
@Html.Partial("CustomerAbsenceTimePartial", Model)
@Html.Partial("AbsenceTimePartial", Model)
</div>
</div>
</div>
@@ -1060,7 +1060,7 @@
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "customer-betreuung-collapsible")", id="customer-betreuung-collapsible">
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "customer-betreuung-collapsible")" , id="customer-betreuung-collapsible">
<div class="card-body p-1">
<div id="betreuungscontainer">
@Html.Partial("CustomerBetreuungPartial", Model)
@@ -1085,11 +1085,11 @@
</button>
</div>
<div class="modal-body p-2" id="customer-absence-time-modal-body">
@Html.Partial("CustomerAbsenceTimeFormPartial", Model)
@Html.Partial("AbsenceTimeFormPartial", Model)
</div>
<div class="modal-footer p-2">
<button class="btn btn-primary" type="button" onclick="submitCustomerAbsenceTimesForm()">OK</button>
<button class="btn btn-secondary" type="button" data-dismiss="modal" onclick="clearCustomerAbsenceTimesForm()">Abbrechen</button>
<button class="btn btn-primary" type="button" onclick="submitAbsenceTimesForm()">OK</button>
<button class="btn btn-secondary" type="button" data-dismiss="modal" onclick="clearAbsenceTimesForm()">Abbrechen</button>
</div>
</div>
</div>

View File

@@ -1,233 +0,0 @@
@using BeWoPlanerMobil.Models;
@using BS.Shared.Extensions
@model CustomerModel
<script type="text/javascript">
var initialDatePrependWidth = 0;
function calcAbsenceTimePrependWidth() {
try {
setTimeout(function () {
if(initialDatePrependWidth <= 0 && $.isNumeric(getMaxWidth("customer-absence-time-prepend"))) {
initialDatePrependWidth = getMaxWidth("customer-absence-time-prepend");
}
if(initialDatePrependWidth <= 0) {
return;
}
$(".customer-absence-time-prepend").width(getMaxWidth("customer-absence-time-prepend"));
});
} catch(error) {
showErrorPopup(error);
}
}
function validateAbsenceTimeForm() {
try {
$("#form-validation-result-column").addClass("d-none");
$("#form-validation-result-container").html("");
let validationMessage = "";
const allDay = $("#customer-absence-time-allday-cb").is(":checked");
const startDateString = $("#customer-absence-time-start-date-input").val();
const endDateString = $("#customer-absence-time-end-date-input").val(); // z.B. 2025-05-20
const startTimeString = $("#customer-absence-time-start-time-input").val(); // z.B. 09:17
const endTimeString = $("#customer-absence-time-end-time-input").val();
const isInfinite = endDateString.length === 0 && endTimeString.length === 0;
const start = allDay ? new Date(startDateString) : combineDateAndTime(new Date(startDateString), startTimeString);
const end = allDay ? new Date(endDateString) : combineDateAndTime(new Date(endDateString), endTimeString);
const isStartValid = false === isNaN(start.getTime());
const isEndValid = false === isNaN(end.getTime()) || isInfinite;
if(!isStartValid || !isEndValid) {
return "Die Datumsangaben sind ungültig!";
}
const selectedOption = $("#absence-reason-select option:selected");
if(!isInfinite && end.getTime() < start.getTime()) {
validationMessage = "Das Startdatum muss vor dem Enddatum liegen.";
}
if(selectedOption.val() === "-1") {
if(validationMessage.length === 0) {
validationMessage = "Die Kategorie darf nicht leer sein.";
} else {
validationMessage += "<br />Die Kategorie darf nicht leer sein.";
}
}
return validationMessage;
} catch(error) {
showErrorPopup(error);
}
}
function toggleAllDay() {
try {
const checkbox = $("#customer-absence-time-allday-cb");
const isChecked = checkbox.is(":checked");
if(isChecked === true) {
$("#customer-absence-time-start-time-input, #customer-absence-time-end-time-input").val(null);
}
$("#customer-absence-time-start-time-input, #customer-absence-time-end-time-input").prop("disabled", isChecked);
} catch(error) {
showErrorPopup(error);
}
}
function submitCustomerAbsenceTimesForm() {
try {
const validationMessage = validateAbsenceTimeForm();
if(validationMessage !== undefined && validationMessage !== null && validationMessage.length > 0) {
$("#form-validation-result-row").removeClass("d-none");
$("#form-validation-result-container").html(validationMessage);
return;
}
showSpinner();
$("#create-absence-time-form").submit();
$("#customer-absence-times-form-popup").modal("hide");
} catch(error) {
showErrorPopup(error);
}
}
function clearCustomerAbsenceTimesForm() {
try {
$("#customer-absence-time-notice, #customer-absence-time-start-date, #customer-absence-time-end-date, #customer-absence-time-start-time, #customer-absence-time-end-time").val("");
$.get("@Url.Action("DeselectAbsenceTime")");
//$.get("@Url.Action("DeselectAbsenceTime")").done(function() {
// $("#customer-absence-time-modal-body").load('@Url.Action("LoadAbsenceTimeToForm", "Customer")').load();
//});
} catch(error) {
showErrorPopup(error);
}
}
</script>
@using(Html.BeginForm("CreateOrUpdateAbsenceTime", "Customer", FormMethod.Post, new { id = "create-absence-time-form" }))
{
var isAllDay = Model.SelectedAbsenceTime?.Start?.IsTimeZero() ?? false;
var allDay = isAllDay ? "checked" : "";
var isDisabled = isAllDay ? "disabled" : "";
var startDate = Model.SelectedAbsenceTime?.Start?.ToString("yyyy-MM-dd");
var endDate = Model.SelectedAbsenceTime?.End?.ToString("yyyy-MM-dd");
var startTime = Model.SelectedAbsenceTime?.Start?.ToString("HH:mm");
var endTime = Model.SelectedAbsenceTime?.End?.ToString("HH:mm");
if(startTime?.Equals("00:00") ?? false)
{
startTime = string.Empty;
}
if(endTime?.Equals("00:00") ?? false)
{
endTime = string.Empty;
}
<input type="hidden" name="customer-absence-time-oid" value="@Model.SelectedAbsenceTime?.AbsenceTimeOid" />
<div class="form-row d-none" id="form-validation-result-row">
<div class="col-12">
<div class="alert alert-danger mb-0" role="alert" id="form-validation-result-container"></div>
</div>
</div>
@* Neue Datums- und Zeitinputs *@
<div class="form-row">
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Startdatum
</span>
</div>
<input type="date" value="@startDate" class="form-control" id="customer-absence-time-start-date-input" name="customer-absence-time-start-date" />
</div>
</div>
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Enddatum
</span>
</div>
<input type="date" value="@endDate" class="form-control" id="customer-absence-time-end-date-input" name="customer-absence-time-end-date" />
</div>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Von
</span>
</div>
<input type="time" class="form-control" id="customer-absence-time-start-time-input" name="customer-absence-time-start-time" @isDisabled value="@startTime" />
</div>
</div>
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Bis
</span>
</div>
<input type="time" class="form-control" id="customer-absence-time-end-time-input" name="customer-absence-time-end-time" @isDisabled value="@endTime" />
</div>
</div>
</div>
@* /Neue Datums- und Zeitinputs *@
<div class="form-row">
<div class="col-md py-1">
<div class="custom-control custom-checkbox custom-control-inline">
<input type="checkbox" class="custom-control-input" name="customer-absence-time-allday-cb" id="customer-absence-time-allday-cb" onclick="toggleAllDay()" @allDay />
<label class="custom-control-label" for="customer-absence-time-allday-cb">Ganztäglich</label>
</div>
</div>
</div>
<div class="form-row">
<div class="col-md">
<div class="form-group mb-2 mt-0">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text customer-absence-time-prepend">
Kategorie
</div>
</div>
@Html.DropDownListFor(m => m.SelectedAbsenceReasonOid, Model.AbsenceReasonItems, new { @class = "custom-select", Id = "absence-reason-select", Name = "customer-absence-time-category" })
</div>
</div>
</div>
</div>
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text customer-absence-time-prepend">
Erläuterung
</div>
</div>
<textarea class="form-control" autocomplete="on" id="customer-absence-time-notice" name="customer-absence-time-notice" maxlength="1024">@(Model.SelectedAbsenceTime?.Notice ?? string.Empty)</textarea>
</div>
</div>
</div>
</div>
}

View File

@@ -0,0 +1,81 @@
@using BeWoPlanerMobil.Util
@model BeWoPlanerMobil.Models.EmployeeModel
@{
ViewBag.Title = "Mitarbeiter";
var selectedEmployeeName = Model.SelectedEmployee.FirstName + " " + Model.SelectedEmployee.LastName;
}
<script type="text/javascript">
$(document).ready(function() {
$(".collapse").on("shown.bs.collapse", function () {
window.saveCollapsibleState($(this).attr("id"), "@Url.Action("SaveCollapsibleStatus")");
});
$(".collapse").on("hidden.bs.collapse", function() {
window.saveCollapsibleState($(this).attr("id"), "@Url.Action("SaveCollapsibleStatus")");
});
});
</script>
<div class="container-fluid mt-1 px-0 lg-max-width">
<div class="col-12">
<div class="card">
<div class="card-header">
@selectedEmployeeName
</div>
<div class="card-body p-2">
@if(Model.HasRightToViewOwnEmployee)
{
<div class="card w-100 h-100 my-1">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="d-inline-flex">
<i class="fas fa-chevron-down h-100 text-bewo-employee-card-header"></i>
</div>
<div class="d-inline d-inline-flex text-bewo-employee-card-header h-100">
<button type="button" class="btn btn-link text-bewo-employee-card-header" style="font-size: 20px;">
Abwesenheiten
</button>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, "employee-abwesenheiten-collapsible")" id="employee-abwesenheiten-collapsible">
<div class="card-body p-2">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#employee-absence-times-form-popup" onclick="calcAbsenceTimePrependWidth()">
Abwesenheit hinzufügen
</button>
<hr class="my-2"/>
<div id="absence-times-container">
@Html.Partial("AbsenceTimePartial", Model)
</div>
</div>
</div>
</div>
}
</div>
</div>
</div>
</div>
@if(Model.HasRightToViewOwnEmployee)
{
<div class="modal" tabindex="-1" role="dialog" id="employee-absence-times-form-popup">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title font-weight-bold">Abwesenheit hinzufügen</h5>
<button class="close" type="button" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<div class="modal-body p-2" id="employee-absence-time-modal-body">
@Html.Partial("AbsenceTimeFormPartial", Model)
</div>
<div class="modal-footer p-2">
<button class="btn btn-primary" type="button" onclick="submitAbsenceTimesForm()">OK</button>
<button class="btn btn-secondary" type="button" data-dismiss="modal" onclick="clearAbsenceTimesForm()">Abbrechen</button>
</div>
</div>
</div>
</div>
}

View File

@@ -0,0 +1 @@
@model BeWoPlanerMobil.Models.PersonModel

View File

@@ -0,0 +1,237 @@
@using BeWoPlanerMobil.Models;
@using BS.Shared.Extensions
@model IAbsenceTimeModel
@{
var controllerName = Model is EmployeeModel ? "Employee" : "Customer";
var prefix = Model.HtmlPrefix;
}
<script type="text/javascript">
var initialDatePrependWidth = 0;
function calcAbsenceTimePrependWidth() {
try {
setTimeout(function () {
if(initialDatePrependWidth <= 0 && $.isNumeric(getMaxWidth(`absence-time-prepend`))) {
initialDatePrependWidth = getMaxWidth(`absence-time-prepend`);
}
if(initialDatePrependWidth <= 0) {
return;
}
$(`.absence-time-prepend`).width(getMaxWidth(`absence-time-prepend`));
});
} catch(error) {
showErrorPopup(error);
}
}
function validateAbsenceTimeForm() {
try {
$("#form-validation-result-column").addClass("d-none");
$("#form-validation-result-container").html("");
let validationMessage = "";
const allDay = $(`#@Model.HtmlPrefix-absence-time-allday-cb`).is(":checked");
const startDateString = $(`#@Model.HtmlPrefix-absence-time-start-date-input`).val();
const endDateString = $(`#@Model.HtmlPrefix-absence-time-end-date-input`).val(); // z.B. 2025-05-20
const startTimeString = $(`#@Model.HtmlPrefix-absence-time-start-time-input`).val(); // z.B. 09:17
const endTimeString = $(`#@Model.HtmlPrefix-absence-time-end-time-input`).val();
const isInfinite = endDateString.length === 0 && endTimeString.length === 0;
const start = allDay ? new Date(startDateString) : combineDateAndTime(new Date(startDateString), startTimeString);
const end = allDay ? new Date(endDateString) : combineDateAndTime(new Date(endDateString), endTimeString);
const isStartValid = false === isNaN(start.getTime());
const isEndValid = false === isNaN(end.getTime()) || isInfinite;
if(!isStartValid || !isEndValid) {
return "Die Datumsangaben sind ungültig!";
}
const selectedOption = $("#absence-reason-select option:selected");
if(!isInfinite && end.getTime() < start.getTime()) {
validationMessage = "Das Startdatum muss vor dem Enddatum liegen.";
}
if(selectedOption.val() === "-1") {
if(validationMessage.length === 0) {
validationMessage = "Die Kategorie darf nicht leer sein.";
} else {
validationMessage += "<br />Die Kategorie darf nicht leer sein.";
}
}
return validationMessage;
} catch(error) {
showErrorPopup(error);
}
}
function toggleAllDay() {
try {
const checkbox = $(`#@Model.HtmlPrefix-absence-time-allday-cb`);
const isChecked = checkbox.is(":checked");
if(isChecked === true) {
$(`#@Model.HtmlPrefix-absence-time-start-time-input, #@Model.HtmlPrefix-absence-time-end-time-input`).val(null);
}
$(`#@Model.HtmlPrefix-absence-time-start-time-input, #@Model.HtmlPrefix-absence-time-end-time-input`).prop("disabled", isChecked);
} catch(error) {
showErrorPopup(error);
}
}
function submitAbsenceTimesForm() {
try {
const validationMessage = validateAbsenceTimeForm();
if(validationMessage !== undefined && validationMessage !== null && validationMessage.length > 0) {
$("#form-validation-result-row").removeClass("d-none");
$("#form-validation-result-container").html(validationMessage);
return;
}
showSpinner();
$("#create-absence-time-form").submit();
$(`#@Model.HtmlPrefix-absence-times-form-popup`).modal("hide");
} catch(error) {
showErrorPopup(error);
}
}
function clearAbsenceTimesForm() {
try {
$(`#@Model.HtmlPrefix-absence-time-notice, #@Model.HtmlPrefix-absence-time-start-date, #@Model.HtmlPrefix-absence-time-end-date, #@Model.HtmlPrefix-absence-time-start-time, #@Model.HtmlPrefix-absence-time-end-time`).val("");
$.get("@Url.Action("DeselectAbsenceTime", controllerName)");
} catch(error) {
showErrorPopup(error);
}
}
</script>
@using(Html.BeginForm("CreateOrUpdateAbsenceTime", controllerName, FormMethod.Post, new { id = "create-absence-time-form" }))
{
var isAllDay = Model.SelectedAbsenceTime?.Start?.IsTimeZero() ?? false;
var allDay = isAllDay ? "checked" : "";
var isDisabled = isAllDay ? "disabled" : "";
var startDate = Model.SelectedAbsenceTime?.Start?.ToString("yyyy-MM-dd");
var endDate = Model.SelectedAbsenceTime?.End?.ToString("yyyy-MM-dd");
var startTime = Model.SelectedAbsenceTime?.Start?.ToString("HH:mm");
var endTime = Model.SelectedAbsenceTime?.End?.ToString("HH:mm");
if(startTime?.Equals("00:00") ?? false)
{
startTime = string.Empty;
}
if(endTime?.Equals("00:00") ?? false)
{
endTime = string.Empty;
}
var absenceTimeOid = Model.SelectedAbsenceTime?.AbsenceTimeOid;
<input type="hidden" name="@prefix-absence-time-oid" value="@absenceTimeOid" />
<div class="form-row d-none" id="form-validation-result-row">
<div class="col-12">
<div class="alert alert-danger mb-0" role="alert" id="form-validation-result-container"></div>
</div>
</div>
#region Datumsangaben
<div class="form-row">
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Startdatum
</span>
</div>
<input type="date" value="@startDate" class="form-control" id="@prefix-absence-time-start-date-input" name="@prefix-absence-time-start-date" />
</div>
</div>
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Enddatum
</span>
</div>
<input type="date" value="@endDate" class="form-control" id="@prefix-absence-time-end-date-input" name="@prefix-absence-time-end-date" />
</div>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Von
</span>
</div>
<input type="time" class="form-control" id="@prefix-absence-time-start-time-input" name="@prefix-absence-time-start-time" @isDisabled value="@startTime" />
</div>
</div>
<div class="col-md-6 mt-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
Bis
</span>
</div>
<input type="time" class="form-control" id="@prefix-absence-time-end-time-input" name="@prefix-absence-time-end-time" @isDisabled value="@endTime" />
</div>
</div>
</div>
<div class="form-row">
<div class="col-md py-1">
<div class="custom-control custom-checkbox custom-control-inline">
<input type="checkbox" class="custom-control-input" name="@prefix-absence-time-allday-cb" id="@prefix-absence-time-allday-cb" onclick="toggleAllDay()" @allDay />
<label class="custom-control-label" for="@prefix-absence-time-allday-cb">Ganztäglich</label>
</div>
</div>
</div>
#endregion
<div class="form-row">
<div class="col-md">
<div class="form-group mb-2 mt-0">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text absence-time-prepend">
Kategorie
</div>
</div>
@Html.DropDownListFor(m => m.SelectedAbsenceReasonOid, Model.AbsenceReasonItems, new { @class = "custom-select", Id = "absence-reason-select", Name = Model.HtmlPrefix + "-absence-time-category" })
</div>
</div>
</div>
</div>
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text absence-time-prepend">
Erläuterung
</div>
</div>
<textarea class="form-control" autocomplete="on" id="@prefix-absence-time-notice" name="@prefix-absence-time-notice" maxlength="1024">@(Model.SelectedAbsenceTime?.Notice ?? string.Empty)</textarea>
</div>
</div>
</div>
</div>
}

View File

@@ -1,74 +1,77 @@
@using BeWoPlanerMobil.Models;
@using BeWoPlanerMobil.Models
@using BeWoPlanerMobil.Util
@using BS.Shared.Extensions
@model BeWoPlanerMobil.Models.IAbsenceTimeModel
@model CustomerModel
@{
var controllerName = Model is CustomerModel ? "Customer" : "Employee";
}
<script type="text/javascript">
@if(ViewData["AbsenceTimeError"] is string testMessage)
{
<text>
showMessagePopupWithHtml("Fehler", "<div class='alert' role='alert'>@Html.Raw(ViewData["AbsenceTimeError"])</div>");
</text>
}
@if(ViewData["AbsenceTimeError"] is string testMessage)
{
<text>
showMessagePopupWithHtml("Fehler", "<div class='alert' role='alert'>@Html.Raw(ViewData["AbsenceTimeError"])</div>");
</text>
}
$(window).ready(function() {
@if(!(Model.SelectedAbsenceTime is null))
{
<text>
$("#customer-absence-times-form-popup").modal("show");
</text>
}
});
$(window).ready(function() {
@if(Model.SelectedAbsenceTime != null)
{
<text>
$("#absence-times-form-popup").modal("show");
</text>
}
});
function deleteAbsenceTime(absenceTimeOid, absenceTimeSpanDescription) {
function deleteAbsenceTime(absenceTimeOid, absenceTimeSpanDescription) {
try {
event.stopPropagation();
const word = absenceTimeSpanDescription.includes("Ab") ? "" : "vom ";
showMessagePopupWithCallback("Abwesenheit löschen",
`Möchten Sie wirklich die Abwesenheit ${word}${absenceTimeSpanDescription.toLowerCase()} löschen?`,
function() {
showSpinner();
$("#absence-times-container").load("@Url.Action("DeleteAbsenceTime", controllerName)", {absenceTimeOid: absenceTimeOid}, function() {
hideSpinner();
});
},
false);
} catch (error) {
showErrorPopup(error);
}
}
function selectAbsenceTime(absenceTimeOid) {
try {
event.stopPropagation();
var word = absenceTimeSpanDescription.includes("Ab") ? "" : "vom ";
showMessagePopupWithCallback("Abwesenheit löschen",
"Möchten Sie wirklich die Abwesenheit " + word + absenceTimeSpanDescription.toLowerCase() + " löschen?",
function() {
showSpinner();
$("#absence-times-container").load("@Url.Action("DeleteAbsenceTime")", {absenceTimeOid: absenceTimeOid}, function() {
hideSpinner();
});
},
false);
} catch (error) {
showErrorPopup(error);
}
}
function selectAbsenceTime(absenceTimeOid) {
try {
event.stopPropagation();
$.get("@Url.Action("SetSelectedAbsenceTimeOid")", { absenceTimeOid: absenceTimeOid }).done(function(result) {
if(result !== undefined && result !== null && result.length > 1) {
showMessagePopupWithHtml("Fehler", "<div class='alert alert-danger' role='alert'>" + result + "</div>");
} else if(result !== undefined && result !== null && result.length === 1) {
$("#customer-absence-time-modal-body").load('@Url.Action("LoadAbsenceTimeToForm", "Customer")', function () {
calcAbsenceTimePrependWidth();
$("#customer-absence-times-form-popup").modal("show");
});
}
});
} catch (error) {
showErrorPopup(error);
}
}
event.stopPropagation();
$.get("@Url.Action("SetSelectedAbsenceTimeOid", controllerName)", {absenceTimeOid: absenceTimeOid}).done(function(result) {
if(result !== undefined && result !== null && result.length > 1) {
showMessagePopupWithHtml("Fehler", `<div class='alert alert-danger' role='alert'>${result}</div>`);
} else if(result !== undefined && result !== null && result.length === 1) {
$(`#@Model.HtmlPrefix-absence-time-modal-body`).load('@Url.Action("LoadAbsenceTimeToForm", controllerName)', function () {
calcAbsenceTimePrependWidth();
$(`#@Model.HtmlPrefix-absence-times-form-popup`).modal("show");
});
}
});
} catch (error) {
showErrorPopup(error);
}
}
</script>
@foreach(var absenceTime in Model.SelectedCustomer.AbsenceTimes.OrderByDescending(at => at.Start))
@foreach(var absenceTime in Model.AbsenceTimeObject.AbsenceTimes.OrderByDescending(at => at.Start))
{
if(absenceTime.Start is null)
{
continue;
}
<div class="row mb-3">
<div class="row mx-0 px-0 mb-2">
<div class="card w-100">
<div class="card-header" onclick="cardHeaderClick2(this)">
<div class="row">
@@ -98,7 +101,7 @@
</div>
</div>
</div>
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, $"customer-absence-time-{absenceTime.AbsenceTimeOid}")" id="customer-absence-time-@absenceTime.AbsenceTimeOid">
<div class="collapse @Html.GetCollapsibleClass(Model.Collapsibles2IsShown, $"{Model.HtmlPrefix}-absence-time-{absenceTime.AbsenceTimeOid}")" id="customer-absence-time-@absenceTime.AbsenceTimeOid">
<div class="card-body">
<div class="container-fluid px-0">
<div class="row">

View File

@@ -410,6 +410,19 @@
</li>
}
}
if(Model.HasRightToViewOwnEmployee)
{
using(Html.BeginForm("RedirectToEmployees", "Main", FormMethod.Post))
{
<li class="nav-item">
<button class="btn btn-link text-light no-underline" onclick="showSpinner()">
<i class="fas fa-user text-bewo-employee"></i>
Mitarbeiter
</button>
</li>
}
}
}

View File

@@ -22,7 +22,7 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.EmployeeColor = pEntity.EmployeeColor;
pDataContract.RelatedCustomerOIDList = pEntity.Employee2CustomerList.Where(w => w.CustomerOid.HasValue).Select(s => s.CustomerOid.Value).ToList();
return pDataContract;
return pDataContract;
}
// COMPACT EMPLOYEES ARE NOT EDITABLE

View File

@@ -28,7 +28,7 @@ namespace BS.Shared.DataContracts.Compact
[DataMember] public String Details2 { get; set; }
[DataMember] public String Details3 { get; set; }
[DataMember]
[DataMember]
public List<long> RelatedCustomerOIDList
{
get

View File

@@ -9,7 +9,7 @@ using BS.Shared.DataContracts.Wohnhilfe;
namespace BS.Shared.DataContracts
{
[DataContract]
public class CustomerDC : PersonDC
public class CustomerDC : PersonDC, IAbsenceTime
{
[DataMember] public List<AbsenceTimeDC> AbsenceTimes { get; set; }
[DataMember] public List<AssessmentSheetCategoryDC> AssessmentSheetCategoryDCs { get; set; }

View File

@@ -8,7 +8,7 @@ namespace BS.Shared.DataContracts
{
[DebuggerDisplay("Oid = {EmployeeOid}, Name = {LastNameFirstName}")]
[DataContract]
public class EmployeeDC : PersonDC, IDataContract
public class EmployeeDC : PersonDC, IDataContract, IAbsenceTime
{
private List<ValueListEntryDC> _Focuses;

View File

@@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace BS.Shared.DataContracts
{
/// <summary>
/// Damit im MoK nur ein PartialView für die darstellung der Abwesenheiten benötigt wird.
/// </summary>
public interface IAbsenceTime
{
List<AbsenceTimeDC> AbsenceTimes { get; set; }
}
}

View File

@@ -187,6 +187,7 @@
<Compile Include="DataContracts\AdminService\AdminServiceSumResponseDetailDC.cs" />
<Compile Include="DataContracts\AdminService\IAdminServiceDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumReqDC.cs" />
<Compile Include="DataContracts\IAbsenceTime.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberRequestDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberResponseDC.cs" />
<Compile Include="DataContracts\Person2TeamDC.cs" />