191 lines
9.3 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|