using DatenDB; using Deckungsbeitrag.AA_Klassen; using Deckungsbeitrag.UserControls; using Microsoft.VisualBasic; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; using System.Threading.Tasks; using System.Windows.Forms; namespace Deckungsbeitrag.AA_Forms { public partial class FormTourenplanung : Form { private List kundenliste; private Benutzer Benutzer; Meldungen meldung = new Meldungen(); #region Form-Konstruktor public FormTourenplanung() { InitializeComponent(); } public FormTourenplanung(Benutzer benutzer) : this() { this.Cursor = Cursors.WaitCursor; this.Benutzer = benutzer; // Controls steuern nach BenutzerRolle switch (this.Benutzer.Rolle) { case BenutzerRolle.Verwaltung: break; case BenutzerRolle.Fahrer: this.buttonAddPage.Enabled = false; break; case BenutzerRolle.Admin: break; case BenutzerRolle.Waschstrasse: this.buttonAddPage.Enabled = false; break; case BenutzerRolle.Master: break; case BenutzerRolle.Expedit: this.buttonAddPage.Enabled = false; break; case BenutzerRolle.Frottee: this.buttonAddPage.Enabled = false; break; case BenutzerRolle.Flach: this.buttonAddPage.Enabled = false; break; default: break; } } #endregion private void FormTourenplanung_Load(object sender, EventArgs e) { List list = Kunde.GetRegionDistinct(); this.comboBoxFilter.DataSource = list; this.comboBoxFilter.SelectedIndex = -1; GetList(string.Empty); // Breite des Panels anpassen damit die kompletten KundenControls sichtbar sind. +25 = ScrollBar Breite. this.flowLayoutPanelKunden.Width = flowLayoutPanelKunden.Controls[0].Width + 25; this.tabControlLKW.Location = new Point(this.flowLayoutPanelKunden.Right, this.tabControlLKW.Location.Y); } private void GetList(string region) { this.Cursor = Cursors.WaitCursor; this.SuspendLayout(); this.kundenliste = Kunde.GetKundenTourenListe(region); Load_flowlayoutpanelKunden(); this.ResumeLayout(); this.Cursor = Cursors.Default; } private void Load_flowlayoutpanelKunden() { this.flowLayoutPanelKunden.Controls.Clear(); // Kunden hinzufügen foreach (Kunde kunde in kundenliste) { // Wenn kein Suchtext vorhanden, dann KundeName verwenden. UCKunde control = new UCKunde(kunde); control.Tag = kunde; flowLayoutPanelKunden.Controls.Add(control); } } #region TabControl-Funktionen // 1. TabPage wird hinzugefügt. private void buttonAddPage_Click(object sender, EventArgs e) { UCTabPageLKW uc = new UCTabPageLKW(); TabPage tp = new TabPage("Neue TabPage"); uc.Dock = DockStyle.Fill; tp.Controls.Add(uc); this.tabControlLKW.TabPages.Add(tp); } // 2. Umbennen mit DoppelClick starten private void tabControlLKW_MouseDoubleClick(object sender, MouseEventArgs e) { if (this.Benutzer.Rolle == BenutzerRolle.Admin || this.Benutzer.Rolle == BenutzerRolle.Verwaltung) { for (int i = 0; i < tabControlLKW.TabCount; i++) { Rectangle r = tabControlLKW.GetTabRect(i); if (r.Contains(e.Location)) { string altText = tabControlLKW.TabPages[i].Text; string neuText = PromptForText("Tab-Namen ändern", "Neuer Name:", altText); if (!string.IsNullOrWhiteSpace(neuText)) { string fahrername = neuText.ToLower(); fahrername = fahrername.Replace(" ", ""); Benutzer fahrer = Benutzer.GetBenutzer(fahrername, null); tabControlLKW.TabPages[i].Text = neuText; if (fahrer != null) tabControlLKW.TabPages[i].Tag = fahrer; } break; } } } } // 3. Öffnet Fenster mit Texteingabe für neuen Name private string PromptForText(string titel, string prompt, string defaultText) { return Interaction.InputBox(prompt, titel, defaultText); } private void tabControlLKW_SelectedIndexChanged(object sender, EventArgs e) { if (tabControlLKW.SelectedTab == null) return; if (tabControlLKW.SelectedTab.Controls.Count == 0) { UCTabPageLKW uc = new UCTabPageLKW(); uc.Dock = DockStyle.Fill; tabControlLKW.SelectedTab.Controls.Add(uc); } } private void SpeichereAlleTabs(RadioButton rb) { var alleTabs = new List(); foreach (TabPage tab in tabControlLKW.TabPages) { if (tab.Controls[0] is UCTabPageLKW uc) { alleTabs.Add(uc.SpeichereDaten()); } } string json = JsonSerializer.Serialize(alleTabs, new JsonSerializerOptions { WriteIndented = true }); if (rb.Text == "Sommer") File.WriteAllText("lkw-touren-sommer.json", json); else File.WriteAllText("lkw-touren-winter.json", json); } private void LadeAlleTabs() { string json = string.Empty; if (this.radioButtonSommer.Checked) { if (!File.Exists("lkw-touren-sommer.json")) return; else json = File.ReadAllText("lkw-touren-sommer.json"); } else { if (!File.Exists("lkw-touren-winter.json")) return; else json = File.ReadAllText("lkw-touren-winter.json"); } try { var tabDaten = JsonSerializer.Deserialize>(json); // Bestehende Tabs löschen tabControlLKW.TabPages.Clear(); // Jede Fahrzeug-Tab laden foreach (var tabData in tabDaten) { // Neuer TabPage TabPage tabPage = new TabPage(tabData.TourName); // UserControl erstellen UCTabPageLKW uc = new UCTabPageLKW(); uc.Dock = DockStyle.Fill; // DATEN laden! uc.LadeDaten(tabData); // UC zum Tab hinzufügen tabPage.Controls.Add(uc); tabControlLKW.TabPages.Add(tabPage); } MessageBox.Show($"Geladen: {tabDaten.Count} Fahrzeuge"); } catch (Exception ex) { MessageBox.Show($"Fehler beim Laden: {ex.Message}"); } } #endregion private void FormTourenplanung_FormClosing(object sender, FormClosingEventArgs e) { foreach (RadioButton rb in this.Controls.OfType()) if (rb.Checked) SpeichereAlleTabs(rb); } private void FormTourenplanung_Shown(object sender, EventArgs e) { this.tabControlLKW.Width = this.Width - flowLayoutPanelKunden.Right - 20; this.Cursor = Cursors.Default; } /// /// Hier werden die KundenControl-Clone gezählt und kontrolliert ob die maximale Cloneanzahl bereits existiert. /// Max. Cloneanzahl ist abhängig vom hinterlegten Lieferrhythmus. /// /// /// /// true wenn noch KundenControl-Clone verfügbar sind public static bool KundenControlToClone(FormTourenplanung form, UCKunde kundectr) { Kunde _kunde = (Kunde)kundectr.Tag; int maxAllowed = 0; int saisonrhythmus = 0; if (form.radioButtonSommer.Checked) { maxAllowed = Lieferrhythmen.GetMaxClonesNet48((Liefertage)_kunde.SommerLieferRhythmus); saisonrhythmus = _kunde.SommerLieferRhythmus; } else { maxAllowed = Lieferrhythmen.GetMaxClonesNet48((Liefertage)_kunde.WinterLieferRhythmus); saisonrhythmus = _kunde.WinterLieferRhythmus; } // Global über ALLE Tabs/Panels zählen int count = 0; foreach (TabPage tab in form.tabControlLKW.TabPages) { // 1. TabPage → UserControl finden foreach (Control ctrl in tab.Controls) { if (ctrl is UserControl tabUserControl) { // 2. UserControl → 5 FlowLayoutPanels durchsuchen foreach (Control subCtrl in tabUserControl.Controls) { if (subCtrl is TableLayoutPanel tablePanel) { foreach (Control subsubCtrl in tablePanel.Controls) { if (subsubCtrl is FlowLayoutPanel flowPanel) { count += flowPanel.Controls.OfType() .Count(c => ((Kunde)c.Tag).KundeID == _kunde.KundeID); } } } } } } } if (count >= maxAllowed) { MessageBox.Show($"Maximum {maxAllowed} für {Lieferrhythmen.GetAnzeigeText((Liefertage)saisonrhythmus)} erreicht!"); return false; } return true; } private void comboBoxFilter_SelectedIndexChanged(object sender, EventArgs e) { if (this.comboBoxFilter.SelectedIndex != -1) GetList((string)this.comboBoxFilter.SelectedItem); } public static void KundenControlToDelete(FormTourenplanung form, UCKunde kundectr) { Kunde _knd = (Kunde)kundectr.Tag; int saisonrhythmus = 0; if (form.radioButtonSommer.Checked) { saisonrhythmus = _knd.SommerLieferRhythmus; } else { saisonrhythmus = _knd.WinterLieferRhythmus; } // Global über ALLE Tabs/Panels zählen foreach (TabPage tab in form.tabControlLKW.TabPages) { // 1. TabPage → UserControl finden foreach (Control ctrl in tab.Controls) { if (ctrl is UserControl tabUserControl) { // 2. UserControl → 5 FlowLayoutPanels durchsuchen foreach (Control subCtrl in tabUserControl.Controls) { if (subCtrl is TableLayoutPanel tablePanel) { foreach (Control subsubCtrl in tablePanel.Controls) { if (subsubCtrl is FlowLayoutPanel flowPanel) { // Zu List konvertieren, damit während Iteration nicht modifiziert wird foreach (UCKunde kc in flowPanel.Controls.OfType().ToList()) { if(_knd == (Kunde)kc.Tag) { DayOfWeek dropDay = DayOfWeek.Sunday; switch (flowPanel.Tag.ToString()) { case "MO": dropDay = DayOfWeek.Monday; break; case "DI": dropDay = DayOfWeek.Tuesday; break; case "MI": dropDay = DayOfWeek.Wednesday; break; case "DO": dropDay = DayOfWeek.Thursday; break; case "FR": dropDay = DayOfWeek.Friday; break; default: break; } if (!UCTabPageLKW.IstTagEnthalten((Liefertage)saisonrhythmus, dropDay)) flowPanel.Controls.Remove(kc); } } } } } } } } } } private void radioButton_CheckedChanged(object sender, EventArgs e) { RadioButton rb = sender as RadioButton; if (!rb.Checked) SpeichereAlleTabs(rb); if (rb.Checked) LadeAlleTabs(); } } } //CHANGES: Es wir kontrolliert ob der gewählte Liefertag zum hinterlegten Lieferrhythmus passt. //CHANGES: Es kann nach der Kontrolle der Lieferrhythmus geändert werden. Dazu muss auch die Anzahl der Liefertage gewählt werden. //CHANGES: Es können nur so viele Clone erstellt werden wie Liefertag im Lieferrhythmus hinterlegt sind. //CHANGES: TabText wird mit Benutzerliste verglichen. Wenn ein passender gefunden wird Tag hinterlegt. //TODO: Funktioniert mehrere KundenControls auf einmal DragDrop?