using BrightIdeasSoftware; using DatenDB; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using System.Xml.Resolvers; namespace Deckungsbeitrag { public partial class FormExpedit : Form { public Fehlermeldungen fehlermeldung = new Fehlermeldungen(); 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; Fehlermeldungen meldung = new Fehlermeldungen(); public List artikelListe; public List auftraglist; public List sonderlist; int beforeedit = 0; int? neuecontclean = null; int? altecontclean = null; Timer timer1 = new Timer(); private Screen[] screens; private Point itemlocation; public FormExpedit(Benutzer benutzer) { InitializeComponent(); this.benutzer = benutzer; this.StartPosition = FormStartPosition.CenterScreen; this.tabControlAuftragList.Visible = true; //Timer für Autorefresh timer1.Interval = 10000; // 10 Sekunden timer1.Tick += Timer1_Tick; timer1.Start(); } 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); } } } } private void FormExpedit_Load(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; this.SuspendLayout(); // Controls aktivieren und deaktivieren nach BenutzerRolle switch (this.benutzer.Rolle) { case BenutzerRolle.Verwaltung: this.buttonDrucken.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; this.groupBoxEtikett.Enabled = false; //TODO: Testen ob ausblenden der Button Column funktioniert. Benutzer-Verwaltung oder Frottee oder Flach notwendig. GetUnvisibleButtonColumn(); break; case BenutzerRolle.Fahrer: this.buttonDrucken.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; this.groupBoxEtikett.Enabled = false; GetUnvisibleButtonColumn(); break; case BenutzerRolle.Admin: break; case BenutzerRolle.Waschstrasse: this.buttonDrucken.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; this.groupBoxEtikett.Enabled = false; GetUnvisibleButtonColumn(); break; case BenutzerRolle.Master: break; case BenutzerRolle.Expedit: break; case BenutzerRolle.Frottee: this.buttonDrucken.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; this.groupBoxEtikett.Enabled = false; GetUnvisibleButtonColumn(); break; case BenutzerRolle.Flach: this.buttonDrucken.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonSWS_Drucken.Enabled = false; this.groupBoxEtikett.Enabled = false; // WENN Rolle Frottee (Expedit Frottee) dann ButtonClick deaktiviert. Nur Expedit kann abschließen GetUnvisibleButtonColumn(); break; default: break; } //Auftragslisten erstellen und in ObjectListViews laden. GetLists(); Load_Etikett_GroupBox(); if (letzterLiefertag != null) this.dTPLiefertag.Value = (DateTime)letzterLiefertag; else this.dTPLiefertag.Value = DateTime.Today.AddDays(1); if (this.kunde != null) Funktionen.Get_RadioButtons(this.groupBoxEtikett); this.ResumeLayout(); Cursor.Current = Cursors.Default; WindowState = FormWindowState.Maximized; } private void GetUnvisibleButtonColumn() { foreach (OLVColumn col in this.objectListViewAuftrag.Columns) if (col.IsButton) col.IsVisible = false; } /// /// Auftragslisten erstellen und in ObjectListViews laden. /// private void GetLists() { // Lade die ListView für Aufträge vom aktuellen Tag. auftraglist = Auftrag.GetAuftragListToday(DateTime.Today); OLV_Load(this.objectListViewAuftrag, auftraglist); // Lade die ListView für Sonderaufträge wie STV, STH, oder INVENTUR sonderlist = Auftrag.GetExpeditLists((int)AuftragTyp.Inventur); if (sonderlist.Count == 0) { this.tabControlAuftragList.TabPages.Remove(tabPageSonder); } else { OLV_Load(this.objectListViewSonder, sonderlist); if(this.tabControlAuftragList.TabPages.Count < 2) this.tabControlAuftragList.TabPages.Insert(1, tabPageSonder); } // Lade die Artikel eines Kunden. //if (kunde!= null) this.artikelListe = KundeArtikel.GetList(kunde.KundeID.ToString()); } /// /// Wenn Timer abgelaufen Funktion für Autorefresh. /// /// /// private void Timer1_Tick(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; if(auftrag != null) { Auftrag _auftrag = Auftrag.GetAuftrag(auftrag.AuftragID); Load_Gridview(_auftrag); } Cursor.Current = Cursors.Default; } /// /// Laden Events (GroupBox_Etikett und GridView) /// private void Load_Etikett_GroupBox() { if (this.auftrag == null) { this.buttonKundeNr.Text = "Auftrag in der Liste wählen"; this.pictureBoxEntwurf.Image = null; this.textBoxCont.Text = "0"; this.pictureBoxMinus.Enabled = this.pictureBoxPlus.Enabled = this.buttonDrucken.Enabled = false; this.buttonDrucken.BackColor = Color.Gray; this.pictureBoxMinus.BackColor = Color.Gray; this.pictureBoxPlus.BackColor = Color.Gray; foreach (Control ctr in this.groupBoxEtikett.Controls) { if (ctr.GetType() == typeof(Label)) ctr.Enabled = true; else if (ctr.Enabled == true) ctr.Enabled = false; } this.dTPLiefertag.Enabled = true; } else { //Kunde holen und Name anzeigen this.kunde = Kunde.GetKunde(null, this.auftrag.KundeID, null); this.buttonKundeNr.Text = kunde.Suchtext; //Containeranzahl und Liefertag anzeigen if (neuecontclean != null) this.textBoxCont.Text = neuecontclean.ToString(); else this.textBoxCont.Text = this.auftrag.ContainerClean.ToString(); this.dTPLiefertag.Value = this.auftrag.Liefertag; this.dTPLiefertag.Enabled = false; //Buttons Enablen und BackColor wechsel this.buttonDrucken.BackColor = Color.FromArgb(0, 192, 0); this.pictureBoxPlus.BackColor = Color.FromArgb(0, 192, 0); this.buttonDrucken.Enabled = this.pictureBoxPlus.Enabled = true; this.auftrag.ContainerClean = int.Parse(this.textBoxCont.Text); etikett = Funktionen.Etikett_Entwurf(this, this.auftrag, nocont); this.pictureBoxEntwurf.Image = etikett; } } private void Load_Gridview(Auftrag auftrag) { //Alle Einträge der DataGridView entfernen. Davor muss die DataSource entfernt werden. this.dGArtikel.DataSource = null; this.dGArtikel.Rows.Clear(); if (auftrag != null) { Aufgabe auf; if (auftrag.AufgabeID.HasValue) auf = Aufgabe.GetAufgabe(null, auftrag.AufgabeID); else auf = new Aufgabe(); this.dGArtikel.AutoGenerateColumns = false; foreach (DataGridViewColumn col in this.dGArtikel.Columns) { col.DataPropertyName = col.Name; if (col.Name.Contains("Bearbeitet")) col.Visible = false; if (col.Name == "Fehlmenge") { if (auf.Bezeichnung == null || auf.Bezeichnung == "STA") col.Visible = true; else col.Visible = false; } if (col.Name == "Korrektur") { if (auf.Bezeichnung != null && auf.Bezeichnung != "STA") col.Visible = true; else col.Visible = false; } } // DataGridView mit ArtikelStand Liste verbinden und Columns automatisch generieren. artikelListe = KundeArtikel.GetList(auftrag.KundeID.ToString()); this.dGArtikel.DataSource = artikelListe; this.dGArtikel.ClearSelection(); //this.dGArtikel.CurrentCell = this.dGArtikel.Rows[0].Cells[3]; // Alle Spaltenbreiten an den Zellinhalt anpassen this.dGArtikel.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // Alle Zeilenhöhen an Zellinhalt anpassen this.dGArtikel.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; this.dGArtikel = Funktionen.DGV_Size_Anpassen(this.dGArtikel); this.dGArtikel.Location = new Point(this.tabControlAuftragList.Right - dGArtikel.Width, this.dGArtikel.Location.Y); if (this.dGArtikel.Rows.Count > 0) this.dGArtikel.Visible = true; else this.dGArtikel.Visible = false; } } /// /// Containeranzahl bearbeiten und Funktion wenn Text geändert wird. /// /// /// private void Container_Click(object sender, EventArgs e) { PictureBox pb = (PictureBox)sender; int cont = int.Parse(this.textBoxCont.Text); if (pb.Name.ToString().Contains("Plus")) { cont++; } if (pb.Name.ToString().Contains("Minus")) { if (cont > 0) { cont--; } //else { pb.BackColor = Color.Gray; pb.Enabled = false; } } this.textBoxCont.Text = cont.ToString(); //Load_Etikett_GroupBox(); } private void textBoxCont_TextChanged(object sender, EventArgs e) { if(int.TryParse(this.textBoxCont.Text, out int result)) { if (this.auftrag != null) { neuecontclean = result; altecontclean = this.auftrag.ContainerClean; } if (result == 0) { this.pictureBoxMinus.Enabled = false; this.pictureBoxMinus.BackColor = Color.Gray; } else { this.pictureBoxMinus.Enabled = true; this.pictureBoxMinus.BackColor = Color.Red; } if (!nocontclicked) { if (result >= 10) { nocont = true; cBNoCont.Checked = true; } else { nocont = false; cBNoCont.Checked = false; } } Load_Etikett_GroupBox(); } else { meldung.Eingabefehler(); this.textBoxCont.Text = "0"; this.textBoxCont.Focus(); } } private void cBNoCont_CheckedChanged(object sender, EventArgs e) { if (cBNoCont.Checked) nocont = true; else nocont = false; if (kunde != null) Load_Etikett_GroupBox(); } private void cBNoCont_Click(object sender, EventArgs e) { if (cBNoCont.Checked) nocont = nocontclicked = true; else { nocont = false; nocontclicked = true; } } /// /// Button Events (SWS-Drucken, Etikette-Drucken, Kundeauswahl, Abbrechen) /// /// /// private void buttonDrucken_Click(object sender, EventArgs e) { //AUFTRAG UPDATE this.auftrag.ContainerClean = int.Parse(this.textBoxCont.Text); letzterLiefertag = this.auftrag.Liefertag = this.dTPLiefertag.Value; //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; FormExpedit_Load(this, e); this.dGArtikel.DataSource = null; this.dGArtikel.Rows.Clear(); } //AUFTRAG SPEICHERN } private void buttonNeuerAuftrag_Click(object sender, EventArgs e) { FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(benutzer, this.letzterLiefertag); if (neuerAuftrag.ShowDialog() == DialogResult.OK) { this.letzterLiefertag = neuerAuftrag.letzterLiefertag; List auftraglist = Auftrag.GetAuftragListToday(DateTime.Today); OLV_Load(this.objectListViewAuftrag, auftraglist); } } private void buttonSWS_Drucken_Click(object sender, EventArgs e) { Kunde knd = Funktionen.KundenAuswahl(); if(knd != null) Funktionen.SWS_Drucken(null, knd, this); } private void buttonAbbrechen_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Close(); } /// /// ObjectListView Funktionen /// private void objectListViewAuftrag_CellClick(object sender, CellClickEventArgs e) { itemlocation = new Point(e.Location.X, e.Location.Y); if(e.Model == null) return; ObjectListView olv = (ObjectListView)sender; Auftrag _auftrag = (Auftrag)e.Model; if (_auftrag.Status != AuftragStatus.Fertig) { this.auftrag = _auftrag; this.neuecontclean = null; Load_Etikett_GroupBox(); this.artikelListe = KundeArtikel.GetList(kunde.KundeID.ToString()); Load_Gridview(this.auftrag); } else { fehlermeldung.AuftragFertig(); } foreach (Control ctr in this.groupBoxEtikett.Controls) if (ctr.Enabled == false) ctr.Enabled = true; this.buttonKundeNr.Enabled = false; olv.Focus(); } private void objectListViewAuftrag_ButtonClick(object sender, CellClickEventArgs e) { Cursor.Current = Cursors.WaitCursor; ObjectListView olv = (ObjectListView)sender; Auftrag _auftrag = (Auftrag)e.Model; if (this.auftrag != _auftrag) neuecontclean = null; this.auftrag = _auftrag; //Load_Etikett_GroupBox(); if (this.auftrag.ContainerClean == 0) { switch (this.auftrag.Typ) { case AuftragTyp.Unbekannt: break; case AuftragTyp.Standart: if (meldung.NoCleanContainer() == DialogResult.OK) return; break; case AuftragTyp.Inventur: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; Load_Etikett_GroupBox(); } else return; break; case AuftragTyp.Standverminderung: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; Load_Etikett_GroupBox(); } else return; break; case AuftragTyp.Standerhöhung: if (meldung.SonderNoCleanContainer() == DialogResult.Yes) { this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; Load_Etikett_GroupBox(); } else return; break; default: break; } } else { if (neuecontclean != null && neuecontclean != altecontclean) { switch (meldung.DifferentCleanContainer()) { case DialogResult.Cancel: break; 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; this.auftrag.Status = AuftragStatus.Fertig; 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) { this.auftrag.Save(); this.auftrag = null; } } 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; this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; } break; default: break; } } else { this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); this.auftrag = null; Load_Etikett_GroupBox(); } } olv.RefreshObject(e); GetLists(); if (olv.Name.Contains("Sonder")) OLV_Load(olv, this.sonderlist); else OLV_Load(olv, this.auftraglist); Load_Gridview(this.auftrag); Cursor.Current = Cursors.Default; } private void OLV_Load(ObjectListView olv, List auftraglist) { Cursor.Current = Cursors.WaitCursor; olv.SuspendLayout(); olv.BeginUpdate(); Generator.GenerateColumns(olv, typeof(Auftrag), true); olv.SetObjects(auftraglist); OLVColumn sortcolumn = (OLVColumn)olv.Columns[5]; olv.Sort(sortcolumn); OLVColumn buttonColumn = new OLVColumn(); buttonColumn = (OLVColumn)olv.Columns[10]; buttonColumn.IsButton = true; buttonColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; olv.CheckedAspectName = "IsChecked"; Funktionen.Columns_Resize(olv); olv.Columns[0].Width = 0; olv.Columns[7].Width = 0; olv.Columns[8].Width = 0; olv.Columns[9].Width = 0; if (olv.Name.Contains("Auftrag")) { this.labelauftragtag.Text = olv.Items.Count.ToString(); int summe = 0; foreach(var obj in olv.Objects) { Auftrag auf = (Auftrag)obj; if(auf.Erstellt.Value.Date == DateTime.Now.Date) summe += auf.ContainerClean; } this.labelcontainertag.Text = summe.ToString(); } olv.EndUpdate(); olv.ResumeLayout(); Cursor.Current = Cursors.Default; } /// /// Liefertag wird ermittelt und in Day of Week umgerechnet. RadioButtons werden Checked oder Unchecked und Click wird registriert. /// private void dTPLiefertag_Leave(object sender, EventArgs e) { foreach (RadioButton liefertag in this.groupBoxEtikett.Controls.OfType()) { if (liefertag.Name.Contains(((Liefertag)dTPLiefertag.Value.DayOfWeek).ToString())) liefertag.Checked = true; } } private void Liefertag_rB_Checked(object sender, EventArgs e) { //TODO: OLV-Item refresh. Neuer Liefertag speichern. foreach (RadioButton radioButton in this.groupBoxEtikett.Controls.OfType()) { if (radioButton.Checked) radioButton.BackColor = Color.Yellow; else { radioButton.BackColor = Color.Gray; } } } private void Liefertag_rB_Click(object sender, EventArgs e) { RadioButton radioButton = (RadioButton)sender; foreach (Liefertag tag in Enum.GetValues(typeof(Liefertag))) { if (radioButton.Name.Contains(tag.ToString())) this.dTPLiefertag.Value = Berechnungen.GetNextWeekday((int)tag); } this.dTPLiefertag.Enabled = false; } private void dTPLiefertag_ValueChanged(object sender, EventArgs e) { dTPLiefertag_Leave(sender, e); if (this.auftrag != null) { this.auftrag.Liefertag = this.dTPLiefertag.Value; this.auftrag.Save(); Load_Etikett_GroupBox(); this.objectListViewAuftrag.RefreshObject(this.auftrag); } } /// /// Wenn das dritte Tab gewählt ist, wird die GroupBox Etikett ausgeblendet. 3.Tab wäre für vergangene Aufträge - weshalb kein Etikett mehr notwendig. /// /// /// private void tabControlAuftragList_Selected(object sender, TabControlEventArgs e) { TabControl tabControl = (TabControl)sender; if(tabControl.SelectedIndex < 3) { this.groupBoxEtikett.Visible = true; } if(tabControl.SelectedIndex == 3) { this.groupBoxEtikett.Visible = false; } } /// /// Vor Beginn der Editierung wird Wert gespeichert um nach der Editierung vergleichen und eventuell speichern zu können. /// /// /// private void dGArtikel_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView dataGrid = sender as DataGridView; beforeedit = int.Parse(dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()); } private void dGArtikel_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DataGridView dgV = (DataGridView)sender; // Aktuelle Zeile holen var row = dgV.Rows[e.RowIndex]; var cell = row.Cells[e.ColumnIndex]; // Werte aus der Zeile auslesen KundeArtikel stand = KundeArtikel.GetItem((int)row.Cells[0].Value); if (cell.ColumnIndex == 4) { stand.Stand = int.Parse(row.Cells[4].Value.ToString()); stand.StandBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (cell.ColumnIndex == 5) { stand.Fehlmenge = int.Parse(row.Cells[5].Value.ToString()); stand.FehlmengeBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (cell.ColumnIndex == 6) { if (int.Parse(row.Cells[6].Value.ToString()) == 0) { stand.Stand = stand.Stand + beforeedit; stand.Korrektur = int.Parse(row.Cells[6].Value.ToString()); stand.StandBearbeitet = stand.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } } // Hier kannst du die Werte speichern, z.B. in Datenbank oder Liste if (stand.Save() != 1) meldung.Speicherfehler(); else Load_Gridview(this.auftrag); } private void dGArtikel_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.ColumnIndex >= 5) { DataGridView dgv = (DataGridView)sender; DataGridViewCell dgc = dgv.CurrentCell; if (!int.TryParse(dgc.EditedFormattedValue.ToString(), out int i)) { meldung.Eingabefehler(); e.Cancel = true; } } } /// /// Beim Wechsel der Tabs wird die DataGridView geleert. /// /// /// private void tabControlAuftragList_SelectedIndexChanged(object sender, EventArgs e) { this.dGArtikel.DataSource = null; this.dGArtikel.Rows.Clear(); } private void buttonEinstellung_Click(object sender, EventArgs e) { FormEinstellung einstellung = new FormEinstellung(this); einstellung.ShowDialog(); } } }