using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using BeWo.Annotations; using BeWo.Scheduler.ViewModel; using BeWo.ServiceProxy; using BS.Shared; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using BS.Shared.Extensions; namespace BeWo.Scheduler.View { public partial class RequestAnswerView : INotifyPropertyChanged { public static readonly RoutedEvent ParticipationChangedEvent = EventManager.RegisterRoutedEvent("ParticipationChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(RequestAnswerView)); public event RoutedEventHandler ParticipationChanged { add { AddHandler(ParticipationChangedEvent, value); } remove { RemoveHandler(ParticipationChangedEvent, value); } } void RaiseParticipationChangedEventEvent() { var newEventArgs = new RoutedEventArgs(ParticipationChangedEvent); RaiseEvent(newEventArgs); } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } public ObservableCollection OffeneTermine { get; set; } private IBeWoAppointment selektierterTermin; public IBeWoAppointment SelektierterTermin { get { return selektierterTermin; } set { selektierterTermin = value; OnPropertyChanged("SelektierterTermin"); } } public RequestAnswerView(IEnumerable appointments, IEnumerable statusUpdates) { var x = new List(); foreach (SchedulerAppointmentVM item in statusUpdates) { var emplist = (List) item.CustomFields["EmployeeList"]; x.AddRange(emplist.Where(emp => emp.IsPChanged && emp.ParticipationAnswer != ParticipationAnswer.Offen && !emp.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid)).Select(emp => new SchedulerAppointmentVM(new SchedulerAppointmentDC { SchedulerAppointmentOid = item.CommitToDataContract().SchedulerAppointmentOid, NewSchedulerAppointmentVersion = item.CommitToDataContract().NewSchedulerAppointmentVersion, IsPrivate = item.IsPrivate, RecurrenceInfo = item.RecurrenceInfo, Type = item.EventType, CustomerList = (List) item.CustomFields["CustomerList"], ResourceList = (List) item.CustomFields["ResourceList"], AllDay = item.AllDay, EmployeeList = emplist, Description = item.Description, EndDate = item.End, StartDate = item.Start, Location = item.Location, Subject = item.Subject, Status = 1, Originator = (CompactEmployeeDC) item.CustomFields["Originator"] }) {CustomFields = item.CustomFields, LabelId = Convert.ToInt32(emp.Employee2SchedulerAppointmentOid)})); } OffeneTermine = appointments.ToObservableCollection(); OffeneTermine.AddRange(new List(x)); DataContext = this; InitializeComponent(); } private void CloseButton_Click(object sender, RoutedEventArgs e) { Close(); } private void Selector_OnSelected(object sender, RoutedEventArgs e) { var lv = (ListView) sender; SelektierterTermin = (IBeWoAppointment) lv.SelectedItem; } private void Zusagen_OnClick(object sender, RoutedEventArgs e) { var meinTermin = SelektierterTermin as SchedulerAppointmentVM; UpdateTeilnahme(ParticipationAnswer.Zusage, meinTermin); } private void Absagen_OnClick(object sender, RoutedEventArgs e) { var meinTermin = SelektierterTermin as SchedulerAppointmentVM; UpdateTeilnahme(ParticipationAnswer.Absage, meinTermin); } private void MitVorbehalt_OnClick(object sender, RoutedEventArgs e) { var meinTermin = SelektierterTermin as SchedulerAppointmentVM; UpdateTeilnahme(ParticipationAnswer.Vorbehalt, meinTermin); } private void UpdateTeilnahme(ParticipationAnswer antwort, SchedulerAppointmentVM termin) { termin.EmployeeList.DoForEach(e => { if (e.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid)) { e.ParticipationAnswer = antwort; } }); ServiceFacade.DoResourceServiceAsync(s => s.UpdateSchedulerAppointments(new List { termin.CommitToDataContract() }), UpdateView); } private void UpdateView(List aktualisierteTermine) { var zuEntfernen = new List(); foreach (var dc in aktualisierteTermine) { foreach (var ivm in OffeneTermine) { var vm = ivm as SchedulerAppointmentVM; if (vm == null || !vm.DataContract.Equals(dc)) continue; var found = vm; found.DataContract = dc; UpdateViewModel(dc, ((SchedulerAppointmentVM) ivm)); vm.UpdateCustomFields(); if (found.EmployeeList.Any(a => a.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) && a.ParticipationAnswer != ParticipationAnswer.Offen && a.IsPChanged) || found.Originator.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) && found.EmployeeList.Any(a => a.IsPC_CheckedTs != null)) zuEntfernen.Add(found); } } this.Dispatch(() => { OffeneTermine = OffeneTermine.Except(zuEntfernen).ToObservableCollection(); OnPropertyChanged("OffeneTermine"); RaiseParticipationChangedEventEvent(); if (OffeneTermine.Count == 0 && OTListView.Items.Count == 0) { Close(); } else { OTListView.SelectedIndex = 0; } }); } private void OK_OnClick(object sender, RoutedEventArgs e) { SelektierterTermin = OTListView.SelectedItem as IBeWoAppointment; if (SelektierterTermin == null || SelektierterTermin.LabelId <= 0) return; ((List) SelektierterTermin.CustomFields["EmployeeList"]).Find(f => f.Employee2SchedulerAppointmentOid == SelektierterTermin.LabelId).IsPC_CheckedTs = DateTime.Now; ((List) SelektierterTermin.CustomFields["EmployeeList"]).Find(f => f.Employee2SchedulerAppointmentOid == SelektierterTermin.LabelId).IsPChanged = false; ServiceFacade.DoResourceServiceAsync(s => s.UpdateSchedulerAppointments(new List {((SchedulerAppointmentVM) SelektierterTermin).DataContract}), UpdateView); } private static void UpdateViewModel(SchedulerAppointmentDC dc, SchedulerAppointmentVM vm) { vm.EmployeeList = dc.EmployeeList; } } public class LVItemConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var app = (IBeWoAppointment) value; if (app.LabelId <= 0) { return string.Format("{0}: {1}", app.Start.ToShortDateString(), app.Subject); } var s = string.Empty; var l = ((List) app.CustomFields["EmployeeList"]).Find(f => f.Employee2SchedulerAppointmentOid == app.LabelId); switch (l.ParticipationAnswer) { case ParticipationAnswer.Zusage: s = "zugesagt"; break; case ParticipationAnswer.Vorbehalt: s = "mit Vorbehalt zugesagt"; break; case ParticipationAnswer.Absage: s = "abgesagt"; break; } return string.Format("{0}: {1} {2} hat {3}", app.Start.ToShortDateString(), l.Employee.FirstName, l.Employee.LastName, s); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class OriginatorExtraxtor : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) { return null; } var app = (IBeWoAppointment)value; var originator = (CompactEmployeeDC) app.CustomFields["Originator"]; return originator.FirstName + " " + originator.LastName; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class Int2VisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (parameter != null && parameter.Equals("ZusagenStack")) { return System.Convert.ToInt32(value) > 0 ? Visibility.Collapsed : Visibility.Visible; } return System.Convert.ToInt32(value) > 0 ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }