Merge branch 'Development'

This commit is contained in:
Kilian Wirl 2025-12-16 17:04:48 +01:00
commit 7644bab0e3
25 changed files with 2351 additions and 173 deletions

View File

@ -305,8 +305,8 @@ namespace Deckungsbeitrag
Fach_Laden();
}
}
//TODO: Wenn NeuerAuftrag gewählt wie gehts weiter?
}
}
//DONE: Bei Transport wir ein Fach mit Aktuellem Auftrag erstellt. Das Alte wird bei Transport gespeichert.
//DONE: Wenn NeuerAuftrag gewählt Fach ändern nicht vergessen.
//DONE: Wenn NeuerAuftrag gewählt wie gehts weiter?

View File

@ -71,7 +71,23 @@
this.tabPageAll = new System.Windows.Forms.TabPage();
this.objectListViewAuftrag = new BrightIdeasSoftware.ObjectListView();
this.tabControlAuftragList = new System.Windows.Forms.TabControl();
this.buttonStats = new System.Windows.Forms.Button();
this.buttonEinstellung = new System.Windows.Forms.Button();
this.groupBoxStatistik = new System.Windows.Forms.GroupBox();
this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker();
this.tableLayoutPanelStatistik = new System.Windows.Forms.TableLayoutPanel();
this.labelZahl6 = new System.Windows.Forms.Label();
this.labelStatistik6 = new System.Windows.Forms.Label();
this.labelZahl5 = new System.Windows.Forms.Label();
this.labelStatistik5 = new System.Windows.Forms.Label();
this.labelZahl4 = new System.Windows.Forms.Label();
this.labelStatistik4 = new System.Windows.Forms.Label();
this.labelZahl3 = new System.Windows.Forms.Label();
this.labelStatistik3 = new System.Windows.Forms.Label();
this.labelZahl2 = new System.Windows.Forms.Label();
this.labelStatistik2 = new System.Windows.Forms.Label();
this.labelZahl1 = new System.Windows.Forms.Label();
this.labelStatistik1 = new System.Windows.Forms.Label();
this.groupBoxEtikett.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxMinus)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlus)).BeginInit();
@ -82,6 +98,8 @@
this.tabPageAll.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.objectListViewAuftrag)).BeginInit();
this.tabControlAuftragList.SuspendLayout();
this.groupBoxStatistik.SuspendLayout();
this.tableLayoutPanelStatistik.SuspendLayout();
this.SuspendLayout();
//
// label10
@ -382,7 +400,7 @@
this.buttonSWS_Drucken.FlatAppearance.BorderSize = 0;
this.buttonSWS_Drucken.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonSWS_Drucken.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonSWS_Drucken.Location = new System.Drawing.Point(1226, 727);
this.buttonSWS_Drucken.Location = new System.Drawing.Point(1179, 727);
this.buttonSWS_Drucken.Margin = new System.Windows.Forms.Padding(2);
this.buttonSWS_Drucken.Name = "buttonSWS_Drucken";
this.buttonSWS_Drucken.Size = new System.Drawing.Size(200, 41);
@ -461,7 +479,7 @@
this.buttonNeuerAuftrag.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonNeuerAuftrag.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonNeuerAuftrag.ForeColor = System.Drawing.Color.Black;
this.buttonNeuerAuftrag.Location = new System.Drawing.Point(1022, 727);
this.buttonNeuerAuftrag.Location = new System.Drawing.Point(975, 727);
this.buttonNeuerAuftrag.Margin = new System.Windows.Forms.Padding(2);
this.buttonNeuerAuftrag.Name = "buttonNeuerAuftrag";
this.buttonNeuerAuftrag.Size = new System.Drawing.Size(200, 41);
@ -667,6 +685,20 @@
this.tabControlAuftragList.SelectedIndexChanged += new System.EventHandler(this.tabControlAuftragList_SelectedIndexChanged);
this.tabControlAuftragList.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControlAuftragList_Selected);
//
// buttonStats
//
this.buttonStats.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonStats.FlatAppearance.BorderColor = System.Drawing.Color.White;
this.buttonStats.FlatAppearance.BorderSize = 3;
this.buttonStats.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonStats.Image = global::Deckungsbeitrag.Properties.Resources.StatisticsWarning_16x;
this.buttonStats.Location = new System.Drawing.Point(1384, 727);
this.buttonStats.Name = "buttonStats";
this.buttonStats.Size = new System.Drawing.Size(41, 41);
this.buttonStats.TabIndex = 46;
this.buttonStats.UseVisualStyleBackColor = true;
this.buttonStats.Click += new System.EventHandler(this.buttonStats_Click);
//
// buttonEinstellung
//
this.buttonEinstellung.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
@ -681,12 +713,225 @@
this.buttonEinstellung.UseVisualStyleBackColor = true;
this.buttonEinstellung.Click += new System.EventHandler(this.buttonEinstellung_Click);
//
// groupBoxStatistik
//
this.groupBoxStatistik.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxStatistik.Controls.Add(this.dateTimePicker1);
this.groupBoxStatistik.Controls.Add(this.tableLayoutPanelStatistik);
this.groupBoxStatistik.ForeColor = System.Drawing.Color.White;
this.groupBoxStatistik.Location = new System.Drawing.Point(1171, 12);
this.groupBoxStatistik.Name = "groupBoxStatistik";
this.groupBoxStatistik.Size = new System.Drawing.Size(301, 197);
this.groupBoxStatistik.TabIndex = 62;
this.groupBoxStatistik.TabStop = false;
this.groupBoxStatistik.Text = "STATISTIK";
this.groupBoxStatistik.Visible = false;
//
// dateTimePicker1
//
this.dateTimePicker1.CustomFormat = "dddd dd.MM.yyyy";
this.dateTimePicker1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.dateTimePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.dateTimePicker1.Location = new System.Drawing.Point(10, 19);
this.dateTimePicker1.Name = "dateTimePicker1";
this.dateTimePicker1.Size = new System.Drawing.Size(224, 26);
this.dateTimePicker1.TabIndex = 1;
this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp);
//
// tableLayoutPanelStatistik
//
this.tableLayoutPanelStatistik.ColumnCount = 2;
this.tableLayoutPanelStatistik.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelStatistik.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl6, 1, 5);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik6, 0, 5);
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl5, 1, 4);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik5, 0, 4);
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl4, 1, 3);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik4, 0, 3);
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl3, 1, 2);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik3, 0, 2);
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl2, 1, 1);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik2, 0, 1);
this.tableLayoutPanelStatistik.Controls.Add(this.labelZahl1, 1, 0);
this.tableLayoutPanelStatistik.Controls.Add(this.labelStatistik1, 0, 0);
this.tableLayoutPanelStatistik.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanelStatistik.Location = new System.Drawing.Point(3, 51);
this.tableLayoutPanelStatistik.Name = "tableLayoutPanelStatistik";
this.tableLayoutPanelStatistik.RowCount = 6;
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F));
this.tableLayoutPanelStatistik.Size = new System.Drawing.Size(295, 143);
this.tableLayoutPanelStatistik.TabIndex = 0;
//
// labelZahl6
//
this.labelZahl6.AutoSize = true;
this.labelZahl6.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl6.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl6.ForeColor = System.Drawing.Color.White;
this.labelZahl6.Location = new System.Drawing.Point(99, 115);
this.labelZahl6.Name = "labelZahl6";
this.labelZahl6.Size = new System.Drawing.Size(53, 28);
this.labelZahl6.TabIndex = 11;
this.labelZahl6.Text = "Zahl 6";
this.labelZahl6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik6
//
this.labelStatistik6.AutoSize = true;
this.labelStatistik6.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik6.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik6.ForeColor = System.Drawing.Color.White;
this.labelStatistik6.Location = new System.Drawing.Point(3, 115);
this.labelStatistik6.Name = "labelStatistik6";
this.labelStatistik6.Size = new System.Drawing.Size(90, 28);
this.labelStatistik6.TabIndex = 10;
this.labelStatistik6.Text = "Statistik 6";
this.labelStatistik6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelZahl5
//
this.labelZahl5.AutoSize = true;
this.labelZahl5.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl5.ForeColor = System.Drawing.Color.White;
this.labelZahl5.Location = new System.Drawing.Point(99, 92);
this.labelZahl5.Name = "labelZahl5";
this.labelZahl5.Size = new System.Drawing.Size(53, 23);
this.labelZahl5.TabIndex = 9;
this.labelZahl5.Text = "Zahl 5";
this.labelZahl5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik5
//
this.labelStatistik5.AutoSize = true;
this.labelStatistik5.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik5.ForeColor = System.Drawing.Color.White;
this.labelStatistik5.Location = new System.Drawing.Point(3, 92);
this.labelStatistik5.Name = "labelStatistik5";
this.labelStatistik5.Size = new System.Drawing.Size(90, 23);
this.labelStatistik5.TabIndex = 8;
this.labelStatistik5.Text = "Statistik 5";
this.labelStatistik5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelZahl4
//
this.labelZahl4.AutoSize = true;
this.labelZahl4.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl4.ForeColor = System.Drawing.Color.White;
this.labelZahl4.Location = new System.Drawing.Point(99, 69);
this.labelZahl4.Name = "labelZahl4";
this.labelZahl4.Size = new System.Drawing.Size(53, 23);
this.labelZahl4.TabIndex = 7;
this.labelZahl4.Text = "Zahl 4";
this.labelZahl4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik4
//
this.labelStatistik4.AutoSize = true;
this.labelStatistik4.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik4.ForeColor = System.Drawing.Color.White;
this.labelStatistik4.Location = new System.Drawing.Point(3, 69);
this.labelStatistik4.Name = "labelStatistik4";
this.labelStatistik4.Size = new System.Drawing.Size(90, 23);
this.labelStatistik4.TabIndex = 6;
this.labelStatistik4.Text = "Statistik 4";
this.labelStatistik4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelZahl3
//
this.labelZahl3.AutoSize = true;
this.labelZahl3.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl3.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl3.ForeColor = System.Drawing.Color.White;
this.labelZahl3.Location = new System.Drawing.Point(99, 46);
this.labelZahl3.Name = "labelZahl3";
this.labelZahl3.Size = new System.Drawing.Size(53, 23);
this.labelZahl3.TabIndex = 5;
this.labelZahl3.Text = "Zahl 3";
this.labelZahl3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik3
//
this.labelStatistik3.AutoSize = true;
this.labelStatistik3.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik3.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik3.ForeColor = System.Drawing.Color.White;
this.labelStatistik3.Location = new System.Drawing.Point(3, 46);
this.labelStatistik3.Name = "labelStatistik3";
this.labelStatistik3.Size = new System.Drawing.Size(90, 23);
this.labelStatistik3.TabIndex = 4;
this.labelStatistik3.Text = "Statistik 3";
this.labelStatistik3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelZahl2
//
this.labelZahl2.AutoSize = true;
this.labelZahl2.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl2.ForeColor = System.Drawing.Color.White;
this.labelZahl2.Location = new System.Drawing.Point(99, 23);
this.labelZahl2.Name = "labelZahl2";
this.labelZahl2.Size = new System.Drawing.Size(53, 23);
this.labelZahl2.TabIndex = 3;
this.labelZahl2.Text = "Zahl 2";
this.labelZahl2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik2
//
this.labelStatistik2.AutoSize = true;
this.labelStatistik2.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik2.ForeColor = System.Drawing.Color.White;
this.labelStatistik2.Location = new System.Drawing.Point(3, 23);
this.labelStatistik2.Name = "labelStatistik2";
this.labelStatistik2.Size = new System.Drawing.Size(90, 23);
this.labelStatistik2.TabIndex = 2;
this.labelStatistik2.Text = "Statistik 2";
this.labelStatistik2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelZahl1
//
this.labelZahl1.AutoSize = true;
this.labelZahl1.Dock = System.Windows.Forms.DockStyle.Left;
this.labelZahl1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelZahl1.ForeColor = System.Drawing.Color.White;
this.labelZahl1.Location = new System.Drawing.Point(99, 0);
this.labelZahl1.Name = "labelZahl1";
this.labelZahl1.Size = new System.Drawing.Size(53, 23);
this.labelZahl1.TabIndex = 1;
this.labelZahl1.Text = "Zahl 1";
this.labelZahl1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelStatistik1
//
this.labelStatistik1.AutoSize = true;
this.labelStatistik1.Dock = System.Windows.Forms.DockStyle.Left;
this.labelStatistik1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatistik1.ForeColor = System.Drawing.Color.White;
this.labelStatistik1.Location = new System.Drawing.Point(3, 0);
this.labelStatistik1.Name = "labelStatistik1";
this.labelStatistik1.Size = new System.Drawing.Size(90, 23);
this.labelStatistik1.TabIndex = 0;
this.labelStatistik1.Text = "Statistik 1";
this.labelStatistik1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// FormExpedit
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.ClientSize = new System.Drawing.Size(1481, 777);
this.Controls.Add(this.groupBoxStatistik);
this.Controls.Add(this.buttonStats);
this.Controls.Add(this.buttonEinstellung);
this.Controls.Add(this.dGArtikel);
this.Controls.Add(this.buttonNeuerAuftrag);
@ -719,6 +964,9 @@
this.tabPageAll.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.objectListViewAuftrag)).EndInit();
this.tabControlAuftragList.ResumeLayout(false);
this.groupBoxStatistik.ResumeLayout(false);
this.tableLayoutPanelStatistik.ResumeLayout(false);
this.tableLayoutPanelStatistik.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@ -766,5 +1014,21 @@
private BrightIdeasSoftware.ObjectListView objectListViewAuftrag;
private System.Windows.Forms.TabControl tabControlAuftragList;
private System.Windows.Forms.Button buttonEinstellung;
private System.Windows.Forms.Button buttonStats;
private System.Windows.Forms.GroupBox groupBoxStatistik;
private System.Windows.Forms.DateTimePicker dateTimePicker1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelStatistik;
private System.Windows.Forms.Label labelZahl6;
private System.Windows.Forms.Label labelStatistik6;
private System.Windows.Forms.Label labelZahl5;
private System.Windows.Forms.Label labelStatistik5;
private System.Windows.Forms.Label labelZahl4;
private System.Windows.Forms.Label labelStatistik4;
private System.Windows.Forms.Label labelZahl3;
private System.Windows.Forms.Label labelStatistik3;
private System.Windows.Forms.Label labelZahl2;
private System.Windows.Forms.Label labelStatistik2;
private System.Windows.Forms.Label labelZahl1;
private System.Windows.Forms.Label labelStatistik1;
}
}

