This commit is contained in:
2026-04-28 12:01:37 +02:00
parent f00ab79e9b
commit 63753087ea
31 changed files with 1173 additions and 280 deletions

View File

@@ -22,8 +22,8 @@ namespace BeWoPlanerMobil.Controllers
/*
* ToDo:
* 1. Filterung einbauen (Mitarbeiter, Klienten, Ressourcen, Privat, Aufgaben, Abwesenheiten)
* 2. "In die Zeiterfassung übertragen" und "Verfügbare Mitarbeiter prüfen" einbauen
* 3. Rechte implementieren!
* 2. Benachrichtigungen einbauen
* 3. Rechte implementieren
* 4. Übersetzungen
*/
@@ -93,19 +93,22 @@ namespace BeWoPlanerMobil.Controllers
private void InitViewModel()
{
if(false == MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || Model?.LoggedInEmployee?.EmployeeOid is null)
if(false == MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || Model?.LoggedInUser?.Employee is null)
{
Logout();
return;
}
var userSettings = LoggedInUser?.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value;
var user = Model.LoggedInUser;
var compactEmployee = user.Employee;
var employeeOid = compactEmployee.EmployeeOid;
var userSettings = user.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value;
Model.ShowOnlyMyOwnAppointments = UserSettingsUtils.GetSettingValueAsBool(userSettings, SettingsKeys.ZeigeNurMeineTermine);
if(Model.ShowOnlyMyOwnAppointments && LoggedInUser != null)
if(Model.ShowOnlyMyOwnAppointments)
{
Model.SelectedEmployeeOidsForFiltering = new List<long> { LoggedInUser.Employee.EmployeeOid };
Model.SelectedEmployeeOidsForFiltering = new List<long> { employeeOid };
}
Model.PossibleEmployees = EmployeeService.GetAllAuthorizedCompactEmployees();
@@ -123,26 +126,17 @@ namespace BeWoPlanerMobil.Controllers
categories2Resources.AddOrUpdateValueInDictionary(category, allResources.Where(resource => resource.ResourceCategory.Equals(category)).OrderBy(r => r.Name).ToList());
}
Model.ResourceCategories2Resources = categories2Resources.OrderBy(kvp => kvp.Key.DisplayName).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Model.ResourceCategories2Resources = categories2Resources.OrderBy(category2Resources => category2Resources.Key.DisplayName).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}
if(Model.LoggedInEmployee?.EmployeeOid.HasValue ?? false)
Model.MyTeamEmployees = EmployeeService.GetAllTeamMember(compactEmployee).OrderBy(employee => employee.LastName).ToList();
if(Model.HasRightToViewTeams)
{
var compactEmployee = EmployeeService.GetActiveCompactEmployeeWithOid(Model.LoggedInEmployee.EmployeeOid.Value);
Model.MyTeamEmployees = EmployeeService.GetAllTeamMember(compactEmployee).OrderBy(employee => employee.LastName).ToList();
}
else
{
Model.MyTeamEmployees = new List<CompactEmployeeDC>();
Model.MyTeams = EmployeeService.GetAllActiveCompactTeamsForEmployee(employeeOid).OrderBy(team => team.Name).ToList();
}
if(Model.HasRightToViewTeams && (Model?.LoggedInEmployee?.EmployeeOid.HasValue ?? false))
{
Model.MyTeams = EmployeeService.GetAllActiveCompactTeamsForEmployee(Model.LoggedInEmployee.EmployeeOid.Value).OrderBy(team => team.Name).ToList();
}
Model.TeamMemberCustomerOids = EmployeeService.LoadTeamsRelatedCustomerOids(LoggedInUser.Employee.EmployeeOid);
Model.TeamMemberCustomerOids = EmployeeService.LoadTeamsRelatedCustomerOids(employeeOid);
Model.SelectedEmployeesForFiltering = Model.PossibleEmployees.Where(possibleEmployee => Model.SelectedEmployeeOidsForFiltering?.Contains(possibleEmployee.EmployeeOid) ?? false).ToList();
Model.SelectedCustomersForFiltering = Model.PossibleCustomers.Where(possibleCustomer => Model.SelectedCustomerOidsForFiltering?.Contains(possibleCustomer.CustomerOid) ?? false).ToList();
@@ -160,10 +154,9 @@ namespace BeWoPlanerMobil.Controllers
UpdateSelectedObjects();
var employeeOid = Model.LoggedInEmployee.EmployeeOid.Value;
var user = LoggedInUser;
var userSettings = user?.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value;
var employeeOid = user.Employee.EmployeeOid;
var userSettings = user.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value;
Model.CurrentViewType = (SchedulerViewType) UserSettingsUtils.GetSettingValueAsInteger(userSettings, SettingsKeys.SchedulerViewType);
@@ -187,11 +180,11 @@ namespace BeWoPlanerMobil.Controllers
Model.ShowTasks
);
var selectedCustomerOids = Model.PossibleCustomers.Select(s => s.CustomerOid).ToList();
var selectedEmployeeOids = Model.PossibleEmployees.Select(s => s.EmployeeOid).ToList();
var allCustomerOids = Model.PossibleCustomers.Select(s => s.CustomerOid).ToList();
var allEmployeeOids = Model.PossibleEmployees.Select(s => s.EmployeeOid).ToList();
var customerAbsenceTimes = KalenderService.GetAllActiveCustomersAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, selectedCustomerOids);
var employeeAbsenceTimes = KalenderService.GetAllActiveEmployeeAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, selectedEmployeeOids);
var customerAbsenceTimes = KalenderService.GetAllActiveCustomersAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, allCustomerOids);
var employeeAbsenceTimes = KalenderService.GetAllActiveEmployeeAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, allEmployeeOids);
if(Model.ShowAbsenceTimes)
{
@@ -215,11 +208,25 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("SchedulerNotificationPartial", Model);
}
private int LoadNotificationCount()
private void LoadNotificationCount()
{
Model.OpenAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(LoggedInUser.Employee.EmployeeOid);
Model.OpenAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(LoggedInUser.Employee.EmployeeOid).OrderByDescending(openAppointment => openAppointment.StartDate).ToList();
Model.OpenAppointmentOids = Model.OpenAppointments.Where(openAppointment => openAppointment.SchedulerAppointmentOid.HasValue).Select(openAppointment => openAppointment.SchedulerAppointmentOid.Value).ToList();
if(Model.AppointmentOid2Answer.HasValue)
{
Model.Appointment2Answer = Model.OpenAppointments.FirstOrDefault(openAppointment => openAppointment.SchedulerAppointmentOid?.Equals(Model.AppointmentOid2Answer.Value) ?? false);
}
else
{
var first = Model.OpenAppointments.FirstOrDefault();
return Model.NotificationCount;
if(first != null)
{
Model.Appointment2Answer = first;
Model.AppointmentOid2Answer = first.SchedulerAppointmentOid;
}
}
}
private List<SchedulerAppointmentDC> ConvertAbsenceTimesToAppointments(List<AbsenceTimeDC> absenceTimes, List<CompactCustomerDC> allCustomers, List<CompactEmployeeDC> allEmployees)
@@ -441,12 +448,12 @@ namespace BeWoPlanerMobil.Controllers
}
/// <summary>
/// Hier laufen Custom-Aufrufe drüber ab. Im JavaScript mit scheduler.PerformCallback(...) aufrufen.
/// Hierüber laufen Custom-Aufrufe des DevExpress-Schedulers ab. Im JavaScript mit scheduler.PerformCallback(...) aufrufen.
/// </summary>
/// <param name="apptID">Etwaige Id des Termin-Objekts</param>
/// <param name="actionId">Die Id der auszuführenden Methode</param>
/// <param name="args">Etwaige Parameter für die auszuführende Methode</param>
/// <returns>Entweder das Scheduler-Partial oder ein anderer Seitenaufruf.</returns>
/// <returns>Entweder das Scheduler-Partial oder einen anderen Seitenaufruf.</returns>
[Authorize]
public ActionResult CustomCallbackAction(string apptID, string actionId, string[] args)
{
@@ -455,7 +462,7 @@ namespace BeWoPlanerMobil.Controllers
case "ToServiceRecord":
return ToServiceRecord(apptID, actionId, args);
case "FilterAppointments":
return FilterAppointments(args.Length >= 1 ? args[0] : null);
return FilterAppointments(args?.Length >= 1 ? args[0] : null);
case "Reload":
ReloadAppointments();
break;
@@ -524,6 +531,7 @@ namespace BeWoPlanerMobil.Controllers
private void UpdateSelectedObjects()
{
var list = new List<ResourceDC>();
Model.ResourceCategories2Resources.Values.DoForEach(l => l.DoForEach(s => list.AddIfNotIn(s)));
Model.SelectedEmployees = Model.PossibleEmployees.Where(employee => Model.SelectedEmployeeOids.Contains(employee.EmployeeOid)).ToList();
@@ -533,10 +541,6 @@ namespace BeWoPlanerMobil.Controllers
Model.SelectedEmployeesForFiltering = Model.PossibleEmployees.Where(employee => Model.SelectedEmployeeOidsForFiltering.Contains(employee.EmployeeOid)).ToList();
Model.SelectedCustomersForFiltering = Model.PossibleCustomers.Where(customer => Model.SelectedCustomerOidsForFiltering.Contains(customer.CustomerOid)).ToList();
Model.SelectedResourcesForFiltering = list.Where(resource => resource.ResourceOid.HasValue && Model.SelectedResourceOidsForFiltering.Contains(resource.ResourceOid.Value)).ToList();
Model.SelectedEmployeesForIntervalFinder = Model.PossibleEmployees.Where(employee => Model.SelectedEmployeeOidsForIntervalFinder.Contains(employee.EmployeeOid)).ToList();
Model.SelectedCustomersForIntervalFinder = Model.PossibleCustomers.Where(customer => Model.SelectedCustomerOidsForIntervalFinder.Contains(customer.CustomerOid)).ToList();
Model.SelectedResourcesForIntervalFinder = list.Where(resource => resource.ResourceOid.HasValue && Model.SelectedResourceOidsForIntervalFinder.Contains(resource.ResourceOid.Value)).ToList();
}
[Authorize]
@@ -650,7 +654,7 @@ namespace BeWoPlanerMobil.Controllers
}
[Authorize]
public ActionResult UpdateEmployeeSelection(long[] selectedEmployeeOids)
public ActionResult UpdateEmployeeSelection(long[] selectedOids)
{
if(Model is null)
{
@@ -658,7 +662,12 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("AptFltEmployeePopupListPartial");
}
var selectedEmployees = Model.PossibleEmployees.Where(possibleEmployee => selectedEmployeeOids.Contains(possibleEmployee.EmployeeOid)).ToList();
if(selectedOids is null)
{
selectedOids = Array.Empty<long>();
}
var selectedEmployees = Model.PossibleEmployees.Where(possibleEmployee => selectedOids.Contains(possibleEmployee.EmployeeOid)).ToList();
Model.SelectedEmployeesForFiltering = selectedEmployees;
Model.SelectedEmployeeOidsForFiltering = selectedEmployees.Select(employee => employee.EmployeeOid).ToList();
@@ -667,7 +676,7 @@ namespace BeWoPlanerMobil.Controllers
}
[Authorize]
public ActionResult UpdateCustomerSelection(long[] selectedCustomerOids)
public ActionResult UpdateCustomerSelection(long[] selectedOids)
{
if(Model is null)
{
@@ -675,7 +684,12 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("AptFltCustomerPopupListPartial");
}
var selectedCustomers = Model.PossibleCustomers.Where(possibleCustomer => selectedCustomerOids.Contains(possibleCustomer.CustomerOid)).ToList();
if(selectedOids is null)
{
selectedOids = Array.Empty<long>();
}
var selectedCustomers = Model.PossibleCustomers.Where(possibleCustomer => selectedOids.Contains(possibleCustomer.CustomerOid)).ToList();
Model.SelectedCustomersForFiltering = selectedCustomers;
Model.SelectedCustomerOidsForFiltering = selectedCustomers.Select(customer => customer.CustomerOid).ToList();
@@ -684,7 +698,7 @@ namespace BeWoPlanerMobil.Controllers
}
[Authorize]
public ActionResult UpdateResourceSelection(long[] selectedResourceOids)
public ActionResult UpdateResourceSelection(long[] selectedOids)
{
if(Model is null)
{
@@ -692,7 +706,12 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("AptFltResourcePopupListPartial");
}
var selectedResources = Model.PossibleResources.Where(possibleResource => possibleResource.ResourceOid.HasValue && selectedResourceOids.Contains(possibleResource.ResourceOid.Value)).ToList();
if(selectedOids is null)
{
selectedOids = Array.Empty<long>();
}
var selectedResources = Model.PossibleResources.Where(possibleResource => possibleResource.ResourceOid.HasValue && selectedOids.Contains(possibleResource.ResourceOid.Value)).ToList();
Model.SelectedResourcesForFiltering = selectedResources;
Model.SelectedResourceOidsForFiltering = selectedResources.Where(resource => resource.ResourceOid.HasValue).Select(resource => resource.ResourceOid.Value).ToList();
@@ -762,5 +781,84 @@ namespace BeWoPlanerMobil.Controllers
return PartialView("SchedulerPagePartial", Model);
}
[Authorize]
public ActionResult LoadAppointmentToAnswer(long oid)
{
Model.Appointment2Answer = Model.OpenAppointments.FirstOrDefault(openAppointment => openAppointment.SchedulerAppointmentOid?.Equals(oid) ?? false);
return PartialView("NotificationPopupContent", Model);
}
[Authorize]
public ActionResult AnswerOpenAppointment(int answer)
{
var appointment = Model.Appointment2Answer;
var employeeRelation = appointment.EmployeeList.FirstOrDefault(employee2Appointment => employee2Appointment.Employee.EmployeeOid == Model.LoggedInUser.Employee.EmployeeOid);
if(employeeRelation != null)
{
employeeRelation.ParticipationAnswer = (ParticipationAnswer) answer;
employeeRelation.IsPChanged = true;
employeeRelation.IsPC_CheckedTs = DateTime.Now;
}
KalenderService.UpdateSchedulerAppointments(new List<SchedulerAppointmentDC> { appointment });
Model.Appointment2Answer = null;
Model.AppointmentOid2Answer = null;
ReloadAppointments();
return PartialView("NotificationsPopupContent", Model);
}
[Authorize]
public ActionResult ConfirmAllOpenAppointments()
{
Model.OpenAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(Model.LoggedInUser.Employee.EmployeeOid);
foreach(var openAppointment in Model.OpenAppointments)
{
var employee2Appointment = openAppointment.EmployeeList.First(first => first.Employee.Equals(Model.LoggedInUser.Employee));
employee2Appointment.ParticipationAnswer = openAppointment.EndDate is null || openAppointment.EndDate > DateTime.Now ? ParticipationAnswer.Zusage : ParticipationAnswer.Verstrichen;
employee2Appointment.IsPChanged = true;
employee2Appointment.IsPC_CheckedTs = DateTime.Now;
}
KalenderService.UpdateSchedulerAppointments(Model.OpenAppointments);
Model.Appointment2Answer = null;
Model.AppointmentOid2Answer = null;
ReloadAppointments();
return PartialView("NotificationsPopupContent", Model);
}
[Authorize]
public ActionResult RightClickConfirm(int answer, long id)
{
var appointments = (List<SchedulerAppointmentDC>) Model.Appointments;
var appointment2Answer = appointments.FirstOrDefault(appointment => appointment.SchedulerAppointmentOid?.Equals(id) ?? false);
var rel = appointment2Answer?.EmployeeList.FirstOrDefault(employee2Appointment => employee2Appointment.Employee.Equals(Model.LoggedInCompactEmployee));
if(rel != null)
{
rel.ParticipationAnswer = (ParticipationAnswer) answer;
rel.IsPChanged = true;
rel.IsPC_CheckedTs = DateTime.Now;
}
KalenderService.UpdateSchedulerAppointments(new List<SchedulerAppointmentDC> { appointment2Answer });
ReloadAppointments();
return PartialView("SchedulerPagePartial", Model);
}
}
}