using BrightIdeasSoftware; using DatenDB; using Deckungsbeitrag.AA_Forms; using Deckungsbeitrag.AA_Klassen; using Deckungsbeitrag.UserControls; //using HarfBuzzSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Deckungsbeitrag { public partial class FormArtikelVW : Form { private readonly Benutzer user; private List artikelList; private AuftragTyp auftragTyp; private int dropdownWidth; public Timer timer; public Artikel artikel; public FormArtikelVW() { InitializeComponent(); } public FormArtikelVW(Benutzer benutzer) : this() { this.user = benutzer; } public FormArtikelVW(Benutzer benutzer, AuftragTyp typ) : this(benutzer) { this.auftragTyp = typ; this.comboBoxArtikel.Enabled = false; } private void FormArtikelVW_Load(object sender, EventArgs e) { timer = new Timer(); timer.Interval = 700; // 0,7 Sekunden timer.Tick += Lade_TmpList; List artlist = Artikel.GetArtikelList("Nachwaesche"); this.comboBoxArtikel.SelectedIndexChanged -= ComboBoxArtikel_SelectedIndexChanged; this.comboBoxArtikel.DataSource = artlist; this.comboBoxArtikel.DisplayMember = "Bezeichnung"; foreach (Artikel art in artlist) { int bezWidth = TextRenderer.MeasureText(art.Bezeichnung, comboBoxArtikel.Font).Width; if (dropdownWidth < bezWidth) dropdownWidth = bezWidth; } this.comboBoxArtikel.DropDownWidth = dropdownWidth; this.comboBoxArtikel.SelectedIndex = -1; this.comboBoxArtikel.SelectedIndexChanged += ComboBoxArtikel_SelectedIndexChanged; OLV_Load_with_Artikel(); } #region ObjectListView private void ObjectListViewArtikel_MouseDoubleClick(object sender, MouseEventArgs e) { ObjectListView olv = (ObjectListView)sender; if (olv.SelectedObjects.Count == 0 || olv.SelectedObjects.Count > 1) return; if (olv.SelectedObject is NachwaescheArtikelData nwArtikel) { artikel = Artikel.GetArtikel(null, nwArtikel.ArtikelID); this.DialogResult = DialogResult.OK; this.Close(); } } private void OLV_GroupCount() { foreach (OLVGroup group in this.objectListViewArtikel.OLVGroups) { int sum = 0; foreach (OLVListItem item in group.Items) { Artikel art = (Artikel)item.RowObject; sum += art.Nachwaesche; } group.Header = $"{group.Header} (Anzahl: {sum})"; } } /// /// Die ObjectListView wird mit den Artikeln geladen bei denen Nachwäsche registriert wird. /// private void OLV_Load_with_Artikel() { if (this.user.Rolle == BenutzerRolle.Expedit || this.user.Rolle == BenutzerRolle.Frottee || this.user.Rolle == BenutzerRolle.Master || this.auftragTyp == AuftragTyp.SOLL_Erhoehung) { //TODO: Einbinden der NachwaescheArtikelData... Generator.GenerateColumns(this.objectListViewArtikel, typeof(NachwaescheArtikelData)); this.artikelList = Artikel.GetArtikelList("Nachwaesche"); var NWArtikelList = new List(); foreach (Artikel art in this.artikelList) { NWArtikelList.Add(new NachwaescheArtikelData { ArtikelID = art.ArtikelID, ArtNummer = art.Nummer.ToString(), ArtName = art.Bezeichnung, Short = art.Short, Sauber = 0, Muell = 0, Kategorie = art.Kategorie }); } this.objectListViewArtikel.Tag = NWArtikelList; this.objectListViewArtikel.Font = new Font(this.objectListViewArtikel.Font.FontFamily, 16, FontStyle.Regular); this.objectListViewArtikel.SetObjects(NWArtikelList); this.objectListViewArtikel.PrimarySortColumn = (OLVColumn)this.objectListViewArtikel.AllColumns[6]; this.objectListViewArtikel.SecondarySortColumn = (OLVColumn)this.objectListViewArtikel.Columns["Abkürzung"]; this.objectListViewArtikel.Sort(); this.objectListViewArtikel.Refresh(); } else { Generator.GenerateColumns(this.objectListViewArtikel, typeof(View_Artikel_Nachwaesche), true); List artnwListe = View_Artikel_Nachwaesche.LadeNachwaesche(); this.objectListViewArtikel.SetObjects(artnwListe); OLVColumn sortColumn = (OLVColumn)this.objectListViewArtikel.Columns["Abteilung"]; this.objectListViewArtikel.Sort(sortColumn); //OLV_GroupCount(); //OLVColumn buttonColumn = new OLVColumn(); //buttonColumn = (OLVColumn)this.objectListViewArtikel.Columns[7]; //buttonColumn.IsButton = true; //buttonColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; } OLV_ColumnsResize(); } /// /// Die ObjectListView wird mit Kunden geladen welche den in der ComboBox gewählten Artikel im Sortiment haben. /// /// Der gewählte Artikel aus der ComboBox private void OLV_Load_with_Kunden(Artikel art) { this.Cursor = Cursors.WaitCursor; this.SuspendLayout(); this.objectListViewArtikel.Columns.Clear(); this.objectListViewArtikel.ShowGroups = false; Generator.GenerateColumns(this.objectListViewArtikel, typeof(NWData)); List kndartList = KundeArtikel.GetFehlmengeList(null, art.ArtikelID, false); var NWDataList = new List(); // Kunden sammeln foreach (KundeArtikel kndart in kndartList) { Kunde knd = Kunde.GetKunde(null, kndart.KundeID, null); NWDataList.Add(new NWData { KndArtID = kndart.KundeArtikelID, KundeID = kndart.KundeID, KndNummer = knd.KundeNummer, Kunde = knd.Suchtext ?? knd.KundeName, Nachwaesche = kndart.Fehlmenge, Reklamation = kndart.Reklamation }); } this.objectListViewArtikel.SetObjects(NWDataList); this.objectListViewArtikel.Refresh(); OLV_ColumnsResize(); this.ResumeLayout(); this.Cursor = Cursors.Default; } private void OLV_ColumnsResize() { this.objectListViewArtikel.FilterMenuBuildStrategy = new MeinFilterMenu(); this.objectListViewArtikel.Width = Funktionen.Columns_Resize(null, objectListViewArtikel).olv.Width + 20; this.objectListViewArtikel.Refresh(); } private void ObjectListViewArtikel_ButtonClick(object sender, CellClickEventArgs e) { Artikel artikel = (Artikel)e.Model; artikel.Nachwaesche = 0; artikel.LastReset = DateTime.Now; if(artikel.Save() == 1) this.objectListViewArtikel.RefreshObject(e.Model); } private void ObjectListViewArtikel_AfterCreatingGroups(object sender, CreateGroupsEventArgs e) { foreach (OLVGroup group in this.objectListViewArtikel.OLVGroups) { int sum = 0; foreach (OLVListItem item in group.Items) { Artikel art = (Artikel)item.RowObject; sum += art.Nachwaesche; } group.Header = $"{group.Header} (Anzahl: {sum})"; } } private void ObjectListViewArtikel_CellEditFinished(object sender, CellEditEventArgs e) { OLVColumn col = e.Column; DateTime timestamp = DateTime.Now.Date; if (col == null) return; if (e.NewValue == e.Value) return; if (int.TryParse(e.NewValue.ToString(), out int i)) { if (i > 0) { Artikel art = Artikel.GetArtikel(((View_Artikel_Nachwaesche)e.RowObject).ArtNr, null); ArtikelNachwaesche artnw = ArtikelNachwaesche.FindeDatensatz(art.ArtikelID, timestamp); if (col.Text == "Sauber") { if (artnw.NachwaescheID != null) artnw.Sauber += i; else { artnw = new ArtikelNachwaesche() { ArtikelID = art.ArtikelID, Datum = timestamp, Sauber = i }; } } if (col.Text == "Müll") { if (artnw.NachwaescheID != null) artnw.Muell += i; else { artnw = new ArtikelNachwaesche() { ArtikelID = art.ArtikelID, Datum = timestamp, Muell = i }; } } artnw.Save(); } else { if (col.Text == "NW") { NWData nw = (NWData)e.RowObject; KundeArtikel kndart = KundeArtikel.GetItem((int)nw.KndArtID); kndart.Fehlmenge = i; kndart.FehlmengeBearbeitet = this.user.BenutzerName + " am " + DateTime.Now.ToString(); kndart.Save(); } } } else { CustomMessageBox.Show("Titel.Fehler", "Text.Fehler.NurZahlen", null, new string[] { "Ok" }); e.Cancel = true; } this.objectListViewArtikel.RefreshObject(e.RowObject); } private void ObjectListViewArtikel_CellEditStarting(object sender, CellEditEventArgs e) { if (e.Control is NumericUpDown numeric) { numeric.Select(0, Text.Length); numeric.Focus(); } } #endregion private void ComboBoxArtikel_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; Artikel art = cb.SelectedItem as Artikel; OLV_Load_with_Kunden(art); } private void ObjectListViewArtikel_Resize(object sender, EventArgs e) { this.ClientSize = new Size(this.objectListViewArtikel.Width + this.objectListViewArtikel.Left, this.ClientSize.Height); } private void TextBoxSuchen_TextChanged(object sender, EventArgs e) { // TextChanged tritt nur ein wenn x Sekunden keine Eingabe erfolgt. Logik befindet sich in Timer_Tick timer.Stop(); // Alten Timer beenden timer.Start(); // Neuen Timer starten } private void Lade_TmpList(object sender, EventArgs e) { timer.Stop(); // Timer stoppen if (string.IsNullOrWhiteSpace(this.textBoxSuchen.Text)) return; if (!this.textBoxSuchen.Text.StartsWith("?")) { string term = this.textBoxSuchen.Text.Trim().ToLower(); if (this.objectListViewArtikel.Tag == null) return; if (this.objectListViewArtikel.Tag is List _allItems) { var filtered = string.IsNullOrWhiteSpace(term) ? _allItems : _allItems.Where(x => (x.ArtName != null && x.ArtName.ToLower().Contains(term)) || (x.Short != null && x.Short.ToLower().Contains(term)) || x.ArtNummer.ToString().Contains(term)).ToList(); this.objectListViewArtikel.SetObjects(filtered); } } } private void TextBoxSuchen_Enter(object sender, EventArgs e) { this.textBoxSuchen.ForeColor = Color.Black; this.textBoxSuchen.Select(0, this.textBoxSuchen.Text.Length); //this.textBoxSuchen.Clear(); } private void TextBoxSuchen_Click(object sender, EventArgs e) { this.textBoxSuchen.SelectAll(); } } } //CHANGES: Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel.