2026-02-20 12:36:20 +01:00
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 ;
2026-02-03 07:02:06 +01:00
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
{
2026-02-20 12:36:20 +01:00
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 )
2026-02-03 07:02:06 +01:00
{
InitializeComponent ( ) ;
2026-02-20 12:36:20 +01:00
// 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 ) ) ;
2026-02-03 07:02:06 +01:00
}
}
}