View File

@ -1,10 +1,13 @@
using BrightIdeasSoftware;
using DatenDB;
using Deckungsbeitrag.Properties;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Xml.Resolvers;
@ -34,7 +37,9 @@ namespace Deckungsbeitrag
private Screen[] screens;
private Point itemlocation;
private ImageList imagelist = new ImageList();
private volatile bool _isProcessing = false; // Thread-sicherer Flag gegen Überlappung
private int _consecutiveFailures = 0;
private const int MAX_FAILURES = 3;
public FormExpedit(Benutzer benutzer)
{
@ -164,16 +169,63 @@ namespace Deckungsbeitrag
/// <param name="e"></param>
private void Timer1_Tick(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
// Vermeide Überlappung (wenn vorheriger Tick noch läuft)
if (_isProcessing) return;
Cursor.Current = Cursors.WaitCursor;
_isProcessing = true;
try
{
if (auftrag != null)
{
Auftrag _auftrag = Auftrag.GetAuftrag(auftrag.AuftragID);
const int maxRetries = 3;
Auftrag _auftrag = null;
for (int retry = 0; retry < maxRetries; retry++)
{
try
{
_auftrag = Auftrag.GetAuftrag(auftrag.AuftragID);
if (dGArtikel.Visible) Load_Gridview(_auftrag);
_consecutiveFailures = 0; // Erfolg -> Zähler reset
break;
}
catch (NpgsqlException ex) when ((ex.InnerException is SocketException || ex.InnerException is System.IO.IOException) && retry < maxRetries - 1)
{
_consecutiveFailures++;
Debug.WriteLine($"Retry {retry + 1}/{maxRetries}: {ex.Message}"); // Logging
System.Threading.Thread.Sleep(1000 * (int)Math.Pow(2, retry)); // Backoff: 1s, 2s, 4s
}
catch (Exception ex)
{
Debug.WriteLine($"Unexpected error: {ex.Message}"); // Logging
break;
}
}
// Timer stoppen bei zu vielen aufeinanderfolgenden Fehlern
if (_consecutiveFailures >= MAX_FAILURES)
{
timer1.Enabled = false;
Debug.WriteLine("Timer gestoppt nach " + MAX_FAILURES + " Fehlern. Bitte manuell neu starten.");
// Optional: Status-Label setzen oder MessageBox
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Timer1_Tick globaler Fehler: {ex}");
_consecutiveFailures++;
}
finally
{
_isProcessing = false;
Cursor.Current = Cursors.Default;
}
}
/// <summary>
/// Laden Events (GroupBox_Etikett und GridView)
@ -379,9 +431,7 @@ namespace Deckungsbeitrag
if(knd != null) Funktionen.SWS_Drucken(null, knd, this);
}
/// <summary>
/// ObjectListView Funktionen
/// </summary>
#region ObjectListView-Events
private void objectListViewAuftrag_CellClick(object sender, CellClickEventArgs e)
{
itemlocation = new Point(e.Location.X, e.Location.Y);
@ -682,6 +732,8 @@ namespace Deckungsbeitrag
// Cursor zurücksetzen
Cursor.Current = Cursors.Default;
}
#endregion
/// <summary>
/// Liefertag wird ermittelt und in Day of Week umgerechnet. RadioButtons werden Checked oder Unchecked und Click wird registriert.
@ -808,8 +860,71 @@ namespace Deckungsbeitrag
einstellung.ShowDialog();
}
#region Statistik
private void buttonStats_Click(object sender, EventArgs e)
{
if (this.groupBoxStatistik.Visible) this.groupBoxStatistik.Visible = false;
else this.groupBoxStatistik.Visible = true;
}
private void GetStatistik()
{
string[] statistik = { "Container gewaschen:", "Container hergerichtet:", "Container fertig:", "Kunden gewaschen:", "Kunden hergerichtet:", "Kunden abgeschlossen:" };
List<Auftrag> auftraglist = Auftrag.GetAuftragStatsListToday(this.dateTimePicker1.Value.Date);
for (int i = 1; i <= statistik.Length; i++)
{
foreach (Control ctr in this.tableLayoutPanelStatistik.Controls)
{
Label lbl;
if (ctr.GetType() == typeof(Label))
{
lbl = (Label)ctr;
if (lbl.Text.Contains("Statistik") && lbl.Text.Contains($"{i.ToString()}")) lbl.Text = statistik[i - 1].ToString();
if (lbl.Name.Contains("Zahl"))
{
int j = 0;
switch (lbl.Name)
{
case var s when s.Contains($"1"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j += a.Container;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"2"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j += a.ContainerClean;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"3"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j += a.ContainerClean;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"4"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j++;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"5"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j++;
lbl.Text = j.ToString();
break;
case var s when s.Contains($"{i}"):
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j++;
lbl.Text = j.ToString();
break;
default:
break;
}
}
//DONE: Breite der GridView festlegen.
//DONE: OLV-Item refresh. Neuer Liefertag speichern.
//DONE: Testen ob ausblenden der Button Column funktioniert. Benutzer-Verwaltung oder Frottee oder Flach notwendig.
}
}
}
//this.groupBoxStatistik.Width = this.tableLayoutPanelStatistik.Right;
}
private void dateTimePicker1_CloseUp(object sender, EventArgs e)
{
GetStatistik();
}
#endregion
}
}
//CHANGES: Statistik für Expedit. (Same as in Main)

