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
=====================================