Programm_Wirl/AA-Forms/FormExpedit.cs
2026-04-14 15:15:02 +02:00

1154 lines
44 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<KundeArtikel> artikelListe;
private List<Auftrag> auftraglist;
private List<Auftrag> sonderlist;
private List<Auftrag> geschaeftlist;
private List<Auftrag> suchliste;
private List<Auftrag> rampenlist;
private List<Auftrag> 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<View_Auftrag_Expedit> listAuftragToday;
private List<View_Auftrag_Expedit> listAuftragGeschaeft;
private List<View_Auftrag_Expedit> listVorbereitet;
private List<View_Auftrag_Expedit> listSonderAuftrag;
private List<View_Auftrag_Expedit> 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;
}
/// <summary>
/// Wenn FormExpedit angezeigt wird, wird die Location des FeedbackButtons berechnet.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<Auftrag> 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<Auftrag>().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<Benutzer> 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<Auftrag> 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<View_Auftrag_Expedit> 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<OLVColumn>().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<OLVColumn>().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<OLVColumn>().FirstOrDefault(col => col.Text == "Schmutzig");
if (dirtCol != null)
{
dirtCol.HeaderImageKey = "dirt";
dirtCol.ShowTextInHeader = false;
dirtCol.MinimumWidth = dirtCol.MaximumWidth = 80;
}
var cleanCol = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(col => col.Text == "Sauber");
if (cleanCol != null)
{
cleanCol.HeaderImageKey = "clean";
cleanCol.ShowTextInHeader = false;
cleanCol.MinimumWidth = dirtCol.MaximumWidth = 80;
}
var primaryCol = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(col => col.Text == "Status");
if (primaryCol != null) olv.PrimarySortColumn = primaryCol;
var secondaryCol = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(col => col.Text == "Liefertag");
if (secondaryCol != null) olv.SecondarySortColumn = secondaryCol;
var druckenCol = olv.AllColumns.Cast<OLVColumn>().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<OLVColumn>().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;
}
/// <summary>
/// Die Objecte der ObjectListView werden neu geladen.
/// </summary>
/// <param name="olv"></param>
/// <param name="auftraglist"></param>
private void OLV_SetObjects(ObjectListView olv, List<View_Auftrag_Expedit> auftraglist)
{
if (olv.AllColumns.Count == 0) Load_OLV(olv, auftraglist);
else
{
olv.SetObjects(auftraglist); // Bindet die Auftragsliste an die View
}
}
/// <summary>
/// Die Objecte der ObjectListView werden neu geladen. Wenn Sie noch keine Spalten hat wird die ObjectListView komplett neu geladen.
/// </summary>
/// <param name="olv"></param>
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;
}
/// <summary>
/// Blendet die Button Spalten aus wenn der User dazu nicht berechtigt ist.
/// </summary>
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();
}
/// <summary>
/// Cell Edit Finished wird verwendet um die Container Sauber Anzahl festzulegen.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
/// <summary>
/// Ausgelöst durch DoppelClick
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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
/// <summary>
/// Controls werden nach Benutzer deaktiviert.
/// </summary>
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);
}
}
/// <summary>
/// Zeigt Fenster zur Eingabe von Text.
/// </summary>
/// <param name="titel"></param>
/// <param name="prompt"></param>
/// <param name="defaultText"></param>
/// <returns>Anzahl Saubere Container als string</returns>
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.");
}
/// <summary>
/// Wird aufgerufen wenn ein Auftrag Fertig ist und so gespeichert werden soll.
/// </summary>
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;
}
/// <summary>
/// Beim Wechsel der Tabs wird ObjectListView neu geladen und Spalten ausgeblendet.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
/// <summary>
/// Wenn Suche mehr als 1 Auftrag wird TabPage mit Ergebnis hinzugefügt.
/// </summary>
/// <param name="liste"></param>
/// <param name="listenArt"></param>
private void AddTabPage(List<Auftrag> 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);
}
/// <summary>
/// MouseDown um Klick auf TabControl zu erkennen.
/// Wenn Klick auf "x" wird die TabPage geschlossen. NUR BEI SUCHE MÖGLICH
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
}
}
/// <summary>
/// Malt Border der GroupBox für Anmerkungen. Farbe wechseln wenn ROT schlecht.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void groupBoxKndInfo_Paint(object sender, PaintEventArgs e)
{
Funktionen.GetGroupBoxBoarder(groupBoxKndInfo, e);
}
/// <summary>
/// Wenn Chart wird sichtbar wird die Position berechnet.
/// Das TabControl wird um die Chart schmäler.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
/// <summary>
/// Wenn die GroupBox für Aufgabe und Anmerkung sichtbar wird wird die Position berechnet.
/// Das TabControl wird um die GroupBox schmäler.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
}
}