using ControlzEx.Standard; using MahApps.Metro.Controls; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; 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; using System.Windows.Threading; namespace ZKuP { /// /// Interaktionslogik für Cards.xaml /// public partial class Cards : MetroWindow, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = null) { System.Diagnostics.Debug.WriteLine("PropertyChanged " + propertyName); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } System.Data.DataTable karten = new System.Data.DataTable("karten"); System.Data.DataTable mcFit = new System.Data.DataTable("mcFit"); DispatcherTimer textInputTimer = new DispatcherTimer(); byte[] _signature = null; public Cards() { InitializeComponent(); textInputTimer.Interval = TimeSpan.FromSeconds(0.5); textInputTimer.Tick += TextInputTimer_Tick; } private async void dgCards_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Delete) await DeleteCard(); } private async void btnAdd_Click(object sender, RoutedEventArgs e) { AddCardUser addCardUser = new AddCardUser(); addCardUser.Owner = this; addCardUser.ShowDialog(); await Query(CardType.DB); } private void CheckBoxHeader_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { CheckAllBoxes(); } //private void CheckBox_Click(object sender, RoutedEventArgs e) //{ // var x = (sender as CheckBox).Parent; // //((sender as CheckBox).Parent as DataRowView).Row.ItemArray[7] = !(bool)((sender as CheckBox).Parent as DataRowView).Row.ItemArray[7]; //} private void CheckAllBoxes(bool init = false) { bool anyChecked = false; if (init) { anyChecked = true; } else { foreach (var row in dgCards.Items.Cast()) if (row.Row.Field("IsChecked") == true) { anyChecked = true; break; } } //anyChecked = dgCards.Items.Cast().Any(row => row.Row.Field("IsChecked") == true); foreach (DataRowView row in dgCards.Items) { row["IsChecked"] = !anyChecked; } } private void dgCards_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (dgCards.SelectedIndex != -1) btnDelete.IsEnabled = true; else btnDelete.IsEnabled = false; } private async void btnDelete_Click(object sender, RoutedEventArgs e) { await DeleteCard(); } private async Task DeleteCard() { var dg = dgCards; var row = dg.SelectedItem as System.Data.DataRowView; var arr = row.Row.ItemArray; string cardsQuery = ""; string cardsQueryTimestamp = ""; string rueckgeber = ""; for (int i = 0; i < dg.Items.Count; i++) { DataRowView item = dg.Items[i] as DataRowView; var r = dg.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; if (r != null) { var content = dg.Columns[0].GetCellContent(r); if ((content as CheckBox).IsChecked != null) { var mycheckbox = content as CheckBox; if ((bool)mycheckbox.IsChecked) { cardsQuery += (item as DataRowView).Row.ItemArray[0].ToString() + ";"; cardsQueryTimestamp += (item as DataRowView).Row.ItemArray[5].ToString() + ";"; if (!string.IsNullOrWhiteSpace((item as DataRowView).Row.ItemArray[7].ToString())) rueckgeber = (item as DataRowView).Row.ItemArray[7].ToString(); } } } } if (cardsQuery == "") { if (MessageBox.Show(this, $"Karte {arr[1]},\nausgegeben an {arr[3]} wurde zurückgegeben?\n\nUnterschrift des Zurückgebers wird abgefragt...", "Karte zurückgegeben?", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { var sig = new Signature(Signature.DisclaimerType.Rueck, arr[3].ToString(), arr[1].ToString(), "", true, arr[7].ToString()); if (sig.ShowDialog() == false) { _signature = sig.ResultByte; if (_signature != null) { await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.karten WHERE `kartennr` = '{arr[1]}'"); await Query(CardType.DB); //await SQL.WriteSQL($"UPDATE {MainWindow.table}.kartenLog SET RueckgabeSignature = @signature, Ansprechpartner = '{arr[7]}' WHERE idkarten = '{arr[0]}' AND Ausgebucht = 1 AND `timestamp` > (now() - INTERVAL 2 MINUTE)", _signature); var cmd = SQL.CreateAndReturnSQLCommand($"UPDATE {MainWindow.table}.kartenLog SET RueckgabeSignature = @signature, Ansprechpartner = @arr7 WHERE idkarten = @arr0 AND Ausgebucht = '1' AND `timestamp` > (now() - INTERVAL 2 MINUTE)", new List() { new MySqlParameter("@arr7", arr[7]), new MySqlParameter("@arr0", arr[0]) }); await SQL.CreateAndWriteSQLwithSignature(cmd, _signature); this.Close(); } } } } else { string cards = ""; string delCards = ""; string delCardsLog = ""; for(var i = 0; i < cardsQuery.Split(';').Length - 1; i++) { cards += $"{cardsQuery.Split(';')[i].Trim()} ausgegeben am: {cardsQueryTimestamp.Split(';')[i]}\n"; delCards += $"`kartennr` = '{cardsQuery.Split(';')[i].Trim()}' OR "; delCardsLog += $"(`kartennr` = '{cardsQuery.Split(';')[i].Trim()}' AND Ausgebucht = 1 AND `timestamp` > (now() - INTERVAL 2 MINUTE)) OR "; } int lastIndex = delCards.LastIndexOf(" OR "); if (lastIndex != -1) delCards = delCards.Remove(lastIndex); int lastIndexLog = delCardsLog.LastIndexOf(" OR "); if (lastIndexLog != -1) delCardsLog = delCardsLog.Remove(lastIndexLog); if (MessageBox.Show(this, $"Die Karten\n\n{cards}\nwurden zurückgegeben?\n\nUnterschrift des Zurückgebers wird abgefragt...", "Karten zurückgegeben?", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { var sig = new Signature(Signature.DisclaimerType.Rueck, arr[3].ToString(), arr[1].ToString(), "", true, rueckgeber); if (sig.ShowDialog() == false) { _signature = sig.ResultByte; if (_signature != null) { await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.karten WHERE {delCards}"); await Query(CardType.DB); await SQL.WriteSQL($"UPDATE {MainWindow.table}.kartenLog SET RueckgabeSignature = @signature WHERE {delCardsLog}", _signature); //var cmd = SQL.CreateAndReturnSQLCommand($"UPDATE {MainWindow.table}.kartenLog SET RueckgabeSignature = @signature WHERE @delCardsLog", new List() // { // new MySqlParameter("@delCardsLog", delCardsLog) // }); //await SQL.CreateAndWriteSQLwithSignature(cmd, _signature); this.Close(); } } } } } // // // // // McFIT // // // TextBox lastTextBox = null; private async void TextInputTimer_Tick(object sender, EventArgs e) { textInputTimer.Stop(); var cBItemSource = await SQL.ReadListStringMultipleColumns($"SELECT idmcFitUsers, Name, Vorname FROM {MainWindow.table}.mcFitUsers WHERE `Name` LIKE '{lastTextBox.Text}%'"); List temp = new List(); foreach (var line in cBItemSource) temp.Add(line.Replace(";", " ")); Dispatcher.Invoke(() => { cBNameAusgabe.ItemsSource = temp; cBNameAusgabe.IsDropDownOpen = true; }); } private void tbAusNachname_TextChanged(object sender, TextChangedEventArgs e) { lastTextBox = (sender as TextBox); textInputTimer.Start(); } private async void cBNameAusgabe_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (cBNameAusgabe != null && cBNameAusgabe.SelectedItem != null) { var result = await SQL.ReadListStringMultipleColumns($"SELECT Name,Vorname,Abteilung,Handynr,Email FROM {MainWindow.table}.mcFitUsers WHERE idmcFitUsers = '{cBNameAusgabe.SelectedItem.ToString().Split(' ')[0]}'", 5); tbAusNachname.TextChanged -= tbAusNachname_TextChanged; tbAusNachname.Text = result.First().Split(';')[0]; tbAusVorname.Text = result.First().Split(';')[1]; tbAusAbteilung.Text = result.First().Split(';')[2]; tbAusHandy.Text = result.First().Split(';')[3]; tbAusEmail.Text = result.First().Split(';')[4]; tbAusNachname.TextChanged += tbAusNachname_TextChanged; } } private async void cBZurKarte_SelectionChanged(object sender, SelectionChangedEventArgs e) { int Kartennr = Convert.ToInt32(cBZurKarte.SelectedValue.ToString().Split(' ')[2]); var result = await SQL.ReadListStringMultipleColumns($"SELECT Nachname,Vorname,Abteilung,Handynr,Email FROM {MainWindow.table}.mcFit WHERE Kartennr = '{Kartennr}'", 5); tbZurNachname.Text = result.First().Split(';')[0]; tbZurVorname.Text = result.First().Split(';')[1]; tbZurAbteilung.Text = result.First().Split(';')[2]; tbZurHandy.Text = result.First().Split(';')[3]; tbZurEmail.Text = result.First().Split(';')[4]; } private async void btnAusgebenUnterschrift_Click(object sender, RoutedEventArgs e) { var name = tbAusVorname.Text + " " + tbAusNachname.Text; if (signoPad._stPad.DeviceGetCount() > 0) { if (tbAusVorname.Text != "" && tbAusNachname.Text != "" && tbAusAbteilung.Text != "" && tbAusHandy.Text != "" && tbAusEmail.Text != "") { var sig = new Signature(Signature.DisclaimerType.McFit, name, tbAusAbteilung.Text, tbAusHandy.Text); if (sig.ShowDialog() == false) { _signature = sig.ResultByte; if (_signature != null) { int Kartennr = Convert.ToInt32(cBAusKarte.SelectedValue.ToString().Split(' ')[2]); //await SQL.WriteSQL($"UPDATE {MainWindow.table}.mcFit SET Vorname = '{tbAusVorname.Text}', Nachname = '{tbAusNachname.Text}', Abteilung = '{tbAusAbteilung.Text}', Handynr = '{tbAusHandy.Text}', Email = '{tbAusEmail.Text}', AusgabeTimestamp = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', ZurueckTimestamp = null, AktuellAusgegeben = '1', Signature = @signature, AusgegebenDruch = '{Environment.UserName}' WHERE Kartennr = '{Kartennr}'", _signature); var cmd = SQL.CreateAndReturnSQLCommand($"UPDATE {MainWindow.table}.mcFit SET Vorname = @tbAusVorname, Nachname = @tbAusNachname, Abteilung = @tbAusAbteilung, Handynr = @tbAusHandy, Email = @tbAusEmail, AusgabeTimestamp = @DateTime, ZurueckTimestamp = null, AktuellAusgegeben = '1', Signature = @signature, AusgegebenDurch = @UserName WHERE Kartennr = @Kartennr", new List() { new MySqlParameter("@tbAusVorname", tbAusVorname.Text), new MySqlParameter("@tbAusNachname", tbAusNachname.Text), new MySqlParameter("@tbAusAbteilung", tbAusAbteilung.Text), new MySqlParameter("@tbAusHandy", tbAusHandy.Text), new MySqlParameter("@tbAusEmail", tbAusEmail.Text), new MySqlParameter("@DateTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), new MySqlParameter("@UserName", Environment.UserName), new MySqlParameter("@Kartennr", Kartennr) }); await SQL.CreateAndWriteSQLwithSignature(cmd, _signature); await Query(CardType.McFit); } } } else { MessageBox.Show("Karte auswählen und alle Felder ausfüllen!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } } else MessageBox.Show("Kein Unterschriftenpad gefunden\nMeldung 0x01", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } private async void btnZuruecknehmen_Click(object sender, RoutedEventArgs e) { int Kartennr = Convert.ToInt32(cBZurKarte.SelectedValue.ToString().Split(' ')[2]); //await SQL.WriteSQL($"UPDATE {MainWindow.table}.mcFit SET ZurueckTimestamp = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', AktuellAusgegeben = '0' WHERE Kartennr = '{Kartennr}'"); await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.mcFit SET ZurueckTimestamp = @DateTime, AktuellAusgegeben = '0' WHERE Kartennr = @Kartennr", new List() { new MySqlParameter("@DateTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), new MySqlParameter("@Kartennr", Kartennr) }); await Query(CardType.McFit); } private void btnSignature_Click(object sender, RoutedEventArgs e) { var signBtn = ((sender as Button).DataContext) as System.Data.DataRowView; var i = SQL.ReadSingleByteArr($"SELECT Signature FROM {MainWindow.table}.mcFit WHERE Kartennr = '{(signBtn).Row.ItemArray[0].ToString()}'"); BitmapImage image = null; if (i != null) image = Helper.ConvertBitmapToImage(i); else image = new BitmapImage(new Uri(@"/Resources/NoSignature.png", UriKind.Relative)); var iv = new ImageView(image); iv.Owner = this; iv.ShowDialog(); } private void GruenRot_Click(object sender, RoutedEventArgs e) { tabcontrol.SelectedIndex = 0; } private void McFit_Click(object sender, RoutedEventArgs e) { tabcontrol.SelectedIndex = 1; } private void tabcontrol_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch(tabcontrol.SelectedIndex) { case 0: btnMcFit.Background = new SolidColorBrush(Color.FromArgb(0xFF, 0x25, 0x2F, 0x3B)); btnGreenRed.Background = new LinearGradientBrush(Color.FromArgb(0xFF, 0x25, 0x2F, 0x3B), Color.FromArgb(0xFF, 0x1B, 0x55, 0x7B), 90); break; case 1: btnGreenRed.Background = new SolidColorBrush(Color.FromArgb(0xFF, 0x25, 0x2F, 0x3B)); btnMcFit.Background = new LinearGradientBrush(Color.FromArgb(0xFF, 0x25, 0x2F, 0x3B), Color.FromArgb(0xFF, 0x1B, 0x55, 0x7B), 90); break; } } private async void Window_Loaded(object sender, RoutedEventArgs e) { Helper.CheckWindowIsInScreenSpace(this); await Query(CardType.All); CheckAllBoxes(true); gridSpinner.Visibility = Visibility.Collapsed; Cursor = Cursors.Arrow; } private async Task Query(CardType type) { await Task.Run(() => { if (type == CardType.DB || type == CardType.All) karten = SQL.ReadSQL($"SELECT `kartennr`,`farbe`,`benutzer`,`telnr`,`AusgegebenDurch`,`AusgegebenTimestamp`,`AusgegebenAnFirma`,`AusgegebenAnPerson` FROM {MainWindow.table}.karten ORDER BY AusgegebenTimestamp DESC", karten).Result; if (type == CardType.McFit || type == CardType.All) mcFit = SQL.ReadSQL($"SELECT `Kartennr`,`Vorname`,`Nachname`,`Abteilung`,`Handynr`,`Email`,`AusgabeTimestamp`,`ZurueckTimestamp`,`AktuellAusgegeben` FROM {MainWindow.table}.mcFit ORDER BY AusgabeTimestamp", mcFit).Result; }); Dispatcher.Invoke(() => { if (type == CardType.DB || type == CardType.All) { if (!karten.Columns.Contains("IsChecked")) karten.Columns.Add("IsChecked", typeof(bool)); dgCards.DataContext = karten; } if (type == CardType.McFit || type == CardType.All) dgMcFit.DataContext = mcFit; }); } private void Window_LocationChanged(object sender, EventArgs e) { Helper.CheckWindowIsInScreenSpace(this); } public enum CardType { All, DB, McFit } } }