Files
BeWoPlaner/BeWo/Scheduler/ViewModel/SchedulerAppointmentListVM.cs
Lyndon bacc7fcedd Verhindern, dass Ressourcen doppelt gebucht werden mit Recht: ToDoOID=91266751
Serientermine können gelöscht werden, aber es fehlt noch eine Abfrage, ob man wirklich löschen will bei normalen Terminen.
2026-07-13 20:32:48 +02:00

689 lines
29 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Xml;
using BeWo.Scheduler.Utils;
using BeWo.Scheduler.View;
using BeWo.ServiceProxy;
using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.Xpf.Scheduler;
using DevExpress.XtraScheduler;
using DevExpress.XtraScheduler.Native;
using SchedulerControl = DevExpress.Xpf.Scheduler.SchedulerControl;
using SchedulerStorage = DevExpress.Xpf.Scheduler.SchedulerStorage;
namespace BeWo.Scheduler.ViewModel
{
public class SchedulerAppointmentListVM : AbstractDCListMapperVM<SchedulerAppointmentDC, SchedulerAppointmentVM>, ISchedulerViewModel
{
public bool ShouldLockOverlappingAppointmentCheck { get; set; }
//protected override SchedulerAppointmentVM CreateVM(SchedulerAppointmentDC pDC)
//{
// var vm = base.CreateVM(pDC);
// if (!pDC.SchedulerAppointmentOid.HasValue && vm.EmployeeList.Count == 0)
// {
// var e2sVm = new Employee2SchedulerAppointmentDC();
// e2sVm.Employee = BeWoApp.LoggedOnUser.Employee;
// vm.EmployeeList.Add(e2sVm);
// }
// return vm;
//}
public SchedulerSettings GetDefaultSchedulerSettings()
{
return new SchedulerSettings(AppointmentKind.General, AppointmentViewType.WorkWeek);
}
private BindingList<IBeWoAppointment> _AppointmentList;
public BindingList<IBeWoAppointment> Appointments
{
get
{
if (_AppointmentList != null)
{
return _AppointmentList;
}
_AppointmentList = new BindingList<IBeWoAppointment>();
_AppointmentList.AddingNew += AppointmentListAddingNew;
foreach (var item in VMList)
{
_AppointmentList.Add(item);
}
return _AppointmentList;
}
}
private static void AppointmentListAddingNew(object sender, AddingNewEventArgs e)
{
var dc = new SchedulerAppointmentDC
{
EmployeeList = new List<Employee2SchedulerAppointmentDC>(),
CustomerList = new List<CompactCustomerDC>(),
ResourceList = new List<ResourceDC>(),
ServiceRecordList = new List<ServiceRecordDC>(),
SupportConceptList = new List<CompactSupportConceptDC>(),
Status = 0
};
var neu = new SchedulerAppointmentVM(dc);
e.NewObject = neu;
}
private Dictionary<Guid, Dictionary<string, Dictionary<string, object>>> _ChangedOccurenceCustomFields;
public Dictionary<Guid, Dictionary<string, Dictionary<string, object>>> ChangedOccurenceCustomFields { get; }
public List<CompactCustomerDC> AllCustomers { get; }
public List<CompactEmployeeDC> AllEmployees { get; }
public Dictionary<ValueListEntryDC, List<ResourceDC>> Categories2Resources { get; }
private Appointment _GeoeffneterTermin;
public SchedulerAppointmentListVM(List<SchedulerAppointmentDC> appList, List<CompactCustomerDC> allCustomers, List<CompactEmployeeDC> allEmployees, Dictionary<ValueListEntryDC, List<ResourceDC>> lCategoriesToResources) : base(appList)
{
Categories2Resources = lCategoriesToResources;
AllCustomers = allCustomers;
AllEmployees = allEmployees;
// TODO: Hier Rechte beachten!
InitChangedOccurrencyCustomFields(appList.Where(t => t.Type == 3).ToList());
InitViewModel();
}
private void InitViewModel()
{
foreach (var item in VMList)
{
item.CustomFields.Add(nameof(CustomFieldStorage), new CustomFieldStorage(item));
item.Id = item.DataContract.SchedulerAppointmentOid;
if (!item.IsPrivate || item.Originator.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) || item.EmployeeList.Select(s => s.Employee).Contains(BeWoApp.CompactLoggedOnEmployee))
{
continue;
}
item.Description = "Privater Termin";
item.Subject = $"Privat ({item.Originator})";
}
}
public void UpdateViewModel(IEnumerable<SchedulerAppointmentDC> updatedDcList)
{
foreach (var dc in updatedDcList)
{
SchedulerAppointmentVM found = null;
foreach (var vm in Appointments.OfType<SchedulerAppointmentVM>().Where(vm => vm.DataContract != null && vm.DataContract.Equals(dc)))
{
found = vm;
}
if (found != null)
{
found.DataContract = dc;
}
}
}
public void SaveAppointments(SchedulerControl control, IEnumerable<Appointment> list)
{
var areEqual = false;
var dcList = new List<SchedulerAppointmentDC>();
foreach (var item in list)
{
if (!(item.GetSourceObject(control.GetCoreStorage()) is SchedulerAppointmentVM vm))
{
continue;
}
UpdateSchedulerAppointment(item, vm);
// Wird ein Serientermin bearbeitet, erfolgt ein Insert und ein Update. Beim Insert erfolgt bereits die Überschneidungsprüfung und muss hier nicht wiederholt werden.
var shouldSkipResourceAvailablityCheck = false;
if(_RecurrenceInfoId != null && item.RecurrenceInfo?.Id is Guid recurrenceId)
{
shouldSkipResourceAvailablityCheck = recurrenceId.Equals(_RecurrenceInfoId);
}
/*
* EventTypes:
* 0: Normal
* 1: Pattern
* 2: Occurrence
* 3: ChangedOccurrence
* 4: DeletedOccurrence
*
*
*
* Wozu ist das gut?
* !ShouldLockOverlappingAppointmentCheck &&
*/
if(!shouldSkipResourceAvailablityCheck && !vm.IsTask && vm.EventType != 4 && !(vm.EventType == 3 && vm.DataContract?.SchedulerAppointmentOid == null))
{
var start = vm.Start;
var end = vm.End;
var employeeOids = vm.EmployeeList.Select(emp => emp.Employee.EmployeeOid).ToList();
var customerOids = vm.CustomerList.Select(cc => cc.CustomerOid).ToList();
var resourceOids = vm.ResourceList.Where(r => r.ResourceOid.HasValue).Select(r => r.ResourceOid.Value).ToList();
var originatorOid = vm.Originator.EmployeeOid;
var schedulerAppointmentOid = vm.DataContract?.SchedulerAppointmentOid;
var recurrenceInfoId = vm.RecurrenceId;
var recurrenceIndex = vm.RecurrenceIndex;
var message = string.Empty;
ServiceFacade.DoResourceServiceSync( s => message = s.ValidateSchedulerAppointment(start, end, employeeOids, customerOids, resourceOids, originatorOid, schedulerAppointmentOid, recurrenceInfoId, recurrenceIndex, shouldSkipResourceAvailablityCheck));
if(!string.IsNullOrWhiteSpace(message))
{
if(message.Contains("Die Ressource") && message.Contains("ist im ausgewählten Zeitraum") && message.Contains("bereits gebucht:") && BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcenDoppeltBuchen) is false)
{
message = message.Remove(message.Length - 31) + "Speichern nicht möglich.";
MessageBox.Show(message, "Überschneidung", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
var messageBoxResult = MessageBox.Show(message, "Überschneidung", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
if(messageBoxResult.Equals(MessageBoxResult.No))
{
return;
}
}
}
if(item.Type.Equals(AppointmentType.ChangedOccurrence) && _GeoeffneterTermin != null)
{
areEqual = _GeoeffneterTermin.Equals(item);
}
if(!areEqual)
{
dcList.Add(vm.CommitToDataContract());
}
}
if(dcList.Count <= 0)
{
return;
}
NewSchedulerView.IgnoreChangeEvents = true;
var mostRecentAppointments = new List<SchedulerAppointmentDC>();
ServiceFacade.DoResourceServiceSync(sync => mostRecentAppointments = sync.UpdateSchedulerAppointments(dcList));
UpdateViewModel(mostRecentAppointments);
_RecurrenceInfoId = null;
control.ActiveView.LayoutChanged();
NewSchedulerView.IgnoreChangeEvents = false;
}
private Guid? _RecurrenceInfoId;
public void InsertAppointments(SchedulerControl control, IEnumerable<Appointment> list)
{
var dcList = new List<SchedulerAppointmentDC>();
foreach (var item in list)
{
if (!(item.GetSourceObject(control.GetCoreStorage()) is SchedulerAppointmentVM vm))
{
if(item.IsException && item.CF_HasServiceRecordEntry())
{
var dc = new SchedulerAppointmentDC
{
IsPrivate = item.CF_IsPrivate(),
Subject = item.Subject,
Description = item.Description,
StartDate = item.Start,
EndDate = item.End,
Originator = item.CF_Originator(),
LabelKey = (long?) item.LabelKey,
AllDay = item.AllDay,
Status = item.StatusId,
Type = (int) item.Type,
Location = item.Location,
RecurrenceInfo = item.RecurrenceInfo.ToXml(),
ReminderInfo = item.Reminder?.ToXml(),
CustomerList = item.CF_CustomerList(),
EmployeeList = item.CF_EmployeeList().ToList(),
ResourceList = item.CF_ResourceList(),
SupportConceptList = item.CF_SupportConceptList(),
ServiceRecordList = item.CF_ServiceRecordList(),
RecurrenceIndex = item.RecurrenceIndex,
RecurrenceId = item.RecurrenceInfo.Id.ToString(),
HasServiceRecordEntry = item.CF_HasServiceRecordEntry()
};
vm = new SchedulerAppointmentVM(dc);
}
else
{
continue;
}
}
if(item.RecurrenceInfo != null)
{
_RecurrenceInfoId = (Guid) item.RecurrenceInfo.Id;
}
UpdateSchedulerAppointment(item, vm);
if(!vm.IsTask && vm.EventType != 4 && !ShouldLockOverlappingAppointmentCheck)
{
var start = vm.Start;
var end = vm.End;
var employeeOids = vm.EmployeeList.Select(emp => emp.Employee.EmployeeOid).ToList();
var customerOids = vm.CustomerList.Select(cc => cc.CustomerOid).ToList();
var resourceOids = vm.ResourceList.Where(r => r.ResourceOid.HasValue).Select(r => r.ResourceOid.Value).ToList();
var originatorOid = vm.Originator.EmployeeOid;
var schedulerAppointmentOid = vm.DataContract?.SchedulerAppointmentOid;
var recurrenceInfoId = vm.RecurrenceId;
var recurrenceIndex = vm.RecurrenceIndex;
var message = string.Empty;
ServiceFacade.DoResourceServiceSync(s => message = s.ValidateSchedulerAppointment(start, end, employeeOids, customerOids, resourceOids, originatorOid, schedulerAppointmentOid, recurrenceInfoId, recurrenceIndex, false));
if(!string.IsNullOrWhiteSpace(message))
{
if(message.Contains("Die Ressource") && message.Contains("ist im ausgewählten Zeitraum") && message.Contains("bereits gebucht:") && BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcenDoppeltBuchen) is false)
{
message = message.Remove(message.Length - 31) + "Speichern nicht möglich.";
MessageBox.Show(message, "Überschneidung", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
var messageBoxResult = MessageBox.Show(message, "Überschneidung", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
if(messageBoxResult.Equals(MessageBoxResult.No))
{
return;
}
}
}
dcList.Add(vm.CommitToDataContract());
}
if(dcList.Count <= 0)
{
return;
}
NewSchedulerView.IgnoreChangeEvents = true;
var mostRecentAppointments = new List<SchedulerAppointmentDC>();
ServiceFacade.DoResourceServiceSync(sync => mostRecentAppointments = sync.InsertSchedulerAppointments(dcList));
UpdateViewModel(mostRecentAppointments);
control.ActiveView.LayoutChanged();
NewSchedulerView.IgnoreChangeEvents = false;
}
private void UpdateSchedulerAppointment(Appointment app, SchedulerAppointmentVM vm)
{
vm.EmployeeList = app.CF_EmployeeList();
vm.CustomerList = app.CF_CustomerList();
vm.ResourceList = app.CF_ResourceList();
vm.Originator = app.CF_Originator();
vm.IsPrivate = app.CF_IsPrivate();
vm.IsTask = app.CF_IsTask();
vm.DueDate = app.CF_DueDate();
vm.CompletedDate = app.CF_CompletedDate();
vm.CompletedNotice = app.CF_CompletedNotice();
vm.TaskDescription = app.CF_TaskDescription();
vm.SupportConceptList = app.CF_SupportConceptList();
vm.HasServiceRecordEntry = app.CF_HasServiceRecordEntry();
vm.ServiceRecordList = app.CF_ServiceRecordList();
if(vm.IsTask)
{
vm.AllDay = true;
}
if(!vm.CustomFields.ContainsKey(nameof(CustomFieldStorage)))
{
vm.CustomFields.Add(nameof(CustomFieldStorage), new CustomFieldStorage(vm));
}
if (vm.CommitToDataContract() != null && vm.CommitToDataContract().SchedulerAppointmentOid.HasValue && vm.EmployeeList != null && vm.EmployeeList.Count > 0)
{
var alt = new SchedulerAppointmentDC();
ServiceFacade.DoResourceServiceSync(s => alt = s.GetSchedulerAppointmentsById(new List<long> {vm.CommitToDataContract().SchedulerAppointmentOid.Value}).First());
var alts = alt.StartDate;
var alte = alt.EndDate;
if(alts != vm.Start || alte != vm.End)
{
var neu = vm.EmployeeList;
vm.EmployeeList = new ObservableCollection<Employee2SchedulerAppointmentDC>(neu.DoForEach(f =>
{
if(!f.Employee.Equals(vm.Originator))
{
f.ParticipationAnswer = ParticipationAnswer.Offen;
}
}).ToList());
}
}
if (vm.ResourceList == null || vm.ResourceList.Count <= 0) return;
if (app.RecurrenceInfo != null)
{
var index = app.RecurrenceIndex.ToString();
var id = new Guid(app.RecurrenceInfo.Id.ToString());
if (_ChangedOccurenceCustomFields.ContainsKey(id) && _ChangedOccurenceCustomFields[id].ContainsKey(index))
{
if (app.Type.Equals(AppointmentType.ChangedOccurrence))
{
app.CustomFields[nameof(CustomFieldStorage)] = _ChangedOccurenceCustomFields[id][index][nameof(CustomFieldStorage)];
}
}
}
app.LabelKey = vm.LabelKey;
}
AbstractAppointmentEditForm ISchedulerViewModel.GetEditAppointmentForm(SchedulerControl control, Appointment appointment)
{
_GeoeffneterTermin = control.Storage.CreateAppointment(AppointmentType.Normal);
_GeoeffneterTermin.AllDay = appointment.AllDay;
_GeoeffneterTermin.Start = appointment.Start;
_GeoeffneterTermin.End = appointment.End;
_GeoeffneterTermin.Description = appointment.Description;
foreach (CustomField cf in appointment.CustomFields)
{
_GeoeffneterTermin.CustomFields[cf.Name] = cf.Value;
}
var isTask = _GeoeffneterTermin.CF_IsTask();
if (!appointment.Type.Equals(AppointmentType.ChangedOccurrence))
{
return new SchedulerAppointmentEditForm(this, control, appointment, AllEmployees, AllCustomers, Categories2Resources, isTask);
}
var index = appointment.RecurrenceIndex;
var id = new Guid(appointment.RecurrenceInfo.Id.ToString());
if (_ChangedOccurenceCustomFields.ContainsKey(id) && _ChangedOccurenceCustomFields[id].ContainsKey(index.ToString()))
{
var specialCustomFields = _ChangedOccurenceCustomFields[id][index.ToString()];
foreach (var cf in specialCustomFields)
{
appointment.CustomFields[cf.Key] = cf.Value;
_GeoeffneterTermin.CustomFields[cf.Key] = cf.Value;
}
}
return new SchedulerAppointmentEditForm(this, control, appointment, AllEmployees, AllCustomers, Categories2Resources, isTask);
}
public void ApplyChangesToChangedOccurencyCustomFields(ObservableCollection<Employee2SchedulerAppointmentDC> employees, List<CompactCustomerDC> customers, List<ResourceDC> resources, CompactEmployeeDC originator, bool isPrivate, string index, Guid id, bool isTask, string taskDescription, DateTime? completedDate, DateTime? dueDate, string completedNotice, List<CompactSupportConceptDC> supportConcepts, string subject, bool isAllDay, List<ServiceRecordDC> serviceRecords, DateTime? start, DateTime? end)
{
if (!_ChangedOccurenceCustomFields.ContainsKey(id) || !_ChangedOccurenceCustomFields[id].ContainsKey(index))
{
return;
}
_ChangedOccurenceCustomFields[id][index][nameof(CustomFieldStorage)] = new CustomFieldStorage(employees, customers, resources, originator, isPrivate, isTask, taskDescription, dueDate, completedDate, completedNotice, supportConcepts, subject, isAllDay, serviceRecords);
}
public void AddCustomFieldsMapping(SchedulerStorage schedulerStorage)
{
var customFieldStorageMapping = new SchedulerCustomFieldMapping(nameof(CustomFieldStorage), nameof(CustomFieldStorage));
schedulerStorage.AppointmentStorage.CustomFieldMappings.Add(customFieldStorageMapping);
}
public void InitNewAppointment(Appointment appointment)
{
appointment.StatusId = 0;
appointment.CustomFields[nameof(CustomFieldStorage)] = new CustomFieldStorage { Originator = BeWoApp.CompactLoggedOnEmployee };
}
public void InitNewTask(Appointment pAppointment, DateTime? pDueDate, IEnumerable<Employee2SchedulerAppointmentDC> pSelectedEmployees, List<CompactCustomerDC> pSelectedCustomers, List<ResourceDC> pSelectedResources, List<CompactSupportConceptDC> pSelectedSupportConcepts)
{
pAppointment.CustomFields[nameof(CustomFieldStorage)] = new CustomFieldStorage
{
Originator = BeWoApp.CompactLoggedOnEmployee,
EmployeeList = new ObservableCollection<Employee2SchedulerAppointmentDC>(pSelectedEmployees ?? new List<Employee2SchedulerAppointmentDC>()),
CustomerList = pSelectedCustomers ?? new List<CompactCustomerDC>(),
ResourceList = pSelectedResources ?? new List<ResourceDC>(),
SupportConceptList = pSelectedSupportConcepts ?? new List<CompactSupportConceptDC>(),
TaskDescription = string.Empty,
DueDate = pDueDate,
IsTask = true
};
pAppointment.StatusId = 0;
}
public bool HideAppointment(string filterCategory, object selectedObject, Appointment appointment, bool showPrivateAppointments, bool showAbsenceTimes, bool pShowTasks)
{
if (appointment.GetCustomFieldStorage() == null)
{
return false;
}
var wirdAngezeigt = true; // -> wird standardmäßig angezeigt
var isPrivate = appointment.CF_IsPrivate();
var isAbsenceTime = appointment.CF_IsAbsenceTime();
var isTask = appointment.CF_IsTask();
// Ist Abwesenheit, es sollen keine privaten Termine angezeigt werden und es sollen keine Abwesenheiten angezeigt werden
if(isAbsenceTime && !showPrivateAppointments && !showAbsenceTimes)
{
return !showAbsenceTimes;
}
if(showPrivateAppointments && !isPrivate)
{
return true;
}
if (!pShowTasks && isTask)
{
return true;
}
var ersteller = appointment.CF_Originator();
var employeeList = appointment.CF_EmployeeList();
var customerList = appointment.CF_CustomerList();
var resourceList = appointment.CF_ResourceList();
if (isPrivate)
{
if (ersteller == null || !ersteller.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid))
{
return true;
}
}
switch (filterCategory)
{
case "NurEigene":
var istEigenerTermin = ersteller != null && ersteller.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) && employeeList != null && employeeList.Count == 0 ||
employeeList != null && employeeList.Any(a => a.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid));
wirdAngezeigt = istEigenerTermin;
break;
case "NachAuswahl":
var dictionary = (Dictionary<string, object>) selectedObject;
var ressourcen = (List<ResourceDC>) dictionary["Ressourcen"];
var mitarbeiter = (List<CompactEmployeeDC>) dictionary["Mitarbeiter"];
var klienten = (List<CompactCustomerDC>) dictionary["Klienten"];
var cfe = employeeList?.Select(s => s.Employee).ToList();
var cfr = resourceList ?? new List<ResourceDC>();
var cfc = customerList ?? new List<CompactCustomerDC>();
var hasOnlyOriginatorInCommon = employeeList != null && ersteller != null && employeeList.Any() == false && mitarbeiter.Contains(ersteller);
var m = cfe.Intersect(mitarbeiter).ToList();
var r = cfr.Intersect(ressourcen).ToList();
var k = cfc.Intersect(klienten).ToList();
wirdAngezeigt = (m.Any() || k.Any() || r.Any()) || hasOnlyOriginatorInCommon;
break;
case "Ebenen":
var liste = (List<bool>) selectedObject; // mkr
var appEList = employeeList.Where(w => !w.Employee.Equals(appointment.CF_Originator())).ToList();
// Ersteller und Rechte beachten
var istEigen = ersteller.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid);
var mVorhanden = appEList.Any(a2app => AllEmployees.Contains(a2app.Employee));
var kVorhanden = customerList.Any(AllCustomers.Contains);
wirdAngezeigt = liste[0] && mVorhanden || liste[1] && resourceList.Any() || liste[2] && kVorhanden;
// Nur Ansehen
if (!istEigen && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAnsehen) && liste[0] && mVorhanden && !appEList.Select(e2sa => e2sa.Employee).Any(a => a.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid)))
{
wirdAngezeigt = false;
}
if (!istEigen && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderKliententermineAlleAnsehen) && liste[2] && kVorhanden)
{
wirdAngezeigt = false;
}
if (!istEigen && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcentermineAnsehen) && liste[1] && resourceList.Any())
{
wirdAngezeigt = false;
}
break;
}
// return false -> Termin wird angezeigt!
return !wirdAngezeigt;
}
public void InitChangedOccurrencyCustomFields(IEnumerable<SchedulerAppointmentDC> appList)
{
_ChangedOccurenceCustomFields = new Dictionary<Guid, Dictionary<string, Dictionary<string, object>>>();
foreach (var termin in appList)
{
var ri = new RecurrenceInfo();
ri.FromXml(termin.RecurrenceInfo);
string index;
using (var reader = XmlReader.Create(new StringReader(termin.RecurrenceInfo)))
{
reader.ReadToFollowing("RecurrenceInfo");
reader.MoveToAttribute("Index");
index = reader.Value;
}
if (index.Equals(""))
{
index = "0";
}
var customFieldCollection =
new Dictionary<string, object>
{
[nameof(CustomFieldStorage)] = new CustomFieldStorage(termin)
};
var id = new Guid(ri.Id.ToString());
if(!_ChangedOccurenceCustomFields.ContainsKey(id))
{
_ChangedOccurenceCustomFields.Add(id, new Dictionary<string, Dictionary<string, object>> { { index, customFieldCollection } });
}
else if(!_ChangedOccurenceCustomFields[id].ContainsKey(index))
{
_ChangedOccurenceCustomFields[id].Add(index, customFieldCollection);
}
else
{
_ChangedOccurenceCustomFields[id][index] = customFieldCollection;
}
}
}
//TODO: alle relevanten Eigenschaften beachten und eigene AreEqual Extension schreiben (erledigt) (https://www.devexpress.com/Support/Center/Question/Details/T270666)
public override bool Equals(object pObj)
{
var obj = (SchedulerAppointmentListVM) pObj;
if (obj == null)
{
return false;
}
var appointmentsAreEqual = Appointments == null && obj.Appointments == null || Appointments != null && Appointments.AreEqual(obj.Appointments);
var allCustomersAreEqual = AllCustomers == null && obj.AllCustomers == null ||
AllCustomers != null && obj.AllCustomers != null && AllCustomers.Count == obj.AllCustomers.Count &&
!AllCustomers
.Where(
(t, i) =>
!(
t.CustomerOid.Equals(obj.AllCustomers[i].CustomerOid) &&
t.CustomerVersion.Equals(obj.AllCustomers[i].CustomerVersion)
)
).Any();
var allEmployeesAreEqual = AllEmployees == null && obj.AllEmployees == null ||
AllEmployees != null && obj.AllEmployees != null && AllEmployees.Count == obj.AllEmployees.Count &&
!AllEmployees
.Where(
(t, i) =>
!(
t.EmployeeOid.Equals(obj.AllEmployees[i].EmployeeOid) &&
t.EmployeeVersion.Equals(obj.AllEmployees[i].EmployeeVersion)
)
).Any();
var areEqual =
VMList.AreEqual(obj.VMList) &&
IsDirty == obj.IsDirty &&
allCustomersAreEqual &&
allEmployeesAreEqual &&
appointmentsAreEqual &&
Equals(Categories2Resources, obj.Categories2Resources) &&
Equals(ChangedOccurenceCustomFields, obj.ChangedOccurenceCustomFields);
return areEqual;
}
}
}