Programm_Wirl/AA-Forms/FormExpedit.cs

1102 lines
42 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 readonly ToolTip cellTooltip = new ToolTip();
public Meldungen fehlermeldung = new Meldungen();
public Image etikett = null;
public Auftrag auftrag;
public Auftrag NeuerAuftrag; //NEU FÜR UPDATE
public Benutzer benutzer;
public Kunde kunde;
DateTime? letzterLiefertag = null;
readonly bool nocont = false;
private readonly Meldungen meldung = new Meldungen();
private List<KundeArtikel> artikelListe;
private List<Auftrag> suchliste;
int? altecontclean = null;
private readonly Timer timer1 = new Timer(); // Timer für Nachwäsche
private readonly Timer timer2 = new Timer(); // Timer für Refresh Auftragliste
private readonly Screen[] screens;
private Point itemlocation;
private const int MAX_FAILURES = 3;
private readonly 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;
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 expedit)
{
Auftrag auftrag = Auftrag.GetAuftrag(expedit.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 expedit1)
{
Auftrag _auftrag = Auftrag.GetAuftrag(expedit1.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 ==========
if (olv.Name.Contains("Rampe")) olv.Sort(secondaryCol);
else 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)
{
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;
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")
{
// Wenn BenutzerRolle Frottee dann Abteilung Frottee Beendet.
if (this.benutzer.Rolle == BenutzerRolle.Frottee) { Auftrag_Fertig(); Neuladen_OLV(olv); return; }
if (olv.CheckedItems.Count > 0)
{
if (MessageBox.Show($"Möchtest du die ausgewählten {olv.CheckedItems.Count} 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();
}
var column = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(col => col.Text == "Kunde");
if (column != null && column.HeaderCheckBox) olv.UncheckHeaderCheckBox(column);
}
}
else
{
if (this.auftrag != _auftrag) altecontclean = null;
this.auftrag = _auftrag;
if (this.auftrag.ContainerClean == 0)
{
if (meldung.NoCleanContainer() == DialogResult.OK) return;
}
else
{
if (altecontclean != null && this.auftrag.ContainerClean != altecontclean)
{
switch (meldung.DifferentCleanContainer())
{
case DialogResult.Cancel:
return;
case DialogResult.Yes:
{
this.auftrag.Gedruckt = DateTime.Now;
this.auftrag.GedrucktVon = benutzer.BenutzerID;
bool nocont = false;
if (this.auftrag.ContainerClean > 10)
{
if (MessageBox.Show("Möchtest du die Containeranzahl am Etikett anzeigen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
nocont = true;
}
else nocont = false;
}
try
{
Funktionen.Etikett_Drucken(auftrag, nocont);
}
catch (Exception ex)
{
MessageBox.Show("Etiketten konnten nicht gedruckt werden. Versuche es nochmals.", "DRUCKFEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error);
Program.AddFehler(this.benutzer, ex.Message, ex.StackTrace, null);
return;
}
}
break;
case DialogResult.No:
this.auftrag.Erstellt = DateTime.Now;
this.auftrag.ErstelltVon = (int)benutzer.BenutzerID;
break;
default:
break;
}
}
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 = true;
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)
{
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;
}
}
/// <summary>
/// Aufträge für TabPages werden von DB-VIEW geladen.
/// </summary>
/// <param name="liste">null wemm alle Listen neu geladen werden sollen</param>
/// <returns>Task zu FormLoad</returns>
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()
{
//TODO: Auftrag richtig speichern... mit gedruckt bzw. erledigt bzw.
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;
if (!(tabControl.SelectedTab.Controls[0] is ObjectListView olv)) 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 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;
if (!(e.RowObject is Auftrag _auftrag)) 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();
}
}
}