Files
BeWoPlaner/BeWo/Scheduling/View/AbsenceTimesCreationView.xaml.cs

191 lines
9.3 KiB
C#

using BeWo.ServiceProxy;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using BS.Shared.Translation;
using DevExpress.XtraScheduler;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace BeWo.Scheduling.View
{
public partial class AbsenceTimesCreationView : Window
{
public List<CompactEmployeeDC> EmployeeList { get; set; }
public DateTime Start { get; set; }
public DateTime Ende { get; set; }
public AbsenceTimesCreationView(DateTime start, DateTime end, List<CompactCustomerDC> customer, List<CompactEmployeeDC> employees, string notice, Appointment appointment, Action<List<AbsenceTimeDC>> schedulerCallback)
{
InitializeComponent();
// Wenn ein Termin im Kalender ganztägig eingetragen wird, ist das Enddatum einen Tag später als eingetragen. Die DevExpress Logik ist einfach anders als die vom BWP
// Beim Einsetzen in die Übertragsmaske muss das Enddatum um 1 reduziert werden, wenn der Termin ganztätig ist
if (appointment != null && !appointment.AllDay)
{
IsAllDay.IsChecked = false;
TextEditStartTime.EditValue = string.Format("{0:HH:mm}", start);
TextEditEndTime.EditValue = string.Format("{0:HH:mm}", end);
}
else
end = end.AddDays(-1);
EmployeeList = employees;
var allAbsenceReasons = ServiceFacade.DoOperationsServiceSync(s => s.GetAllAbsenceReason());
ListboxAbwesenheitskategorie.ItemsSource = allAbsenceReasons;
DateEditStartDate.EditValue = start.Date;
DateEditEndDate.EditValue = end.Date;
TextEditBemerkung.EditValue = notice;
}
private void ListboxAbwesenheitskategorie_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void ButtonSpeichern_Click(object sender, RoutedEventArgs e)
{
bool doSave = true;
bool auchUeberschneidungenSpeichern = false;
// Hat der zu übertragende Termin keine Mitarbeiter in der Liste, kann auch nichts übertragen werden
if (EmployeeList == null || EmployeeList != null && EmployeeList.Count == 0)
MessageBox.Show(Translator.Translate(
"Der zu übertragende Termin wurde keinem Mitarbeiter zugeordnet. Der Übertrag ist so nicht möglich."), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Information);
else if (ListboxAbwesenheitskategorie.SelectedItem == null)
MessageBox.Show(Translator.Translate(
"Bitte wählen Sie eine Abwesenheitskatgorie aus der Liste aus."), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Information);
else
{
// Eine Liste zusammenstellen, in der alle MA drin sind, die schon eine Abwesenheit in dem Zeitraum haben, der gespeichert werden soll
var ueberschneidungen = PruefeAufUeberschneidungen(EmployeeList);
if (ueberschneidungen != null && ueberschneidungen.Count > 0)
{
// Namen zusammenstellen und Nutzer*in anzeigen
var mitarbeiterNamen = string.Join(Environment.NewLine, ueberschneidungen.Select(u => u.FirstNameLastName));
doSave = false;
var result = MessageBox.Show(Translator.Translate(
"Bei folgenden Mitarbeitern gibt es mind. eine Abwesenheit, die sich mit der zu übertragenden überschneidet:\n\n") + mitarbeiterNamen +
"\n\nSoll trotzdem auch für diese gespeichert werden?\nJa = Auch bei Überschneidung speichern\nNein = Für oben genannte nicht speichern",
"BeWoPlaner", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning);
// "Ja" heißt, es soll gespeichert werden und auch für die mitt einer Überschneidung
if (result == MessageBoxResult.Yes)
{
doSave = true;
auchUeberschneidungenSpeichern = true;
}
// "Nein" heißt, es soll gespeichert werden, aber die mit Überschneidung werden ausgelassen
else if (result == MessageBoxResult.No)
{
doSave = true;
}
// Vorgang abbrechen
else if (result == MessageBoxResult.Cancel)
{
doSave = false;
}
}
if (DateEditEndDate.EditValue == null)
{
doSave = false;
MessageBox.Show(Translator.Translate(
"Die Abwesenheit hat kein Startdatum. Ohne Startdatum kann die Abwesenheit nicht gespeichert werden"),
"BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Warning);
}
if (DateEditEndDate.EditValue == null)
{
doSave = false;
if (MessageBox.Show(Translator.Translate(
"Die Abwesenheit hat kein Enddatum.\nBeachten Sie, dass Abwesenheiten ohne Enddatum unbegrenzt weiterlaufen und es dadurch " +
"zu Fehlberechnungen im Stunden- und Urlaubskonto kommen kann.\nMöchten Sie trotzdem fortfahren?"),
"BeWoPlaner", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
doSave = true;
}
}
if (doSave)
{
if (!auchUeberschneidungenSpeichern)
EmployeeList.RemoveRange(ueberschneidungen);
string bemerkung = TextEditBemerkung.EditValue != null ? TextEditBemerkung.EditValue.ToString() : "";
AbsenceReasonDC absReasonDC = (AbsenceReasonDC)ListboxAbwesenheitskategorie.SelectedItem;
try
{
ServiceFacade.DoEmployeeServiceSync(s => s.SpeichereKalenderterminAlsAbwesenheit(EmployeeList, absReasonDC, bemerkung, Start, Ende));
if (EmployeeList.Count > 0)
{
MessageBox.Show(Translator.Translate(
"Übertrag erfolgreich!"), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Information);
}
else
MessageBox.Show(Translator.Translate(
"Es wurde nichts gespeichert, da es ausschließlich Überschneidungen gab."), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
MessageBox.Show(Translator.Translate(
"Beim Speichern gab es einen Fehler. Grund:\n" + ex.Message), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Error);
}
this.Close();
}
}
}
private void ButtonAbbrechen_Click(object sender, RoutedEventArgs e)
{
var result = MessageBox.Show("Sind Sie sicher, dass Sie das Übertragen abbrechen wollen?", "", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
this.Close();
}
private List<CompactEmployeeDC> PruefeAufUeberschneidungen(List<CompactEmployeeDC> employee)
{
DateTime start = (DateTime)DateEditStartDate.EditValue;
DateTime ende = (DateTime)DateEditEndDate.EditValue;
var startZeitArray = new string[2] { "00", "00" };
var endZeitArray = new string[2] { "00", "00" };
// Wenn es bestimmte Start- und Endzeiten gibt in Start- und Enddatum übernehmen
if (!IsAllDay.IsChecked.Value)
{
if (TextEditStartTime.EditValue != null && TextEditStartTime.EditValue.ToString() != "")
startZeitArray = TextEditStartTime.EditValue.ToString().Split(':');
if (TextEditEndTime.EditValue != null && TextEditEndTime.EditValue.ToString() != "")
endZeitArray = TextEditEndTime.EditValue.ToString().Split(':');
Start = new DateTime(start.Year, start.Month, start.Day, Convert.ToInt32(startZeitArray[0]), Convert.ToInt32(startZeitArray[1]), 0);
Ende = new DateTime(ende.Year, ende.Month, ende.Day, Convert.ToInt32(endZeitArray[0]), Convert.ToInt32(endZeitArray[1]), 0);
}
else
{
Start = start;
Ende = ende;
}
return ServiceFacade.DoEmployeeServiceSync(s => s.GetAllEmployeeMitUeberschneidendenAbwesenheiten(employee, Start, Ende));
}
}
}