using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; 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 PEP_Tool { /// /// Interaktionslogik für Zugzuweisung.xaml /// public partial class Zugzuweisung : Window, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private DataTable mACombo = new DataTable(); public DataTable MACombo { get { return mACombo; } set { mACombo = value; OnPropertyChanged(); } } private List mAView = new List(); public List MAView { get { return mAView; } set { mAView = value; OnPropertyChanged(); } } DataTable schaltList = new DataTable("SchaltList"); DataTable schaltListGewerk = new DataTable("SchaltListGewerk"); DataTable schaltListTag = new DataTable("SchaltListTag"); public Zugzuweisung(Button sender = null) { this.DataContext = this; InitializeComponent(); if (sender != null) ZuweisungFromList(sender); else ZuweisungFromMenu(); dGSchaltList.DataContext = schaltList; dGSchaltListGewerk.DataContext = schaltListGewerk; dGSchaltListTag.DataContext = schaltListTag; } private void ZuweisungFromMenu() { lbl1.Visibility = Visibility.Collapsed; lbl2.Visibility = Visibility.Collapsed; btnAddMitarbeiter.Visibility = Visibility.Visible; dPMAFilter.Visibility = Visibility.Visible; cBGewerke.Visibility = Visibility.Visible; } object sending; object buttonDatum; private async void ZuweisungFromList(Button sender) { sending = sender; dPMAFilter.Visibility = Visibility.Collapsed; cBGewerke.Visibility = Visibility.Collapsed; btnAddMitarbeiter.Visibility = Visibility.Collapsed; lbl1.Visibility = Visibility.Visible; lbl2.Visibility = Visibility.Visible; var x = (sender); var y = x.DataContext as System.Data.DataRowView; var z = y.Row.ItemArray[0]; buttonDatum = y.Row.ItemArray[4]; var schicht = y.Row.ItemArray[8].ToString().Substring(0, 2); lblDate.Text = Convert.ToDateTime(buttonDatum).ToShortDateString(); switch (schicht) { case "MF": cBSchicht.SelectedIndex = 0; break; case "MT": cBSchicht.SelectedIndex = 0; break; case "MS": cBSchicht.SelectedIndex = 1; break; case "MN": cBSchicht.SelectedIndex = 2; break; default: cBSchicht.SelectedIndex = 0; break; } if (schicht == "MF" || schicht == "MT") MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); else MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE c.Arbeitsmuster like '%{schicht}%' AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); //schaltList = await SQL.ReadSQL($"SELECT Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE ZugName = '{tbName.Text}'", schaltList); schaltListTag = await SQL.ReadSQL($"SELECT Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}'", schaltListTag); MAView = Helper.DataTableToGewerk(MACombo); } bool resultChanged = false; private void BtnOK_Click(object sender, RoutedEventArgs e) { this.Close(); } private async void BtnAdd_Click(object sender, RoutedEventArgs e) { DateTime date = DateTime.Now; if (dPSchaltVon.Value.HasValue) { date = dPSchaltVon.Value.Value; if (dPSchaltVon.Value.Value >= dPSchaltBis.Value.Value) { MessageBox.Show("Startzeit größer als Endzeit", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); return; } } else { MessageBox.Show("Kein gültiges Datum gewählt", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); return; } li.Visibility = Visibility.Visible; await Task.Delay(50); await SQL.WriteSQL($"INSERT INTO `schaltung` (ZugName,Datum,Start,Ende,Zustand,Grund,AnzahlMA,Abteilung) VALUES ('{tbName.Text}','{date.ToString("yyyy-MM-dd")}','{dPSchaltVon.Text}','{dPSchaltBis.Text}','{cbSchaltzustand.Text}','{tbGrund.Text}','{cBAnzahlMA.SelectedValue.ToString()}','{(((Gewerk)((ItemCollection)(dGMAView.Items))[dGMAView.SelectedIndex]).Abteilung)}')"); schaltList = await SQL.ReadSQL($"Select Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE ZugName = '{tbName.Text}'", schaltList); schaltListGewerk = await SQL.ReadSQL($"SELECT Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE Abteilung = '{(((Gewerk)((ItemCollection)(dGMAView.Items))[dGMAView.SelectedIndex]).Abteilung)}' AND Start like '{Convert.ToDateTime(buttonDatum).ToString("dd.MM.")}%'", schaltListGewerk); schaltListTag = await SQL.ReadSQL($"SELECT Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE Start like '{Convert.ToDateTime(buttonDatum).ToString("dd.MM.")}%'", schaltListTag); var schicht = ""; switch (cBSchicht.SelectedIndex) { case 0: schicht = "MF"; break; case 1: schicht = "MS"; break; case 2: schicht = "MN"; break; default: schicht = "MF"; break; } if (schicht == "MF" || schicht == "MT") MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); else MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE c.Arbeitsmuster like '%{schicht}%' AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); MAView = Helper.DataTableToGewerk(MACombo); li.Visibility = Visibility.Collapsed; } private void DPMAFilter_SelectedDateChanged(object sender, SelectionChangedEventArgs e) { throw new NotImplementedException(); } private async void DGSchaltList_PreviewKeyDown(object sender, KeyEventArgs e) { var dg = sender as DataGrid; var row = dg.SelectedItem as DataRowView; var arr = row.Row.ItemArray; if (e.Key == Key.Delete) { li.Visibility = Visibility.Visible; await Task.Delay(50); //await SQL.WriteSQL($"UPDATE `mitarbeiter_change` `m` left join `schaltung` `s` ON m.mitarbeiter_static_PersNr = s.mitarbeiter_static_PersNr AND s.Datum = m.Datum SET `ZugNameB` = (select s.ZugName WHERE s.mitarbeiter_static_PersNr = '{arr[8]}' AND s.Start > DATE_FORMAT(NOW(), '%d.%m. %H:%i')) WHERE (s.ZugName = '{arr[1]}' AND s.Datum = '{Convert.ToDateTime(arr[3]).ToString("yyyy-MM-dd")}' AND s.Start = '{arr[4]}' AND s.Ende = '{arr[5]}' AND s.Zustand = '{arr[6]}' AND s.Grund = '{arr[7]}')"); await SQL.WriteSQL($"DELETE FROM `schaltung` WHERE (`Abteilung` = '{arr[0]}' AND `ZugName` = '{arr[2]}' AND `Datum` = '{Convert.ToDateTime(arr[3].ToString().Split(' ')[0] + "." + DateTime.Now.Year).ToString("yyyy-MM-dd")}' AND `Start` = '{arr[3]}' AND `Ende` = '{arr[4]}' AND `Zustand` = '{arr[5]}' AND `Grund` = '{arr[6]}')"); //schaltList = await SQL.ReadSQL($"Select Name,ZugName,Start,Ende,Zustand,Grund FROM `mitarbeiter_static` `m` left join `schaltung` `s` ON m.PersNr = s.mitarbeiter_static_PersNr WHERE {pers}", schaltList); li.Visibility = Visibility.Collapsed; } } private async void DGMAView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (dGMAView.SelectedIndex != -1) { var i = Convert.ToInt16((((Gewerk)((ItemCollection)(dGMAView.Items))[dGMAView.SelectedIndex]).MAVerfuegbar)); var a = new int[i]; for (var j = 1; j != i + 1; ++j) { a[j - 1] = j; } cBAnzahlMA.ItemsSource = a; lblPlanungGewerk.Text = $"Planung für Gewerk '{(((Gewerk)((ItemCollection)(dGMAView.Items))[dGMAView.SelectedIndex]).Abteilung)}' am {Convert.ToDateTime(buttonDatum).ToShortDateString()}:"; schaltListGewerk = await SQL.ReadSQL($"SELECT Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE Abteilung = '{(((Gewerk)((ItemCollection)(dGMAView.Items))[dGMAView.SelectedIndex]).Abteilung)}' AND Start like '{Convert.ToDateTime(buttonDatum).ToString("dd.MM.")}%'", schaltListGewerk); } } private async void TbName_TextChanged(object sender, TextChangedEventArgs e) { if (tbName.Text != "" && char.IsDigit(tbName.Text[0])) { tbName.Text = "Tz " + tbName.Text; tbName.CaretIndex = tbName.Text.Length; } if (System.Text.RegularExpressions.Regex.IsMatch(tbName.Text, @".{1,3}\d\d\d+")) { schaltList = await SQL.ReadSQL($"Select Abteilung,AnzahlMA,ZugName,Start,Ende,Zustand,Grund FROM `schaltung` `s` WHERE ZugName = '{tbName.Text}'", schaltList); lblPlanungTz.Text = $"Planung für Triebzug '{tbName.Text}':"; } else { schaltList.Clear(); lblPlanungTz.Text = $"Planung für Triebzug:"; } } private void CBAnzahlMA_DropDownOpened(object sender, EventArgs e) { if (cBAnzahlMA.Items.Count == 0) cBAnzahlMA.ItemsSource = new string[1] { "Bitte zuerst Gewerk wählen" }; } private async void CBSchicht_SelectionChanged(object sender, SelectionChangedEventArgs e) { var schicht = "";//((DataRowView)((Button)sending).DataContext).Row.ItemArray[8].ToString().Substring(0, 2); switch (cBSchicht.SelectedIndex) { case 0: schicht = "MF"; break; case 1: schicht = "MS"; break; case 2: schicht = "MN"; break; default: schicht = "MF"; break; } DataTable dt = null; if (schicht == "MF" || schicht == "MT") dt = await SQL.ReadSQL($"SELECT Min(str_to_date(REPLACE(Beginn, '*', ':'), '%H:%i')), max(str_to_date(REPLACE(Gehen, '*', ':'), '%H:%i')) from mitarbeiter_change where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (Arbeitsmuster like '%{schicht}%' OR Arbeitsmuster like '%MT%')"); else dt = await SQL.ReadSQL($"SELECT Min(str_to_date(REPLACE(Beginn, '*', ':'), '%H:%i')), max(str_to_date(REPLACE(Gehen, '*', ':'), '%H:%i')) from mitarbeiter_change where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND Arbeitsmuster like '%{schicht}%'"); var from = dt.Rows[0].ItemArray[0].ToString(); var until = dt.Rows[0].ItemArray[1].ToString(); dPSchaltVon.Value = null; dPSchaltBis.Value = null; dPSchaltVon.Minimum = null; dPSchaltBis.Maximum = DateTime.MaxValue; if (!(string.IsNullOrEmpty(from) || string.IsNullOrEmpty(until))) { if (TimeSpan.Parse(from) > TimeSpan.Parse(until)) { dPSchaltVon.Minimum = Convert.ToDateTime(buttonDatum) + TimeSpan.Parse(from); dPSchaltBis.Maximum = Convert.ToDateTime(buttonDatum) + TimeSpan.FromDays(1) + TimeSpan.Parse(until); } else { dPSchaltVon.Minimum = Convert.ToDateTime(buttonDatum) + TimeSpan.Parse(from); dPSchaltBis.Maximum = Convert.ToDateTime(buttonDatum) + TimeSpan.Parse(until); } } else { dPSchaltVon.Minimum = Convert.ToDateTime(buttonDatum); dPSchaltBis.Maximum = Convert.ToDateTime(buttonDatum) + TimeSpan.FromDays(2); } dPSchaltVon.Value = dPSchaltVon.Minimum.Value; dPSchaltBis.Value = dPSchaltBis.Maximum.Value; if (schicht == "MF" || schicht == "MT") MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE (c.Arbeitsmuster like '%MF%' OR c.Arbeitsmuster like '%MT%') AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); else MACombo = await SQL.ReadSQL($"SELECT Abteilung, COUNT(*) - IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0),COUNT(*),IFNULL((SELECT SUM(AnzahlMA) from schaltung `s` where Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' AND c.Arbeitsmuster like '%{schicht}%' AND s.Abteilung = m.Abteilung),0) From `mitarbeiter_static` `m` left join `mitarbeiter_change` `c` ON m.PersNr = c.mitarbeiter_static_PersNr WHERE c.Arbeitsmuster like '%{schicht}%' AND c.Datum = '{Convert.ToDateTime(buttonDatum).ToString("yyyy-MM-dd")}' group by m.Abteilung order by Abteilung"); MAView = Helper.DataTableToGewerk(MACombo); } private void OnPropertyChanged([CallerMemberName] string propertyName = null) { System.Diagnostics.Debug.WriteLine("PropertyChanged " + propertyName); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class SearchFilterConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return $"{values[0].ToString()} {values[1].ToString()}"; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } public class Gewerk { public string Abteilung { get; set; } public string MAAnwesend { get; set; } public string MAVerplant { get; set; } public string MAVerfuegbar { get; set; } } }