Programm_Wirl/AA-Forms/FormExpedit.cs

1247 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 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
{
FormShowUserControl showGroupBox = new FormShowUserControl("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)
{
FormShowUserControl showGroupBox = new FormShowUserControl("Statistik", this.benutzer);
showGroupBox.ShowDialog();
}
#endregion
#region ObjectListView-Events
private void Load_OLV(ObjectListView olv, List<View_Auftrag_Expedit> auftragliste)
{
this.UseWaitCursor = true;
// === LAYOUT & UPDATE PAUSIEREN ===
olv.BeginUpdate();
olv.SuspendLayout();
try
{
// === SPALTEN NUR EINMAL GENERIEREN (falls sinnvoll) ===
if (olv.AllColumns.Count == 0)
{
Generator.GenerateColumns(olv, typeof(View_Auftrag_Expedit), true);
ConfigureColumns(olv);
}
// === IMAGE-LIST (einmalig zentral konfigurieren, hier nur zuweisen) ===
Program.imagelist.ImageSize = new Size(24, 24);
olv.SmallImageList = Program.imagelist;
// === TOOLTIP-EVENT EINMALIG REGISTRIEREN ===
olv.CellToolTipShowing -= Olv_CellToolTipShowing;
olv.CellToolTipShowing += Olv_CellToolTipShowing;
// === DATEN LADEN ===
OLV_SetObjects(olv, auftragliste);
// === SORTIERUNG ===
var statusCol = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(c => c.Text == "Status");
var liefertagCol = olv.AllColumns.Cast<OLVColumn>().FirstOrDefault(c => c.Text == "Liefertag");
if (statusCol != null) olv.PrimarySortColumn = statusCol;
if (liefertagCol != null) olv.SecondarySortColumn = liefertagCol;
if (olv.Name.Contains("Rampe") && liefertagCol != null)
olv.Sort(liefertagCol);
else
olv.Sort();
// === SPALTEN JE NACH TAB/ROLLE ===
GetUnvisibleColumns(olv);
// === SPALTENBREITE ANPASSEN ===
olv = Funktionen.Columns_Resize(null, olv).olv;
// === FILTER ===
olv.FilterMenuBuildStrategy = new MeinFilterMenu();
}
finally
{
olv.ResumeLayout();
olv.EndUpdate();
olv.Focus();
this.UseWaitCursor = false;
}
}
private void ConfigureColumns(ObjectListView olv)
{
var columns = olv.AllColumns.Cast<OLVColumn>().ToList();
OLVColumn Find(string header) =>
columns.FirstOrDefault(c => String.Equals(c.Text, header, StringComparison.OrdinalIgnoreCase));
// --- Aufgabe-Icon ---
var aufgabeCol = Find("Aufgabe");
if (aufgabeCol != null)
{
aufgabeCol.ImageGetter = rowObject =>
{
var a = rowObject as View_Auftrag_Expedit;
if (a == null) return -1;
return string.IsNullOrEmpty(a.AufgabeBezeichnung) ? -1 : 0;
};
}
// --- Kunde-Icon ---
var kundeCol = Find("Kunde");
if (kundeCol != null)
{
kundeCol.ImageGetter = rowObject =>
{
var a = rowObject as View_Auftrag_Expedit;
if (a == null) return -1;
return string.IsNullOrEmpty(a.Zusatz) ? -1 : 1;
};
}
// --- Schmutzig / Sauber ---
var dirtCol = Find("Schmutzig");
if (dirtCol != null)
{
dirtCol.HeaderImageKey = "dirt";
dirtCol.ShowTextInHeader = false;
dirtCol.MinimumWidth = dirtCol.MaximumWidth = 80;
}
var cleanCol = Find("Sauber");
if (cleanCol != null)
{
cleanCol.HeaderImageKey = "clean";
cleanCol.ShowTextInHeader = false;
cleanCol.MinimumWidth = cleanCol.MaximumWidth = 80; // Bugfix: nicht dirtCol.MaximumWidth
}
// --- Etikett-Button ---
var druckenCol = Find("Etikett");
if (druckenCol != null)
{
druckenCol.IsButton = true;
druckenCol.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds;
druckenCol.HeaderImageKey = "print";
druckenCol.ShowTextInHeader = false;
druckenCol.MinimumWidth = druckenCol.MaximumWidth = 80;
}
// --- Abschließen-Button ---
var fertigCol = Find("Abschließen");
if (fertigCol != null)
{
fertigCol.IsButton = true;
fertigCol.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds;
fertigCol.HeaderImageKey = "abschließen";
fertigCol.ShowTextInHeader = false;
fertigCol.MinimumWidth = fertigCol.MaximumWidth = 80;
}
}
private void Olv_CellToolTipShowing(object sender, ToolTipShowingEventArgs e)
{
// Kein Model, kein Tooltip
if (e.Model == null || e.Column == null)
return;
// Aufgabe-Tooltip
if (e.Column.Text == "Aufgabe" && e.Model is View_Auftrag_Expedit expeditAufgabe)
{
var auftrag = Auftrag.GetAuftrag(expeditAufgabe.AuftragID);
var aufgabe = Aufgabe.GetAufgabe(null, auftrag.AufgabeID);
e.Text = aufgabe?.Bezeichnung;
return;
}
// Kunde-Tooltip
if (e.Column.Text == "Kunde" && e.Model is View_Auftrag_Expedit expeditKunde)
{
var auftrag = Auftrag.GetAuftrag(expeditKunde.AuftragID);
var kunde = Kunde.GetKunde(null, auftrag.KundeID, null);
if (!string.IsNullOrWhiteSpace(kunde?.Anmerkung))
e.Text = kunde.Anmerkung;
return;
}
// Fahrer-Tooltip Typfix: hier passt View_Auftrag_Expedit besser
if (e.Column.Text == "Fahrer" && e.Model is View_Auftrag_Expedit expeditFahrer)
{
e.Text = expeditFahrer.Zusatz;
}
}
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, CellClickEventArgs e)
{
var olv = (ObjectListView)sender;
var view = (View_Auftrag_Expedit)e.Model;
var auftrag = Auftrag.GetAuftrag(view.AuftragID);
this.UseWaitCursor = true;
try
{
switch (e.Column.Text)
{
case "Abschließen":
HandleAbschliessenClick(olv, auftrag);
break;
case "Etikett":
HandleEtikettClick(auftrag);
break;
}
}
finally
{
Neuladen_OLV(olv);
this.UseWaitCursor = false;
}
}
/// <summary>
/// Behandelt den Fall, dass der Button in der Spalte Abschliessen geclickt wurde
/// </summary>
/// <param name="olv"></param>
/// <param name="auftrag"></param>
private void HandleAbschliessenClick(ObjectListView olv, Auftrag auftrag)
{
// Sonderfall Frottee: nur Abteilung beenden und raus
if (this.benutzer.Rolle == BenutzerRolle.Frottee)
{
this.auftrag = auftrag;
Auftrag_Fertig();
return;
}
if (olv.CheckedItems.Count > 0)
{
HandleBatchAbschliessen(olv);
return;
}
HandleSingleAbschliessen(auftrag);
}
/// <summary>
/// Wenn angehackte Datensätze im Bulk abeschlossen werden sollen.
/// Hier sind mehrere oder nur ein Auftrag abschließen möglich.
/// </summary>
/// <param name="olv"></param>
private void HandleBatchAbschliessen(ObjectListView olv)
{
var count = olv.CheckedItems.Count;
var result = MessageBox.Show(
$"Möchtest du die ausgewählten {count} Aufträge abschließen?",
"AUFTRÄGE FERTIG",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.No)
return;
foreach (OLVListItem item in olv.CheckedItems)
{
this.auftrag = (Auftrag)item.RowObject;
Auftrag_Fertig();
}
var kundeColumn = olv.AllColumns
.Cast<OLVColumn>()
.FirstOrDefault(col => col.Text == "Kunde");
if (kundeColumn != null && kundeColumn.HeaderCheckBox)
olv.UncheckHeaderCheckBox(kundeColumn);
}
/// <summary>
/// Wenn der Button geclickt wurde ohne anhacken. Es wird garantiert nur 1 Auftrag abgeschlossen
/// </summary>
/// <param name="auftrag"></param>
private void HandleSingleAbschliessen(Auftrag auftrag)
{
if (this.auftrag != auftrag)
altecontclean = null;
this.auftrag = auftrag;
if (this.auftrag.ContainerClean == 0)
{
if (meldung.NoCleanContainer() == DialogResult.OK)
return;
}
else
{
if (!HandleContainerCleanChange())
return;
}
Auftrag_Fertig();
}
/// <summary>
/// Behandelt den Fall, dass sich ContainerClean geändert hat.
/// Gibt false zurück, wenn der Vorgang abgebrochen werden soll.
/// </summary>
private bool HandleContainerCleanChange()
{
if (altecontclean == null || this.auftrag.ContainerClean == altecontclean)
return true;
switch (meldung.DifferentCleanContainer())
{
case DialogResult.Cancel:
return false;
case DialogResult.Yes:
return TryDruckMitNeuemContainerClean();
case DialogResult.No:
this.auftrag.Erstellt = DateTime.Now;
this.auftrag.ErstelltVon = (int)benutzer.BenutzerID;
return true;
default:
return true;
}
}
/// <summary>
/// Wenn eine neue Anzahl an sauberen Containern eingegeben wurde wird ein erneuter Druck abgefragt.
/// </summary>
private bool TryDruckMitNeuemContainerClean()
{
this.auftrag.Gedruckt = DateTime.Now;
this.auftrag.GedrucktVon = benutzer.BenutzerID;
var nocont = false;
if (this.auftrag.ContainerClean > 10)
{
var res = MessageBox.Show(
"Möchtest du die Containeranzahl am Etikett anzeigen?",
"FRAGE",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
nocont = (res == DialogResult.No);
}
try
{
Funktionen.Etikett_Drucken(auftrag, nocont);
return true;
}
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 false;
}
}
/// <summary>
/// Behandelt den Fall, dass der Button in der Spalte Etikett geclickt wurde.
/// </summary>
/// <param name="auftrag"></param>
private void HandleEtikettClick(Auftrag auftrag)
{
this.auftrag = auftrag;
if (this.auftrag.AufgabeID != null)
{
var aufgabe = Aufgabe.GetAufgabe(null, auftrag.AufgabeID);
var text = $"Bei dem ausgewählten Auftrag ist die Aufgabe {aufgabe.Bezeichnung} zu erledigen. Hast du die Aufgabe erledigt? ";
if (meldung.GetAchtung(this, text, false) == DialogResult.No)
return;
}
PrepareContainerCleanForEtikett();
var 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;
}
}
private void PrepareContainerCleanForEtikett()
{
if (this.auftrag.ContainerClean != 0)
{
letzterLiefertag = this.auftrag.Liefertag;
return;
}
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;
}
/// <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);
if (this.auftrag.Status == AuftragStatus.Vorbereitet & e.Value != e.NewValue)
{
if (MessageBox.Show("Die Containeranzahl wurde verändert. Möchtest du die Etiketten nochmals drucken?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Funktionen.Etikett_Drucken(this.auftrag, nocont);
}
}
//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();
}
}
}