Programm_Wirl/AA-Forms/FormMain.cs

1482 lines
52 KiB
C#

using BrightIdeasSoftware;
using DatenDB;
using Deckungsbeitrag.AA_Forms;
using Deckungsbeitrag.AA_Klassen;
using Deckungsbeitrag.Properties;
using Deckungsbeitrag.UserControls;
using Npgsql;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Diagnostics.Eventing.Reader;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Management.Instrumentation;
using System.Reflection;
using System.Runtime;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using ZXing.Common;
using Timer = System.Windows.Forms.Timer;
namespace Deckungsbeitrag
{
public partial class FormMain : Form
{
#region Properties
private readonly Benutzer benutzer = null;
private readonly Meldungen meldung = new Meldungen();
private bool open = false;
private bool isDragging = false;
private Size _fixedSize;
private bool _handlingResize;
private readonly UserSettingsManager _settings = new UserSettingsManager();
private bool formloading = false;
private Dictionary<DateTime, List<Auftrag>> auftragliste;
private Control draggedBox;
private Point dragOffset;
private readonly PictureBox ghostImage;
private readonly bool isButtonDragging = false;
private List<AuftragArtikel> ArtikellisteProAuftrag;
private OnboardingSchritt onBoardingArt = OnboardingSchritt.Main;
private UCStatistik uCStatistik;
private UCAuftragSuchen uCAuftrag;
private UCInventur uCInventur;
private readonly Screen screen = Screen.PrimaryScreen;
private Kunde kunde;
private Tour tour;
#endregion
public FormMain()
{
InitializeComponent();
this.panelMain.AllowDrop = true;
this.toolStripMenu.Size = new Size(toolStripButton1.Size.Width + 20, this.Height);
_fixedSize = screen.WorkingArea.Size;
}
public FormMain(Benutzer benutzer) : this()
{
this.benutzer = benutzer;
ghostImage = new PictureBox
{
Size = new Size(200, 100), // GroupBox-Größe
Visible = false,
BackColor = Color.Transparent,
SizeMode = PictureBoxSizeMode.StretchImage
};
panelMain.Controls.Add(ghostImage); // Zum Panel!
}
#region FormMain-Events
private async void FormMain_Load(object sender, EventArgs e)
{
this.SuspendLayout();
this.Cursor = Cursors.WaitCursor;
formloading = true;
_settings.Load();
this.buttonKundeArtikelUpdate.BringToFront();
this.WindowState = FormWindowState.Maximized;
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.panelMain.Width = this.Width - this.toolStripMenu.Right - 20;
this.panelMain.Location = new Point(this.toolStripMenu.Right, 0);
this.Text += Assembly.GetExecutingAssembly().GetName().Version.ToString();
this.labelKundenDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen\Kundenstammblatt.csv";
this.labelSoftwareDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Setup\SetupVerwaltung*.msi";
this.labelArtikelDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen\Artikelkurzliste.csv";
// Inventuren sind ausschließlich für Admin, Verwaltung oder Master sichtbar.
if (this.benutzer.Rolle == BenutzerRolle.Admin || this.benutzer.Rolle == BenutzerRolle.Verwaltung || this.benutzer.Rolle == BenutzerRolle.Master)
{
GetInventuren();
GetSaison();
}
else
{
if (this.benutzer.Rolle == BenutzerRolle.Fahrer)
{
Saison saison = Saison.GetAktivSaison();
if (saison.Bezeichnung == "Zwischensaison")
{
var data = ShowTourenplan();
tour = Tour.GetTour(saison.SaisonId, data.tour);
}
}
}
if (this.groupBoxContAnz.Visible)
{
await GetAuftraege();
GetContainerProTag();
}
// UserCotnrols werden eingefügt
GetUserControls();
// Controls werde Enabled
Enable_Controls();
// Location für UCInventur festlegen.
Get_UCInventur_Location();
this.Activate();
_fixedSize = this.Size;
formloading = false;
}
private void FormMain_Shown(object sender, EventArgs e)
{
if (this.benutzer.Rolle != BenutzerRolle.Fahrer)
{
// Meldung wenn Updates oder Imports erledigt wurden.
if (Program.Artikelliste_Importiert | Program.Kundenliste_Importiert | Program.Software_Updated)
{
string[] updates = new string[3];
updates[0] = Program.Artikelliste_Importiert ? "Artikelliste: ✅" : "Artikelliste: ❌";
updates[1] = Program.Kundenliste_Importiert ? "Kundenliste: ✅" : "Kundenliste: ❌";
updates[2] = Program.Software_Updated ? "Software: ✅" : "Sofware: ❌";
MessageBox.Show($"Folgende Updates wurden heute durchgeführt:\n\n{updates[0]}\n{updates[1]}\n{updates[2]}", "UPDATES DURCHGEFÜHRT", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
this.ResumeLayout();
this.Cursor = Cursors.Default;
}
private void FormMain_ResizeBegin(object sender, EventArgs e)
{
_handlingResize = true;
this.Size = _fixedSize;
_handlingResize = false;
}
private void FormMain_Resize(object sender, EventArgs e)
{
if (_handlingResize) return;
if (this.Size != _fixedSize)
{
_handlingResize = true;
this.Size = _fixedSize;
_handlingResize = false;
}
//this.panelMain.Size = new Size(this.ClientSize.Width - this.toolStripMenu.Right, this.Height);
//this.panelProgress.Location = new Point(this.panelMain.Right - this.panelProgress.Width - 100, this.panelMain.Bottom - this.panelProgress.Height - 20);
}
/// <summary>
/// Settings speichern bei Form_Closing.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
_settings.LocationButtonNeueAufgabe = this.buttonNeueAufgabe.Location;
_settings.LocationButtonSonderAuftrag = this.buttonSonderAuftrag.Location;
_settings.LocationButtonNeuerAuftrag = this.buttonNeuerAuftrag.Location;
_settings.LocationButtonNeuerUser = this.buttonNeuerUser.Location;
_settings.LocationGroupBoxContainer = this.groupBoxContAnz.Location;
_settings.LocationGroupBoxSaison = this.groupBoxSaison.Location;
if (uCStatistik != null) _settings.LocationGroupBoxStatistik = this.uCStatistik.Location;
if (uCAuftrag != null) _settings.LocationGroupBoxAuftragSuchen = this.uCAuftrag.Location;
_settings.OLV_State = this.objectListViewAuftrag.SaveState();
_settings.Save();
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Speichern" + ex.Message);
}
}
#endregion
private (DateTime? datum, string[] touren, string tour) ShowTourenplan()
{
FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer, this.kunde);
if (showUserControl.ShowDialog() == DialogResult.OK)
{
var data = showUserControl.lieferDaten;
return (data.datum, data.touren, data.text);
}
return (null, null, null);
}
#region ToolStripButton-Events
private void Get_Border_Paint(object sender, PaintEventArgs e)
{
ToolStripItem item = (ToolStripItem)sender;
ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, item.Width, item.Height), Color.White, ButtonBorderStyle.Solid);
}
private void ToolStrip_MouseEnter(object sender, EventArgs e)
{
if (sender.GetType() == typeof(ToolStripButton))
{
ToolStripButton tsb = (ToolStripButton)sender;
tsb.ForeColor = Program.Wirlblau;
tsb.BackColor = Color.White;
}
}
private void ToolStrip_MouseLeave(object sender, EventArgs e)
{
if (sender.GetType() == typeof(ToolStripButton))
{
ToolStripButton tsb = (ToolStripButton)sender;
tsb.ForeColor = Color.White;
tsb.BackColor = Program.Wirlblau;
}
}
private void TSBBenutzerVW_Click(object sender, EventArgs e)
{
FormBenutzerVW benutzerVW = new FormBenutzerVW();
benutzerVW.ShowDialog();
}
private void ToolStripBeenden_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void TSBAufgabeVW_Click(object sender, EventArgs e)
{
FormAufgabeVW aufgabeVW = new FormAufgabeVW();
aufgabeVW.ShowDialog();
}
private void ToolStripZaehlscheine_Click(object sender, EventArgs e)
{
FormKundeVW kundedaten = new FormKundeVW(this.benutzer);
if (kundedaten.ShowDialog() == DialogResult.OK)
{
}
}
private void ToolStripDB_Click(object sender, EventArgs e)
{
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, false);
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
}
private void TSBWaschstrasse_Click(object sender, EventArgs e)
{
FormAufleger aufleger = new FormAufleger();
aufleger.ShowDialog();
}
private void ToolStripButtonImport_Click(object sender, EventArgs e)
{
FormImport import = new FormImport();
import.ShowDialog();
}
private void TSBKosten_Click(object sender, EventArgs e)
{
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, true);
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
}
private void TSBEinstellung_Click(object sender, EventArgs e)
{
FormEinstellung einstellung = new FormEinstellung();
einstellung.ShowDialog();
}
private void TSBExpedit_Click(object sender, EventArgs e)
{
FormExpedit exp = new FormExpedit(benutzer);
exp.ShowDialog();
}
private void TSBAuftragVW_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
if (!this.groupBoxAuftrag.Visible)
{
if (benutzer.Rolle == BenutzerRolle.Fahrer) this.rBFertig.Checked = true;
else this.rBAlle.Checked = true;
// Groupbox einblenden wenn OLV noch nicht sichtbar ist.
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = gb.Name.Contains("Auftrag");
// PanelMain Buttons ausblenden.
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = false;
}
else
{
// Groupbox ausblenden wenn OLV sichtbar ist.
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = !gb.Name.Contains("Auftrag");
// PanelMain Buttons einblenden.
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = true;
}
this.Cursor = Cursors.Default;
}
private void TSBScannTest_Click(object sender, EventArgs e)
{
if (open)
{
this.groupBoxScannTest.Visible = false;
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = false;
open = false;
}
else
{
this.groupBoxScannTest.Visible = true;
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = true;
this.pictureBoxScannTest.Image = Image.FromFile("C:\\Users\\KilianWirl\\OneDrive - gehgassi GmbH\\Wäscherei Wirl\\Programme\\Deckungsbeitrag\\static-qr-code-ca1aa53ab47cd115bc1ad29afb0e5f22.png");
this.textBoxScannTest.Focus();
open = true;
}
}
private void TSBArtikelVW_Click(object sender, EventArgs e)
{
FormArtikelVW artikelVW = new FormArtikelVW(this.benutzer);
artikelVW.ShowDialog();
}
private void TSBTourenplanung_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
FormTourenplanung tourenplanung = new FormTourenplanung(this.benutzer);
tourenplanung.ShowDialog();
this.Cursor = Cursors.Default;
}
private void TSBHilfe_Click(object sender, EventArgs e)
{
FormMain_HelpButtonClicked(this, null);
}
#endregion
#region Button-Click Events
/// <summary>
/// Panel Main Control Funktionen
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonNeuerAuftrag_Click(object sender, EventArgs e)
{
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standart);
if (neuerAuftrag.ShowDialog() == DialogResult.Abort) { this.kunde = neuerAuftrag.kunde; GetNeueInventur(); }
}
private void ButtonScannTest_Click(object sender, EventArgs e)
{
string s = this.textBoxScannTest.Text;
int pos = s.IndexOf('#');
this.textBoxScannTest.Text = this.labelScannTest.Text = s.Substring(pos + 1);
}
private void ButtonNeueAufgabe_Click(object sender, EventArgs e)
{
FormNeueAufgabe neueAufgabe = new FormNeueAufgabe();
neueAufgabe.ShowDialog();
}
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// Button-Click AufAbruf und Ausgeliefert sowie ItemsChecked
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAusgeliefert_Click(object sender, EventArgs e)
{
int saved = 0;
int tosave = 0;
if (this.objectListViewAuftrag.CheckedItems.Count > 0)
{
if (meldung.AuftragAusgeliefert() == DialogResult.Yes)
{
foreach (OLVListItem item in this.objectListViewAuftrag.CheckedItems)
{
++tosave;
Auftrag a = (Auftrag)item.RowObject;
a.ArbeiterID = this.benutzer.BenutzerID;
a.Erledigt = DateTime.Now;
a.ErledigtVon = this.benutzer.BenutzerID;
a.Status = AuftragStatus.Ausgeliefert;
if (a.Save()[0] == 1)
{
++saved;
ArtikellisteProAuftrag = AuftragArtikel.GetList(a.AuftragID);
foreach (AuftragArtikel auftragArtikel in this.ArtikellisteProAuftrag)
{
auftragArtikel.Erledigt = true;
if (auftragArtikel.Save() == 0) meldung.GetFehler(this, $"Der Artikel {auftragArtikel.AuftragArtikelID} konnte nicht gespeichert werden.");
}
}
// Wenn Typ ist Regelmäßig, wird ein neuer Auftrag laut Rhythmus hinterlegt.
if (a.Typ == AuftragTyp.Regelmäßig)
{
Auftrag newAuftrag = a;
newAuftrag.AuftragID = null;
newAuftrag.Liefertag = a.Liefertag.AddDays((int)a.Rhythmus);
newAuftrag.Status = AuftragStatus.Herrichten;
newAuftrag.ErstelltVon = (int)this.benutzer.BenutzerID;
newAuftrag.Erstellt = DateTime.Now;
newAuftrag.TourID = a.TourID;
// Werte des alten Auftrags zurücksetzen.
newAuftrag.Erledigt = null;
newAuftrag.ErledigtVon = null;
if (newAuftrag.Save()[0] != 1) meldung.Speicherfehler();
else
{
foreach (AuftragArtikel auftragArtikel in this.ArtikellisteProAuftrag)
{
auftragArtikel.AuftragArtikelID = null;
auftragArtikel.AuftragID = newAuftrag.AuftragID;
auftragArtikel.Erledigt = false;
if (auftragArtikel.Save() == 0) meldung.GetFehler(this, $"Der Artikel {auftragArtikel.AuftragArtikelID} konnte nicht gespeichert werden.");
}
}
}
}
if (saved == tosave) GetExpeditList(null);
}
}
}
private void ButtonAufAbruf_Click(object sender, EventArgs e)
{
if (this.objectListViewAuftrag.CheckedItems.Count == 1)
{
if (meldung.AuftragAufAbruf() == DialogResult.Yes)
{
OLVListItem item = (OLVListItem)this.objectListViewAuftrag.CheckedItems[0];
Auftrag a = (Auftrag)item.RowObject;
a.Typ = AuftragTyp.AufAbruf;
if (a.Save()[0] == 1) GetExpeditList(null);
}
}
else
{
meldung.NurEinAuftrag();
}
}
/// <summary>
/// Buttons auf MainPanel. Schnellzugriff für Neuer User und Neuer Auftrag.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonNeuerUser_Click(object sender, EventArgs e)
{
FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer();
neuerBenutzer.ShowDialog();
}
private void ButtonTestChart_Click(object sender, EventArgs e)
{
FehlmengeChart chart = new FehlmengeChart();
chart.Show();
}
private void ButtonTourenliste_Click(object sender, EventArgs e)
{
Benutzer fahrer = new Benutzer();
if (this.benutzer.Rolle == BenutzerRolle.Fahrer) fahrer = this.benutzer;
else
{
List<Benutzer> fahrerliste = Benutzer.GetFahrerList();
FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste);
if (benutzerVW.ShowDialog() == DialogResult.OK)
{
fahrer = benutzerVW.user;
}
}
if (fahrer != null)
{
List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
}
}
private async void ButtonKundeArtikelUpdate_Click(object sender, EventArgs e)
{
if (this.buttonKundeArtikelUpdate.Enabled == false) return;
Application.UseWaitCursor = true;
List<Sortiment> sortimentListe = Funktionen.SortimentLesen("Liste");
this.buttonKundeArtikelUpdate.Enabled = false;
this.progressBarKundeArtikelUpdate.Maximum = sortimentListe.Count();
this.progressBarKundeArtikelUpdate.Value = 0;
this.progressBarKundeArtikelUpdate.Visible = true;
this.progressBarKundeArtikelUpdate.Refresh();
this.progressBarKundeArtikelUpdate.BringToFront();
IProgress<int> progress = new Progress<int>(percent => // ✅ Progress<T> verwenden
{
this.progressBarKundeArtikelUpdate.Value = percent; // ✅ Lambda-Block
});
await Task.Run(() => DoKundeArtikelImportOnce(progress, sortimentListe));
MessageBox.Show("Das Update der KundenArtikel ist erfolgreich beendet.", "Update erfolgreich");
this.progressBarKundeArtikelUpdate.Value = 0;
this.buttonKundeArtikelUpdate.Enabled = true;
this.buttonKundeArtikelUpdate.BringToFront();
Application.UseWaitCursor = false;
}
private void buttonSonderAuftrag_Click(object sender, EventArgs e)
{
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, null);
if (neuerAuftrag.ShowDialog() == DialogResult.Abort) { this.kunde = neuerAuftrag.kunde; GetNeueInventur(); }
}
#endregion
#region GroupBox Auftrag
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// RadioButtons für Auftragsverwaltung & Laden der Auftragsliste nach Status.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton rB = (RadioButton)sender;
if (rB.Checked)
{
if (Enum.TryParse(rB.Name.Substring(2), out AuftragStatus status)) rB.Tag = (int)status;
else rB.Tag = null;
switch (rB.Tag)
{
case AuftragStatus.Abgeholt:
break;
case AuftragStatus.Aufgelegt:
break;
case AuftragStatus.Gewaschen:
break;
case AuftragStatus.Herrichten:
break;
case AuftragStatus.Vorbereitet:
GetExpeditList((int?)rB.Tag);
break;
case AuftragStatus.Fertig:
GetExpeditList((int?)rB.Tag);
break;
case AuftragStatus.Ausgeliefert:
GetExpeditList((int?)rB.Tag);
break;
default:
GetExpeditList((int?)rB.Tag);
break;
}
}
}
private async void GetExpeditList(int? status)
{
Application.UseWaitCursor = true;
this.objectListViewAuftrag.SuspendLayout();
this.objectListViewAuftrag.BeginUpdate();
List<Auftrag> alist = new List<Auftrag>();
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
try
{
await conn.OpenAsync();
//TODO: Richtige Liste holen, wahrscheinlich mit TourID von ShowTourenplan.
if (status == null & this.benutzer.Rolle == BenutzerRolle.Fahrer) alist = await Auftrag.GetFahrerListAsync(tour.TourID, conn);
else alist = await Auftrag.GetStatusListAsync(status, conn);
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
}
if (alist.Count == 0) meldung.KeineAufträge();
else Load_OLV(alist); // Load_ListView(alist);
this.objectListViewAuftrag.EndUpdate();
this.objectListViewAuftrag.ResumeLayout();
Application.UseWaitCursor = false;
}
private void GetUnvisibleColumns()
{
foreach (OLVColumn col in this.objectListViewAuftrag.Columns)
{
if (this.benutzer.Rolle == BenutzerRolle.Frottee)
{
if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
}
else if (col.IsButton) col.IsVisible = false;
switch (this.benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
break;
case BenutzerRolle.Fahrer:
if (col.IsButton) col.IsVisible = false;
if (col.Text == "FR" || col.Text == "GT" || col.Text == "KT") col.IsVisible = false;
break;
case BenutzerRolle.Admin:
break;
case BenutzerRolle.Waschstrasse:
break;
case BenutzerRolle.Master:
break;
case BenutzerRolle.Expedit:
break;
case BenutzerRolle.Frottee:
if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
break;
case BenutzerRolle.Flach:
break;
default:
break;
}
}
this.objectListViewAuftrag.RebuildColumns();
}
private void ObjectListViewAuftrag_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (this.objectListViewAuftrag.CheckedItems.Count > 0) this.buttonAusgeliefert.Visible = true;
else this.buttonAusgeliefert.Visible = false;
if (this.objectListViewAuftrag.CheckedItems.Count == 1) this.buttonAufAbruf.Visible = true;
else this.buttonAufAbruf.Visible = false;
}
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// ObjectListView für Auftragsverwaltung laden.
/// </summary>
/// <param name="alist"></param>
private void Load_OLV(List<Auftrag> alist)
{
// Cursor auf Warte-Status setzen, um Benutzerfeedback zu geben
this.Cursor = Cursors.WaitCursor;
// Spalten erstellen nach Typ Auftrag.
Generator.GenerateColumns(this.objectListViewAuftrag, typeof(Auftrag), true);
// ========== CHECKBOX COLUMNS FÜR ABTEILUNGEN ===========
// Spalten-Setup
var colFrottee = new OLVColumn("Frottee", "Frottee")
{
Text = "FR",
DisplayIndex = 6,
TextAlign = HorizontalAlignment.Center,
CheckBoxes = false,
TriStateCheckBoxes = false,
Width = 50,
AspectGetter = row =>
{
var auftrag = (Auftrag)row;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.FrotteeBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.FrotteeBeendet) != 0;
if (beendet) return "✅"; // Status 1 ✓
if (begonnen) return "⭕"; // Status 2 ✓
return "❌"; // Status 0 ✓
}
};
var colKleinteile = new OLVColumn("Kleinteile", "Kleinteile")
{
Text = "KT",
DisplayIndex = 7,
TextAlign = HorizontalAlignment.Center,
CheckBoxes = false,
TriStateCheckBoxes = false,
Width = 50,
AspectGetter = row =>
{
var auftrag = (Auftrag)row;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.KleinteileBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.KleinteileBeendet) != 0;
if (beendet) return "✅"; // Status 1 ✓
if (begonnen) return "⭕"; // Status 2 ✓
return "❌"; // Status 0 ✓
}
};
var colGrosseTeile = new OLVColumn("Großteile", "Großteile")
{
Text = "GT",
DisplayIndex = 8,
TextAlign = HorizontalAlignment.Center,
CheckBoxes = false,
TriStateCheckBoxes = false,
Width = 50,
AspectGetter = row =>
{
var auftrag = (Auftrag)row;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.GrossteileBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.GrossteileBeendet) != 0;
if (beendet) return "✅"; // Status 1 ✓
if (begonnen) return "⭕"; // Status 2 ✓
return "❌"; // Status 0 ✓
}
};
this.objectListViewAuftrag.AllColumns.Add(colFrottee);
this.objectListViewAuftrag.AllColumns.Add(colKleinteile);
this.objectListViewAuftrag.AllColumns.Add(colGrosseTeile);
foreach (OLVColumn col in this.objectListViewAuftrag.AllColumns)
{
switch (col.Text)
{
case "Abschließen": // Abschließen Spalte als Button-Spalte konfigurieren
OLVColumn fertigColumn = col;
fertigColumn.DisplayIndex = 11;
fertigColumn.IsButton = true; // Als Button rendern
fertigColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
fertigColumn.HeaderImageKey = "abschließen";
fertigColumn.ShowTextInHeader = false;
fertigColumn.MinimumWidth = fertigColumn.MaximumWidth = 80;
break;
case "Etikett": // Etikett Spalte als Button-Spalte konfigurieren
OLVColumn etikettColumn = col;
etikettColumn.DisplayIndex = 10;
etikettColumn.IsButton = true; // Als Button rendern
etikettColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
etikettColumn.HeaderImageKey = "print";
etikettColumn.ShowTextInHeader = false;
etikettColumn.MinimumWidth = etikettColumn.MaximumWidth = 80;
break;
case "Aufgabe": // Aufgabe Spalte als Icon-Spalte: zeigt Icon wenn AufgabeID vorhanden
OLVColumn iconColumn = col;
iconColumn.DisplayIndex = 9;
iconColumn.ImageGetter = rowObject =>
{
var auftrag = rowObject as Auftrag;
if (auftrag.AufgabeID == null) return null; // null = kein Icon anzeigen
else return 0; // Index 0 aus SmallImageList
};
break;
case "Kunde": // Kunde Spalte als Icon-Spalte: zeigt Icon und Kundename wenn Anmerkung vorhanden
OLVColumn iColumn = col;
iColumn.HeaderCheckBox = true;
iColumn.HeaderCheckBoxUpdatesRowCheckBoxes = true;
iColumn.DisplayIndex = 0;
iColumn.ImageGetter = rowObject =>
{
var _auftrag = rowObject as Auftrag;
if (string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) return null;
else return 1;
};
break;
case "Liefertag": // Liefertag Spalte Zeigt Liefertag als String an.
OLVColumn dateColumn = col;
dateColumn.DisplayIndex = 1;
dateColumn.AspectToStringFormat = "{0:ddd dd.MM.}";
// DateTime-Filter für Spalte 2
dateColumn.ClusteringStrategy = new DateTimeClusteringStrategy(DateTimePortion.Day, "ddd dd.MM."); // DateTimeClustering damit Datum gefiltert werden kann
this.objectListViewAuftrag.SecondarySortColumn = dateColumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
break;
case "Status": // Spalte 5 als primäre Sortier-Spalte festlegen (nach Datenbindung!)
OLVColumn sortcolumn = col;
sortcolumn.DisplayIndex = 4;
this.objectListViewAuftrag.PrimarySortColumn = sortcolumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
break;
case "Erstellt":
col.IsVisible = false;
break;
case "Gedruckt":
col.IsVisible = false;
break;
case "Erledigt":
col.IsVisible = false;
break;
case "schmutzig":
col.HeaderImageKey = "dirt";
col.ShowTextInHeader = false;
col.MinimumWidth = col.MaximumWidth = 80;
col.DisplayIndex = 2;
break;
case "sauber":
col.HeaderImageKey = "clean";
col.ShowTextInHeader = false;
col.MinimumWidth = col.MaximumWidth = 80;
col.DisplayIndex = 3;
break;
default:
break;
}
}
// ========== IMAGE-LIST ZUWEISEN ==========
// SmallImageList für Icons in Detail-View (16x16 Pixel standard)
Program.imagelist.ImageSize = new Size(24, 24);
this.objectListViewAuftrag.SmallImageList = Program.imagelist; // Voraussetzung: imagelist mit Icon Index 0 gefüllt
// ========== TOOLTIP FÜR ICON-SPALTEN ==========
// Automatischer Cell-Tooltip bei Mouse-Hover über Spalte 10 und 1
this.objectListViewAuftrag.CellToolTipShowing += (s, e) =>
{
// Nur für Icon-Spalte (Index 10) und gültiges Model
if (e.Column.Text == "Aufgabe" && e.Model is Auftrag auftrag)
{
// 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 Auftrag _auftrag)
{
if (!string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung))
{
// Lade Anmerkung als Tooltip-Text
e.Text = Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung;
}
}
//TODO: Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe??
if (e.Column.Text == "Fahrer" && e.Model is Auftrag auftrag1)
{
e.Text = auftrag1.ZusatzInfo;
}
};
// ========== DATEN LADEN ==========
// WICHTIG: SetObjects NACH Column-Konfiguration aufrufen!
this.objectListViewAuftrag.SetObjects(alist);
this.objectListViewAuftrag.RebuildColumns();
//if (_settings.OLV_State != null) this.objectListViewAuftrag.RestoreState(_settings.OLV_State);
GetUnvisibleColumns();
this.objectListViewAuftrag = Funktionen.Columns_Resize(null, this.objectListViewAuftrag).olv;
// Cursor auf Default-Status setzen, um Benutzerfeedback zu geben
this.Cursor = Cursors.Default;
}
#endregion
#region Drag & Drop Events
/// <summary>
/// Drag & Drop für GroupBox.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void GroupBox_Paint(object sender, PaintEventArgs e)
{
GroupBox gb = (GroupBox)sender;
base.OnPaint(e);
Funktionen.GetGroupBoxBoarder(gb, e);
gb.MouseDown += GroupBox_MouseDown;
gb.MouseMove += GroupBox_MouseMove;
gb.MouseUp += GroupBox_MouseUp;
foreach(Control ctr in gb.Controls)
{
if (ctr.GetType() == typeof(ComboBox) || ctr.GetType() == typeof(DateTimePicker) || ctr is Button || ctr is RadioButton) continue;
ctr.MouseDown += GroupBox_MouseDown;
ctr.MouseMove += GroupBox_MouseMove;
ctr.MouseUp += GroupBox_MouseUp;
}
}
private void GroupBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
draggedBox = FindParentGroupBox((Control)sender);
// 1. BILD der GroupBox erstellen
Bitmap dragImage = new Bitmap(draggedBox.Width, draggedBox.Height);
draggedBox.DrawToBitmap(dragImage, draggedBox.ClientRectangle);
// 2. Ghost-Bild setzen + sichtbar machen
ghostImage.Image?.Dispose();
ghostImage.Image = dragImage;
ghostImage.Size = draggedBox.Size;
ghostImage.Visible = true;
ghostImage.BringToFront();
dragOffset = e.Location;
isDragging = true;
panelMain.SuspendLayout();
// 2. Original unsichtbar machen
draggedBox.Visible = false;
}
}
private void GroupBox_MouseMove(object sender, MouseEventArgs e)
{
if (isButtonDragging) return;
if (isDragging)
{
Point mousePos = panelMain.PointToClient(MousePosition);
Point newPos = new Point(mousePos.X - dragOffset.X, mousePos.Y - dragOffset.Y);
// Grenzen
newPos.X = Math.Max(0, Math.Min(panelMain.Width - draggedBox.Width, newPos.X));
newPos.Y = Math.Max(0, Math.Min(panelMain.Height - draggedBox.Height, newPos.Y));
// 1. Ghost folgt Maus
ghostImage.Location = newPos;
// 2. Original folgt (unsichtbar)
draggedBox.Location = newPos;
}
}
private void GroupBox_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
if (draggedBox != null)
{
// Screenshot erstellen
Bitmap bmp = new Bitmap(draggedBox.Width, draggedBox.Height);
draggedBox.DrawToBitmap(bmp, draggedBox.ClientRectangle);
// Ghost 50% transparent machen
float[][] matrix = {
new float[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0, 0, 1, 0, 0},
new float[] {0, 0, 0, 0.5f, 0},
new float[] {0, 0, 0, 0, 1}
};
using (ImageAttributes attr = new ImageAttributes())
{
attr.SetColorMatrix(new ColorMatrix(matrix));
// Graphics.FromImage für DragImage rendern (komplex)
}
}
}
private void GroupBox_MouseUp(object sender, MouseEventArgs e)
{
if (isDragging)
{
isDragging = false;
ghostImage.Visible = false;
draggedBox.Visible = true;// Ghost weg
panelMain.ResumeLayout();
}
}
private void RegisterDragEvents(Control parent)
{
if (parent is Button) return;
parent.MouseDown += Child_MouseDown;
// 1. Parent selbst behandeln (GroupBox)
if (parent is GroupBox gb)
{
gb.MouseDown += GroupBox_MouseDown;
gb.MouseMove += GroupBox_MouseMove;
gb.MouseUp += GroupBox_MouseUp;
}
if (parent is UserControl uc)
{
uc.MouseDown += GroupBox_MouseDown;
uc.MouseMove += GroupBox_MouseMove;
uc.MouseUp += GroupBox_MouseUp;
}
// 2. ALLE Children (rekursiv) - auch Child of Child!
foreach (Control child in parent.Controls)
{
if (child is ComboBox || child is DateTimePicker || child is Button || child is RadioButton || child is PictureBox || child is DataGridView) continue;
if (child.Name == "labelInvText") continue;
// JEDES Control bekommt Child-Handler
child.MouseDown += Child_MouseDown;
child.MouseMove += Child_MouseMove;
child.MouseUp += Child_MouseUp;
// Rekursion für NESTED Children
RegisterDragEvents(child);
}
}
private void Child_MouseDown(object sender, MouseEventArgs e)
{
// Koordinaten an Parent weiterleiten
Control child = (Control)sender;
if (child is Button)
{
return;
}
Control parentGb = FindParentGroupBox(child);
if (parentGb != null)
{
Point parentPos = child.PointToClient(child.PointToScreen(e.Location));
MouseEventArgs parentEvent = new MouseEventArgs(e.Button, e.Clicks,
parentPos.X, parentPos.Y, e.Delta);
GroupBox_MouseDown(parentGb, parentEvent);
}
}
private void Child_MouseMove(object sender, MouseEventArgs e)
{
Control gb = FindParentGroupBox((Control)sender);
if (gb != null && isDragging && draggedBox == gb)
{
GroupBox_MouseMove(gb, e);
}
}
private void Child_MouseUp(object sender, MouseEventArgs e)
{
Control gb = FindParentGroupBox((Control)sender);
if (gb != null && isDragging && draggedBox == gb)
{
GroupBox_MouseUp(gb, e); // ← Dragging beenden!
}
}
private Control FindParentGroupBox(Control control)
{
while (control != null)
{
if (control.Parent is UserControl control2)
{
return control2;
}
else if (control is GroupBox box)
{
return box;
}
if (control is UserControl control1)
{
return control1;
}
control = control.Parent;
}
return null;
}
#endregion
private void GetNeueInventur()
{
onBoardingArt = OnboardingSchritt.NeueInventur;
ZeigeOnboarding();
Kunde kunde = null;
FormListe liste = new FormListe(null, (int)Listentyp.Reklamationliste, "Miete");
if (liste.ShowDialog() == DialogResult.OK)
{
kunde = liste.kunde;
uCInventur = new UCInventur(kunde, this.benutzer);
uCInventur.UCInventur_Update += () => { this.GetInventuren(); };
uCInventur.UCInventur_Delete += Do_UCInventur_Delete;
this.panelMain.Controls.Add(uCInventur);
uCInventur.Location = new Point(100, 100);
uCInventur.BringToFront();
RegisterDragEvents(uCInventur);
}
}
private async void GetInventuren()
{
foreach (UCInventur uci in panelMain.Controls.OfType<UCInventur>())
{
this.panelMain.Controls.Remove(uci);
}
string loadPath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren";
if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") loadPath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren";
// Alle "Warten" Inventur Files auflisten.
string[] invFiles = Directory.GetFiles(loadPath, "Warten-*.csv");
if (invFiles.Length == 0) return;
int i = 0;
foreach (string s in invFiles)
{
i++;
// 1. alle Zeilen lesen
string[] lines = File.ReadAllLines(Path.Combine(loadPath, s), Encoding.UTF8);
// 2. an UCInventur übergeben
uCInventur = new UCInventur(lines, this.benutzer, this)
{
Visible = false,
Name = $"uci_{i}"
};
uCInventur.UCInventur_Update += () => { this.GetInventuren(); };
uCInventur.UCInventur_Delete += Do_UCInventur_Delete;
this.panelMain.Controls.Add(uCInventur);
}
//Get_UCInventur_Location();
}
private void Do_UCInventur_Delete()
{
this.panelMain.Controls.Remove(uCInventur);
}
private void Get_UCInventur_Location()
{
// UCInventur in den Vordergrund bringen und Location setzen.
int y = panelMain.Controls["feedback"].Bottom + 10;
foreach (UCInventur uci in panelMain.Controls.OfType<UCInventur>())
{
int x = panelMain.Width - uCInventur.Width - 10;
uci.Visible = true;
uci.BringToFront();
uci.Location = new Point(x, y);
y += uci.Height;
}
}
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 GetUserControls()
{
// Feedback Button wird eingefügt. Location wird in FormMain_Shown berechnet.
UCFeedback feedback = new UCFeedback(this.benutzer);
this.panelMain.Controls.Add(feedback);
if (feedback != null) feedback.Location = new Point(panelMain.Width - feedback.Width - 10, panelMain.Top + 10);
switch (this.benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
break;
case BenutzerRolle.Fahrer:
break;
case BenutzerRolle.Admin:
// UserControl Auftrag Suchen einfügen
uCAuftrag = new UCAuftragSuchen(this.benutzer, this);
this.panelMain.Controls.Add(uCAuftrag);
uCAuftrag.Location = new Point(8, this.buttonNeueAufgabe.Bottom + 10);
// UserControl Statistik einfügen
uCStatistik = new UCStatistik();
this.panelMain.Controls.Add(uCStatistik);
uCStatistik.Location = new Point(8, uCAuftrag.Bottom + 10);
break;
case BenutzerRolle.Waschstrasse:
break;
case BenutzerRolle.Master:
break;
case BenutzerRolle.Expedit:
break;
case BenutzerRolle.Frottee:
break;
case BenutzerRolle.Flach:
break;
default:
break;
}
}
private void Enable_Controls()
{
// BUTTONS ENABLEN
foreach (Control ctr in this.panelMain.Controls)
{
switch (this.benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxSaison");
break;
case BenutzerRolle.Fahrer:
ctr.Visible = ctr.Enabled = ctr.Name.Contains("NeuerAuftrag") || ctr.Name.Contains("groupBoxAuftrag") || ctr.Name.Contains("Tourenliste");
if (ctr.Name.Contains("groupBoxAuftrag"))
{
this.groupBoxAuftrag.Size = new Size(this.panelMain.Width - this.buttonNeuerAuftrag.Right - 20, this.panelMain.Height - 20);
this.groupBoxAuftrag.Location = new Point(this.buttonNeuerAuftrag.Right + 10, this.buttonNeuerAuftrag.Bottom + 10);
foreach (RadioButton rb in this.groupBoxAuftrag.Controls.OfType<RadioButton>()) rb.Enabled = false;
}
break;
case BenutzerRolle.Admin:
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxScannTest");
break;
case BenutzerRolle.Waschstrasse:
ctr.Visible = ctr.Enabled = false;
break;
case BenutzerRolle.Master:
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxScannTest");
break;
case BenutzerRolle.Expedit:
ctr.Visible = ctr.Enabled = false;
break;
case BenutzerRolle.Frottee:
ctr.Visible = ctr.Enabled = false;
break;
case BenutzerRolle.Flach:
ctr.Visible = ctr.Enabled = false;
break;
default:
break;
}
if (!ctr.Name.Contains("groupBoxAuftrag")) RegisterDragEvents(ctr);
}
// TOOLSTRIP-BUTTONS ENABLEN
foreach (ToolStripButton btn in this.toolStripMenu.Items)
{
switch (this.benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
btn.Enabled = true;
break;
case BenutzerRolle.Fahrer:
btn.Enabled = btn.Name.Contains("Hilfe");
break;
case BenutzerRolle.Admin:
btn.Enabled = true;
break;
case BenutzerRolle.Waschstrasse:
btn.Enabled = btn.Name.Contains("Hilfe");
break;
case BenutzerRolle.Master:
btn.Enabled = true;
break;
case BenutzerRolle.Expedit:
btn.Enabled = btn.Name.Contains("Hilfe");
break;
case BenutzerRolle.Frottee:
btn.Enabled = btn.Name.Contains("Hilfe");
break;
case BenutzerRolle.Flach:
btn.Enabled = btn.Name.Contains("Hilfe");
break;
default:
break;
}
}
if (this.groupBoxAuftrag.Visible && this.benutzer.Rolle == BenutzerRolle.Fahrer)
{
GetExpeditList(null);
}
this.panelProgress.Visible = this.panelProgress.Enabled = this.benutzer.Rolle == BenutzerRolle.Master;
this.buttonKundeArtikelUpdate.Visible = this.buttonKundeArtikelUpdate.Enabled = this.benutzer.Rolle == BenutzerRolle.Master;
}
private void DoKundeArtikelImportOnce(IProgress<int> progress, List<Sortiment> sortimentListe)
{
int kundeid = 0;
int itemsDone = 0;
int reihung = 1;
foreach (Sortiment sort in sortimentListe)
{
// Fortschrittswert an die ProgressBar melden
progress.Report(++itemsDone);
Console.WriteLine(itemsDone);
if (sort.ArtNr != 0)
{
if (kundeid != Kunde.GetKundeID(sort.KundeNummer, null)) { kundeid = Kunde.GetKundeID(sort.KundeNummer, null); reihung = 1; }
if (kundeid == 0) continue;
KundeArtikel kndart = KundeArtikel.GetItemIfAvailable(kundeid, sort.ArtNr);
try
{
Artikel art = Artikel.GetArtikel(sort.ArtNr, null);
if (art == null) continue;
if (kndart == null)
{
kndart = new KundeArtikel
{
KundeID = kundeid,
ArtikelName = art.Bezeichnung,
ArtikelNR = art.Nummer
};
}
kndart.ArtikelID = art.ArtikelID;
kndart.Reihung = reihung;
kndart.Save();
}
catch (Exception ex)
{
MessageBox.Show($"Kundenartikel {kndart.KundeArtikelID} von Kunde {kundeid} konnte nicht gespeichert werden. {ex.Message}");
}
}
reihung++;
}
}
private async Task GetAuftraege()
{
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
try
{
await conn.OpenAsync();
auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragStatus.Aufgelegt);
//TODO: nicht ganze Aufträge holen sondern nur die Zahlen?
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
}
}
private void Paint_Boarder(Size size, PaintEventArgs e)
{
e.Graphics.Clear(Color.White);
Pen pen = new Pen(Program.Wirlblau, 4);
Rectangle rect = new Rectangle(1, 2, size.Width - 4, size.Height - 4);
e.Graphics.DrawRectangle(pen, rect);
}
private void PanelMain_Paint(object sender, PaintEventArgs e)
{
Paint_Boarder(this.panelMain.Size, e);
}
private void PanelMain_Resize(object sender, EventArgs e)
{
panelMain.Invalidate();
}
private async void FormMain_HelpButtonClicked(object sender, CancelEventArgs e)
{
this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen
await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus
ZeigeOnboarding();
}
private void GetContainerProTag()
{
for (int i = 0; i < this.tLPContAnz.ColumnCount; i++)
{
if (i == 0)
{
int row = 1;
foreach (var key in auftragliste.Keys.OrderBy(k => k))
{
Control ctr = this.tLPContAnz.GetControlFromPosition(i, row);
ctr.Text = Funktionen.GetWochentagDeutsch(key.DayOfWeek);
ctr.Text += " (" + key.ToShortDateString() + "):"; // "13.02.2026"
row++;
}
Control control = this.tLPContAnz.GetControlFromPosition(i, row - 1);
control.Text = "Rest";
}
if (i == 1)
{
int row = 1;
int cont = 0;
int gescont = 0;
foreach (List<Auftrag> liste in auftragliste.Values)
{
foreach (Auftrag a in liste)
{
cont += a.Container;
}
Control ctr = this.tLPContAnz.GetControlFromPosition(i, row);
ctr.Text = cont.ToString();
gescont += cont;
row++;
cont = 0;
}
Control control = this.tLPContAnz.GetControlFromPosition(1, 6);
control.Text = gescont.ToString();
}
if (i == 2 || i == 3)
{
double geszeit = 0;
for (int j = 1; j < this.tLPContAnz.RowCount; j++)
{
Control ctr = this.tLPContAnz.GetControlFromPosition(1, j);
if (double.TryParse(ctr.Text, out double cont)) cont = (cont * 2.7 * 3.5) / 60 / (i-1);
Control control = this.tLPContAnz.GetControlFromPosition(i, j);
control.Text = cont.ToString("F1") + " h";
if (j < 6) geszeit += cont;
}
Control _ctr = this.tLPContAnz.GetControlFromPosition(i, 6);
_ctr.Text = geszeit.ToString("F1") + " h";
}
}
}
private void GetSaison()
{
var listenQuelle = Saison.LadeSaisons(); // Liste<Saison>
comboBoxSaison.DataSource = listenQuelle;
comboBoxSaison.DisplayMember = nameof(Saison.Bezeichnung);
comboBoxSaison.ValueMember = nameof(Saison.SaisonId);
// aktiven Eintrag suchen (falls genau einer aktiv ist)
var aktiveSaison = listenQuelle
.FirstOrDefault(s => s.Aktiv); // LINQ FirstOrDefault [web:13][web:16][web:19]
if (aktiveSaison != null)
{
comboBoxSaison.SelectedValue = aktiveSaison.SaisonId; // per ValueMember setzen [web:11][web:20]
}
}
private void ComboBoxSaison_SelectedIndexChanged(object sender, EventArgs e)
{
if (formloading) { return; }
if (meldung.GetFrage(this, "Bist du dir sicher, dass du die Aktive Saison ändern möchtest?", false) == DialogResult.No)
{
formloading = true;
try
{
foreach (Saison saison in comboBoxSaison.Items)
{
if (saison.Aktiv)
{
comboBoxSaison.SelectedItem = saison; // Event wird aktuell unterdrückt
break;
}
}
}
finally
{
formloading = false;
}
return;
}
foreach (Saison saison in comboBoxSaison.Items)
{
if (saison == comboBoxSaison.SelectedItem) saison.Aktiv = true;
else saison.Aktiv = false;
saison.Save();
}
}
/// <summary>
/// Scan QR-Code Test.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TextBoxScannTest_TextChanged(object sender, EventArgs e)
{
TextBox textBox1 = (TextBox)sender;
using (Graphics g = textBox1.CreateGraphics())
{
SizeF size = g.MeasureString(textBox1.Text, textBox1.Font);
textBox1.Width = (int)size.Width + 10; // +10 als Puffer
}
}
}
}
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.
//CHANGES: Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden.
//TODO: Dateinamen aus Tikos anschauen. Eventuell Datum von letztem Import über Dateiname wählen?
//DONE: JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen.