1281 lines
48 KiB
C#
1281 lines
48 KiB
C#
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;
|
||
private OnboardingSchritt onBoardingArt = OnboardingSchritt.Expedit;
|
||
#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(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();
|
||
|
||
}));
|
||
}
|
||
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.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 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.UseWaitCursor = false;
|
||
return;
|
||
}
|
||
|
||
string cleanedText = new string(eingabe.Where(char.IsLetterOrDigit).ToArray());
|
||
|
||
if (int.TryParse(cleanedText, out _)) kundeID = Kunde.GetKundeID(cleanedText, null);
|
||
else kundeID = Kunde.GetKundeID(null, cleanedText);
|
||
|
||
var model = objectListViewAuftrag.Objects.Cast<Auftrag>().FirstOrDefault(a => a.KundeID == kundeID);
|
||
|
||
if (model == null)
|
||
{
|
||
|
||
}
|
||
|
||
if (model != null)
|
||
{
|
||
objectListViewAuftrag.SelectedObject = model;
|
||
objectListViewAuftrag.EnsureModelVisible(model);
|
||
objectListViewAuftrag.Focus();
|
||
|
||
}
|
||
else
|
||
{
|
||
|
||
FormShowGroupBox showGroupBox = new FormShowGroupBox("Auftrag Suchen", this.benutzer);
|
||
if (showGroupBox.ShowDialog() == DialogResult.OK)
|
||
{
|
||
suchliste = showGroupBox.auftragliste;
|
||
AddTabPage(suchliste, ListenArt.Suchliste);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
private void buttonReklamation_Click(object sender, EventArgs e)
|
||
{
|
||
FormFehlmengeCount reklamation = new FormFehlmengeCount(this.benutzer);
|
||
reklamation.ShowDialog();
|
||
}
|
||
private void buttonTourenListe_Click(object sender, EventArgs e)
|
||
{
|
||
List<Benutzer> fahrerliste = Benutzer.GetFahrerList();
|
||
Benutzer fahrer = new Benutzer();
|
||
FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste);
|
||
if (benutzerVW.ShowDialog() == DialogResult.OK)
|
||
{
|
||
fahrer = benutzerVW.user;
|
||
}
|
||
else fahrer = null;
|
||
|
||
if (fahrer != null)
|
||
{
|
||
List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
|
||
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
|
||
}
|
||
|
||
}
|
||
private void buttonStats_Click(object sender, EventArgs e)
|
||
{
|
||
FormShowGroupBox showGroupBox = new FormShowGroupBox("Statistik", this.benutzer);
|
||
showGroupBox.ShowDialog();
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region ObjectListView-Events
|
||
|
||
/// <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)
|
||
{
|
||
// 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)
|
||
this.UseWaitCursor = false;
|
||
}
|
||
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;
|
||
}
|
||
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)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 || _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)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.UseWaitCursor = false;
|
||
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.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<Auftrag> auftraglist)
|
||
{
|
||
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
|
||
}
|
||
}
|
||
|
||
/// <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 Sonderaufträge ObjectListView
|
||
if (olv.Name.Contains("Sonder"))
|
||
{
|
||
await GetSonderAuftraege();
|
||
OLV_SetObjects(olv, sonderlist);
|
||
}
|
||
else
|
||
{
|
||
// 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); }
|
||
}
|
||
|
||
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.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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Cell Edit Finished wird verwendet um die Container Sauber Anzahl festzulegen.
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void objectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e)
|
||
{
|
||
ObjectListView olv = (ObjectListView)sender;
|
||
this.auftrag = (Auftrag)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);
|
||
}
|
||
|
||
/// <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()
|
||
{
|
||
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;
|
||
|
||
tabControl.SuspendLayout();
|
||
olv.SuspendLayout();
|
||
|
||
chartFehlmenge.Visible = false;
|
||
groupBoxKndInfo.Visible = false;
|
||
|
||
//GetUnvisibleColumns(olv);
|
||
|
||
Neuladen_OLV(olv);
|
||
|
||
olv.ResumeLayout();
|
||
tabControl.ResumeLayout();
|
||
this.UseWaitCursor = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Wenn Suche mehr als 1 Auftrag wird TabPage mit Ergebnis hinzugefügt.
|
||
/// </summary>
|
||
/// <param name="liste"></param>
|
||
/// <param name="listenArt"></param>
|
||
private void AddTabPage(List<Auftrag> liste, ListenArt listenArt)
|
||
{
|
||
if (liste == null) return;
|
||
UCAuftragListe ucl = new UCAuftragListe(this.benutzer, liste);
|
||
TabPage tabPage = new TabPage();
|
||
|
||
switch (listenArt)
|
||
{
|
||
case ListenArt.Auftragliste: // Aufträge HEUTE
|
||
break;
|
||
case ListenArt.Sonderliste: // Sonderaufträge
|
||
break;
|
||
case ListenArt.Geschäftliste: // Aufträge Geschäftskunden
|
||
break;
|
||
case ListenArt.Suchliste: // Aufträge gesucht
|
||
string closeStr = " ×"; // Unicode X-Symbol
|
||
tabPage.Text = "Suchergebnis" + closeStr;
|
||
break;
|
||
case ListenArt.Rampenliste: // Aufträge auf Rampe
|
||
break;
|
||
case ListenArt.Vorbereitetliste: // Vorbereitete Aufträge
|
||
tabPage.Text = "Vorbereitet";
|
||
break;
|
||
default: //Alle Listen
|
||
break;
|
||
}
|
||
|
||
|
||
// if (!tabPage.Text.Contains("Suche")) return;
|
||
tabPage.Controls.Add(ucl);
|
||
ucl.Dock = DockStyle.Fill;
|
||
this.tabControlAuftragList.Controls.Add(tabPage);
|
||
}
|
||
|
||
/// <summary>
|
||
/// MouseDown um Klick auf TabControl zu erkennen.
|
||
/// Wenn Klick auf "x" wird die TabPage geschlossen. NUR BEI SUCHE MÖGLICH
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void tabControlAuftragList_MouseDown(object sender, MouseEventArgs e)
|
||
{
|
||
this.UseWaitCursor = true;
|
||
if (e.Button == MouseButtons.Left)
|
||
{
|
||
for (int i = 0; i < tabControlAuftragList.TabCount; i++)
|
||
{
|
||
Rectangle r = tabControlAuftragList.GetTabRect(i);
|
||
if (r.Contains(e.X, e.Y))
|
||
{
|
||
// X-Button-Bereich (rechts)
|
||
Rectangle closeRect = new Rectangle(r.Right - 18, r.Top + 4, 14, 14);
|
||
if (closeRect.Contains(e.X, e.Y))
|
||
{
|
||
if (tabControlAuftragList.TabPages[i].Text.Contains("Suche")) tabControlAuftragList.TabPages.RemoveAt(i);
|
||
return;
|
||
}
|
||
tabControlAuftragList.SelectedIndex = i;
|
||
this.UseWaitCursor = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Malt Border der GroupBox für Anmerkungen. Farbe wechseln wenn ROT schlecht.
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void groupBoxKndInfo_Paint(object sender, PaintEventArgs e)
|
||
{
|
||
Funktionen.GetGroupBoxBoarder(groupBoxKndInfo, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Wenn Chart wird sichtbar wird die Position berechnet.
|
||
/// Das TabControl wird um die Chart schmäler.
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void chartFehlmenge_VisibleChanged(object sender, EventArgs e)
|
||
{
|
||
UCFeedback fb = this.Controls.Find("feedback", false)[0] as UCFeedback;
|
||
|
||
if (chartFehlmenge.Visible || groupBoxKndInfo.Visible)
|
||
{
|
||
this.tabControlAuftragList.Width = (int)(this.Width * 0.80);
|
||
this.chartFehlmenge.Width = (int)(this.Width * 0.20) - 20;
|
||
this.groupBoxKndInfo.Width = this.chartFehlmenge.Width - 10;
|
||
|
||
int chartHeight = (int)(this.tabControlAuftragList.Height * 0.75);
|
||
int gbHeight = (int)(this.tabControlAuftragList.Height * 0.25);
|
||
|
||
chartFehlmenge.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Top);
|
||
chartFehlmenge.Size = new Size(groupBoxKndInfo.Width, chartHeight);
|
||
groupBoxKndInfo.Height = gbHeight;
|
||
groupBoxKndInfo.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Bottom - gbHeight);
|
||
|
||
fb.Visible = false;
|
||
}
|
||
else
|
||
{
|
||
this.tabControlAuftragList.Width = this.Width - 25;
|
||
fb.Visible = true;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Wenn die GroupBox für Aufgabe und Anmerkung sichtbar wird wird die Position berechnet.
|
||
/// Das TabControl wird um die GroupBox schmäler.
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void groupBoxKndInfo_VisibleChanged(object sender, EventArgs e)
|
||
{
|
||
if (groupBoxKndInfo.Visible)
|
||
{
|
||
this.tabControlAuftragList.Width = (int)(this.Width * 0.80);
|
||
this.groupBoxKndInfo.Width = (int)(this.Width * 0.20) - 20;
|
||
|
||
int chartHeight = (int)(this.tabControlAuftragList.Height * 0.75);
|
||
int gbHeight = (int)(this.tabControlAuftragList.Height * 0.25);
|
||
|
||
groupBoxKndInfo.Height = gbHeight;
|
||
groupBoxKndInfo.Location = new Point(this.tabControlAuftragList.Right + 10, this.tabControlAuftragList.Bottom - gbHeight);
|
||
|
||
}
|
||
else
|
||
{
|
||
this.tabControlAuftragList.Width = this.Width - 25;
|
||
}
|
||
}
|
||
|
||
private async void FormExpedit_HelpButtonClicked(object sender, System.ComponentModel.CancelEventArgs e)
|
||
{
|
||
this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen
|
||
await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus
|
||
ZeigeOnboarding();
|
||
}
|
||
private async void ZeigeOnboarding()
|
||
{
|
||
if (this.benutzer.IstGesehen(onBoardingArt)) return; // Bereits fertig
|
||
|
||
if (Program.ShowOnBoarding(this.benutzer.Rolle.ToString(), onBoardingArt) == DialogResult.OK)
|
||
{
|
||
// Nächster Schritt → Flag setzen
|
||
this.benutzer.OnboardingStatus = this.benutzer.SetOnboardingFlag(onBoardingArt);
|
||
await this.benutzer.UpdateOnBoardingAsync(); // Deine Update-Methode
|
||
//this.Close(); // Onboarding beendet
|
||
}
|
||
}
|
||
|
||
private void objectListViewRampe_CellEditStarting(object sender, CellEditEventArgs e)
|
||
{
|
||
ObjectListView olv = (ObjectListView)sender;
|
||
Auftrag _auftrag = e.RowObject as Auftrag;
|
||
|
||
if (_auftrag == null) return;
|
||
//Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null);
|
||
_auftrag.Status = AuftragStatus.Gewaschen;
|
||
_auftrag.Save();
|
||
|
||
olv.RefreshObject(olv.SelectedObject);
|
||
e.Cancel = true;
|
||
}
|
||
}
|
||
}
|