MoK: Mitarbeiterabwesenheiten hinzugefügt.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
280
BeWoPlanerMobil/Controllers/EmployeeController.cs
Normal file
280
BeWoPlanerMobil/Controllers/EmployeeController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
27
BeWoPlanerMobil/Controllers/IAbsenceTimeController.cs
Normal file
27
BeWoPlanerMobil/Controllers/IAbsenceTimeController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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]
|
||||
|
||||
93
BeWoPlanerMobil/Controllers/PersonController.cs
Normal file
93
BeWoPlanerMobil/Controllers/PersonController.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
75
BeWoPlanerMobil/Models/EmployeeModel.cs
Normal file
75
BeWoPlanerMobil/Models/EmployeeModel.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
BeWoPlanerMobil/Models/EmployeeSessionModel.cs
Normal file
21
BeWoPlanerMobil/Models/EmployeeSessionModel.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
17
BeWoPlanerMobil/Models/IAbsenceTimeModel.cs
Normal file
17
BeWoPlanerMobil/Models/IAbsenceTimeModel.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
7
BeWoPlanerMobil/Models/IAbsenceTimeSessionModel.cs
Normal file
7
BeWoPlanerMobil/Models/IAbsenceTimeSessionModel.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace BeWoPlanerMobil.Models
|
||||
{
|
||||
internal interface IAbsenceTimeSessionModel
|
||||
{
|
||||
long? SelectedAbsenceTimeObjectOid { get; set; }
|
||||
}
|
||||
}
|
||||
30
BeWoPlanerMobil/Models/PersonModel.cs
Normal file
30
BeWoPlanerMobil/Models/PersonModel.cs
Normal 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; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
20
BeWoPlanerMobil/Models/PersonSessionModel.cs
Normal file
20
BeWoPlanerMobil/Models/PersonSessionModel.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,4 @@
|
||||
using System.Web.Mvc;
|
||||
using BS.Shared;
|
||||
|
||||
namespace BeWoPlanerMobil.Util
|
||||
namespace BeWoPlanerMobil.Util
|
||||
{
|
||||
internal interface ISignable
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
81
BeWoPlanerMobil/Views/Employee/Employee.cshtml
Normal file
81
BeWoPlanerMobil/Views/Employee/Employee.cshtml
Normal 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>×</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>
|
||||
}
|
||||
1
BeWoPlanerMobil/Views/Person/Person.cshtml
Normal file
1
BeWoPlanerMobil/Views/Person/Person.cshtml
Normal file
@@ -0,0 +1 @@
|
||||
@model BeWoPlanerMobil.Models.PersonModel
|
||||
237
BeWoPlanerMobil/Views/Shared/AbsenceTimeFormPartial.cshtml
Normal file
237
BeWoPlanerMobil/Views/Shared/AbsenceTimeFormPartial.cshtml
Normal 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>
|
||||
}
|
||||
@@ -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">
|
||||
@@ -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>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
12
Shared/DataContracts/IAbsenceTime.cs
Normal file
12
Shared/DataContracts/IAbsenceTime.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user