From dbfd17bad3b33d5071400e20ed46337e4c11d7f2 Mon Sep 17 00:00:00 2001 From: Kilian Wirl Date: Fri, 24 Apr 2026 17:12:39 +0200 Subject: [PATCH] =?UTF-8?q?ReadMe-=C3=84nderungen=20f=C3=BCr=20bessere=20L?= =?UTF-8?q?esbarkeit=20von=20Usern/Kevin.=20DatenLaden=20bei=20NeuerAuftra?= =?UTF-8?q?g=20von=20Fahrer=20adaptiert.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AA-Forms/CustomMessageBox.Designer.cs | 39 +++++++++++++ AA-Forms/CustomMessageBox.cs | 20 +++++++ AA-Forms/FormAuftragDetail.cs | 29 ++++----- AA-Forms/FormExpedit.cs | 21 ++++++- AA-Forms/FormKundeVW.designer.cs | 3 +- AA-Forms/FormNeuerAuftrag.Designer.cs | 2 +- AA-Forms/FormNeuerAuftrag.cs | 51 ++++++++++------ App.config | 2 +- UpdateVerwaltungReadMe.ps1 | 47 ++++++++++++--- Verwaltung.csproj | 6 ++ Verwaltung_ReadMe.txt | 84 ++++++++++++++++++--------- 11 files changed, 226 insertions(+), 78 deletions(-) create mode 100644 AA-Forms/CustomMessageBox.Designer.cs create mode 100644 AA-Forms/CustomMessageBox.cs diff --git a/AA-Forms/CustomMessageBox.Designer.cs b/AA-Forms/CustomMessageBox.Designer.cs new file mode 100644 index 0000000..f7b7c51 --- /dev/null +++ b/AA-Forms/CustomMessageBox.Designer.cs @@ -0,0 +1,39 @@ +namespace Deckungsbeitrag.AA_Forms +{ + partial class CustomMessageBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "CustomMessageBox"; + } + + #endregion + } +} \ No newline at end of file diff --git a/AA-Forms/CustomMessageBox.cs b/AA-Forms/CustomMessageBox.cs new file mode 100644 index 0000000..688abb3 --- /dev/null +++ b/AA-Forms/CustomMessageBox.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Deckungsbeitrag.AA_Forms +{ + public partial class CustomMessageBox : Form + { + public CustomMessageBox() + { + InitializeComponent(); + } + } +} diff --git a/AA-Forms/FormAuftragDetail.cs b/AA-Forms/FormAuftragDetail.cs index c7fa9f2..0f57e8e 100644 --- a/AA-Forms/FormAuftragDetail.cs +++ b/AA-Forms/FormAuftragDetail.cs @@ -511,7 +511,6 @@ namespace Deckungsbeitrag } - //PRINT PAGE FÜR DRUCK private void FormAuftragDetail_Shown(object sender, EventArgs e) { fb = new UCFeedback(benutzer); @@ -554,18 +553,18 @@ namespace Deckungsbeitrag ObjectListView olv = (ObjectListView)sender; AuftragArtikel auftragArtikel = (AuftragArtikel)e.RowObject; - if (e.Column.Text == "Anzahl") diff = (int)e.Value - ((int)e.NewValue); - if (diff > 0) Tosave = true; + int newValue = (int)e.NewValue; + + if (this.auftrag.Typ == AuftragTyp.SOLL_Verminderung) if (newValue > 0) newValue = newValue * -1; + if (e.Column.Text == "Anzahl") diff = (int)e.Value - (newValue); + if (diff != 0) Tosave = true; if (auftragDictionary.TryGetValue((int)auftragArtikel.AuftragArtikelID, out int val)) { - val = (int)e.NewValue; - if ((int)e.NewValue == 0) e.ListViewItem.Checked = true; + val = newValue; + if (newValue == 0) e.ListViewItem.Checked = true; } - else auftragDictionary.Add((int)auftragArtikel.AuftragArtikelID, (int)e.NewValue); - - //auftragArtikel.Anzahl = (int)e.NewValue; - //auftragArtikel.Save(); + else auftragDictionary.Add((int)auftragArtikel.AuftragArtikelID, newValue); KundeArtikel kndart = KundeArtikel.GetKundeArtikelVonArtikelID(this.kunde.KundeID, auftragArtikel.ArtikelID); @@ -574,12 +573,7 @@ namespace Deckungsbeitrag int stand = kndart.Stand; int korrektur = kndart.Korrektur; KorrigiereBestand(diff, ref reklamation, ref fehlmenge, ref stand, ref korrektur); - //kndart.Reklamation = reklamation; - //kndart.Fehlmenge = fehlmenge; - //kndart.Stand = stand; - //kndart.Korrektur = korrektur; - - //kndart.Save(); + if (dictionary.TryGetValue((int)kndart.KundeArtikelID, out int[] value)) { for (int i = 0; i < value.Length; i++) @@ -598,7 +592,7 @@ namespace Deckungsbeitrag bestand = new int[4]; if (diff == 0) return; - if (diff < 0) { bestand[2] = diff; stand += diff; return; } + if (diff < 0 || this.auftrag.Typ == AuftragTyp.SOLL_Erhoehung) { bestand[2] = diff; stand += diff; return; } int rest = diff * 1; @@ -666,4 +660,5 @@ namespace Deckungsbeitrag //CHANGES: 2. Änderungen werden nur gespeichert wenn ein Etikett gedruckt wurde. //CHANGES: 3. Abschließen nur möglich wenn alle Artikel auf 0 sind (Checked) und gespeichert wurde. //CHANGES: Bei Druckabbruch wird die geänderte Zahl NICHT zurückgesetzt. (Das muss händisch erfolgen) -//CHANGES: Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. \ No newline at end of file +//CHANGES: Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. +//CHANGES: Wenn die reduzierte Anzahl bei SOLL-Verminderung nicht negativ ist, wird diese negativ gemacht. So wird ein möglicher Fehler ausgebessert. \ No newline at end of file diff --git a/AA-Forms/FormExpedit.cs b/AA-Forms/FormExpedit.cs index b65126b..0a10ab5 100644 --- a/AA-Forms/FormExpedit.cs +++ b/AA-Forms/FormExpedit.cs @@ -161,7 +161,23 @@ namespace Deckungsbeitrag #region Button_Click-Events private async void ButtonNeuerAuftrag_Click(object sender, EventArgs e) { - FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(benutzer, this.letzterLiefertag, AuftragTyp.Standart); + DialogResult result = DialogResult.Cancel; + AuftragTyp? auftragTyp = null; + result = MessageBox.Show("Welchen Auftrag möchtest du erstellen?\n\n[JA] => Geschäft\n[NEIN] => Standart", "FRAGE", MessageBoxButtons.YesNoCancel); + + switch (result) + { + case DialogResult.Yes: + auftragTyp = AuftragTyp.Geschäft; + break; + case DialogResult.No: + auftragTyp = AuftragTyp.Standart; + break; + default: + return; + } + + FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(benutzer, this.letzterLiefertag, auftragTyp); if (neuerAuftrag.ShowDialog() == DialogResult.OK) { this.letzterLiefertag = neuerAuftrag.letzterLiefertag; @@ -1318,4 +1334,5 @@ namespace Deckungsbeitrag //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 +//CHANGES: NumericUpDown markiert automatisch den Inhalt. Erleichtert die Eingabe. +//CHANGES: Wenn Expedit NeuerAuftrag aufruft wird gefragt welcher Auftrag gewünscht ist. Geschäftkunde = Geschäft (Notwendig bis ausschließlich Fahrer die Standardaufträge erstellen) \ No newline at end of file diff --git a/AA-Forms/FormKundeVW.designer.cs b/AA-Forms/FormKundeVW.designer.cs index b872ae4..640c5cd 100644 --- a/AA-Forms/FormKundeVW.designer.cs +++ b/AA-Forms/FormKundeVW.designer.cs @@ -369,6 +369,7 @@ namespace Deckungsbeitrag this.buttonSWS_Drucken.TabIndex = 36; this.buttonSWS_Drucken.Text = "SWS-Drucken"; this.buttonSWS_Drucken.UseVisualStyleBackColor = false; + this.buttonSWS_Drucken.Visible = false; this.buttonSWS_Drucken.Click += new System.EventHandler(this.ButtonDrucken_Click); // // pictureBoxEntwurf @@ -401,7 +402,7 @@ namespace Deckungsbeitrag this.tabPageUmsatz.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.tabPageUmsatz.Name = "tabPageUmsatz"; this.tabPageUmsatz.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.tabPageUmsatz.Size = new System.Drawing.Size(925, 692); + this.tabPageUmsatz.Size = new System.Drawing.Size(1001, 734); this.tabPageUmsatz.TabIndex = 0; this.tabPageUmsatz.Text = "Umsatz"; // diff --git a/AA-Forms/FormNeuerAuftrag.Designer.cs b/AA-Forms/FormNeuerAuftrag.Designer.cs index 38f9f1c..8166e9e 100644 --- a/AA-Forms/FormNeuerAuftrag.Designer.cs +++ b/AA-Forms/FormNeuerAuftrag.Designer.cs @@ -388,7 +388,7 @@ namespace Deckungsbeitrag this.textBoxText.Size = new System.Drawing.Size(518, 459); this.textBoxText.TabIndex = 48; this.textBoxText.Visible = false; - this.textBoxText.VisibleChanged += new System.EventHandler(this.textBoxText_VisibleChanged); + this.textBoxText.VisibleChanged += new System.EventHandler(this.TextBoxText_VisibleChanged); // // pictureBoxAddArtikel // diff --git a/AA-Forms/FormNeuerAuftrag.cs b/AA-Forms/FormNeuerAuftrag.cs index 034c661..5436a13 100644 --- a/AA-Forms/FormNeuerAuftrag.cs +++ b/AA-Forms/FormNeuerAuftrag.cs @@ -64,7 +64,7 @@ namespace Deckungsbeitrag { this.auftragtyp = auftragTyp; } - public FormNeuerAuftrag(Benutzer benutzer, DateTime? letzterLiefertag, AuftragTyp auftragTyp) : this(benutzer, auftragTyp) + public FormNeuerAuftrag(Benutzer benutzer, DateTime? letzterLiefertag, AuftragTyp? auftragTyp) : this(benutzer, auftragTyp) { this.letzterLiefertag = letzterLiefertag; } @@ -85,17 +85,8 @@ namespace Deckungsbeitrag if (this.auftragtyp == AuftragTyp.Regelmäßig) {kndService = "Geschäft"; labelLiefertag.Text = "Erster Liefertag:"; } if (this.benutzer.Rolle == BenutzerRolle.Fahrer) kndService = "Geschäft"; - // Kunde laden - this.kunde = Funktionen.Open_List(kndService); - if (this.kunde == null) { CloseForm(DialogResult.Cancel); return; } - this.textBoxKndNr.Text = kunde.KundeNummer; - this.kundeName = this.textBoxKundeName.Text = this.kunde.Suchtext ?? this.kunde.KundeName; - - this.textBoxKundeName.Enabled = false; - this.textBoxKndNr.Enabled = false; - - if (this.auftragtyp == null || this.auftragtyp == AuftragTyp.Geschäft) SonderDatenLaden(); - else DatenLaden(); + if (this.auftragtyp == null || this.auftragtyp == AuftragTyp.Geschäft) SonderDatenLaden(kndService); + else DatenLaden(kndService); } private async void FormNeuerAuftrag_HelpButtonClicked(object sender, CancelEventArgs e) { @@ -104,16 +95,22 @@ namespace Deckungsbeitrag ZeigeOnboarding(); } - private void SonderDatenLaden() + private void SonderDatenLaden(string kndService) { + // Kunde laden + if (!GetKunde(kndService)) { CloseForm(DialogResult.Cancel); return; } + // ComboBox Typ & Fahrer wird mit Items geladen ComboBoxTyp_Load(); ComboBoxFahrer_Load(); } - private void DatenLaden() + private void DatenLaden(string kndService) { this.SuspendLayout(); + // Kunde laden + if (!GetKunde(kndService)) { CloseForm(DialogResult.Cancel); return; } + // Containeranzahl laden if (int.TryParse(Interaction.InputBox($"Wieviel Container hast du beim Kunde {kundeName} abgeholt?", "CONTAINERANZAHL", "1"), out int i)) this.textBoxCont.Text = i.ToString(); else { CloseForm(DialogResult.Cancel); return; } @@ -127,6 +124,19 @@ namespace Deckungsbeitrag this.ResumeLayout(); } + private bool GetKunde(string kndService) + { + this.kunde = Funktionen.Open_List(kndService); + if (this.kunde == null) { CloseForm(DialogResult.Cancel); return false; } + + this.textBoxKndNr.Text = kunde.KundeNummer; + this.kundeName = this.textBoxKundeName.Text = this.kunde.Suchtext ?? this.kunde.KundeName; + + // Textboxen mit Kundedaten füllen + this.textBoxKundeName.Enabled = false; + this.textBoxKndNr.Enabled = false; + return true; + } private void GetNextLiefertag() { DateTime nextLiefertag = DateTime.Today; @@ -226,11 +236,12 @@ namespace Deckungsbeitrag List tourliste = Tour.GetSaisonListe(saison); this.comboBoxFahrer.DataSource = tourliste; this.comboBoxFahrer.DisplayMember = "Bezeichnung"; + this.comboBoxFahrer.ValueMember = "TourID"; this.comboBoxFahrer.DropDownWidth = GetDropDownWidth(this.comboBoxFahrer); // ComboBox-Auswahl vordefinieren. if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { - this.comboBoxFahrer.SelectedItem = tour; + this.comboBoxFahrer.SelectedValue = tour.TourID; } else this.comboBoxFahrer.SelectedIndex = -1; this.comboBoxFahrer.Validating += ComboBoxFahrer_Validating; @@ -326,7 +337,7 @@ namespace Deckungsbeitrag 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", ""); + anzahl = Interaction.InputBox($"Wieviel Stück sollen geliefert oder eingezogen werden?\n\nStück:", "Artikelanzahl", ""); index++; } while (!int.TryParse(anzahl, out artAnzahl)); @@ -449,6 +460,8 @@ namespace Deckungsbeitrag return; case AuftragTyp.Regelmäßig: SpezialAuftragSpeichern(Auftrag); return; + case AuftragTyp.IST_Erhoehung: SpezialAuftragSpeichern(Auftrag); + return; default: break; } @@ -579,7 +592,7 @@ namespace Deckungsbeitrag Rhythmus = this.comboBoxRhythmus.Enabled ? (RegRhythmen)this.comboBoxRhythmus.SelectedItem : RegRhythmen.Unbekannt, // Wenn Rhythmus ist nicht Enabled dann RegRhythmus Unbekannt. TourID = selectedTour?.TourID, // Wenn Tour hinterlegt dann TourID speichern. ArbeiterID = selectedTour?.BenutzerID, // Wenn Tour hinterlegt dann BenutzerID der Tour speichern. KANN AUCH null SEIN!! - Priority = selectedTour.Priority, // Wenn Tour hinterlegt dann Priority der Tour speichern. + Priority = selectedTour == null ? Priority.None : selectedTour.Priority, // Wenn Tour hinterlegt dann Priority der Tour speichern. ZusatzInfo = zusatz, }; @@ -677,7 +690,7 @@ namespace Deckungsbeitrag if (this.benutzer.Rolle == BenutzerRolle.Fahrer) { this.Auftrag = null; - DatenLaden(); + DatenLaden(string.Empty); } } @@ -739,7 +752,7 @@ namespace Deckungsbeitrag //this.Close(); // Onboarding beendet } } - private void textBoxText_VisibleChanged(object sender, EventArgs e) + private void TextBoxText_VisibleChanged(object sender, EventArgs e) { if (textBoxText.Visible) { diff --git a/App.config b/App.config index cd7ad7f..6484ec4 100644 --- a/App.config +++ b/App.config @@ -6,7 +6,7 @@ - + diff --git a/UpdateVerwaltungReadMe.ps1 b/UpdateVerwaltungReadMe.ps1 index e9cb668..af1de06 100644 --- a/UpdateVerwaltungReadMe.ps1 +++ b/UpdateVerwaltungReadMe.ps1 @@ -43,6 +43,7 @@ if (Test-Path $assemblyInfoPath) { } # Dateien durchsuchen +$changesList = @() $openTodos = @() $doneTodos = @() $installReminders = @() @@ -74,10 +75,39 @@ foreach ($file in $csFiles) { } # CHANGES erkennen - $changeMatches = [regex]::Matches($content, '//\s*CHANGES\s*:?\s*(.+?)(?=\r?\n|//|$)', 'IgnoreCase') + $pattern = '//\s*CHANGES\s*:?\s*(.+?)(?=\r?\n|//|$)' + + $changeMatches = [regex]::Matches($content, $pattern, 'IgnoreCase') foreach ($match in $changeMatches) { $txt = $match.Groups[1].Value.Trim() - if ($txt) { $changes += "✨ $txt [$($file.Name)]" } + if ($txt) { + $changesList += [PSCustomObject]@{ + Datei = if ($file.Name.StartsWith("Form")) { + $file.Name.Substring(4) + } else {$file.Name} + Text = $txt + } + } + $markdownLines = @() + +# Nach Class gruppieren, Class‑Namen sortieren, dann pro Gruppe Text sortieren + $changesList | + Group-Object -Property Datei | + Sort-Object -Property Name | + ForEach-Object { + $datei = $_.Name + + $markdownLines += "## $datei ##" + $markdownLines += "" + + $_.Group | + Sort-Object -Property Text | + ForEach-Object { + $markdownLines += "- ✨ $($_.Text)" + } + + $markdownLines += "" + } } } @@ -85,7 +115,6 @@ foreach ($file in $csFiles) { $openTodos = $openTodos | Sort-Object | Get-Unique $doneTodos = $doneTodos | Sort-Object | Get-Unique $installReminders = $installReminders | Sort-Object | Get-Unique -$changes = $changes | Sort-Object | Get-Unique # Formatierte Abschnitte $doneSection = if ($doneTodos.Count -gt 0) { @@ -109,9 +138,9 @@ $installSection = if ($installReminders.Count -gt 0) { @("Keine Install-Reminder vorhanden ✅") } -$changesSection = if ($changes.Count -gt 0) { - @("=== ✨ CHANGES ($($changes.Count)) ===") + - ($changes | ForEach-Object { "- $_" }) +$changesSection = if ($markdownLines.Count -gt 0) { + @("=== ✨ CHANGES ($($markdownLines.Count)) ===") + + ($markdownLines | ForEach-Object { "- $_" }) } else { @("Keine Changes vorhanden") } @@ -121,6 +150,7 @@ $doneText = $doneSection -join "`r`n" $openText = $openSection -join "`r`n" $installText = $installSection -join "`r`n" $changesText = $changesSection -join "`r`n" +$markdown = $markdownLines -join "`n" $custom = "Release Build" $buildDate = Get-Date -Format "dd.MM.yyyy HH:mm" @@ -136,9 +166,10 @@ Build-Info: - Erledigte TODOs: $($doneTodos.Count) - Offene TODOs: $($openTodos.Count) - Install-Reminders: $($installReminders.Count) -- Changes: $($changes.Count) +- Changes: $($changesList.Count) -$changesText +=== ✨ CHANGES ($($changesList.Count)) === +$markdown $installText diff --git a/Verwaltung.csproj b/Verwaltung.csproj index dbc8f20..663f3a7 100644 --- a/Verwaltung.csproj +++ b/Verwaltung.csproj @@ -157,6 +157,12 @@ + + Form + + + CustomMessageBox.cs + Form diff --git a/Verwaltung_ReadMe.txt b/Verwaltung_ReadMe.txt index 7b0c1ad..d8fe2cc 100644 --- a/Verwaltung_ReadMe.txt +++ b/Verwaltung_ReadMe.txt @@ -7,38 +7,64 @@ Build-Info: - Erledigte TODOs: 6 - Offene TODOs: 24 - Install-Reminders: 1 -- Changes: 26 +- Changes: 28 + +=== ✨ CHANGES (28) === +## ArtikelVW.cs ## + +- ✨ Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel. + +## AuftragDetail.cs ## + +- ✨ 1. Es wird ab sofort nur ein Button zum Speichern und Abschließen bereitgestellt. System entscheidet was getan wird. +- ✨ 2. Änderungen werden nur gespeichert wenn ein Etikett gedruckt wurde. +- ✨ 3. Abschließen nur möglich wenn alle Artikel auf 0 sind (Checked) und gespeichert wurde. +- ✨ Bei Druckabbruch wird die geänderte Zahl NICHT zurückgesetzt. (Das muss händisch erfolgen) +- ✨ Wenn die reduzierte Anzahl bei SOLL-Verminderung nicht negativ ist, wird diese negativ gemacht. So wird ein möglicher Fehler ausgebessert. +- ✨ Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. + +## Expedit.cs ## + +- ✨ Im Tab Rampe wird bei DoppelClick der Auftrag als gewaschen markiert und im Tab Aufträge heute sichtbar. +- ✨ Im Tab Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen. +- ✨ NumericUpDown markiert automatisch den Inhalt. Erleichtert die Eingabe. +- ✨ Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert. +- ✨ Wenn Expedit NeuerAuftrag aufruft wird gefragt welcher Auftrag gewünscht ist. Geschäftkunde = Geschäft (Notwendig bis ausschließlich Fahrer die Standardaufträge erstellen) + +## Main.cs ## + +- ✨ Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden. +- ✨ Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren. + +## NeuerAuftrag.cs ## + +- ✨ Auftrag LAUFZETTEL (ehem. Einmalig) läuft als Sonderauftrag also Tab-Sonderaufträge. +- ✨ Der Text des LAUFZETTELS wird bei Expedit im InfoFeld angezeigt. +- ✨ DropDownWidth wird an das größte Item angepasst. +- ✨ Es kann ab jetzt Morgen als Liefertag gewählt werden. + +## Tourenplanung.cs ## + +- ✨ Es kann nach der Kontrolle der Lieferrhythmus geändert werden. Dazu muss auch die Anzahl der Liefertage gewählt werden. +- ✨ Es können nur so viele Clone erstellt werden wie Liefertag im Lieferrhythmus hinterlegt sind. +- ✨ Es wir kontrolliert ob der gewählte Liefertag zum hinterlegten Lieferrhythmus passt. +- ✨ TabText wird mit Benutzerliste verglichen. Wenn ein passender gefunden wird Tag hinterlegt. + +## UCInventur.cs ## + +- ✨ Beim nachträglichen Ändern des Standes wird jetzt die Schwund-Spalte neu berechnet. Damit sollte die Berechnung wieder stimmen. +- ✨ Es wird jetzt nur ein Button "Speichern/Freigeben" bereitgestellt und dort dann gefragt ob speichern oder freigeben. Hier wird auch zwischen den Rollen unterschieden. + +## UCTabPageLKW.cs ## + +- ✨ Innerhalb eines Tages kann die Reihenfolge angepasst werden. +- ✨ Lieferrhythmen können angepasst und übernommen werden. +- ✨ Speichern und Laden wurde angepasst, JSON enthält jetzt pro Tag eine Kundenliste. +- ✨ Wenn der Lieferrhythmus geändert wird, werden KundenControls an falschen Tagen gelöscht. -=== ✨ CHANGES (26) === -- ✨ 1. Es wird ab sofort nur ein Button zum Speichern und Abschließen bereitgestellt. System entscheidet was getan wird. [FormAuftragDetail.cs] -- ✨ 2. Änderungen werden nur gespeichert wenn ein Etikett gedruckt wurde. [FormAuftragDetail.cs] -- ✨ 3. Abschließen nur möglich wenn alle Artikel auf 0 sind (Checked) und gespeichert wurde. [FormAuftragDetail.cs] -- ✨ Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden. [FormMain.cs] -- ✨ Auftrag LAUFZETTEL (ehem. Einmalig) läuft als Sonderauftrag also Tab-Sonderaufträge. [FormNeuerAuftrag.cs] -- ✨ Bei Druckabbruch wird die geänderte Zahl NICHT zurückgesetzt. (Das muss händisch erfolgen) [FormAuftragDetail.cs] -- ✨ Beim nachträglichen Ändern des Standes wird jetzt die Schwund-Spalte neu berechnet. Damit sollte die Berechnung wieder stimmen. [UCInventur.cs] -- ✨ Der Text des LAUFZETTELS wird bei Expedit im InfoFeld angezeigt. [FormNeuerAuftrag.cs] -- ✨ DropDownWidth wird an das größte Item angepasst. [FormNeuerAuftrag.cs] -- ✨ Es kann ab jetzt Morgen als Liefertag gewählt werden. [FormNeuerAuftrag.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] -- ✨ Es wird jetzt nur ein Button "Speichern/Freigeben" bereitgestellt und dort dann gefragt ob speichern oder freigeben. Hier wird auch zwischen den Rollen unterschieden. [UCInventur.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] -- ✨ Lieferrhythmen können angepasst und übernommen werden. [UCTabPageLKW.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] -- ✨ Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. [FormAuftragDetail.cs] -- ✨ Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert. [FormExpedit.cs] === ⚙️ INSTALL-REMINDER (1) === - ⚙️ DB anpassen. (Priority in Auftrag etc.) [Auftrag.cs] -Installation: 24.04.2026 13:46 +Installation: 24.04.2026 17:10 =====================================