Programm_Wirl/AA-Forms/FormTourenplanung.cs

378 lines
12 KiB
C#

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<Kunde> 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<string> 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.
KundenControl control = new KundenControl(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<TourenDaten>();
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<List<TourenDaten>>(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<RadioButton>()) 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;
}
/// <summary>
/// Hier werden die KundenControl-Clone gezählt und kontrolliert ob die maximale Cloneanzahl bereits existiert.
/// Max. Cloneanzahl ist abhängig vom hinterlegten Lieferrhythmus.
/// </summary>
/// <param name="form"></param>
/// <param name="kundectr"></param>
/// <returns>true wenn noch KundenControl-Clone verfügbar sind</returns>
public static bool KundenControlToClone(FormTourenplanung form, KundenControl 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<KundenControl>()
.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, KundenControl 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 (KundenControl kc in flowPanel.Controls.OfType<KundenControl>().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: ComboBox kann zum Filtern der Kunden verwendet 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.
//DONE: Testen ob umbenennen funktioniert.
//DONE: Max Clones von PanelKunde zu PanelTourenplanung. (Lieferrythmus eingeben?)
//DONE: Speichern der Touren ermöglichen. Eventuell über .json oder .xml Datei?
//DONE: Filter für Regionen ermöglichen.
//TODO: Funktioniert mehrere KundenControls auf einmal DragDrop?
//DONE: Wenn der Lieferrhythmus geändert wurde müssen alle Clone von falschen Tagen gelöscht werden.