View File

@ -21,7 +21,8 @@ namespace Deckungsbeitrag
Kunde kunde;
List<KundeArtikel> artikelListe;
Meldungen meldung = new Meldungen();
//Benutzer benutzer;
private List<Auftrag> auftragsliste;
string userid;
public FormFehlmengeCount()
{
@ -45,7 +46,8 @@ namespace Deckungsbeitrag
//Kunde wird durch Scan oder Handeingabe Ausgewählt.
this.kunde = Funktionen.KundenAuswahl();
//this.kunde = Funktionen.KundenAuswahl();
Open_Liste();
ControlLaden();
CloseKeyboard();
@ -305,9 +307,30 @@ namespace Deckungsbeitrag
}
//Kunde wird durch Scan oder Handeingabe Ausgewählt.
this.kunde = Funktionen.KundenAuswahl();
Open_Liste();
ControlLaden();
}
/// <summary>
/// Auftragliste aufrufen.
/// </summary>
/// <param name="extra">Wenn Extrakunde dann true</param>
private void Open_Liste()
{
auftragsliste = Auftrag.GetFinishingList();
List<object> kundenliste = new List<object>();
foreach(Auftrag auf in auftragsliste)
{
object kunde = Kunde.GetKunde(null, auf.KundeID, null);
kundenliste.Add(kunde);
}
FormListe liste = new FormListe(kundenliste, 0);
if (liste.ShowDialog() == DialogResult.OK)
{
this.kunde = liste.kunde;
}
}
/// <summary>
/// TextBox Scann Events
@ -388,5 +411,6 @@ namespace Deckungsbeitrag
}
}
//DONE: Kunde Anmerkung anzeigen. Spezielle Farbe verwenden. Label oder Textbox?
//TODO: Eventuell bei erstem Erscheinen Info anzeigen.
//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.

View File

@ -538,5 +538,3 @@ namespace Deckungsbeitrag
}
}
}
//DONE: TextBox Anmerkung ausprogrammieren. (Immer Enabled, Speichern bei Leave oder Button)
//DONE: Zeichenanzahl aktuell/maximal anzeigen.

View File

@ -38,7 +38,7 @@ namespace Deckungsbeitrag
this.textBoxKunde = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.buttonOK = new System.Windows.Forms.Button();
this.buttonNeuerBenutzer = new System.Windows.Forms.Button();
this.buttonNeuerAuftrag = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listViewKunde
@ -63,7 +63,7 @@ namespace Deckungsbeitrag
this.listViewKunde.Margin = new System.Windows.Forms.Padding(2);
this.listViewKunde.MultiSelect = false;
this.listViewKunde.Name = "listViewKunde";
this.listViewKunde.Size = new System.Drawing.Size(396, 303);
this.listViewKunde.Size = new System.Drawing.Size(396, 466);
this.listViewKunde.TabIndex = 1;
this.listViewKunde.UseCompatibleStateImageBehavior = false;
this.listViewKunde.View = System.Windows.Forms.View.Details;
@ -129,31 +129,30 @@ namespace Deckungsbeitrag
this.buttonOK.UseVisualStyleBackColor = false;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// buttonNeuerBenutzer
// buttonNeuerAuftrag
//
this.buttonNeuerBenutzer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
this.buttonNeuerAuftrag.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.buttonNeuerBenutzer.BackColor = System.Drawing.Color.Yellow;
this.buttonNeuerBenutzer.FlatAppearance.BorderSize = 0;
this.buttonNeuerBenutzer.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonNeuerBenutzer.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonNeuerBenutzer.Location = new System.Drawing.Point(115, 114);
this.buttonNeuerBenutzer.Margin = new System.Windows.Forms.Padding(2);
this.buttonNeuerBenutzer.Name = "buttonNeuerBenutzer";
this.buttonNeuerBenutzer.Size = new System.Drawing.Size(167, 34);
this.buttonNeuerBenutzer.TabIndex = 16;
this.buttonNeuerBenutzer.Text = "Neuer Benutzer";
this.buttonNeuerBenutzer.UseVisualStyleBackColor = false;
this.buttonNeuerBenutzer.Visible = false;
this.buttonNeuerBenutzer.Click += new System.EventHandler(this.buttonNeuerBenutzer_Click);
this.buttonNeuerAuftrag.BackColor = System.Drawing.Color.Turquoise;
this.buttonNeuerAuftrag.FlatAppearance.BorderSize = 0;
this.buttonNeuerAuftrag.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonNeuerAuftrag.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonNeuerAuftrag.Location = new System.Drawing.Point(120, 467);
this.buttonNeuerAuftrag.Margin = new System.Windows.Forms.Padding(2);
this.buttonNeuerAuftrag.Name = "buttonNeuerAuftrag";
this.buttonNeuerAuftrag.Size = new System.Drawing.Size(167, 34);
this.buttonNeuerAuftrag.TabIndex = 16;
this.buttonNeuerAuftrag.Text = "Neuer Auftrag";
this.buttonNeuerAuftrag.UseVisualStyleBackColor = false;
this.buttonNeuerAuftrag.Click += new System.EventHandler(this.buttonNeuerAuftrag_Click);
//
// FormListe
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.ClientSize = new System.Drawing.Size(413, 358);
this.Controls.Add(this.buttonNeuerBenutzer);
this.ClientSize = new System.Drawing.Size(413, 521);
this.Controls.Add(this.buttonNeuerAuftrag);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBoxKunde);
@ -170,6 +169,7 @@ namespace Deckungsbeitrag
this.Text = "LISTE";
this.TopMost = true;
this.Load += new System.EventHandler(this.FormListe_Load);
this.Shown += new System.EventHandler(this.FormListe_Shown);
this.ResumeLayout(false);
this.PerformLayout();
@ -185,6 +185,6 @@ namespace Deckungsbeitrag
private System.Windows.Forms.TextBox textBoxKunde;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonNeuerBenutzer;
private System.Windows.Forms.Button buttonNeuerAuftrag;
}
}

View File

@ -20,29 +20,34 @@ namespace Deckungsbeitrag
{
Kundenliste = 0,
Aufgabenliste = 1,
Benutzerliste = 2
Benutzerliste = 2,
Auftragliste = 3
}
public partial class FormListe : Form
{
public Kunde kunde;
public Benutzer benutzer;
public List<Kunde> Kundenliste;
public List<Aufgabe> Aufgabenliste;
public List<Benutzer> Benutzerliste;
public Auftrag auftrag;
private List<Kunde> Kundenliste;
private List<Aufgabe> Aufgabenliste;
private List<Benutzer> Benutzerliste;
private List<Auftrag> Auftragliste;
private Meldungen meldung = new Meldungen();
bool isKundenliste = false;
bool isAufgabenliste = false;
bool isBenutzerliste = false;
int type_of_list;
string path = "C:\\Windows\\WinSxS\\amd64_microsoft-windows-osk_31bf3856ad364e35_10.0.22621.3672_none_8a93c823d58f9d77\\osk.exe";
string ben_col = "Vorname,Nachname,Benutzername,Rolle,Schein,Gueltig bis,Aktiv";
string knd_col = "KundenNr,KundenName,PLZ,Ort";
string knd_col = "KundenNr,Suchtext,KundenName,Ort";
string auf_col = "Aufgabe,Beschreibung";
string auftrag_col = "Kunde,Liefertag,Container";
string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string keyboardPath;
private Timer timer;
//QR-Code Scan mit integrierter Kamera
#region Form-Konstruktor
public FormListe()
{
InitializeComponent();
@ -59,8 +64,19 @@ namespace Deckungsbeitrag
}
public FormListe(List<object> objliste, int listentyp) : this()
{
// Welcher Listentyp angezeigt wird muss beim Öffnen mitgegeben werden.
this.type_of_list = listentyp;
if(this.type_of_list == (int)Listentyp.Auftragliste)
{
this.Auftragliste = objliste.Cast<Auftrag>().ToList();
}
if(this.type_of_list == (int)Listentyp.Kundenliste)
{
this.Kundenliste = objliste.OfType<Kunde>().GroupBy(k => k.KundeID).Select(g => g.First()).ToList();
}
}
#endregion
private void FormListe_Load(object sender, EventArgs e)
{
// Timer für Wartezeit bis TextChanged eintritt.
@ -72,10 +88,14 @@ namespace Deckungsbeitrag
listViewKunde_Load();
this.textBoxKunde.Focus();
StartPosition = FormStartPosition.CenterScreen;
this.CenterToScreen();
}
private void FormListe_Shown(object sender, EventArgs e)
{
this.CenterToScreen();
}
private void listViewKunde_Load()
{
//LISTE LEEREN
@ -98,19 +118,20 @@ namespace Deckungsbeitrag
}
//KUNDEN LADEN
this.Text = "KUNDE WÄHLEN";
foreach (Kunde kunde in Kunde.GetTmpList(textBoxKunde.Text))
if (this.Kundenliste == null) this.Kundenliste = Kunde.GetTmpList(textBoxKunde.Text);
foreach (Kunde kunde in this.Kundenliste)
{
ListViewItem item = new ListViewItem();
item.Tag = kunde;
item.Text = kunde.KundeNummer;
item.SubItems.Add(kunde.Suchtext);
item.SubItems.Add(kunde.KundeName);
item.SubItems.Add(kunde.PLZ.ToString());
item.SubItems.Add(kunde.Ort);
this.listViewKunde.Items.Add(item);
}
if (listViewKunde.Items.Count == 1) kunde = (Kunde)listViewKunde.Items[0].Tag;
this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = false;
}
break;
case var aufliste when type_of_list == (int)Listentyp.Aufgabenliste:
@ -128,7 +149,7 @@ namespace Deckungsbeitrag
case var benliste when type_of_list == (int)Listentyp.Benutzerliste:
{
this.textBoxKunde.Visible = this.label1.Visible = false;
this.buttonNeuerBenutzer.Visible = true;
this.buttonNeuerAuftrag.Visible = true;
string[] colname = ben_col.Split(',');
foreach (string s in colname)
{
@ -155,6 +176,27 @@ namespace Deckungsbeitrag
}
}
break;
case var auftragliste 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);
}
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"));
item.SubItems.Add(auftrag.Container.ToString());
this.listViewKunde.Items.Add(item);
}
this.textBoxKunde.Enabled = false;
break;
default:
break;
}
@ -180,15 +222,6 @@ namespace Deckungsbeitrag
this.Size = new Size(lvwWidth + 50, this.Height);
}
private void FormListe_Shown(object sender, EventArgs e)
{
if (isAufgabenliste)
{
//FormNeueAufgabe aufgabe = new FormNeueAufgabe();
//aufgabe.ShowDialog();
}
FormListe_Load(this, null);
}
private void TextBoxKunde_Enter(object sender, EventArgs e)
{
this.textBoxKunde.ForeColor = Color.Black;
@ -208,7 +241,7 @@ namespace Deckungsbeitrag
// Wenn kein Fragezeichen am Anfang wird Kundenliste erstellt.
if (!textBoxKunde.Text.StartsWith("?"))
{
Kundenliste = Kunde.GetTmpList(this.textBoxKunde.Text);
if(this.Kundenliste == null) this.Kundenliste = Kunde.GetTmpList(this.textBoxKunde.Text);
listViewKunde_Load();
}
@ -233,6 +266,11 @@ namespace Deckungsbeitrag
this.DialogResult = DialogResult.OK;
this.Close();
}
break;
case var _ when type_of_list == (int)Listentyp.Auftragliste:
auftrag = (Auftrag)item.Tag;
this.DialogResult = DialogResult.OK;
this.Close();
break;
default:
break;
@ -277,12 +315,6 @@ namespace Deckungsbeitrag
this.DialogResult = DialogResult.OK;
this.Close();
}
private void buttonNeuerBenutzer_Click(object sender, EventArgs e)
{
//FormBenutzerDetail benutzerdetail = new FormBenutzerDetail();
//benutzerdetail.ShowDialog();
this.Close();
}
private void textBoxKunde_Leave(object sender, EventArgs e)
{
@ -300,5 +332,16 @@ namespace Deckungsbeitrag
}
}
}
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)
{
this.DialogResult = DialogResult.Yes;
this.Close();
}
}
}
}
//CHANGES: Die Liste zeigt jetzt auch die Aufträge und die Kunden der möglich Aufträge an. (Erleichtert die Kundenauswahl bei Fehlmengecount)
//DONE: Listentyp.Auftragliste implementiert um über FormWSVerfolgung die Auftragliste abrufen zu können.
//DONE: Kunde anzeigen Reihenfolge der Spalten zuerst Suchtext danach Name.

View File

