using BrightIdeasSoftware; using DatenDB; using Deckungsbeitrag.AA_Forms; using Deckungsbeitrag.AA_Klassen; using Deckungsbeitrag.Properties; using Deckungsbeitrag.UserControls; using Microsoft.VisualBasic; using Npgsql; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Reflection; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Resolvers; namespace Deckungsbeitrag { public enum ListenArt { Auftragliste = 0, Sonderliste = 1, Geschäftliste = 2, Suchliste = 3, Rampenliste = 4, Vorbereitetliste = 5 } public partial class FormExpedit : Form { #region Properties private readonly UserSettingsManager _settings = new UserSettingsManager(); private ToolTip cellTooltip = new ToolTip(); public Meldungen fehlermeldung = new Meldungen(); public Image etikett = null; public Auftrag auftrag; public Auftrag NeuerAuftrag; //NEU FÜR UPDATE //public AuftragArtikel auftragArtikel; public Benutzer benutzer; public Kunde kunde; DateTime? letzterLiefertag = null; bool nocont = false; bool nocontclicked = false; Meldungen meldung = new Meldungen(); private List artikelListe; private List auftraglist; private List sonderlist; private List geschaeftlist; private List suchliste; private List rampenlist; private List vorbereitetliste; int beforeedit = 0; int? altecontclean = null; Timer timer1 = new Timer(); // Timer für Nachwäsche Timer timer2 = new Timer(); // Timer für Refresh Auftragliste private Screen[] screens; private Point itemlocation; //private ImageList imagelist = new ImageList(); private volatile bool _isProcessing = false; // Thread-sicherer Flag gegen Überlappung private int _consecutiveFailures = 0; private const int MAX_FAILURES = 3; private bool aufgabeDone = false; private bool isttest = true; private bool _doubleClickPending = false; private OnboardingSchritt onBoardingArt = OnboardingSchritt.Expedit; private List listAuftragToday; private List listAuftragGeschaeft; private List listVorbereitet; private List listSonderAuftrag; private List listRampe; #endregion public FormExpedit(Benutzer benutzer) { InitializeComponent(); this.Text += " Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); this.benutzer = benutzer; this.StartPosition = FormStartPosition.CenterScreen; this.tabControlAuftragList.Visible = true; } public FormExpedit(Benutzer benutzer, Screen[] screens) : this(benutzer) { this.screens = screens; foreach (Screen screen in screens) { if (screen.Primary) { if (screen.WorkingArea.Width < 1500) { this.objectListViewAuftrag.Font = new Font(this.objectListViewAuftrag.Font.FontFamily, 10); } } } } #region Form-Funktionen private void FormExpedit_Load(object sender, EventArgs e) { this.UseWaitCursor = true; this.SuspendLayout(); _settings.Load(); UCFeedback fb = new UCFeedback(this.benutzer); this.Controls.Add(fb); //Auftragslisten erstellen und in ObjectListViews laden. // DB PARALLEL im Background (NON-BLOCKING!) _ = Task.Run(async () => { try { await Task.WhenAll( GetAuftraegeAsync(null)); // UI-Update NACH Daten (Invoke!) this.Invoke(new Action(() => { // OLVs füllen if (listAuftragToday.Count > 0) Load_OLV(this.objectListViewAuftrag, listAuftragToday); if (listAuftragGeschaeft != null && listAuftragGeschaeft.Count > 0) Load_OLV(this.objectListViewGeschaeft, listAuftragGeschaeft); if (listSonderAuftrag.Count > 0) Load_OLV(this.objectListViewSonder, listSonderAuftrag); if (listVorbereitet != null && listVorbereitet.Count > 0) Load_OLV(this.objectListViewVorbereitet, listVorbereitet); if (listRampe!= null && listRampe.Count > 0) Load_OLV(this.objectListViewRampe, listRampe); // Controls aktivieren und deaktivieren nach BenutzerRolle Enable_Controls(); })); } catch (Exception ex) { // Vermeide $ für C# älter Random rnd = new Random(); int zahl = rnd.Next(1, 10001); this.BeginInvoke(new Action(() => MessageBox.Show(string.Format($"Laden fehlgeschlagen. Leite den Fehler {zahl} an Kilian weiter. ", ex.Message)))); Program.AddFehler(this.benutzer, $"Fehler {zahl} - ex.Message", ex.StackTrace, null); } }); } private void FormExpedit_FormClosing(object sender, FormClosingEventArgs e) { _settings.OLV_State = this.objectListViewAuftrag.SaveState(); _settings.Save(); } private void FormExpedit_Resize(object sender, EventArgs e) { this.tabControlAuftragList.Width = this.ClientSize.Width; } /// /// Wenn FormExpedit angezeigt wird, wird die Location des FeedbackButtons berechnet. /// /// /// private void FormExpedit_Shown(object sender, EventArgs e) { // Location des Feedback Buttons wird berechnet. (Screengröße ist hier klar) UCFeedback fb = this.Controls.Find("feedback", false)[0] as UCFeedback; Button btn = fb.Controls[0] as Button; if (fb != null) fb.Location = new Point(this.ClientSize.Width - fb.Width, 0); btn.BackColor = Program.Wirlblau; btn.ForeColor = Color.White; btn.FlatAppearance.BorderColor = Color.White; fb.BringToFront(); //WindowState = FormWindowState.Maximized; } #endregion #region Button_Click-Events private async void buttonNeuerAuftrag_Click(object sender, EventArgs e) { FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(benutzer, this.letzterLiefertag, AuftragTyp.Standart); if (neuerAuftrag.ShowDialog() == DialogResult.OK) { this.letzterLiefertag = neuerAuftrag.letzterLiefertag; await GetAuftraegeAsync(ListenArt.Auftragliste); await GetAuftraegeAsync(ListenArt.Geschäftliste); //List auftraglist = Auftrag.GetAuftragListToday(DateTime.Today); OLV_SetObjects(this.objectListViewAuftrag, listAuftragToday); OLV_SetObjects(this.objectListViewGeschaeft, listAuftragGeschaeft); } } private void buttonSWS_Drucken_Click(object sender, EventArgs e) { Kunde knd = Funktionen.KundenAuswahl(); if(knd != null) Funktionen.SWS_Drucken(null, knd, this); } private void buttonEinstellung_Click(object sender, EventArgs e) { FormEinstellung einstellung = new FormEinstellung(this.benutzer); einstellung.ShowDialog(); } private void buttonSuchen_Click(object sender, EventArgs e) { int kundeID = 0; string eingabe = PromptForText( "Welchen Kunden suchst du? \n\n" + "Bitte scanne den QR-Code des Kunden den du suchst:", "QR-Code Inhalt", "0"); if (string.IsNullOrWhiteSpace(eingabe)) { this.UseWaitCursor = false; return; } string cleanedText = new string(eingabe.Where(char.IsLetterOrDigit).ToArray()); if (int.TryParse(cleanedText, out _)) kundeID = Kunde.GetKundeID(cleanedText, null); else kundeID = Kunde.GetKundeID(null, cleanedText); var model = objectListViewAuftrag.Objects.Cast().FirstOrDefault(a => a.KundeID == kundeID); if (model == null) { } if (model != null) { objectListViewAuftrag.SelectedObject = model; objectListViewAuftrag.EnsureModelVisible(model); objectListViewAuftrag.Focus(); } else { FormShowGroupBox showGroupBox = new FormShowGroupBox("Auftrag Suchen", this.benutzer); if (showGroupBox.ShowDialog() == DialogResult.OK) { suchliste = showGroupBox.auftragliste; AddTabPage(suchliste, ListenArt.Suchliste); } } } private void buttonReklamation_Click(object sender, EventArgs e) { FormFehlmengeCount reklamation = new FormFehlmengeCount(this.benutzer); reklamation.ShowDialog(); } private void buttonTourenListe_Click(object sender, EventArgs e) { List fahrerliste = Benutzer.GetFahrerList(); Benutzer fahrer = new Benutzer(); FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste); if (benutzerVW.ShowDialog() == DialogResult.OK) { fahrer = benutzerVW.user; } else fahrer = null; if (fahrer != null) { List auftragliste = Auftrag.GetTourenListe(fahrer); if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer); } } private void buttonStats_Click(object sender, EventArgs e) { FormShowGroupBox showGroupBox = new FormShowGroupBox("Statistik", this.benutzer); showGroupBox.ShowDialog(); } #endregion #region ObjectListView-Events private void Load_OLV(ObjectListView olv, List auftragliste) { // ========== LAYOUT UND UPDATE PAUSIEREN ========== olv.BeginUpdate(); // Stoppt Datenaktualisierungen/Redraws olv.SuspendLayout(); // Stoppt Layout-Berechnungen (Anchor/Dock) // ========== SPALTEN AUTOMATISCH AUS MODEL ERTELLEN ========== Generator.GenerateColumns(olv, typeof(View_Auftrag_Expedit), true); // ========== SPALTEN ANPASSEN ========== var aufgabeCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Aufgabe"); if (aufgabeCol != null) { aufgabeCol.ImageGetter = rowObject => { var auftrag = rowObject as View_Auftrag_Expedit; return string.IsNullOrEmpty(auftrag?.AufgabeBezeichnung) ? -1 : 0; }; } var kundeCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Kunde"); if (kundeCol != null) { kundeCol.ImageGetter = rowObject => { var auftrag = rowObject as View_Auftrag_Expedit; return string.IsNullOrEmpty(auftrag?.Zusatz) ? -1 : 1; }; } var dirtCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Schmutzig"); if (dirtCol != null) { dirtCol.HeaderImageKey = "dirt"; dirtCol.ShowTextInHeader = false; dirtCol.MinimumWidth = dirtCol.MaximumWidth = 80; } var cleanCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Sauber"); if (cleanCol != null) { cleanCol.HeaderImageKey = "clean"; cleanCol.ShowTextInHeader = false; cleanCol.MinimumWidth = dirtCol.MaximumWidth = 80; } var primaryCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Status"); if (primaryCol != null) olv.PrimarySortColumn = primaryCol; var secondaryCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Liefertag"); if (secondaryCol != null) olv.SecondarySortColumn = secondaryCol; var druckenCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Etikett"); if (druckenCol != null) { druckenCol.IsButton = true; // Als Button rendern druckenCol.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle druckenCol.HeaderImageKey = "print"; druckenCol.ShowTextInHeader = false; druckenCol.MinimumWidth = druckenCol.MaximumWidth = 80; } var fertigCol = olv.AllColumns.Cast().FirstOrDefault(col => col.Text == "Abschließen"); if (fertigCol != null) { fertigCol.IsButton = true; // Als Button rendern fertigCol.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle fertigCol.HeaderImageKey = "abschließen"; fertigCol.ShowTextInHeader = false; fertigCol.MinimumWidth = fertigCol.MaximumWidth = 80; } // ========== SPALTEN JE NACH TAB UND ROLLE AUSBLENDEN ========== GetUnvisibleColumns(olv); //if (_settings.OLV_State != null) olv.RestoreState(_settings.OLV_State); // ========== IMAGE-LIST ZUWEISEN ========== // SmallImageList für Icons in Detail-View (24x24 Pixel standard) Program.imagelist.ImageSize = new Size(24, 24); olv.SmallImageList = Program.imagelist; // Voraussetzung: imagelist mit Icon Index 0 gefüllt // ========== TOOLTIP FÜR ICON-SPALTEN ========== // Automatischer Cell-Tooltip bei Mouse-Hover olv.CellToolTipShowing += (s, e) => { // Nur für Icon-Spalte (Index 10) und gültiges Model if (e.Column.Text == "Aufgabe" && e.Model is View_Auftrag_Expedit) { Auftrag auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.Model).AuftragID); // Lade Bezeichnung der Aufgabe als Tooltip-Text e.Text = Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung; } // Nur für Icon-Spalte (Index 1) und gültiges Model if (e.Column.Text == "Kunde" && e.Model is View_Auftrag_Expedit) { Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.Model).AuftragID); if (!string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) { // Lade Anmerkung als Tooltip-Text e.Text = Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung; } } if (e.Column.Text == "Fahrer" && e.Model is Auftrag auftrag1) { e.Text = auftrag1.ZusatzInfo; } }; // ========== DATEN LADEN ========== // WICHTIG: SetObjects NACH Column-Konfiguration aufrufen! OLV_SetObjects(olv, auftragliste); // ========== SORTIERUNG NACH SPALTEN ========== olv.Sort(); // ========== SPALTENBREITE ANPASSEN ========== olv = Funktionen.Columns_Resize(null, olv).olv; // ========== FILTER AKTIVIEREN UND ZUWEISEN ========== olv.FilterMenuBuildStrategy = new MeinFilterMenu(); // ========== AUFRÄUMEN & AKTIVIEREN ========== olv.ResumeLayout(); // Layout-Pause beenden, Positionen neu berechnen olv.EndUpdate(); // Update-Pause beenden, Daten neu zeichnen olv.Focus(); // OLV fokussieren (Tastaturbedienung aktivieren) this.UseWaitCursor = false; } private void objectListViewAuftrag_FormatCell(object sender, FormatCellEventArgs e) { ObjectListView olv = (ObjectListView)sender; if (e.Column.IsButton) { if(e.SubItem.BackColor != Color.LightBlue) { e.SubItem.BackColor = Color.AliceBlue; e.SubItem.ForeColor = Color.Black; } else { e.SubItem.BackColor = Color.LightSteelBlue; e.SubItem.ForeColor = Color.Black; } } if (e.Column.Text == "FR" || e.Column.Text == "KT" || e.Column.Text == "GT") { if (e.CellValue.ToString() == "☑") { e.SubItem.Font = new Font("Segoe UI Symbol", 14F, FontStyle.Bold); e.SubItem.ForeColor = Color.YellowGreen; } if (e.CellValue.ToString() == "☐") { e.SubItem.Font = new Font("Segoe UI Symbol", 14F, FontStyle.Bold); e.SubItem.ForeColor = Color.Yellow; } if (e.CellValue.ToString() == "☒") { e.SubItem.Font = new Font("Segoe UI Symbol", 14F, FontStyle.Bold); e.SubItem.ForeColor = Color.Red; } } } private async void objectListViewAuftrag_CellClick(object sender, CellClickEventArgs e) { itemlocation = new Point(e.Location.X, e.Location.Y); ObjectListView olv = (ObjectListView)sender; if (e.Model == null) { chartFehlmenge.Visible = false; groupBoxKndInfo.Visible = false; return; } Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.Model).AuftragID); if (_auftrag.Status != AuftragStatus.Fertig) { this.auftrag = _auftrag; this.kunde = Kunde.GetKunde(null, this.auftrag.KundeID, null); this.artikelListe = KundeArtikel.GetList(kunde.KundeID.ToString()); // Chart wird eingeblendet statt Gridview. NUR wenn isttest = true. var chartliste = await KundeArtikel.LoadArtikelDatenAsync(kunde); if (chartliste.Count > 0) { this.chartFehlmenge = Funktionen.Load_FehlmengeChart(chartliste, chartFehlmenge); this.chartFehlmenge.Visible = true; } else this.chartFehlmenge.Visible = false; if (!string.IsNullOrWhiteSpace(this.kunde.Anmerkung) || auftrag.AufgabeID != null) this.groupBoxKndInfo.Visible = true; else this.groupBoxKndInfo.Visible = false; if (!string.IsNullOrWhiteSpace(this.kunde.Anmerkung)) { labelAnmerkung.Visible = true; labelAnmerkung.Text = this.kunde.Anmerkung; } else { labelAnmerkung.Visible = false; } if (auftrag.AufgabeID != null) { labelAufgabe.Text = Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung.ToString(); labelAufgabe.Visible = true; } else { labelAufgabe.Visible = false; } // GroupBox einblenden wenn notwendig. if (labelAufgabe.Visible || labelAnmerkung.Visible || chartFehlmenge.Visible) this.groupBoxKndInfo.Visible = true; else this.groupBoxKndInfo.Visible = false; } else { fehlermeldung.AuftragFertig(); } olv.Focus(); } private async void objectListViewAuftrag_CellRightClick(object sender, CellRightClickEventArgs e) { ObjectListView olv = (ObjectListView)sender; // Überprüfung ob Click auf einem Item war. if (e.Model == null) return; Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.Model).AuftragID); Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null); string name = string.Empty; if (string.IsNullOrWhiteSpace(_kunde.Suchtext)) name = _kunde.KundeName; else name = _kunde.Suchtext; // Überprüfung welche Spalte geclickt wurde. switch (e.Column.Text) { case "Abschließen": // Wenn Click in Gruppe Vorbereitet dann ignorieren. if (e.Item.Group.Header == "Vorbereitet") return; if (meldung.GetFrage(this, $"Für den Auftrag wurden keine Etiketten gedruckt, ohne Etikettendruck als Vorbereitet markieren?", false) == DialogResult.Yes) { // Wenn Aufgabe hinterlegt ist wir nachgefragt ob diese erledigt wurde. if (_auftrag.AufgabeID != null) { // Wenn NEIN wird der Click abgebrochen. if (meldung.GetAchtung(this, $"Bei dem ausgewählten Auftrag ist die Aufgabe {Aufgabe.GetAufgabe(null, _auftrag.AufgabeID).Bezeichnung} zu erledigen. Hast du die Aufgabe erledigt? ", false) == DialogResult.No) return; else Aufgabe_erledigt(_auftrag, _kunde, name); } // Wenn TextBox für saubere Container 0 ist wird der Click abgebrochen. if (_auftrag.ContainerClean == 0) { meldung.GetFehler(this, "Du kannst den Auftrag nicht als vorbereitet markieren. Wähle zuerst die Anzahl der sauberen Container."); return; } // Auftrag wird bearbeitet und gespeichert. _auftrag.Status = AuftragStatus.Vorbereitet; _auftrag.Save(); olv.RefreshObject(e); if (olv.Name.Contains("Geschaeft")) { await GetAuftraegeAsync(ListenArt.Geschäftliste); OLV_SetObjects(olv, listAuftragGeschaeft); } if (olv.Name.Contains("Auftrag")) { await GetAuftraegeAsync(ListenArt.Auftragliste); OLV_SetObjects(olv, listAuftragToday); } if (olv.Name.Contains("Rampe")) { await GetAuftraegeAsync(ListenArt.Rampenliste); OLV_SetObjects(olv, listRampe); } if (olv.Name.Contains("Vorbereitet")) { await GetAuftraegeAsync(ListenArt.Vorbereitetliste); OLV_SetObjects(olv, listVorbereitet); } if (olv.Name.Contains("Sonder")) { await GetAuftraegeAsync(ListenArt.Sonderliste); OLV_SetObjects(olv, listSonderAuftrag); } } break; case "Aufgabe": if (_auftrag.AufgabeID == null) return; Aufgabe _aufgabe = Aufgabe.GetAufgabe(null, ((Auftrag)e.Model).AufgabeID); if (meldung.GetFrage(this, $"Hast du beim Kunden {name} die Aufgabe {_aufgabe.Bezeichnung} erledigt und möchtest sie als erledigt markieren?", false) == DialogResult.Yes) { Aufgabe_erledigt(_auftrag, _kunde, name); } break; default: if (_auftrag.Typ == AuftragTyp.Regelmäßig || _auftrag.Typ == AuftragTyp.Standerhöhung || _auftrag.Typ == AuftragTyp.Standverminderung || _auftrag.Typ == AuftragTyp.Inventur) { FormAuftragDetail auftragDetail = new FormAuftragDetail(_auftrag, this.benutzer); if (auftragDetail.ShowDialog() == DialogResult.OK) { Neuladen_OLV(olv); } } break; } } private void objectListViewAuftrag_ButtonClick(object sender, BrightIdeasSoftware.CellClickEventArgs e) { ObjectListView olv = (ObjectListView)sender; Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.Model).AuftragID); if (e.Column.Text == "Abschließen") { if (olv.CheckedItems.Count > 0) { if (MessageBox.Show("Möchtest du wirklich alle Aufträge abschließen?", "AUFTRÄGE FERTIG", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; else { foreach (OLVListItem item in olv.CheckedItems) { this.auftrag = (Auftrag)item.RowObject; Auftrag_Fertig(); } foreach (OLVColumn col in olv.Columns) if (col.HeaderCheckBox == true) olv.UncheckHeaderCheckBox(col); } } else { if (this.auftrag != _auftrag) altecontclean = null; this.auftrag = _auftrag; if (this.benutzer.Rolle == BenutzerRolle.Frottee) { Auftrag_Fertig(); Neuladen_OLV(olv); return; } if (this.auftrag.ContainerClean == 0) { switch (this.auftrag.Typ) { case AuftragTyp.Geschäft: break; case AuftragTyp.Standart: if (meldung.NoCleanContainer() == DialogResult.OK) return; break; case AuftragTyp.Inventur: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { Auftrag_Fertig(); } else return; break; case AuftragTyp.Standverminderung: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { Auftrag_Fertig(); } else return; break; case AuftragTyp.Standerhöhung: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { Auftrag_Fertig(); } else return; break; default: break; } } else { if (altecontclean != null && this.auftrag.ContainerClean != altecontclean) { switch (meldung.DifferentCleanContainer()) { case DialogResult.Cancel: return; case DialogResult.Yes: { //this.auftrag.ContainerClean = (int)neuecontclean; //neuecontclean = null; //this.auftrag.Liefertag = dTPLiefertag.Value; //WENN BEARBEITET UND AUSGEDRUCKT WIRD GEDRUCKT VERÄNDERT UND ERSTELLT IST URSPRUNGSDATUM this.auftrag.Gedruckt = DateTime.Now; this.auftrag.GedrucktVon = benutzer.BenutzerID; bool nocont = false; if (MessageBox.Show("Möchtest du die Containeranzahl am Etikett anzeigen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { nocont = true; } else nocont = false; DialogResult result = Funktionen.Etikett_Drucken(auftrag, nocont); if (result == DialogResult.OK) { Auftrag_Fertig(); } } break; case DialogResult.No: { //this.auftrag.ContainerClean = (int)neuecontclean; //neuecontclean = null; //this.auftrag.Liefertag = dTPLiefertag.Value; //WENN BEARBEITET UND NICHT GEDRUCKT WIRD ERSTELLT VERÄNDERT UND GEDRUCKT IST URSPRUNGSDATUM this.auftrag.Erstellt = DateTime.Now; this.auftrag.ErstelltVon = (int)benutzer.BenutzerID; Auftrag_Fertig(); } break; default: break; } } else { Auftrag_Fertig(); } } } } if (e.Column.Text == "Etikett") { this.auftrag = _auftrag; if (this.auftrag.AufgabeID != null) { if (meldung.GetAchtung(this, $"Bei dem ausgewählten Auftrag ist die Aufgabe {Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung} zu erledigen. Hast du die Aufgabe erledigt? ", false) == DialogResult.No) return; } if (this.auftrag.ContainerClean != 0) { letzterLiefertag = this.auftrag.Liefertag; } else { string eingabe = PromptForText( "Der Auftrag hat keine sauberen Container oder Pakete. \n\n" + "Bitte gib an wieviele Container oder Pakete der Auftrag hat:", "Container/Pakete eingeben", "0"); if (string.IsNullOrWhiteSpace(eingabe) || !int.TryParse(eingabe, out int anzahl)) { this.UseWaitCursor = false; return; } this.auftrag.ContainerClean = anzahl; } //ETIKETT DRUCKEN DialogResult result = Funktionen.Etikett_Drucken(auftrag, nocont); if (result == DialogResult.OK) { this.auftrag.Gedruckt = DateTime.Now; this.auftrag.GedrucktVon = (int)this.benutzer.BenutzerID; this.auftrag.Status = AuftragStatus.Vorbereitet; this.auftrag.Save(); this.auftrag = null; } } Neuladen_OLV(olv); this.UseWaitCursor = false; } /// /// Die Objecte der ObjectListView werden neu geladen. /// /// /// private void OLV_SetObjects(ObjectListView olv, List auftraglist) { if (olv.AllColumns.Count == 0) Load_OLV(olv, auftraglist); else { olv.SetObjects(auftraglist); // Bindet die Auftragsliste an die View } } /// /// Die Objecte der ObjectListView werden neu geladen. Wenn Sie noch keine Spalten hat wird die ObjectListView komplett neu geladen. /// /// private async void Neuladen_OLV(ObjectListView olv) { this.UseWaitCursor = true; olv.SuspendLayout(); // Neu-Laden der ObjectListView if (olv.Name.Contains("Geschaeft")) { await GetAuftraegeAsync(ListenArt.Geschäftliste); OLV_SetObjects(olv, listAuftragGeschaeft); } if (olv.Name.Contains("Auftrag")) { await GetAuftraegeAsync(ListenArt.Auftragliste); OLV_SetObjects(olv, listAuftragToday); } if (olv.Name.Contains("Rampe")) { await GetAuftraegeAsync(ListenArt.Rampenliste); OLV_SetObjects(olv, listRampe); } if (olv.Name.Contains("Vorbereitet")) { await GetAuftraegeAsync(ListenArt.Vorbereitetliste); OLV_SetObjects(olv, listVorbereitet); } if (olv.Name.Contains("Sonder")) { await GetAuftraegeAsync(ListenArt.Sonderliste); OLV_SetObjects(olv, listSonderAuftrag); } GetUnvisibleColumns(olv); olv.ResumeLayout(false); this.UseWaitCursor = false; } /// /// Blendet die Button Spalten aus wenn der User dazu nicht berechtigt ist. /// private void GetUnvisibleColumns(ObjectListView olv) { foreach (OLVColumn col in olv.AllColumns) { switch (tabControlAuftragList.SelectedTab.Text) { case var t when t == "Vorbereitet": //Wenn Tab ist Vorbereitet wird Abschließen eingeblendet. if (col.Text == "Abschließen") col.IsVisible = true; if (col.Text == "Etikett") col.IsVisible = false; if (col.Text == "Kunde") { col.HeaderCheckBox = true; col.HeaderCheckBoxUpdatesRowCheckBoxes = true; } if (col.Text == "FR" || col.Text == "GT" || col.Text == "KT") col.IsVisible = false; break; case var t when t == "Rampe": if (col.IsButton) col.IsVisible = false; if (col.Text == "FR" || col.Text == "GT" || col.Text == "KT") col.IsVisible = false; break; case var t when t == "Geschäft": if (col.Text == "Abschließen") col.IsVisible = true; if (col.Text == "Etikett") col.IsVisible = false; break; case var t when t == "Aufträge heute": if (col.Text == "Abschließen") { //Für alle BenutzerRollen Abschließen ausblenden. //Nur FrotteeExpedit sieht Abschließen um Abteilung zu beenden. if (this.benutzer.Rolle == BenutzerRolle.Frottee) col.IsVisible = true; else col.IsVisible = false; } break; default: break; } //Für FrotteeExpedit Etiketten drucken ausblenden. if (this.benutzer.Rolle == BenutzerRolle.Frottee) if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false; } olv.RebuildColumns(); } /// /// Cell Edit Finished wird verwendet um die Container Sauber Anzahl festzulegen. /// /// /// private void objectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e) { ObjectListView olv = (ObjectListView)sender; this.auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); if (e.Column.Text == "sauber") altecontclean = (int?)e.Value; if (!string.IsNullOrWhiteSpace(e.NewValue.ToString())) Save_Auftrag(this.auftrag, false); //Neuladen_OLV(olv); } /// /// Ausgelöst durch DoppelClick /// /// /// private void objectListViewAuftrag_CellEditStarting(object sender, CellEditEventArgs e) { if (e.Column.AspectName == "KundeName") { ObjectListView olv = (ObjectListView)sender; Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); if (_auftrag == null) return; Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null); FormKundeVW kndVW = new FormKundeVW(_kunde, this.benutzer); kndVW.ShowDialog(); olv.RefreshObject(olv.SelectedObject); e.Cancel = true; } else if (meldung.GetFrage(this, $"Möchtest du die gewählte Zelle wirklich bearbeiten?", false) == DialogResult.No) e.Cancel = true; } #endregion /// /// Controls werden nach Benutzer deaktiviert. /// private void Enable_Controls() { switch (this.benutzer.Rolle) { case BenutzerRolle.Verwaltung: this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; GetUnvisibleColumns(this.objectListViewAuftrag); break; case BenutzerRolle.Fahrer: this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; GetUnvisibleColumns(this.objectListViewAuftrag); break; case BenutzerRolle.Admin: break; case BenutzerRolle.Waschstrasse: this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; GetUnvisibleColumns(this.objectListViewAuftrag); break; case BenutzerRolle.Master: break; case BenutzerRolle.Expedit: break; case BenutzerRolle.Frottee: this.buttonNeuerAuftrag.Visible = this.buttonSWS_Drucken.Visible = false; this.buttonStats.Visible = this.buttonEinstellung.Visible = false; // buttonReklamation einblenden wenn Frottee-Expedit auch Reklamation bearbeitet. foreach(TabPage tab in this.tabControlAuftragList.TabPages) { if (tab.Text == "Vorbereitet" || tab.Text == "Rampe") tabControlAuftragList.TabPages.Remove(tab); } break; case BenutzerRolle.Flach: this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; // WENN Rolle Frottee (Expedit Frottee) dann ButtonClick deaktiviert. Nur Expedit kann abschließen GetUnvisibleColumns(this.objectListViewAuftrag); break; default: break; } } private async Task GetAuftraegeAsync(ListenArt? liste) { if (this.benutzer.Rolle != BenutzerRolle.Frottee) { if (liste == null || liste == ListenArt.Auftragliste) listAuftragToday = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Vorbereitet, minStatusFilter: AuftragStatus.Gewaschen); if (liste == null || liste == ListenArt.Geschäftliste) listAuftragGeschaeft = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Fertig, minStatusFilter: AuftragStatus.Abgeholt, typFilter: AuftragTyp.Geschäft); if (liste == null || liste == ListenArt.Vorbereitetliste) listVorbereitet = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Vorbereitet); if (liste == null || liste == ListenArt.Sonderliste) listSonderAuftrag = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Fertig, minStatusFilter: AuftragStatus.Herrichten, typFilter: AuftragTyp.Einmalig, minTypFilter: AuftragTyp.Inventur); if (liste == null || liste == ListenArt.Rampenliste) listRampe = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Abgeholt, typFilter: AuftragTyp.Standart); } else { if (liste == null || liste == ListenArt.Auftragliste) listAuftragToday = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Vorbereitet, minStatusFilter: AuftragStatus.Gewaschen, frottee: true); if (liste == null || liste == ListenArt.Sonderliste) listSonderAuftrag = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Fertig, minStatusFilter: AuftragStatus.Herrichten, typFilter: AuftragTyp.Einmalig, minTypFilter: AuftragTyp.Inventur, frottee: true); } } /// /// Zeigt Fenster zur Eingabe von Text. /// /// /// /// /// Anzahl Saubere Container als string private string PromptForText(string titel, string prompt, string defaultText) { return Interaction.InputBox(prompt, titel, defaultText); } private void Save_Auftrag(Auftrag auftrag, bool show) { if (auftrag.Save()[0] == 1) if (show) meldung.Gespeichert(); else if (show) meldung.Speicherfehler(); } private void Aufgabe_erledigt(Auftrag _auftrag,Kunde _kunde, string name) { if (_kunde.AufgabeCount <= 0) _kunde.Aufgabe = null; else _kunde.AufgabeCount--; _auftrag.AufgabeErledigt = true; if (_auftrag.Save()[0] != 1) meldung.GetFehler(this, $"Der Auftrag konnte nicht gespeichert und die Aufgabe nicht als erledigt markiert werden. Melde das bitte deinem Vorgesetzten."); if (_kunde.Save() != 1) meldung.GetFehler(this, $"Der Kunde {name} konnte nicht gespeichert und die Aufgabe nicht entfernt werden. Melde das bitte deinem Vorgesetzten."); } /// /// Wird aufgerufen wenn ein Auftrag Fertig ist und so gespeichert werden soll. /// private void Auftrag_Fertig() { if (this.benutzer.Rolle == BenutzerRolle.Frottee) this.auftrag.Abteilungen |= AbteilungsStatus.FrotteeBeendet; else this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; } /// /// Beim Wechsel der Tabs wird ObjectListView neu geladen und Spalten ausgeblendet. /// /// /// private void tabControlAuftragList_SelectedIndexChanged(object sender, EventArgs e) { TabControl tabControl = sender as TabControl; ObjectListView olv = tabControl.SelectedTab.Controls[0] as ObjectListView; if (olv == null) return; tabControl.SuspendLayout(); olv.SuspendLayout(); chartFehlmenge.Visible = false; groupBoxKndInfo.Visible = false; //GetUnvisibleColumns(olv); Neuladen_OLV(olv); olv.ResumeLayout(); tabControl.ResumeLayout(); this.UseWaitCursor = false; } /// /// Wenn Suche mehr als 1 Auftrag wird TabPage mit Ergebnis hinzugefügt. /// /// /// private void AddTabPage(List liste, ListenArt listenArt) { if (liste == null) return; UCAuftragListe ucl = new UCAuftragListe(this.benutzer, liste); TabPage tabPage = new TabPage(); switch (listenArt) { case ListenArt.Auftragliste: // Aufträge HEUTE break; case ListenArt.Sonderliste: // Sonderaufträge break; case ListenArt.Geschäftliste: // Aufträge Geschäftskunden break; case ListenArt.Suchliste: // Aufträge gesucht string closeStr = " ×"; // Unicode X-Symbol tabPage.Text = "Suchergebnis" + closeStr; break; case ListenArt.Rampenliste: // Aufträge auf Rampe break; case ListenArt.Vorbereitetliste: // Vorbereitete Aufträge tabPage.Text = "Vorbereitet"; break; default: //Alle Listen break; } // if (!tabPage.Text.Contains("Suche")) return; tabPage.Controls.Add(ucl); ucl.Dock = DockStyle.Fill; this.tabControlAuftragList.Controls.Add(tabPage); } /// /// MouseDown um Klick auf TabControl zu erkennen. /// Wenn Klick auf "x" wird die TabPage geschlossen. NUR BEI SUCHE MÖGLICH /// /// /// private void tabControlAuftragList_MouseDown(object sender, MouseEventArgs e) { this.UseWaitCursor = true; if (e.Button == MouseButtons.Left) { for (int i = 0; i < tabControlAuftragList.TabCount; i++) { Rectangle r = tabControlAuftragList.GetTabRect(i); if (r.Contains(e.X, e.Y)) { // X-Button-Bereich (rechts) Rectangle closeRect = new Rectangle(r.Right - 18, r.Top + 4, 14, 14); if (closeRect.Contains(e.X, e.Y)) { if (tabControlAuftragList.TabPages[i].Text.Contains("Suche")) tabControlAuftragList.TabPages.RemoveAt(i); return; } tabControlAuftragList.SelectedIndex = i; this.UseWaitCursor = false; break; } } } } /// /// Malt Border der GroupBox für Anmerkungen. Farbe wechseln wenn ROT schlecht. /// /// /// private void groupBoxKndInfo_Paint(object sender, PaintEventArgs e) { Funktionen.GetGroupBoxBoarder(groupBoxKndInfo, e); } /// /// Wenn Chart wird sichtbar wird die Position berechnet. /// Das TabControl wird um die Chart schmäler. /// /// /// private void chartFehlmenge_VisibleChanged(object sender, EventArgs e) { UCFeedback fb = this.Controls.Find("feedback", false)[0] as UCFeedback; if (chartFehlmenge.Visible || groupBoxKndInfo.Visible) { this.tabControlAuftragList.Width = (int)(this.Width * 0.80); this.chartFehlmenge.Width = (int)(this.Width * 0.20) - 20; this.groupBoxKndInfo.Width = this.chartFehlmenge.Width - 10; int chartHeight = (int)(this.tabControlAuftragList.Height * 0.75); int gbHeight = (int)(this.tabControlAuftragList.Height * 0.25); chartFehlmenge.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Top); chartFehlmenge.Size = new Size(groupBoxKndInfo.Width, chartHeight); groupBoxKndInfo.Height = gbHeight; groupBoxKndInfo.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Bottom - gbHeight); fb.Visible = false; } else { this.tabControlAuftragList.Width = this.Width - 25; fb.Visible = true; } } /// /// Wenn die GroupBox für Aufgabe und Anmerkung sichtbar wird wird die Position berechnet. /// Das TabControl wird um die GroupBox schmäler. /// /// /// private void groupBoxKndInfo_VisibleChanged(object sender, EventArgs e) { if (groupBoxKndInfo.Visible) { this.tabControlAuftragList.Width = (int)(this.Width * 0.80); this.groupBoxKndInfo.Width = (int)(this.Width * 0.20) - 20; int chartHeight = (int)(this.tabControlAuftragList.Height * 0.75); int gbHeight = (int)(this.tabControlAuftragList.Height * 0.25); groupBoxKndInfo.Height = gbHeight; groupBoxKndInfo.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Bottom - gbHeight); } else { this.tabControlAuftragList.Width = this.Width - 25; } } private async void FormExpedit_HelpButtonClicked(object sender, System.ComponentModel.CancelEventArgs e) { this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus ZeigeOnboarding(); } private async void ZeigeOnboarding() { if (this.benutzer.IstGesehen(onBoardingArt)) return; // Bereits fertig if (Program.ShowOnBoarding(this.benutzer.Rolle.ToString(), onBoardingArt) == DialogResult.OK) { // Nächster Schritt → Flag setzen this.benutzer.OnboardingStatus = this.benutzer.SetOnboardingFlag(onBoardingArt); await this.benutzer.UpdateOnBoardingAsync(); // Deine Update-Methode //this.Close(); // Onboarding beendet } } private void objectListViewRampe_CellEditStarting(object sender, CellEditEventArgs e) { ObjectListView olv = (ObjectListView)sender; Auftrag _auftrag = e.RowObject as Auftrag; if (_auftrag == null) return; //Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null); _auftrag.Status = AuftragStatus.Gewaschen; _auftrag.Save(); olv.RefreshObject(olv.SelectedObject); e.Cancel = true; } private void buttonNW_Click(object sender, EventArgs e) { FormArtikelVW artikelVW = new FormArtikelVW(this.benutzer); artikelVW.ShowDialog(); } } }