using BuechermarktClient.Models; using System.ComponentModel; using System.Linq; using System.Windows; using MongoDB.Driver; using MongoDB.Bson; using System.Collections.Generic; using System.Windows.Data; using System; using System.Globalization; using System.Threading; using System.Windows.Input; using System.Windows.Controls; using System.Collections.Specialized; using System.Collections.ObjectModel; namespace BuechermarktClient { /// /// Interaktionslogik für Sell.xaml /// public partial class Sell : Window, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private Dictionary _Dictionary; private Dictionary _ReverseDictionary; private string _AddField; public string AddField { get { return _AddField; } set { if(value != _AddField) { _AddField = value; OnPropertyChanged("AddField"); } } } private int _SvSum; public int SvSum { get { return _SvSum; } set { if (value != _SvSum) { _SvSum = value; OnPropertyChanged("SvSum"); } } } private double _TotalSum; public double TotalSum { get { return _TotalSum; } set { if(value != _TotalSum) { _TotalSum = value; OnPropertyChanged("TotalSum"); } } } private readonly ObservableCollection _SellBooks; public ObservableCollection SellBooks { get { return _SellBooks; } } private void listChanged(object sender, NotifyCollectionChangedEventArgs args) { SvSum = SellBooks.Count; var pr = 0.0; foreach(var sb in SellBooks) { pr += sb.Price; } TotalSum = SvSum + pr; } public Sell() { InitializeComponent(); DataContext = this; _SellBooks = new ObservableCollection(); _SellBooks.CollectionChanged += listChanged; _Dictionary = new Dictionary(); _Dictionary.Add('a', 'A'); _Dictionary.Add('b', 'B'); _Dictionary.Add('c', 'C'); _Dictionary.Add('d', 'D'); _Dictionary.Add('e', 'E'); _Dictionary.Add('f', 'F'); _Dictionary.Add('g', 'G'); _Dictionary.Add('h', 'H'); _Dictionary.Add('i', 'I'); _Dictionary.Add('j', 'J'); _Dictionary.Add('k', 'K'); _Dictionary.Add('l', 'L'); _Dictionary.Add('m', 'M'); _Dictionary.Add('n', 'N'); _Dictionary.Add('o', 'O'); _Dictionary.Add('p', 'P'); _Dictionary.Add('q', 'Q'); _Dictionary.Add('r', 'R'); _Dictionary.Add('s', 'S'); _Dictionary.Add('t', 'T'); _Dictionary.Add('u', 'U'); _Dictionary.Add('v', 'V'); _Dictionary.Add('w', 'W'); _Dictionary.Add('x', 'X'); _Dictionary.Add('y', 'Y'); _Dictionary.Add('z', 'Z'); _Dictionary.Add('1', '!'); _Dictionary.Add('2', '"'); _Dictionary.Add('3', '§'); _Dictionary.Add('4', '$'); _Dictionary.Add('5', '%'); _Dictionary.Add('6', '&'); _Dictionary.Add('7', '/'); _Dictionary.Add('8', '('); _Dictionary.Add('9', ')'); _Dictionary.Add('0', '='); _Dictionary.Add('ß', '?'); _Dictionary.Add('-', '_'); _ReverseDictionary = new Dictionary(); foreach(var entry in _Dictionary) { _ReverseDictionary.Add(entry.Value, entry.Key); } } private void Add_Click(object sender, RoutedEventArgs e) { while (true) { try { var reverse = ReverseString(AddField); var case1 = ReverseUnderscore(AddField); var case2 = ReverseUnderscore(reverse); foreach (var s in SellBooks) { if(s.LabelId == AddField || s.LabelId == reverse || s.LabelId == case1 ||s.LabelId == case2) { MessageBox.Show("Das Buch ist bereits in der Liste"); return; } } var item = MainWindow.BookCollection.FindSync(b => b.LabelId == AddField || b.LabelId == reverse || b.LabelId == case1 || b.LabelId == case2).FirstOrDefault(); if (item == null) { MessageBox.Show("Das Buch ist nicht vorhanden bitte überprüfen"); return; } var stud = MainWindow.StudentCollection.FindSync(s => s.ID == item.Student).FirstOrDefault(); if (stud == null) { MessageBox.Show("Der Schüler ist nicht vorhanden bitte überprüfen"); return; } var type = MainWindow.BookTypeCollection.FindSync(bt => bt.ID == item.BookType).FirstOrDefault(); if (type == null) { MessageBox.Show("Der Buchtyp (ObjId: " + item.BookType + ") ist nicht vorhanden bitte überprüfen"); return; } var sb = new SellBook(); sb.StudentId = stud.LabelId; sb.LabelId = item.LabelId; sb.Price = item.Price; sb.Type = type.Name; AddField = String.Empty; SellBooks.Add(sb); Dispatcher.BeginInvoke(new Action(delegate () { BooksList.ItemsSource = SellBooks; })); return; } catch (MongoExecutionTimeoutException) { Thread.Sleep(100); } } } private void ListViewItem_PreviewMouseUp(object sender, MouseButtonEventArgs e) { if (sender is ListViewItem item && item.IsSelected) { SellBooks.Remove(item.DataContext as SellBook); Dispatcher.BeginInvoke(new Action(delegate () { BooksList.ItemsSource = SellBooks; })); } } private void SellAll_Click(object sender, RoutedEventArgs e) { while (true) { try { foreach (var sb in SellBooks) { MainWindow.BookCollection.FindOneAndUpdate(b => b.LabelId == sb.LabelId, Builders.Update.Set(b => b.State, Models.BookState.Selled)); } SellBooks.Clear(); Dispatcher.BeginInvoke(new Action(delegate () { BooksList.ItemsSource = SellBooks; })); return; } catch (MongoExecutionTimeoutException) { Thread.Sleep(100); } } } private string ReverseString(string s) { var res = String.Empty; foreach(var i in s) { char v; if(_Dictionary.TryGetValue(i, out v) || _ReverseDictionary.TryGetValue(i, out v)) { res += v; } else { MessageBox.Show(string.Format("Das Label enthält ungültige Zeichen ( {0} ), {1}", i, s)); return null; } } return res; } private string ReverseUnderscore(string s) { if(s.IndexOf("_") >= 0 || s.IndexOf("-") >= 0) { s = s.Replace("_", "?").Replace("-", "ß"); } else { s = s.Replace("?", "_").Replace("ß", "-"); } return s; } } public class SellBook { public string StudentId { get; set; } public string LabelId { get; set; } public string Type { get; set; } public double Price { get; set; } } }