@ -1,6 +1,7 @@
using BrightIdeasSoftware;
using DatenDB;
using Deckungsbeitrag.AA_Forms;
using Deckungsbeitrag.Properties;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -28,6 +29,8 @@ namespace Deckungsbeitrag
private Point newLocation;
private Size _fixedSize;
private bool _handlingResize;
private ImageList imagelist = new ImageList();
public FormMain()
{
@ -52,11 +55,14 @@ namespace Deckungsbeitrag
this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBExpedit.Enabled = false;
break;
case BenutzerRolle.Fahrer:
this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false;
this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false;
foreach(ToolStripButton tsb in this.toolStripMenu.Items)
{
if(!tsb.Name.Contains("Auftrag")) tsb.Enabled = false;
}
this.groupBoxStatistik.Enabled = this.buttonNeueAufgabe.Enabled = this.buttonNeuerUser.Enabled = false;
this.groupBoxStatistik.Visible = this.buttonNeueAufgabe.Visible = this.buttonNeuerUser.Visible = this.groupBoxUpdate.Visible = false;
break;
case BenutzerRolle.Admin:
this.groupBoxUpdate.Visible = false;
break;
case BenutzerRolle.Waschstrasse:
@ -73,6 +79,10 @@ namespace Deckungsbeitrag
private void FormMain_Load(object sender, EventArgs e)
{
imagelist.Images.Add(Resources.Exclamation_Red);
imagelist.Images.Add(Resources.InformationSymbol_16x);
imagelist.ImageSize = new Size(16, 16);
this.WindowState = FormWindowState.Maximized;
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.panelMain.Width = this.Width - this.toolStripMenu.Right - 20;
@ -109,12 +119,7 @@ namespace Deckungsbeitrag
}
/// <summary>
/// ToolStrip Buttons Click Events
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
#region ToolStripButton_Click-Events
private void tSBBenutzerVW_Click(object sender, EventArgs e)
{
FormBenutzerVW benutzerVW = new FormBenutzerVW();
@ -178,16 +183,17 @@ namespace Deckungsbeitrag
{
if (!this.objectListViewAuftrag.Visible)
{
this.rBAlle.Checked = true;
if (benutzer.Rolle == BenutzerRolle.Fahrer) this.rBFertig.Checked = true;
else this.rBAlle.Checked = true;
this.rBAlle.Visible = this.rBAusgeliefert.Visible = this.rBFertig.Visible = this.rBVorbereitet.Visible = this.rBAufAbruf.Visible = true;
this.groupBoxAuftrag.Visible = true;
this.groupBoxStatistik.Visible = this.groupBoxUpdate.Visible = this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Visible = this.buttonNeuerUser.Enabled = false;
this.groupBoxStatistik.Visible = this.groupBoxUpdate.Visible = this.buttonNeueAufgabe.Visible = this.buttonNeueAufgabe.Enabled = this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Visible = this.buttonNeuerUser.Enabled = false;
this.objectListViewAuftrag.Enabled = this.objectListViewAuftrag.Visible = true;
}
else
{
this.groupBoxAuftrag.Visible = this.buttonAufAbruf.Visible = this.buttonAusgeliefert.Visible = this.rBAlle.Visible = this.rBAusgeliefert.Visible = this.rBFertig.Visible = this.rBVorbereitet.Visible = this.rBAufAbruf.Visible = this.objectListViewAuftrag.Enabled = this.objectListViewAuftrag.Visible = false;
this.groupBoxStatistik.Visible = this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Enabled = this.buttonNeuerUser.Visible = true;
this.groupBoxStatistik.Visible = this.buttonNeuerAuftrag.Visible = this.buttonNeueAufgabe.Visible = this.buttonNeueAufgabe.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Enabled = this.buttonNeuerUser.Visible = true;
}
}
private void tSBScannTest_Click(object sender, EventArgs e)
@ -212,7 +218,7 @@ namespace Deckungsbeitrag
FormArtikelVW artikelVW = new FormArtikelVW();
artikelVW.ShowDialog();
}
#endregion
/// <summary>
/// TOOLSTRIP BUTTON DESIGN
@ -505,7 +511,6 @@ namespace Deckungsbeitrag
tSBArtikelVW.Enabled = true;
progressBarArtikel.Value = 0;
}
private void buttonAllUpdate_Click(object sender, EventArgs e)
{
//Update_Artikel();
@ -637,14 +642,68 @@ namespace Deckungsbeitrag
{
this.objectListViewAuftrag.HeaderFormatStyle = Funktionen.GetHeader();
Generator.GenerateColumns(this.objectListViewAuftrag, typeof(Auftrag), true);
this.objectListViewAuftrag.SetObjects(alist);
OLVColumn sortcolumn = (OLVColumn)this.objectListViewAuftrag.Columns[1];
this.objectListViewAuftrag.Sort(sortcolumn);
// ========== SPALTE 11: BUTTON-COLUMNE ==========
// Spalte 11 (Index 11) als Button-Spalte konfigurieren
OLVColumn buttonColumn = new OLVColumn();
buttonColumn = (OLVColumn)this.objectListViewAuftrag.Columns[10];
buttonColumn = (OLVColumn)this.objectListViewAuftrag.Columns[11];
buttonColumn.IsButton = true;
buttonColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds;
// ========== IMAGE-LIST ZUWEISEN ==========
// SmallImageList für Icons in Detail-View (16x16 Pixel standard)
this.objectListViewAuftrag.SmallImageList = imagelist; // Voraussetzung: imagelist mit Icon Index 0 gefüllt
// ========== SPALTE 10 & 1: ICON-KOLUMNE ==========
// Spalte 10 als Icon-Spalte: zeigt Icon wenn AufgabeID vorhanden
OLVColumn iconColumn = (OLVColumn)this.objectListViewAuftrag.Columns[10];
iconColumn.ImageGetter = rowObject =>
{
var auftrag = rowObject as Auftrag;
if (auftrag.AufgabeID == null) return null; // null = kein Icon anzeigen
else return 0; // Index 0 aus SmallImageList
};
OLVColumn iColumn = (OLVColumn)this.objectListViewAuftrag.Columns[1];
iColumn.ImageGetter = rowObject =>
{
var _auftrag = rowObject as Auftrag;
if (string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) return null; // null = kein Icon anzeigen
else return 1; // Index 0 aus SmallImageList
};
// ========== TOOLTIP FÜR ICON-SPALTE ==========
// Automatischer Cell-Tooltip bei Mouse-Hover über Spalte 10 und 1
this.objectListViewAuftrag.CellToolTipShowing += (s, e) =>
{
// Nur für Icon-Spalte (Index 10) und gültiges Model
if (e.ColumnIndex == 10 && e.Model is Auftrag auftrag)
{
// Lade Bezeichnung der Aufgabe als Tooltip-Text
e.Text = Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung;
}
// Nur für Icon-Spalte (Index 1) und gültiges Model
if (e.ColumnIndex == 1 && e.Model is Auftrag _auftrag)
{
if (!string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung))
{
// Lade Anmerkung als Tooltip-Text
e.Text = Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung;
}
}
//TODO: Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe??
};
// ========== DATEN LADEN ==========
// WICHTIG: SetObjects NACH Column-Konfiguration aufrufen!
this.objectListViewAuftrag.SetObjects(alist);
// ========== SORTIERUNG ==========
// Spalte 2 als primäre Sortier-Spalte festlegen (nach Datenbindung!)
OLVColumn sortcolumn = (OLVColumn)this.objectListViewAuftrag.Columns[2];
this.objectListViewAuftrag.Sort(sortcolumn);
// ========== CHECKBOX-FUNKTIONALITÄT ==========
// Aktiviert Checkboxen basierend auf "IsChecked" Property des Auftrag-Modells
this.objectListViewAuftrag.CheckedAspectName = "IsChecked";
Funktionen.Columns_Resize(this.objectListViewAuftrag);
@ -930,7 +989,7 @@ namespace Deckungsbeitrag
}
}
}
//DONE: DragDrop verbessern
//DONE: GroupBox Realtime verschieben testen. Sonst Endposition nehmen. gb.Location hier entfernen und unten einkommentieren.
//DONE: GroupBox wird an Endposition verschoben.
//DONE: Wenn Fahrer registriert kann nur NeuerAuftrag aufgerufen werden. Dort kann er Aufträge erstellen mit dem Status "Abgeholt" (Wichtig für Auftragauswahl bei Waschstraße)
//DONE: Wenn Fahrer Auftragverwaltung öffnet werden Aufträge mit AuftragStatus "Fertig" angezeigt. Fahrer können dann als "Ausgeliefert" markieren.
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.
//CHANGES: Auftragverwaltung Spalten wurden aktualisiert. Mit Icons, Buttons und Sortierung auf Liefertag.

View File

@ -81,4 +81,4 @@ namespace Deckungsbeitrag
}
}
}
//TODO: Neue Aufgabe Screen erstellen.
//DONE: Neue Aufgabe Screen erstellen.

View File

