Programm_Wirl/AA-Forms/FormExpedit.cs

1218 lines
45 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.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;
#endregion
public FormExpedit(Benutzer benutzer)
{
this.Cursor = Cursors.WaitCursor;
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.Cursor = Cursors.WaitCursor;
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)
{
//Application.UseWaitCursor = true;
this.Cursor = Cursors.WaitCursor;
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(GetAuftraege(null), GetSonderAuftraege());
// UI-Update NACH Daten (Invoke!)
this.Invoke(new Action(() =>
{
// OLVs füllen
if (auftraglist.Count > 0) OLV_Load(this.objectListViewAuftrag, auftraglist);
//if (sonderlist.Count > 0) OLV_Load(this.objectListViewSonder, sonderlist);
//if (geschaeftlist.Count > 0) OLV_Load(this.objectListViewGeschaeft, geschaeftlist);
//if (rampenlist.Count > 0) OLV_Load(this.objectListViewRampe, rampenlist);
//if (vorbereitetliste.Count > 0) OLV_Load(this.objectListViewVorbereitet, vorbereitetliste);
// Controls aktivieren und deaktivieren nach BenutzerRolle
Enable_Controls();
this.Visible = true;
this.ResumeLayout(false);
this.Cursor = Cursors.Default;
}));
}
catch (Exception ex)
{
// Vermeide $ für C# älter
this.BeginInvoke(new Action(() => MessageBox.Show(
string.Format($"Laden fehlgeschlagen: {0}", ex.Message))));
Program.AddFehler(this.benutzer, 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.Cursor = Cursors.WaitCursor;
this.tabControlAuftragList.Width = this.Width - 25;
}
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.Width - fb.Width - 18, 0);
btn.BackColor = Program.Wirlblau;
btn.ForeColor = Color.White;
btn.FlatAppearance.BorderColor = Color.White;
fb.BringToFront();
this.ResumeLayout();
//this.Cursor = Cursors.Default;
Application.UseWaitCursor = false;
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 GetAuftraege(null);
//List<Auftrag> auftraglist = Auftrag.GetAuftragListToday(DateTime.Today);
OLV_SetObjects(this.objectListViewAuftrag, auftraglist);
OLV_SetObjects(this.objectListViewGeschaeft, geschaeftlist);
}
}
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.Cursor = Cursors.Default;
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)
{
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;
}
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
/// <summary>
/// Die ObjectListView wird komplett neu geladen. Mit Spalten etc.
/// </summary>
/// <param name="olv"></param>
/// <param name="auftraglist"></param>
private void OLV_Load(ObjectListView olv, List<Auftrag> auftraglist)
{
this.Cursor = Cursors.WaitCursor;
// Layout- und Update-Änderungen pausieren, um Flackern zu verhindern
olv.SuspendLayout(); // Stoppt Layout-Berechnungen (Anchor/Dock)
// SpaltenHeader-Design anpassen
//this.objectListViewAuftrag.HeaderFormatStyle = Funktionen.GetHeader();
// Automatisch alle Properties von Auftrag als Spalten generieren
Generator.GenerateColumns(olv, typeof(Auftrag), true);
// ========== CHECKBOX COLUMNS FÜR ABTEILUNGEN ===========
// Spalten-Setup
var colFrottee = new OLVColumn("Frottee", "Frottee");
colFrottee.Text = "FR";
colFrottee.DisplayIndex = 6;
colFrottee.TextAlign = HorizontalAlignment.Center;
colFrottee.Width = 50;
colFrottee.AspectGetter = row => {
var auftrag = (Auftrag)row;
if (!KundeArtikel.HatKategorieArtikel(auftrag.KundeID, ArtikelKategorie.Frottee) & !KundeArtikel.HatKategorieArtikel(auftrag.KundeID, ArtikelKategorie.Spannleintuch)) return string.Empty;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.FrotteeBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.FrotteeBeendet) != 0;
if (beendet) return "☑"; // Status 1 ✓
if (begonnen) return "☐"; // Status 2 ✓
return "☒"; // Status 0 ✓
};
var colKleinteile = new OLVColumn("Kleinteile", "Kleinteile");
colKleinteile.Text = "KT";
colKleinteile.DisplayIndex = 7;
colKleinteile.TextAlign = HorizontalAlignment.Center;
colKleinteile.Width = 50;
colKleinteile.AspectGetter = row => {
var auftrag = (Auftrag)row;
if (!KundeArtikel.HatKategorieArtikel(auftrag.KundeID, ArtikelKategorie.Kleinteile)) return string.Empty;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.KleinteileBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.KleinteileBeendet) != 0;
if (beendet) return "☑"; // Status 1 ✓
if (begonnen) return "☐"; // Status 2 ✓
return "☒"; // Status 0 ✓
};
var colGrosseTeile = new OLVColumn("Großteile", "Großteile");
colGrosseTeile.Text = "GT";
colGrosseTeile.DisplayIndex = 8;
colGrosseTeile.TextAlign = HorizontalAlignment.Center;
colGrosseTeile.Width = 50;
colGrosseTeile.AspectGetter = row => {
var auftrag = (Auftrag)row;
if (!KundeArtikel.HatKategorieArtikel(auftrag.KundeID, ArtikelKategorie.Grossteile)) return string.Empty;
int abteilungen = (int)auftrag.Abteilungen;
bool begonnen = (abteilungen & (int)AbteilungsStatus.GrossteileBegonnen) != 0;
bool beendet = (abteilungen & (int)AbteilungsStatus.GrossteileBeendet) != 0;
if (beendet) return "☑"; // Status 1 ✓
if (begonnen) return "☐"; // Status 2 ✓
return "☒"; // Status 0 ✓
};
olv.AllColumns.Add(colFrottee);
olv.AllColumns.Add(colKleinteile);
olv.AllColumns.Add(colGrosseTeile);
// ========== COLUMNS DURCHLAUFEN ===========
foreach (OLVColumn col in olv.AllColumns)
{
switch (col.Text)
{
case "Abschließen": // Abschließen Spalte als Button-Spalte konfigurieren
OLVColumn fertigColumn = col;
fertigColumn.DisplayIndex = 11;
fertigColumn.IsButton = true; // Als Button rendern
fertigColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
fertigColumn.HeaderImageKey = "abschließen";
fertigColumn.ShowTextInHeader = false;
fertigColumn.MinimumWidth = fertigColumn.MaximumWidth = 80;
break;
case "Etikett": // Etikett Spalte als Button-Spalte konfigurieren
OLVColumn etikettColumn = col;
etikettColumn.DisplayIndex = 10;
etikettColumn.IsButton = true; // Als Button rendern
etikettColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
etikettColumn.HeaderImageKey = "print";
etikettColumn.ShowTextInHeader = false;
etikettColumn.MinimumWidth = etikettColumn.MaximumWidth = 80;
break;
case "Aufgabe": // Aufgabe Spalte als Icon-Spalte: zeigt Icon wenn AufgabeID vorhanden
OLVColumn iconColumn = col;
iconColumn.DisplayIndex = 9;
iconColumn.ImageGetter = rowObject =>
{
var auftrag = rowObject as Auftrag;
if (auftrag.AufgabeID == null) return null; // null = kein Icon anzeigen
else return 0; // Index 0 aus SmallImageList
};
break;
case "Kunde": // Kunde Spalte als Icon-Spalte: zeigt Icon und Kundename wenn Anmerkung vorhanden
OLVColumn iColumn = col;
iColumn.DisplayIndex = 0;
iColumn.ImageGetter = rowObject =>
{
var _auftrag = rowObject as Auftrag;
if (string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) return null; // null = kein Icon anzeigen
else return 1; // Index 0 aus SmallImageList
};
break;
case "Liefertag": // Liefertag Spalte Zeigt Liefertag als String an.
OLVColumn dateColumn = col;
dateColumn.DisplayIndex = 1;
dateColumn.AspectToStringFormat = "{0:ddd dd.MM.}";
// DateTime-Filter für Spalte 2
dateColumn.ClusteringStrategy = new DateTimeClusteringStrategy(DateTimePortion.Day, "ddd dd.MM."); // DateTimeClustering damit Datum gefiltert werden kann
olv.SecondarySortColumn = dateColumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
break;
case "Status": // Spalte 5 als primäre Sortier-Spalte festlegen (nach Datenbindung!)
OLVColumn sortcolumn = col;
sortcolumn.DisplayIndex = 4;
olv.PrimarySortColumn = sortcolumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
break;
case "Auswählen":
col.IsVisible = false;
break;
case "Erstellt":
col.IsVisible = false;
break;
case "Gedruckt":
col.IsVisible = false;
break;
case "Erledigt":
col.IsVisible = false;
break;
case "schmutzig":
col.HeaderImageKey = "dirt";
col.ShowTextInHeader = false;
col.MinimumWidth = col.MaximumWidth = 80;
col.DisplayIndex = 2;
break;
case "sauber":
col.HeaderImageKey = "clean";
col.ShowTextInHeader = false;
col.MinimumWidth = col.MaximumWidth = 80;
col.DisplayIndex = 3;
break;
default:
break;
}
}
//TODO: Reihenfolge Spalten richtig stellen.
//TODO: OLV State speichern.
GetUnvisibleColumns(olv);
olv.RebuildColumns();
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 über Spalte 10 und 1
olv.CellToolTipShowing += (s, e) =>
{
// Nur für Icon-Spalte (Index 10) und gültiges Model
if (e.Column.Text == "Aufgabe" && e.Model is Auftrag auftrag)
{
// Lade Bezeichnung der Aufgabe als Tooltip-Text
e.Text = Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung;
}
// Nur für Icon-Spalte (Index 1) und gültiges Model
if (e.Column.Text == "Kunde" && e.Model is Auftrag _auftrag)
{
if (!string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung))
{
// Lade Anmerkung als Tooltip-Text
e.Text = Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung;
}
}
//TODO: Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe??
if (e.Column.Text == "Fahrer" && e.Model is Auftrag auftrag1)
{
e.Text = auftrag1.ZusatzInfo;
}
};
// ========== DATEN LADEN ==========
// WICHTIG: SetObjects NACH Column-Konfiguration aufrufen!
OLV_SetObjects(olv, auftraglist);
olv.RefreshObjects(auftraglist);
// ========== SORTIERUNG ==========
olv.Sort();
// ========== SPALTEN ANPASSEN ==========
olv = Funktionen.Columns_Resize(null, olv).olv; // Externe Funktion für responsive Spaltenbreiten
olv.FilterMenuBuildStrategy = new MeinFilterMenu();
// ========== AUFRÄUMEN & AKTIVIEREN ==========
//olv.ResumeLayout(); // Layout-Pause beenden, Positionen neu berechnen
olv.Focus(); // OLV fokussieren (Tastaturbedienung aktivieren)
}
private void objectListViewAuftrag_FormatCell(object sender, FormatCellEventArgs e)
{
if (e.ColumnIndex == 11)
{ // jede zweite Spalte
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;
Auftrag _auftrag = (Auftrag)e.Model;
if (e.Model == null) { chartFehlmenge.Visible = false; groupBoxKndInfo.Visible = false; return; }
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;
}
this.groupBoxKndInfo.Visible = true;
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)e.Model;
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("Sonder"))
{
await GetSonderAuftraege();
OLV_SetObjects(olv, sonderlist);
}
if (olv.Name.Contains("Geschaeft")) { await GetAuftraege(ListenArt.Geschäftliste); OLV_SetObjects(olv, geschaeftlist); }
if (olv.Name.Contains("Auftrag")) { await GetAuftraege(ListenArt.Auftragliste); OLV_SetObjects(olv, auftraglist); }
if (olv.Name.Contains("Rampe")) { await GetAuftraege(ListenArt.Rampenliste); OLV_SetObjects(olv, rampenlist); }
}
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)
{
FormAuftragDetail auftragDetail = new FormAuftragDetail(_auftrag, this.benutzer);
if (auftragDetail.ShowDialog() == DialogResult.Yes)
{
olv.RefreshObject(olv.SelectedObject);
}
}
break;
}
}
private void objectListViewAuftrag_ButtonClick(object sender, BrightIdeasSoftware.CellClickEventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
ObjectListView olv = (ObjectListView)sender;
Auftrag _auftrag = (Auftrag)e.Model;
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)
{
//AUFTRAG UPDATE
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.Cursor = Cursors.Default;
return;
}
this.auftrag.ContainerClean = anzahl;
}
//ETIKETT DRUCKEN
DialogResult result = Funktionen.Etikett_Drucken(auftrag, nocont);
if (result == DialogResult.OK)
{
this.auftrag.Gedruckt = this.auftrag.Erstellt = DateTime.Now;
this.auftrag.GedrucktVon = this.auftrag.ErstelltVon = (int)this.benutzer.BenutzerID;
this.auftrag.Status = AuftragStatus.Vorbereitet;
this.auftrag.Save();
this.auftrag = null;
}
}
Neuladen_OLV(olv);
this.Cursor = Cursors.Default;
}
/// <summary>
/// Die Objecte der ObjectListView werden neu geladen.
/// </summary>
/// <param name="olv"></param>
/// <param name="auftraglist"></param>
private void OLV_SetObjects(ObjectListView olv, List<Auftrag> auftraglist)
{
this.Cursor = Cursors.WaitCursor;
this.SuspendLayout();
if (olv.AllColumns.Count == 0) OLV_Load(olv, auftraglist);
else
{
olv.BeginUpdate(); // Stoppt Datenaktualisierungen/Redraws
olv.SetObjects(auftraglist); // Bindet die Auftragsliste an die View
olv.EndUpdate(); // Update-Pause beenden, Daten neu zeichnen
}
this.ResumeLayout(false);
this.Cursor = Cursors.Default;
}
/// <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)
{
// Neu-Laden der Sonderaufträge ObjectListView
if (olv.Name.Contains("Sonder"))
{
await GetSonderAuftraege();
OLV_SetObjects(olv, sonderlist);
return;
}
// Neu-Laden der Standartaufträge ObjectListView
if (olv.Name.Contains("Geschaeft")) { await GetAuftraege(ListenArt.Geschäftliste); OLV_SetObjects(olv, geschaeftlist); }
if (olv.Name.Contains("Auftrag")) { await GetAuftraege(ListenArt.Auftragliste); OLV_SetObjects(olv, auftraglist); }
if (olv.Name.Contains("Rampe")) { await GetAuftraege(ListenArt.Rampenliste); OLV_SetObjects(olv, rampenlist); }
if (olv.Name.Contains("Vorbereitet")) { await GetAuftraege(ListenArt.Vorbereitetliste); OLV_SetObjects(olv, vorbereitetliste); }
}
/// <summary>
/// Blendet die Button Spalten aus wenn der User dazu nicht berechtigt ist.
/// </summary>
private void GetUnvisibleColumns(ObjectListView olv)
{
this.Cursor = Cursors.WaitCursor;
this.SuspendLayout();
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.IsButton) col.IsVisible = true;
if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
if (col.Text == "Kunde")
{
col.HeaderCheckBox = true;
col.HeaderCheckBoxUpdatesRowCheckBoxes = true;
}
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;
default:
//Für alle BenutzerRollen Abschließen ausblenden.
if (col.IsButton & col.Text == "Abschließen") col.IsVisible = false;
break;
}
//Für FrotteeExpedit Etiketten drucken ausblenden.
if (this.benutzer.Rolle == BenutzerRolle.Frottee) if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
}
olv.RebuildColumns();
this.ResumeLayout(false);
}
private void objectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e)
{
this.Cursor = Cursors.WaitCursor;
this.SuspendLayout();
ObjectListView olv = (ObjectListView)sender;
this.auftrag = (Auftrag)e.RowObject;
if (e.Column.Text == "sauber") altecontclean = (int?)e.Value;
if (!string.IsNullOrWhiteSpace(e.NewValue.ToString())) Save_Auftrag(this.auftrag, false);
//Neuladen_OLV(olv);
this.ResumeLayout();
this.Cursor = Cursors.Default;
}
/// <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 = e.RowObject as Auftrag;
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;
//TODO: Soll hier ebenfalls der nächste Liefertag laut Rhythmus vorgeschlagen werden?
}
#endregion
/// <summary>
/// Controls werden nach Benutzer deaktiviert.
/// </summary>
private void Enable_Controls()
{
this.Cursor = Cursors.WaitCursor;
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>
/// Auftragslisten erstellen und in ObjectListViews laden.
/// </summary>
private async Task GetSonderAuftraege()
{
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
try
{
await conn.OpenAsync();
if (this.benutzer.Rolle == BenutzerRolle.Frottee)
{
sonderlist = await Auftrag.GetSonderListsAsync((int)AuftragTyp.Inventur, conn, (int)AbteilungsStatus.FrotteeBegonnen);
}
else
{
sonderlist = await Auftrag.GetSonderListsAsync((int)AuftragTyp.Inventur, conn, null);
}
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
}
}
private async Task GetAuftraege(ListenArt? liste)
{
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
try
{
await conn.OpenAsync();
if (this.benutzer.Rolle == BenutzerRolle.Frottee)
{
if (liste == null || liste == ListenArt.Auftragliste) auftraglist = await Auftrag.GetAuftragListTodayAsync(AuftragStatus.Vorbereitet, conn, null, (int)AbteilungsStatus.FrotteeBegonnen);
if (liste == null || liste == ListenArt.Geschäftliste) geschaeftlist = await Auftrag.GetAuftragListTodayAsync(null, conn, AuftragTyp.Geschäft, (int)AbteilungsStatus.FrotteeBegonnen);
}
else
{
if (liste == null || liste == ListenArt.Auftragliste) auftraglist = await Auftrag.GetAuftragListTodayAsync(AuftragStatus.Vorbereitet, conn, null, null);
if (liste == null || liste == ListenArt.Geschäftliste) geschaeftlist = await Auftrag.GetAuftragListTodayAsync(null, conn, AuftragTyp.Geschäft, null);
if (liste == null || liste == ListenArt.Rampenliste) rampenlist = await Auftrag.GetAuftragListTodayAsync(AuftragStatus.Abgeholt, conn, AuftragTyp.Standart, null);
if (liste == null || liste == ListenArt.Vorbereitetliste) vorbereitetliste = await Auftrag.GetAuftragListTodayAsync(AuftragStatus.Vorbereitet, conn, AuftragTyp.Standart, null);
}
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
}
}
/// <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;
GetUnvisibleColumns(olv);
Neuladen_OLV(olv);
}
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);
}
// MouseDown-Event für Klick-Erkennung
private void tabControlAuftragList_MouseDown(object sender, MouseEventArgs e)
{
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;
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);
}
private void chartFehlmenge_VisibleChanged(object sender, EventArgs e)
{
UCFeedback fb = this.Controls.Find("feedback", false)[0] as UCFeedback;
if (chartFehlmenge.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(chartFehlmenge.Left, chartHeight + 10);
fb.Visible = false;
}
else
{
this.tabControlAuftragList.Width = this.Width - 25;
fb.Visible = true;
}
}
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(chartFehlmenge.Left, chartHeight + 10);
}
else
{
this.tabControlAuftragList.Width = this.Width - 25;
}
}
}
}