378 lines
12 KiB
C#
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 readonly Benutzer Benutzer;
|
|
readonly 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.
|
|
UCKunde control = new UCKunde(kunde)
|
|
{
|
|
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
|
|
{
|
|
Dock = DockStyle.Fill
|
|
};
|
|
tabControlLKW.SelectedTab.Controls.Add(uc);
|
|
}
|
|
}
|
|
private void SpeichereAlleTabs(RadioButton rb)
|
|
{
|
|
var alleTabs = new List<TDaten>();
|
|
|
|
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);
|
|
if (rb.Text == "Winter") File.WriteAllText("lkw-touren-winter.json", json);
|
|
if (rb.Name.Contains("Fruehling26")) File.WriteAllText("lkw-touren-fruehling26.json", json);
|
|
}
|
|
private void LadeAlleTabs()
|
|
{
|
|
string json;
|
|
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<TDaten>>(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
|
|
{
|
|
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, 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<UCKunde>()
|
|
.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;
|
|
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<UCKunde>().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?
|