1478 lines
52 KiB
C#
1478 lines
52 KiB
C#
using BrightIdeasSoftware;
|
|
using DatenDB;
|
|
using Deckungsbeitrag.AA_Forms;
|
|
using Deckungsbeitrag.AA_Klassen;
|
|
using Deckungsbeitrag.Properties;
|
|
using Deckungsbeitrag.UserControls;
|
|
using Npgsql;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Configuration;
|
|
using System.Data;
|
|
using System.Diagnostics;
|
|
using System.Diagnostics.Eventing.Reader;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Management.Instrumentation;
|
|
using System.Reflection;
|
|
using System.Runtime;
|
|
using System.Runtime.ConstrainedExecution;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Xml.Serialization;
|
|
using ZXing.Common;
|
|
using Timer = System.Windows.Forms.Timer;
|
|
|
|
namespace Deckungsbeitrag
|
|
{
|
|
public partial class FormMain : Form
|
|
{
|
|
#region Properties
|
|
|
|
private readonly Benutzer benutzer = null;
|
|
private readonly Meldungen meldung = new Meldungen();
|
|
private bool open = false;
|
|
private bool isDragging = false;
|
|
private Size _fixedSize;
|
|
private bool _handlingResize;
|
|
private readonly UserSettingsManager _settings = new UserSettingsManager();
|
|
private bool formloading = false;
|
|
private Dictionary<DateTime, List<Auftrag>> auftragliste;
|
|
private Control draggedBox;
|
|
private Point dragOffset;
|
|
private readonly PictureBox ghostImage;
|
|
private readonly bool isButtonDragging = false;
|
|
private List<AuftragArtikel> ArtikellisteProAuftrag;
|
|
private OnboardingSchritt onBoardingArt = OnboardingSchritt.Main;
|
|
private UCStatistik uCStatistik;
|
|
private UCAuftragSuchen uCAuftrag;
|
|
private UCInventur uCInventur;
|
|
private readonly Screen screen = Screen.PrimaryScreen;
|
|
private Kunde kunde;
|
|
#endregion
|
|
public FormMain()
|
|
{
|
|
InitializeComponent();
|
|
this.panelMain.AllowDrop = true;
|
|
|
|
this.toolStripMenu.Size = new Size(toolStripButton1.Size.Width + 20, this.Height);
|
|
_fixedSize = screen.WorkingArea.Size;
|
|
}
|
|
public FormMain(Benutzer benutzer) : this()
|
|
{
|
|
this.benutzer = benutzer;
|
|
|
|
ghostImage = new PictureBox
|
|
{
|
|
Size = new Size(200, 100), // GroupBox-Größe
|
|
Visible = false,
|
|
BackColor = Color.Transparent,
|
|
SizeMode = PictureBoxSizeMode.StretchImage
|
|
};
|
|
panelMain.Controls.Add(ghostImage); // Zum Panel!
|
|
}
|
|
|
|
#region FormMain-Events
|
|
private async void FormMain_Load(object sender, EventArgs e)
|
|
{
|
|
this.SuspendLayout();
|
|
this.Cursor = Cursors.WaitCursor;
|
|
|
|
formloading = true;
|
|
_settings.Load();
|
|
|
|
this.buttonKundeArtikelUpdate.BringToFront();
|
|
|
|
this.WindowState = FormWindowState.Maximized;
|
|
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
|
|
this.panelMain.Width = this.Width - this.toolStripMenu.Right - 20;
|
|
this.panelMain.Location = new Point(this.toolStripMenu.Right, 0);
|
|
this.Text += Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
|
this.labelKundenDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen\Kundenstammblatt.csv";
|
|
this.labelSoftwareDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Setup\SetupVerwaltung*.msi";
|
|
this.labelArtikelDatum.Text = @"N:\TECHNIK\Software\Wirl-Verwaltung\Listen\Artikelkurzliste.csv";
|
|
|
|
// Inventuren sind ausschließlich für Admin, Verwaltung oder Master sichtbar.
|
|
if (this.benutzer.Rolle == BenutzerRolle.Admin || this.benutzer.Rolle == BenutzerRolle.Verwaltung || this.benutzer.Rolle == BenutzerRolle.Master)
|
|
{
|
|
GetInventuren();
|
|
GetSaison();
|
|
}
|
|
|
|
if (this.groupBoxContAnz.Visible)
|
|
{
|
|
await GetAuftraege();
|
|
GetContainerProTag();
|
|
}
|
|
|
|
// UserCotnrols werden eingefügt
|
|
GetUserControls();
|
|
// Controls werde Enabled
|
|
Enable_Controls();
|
|
// Location für UCInventur festlegen.
|
|
Get_UCInventur_Location();
|
|
|
|
|
|
this.Activate();
|
|
_fixedSize = this.Size;
|
|
formloading = false;
|
|
}
|
|
|
|
private void FormMain_Shown(object sender, EventArgs e)
|
|
{
|
|
|
|
// Meldung wenn Updates oder Imports erledigt wurden.
|
|
if (Program.Artikelliste_Importiert | Program.Kundenliste_Importiert | Program.Software_Updated)
|
|
{
|
|
string[] updates = new string[3];
|
|
updates[0] = Program.Artikelliste_Importiert ? "Artikelliste: ✅" : "Artikelliste: ❌";
|
|
updates[1] = Program.Kundenliste_Importiert ? "Kundenliste: ✅" : "Kundenliste: ❌";
|
|
updates[2] = Program.Software_Updated ? "Software: ✅" : "Sofware: ❌";
|
|
MessageBox.Show($"Folgende Updates wurden heute durchgeführt:\n\n{updates[0]}\n{updates[1]}\n{updates[2]}", "UPDATES DURCHGEFÜHRT", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
// OnBoarding nur bei den Fahrern anzeigen. Bis die anderen Fertig sind.
|
|
if (this.benutzer.Rolle == BenutzerRolle.Fahrer) ZeigeOnboarding();
|
|
|
|
this.ResumeLayout();
|
|
this.Cursor = Cursors.Default;
|
|
}
|
|
|
|
private void FormMain_ResizeBegin(object sender, EventArgs e)
|
|
{
|
|
_handlingResize = true;
|
|
this.Size = _fixedSize;
|
|
_handlingResize = false;
|
|
}
|
|
private void FormMain_Resize(object sender, EventArgs e)
|
|
{
|
|
if (_handlingResize) return;
|
|
if (this.Size != _fixedSize)
|
|
{
|
|
_handlingResize = true;
|
|
this.Size = _fixedSize;
|
|
_handlingResize = false;
|
|
}
|
|
//this.panelMain.Size = new Size(this.ClientSize.Width - this.toolStripMenu.Right, this.Height);
|
|
//this.panelProgress.Location = new Point(this.panelMain.Right - this.panelProgress.Width - 100, this.panelMain.Bottom - this.panelProgress.Height - 20);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Settings speichern bei Form_Closing.
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
_settings.LocationButtonNeueAufgabe = this.buttonNeueAufgabe.Location;
|
|
_settings.LocationButtonNeueInventur = this.buttonNeueInventur.Location;
|
|
_settings.LocationButtonNeuerAuftrag = this.buttonNeuerAuftrag.Location;
|
|
_settings.LocationButtonNeuerStand = this.buttonNeuerStand.Location;
|
|
_settings.LocationButtonNeuerUser = this.buttonNeuerUser.Location;
|
|
|
|
_settings.LocationGroupBoxContainer = this.groupBoxContAnz.Location;
|
|
_settings.LocationGroupBoxSaison = this.groupBoxSaison.Location;
|
|
if (uCStatistik != null) _settings.LocationGroupBoxStatistik = this.uCStatistik.Location;
|
|
if (uCAuftrag != null) _settings.LocationGroupBoxAuftragSuchen = this.uCAuftrag.Location;
|
|
|
|
_settings.OLV_State = this.objectListViewAuftrag.SaveState();
|
|
_settings.Save();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
MessageBox.Show("Fehler beim Speichern" + ex.Message);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ToolStripButton-Events
|
|
private void Get_Border_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
ToolStripItem item = (ToolStripItem)sender;
|
|
ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, item.Width, item.Height), Color.White, ButtonBorderStyle.Solid);
|
|
}
|
|
private void ToolStrip_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
if (sender.GetType() == typeof(ToolStripButton))
|
|
{
|
|
ToolStripButton tsb = (ToolStripButton)sender;
|
|
tsb.ForeColor = Program.Wirlblau;
|
|
tsb.BackColor = Color.White;
|
|
}
|
|
}
|
|
private void ToolStrip_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
if (sender.GetType() == typeof(ToolStripButton))
|
|
{
|
|
ToolStripButton tsb = (ToolStripButton)sender;
|
|
tsb.ForeColor = Color.White;
|
|
tsb.BackColor = Program.Wirlblau;
|
|
}
|
|
}
|
|
private void TSBBenutzerVW_Click(object sender, EventArgs e)
|
|
{
|
|
FormBenutzerVW benutzerVW = new FormBenutzerVW();
|
|
benutzerVW.ShowDialog();
|
|
}
|
|
private void ToolStripBeenden_Click(object sender, EventArgs e)
|
|
{
|
|
Application.Exit();
|
|
}
|
|
private void TSBAufgabeVW_Click(object sender, EventArgs e)
|
|
{
|
|
FormAufgabeVW aufgabeVW = new FormAufgabeVW();
|
|
aufgabeVW.ShowDialog();
|
|
}
|
|
private void ToolStripZaehlscheine_Click(object sender, EventArgs e)
|
|
{
|
|
FormKundeVW kundedaten = new FormKundeVW(this.benutzer);
|
|
if (kundedaten.ShowDialog() == DialogResult.OK)
|
|
{
|
|
|
|
}
|
|
}
|
|
private void ToolStripDB_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, false);
|
|
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
|
|
}
|
|
private void TSBWaschstrasse_Click(object sender, EventArgs e)
|
|
{
|
|
FormAufleger aufleger = new FormAufleger();
|
|
aufleger.ShowDialog();
|
|
}
|
|
private void ToolStripButtonImport_Click(object sender, EventArgs e)
|
|
{
|
|
FormImport import = new FormImport();
|
|
import.ShowDialog();
|
|
}
|
|
private void TSBKosten_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, true);
|
|
if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { }
|
|
}
|
|
private void TSBEinstellung_Click(object sender, EventArgs e)
|
|
{
|
|
FormEinstellung einstellung = new FormEinstellung();
|
|
einstellung.ShowDialog();
|
|
}
|
|
private void TSBExpedit_Click(object sender, EventArgs e)
|
|
{
|
|
FormExpedit exp = new FormExpedit(benutzer);
|
|
exp.ShowDialog();
|
|
}
|
|
private void TSBAuftragVW_Click(object sender, EventArgs e)
|
|
{
|
|
this.Cursor = Cursors.WaitCursor;
|
|
|
|
if (!this.groupBoxAuftrag.Visible)
|
|
{
|
|
if (benutzer.Rolle == BenutzerRolle.Fahrer) this.rBFertig.Checked = true;
|
|
else this.rBAlle.Checked = true;
|
|
|
|
// Groupbox einblenden wenn OLV noch nicht sichtbar ist.
|
|
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = gb.Name.Contains("Auftrag");
|
|
|
|
// PanelMain Buttons ausblenden.
|
|
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = false;
|
|
}
|
|
else
|
|
{
|
|
// Groupbox ausblenden wenn OLV sichtbar ist.
|
|
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>()) gb.Visible = !gb.Name.Contains("Auftrag");
|
|
|
|
// PanelMain Buttons einblenden.
|
|
foreach (Button btn in this.panelMain.Controls.OfType<Button>()) btn.Visible = true;
|
|
}
|
|
|
|
this.Cursor = Cursors.Default;
|
|
}
|
|
private void TSBScannTest_Click(object sender, EventArgs e)
|
|
{
|
|
if (open)
|
|
{
|
|
this.groupBoxScannTest.Visible = false;
|
|
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = false;
|
|
open = false;
|
|
}
|
|
else
|
|
{
|
|
this.groupBoxScannTest.Visible = true;
|
|
this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = true;
|
|
this.pictureBoxScannTest.Image = Image.FromFile("C:\\Users\\KilianWirl\\OneDrive - gehgassi GmbH\\Wäscherei Wirl\\Programme\\Deckungsbeitrag\\static-qr-code-ca1aa53ab47cd115bc1ad29afb0e5f22.png");
|
|
this.textBoxScannTest.Focus();
|
|
open = true;
|
|
}
|
|
}
|
|
private void TSBArtikelVW_Click(object sender, EventArgs e)
|
|
{
|
|
FormArtikelVW artikelVW = new FormArtikelVW(this.benutzer);
|
|
artikelVW.ShowDialog();
|
|
}
|
|
private void TSBTourenplanung_Click(object sender, EventArgs e)
|
|
{
|
|
this.Cursor = Cursors.WaitCursor;
|
|
FormTourenplanung tourenplanung = new FormTourenplanung(this.benutzer);
|
|
tourenplanung.ShowDialog();
|
|
this.Cursor = Cursors.Default;
|
|
}
|
|
private void TSBHilfe_Click(object sender, EventArgs e)
|
|
{
|
|
FormMain_HelpButtonClicked(this, null);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Button-Click Events
|
|
/// <summary>
|
|
/// Panel Main Control Funktionen
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ButtonNeuerAuftrag_Click(object sender, EventArgs e)
|
|
{
|
|
onBoardingArt = OnboardingSchritt.NeuerAuftrag;
|
|
if (this.benutzer.Rolle == BenutzerRolle.Fahrer) ZeigeOnboarding();
|
|
|
|
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standart);
|
|
if (neuerAuftrag.ShowDialog() == DialogResult.Abort) { this.kunde = neuerAuftrag.kunde; ButtonNeueInventur_Click(this.buttonNeueInventur, null); }
|
|
}
|
|
private void ButtonScannTest_Click(object sender, EventArgs e)
|
|
{
|
|
string s = this.textBoxScannTest.Text;
|
|
int pos = s.IndexOf('#');
|
|
this.textBoxScannTest.Text = this.labelScannTest.Text = s.Substring(pos + 1);
|
|
}
|
|
private void ButtonNeueAufgabe_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeueAufgabe neueAufgabe = new FormNeueAufgabe();
|
|
neueAufgabe.ShowDialog();
|
|
}
|
|
private void ButtonNeuerStand_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuerAuftrag neuerAuftrag;
|
|
DialogResult result = meldung.GetFrage(this, "Möchtest du eine Standverminderung oder Standerhöhung erstellen? \n\n [JA = Standverminerung | NEIN = Standerhöhung]", true);
|
|
|
|
switch (result)
|
|
{
|
|
case DialogResult.Cancel:
|
|
return;
|
|
case DialogResult.Yes:
|
|
neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standverminderung); neuerAuftrag.ShowDialog();
|
|
break;
|
|
case DialogResult.No:
|
|
neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standerhöhung); neuerAuftrag.ShowDialog();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
private void ButtonNeueInventur_Click(object sender, EventArgs e)
|
|
{
|
|
onBoardingArt = OnboardingSchritt.NeueInventur;
|
|
ZeigeOnboarding();
|
|
|
|
Kunde kunde = null;
|
|
FormListe liste = new FormListe(null, (int)Listentyp.Reklamationliste, "Miete");
|
|
if (liste.ShowDialog() == DialogResult.OK)
|
|
{
|
|
kunde = liste.kunde;
|
|
uCInventur = new UCInventur(kunde, this.benutzer);
|
|
uCInventur.UCInventur_Update += () => { this.GetInventuren(); };
|
|
uCInventur.UCInventur_Delete += Do_UCInventur_Delete;
|
|
this.panelMain.Controls.Add(uCInventur);
|
|
uCInventur.Location = new Point(100, 100);
|
|
uCInventur.BringToFront();
|
|
RegisterDragEvents(uCInventur);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// AUFTRAGSVERWALTUNG FUNKTIONEN
|
|
/// Button-Click AufAbruf und Ausgeliefert sowie ItemsChecked
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ButtonAusgeliefert_Click(object sender, EventArgs e)
|
|
{
|
|
int saved = 0;
|
|
int tosave = 0;
|
|
if (this.objectListViewAuftrag.CheckedItems.Count > 0)
|
|
{
|
|
if (meldung.AuftragAusgeliefert() == DialogResult.Yes)
|
|
{
|
|
foreach (OLVListItem item in this.objectListViewAuftrag.CheckedItems)
|
|
{
|
|
++tosave;
|
|
Auftrag a = (Auftrag)item.RowObject;
|
|
|
|
|
|
a.Erledigt = DateTime.Now;
|
|
a.ErledigtVon = this.benutzer.BenutzerID;
|
|
a.Status = AuftragStatus.Ausgeliefert;
|
|
|
|
if (a.Save()[0] == 1)
|
|
{
|
|
++saved;
|
|
ArtikellisteProAuftrag = AuftragArtikel.GetList(a.AuftragID);
|
|
foreach (AuftragArtikel auftragArtikel in this.ArtikellisteProAuftrag)
|
|
{
|
|
auftragArtikel.Erledigt = true;
|
|
if (auftragArtikel.Save() == 0) meldung.GetFehler(this, $"Der Artikel {auftragArtikel.AuftragArtikelID} konnte nicht gespeichert werden.");
|
|
}
|
|
}
|
|
|
|
// Wenn Typ ist Regelmäßig, wird ein neuer Auftrag laut Rhythmus hinterlegt.
|
|
if (a.Typ == AuftragTyp.Regelmäßig)
|
|
{
|
|
Auftrag newAuftrag = a;
|
|
newAuftrag.AuftragID = null;
|
|
newAuftrag.Liefertag = a.Liefertag.AddDays((int)a.Rhythmus);
|
|
newAuftrag.Status = AuftragStatus.Herrichten;
|
|
newAuftrag.ErstelltVon = (int)this.benutzer.BenutzerID;
|
|
newAuftrag.Erstellt = DateTime.Now;
|
|
|
|
// Werte des alten Auftrags zurücksetzen.
|
|
newAuftrag.Erledigt = null;
|
|
newAuftrag.ErledigtVon = null;
|
|
|
|
if (newAuftrag.Save()[0] != 1) meldung.Speicherfehler();
|
|
else
|
|
{
|
|
foreach (AuftragArtikel auftragArtikel in this.ArtikellisteProAuftrag)
|
|
{
|
|
auftragArtikel.AuftragArtikelID = null;
|
|
auftragArtikel.AuftragID = newAuftrag.AuftragID;
|
|
auftragArtikel.Erledigt = false;
|
|
if (auftragArtikel.Save() == 0) meldung.GetFehler(this, $"Der Artikel {auftragArtikel.AuftragArtikelID} konnte nicht gespeichert werden.");
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
if (saved == tosave) GetExpeditList(null);
|
|
}
|
|
}
|
|
}
|
|
private void ButtonAufAbruf_Click(object sender, EventArgs e)
|
|
{
|
|
if (this.objectListViewAuftrag.CheckedItems.Count == 1)
|
|
{
|
|
if (meldung.AuftragAufAbruf() == DialogResult.Yes)
|
|
{
|
|
OLVListItem item = (OLVListItem)this.objectListViewAuftrag.CheckedItems[0];
|
|
Auftrag a = (Auftrag)item.RowObject;
|
|
a.Typ = AuftragTyp.AufAbruf;
|
|
|
|
if (a.Save()[0] == 1) GetExpeditList(null);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
meldung.NurEinAuftrag();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Buttons auf MainPanel. Schnellzugriff für Neuer User und Neuer Auftrag.
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ButtonNeuerUser_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer();
|
|
neuerBenutzer.ShowDialog();
|
|
}
|
|
private void ButtonTestChart_Click(object sender, EventArgs e)
|
|
{
|
|
FehlmengeChart chart = new FehlmengeChart();
|
|
chart.Show();
|
|
}
|
|
private void ButtonTourenliste_Click(object sender, EventArgs e)
|
|
{
|
|
Benutzer fahrer = new Benutzer();
|
|
if (this.benutzer.Rolle == BenutzerRolle.Fahrer) fahrer = this.benutzer;
|
|
else
|
|
{
|
|
List<Benutzer> fahrerliste = Benutzer.GetFahrerList();
|
|
FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste);
|
|
if (benutzerVW.ShowDialog() == DialogResult.OK)
|
|
{
|
|
fahrer = benutzerVW.user;
|
|
}
|
|
}
|
|
if (fahrer != null)
|
|
{
|
|
List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
|
|
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
|
|
}
|
|
}
|
|
private async void ButtonKundeArtikelUpdate_Click(object sender, EventArgs e)
|
|
{
|
|
if (this.buttonKundeArtikelUpdate.Enabled == false) return;
|
|
|
|
Application.UseWaitCursor = true;
|
|
List<Sortiment> sortimentListe = Funktionen.SortimentLesen("Liste");
|
|
|
|
this.buttonKundeArtikelUpdate.Enabled = false;
|
|
this.progressBarKundeArtikelUpdate.Maximum = sortimentListe.Count();
|
|
this.progressBarKundeArtikelUpdate.Value = 0;
|
|
this.progressBarKundeArtikelUpdate.Visible = true;
|
|
this.progressBarKundeArtikelUpdate.Refresh();
|
|
this.progressBarKundeArtikelUpdate.BringToFront();
|
|
|
|
IProgress<int> progress = new Progress<int>(percent => // ✅ Progress<T> verwenden
|
|
{
|
|
this.progressBarKundeArtikelUpdate.Value = percent; // ✅ Lambda-Block
|
|
});
|
|
|
|
await Task.Run(() => DoKundeArtikelImportOnce(progress, sortimentListe));
|
|
|
|
MessageBox.Show("Das Update der KundenArtikel ist erfolgreich beendet.", "Update erfolgreich");
|
|
this.progressBarKundeArtikelUpdate.Value = 0;
|
|
this.buttonKundeArtikelUpdate.Enabled = true;
|
|
this.buttonKundeArtikelUpdate.BringToFront();
|
|
Application.UseWaitCursor = false;
|
|
}
|
|
private void ButtonRegAuftrag_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Regelmäßig);
|
|
neuerAuftrag.ShowDialog();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Auftrag GroupBox
|
|
/// <summary>
|
|
/// AUFTRAGSVERWALTUNG FUNKTIONEN
|
|
/// RadioButtons für Auftragsverwaltung & Laden der Auftragsliste nach Status.
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void RadioButton_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
RadioButton rB = (RadioButton)sender;
|
|
if (rB.Checked)
|
|
{
|
|
if (Enum.TryParse(rB.Name.Substring(2), out AuftragStatus status)) rB.Tag = (int)status;
|
|
else rB.Tag = null;
|
|
|
|
switch (rB.Tag)
|
|
{
|
|
case AuftragStatus.Abgeholt:
|
|
break;
|
|
case AuftragStatus.Aufgelegt:
|
|
break;
|
|
case AuftragStatus.Gewaschen:
|
|
break;
|
|
case AuftragStatus.Herrichten:
|
|
break;
|
|
case AuftragStatus.Vorbereitet:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
case AuftragStatus.Fertig:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
case AuftragStatus.Ausgeliefert:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
default:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
private async void GetExpeditList(int? status)
|
|
{
|
|
Application.UseWaitCursor = true;
|
|
this.objectListViewAuftrag.SuspendLayout();
|
|
this.objectListViewAuftrag.BeginUpdate();
|
|
|
|
List<Auftrag> alist = new List<Auftrag>();
|
|
|
|
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
|
|
try
|
|
{
|
|
await conn.OpenAsync();
|
|
if (status == null & this.benutzer.Rolle == BenutzerRolle.Fahrer) alist = await Auftrag.GetFahrerListAsync(this.benutzer.BenutzerID, conn);
|
|
else alist = await Auftrag.GetStatusListAsync(status, conn);
|
|
}
|
|
finally
|
|
{
|
|
if (conn.State == ConnectionState.Open)
|
|
conn.Close();
|
|
conn.Dispose();
|
|
}
|
|
|
|
if (alist.Count == 0) meldung.KeineAufträge();
|
|
else Load_OLV(alist); // Load_ListView(alist);
|
|
|
|
this.objectListViewAuftrag.EndUpdate();
|
|
this.objectListViewAuftrag.ResumeLayout();
|
|
Application.UseWaitCursor = false;
|
|
}
|
|
private void GetUnvisibleColumns()
|
|
{
|
|
|
|
foreach (OLVColumn col in this.objectListViewAuftrag.Columns)
|
|
{
|
|
if (this.benutzer.Rolle == BenutzerRolle.Frottee)
|
|
{
|
|
if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
|
|
}
|
|
else if (col.IsButton) col.IsVisible = false;
|
|
|
|
switch (this.benutzer.Rolle)
|
|
{
|
|
case BenutzerRolle.Verwaltung:
|
|
break;
|
|
case BenutzerRolle.Fahrer:
|
|
if (col.IsButton) col.IsVisible = false;
|
|
if (col.Text == "FR" || col.Text == "GT" || col.Text == "KT") col.IsVisible = false;
|
|
|
|
break;
|
|
case BenutzerRolle.Admin:
|
|
break;
|
|
case BenutzerRolle.Waschstrasse:
|
|
break;
|
|
case BenutzerRolle.Master:
|
|
break;
|
|
case BenutzerRolle.Expedit:
|
|
break;
|
|
case BenutzerRolle.Frottee:
|
|
if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
|
|
break;
|
|
case BenutzerRolle.Flach:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
this.objectListViewAuftrag.RebuildColumns();
|
|
}
|
|
private void ObjectListViewAuftrag_ItemChecked(object sender, ItemCheckedEventArgs e)
|
|
{
|
|
if (this.objectListViewAuftrag.CheckedItems.Count > 0) this.buttonAusgeliefert.Visible = true;
|
|
else this.buttonAusgeliefert.Visible = false;
|
|
if (this.objectListViewAuftrag.CheckedItems.Count == 1) this.buttonAufAbruf.Visible = true;
|
|
else this.buttonAufAbruf.Visible = false;
|
|
|
|
}
|
|
/// <summary>
|
|
/// AUFTRAGSVERWALTUNG FUNKTIONEN
|
|
/// ObjectListView für Auftragsverwaltung laden.
|
|
/// </summary>
|
|
/// <param name="alist"></param>
|
|
private void Load_OLV(List<Auftrag> alist)
|
|
{
|
|
// Cursor auf Warte-Status setzen, um Benutzerfeedback zu geben
|
|
this.Cursor = Cursors.WaitCursor;
|
|
|
|
// Spalten erstellen nach Typ Auftrag.
|
|
Generator.GenerateColumns(this.objectListViewAuftrag, typeof(Auftrag), true);
|
|
|
|
// ========== CHECKBOX COLUMNS FÜR ABTEILUNGEN ===========
|
|
// Spalten-Setup
|
|
var colFrottee = new OLVColumn("Frottee", "Frottee")
|
|
{
|
|
Text = "FR",
|
|
DisplayIndex = 6,
|
|
TextAlign = HorizontalAlignment.Center,
|
|
CheckBoxes = false,
|
|
TriStateCheckBoxes = false,
|
|
Width = 50,
|
|
AspectGetter = row =>
|
|
{
|
|
var auftrag = (Auftrag)row;
|
|
int abteilungen = (int)auftrag.Abteilungen;
|
|
|
|
bool begonnen = (abteilungen & (int)AbteilungsStatus.FrotteeBegonnen) != 0;
|
|
bool beendet = (abteilungen & (int)AbteilungsStatus.FrotteeBeendet) != 0;
|
|
|
|
if (beendet) return "✅"; // Status 1 ✓
|
|
if (begonnen) return "⭕"; // Status 2 ✓
|
|
return "❌"; // Status 0 ✓
|
|
}
|
|
};
|
|
var colKleinteile = new OLVColumn("Kleinteile", "Kleinteile")
|
|
{
|
|
Text = "KT",
|
|
DisplayIndex = 7,
|
|
TextAlign = HorizontalAlignment.Center,
|
|
CheckBoxes = false,
|
|
TriStateCheckBoxes = false,
|
|
Width = 50,
|
|
AspectGetter = row =>
|
|
{
|
|
var auftrag = (Auftrag)row;
|
|
int abteilungen = (int)auftrag.Abteilungen;
|
|
|
|
bool begonnen = (abteilungen & (int)AbteilungsStatus.KleinteileBegonnen) != 0;
|
|
bool beendet = (abteilungen & (int)AbteilungsStatus.KleinteileBeendet) != 0;
|
|
|
|
if (beendet) return "✅"; // Status 1 ✓
|
|
if (begonnen) return "⭕"; // Status 2 ✓
|
|
return "❌"; // Status 0 ✓
|
|
}
|
|
};
|
|
var colGrosseTeile = new OLVColumn("Großteile", "Großteile")
|
|
{
|
|
Text = "GT",
|
|
DisplayIndex = 8,
|
|
TextAlign = HorizontalAlignment.Center,
|
|
CheckBoxes = false,
|
|
TriStateCheckBoxes = false,
|
|
Width = 50,
|
|
AspectGetter = row =>
|
|
{
|
|
var auftrag = (Auftrag)row;
|
|
int abteilungen = (int)auftrag.Abteilungen;
|
|
|
|
bool begonnen = (abteilungen & (int)AbteilungsStatus.GrossteileBegonnen) != 0;
|
|
bool beendet = (abteilungen & (int)AbteilungsStatus.GrossteileBeendet) != 0;
|
|
|
|
if (beendet) return "✅"; // Status 1 ✓
|
|
if (begonnen) return "⭕"; // Status 2 ✓
|
|
return "❌"; // Status 0 ✓
|
|
}
|
|
};
|
|
|
|
this.objectListViewAuftrag.AllColumns.Add(colFrottee);
|
|
this.objectListViewAuftrag.AllColumns.Add(colKleinteile);
|
|
this.objectListViewAuftrag.AllColumns.Add(colGrosseTeile);
|
|
|
|
foreach (OLVColumn col in this.objectListViewAuftrag.AllColumns)
|
|
{
|
|
switch (col.Text)
|
|
{
|
|
case "Abschließen": // Abschließen Spalte als Button-Spalte konfigurieren
|
|
|
|
OLVColumn fertigColumn = col;
|
|
fertigColumn.DisplayIndex = 11;
|
|
fertigColumn.IsButton = true; // Als Button rendern
|
|
fertigColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
|
|
fertigColumn.HeaderImageKey = "abschließen";
|
|
fertigColumn.ShowTextInHeader = false;
|
|
fertigColumn.MinimumWidth = fertigColumn.MaximumWidth = 80;
|
|
break;
|
|
case "Etikett": // Etikett Spalte als Button-Spalte konfigurieren
|
|
OLVColumn etikettColumn = col;
|
|
etikettColumn.DisplayIndex = 10;
|
|
etikettColumn.IsButton = true; // Als Button rendern
|
|
etikettColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // Button füllt gesamte Zelle
|
|
etikettColumn.HeaderImageKey = "print";
|
|
etikettColumn.ShowTextInHeader = false;
|
|
etikettColumn.MinimumWidth = etikettColumn.MaximumWidth = 80;
|
|
break;
|
|
case "Aufgabe": // Aufgabe Spalte als Icon-Spalte: zeigt Icon wenn AufgabeID vorhanden
|
|
OLVColumn iconColumn = col;
|
|
iconColumn.DisplayIndex = 9;
|
|
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
|
|
};
|
|
break;
|
|
case "Kunde": // Kunde Spalte als Icon-Spalte: zeigt Icon und Kundename wenn Anmerkung vorhanden
|
|
OLVColumn iColumn = col;
|
|
iColumn.HeaderCheckBox = true;
|
|
iColumn.HeaderCheckBoxUpdatesRowCheckBoxes = true;
|
|
iColumn.DisplayIndex = 0;
|
|
iColumn.ImageGetter = rowObject =>
|
|
{
|
|
var _auftrag = rowObject as Auftrag;
|
|
if (string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) return null;
|
|
else return 1;
|
|
};
|
|
break;
|
|
case "Liefertag": // Liefertag Spalte Zeigt Liefertag als String an.
|
|
OLVColumn dateColumn = col;
|
|
dateColumn.DisplayIndex = 1;
|
|
dateColumn.AspectToStringFormat = "{0:ddd dd.MM.}";
|
|
// DateTime-Filter für Spalte 2
|
|
dateColumn.ClusteringStrategy = new DateTimeClusteringStrategy(DateTimePortion.Day, "ddd dd.MM."); // DateTimeClustering damit Datum gefiltert werden kann
|
|
this.objectListViewAuftrag.SecondarySortColumn = dateColumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
|
|
break;
|
|
case "Status": // Spalte 5 als primäre Sortier-Spalte festlegen (nach Datenbindung!)
|
|
OLVColumn sortcolumn = col;
|
|
sortcolumn.DisplayIndex = 4;
|
|
this.objectListViewAuftrag.PrimarySortColumn = sortcolumn; // Primary Sortiert nach Spalte 5 (Status) Secundary Sortiert nach Spalte 2 (Liefertag)
|
|
break;
|
|
case "Erstellt":
|
|
col.IsVisible = false;
|
|
break;
|
|
case "Gedruckt":
|
|
col.IsVisible = false;
|
|
break;
|
|
case "Erledigt":
|
|
col.IsVisible = false;
|
|
break;
|
|
case "schmutzig":
|
|
col.HeaderImageKey = "dirt";
|
|
col.ShowTextInHeader = false;
|
|
col.MinimumWidth = col.MaximumWidth = 80;
|
|
col.DisplayIndex = 2;
|
|
break;
|
|
case "sauber":
|
|
col.HeaderImageKey = "clean";
|
|
col.ShowTextInHeader = false;
|
|
col.MinimumWidth = col.MaximumWidth = 80;
|
|
col.DisplayIndex = 3;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ========== IMAGE-LIST ZUWEISEN ==========
|
|
// SmallImageList für Icons in Detail-View (16x16 Pixel standard)
|
|
Program.imagelist.ImageSize = new Size(24, 24);
|
|
this.objectListViewAuftrag.SmallImageList = Program.imagelist; // Voraussetzung: imagelist mit Icon Index 0 gefüllt
|
|
|
|
// ========== TOOLTIP FÜR ICON-SPALTEN ==========
|
|
// 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.Column.Text == "Aufgabe" && 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.Column.Text == "Kunde" && 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??
|
|
if (e.Column.Text == "Fahrer" && e.Model is Auftrag auftrag1)
|
|
{
|
|
e.Text = auftrag1.ZusatzInfo;
|
|
}
|
|
};
|
|
|
|
// ========== DATEN LADEN ==========
|
|
// WICHTIG: SetObjects NACH Column-Konfiguration aufrufen!
|
|
this.objectListViewAuftrag.SetObjects(alist);
|
|
|
|
this.objectListViewAuftrag.RebuildColumns();
|
|
//if (_settings.OLV_State != null) this.objectListViewAuftrag.RestoreState(_settings.OLV_State);
|
|
GetUnvisibleColumns();
|
|
|
|
|
|
this.objectListViewAuftrag = Funktionen.Columns_Resize(null, this.objectListViewAuftrag).olv;
|
|
|
|
// Cursor auf Default-Status setzen, um Benutzerfeedback zu geben
|
|
this.Cursor = Cursors.Default;
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region Drag & Drop Events
|
|
|
|
/// <summary>
|
|
/// Drag & Drop für GroupBox.
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void GroupBox_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
GroupBox gb = (GroupBox)sender;
|
|
base.OnPaint(e);
|
|
Funktionen.GetGroupBoxBoarder(gb, e);
|
|
|
|
gb.MouseDown += GroupBox_MouseDown;
|
|
gb.MouseMove += GroupBox_MouseMove;
|
|
gb.MouseUp += GroupBox_MouseUp;
|
|
foreach(Control ctr in gb.Controls)
|
|
{
|
|
if (ctr.GetType() == typeof(ComboBox) || ctr.GetType() == typeof(DateTimePicker) || ctr is Button || ctr is RadioButton) continue;
|
|
ctr.MouseDown += GroupBox_MouseDown;
|
|
ctr.MouseMove += GroupBox_MouseMove;
|
|
ctr.MouseUp += GroupBox_MouseUp;
|
|
}
|
|
}
|
|
private void GroupBox_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
|
|
draggedBox = FindParentGroupBox((Control)sender);
|
|
|
|
// 1. BILD der GroupBox erstellen
|
|
Bitmap dragImage = new Bitmap(draggedBox.Width, draggedBox.Height);
|
|
draggedBox.DrawToBitmap(dragImage, draggedBox.ClientRectangle);
|
|
|
|
// 2. Ghost-Bild setzen + sichtbar machen
|
|
ghostImage.Image?.Dispose();
|
|
ghostImage.Image = dragImage;
|
|
ghostImage.Size = draggedBox.Size;
|
|
ghostImage.Visible = true;
|
|
ghostImage.BringToFront();
|
|
|
|
dragOffset = e.Location;
|
|
isDragging = true;
|
|
panelMain.SuspendLayout();
|
|
|
|
// 2. Original unsichtbar machen
|
|
draggedBox.Visible = false;
|
|
}
|
|
}
|
|
private void GroupBox_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
if (isButtonDragging) return;
|
|
if (isDragging)
|
|
{
|
|
Point mousePos = panelMain.PointToClient(MousePosition);
|
|
Point newPos = new Point(mousePos.X - dragOffset.X, mousePos.Y - dragOffset.Y);
|
|
|
|
// Grenzen
|
|
newPos.X = Math.Max(0, Math.Min(panelMain.Width - draggedBox.Width, newPos.X));
|
|
newPos.Y = Math.Max(0, Math.Min(panelMain.Height - draggedBox.Height, newPos.Y));
|
|
|
|
// 1. Ghost folgt Maus
|
|
ghostImage.Location = newPos;
|
|
|
|
// 2. Original folgt (unsichtbar)
|
|
draggedBox.Location = newPos;
|
|
}
|
|
}
|
|
private void GroupBox_GiveFeedback(object sender, GiveFeedbackEventArgs e)
|
|
{
|
|
if (draggedBox != null)
|
|
{
|
|
// Screenshot erstellen
|
|
Bitmap bmp = new Bitmap(draggedBox.Width, draggedBox.Height);
|
|
draggedBox.DrawToBitmap(bmp, draggedBox.ClientRectangle);
|
|
|
|
// Ghost 50% transparent machen
|
|
float[][] matrix = {
|
|
new float[] {1, 0, 0, 0, 0},
|
|
new float[] {0, 1, 0, 0, 0},
|
|
new float[] {0, 0, 1, 0, 0},
|
|
new float[] {0, 0, 0, 0.5f, 0},
|
|
new float[] {0, 0, 0, 0, 1}
|
|
};
|
|
using (ImageAttributes attr = new ImageAttributes())
|
|
{
|
|
attr.SetColorMatrix(new ColorMatrix(matrix));
|
|
// Graphics.FromImage für DragImage rendern (komplex)
|
|
}
|
|
}
|
|
}
|
|
private void GroupBox_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (isDragging)
|
|
{
|
|
isDragging = false;
|
|
ghostImage.Visible = false;
|
|
draggedBox.Visible = true;// Ghost weg
|
|
panelMain.ResumeLayout();
|
|
}
|
|
}
|
|
private void RegisterDragEvents(Control parent)
|
|
{
|
|
if (parent is Button) return;
|
|
|
|
parent.MouseDown += Child_MouseDown;
|
|
// 1. Parent selbst behandeln (GroupBox)
|
|
if (parent is GroupBox gb)
|
|
{
|
|
gb.MouseDown += GroupBox_MouseDown;
|
|
gb.MouseMove += GroupBox_MouseMove;
|
|
gb.MouseUp += GroupBox_MouseUp;
|
|
}
|
|
if (parent is UserControl uc)
|
|
{
|
|
uc.MouseDown += GroupBox_MouseDown;
|
|
uc.MouseMove += GroupBox_MouseMove;
|
|
uc.MouseUp += GroupBox_MouseUp;
|
|
|
|
}
|
|
// 2. ALLE Children (rekursiv) - auch Child of Child!
|
|
foreach (Control child in parent.Controls)
|
|
{
|
|
if (child is ComboBox || child is DateTimePicker || child is Button || child is RadioButton || child is PictureBox || child is DataGridView) continue;
|
|
if (child.Name == "labelInvText") continue;
|
|
// JEDES Control bekommt Child-Handler
|
|
child.MouseDown += Child_MouseDown;
|
|
child.MouseMove += Child_MouseMove;
|
|
child.MouseUp += Child_MouseUp;
|
|
|
|
// Rekursion für NESTED Children
|
|
RegisterDragEvents(child);
|
|
}
|
|
}
|
|
private void Child_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
// Koordinaten an Parent weiterleiten
|
|
Control child = (Control)sender;
|
|
|
|
if (child is Button)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Control parentGb = FindParentGroupBox(child);
|
|
|
|
if (parentGb != null)
|
|
{
|
|
Point parentPos = child.PointToClient(child.PointToScreen(e.Location));
|
|
MouseEventArgs parentEvent = new MouseEventArgs(e.Button, e.Clicks,
|
|
parentPos.X, parentPos.Y, e.Delta);
|
|
GroupBox_MouseDown(parentGb, parentEvent);
|
|
}
|
|
}
|
|
private void Child_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
Control gb = FindParentGroupBox((Control)sender);
|
|
if (gb != null && isDragging && draggedBox == gb)
|
|
{
|
|
GroupBox_MouseMove(gb, e);
|
|
}
|
|
}
|
|
private void Child_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
Control gb = FindParentGroupBox((Control)sender);
|
|
if (gb != null && isDragging && draggedBox == gb)
|
|
{
|
|
GroupBox_MouseUp(gb, e); // ← Dragging beenden!
|
|
}
|
|
}
|
|
private Control FindParentGroupBox(Control control)
|
|
{
|
|
while (control != null)
|
|
{
|
|
if (control.Parent is UserControl control2)
|
|
{
|
|
return control2;
|
|
}
|
|
else if (control is GroupBox box)
|
|
{
|
|
return box;
|
|
}
|
|
if (control is UserControl control1)
|
|
{
|
|
return control1;
|
|
}
|
|
|
|
control = control.Parent;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
#endregion
|
|
private async void GetInventuren()
|
|
{
|
|
foreach (UCInventur uci in panelMain.Controls.OfType<UCInventur>())
|
|
{
|
|
this.panelMain.Controls.Remove(uci);
|
|
}
|
|
|
|
string loadPath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren";
|
|
if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") loadPath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren";
|
|
|
|
// Alle "Warten" Inventur Files auflisten.
|
|
string[] invFiles = Directory.GetFiles(loadPath, "Warten-*.csv");
|
|
if (invFiles.Length == 0) return;
|
|
int i = 0;
|
|
foreach (string s in invFiles)
|
|
{
|
|
i++;
|
|
// 1. alle Zeilen lesen
|
|
string[] lines = File.ReadAllLines(Path.Combine(loadPath, s), Encoding.UTF8);
|
|
// 2. an UCInventur übergeben
|
|
uCInventur = new UCInventur(lines, this.benutzer, this)
|
|
{
|
|
Visible = false,
|
|
Name = $"uci_{i}"
|
|
};
|
|
uCInventur.UCInventur_Update += () => { this.GetInventuren(); };
|
|
uCInventur.UCInventur_Delete += Do_UCInventur_Delete;
|
|
|
|
this.panelMain.Controls.Add(uCInventur);
|
|
}
|
|
//Get_UCInventur_Location();
|
|
}
|
|
private void Do_UCInventur_Delete()
|
|
{
|
|
this.panelMain.Controls.Remove(uCInventur);
|
|
}
|
|
|
|
private void Get_UCInventur_Location()
|
|
{
|
|
// UCInventur in den Vordergrund bringen und Location setzen.
|
|
int y = panelMain.Controls["feedback"].Bottom + 10;
|
|
foreach (UCInventur uci in panelMain.Controls.OfType<UCInventur>())
|
|
{
|
|
int x = panelMain.Width - uCInventur.Width - 10;
|
|
uci.Visible = true;
|
|
uci.BringToFront();
|
|
uci.Location = new Point(x, y);
|
|
y += uci.Height;
|
|
}
|
|
|
|
}
|
|
|
|
private async void ZeigeOnboarding()
|
|
{
|
|
if (this.benutzer.IstGesehen(onBoardingArt)) return; // Bereits fertig
|
|
|
|
if (Program.ShowOnBoarding(this.benutzer.Rolle.ToString(), onBoardingArt) == DialogResult.OK)
|
|
{
|
|
// Nächster Schritt → Flag setzen
|
|
this.benutzer.OnboardingStatus = this.benutzer.SetOnboardingFlag(onBoardingArt);
|
|
await this.benutzer.UpdateOnBoardingAsync(); // Deine Update-Methode
|
|
//this.Close(); // Onboarding beendet
|
|
}
|
|
}
|
|
private void GetUserControls()
|
|
{
|
|
// Feedback Button wird eingefügt. Location wird in FormMain_Shown berechnet.
|
|
UCFeedback feedback = new UCFeedback(this.benutzer);
|
|
this.panelMain.Controls.Add(feedback);
|
|
if (feedback != null) feedback.Location = new Point(panelMain.Width - feedback.Width - 10, panelMain.Top + 10);
|
|
|
|
switch (this.benutzer.Rolle)
|
|
{
|
|
case BenutzerRolle.Verwaltung:
|
|
break;
|
|
case BenutzerRolle.Fahrer:
|
|
break;
|
|
case BenutzerRolle.Admin:
|
|
// UserControl Auftrag Suchen einfügen
|
|
uCAuftrag = new UCAuftragSuchen(this.benutzer, this);
|
|
this.panelMain.Controls.Add(uCAuftrag);
|
|
uCAuftrag.Location = new Point(8, this.buttonNeueAufgabe.Bottom + 10);
|
|
// UserControl Statistik einfügen
|
|
uCStatistik = new UCStatistik();
|
|
this.panelMain.Controls.Add(uCStatistik);
|
|
uCStatistik.Location = new Point(8, uCAuftrag.Bottom + 10);
|
|
break;
|
|
case BenutzerRolle.Waschstrasse:
|
|
break;
|
|
case BenutzerRolle.Master:
|
|
break;
|
|
case BenutzerRolle.Expedit:
|
|
break;
|
|
case BenutzerRolle.Frottee:
|
|
break;
|
|
case BenutzerRolle.Flach:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
private void Enable_Controls()
|
|
{
|
|
// BUTTONS ENABLEN
|
|
foreach (Control ctr in this.panelMain.Controls)
|
|
{
|
|
switch (this.benutzer.Rolle)
|
|
{
|
|
case BenutzerRolle.Verwaltung:
|
|
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxSaison");
|
|
break;
|
|
case BenutzerRolle.Fahrer:
|
|
ctr.Visible = ctr.Enabled = ctr.Name.Contains("NeuerAuftrag") || ctr.Name.Contains("groupBoxAuftrag") || ctr.Name.Contains("Tourenliste");
|
|
if (ctr.Name.Contains("groupBoxAuftrag"))
|
|
{
|
|
this.groupBoxAuftrag.Size = new Size(this.panelMain.Width - this.buttonNeuerAuftrag.Right - 20, this.panelMain.Height - 20);
|
|
this.groupBoxAuftrag.Location = new Point(this.buttonNeuerAuftrag.Right + 10, this.buttonNeuerAuftrag.Bottom + 10);
|
|
foreach (RadioButton rb in this.groupBoxAuftrag.Controls.OfType<RadioButton>()) rb.Enabled = false;
|
|
}
|
|
break;
|
|
case BenutzerRolle.Admin:
|
|
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxScannTest");
|
|
break;
|
|
case BenutzerRolle.Waschstrasse:
|
|
ctr.Visible = ctr.Enabled = false;
|
|
break;
|
|
case BenutzerRolle.Master:
|
|
ctr.Visible = ctr.Enabled = !ctr.Name.Contains("groupBoxAuftrag") && !ctr.Name.Contains("groupBoxScannTest");
|
|
break;
|
|
case BenutzerRolle.Expedit:
|
|
ctr.Visible = ctr.Enabled = false;
|
|
break;
|
|
case BenutzerRolle.Frottee:
|
|
ctr.Visible = ctr.Enabled = false;
|
|
break;
|
|
case BenutzerRolle.Flach:
|
|
ctr.Visible = ctr.Enabled = false;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (!ctr.Name.Contains("groupBoxAuftrag")) RegisterDragEvents(ctr);
|
|
}
|
|
|
|
// TOOLSTRIP-BUTTONS ENABLEN
|
|
foreach (ToolStripButton btn in this.toolStripMenu.Items)
|
|
{
|
|
switch (this.benutzer.Rolle)
|
|
{
|
|
case BenutzerRolle.Verwaltung:
|
|
btn.Enabled = true;
|
|
break;
|
|
case BenutzerRolle.Fahrer:
|
|
btn.Enabled = btn.Name.Contains("Hilfe");
|
|
break;
|
|
case BenutzerRolle.Admin:
|
|
btn.Enabled = true;
|
|
break;
|
|
case BenutzerRolle.Waschstrasse:
|
|
btn.Enabled = btn.Name.Contains("Hilfe");
|
|
break;
|
|
case BenutzerRolle.Master:
|
|
btn.Enabled = true;
|
|
break;
|
|
case BenutzerRolle.Expedit:
|
|
btn.Enabled = btn.Name.Contains("Hilfe");
|
|
break;
|
|
case BenutzerRolle.Frottee:
|
|
btn.Enabled = btn.Name.Contains("Hilfe");
|
|
break;
|
|
case BenutzerRolle.Flach:
|
|
btn.Enabled = btn.Name.Contains("Hilfe");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if (this.groupBoxAuftrag.Visible && this.benutzer.Rolle == BenutzerRolle.Fahrer)
|
|
{
|
|
GetExpeditList(null);
|
|
}
|
|
this.panelProgress.Visible = this.panelProgress.Enabled = this.benutzer.Rolle == BenutzerRolle.Master;
|
|
this.buttonKundeArtikelUpdate.Visible = this.buttonKundeArtikelUpdate.Enabled = this.benutzer.Rolle == BenutzerRolle.Master;
|
|
}
|
|
private void DoKundeArtikelImportOnce(IProgress<int> progress, List<Sortiment> sortimentListe)
|
|
{
|
|
int kundeid = 0;
|
|
int itemsDone = 0;
|
|
int reihung = 1;
|
|
foreach (Sortiment sort in sortimentListe)
|
|
{
|
|
// Fortschrittswert an die ProgressBar melden
|
|
progress.Report(++itemsDone);
|
|
Console.WriteLine(itemsDone);
|
|
|
|
if (sort.ArtNr != 0)
|
|
{
|
|
if (kundeid != Kunde.GetKundeID(sort.KundeNummer, null)) { kundeid = Kunde.GetKundeID(sort.KundeNummer, null); reihung = 1; }
|
|
if (kundeid == 0) continue;
|
|
KundeArtikel kndart = KundeArtikel.GetItemIfAvailable(kundeid, sort.ArtNr);
|
|
try
|
|
{
|
|
Artikel art = Artikel.GetArtikel(sort.ArtNr, null);
|
|
if (art == null) continue;
|
|
if (kndart == null)
|
|
{
|
|
kndart = new KundeArtikel
|
|
{
|
|
KundeID = kundeid,
|
|
ArtikelName = art.Bezeichnung,
|
|
ArtikelNR = art.Nummer
|
|
};
|
|
}
|
|
|
|
kndart.ArtikelID = art.ArtikelID;
|
|
kndart.Reihung = reihung;
|
|
kndart.Save();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"Kundenartikel {kndart.KundeArtikelID} von Kunde {kundeid} konnte nicht gespeichert werden. {ex.Message}");
|
|
}
|
|
}
|
|
reihung++;
|
|
}
|
|
|
|
}
|
|
private async Task GetAuftraege()
|
|
{
|
|
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
|
|
try
|
|
{
|
|
await conn.OpenAsync();
|
|
auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragStatus.Aufgelegt);
|
|
//TODO: nicht ganze Aufträge holen sondern nur die Zahlen?
|
|
}
|
|
finally
|
|
{
|
|
if (conn.State == ConnectionState.Open)
|
|
conn.Close();
|
|
conn.Dispose();
|
|
}
|
|
}
|
|
private void Paint_Boarder(Size size, PaintEventArgs e)
|
|
{
|
|
e.Graphics.Clear(Color.White);
|
|
Pen pen = new Pen(Program.Wirlblau, 4);
|
|
Rectangle rect = new Rectangle(1, 2, size.Width - 4, size.Height - 4);
|
|
e.Graphics.DrawRectangle(pen, rect);
|
|
}
|
|
private void PanelMain_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
Paint_Boarder(this.panelMain.Size, e);
|
|
}
|
|
private void PanelMain_Resize(object sender, EventArgs e)
|
|
{
|
|
panelMain.Invalidate();
|
|
}
|
|
private async void FormMain_HelpButtonClicked(object sender, CancelEventArgs e)
|
|
{
|
|
this.benutzer.OnboardingStatus = this.benutzer.ClearOnboardingFlag(onBoardingArt); // OnBoarding zurücksetzen
|
|
await this.benutzer.UpdateOnBoardingAsync(); // Update OnBoardingStatus
|
|
ZeigeOnboarding();
|
|
}
|
|
private void GetContainerProTag()
|
|
{
|
|
for (int i = 0; i < this.tLPContAnz.ColumnCount; i++)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
int row = 1;
|
|
foreach (var key in auftragliste.Keys.OrderBy(k => k))
|
|
{
|
|
Control ctr = this.tLPContAnz.GetControlFromPosition(i, row);
|
|
ctr.Text = Funktionen.GetWochentagDeutsch(key.DayOfWeek);
|
|
ctr.Text += " (" + key.ToShortDateString() + "):"; // "13.02.2026"
|
|
|
|
row++;
|
|
}
|
|
Control control = this.tLPContAnz.GetControlFromPosition(i, row - 1);
|
|
control.Text = "Rest";
|
|
}
|
|
if (i == 1)
|
|
{
|
|
int row = 1;
|
|
int cont = 0;
|
|
int gescont = 0;
|
|
foreach (List<Auftrag> liste in auftragliste.Values)
|
|
{
|
|
foreach (Auftrag a in liste)
|
|
{
|
|
cont += a.Container;
|
|
}
|
|
Control ctr = this.tLPContAnz.GetControlFromPosition(i, row);
|
|
ctr.Text = cont.ToString();
|
|
gescont += cont;
|
|
row++;
|
|
cont = 0;
|
|
}
|
|
Control control = this.tLPContAnz.GetControlFromPosition(1, 6);
|
|
control.Text = gescont.ToString();
|
|
}
|
|
if (i == 2 || i == 3)
|
|
{
|
|
double geszeit = 0;
|
|
for (int j = 1; j < this.tLPContAnz.RowCount; j++)
|
|
{
|
|
Control ctr = this.tLPContAnz.GetControlFromPosition(1, j);
|
|
if (double.TryParse(ctr.Text, out double cont)) cont = (cont * 2.7 * 3.5) / 60 / (i-1);
|
|
Control control = this.tLPContAnz.GetControlFromPosition(i, j);
|
|
control.Text = cont.ToString("F1") + " h";
|
|
if (j < 6) geszeit += cont;
|
|
}
|
|
Control _ctr = this.tLPContAnz.GetControlFromPosition(i, 6);
|
|
_ctr.Text = geszeit.ToString("F1") + " h";
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
private void GetSaison()
|
|
{
|
|
var listenQuelle = Saison.LadeSaisons(); // Liste<Saison>
|
|
|
|
comboBoxSaison.DataSource = listenQuelle;
|
|
comboBoxSaison.DisplayMember = nameof(Saison.Bezeichnung);
|
|
comboBoxSaison.ValueMember = nameof(Saison.SaisonId);
|
|
|
|
// aktiven Eintrag suchen (falls genau einer aktiv ist)
|
|
var aktiveSaison = listenQuelle
|
|
.FirstOrDefault(s => s.Aktiv); // LINQ FirstOrDefault [web:13][web:16][web:19]
|
|
|
|
if (aktiveSaison != null)
|
|
{
|
|
comboBoxSaison.SelectedValue = aktiveSaison.SaisonId; // per ValueMember setzen [web:11][web:20]
|
|
}
|
|
}
|
|
private void ComboBoxSaison_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (formloading) { return; }
|
|
if (meldung.GetFrage(this, "Bist du dir sicher, dass du die Aktive Saison ändern möchtest?", false) == DialogResult.No)
|
|
{
|
|
formloading = true;
|
|
try
|
|
{
|
|
foreach (Saison saison in comboBoxSaison.Items)
|
|
{
|
|
if (saison.Aktiv)
|
|
{
|
|
comboBoxSaison.SelectedItem = saison; // Event wird aktuell unterdrückt
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
formloading = false;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
foreach (Saison saison in comboBoxSaison.Items)
|
|
{
|
|
if (saison == comboBoxSaison.SelectedItem) saison.Aktiv = true;
|
|
else saison.Aktiv = false;
|
|
|
|
saison.Save();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Scan QR-Code Test.
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void TextBoxScannTest_TextChanged(object sender, EventArgs e)
|
|
{
|
|
TextBox textBox1 = (TextBox)sender;
|
|
using (Graphics g = textBox1.CreateGraphics())
|
|
{
|
|
SizeF size = g.MeasureString(textBox1.Text, textBox1.Font);
|
|
textBox1.Width = (int)size.Width + 10; // +10 als Puffer
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.
|
|
//CHANGES: Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden.
|
|
//TODO: Dateinamen aus Tikos anschauen. Eventuell Datum von letztem Import über Dateiname wählen?
|
|
//DONE: JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen.
|