Programm_Wirl/AA-Forms/FormMain.cs

1151 lines
40 KiB
C#

using BrightIdeasSoftware;
using DatenDB;
using Deckungsbeitrag.AA_Forms;
using Deckungsbeitrag.Properties;
using Npgsql;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using Timer = System.Windows.Forms.Timer;
namespace Deckungsbeitrag
{
public partial class FormMain : Form
{
private Benutzer benutzer = null;
Meldungen meldung = new Meldungen();
bool open = false;
private bool isDragging = false;
private Point dragStartPoint;
private Point newLocation;
private Size _fixedSize;
private bool _handlingResize;
private readonly UserSettingsManager _settings = new UserSettingsManager();
public FormMain()
{
InitializeComponent();
this.toolStripMenu.Size = new Size(toolStripButton1.Size.Width + 20, this.Height);
//this.panelMain.Location = new Point(toolStripMenu.Right + 10, 12);
if (Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main != Point.Empty) this.buttonNeuerAuftrag.Location = Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main;
if (Properties.Settings.Default.Location_ButtonNeuerUser_Main != Point.Empty) this.buttonNeuerUser.Location = Properties.Settings.Default.Location_ButtonNeuerUser_Main;
if (Properties.Settings.Default.Location_GroupBoxStatistik_Main != Point.Empty) this.groupBoxStatistik.Location = Properties.Settings.Default.Location_GroupBoxStatistik_Main;
}
public FormMain(Benutzer benutzer) : this()
{
this.benutzer = benutzer;
this.groupBoxUpdate.Enabled = false;
// AKTIVE ELEMENTE JE BENUTZER ROLLE
switch (benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBExpedit.Enabled = false;
this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBExpedit.Enabled = false;
break;
case BenutzerRolle.Fahrer:
// ToolStripButtons werden deaktiviert.
foreach(ToolStripButton tsb in this.toolStripMenu.Items)
{
// Ausgewählter ToolStripButton bleibt aktiv.
if(!tsb.Name.Contains("Auftrag")) tsb.Enabled = false;
}
// Controls im PanelMain werden deaktiviert.
foreach(Control ctr in this.panelMain.Controls)
{
// Ausgewählte Buttons bleiben aktiv.
if (ctr.Name.Contains("Auftrag")) ctr.Enabled = true;
else ctr.Enabled = false;
}
break;
case BenutzerRolle.Admin:
this.groupBoxUpdate.Visible = false;
break;
case BenutzerRolle.Waschstrasse:
this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false;
this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false;
break;
case BenutzerRolle.Master:
break;
default:
break;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
_settings.Load();
this.WindowState = FormWindowState.Maximized;
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.panelMain.Width = this.Width - this.toolStripMenu.Right - 20;
this.panelMain.Location = new Point(this.toolStripMenu.Right, 0);
GetStatistik();
// GroupBoxen im PanelMain werden ausgeblendet
foreach (Control ctr in this.panelMain.Controls)
{
if (ctr.GetType() == typeof(GroupBox))
{
GroupBox gb = (GroupBox)ctr;
if(!gb.Name.Contains("Update") & !gb.Name.Contains("Statistik") & !gb.Name.Contains("Neuer"))
{
gb.Visible = false;
gb.Location = new Point(0, 0);
gb.Size = new Size(this.panelMain.Width, this.panelMain.Height);
}
}
}
this.Activate();
_fixedSize = this.Size;
}
private void Paint_Boarder(Size size, Point location, PaintEventArgs e)
{
Pen pen = new Pen(Color.FromArgb(1, 53, 101), 4);
Rectangle rect = new Rectangle(1, 2, size.Width - 4, size.Height - 4);
e.Graphics.DrawRectangle(pen, rect);
}
private void panelMain_Paint(object sender, PaintEventArgs e)
{
Paint_Boarder(this.panelMain.Size, this.panelMain.Location, e);
}
#region ToolStripButton_Click-Events
private void tSBBenutzerVW_Click(object sender, EventArgs e)
{
FormBenutzerVW benutzerVW = new FormBenutzerVW();
benutzerVW.ShowDialog();
}
private void toolStripBeenden_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void tSBAufgabeVW_Click(object sender, EventArgs e)
{
FormAufgabeVW aufgabeVW = new FormAufgabeVW();
aufgabeVW.ShowDialog();
}
private void toolStripZaehlscheine_Click(object sender, EventArgs e)
{
FormKundeVW kundedaten = new FormKundeVW(this.benutzer);
if (kundedaten.ShowDialog() == DialogResult.OK)
{
}
}
private void toolStripDB_Click(object sender, EventArgs e)
{
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, false);
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
}
private void tSBWaschstrasse1_Click(object sender, EventArgs e)
{
//FormWaschstrasse waschstrasse = new FormWaschstrasse(this.tSBWaschverlauf.Text);
//waschstrasse.ShowDialog();
//LISTVIEW MIT GEWASCHTEN FÄCHERN ERSTELLEN (KOMMT WENN BENUTZER = ADMIN)
}
private void toolStripButtonImport_Click(object sender, EventArgs e)
{
FormImport import = new FormImport();
import.ShowDialog();
}
private void tSBKosten_Click(object sender, EventArgs e)
{
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, true);
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
}
private void tSBEinstellung_Click(object sender, EventArgs e)
{
FormEinstellung einstellung = new FormEinstellung();
einstellung.ShowDialog();
}
private void toolStripStatusLabel2_DoubleClick(object sender, EventArgs e)
{
FormEinstellung einstellung = new FormEinstellung("Sortiment");
einstellung.ShowDialog();
}
private void tSBExpedit_Click(object sender, EventArgs e)
{
FormExpedit exp = new FormExpedit(benutzer);
exp.ShowDialog();
}
private void tSBAuftragVW_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
if (!this.groupBoxAuftrag.Visible)
{
if (benutzer.Rolle == BenutzerRolle.Fahrer) this.rBFertig.Checked = true;
else this.rBAlle.Checked = true;
// Groupbox einblenden wenn OLV noch nicht sichtbar ist.
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = gb.Name.Contains("Auftrag") ? true : false;
// PanelMain Buttons ausblenden.
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = false;
}
else
{
// Groupbox einblenden wenn OLV noch nicht sichtbar ist.
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = gb.Name.Contains("Auftrag") ? false : true;
// PanelMain Buttons ausblenden.
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = true;
}
this.Cursor = Cursors.Default;
}
private void tSBScannTest_Click(object sender, EventArgs e)
{
if (open)
{
this.groupBoxScannTest.Visible = false;
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = false;
open = false;
}
else
{
this.groupBoxScannTest.Visible = true;
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = true;
this.pictureBoxScannTest.Image = Image.FromFile("C:\\Users\\KilianWirl\\OneDrive - gehgassi GmbH\\Wäscherei Wirl\\Programme\\Deckungsbeitrag\\static-qr-code-ca1aa53ab47cd115bc1ad29afb0e5f22.png");
this.textBoxScannTest.Focus();
open = true;
}
}
private void tSBArtikelVW_Click(object sender, EventArgs e)
{
FormArtikelVW artikelVW = new FormArtikelVW();
artikelVW.ShowDialog();
}
#endregion
/// <summary>
/// TOOLSTRIP BUTTON DESIGN
/// </summary>
private void get_Border_Paint(object sender, PaintEventArgs e)
{
ToolStripItem item = (ToolStripItem)sender;
ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, item.Width, item.Height), Color.White, ButtonBorderStyle.Solid);
}
private void toolStrip_MouseEnter(object sender, EventArgs e)
{
if (sender.GetType() == typeof(ToolStripButton))
{
ToolStripButton tsb = (ToolStripButton)sender;
tsb.ForeColor = Color.FromArgb(1, 53, 101);
tsb.BackColor = Color.White;
}
}
private void toolStrip_MouseLeave(object sender, EventArgs e)
{
if (sender.GetType() == typeof(ToolStripButton))
{
ToolStripButton tsb = (ToolStripButton)sender;
tsb.ForeColor = Color.White;
tsb.BackColor = Color.FromArgb(1, 53, 101);
}
}
/// <summary>
/// Hilfe Events
///
/// </summary>
private void buttonNeueMaschine_HelpRequested(object sender, HelpEventArgs hlpevent)
{
MessageBox.Show($"Hier kannst du eine neue Maschine anlegen.{Environment.NewLine}{Environment.NewLine}Wenn du bei einer Maschine einen Trockner aus- oder einschalten willst musst du die Maschine doppelt anklicken.", "Hilfe", MessageBoxButtons.OK, MessageBoxIcon.Information);
} //Hilfe bei Maschine Button und Maschine Groupbox.
/// <summary>
/// Panel Main Control Funktionen
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonNeuerAuftrag_Click(object sender, EventArgs e)
{
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standart); neuerAuftrag.ShowDialog();
}
private void buttonScannTest_Click(object sender, EventArgs e)
{
string s = this.textBoxScannTest.Text;
int pos = s.IndexOf('#');
this.textBoxScannTest.Text = this.labelScannTest.Text = s.Substring(pos + 1);
}
private void buttonNeueAufgabe_Click(object sender, EventArgs e)
{
FormNeueAufgabe neueAufgabe = new FormNeueAufgabe();
neueAufgabe.ShowDialog();
}
private void buttonNeuerStand_Click(object sender, EventArgs e)
{
FormNeuerAuftrag neuerAuftrag;
DialogResult result = meldung.GetFrage(this, "Möchtest du eine Standverminderung oder Standerhöhung erstellen? \n\n [JA = Standverminerung | NEIN = Standerhöhung]", true);
switch (result)
{
case DialogResult.Cancel:
return;
case DialogResult.Yes:
neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standverminderung); neuerAuftrag.ShowDialog();
break;
case DialogResult.No:
neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standerhöhung); neuerAuftrag.ShowDialog();
break;
default:
break;
}
}
private void buttonNeueInventur_Click(object sender, EventArgs e)
{
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Inventur); neuerAuftrag.ShowDialog();
}
/// <summary>
/// Scan QR-Code Test.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void textBoxScannTest_TextChanged(object sender, EventArgs e)
{
TextBox textBox1 = (TextBox)sender;
using (Graphics g = textBox1.CreateGraphics())
{
SizeF size = g.MeasureString(textBox1.Text, textBox1.Font);
textBox1.Width = (int)size.Width + 10; // +10 als Puffer
}
}
/// <summary>
/// Update Events mit Button-Click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void buttonArtikelUpdate_Click(object sender, EventArgs e)
{
FormLaden laden = new FormLaden();
laden.Show();
List<Sortiment> sortiment = Funktionen.SortimentLesen("Liste");
sortiment = sortiment.GroupBy(a => a.ArtNr).Select(g => g.First()).ToList();
//TODO: Testen ob Get_ArtikelKurzliste funktioniert.
//List<Artikel> artikelkurzliste = Funktionen.Get_ArtikelKurzlisteFromDatei();
// Controls blockieren
progressBarArtikel.Value = 0;
progressBarArtikel.Visible = true;
// ProgressBar Maximum definieren
progressBarArtikel.Maximum = sortiment.Count();
tSBArtikelVW.Enabled = false;
// Fortschritt simulieren (z.B. Datenbankabfrage)
var progress = new Progress<int>(value => progressBarArtikel.Value = value);
await Task.Run(() =>
{
Update_Artikel(progress, sortiment);
//TODO: Einkommentieren wenn ArtikelUpdate auf ArtikelKurzliste umgestellt werden kann.
//Update_Artikel(progress, artikelkurzliste);
});
progressBarArtikel.Value = 0;
laden.Close();
this.Show();
//TODO: LadenScreen anzeigen etc.
}
private async void buttonSortimentUpdate_Click(object sender, EventArgs e)
{
//TODO: für Ladescreen den Progressbar programieren. (perplexity fragen wie der Status an einen anderen Screen übergeben werden kann)
// Form Laden anzeigen
FormLaden laden = new FormLaden();
laden.Show();
// Sortiment holen
List<Sortiment> sortiment = Funktionen.SortimentLesen("Liste");
// Controls blockieren
progressBarArtikel.Value = 0;
progressBarArtikel.Visible = true;
// ProgressBar Maximum definieren
progressBarArtikel.Maximum = sortiment.Count();
// Fortschritt simulieren (z.B. Datenbankabfrage)
var progress = new Progress<int>(value => progressBarArtikel.Value = value);
await Task.Run(() => Update_Sortiment(progress, sortiment));
progressBarArtikel.Value = 0;
//laden.Close();
//this.Show();
}
private void Update_Sortiment(IProgress<int> progress, List<Sortiment> sortiment)
{
int tosave = 0;
int saved = 0;
int artvorhanden = 0;
int anzahlkunden = 0;
string sortNr = string.Empty;
List<Kunde> kundenliste = Kunde.GetList(true, string.Empty);
// ProgressBar Maximum definieren
progressBarArtikel.Maximum = kundenliste.Count();
foreach (Kunde kunde in kundenliste)
{
// Fortschrittswert an die ProgressBar melden
progress.Report(++anzahlkunden);
//Jedes Innsbrucker Soziale Dienste Sortiment ist gleich.
if (kunde.KundeNummer == "010069" | kunde.KundeNummer == "010071") sortNr = "010068";
else sortNr = kunde.KundeNummer;
foreach (Sortiment sort in sortiment.FindAll(Sortiment => Sortiment.KundeNummer == sortNr))
{
KundeArtikel item = KundeArtikel.GetItemIfAvailable(Kunde.GetKundeID(sort.KundeNummer, null), sort.ArtNr);
if(item == null)
{
++tosave;
item = new KundeArtikel();
item.KundeID = Kunde.GetKundeID(sort.KundeNummer, null);
item.ArtikelNR = sort.ArtNr;
item.ArtikelName = sort.ArtName;
item.Stand = 0;
item.Fehlmenge = 0;
item.Korrektur = 0;
if (item.Save() == 1) saved++;
}
else ++artvorhanden;
}
}
// Überprüfung ob alle Zeilen gespeichert wurden.
if (tosave == saved)
{
meldung.Gespeichert();
meldung.VerarbeiteteDaten(saved, anzahlkunden, artvorhanden);
}
else meldung.Speicherfehler();
}
private void Update_Artikel(IProgress<int> progress, List<Sortiment> sortiment)
{
int i = 0;
//TODO: Artikel Update weiter testen und programmieren. Für ArtikelKurzliste ausprogrammieren.
foreach (Sortiment sort in sortiment)
{
// Fortschrittswert an die ProgressBar melden
progress.Report(++i);
if (sort.ArtNr != 0)
{
Artikel art = Artikel.GetArtikel(sort.ArtNr);
if (art.ArtikelID == null)
{
art = new Artikel();
art.Nummer = sort.ArtNr;
art.Bezeichnung = sort.ArtName;
art.Nachwaesche = 0;
art.Muellwaesche = 0;
art.LastReset = null;
//Switch für ArtikelKategorie
switch (sort.ArtNr)
{
case var nr when nr.ToString().StartsWith("63"):
art.Kategorie = ArtikelKategorie.Frottee;
break;
case var nr when nr.ToString().StartsWith("611"):
if (nr.ToString().StartsWith("61115") || nr.ToString().StartsWith("61116")) art.Kategorie = ArtikelKategorie.Spannleintuch;
else art.Kategorie = ArtikelKategorie.Grossteile;
break;
case var nr when nr.ToString().StartsWith("612"):
art.Kategorie = ArtikelKategorie.Kleinteile;
break;
default:
break;
}
//Erstellen der Shortbezeichnung für Buttons
if (art.Bezeichnung.Contains("DOPPEL") | art.Bezeichnung.Contains("D-")) art.Short = art.Short + "D-";
if (art.Bezeichnung.Contains("SPANN")) art.Short = art.Short + "SP";
if (art.Bezeichnung.Contains("LEINTUCH")) art.Short = art.Short + "LT";
if (art.Bezeichnung.Contains("SPANN"))
{
string[] s = art.Bezeichnung.Split(' ');
if (s.Length == 3) art.Short = art.Short + " " + s[2];
} //Farben zuordnen und zu Short hinzufügen
if (art.Bezeichnung.Contains("HANDTUCH")) art.Short = art.Short + "HT";
if (art.Bezeichnung.Contains("DUSCHTUCH")) art.Short = art.Short + "DT";
if (art.Bezeichnung.Contains("BADETUCH")) art.Short = art.Short + "BT";
if (art.Bezeichnung.Contains("BADEVORLEGER")) art.Short = art.Short + "BV";
if (art.Bezeichnung.Contains("BADEMANTEL")) art.Short = art.Short + "BM";
if (art.Bezeichnung.Contains("SAUNATUCH")) art.Short = art.Short + "ST";
if (art.Bezeichnung.Contains("GESICHTSTUCH")) art.Short = art.Short + "GT";
if (art.Bezeichnung.Contains("POLSTERBEZUG"))
{
art.Short = art.Short + "PB";
switch (art.Bezeichnung)
{
case var bez when bez.Contains("60x80"):
art.Short = art.Short + " 60x80";
break;
case var bez when bez.Contains("40x60"):
art.Short = art.Short + " 40x60";
break;
case var bez when bez.Contains("40x40"):
art.Short = art.Short + " 40x40";
break;
case var bez when bez.Contains("40x50"):
art.Short = art.Short + " 40x50";
break;
case var bez when bez.Contains("40x70"):
art.Short = art.Short + " 40x70";
break;
default:
break;
}
} //Größen zuordnen und zu Short hinzufügen
if (art.Bezeichnung.Contains("DECKENBEZUG")) art.Short = art.Short + "DB";
if (art.Bezeichnung.Contains("TISCHTUCH"))
{
art.Short = art.Short + "TT";
int index = art.Bezeichnung.IndexOf("x");
if (index > 0) art.Short = art.Short + art.Bezeichnung.Substring(index - 4, 8);
} //Tischtücher und Größen zuordnen und zu Short hinzufügen
if (art.Bezeichnung.Contains("MUNDSERVIETTE")) art.Short = art.Short + "MS";
if (art.Bezeichnung.Contains("DECKSERVIETTE")) art.Short = art.Short + "DS";
//Speichern jedes Artikels
art.Save();
}
else
{
art.Bezeichnung = sort.ArtName;
art.Save();
}
}
}
tSBArtikelVW.Enabled = true;
progressBarArtikel.Value = 0;
}
private void buttonAllUpdate_Click(object sender, EventArgs e)
{
//Update_Artikel();
}
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// Button-Click AufAbruf und Ausgeliefert sowie ItemsChecked
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonAusgeliefert_Click(object sender, EventArgs e)
{
int saved = 0;
int tosave = 0;
if (this.objectListViewAuftrag.CheckedItems.Count > 0)
{
if (meldung.AuftragAusgeliefert() == DialogResult.Yes)
{
foreach (OLVListItem item in this.objectListViewAuftrag.CheckedItems)
{
++tosave;
Auftrag a = (Auftrag)item.RowObject;
a.Erledigt = DateTime.Today;
a.ErledigtVon = this.benutzer.BenutzerID;
a.Status = AuftragStatus.Ausgeliefert;
if (a.Save()[0] == 1) ++saved;
}
if (saved == tosave) GetExpeditList(null);
}
}
}
private void buttonAufAbruf_Click(object sender, EventArgs e)
{
if (this.objectListViewAuftrag.CheckedItems.Count == 1)
{
if (meldung.AuftragAufAbruf() == DialogResult.Yes)
{
OLVListItem item = (OLVListItem)this.objectListViewAuftrag.CheckedItems[0];
Auftrag a = (Auftrag)item.RowObject;
a.Status = AuftragStatus.AufAbruf;
if (a.Save()[0] == 1) GetExpeditList(null);
}
}
else
{
meldung.NurEinAuftrag();
}
}
private void objectListViewAuftrag_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (this.objectListViewAuftrag.CheckedItems.Count > 0) this.buttonAusgeliefert.Visible = true;
if (this.objectListViewAuftrag.CheckedItems.Count == 1) this.buttonAufAbruf.Visible = true;
else this.buttonAufAbruf.Visible = false;
}
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// RadioButtons für Auftragsverwaltung & Laden der Auftragsliste nach Status.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton rB = (RadioButton)sender;
if (rB.Checked)
{
if (Enum.TryParse(rB.Name.Substring(2), out AuftragStatus status)) rB.Tag = (int)status;
else rB.Tag = null;
switch (rB.Tag)
{
case AuftragStatus.Abgeholt:
break;
case AuftragStatus.Aufgelegt:
break;
case AuftragStatus.Gewaschen:
break;
case AuftragStatus.Herrichten:
break;
case AuftragStatus.Vorbereitet:
GetExpeditList((int?)rB.Tag);
break;
case AuftragStatus.Fertig:
GetExpeditList((int?)rB.Tag);
break;
case AuftragStatus.Ausgeliefert:
GetExpeditList((int?)rB.Tag);
break;
case AuftragStatus.AufAbruf:
GetExpeditList((int?)rB.Tag);
break;
default:
GetExpeditList((int?)rB.Tag);
break;
}
}
}
private async void GetExpeditList(int? status)
{
this.objectListViewAuftrag.SuspendLayout();
this.objectListViewAuftrag.BeginUpdate();
List<Auftrag> alist = new List<Auftrag>();
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
try
{
await conn.OpenAsync();
alist = await Auftrag.GetStatusListAsync(status, conn);
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
}
if (alist.Count == 0) meldung.KeineAufträge();
else Load_OLV(alist); // Load_ListView(alist);
this.objectListViewAuftrag.EndUpdate();
this.objectListViewAuftrag.ResumeLayout();
}
/// <summary>
/// AUFTRAGSVERWALTUNG FUNKTIONEN
/// ObjectListView für Auftragsverwaltung laden.
/// </summary>
/// <param name="alist"></param>
private void Load_OLV(List<Auftrag> alist)
{
// Cursor auf Warte-Status setzen, um Benutzerfeedback zu geben
this.Cursor = Cursors.WaitCursor;
// Spalten erstellen nach Typ Auftrag.
Generator.GenerateColumns(this.objectListViewAuftrag, 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.CheckBoxes = true;
colFrottee.Width = 50;
colFrottee.AspectGetter = row => ((Auftrag)row).Abteilungen.HasFlag(AbteilungsStatus.Frottee);
var colKleinteile = new OLVColumn("Kleinteile", "Kleinteile");
colKleinteile.Text = "KT";
colKleinteile.DisplayIndex = 7;
colKleinteile.TextAlign = HorizontalAlignment.Center;
colKleinteile.CheckBoxes = true;
colKleinteile.Width = 50;
colKleinteile.AspectGetter = row => ((Auftrag)row).Abteilungen.HasFlag(AbteilungsStatus.Kleinteile);
var colGrosseTeile = new OLVColumn("Großteile", "Großteile");
colGrosseTeile.Text = "GT";
colGrosseTeile.DisplayIndex = 8;
colGrosseTeile.TextAlign = HorizontalAlignment.Center;
colGrosseTeile.CheckBoxes = true;
colGrosseTeile.Width = 50;
colGrosseTeile.AspectGetter = row => ((Auftrag)row).Abteilungen.HasFlag(AbteilungsStatus.Großteile);
this.objectListViewAuftrag.AllColumns.Add(colFrottee);
this.objectListViewAuftrag.AllColumns.Add(colKleinteile);
this.objectListViewAuftrag.AllColumns.Add(colGrosseTeile);
foreach (OLVColumn col in this.objectListViewAuftrag.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
this.objectListViewAuftrag.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;
this.objectListViewAuftrag.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;
}
}
// ========== IMAGE-LIST ZUWEISEN ==========
// SmallImageList für Icons in Detail-View (16x16 Pixel standard)
Program.imagelist.ImageSize = new Size(24, 24);
this.objectListViewAuftrag.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
this.objectListViewAuftrag.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!
this.objectListViewAuftrag.SetObjects(alist);
this.objectListViewAuftrag.RebuildColumns();
if (_settings.OLV_State != null) this.objectListViewAuftrag.RestoreState(_settings.OLV_State);
Funktionen.Columns_Resize(this.objectListViewAuftrag);
// Cursor auf Default-Status setzen, um Benutzerfeedback zu geben
this.Cursor = Cursors.Default;
}
private void FormMain_HelpButtonClicked(object sender, CancelEventArgs e)
{
string[] keys = {
"Aufgelegt",
"Hergerichtet",
"Fertig" };
string[] keytext = {
"Auftrag wurde erstellt aber noch nicht ferig hergerichtet",
"Auftrag wurde fertig hergerichtet aber nicht abgeschlossen. Containeranzahl kann noch bearbeitet werden.",
"Auftrag wurde abgeschlossen und kann nichtmehr bearbeitet werden."};
FormHelp help = new FormHelp(keys, keytext);
help.ShowDialog();
//e.Cancel = true;
}
private void tSBHilfe_Click(object sender, EventArgs e)
{
FormMain_HelpButtonClicked(this, null);
}
private void GetStatistik()
{
string[] statistik = { "Container gewaschen:", "Container hergerichtet:", "Container fertig:", "Kunden gewaschen:", "Kunden hergerichtet:", "Kunden abgeschlossen:" };
List<Auftrag> auftraglist = Auftrag.GetAuftragStatsListToday(this.dateTimePicker1.Value.Date);
for (int i = 1; i <= statistik.Length; i++)
{
foreach(Control ctr in this.tableLayoutPanelStatistik.Controls)
{
Label lbl;
if (ctr.GetType() == typeof(Label))
{
lbl = (Label)ctr;
if (lbl.Text.Contains("Statistik") && lbl.Text.Contains($"{i.ToString()}")) lbl.Text = statistik[i - 1].ToString();
if (lbl.Name.Contains("Zahl"))
{
int j = 0;
switch (lbl.Name)
{
case var s when s.Contains($"1"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j += a.Container;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"2"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j += a.ContainerClean;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"3"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j += a.ContainerClean;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"4"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j++;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"5"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j++;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"{i}"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j++;
lbl.Text = j.ToString();
break;
default:
break;
}
}
}
}
}
//this.groupBoxStatistik.Width = this.tableLayoutPanelStatistik.Right;
}
private void dateTimePicker1_CloseUp(object sender, EventArgs e)
{
GetStatistik();
}
/// <summary>
/// Drag & Drop für GroupBox.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void groupBox_Paint(object sender, PaintEventArgs e)
{
GroupBox gb = (GroupBox)sender;
base.OnPaint(e);
Funktionen.GetGroupBoxBoarder(gb, e);
gb.MouseDown += groupBox_MouseDown;
gb.MouseMove += groupBox_MouseMove;
gb.MouseUp += groupBox_MouseUp;
foreach(Control ctr in gb.Controls)
{
ctr.MouseDown += groupBox_MouseDown;
ctr.MouseMove += groupBox_MouseMove;
ctr.MouseUp += groupBox_MouseUp;
}
}
private void groupBox_MouseDown(object sender, MouseEventArgs e)
{
GroupBox gb;
if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender;
else
{
var ctr = (Control)sender;
gb = (GroupBox)ctr.Parent;
}
if (e.Button == MouseButtons.Left)
{
isDragging = true;
dragStartPoint = new Point(e.X, e.Y);
}
}
private void groupBox_MouseMove(object sender, MouseEventArgs e)
{
GroupBox gb;
if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender;
else
{
var ctr = (Control)sender;
gb = (GroupBox)ctr.Parent;
}
Panel panel = (Panel)gb.Parent;
if (isDragging)
{
// Neue Position berechnen, relativ zum ursprünglichen Klickpunkt
newLocation = gb.PointToScreen(dragStartPoint);
newLocation.X += e.X - dragStartPoint.X;
newLocation.Y += e.Y - dragStartPoint.Y;
// Optional: Keep inside form bounds
newLocation.X = Math.Max(0, Math.Min(panel.Width - gb.Width, newLocation.X));
newLocation.Y = Math.Max(0, Math.Min(panel.Height - gb.Height, newLocation.Y));
// Position des Controls setzen
newLocation = panel.PointToClient(newLocation);
}
}
private void groupBox_MouseUp(object sender, MouseEventArgs e)
{
GroupBox gb;
if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender;
else
{
var ctr = (Control)sender;
gb = (GroupBox)ctr.Parent;
}
if (e.Button == MouseButtons.Left)
{
isDragging = false;
gb.Location = newLocation;
}
Properties.Settings.Default.Location_GroupBoxStatistik_Main = gb.Location;
Properties.Settings.Default.Save();
}
/// <summary>
/// Drag & Drop für Buttons.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_MouseDown(object sender, MouseEventArgs e)
{
Button btn = (Button)sender;
if (btn != null && e.Button == MouseButtons.Left)
{
//btn.DoDragDrop(btn, DragDropEffects.Move);
dragStartPoint = e.Location;
isDragging = false;
}
}
private void panelMain_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Button)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private void panelMain_DragDrop(object sender, DragEventArgs e)
{
if (isDragging)
{
Button btn = e.Data.GetData(typeof(Button)) as Button;
if (btn != null)
{
Point p = this.panelMain.PointToClient(new Point(e.X, e.Y));
btn.Location = new Point(p.X - btn.Width / 2, p.Y - btn.Height / 2);
}
}
}
private void Button_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
var dx = Math.Abs(e.X - dragStartPoint.X);
var dy = Math.Abs(e.Y - dragStartPoint.Y);
if (!isDragging && (dx > SystemInformation.DragSize.Width || dy > SystemInformation.DragSize.Height))
{
isDragging = true;
var btn = sender as Button;
btn.DoDragDrop(btn, DragDropEffects.Move);
}
}
}
/// <summary>
/// Buttons auf MainPanel. Schnellzugriff für Neuer User und Neuer Auftrag.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonNeuerUser_Click(object sender, EventArgs e)
{
FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer();
neuerBenutzer.ShowDialog();
}
/// <summary>
/// Settings speichern bei Form_Closing.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main = this.buttonNeuerAuftrag.Location;
Properties.Settings.Default.Location_ButtonNeuerUser_Main = this.buttonNeuerUser.Location;
Properties.Settings.Default.Location_GroupBoxStatistik_Main = this.groupBoxStatistik.Location;
Properties.Settings.Default.Save();
_settings.OLV_State = this.objectListViewAuftrag.SaveState();
_settings.Save();
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Speichern" + ex.Message);
}
}
private void FormMain_ResizeBegin(object sender, EventArgs e)
{
_handlingResize = true;
this.Size = _fixedSize;
_handlingResize = false;
}
private void FormMain_Resize(object sender, EventArgs e)
{
if (_handlingResize) return;
if(this.Size != _fixedSize)
{
_handlingResize = true;
this.Size = _fixedSize;
_handlingResize = false;
}
}
private void tSBTourenplanung_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
FormTourenplanung tourenplanung = new FormTourenplanung(this.benutzer);
tourenplanung.ShowDialog();
this.Cursor = Cursors.Default;
}
}
}
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.
//CHANGES: Auftragverwaltung Spalten wurden aktualisiert. Mit Icons, Buttons und Sortierung auf Liefertag.
//DONE: 2 neue Buttons für "Neue Inventur" und "Neue Standveränderung"
//DONE: Bei Fahrer neue Deaktivierung von Controls.