@ -48,7 +48,6 @@ namespace Deckungsbeitrag
{
this.letzterLiefertag = letzterLiefertag;
}
public FormNeuerAuftrag(string userid) : this()
{
this.userid = userid;
@ -289,9 +288,32 @@ namespace Deckungsbeitrag
}
else
{
if (benutzer.Rolle == BenutzerRolle.Verwaltung || benutzer.Rolle == BenutzerRolle.Admin) Auftrag.Status = AuftragStatus.Herrichten;
else Auftrag.Status = AuftragStatus.Aufgelegt;
switch (benutzer.Rolle)
{
case BenutzerRolle.Verwaltung:
Auftrag.Status = AuftragStatus.Herrichten;
break;
case BenutzerRolle.Fahrer:
Auftrag.Status = AuftragStatus.Abgeholt;
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.Herrichten;
break;
case BenutzerRolle.Frottee:
break;
case BenutzerRolle.Flach:
break;
default:
break;
}
//Wenn SONDERAUFTRAG(STH,STV,STA) dann ARTIKEL speichern.
if (Auftrag.Typ >= AuftragTyp.Inventur)
@ -487,3 +509,6 @@ namespace Deckungsbeitrag
}
}
}
//DONE: AuftragStatus mit Switch nach BenutzerRolle ermöglichen.
//DONE: FahrerAufträge erhalten Status "Abgeholt".
//DONE: Wenn der Auftrag nicht gefunden wird, wird neuer Auftrag erstellt und mit Status "Aufgelegt" versehen.

View File

@ -25,6 +25,7 @@ namespace Deckungsbeitrag.AA_Forms
private Aufgabe aufgabe;
private WSFach fach;
private Auftrag extraAuftrag;
private List<object> auftragsliste;
public bool ws1transport = false;
public bool ws2transport = false;
@ -82,8 +83,6 @@ namespace Deckungsbeitrag.AA_Forms
item.Click += AufgabeAuswaehlen_Click;
toolStripDropDownButtonInfo.DropDownItems.Add(item);
}
}
/// <summary>
@ -150,8 +149,8 @@ namespace Deckungsbeitrag.AA_Forms
this.aufgabe = null;
// Neuen Auftrag eingeben. Wenn kein ExtraKunde wird false als extra weitergegeben.
Open_NeuerAuftrag(false);
//Open_NeuerAuftrag(false); //TODO: Auftragauswahl aufrufen statt NeuerAuftrag. (Wenn Fahrer Aufträge erstellen)
Open_Liste(false);
// Fachliste neu laden damit neuer Auftrag in erstes Fach geladen werden kann.
fachliste = WSFach.GetFachliste(maschine);
}
@ -233,6 +232,7 @@ namespace Deckungsbeitrag.AA_Forms
}
/// <summary>
/// Wenn eine Info von der Statusleiste gewählt wurde.
/// </summary>
@ -249,7 +249,8 @@ namespace Deckungsbeitrag.AA_Forms
if (((Aufgabe)item.Tag).Bezeichnung == "Extra Kunde")
{
// Wenn ExtraKunde wird true als extra weitergegeben.
Open_NeuerAuftrag(true);
//Open_NeuerAuftrag(true);
Open_Liste(true);
}
Fach_speichern(); // Gleiches Fach mit neuem Auftrag = Update.
}
@ -269,6 +270,53 @@ namespace Deckungsbeitrag.AA_Forms
}
}
/// <summary>
/// Auftragliste aufrufen.
/// </summary>
/// <param name="extra">Wenn Extrakunde dann true</param>
private void Open_Liste(bool extra)
{
auftragsliste = new List<object>(Auftrag.GetRampeAuftragList());
FormListe liste = new FormListe(auftragsliste, 3);
switch (liste.ShowDialog())
{
case DialogResult.None:
break;
case DialogResult.OK:
if (extra)
{
this.extraAuftrag = liste.auftrag;
this.extraAuftrag.Status = AuftragStatus.Aufgelegt;
if (this.extraAuftrag.Save()[0] != 1) meldung.Speicherfehler();
}
else
{
this.auftrag = liste.auftrag;
this.auftrag.Status = AuftragStatus.Aufgelegt;
if (this.auftrag.Save()[0] != 1) meldung.Speicherfehler();
}
Fach_speichern();
break;
case DialogResult.Cancel:
break;
case DialogResult.Abort:
break;
case DialogResult.Retry:
break;
case DialogResult.Ignore:
break;
case DialogResult.Yes:
Open_NeuerAuftrag(extra);
break;
case DialogResult.No:
break;
default:
break;
}
}
/// <summary>
/// Fach wird gespeichert. Bei Änderungen wird Fach überschrieben. Wenn FachID = 0 oder null wird neues Fach erstellt, sonst überschrieben.
/// </summary>
@ -284,6 +332,7 @@ namespace Deckungsbeitrag.AA_Forms
if (this.extraAuftrag != null) this.fach.ExtraAuftragID = this.extraAuftrag.AuftragID;
else this.fach.ExtraAuftragID = null;
if (this.fach.Save() == 1) Panel_Laden(false);
}
@ -345,7 +394,8 @@ namespace Deckungsbeitrag.AA_Forms
if (Form.ModifierKeys == Keys.None && keyData == Keys.Insert)
{
// Neuer Auftrag wird geöffnet. Wenn nicht ExtraKunde wird false weitergegeben, sonst true.
Open_NeuerAuftrag(false);
//Open_NeuerAuftrag(false);
Open_Liste(false);
return true;
}
@ -386,6 +436,11 @@ namespace Deckungsbeitrag.AA_Forms
toolStripDropDownButtonInfo.DropDown.Show();
}
}
}
}
//DONE: Statt Neuen Auftrag wird Auftragsliste mit Status "abgeholt" angezeigt. Dadurch muss Aufleger weder scannen noch Namen eintippen und suchen.
//DONE: Auch wenn Extra Auftrag benötigt wird funktioniert es über die Auftragsliste.
//DONE: Wenn kein Auftrag gefunden wird, kann ein neuer erstellt werden.
//CHANGES: Aufleger muss keine Aufträge mehr erstellen da Fahrer das machen können.
//CHANGES: Wenn Auftrag nicht gefunden kann er trotzdem einen neuen Erstellen.
//CHANGES: Auftragsliste zeigt hier nur AuftragStatus "Abgeholt" Aufträge.

View File

@ -135,5 +135,4 @@ namespace DatenDB
}
}
}
//TODO: Aktive Property einfügen.
//INSTALL-REMINDER: Spalte Aktiv in DB einfügen.

View File

@ -43,6 +43,38 @@ namespace DatenDB
{
}
public static List<Auftrag> GetFinishingList()
{
DatenbankConnection.GetConnection().Open();
List<Auftrag> resultList = new List<Auftrag>();
NpgsqlCommand cmd = new NpgsqlCommand();
cmd.Connection = DatenbankConnection.GetConnection();
cmd.CommandText = $"select {COLUMNS} from {TABLE} where status = 1 order by liefertag asc";
NpgsqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) resultList.Add(new Auftrag(reader));
reader.Close();
DatenbankConnection.GetConnection().Close();
return resultList;
}
public static List<Auftrag> GetRampeAuftragList()
{
DatenbankConnection.GetConnection().Open();
List<Auftrag> resultList = new List<Auftrag>();
NpgsqlCommand cmd = new NpgsqlCommand();
cmd.Connection = DatenbankConnection.GetConnection();
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;
}
public static List<Auftrag> GetAuftragList(string s, Auftrag auftrag)
{
int? aID = null;
@ -205,7 +237,7 @@ namespace DatenDB
}
#region Properties
/// <summary>
/// CheckBoxen zur Auftragsauswahl als erste Spalte.
/// </summary>
@ -373,10 +405,7 @@ namespace DatenDB
public int? AufgabeID { get; set; }
[OLVIgnore]
public bool AufgabeErledigt { get; set; } = false;
#endregion
public int[] Save()
{
@ -425,3 +454,5 @@ namespace DatenDB
}
//INSTALL-REMINDER: AufgabeID als Spalte in DB hinzufügen.
//INSTALL-REMINDER: AufgabeErledigt als Spalte in DB hinzufügen.
//DONE: Neuer Konstruktor für Auftragliste "Rampe". (abgeholte Aufträge die noch nicht aufgelegt sind)
//DONE: Neuer Konstruktor für Auftragliste "Finishing" oder "Aufgelegt". (aufgelegte Aufträge die noch nicht

View File

@ -1098,5 +1098,3 @@ namespace Deckungsbeitrag
}
}
}
//DONE: Funktionalität klären. MessageBox vor Screenauswahl? oder mit Button im Screen Kamera?

View File

@ -290,7 +290,7 @@ namespace DatenDB
}
}
#region Properties
[OLVIgnore]
public int? KundeID { get; set; }
@ -372,6 +372,7 @@ namespace DatenDB
[OLVIgnore]
public string Anmerkung { get; set; }
#endregion
}
}
//INSTALL-REMINDER: Spalte Anmerkung in DB hinzufügen.

View File

@ -6,7 +6,7 @@
</sectionGroup>
</configSections>
<appSettings>
<add key="ConnectionString" value="user id=postgres;password=Ki985941Wi;host=10.10.10.1;port=5432;database=Test_Wirl;Timeout=5" />
<add key="ConnectionString" value="user id=msfrottee01;password=5KsA4BSf4P;host=10.10.10.1;port=5432;database=Test_Wirl;Timeout=30" />
<add key="SortimentPfad" value="N:\\BÜRO\\SOCOM\\Zaehlscheine\\Kundensortiment.txt" />
<add key="BildPfad" value="C:\\Users\\KilianWirl\\OneDrive - gehgassi GmbH\\Wäscherei Wirl\\Programme\\Deckungsbeitrag\\Deckungsbeitrag\\Star.png" />
<add key="QrPfad" value="N:\\BÜRO\\SOCOM\\Zaehlscheine\\qrweb.png" />

View File

@ -1,8 +1,11 @@
using DatenDB;
using Deckungsbeitrag.AA_Forms;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;
using System.Runtime.CompilerServices;
@ -27,6 +30,52 @@ namespace Deckungsbeitrag
Application.SetCompatibleTextRenderingDefault(false);
Screen[] screens = Screen.AllScreens;
string readmePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Verwaltung_ReadMe.txt");
// Prüfe, ob ReadMe schon einmal geöffnet wurde
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\KilianWirlGmbH\Verwaltung"))
{
if (key == null || key.GetValue("ReadMeShown") == null)
{
// Erstes Mal nach Installation
if (File.Exists(readmePath))
{
Process.Start(new ProcessStartInfo
{
FileName = readmePath,
UseShellExecute = true
});
// WICHTIG: Warte 2 Sekunden (ReadMe öffnen)
System.Threading.Thread.Sleep(2000);
// Abbruch-Dialog
DialogResult result = MessageBox.Show(
"ReadMe wurde geöffnet.\n\n" +
"Falls INSTALL-REMINDER noch Änderungen enthält,\n" +
"soll die Anwendung jetzt ABGEBROCHEN werden?\n\n" +
"[JA = Abbruch | NEIN = Fortfahren]",
"Nach Installation - Update prüfen",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1 // Standard: Abbruch
);
if (result == DialogResult.Yes)
{
MessageBox.Show("Installation wurde abgebrochen.\nBitte Änderungen vornehmen und neu installieren.",
"Abbruch", MessageBoxButtons.OK, MessageBoxIcon.Information);
return; // App beenden
}
// Markiere als gezeigt
Registry.CurrentUser.CreateSubKey(@"Software\KilianWirlGmbH\Verwaltung")
.SetValue("ReadMeShown", 1);
}
}
}
if (userid.StartsWith("ms") | userid.StartsWith("ps"))
{
if (userid.Contains("wstrasse")) Application.Run(new FormWSVerfolgung(userid));
@ -75,4 +124,3 @@ namespace Deckungsbeitrag
}
}
}
//DONE: Für Maschinen keine Anmeldung notwendig.

View File

@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
[assembly: AssemblyVersion("1.0.3.0")]
[assembly: AssemblyFileVersion("1.0.3.0")]
[assembly: AssemblyVersion("1.0.4.2")]
[assembly: AssemblyFileVersion("1.0.4.2")]

View File

