1466 lines
52 KiB
C#
1466 lines
52 KiB
C#
using BrightIdeasSoftware;
|
|
using DatenDB;
|
|
using Deckungsbeitrag.AA_Forms;
|
|
using Deckungsbeitrag.AA_Klassen;
|
|
using Deckungsbeitrag.Properties;
|
|
using Npgsql;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Configuration;
|
|
using System.Data;
|
|
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.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Input;
|
|
using System.Xml.Serialization;
|
|
using Timer = System.Windows.Forms.Timer;
|
|
|
|
namespace Deckungsbeitrag
|
|
{
|
|
public partial class FormMain : Form
|
|
{
|
|
private Benutzer benutzer = null;
|
|
Meldungen meldung = new Meldungen();
|
|
bool open = false;
|
|
private bool isDragging = false;
|
|
private Point dragStartPoint;
|
|
private Point newLocation;
|
|
private Size _fixedSize;
|
|
private bool _handlingResize;
|
|
private readonly UserSettingsManager _settings = new UserSettingsManager();
|
|
private bool formloading = false;
|
|
private Dictionary<DateTime, List<Auftrag>> auftragliste;
|
|
private GroupBox draggedBox;
|
|
private Point dragOffset;
|
|
private Point dragOffsetButton;
|
|
private PictureBox ghostImage;
|
|
private Button draggedButton;
|
|
private bool isButtonDragging = false;
|
|
private Timer dragEndTimer;
|
|
|
|
public FormMain()
|
|
{
|
|
InitializeComponent();
|
|
this.panelMain.AllowDrop = true;
|
|
|
|
this.toolStripMenu.Size = new Size(toolStripButton1.Size.Width + 20, this.Height);
|
|
|
|
}
|
|
public FormMain(Benutzer benutzer) : this()
|
|
{
|
|
this.benutzer = benutzer;
|
|
|
|
this.groupBoxUpdate.Enabled = false;
|
|
|
|
// AKTIVE ELEMENTE JE BENUTZER ROLLE
|
|
switch (benutzer.Rolle)
|
|
{
|
|
case BenutzerRolle.Verwaltung:
|
|
this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBExpedit.Enabled = false;
|
|
this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBExpedit.Enabled = false;
|
|
break;
|
|
case BenutzerRolle.Fahrer:
|
|
|
|
// ToolStripButtons werden deaktiviert.
|
|
foreach(ToolStripButton tsb in this.toolStripMenu.Items)
|
|
{
|
|
// Ausgewählter ToolStripButton bleibt aktiv.
|
|
if(!tsb.Name.Contains("Auftrag")) tsb.Enabled = false;
|
|
}
|
|
|
|
// Controls im PanelMain werden deaktiviert.
|
|
foreach(Control ctr in this.panelMain.Controls)
|
|
{
|
|
// Ausgewählte Buttons bleiben aktiv.
|
|
if (ctr.Name.Contains("Auftrag") || ctr.Name.Contains("Tourenliste")) ctr.Visible = true;
|
|
else
|
|
{
|
|
//if (ctr.GetType() == typeof(Button)) ctr.BackColor = Color.Gray;
|
|
ctr.Visible = false;
|
|
}
|
|
}
|
|
break;
|
|
case BenutzerRolle.Admin:
|
|
break;
|
|
case BenutzerRolle.Waschstrasse:
|
|
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;
|
|
break;
|
|
case BenutzerRolle.Master:
|
|
this.groupBoxUpdate.Visible = this.groupBoxUpdate.Enabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
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!
|
|
}
|
|
|
|
|
|
private async void FormMain_Load(object sender, EventArgs e)
|
|
{
|
|
formloading = true;
|
|
_settings.Load();
|
|
|
|
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";
|
|
|
|
GetStatistik();
|
|
GetSaison();
|
|
|
|
// GroupBoxen im PanelMain werden ausgeblendet
|
|
foreach (GroupBox gb in this.panelMain.Controls.OfType<GroupBox>())
|
|
{
|
|
if (!gb.Name.Contains("Update") & !gb.Name.Contains("Statistik") & !gb.Name.Contains("Neuer") & !gb.Name.Contains("Saison") & !gb.Name.Contains("ContAnz"))
|
|
{
|
|
gb.Visible = false;
|
|
gb.Location = new Point(0, 0);
|
|
gb.Size = new Size(this.panelMain.Width, this.panelMain.Height);
|
|
}
|
|
RegisterDragEvents(gb);
|
|
}
|
|
|
|
if (this.groupBoxContAnz.Visible)
|
|
{
|
|
await GetAuftraege();
|
|
GetContainerProTag();
|
|
}
|
|
|
|
this.Activate();
|
|
_fixedSize = this.Size;
|
|
formloading = false;
|
|
}
|
|
private async Task GetAuftraege()
|
|
{
|
|
var conn = new NpgsqlConnection(ConfigurationManager.AppSettings["ConnectionString"]); // Pro Task!
|
|
try
|
|
{
|
|
await conn.OpenAsync();
|
|
auftragliste = await Auftrag.GetAuftraegeProLiefertagAsync(conn, AuftragTyp.Standart, AuftragStatus.Aufgelegt);
|
|
}
|
|
finally
|
|
{
|
|
if (conn.State == ConnectionState.Open)
|
|
conn.Close();
|
|
conn.Dispose();
|
|
}
|
|
}
|
|
|
|
|
|
private void Paint_Boarder(Size size, Point location, PaintEventArgs e)
|
|
{
|
|
e.Graphics.Clear(Color.White);
|
|
Pen pen = new Pen(Color.FromArgb(1, 53, 101), 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, this.panelMain.Location, e);
|
|
}
|
|
|
|
#region ToolStripButton_Click-Events
|
|
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 toolStripStatusLabel2_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
FormEinstellung einstellung = new FormEinstellung("Sortiment");
|
|
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") ? true : false;
|
|
|
|
// 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") ? false : true;
|
|
|
|
// 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();
|
|
artikelVW.ShowDialog();
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// TOOLSTRIP BUTTON DESIGN
|
|
/// </summary>
|
|
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 = Color.FromArgb(1, 53, 101);
|
|
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 = Color.FromArgb(1, 53, 101);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Hilfe Events
|
|
///
|
|
/// </summary>
|
|
private void buttonNeueMaschine_HelpRequested(object sender, HelpEventArgs hlpevent)
|
|
{
|
|
MessageBox.Show($"Hier kannst du eine neue Maschine anlegen.{Environment.NewLine}{Environment.NewLine}Wenn du bei einer Maschine einen Trockner aus- oder einschalten willst musst du die Maschine doppelt anklicken.", "Hilfe", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
} //Hilfe bei Maschine Button und Maschine Groupbox.
|
|
|
|
/// <summary>
|
|
/// Panel Main Control Funktionen
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void buttonNeuerAuftrag_Click(object sender, EventArgs e)
|
|
{
|
|
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standart); neuerAuftrag.ShowDialog();
|
|
}
|
|
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)
|
|
{
|
|
FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Inventur); neuerAuftrag.ShowDialog();
|
|
}
|
|
|
|
|
|
/// <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
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update Events mit Button-Click
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void Update_Sortiment(IProgress<int> progress, List<Sortiment> sortiment)
|
|
{
|
|
int tosave = 0;
|
|
int saved = 0;
|
|
int artvorhanden = 0;
|
|
int anzahlkunden = 0;
|
|
string sortNr = string.Empty;
|
|
List<Kunde> kundenliste = Kunde.GetList(true, string.Empty);
|
|
|
|
|
|
foreach (Kunde kunde in kundenliste)
|
|
{
|
|
// Fortschrittswert an die ProgressBar melden
|
|
progress.Report(++anzahlkunden);
|
|
|
|
//Jedes Innsbrucker Soziale Dienste Sortiment ist gleich.
|
|
if (kunde.KundeNummer == "010069" | kunde.KundeNummer == "010071") sortNr = "010068";
|
|
else sortNr = kunde.KundeNummer;
|
|
|
|
foreach (Sortiment sort in sortiment.FindAll(Sortiment => Sortiment.KundeNummer == sortNr))
|
|
{
|
|
KundeArtikel item = KundeArtikel.GetItemIfAvailable(Kunde.GetKundeID(sort.KundeNummer, null), sort.ArtNr);
|
|
|
|
if(item == null)
|
|
{
|
|
++tosave;
|
|
|
|
item = new KundeArtikel();
|
|
item.KundeID = Kunde.GetKundeID(sort.KundeNummer, null);
|
|
item.ArtikelNR = sort.ArtNr;
|
|
item.ArtikelName = sort.ArtName;
|
|
item.Stand = 0;
|
|
item.Fehlmenge = 0;
|
|
item.Korrektur = 0;
|
|
|
|
if (item.Save() == 1) saved++;
|
|
}
|
|
else ++artvorhanden;
|
|
|
|
}
|
|
|
|
}
|
|
// Überprüfung ob alle Zeilen gespeichert wurden.
|
|
if (tosave == saved)
|
|
{
|
|
meldung.Gespeichert();
|
|
meldung.VerarbeiteteDaten(saved, anzahlkunden, artvorhanden);
|
|
}
|
|
else meldung.Speicherfehler();
|
|
}
|
|
private void Update_Artikel(IProgress<int> progress, List<Sortiment> sortiment, List<Artikel> artikelkurzliste)
|
|
{
|
|
int i = 0;
|
|
|
|
//TODO: Artikel Update weiter testen und programmieren. Für ArtikelKurzliste ausprogrammieren.
|
|
if (artikelkurzliste == null)
|
|
{
|
|
foreach (Sortiment sort in sortiment)
|
|
{
|
|
// Fortschrittswert an die ProgressBar melden
|
|
progress.Report(++i);
|
|
|
|
if (sort.ArtNr != 0)
|
|
{
|
|
Artikel art = Artikel.GetArtikel(sort.ArtNr);
|
|
if (art.ArtikelID == null)
|
|
{
|
|
art = new Artikel();
|
|
art.Nummer = sort.ArtNr;
|
|
art.Bezeichnung = sort.ArtName;
|
|
art.Nachwaesche = 0;
|
|
art.Muellwaesche = 0;
|
|
art.LastReset = null;
|
|
|
|
//Switch für ArtikelKategorie
|
|
switch (sort.ArtNr)
|
|
{
|
|
case var nr when nr.ToString().StartsWith("63"):
|
|
art.Kategorie = ArtikelKategorie.Frottee;
|
|
break;
|
|
case var nr when nr.ToString().StartsWith("611"):
|
|
if (nr.ToString().StartsWith("61115") || nr.ToString().StartsWith("61116")) art.Kategorie = ArtikelKategorie.Spannleintuch;
|
|
else art.Kategorie = ArtikelKategorie.Grossteile;
|
|
break;
|
|
case var nr when nr.ToString().StartsWith("612"):
|
|
art.Kategorie = ArtikelKategorie.Kleinteile;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//Erstellen der Shortbezeichnung für Buttons
|
|
if (art.Bezeichnung.Contains("DOPPEL") | art.Bezeichnung.Contains("D-")) art.Short = art.Short + "D-";
|
|
if (art.Bezeichnung.Contains("SPANN")) art.Short = art.Short + "SP";
|
|
if (art.Bezeichnung.Contains("LEINTUCH")) art.Short = art.Short + "LT";
|
|
if (art.Bezeichnung.Contains("SPANN"))
|
|
{
|
|
string[] s = art.Bezeichnung.Split(' ');
|
|
if (s.Length == 3) art.Short = art.Short + " " + s[2];
|
|
} //Farben zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("HANDTUCH")) art.Short = art.Short + "HT";
|
|
if (art.Bezeichnung.Contains("DUSCHTUCH")) art.Short = art.Short + "DT";
|
|
if (art.Bezeichnung.Contains("BADETUCH")) art.Short = art.Short + "BT";
|
|
if (art.Bezeichnung.Contains("BADEVORLEGER")) art.Short = art.Short + "BV";
|
|
if (art.Bezeichnung.Contains("BADEMANTEL")) art.Short = art.Short + "BM";
|
|
if (art.Bezeichnung.Contains("SAUNATUCH")) art.Short = art.Short + "ST";
|
|
if (art.Bezeichnung.Contains("GESICHTSTUCH")) art.Short = art.Short + "GT";
|
|
if (art.Bezeichnung.Contains("POLSTERBEZUG"))
|
|
{
|
|
art.Short = art.Short + "PB";
|
|
switch (art.Bezeichnung)
|
|
{
|
|
case var bez when bez.Contains("60x80"):
|
|
art.Short = art.Short + " 60x80";
|
|
break;
|
|
case var bez when bez.Contains("40x60"):
|
|
art.Short = art.Short + " 40x60";
|
|
break;
|
|
case var bez when bez.Contains("40x40"):
|
|
art.Short = art.Short + " 40x40";
|
|
break;
|
|
case var bez when bez.Contains("40x50"):
|
|
art.Short = art.Short + " 40x50";
|
|
break;
|
|
case var bez when bez.Contains("40x70"):
|
|
art.Short = art.Short + " 40x70";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} //Größen zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("DECKENBEZUG")) art.Short = art.Short + "DB";
|
|
if (art.Bezeichnung.Contains("TISCHTUCH"))
|
|
{
|
|
art.Short = art.Short + "TT";
|
|
int index = art.Bezeichnung.IndexOf("x");
|
|
if (index > 0) art.Short = art.Short + art.Bezeichnung.Substring(index - 4, 8);
|
|
} //Tischtücher und Größen zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("MUNDSERVIETTE")) art.Short = art.Short + "MS";
|
|
if (art.Bezeichnung.Contains("DECKSERVIETTE")) art.Short = art.Short + "DS";
|
|
|
|
//Speichern jedes Artikels
|
|
art.Save();
|
|
}
|
|
else
|
|
{
|
|
art.Bezeichnung = sort.ArtName;
|
|
|
|
art.Save();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
foreach (Artikel artikel in artikelkurzliste)
|
|
{
|
|
// Fortschrittswert an die ProgressBar melden
|
|
progress.Report(++i);
|
|
Artikel art = Artikel.GetArtikel(artikel.Nummer);
|
|
if (art == null) artikel.Save();
|
|
else
|
|
{
|
|
art.Bezeichnung = artikel.Bezeichnung;
|
|
art.Short = artikel.Short;
|
|
switch (artikel.Nummer)
|
|
{
|
|
case var nr when nr.ToString().StartsWith("63"):
|
|
art.Kategorie = ArtikelKategorie.Frottee;
|
|
break;
|
|
case var nr when nr.ToString().StartsWith("611"):
|
|
if (nr.ToString().StartsWith("61115") || nr.ToString().StartsWith("61116")) art.Kategorie = ArtikelKategorie.Spannleintuch;
|
|
else art.Kategorie = ArtikelKategorie.Grossteile;
|
|
break;
|
|
case var nr when nr.ToString().StartsWith("612"):
|
|
art.Kategorie = ArtikelKategorie.Kleinteile;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//Erstellen der Shortbezeichnung für Buttons
|
|
if (art.Bezeichnung.Contains("DOPPEL") | art.Bezeichnung.Contains("D-")) art.Short = art.Short + "D-";
|
|
if (art.Bezeichnung.Contains("SPANN")) art.Short = art.Short + "SP";
|
|
if (art.Bezeichnung.Contains("LEINTUCH")) art.Short = art.Short + "LT";
|
|
if (art.Bezeichnung.Contains("SPANN"))
|
|
{
|
|
string[] s = art.Bezeichnung.Split(' ');
|
|
if (s.Length == 3) art.Short = art.Short + " " + s[2];
|
|
} //Farben zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("HANDTUCH")) art.Short = art.Short + "HT";
|
|
if (art.Bezeichnung.Contains("DUSCHTUCH")) art.Short = art.Short + "DT";
|
|
if (art.Bezeichnung.Contains("BADETUCH")) art.Short = art.Short + "BT";
|
|
if (art.Bezeichnung.Contains("BADEVORLEGER")) art.Short = art.Short + "BV";
|
|
if (art.Bezeichnung.Contains("BADEMANTEL")) art.Short = art.Short + "BM";
|
|
if (art.Bezeichnung.Contains("SAUNATUCH")) art.Short = art.Short + "ST";
|
|
if (art.Bezeichnung.Contains("GESICHTSTUCH")) art.Short = art.Short + "GT";
|
|
if (art.Bezeichnung.Contains("POLSTERBEZUG"))
|
|
{
|
|
string extra;
|
|
int index = art.Bezeichnung.IndexOf(" ") + 1;
|
|
int length = art.Bezeichnung.IndexOf(" ", index + 1) - index;
|
|
|
|
art.Short = art.Short + "PB";
|
|
if (index > 0 & length > 0)
|
|
{
|
|
extra = art.Bezeichnung.Substring(index, length);
|
|
art.Short += " " + extra;
|
|
}
|
|
|
|
switch (art.Bezeichnung)
|
|
{
|
|
case var bez when bez.Contains("60x80"):
|
|
art.Short = art.Short + " 60x80";
|
|
break;
|
|
case var bez when bez.Contains("40x60"):
|
|
art.Short = art.Short + " 40x60";
|
|
break;
|
|
case var bez when bez.Contains("40x40"):
|
|
art.Short = art.Short + " 40x40";
|
|
break;
|
|
case var bez when bez.Contains("40x50"):
|
|
art.Short = art.Short + " 40x50";
|
|
break;
|
|
case var bez when bez.Contains("40x70"):
|
|
art.Short = art.Short + " 40x70";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} //Größen zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("DECKENBEZUG"))
|
|
{
|
|
string extra;
|
|
int index = art.Bezeichnung.IndexOf(" ") + 1;
|
|
int length = art.Bezeichnung.IndexOf(" ", index + 1) - index;
|
|
|
|
art.Short = art.Short + "DB";
|
|
if (index > 0 & length > 0)
|
|
{
|
|
extra = art.Bezeichnung.Substring(index, length);
|
|
art.Short += " " + extra;
|
|
}
|
|
|
|
}
|
|
if (art.Bezeichnung.Contains("TISCHTUCH"))
|
|
{
|
|
art.Short = art.Short + "TT";
|
|
int index = art.Bezeichnung.IndexOf("x");
|
|
if (index > 0) art.Short = art.Short + art.Bezeichnung.Substring(index - 4, 8);
|
|
} //Tischtücher und Größen zuordnen und zu Short hinzufügen
|
|
if (art.Bezeichnung.Contains("MUNDSERVIETTE")) art.Short = art.Short + "MS";
|
|
if (art.Bezeichnung.Contains("DECKSERVIETTE")) art.Short = art.Short + "DS";
|
|
|
|
art.Save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
private void buttonAllUpdate_Click(object sender, EventArgs e)
|
|
{
|
|
//Update_Artikel();
|
|
}
|
|
|
|
/// <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.Today;
|
|
a.ErledigtVon = this.benutzer.BenutzerID;
|
|
a.Status = AuftragStatus.Ausgeliefert;
|
|
|
|
if (a.Save()[0] == 1) ++saved;
|
|
}
|
|
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.Status = AuftragStatus.AufAbruf;
|
|
|
|
if (a.Save()[0] == 1) GetExpeditList(null);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
meldung.NurEinAuftrag();
|
|
}
|
|
}
|
|
private void objectListViewAuftrag_ItemChecked(object sender, ItemCheckedEventArgs e)
|
|
{
|
|
if (this.objectListViewAuftrag.CheckedItems.Count > 0) this.buttonAusgeliefert.Visible = true;
|
|
if (this.objectListViewAuftrag.CheckedItems.Count == 1) this.buttonAufAbruf.Visible = true;
|
|
else this.buttonAufAbruf.Visible = false;
|
|
|
|
}
|
|
|
|
/// <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;
|
|
case AuftragStatus.AufAbruf:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
default:
|
|
GetExpeditList((int?)rB.Tag);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
private async void GetExpeditList(int? status)
|
|
{
|
|
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();
|
|
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();
|
|
}
|
|
|
|
/// <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");
|
|
colFrottee.Text = "FR";
|
|
colFrottee.DisplayIndex = 6;
|
|
colFrottee.TextAlign = HorizontalAlignment.Center;
|
|
colFrottee.CheckBoxes = false;
|
|
colFrottee.TriStateCheckBoxes = false;
|
|
colFrottee.Width = 50;
|
|
colFrottee.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");
|
|
colKleinteile.Text = "KT";
|
|
colKleinteile.DisplayIndex = 7;
|
|
colKleinteile.TextAlign = HorizontalAlignment.Center;
|
|
colKleinteile.CheckBoxes = false;
|
|
colKleinteile.TriStateCheckBoxes = false;
|
|
colKleinteile.Width = 50;
|
|
colKleinteile.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");
|
|
colGrosseTeile.Text = "GT";
|
|
colGrosseTeile.DisplayIndex = 8;
|
|
colGrosseTeile.TextAlign = HorizontalAlignment.Center;
|
|
colGrosseTeile.CheckBoxes = false;
|
|
colGrosseTeile.TriStateCheckBoxes = false;
|
|
colGrosseTeile.Width = 50;
|
|
colGrosseTeile.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.DisplayIndex = 0;
|
|
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
|
|
};
|
|
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 "Auswählen":
|
|
col.IsVisible = false;
|
|
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);
|
|
|
|
this.objectListViewAuftrag = Funktionen.Columns_Resize(null, this.objectListViewAuftrag).olv;
|
|
|
|
// Cursor auf Default-Status setzen, um Benutzerfeedback zu geben
|
|
this.Cursor = Cursors.Default;
|
|
|
|
}
|
|
private void FormMain_HelpButtonClicked(object sender, CancelEventArgs e)
|
|
{
|
|
string[] keys = {
|
|
"Aufgelegt",
|
|
"Hergerichtet",
|
|
"Fertig" };
|
|
|
|
string[] keytext = {
|
|
"Auftrag wurde erstellt aber noch nicht ferig hergerichtet",
|
|
"Auftrag wurde fertig hergerichtet aber nicht abgeschlossen. Containeranzahl kann noch bearbeitet werden.",
|
|
"Auftrag wurde abgeschlossen und kann nichtmehr bearbeitet werden."};
|
|
|
|
FormHelp help = new FormHelp(keys, keytext);
|
|
help.ShowDialog();
|
|
//e.Cancel = true;
|
|
|
|
}
|
|
private void tSBHilfe_Click(object sender, EventArgs e)
|
|
{
|
|
FormMain_HelpButtonClicked(this, null);
|
|
}
|
|
private void GetStatistik()
|
|
{
|
|
string[] statistik = { "Container gewaschen:", "Container abgeschlossen:", "Container abgeholt:", "Kunden gewaschen:", "Kunden abgeschlossen:", "Kunden abgeholt:" };
|
|
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.Gewaschen) 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.Abgeholt) j += a.ContainerClean;
|
|
lbl.Text = j.ToString();
|
|
break;
|
|
case var s when s.Contains($"4"):
|
|
foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Gewaschen) 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.Abgeholt) j++;
|
|
lbl.Text = j.ToString();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//this.groupBoxStatistik.Width = this.tableLayoutPanelStatistik.Right;
|
|
|
|
}
|
|
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 dateTimePicker1_CloseUp(object sender, EventArgs e)
|
|
{
|
|
GetStatistik();
|
|
}
|
|
|
|
/// <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)) return;
|
|
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)
|
|
{
|
|
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;
|
|
}
|
|
|
|
// 2. ALLE Children (rekursiv) - auch Child of Child!
|
|
foreach (Control child in parent.Controls)
|
|
{
|
|
// 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 buttonBase)
|
|
{
|
|
//buttonBase.PerformClick(); // Löst Childs Click-Event aus
|
|
return;
|
|
}
|
|
|
|
GroupBox 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)
|
|
{
|
|
GroupBox gb = FindParentGroupBox((Control)sender);
|
|
if (gb != null && isDragging && draggedBox == gb)
|
|
{
|
|
groupBox_MouseMove(gb, e);
|
|
}
|
|
}
|
|
private void Child_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
GroupBox gb = FindParentGroupBox((Control)sender);
|
|
if (gb != null && isDragging && draggedBox == gb)
|
|
{
|
|
groupBox_MouseUp(gb, e); // ← Dragging beenden!
|
|
}
|
|
}
|
|
private GroupBox FindParentGroupBox(Control control)
|
|
{
|
|
while (control != null)
|
|
{
|
|
if (control is GroupBox) return (GroupBox)control;
|
|
control = control.Parent;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <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();
|
|
}
|
|
|
|
/// <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;
|
|
_settings.LocationGroupBoxStatistik = this.groupBoxStatistik.Location;
|
|
|
|
_settings.OLV_State = this.objectListViewAuftrag.SaveState();
|
|
_settings.Save();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
MessageBox.Show("Fehler beim Speichern" + ex.Message);
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
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 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();
|
|
}
|
|
}
|
|
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 void panelMain_Resize(object sender, EventArgs e)
|
|
{
|
|
panelMain.Invalidate();
|
|
}
|
|
|
|
private void FormMain_Shown(object sender, EventArgs e)
|
|
{
|
|
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.
|
|
//CHANGES: Saisonauswahl DropDown eingefügt. Wenn Zwischensaison gewählt wir Warnung wegen falschen Liefertagen gezeigt. Sonst wird Saisonrhythmus als Liefertag beachtet.
|
|
//CHANGES: Artikelliste und Kundenliste werden automatisch importiert wenn vorhanden.
|
|
//CHANGES: Datum von letztem Import verfügbar.
|
|
//TODO: Dateinamen aus Tikos anschauen. Eventuell Datum von letztem Import über Dateiname wählen?
|
|
//TODO: JSON nach angemeldeten Fahrer durchsuchen und Kundenliste des aktuellen Wochentag anzeigen.
|
|
//TODO: Auftrag Schnellerfassung erstellen. Kundenliste aus JSON in OLV einfügen wenn schmutzig > 0 dann Auftrag erstellen. Spalten: "Kunde, schmutzig, liefertag, zustellfahrer" evnetuell in AuftragVW? |