diff --git a/AA-Forms/FormArtikelVW.Designer.cs b/AA-Forms/FormArtikelVW.Designer.cs index 364c956..d55098a 100644 --- a/AA-Forms/FormArtikelVW.Designer.cs +++ b/AA-Forms/FormArtikelVW.Designer.cs @@ -61,10 +61,10 @@ this.objectListViewArtikel.UseCompatibleStateImageBehavior = false; this.objectListViewArtikel.UseFiltering = true; this.objectListViewArtikel.View = System.Windows.Forms.View.Details; - this.objectListViewArtikel.ButtonClick += new System.EventHandler(this.objectListViewArtikel_ButtonClick); - this.objectListViewArtikel.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.objectListViewArtikel_CellEditFinished); - this.objectListViewArtikel.CellEditStarting += new BrightIdeasSoftware.CellEditEventHandler(this.objectListViewArtikel_CellEditStarting); - this.objectListViewArtikel.Resize += new System.EventHandler(this.objectListViewArtikel_Resize); + this.objectListViewArtikel.ButtonClick += new System.EventHandler(this.ObjectListViewArtikel_ButtonClick); + this.objectListViewArtikel.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.ObjectListViewArtikel_CellEditFinished); + this.objectListViewArtikel.CellEditStarting += new BrightIdeasSoftware.CellEditEventHandler(this.ObjectListViewArtikel_CellEditStarting); + this.objectListViewArtikel.Resize += new System.EventHandler(this.ObjectListViewArtikel_Resize); // // fLPSuche // @@ -85,7 +85,7 @@ this.comboBoxArtikel.Name = "comboBoxArtikel"; this.comboBoxArtikel.Size = new System.Drawing.Size(261, 33); this.comboBoxArtikel.TabIndex = 0; - this.comboBoxArtikel.SelectedIndexChanged += new System.EventHandler(this.comboBoxArtikel_SelectedIndexChanged); + this.comboBoxArtikel.SelectedIndexChanged += new System.EventHandler(this.ComboBoxArtikel_SelectedIndexChanged); // // FormArtikelVW // diff --git a/AA-Forms/FormArtikelVW.cs b/AA-Forms/FormArtikelVW.cs index e534879..ef5d709 100644 --- a/AA-Forms/FormArtikelVW.cs +++ b/AA-Forms/FormArtikelVW.cs @@ -18,9 +18,8 @@ namespace Deckungsbeitrag { public partial class FormArtikelVW : Form { - private Benutzer user; + private readonly Benutzer user; private List artikelList; - private List artNWList; private int dropdownWidth; public FormArtikelVW() { @@ -35,7 +34,7 @@ namespace Deckungsbeitrag { List artlist = Artikel.GetArtikelList("Nachwaesche"); - this.comboBoxArtikel.SelectedIndexChanged -= comboBoxArtikel_SelectedIndexChanged; + this.comboBoxArtikel.SelectedIndexChanged -= ComboBoxArtikel_SelectedIndexChanged; this.comboBoxArtikel.DataSource = artlist; this.comboBoxArtikel.DisplayMember = "Bezeichnung"; foreach (Artikel art in artlist) @@ -45,7 +44,7 @@ namespace Deckungsbeitrag } this.comboBoxArtikel.DropDownWidth = dropdownWidth; this.comboBoxArtikel.SelectedIndex = -1; - this.comboBoxArtikel.SelectedIndexChanged += comboBoxArtikel_SelectedIndexChanged; + this.comboBoxArtikel.SelectedIndexChanged += ComboBoxArtikel_SelectedIndexChanged; OLV_Load_with_Artikel(); @@ -64,7 +63,7 @@ namespace Deckungsbeitrag Artikel art = (Artikel)item.RowObject; sum += art.Nachwaesche; } - group.Header = $"{group.Header} (Anzahl: {sum.ToString()})"; + group.Header = $"{group.Header} (Anzahl: {sum})"; } } @@ -115,7 +114,7 @@ namespace Deckungsbeitrag //buttonColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; } - OLV_ColumnsResize(this.objectListViewArtikel); + OLV_ColumnsResize(); } /// @@ -143,27 +142,28 @@ namespace Deckungsbeitrag KndArtID = kndart.KundeArtikelID, KundeID = kndart.KundeID, KndNummer = knd.KundeNummer, - Kunde = knd.Suchtext == null ? knd.KundeName : knd.Suchtext, - Nachwaesche = kndart.Fehlmenge + Kunde = knd.Suchtext ?? knd.KundeName, + Nachwaesche = kndart.Fehlmenge, + Reklamation = kndart.Reklamation }); } this.objectListViewArtikel.SetObjects(NWDataList); this.objectListViewArtikel.Refresh(); - OLV_ColumnsResize(this.objectListViewArtikel); + OLV_ColumnsResize(); this.ResumeLayout(); this.Cursor = Cursors.Default; } - private void OLV_ColumnsResize(ObjectListView olv) + private void OLV_ColumnsResize() { this.objectListViewArtikel.FilterMenuBuildStrategy = new MeinFilterMenu(); this.objectListViewArtikel.Width = Funktionen.Columns_Resize(null, objectListViewArtikel).olv.Width + 20; this.objectListViewArtikel.Refresh(); } - private void objectListViewArtikel_ButtonClick(object sender, CellClickEventArgs e) + private void ObjectListViewArtikel_ButtonClick(object sender, CellClickEventArgs e) { Artikel artikel = (Artikel)e.Model; artikel.Nachwaesche = 0; @@ -171,7 +171,7 @@ namespace Deckungsbeitrag if(artikel.Save() == 1) this.objectListViewArtikel.RefreshObject(e.Model); } - private void objectListViewArtikel_AfterCreatingGroups(object sender, CreateGroupsEventArgs e) + private void ObjectListViewArtikel_AfterCreatingGroups(object sender, CreateGroupsEventArgs e) { foreach (OLVGroup group in this.objectListViewArtikel.OLVGroups) { @@ -182,12 +182,12 @@ namespace Deckungsbeitrag Artikel art = (Artikel)item.RowObject; sum += art.Nachwaesche; } - group.Header = $"{group.Header} (Anzahl: {sum.ToString()})"; + group.Header = $"{group.Header} (Anzahl: {sum})"; } } - private void objectListViewArtikel_CellEditFinished(object sender, CellEditEventArgs e) + private void ObjectListViewArtikel_CellEditFinished(object sender, CellEditEventArgs e) { OLVColumn col = e.Column; DateTime timestamp = DateTime.Now.Date; @@ -249,13 +249,12 @@ namespace Deckungsbeitrag this.objectListViewArtikel.RefreshObject(e.RowObject); } - private void objectListViewArtikel_CellEditStarting(object sender, CellEditEventArgs e) + private void ObjectListViewArtikel_CellEditStarting(object sender, CellEditEventArgs e) { - OLVColumn col = e.Column; if (e.Control is NumericUpDown numeric) { numeric.Select(0, Text.Length); numeric.Focus(); } } #endregion - private void comboBoxArtikel_SelectedIndexChanged(object sender, EventArgs e) + private void ComboBoxArtikel_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; Artikel art = cb.SelectedItem as Artikel; @@ -263,9 +262,10 @@ namespace Deckungsbeitrag OLV_Load_with_Kunden(art); } - private void objectListViewArtikel_Resize(object sender, EventArgs e) + private void ObjectListViewArtikel_Resize(object sender, EventArgs e) { this.ClientSize = new Size(this.objectListViewArtikel.Width + this.objectListViewArtikel.Left, this.ClientSize.Height); } } } +//CHANGES: Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel. \ No newline at end of file diff --git a/AA-Forms/FormAufleger.Designer.cs b/AA-Forms/FormAufleger.Designer.cs index 40f50f4..dde8d16 100644 --- a/AA-Forms/FormAufleger.Designer.cs +++ b/AA-Forms/FormAufleger.Designer.cs @@ -105,7 +105,7 @@ this.labelContT5.Tag = "FR"; this.labelContT5.Text = "0"; this.labelContT5.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.labelContT5.DoubleClick += new System.EventHandler(this.labelCont_DoubleClick); + this.labelContT5.DoubleClick += new System.EventHandler(this.LabelCont_DoubleClick); // // labelContT4 // @@ -122,7 +122,7 @@ this.labelContT4.Tag = "DO"; this.labelContT4.Text = "0"; this.labelContT4.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.labelContT4.DoubleClick += new System.EventHandler(this.labelCont_DoubleClick); + this.labelContT4.DoubleClick += new System.EventHandler(this.LabelCont_DoubleClick); // // labelContT3 // @@ -139,7 +139,7 @@ this.labelContT3.Tag = "MI"; this.labelContT3.Text = "0"; this.labelContT3.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.labelContT3.DoubleClick += new System.EventHandler(this.labelCont_DoubleClick); + this.labelContT3.DoubleClick += new System.EventHandler(this.LabelCont_DoubleClick); // // labelContT2 // @@ -156,7 +156,7 @@ this.labelContT2.Tag = "DI"; this.labelContT2.Text = "0"; this.labelContT2.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.labelContT2.DoubleClick += new System.EventHandler(this.labelCont_DoubleClick); + this.labelContT2.DoubleClick += new System.EventHandler(this.LabelCont_DoubleClick); // // labelContT1 // @@ -173,7 +173,7 @@ this.labelContT1.Tag = "MO"; this.labelContT1.Text = "0"; this.labelContT1.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.labelContT1.DoubleClick += new System.EventHandler(this.labelCont_DoubleClick); + this.labelContT1.DoubleClick += new System.EventHandler(this.LabelCont_DoubleClick); // // fLP_T5 // @@ -324,7 +324,7 @@ this.textBoxScan.Name = "textBoxScan"; this.textBoxScan.Size = new System.Drawing.Size(268, 46); this.textBoxScan.TabIndex = 25; - this.textBoxScan.TextChanged += new System.EventHandler(this.textBoxScan_TextChanged); + this.textBoxScan.TextChanged += new System.EventHandler(this.TextBoxScan_TextChanged); // // buttonCloseForm // @@ -342,7 +342,7 @@ this.buttonCloseForm.TabIndex = 27; this.buttonCloseForm.Text = "Schließen"; this.buttonCloseForm.UseVisualStyleBackColor = false; - this.buttonCloseForm.Click += new System.EventHandler(this.buttonCloseForm_Click); + this.buttonCloseForm.Click += new System.EventHandler(this.ButtonCloseForm_Click); // // labelVersion // diff --git a/AA-Forms/FormAufleger.cs b/AA-Forms/FormAufleger.cs index e96a537..30f80d3 100644 --- a/AA-Forms/FormAufleger.cs +++ b/AA-Forms/FormAufleger.cs @@ -16,26 +16,27 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; -using System.Windows.Input; namespace Deckungsbeitrag { public partial class FormAufleger : Form { private Dictionary> auftragliste; - private System.Windows.Forms.Timer timer; + private readonly System.Windows.Forms.Timer timer; private Auftrag auftrag; - private Meldungen meldung = new Meldungen(); + private readonly Meldungen meldung = new Meldungen(); private bool iswechsel = false; - private string userid; + private readonly string userid; public FormAufleger() { InitializeComponent(); // Timer für Wartezeit bis TextChanged eintritt. - timer = new System.Windows.Forms.Timer(); - timer.Interval = 700; // 0,7 Sekunden + timer = new System.Windows.Forms.Timer + { + Interval = 700 // 0,7 Sekunden + }; timer.Tick += Timer_Tick; } @@ -119,8 +120,10 @@ namespace Deckungsbeitrag int anzUCA = 0; foreach (Auftrag auftrag in liste) { - UCAuftrag uca = new UCAuftrag(auftrag); - uca.Tag = auftrag; + UCAuftrag uca = new UCAuftrag(auftrag) + { + Tag = auftrag + }; if (auftrag.Status == AuftragStatus.Aufgelegt) { @@ -194,7 +197,7 @@ namespace Deckungsbeitrag try { await conn.OpenAsync(); - auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragTyp.Standart, AuftragStatus.Aufgelegt); + auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragStatus.Aufgelegt); } finally { @@ -229,7 +232,7 @@ namespace Deckungsbeitrag return base.ProcessDialogKey(keyData); } - private void textBoxScan_TextChanged(object sender, EventArgs e) + private void TextBoxScan_TextChanged(object sender, EventArgs e) { // TextChanged tritt nur ein wenn x Sekunden keine Eingabe erfolgt. Logik befindet sich in Timer_Tick timer.Stop(); // Alten Timer beenden @@ -285,7 +288,7 @@ namespace Deckungsbeitrag } private void SucheAuftrag() { - this.textBoxScan.TextChanged -= textBoxScan_TextChanged; + this.textBoxScan.TextChanged -= TextBoxScan_TextChanged; foreach (FlowLayoutPanel flp in this.tLPAuftrag.Controls.OfType()) { @@ -305,7 +308,7 @@ namespace Deckungsbeitrag this.textBoxScan.Clear(); this.textBoxScan.Focus(); - this.textBoxScan.TextChanged += textBoxScan_TextChanged; + this.textBoxScan.TextChanged += TextBoxScan_TextChanged; } private bool AuftragSpeichern() { @@ -320,7 +323,7 @@ namespace Deckungsbeitrag //if (auftrag == null) return; //if (AuftragSpeichern() == false) e.Cancel = true; } - private void buttonCloseForm_Click(object sender, EventArgs e) + private void ButtonCloseForm_Click(object sender, EventArgs e) { if (meldung.GetFrage(this, "Möchtest du das Programm wirklich schließen?", false) == DialogResult.No) return; @@ -333,7 +336,7 @@ namespace Deckungsbeitrag /// /// /// - private void labelCont_DoubleClick(object sender, EventArgs e) + private void LabelCont_DoubleClick(object sender, EventArgs e) { Label lbl = sender as Label; double[] zeit = { 0, 0 }; @@ -343,9 +346,8 @@ namespace Deckungsbeitrag if (double.TryParse(lbl.Text, out double cont)) zeit[i-1] = (cont * 2.7 * 3.5) / 60 / i; } - meldung.GetInfo(this, $"Die Waschzeiten für den gewünschten Tag lauten:\n\n[Eine Waschstraße] => {zeit[0].ToString("F1")} Stunden\n[Zwei Waschstraßen] => {zeit[1].ToString("F1")} Stunden", false); + meldung.GetInfo(this, $"Die Waschzeiten für den gewünschten Tag lauten:\n\n[Eine Waschstraße] => {zeit[0]:F1} Stunden\n[Zwei Waschstraßen] => {zeit[1]:F1} Stunden", false); } } -} -//CHANGES: Programm wird mit Button geschlossen. (Sicherheitsabfrage ob wirklich gewollt wird gemacht.) +} \ No newline at end of file diff --git a/AA-Forms/FormAuftragDetail.cs b/AA-Forms/FormAuftragDetail.cs index 697c47d..d78791b 100644 --- a/AA-Forms/FormAuftragDetail.cs +++ b/AA-Forms/FormAuftragDetail.cs @@ -15,7 +15,6 @@ using System.Text; using System.Threading.Tasks; using System.Web; using System.Windows.Forms; -using System.Windows.Input; using ZXing; namespace Deckungsbeitrag @@ -496,16 +495,6 @@ namespace Deckungsbeitrag /// UNUSED THINGS /// - //RAHMEN UM FORM ZEICHNEN - private void FormAuftragDetail_Paint(object sender, PaintEventArgs e) - { - Graphics surface = CreateGraphics(); - Pen pen1 = new Pen(Color.White, 5); - - surface.DrawLine(pen1, 10, 215, this.buttonAbbrechen.Right + 15, 215); - surface.DrawRectangle(pen1, 10, 10, this.buttonAbbrechen.Right + 5, this.buttonAbbrechen.Bottom + 5); - - } //PRINT PAGE FÜR DRUCK private void FormAuftragDetail_Shown(object sender, EventArgs e) { @@ -654,7 +643,7 @@ namespace Deckungsbeitrag } } //DONE: Korrigiere Bestand: Wenn -Zahl dann Stand - Zahl. -//TODO: Speichern etc. durchgehen und adaptieren +//DONE: Speichern etc. durchgehen und adaptieren //DONE: Feedback Button hinzufügen //DONE: ComboBox Fahrer und Priorität implementieren //DONE: Container schmutzig bearbeitbar machen \ No newline at end of file diff --git a/AA-Forms/FormBenutzerVW.Designer.cs b/AA-Forms/FormBenutzerVW.Designer.cs index 9a16e8b..fd4ee89 100644 --- a/AA-Forms/FormBenutzerVW.Designer.cs +++ b/AA-Forms/FormBenutzerVW.Designer.cs @@ -59,9 +59,9 @@ this.objectListViewBenutzer.UseCompatibleStateImageBehavior = false; this.objectListViewBenutzer.UseFiltering = true; this.objectListViewBenutzer.View = System.Windows.Forms.View.Details; - this.objectListViewBenutzer.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.objectListViewBenutzer_CellEditFinished); - this.objectListViewBenutzer.CellEditStarting += new BrightIdeasSoftware.CellEditEventHandler(this.objectListViewBenutzer_CellEditStarting); - this.objectListViewBenutzer.SubItemChecking += new System.EventHandler(this.objectListViewBenutzer_SubItemChecking); + this.objectListViewBenutzer.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.ObjectListViewBenutzer_CellEditFinished); + this.objectListViewBenutzer.CellEditStarting += new BrightIdeasSoftware.CellEditEventHandler(this.ObjectListViewBenutzer_CellEditStarting); + this.objectListViewBenutzer.SubItemChecking += new System.EventHandler(this.ObjectListViewBenutzer_SubItemChecking); // // buttonNewUser // @@ -78,7 +78,7 @@ this.buttonNewUser.Text = "Neuer User"; this.buttonNewUser.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.buttonNewUser.UseVisualStyleBackColor = false; - this.buttonNewUser.Click += new System.EventHandler(this.buttonNewUser_Click); + this.buttonNewUser.Click += new System.EventHandler(this.ButtonNewUser_Click); // // buttonAbbrechen // @@ -96,7 +96,7 @@ this.buttonAbbrechen.TextAlign = System.Drawing.ContentAlignment.BottomCenter; this.buttonAbbrechen.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; this.buttonAbbrechen.UseVisualStyleBackColor = false; - this.buttonAbbrechen.Click += new System.EventHandler(this.buttonAbbrechen_Click); + this.buttonAbbrechen.Click += new System.EventHandler(this.ButtonAbbrechen_Click); // // buttonSpeichern // diff --git a/AA-Forms/FormBenutzerVW.cs b/AA-Forms/FormBenutzerVW.cs index cd54e96..eccb177 100644 --- a/AA-Forms/FormBenutzerVW.cs +++ b/AA-Forms/FormBenutzerVW.cs @@ -18,7 +18,7 @@ namespace Deckungsbeitrag { public Meldungen meldung = new Meldungen(); public Benutzer user; - private List fahrerliste; + private readonly List fahrerliste; public FormBenutzerVW() { @@ -33,7 +33,7 @@ namespace Deckungsbeitrag private void FormBenutzerVW_Load(object sender, EventArgs e) { - List list = new List(); + List list; try { if (this.fahrerliste != null && this.fahrerliste.Count > 0) list = this.fahrerliste; @@ -55,28 +55,24 @@ namespace Deckungsbeitrag } - - /// - /// BUTTON CLICK EVENTS - /// - /// - /// - private void buttonNewUser_Click(object sender, EventArgs e) - { - FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer(); - neuerBenutzer.Show(); - } - private void buttonAbbrechen_Click(object sender, EventArgs e) - { - this.Close(); - } private void Save_Benutzer(Benutzer benutzer, bool show) { if (benutzer.Save() == 1) if (show) meldung.Gespeichert(); else if (show) meldung.Speicherfehler(); } - #region ObjectListView-Funktionen + + private void ButtonNewUser_Click(object sender, EventArgs e) + { + FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer(); + neuerBenutzer.Show(); + } + private void ButtonAbbrechen_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void Load_OLV(List alist) { Generator.GenerateColumns(this.objectListViewBenutzer, typeof(Benutzer), true); @@ -95,12 +91,12 @@ namespace Deckungsbeitrag this.objectListViewBenutzer = Funktionen.Columns_Resize(null, this.objectListViewBenutzer).olv; } - private void objectListViewBenutzer_CellEditFinished(object sender, CellEditEventArgs e) + private void ObjectListViewBenutzer_CellEditFinished(object sender, CellEditEventArgs e) { Benutzer benutzer = (Benutzer)e.RowObject; if(!string.IsNullOrWhiteSpace(e.NewValue.ToString())) Save_Benutzer(benutzer, false); } - private void objectListViewBenutzer_SubItemChecking(object sender, SubItemCheckingEventArgs e) + private void ObjectListViewBenutzer_SubItemChecking(object sender, SubItemCheckingEventArgs e) { Benutzer benutzer = (Benutzer)e.RowObject; if (benutzer.Aktiv) benutzer.Aktiv = false; @@ -108,15 +104,13 @@ namespace Deckungsbeitrag Save_Benutzer(benutzer, false); } - private void objectListViewBenutzer_CellEditStarting(object sender, CellEditEventArgs e) + private void ObjectListViewBenutzer_CellEditStarting(object sender, CellEditEventArgs e) { - ObjectListView olv = (ObjectListView)sender; user = e.RowObject as Benutzer; if (user == null) return; } - #endregion } diff --git a/AA-Forms/FormExpedit.cs b/AA-Forms/FormExpedit.cs index 1b80870..35bd580 100644 --- a/AA-Forms/FormExpedit.cs +++ b/AA-Forms/FormExpedit.cs @@ -228,8 +228,6 @@ namespace Deckungsbeitrag } } } - - private void ButtonReklamation_Click(object sender, EventArgs e) { FormFehlmengeCount reklamation = new FormFehlmengeCount(this.benutzer); @@ -333,8 +331,7 @@ namespace Deckungsbeitrag { aufgabeCol.ImageGetter = rowObject => { - var a = rowObject as View_Auftrag_Expedit; - if (a == null) return -1; + if (!(rowObject is View_Auftrag_Expedit a)) return -1; return string.IsNullOrEmpty(a.AufgabeBezeichnung) ? -1 : 0; }; } @@ -345,8 +342,7 @@ namespace Deckungsbeitrag { kundeCol.ImageGetter = rowObject => { - var a = rowObject as View_Auftrag_Expedit; - if (a == null) return -1; + if (!(rowObject is View_Auftrag_Expedit a)) return -1; return string.IsNullOrEmpty(a.Zusatz) ? -1 : 1; }; } @@ -389,6 +385,7 @@ namespace Deckungsbeitrag fertigCol.ShowTextInHeader = false; fertigCol.MinimumWidth = fertigCol.MaximumWidth = 80; } + } private void Olv_CellToolTipShowing(object sender, ToolTipShowingEventArgs e) { @@ -889,18 +886,55 @@ namespace Deckungsbeitrag /// private void ObjectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e) { + ObjectListView olv = (ObjectListView)sender; this.auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); - if (e.Column.Text == "sauber") altecontclean = (int?)e.Value; - if (!string.IsNullOrWhiteSpace(e.NewValue.ToString())) { this.auftrag.ContainerClean = (int)e.NewValue; Save_Auftrag(this.auftrag, false); } + var modelType = this.auftrag.GetType(); + var propInfo = modelType.GetProperty(e.Column.AspectName); - if (this.auftrag.Status == AuftragStatus.Vorbereitet & e.Value != e.NewValue) + + switch (e.Column.AspectName) { - if (MessageBox.Show("Die Containeranzahl wurde verändert. Möchtest du die Etiketten nochmals drucken?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - Funktionen.Etikett_Drucken(this.auftrag, nocont); - } + case var t when t == "ContainerClean": + { + altecontclean = (int?)e.Value; + + if (e.Value != e.NewValue) + { + if (this.auftrag.Status <= AuftragStatus.Warten) + { + if (int.TryParse(e.NewValue.ToString(), out int i)) this.auftrag.ContainerClean = i; + else return; + + if (this.auftrag.Status == AuftragStatus.Vorbereitet) + { + if (MessageBox.Show("Die Containeranzahl wurde verändert. Möchtest du die Etiketten nochmals drucken?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + Funktionen.Etikett_Drucken(this.auftrag, nocont); + } + } + } + } + } + break; + case var t when t == "Fahrer": + { + if (e.NewValue != null) + { + this.auftrag.ArbeiterID = ((Benutzer)e.NewValue).BenutzerID; + this.auftrag.Priority = Funktionen.GetPriority((Benutzer)e.NewValue); + } + } + break; + default: + if (propInfo != null && e.NewValue != null) + { + // Dynamisch setzen + propInfo.SetValue(this.auftrag, Convert.ChangeType(e.NewValue, propInfo.PropertyType)); + } + break; } - //Neuladen_OLV(olv); + Save_Auftrag(this.auftrag, false); + Neuladen_OLV(olv); } /// @@ -910,11 +944,11 @@ namespace Deckungsbeitrag /// private void ObjectListViewAuftrag_CellEditStarting(object sender, CellEditEventArgs e) { + ObjectListView olv = (ObjectListView)sender; + Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); + if (e.Column.AspectName == "KundeName") { - ObjectListView olv = (ObjectListView)sender; - Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); - if (_auftrag == null) return; Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null); @@ -923,13 +957,46 @@ namespace Deckungsbeitrag olv.RefreshObject(olv.SelectedObject); e.Cancel = true; + return; } - else if (meldung.GetFrage(this, $"Möchtest du die gewählte Zelle wirklich bearbeiten?", false) == DialogResult.No) e.Cancel = true; + else if (meldung.GetFrage(this, $"Möchtest du die gewählte Zelle wirklich bearbeiten?", false) == DialogResult.No) { e.Cancel = true; return; } + if (e.Column.AspectName == "Fahrer") + { + List list = Benutzer.GetFahrerList(); + ComboBox fahrer = new ComboBox + { + Bounds = e.CellBounds, + DropDownStyle = ComboBoxStyle.DropDownList, + DisplayMember = "BenutzerName", + DataSource = list + }; + e.Control = fahrer; + } + if (e.Control is NumericUpDown num) num.Select(0, int.MaxValue); + } + + /// + /// Satt Edit wird der Kunde als gewaschen markiert. + /// Solange Waschstraße nicht involviert, muss Expedit so die Aufträge in Aufträge heute bringen. + /// + /// + /// + private void ObjectListViewRampe_CellEditStarting(object sender, CellEditEventArgs e) + { + ObjectListView olv = (ObjectListView)sender; + Auftrag _auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID); + + if (_auftrag == null) return; + _auftrag.Status = AuftragStatus.Gewaschen; + _auftrag.Save(); + + Neuladen_OLV(olv); + e.Cancel = true; } #endregion - + /// /// Controls werden nach Benutzer deaktiviert. /// @@ -1225,18 +1292,6 @@ namespace Deckungsbeitrag //this.Close(); // Onboarding beendet } } - private void ObjectListViewRampe_CellEditStarting(object sender, CellEditEventArgs e) - { - ObjectListView olv = (ObjectListView)sender; - - if (!(e.RowObject is Auftrag _auftrag)) return; - //Kunde _kunde = Kunde.GetKunde(null, _auftrag.KundeID, null); - _auftrag.Status = AuftragStatus.Gewaschen; - _auftrag.Save(); - - olv.RefreshObject(olv.SelectedObject); - e.Cancel = true; - } private void ButtonNW_Click(object sender, EventArgs e) { FormArtikelVW artikelVW = new FormArtikelVW(this.benutzer); @@ -1244,4 +1299,7 @@ namespace Deckungsbeitrag } } } -//CHANGES: Im Tap Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen. \ No newline at end of file +//CHANGES: Im Tab Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen. +//CHANGES: Im Tab Rampe wird bei DoppelClick der Auftrag als gewaschen markiert und im Tab Aufträge heute sichtbar. +//CHANGES: Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert. +//CHANGES: NumericUpDown markiert automatisch den Inhalt. Erleichtert die Eingabe. \ No newline at end of file diff --git a/AA-Forms/FormFehlmengeCount.Designer.cs b/AA-Forms/FormFehlmengeCount.Designer.cs index 9a9595d..c11db5a 100644 --- a/AA-Forms/FormFehlmengeCount.Designer.cs +++ b/AA-Forms/FormFehlmengeCount.Designer.cs @@ -56,8 +56,8 @@ this.textBoxScann.Name = "textBoxScann"; this.textBoxScann.Size = new System.Drawing.Size(130, 31); this.textBoxScann.TabIndex = 1; - this.textBoxScann.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxScann_KeyDown); - this.textBoxScann.Leave += new System.EventHandler(this.textBoxScann_Leave); + this.textBoxScann.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxScann_KeyDown); + this.textBoxScann.Leave += new System.EventHandler(this.TextBoxScann_Leave); // // labelSuchtext // @@ -81,7 +81,7 @@ this.buttonFertig.TabIndex = 3; this.buttonFertig.Text = "Kunde Fertig"; this.buttonFertig.UseVisualStyleBackColor = false; - this.buttonFertig.Click += new System.EventHandler(this.buttonFertig_Click); + this.buttonFertig.Click += new System.EventHandler(this.ButtonFertig_Click); // // labelName // diff --git a/AA-Forms/FormFehlmengeCount.cs b/AA-Forms/FormFehlmengeCount.cs index 8d4ee37..38bddd3 100644 --- a/AA-Forms/FormFehlmengeCount.cs +++ b/AA-Forms/FormFehlmengeCount.cs @@ -25,11 +25,11 @@ namespace Deckungsbeitrag Kunde kunde; Auftrag auftrag; List artikelListe; - Meldungen meldung = new Meldungen(); - private Benutzer benutzer; + readonly Meldungen meldung = new Meldungen(); + private readonly Benutzer benutzer; private List auftragsliste; private ArtikelKategorie kategorie; - string userid; + readonly string userid; #region Form-Konstruktor @@ -114,7 +114,7 @@ namespace Deckungsbeitrag if (kunde.Aufgabe != null) { - string n = kunde.Suchtext == null ? kunde.KundeName : kunde.Suchtext; + string n = kunde.Suchtext ?? kunde.KundeName; meldung.GetInfo(this, $"Bei Kunde {n} solltest du folgendes beachten: {Aufgabe.GetAufgabe(null, kunde.Aufgabe).Bezeichnung}", false); } } @@ -387,7 +387,7 @@ namespace Deckungsbeitrag /// /// /// - private void buttonFertig_Click(object sender, EventArgs e) + private void ButtonFertig_Click(object sender, EventArgs e) { // Controls werden durchgegangen und ausgeblendet oder der Text entfernt. @@ -470,7 +470,7 @@ namespace Deckungsbeitrag /// /// /// - private void textBoxScann_Leave(object sender, EventArgs e) + private void TextBoxScann_Leave(object sender, EventArgs e) { // Kundennummer wird ausgelesen und Kunde aus DB geholt. Form_Load wird danach ausgelöst if (this.kunde == null) @@ -479,12 +479,12 @@ namespace Deckungsbeitrag ControlLaden(); } } - private void textBoxScann_KeyDown(object sender, KeyEventArgs e) + private void TextBoxScann_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // Leave-Ereignis manuell ausführen - textBoxScann_Leave(sender, EventArgs.Empty); + TextBoxScann_Leave(sender, EventArgs.Empty); // Fokus auf das nächste Steuerelement verschieben //this.SelectNextControl((Control)sender, true, true, true, true); @@ -502,16 +502,14 @@ namespace Deckungsbeitrag /// private void Button_MouseUp(object sender, MouseEventArgs e) { - Button btn = sender as Button; - if (btn != null) + if (sender is Button btn) { btn.BackColor = Color.Turquoise; // Gewünschte Farbe beim MouseUp } } private void Button_MouseDown(object sender, MouseEventArgs e) { - Button btn = sender as Button; - if (btn != null) + if (sender is Button btn) { btn.BackColor = Color.LightSeaGreen; // Gewünschte Farbe beim MouseDown } @@ -521,36 +519,25 @@ namespace Deckungsbeitrag // Beim geklickten Artikel wird Fehlmenge erhöht Button btn = (Button)sender; KundeArtikel kndart = (KundeArtikel)btn.Tag; + DateTime timestamp = DateTime.Now.Date; + ArtikelNachwaesche artnw = ArtikelNachwaesche.FindeDatensatz(kndart.ArtikelID, timestamp); + if (artnw.NachwaescheID == null) + { + artnw = new ArtikelNachwaesche() + { + ArtikelID = kndart.ArtikelID, + Datum = timestamp, + Nachwaesche = 0, + Reklamation = 0 + }; + } - if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit)) kndart.Reklamation++; - else kndart.Fehlmenge++; + if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit)) { kndart.Reklamation++; artnw.Reklamation++; } + else { kndart.Fehlmenge++; artnw.Nachwaesche++; } // Wenn speichern nicht möglich, wird darauf hingewiesen. - if (kndart.Save() != 1) meldung.FehlmengeCount(); - else - { - DateTime timestamp = DateTime.Now.Date; - ArtikelNachwaesche artnw = ArtikelNachwaesche.FindeDatensatz(kndart.ArtikelID, timestamp); - if (artnw.NachwaescheID != null) artnw.Nachwaesche++; - else - { - artnw = new ArtikelNachwaesche() - { - ArtikelID = kndart.ArtikelID, - Datum = timestamp, - Nachwaesche = 1 - }; - } - - artnw.Save(); - } - + if (kndart.Save() != 1 || artnw.Save() != 1) meldung.FehlmengeCount(); } - - } } -//TODO: Wenn Frottee-Expedit auch Relamation bearbeitet, muss BenutzerRolle abgefragt werden. siehe CHANGES. -//DONE: Auftrag über FormListe holen und daraus den Kunden für Fehlmenge holen. -//DONE: Logik überlegen wie ein bearbeiteter Auftrag nicht doppelt gewählt werden kann. (Abteilungen zu Auftrag hinzufügen und bei Ausschlager Druck definieren?) -//DONE: Nur die Kunden der Aufträge als Liste anzeigen wäre möglich. Macht die Auswahl für das Personal einfacher weil 90% bereits weg fallen. \ No newline at end of file +//DONE: Wenn Frottee-Expedit auch Reklamation bearbeitet, muss BenutzerRolle abgefragt werden. siehe CHANGES. \ No newline at end of file diff --git a/AA-Forms/FormKundeVW.cs b/AA-Forms/FormKundeVW.cs index dbeb694..1bcd835 100644 --- a/AA-Forms/FormKundeVW.cs +++ b/AA-Forms/FormKundeVW.cs @@ -604,5 +604,3 @@ namespace Deckungsbeitrag } } } -//INSTALL-REMINDER: Tabelle KundeArtikel Spalten ArtikelID und Reihung hinzufügen. -//CHANGES: KundeArtikel wird mit Reihung gespeichert und angezeigt. \ No newline at end of file diff --git a/AA-Forms/FormListe.Designer.cs b/AA-Forms/FormListe.Designer.cs index 91466d0..4330710 100644 --- a/AA-Forms/FormListe.Designer.cs +++ b/AA-Forms/FormListe.Designer.cs @@ -67,8 +67,8 @@ namespace Deckungsbeitrag this.listViewKunde.TabIndex = 1; this.listViewKunde.UseCompatibleStateImageBehavior = false; this.listViewKunde.View = System.Windows.Forms.View.Details; - this.listViewKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewKunde_KeyDown); - this.listViewKunde.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listViewKunde_MouseClick); + this.listViewKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewKunde_KeyDown); + this.listViewKunde.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ListViewKunde_MouseClick); // // columnHeader1 // @@ -97,10 +97,10 @@ namespace Deckungsbeitrag this.textBoxKunde.Size = new System.Drawing.Size(120, 26); this.textBoxKunde.TabIndex = 0; this.textBoxKunde.Text = "Hier eingeben"; - this.textBoxKunde.TextChanged += new System.EventHandler(this.textBoxKunde_TextChanged); + this.textBoxKunde.TextChanged += new System.EventHandler(this.TextBoxKunde_TextChanged); this.textBoxKunde.Enter += new System.EventHandler(this.TextBoxKunde_Enter); - this.textBoxKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewKunde_KeyDown); - this.textBoxKunde.Leave += new System.EventHandler(this.textBoxKunde_Leave); + this.textBoxKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewKunde_KeyDown); + this.textBoxKunde.Leave += new System.EventHandler(this.TextBoxKunde_Leave); // // label1 // @@ -127,7 +127,7 @@ namespace Deckungsbeitrag this.buttonOK.TabIndex = 15; this.buttonOK.Text = "Kunde übernehmen"; this.buttonOK.UseVisualStyleBackColor = false; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + this.buttonOK.Click += new System.EventHandler(this.ButtonOK_Click); // // buttonNeuerAuftrag // @@ -144,7 +144,7 @@ namespace Deckungsbeitrag this.buttonNeuerAuftrag.TabIndex = 16; this.buttonNeuerAuftrag.Text = "Neuer Auftrag"; this.buttonNeuerAuftrag.UseVisualStyleBackColor = false; - this.buttonNeuerAuftrag.Click += new System.EventHandler(this.buttonNeuerAuftrag_Click); + this.buttonNeuerAuftrag.Click += new System.EventHandler(this.ButtonNeuerAuftrag_Click); // // FormListe // diff --git a/AA-Forms/FormListe.cs b/AA-Forms/FormListe.cs index bdd0193..054b69b 100644 --- a/AA-Forms/FormListe.cs +++ b/AA-Forms/FormListe.cs @@ -31,16 +31,16 @@ namespace Deckungsbeitrag public Benutzer benutzer; public Auftrag auftrag; private List Kundenliste; - private List Auftragliste; - private List Finishingliste; - private Meldungen meldung = new Meldungen(); - int type_of_list; - string ben_col = "Vorname,Nachname,Benutzername,Rolle,Schein,Gueltig bis,Aktiv"; - string knd_col = "KundenNr,Suchtext,KundenName,Ort"; - string auf_col = "Aufgabe,Beschreibung"; - string auftrag_col = "Kunde,Liefertag,Container"; + private readonly List Auftragliste; + private readonly List Finishingliste; + private readonly Meldungen meldung = new Meldungen(); + readonly int type_of_list; + readonly string ben_col = "Vorname,Nachname,Benutzername,Rolle,Schein,Gueltig bis,Aktiv"; + readonly string knd_col = "KundenNr,Suchtext,KundenName,Ort"; + readonly string auf_col = "Aufgabe,Beschreibung"; + readonly string auftrag_col = "Kunde,Liefertag,Container"; private Timer timer; - private string kndService; + private readonly string kndService; #region Form-Konstruktor @@ -74,13 +74,15 @@ namespace Deckungsbeitrag private void FormListe_Load(object sender, EventArgs e) { // Timer für Wartezeit bis TextChanged eintritt. - timer = new Timer(); - timer.Interval = 700; // 0,7 Sekunden + timer = new Timer + { + Interval = 700 // 0,7 Sekunden + }; timer.Tick += Timer_Tick; this.buttonOK.Visible = this.buttonOK.Enabled = false; - listViewKunde_Load(); + ListViewKunde_Load(); this.textBoxKunde.Focus(); this.CenterToScreen(); @@ -90,7 +92,7 @@ namespace Deckungsbeitrag this.CenterToScreen(); } - private void listViewKunde_Load() + private void ListViewKunde_Load() { //LISTE LEEREN this.listViewKunde.Items.Clear(); @@ -99,16 +101,18 @@ namespace Deckungsbeitrag //SWITCH NACH LISTENTYP switch (type_of_list) { - case var kndliste when type_of_list == (int)Listentyp.Kundenliste: + case var _ when type_of_list == (int)Listentyp.Kundenliste: { //SPALTEN ERSTELLEN UND EINFÜGEN string[] colname = knd_col.Split(','); foreach (string s in colname) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; + ColumnHeader ch = new ColumnHeader + { + Text = s + }; - this.listViewKunde.Columns.Add(ch); + this.listViewKunde.Columns.Add(ch); } //KUNDEN LADEN this.Text = "KUNDE WÄHLEN"; @@ -136,27 +140,31 @@ namespace Deckungsbeitrag this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = false; } break; - case var aufliste when type_of_list == (int)Listentyp.Aufgabenliste: + case var _ when type_of_list == (int)Listentyp.Aufgabenliste: { string[] colname = auf_col.Split(','); foreach (string s in colname) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; + ColumnHeader ch = new ColumnHeader + { + Text = s + }; this.listViewKunde.Columns.Add(ch); } } break; - case var benliste when type_of_list == (int)Listentyp.Benutzerliste: + case var _ when type_of_list == (int)Listentyp.Benutzerliste: { this.textBoxKunde.Visible = this.label1.Visible = false; this.buttonNeuerAuftrag.Visible = true; string[] colname = ben_col.Split(','); foreach (string s in colname) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; + ColumnHeader ch = new ColumnHeader + { + Text = s + }; this.listViewKunde.Columns.Add(ch); } @@ -164,10 +172,12 @@ namespace Deckungsbeitrag this.Text = "BENUTZER WÄHLEN"; foreach(Benutzer b in Benutzer.GetList()) { - ListViewItem item = new ListViewItem(); - item.Tag = b; - item.Text = b.Vorname; - item.SubItems.Add(b.Nachname); + ListViewItem item = new ListViewItem + { + Tag = b, + Text = b.Vorname + }; + item.SubItems.Add(b.Nachname); item.SubItems.Add(b.BenutzerName); item.SubItems.Add(b.Rolle.ToString()); item.SubItems.Add(b.Schein.ToString()); @@ -178,21 +188,25 @@ namespace Deckungsbeitrag } } break; - case var auftragliste when type_of_list == (int)Listentyp.Auftragliste: + case var _ when type_of_list == (int)Listentyp.Auftragliste: string[] col = auftrag_col.Split(','); foreach(string s in col) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; - this.listViewKunde.Columns.Add(ch); + ColumnHeader ch = new ColumnHeader + { + Text = s + }; + this.listViewKunde.Columns.Add(ch); } this.Text = "AUFTRAG WÄHLEN"; foreach(Auftrag auftrag in this.Auftragliste) { - ListViewItem item = new ListViewItem(); - item.Tag = auftrag; - item.Text = auftrag.Kundename; - item.SubItems.Add(auftrag.Liefertag.ToString("ddd dd.MM")); + ListViewItem item = new ListViewItem + { + Tag = auftrag, + Text = auftrag.Kundename + }; + item.SubItems.Add(auftrag.Liefertag.ToString("ddd dd.MM")); item.SubItems.Add(auftrag.Container.ToString()); this.listViewKunde.Items.Add(item); @@ -208,15 +222,17 @@ namespace Deckungsbeitrag this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = false; break; - case var finishliste when type_of_list == (int)Listentyp.Finishingliste: + case var _ when type_of_list == (int)Listentyp.Finishingliste: //SPALTEN ERSTELLEN UND EINFÜGEN string[] colname1 = knd_col.Split(','); foreach (string s in colname1) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; + ColumnHeader ch = new ColumnHeader + { + Text = s + }; - this.listViewKunde.Columns.Add(ch); + this.listViewKunde.Columns.Add(ch); } //KUNDEN LADEN this.Text = "KUNDE WÄHLEN"; @@ -224,10 +240,12 @@ namespace Deckungsbeitrag { Kunde knd = Kunde.GetKunde(null, a.KundeID, null); - ListViewItem item = new ListViewItem(); - item.Tag = a; - item.Text = knd.KundeNummer; - item.SubItems.Add(knd.Suchtext); + ListViewItem item = new ListViewItem + { + Tag = a, + Text = knd.KundeNummer + }; + item.SubItems.Add(knd.Suchtext); item.SubItems.Add(knd.KundeName); item.SubItems.Add(knd.Ort); @@ -242,14 +260,16 @@ namespace Deckungsbeitrag this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = false; break; - case var reklamationliste when type_of_list == (int)Listentyp.Reklamationliste: + case var _ when type_of_list == (int)Listentyp.Reklamationliste: { //SPALTEN ERSTELLEN UND EINFÜGEN string[] colname = knd_col.Split(','); foreach (string s in colname) { - ColumnHeader ch = new ColumnHeader(); - ch.Text = s; + ColumnHeader ch = new ColumnHeader + { + Text = s + }; this.listViewKunde.Columns.Add(ch); } @@ -258,9 +278,11 @@ namespace Deckungsbeitrag if (this.Kundenliste == null) this.Kundenliste = Kunde.GetReklamationListe("Miete"); foreach (Kunde kunde in this.Kundenliste) { - ListViewItem item = new ListViewItem(); - item.Tag = kunde; - item.Text = kunde.KundeNummer; + ListViewItem item = new ListViewItem + { + Tag = kunde, + Text = kunde.KundeNummer + }; item.SubItems.Add(kunde.Suchtext); item.SubItems.Add(kunde.KundeName); item.SubItems.Add(kunde.Ort); @@ -280,12 +302,12 @@ namespace Deckungsbeitrag default: break; } - listViewKunde_Design(); + ListViewKunde_Design(); //Funktionen.Columns_Resize(this.listViewKunde); //this.Size = new Size(this.listViewKunde.Width + 70, this.Height); } - private void listViewKunde_Design() + private void ListViewKunde_Design() { int lvwWidth = 0; this.listViewKunde.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); @@ -310,7 +332,7 @@ namespace Deckungsbeitrag //GetKeyboard(); } - private void textBoxKunde_TextChanged(object sender, EventArgs e) + private void TextBoxKunde_TextChanged(object sender, EventArgs e) { // TextChanged tritt nur ein wenn x Sekunden keine Eingabe erfolgt. Logik befindet sich in Timer_Tick timer.Stop(); // Alten Timer beenden @@ -319,26 +341,25 @@ namespace Deckungsbeitrag private void Timer_Tick(object sender, EventArgs e) { timer.Stop(); // Timer stoppen - string text = string.Empty; if (string.IsNullOrEmpty(textBoxKunde.Text)) { return; } // Wenn kein Fragezeichen am Anfang wird Kundenliste erstellt. if (!textBoxKunde.Text.StartsWith("?")) { - if (textBoxKunde.Text.StartsWith("http")) - { - int index = 1; - int i = 0; - index += textBoxKunde.Text.IndexOf("=", index); - i = textBoxKunde.Text.IndexOf("%", index); - text = textBoxKunde.Text.Substring(index, i - index); - textBoxKunde.Text = text; - } - else text = this.textBoxKunde.Text; + string text; + if (textBoxKunde.Text.StartsWith("http")) + { + int index = 1; + index += textBoxKunde.Text.IndexOf("=", index); + int i = textBoxKunde.Text.IndexOf("%", index); + text = textBoxKunde.Text.Substring(index, i - index); + textBoxKunde.Text = text; + } + else text = this.textBoxKunde.Text; this.Kundenliste = Kunde.GetTmpList(text, this.kndService); - listViewKunde_Load(); + ListViewKunde_Load(); return; } @@ -351,7 +372,7 @@ namespace Deckungsbeitrag } } - private void listViewKunde_MouseClick(object sender, MouseEventArgs e) + private void ListViewKunde_MouseClick(object sender, MouseEventArgs e) { ListViewItem item = this.listViewKunde.GetItemAt(e.X, e.Y); @@ -385,7 +406,7 @@ namespace Deckungsbeitrag break; } } - private void listViewKunde_KeyDown(object sender, KeyEventArgs e) + private void ListViewKunde_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { @@ -425,7 +446,7 @@ namespace Deckungsbeitrag } e.Handled = true; - textBoxKunde_Leave(this, e); + TextBoxKunde_Leave(this, e); this.DialogResult = DialogResult.OK; this.Close(); } @@ -436,7 +457,7 @@ namespace Deckungsbeitrag } } - private void buttonOK_Click(object sender, EventArgs e) + private void ButtonOK_Click(object sender, EventArgs e) { this.kunde = Kunde.GetKunde("2320000", null, null); this.kunde.Suchtext = this.textBoxKunde.Text.Substring(1); @@ -445,7 +466,7 @@ namespace Deckungsbeitrag this.DialogResult = DialogResult.OK; this.Close(); } - private void textBoxKunde_Leave(object sender, EventArgs e) + private void TextBoxKunde_Leave(object sender, EventArgs e) { // Alle gestarteten Instanzen von TabTip.exe (Touch Tastatur) schließen @@ -462,7 +483,7 @@ namespace Deckungsbeitrag } } } - private void buttonNeuerAuftrag_Click(object sender, EventArgs e) + private void ButtonNeuerAuftrag_Click(object sender, EventArgs e) { if (meldung.GetFrage(this, "Konntest du den gewünschten Auftrag nicht finden und möchtest diesen neu erstellen?", false) == DialogResult.Yes) { diff --git a/AA-Forms/FormMain.Designer.cs b/AA-Forms/FormMain.Designer.cs index b348c6c..ed8e8f6 100644 --- a/AA-Forms/FormMain.Designer.cs +++ b/AA-Forms/FormMain.Designer.cs @@ -750,7 +750,7 @@ namespace Deckungsbeitrag this.groupBoxContAnz.Controls.Add(this.tLPContAnz); this.groupBoxContAnz.Enabled = false; this.groupBoxContAnz.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101))))); - this.groupBoxContAnz.Location = new System.Drawing.Point(375, 224); + this.groupBoxContAnz.Location = new System.Drawing.Point(558, 311); this.groupBoxContAnz.Margin = new System.Windows.Forms.Padding(4); this.groupBoxContAnz.Name = "groupBoxContAnz"; this.groupBoxContAnz.Padding = new System.Windows.Forms.Padding(4); @@ -818,7 +818,7 @@ namespace Deckungsbeitrag this.label14.Dock = System.Windows.Forms.DockStyle.Right; this.label14.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label14.ForeColor = System.Drawing.SystemColors.ControlText; - this.label14.Location = new System.Drawing.Point(417, 222); + this.label14.Location = new System.Drawing.Point(306, 222); this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(54, 37); @@ -874,7 +874,7 @@ namespace Deckungsbeitrag this.label5.Dock = System.Windows.Forms.DockStyle.Right; this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label5.ForeColor = System.Drawing.SystemColors.ControlText; - this.label5.Location = new System.Drawing.Point(421, 185); + this.label5.Location = new System.Drawing.Point(310, 185); this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(50, 37); @@ -930,7 +930,7 @@ namespace Deckungsbeitrag this.labelZeit52.Dock = System.Windows.Forms.DockStyle.Right; this.labelZeit52.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelZeit52.ForeColor = System.Drawing.SystemColors.ControlText; - this.labelZeit52.Location = new System.Drawing.Point(421, 148); + this.labelZeit52.Location = new System.Drawing.Point(310, 148); this.labelZeit52.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.labelZeit52.Name = "labelZeit52"; this.labelZeit52.Size = new System.Drawing.Size(50, 37); @@ -944,7 +944,7 @@ namespace Deckungsbeitrag this.labelZeit42.Dock = System.Windows.Forms.DockStyle.Right; this.labelZeit42.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelZeit42.ForeColor = System.Drawing.SystemColors.ControlText; - this.labelZeit42.Location = new System.Drawing.Point(421, 111); + this.labelZeit42.Location = new System.Drawing.Point(310, 111); this.labelZeit42.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.labelZeit42.Name = "labelZeit42"; this.labelZeit42.Size = new System.Drawing.Size(50, 37); @@ -958,7 +958,7 @@ namespace Deckungsbeitrag this.labelZeit32.Dock = System.Windows.Forms.DockStyle.Right; this.labelZeit32.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelZeit32.ForeColor = System.Drawing.SystemColors.ControlText; - this.labelZeit32.Location = new System.Drawing.Point(421, 74); + this.labelZeit32.Location = new System.Drawing.Point(310, 74); this.labelZeit32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.labelZeit32.Name = "labelZeit32"; this.labelZeit32.Size = new System.Drawing.Size(50, 37); @@ -972,7 +972,7 @@ namespace Deckungsbeitrag this.labelZeit22.Dock = System.Windows.Forms.DockStyle.Right; this.labelZeit22.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelZeit22.ForeColor = System.Drawing.SystemColors.ControlText; - this.labelZeit22.Location = new System.Drawing.Point(421, 37); + this.labelZeit22.Location = new System.Drawing.Point(310, 37); this.labelZeit22.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.labelZeit22.Name = "labelZeit22"; this.labelZeit22.Size = new System.Drawing.Size(50, 37); @@ -989,7 +989,7 @@ namespace Deckungsbeitrag this.labelZeit12.Location = new System.Drawing.Point(306, 0); this.labelZeit12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.labelZeit12.Name = "labelZeit12"; - this.labelZeit12.Size = new System.Drawing.Size(165, 37); + this.labelZeit12.Size = new System.Drawing.Size(54, 37); this.labelZeit12.TabIndex = 15; this.labelZeit12.Text = "2"; this.labelZeit12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -1195,7 +1195,7 @@ namespace Deckungsbeitrag this.groupBoxSaison.Controls.Add(this.comboBoxSaison); this.groupBoxSaison.Enabled = false; this.groupBoxSaison.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101))))); - this.groupBoxSaison.Location = new System.Drawing.Point(294, 408); + this.groupBoxSaison.Location = new System.Drawing.Point(558, 224); this.groupBoxSaison.Margin = new System.Windows.Forms.Padding(4); this.groupBoxSaison.Name = "groupBoxSaison"; this.groupBoxSaison.Padding = new System.Windows.Forms.Padding(4); diff --git a/AA-Forms/FormMain.cs b/AA-Forms/FormMain.cs index fe20fe9..3d59ee4 100644 --- a/AA-Forms/FormMain.cs +++ b/AA-Forms/FormMain.cs @@ -25,7 +25,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; -using System.Windows.Input; using System.Xml.Serialization; using ZXing.Common; using Timer = System.Windows.Forms.Timer; @@ -99,8 +98,12 @@ namespace Deckungsbeitrag this.labelSoftwareDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Setup\SetupVerwaltung*.msi"; this.labelArtikelDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen\Artikelkurzliste.csv"; - if (this.benutzer.Rolle == BenutzerRolle.Admin || this.benutzer.Rolle == BenutzerRolle.Verwaltung || this.benutzer.Rolle == BenutzerRolle.Master) GetInventuren(); - GetSaison(); + // Inventuren sind ausschließlich für Admin, Verwaltung oder Master sichtbar. + if (this.benutzer.Rolle == BenutzerRolle.Admin || this.benutzer.Rolle == BenutzerRolle.Verwaltung || this.benutzer.Rolle == BenutzerRolle.Master) + { + GetInventuren(); + GetSaison(); + } if (this.groupBoxContAnz.Visible) { @@ -1108,9 +1111,8 @@ namespace Deckungsbeitrag this.panelMain.Controls.Add(uCInventur); } - Get_UCInventur_Location(); + //Get_UCInventur_Location(); } - private void Do_UCInventur_Delete() { this.panelMain.Controls.Remove(uCInventur); @@ -1119,16 +1121,14 @@ namespace Deckungsbeitrag private void Get_UCInventur_Location() { // UCInventur in den Vordergrund bringen und Location setzen. - int y = 0; - int x = 0; - if (!formloading) y = panelMain.Controls["feedback"].Top; + int y = panelMain.Controls["feedback"].Bottom + 10; foreach (UCInventur uci in panelMain.Controls.OfType()) { - if (!formloading) x = panelMain.Controls["feedback"].Left - uCInventur.Width - 10; + int x = panelMain.Width - uCInventur.Width - 10; + uci.Visible = true; uci.BringToFront(); uci.Location = new Point(x, y); y += uci.Height; - uci.Visible = true; } } @@ -1317,7 +1317,7 @@ namespace Deckungsbeitrag try { await conn.OpenAsync(); - auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragTyp.Standart, AuftragStatus.Aufgelegt); + auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragStatus.Aufgelegt); //TODO: nicht ganze Aufträge holen sondern nur die Zahlen? } finally @@ -1469,21 +1469,9 @@ namespace Deckungsbeitrag textBox1.Width = (int)size.Width + 10; // +10 als Puffer } } - - private void buttonTestInventur_Click(object sender, EventArgs e) - { - FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer); - showUserControl.ShowDialog(); - var data = showUserControl.lieferDaten; - MessageBox.Show($"{data.datum} {data.text}", "Test", MessageBoxButtons.OK); - } } } //CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren. //CHANGES: Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden. //TODO: Dateinamen aus Tikos anschauen. Eventuell Datum von letztem Import über Dateiname wählen? -//TODO: JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen. -//TODO: Auftrag Schnellerfassung erstellen. Kundenliste aus JSON in OLV einfügen wenn schmutzig > 0 dann Auftrag erstellen. Spalten: "Kunde, schmutzig, liefertag, zustellfahrer" evnetuell in AuftragVW? -//DONE: HILFE zeigt OnBoarding. -//DONE: Auftragliste bei Fahrer anzeigen wenn Login. -//DONE: Wenn RegAuftrag wird als augeliefert markiert, wird dieser automatisch neu erstellt laut hinterlegtem Rhythmus. \ No newline at end of file +//DONE: JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen. diff --git a/AA-Forms/FormNeuDeckungsbeitrag.cs b/AA-Forms/FormNeuDeckungsbeitrag.cs index 3be4575..6fb7a79 100644 --- a/AA-Forms/FormNeuDeckungsbeitrag.cs +++ b/AA-Forms/FormNeuDeckungsbeitrag.cs @@ -13,9 +13,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using System.Windows; using System.Windows.Forms; -using System.Windows.Input; using Point = System.Drawing.Point; using Size = System.Drawing.Size; diff --git a/AA-Forms/FormNeueAufgabe.cs b/AA-Forms/FormNeueAufgabe.cs index aa42509..5eeb331 100644 --- a/AA-Forms/FormNeueAufgabe.cs +++ b/AA-Forms/FormNeueAufgabe.cs @@ -80,5 +80,4 @@ namespace Deckungsbeitrag if ((Kategorie)comboBoxAufgabeKat.SelectedItem == Kategorie.Waschstrasse) this.buttonFarbe.Enabled = true; } } -} -//DONE: Neue Aufgabe Screen erstellen. \ No newline at end of file +} \ No newline at end of file diff --git a/AA-Forms/FormNeuerAuftrag.Designer.cs b/AA-Forms/FormNeuerAuftrag.Designer.cs index d8aa435..19cfbe6 100644 --- a/AA-Forms/FormNeuerAuftrag.Designer.cs +++ b/AA-Forms/FormNeuerAuftrag.Designer.cs @@ -37,7 +37,7 @@ namespace Deckungsbeitrag this.label2 = new System.Windows.Forms.Label(); this.textBoxKundeName = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); + this.labelLiefertag = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.rBMO = new System.Windows.Forms.RadioButton(); this.rBFR = new System.Windows.Forms.RadioButton(); @@ -76,8 +76,8 @@ namespace Deckungsbeitrag this.dTPLiefertag.Name = "dTPLiefertag"; this.dTPLiefertag.Size = new System.Drawing.Size(187, 38); this.dTPLiefertag.TabIndex = 2; - this.dTPLiefertag.ValueChanged += new System.EventHandler(this.dTPLiefertag_ValueChanged); - this.dTPLiefertag.Leave += new System.EventHandler(this.dTPLiefertag_Leave); + this.dTPLiefertag.ValueChanged += new System.EventHandler(this.DTPLiefertag_ValueChanged); + this.dTPLiefertag.Leave += new System.EventHandler(this.DTPLiefertag_Leave); // // buttonSpeichern // @@ -97,7 +97,7 @@ namespace Deckungsbeitrag this.buttonSpeichern.Text = "Speichern"; this.buttonSpeichern.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; this.buttonSpeichern.UseVisualStyleBackColor = false; - this.buttonSpeichern.Click += new System.EventHandler(this.buttonSpeichern_Click); + this.buttonSpeichern.Click += new System.EventHandler(this.ButtonSpeichern_Click); // // buttonAbbrechen // @@ -118,7 +118,7 @@ namespace Deckungsbeitrag this.buttonAbbrechen.Text = "Abbrechen"; this.buttonAbbrechen.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; this.buttonAbbrechen.UseVisualStyleBackColor = false; - this.buttonAbbrechen.Click += new System.EventHandler(this.buttonAbbrechen_Click); + this.buttonAbbrechen.Click += new System.EventHandler(this.ButtonAbbrechen_Click); // // textBoxKndNr // @@ -128,8 +128,6 @@ namespace Deckungsbeitrag this.textBoxKndNr.Name = "textBoxKndNr"; this.textBoxKndNr.Size = new System.Drawing.Size(139, 37); this.textBoxKndNr.TabIndex = 0; - this.textBoxKndNr.Click += new System.EventHandler(this.textBoxKndNr_Click); - this.textBoxKndNr.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBoxKndNr_PreviewKeyDown); // // label2 // @@ -149,7 +147,6 @@ namespace Deckungsbeitrag this.textBoxKundeName.Name = "textBoxKundeName"; this.textBoxKundeName.Size = new System.Drawing.Size(369, 37); this.textBoxKundeName.TabIndex = 8; - this.textBoxKundeName.Leave += new System.EventHandler(this.textBoxKundeName_Leave); // // label3 // @@ -161,15 +158,15 @@ namespace Deckungsbeitrag this.label3.TabIndex = 19; this.label3.Text = "Kunde:"; // - // label4 + // labelLiefertag // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(7, 266); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(120, 25); - this.label4.TabIndex = 22; - this.label4.Text = "Lieferdatum:"; + this.labelLiefertag.AutoSize = true; + this.labelLiefertag.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelLiefertag.Location = new System.Drawing.Point(7, 266); + this.labelLiefertag.Name = "labelLiefertag"; + this.labelLiefertag.Size = new System.Drawing.Size(120, 25); + this.labelLiefertag.TabIndex = 22; + this.labelLiefertag.Text = "Lieferdatum:"; // // label5 // @@ -309,7 +306,7 @@ namespace Deckungsbeitrag this.comboBoxTyp.Name = "comboBoxTyp"; this.comboBoxTyp.Size = new System.Drawing.Size(224, 38); this.comboBoxTyp.TabIndex = 1; - this.comboBoxTyp.SelectedValueChanged += new System.EventHandler(this.comboBoxTyp_SelectedValueChanged); + this.comboBoxTyp.SelectedValueChanged += new System.EventHandler(this.ComboBoxTyp_SelectedValueChanged); // // textBoxCont // @@ -321,7 +318,7 @@ namespace Deckungsbeitrag this.textBoxCont.TabIndex = 31; this.textBoxCont.Text = "0"; this.textBoxCont.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - this.textBoxCont.TextChanged += new System.EventHandler(this.textBoxCont_TextChanged); + this.textBoxCont.TextChanged += new System.EventHandler(this.TextBoxCont_TextChanged); // // label1 // @@ -345,7 +342,7 @@ namespace Deckungsbeitrag this.comboBoxFahrer.Name = "comboBoxFahrer"; this.comboBoxFahrer.Size = new System.Drawing.Size(224, 38); this.comboBoxFahrer.TabIndex = 34; - this.comboBoxFahrer.Validating += new System.ComponentModel.CancelEventHandler(this.comboBoxFahrer_Validating); + this.comboBoxFahrer.Validating += new System.ComponentModel.CancelEventHandler(this.ComboBoxFahrer_Validating); // // buttonEinstellung // @@ -362,7 +359,7 @@ namespace Deckungsbeitrag this.buttonEinstellung.TabIndex = 46; this.buttonEinstellung.Text = "i"; this.buttonEinstellung.UseVisualStyleBackColor = true; - this.buttonEinstellung.Click += new System.EventHandler(this.buttonEinstellung_Click); + this.buttonEinstellung.Click += new System.EventHandler(this.ButtonEinstellung_Click); // // panelRegAuftrag // @@ -379,7 +376,7 @@ namespace Deckungsbeitrag this.panelRegAuftrag.Size = new System.Drawing.Size(569, 514); this.panelRegAuftrag.TabIndex = 47; this.panelRegAuftrag.Visible = false; - this.panelRegAuftrag.EnabledChanged += new System.EventHandler(this.panelRegAuftrag_EnabledChanged); + this.panelRegAuftrag.EnabledChanged += new System.EventHandler(this.PanelRegAuftrag_EnabledChanged); // // pictureBoxAddArtikel // @@ -393,7 +390,7 @@ namespace Deckungsbeitrag this.pictureBoxAddArtikel.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.pictureBoxAddArtikel.TabIndex = 39; this.pictureBoxAddArtikel.TabStop = false; - this.pictureBoxAddArtikel.Click += new System.EventHandler(this.pictureBoxAddArtikel_Click); + this.pictureBoxAddArtikel.Click += new System.EventHandler(this.PictureBoxAddArtikel_Click); // // label8 // @@ -419,7 +416,7 @@ namespace Deckungsbeitrag this.comboBoxArtikel.Name = "comboBoxArtikel"; this.comboBoxArtikel.Size = new System.Drawing.Size(449, 38); this.comboBoxArtikel.TabIndex = 37; - this.comboBoxArtikel.SelectedIndexChanged += new System.EventHandler(this.comboBoxArtikel_SelectedIndexChanged); + this.comboBoxArtikel.SelectedIndexChanged += new System.EventHandler(this.ComboBoxArtikel_SelectedIndexChanged); // // label7 // @@ -506,7 +503,7 @@ namespace Deckungsbeitrag this.Controls.Add(this.pictureBoxMinus); this.Controls.Add(this.pictureBoxPlus); this.Controls.Add(this.label5); - this.Controls.Add(this.label4); + this.Controls.Add(this.labelLiefertag); this.Controls.Add(this.label3); this.Controls.Add(this.textBoxKundeName); this.Controls.Add(this.label2); @@ -529,7 +526,6 @@ namespace Deckungsbeitrag this.Text = "NEUER AUFTRAG"; this.HelpButtonClicked += new System.ComponentModel.CancelEventHandler(this.FormNeuerAuftrag_HelpButtonClicked); this.Load += new System.EventHandler(this.FormNeuerAuftrag_Load); - this.Shown += new System.EventHandler(this.FormNeuerAuftrag_Shown); this.panelRegAuftrag.ResumeLayout(false); this.panelRegAuftrag.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxAddArtikel)).EndInit(); @@ -548,7 +544,7 @@ namespace Deckungsbeitrag private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBoxKundeName; private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label labelLiefertag; private System.Windows.Forms.Label label5; private System.Windows.Forms.PictureBox pictureBoxPlus; private System.Windows.Forms.PictureBox pictureBoxMinus; diff --git a/AA-Forms/FormNeuerAuftrag.cs b/AA-Forms/FormNeuerAuftrag.cs index 893bd63..7c473d8 100644 --- a/AA-Forms/FormNeuerAuftrag.cs +++ b/AA-Forms/FormNeuerAuftrag.cs @@ -33,20 +33,17 @@ namespace Deckungsbeitrag public Auftrag extraAuftrag; public Fach fach; public AuftragArtikel AuftragArtikel; - private Benutzer benutzer; - private Maschine maschine; - bool extra; + private readonly Benutzer benutzer; List sortimentListe; public DateTime? letzterLiefertag; - private Kunde knd; public DataGridViewCell aktivCell; - private string userid; - private AuftragTyp auftragtyp = AuftragTyp.Standart; + private readonly string userid; + private readonly AuftragTyp auftragtyp = AuftragTyp.Standart; private string eingabe = string.Empty; - private DateTime nextLiefertag = DateTime.Today; - private OnboardingSchritt onBoardingArt = OnboardingSchritt.NeuerAuftrag; + private readonly OnboardingSchritt onBoardingArt = OnboardingSchritt.NeuerAuftrag; string[] touren; string tour; + string kundeName = string.Empty; #endregion @@ -54,6 +51,7 @@ namespace Deckungsbeitrag public FormNeuerAuftrag() { InitializeComponent(); + this.Text += " Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); } public FormNeuerAuftrag(Benutzer benutzer) : this() { @@ -75,94 +73,42 @@ namespace Deckungsbeitrag if (userid.Contains("wstrasse02")) this.benutzer = Benutzer.GetBenutzer("ws2", null); } #endregion - private void FormNeuerAuftrag_Load(object sender, EventArgs e) - { - string kndService = string.Empty; - this.Text += " Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); + private void FormNeuerAuftrag_Load(object sender, EventArgs e) + { // SortimentListe holen sortimentListe = Funktionen.SortimentLesen("Liste"); - // Kunde holen - - if (auftragtyp == AuftragTyp.Regelmäßig) kndService = "Geschäft"; + string kndService = string.Empty; + if (this.auftragtyp == AuftragTyp.Regelmäßig) {kndService = "Geschäft"; labelLiefertag.Text = "Erster Liefertag:"; } if (this.benutzer.Rolle == BenutzerRolle.Fahrer) kndService = "Geschäft"; - this.kunde = Funktionen.Open_List(kndService); - - // ComboBox AuftragTyp wird geladen und richtiges Item selected. - // Falls KundenAuswahl null liefert wird Form geschlossen oder wenn Waschstrasse neu geladen. - if (this.kunde != null) - { - if (this.auftragtyp != AuftragTyp.Regelmäßig) - { - Saison Saison = Saison.GetAktivSaison(); - if (Saison.Bezeichnung == "Sommer") nextLiefertag = Funktionen.GetNextLiefertag((Liefertage)this.kunde.SommerLieferRhythmus); - if (Saison.Bezeichnung == "Winter") nextLiefertag = Funktionen.GetNextLiefertag((Liefertage)this.kunde.WinterLieferRhythmus); - if (Saison.Bezeichnung == "Zwischensaison") - { - bool? ok = ShowTourenplan(); - if (ok == null) { this.Close(); return; } - if ((bool)!ok) - { - - meldung.GetInfo(this, "Achtung Liefertag kann falsch sein, da Zwischensaison ist.", false); - DateTime datum = DateTime.Today; - int tage = 2; - while (tage > 0) - { - datum = datum.AddDays(1); - if (datum.DayOfWeek != DayOfWeek.Saturday && datum.DayOfWeek != DayOfWeek.Sunday) - { - tage--; - } - } - nextLiefertag = datum; - } - } - } - comboBoxTyp_Load(); - comboBoxFahrer_Load(); - DatenLaden(); - } - else - { - this.DialogResult = DialogResult.Cancel; - this.Close(); - } - - this.textBoxKundeName.Enabled = false; - this.textBoxKndNr.Enabled = false; - - // RadioButtons und ComboBoxen laden. - if(this.kunde != null) Funktionen.Get_RadioButtons(this); - + DatenLaden(kndService); } - private bool? ShowTourenplan() + private async void FormNeuerAuftrag_HelpButtonClicked(object sender, CancelEventArgs e) { - FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer, this.kunde); - if (showUserControl.ShowDialog() == DialogResult.OK) - { - var data = showUserControl.lieferDaten; - nextLiefertag = data.datum; - touren = data.touren; - tour = data.text; - return true; - } - - if (MessageBox.Show("Möchtest du die Eingabe von Aufträgen beenden?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return false; - else { return null; } + this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen + await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus + ZeigeOnboarding(); + } /// /// Kundendaten Liefertag werden eingefügt. /// - private void DatenLaden() + private void DatenLaden(string kndService) { - this.textBoxKndNr.Text = kunde.KundeNummer; - if (string.IsNullOrWhiteSpace(kunde.Suchtext)) this.textBoxKundeName.Text = kunde.KundeName; - else this.textBoxKundeName.Text = kunde.Suchtext; - this.dTPLiefertag.Value = nextLiefertag; - this.textBoxCont.Text = "0"; + // Kunde laden + GetKunde(kndService); + + // Containeranzahl laden + GetContainerAnzahl(); + + // NextLiefertag laden + GetNextLiefertag(); + + // ComboBox Typ & Fahrer wird mit Items geladen + ComboBoxTyp_Load(); + ComboBoxFahrer_Load(); if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { @@ -171,19 +117,112 @@ namespace Deckungsbeitrag } else this.comboBoxFahrer.SelectedIndex = -1; - dTPLiefertag_Leave(this.dTPLiefertag, EventArgs.Empty); } - private void comboBoxTyp_Load() + private void GetNextLiefertag() + { + DateTime nextLiefertag = DateTime.Today; + Saison Saison = Saison.GetAktivSaison(); + if (Saison.Bezeichnung == "Sommer") nextLiefertag = Funktionen.GetNextLiefertag((Liefertage)this.kunde.SommerLieferRhythmus); + if (Saison.Bezeichnung == "Winter") nextLiefertag = Funktionen.GetNextLiefertag((Liefertage)this.kunde.WinterLieferRhythmus); + // Wenn aktive Saison ist Zwischensaison, wird der Tourenplan angezeigt und die Auswahl von Liefertag(Datum) & Tour(Fahrer) übernommen. + if (Saison.Bezeichnung == "Zwischensaison") + { + var data = ShowTourenplan(); + // Wenn ShowTourenplan null retour gibt, wird das Schließen der Form abgefragt. + if (data.datum == null) + { + if (MessageBox.Show("Möchtest du die Eingabe von Aufträgen beenden?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + // Wenn trotzdem nicht geschlossen werden soll, wir die Info angezeigt, dass der Liefertag falsch sein kann. + meldung.GetInfo(this, "Achtung Liefertag kann falsch sein, da Zwischensaison ist.", false); + DateTime datum = DateTime.Today; + int tage = 2; + while (tage > 0) + { + datum = datum.AddDays(1); + if (datum.DayOfWeek != DayOfWeek.Saturday && datum.DayOfWeek != DayOfWeek.Sunday) + { + tage--; + } + } + nextLiefertag = datum; + } + else + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + } + else + { + // Wenn ShowTourenplan Daten retour gibt, werden diese geladen. + nextLiefertag = (DateTime)data.datum; + tour = data.tour ?? null; + } + } + + if (this.auftragtyp == AuftragTyp.Regelmäßig) nextLiefertag = DateTime.Today.AddDays(1); + this.dTPLiefertag.Value = nextLiefertag; + + // Die Wochentag RadioButtons werden geladen. Wichtig wenn der Tag null ist vor DTPLiefertag_Leave durchführen. + if (this.rBMO.Tag == null) Funktionen.Get_RadioButtons(this); + + // Der Richtige RadioButton wird als aktiv markiert. + DTPLiefertag_Leave(this.dTPLiefertag, EventArgs.Empty); + } + private void GetKunde(string kndService) + { + try + { + this.kunde = Funktionen.Open_List(kndService); + + this.textBoxKndNr.Text = kunde.KundeNummer; + this.textBoxKundeName.Text = this.kunde.Suchtext ?? this.kunde.KundeName; + + this.textBoxKundeName.Enabled = false; + this.textBoxKndNr.Enabled = false; + + } + catch (Exception) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + } + private void GetContainerAnzahl() + { + int anzahl = 0; + if (int.TryParse(Interaction.InputBox($"Wieviel Container hast du beim Kunde {kundeName} abgeholt?", "CONTAINERANZAHL", "1"), out int i)) anzahl = i; + + this.textBoxCont.Text = anzahl.ToString(); + } + private (DateTime? datum, string[] touren, string tour) ShowTourenplan() + { + FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer, this.kunde); + if (showUserControl.ShowDialog() == DialogResult.OK) + { + var data = showUserControl.lieferDaten; + return (data.datum, data.touren, data.text); + } + return (null, null, null); + } + + #region ComboBox-Events + /// + /// ComboBox wird mit AuftragTyp geladen. + /// SelectedItem wird gewählt. Wenn Kunde Service ist Geschäft dann Geschäft, sonst Prop. auftragtyp. + /// + private void ComboBoxTyp_Load() { try { this.SuspendLayout(); - this.comboBoxTyp.SelectedValueChanged -= comboBoxTyp_SelectedValueChanged; + this.comboBoxTyp.SelectedValueChanged -= ComboBoxTyp_SelectedValueChanged; // Items werden von AuftragTyp geladen. this.comboBoxTyp.DataSource = Enum.GetValues(typeof(AuftragTyp)); // Wenn der Kunde ein Geschäftskunde ist, wird AuftragTyp.Geschäft ausgewählt. Andernfalls wird der AuftragTyp aus dem Konstruktor gewählt. - this.comboBoxTyp.SelectedValueChanged += comboBoxTyp_SelectedValueChanged; + this.comboBoxTyp.SelectedValueChanged += ComboBoxTyp_SelectedValueChanged; if (kunde.Service == "Geschäft") this.comboBoxTyp.SelectedItem = AuftragTyp.Geschäft; else this.comboBoxTyp.SelectedItem = auftragtyp; @@ -202,7 +241,12 @@ namespace Deckungsbeitrag throw; } } - private void comboBoxFahrer_Load() + + /// + /// ComboBox wird mit Fahrerliste geladen. + /// Wenn Prop. tour ist leer wird Benutzername angezeigt, sonst Tourbezeichnung. + /// + private void ComboBoxFahrer_Load() { List benutzerliste = Benutzer.GetFahrerList(); this.comboBoxFahrer.DataSource = benutzerliste; @@ -210,366 +254,14 @@ namespace Deckungsbeitrag else this.comboBoxFahrer.DisplayMember = "Tour"; } - - /// - /// Button Click Events. - /// - /// - /// - private void buttonAbbrechen_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - this.Close(); - } - private void buttonSpeichern_Click(object sender, EventArgs e) - { - if (!this.ValidateChildren(ValidationConstraints.Enabled)) return; - - if(kunde == null) - { - MessageBox.Show("Auftrag kann nicht gespeichert werden. Kein Kunde vorhanden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - this.textBoxKndNr.Focus(); - return; - } - - this.Auftrag = Aktualisieren(kunde); - - // Wenn Fahrer den Auftrag speichert - if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { FahrerAuftraegeSpeichern(this.Auftrag); return; } - - // Wenn Expedit/Waschstrasse/Verwaltung/Admin den Auftrag speichert - switch ((AuftragTyp)comboBoxTyp.SelectedItem) - { - //case AuftragTyp.Geschäft: - // break; - //case AuftragTyp.Standart: - // break; - //case AuftragTyp.Inventur: - // break; - //case AuftragTyp.AufAbruf: - // break; - case AuftragTyp.Standerhöhung: SpezialAuftragSpeichern(Auftrag); - return; - case AuftragTyp.Standverminderung: SpezialAuftragSpeichern(Auftrag); - return; - case AuftragTyp.Regelmäßig: SpezialAuftragSpeichern(Auftrag); - return; - case AuftragTyp.Einmalig: SpezialAuftragSpeichern(Auftrag); - return; - default: - break; - } - - if (Auftrag.FindeAuftrag(true).Gefunden) //TODO: Aufträge zusammenführen wenn gleicher Kunde und Liefertag. - { - if (meldung.AuftragVorhanden(Auftrag) == DialogResult.Yes) - { - - if (benutzer.Rolle == BenutzerRolle.Verwaltung || benutzer.Rolle == BenutzerRolle.Admin) Auftrag.Status = AuftragStatus.Herrichten; - else Auftrag.Status = AuftragStatus.Abgeholt; - - //Wenn SONDERAUFTRAG(STH,STV,STA) dann ARTIKEL speichern. - if (Auftrag.Typ >= AuftragTyp.Inventur & Auftrag.Typ <= AuftragTyp.Standverminderung) - { - int tosave = 0; - int saved = 0; - //Kontrolle ob alle Artikel gespeichert wurden. - if (saved != tosave) meldung.Speicherfehler(); - else - { - //Speichern von AUFTRAG - Auftrag.Save(); - //GetInventurCSV(); - } - } - else - { - if (!extra) - { - if (Auftrag.Save()[1] == 1) this.Close(); - } - else Auftrag.Save(); - } - } - else { Auftrag = new Auftrag(); FormNeuerAuftrag_Load(this, e); return; } - } - else - { - switch (benutzer.Rolle) - { - case BenutzerRolle.Verwaltung: - Auftrag.Status = AuftragStatus.Herrichten; - break; - case BenutzerRolle.Fahrer: - Auftrag.Status = AuftragStatus.Abgeholt; - if (Auftrag.ArbeiterID == null) Auftrag.ArbeiterID = benutzer.BenutzerID; - break; - case BenutzerRolle.Admin: - Auftrag.Status = AuftragStatus.Herrichten; - break; - case BenutzerRolle.Waschstrasse: - Auftrag.Status = AuftragStatus.Aufgelegt; - break; - case BenutzerRolle.Master: - break; - case BenutzerRolle.Expedit: - Auftrag.Status = AuftragStatus.Gewaschen; - break; - case BenutzerRolle.Frottee: - break; - case BenutzerRolle.Flach: - break; - default: - break; - } - - Auftrag.Save(); - } - - this.DialogResult = DialogResult.OK; - this.Close(); - } - private Auftrag Aktualisieren(Kunde knd) - { - int? arbeiterID; - DateTime liefertag; - string zusatz = string.Empty; - - // Wenn Kundennummer ist Div.Barzahler(in FormListe wenn mit ? am Anfang) wird individueller Kundename als Zusatzinfo gespeichert. - if (knd.KundeNummer == "2320000") zusatz = string.IsNullOrWhiteSpace(knd.Suchtext) ? "Kunde: " + knd.KundeName : "Kunde: " + knd.Suchtext; - else if (!string.IsNullOrWhiteSpace(eingabe)) zusatz = "Fahrerwechsel: " + eingabe; - - Auftrag _auftrag = new Auftrag() - { - AuftragID = this.Auftrag == null ? null : this.Auftrag.AuftragID, - KundeID = (int)knd.KundeID, - ArbeiterID = arbeiterID = this.comboBoxFahrer.SelectedIndex == -1 ? null : ((Benutzer)this.comboBoxFahrer.SelectedItem).BenutzerID, - AufgabeID = knd.Aufgabe != null ? knd.Aufgabe : null, - Liefertag = liefertag = this.dTPLiefertag.Value, - Container = int.TryParse(this.textBoxCont.Text, out int i) ? i : 0, - ErstelltVon = (int)this.benutzer.BenutzerID, - Erstellt = DateTime.Now, - Typ = (AuftragTyp)comboBoxTyp.SelectedItem, - Abteilungen = AbteilungsStatus.Keine, - Priority = Funktionen.GetPriority((Benutzer)this.comboBoxFahrer.SelectedItem), - Status = this.benutzer.Rolle == BenutzerRolle.Fahrer ? AuftragStatus.Abgeholt : AuftragStatus.Herrichten, - Rhythmus = this.comboBoxRhythmus.Enabled ? (RegRhythmen)this.comboBoxRhythmus.SelectedItem : RegRhythmen.Unbekannt, - TourID = this.Auftrag.TourID == null || this.Auftrag.TourID == 0 ? GetTour(arbeiterID, liefertag) : this.Auftrag.TourID, - ZusatzInfo = zusatz, - }; - - return _auftrag; - } - private int? GetTour(int? arbeiterID, DateTime liefertag) - { - Tour tour = null; - do - { - tour = Tour.FindeTour(null, arbeiterID, liefertag); - if (tour == null) Funktionen.UpdateOrSaveTour(Auftrag.TourID, Auftrag); - - } while (tour == null); - - return tour.TourID; - } - private void SpezialAuftragSpeichern(Auftrag Auftrag) - { - if (Auftrag.FindeAuftrag(true).Gefunden) - { - int aufID = Auftrag.FindeAuftrag(false).auftragID; - Auftrag auf = Auftrag.GetAuftrag(aufID); - List liste = AuftragArtikel.GetList(auf.AuftragID); - string output = string.Join(Environment.NewLine, liste.Select(a => $"{a.ArtikelName,-20} {a.Anzahl,4} Stk.")); - if (MessageBox.Show($"Es wurde ein Auftrag von {kunde.Suchtext ?? kunde.KundeName} für {auf.Liefertag.ToShortDateString()}\nmit folgenden Artikeln gefunden:\n\n{output}\nGeplanter Rhythmus: {Lieferrhythmen.Rhythmus}\n\nMöchtest du den Auftrag als erledigt markieren?", "AUFTRAG GEFUNDEN", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - auf.Status = AuftragStatus.Erledigt; - - foreach (AuftragArtikel art in liste) { art.Erledigt = true; art.Save(); } - if (auf.Save()[0] != 1) meldung.Speicherfehler(); - } - else return; - } - - if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); - else - { - foreach (UCArtikel uca in this.fLPArtikel.Controls) - { - int? id; - string artname; - if (uca.Tag != null) - { - if (uca.Tag is Artikel) - { - id = ((Artikel)uca.Tag).ArtikelID; - artname = ((Artikel)uca.Tag).Nummer + ((Artikel)uca.Tag).Bezeichnung; - } - else - { - id = ((KundeArtikel)uca.Tag).ArtikelID; - artname = ((KundeArtikel)uca.Tag).ArtikelNR + ((KundeArtikel)uca.Tag).ArtikelName; - } - } - else - { - id = null; - artname = uca.ArtikelName.ToString(); - } - AuftragArtikel aufart = new AuftragArtikel() - { - AuftragID = Auftrag.AuftragID, - ArtikelID = id, - ArtikelName = artname, - Anzahl = uca.Anzahl, - Erledigt = false, - Gesamt = uca.Anzahl, - }; - aufart.Save(); - } - } - this.Close(); - } - private void FahrerAuftraegeSpeichern(Auftrag Auftrag) - { - if (Auftrag.FindeAuftrag(false).Gefunden) - { - if (meldung.GetFrage(this, $"Der Auftrag {Kunde.GetKunde(null, Auftrag.KundeID, null).Suchtext} Liefertag {Auftrag.Liefertag.ToShortDateString()} ist bereits vorhanden.\nMöchtest du diesen bearbeiten?\n\n[JA] => Auftrag bearbeiten\n[NEIN] => Neuen Auftrag erstellen", false) == DialogResult.Yes) - { - Auftrag = Auftrag.GetAuftrag(Auftrag.FindeAuftrag(false).auftragID); - Auftrag.Container += int.Parse(this.textBoxCont.Text); - if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); - else meldung.GetInfo(this, $"Der Auftrag wurde bearbeitet.\nBitte suche den Auftrag von {Kunde.GetKunde(null, Auftrag.KundeID, null).Suchtext} mit Liefertag {Auftrag.Liefertag.ToShortDateString()} und stelle deine Container dazu.\nVergiss nicht die Containeranzahl auf der Karte auszubessern.", false); - } - else - { - Auftrag.ZusatzInfo += " Auftrag 2"; - if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); - else meldung.GetInfo(this, "Der Auftrag wurde als neuer Auftrag gespeichert.\nBitte vermerke auf der Containerkarte, dass dieser Auftrag 'Auftrag 2' ist.\n\nSollte das nicht richtig sein, melde es deinem Vorgesetzten.", false); - } - } - else if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); - - if (this.benutzer.Rolle == BenutzerRolle.Fahrer) - { - this.Auftrag = null; - this.kunde = Funktionen.KundenAuswahl(); - if (this.kunde != null) - { - bool? ok = ShowTourenplan(); - if (ok == null) { this.Close(); return; } - if ((bool)ok) - { - DatenLaden(); - return; - } - else this.Close(); - } - else this.Close(); - } - } - - 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")) cont--; - this.textBoxCont.Text = cont.ToString(); - } - - /// - /// TextBox Events - /// - /// - /// - private void textBoxCont_TextChanged(object sender, EventArgs e) - { - if (this.textBoxCont.Text == "0") { this.pictureBoxMinus.Enabled = false; this.pictureBoxMinus.BackColor = Color.Gray; } - else { this.pictureBoxMinus.Enabled = true; this.pictureBoxMinus.BackColor = Color.Red; } - } - - /// - /// Liefertag mit automatischer Berechnung des nächsten Datums bzw. des Wochentages des Datums. - /// - /// - /// - private void dTPLiefertag_Leave(object sender, EventArgs e) - { - foreach (RadioButton liefertag in this.Controls.OfType()) - { - if (liefertag.Name.Contains(((Liefertag)dTPLiefertag.Value.DayOfWeek).ToString())) liefertag.Checked = true; - } - } - private void Liefertag_rB_Checked(object sender, EventArgs e) - { - foreach (RadioButton radioButton in this.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); - } - private void textBoxKndNr_Click(object sender, EventArgs e) - { - this.textBoxKndNr.Clear(); - //Process.Start("C:\\Windows\\WinSxS\\amd64_microsoft-windows-osk_31bf3856ad364e35_10.0.22621.3672_none_8a93c823d58f9d77\\osk.exe"); - } - - //Wenn der Kunde nicht gefunden wird und händisch eingegeben wird, wird beim verlassen der Textbox der Kunde als DIV ZIELKUNDE erstellt. - //Der individuelle Kundename wird als KUNDE.SUCHTEXT eingetragen aber nicht gespeichert. - private void textBoxKundeName_Leave(object sender, EventArgs e) - { - if (!string.IsNullOrWhiteSpace(textBoxKundeName.Text)) - { - kunde = Kunde.GetKunde("2300000", null, null); - kunde.Suchtext = this.textBoxKundeName.Text; - } - } - - //Wenn mit TAB aus Textbox gesprungen wird, wird Focus auf TEXTBOX KUNDENAME gelegt. (Dadurch wird Fehlermeldung aktiviert) - private void textBoxKndNr_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) - { - if (e.KeyValue == 9) textBoxKundeName.Focus(); - } - - /// - /// Überprüfen ob die Eingabe eine Zahl ist. Es wird sonst eine Meldung angezeigt und das weiterspringen wird verhindert. - /// - /// - /// - 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; - } - } - } - - private void comboBoxTyp_SelectedValueChanged(object sender, EventArgs e) + private void ComboBoxTyp_SelectedValueChanged(object sender, EventArgs e) { if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { if ((AuftragTyp)comboBoxTyp.SelectedValue != AuftragTyp.Standart & (AuftragTyp)comboBoxTyp.SelectedValue != AuftragTyp.AufAbruf) { - meldung.GetFehler(this, "Unerlaubter AuftragTyp. Bitte wähle Standart oder AufAbruf."); + meldung.GetFehler(this, "Unerlaubter AuftragTyp. Bitte wähle Standard oder AufAbruf."); + this.comboBoxTyp.SelectedItem = AuftragTyp.Standart; return; } } @@ -623,8 +315,27 @@ namespace Deckungsbeitrag break; } } + private void ComboBoxArtikel_SelectedIndexChanged(object sender, EventArgs e) + { + int index = 0; + int artAnzahl = 1; + string anzahl = string.Empty; + UCArtikel uca; + var art = this.comboBoxArtikel.SelectedItem; + do + { + if (index > 0) if (MessageBox.Show("Bitte nur ganze Zahlen eingeben.", "ACHTUNG", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; + anzahl = Interaction.InputBox($"Wieviel Stück sollen geliefert werden?\n\nStück:", "Artikelanzahl", ""); + index++; + } while (!int.TryParse(anzahl, out artAnzahl)); - private void comboBoxFahrer_Validating(object sender, CancelEventArgs e) + if (art is Artikel artikel) uca = new UCArtikel(artikel, artAnzahl); + else uca = new UCArtikel((KundeArtikel)art, artAnzahl); + uca.Width = fLPArtikel.Width - 25; + uca.DeleteClicked += Uca_DeleteClicked; + this.fLPArtikel.Controls.Add(uca); + } + private void ComboBoxFahrer_Validating(object sender, CancelEventArgs e) { if (((ComboBox)sender).SelectedIndex == -1) return; if (((Benutzer)((ComboBox)sender).SelectedItem).BenutzerID == this.benutzer.BenutzerID) return; @@ -637,53 +348,18 @@ namespace Deckungsbeitrag else eingabe += " / "; } } + #endregion - private void buttonEinstellung_Click(object sender, EventArgs e) + /// + /// ComboBox Artikel & Rhythmus wird geladen. + /// Je nach AuftragTyp werden verschiedene Items in die ComboBoxen geladen. + /// + /// + /// + private void PanelRegAuftrag_EnabledChanged(object sender, EventArgs e) { - FormKundeVW kundeVW = new FormKundeVW(this.kunde); - kundeVW.ShowDialog(); - } + comboBoxArtikel.SelectedIndexChanged -= ComboBoxArtikel_SelectedIndexChanged; - private void pictureBoxAddArtikel_Click(object sender, EventArgs e) - { - int index = 0; - int artAnzahl = 1; - string artname = string.Empty; - string anzahl = string.Empty; - UCArtikel uca; - - artname = Interaction.InputBox($"Möchtest du einen individuellen Artikel eingeben?\n\nArtikelname:", "ARTIKELNAME WÄHLEN", ""); - if (!string.IsNullOrWhiteSpace(artname)) - { - do - { - if (index > 0) if (MessageBox.Show("Bitte nur ganze Zahlen eingeben.", "ACHTUNG", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; - anzahl = Interaction.InputBox($"Wieviel Stück sollen geliefert werden?\n\nStück:", "Artikelanzahl", ""); - index++; - } while (!int.TryParse(anzahl, out artAnzahl)); - } - - var art = new Artikel() - { - Bezeichnung = artname, - Nummer = 0000 - }; - - uca = new UCArtikel(art, artAnzahl); - uca.Width = fLPArtikel.Width - 25; - uca.DeleteClicked += Uca_DeleteClicked; - this.fLPArtikel.Controls.Add(uca); - } - - private void Uca_DeleteClicked(object sender, EventArgs e) - { - this.fLPArtikel.Controls.Remove((UCArtikel)sender); - } - - private void panelRegAuftrag_EnabledChanged(object sender, EventArgs e) - { - comboBoxArtikel.SelectedIndexChanged -= comboBoxArtikel_SelectedIndexChanged; - Panel panel = sender as Panel; int dropdownWidth = comboBoxArtikel.DropDownWidth; if (panel.Enabled) @@ -725,20 +401,317 @@ namespace Deckungsbeitrag } } - comboBoxArtikel.SelectedIndexChanged += comboBoxArtikel_SelectedIndexChanged; + comboBoxArtikel.SelectedIndexChanged += ComboBoxArtikel_SelectedIndexChanged; } - private void FormNeuerAuftrag_Shown(object sender, EventArgs e) + #region Click Events + private void ButtonAbbrechen_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + private void ButtonSpeichern_Click(object sender, EventArgs e) + { + if (!this.ValidateChildren(ValidationConstraints.Enabled)) return; + + if(this.kunde == null) + { + MessageBox.Show("Auftrag kann nicht gespeichert werden. Kein Kunde vorhanden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + this.textBoxKndNr.Focus(); + return; + } + + this.Auftrag = Aktualisieren(kunde); + + // Wenn Fahrer den Auftrag speichert + if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { FahrerAuftraegeSpeichern(this.Auftrag); return; } + + // Wenn Expedit/Waschstrasse/Verwaltung/Admin den Auftrag speichert + switch ((AuftragTyp)comboBoxTyp.SelectedItem) + { + case AuftragTyp.Standerhöhung: SpezialAuftragSpeichern(Auftrag); + return; + case AuftragTyp.Standverminderung: SpezialAuftragSpeichern(Auftrag); + return; + case AuftragTyp.Regelmäßig: SpezialAuftragSpeichern(Auftrag); + return; + case AuftragTyp.Einmalig: SpezialAuftragSpeichern(Auftrag); + return; + default: + break; + } + + if (Auftrag.FindeAuftrag(true).Gefunden) //TODO: Aufträge zusammenführen wenn gleicher Kunde und Liefertag. + { + if (meldung.AuftragVorhanden(Auftrag) == DialogResult.Yes) + { + if (benutzer.Rolle == BenutzerRolle.Verwaltung || benutzer.Rolle == BenutzerRolle.Admin) Auftrag.Status = AuftragStatus.Herrichten; + else Auftrag.Status = AuftragStatus.Abgeholt; + } + else { this.Auftrag = new Auftrag(); FormNeuerAuftrag_Load(this, e); return; } + } + else + { + switch (benutzer.Rolle) + { + case BenutzerRolle.Verwaltung: + Auftrag.Status = AuftragStatus.Herrichten; + break; + case BenutzerRolle.Fahrer: + Auftrag.Status = AuftragStatus.Abgeholt; + if (Auftrag.ArbeiterID == null) Auftrag.ArbeiterID = benutzer.BenutzerID; + break; + case BenutzerRolle.Admin: + Auftrag.Status = AuftragStatus.Herrichten; + break; + case BenutzerRolle.Waschstrasse: + Auftrag.Status = AuftragStatus.Aufgelegt; + break; + case BenutzerRolle.Master: + break; + case BenutzerRolle.Expedit: + Auftrag.Status = AuftragStatus.Gewaschen; + break; + case BenutzerRolle.Frottee: + break; + case BenutzerRolle.Flach: + break; + default: + break; + } + + Auftrag.Save(); + } + + this.DialogResult = DialogResult.OK; + this.Close(); + } + private void ButtonEinstellung_Click(object sender, EventArgs e) { + FormKundeVW kundeVW = new FormKundeVW(this.kunde); + kundeVW.ShowDialog(); } - - private async void FormNeuerAuftrag_HelpButtonClicked(object sender, CancelEventArgs e) + private void Uca_DeleteClicked(object sender, EventArgs e) { - this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen - await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus - ZeigeOnboarding(); - + this.fLPArtikel.Controls.Remove((UCArtikel)sender); } + private void PictureBoxAddArtikel_Click(object sender, EventArgs e) + { + int index = 0; + int artAnzahl = 1; + string artname = string.Empty; + string anzahl = string.Empty; + UCArtikel uca; + + artname = Interaction.InputBox($"Möchtest du einen individuellen Artikel eingeben?\n\nArtikelname:", "ARTIKELNAME WÄHLEN", ""); + if (!string.IsNullOrWhiteSpace(artname)) + { + do + { + if (index > 0) if (MessageBox.Show("Bitte nur ganze Zahlen eingeben.", "ACHTUNG", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; + anzahl = Interaction.InputBox($"Wieviel Stück sollen geliefert werden?\n\nStück:", "Artikelanzahl", ""); + index++; + } while (!int.TryParse(anzahl, out artAnzahl)); + } + + var art = new Artikel() + { + Bezeichnung = artname, + Nummer = 0000 + }; + + uca = new UCArtikel(art, artAnzahl) + { + Width = fLPArtikel.Width - 25 + }; + uca.DeleteClicked += Uca_DeleteClicked; + this.fLPArtikel.Controls.Add(uca); + } + 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")) cont--; + this.textBoxCont.Text = cont.ToString(); + } + #endregion + + private Auftrag Aktualisieren(Kunde knd) + { + int? arbeiterID; + DateTime liefertag; + string zusatz = string.Empty; + + // Wenn Kundennummer ist Div.Barzahler(in FormListe wenn mit ? am Anfang) wird individueller Kundename als Zusatzinfo gespeichert. + if (knd.KundeNummer == "2320000") zusatz = string.IsNullOrWhiteSpace(knd.Suchtext) ? "Kunde: " + knd.KundeName : "Kunde: " + knd.Suchtext; + else if (!string.IsNullOrWhiteSpace(eingabe)) zusatz = "Fahrerwechsel: " + eingabe; + + Auftrag _auftrag = new Auftrag + { + AuftragID = this.Auftrag?.AuftragID, + KundeID = (int)knd.KundeID, + ArbeiterID = arbeiterID = this.comboBoxFahrer.SelectedIndex == -1 ? null : ((Benutzer)this.comboBoxFahrer.SelectedItem).BenutzerID, + AufgabeID = knd.Aufgabe != null ? knd.Aufgabe : null, + Liefertag = liefertag = this.dTPLiefertag.Value, + Container = int.TryParse(this.textBoxCont.Text, out int i) ? i : 0, + ErstelltVon = (int)this.benutzer.BenutzerID, + Erstellt = DateTime.Now, + Typ = (AuftragTyp)comboBoxTyp.SelectedItem, + Abteilungen = AbteilungsStatus.Keine, + Priority = Funktionen.GetPriority((Benutzer)this.comboBoxFahrer.SelectedItem), + Status = this.benutzer.Rolle == BenutzerRolle.Fahrer ? AuftragStatus.Abgeholt : AuftragStatus.Herrichten, + Rhythmus = this.comboBoxRhythmus.Enabled ? (RegRhythmen)this.comboBoxRhythmus.SelectedItem : RegRhythmen.Unbekannt, + TourID = this.Auftrag == null ? GetTour(arbeiterID, liefertag) : this.Auftrag.TourID, + ZusatzInfo = zusatz, + }; + + + return _auftrag; + } + private int? GetTour(int? arbeiterID, DateTime liefertag) + { + Tour tour; + do + { + tour = Tour.FindeTour(null, arbeiterID, liefertag); + if (tour == null) Funktionen.UpdateOrSaveTour(Auftrag.TourID, Auftrag); + + } while (tour == null); + + return tour.TourID; + } + private void SpezialAuftragSpeichern(Auftrag Auftrag) + { + if (Auftrag.FindeAuftrag(true).Gefunden) + { + int aufID = Auftrag.FindeAuftrag(false).auftragID; + Auftrag auf = Auftrag.GetAuftrag(aufID); + List liste = AuftragArtikel.GetList(auf.AuftragID); + string output = string.Join(Environment.NewLine, liste.Select(a => $"{a.ArtikelName,-20} {a.Anzahl,4} Stk.")); + if (MessageBox.Show($"Es wurde ein Auftrag von {kunde.Suchtext ?? kunde.KundeName} für {auf.Liefertag:d}\nmit folgenden Artikeln gefunden:\n\n{output}\nGeplanter Rhythmus: {Lieferrhythmen.Rhythmus}\n\nMöchtest du den Auftrag als erledigt markieren?", "AUFTRAG GEFUNDEN", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + auf.Status = AuftragStatus.Erledigt; + + foreach (AuftragArtikel art in liste) { art.Erledigt = true; art.Save(); } + if (auf.Save()[0] != 1) meldung.Speicherfehler(); + } + else return; + } + + if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); + else + { + foreach (UCArtikel uca in this.fLPArtikel.Controls) + { + int? id; + string artname; + if (uca.Tag != null) + { + if (uca.Tag is Artikel artikel) + { + id = artikel.ArtikelID; + artname = artikel.Nummer + artikel.Bezeichnung; + } + else + { + id = ((KundeArtikel)uca.Tag).ArtikelID; + artname = ((KundeArtikel)uca.Tag).ArtikelNR + ((KundeArtikel)uca.Tag).ArtikelName; + } + } + else + { + id = null; + artname = uca.ArtikelName.ToString(); + } + AuftragArtikel aufart = new AuftragArtikel() + { + AuftragID = Auftrag.AuftragID, + ArtikelID = id, + ArtikelName = artname, + Anzahl = uca.Anzahl, + Erledigt = false, + Gesamt = uca.Anzahl, + }; + aufart.Save(); + } + } + this.Close(); + } + private void FahrerAuftraegeSpeichern(Auftrag Auftrag) + { + if (Auftrag.FindeAuftrag(false).Gefunden) + { + if (meldung.GetFrage(this, $"Der Auftrag {Kunde.GetKunde(null, Auftrag.KundeID, null).Suchtext} Liefertag {Auftrag.Liefertag:d} ist bereits vorhanden.\nMöchtest du diesen bearbeiten?\n\n[JA] => Auftrag bearbeiten\n[NEIN] => Neuen Auftrag erstellen", false) == DialogResult.Yes) + { + Auftrag = Auftrag.GetAuftrag(Auftrag.FindeAuftrag(false).auftragID); + Auftrag.Container += int.Parse(this.textBoxCont.Text); + if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); + else meldung.GetInfo(this, $"Der Auftrag wurde bearbeitet.\nBitte suche den Auftrag von {Kunde.GetKunde(null, Auftrag.KundeID, null).Suchtext} mit Liefertag {Auftrag.Liefertag:d} und stelle deine Container dazu.\nVergiss nicht die Containeranzahl auf der Karte auszubessern.", false); + } + else + { + Auftrag.ZusatzInfo += " Auftrag 2"; + if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); + else meldung.GetInfo(this, "Der Auftrag wurde als neuer Auftrag gespeichert.\nBitte vermerke auf der Containerkarte, dass dieser Auftrag 'Auftrag 2' ist.\n\nSollte das nicht richtig sein, melde es deinem Vorgesetzten.", false); + } + } + else if (Auftrag.Save()[0] != 1) meldung.Speicherfehler(); + + if (this.benutzer.Rolle == BenutzerRolle.Fahrer) + { + this.Auftrag = null; + + DatenLaden(string.Empty); + } + } + + /// + /// TextBox Events + /// + /// + /// + private void TextBoxCont_TextChanged(object sender, EventArgs e) + { + if (this.textBoxCont.Text == "0") { this.pictureBoxMinus.Enabled = false; this.pictureBoxMinus.BackColor = Color.Gray; } + else { this.pictureBoxMinus.Enabled = true; this.pictureBoxMinus.BackColor = Color.Red; } + } + + #region GetLiefertag etc. + /// + /// Liefertag mit automatischer Berechnung des nächsten Datums bzw. des Wochentages des Datums. + /// + /// + /// + private void DTPLiefertag_Leave(object sender, EventArgs e) + { + foreach (RadioButton liefertag in this.Controls.OfType()) + { + if (liefertag.Name.Contains(((Liefertag)dTPLiefertag.Value.DayOfWeek).ToString())) liefertag.Checked = true; + } + } + private void Liefertag_rB_Checked(object sender, EventArgs e) + { + foreach (RadioButton radioButton in this.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); + } + #endregion private async void ZeigeOnboarding() { if (this.benutzer.IstGesehen(onBoardingArt)) return; // Bereits fertig @@ -751,27 +724,6 @@ namespace Deckungsbeitrag //this.Close(); // Onboarding beendet } } - - private void comboBoxArtikel_SelectedIndexChanged(object sender, EventArgs e) - { - int index = 0; - int artAnzahl = 1; - string anzahl = string.Empty; - UCArtikel uca; - var art = this.comboBoxArtikel.SelectedItem; - do - { - if (index > 0) if (MessageBox.Show("Bitte nur ganze Zahlen eingeben.", "ACHTUNG", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; - anzahl = Interaction.InputBox($"Wieviel Stück sollen geliefert werden?\n\nStück:", "Artikelanzahl", ""); - index++; - } while (!int.TryParse(anzahl, out artAnzahl)); - - if (art is Artikel) uca = new UCArtikel((Artikel)art, artAnzahl); - else uca = new UCArtikel((KundeArtikel)art, artAnzahl); - uca.Width = fLPArtikel.Width - 25; - uca.DeleteClicked += Uca_DeleteClicked; - this.fLPArtikel.Controls.Add(uca); - } } } -//TODO: TourenListe Entwurf muss überarbeitet werden. +//TODO: TourenListe Entwurf muss überarbeitet werden. \ No newline at end of file diff --git a/AA-Forms/FormShowUserControl.cs b/AA-Forms/FormShowUserControl.cs index e8d2944..bcdc3a4 100644 --- a/AA-Forms/FormShowUserControl.cs +++ b/AA-Forms/FormShowUserControl.cs @@ -93,7 +93,6 @@ namespace Deckungsbeitrag.AA_Forms private void FormShowUserControl_Shown(object sender, EventArgs e) { this.ClientSize = new Size(uc.Width, uc.Height); - //ucs.Location = new Point(5, 10); } private void FormShowUserControl_FormClosing(object sender, FormClosingEventArgs e) @@ -103,7 +102,6 @@ namespace Deckungsbeitrag.AA_Forms { UCTourenplan uc = (UCTourenplan)form.Controls[0]; lieferDaten = uc.lieferDaten; - //this.DialogResult = DialogResult.OK; } } } diff --git a/AA-Forms/FormTourenplanung.Designer.cs b/AA-Forms/FormTourenplanung.Designer.cs index ca538c1..1bcb42c 100644 --- a/AA-Forms/FormTourenplanung.Designer.cs +++ b/AA-Forms/FormTourenplanung.Designer.cs @@ -48,8 +48,8 @@ this.tabControlLKW.SelectedIndex = 0; this.tabControlLKW.Size = new System.Drawing.Size(594, 411); this.tabControlLKW.TabIndex = 0; - this.tabControlLKW.SelectedIndexChanged += new System.EventHandler(this.tabControlLKW_SelectedIndexChanged); - this.tabControlLKW.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tabControlLKW_MouseDoubleClick); + this.tabControlLKW.SelectedIndexChanged += new System.EventHandler(this.TabControlLKW_SelectedIndexChanged); + this.tabControlLKW.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.TabControlLKW_MouseDoubleClick); // // flowLayoutPanelKunden // @@ -72,7 +72,7 @@ this.comboBoxFilter.Name = "comboBoxFilter"; this.comboBoxFilter.Size = new System.Drawing.Size(199, 33); this.comboBoxFilter.TabIndex = 2; - this.comboBoxFilter.SelectedIndexChanged += new System.EventHandler(this.comboBoxFilter_SelectedIndexChanged); + this.comboBoxFilter.SelectedIndexChanged += new System.EventHandler(this.ComboBoxFilter_SelectedIndexChanged); // // buttonAddPage // @@ -92,7 +92,7 @@ this.buttonAddPage.Text = "Neues Fahrzeug"; this.buttonAddPage.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.buttonAddPage.UseVisualStyleBackColor = false; - this.buttonAddPage.Click += new System.EventHandler(this.buttonAddPage_Click); + this.buttonAddPage.Click += new System.EventHandler(this.ButtonAddPage_Click); // // radioButtonSommer // @@ -110,7 +110,7 @@ this.radioButtonSommer.Text = "Sommer"; this.radioButtonSommer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.radioButtonSommer.UseVisualStyleBackColor = false; - this.radioButtonSommer.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + this.radioButtonSommer.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); // // radioButtonWinter // @@ -128,7 +128,7 @@ this.radioButtonWinter.Text = "Winter"; this.radioButtonWinter.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.radioButtonWinter.UseVisualStyleBackColor = false; - this.radioButtonWinter.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + this.radioButtonWinter.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); // // radioButtonFruehling26 // diff --git a/AA-Forms/FormTourenplanung.cs b/AA-Forms/FormTourenplanung.cs index def9a2e..0069038 100644 --- a/AA-Forms/FormTourenplanung.cs +++ b/AA-Forms/FormTourenplanung.cs @@ -21,8 +21,8 @@ namespace Deckungsbeitrag.AA_Forms public partial class FormTourenplanung : Form { private List kundenliste; - private Benutzer Benutzer; - Meldungen meldung = new Meldungen(); + private readonly Benutzer Benutzer; + readonly Meldungen meldung = new Meldungen(); #region Form-Konstruktor @@ -100,15 +100,17 @@ namespace Deckungsbeitrag.AA_Forms foreach (Kunde kunde in kundenliste) { // Wenn kein Suchtext vorhanden, dann KundeName verwenden. - UCKunde control = new UCKunde(kunde); - control.Tag = kunde; + UCKunde control = new UCKunde(kunde) + { + Tag = kunde + }; flowLayoutPanelKunden.Controls.Add(control); } } #region TabControl-Funktionen // 1. TabPage wird hinzugefügt. - private void buttonAddPage_Click(object sender, EventArgs e) + private void ButtonAddPage_Click(object sender, EventArgs e) { UCTabPageLKW uc = new UCTabPageLKW(); TabPage tp = new TabPage("Neue TabPage"); @@ -117,7 +119,7 @@ namespace Deckungsbeitrag.AA_Forms this.tabControlLKW.TabPages.Add(tp); } // 2. Umbennen mit DoppelClick starten - private void tabControlLKW_MouseDoubleClick(object sender, MouseEventArgs e) + private void TabControlLKW_MouseDoubleClick(object sender, MouseEventArgs e) { if (this.Benutzer.Rolle == BenutzerRolle.Admin || this.Benutzer.Rolle == BenutzerRolle.Verwaltung) { @@ -146,13 +148,15 @@ namespace Deckungsbeitrag.AA_Forms { return Interaction.InputBox(prompt, titel, defaultText); } - private void tabControlLKW_SelectedIndexChanged(object sender, EventArgs e) + private void TabControlLKW_SelectedIndexChanged(object sender, EventArgs e) { if (tabControlLKW.SelectedTab == null) return; if (tabControlLKW.SelectedTab.Controls.Count == 0) { - UCTabPageLKW uc = new UCTabPageLKW(); - uc.Dock = DockStyle.Fill; + UCTabPageLKW uc = new UCTabPageLKW + { + Dock = DockStyle.Fill + }; tabControlLKW.SelectedTab.Controls.Add(uc); } } @@ -179,8 +183,7 @@ namespace Deckungsbeitrag.AA_Forms } private void LadeAlleTabs() { - string json = string.Empty; - + string json; if (this.radioButtonSommer.Checked) { if (!File.Exists("lkw-touren-sommer.json")) return; @@ -206,8 +209,10 @@ namespace Deckungsbeitrag.AA_Forms TabPage tabPage = new TabPage(tabData.TourName); // UserControl erstellen - UCTabPageLKW uc = new UCTabPageLKW(); - uc.Dock = DockStyle.Fill; + UCTabPageLKW uc = new UCTabPageLKW + { + Dock = DockStyle.Fill + }; // DATEN laden! uc.LadeDaten(tabData); @@ -292,7 +297,7 @@ namespace Deckungsbeitrag.AA_Forms return true; } - private void comboBoxFilter_SelectedIndexChanged(object sender, EventArgs e) + private void ComboBoxFilter_SelectedIndexChanged(object sender, EventArgs e) { if (this.comboBoxFilter.SelectedIndex != -1) GetList((string)this.comboBoxFilter.SelectedItem); } @@ -300,8 +305,7 @@ namespace Deckungsbeitrag.AA_Forms public static void KundenControlToDelete(FormTourenplanung form, UCKunde kundectr) { Kunde _knd = (Kunde)kundectr.Tag; - int saisonrhythmus = 0; - + int saisonrhythmus; if (form.radioButtonSommer.Checked) { saisonrhythmus = _knd.SommerLieferRhythmus; } else { saisonrhythmus = _knd.WinterLieferRhythmus; } // Global über ALLE Tabs/Panels zählen @@ -358,7 +362,7 @@ namespace Deckungsbeitrag.AA_Forms } } - private void radioButton_CheckedChanged(object sender, EventArgs e) + private void RadioButton_CheckedChanged(object sender, EventArgs e) { RadioButton rb = sender as RadioButton; if (!rb.Checked) SpeichereAlleTabs(rb); diff --git a/AA-Forms/FormWSVerfolgung.cs b/AA-Forms/FormWSVerfolgung.cs index bc49fd0..5f73381 100644 --- a/AA-Forms/FormWSVerfolgung.cs +++ b/AA-Forms/FormWSVerfolgung.cs @@ -381,8 +381,6 @@ namespace Deckungsbeitrag.AA_Forms /// protected override bool ProcessDialogKey(Keys keyData) { - //TODO: Umbau in Switch. - // Escape [ESC] schließt den Screen. if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) { diff --git a/AA-Klassen/ArtikelNachwaesche.cs b/AA-Klassen/ArtikelNachwaesche.cs index 52f7a51..0247261 100644 --- a/AA-Klassen/ArtikelNachwaesche.cs +++ b/AA-Klassen/ArtikelNachwaesche.cs @@ -12,8 +12,8 @@ namespace Deckungsbeitrag.AA_Klassen { internal class ArtikelNachwaesche { - // 0 1 2 3 4 5 - private static string COLUMNS = "nw_artikel_id, artikel_id, datum, nachwaesche, nw_muell, nw_sauber"; + // 0 1 2 3 4 5 6 + private static string COLUMNS = "nw_artikel_id, artikel_id, datum, nachwaesche, nw_muell, nw_sauber, reklamation"; private static string TABLE = "kundenverwaltung.nw_artikel"; #region Class-Standarts (Properties, Save, reader) @@ -31,6 +31,7 @@ namespace Deckungsbeitrag.AA_Klassen public int Muell { get; set; } [OLVColumn("Sauber", DisplayIndex = 2)] public int Sauber { get; set; } + public int Reklamation { get; set; } public int? Save() { @@ -43,13 +44,13 @@ namespace Deckungsbeitrag.AA_Klassen if (this.NachwaescheID.HasValue & this.NachwaescheID != 0) { - command.CommandText = $"update {TABLE} set artikel_id = :p1, datum = :p2, nachwaesche = :p3, nw_muell = :p4, nw_sauber = :p5 WHERE nw_artikel_id = :p0"; + command.CommandText = $"update {TABLE} set artikel_id = :p1, datum = :p2, nachwaesche = :p3, nw_muell = :p4, nw_sauber = :p5, reklamation = :p6 WHERE nw_artikel_id = :p0"; } else { command.CommandText = "select nextval('kundenverwaltung.tour_seq')"; this.NachwaescheID = (int)(long)command.ExecuteScalar(); - command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5)"; + command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6)"; } command.Parameters.AddWithValue("p0", this.NachwaescheID); @@ -58,6 +59,7 @@ namespace Deckungsbeitrag.AA_Klassen command.Parameters.AddWithValue("p3", this.Nachwaesche); command.Parameters.AddWithValue("p4", this.Muell); command.Parameters.AddWithValue("p5", this.Sauber); + command.Parameters.AddWithValue("p6", this.Reklamation); result = command.ExecuteNonQuery(); @@ -75,6 +77,7 @@ namespace Deckungsbeitrag.AA_Klassen this.Nachwaesche = reader.IsDBNull(3) ? 0 : reader.GetInt32(3); this.Muell = reader.IsDBNull(4) ? 0 : reader.GetInt32(4); this.Sauber = reader.IsDBNull(5) ? 0 : reader.GetInt32(5); + this.Reklamation = reader.IsDBNull(6) ? 0 : reader.GetInt32(5); } #endregion diff --git a/AA-Klassen/Auftrag.cs b/AA-Klassen/Auftrag.cs index baf6788..3a7b6f4 100644 --- a/AA-Klassen/Auftrag.cs +++ b/AA-Klassen/Auftrag.cs @@ -199,7 +199,7 @@ namespace DatenDB return resultList; } - public static async Task>> GetAuftraegeProLiefertagAsync(NpgsqlConnection conn, AuftragTyp standart, AuftragStatus aufgelegt) + public static async Task>> GetAuftraegeProLiefertagAsync(NpgsqlConnection conn, AuftragStatus aufgelegt) { // ✅ 5 FIXED Keys mit Sonntags-Check @@ -236,75 +236,87 @@ namespace DatenDB { DatenbankConnection.GetConnection().Open(); List resultList = new List(); - NpgsqlCommand cmd = new NpgsqlCommand(); - cmd.Connection = DatenbankConnection.GetConnection(); - //cmd.CommandText = $"select {COLUMNS} from {TABLE} where status = 2 order by liefertag asc"; - if (kategorie == ArtikelKategorie.Frottee) cmd.CommandText = $"select {ACOLUMNS} from {TABLE} a JOIN kundenverwaltung.kunde_artikel k ON a.kunde_id = k.kunde_id JOIN kundenverwaltung.artikel b ON k.artikel_id = b.artikel_id WHERE a.status = 2 and b.kategorie = {(int)kategorie} or a.status = 2 and b.kategorie = 4 GROUP BY a.auftrag_id, a.kunde_id HAVING COUNT(*) >= 1"; - else cmd.CommandText = $"select {ACOLUMNS} from {TABLE} a JOIN kundenverwaltung.kunde_artikel k ON a.kunde_id = k.kunde_id JOIN kundenverwaltung.artikel b ON k.artikel_id = b.artikel_id WHERE a.status = 2 and b.kategorie = {(int)kategorie} GROUP BY a.auftrag_id, a.kunde_id HAVING COUNT(*) >= 1"; + using (NpgsqlCommand cmd = new NpgsqlCommand()) + { + cmd.Connection = DatenbankConnection.GetConnection(); + //cmd.CommandText = $"select {COLUMNS} from {TABLE} where status = 2 order by liefertag asc"; + if (kategorie == ArtikelKategorie.Frottee) cmd.CommandText = $"select {ACOLUMNS} from {TABLE} a JOIN kundenverwaltung.kunde_artikel k ON a.kunde_id = k.kunde_id JOIN kundenverwaltung.artikel b ON k.artikel_id = b.artikel_id WHERE a.status = 2 and b.kategorie = {(int)kategorie} or a.status = 2 and b.kategorie = 4 GROUP BY a.auftrag_id, a.kunde_id HAVING COUNT(*) >= 1"; + else cmd.CommandText = $"select {ACOLUMNS} from {TABLE} a JOIN kundenverwaltung.kunde_artikel k ON a.kunde_id = k.kunde_id JOIN kundenverwaltung.artikel b ON k.artikel_id = b.artikel_id WHERE a.status = 2 and b.kategorie = {(int)kategorie} GROUP BY a.auftrag_id, a.kunde_id HAVING COUNT(*) >= 1"; + + NpgsqlDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) resultList.Add(new Auftrag(reader)); + reader.Close(); + } - NpgsqlDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) resultList.Add(new Auftrag(reader)); - reader.Close(); DatenbankConnection.GetConnection().Close(); return resultList; } public static List GetRampeAuftragList() { - DatenbankConnection.GetConnection().Open(); - List resultList = new List(); - NpgsqlCommand cmd = new NpgsqlCommand(); - cmd.Connection = DatenbankConnection.GetConnection(); + DatenbankConnection.GetConnection().Open(); + List resultList = new List(); + using (NpgsqlCommand cmd = new NpgsqlCommand()) + { + cmd.Connection = DatenbankConnection.GetConnection(); - cmd.CommandText = $"select {COLUMNS} from {TABLE} where status = 0 order by liefertag asc"; + cmd.CommandText = $"select {COLUMNS} from {TABLE} where status = 0 order by liefertag asc"; - NpgsqlDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) resultList.Add(new Auftrag(reader)); - reader.Close(); - DatenbankConnection.GetConnection().Close(); - return resultList; + NpgsqlDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) resultList.Add(new Auftrag(reader)); + reader.Close(); + } + + DatenbankConnection.GetConnection().Close(); + return resultList; } public static List GetAuftragList(string s, Auftrag auftrag) - { - int? aID = null; - int? mID = null; - //Get MaschineID und AuftragID für Aufträge vor und nach Auftrag - if (auftrag != null) - { - mID = auftrag.MaschineID; - aID = auftrag.AuftragID; - } - //Get AufgabeID für Anzeige von Standerhöhungen - if (s == "STH") aID = (int)Aufgabe.GetAufgabe(s, null).AufgabeID; + { + int? aID = null; + int? mID = null; + //Get MaschineID und AuftragID für Aufträge vor und nach Auftrag + if (auftrag != null) + { + mID = auftrag.MaschineID; + aID = auftrag.AuftragID; + } + //Get AufgabeID für Anzeige von Standerhöhungen + if (s == "STH") aID = (int)Aufgabe.GetAufgabe(s, null).AufgabeID; DatenbankConnection.GetConnection().Open(); - List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); + List resultList = new List(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); - if (s == "Expedit") command.CommandText = $"select {COLUMNS} from {TABLE} where status = 3 order by liefertag asc"; - if (s == string.Empty) command.CommandText = $"select {COLUMNS} from {TABLE} where gedruckt is null and erledigt is null"; - if (s == "davor") command.CommandText = $"select {COLUMNS} from {TABLE} where maschine_id = {mID} and auftrag_id < {aID} order by liefertag asc limit 3"; - if (s == "danach") command.CommandText = $"select {COLUMNS} from {TABLE} where maschine_id = {mID} and auftrag_id > {aID} order by liefertag asc limit 3"; - if (s == "STH") command.CommandText = $"select {COLUMNS} from {TABLE} where status = 3 and aufgabe_id = {aID} order by liefertag"; + if (s == "Expedit") command.CommandText = $"select {COLUMNS} from {TABLE} where status = 3 order by liefertag asc"; + if (s == string.Empty) command.CommandText = $"select {COLUMNS} from {TABLE} where gedruckt is null and erledigt is null"; + if (s == "davor") command.CommandText = $"select {COLUMNS} from {TABLE} where maschine_id = {mID} and auftrag_id < {aID} order by liefertag asc limit 3"; + if (s == "danach") command.CommandText = $"select {COLUMNS} from {TABLE} where maschine_id = {mID} and auftrag_id > {aID} order by liefertag asc limit 3"; + if (s == "STH") command.CommandText = $"select {COLUMNS} from {TABLE} where status = 3 and aufgabe_id = {aID} order by liefertag"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Auftrag(reader)); - reader.Close(); - DatenbankConnection.GetConnection().Close(); - return resultList; - } + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Auftrag(reader)); + reader.Close(); + } + + DatenbankConnection.GetConnection().Close(); + return resultList; + } public static List GetAuftragStatsListToday(DateTime produktion) { DatenbankConnection.GetConnection().Open(); List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where typ = 1 and erstellt::date = '{produktion.Date}' order by liefertag asc"; + command.CommandText = $"select {COLUMNS} from {TABLE} where typ = 1 and erstellt::date = '{produktion.Date}' order by liefertag asc"; + + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Auftrag(reader)); + reader.Close(); + } - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Auftrag(reader)); - reader.Close(); DatenbankConnection.GetConnection().Close(); return resultList; } @@ -313,14 +325,17 @@ namespace DatenDB DateTime dateTime = NaechsterLiefertag(); DatenbankConnection.GetConnection().Open(); List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {ACOLUMNS} from {TABLE} a join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where typ >= {(int)AuftragTyp.Standart} and a.liefertag = '{dateTime}' and a.benutzer_id = {fahrer.BenutzerID} and a.status <= {(int)AuftragStatus.Fertig} order by k.region, k.bezeichnung"; + command.CommandText = $"select {ACOLUMNS} from {TABLE} a join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where typ >= {(int)AuftragTyp.Standart} and a.liefertag = '{dateTime}' and a.benutzer_id = {fahrer.BenutzerID} and a.status <= {(int)AuftragStatus.Fertig} order by k.region, k.bezeichnung"; + + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Auftrag(reader)); + reader.Close(); + } - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Auftrag(reader)); - reader.Close(); DatenbankConnection.GetConnection().Close(); return resultList; } @@ -332,12 +347,15 @@ namespace DatenDB try { DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where auftrag_id = {auftragID}"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = new Auftrag(reader); - reader.Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where auftrag_id = {auftragID}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = new Auftrag(reader); + reader.Close(); + } + DatenbankConnection.GetConnection().Close(); } @@ -351,15 +369,18 @@ namespace DatenDB return result; } public static Auftrag GetLastAuftrag(int? benutzerID) - { + { DatenbankConnection.GetConnection().Open(); Auftrag result = new Auftrag(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where erstellt_von = {benutzerID} order by erstellt desc limit 1"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = new Auftrag(reader); - reader.Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where erstellt_von = {benutzerID} order by erstellt desc limit 1"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = new Auftrag(reader); + reader.Close(); + } + DatenbankConnection.GetConnection().Close(); return result; @@ -368,21 +389,23 @@ namespace DatenDB { List result = new List(); DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - - command.Connection = DatenbankConnection.GetConnection(); - if (string.IsNullOrWhiteSpace(zusatz)) + using (NpgsqlCommand command = new NpgsqlCommand()) { - if (date == null) command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt}"; - else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and {datum} = '{date}'"; + command.Connection = DatenbankConnection.GetConnection(); + if (string.IsNullOrWhiteSpace(zusatz)) + { + if (date == null) command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt}"; + else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and {datum} = '{date}'"; + } + else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt} and zusatz ~* '{zusatz}'"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result.Add(new Auftrag(reader)); + reader.Close(); } - else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt} and zusatz ~* '{zusatz}'"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result.Add(new Auftrag(reader)); - reader.Close(); + DatenbankConnection.GetConnection().Close(); - return result; + return result; } private bool FindAuftragStatus(int? auftragid, AuftragStatus status) { @@ -413,7 +436,7 @@ namespace DatenDB } finally { - if (cmd != null) cmd.Dispose(); + cmd?.Dispose(); if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); @@ -428,13 +451,15 @@ namespace DatenDB try { DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select a.benutzer_id from {TABLE} a inner join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where k.region = '{kunde.Region}' and a.liefertag = '{liefertag.Date}' order by a.benutzer_id limit 1"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = reader.GetInt32(0); + reader.Close(); + } - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select a.benutzer_id from {TABLE} a inner join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where k.region = '{kunde.Region}' and a.liefertag = '{liefertag.Date}' order by a.benutzer_id limit 1"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = reader.GetInt32(0); - reader.Close(); DatenbankConnection.GetConnection().Close(); return result; @@ -453,18 +478,20 @@ namespace DatenDB try { DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - - command.Connection = DatenbankConnection.GetConnection(); - if (this.Typ != AuftragTyp.Regelmäßig) + using (NpgsqlCommand command = new NpgsqlCommand()) { - if (exakt) command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and typ = {(int)this.Typ} and liefertag = '{this.Liefertag}'"; - else command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and liefertag = '{this.Liefertag}' and status = {(int)this.Status}"; + command.Connection = DatenbankConnection.GetConnection(); + if (this.Typ != AuftragTyp.Regelmäßig) + { + if (exakt) command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and typ = {(int)this.Typ} and liefertag = '{this.Liefertag}'"; + else command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and liefertag = '{this.Liefertag}' and status = {(int)this.Status}"; + } + else command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and typ = {(int)this.Typ}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = reader.GetInt16(0); + reader.Close(); } - else command.CommandText = $"select auftrag_id from {TABLE} where kunde_id = {this.KundeID} and typ = {(int)this.Typ}"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = reader.GetInt16(0); - reader.Close(); + DatenbankConnection.GetConnection().Close(); } catch (Exception ex) @@ -521,27 +548,29 @@ namespace DatenDB } public static int[] GetContaineranzahl(int? kundeId) - { - int[] result = { 0, 0, 0 }; - int i = 0; + { + int[] result = { 0, 0, 0 }; + int i = 0; DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select max(container_clean), avg(container_clean), min(container_clean) from {TABLE} where kunde_id = {kundeId}"; - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select max(container_clean), avg(container_clean), min(container_clean) from {TABLE} where kunde_id = {kundeId}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + result[i] = reader.IsDBNull(i) ? 0 : reader.GetInt16(i); + i++; + } + reader.Close(); + } - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) - { - result[i] = reader.IsDBNull(i) ? 0 : reader.GetInt16(i); - i++; - } - reader.Close(); DatenbankConnection.GetConnection().Close(); return result; - } + } public Auftrag(NpgsqlDataReader reader, bool isExpedit = true) { this.AuftragID = reader.GetInt32(0); @@ -562,7 +591,7 @@ namespace DatenDB this.MaschineID = reader.IsDBNull(15) ? null : (int?)reader.GetInt32(15); this.ContainerClean = reader.IsDBNull(16) ? 0 : reader.GetInt32(16); this.Typ = reader.IsDBNull(17) ? AuftragTyp.Standart : (AuftragTyp)reader.GetInt32(17); - this.AufgabeErledigt = reader.IsDBNull(18) ? false : reader.GetBoolean(18); + this.AufgabeErledigt = !reader.IsDBNull(18) && reader.GetBoolean(18); this.Abteilungen = reader.IsDBNull(19) ? AbteilungsStatus.Keine : (AbteilungsStatus)reader.GetInt16(19); this.Rhythmus = reader.IsDBNull(20) ? RegRhythmen.Unbekannt : (RegRhythmen)reader.GetInt32(20); this.Priority = (AuftragPriority)reader.GetInt32(21); @@ -597,7 +626,7 @@ namespace DatenDB this.MaschineID = reader.IsDBNull(15) ? null : (int?)reader.GetInt32(15); this.ContainerClean = reader.IsDBNull(16) ? 0 : reader.GetInt32(16); this.Typ = reader.IsDBNull(17) ? AuftragTyp.Standart : (AuftragTyp)reader.GetInt32(17); - this.AufgabeErledigt = reader.IsDBNull(18) ? false : reader.GetBoolean(18); + this.AufgabeErledigt = !reader.IsDBNull(18) && reader.GetBoolean(18); this.Abteilungen = reader.IsDBNull(19) ? AbteilungsStatus.Keine : (AbteilungsStatus)reader.GetInt16(19); this.Rhythmus = reader.IsDBNull(20) ? RegRhythmen.Unbekannt : (RegRhythmen)reader.GetInt32(20); this.Priority = (AuftragPriority)reader.GetInt32(21); @@ -719,33 +748,6 @@ namespace DatenDB } } - - /// - /// SPALTE 12 - Button Etikett Drucken wird angezeigt. - /// - private string _etikett; - [OLVColumn("Etikett", DisplayIndex = 11, TextAlign = System.Windows.Forms.HorizontalAlignment.Center)] - public string Etikett - { - get - { - if (Typ >= AuftragTyp.Inventur & Typ <= AuftragTyp.Standverminderung) - { - if (Status >= AuftragStatus.Vorbereitet) return _fertig = string.Empty; - else return _fertig = "🖨"; - } - else - { - if (Status <= AuftragStatus.Herrichten) return _fertig = "🖨"; - else - { - if (Status == AuftragStatus.Vorbereitet) return _fertig = "🖨"; - else return _fertig = string.Empty; - } - } - } - } - /// /// SPALTE 13 - Button Abschließenvon Aufträgen wird angezeigt. /// @@ -830,21 +832,23 @@ namespace DatenDB conn.Open(); int auftragStatusID = 0; - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = conn; + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = conn; - command.CommandText = "select nextval('kundenverwaltung.auftrag_status_seq')"; - auftragStatusID = (int)(long)command.ExecuteScalar(); + command.CommandText = "select nextval('kundenverwaltung.auftrag_status_seq')"; + auftragStatusID = (int)(long)command.ExecuteScalar(); - command.CommandText = $"INSERT INTO kundenverwaltung.auftrag_status(auftrag_status_id, auftrag_id, benutzer_id, auftrag_status, status_changed) VALUES (:p0, :p1, :p2, :p3, :p4)"; + command.CommandText = $"INSERT INTO kundenverwaltung.auftrag_status(auftrag_status_id, auftrag_id, benutzer_id, auftrag_status, status_changed) VALUES (:p0, :p1, :p2, :p3, :p4)"; - command.Parameters.AddWithValue("p0", auftragStatusID); - command.Parameters.AddWithValue("p1", this.AuftragID); - command.Parameters.AddWithValue("p2", Program.benutzer == null ? (object)DBNull.Value : Program.benutzer.BenutzerID); - command.Parameters.AddWithValue("p3", (int)_status); - command.Parameters.AddWithValue("p4", DateTime.Now); + command.Parameters.AddWithValue("p0", auftragStatusID); + command.Parameters.AddWithValue("p1", this.AuftragID); + command.Parameters.AddWithValue("p2", Program.benutzer == null ? (object)DBNull.Value : Program.benutzer.BenutzerID); + command.Parameters.AddWithValue("p3", (int)_status); + command.Parameters.AddWithValue("p4", DateTime.Now); - command.ExecuteNonQuery(); + command.ExecuteNonQuery(); + } } catch (Exception) { @@ -859,50 +863,53 @@ namespace DatenDB } public int[] Save() - { - DatenbankConnection.GetConnection().Open(); - int[] result = new int[2]; - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); + { + DatenbankConnection.GetConnection().Open(); + int[] result = new int[2]; + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); - if (this.AuftragID.HasValue & this.AuftragID != 0) - { - command.CommandText = $"update {TABLE} set benutzer_id = :p1, aufgabe_id = :p2, kunde_id = :p3, zusatz = :p4, liefertag = :p5, gedruckt = :p6, gedruckt_von = :p7, erledigt = :p8, erledigt_von = :p9, erstellt = :p10, erstellt_von = :p11, status = :p12, tour_id = :p13, container_dirt = :p14, maschine_id = :p15, container_clean = :p16, typ = :p17, aufgabe_erledigt = :p18, abteilungen_status = :p19, rhythmus = :p20, priority = :p21 WHERE auftrag_id = :p0"; - } - else - { - command.CommandText = "select nextval('kundenverwaltung.auftrag_seq')"; - this.AuftragID = result[1] = (int)(long)command.ExecuteScalar(); - command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12, :p13, :p14, :p15, :p16, :p17, :p18, :p19, :p20, :p21)"; - } + if (this.AuftragID.HasValue & this.AuftragID != 0) + { + command.CommandText = $"update {TABLE} set benutzer_id = :p1, aufgabe_id = :p2, kunde_id = :p3, zusatz = :p4, liefertag = :p5, gedruckt = :p6, gedruckt_von = :p7, erledigt = :p8, erledigt_von = :p9, erstellt = :p10, erstellt_von = :p11, status = :p12, tour_id = :p13, container_dirt = :p14, maschine_id = :p15, container_clean = :p16, typ = :p17, aufgabe_erledigt = :p18, abteilungen_status = :p19, rhythmus = :p20, priority = :p21 WHERE auftrag_id = :p0"; + } + else + { + command.CommandText = "select nextval('kundenverwaltung.auftrag_seq')"; + this.AuftragID = result[1] = (int)(long)command.ExecuteScalar(); + command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12, :p13, :p14, :p15, :p16, :p17, :p18, :p19, :p20, :p21)"; + } - command.Parameters.AddWithValue("p0", this.AuftragID); - command.Parameters.AddWithValue("p1", this.ArbeiterID.HasValue ? this.ArbeiterID.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p2", this.AufgabeID.HasValue ? this.AufgabeID.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p3", this.KundeID); - command.Parameters.AddWithValue("p4", string.IsNullOrEmpty(this.ZusatzInfo) ? (object)DBNull.Value : this.ZusatzInfo); - command.Parameters.AddWithValue("p5", this.Liefertag); - command.Parameters.AddWithValue("p6", this.Gedruckt.HasValue ? this.Gedruckt.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p7", this.GedrucktVon.HasValue ? this.GedrucktVon.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p8", this.Erledigt.HasValue ? this.Erledigt.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p9", this.ErledigtVon.HasValue ? this.ErledigtVon.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p10", this.Erstellt); - command.Parameters.AddWithValue("p11", this.ErstelltVon); - command.Parameters.AddWithValue("p12", (int)this.Status); - command.Parameters.AddWithValue("p13", this.TourID.HasValue ? this.TourID.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p14", this.Container); - command.Parameters.AddWithValue("p15", this.MaschineID.HasValue ? this.MaschineID.Value : 0); - command.Parameters.AddWithValue("p16", this.ContainerClean); - command.Parameters.AddWithValue("p17", (int)this.Typ); - command.Parameters.AddWithValue("p18", this.AufgabeErledigt); - command.Parameters.AddWithValue("p19", (int)this.Abteilungen); - command.Parameters.AddWithValue("p20", (int)this.Rhythmus); - command.Parameters.AddWithValue("p21", (int)this.Priority); + command.Parameters.AddWithValue("p0", this.AuftragID); + command.Parameters.AddWithValue("p1", this.ArbeiterID ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p2", this.AufgabeID ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p3", this.KundeID); + command.Parameters.AddWithValue("p4", string.IsNullOrEmpty(this.ZusatzInfo) ? (object)DBNull.Value : this.ZusatzInfo); + command.Parameters.AddWithValue("p5", this.Liefertag); + command.Parameters.AddWithValue("p6", this.Gedruckt ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p7", this.GedrucktVon ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p8", this.Erledigt ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p9", this.ErledigtVon ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p10", this.Erstellt); + command.Parameters.AddWithValue("p11", this.ErstelltVon); + command.Parameters.AddWithValue("p12", (int)this.Status); + command.Parameters.AddWithValue("p13", this.TourID ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p14", this.Container); + command.Parameters.AddWithValue("p15", this.MaschineID ?? 0); + command.Parameters.AddWithValue("p16", this.ContainerClean); + command.Parameters.AddWithValue("p17", (int)this.Typ); + command.Parameters.AddWithValue("p18", this.AufgabeErledigt); + command.Parameters.AddWithValue("p19", (int)this.Abteilungen); + command.Parameters.AddWithValue("p20", (int)this.Rhythmus); + command.Parameters.AddWithValue("p21", (int)this.Priority); - result[0] = command.ExecuteNonQuery(); - DatenbankConnection.GetConnection().Close(); - return result; - } + result[0] = command.ExecuteNonQuery(); + } + + DatenbankConnection.GetConnection().Close(); + return result; + } public static DateTime NaechsterLiefertag() { DateTime heute = DateTime.Today; @@ -922,25 +929,27 @@ namespace DatenDB string and = " and "; List result = new List(); DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + if (!string.IsNullOrWhiteSpace(datum)) { commandline += $"{datum} = '{date}'"; parts++; } + if (status != null) + { + if (parts > 0) commandline += and + $"status = {(int)status}"; + else commandline += $"status = {(int)status}"; + } + if (typ != null) + { + if (parts > 0) commandline += and + $"typ = {(int)typ}"; + else commandline += $"typ = {(int)typ}"; + } - command.Connection = DatenbankConnection.GetConnection(); - if (!string.IsNullOrWhiteSpace(datum)) { commandline += $"{datum} = '{date}'"; parts++; } - if (status != null) - { - if (parts > 0) commandline += and + $"status = {(int)status}"; - else commandline += $"status = {(int)status}"; - } - if (typ != null) - { - if (parts > 0) commandline += and + $"typ = {(int)typ}"; - else commandline += $"typ = {(int)typ}"; + command.CommandText = commandline; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result.Add(new Auftrag(reader)); + reader.Close(); } - command.CommandText = commandline; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result.Add(new Auftrag(reader)); - reader.Close(); DatenbankConnection.GetConnection().Close(); return result; diff --git a/AA-Klassen/Benutzer.cs b/AA-Klassen/Benutzer.cs index ccee06b..5c11bad 100644 --- a/AA-Klassen/Benutzer.cs +++ b/AA-Klassen/Benutzer.cs @@ -43,42 +43,51 @@ namespace DatenDB { } public static List GetList() - { + { DatenbankConnection.GetConnection().Open(); List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE}"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Benutzer(reader)); - reader.Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Benutzer(reader)); + reader.Close(); + } + DatenbankConnection.GetConnection().Close(); return resultList; - } - public static List GetFahrerList() - { - DatenbankConnection.GetConnection().Open(); - List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where rolle = 'Fahrer' and ist_aktiv is true order by benutzer_id asc"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Benutzer(reader)); - reader.Close(); - DatenbankConnection.GetConnection().Close(); - return resultList; - } + } + public static List GetFahrerList() + { + DatenbankConnection.GetConnection().Open(); + List resultList = new List(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where rolle = 'Fahrer' and ist_aktiv is true order by benutzer_id asc"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Benutzer(reader)); + reader.Close(); + } + + DatenbankConnection.GetConnection().Close(); + return resultList; + } public static List GetArbeiterList() { DatenbankConnection.GetConnection().Open(); List resultList = new List(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where ist_aktiv is true and rolle = 'Fahrer' or rolle = 'Verwaltung' or rolle = 'Expedit' order by benutzer_id asc"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) resultList.Add(new Benutzer(reader)); - reader.Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where ist_aktiv is true and rolle = 'Fahrer' or rolle = 'Verwaltung' or rolle = 'Expedit' order by benutzer_id asc"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) resultList.Add(new Benutzer(reader)); + reader.Close(); + } + DatenbankConnection.GetConnection().Close(); return resultList; } @@ -88,17 +97,20 @@ namespace DatenDB Benutzer benutzer = new Benutzer(); try - { + { DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - if (!string.IsNullOrEmpty(benutzerName)) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_name = '{benutzerName}'"; - if (benID != null) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_id = {benID}"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) benutzer = new Benutzer(reader); - reader.Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + if (!string.IsNullOrEmpty(benutzerName)) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_name = '{benutzerName}'"; + if (benID != null) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_id = {benID}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) benutzer = new Benutzer(reader); + reader.Close(); + } + DatenbankConnection.GetConnection().Close(); - return benutzer; + return benutzer; } catch (Exception ex) { @@ -175,34 +187,36 @@ namespace DatenDB #endregion public static Benutzer Get(string benutzerName, string passwort) - { - try - { + { + try + { DatenbankConnection.GetConnection().Open(); } - catch (NpgsqlException) - { - throw new LoginException("Datenbank ist nicht verbunden", -4); - } - - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where lower(benutzer_name) = :ben"; - command.Parameters.AddWithValue(":ben", benutzerName.ToLower()); + catch (NpgsqlException) + { + throw new LoginException("Datenbank ist nicht verbunden", -4); + } - NpgsqlDataReader reader = command.ExecuteReader(); - Benutzer person = null; - if (reader.Read()) person = new Benutzer(reader); - reader.Close(); - DatenbankConnection.GetConnection().Close(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where lower(benutzer_name) = :ben"; + command.Parameters.AddWithValue(":ben", benutzerName.ToLower()); - if (person == null) throw new LoginException("Benutzer nicht gefunden!", -1); - else if (string.IsNullOrEmpty(person.Passwort)) throw new LoginException("Benutzer gefunden, Passwort bestätigen", -3); - if (person.Passwort != passwort) throw new LoginException("Passwort ist falsch!", -2); - - return person; - } //FEHLERMELDUNG DYNAMISCH GENERIEREN... - public Benutzer(NpgsqlDataReader reader) + NpgsqlDataReader reader = command.ExecuteReader(); + Benutzer person = null; + if (reader.Read()) person = new Benutzer(reader); + reader.Close(); + DatenbankConnection.GetConnection().Close(); + + if (person == null) throw new LoginException("Benutzer nicht gefunden!", -1); + else if (string.IsNullOrEmpty(person.Passwort)) throw new LoginException("Benutzer gefunden, Passwort bestätigen", -3); + if (person.Passwort != passwort) throw new LoginException("Passwort ist falsch!", -2); + + return person; + } + } //FEHLERMELDUNG DYNAMISCH GENERIEREN... + public Benutzer(NpgsqlDataReader reader) { this.BenutzerID = reader.GetInt32(0); this.Rolle = reader.IsDBNull(1) ? BenutzerRolle.Verwaltung : (BenutzerRolle)Enum.Parse(typeof(BenutzerRolle), reader.GetString(1)); @@ -211,46 +225,48 @@ namespace DatenDB this.Nachname = reader.IsDBNull(4) ? string.Empty : reader.GetString(4); this.Schein = reader.IsDBNull(5) ? null : (int?)reader.GetInt32(5); this.GueltigBis = reader.IsDBNull(6) ? null : (DateTime?)reader.GetDateTime(6); - this.Aktiv = reader.IsDBNull(7) ? true : reader.GetBoolean(7); + this.Aktiv = reader.IsDBNull(7) || reader.GetBoolean(7); this.BenutzerName = reader.IsDBNull(8) ? string.Empty : reader.GetString(8); this.OnboardingStatus = reader.GetInt32(9); this.Tour = reader.IsDBNull(10) ? string.Empty : reader.GetString(10); } public int Save() - { - DatenbankConnection.GetConnection().Open(); + { + DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - command.Connection = DatenbankConnection.GetConnection(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); - if (this.BenutzerID.HasValue & this.BenutzerID != 0) - { - command.CommandText = $"update {TABLE} set rolle = :p1, passwort = :p2, vorname = :p3, nachname = :p4, schein = :p5, gueltig_bis = :p6, ist_aktiv = :p7, benutzer_name = :p8, onboarding_status = :p9, tour = :p10 where benutzer_id = :p0"; - } - else - { - command.CommandText = "select nextval('kundenverwaltung.benutzer_seq')"; - this.BenutzerID = (int)(long)command.ExecuteScalar(); - command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10)"; - } + if (this.BenutzerID.HasValue & this.BenutzerID != 0) + { + command.CommandText = $"update {TABLE} set rolle = :p1, passwort = :p2, vorname = :p3, nachname = :p4, schein = :p5, gueltig_bis = :p6, ist_aktiv = :p7, benutzer_name = :p8, onboarding_status = :p9, tour = :p10 where benutzer_id = :p0"; + } + else + { + command.CommandText = "select nextval('kundenverwaltung.benutzer_seq')"; + this.BenutzerID = (int)(long)command.ExecuteScalar(); + command.CommandText = $"insert into {TABLE} ({COLUMNS}) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10)"; + } - command.Parameters.AddWithValue("p0", this.BenutzerID); - command.Parameters.AddWithValue("p1", this.Rolle.ToString()); - command.Parameters.AddWithValue("p2", string.IsNullOrEmpty(this.Passwort) ? (object)DBNull.Value : this.Passwort); - command.Parameters.AddWithValue("p3", string.IsNullOrEmpty(this.Vorname) ? (object)DBNull.Value : this.Vorname); - command.Parameters.AddWithValue("p4", string.IsNullOrEmpty(this.Nachname) ? (object)DBNull.Value : this.Nachname); - command.Parameters.AddWithValue("p5", this.Schein.HasValue ? this.Schein.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p6", this.Rolle == BenutzerRolle.Fahrer ? this.GueltigBis.Value : (object)DBNull.Value); - command.Parameters.AddWithValue("p7", this.Aktiv); - command.Parameters.AddWithValue("p8", string.IsNullOrEmpty(this.BenutzerName) ? (object)DBNull.Value : this.BenutzerName); - command.Parameters.AddWithValue("p9", this.OnboardingStatus); - command.Parameters.AddWithValue("p10", string.IsNullOrWhiteSpace(this.Tour) ? (object)DBNull.Value : this.Tour); + command.Parameters.AddWithValue("p0", this.BenutzerID); + command.Parameters.AddWithValue("p1", this.Rolle.ToString()); + command.Parameters.AddWithValue("p2", string.IsNullOrEmpty(this.Passwort) ? (object)DBNull.Value : this.Passwort); + command.Parameters.AddWithValue("p3", string.IsNullOrEmpty(this.Vorname) ? (object)DBNull.Value : this.Vorname); + command.Parameters.AddWithValue("p4", string.IsNullOrEmpty(this.Nachname) ? (object)DBNull.Value : this.Nachname); + command.Parameters.AddWithValue("p5", this.Schein ?? (object)DBNull.Value); + command.Parameters.AddWithValue("p6", this.Rolle == BenutzerRolle.Fahrer ? this.GueltigBis.Value : (object)DBNull.Value); + command.Parameters.AddWithValue("p7", this.Aktiv); + command.Parameters.AddWithValue("p8", string.IsNullOrEmpty(this.BenutzerName) ? (object)DBNull.Value : this.BenutzerName); + command.Parameters.AddWithValue("p9", this.OnboardingStatus); + command.Parameters.AddWithValue("p10", string.IsNullOrWhiteSpace(this.Tour) ? (object)DBNull.Value : this.Tour); - int result = command.ExecuteNonQuery(); - DatenbankConnection.GetConnection().Close(); - return result; - } - } + int result = command.ExecuteNonQuery(); + DatenbankConnection.GetConnection().Close(); + return result; + } + } + } public static class BenutzerExtensions { public static int SetOnboardingFlag(this Benutzer user, OnboardingSchritt schritt) @@ -268,6 +284,4 @@ namespace DatenDB } } -} -//INSTALL-REMINDER: DB anpassen. -//CHANGES: OnBoarding wird jetzt gespeichert wenn gesehen. +} \ No newline at end of file diff --git a/AA-Klassen/DataClass.cs b/AA-Klassen/DataClass.cs index 59b478b..2d3d751 100644 --- a/AA-Klassen/DataClass.cs +++ b/AA-Klassen/DataClass.cs @@ -24,6 +24,7 @@ namespace Deckungsbeitrag.AA_Klassen [OLVColumn("KndNr.", DisplayIndex = 0, IsEditable = false)] public string KndNummer { get; set; } [OLVColumn("Kunde", DisplayIndex = 1, IsEditable = false)] public string Kunde { get; set; } [OLVColumn("NW", DisplayIndex = 2, TextAlign = HorizontalAlignment.Center)] public int Nachwaesche { get; set; } + [OLVColumn("Rekl", DisplayIndex = 3, TextAlign = HorizontalAlignment.Center)]public int Reklamation { get; set; } } /// @@ -64,7 +65,7 @@ namespace Deckungsbeitrag.AA_Klassen using (var conn = new NpgsqlConnection(_connectionString)) using (var cmd = new NpgsqlCommand(@" - SELECT artnr, abteilung, artname, nw, muell, sauber + SELECT artnr, abteilung, artname, nw, reklamation, muell, sauber FROM kundenverwaltung.vw_art_nachwaesche ORDER BY artnr ASC", conn)) { @@ -79,8 +80,9 @@ namespace Deckungsbeitrag.AA_Klassen Abteilung = (ArtikelKategorie)reader.GetInt16(1), ArtName = reader.GetString(2), Nachwaesche = reader.IsDBNull(3) ? 0 : reader.GetInt32(3), - Muell = reader.IsDBNull(4) ? 0 : reader.GetInt32(4), - Sauber = reader.IsDBNull(5) ? 0 : reader.GetInt32(5) + Reklamation = reader.IsDBNull(4) ? 0 : reader.GetInt32(4), + Muell = reader.IsDBNull(5) ? 0 : reader.GetInt32(5), + Sauber = reader.IsDBNull(6) ? 0 : reader.GetInt32(6) }); } } @@ -89,11 +91,12 @@ namespace Deckungsbeitrag.AA_Klassen return result; } [OLVColumn("ArtNr.", DisplayIndex = 0, IsEditable = false)] public int ArtNr { get; set; } - [OLVColumn("Abteilung", DisplayIndex = 1, IsEditable = false)] public ArtikelKategorie Abteilung { get; set; } - [OLVColumn("ArtName", DisplayIndex = 2, IsEditable = false)] public string ArtName { get; set; } - [OLVColumn("NW", DisplayIndex = 3, TextAlign = HorizontalAlignment.Center)] public int Nachwaesche { get; set; } - [OLVColumn("Müll", DisplayIndex = 4, TextAlign = HorizontalAlignment.Center)] public int Muell { get; set; } - [OLVColumn("Sauber", DisplayIndex = 5, TextAlign = HorizontalAlignment.Center)] public int Sauber { get; set; } + [OLVColumn("Abteilung", DisplayIndex = 10, IsEditable = false)] public ArtikelKategorie Abteilung { get; set; } + [OLVColumn("ArtName", DisplayIndex = 20, IsEditable = false)] public string ArtName { get; set; } + [OLVColumn("NW", DisplayIndex = 30, TextAlign = HorizontalAlignment.Center)] public int Nachwaesche { get; set; } + [OLVColumn("Rekl", DisplayIndex = 32, TextAlign = HorizontalAlignment.Center)] public int Reklamation { get; set; } + [OLVColumn("Müll", DisplayIndex = 40, TextAlign = HorizontalAlignment.Center)] public int Muell { get; set; } + [OLVColumn("Sauber", DisplayIndex = 50, TextAlign = HorizontalAlignment.Center)] public int Sauber { get; set; } } /// @@ -235,7 +238,7 @@ namespace Deckungsbeitrag.AA_Klassen [OLVIgnore]public int? TourID { get; set; } [OLVColumn("Schmutzig", DisplayIndex = 20, TextAlign = HorizontalAlignment.Center)]public int ContainerDirt { get; set; } [OLVColumn("Sauber", DisplayIndex = 30, TextAlign = HorizontalAlignment.Center)]public int ContainerClean { get; set; } - [OLVColumn("Typ", DisplayIndex = 50)]public AuftragTyp Typ { get; set; } + [OLVColumn("Typ", DisplayIndex = 50, IsEditable = false)]public AuftragTyp Typ { get; set; } [OLVIgnore]public bool AufgabeErledigt { get; set; } [OLVIgnore]public AbteilungsStatus AbteilungenStatus { get; set; } [OLVIgnore]public RegRhythmen Rhythmus { get; set; } @@ -312,7 +315,6 @@ namespace Deckungsbeitrag.AA_Klassen return reader.IsDBNull(ordinal) ? 0 : reader.GetInt32(ordinal); } - private static int? SafeIntNullable(NpgsqlDataReader reader, string columnName) { int ordinal; @@ -321,28 +323,36 @@ namespace Deckungsbeitrag.AA_Klassen return reader.IsDBNull(ordinal) ? (int?)null : reader.GetInt32(ordinal); } - private static string SafeString(NpgsqlDataReader reader, string columnName) { int ordinal; string name; try { ordinal = reader.GetOrdinal(columnName); } catch { return null; } - - if (columnName == "suchtext") + switch (columnName) { - if (reader.IsDBNull(ordinal)) - { - ordinal = reader.GetOrdinal("kunde_name"); - } + case var t when t == "suchtext": + { + if (reader.IsDBNull(ordinal)) + { + ordinal = reader.GetOrdinal("kunde_name"); + } + name = reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); + if (name == "BAR DIVERSE") ordinal = reader.GetOrdinal("zusatz"); + } + break; + case var t when t == "fahrer": + { + name = reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); + name += reader.IsDBNull(ordinal + 1) ? string.Empty : " (" + reader.GetString(ordinal + 1) + ")"; + } + break; + default: + name = reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); + break; } - name = reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); - - if (name == "BAR DIVERSE") ordinal = reader.GetOrdinal("zusatz"); - name = reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); return name; } - private static bool SafeBool(NpgsqlDataReader reader, string columnName) { int ordinal; @@ -351,7 +361,6 @@ namespace Deckungsbeitrag.AA_Klassen return !reader.IsDBNull(ordinal) && reader.GetBoolean(ordinal); } - private static DateTime? SafeDateTime(NpgsqlDataReader reader, string columnName) { int ordinal; diff --git a/AA-Klassen/Tour.cs b/AA-Klassen/Tour.cs index dcbe482..330f4c4 100644 --- a/AA-Klassen/Tour.cs +++ b/AA-Klassen/Tour.cs @@ -33,16 +33,15 @@ namespace Deckungsbeitrag.AA_Klassen public int? Save() { - int? result = 0; DatenbankConnection.GetConnection().Open(); using (NpgsqlCommand command = new NpgsqlCommand()) { command.Connection = DatenbankConnection.GetConnection(); + int? result; if (this.TourID.HasValue & this.TourID != 0) { - result = this.TourID; command.CommandText = $"update {TABLE} set benutzer_id = :p1, kundenanzahl = :p2, liefertag = :p3, start = :p4, ende = :p5, container_dirt = :p6, container_clean = :p7, saison_id = :p8, tourenliste = :p9, listegedruckt = :p10, gedruckt_von = :p11 WHERE tour_id = :p0"; } else @@ -104,20 +103,22 @@ namespace Deckungsbeitrag.AA_Klassen { Tour result = null; DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); - - command.Connection = DatenbankConnection.GetConnection(); - if (tourID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_id = {arbeiterID} and liefertag = '{liefertag}'"; - else + using (NpgsqlCommand command = new NpgsqlCommand()) { - if (arbeiterID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where liefertag = {liefertag}"; - else command.CommandText = $"select {COLUMNS} from {TABLE} where tour_id = {tourID}"; + command.Connection = DatenbankConnection.GetConnection(); + if (tourID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_id = {arbeiterID} and liefertag = '{liefertag}'"; + else + { + if (arbeiterID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where liefertag = {liefertag}"; + else command.CommandText = $"select {COLUMNS} from {TABLE} where tour_id = {tourID}"; + } + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = new Tour(reader); + reader.Close(); } - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = new Tour(reader); - reader.Close(); + DatenbankConnection.GetConnection().Close(); - + return result; } @@ -125,13 +126,15 @@ namespace Deckungsbeitrag.AA_Klassen { Tour result = null; DatenbankConnection.GetConnection().Open(); - NpgsqlCommand command = new NpgsqlCommand(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = DatenbankConnection.GetConnection(); + command.CommandText = $"select {COLUMNS} from {TABLE} where tour_id = {tourID}"; + NpgsqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) result = new Tour(reader); + reader.Close(); + } - command.Connection = DatenbankConnection.GetConnection(); - command.CommandText = $"select {COLUMNS} from {TABLE} where tour_id = {tourID}"; - NpgsqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) result = new Tour(reader); - reader.Close(); DatenbankConnection.GetConnection().Close(); return result; @@ -156,7 +159,7 @@ namespace Deckungsbeitrag.AA_Klassen //CHANGES: Class Tour wurde erstellt. Speichern, Laden und Bearbeiten von Touren sollte möglich sein. //DONE: Wenn Fahrer neuen Auftrag erstellt, wird Tour (BenutzerID & Liefertag) gesucht und gespeichert oder upgedatet. Dabei werden die Containerzahlen schmutzig addiert und die Kundenanzahl um 1 erhöht. //TODO: Wenn Auftrag abgeschlossen wird muss die Containerzahl sauber addiert werden. Kundenanzahl und Containeranzahl schmutzig darf nicht erhöht werden. +//TODO: !!ÜBERLEGE!! Tour Start und Ende automatisch erfassen. (Beladenscan und Entladescan?) //TODO: Eingabemöglichkeit von Tour Start und Ende muss erledigt werden. -//TODO: !!ÜBERLEGE!! Tour Start und Ende automatisch erfassen. //TODO: Kundenanzahl bei Tourenliste erstellen vergleichen und anpassen. //TODO: !!ÜBERLEGE!! DB-Query für Kundenanzahl und Containeranzahl Abgleich. (Aufträge haben TourID hinterlegt. So sollte alles vergleichbar sein.) \ No newline at end of file diff --git a/App.config b/App.config index 6484ec4..a3ca776 100644 --- a/App.config +++ b/App.config @@ -6,7 +6,7 @@ - + diff --git a/Program.cs b/Program.cs index 84d7a58..d54dd50 100644 --- a/Program.cs +++ b/Program.cs @@ -35,12 +35,11 @@ namespace Deckungsbeitrag public static bool Artikelliste_Importiert = false; public static bool Kundenliste_Importiert = false; public static bool Software_Updated = false; - private static DateTime zielZeit = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 22, 0, 0); + private static readonly DateTime zielZeit = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 22, 0, 0); private static System.Timers.Timer timer; //public static string vaultPath = @"N:\TECHNIK\Software\Wirl-Verwaltung\Feedback"; - private static string savePath = ConfigurationManager.AppSettings["DateiSavePfad"]; - private static readonly string login = "login"; - private static bool istest = false; + private static readonly string savePath = ConfigurationManager.AppSettings["DateiSavePfad"]; + private static readonly bool istest = false; /// @@ -51,8 +50,10 @@ namespace Deckungsbeitrag { userid = ConfigurationManager.AppSettings["ConnectionString"].Split(';')[0]; userid = userid.Split('=')[1]; - timer = new System.Timers.Timer(); - timer.Interval = 1000; + timer = new System.Timers.Timer + { + Interval = 1000 + }; timer.Elapsed += Timer_Elapsed; timer.Start(); Application.EnableVisualStyles(); @@ -102,12 +103,9 @@ namespace Deckungsbeitrag } - Settings.Default.Save(); Cursor.Current = Cursors.Default; - - if (istest) { Application.Run(new FormAufleger()); return; } if (userid.StartsWith("ms") | userid.StartsWith("ps")) @@ -239,7 +237,6 @@ namespace Deckungsbeitrag private static void ArtikelList_Laden() { string updatePath = Path.Combine(savePath, "Listen"); - updatePath = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen"; //Pfad zu Listen string dateiName = "Artikelkurzliste.csv"; string row; string[] rows; @@ -280,9 +277,7 @@ namespace Deckungsbeitrag tosave++; // Artikel wird in DB gesucht und geholt. - Artikel art = Artikel.GetArtikel(Convert.ToInt32(linedata[1]), null); - if (art == null) art = new Artikel(); - + Artikel art = Artikel.GetArtikel(Convert.ToInt32(linedata[1]), null) ?? new Artikel(); art.Nummer = Convert.ToInt32(linedata[1]); art.Bezeichnung = linedata[3]; @@ -437,9 +432,7 @@ namespace Deckungsbeitrag tosave++; // Kunde wird gesucht und aus DB geholt. - Kunde kunde = Kunde.GetKunde(linedata[0], null, null); - if (kunde == null) kunde = new Kunde(); - + Kunde kunde = Kunde.GetKunde(linedata[0], null, null) ?? new Kunde(); kunde.KundeNummer = linedata[0]; kunde.KundeGruppe = linedata[3]; kunde.PLZ = int.TryParse(linedata[4], out int tmp2) ? tmp2 : 00; @@ -458,7 +451,7 @@ namespace Deckungsbeitrag } kunde.Region = linedata[48]; if (kunde.Suchtext != linedata[55]) kunde.Suchtext = linedata[55]; - kunde.Aktiv = linedata[56] == "1" ? true : false; + kunde.Aktiv = linedata[56] == "1"; if (kunde.Save() == 1) saved++; } @@ -525,7 +518,7 @@ namespace Deckungsbeitrag var psi = new ProcessStartInfo { FileName = "msiexec.exe", - Arguments = $"/i \"{localMsi}\" /qn /norestart ALLUSERS=1 /L*v \"C:\\tmp\\update.log\"", + Arguments = $"/i \"{localMsi}\" /norestart ALLUSERS=1 /L*v \"C:\\tmp\\update.log\"", Verb = "runas", UseShellExecute = true }; @@ -602,16 +595,16 @@ namespace Deckungsbeitrag public static void AddFeedback(Benutzer user, string feedbackText, string bildDateiname, string timeStamp) { string vaultPath = Path.Combine(savePath, "Feedback\\VerwaltungFeedback.md"); - string feedback = string.Empty; Benutzer ben = benutzer; // Wenn User existiert wird dieser Verwendet. Sonst der bei Anmeldung registrierte Benutzer. if (user != null) ben = user; + string feedback; // Wenn der Bilddateiname leer ist wird feedback ohne Bilddateiname erstellt. - if (string.IsNullOrWhiteSpace(bildDateiname)) + if (string.IsNullOrWhiteSpace(bildDateiname)) { - feedback = $@"- [ ] **Zeitpunkt:** {timeStamp} **| User:** {ben.Vorname} {ben.Nachname} **| Text:** {feedbackText}{Environment.NewLine}"; + feedback = $@"- [ ] **Zeitpunkt:** {timeStamp} **| User:** {ben.Vorname} {ben.Nachname} **| Text:** {feedbackText}{Environment.NewLine}"; } else feedback = $@" - [ ] **Zeitpunkt:** {timeStamp} **| User:** {ben.Vorname} {ben.Nachname} **| Text:** {feedbackText} **| Bild:** ![[{bildDateiname}.png]]{Environment.NewLine}"; @@ -636,15 +629,15 @@ namespace Deckungsbeitrag { string path = Path.Combine(savePath, "Feedback"); string vaultPath = Path.Combine(path, "VerwaltungFehler.md"); - //string bildPath = Path.Combine(savePath, bildDateiname); - string fehler = string.Empty; - string benutzerKennung = string.Empty; Benutzer ben = benutzer; // Wenn User existiert wird dieser Verwendet. Sonst der bei Anmeldung registrierte Benutzer. if (user != null) ben = user; + string benutzerKennung; if (ben.BenutzerID == null) benutzerKennung = userid; else benutzerKennung = ben.Vorname + " " + ben.Nachname; if (timeStamp == null) timeStamp = DateTime.Now.ToString("dd.MM.yyyy-HH-mm"); + //string bildPath = Path.Combine(savePath, bildDateiname); + string fehler; // Wenn der Bilddateiname leer ist wird feedback ohne Bilddateiname erstellt. if (string.IsNullOrWhiteSpace(fehlerStackTrace)) { @@ -664,5 +657,5 @@ namespace Deckungsbeitrag #endregion } } -//TODO: Mit AddFehler in Obsidian eine Fehlerliste betreiben. (Wichtige Infos feststellen und bereitstellen) +//DOEN: Mit AddFehler in Obsidian eine Fehlerliste betreiben. (Wichtige Infos feststellen und bereitstellen) //DONE: Mit AddFehler können Fehler aus try/chatch in Obsidian eingefügt werden. (Timestamp, PC-Name, Ex-Message) \ No newline at end of file diff --git a/UserControls/UCInventur.cs b/UserControls/UCInventur.cs index 2f50b48..1f950e1 100644 --- a/UserControls/UCInventur.cs +++ b/UserControls/UCInventur.cs @@ -25,7 +25,6 @@ namespace Deckungsbeitrag.UserControls private readonly Benutzer user; private readonly Kunde kunde; private List artikelListe; - private readonly int controlHeight; private bool neueinventur = false; private readonly string[] lines; private bool formLoading = false; diff --git a/UserControls/UCTabPageLKW.cs b/UserControls/UCTabPageLKW.cs index 1ac1c5f..20d17c8 100644 --- a/UserControls/UCTabPageLKW.cs +++ b/UserControls/UCTabPageLKW.cs @@ -48,7 +48,7 @@ namespace Deckungsbeitrag.UserControls { bool toClone = true; string saison = string.Empty; - int saisonrhythmus = 0; + int saisonrhythmus; FlowLayoutPanel dropTarget = sender as FlowLayoutPanel; DayOfWeek dropDay = DayOfWeek.Sunday; @@ -114,9 +114,7 @@ namespace Deckungsbeitrag.UserControls // Move statt Clone KundenControl if (e.Data.GetDataPresent(typeof(UCKunde))) { - UCKunde draggedControl = e.Data.GetData(typeof(UCKunde)) as UCKunde; - - if (draggedControl == null || dropTarget == null || draggedControl.Parent.Tag != dropTarget.Tag) return; + if (!(e.Data.GetData(typeof(UCKunde)) is UCKunde draggedControl) || dropTarget == null || draggedControl.Parent.Tag != dropTarget.Tag) return; dropTarget.SuspendLayout(); try @@ -182,7 +180,6 @@ namespace Deckungsbeitrag.UserControls private static Liefertage GetKompatiblenRhythmus(DayOfWeek dropDay, Liefertage originalRhythmus) { Meldungen meldung = new Meldungen(); - CancelEventArgs e = new CancelEventArgs(); string dropTag = CultureInfo.GetCultureInfo("de-DE").DateTimeFormat.GetDayName(dropDay); // 1. Ist dropDay im Original enthalten? Wird originalRhythums zurück gegeben. @@ -331,11 +328,10 @@ namespace Deckungsbeitrag.UserControls for (int i = 0; i < 3; i++) { string lblName = $"{baseName}{i}"; // labelContMO0, labelContMO1, labelContMO2 - var lbl = tableLayoutPanelTage.Controls - .Find(lblName, true) - .FirstOrDefault() as Label; - if (lbl != null && int.TryParse(lbl.Text, out int value)) + if (tableLayoutPanelTage.Controls + .Find(lblName, true) + .FirstOrDefault() is Label lbl && int.TryParse(lbl.Text, out int value)) { counts[i] = value; } @@ -372,8 +368,10 @@ namespace Deckungsbeitrag.UserControls foreach (var kundeData in kundenListe) // nur die Kunden dieses Tags { Kunde kunde = Kunde.GetKunde(null, kundeData.KundeID, null); - UCKunde kundectrl = new UCKunde(kunde); - kundectrl.Tag = kunde; + UCKunde kundectrl = new UCKunde(kunde) + { + Tag = kunde + }; zielFlp.Controls.Add(kundectrl); } } @@ -382,11 +380,10 @@ namespace Deckungsbeitrag.UserControls if (data.Counter.TryGetValue(tag, out int[] counts)) { string counterName = $"labelCont{tag}"; - var counterLabel = tableLayoutPanelTage.Controls - .Find(counterName, true) - .FirstOrDefault() as Label; - if (counterLabel != null) + if (tableLayoutPanelTage.Controls + .Find(counterName, true) + .FirstOrDefault() is Label counterLabel) { counterLabel.Text = $"{counts[0]}/{counts[1]}/{counts[2]}"; } @@ -400,5 +397,4 @@ namespace Deckungsbeitrag.UserControls //CHANGES: Innerhalb eines Tages kann die Reihenfolge angepasst werden. //CHANGES: Wenn der Lieferrhythmus geändert wird, werden KundenControls an falschen Tagen gelöscht. //CHANGES: Lieferrhythmen können angepasst und übernommen werden. -//CHANGES: Speichern und Laden wurde angepasst, JSON enthält jetzt pro Tag eine Kundenliste. -//CHANGES: Winter und Sommer wird getrennt geändert und gespeichert. +//CHANGES: Speichern und Laden wurde angepasst, JSON enthält jetzt pro Tag eine Kundenliste. \ No newline at end of file diff --git a/Verwaltung.csproj b/Verwaltung.csproj index 6dc3f98..dbc8f20 100644 --- a/Verwaltung.csproj +++ b/Verwaltung.csproj @@ -85,6 +85,7 @@ packages\ObjectListView.Updated.2.9.3\lib\net40\ObjectListView.dll + packages\Spire.Barcode.7.4.1\lib\net48\Spire.Barcode.dll diff --git a/Verwaltung_ReadMe.txt b/Verwaltung_ReadMe.txt index efc264a..87b9bfb 100644 --- a/Verwaltung_ReadMe.txt +++ b/Verwaltung_ReadMe.txt @@ -4,65 +4,59 @@ NEUIGKEITEN - Version 1.0.9.2 Build-Info: - Build-Typ: Release Build -- Erledigte TODOs: 19 -- Offene TODOs: 37 -- Install-Reminders: 4 -- Changes: 15 +- Erledigte TODOs: 15 +- Offene TODOs: 31 +- Install-Reminders: 2 +- Changes: 16 -=== ⚙️ INSTALL-REMINDER (4) === -- ⚙️ DB anpassen. [Benutzer.cs] +=== ⚙️ INSTALL-REMINDER (2) === - ⚙️ DB anpassen. (Priority in Auftrag etc.) [Auftrag.cs] -- ⚙️ Tabelle KundeArtikel Spalten ArtikelID und Reihung hinzufügen. [FormKundeVW.cs] - ⚙️ Tabelle Tour in Datenbank einfügen [Tour.cs] -=== ✨ CHANGES (15) === +=== ✨ CHANGES (16) === - ✨ Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden. [FormMain.cs] - ✨ Class Tour wurde erstellt. Speichern, Laden und Bearbeiten von Touren sollte möglich sein. [Tour.cs] - ✨ Es kann nach der Kontrolle der Lieferrhythmus geändert werden. Dazu muss auch die Anzahl der Liefertage gewählt werden. [FormTourenplanung.cs] - ✨ Es können nur so viele Clone erstellt werden wie Liefertag im Lieferrhythmus hinterlegt sind. [FormTourenplanung.cs] - ✨ Es wir kontrolliert ob der gewählte Liefertag zum hinterlegten Lieferrhythmus passt. [FormTourenplanung.cs] - ✨ Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren. [FormMain.cs] +- ✨ Im Tab Rampe wird bei DoppelClick der Auftrag als gewaschen markiert und im Tab Aufträge heute sichtbar. [FormExpedit.cs] +- ✨ Im Tab Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen. [FormExpedit.cs] - ✨ Innerhalb eines Tages kann die Reihenfolge angepasst werden. [UCTabPageLKW.cs] -- ✨ KundeArtikel wird mit Reihung gespeichert und angezeigt. [FormKundeVW.cs] - ✨ Lieferrhythmen können angepasst und übernommen werden. [UCTabPageLKW.cs] -- ✨ OnBoarding wird jetzt gespeichert wenn gesehen. [Benutzer.cs] -- ✨ Programm wird mit Button geschlossen. (Sicherheitsabfrage ob wirklich gewollt wird gemacht.) [FormAufleger.cs] +- ✨ NumericUpDown markiert automatisch den Inhalt. Erleichtert die Eingabe. [FormExpedit.cs] +- ✨ Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel. [FormArtikelVW.cs] - ✨ Speichern und Laden wurde angepasst, JSON enthält jetzt pro Tag eine Kundenliste. [UCTabPageLKW.cs] - ✨ TabText wird mit Benutzerliste verglichen. Wenn ein passender gefunden wird Tag hinterlegt. [FormTourenplanung.cs] - ✨ Wenn der Lieferrhythmus geändert wird, werden KundenControls an falschen Tagen gelöscht. [UCTabPageLKW.cs] -- ✨ Winter und Sommer wird getrennt geändert und gespeichert. [UCTabPageLKW.cs] +- ✨ Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert. [FormExpedit.cs] -=== ✅ ERLEDIGTE TODOs (19) === -- ✅ : Auftrag über FormListe holen und daraus den Kunden für Fehlmenge holen. [FormFehlmengeCount.cs] -- ✅ : Auftragliste bei Fahrer anzeigen wenn Login. [FormMain.cs] +=== ✅ ERLEDIGTE TODOs (15) === - ✅ : Bei Transport wir ein Fach mit Aktuellem Auftrag erstellt. Das Alte wird bei Transport gespeichert. [FormAusschlager.cs] - ✅ : CLick auf Inventur freigeben Dateiname von "Warten" auf "Herrichten" ändern. [UCInventur.cs] - ✅ : ComboBox Fahrer und Priorität implementieren [FormAuftragDetail.cs] - ✅ : Container schmutzig bearbeitbar machen [FormAuftragDetail.cs] - ✅ : Feedback Button hinzufügen [FormAuftragDetail.cs] -- ✅ : HILFE zeigt OnBoarding. [FormMain.cs] - ✅ : Inventur freigeben nur für Admin oder Verwaltung. [UCInventur.cs] - ✅ : Inventur für Expedit zugänglich machen. [UCInventur.cs] +- ✅ : JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen. [FormMain.cs] - ✅ : Korrigiere Bestand: Wenn -Zahl dann Stand - Zahl. [FormAuftragDetail.cs] -- ✅ : Logik überlegen wie ein bearbeiteter Auftrag nicht doppelt gewählt werden kann. (Abteilungen zu Auftrag hinzufügen und bei Ausschlager Druck definieren?) [FormFehlmengeCount.cs] - ✅ : Mit AddFehler können Fehler aus try/chatch in Obsidian eingefügt werden. (Timestamp, PC-Name, Ex-Message) [Program.cs] -- ✅ : Neue Aufgabe Screen erstellen. [FormNeueAufgabe.cs] -- ✅ : Nur die Kunden der Aufträge als Liste anzeigen wäre möglich. Macht die Auswahl für das Personal einfacher weil 90% bereits weg fallen. [FormFehlmengeCount.cs] +- ✅ : Speichern etc. durchgehen und adaptieren [FormAuftragDetail.cs] - ✅ : Wenn Fahrer neuen Auftrag erstellt, wird Tour (BenutzerID & Liefertag) gesucht und gespeichert oder upgedatet. Dabei werden die Containerzahlen schmutzig addiert und die Kundenanzahl um 1 erhöht. [Tour.cs] +- ✅ : Wenn Frottee-Expedit auch Reklamation bearbeitet, muss BenutzerRolle abgefragt werden. siehe CHANGES. [FormFehlmengeCount.cs] - ✅ : Wenn NeuerAuftrag gewählt Fach ändern nicht vergessen. [FormAusschlager.cs] - ✅ : Wenn NeuerAuftrag gewählt wie gehts weiter? [FormAusschlager.cs] -- ✅ : Wenn RegAuftrag wird als augeliefert markiert, wird dieser automatisch neu erstellt laut hinterlegtem Rhythmus. [FormMain.cs] -=== 🔄 OFFENE TODOs (37) === +=== 🔄 OFFENE TODOs (31) === - 🔄 !!ÜBERLEGE!! DB-Query für Kundenanzahl und Containeranzahl Abgleich. (Aufträge haben TourID hinterlegt. So sollte alles vergleichbar sein.) [Tour.cs] -- 🔄 !!ÜBERLEGE!! Tour Start und Ende automatisch erfassen. [Tour.cs] +- 🔄 !!ÜBERLEGE!! Tour Start und Ende automatisch erfassen. (Beladenscan und Entladescan?) [Tour.cs] - 🔄 Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe?? [FormMain.cs] - 🔄 Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe?? [UCAuftragListe.cs] - 🔄 Auftrag richtig speichern... mit gedruckt bzw. erledigt bzw. [FormExpedit.cs] -- 🔄 Auftrag Schnellerfassung erstellen. Kundenliste aus JSON in OLV einfügen wenn schmutzig > 0 dann Auftrag erstellen. Spalten: "Kunde, schmutzig, liefertag, zustellfahrer" evnetuell in AuftragVW? [FormMain.cs] - 🔄 Auftragauswahl aufrufen statt NeuerAuftrag. (Wenn Fahrer Aufträge erstellen) [FormWSVerfolgung.cs] - 🔄 Aufträge zusammenführen wenn gleicher Kunde und Liefertag. [FormNeuerAuftrag.cs] - 🔄 Ausprobieren ob die Ausrichtung jetzt richtig ist. Sowohl beim ersten wie auch zweiten Mal. [Funktionen.cs] @@ -77,23 +71,18 @@ Build-Info: - 🔄 Funktioniert mehrere KundenControls auf einmal DragDrop? [FormTourenplanung.cs] - 🔄 Gesamt soll immer 100% sein. [Funktionen.cs] - 🔄 Hier Settings speichern mit UserSettingsManager Klasse. [FormEinstellung.cs] -- 🔄 JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen. [FormMain.cs] - 🔄 Kundenanzahl bei Tourenliste erstellen vergleichen und anpassen. [Tour.cs] -- 🔄 Mit AddFehler in Obsidian eine Fehlerliste betreiben. (Wichtige Infos feststellen und bereitstellen) [Program.cs] - 🔄 Nach Test und Rücksprache eventuell wieder umbauen. Benutzer.Rolle etc. [FormFehlmengeCount.cs] - 🔄 nicht ganze Aufträge holen sondern nur die Zahlen? [FormMain.cs] - 🔄 Non-Hard-Coded-Lösung für Priority finden. [Auftrag.cs] - 🔄 Reg.Aufträge einbauen. Besonderheit: Die Artikel sollen ebenfalls erscheinen. [Funktionen.cs] - 🔄 Settings hier ändern auf UserSettingsManager Klasse. [FormEinstellung.cs] -- 🔄 Speichern etc. durchgehen und adaptieren [FormAuftragDetail.cs] - 🔄 TourenListe Entwurf muss überarbeitet werden. [FormNeuerAuftrag.cs] -- 🔄 Umbau in Switch. [FormWSVerfolgung.cs] - 🔄 UserSetting Properties eintragen und in EinstellungsScreen abrufen. [UserSettingsManager.cs] - 🔄 Warum der falsche Path? Immer mit \\ [UCFeedback.cs] - 🔄 Weitere Properties von oben hier zuweisen [UserSettingsManager.cs] - 🔄 Wenn Auftrag abgeschlossen wird muss die Containerzahl sauber addiert werden. Kundenanzahl und Containeranzahl schmutzig darf nicht erhöht werden. [Tour.cs] -- 🔄 Wenn Frottee-Expedit auch Relamation bearbeitet, muss BenutzerRolle abgefragt werden. siehe CHANGES. [FormFehlmengeCount.cs] - 🔄 Zuweisung zu Fahrer muss geklärt werden. [Funktionen.cs] -Installation: 17.04.2026 07:41 +Installation: 21.04.2026 09:01 =====================================