@ -140,6 +140,16 @@ namespace Deckungsbeitrag.Properties {
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap StatisticsWarning_16x {
get {
object obj = ResourceManager.GetObject("StatisticsWarning_16x", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>

View File

@ -121,11 +121,17 @@
<data name="Checkmark_blue_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Checkmark_blue_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="PenOne_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\PenOne_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="InformationSymbol_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\InformationSymbol_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="WarningRule_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\WarningRule_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="Monaco_Settings_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Monaco_Settings_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Exclamation_Red" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\weather_warning_signal_alert_exclamation_icon_124159.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="UpdatedScript_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UpdatedScript_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@ -136,16 +142,13 @@
<data name="Close_red_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Close_red_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Monaco_Settings_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Monaco_Settings_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Exclamation_Red" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\weather_warning_signal_alert_exclamation_icon_124159.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="WarningRule_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\WarningRule_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Close_WhiteNoHalo_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Close_WhiteNoHalo_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="PenOne_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\PenOne_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="StatisticsWarning_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\StatisticsWarning_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
# =====================================
# Skript: UpdateVerwaltungReadMe.ps1 - mit INSTALL-REMINDER
# Skript: UpdateVerwaltungReadMe.ps1 - mit INSTALL-REMINDER + CHANGES
# =====================================
$ProjectDir = Split-Path $MyInvocation.MyCommand.Path -Parent
@ -19,13 +19,16 @@ Build-Info:
- Erledigte TODOs: ##DONE_COUNT##
- Offene TODOs: ##OPEN_COUNT##
- Install-Reminders: ##REMINDER_COUNT##
- Changes: ##CHANGE_COUNT##
##INSTALL_REMINDERS##
##CHANGES##
##DONE_TODOS##
##OPEN_TODOS##
##INSTALL_REMINDERS##
Installation: ##BUILD_DATE##
=====================================
"@ | Out-File $readmePath -Encoding UTF8
@ -47,6 +50,7 @@ if (Test-Path $assemblyInfoPath) {
$openTodos = @()
$doneTodos = @()
$installReminders = @()
$changes = @()
$csFiles = Get-ChildItem -Path $ProjectDir -Recurse -Filter "*.cs" -ErrorAction SilentlyContinue
foreach ($file in $csFiles) {
@ -72,12 +76,20 @@ foreach ($file in $csFiles) {
$txt = $match.Groups[1].Value.Trim()
if ($txt) { $installReminders += "⚙️ $txt [$($file.Name)]" }
}
# CHANGES erkennen
$changeMatches = [regex]::Matches($content, '//\s*CHANGES\s*:?\s*(.+?)(?=\r?\n|//|$)', 'IgnoreCase')
foreach ($match in $changeMatches) {
$txt = $match.Groups[1].Value.Trim()
if ($txt) { $changes += "$txt [$($file.Name)]" }
}
}
# Duplikate entfernen
$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) {
@ -101,15 +113,23 @@ $installSection = if ($installReminders.Count -gt 0) {
@("Keine Install-Reminder vorhanden ✅")
}
$changesSection = if ($changes.Count -gt 0) {
@("=== ✨ CHANGES ($($changes.Count)) ===") +
($changes | ForEach-Object { "- $_" })
} else {
@("Keine Changes vorhanden")
}
# Textaufbereitung
$doneText = $doneSection -join "`r`n"
$openText = $openSection -join "`r`n"
$installText = $installSection -join "`r`n"
$changesText = $changesSection -join "`r`n"
$custom = "Release Build"
$buildDate = Get-Date -Format "dd.MM.yyyy HH:mm"
# ReadMe aufbauen
# ReadMe aufbauen (CHANGES nach INSTALL-REMINDER)
$readmeContent = @"
=====================================
NEUIGKEITEN - Version $version
@ -120,10 +140,13 @@ Build-Info:
- Erledigte TODOs: $($doneTodos.Count)
- Offene TODOs: $($openTodos.Count)
- Install-Reminders: $($installReminders.Count)
- Changes: $($changes.Count)
$installText
$changesText
`r`n$doneText
`r`n$openText
@ -136,3 +159,4 @@ Installation: $buildDate
$readmeContent | Out-File $readmePath -Encoding UTF8
Write-Host "✅ Verwaltung_ReadMe.txt erfolgreich aktualisiert!"
Write-Host "📊 Stats: $($doneTodos.Count) DONE, $($openTodos.Count) TODO, $($installReminders.Count) REMINDER, $($changes.Count) CHANGES"

View File

@ -494,6 +494,8 @@
<Content Include="ILLink\ILLink.Descriptors.LibraryBuild.xml" />
<None Include="Resources\InformationSymbol_16x.png" />
<None Include="Resources\PenOne_16x.png" />
<None Include="Resources\StatisticsWarning_16x.png" />
<Content Include="Verwaltung_ReadMe.txt" />
<Content Include="wirlneu_transparent %281%29.ico" />
<None Include="Resources\Close_WhiteNoHalo_16x.png" />
<None Include="Resources\Monaco_Settings_16x.png" />

View File

@ -1,12 +1,13 @@
=====================================
NEUIGKEITEN - Version 1.0.3.0
NEUIGKEITEN - Version 1.0.4.2
=====================================
Build-Info:
- Build-Typ: Release Build
- Erledigte TODOs: 13
- Offene TODOs: 22
- Erledigte TODOs: 19
- Offene TODOs: 20
- Install-Reminders: 5
- Changes: 7
=== ⚙️ INSTALL-REMINDER (5) ===
@ -16,37 +17,51 @@ Build-Info:
- ⚙️ Spalte Anmerkung in DB hinzufügen. [Kunde.cs]
- ⚙️ Spalte Aufgabe Count in DB hinzufügen. [Kunde.cs]
=== ✨ CHANGES (7) ===
- ✨ Aufleger muss keine Aufträge mehr erstellen da Fahrer das machen können. [FormWSVerfolgung.cs]
- ✨ Auftragsliste zeigt hier nur AuftragStatus "Abgeholt" Aufträge. [FormWSVerfolgung.cs]
- ✨ Auftragverwaltung Spalten wurden aktualisiert. Mit Icons, Buttons und Sortierung auf Liefertag. [FormMain.cs]
- ✨ Die Liste zeigt jetzt auch die Aufträge und die Kunden der möglich Aufträge an. (Erleichtert die Kundenauswahl bei Fehlmengecount) [FormListe.cs]
- ✨ Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren. [FormMain.cs]
- ✨ Statistik für Expedit. (Same as in Main) [FormExpedit.cs]
- ✨ Wenn Auftrag nicht gefunden kann er trotzdem einen neuen Erstellen. [FormWSVerfolgung.cs]
=== ✅ ERLEDIGTE TODOs (13) ===
=== ✅ ERLEDIGTE TODOs (19) ===
- ✅ : Auch wenn Extra Auftrag benötigt wird funktioniert es über die Auftragsliste. [FormWSVerfolgung.cs]
- ✅ : Auftrag über FormListe holen und daraus den Kunden für Fehlmenge holen. [FormFehlmengeCount.cs]
- ✅ : AuftragStatus mit Switch nach BenutzerRolle ermöglichen. [FormNeuerAuftrag.cs]
- ✅ : Bei Transport wir ein Fach mit Aktuellem Auftrag erstellt. Das Alte wird bei Transport gespeichert. [FormAusschlager.cs]
- ✅ : Breite der GridView festlegen. [FormExpedit.cs]
- ✅ : DragDrop verbessern [FormMain.cs]
- ✅ : Funktionalität klären. MessageBox vor Screenauswahl? oder mit Button im Screen Kamera? [Funktionen.cs]
- ✅ : Für Maschinen keine Anmeldung notwendig. [Program.cs]
- ✅ : GroupBox Realtime verschieben testen. Sonst Endposition nehmen. gb.Location hier entfernen und unten einkommentieren. [FormMain.cs]
- ✅ : GroupBox wird an Endposition verschoben. [FormMain.cs]
- ✅ : Kunde Anmerkung anzeigen. Spezielle Farbe verwenden. Label oder Textbox? [FormFehlmengeCount.cs]
- ✅ : OLV-Item refresh. Neuer Liefertag speichern. [FormExpedit.cs]
- ✅ : Testen ob ausblenden der Button Column funktioniert. Benutzer-Verwaltung oder Frottee oder Flach notwendig. [FormExpedit.cs]
- ✅ : TextBox Anmerkung ausprogrammieren. (Immer Enabled, Speichern bei Leave oder Button) [FormKundeVW.cs]
- ✅ : FahrerAufträge erhalten Status "Abgeholt". [FormNeuerAuftrag.cs]
- ✅ : Kunde anzeigen Reihenfolge der Spalten zuerst Suchtext danach Name. [FormListe.cs]
- ✅ : Listentyp.Auftragliste implementiert um über FormWSVerfolgung die Auftragliste abrufen zu können. [FormListe.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]
- ✅ : Neue Aufgabe Screen erstellen. [FormNeueAufgabe.cs]
- ✅ : Neuer Konstruktor für Auftragliste "Finishing" oder "Aufgelegt". (aufgelegte Aufträge die noch nicht [Auftrag.cs]
- ✅ : Neuer Konstruktor für Auftragliste "Rampe". (abgeholte Aufträge die noch nicht aufgelegt sind) [Auftrag.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]
- ✅ : Statt Neuen Auftrag wird Auftragsliste mit Status "abgeholt" angezeigt. Dadurch muss Aufleger weder scannen noch Namen eintippen und suchen. [FormWSVerfolgung.cs]
- ✅ : Wenn der Auftrag nicht gefunden wird, wird neuer Auftrag erstellt und mit Status "Aufgelegt" versehen. [FormNeuerAuftrag.cs]
- ✅ : Wenn Fahrer Auftragverwaltung öffnet werden Aufträge mit AuftragStatus "Fertig" angezeigt. Fahrer können dann als "Ausgeliefert" markieren. [FormMain.cs]
- ✅ : Wenn Fahrer registriert kann nur NeuerAuftrag aufgerufen werden. Dort kann er Aufträge erstellen mit dem Status "Abgeholt" (Wichtig für Auftragauswahl bei Waschstraße) [FormMain.cs]
- ✅ : Wenn kein Auftrag gefunden wird, kann ein neuer erstellt werden. [FormWSVerfolgung.cs]
- ✅ : Wenn NeuerAuftrag gewählt Fach ändern nicht vergessen. [FormAusschlager.cs]
- ✅ : Zeichenanzahl aktuell/maximal anzeigen. [FormKundeVW.cs]
- ✅ : Wenn NeuerAuftrag gewählt wie gehts weiter? [FormAusschlager.cs]
=== 🔄 OFFENE TODOs (22) ===
- 🔄 Aktive Property einfügen. [Aufgabe.cs]
=== 🔄 OFFENE TODOs (20) ===
- 🔄 Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe?? [FormExpedit.cs]
- 🔄 Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe?? [FormMain.cs]
- 🔄 Artikel Update weiter testen und programmieren. Für ArtikelKurzliste ausprogrammieren. [FormMain.cs]
- 🔄 Auftragauswahl aufrufen statt NeuerAuftrag. (Wenn Fahrer Aufträge erstellen) [FormWSVerfolgung.cs]
- 🔄 Ausprobieren ob die Ausrichtung jetzt richtig ist. Sowohl beim ersten wie auch zweiten Mal. [Funktionen.cs]
- 🔄 Deaktivieren wenn SPS funktioniert. Transport wird simuliert. [FormWSVerfolgung.cs]
- 🔄 Einkommentieren wenn ArtikelUpdate auf ArtikelKurzliste umgestellt werden kann. [FormMain.cs]
- 🔄 Eventuell auch andere ListViews einbinden? [Funktionen.cs]
- 🔄 Eventuell bei erstem Erscheinen Info anzeigen. [FormFehlmengeCount.cs]
- 🔄 für Ladescreen den Progressbar programieren. (perplexity fragen wie der Status an einen anderen Screen übergeben werden kann) [FormMain.cs]
- 🔄 Hier Settings speichern mit UserSettingsManager Klasse. [FormEinstellung.cs]
- 🔄 LadenScreen anzeigen etc. [FormMain.cs]
- 🔄 Nach Test und Rücksprache eventuell wieder umbauen. Benutzer.Rolle etc. [FormFehlmengeCount.cs]
- 🔄 Neue Aufgabe Screen erstellen. [FormNeueAufgabe.cs]
- 🔄 Settings hier ändern auf UserSettingsManager Klasse. [FormEinstellung.cs]
- 🔄 Testen ob Get_ArtikelKurzliste funktioniert. [FormMain.cs]
- 🔄 Testen ob SWS-QRCodes gelesen werden können. Nur notwendig bis alle SWS-QRCodes richtig gedruckt und gelesen werden. [Kunde.cs]
@ -55,7 +70,6 @@ Build-Info:
- 🔄 UserSetting Properties eintragen und in EinstellungsScreen abrufen. [UserSettingsManager.cs]
- 🔄 Weitere Properties von oben hier zuweisen [UserSettingsManager.cs]
- 🔄 Wenn Nachwäsche oder Müllwäsche alle Artikel anzeigen. [FormFehlmengeCount.cs]
- 🔄 Wenn NeuerAuftrag gewählt wie gehts weiter? [FormAusschlager.cs]
Installation: 15.12.2025 18:26
Installation: 16.12.2025 16:57
=====================================