2019-07-25 14:58:13 +02:00
using System ;
using System.Collections.Generic ;
2020-04-02 13:19:14 +02:00
using System.Globalization ;
2019-07-25 14:58:13 +02:00
using System.Linq ;
using System.Web.Mvc ;
using BeWoPlanerMobil.Models ;
using BeWoPlanerMobil.Service ;
2020-09-21 11:57:10 +02:00
using BeWoPlanerMobil.Util ;
2021-01-14 16:30:28 +01:00
using BS.Shared ;
2019-07-25 14:58:13 +02:00
using BS.Shared.DataContracts ;
using BS.Shared.DataContracts.Compact ;
using BS.Shared.Extensions ;
using DevExpress.XtraScheduler ;
using DevExpress.XtraScheduler.Compatibility ;
2020-06-29 19:24:24 +02:00
using Newtonsoft.Json ;
2019-07-25 14:58:13 +02:00
using static BeWoPlanerMobil . Util . MobileUtils ;
2021-11-08 20:24:26 +01:00
using RecurrenceInformation = BS . Shared . Core . RecurrenceInformation ;
2019-07-25 14:58:13 +02:00
namespace BeWoPlanerMobil.Controllers
{
public class SchedulerController : AbstractBaseController
{
private SchedulerModel _Model ;
public SchedulerModel Model
{
get
{
if ( ! MobileSessionFacade . IsUserLoggedIn ( ) )
{
2020-10-07 19:42:17 +02:00
Logout ( ) ;
2019-07-25 14:58:13 +02:00
return null ;
}
2022-08-10 14:13:29 +02:00
if ( ( ( SchedulerModel ) Session [ ModelSessionConstants . SchedulerModelKey ] ) ? . Employee is null )
2019-07-25 14:58:13 +02:00
{
_Model = new SchedulerModel { Employee = MobileSessionFacade . LoggedInEmployee } ;
2020-09-21 11:57:10 +02:00
Session [ ModelSessionConstants . SchedulerModelKey ] = _Model ;
2019-07-25 14:58:13 +02:00
}
else
{
2020-09-21 11:57:10 +02:00
_Model = ( SchedulerModel ) Session [ ModelSessionConstants . SchedulerModelKey ] ;
2019-07-25 14:58:13 +02:00
}
return _Model ;
}
}
[Authorize]
public ActionResult Scheduler ( )
{
2022-12-30 16:28:23 +01:00
if ( ! MobileSessionFacade . IsUserLoggedIn ( ) | | Request . Browser . Browser . Equals ( "InternetExplorer" ) | | ! AbstractModel . IsAllowedToSeeScheduler )
2019-07-25 14:58:13 +02:00
{
2020-10-07 19:42:17 +02:00
return Logout ( ) ;
2019-07-25 14:58:13 +02:00
}
2020-06-29 19:24:24 +02:00
if ( AbstractModel . HasRightToInsertRessourceAppointments )
{
var allResources = KalenderService . GetAllResources ( ) . ToList ( ) ;
var categories2Resources = new Dictionary < ValueListEntryDC , List < ResourceDC > > ( ) ;
foreach ( var category in allResources . Select ( resource = > resource . ResourceCategory ) )
{
categories2Resources . AddOrUpdateValueInDictionary ( category , allResources . Where ( resource = > resource . ResourceCategory . Equals ( category ) ) . ToList ( ) ) ;
}
Model . ResourceCategories2Resources = categories2Resources ;
}
2022-12-30 16:28:23 +01:00
if ( Model ? . Employee ? . EmployeeOid . HasValue ? ? false )
{
var compactEmployee = EmployeeService . GetActiveCompactEmployeeWithOid ( Model . Employee . EmployeeOid . Value ) ;
Model . MyTeamEmployees = EmployeeService . GetAllTeamMember ( compactEmployee ) ;
}
else if ( ! ( Model is null ) )
{
Model . MyTeamEmployees = new List < CompactEmployeeDC > ( ) ;
}
if ( AbstractModel . HasRightToViewTeams & & ( Model ? . Employee ? . EmployeeOid . HasValue ? ? false ) )
{
Model . MyTeams = EmployeeService . GetAllActiveCompactTeamsForEmployee ( Model . Employee . EmployeeOid . Value ) ;
}
2020-04-02 13:19:14 +02:00
LoadAppointmentsForDate ( ) ;
2019-07-25 14:58:13 +02:00
return View ( Model ) ;
}
2020-04-02 13:19:14 +02:00
private void LoadAppointmentsForDate ( )
2019-07-25 14:58:13 +02:00
{
2022-08-10 14:13:29 +02:00
if ( Model ? . Employee . EmployeeOid is null )
2019-07-25 14:58:13 +02:00
{
2020-04-02 13:19:14 +02:00
return ;
}
2019-07-25 14:58:13 +02:00
2020-04-02 13:19:14 +02:00
var date = Model . SelectedDate ;
2021-11-08 20:24:26 +01:00
var monday = date . GetInSameCalendarWeek ( DayOfWeek . Monday ) ;
var sunday = monday . Date . AddDays ( 6 ) ;
var start = date ;
var end = date . AddDays ( 1 ) ;
if ( Model . SelectedSchedulerView = = "5" )
{
start = monday ;
end = monday . AddDays ( 4 ) ;
}
else if ( Model . SelectedSchedulerView = = "7" )
{
start = monday ;
end = sunday ;
}
2019-07-25 14:58:13 +02:00
2022-12-30 16:28:23 +01:00
var selectedCustomers = Model . SelectedCustomersForFiltering ? . Select ( s = > s . CustomerOid ) . ToList ( ) ? ? new List < long > ( ) ;
var selectedEmployees = Model . SelectedEmployeesForFiltering ? . Select ( s = > s . EmployeeOid ) . ToList ( ) ? ? new List < long > ( ) ;
var selectedResources = Model . SelectedResourcesForFiltering ? . Where ( w = > w . ResourceOid . HasValue ) . Select ( s = > s . ResourceOid . Value ) . ToList ( ) ? ? new List < long > ( ) ;
2019-07-29 19:40:14 +02:00
2022-12-30 16:28:23 +01:00
var appointments = KalenderService . LoadFilteredAppointmentsMitAufgaben ( AbstractModel . HasRightToViewEmployeeAppointments , Model . Employee . EmployeeOid . Value , start . Date , end , selectedEmployees , selectedCustomers , selectedResources , false , false , false , false , true , true ) . ToList ( ) ;
2020-04-24 19:08:09 +02:00
2023-03-29 19:25:21 +02:00
var allDayTestAppointment = appointments . FirstOrDefault ( f = > f . AllDay & & f . Subject . Equals ( "Ganztägiger Termin" ) ) ;
2022-12-30 16:28:23 +01:00
var tasks = appointments . Where ( w = > w . IsTask & & w . CompletedDate is null ) . ToList ( ) ;
2020-04-24 19:08:09 +02:00
2020-04-02 13:19:14 +02:00
// Nur eigene Kliententermine ansehen
2022-12-30 16:28:23 +01:00
if ( ! AbstractModel . HasRightToViewCustomerAppointments )
2020-04-02 13:19:14 +02:00
{
appointments = appointments . Where ( a = > a . CustomerList . All ( c = > MobileSessionFacade . LoggedInEmployee . RelatedCustomers . Any ( rc = > rc . Customer . Equals ( c ) ) ) ) . ToList ( ) ;
}
2019-07-29 19:40:14 +02:00
2022-12-30 16:28:23 +01:00
if ( ! AbstractModel . HasRightToViewAllResourceAppointments )
2020-04-02 13:19:14 +02:00
{
appointments = appointments . Where ( a = > a . ResourceList . Count = = 0 ) . ToList ( ) ;
}
2019-07-29 19:40:14 +02:00
2020-04-02 13:19:14 +02:00
if ( ! AbstractModel . IsAllowedToSeeCustomers )
{
appointments = appointments . Where ( a = > a . CustomerList . Count = = 0 ) . ToList ( ) ;
}
2019-07-29 19:40:14 +02:00
2023-03-29 19:25:21 +02:00
// Wenn es ein ganztägiger Termin ist, eine Sekunde abziehen und beim Speichern wieder draufaddieren?
foreach ( var app in appointments . Where ( a = > a . AllDay ) )
{
app . EndDate = app . EndDate . Value . AddMinutes ( - 1 ) ;
}
2020-04-02 13:19:14 +02:00
var holySweetFlyingFuck = appointments . Where ( w = >
2021-11-08 20:24:26 +01:00
w . IsTask = = false & & // Aufgaben ausschließen
w . StartDate . HasValue & & w . EndDate . HasValue & & // Datumsangaben haben einen Wert
( date . InBetween ( w . StartDate . Value , w . EndDate . Value , false ) | | date . CompareShortDates ( w . StartDate . Value ) )
2023-01-16 14:33:52 +01:00
// Einzeltermine oder Ausnahmen und gelöschte Ausnahmen
2022-08-10 14:13:29 +02:00
& & ( w . RecurrenceInfo is null | | w . RecurrenceInfo ! = null & & ( w . Type = = 3 | | w . Type = = 4 ) )
2021-11-08 20:24:26 +01:00
) . ToList ( ) ;
2019-07-25 14:58:13 +02:00
2020-07-13 16:25:43 +02:00
var deletedOccurrences = holySweetFlyingFuck . Where ( w = > w . Type = = 4 ) . Select ( s = > BS . Shared . Core . Utils . GetOccurrenceId ( s . RecurrenceInfo ) ) . ToList ( ) ;
var changedOccurrences = holySweetFlyingFuck . Where ( w = > w . Type = = 3 ) . Select ( s = > BS . Shared . Core . Utils . GetOccurrenceId ( s . RecurrenceInfo ) ) . ToList ( ) ;
2019-07-25 14:58:13 +02:00
2020-04-02 13:19:14 +02:00
holySweetFlyingFuck = holySweetFlyingFuck . Where ( w = > w . Type ! = 4 ) . ToList ( ) ;
2021-11-08 20:24:26 +01:00
holySweetFlyingFuck . AddRangeIfElementsNotIn ( CalculateRecurrences ( appointments , start , end , changedOccurrences , deletedOccurrences ) ) ;
2022-12-30 16:28:23 +01:00
holySweetFlyingFuck . AddRange ( tasks ) ;
2021-11-08 20:24:26 +01:00
2022-12-30 16:28:23 +01:00
Model . Appointments = holySweetFlyingFuck . Where ( w = > w . IsTask = = Model . ShouldLoadTasks ) . OrderBy ( appointment = > appointment . StartDate ) . ToList ( ) ;
2021-11-08 20:24:26 +01:00
2023-03-03 21:54:36 +01:00
Model . WeekViewObject = new WeekViewObject ( Model . Appointments , Model . SelectedDate . GetInSameCalendarWeek ( DayOfWeek . Monday ) , Model . Employee ) ;
2021-11-08 20:24:26 +01:00
2022-12-30 16:28:23 +01:00
if ( AbstractModel . HasRightToViewCustomerSelectionInScheduler )
2021-11-08 20:24:26 +01:00
{
Model . AllCustomers = EmployeeService . GetActiveCompactCustomersForEmployee ( Model . Employee . EmployeeOid ) . OrderBy ( o = > o . DetailDescription ) . ToList ( ) ;
}
2022-12-30 16:28:23 +01:00
if ( AbstractModel . HasRightToViewEmployeeAppointments )
2021-11-08 20:24:26 +01:00
{
Model . AllEmployees = EmployeeService . GetActiveCompactEmployeesForEmployee ( Model . Employee . EmployeeOid . Value ) . OrderBy ( o = > o . DetailDescription ) . ToList ( ) ;
}
}
private static IEnumerable < SchedulerAppointmentDC > CalculateRecurrences ( IEnumerable < SchedulerAppointmentDC > appointments , DateTime start , DateTime end , IReadOnlyCollection < RecurrenceInformation > changedOccurrences , IReadOnlyCollection < RecurrenceInformation > deletedOccurrences )
{
var result = new List < SchedulerAppointmentDC > ( ) ;
var interval = new TimeInterval ( start , end ) ;
foreach ( var appointment in appointments . Where ( app = > app . RecurrenceInfo ! = null & & app . Type = = 1 ) )
2020-04-02 13:19:14 +02:00
{
2020-07-13 16:25:43 +02:00
var recurrenceInfo = new RecurrenceInfo ( ) ;
recurrenceInfo . FromXml ( appointment . RecurrenceInfo ) ;
var occurrenceCalculator = OccurrenceCalculator . CreateInstance ( recurrenceInfo ) ;
2019-07-25 14:58:13 +02:00
2020-07-13 16:25:43 +02:00
var pattern = StaticAppointmentFactory . CreateAppointment ( AppointmentType . Pattern ) ;
pattern . RecurrenceInfo . FromXml ( appointment . RecurrenceInfo ) ;
pattern . Start = pattern . RecurrenceInfo . Start ;
pattern . End = pattern . RecurrenceInfo . End ;
var patternId = pattern . RecurrenceInfo . Id . ToString ( ) ;
2019-07-25 14:58:13 +02:00
2020-07-13 16:25:43 +02:00
var occurrences = occurrenceCalculator . CalcOccurrences ( interval , pattern ) ;
2019-07-25 14:58:13 +02:00
2020-07-13 16:25:43 +02:00
if ( occurrences . Count > 0 )
{
2021-11-08 20:24:26 +01:00
foreach ( var app in occurrences . GetAppointments ( interval ) )
2020-04-02 13:19:14 +02:00
{
2021-11-08 20:24:26 +01:00
var index = app . RecurrenceIndex ;
2023-03-03 21:54:36 +01:00
2020-07-13 16:25:43 +02:00
var duration = ( appointment . EndDate . Value - appointment . StartDate . Value ) . TotalMinutes ;
2021-11-08 20:24:26 +01:00
var isOutOfInterval = app . Start . GetShortDateTime ( ) . AreInBetweenDates ( app . Start . AddMinutes ( duration ) , start , end ) = = false ;
var isChangedOccurrence = changedOccurrences . Any ( a = > a . PatternId . Equals ( patternId ) & & a . Index = = index ) ;
var isDeletedOccurrence = deletedOccurrences . Any ( a = > a . PatternId . Equals ( patternId ) & & a . Index = = index ) ;
if ( isOutOfInterval | | isChangedOccurrence | | isDeletedOccurrence )
2019-07-25 14:58:13 +02:00
{
2020-07-13 16:25:43 +02:00
continue ;
2019-07-25 14:58:13 +02:00
}
2020-07-13 16:25:43 +02:00
var recurringAppointment = new SchedulerAppointmentDC
{
2022-05-12 18:36:05 +02:00
AllDay = appointment . AllDay ,
CustomerList = appointment . CustomerList ,
2023-03-14 16:12:52 +01:00
Description = appointment . Description ? . RemoveUppercaseEsszett ( ) ,
2022-05-12 18:36:05 +02:00
EmployeeList = appointment . EmployeeList ,
EndDate = app . Start . AddMinutes ( duration ) ,
2020-07-13 16:25:43 +02:00
FormerBookingSequenceOid = appointment . FormerBookingSequenceOid ,
2022-05-12 18:36:05 +02:00
IsPrivate = appointment . IsPrivate ,
2022-06-13 15:38:43 +02:00
LabelKey = appointment . LabelKey ,
2023-03-14 16:12:52 +01:00
Location = appointment . Location ? . RemoveUppercaseEsszett ( ) ,
2022-05-12 18:36:05 +02:00
Originator = appointment . Originator ,
RecurrenceInfo = app . RecurrenceInfo . ToXml ( ) ,
2023-03-03 21:54:36 +01:00
RecurrenceIndex = index ,
2022-05-12 18:36:05 +02:00
ReminderInfo = appointment . ReminderInfo ,
ResourceList = appointment . ResourceList ,
StartDate = app . Start ,
2023-03-14 16:12:52 +01:00
Subject = appointment . Subject ? . RemoveUppercaseEsszett ( ) ? ? "" ,
2023-03-03 21:54:36 +01:00
Type = ( int ) app . Type ,
ServiceRecordList = appointment . ServiceRecordList ,
SupportConceptList = appointment . SupportConceptList
2020-07-13 16:25:43 +02:00
} ;
2021-11-08 20:24:26 +01:00
result . AddIfNotIn ( recurringAppointment ) ;
2019-07-25 14:58:13 +02:00
}
}
2020-04-02 13:19:14 +02:00
}
2019-07-25 14:58:13 +02:00
2022-05-12 18:36:05 +02:00
// Es wird bei ganztägigen Serienterminen eine Minute abgezogen, damit die nicht als zweitägig angezeigt werden. Bearbeiten kann man Serientermin im MoK noch nicht.
foreach ( var app in result . Where ( w = > w . AllDay & & w . EndDate . HasValue ) )
{
app . EndDate = app . EndDate . Value . AddMinutes ( - 1 ) ;
}
2021-11-08 20:24:26 +01:00
return result ;
2019-07-25 14:58:13 +02:00
}
[Authorize]
2020-04-02 13:19:14 +02:00
[HttpPost]
public ActionResult InsertOrUpdateAppointment ( FormCollection formCollection )
2019-07-25 14:58:13 +02:00
{
try
{
2023-02-01 20:41:13 +01:00
if ( Model is null )
2019-07-25 14:58:13 +02:00
{
2023-03-03 21:54:36 +01:00
return Logout ( ) ;
2019-07-25 14:58:13 +02:00
}
2020-09-21 11:57:10 +02:00
var rawStartDate = formCollection [ FormCollectionConstants . AppointmentStartDateKey ] ;
var rawEndDate = formCollection [ FormCollectionConstants . AppointmentEndDateKey ] ;
var rawStartTime = formCollection [ FormCollectionConstants . AppointmentStartTimeKey ] ;
var rawEndTime = formCollection [ FormCollectionConstants . AppointmentEndTimeKey ] ;
var subject = formCollection [ FormCollectionConstants . AppointmentSubjectKey ] ;
var location = formCollection [ FormCollectionConstants . AppointmentLocationKey ] ;
var notice = formCollection [ FormCollectionConstants . AppointmentNoticeKey ] ;
2019-07-25 14:58:13 +02:00
2023-03-14 16:12:52 +01:00
subject = subject . RemoveUppercaseEsszett ( ) ;
location = location . RemoveUppercaseEsszett ( ) ;
notice = notice . RemoveUppercaseEsszett ( ) ;
2023-03-03 21:54:36 +01:00
var isPrivate = formCollection [ FormCollectionConstants . AppointmentIsPrivateKey ] = = "true,false" ;
var allDay = formCollection [ FormCollectionConstants . AppointmentIsAllDayKey ] = = "true,false" ;
2022-02-10 11:06:03 +01:00
2020-04-02 13:19:14 +02:00
var isSuccessfulStartTime = DateTime . TryParseExact ( rawStartTime , "HH:mm" , null , DateTimeStyles . None , out var startTime ) ;
var isSuccessfulEndTime = DateTime . TryParseExact ( rawEndTime , "HH:mm" , null , DateTimeStyles . None , out var endTime ) ;
2022-08-10 14:13:29 +02:00
if ( rawStartTime is null )
2022-02-10 11:06:03 +01:00
{
rawStartTime = "00:00" ;
}
2023-02-01 20:41:13 +01:00
if ( rawEndTime is null )
2022-02-10 11:06:03 +01:00
{
rawEndTime = "00:00" ;
}
2020-06-29 19:24:24 +02:00
var startAndEnd = ConvertStringDatesToDateTimes ( $"{rawStartDate} {rawStartTime}" , $"{rawEndDate} {rawEndTime}" ) ;
var startDate = startAndEnd . StartDate ;
var endDate = startAndEnd . EndDate ;
2023-02-01 20:41:13 +01:00
if ( ! allDay & & isSuccessfulStartTime & & isSuccessfulEndTime | | allDay )
2019-07-25 14:58:13 +02:00
{
2020-04-02 13:19:14 +02:00
startDate = startDate . MergeDatesByDate ( startTime ) ;
endDate = endDate . MergeDatesByDate ( endTime ) ;
var appointmentToInsert = Model . SelectedAppointment ? ? new SchedulerAppointmentDC ( ) ;
2020-06-29 19:24:24 +02:00
var isNew = ! appointmentToInsert . SchedulerAppointmentOid . HasValue ;
2021-11-08 20:24:26 +01:00
var appointmentEmployeeList = new List < Employee2SchedulerAppointmentDC > ( ) ;
if ( Model . SelectedEmployees ? . Any ( ) ? ? false )
{
foreach ( var employee in Model . SelectedEmployees )
{
var employee2Appointment = new Employee2SchedulerAppointmentDC
{
Employee = employee ,
} ;
appointmentEmployeeList . Add ( employee2Appointment ) ;
}
}
2023-02-01 20:41:13 +01:00
if ( allDay )
{
startDate = startDate . Date ;
2023-03-29 19:54:16 +02:00
endDate = endDate . AddDays ( 1 ) ;
2023-02-01 20:41:13 +01:00
}
2021-11-08 20:24:26 +01:00
appointmentToInsert . EmployeeList = appointmentEmployeeList ;
appointmentToInsert . CustomerList = Model . SelectedCustomers ;
2020-06-29 19:24:24 +02:00
appointmentToInsert . ResourceList = Model . SelectedResources ? ? new List < ResourceDC > ( ) ;
appointmentToInsert . SupportConceptList = isNew ? new List < CompactSupportConceptDC > ( ) : appointmentToInsert . SupportConceptList ;
2023-03-14 16:12:52 +01:00
appointmentToInsert . ServiceRecordList = isNew ? new List < ServiceRecordDC > ( ) : appointmentToInsert . ServiceRecordList ;
2020-04-02 13:19:14 +02:00
appointmentToInsert . EndDate = endDate ;
appointmentToInsert . StartDate = startDate ;
appointmentToInsert . Subject = subject ;
appointmentToInsert . Description = notice ;
appointmentToInsert . Originator = MobileSessionFacade . LoggedInCompactEmployee ;
appointmentToInsert . Location = location ;
2021-01-14 16:30:28 +01:00
appointmentToInsert . ActivationType = ActivationTypeId . Active ;
2022-02-10 11:06:03 +01:00
appointmentToInsert . IsPrivate = isPrivate ;
appointmentToInsert . AllDay = allDay ;
2020-04-02 13:19:14 +02:00
2022-05-12 18:36:05 +02:00
// Eine Minute addieren, wenn die Uhrzeit eines ganztägigen Termins nicht exakt 00:00 ist.
2023-03-29 19:54:16 +02:00
// ToDo: Wird beim SelectAppointmentToEdit gemacht, damit die Formularanzeige korrekt ist!
2022-05-12 18:36:05 +02:00
if ( allDay & & endDate . Hour = = 23 & & endDate . Minute = = 59 )
{
appointmentToInsert . EndDate = endDate . AddMinutes ( 1 ) ;
}
2022-12-30 16:28:23 +01:00
// ToDo: Rechte beachten!
if ( appointmentToInsert . CanBeEdited )
2020-04-02 13:19:14 +02:00
{
2022-12-30 16:28:23 +01:00
if ( ! isNew )
{
KalenderService . UpdateSchedulerAppointments ( new List < SchedulerAppointmentDC > { appointmentToInsert } ) ;
}
else
{
KalenderService . InsertSchedulerAppointments ( new List < SchedulerAppointmentDC > { appointmentToInsert } ) ;
}
2020-04-02 13:19:14 +02:00
}
}
2019-07-25 14:58:13 +02:00
}
2023-02-01 20:41:13 +01:00
catch ( Exception exception )
2019-07-25 14:58:13 +02:00
{
2020-04-02 13:19:14 +02:00
Log . Error ( exception . Message , exception ) ;
}
finally
{
2023-02-01 20:41:13 +01:00
if ( Model ! = null )
2020-04-02 13:19:14 +02:00
{
2023-03-29 19:54:16 +02:00
Model . IsAllDay = false ;
2020-04-02 13:19:14 +02:00
Model . SelectedAppointment = null ;
2020-06-29 19:24:24 +02:00
Model . SelectedResources ? . Clear ( ) ;
2023-02-01 20:41:13 +01:00
Model . SelectedCustomers ? . Clear ( ) ;
Model . SelectedEmployees ? . Clear ( ) ;
2020-04-02 13:19:14 +02:00
}
2019-07-25 14:58:13 +02:00
}
2020-04-02 13:19:14 +02:00
return RedirectToActionPermanent ( "Scheduler" ) ;
2019-07-25 14:58:13 +02:00
}
[Authorize]
2020-04-02 13:19:14 +02:00
[HttpPost]
public ActionResult NavigateToPreviousDate ( )
2019-07-25 14:58:13 +02:00
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2019-07-25 14:58:13 +02:00
{
2023-03-03 21:54:36 +01:00
return Logout ( ) ;
2020-04-02 13:19:14 +02:00
}
2019-07-25 14:58:13 +02:00
2020-04-02 13:19:14 +02:00
Model . SelectedDate = Model . SelectedDate . AddDays ( - 1 ) ;
2019-07-25 14:58:13 +02:00
2020-05-12 14:20:58 +02:00
if ( Model ! = null )
{
Model . SelectedAppointment = null ;
2022-08-11 15:10:01 +02:00
//Model.SelectedResources.Clear();
2020-05-12 14:20:58 +02:00
}
2020-04-02 13:19:14 +02:00
return RedirectToActionPermanent ( "Scheduler" ) ;
}
2019-07-25 14:58:13 +02:00
2020-04-02 13:19:14 +02:00
[Authorize]
[HttpPost]
public ActionResult NavigateToNextDate ( )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2020-04-02 13:19:14 +02:00
{
2023-03-03 21:54:36 +01:00
return Logout ( ) ;
2019-07-25 14:58:13 +02:00
}
2020-04-02 13:19:14 +02:00
Model . SelectedDate = Model . SelectedDate . AddDays ( 1 ) ;
2022-12-30 16:28:23 +01:00
if ( ! ( Model is null ) )
2020-05-12 14:20:58 +02:00
{
Model . SelectedAppointment = null ;
2022-08-11 15:10:01 +02:00
//Model.SelectedResources.Clear();
2020-05-12 14:20:58 +02:00
}
2020-04-02 13:19:14 +02:00
return RedirectToActionPermanent ( "Scheduler" ) ;
}
[Authorize]
[HttpPost]
public ActionResult SelectSchedulerDate ( FormCollection formCollection ) {
2023-03-03 21:54:36 +01:00
if ( Model is null )
2019-07-25 14:58:13 +02:00
{
2023-03-03 21:54:36 +01:00
return Logout ( ) ;
2020-04-02 13:19:14 +02:00
}
2020-09-21 11:57:10 +02:00
var rawSchedulerDate = formCollection [ FormCollectionConstants . AppointmentSchedulerDateKey ] ;
2020-04-02 13:19:14 +02:00
var schedulerDate = DateTime . ParseExact ( rawSchedulerDate , "dd.MM.yyyy" , null ) ;
Model . SelectedDate = schedulerDate ;
2023-03-03 21:54:36 +01:00
Model . SelectedAppointment = null ;
Model . SelectedResources . Clear ( ) ;
2020-05-12 14:20:58 +02:00
2020-04-02 13:19:14 +02:00
return RedirectToActionPermanent ( "Scheduler" ) ;
}
[Authorize]
[HttpPost]
public ActionResult SelectAppointmentToEdit ( FormCollection formCollection )
{
2023-03-03 21:54:36 +01:00
if ( Model is null )
{
return Logout ( ) ;
}
2020-09-21 11:57:10 +02:00
var rawOid = formCollection [ FormCollectionConstants . AppointmentSchedulerOidHolderKey ] ;
2020-04-02 13:19:14 +02:00
var isSuccessful = long . TryParse ( rawOid , out var appointmentOid ) ;
2023-03-03 21:54:36 +01:00
if ( ! isSuccessful )
2020-04-02 13:19:14 +02:00
{
2023-03-03 21:54:36 +01:00
return RedirectToActionPermanent ( "Scheduler" ) ;
}
2022-02-10 11:06:03 +01:00
2023-03-03 21:54:36 +01:00
Model . SelectedAppointment = Model . Appointments . FirstOrDefault ( app = > app . SchedulerAppointmentOid . HasValue & & app . SchedulerAppointmentOid . Value = = appointmentOid ) ;
if ( Model . SelectedAppointment ! = null )
{
2023-04-04 19:30:03 +02:00
if ( Model . SelectedAppointment . AllDay & & Model . SelectedAppointment . EndDate . HasValue )
2023-03-29 19:54:16 +02:00
{
Model . SelectedAppointment . EndDate = Model . SelectedAppointment . EndDate . Value . AddMinutes ( 1 ) . AddDays ( - 1 ) ;
}
2023-04-04 19:30:03 +02:00
2023-03-03 21:54:36 +01:00
Model . IsAllDay = Model . SelectedAppointment . AllDay ;
Model . IsPrivate = Model . SelectedAppointment . IsPrivate ;
Model . SelectedResources = Model . SelectedAppointment ? . ResourceList ? ? new List < ResourceDC > ( ) ;
Model . SelectedEmployees = Model . SelectedAppointment ? . EmployeeList . Select ( e2a = > e2a . Employee ) . ToList ( ) ? ? new List < CompactEmployeeDC > ( ) ;
Model . SelectedCustomers = Model . SelectedAppointment ? . CustomerList ? ? new List < CompactCustomerDC > ( ) ;
2020-04-02 13:19:14 +02:00
}
return RedirectToActionPermanent ( "Scheduler" ) ;
}
2020-05-12 14:20:58 +02:00
[Authorize]
2020-04-02 13:19:14 +02:00
public JsonResult ResetSelectedAppointment ( )
{
if ( Model ! = null )
{
Model . SelectedAppointment = null ;
2020-06-29 19:24:24 +02:00
Model . SelectedResources . Clear ( ) ;
2022-02-10 11:06:03 +01:00
Model . IsAllDay = false ;
Model . IsPrivate = false ;
2019-07-25 14:58:13 +02:00
}
2020-04-02 13:19:14 +02:00
2020-05-12 14:20:58 +02:00
return Json ( null , JsonRequestBehavior . AllowGet ) ;
}
[Authorize]
public JsonResult CheckForOverlappingAppointments ( string startDateRaw , string endDateRaw , string startTimeRaw , string endTimeRaw )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2020-05-12 14:20:58 +02:00
{
2020-10-07 19:42:17 +02:00
Logout ( ) ;
2020-05-12 14:20:58 +02:00
return null ;
}
var isOverlapping = false ;
var oid = Model . SelectedAppointment ? . SchedulerAppointmentOid ;
var isSuccessfulStartDate = DateTime . TryParseExact ( startDateRaw , "dd.MM.yyyy" , null , DateTimeStyles . None , out var startDate ) ;
var isSuccessfulStartTime = DateTime . TryParseExact ( startTimeRaw , "HH:mm" , null , DateTimeStyles . None , out var startTime ) ;
var isSuccessfulEndDate = DateTime . TryParseExact ( endDateRaw , "dd.MM.yyyy" , null , DateTimeStyles . None , out var endDate ) ;
var isSuccessfulEndTime = DateTime . TryParseExact ( endTimeRaw , "HH:mm" , null , DateTimeStyles . None , out var endTime ) ;
if ( isSuccessfulStartDate & & isSuccessfulStartTime & & isSuccessfulEndDate & & isSuccessfulEndTime )
{
startDate = startDate . MergeDatesByDate ( startTime ) ;
endDate = endDate . MergeDatesByDate ( endTime ) ;
2020-06-29 19:24:24 +02:00
var customerOidList = Model . SelectedAppointment ? . CustomerList ? . Select ( customer = > customer . CustomerOid ) . ToList ( ) ? ? new List < long > ( ) ;
var employeeOidList = Model . SelectedAppointment ? . EmployeeList ? . Select ( employee2Appointment = > employee2Appointment . Employee . EmployeeOid ) . ToList ( ) ? ? new List < long > ( ) ;
var resourceOidList = Model . SelectedResources . Where ( resource = > resource . ResourceOid . HasValue ) . Select ( resource = > resource . ResourceOid . Value ) . ToList ( ) ? ? new List < long > ( ) ;
2020-05-12 14:20:58 +02:00
var originator = Model . SelectedAppointment ? . Originator ? ? MobileSessionFacade . LoggedInCompactEmployee ;
var recurrenceId = Model . SelectedAppointment ? . RecurrenceId ? ? string . Empty ;
var recurrenceIndex = Model . SelectedAppointment ? . RecurrenceIndex ? ? 0 ;
2020-06-29 19:24:24 +02:00
isOverlapping = KalenderService . OverlappingAppointmentsExist ( startDate , endDate , employeeOidList , customerOidList , resourceOidList , originator . EmployeeOid , oid , recurrenceId , recurrenceIndex ) ;
2020-07-08 16:51:11 +02:00
2021-07-21 15:36:18 +02:00
// TODO: Serientermine überprüfen
2020-07-08 16:51:11 +02:00
if ( Model . Appointments ! = null )
{
2022-08-10 14:13:29 +02:00
foreach ( var appointment in Model . Appointments . Where ( app = > app . SchedulerAppointmentOid is null & & app . IsTask = = false ) )
2020-07-08 16:51:11 +02:00
{
}
}
2020-05-12 14:20:58 +02:00
}
return Json ( isOverlapping , JsonRequestBehavior . AllowGet ) ;
2019-07-25 14:58:13 +02:00
}
2020-06-29 19:24:24 +02:00
2020-07-15 12:15:13 +02:00
[Authorize]
2020-06-29 19:24:24 +02:00
public string SelectResourcesForAppointment ( string resourceOids )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2020-06-29 19:24:24 +02:00
{
2020-10-07 19:42:17 +02:00
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2020-06-29 19:24:24 +02:00
}
var oidList = ConvertOidStringToList ( resourceOids ) ;
var list = new List < ResourceDC > ( ) ;
Model . ResourceCategories2Resources . Values . DoForEach ( l = > l . DoForEach ( s = > list . AddIfNotIn ( s ) ) ) ;
Model . SelectedResources = list . Where ( resource = > resource . ResourceOid . HasValue & & oidList . Contains ( resource . ResourceOid . Value ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedResources ) ;
}
2021-11-08 20:24:26 +01:00
[Authorize]
2022-02-10 11:06:03 +01:00
public string SelectEmployeesForAppointment ( string oidString )
2021-11-08 20:24:26 +01:00
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2021-11-08 20:24:26 +01:00
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2021-11-08 20:24:26 +01:00
}
2022-02-10 11:06:03 +01:00
var oidList = ConvertOidStringToList ( oidString ) ;
2021-11-08 20:24:26 +01:00
Model . SelectedEmployees = Model . AllEmployees . Where ( employee = > oidList . Contains ( employee . EmployeeOid ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedEmployees . OrderBy ( o = > o . DetailDescription ) ) ;
}
[Authorize]
2022-02-10 11:06:03 +01:00
public string SelectCustomersForAppointment ( string oidString )
2021-11-08 20:24:26 +01:00
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2021-11-08 20:24:26 +01:00
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2021-11-08 20:24:26 +01:00
}
2022-02-10 11:06:03 +01:00
var oidList = ConvertOidStringToList ( oidString ) ;
2021-11-08 20:24:26 +01:00
Model . SelectedCustomers = Model . AllCustomers . Where ( customer = > oidList . Contains ( customer . CustomerOid ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedCustomers . OrderBy ( o = > o . LastNameFirstName ) ) ;
}
2020-07-15 12:15:13 +02:00
[Authorize]
2020-06-29 19:24:24 +02:00
public string CheckResourcesAvailability ( string start , string end , string resourceOids )
{
if ( ! AbstractModel . HasRightToInsertRessourceAppointments )
{
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2020-06-29 19:24:24 +02:00
}
if ( ! string . IsNullOrWhiteSpace ( start ) & & ! string . IsNullOrWhiteSpace ( end ) & & ! string . IsNullOrWhiteSpace ( resourceOids ) & & Model ! = null )
{
var oidList = ConvertOidStringToList ( resourceOids ) ;
2021-05-17 14:01:06 +02:00
foreach ( var oid in oidList )
{
if ( ! Model . ResourceCategories2Resources . Any ( a = > a . Value . All ( b = > b . ResourceOid ! = oid ) ) )
{
return JsonConvert . SerializeObject ( new List < ResourceDC > ( ) ) ;
}
}
2020-06-29 19:24:24 +02:00
var dateTimes = ConvertStringDatesToDateTimes ( start , end ) ;
var unavailableResources = KalenderService . CheckResourceAvailability ( dateTimes . StartDate , dateTimes . EndDate , oidList , Model . SelectedAppointment ? . SchedulerAppointmentOid ) ;
return JsonConvert . SerializeObject ( unavailableResources ) ;
}
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2020-06-29 19:24:24 +02:00
}
2020-07-15 12:15:13 +02:00
[Authorize]
public string HasSelectedAppointment ( )
{
return JsonConvert . SerializeObject ( Model ? . SelectedAppointment ! = null ) ;
}
2021-11-08 20:24:26 +01:00
[Authorize]
[HttpPost]
public ActionResult ChangeSchedulerView ( FormCollection formCollection )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2021-11-08 20:24:26 +01:00
{
return Logout ( ) ;
}
var selectedSchedulerView = formCollection [ "SelectedSchedulerView" ] ;
Model . SelectedSchedulerView = selectedSchedulerView ;
return RedirectToActionPermanent ( "Scheduler" ) ;
}
2022-02-10 11:06:03 +01:00
[Authorize]
[HttpPost]
public ActionResult FindFreeIntervals ( FormCollection formCollection )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
return Logout ( ) ;
}
var d = formCollection [ "Duration" ] ;
2022-02-15 17:22:14 +01:00
var s = formCollection [ "IntervalStart" ] . Substring ( 0 , 10 ) ;
2022-02-10 11:06:03 +01:00
var st = formCollection [ "IntervalStartTime" ] ;
2022-02-15 17:22:14 +01:00
var e = formCollection [ "IntervalEnd" ] . Substring ( 0 , 10 ) ;
2022-02-10 11:06:03 +01:00
var et = formCollection [ "IntervalEndTime" ] ;
if ( int . TryParse ( d , out var duration ) & & DateTime . TryParse ( $"{s} {st}" , out var start ) & & DateTime . TryParse ( $"{e} {et}" , out var end ) & & Model . Employee . EmployeeOid . HasValue )
{
var customerOids = Model . SelectedCustomersForIntervalFinder . Select ( c = > c . CustomerOid ) . ToList ( ) ;
var employeeOids = Model . SelectedEmployeesForIntervalFinder . Select ( m = > m . EmployeeOid ) . ToList ( ) ;
var resourceOids = Model . SelectedResourcesForIntervalFinder . Where ( w = > w . ResourceOid . HasValue ) . Select ( r = > r . ResourceOid . Value ) . ToList ( ) ;
Model . FreeIntervals = KalenderService . FindAppointmentsInRange ( duration , start , end , resourceOids , customerOids , employeeOids , Model . Employee . EmployeeOid . Value ) ;
Model . IntervalStartDate = start ;
Model . IntervalEndDate = end ;
Model . IntervalDuration = duration ;
}
return RedirectToActionPermanent ( "Scheduler" ) ;
}
[Authorize]
public string SelectEmployeesForIntervalFinder ( string oidString )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-02-10 11:06:03 +01:00
}
var employeeOids = ConvertOidStringToList ( oidString ) ;
Model . SelectedEmployeesForIntervalFinder = Model . AllEmployees . Where ( employee = > employeeOids . Contains ( employee . EmployeeOid ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedEmployeesForIntervalFinder . OrderBy ( o = > o . DetailDescription ) ) ;
}
[Authorize]
public string SelectCustomersForIntervalFinder ( string oidString )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-02-10 11:06:03 +01:00
}
var customerOids = ConvertOidStringToList ( oidString ) ;
Model . SelectedCustomersForIntervalFinder = Model . AllCustomers . Where ( customer = > customerOids . Contains ( customer . CustomerOid ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedCustomersForIntervalFinder . OrderBy ( o = > o . LastNameFirstName ) ) ;
}
[Authorize]
public string SelectResourcesForIntervalFinder ( string resourceOids )
{
2023-02-01 20:41:13 +01:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-02-10 11:06:03 +01:00
}
var resourceOidList = ConvertOidStringToList ( resourceOids ) ;
var list = new List < ResourceDC > ( ) ;
Model . ResourceCategories2Resources . Values . DoForEach ( l = > l . DoForEach ( s = > list . AddIfNotIn ( s ) ) ) ;
Model . SelectedResourcesForIntervalFinder = list . Where ( resource = > resource . ResourceOid . HasValue & & resourceOidList . Contains ( resource . ResourceOid . Value ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedResourcesForIntervalFinder ) ;
}
[Authorize]
[HttpPost]
public ActionResult SetIsInIntervalFinderMode ( FormCollection formCollection )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
return Logout ( ) ;
}
var newValue = ! Model . IsInIntervalFinderMode ;
Model . IsInIntervalFinderMode = newValue ;
if ( ! newValue )
{
Model . SelectedEmployeesForIntervalFinder . Clear ( ) ;
Model . SelectedCustomersForIntervalFinder . Clear ( ) ;
Model . SelectedResourcesForIntervalFinder . Clear ( ) ;
}
return RedirectToActionPermanent ( "Scheduler" ) ;
}
[Authorize]
[HttpPost]
public ActionResult SelectIntervalForForm ( FormCollection formCollection )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
return Logout ( ) ;
}
var startStr = formCollection [ "startDate" ] ;
var endStr = formCollection [ "endDate" ] ;
if ( DateTime . TryParse ( startStr , out var startDate ) & & DateTime . TryParse ( endStr , out var endDate ) )
{
Model . IsInIntervalFinderMode = false ;
var employees2Appointment = new List < Employee2SchedulerAppointmentDC > ( ) ;
Model . SelectedEmployeesForIntervalFinder . DoForEach ( employee = >
{
employees2Appointment . Add ( new Employee2SchedulerAppointmentDC
{
Employee = employee
} ) ;
} ) ;
Model . SelectedAppointment = new SchedulerAppointmentDC ( )
{
ActivationType = ActivationTypeId . Active ,
IsTask = false ,
IsPrivate = false ,
Originator = MobileSessionFacade . LoggedInCompactEmployee ,
StartDate = startDate ,
EndDate = endDate
} ;
Model . SelectedCustomers = Model . SelectedCustomersForIntervalFinder . Clone ( ) ;
Model . SelectedEmployees = Model . SelectedEmployeesForIntervalFinder . Clone ( ) ;
Model . SelectedResources = Model . SelectedResourcesForIntervalFinder . Clone ( ) ;
Model . SelectedCustomersForIntervalFinder . Clear ( ) ;
Model . SelectedEmployeesForIntervalFinder . Clear ( ) ;
Model . SelectedResourcesForIntervalFinder . Clear ( ) ;
Model . IntervalStartDate = null ;
Model . IntervalEndDate = null ;
}
return RedirectToActionPermanent ( "Scheduler" ) ;
}
[Authorize]
public string ResetIntervalFinder ( )
{
2022-08-10 14:13:29 +02:00
if ( Model is null )
2022-02-10 11:06:03 +01:00
{
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-02-10 11:06:03 +01:00
}
Model . SelectedCustomersForIntervalFinder . Clear ( ) ;
Model . SelectedEmployeesForIntervalFinder . Clear ( ) ;
Model . SelectedResourcesForIntervalFinder . Clear ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-02-10 11:06:03 +01:00
}
2022-08-10 14:13:29 +02:00
[Authorize]
public ActionResult FetchAppointments ( )
{
LoadAppointmentsForDate ( ) ;
return PartialView ( "OneDaySchedulerPartial" , Model ) ;
}
2022-12-30 16:28:23 +01:00
[Authorize]
public string SelectResourcesForAppointmentFiltering ( string resourceOids )
{
if ( Model is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
var oidList = ConvertOidStringToList ( resourceOids ) ;
var list = new List < ResourceDC > ( ) ;
Model . ResourceCategories2Resources . Values . DoForEach ( l = > l . DoForEach ( s = > list . AddIfNotIn ( s ) ) ) ;
Model . SelectedResourcesForFiltering = list . Where ( resource = > resource . ResourceOid . HasValue & & oidList . Contains ( resource . ResourceOid . Value ) ) . ToList ( ) ;
return JsonConvert . SerializeObject ( Model . SelectedResourcesForFiltering ) ;
}
[Authorize]
public string SelectEmployeesForAppointmentFiltering ( string oidString )
{
if ( Model is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
var oidList = ConvertOidStringToList ( oidString ) ;
Model . SelectedEmployeesForFiltering = Model . AllEmployees . Where ( employee = > oidList . Contains ( employee . EmployeeOid ) ) . ToList ( ) ;
return Model . SelectedEmployeesForFiltering . Count . ToString ( ) ;
}
[Authorize]
public string SelectCustomersForAppointmentFiltering ( string oidString )
{
if ( Model is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
var oidList = ConvertOidStringToList ( oidString ) ;
Model . SelectedCustomersForFiltering = Model . AllCustomers . Where ( customer = > oidList . Contains ( customer . CustomerOid ) ) . ToList ( ) ;
return Model . SelectedCustomersForFiltering . Count . ToString ( ) ;
}
[Authorize]
public ActionResult FetchSelectedEmployeesForPopup ( )
{
return PartialView ( "EmployeeForFilteringPartial" , Model ) ;
}
[Authorize]
public ActionResult FetchEmployeeFilteringModalBody ( )
{
return PartialView ( "EmployeeFilteringModalContentPartial" , Model ) ;
}
[Authorize]
public string SelectTeamForFiltering ( string teamOidString )
{
if ( Model ? . Employee ? . EmployeeOid is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
if ( long . TryParse ( teamOidString , out var teamOid ) )
{
var team = EmployeeService . FindTeamByOid ( teamOid , Model . Employee . EmployeeOid . Value ) ;
2023-02-09 15:17:33 +01:00
2022-12-30 16:28:23 +01:00
if ( ! ( team is null ) )
{
Model . SelectedEmployeesForFiltering . AddRangeIfElementsNotIn ( team . Member ) ;
}
}
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
[Authorize]
public string SelectTeamForAppointment ( string teamOidString )
{
if ( Model ? . Employee ? . EmployeeOid is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
var teamMemberOids = new List < long > ( ) ;
if ( long . TryParse ( teamOidString , out var teamOid ) )
{
var team = EmployeeService . FindTeamByOid ( teamOid , Model . Employee . EmployeeOid . Value ) ;
if ( ! ( team is null ) )
{
Model . SelectedEmployees . AddRangeIfElementsNotIn ( team . Member ) ;
teamMemberOids . AddRangeIfElementsNotIn ( team . Member . Select ( member = > member . EmployeeOid ) ) ;
}
}
return JsonConvert . SerializeObject ( teamMemberOids ) ;
}
[Authorize]
public ActionResult FetchCustomersForFiltering ( )
{
return PartialView ( "CustomerFilterSelectionPartial" , Model ) ;
}
[Authorize]
public ActionResult FetchCustomerFilteringModalBody ( )
{
return PartialView ( "CustomerFilteringModalContentPartial" , Model ) ;
}
[Authorize]
public string SetShouldLoadTasks ( bool isChecked )
{
try
{
if ( Model is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
Model . ShouldLoadTasks = isChecked ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
catch ( Exception exception )
{
Log . Error ( exception . Message , exception ) ;
}
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
[Authorize]
2023-03-03 21:54:36 +01:00
public string DeleteAppointment ( string appointmentIdentifier , bool deleteSeries )
2022-12-30 16:28:23 +01:00
{
if ( Model ? . Employee ? . EmployeeOid is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
2023-03-03 21:54:36 +01:00
if ( ! Guid . TryParse ( appointmentIdentifier , out var identifier ) )
{
return LeerzeichenFuerGetMethoden ;
}
2022-12-30 16:28:23 +01:00
2023-03-03 21:54:36 +01:00
var schedulerAppointment = Model . AppointmentListItems . FirstOrDefault ( app = > app . Identifier . Equals ( identifier ) ) ? . SchedulerAppointment ;
if ( schedulerAppointment is null )
2022-12-30 16:28:23 +01:00
{
2023-03-03 21:54:36 +01:00
return LeerzeichenFuerGetMethoden ;
}
2022-12-30 16:28:23 +01:00
2023-03-03 21:54:36 +01:00
if ( schedulerAppointment . SchedulerAppointmentOid is null & & ! ( schedulerAppointment . RecurrenceInfo is null ) )
{
var recurrenceInfo = new RecurrenceInfo ( ) ;
recurrenceInfo . FromXml ( schedulerAppointment . RecurrenceInfo ) ;
2022-12-30 16:28:23 +01:00
2023-03-03 21:54:36 +01:00
var pattern = StaticAppointmentFactory . CreateAppointment ( AppointmentType . Pattern ) ;
pattern . RecurrenceInfo . FromXml ( schedulerAppointment . RecurrenceInfo ) ;
pattern . Start = pattern . RecurrenceInfo . Start ;
pattern . End = pattern . RecurrenceInfo . End ;
2022-12-30 16:28:23 +01:00
2023-03-03 21:54:36 +01:00
var exception = pattern . CreateException ( AppointmentType . DeletedOccurrence , schedulerAppointment . RecurrenceIndex ) ;
var recurrenceId = exception . RecurrenceInfo . Id . ToString ( ) ;
schedulerAppointment = deleteSeries ?
KalenderService . FindRootAppointmentByRecurrenceId ( recurrenceId ) :
CloneAppointment ( schedulerAppointment , $"<RecurrenceInfo Id=\" { recurrenceId } \ " Index=\"{schedulerAppointment.RecurrenceIndex}\" />" , ( int ) exception . Type ) ;
}
if ( schedulerAppointment is null )
{
return LeerzeichenFuerGetMethoden ;
}
var teamMemberCustomerOids = EmployeeService . LoadTeamsRelatedCustomerOids ( Model . Employee . EmployeeOid . Value ) ;
var customerList = schedulerAppointment . CustomerList ;
var employeeList = schedulerAppointment . EmployeeList ;
var resourceList = schedulerAppointment . ResourceList ;
var originator = schedulerAppointment . Originator ;
var isNew = schedulerAppointment . SchedulerAppointmentOid is null ;
var loggedOnUser = MobileSessionFacade . LoggedInUserDC ;
var isAllowedToDelete = BS . Shared . Core . Utils . CheckSchedulerRights ( customerList , resourceList , employeeList , originator , isNew , SchedulerRightsCheckType . Edit , loggedOnUser , teamMemberCustomerOids ) ;
if ( isAllowedToDelete )
{
if ( schedulerAppointment . SchedulerAppointmentOid . HasValue & & schedulerAppointment . NewSchedulerAppointmentVersion . HasValue )
2022-12-30 16:28:23 +01:00
{
2023-03-03 21:54:36 +01:00
var oid2Version = new Dictionary < long , long > { { schedulerAppointment . SchedulerAppointmentOid . Value , schedulerAppointment . NewSchedulerAppointmentVersion . Value } } ;
2022-12-30 16:28:23 +01:00
KalenderService . DeactivateSchedulerAppointments ( oid2Version ) ;
}
2023-03-03 21:54:36 +01:00
// DeletedOccurrence
if ( schedulerAppointment . Type = = 4 & & ! deleteSeries )
{
KalenderService . InsertSchedulerAppointments ( new List < SchedulerAppointmentDC > { schedulerAppointment } ) ;
}
2022-12-30 16:28:23 +01:00
}
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2022-12-30 16:28:23 +01:00
}
2023-02-09 15:17:33 +01:00
2023-03-03 21:54:36 +01:00
[Authorize]
public static SchedulerAppointmentDC CloneAppointment ( SchedulerAppointmentDC schedulerAppointment , string recurrenceInfo , int type )
{
return new SchedulerAppointmentDC
{
StartDate = schedulerAppointment . StartDate ,
EndDate = schedulerAppointment . EndDate ,
ServiceRecordList = schedulerAppointment . ServiceRecordList ? ? new List < ServiceRecordDC > ( ) ,
EmployeeList = schedulerAppointment . EmployeeList ? ? new List < Employee2SchedulerAppointmentDC > ( ) ,
ActivationType = ActivationTypeId . Active ,
AllDay = schedulerAppointment . AllDay ,
CanBeEdited = schedulerAppointment . CanBeEdited ,
CompletedDate = schedulerAppointment . CompletedDate ,
CompletedNotice = schedulerAppointment . CompletedNotice ,
CompletedUser = schedulerAppointment . CompletedUser ,
CustomerList = schedulerAppointment . CustomerList ? ? new List < CompactCustomerDC > ( ) ,
2023-03-14 16:12:52 +01:00
Description = schedulerAppointment . Description ? . RemoveUppercaseEsszett ( ) ,
2023-03-03 21:54:36 +01:00
DueDate = schedulerAppointment . DueDate ,
FormerBookingSequenceOid = schedulerAppointment . FormerBookingSequenceOid ,
FormerTaskOid = schedulerAppointment . FormerTaskOid ,
HasServiceRecordEntry = schedulerAppointment . HasServiceRecordEntry ,
IsPrivate = schedulerAppointment . IsPrivate ,
IsTask = schedulerAppointment . IsTask ,
IsTeilnahmeBestaetigung = schedulerAppointment . IsTeilnahmeBestaetigung ,
LabelKey = schedulerAppointment . LabelKey ,
2023-03-14 16:12:52 +01:00
Location = schedulerAppointment . Location ? . RemoveUppercaseEsszett ( ) ,
2023-03-03 21:54:36 +01:00
Originator = schedulerAppointment . Originator ,
RecurrenceInfo = recurrenceInfo ,
ReminderInfo = schedulerAppointment . ReminderInfo ,
ResourceList = schedulerAppointment . ResourceList ? ? new List < ResourceDC > ( ) ,
Status = schedulerAppointment . Status ,
2023-03-14 16:12:52 +01:00
Subject = schedulerAppointment . Subject ? . RemoveUppercaseEsszett ( ) ? ? string . Empty ,
2023-03-03 21:54:36 +01:00
SupportConceptList = schedulerAppointment . SupportConceptList ? ? new List < CompactSupportConceptDC > ( ) ,
TaskDescription = schedulerAppointment . TaskDescription ,
Type = type
} ;
}
2023-02-09 15:17:33 +01:00
[Authorize]
public string SelectTeamForIntervalFinder ( string teamOidString )
{
if ( Model ? . Employee ? . EmployeeOid is null )
{
Logout ( ) ;
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2023-02-09 15:17:33 +01:00
}
if ( long . TryParse ( teamOidString , out var teamOid ) )
{
var team = EmployeeService . FindTeamByOid ( teamOid , Model . Employee . EmployeeOid . Value ) ;
if ( ! ( team is null ) )
{
var memberOids = team . Member . Select ( member = > member . EmployeeOid ) . ToList ( ) ;
return JsonConvert . SerializeObject ( memberOids ) ;
}
}
2023-02-09 20:47:52 +01:00
return LeerzeichenFuerGetMethoden ;
2023-02-09 15:17:33 +01:00
}
2023-02-23 11:48:41 +01:00
[Authorize]
[HttpPost]
public ActionResult TransformAppointmentToServiceRecord ( FormCollection formCollection )
{
if ( Model is null )
{
return Logout ( ) ;
}
2023-03-03 21:54:36 +01:00
if ( ! Guid . TryParse ( formCollection [ FormCollectionConstants . AppointmentIdInputKey ] , out var identifier ) )
2023-02-23 11:48:41 +01:00
{
2023-03-03 21:54:36 +01:00
return RedirectToActionPermanent ( "PrepareServiceRecordInsert" , "Main" ) ;
}
2023-02-23 11:48:41 +01:00
2023-03-03 21:54:36 +01:00
var appointmentListItem = Model . AppointmentListItems . FirstOrDefault ( f = > f . Identifier . Equals ( identifier ) ) ;
2023-02-23 11:48:41 +01:00
2023-03-03 21:54:36 +01:00
if ( appointmentListItem is null )
{
return RedirectToActionPermanent ( "PrepareServiceRecordInsert" , "Main" ) ;
}
2023-02-23 11:48:41 +01:00
2023-03-03 21:54:36 +01:00
var appointment = appointmentListItem . SchedulerAppointment ;
2023-02-23 11:48:41 +01:00
2023-03-03 21:54:36 +01:00
var employeeOids = appointment . EmployeeList . Select ( employee2Appointment = > employee2Appointment . Employee . EmployeeOid ) . ToList ( ) ;
if ( employeeOids . Count = = 0 )
{
employeeOids . Add ( appointment . Originator . EmployeeOid ) ;
2023-02-23 11:48:41 +01:00
}
2023-03-03 21:54:36 +01:00
TempData [ TempDataConstants . AppointmentListItemKey ] = appointmentListItem ;
2023-02-23 11:48:41 +01:00
return RedirectToActionPermanent ( "PrepareServiceRecordInsert" , "Main" ) ;
2023-03-03 21:54:36 +01:00
2023-02-23 11:48:41 +01:00
}
2019-07-25 14:58:13 +02:00
}
}