using AForge.Video.DirectShow; using BrightIdeasSoftware; using DatenDB; using Deckungsbeitrag.AA_Forms; using Deckungsbeitrag.AA_Klassen; using Deckungsbeitrag.UserControls; using Spire.Barcode; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using ZXing; namespace Deckungsbeitrag { public partial class FormKundeVW : Form { private FilterInfoCollection videoDevices; List sortimentListe = null; List standListe = null; Kunde kunde = null; Image qrcode = null; private readonly Meldungen meldung = new Meldungen(); private readonly Benutzer benutzer; int beforeedit = 0; private bool formloading = false; private DataGridView.HitTestInfo _hitInfo; public bool aufgabeErledigt = false; public bool _tosave = false; private bool _tosaveInventur = false; public bool TosaveInventur { get { return _tosaveInventur; } set { _tosaveInventur = value; if (_tosaveInventur & dateTimePickerInventur.Checked & dateTimePickerLiefertag.Checked) { buttonFreigeben.Enabled = true; buttonFreigeben.BackColor = Color.FromArgb(0, 192, 0); } else { buttonFreigeben.Enabled = false; buttonFreigeben.BackColor = Color.Gray; } } } private bool _tosaveStand = false; public bool TosaveStand { get { return _tosaveStand; } set { _tosaveStand = value; if (_tosaveStand) { buttonSpeichern.Enabled = true; buttonSpeichern.BackColor = Color.FromArgb(0, 192, 0); } else { buttonSpeichern.Enabled = false; buttonSpeichern.BackColor = Color.Gray; } } } public FormKundeVW() { InitializeComponent(); } public FormKundeVW(Kunde kunde) :this() { this.kunde = kunde; } public FormKundeVW(Benutzer benutzer) : this() { this.benutzer = benutzer; } public FormKundeVW(Kunde kunde, Benutzer benutzer) : this(kunde) { this.benutzer = benutzer; } private void KundeDaten_Load(object sender, EventArgs e) { formloading = true; videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); //Sortiment Liste erstellen. sortimentListe = Funktionen.SortimentLesen("Liste"); //Alle TextBoxen deaktivieren. TextBoxes_Unable(); labelAnzahlChars.Text = textBoxAnmerkung.TextLength.ToString() + "/" + textBoxAnmerkung.MaxLength.ToString(); this.labelAnzahlChars.Location = new Point(this.textBoxAnmerkung.Right - this.labelAnzahlChars.Width, this.labelAnzahlChars.Location.Y); this.tabControlKunde.Location = new Point(this.textBoxAnmerkung.Right + 10, 11); //this.tabControlKunde.TabPages.Remove(tabPageArtikel); ComboBox_Laden(); if (this.kunde == null) this.kunde = Funktionen.KundenAuswahl(); if (this.kunde != null) DatenLesen(); else this.Close(); } private void FormKundeVW_Shown(object sender, EventArgs e) { this.tabControlKunde.Width = this.ClientSize.Width - tabControlKunde.Left - 10; } private void ComboBox_Laden() { // Service Liste erstellen und mit ComboBox verknüpfen. this.comboBoxService.Enabled = false; List list = Kunde.GetServiceDistinct(); this.comboBoxService.DataSource = list; // Aufgaben Liste erstellen und mit ComboBox verknüpfen. List aufgabenlist1 = Aufgabe.GetList(2); this.comboBoxAufgabe.DataSource = aufgabenlist1; this.comboBoxAufgabe.DisplayMember = "Bezeichnung"; this.comboBoxAufgabe.SelectedIndex = -1; this.comboBoxAufgabe.Enabled = false; // Sommer-Lieferrhythmus Liste mit ComboBox verknüpfen. this.comboBoxLRSommer.DataSource = new BindingSource(Lieferrhythmen.AnzeigeNamen, null); this.comboBoxLRSommer.DisplayMember = "Key"; this.comboBoxLRSommer.ValueMember = "Value"; // WinterLieferrhythmus Liste mit ComboBox verknüpfen. this.comboBoxLRWinter.DataSource = new BindingSource(Lieferrhythmen.AnzeigeNamen, null); this.comboBoxLRWinter.DisplayMember = "Key"; this.comboBoxLRWinter.ValueMember = "Value"; } private void DatenLesen() { formloading = true; //TextBoxen deaktivieren. TextBoxes_Unable(); //Alle Einträge der DataGridView entfernen. Davor muss die DataSource entfernt werden. this.dGArtikel.DataSource = null; this.dGArtikel.Rows.Clear(); //ComboBox für Sonderaufgaben wie "In Säcke Verpacken". this.comboBoxAufgabe.Enabled = true; //Properties für Standliste. //sortNr ist falls noch kein Stand hinterlegt wurde string sortNr = string.Empty; //kundeid ist falls bereits ein Stand existiert und die Artikel gespeichert wurden. string kundeid = this.kunde.KundeID.ToString(); this.standListe = KundeArtikel.GetList(kundeid); // Wenn bereits ein Stand gespeichert ist, kommt er aus der DB. Wenn kein Stand gespeichert kommt Liste aus Sortiment. if (this.standListe.Count > 0) { CompareToSortiment(); Load_Gridview(this.standListe); if (this.benutzer.Rolle == BenutzerRolle.Admin) this.dGArtikel.Enabled = true; else this.dGArtikel.Enabled = false; } else { //Jedes Innsbrucker Soziale Dienste Sortiment ist gleich. if (this.kunde.KundeNummer == "010069" | this.kunde.KundeNummer == "010071") sortNr = "010068"; else sortNr = this.kunde.KundeNummer; //Sortiment holen und Standliste filtern. standListe = new List(); int reihung = 1; foreach (Sortiment sort in sortimentListe.FindAll(Sortiment => Sortiment.KundeNummer == sortNr)) { if (sort.ArtName.Contains("*EK")) continue; KundeArtikel item = new KundeArtikel { ArtikelNR = sort.ArtNr, ArtikelName = sort.ArtName, KundeID = Kunde.GetKundeID(sort.KundeNummer, null), ArtikelID = Artikel.GetArtikelID(sort.ArtNr), Reihung = reihung }; standListe.Add(item); reihung++; } if (standListe.Count == 0) this.tabControlKunde.Controls.Remove(tabPageArtikel); standListe = standListe.OrderBy(x => x.Reihung).ToList(); //GridView mit der jeweiligen Liste füllen. Load_Gridview(standListe); if (this.benutzer.Rolle == BenutzerRolle.Admin) this.dGArtikel.Enabled = true; else this.dGArtikel.Enabled = false; } // QR-Code wird erstellt BarcodeWriter code = new BarcodeWriter { Format = BarcodeFormat.QR_CODE }; qrcode = code.Write(this.kunde.KundeNummer); this.pictureBoxQRCode.Image = qrcode; this.pictureBoxQRCode.SizeMode = PictureBoxSizeMode.Zoom; // SWS-Entwurf wird erstellt und angezeigt this.pictureBoxEntwurf.Image = Funktionen.SWS_Entwurf(null, this.kunde); this.pictureBoxEntwurf.Visible = true; // Restliche TextBoxen werden befüllt this.textBoxKndNr.Text = this.kunde.KundeNummer; this.textBoxKundeName.Text = this.kunde.KundeName; this.textBoxKndName2.Text = this.kunde.KundeName2; this.textBoxStraße.Text = this.kunde.Strasse; this.textBoxPLZ.Text = this.kunde.PLZ.ToString(); this.textBoxOrt.Text = this.kunde.Ort; this.textBoxSuchtext.Text = this.kunde.Suchtext; this.textBoxAnmerkung.Text = this.kunde.Anmerkung; // CheckBox aktivieren this.checkBoxNW.Checked = this.kunde.HatNachwaesche; // ComboBox-Item für Aufgabe wird gewählt und Button Entfernen aktiviert foreach (Aufgabe auf in comboBoxAufgabe.Items) if (auf.AufgabeID == this.kunde.Aufgabe) this.comboBoxAufgabe.SelectedItem = auf; if (this.comboBoxAufgabe.SelectedItem != null) this.buttonAufgEnt.Enabled = true; // ComboBox-Item für Service wird gewählt if (!string.IsNullOrWhiteSpace(this.kunde.Service)) { foreach (string s in comboBoxService.Items) if (s == this.kunde.Service) this.comboBoxService.SelectedItem = s; } this.comboBoxLRSommer.SelectedIndexChanged -= ComboBoxLieferrhythmus_SelectedIndexChanged; this.comboBoxLRWinter.SelectedIndexChanged -= ComboBoxLieferrhythmus_SelectedIndexChanged; this.comboBoxAufgabe.SelectedIndexChanged -= ComboBoxAufgabe_SelectedIndexChanged; // ComboBox-Item für Lieferrhythmus wird gewählt this.comboBoxLRSommer.SelectedValue = (Liefertage)this.kunde.SommerLieferRhythmus; this.comboBoxLRWinter.SelectedValue = (Liefertage)this.kunde.WinterLieferRhythmus; if (this.kunde.Aufgabe == null) this.comboBoxAufgabe.SelectedIndex = -1; else this.comboBoxAufgabe.SelectedItem = Aufgabe.GetAufgabe(null, this.kunde.Aufgabe); this.comboBoxAufgabe.SelectedIndexChanged += ComboBoxAufgabe_SelectedIndexChanged; this.comboBoxLRSommer.SelectedIndexChanged += ComboBoxLieferrhythmus_SelectedIndexChanged; this.comboBoxLRWinter.SelectedIndexChanged += ComboBoxLieferrhythmus_SelectedIndexChanged; // numericUpDown für AufgabeCount befüllen this.numericUpDownAufgabeCount.Value = (decimal)this.kunde.AufgabeCount; // Wird noch nicht verwendet this.buttonProgramm.Text = "WP 01"; // Buttons und ähnliches aktivieren. this.buttonProgramm.Enabled = true; this.buttonBewertung.Enabled = true; this.tabControlKunde.Enabled = true; OLV_Load(); Chart_Load(); this.tabControlKunde.SelectedIndex = 0; formloading = false; } private void CompareToSortiment() { int reihung = 1; Kunde _kunde = Kunde.GetKunde(null, this.standListe[0].KundeID, null); List _sortListe = new List(); foreach (Sortiment sort in sortimentListe.FindAll(Sortiment => Sortiment.KundeNummer == _kunde.KundeNummer)) _sortListe.Add(sort); if (_sortListe.Count == this.standListe.Count && this.standListe[0].ArtikelID == null || this.standListe[0].Reihung == 0) { foreach (Sortiment sort in _sortListe) { //if (sort.ArtName.Contains("*EK")) continue; KundeArtikel kndart = this.standListe.Find(s => s.ArtikelNR == sort.ArtNr); kndart.ArtikelID = Artikel.GetArtikelID(sort.ArtNr); kndart.Reihung = reihung; kndart.Save(); reihung++; } } else { if (_sortListe.Count > this.standListe.Count) { int reih = 1; foreach (Sortiment sort in _sortListe) { KundeArtikel kndart = this.standListe.Find(s => s.ArtikelNR == sort.ArtNr); if (kndart == null) { kndart = new KundeArtikel { ArtikelNR = sort.ArtNr, ArtikelName = sort.ArtName, KundeID = Kunde.GetKundeID(sort.KundeNummer, null), ArtikelID = Artikel.GetArtikelID(sort.ArtNr), }; standListe.Add(kndart); } kndart.Reihung = reih; kndart.Save(); reih++; } } } this.standListe = this.standListe.OrderBy(x => x.Reihung).ToList(); } /// /// TextBox Events /// private void TextBoxes_Unable() { foreach (Control ctr in this.Controls) if (ctr is TextBox) { if (!ctr.Name.Contains("Anmerkung")) ctr.Enabled = false; } } private void TextBoxKndNr_Leave(object sender, EventArgs e) { } private void TSBBeenden_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Close(); } private void ButtonDrucken_Click(object sender, EventArgs e) { Funktionen.SWS_Drucken(null, this.kunde, this); } private void TSBNext_Click(object sender, EventArgs e) { SaveChanges(); // Kundenliste öffnen und Kunde auswählen. this.kunde = Funktionen.KundenAuswahl(); if (kunde != null) DatenLesen(); } private void SaveChanges() { if (_tosave) { if (this.comboBoxAufgabe.SelectedItem != null && this.numericUpDownAufgabeCount.Value == 0) { meldung.GetFehler(this, $"Du hast für deine Aufgabe noch keine Auftraganzahl eingegeben. Hole das bitte jetzt nach."); return; } if (this.comboBoxAufgabe.SelectedItem == null && this.numericUpDownAufgabeCount.Value > 0) { meldung.GetFehler(this, "Du hast noch keine Aufgabe ausgewählt. Hole das bitte jetzt nach."); return; } if (MessageBox.Show("Möchtest du die Änderungen speichern?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.kunde.Save(); _tosave = false; } if (TosaveInventur) { if (MessageBox.Show("Du hast die Inventur noch nicht gespeichert, möchtest du diese jetzt speichern?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) ButtonFreigeben_Click(buttonFreigeben, null); TosaveInventur = false; } } private void ButtonProgramm_Click(object sender, EventArgs e) { } private void ButtonAufgEnt_Click(object sender, EventArgs e) { if (MessageBox.Show("Möchtest du die Aufgabe wirklich löschen?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.comboBoxAufgabe.SelectedIndex = -1; this.kunde.Aufgabe = null; this.kunde.Save(); } } private void OLV_Load() { foreach(ObjectListView olv in this.Controls.OfType()) { olv.HeaderFormatStyle = Funktionen.GetHeader(); olv.OwnerDraw = true; Generator.GenerateColumns(olv, typeof(OLVKundenumsatz), true); if (olv.Name.Contains("Jahresumsatz")) { foreach (OLVColumn c in olv.Columns) if (c.Name == "Zeitraum") c.Text = "Jahr"; olv.SetObjects(OLVKundenumsatz.GetJahresumsatz(this.kunde.KundeID)); } if (olv.Name.Contains("Quartalsumsatz")) { foreach (OLVColumn c in olv.Columns) if (c.Name == "Zeitraum") c.Text = "Quartal"; olv.SetObjects(OLVKundenumsatz.GetQuartalsumsatz(this.kunde.KundeID)); } if (olv.Name.Contains("Monatsumsatz")) { foreach (OLVColumn c in olv.Columns) if (c.Name == "Zeitraum") c.Text = "Monat"; olv.SetObjects(OLVKundenumsatz.GetMonatsumsatz(this.kunde.KundeID)); } } } private void Chart_Load() { foreach (Chart chart in this.Controls.OfType()) chart.Visible = true; //IMPLEMENTIEREN ClassChart ch = ClassChart.FillChart(this.kunde.KundeID); //Chart Jahresumsatz List olv = OLVKundenumsatz.GetJahresumsatz(this.kunde.KundeID); string[] x = new string[olv.Count()]; double[] y = new double[olv.Count()]; for (int i = 0; i < y.Length; i++) { y[i] = olv[i].Umsatz; x[i] = olv[i].Zeitraum; } this.chartJahresumsatz.Series[0].LegendText = "Umsatz"; this.chartJahresumsatz.Series[0].ChartType = SeriesChartType.Column; this.chartJahresumsatz.Series[0].IsValueShownAsLabel = true; this.chartJahresumsatz.Series[0].Points.DataBindXY(x, y); //Chart Quartalsumsatz List olvq = OLVKundenumsatz.GetQuartalsumsatz(this.kunde.KundeID); string[] xq = new string[olvq.Count()]; double[] yq = new double[olvq.Count()]; for (int i = 0; i < olvq.Count(); i++) { yq[i] = olvq[i].Umsatz; xq[i] = olvq[i].Zeitraum; } this.chartQuartalsumsatz.Series[0].LegendText = "Umsatz"; this.chartQuartalsumsatz.Series[0].ChartType = SeriesChartType.Bar; this.chartQuartalsumsatz.Series[0].IsValueShownAsLabel = true; this.chartQuartalsumsatz.Series[0].Points.DataBindXY(xq, yq); } private void ComboBoxAufgabe_DropDownClosed(object sender, EventArgs e) { } private void KundeDaten_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.End) TSBNext_Click(this, e); } /// /// Events für ShortCut zu "Nächster Kunde" /// /// /// private void NaechsterKundeToolStripMenuItem_Click(object sender, EventArgs e) { TSBNext_Click(this, e); } /// /// Laden der DataGridView zur Stand und Fehlmengenverwaltung. /// /// private void Load_Gridview(List objectListe) { if (objectListe.Count > 0) { this.dGArtikel.AutoGenerateColumns = false; foreach (DataGridViewColumn col in this.dGArtikel.Columns) { col.DataPropertyName = col.Name; } // DataGridView mit ArtikelStand Liste verbinden und Columns automatisch generieren. this.dGArtikel.DataSource = objectListe; this.dGArtikel.ClearSelection(); this.dGArtikel.CurrentCell = this.dGArtikel.Rows[0].Cells[3]; // Alle Spaltenbreiten an den Zellinhalt anpassen this.dGArtikel.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // Alle Zeilenhöhen an Zellinhalt anpassen this.dGArtikel.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; } } /// /// Speichern von Stand und Fehlmengenänderungen. /// /// /// private void StandSpeichernToolStripMenuItem_Click(object sender, EventArgs e) { int tosave = 0; int toupdate = 0; int saved = 0; this.dGArtikel.EndEdit(); // Speichern der Zeilen aus der DataGridView foreach(DataGridViewRow row in this.dGArtikel.Rows) { KundeArtikel item = KundeArtikel.GetItemIfAvailable(int.Parse(row.Cells[1].Value.ToString()), int.Parse(row.Cells[2].Value.ToString())); if(item != null) { ++toupdate; if (int.Parse(row.Cells[4].Value.ToString()) != 0) { item.Stand = int.Parse(row.Cells[4].Value.ToString()); item.StandBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[5].Value.ToString()) != 0) { item.Fehlmenge = int.Parse(row.Cells[5].Value.ToString()); item.FehlmengeBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[6].Value.ToString()) != 0) { item.Reklamation = int.Parse(row.Cells[6].Value.ToString()); item.ReklamationBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[7].Value.ToString()) != 0) { item.Korrektur = int.Parse(row.Cells[7].Value.ToString()); item.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (item.Save() == 1) saved++; } else { ++tosave; item.KundeArtikelID = null; item.KundeID = int.Parse(row.Cells[1].Value.ToString()); item.ArtikelNR = int.Parse(row.Cells[2].Value.ToString()); item.ArtikelName = row.Cells[3].Value.ToString(); if (int.Parse(row.Cells[4].Value.ToString()) != 0) { item.Stand = int.Parse(row.Cells[4].Value.ToString()); item.StandBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[5].Value.ToString()) != 0) { item.Fehlmenge = int.Parse(row.Cells[5].Value.ToString()); item.FehlmengeBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[6].Value.ToString()) != 0) { item.Reklamation = int.Parse(row.Cells[6].Value.ToString()); item.ReklamationBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (int.Parse(row.Cells[7].Value.ToString()) != 0) { item.Korrektur = int.Parse(row.Cells[7].Value.ToString()); item.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (item.Save() == 1) saved++; } } // Überprüfung ob alle Zeilen gespeichert wurden. if ((toupdate + tosave) == saved) meldung.Gespeichert(); else meldung.Speicherfehler(); Load_Gridview(this.standListe); } private void DGArtikel_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView dataGrid = sender as DataGridView; beforeedit = int.Parse(dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()); } private void DGArtikel_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0) { DataGridView dg = sender as DataGridView; DataGridViewRow row = dg.Rows[e.RowIndex]; DataGridViewCell cell = dg.Rows[e.RowIndex].Cells[e.ColumnIndex]; if (cell != null) { // Wenn der Zellenwert sich geändert hat, wird die entsprechende Zahl in der DB upgedatet. if (beforeedit != int.Parse(cell.Value.ToString())) { // Speichern des aktuellen Zellinhaltes. if (row.Cells[0].Value != null) { KundeArtikel item = KundeArtikel.GetItem(int.Parse(row.Cells[0].Value.ToString())); item.KundeArtikelID = int.Parse(row.Cells[0].Value.ToString()); if (row.Cells[e.ColumnIndex].OwningColumn.Name == "Stand") { item.Stand = int.Parse(row.Cells[e.ColumnIndex].Value.ToString()); item.StandBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); TosaveStand = true; } if (row.Cells[e.ColumnIndex].OwningColumn.Name == "Fehlmenge") { item.Fehlmenge = int.Parse(row.Cells[e.ColumnIndex].Value.ToString()); item.FehlmengeBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (row.Cells[e.ColumnIndex].OwningColumn.Name == "Reklamation") { item.Reklamation = int.Parse(row.Cells[e.ColumnIndex].Value.ToString()); //item.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (row.Cells[e.ColumnIndex].OwningColumn.Name == "Korrektur") { item.Korrektur = int.Parse(row.Cells[e.ColumnIndex].Value.ToString()); item.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString(); } if (item.Save() != 1) meldung.Speicherfehler(); } } else { if (row.Cells[e.ColumnIndex].OwningColumn.Name == "Stand") TosaveStand = false; } } } } private void ButtonServiceBearbeiten_Click(object sender, EventArgs e) { if(this.comboBoxService.Enabled == false) this.comboBoxService.Enabled = true; } private void TextBoxAnmerkung_Leave(object sender, EventArgs e) { if (meldung.GetFrage(this, "Möchtest du die Anmerkung speichern?", false) == DialogResult.Yes) { kunde.Anmerkung = textBoxAnmerkung.Text; } } private void NumericUpDownAufgabeCount_Leave(object sender, EventArgs e) { if (meldung.GetFrage(this, $"Möchtest du die Aufgabe für die nächsten {numericUpDownAufgabeCount.Value} Aufträge speichern?", false) == DialogResult.Yes) { if (this.comboBoxAufgabe.SelectedItem == null) { this.kunde.Aufgabe = null; this.kunde.AufgabeCount = null; } else { this.kunde.Aufgabe = ((Aufgabe)this.comboBoxAufgabe.SelectedItem).AufgabeID; this.kunde.AufgabeCount = (int)numericUpDownAufgabeCount.Value; } } } /// /// ValueChanged Events zum Speichern wenn Changed. /// /// /// private void TextBoxAnmerkung_TextChanged(object sender, EventArgs e) { if (formloading) return; _tosave = true; labelAnzahlChars.Text = textBoxAnmerkung.TextLength.ToString() + "/" + textBoxAnmerkung.MaxLength.ToString(); //TextBoxAnmerkung_Leave(this, null); } private void ComboBoxAufgabe_SelectedIndexChanged(object sender, EventArgs e) { if (formloading) return; _tosave = true; } private void NumericUpDownAufgabeCount_ValueChanged(object sender, EventArgs e) { NumericUpDown numeric = (NumericUpDown)sender; if (formloading) return; _tosave = true; } private void ComboBoxService_SelectedValueChanged(object sender, EventArgs e) { if (formloading) return; if (this.comboBoxService.Enabled == true) this.kunde.Service = this.comboBoxService.SelectedValue.ToString(); else return; _tosave = true; } private void ComboBoxLieferrhythmus_SelectedIndexChanged(object sender, EventArgs e) { if (formloading) return; this.kunde.SommerLieferRhythmus = (int)this.comboBoxLRSommer.SelectedValue; this.kunde.WinterLieferRhythmus = (int)this.comboBoxLRWinter.SelectedValue; _tosave = true; } /// /// FormClosing: Wenn Form wird geschlossen, Kontrolle ob Änderungen gemacht wurden. /// /// /// private void FormKundeVW_FormClosing(object sender, FormClosingEventArgs e) { SaveChanges(); } private void CheckBoxNW_Click(object sender, EventArgs e) { if (formloading) return; this.kunde.HatNachwaesche = this.checkBoxNW.Checked; _tosave = true; } #region INVENTUR Tab private void TabControlKunde_SelectedIndexChanged(object sender, EventArgs e) { if (this.tabControlKunde.SelectedTab.Text == "Inventuren") { this.tabControlInventur.Cursor = Cursors.WaitCursor; this.tabControlInventur.SuspendLayout(); string savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren"; if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren"; string delPath = Path.Combine(savePath, $"Warten-{this.kunde.KundeNummer}.csv"); string[] lines = null; if (File.Exists(delPath)) { int i = 0; //int j = 0; lines = File.ReadAllLines(delPath, Encoding.UTF8); this.dateTimePickerInventur.ValueChanged -= DateTimePicker_ValueChanged; this.dateTimePickerLiefertag.ValueChanged -= DateTimePicker_ValueChanged; this.dGVZahlen.Columns.Clear(); this.dGVZahlen.Rows.Clear(); this.dGVZahlen.AllowUserToAddRows = false; // 1. alle Zeilen lesen foreach (string line in lines) { i++; if (i == 1 || i == 2 || i == 3 || i ==6 || i == 7 || i == 8) { if (i == 2 && line.Split(':')[1].Replace(';', ' ').Trim() != this.kunde.KundeNummer) return; else continue; } if (i == 4 && DateTime.TryParse(line.Split(':')[1].Replace(';', ' ').Trim(), out DateTime dt)) dateTimePickerInventur.Value = dt; if (i == 5 && DateTime.TryParse(line.Split(':')[1].Replace(';', ' ').Trim(), out DateTime date)) dateTimePickerLiefertag.Value = date; if (i == 9) { string[] artikel = line.Split(';'); DataGridViewColumn col; for (int x = 0; x < artikel.Length; x++) { if (x == 0) continue; KundeArtikel kndart = KundeArtikel.GetItemIfAvailable((int)this.kunde.KundeID, int.Parse(artikel[x].Split(':')[1])); col = new DataGridViewTextBoxColumn { HeaderText = artikel[x], Name = "col_" + artikel[x], Tag = kndart, ReadOnly = false, SortMode = DataGridViewColumnSortMode.NotSortable }; this.dGVZahlen.Columns.Add(col); } } if (i > 9) { string[] data = line.Split(';'); DataGridViewRow drow = new DataGridViewRow(); drow.CreateCells(this.dGVZahlen); for (int j = 0; j < data.Length; j++) { if (j == 0) drow.HeaderCell.Value = data[0]; else drow.Cells[j - 1].Value = data[j]; } this.dGVZahlen.Rows.Add(drow); } } } else { GetInventurColumns(); GetRowHeader(null); GetOLVItems(); } GetRowLayout(); this.dateTimePickerInventur.ValueChanged += DateTimePicker_ValueChanged; this.dateTimePickerLiefertag.ValueChanged += DateTimePicker_ValueChanged; this.tabControlInventur.ResumeLayout(); this.tabControlInventur.Cursor = Cursors.Default; } } /// /// Laden von alten Inventuren. /// private void GetOldInventuren() { string savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren"; if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren"; string[] invFiles = Directory.GetFiles(savePath, $"*-{this.kunde.KundeNummer}.csv"); string[] lines = null; // Wenn keine Files vorhanden -> RETURN if (invFiles.Length == 0) return; int i = 0; foreach (string s in invFiles) { i++; // Wartende Inventur wird ignoriert. if (s.StartsWith("Warten")) continue; // 1. alle Zeilen lesen lines = File.ReadAllLines(Path.Combine(savePath, s), Encoding.UTF8); // 2. an UCInventur übergeben } } private void GetRowLayout() { foreach (DataGridViewRow row in this.dGVZahlen.Rows) { if (row.HeaderCell.Value == null) continue; switch (row.HeaderCell.Value.ToString()) { case var t when t == "INV-Ausgleich": row.HeaderCell.Style.BackColor = row.DefaultCellStyle.BackColor = Color.Green; row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); row.HeaderCell.Style.ForeColor = row.DefaultCellStyle.ForeColor = Color.White; break; case var t when t == "Schwund": row.HeaderCell.Style.BackColor = row.DefaultCellStyle.BackColor = Color.Red; row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); row.HeaderCell.Style.ForeColor = row.DefaultCellStyle.ForeColor = Color.White; break; case var t when t == "IST-Stand": row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); break; default: break; } } this.dGVZahlen.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); } private void GetRowHeader(string[] datarows) { string[] rows; if (datarows != null) { rows = datarows.ToArray(); } else rows = new string[] { "IST-Stand", "SOLL-Stand", "INV-Ausgleich", "Reklamation", "Nachwäsche", "Schwund" }; this.dGVZahlen.Rows.Clear(); this.dGVZahlen.Rows.Add(rows.Length - 1); foreach (DataGridViewRow row in this.dGVZahlen.Rows) { row.HeaderCell.Value = rows[row.Index]; row.ReadOnly = true; //switch (row.HeaderCell.Value.ToString()) //{ // case var t when t == "INV-Ausgleich": // row.HeaderCell.Style.BackColor = row.DefaultCellStyle.BackColor = Color.Green; // row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); // row.HeaderCell.Style.ForeColor = row.DefaultCellStyle.ForeColor = Color.White; // break; // case var t when t == "Schwund": // row.HeaderCell.Style.BackColor = row.DefaultCellStyle.BackColor = Color.Red; // row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); // row.HeaderCell.Style.ForeColor = row.DefaultCellStyle.ForeColor = Color.White; // break; // case var t when t == "IST-Stand": // row.HeaderCell.Style.Font = row.DefaultCellStyle.Font = new Font(dGVZahlen.Font, FontStyle.Bold); // break; // default: // break; //} } //this.dGVZahlen.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); } private void GetOLVItems() { foreach (DataGridViewColumn col in this.dGVZahlen.Columns) { KundeArtikel kndart = col.Tag as KundeArtikel; foreach (DataGridViewRow row in this.dGVZahlen.Rows) { if (row.HeaderCell.Value?.ToString() == "SOLL-Stand") row.Cells[col.Index].Value = kndart.Stand; if (row.HeaderCell.Value?.ToString() == "Reklamation") row.Cells[col.Index].Value = kndart.Reklamation; if (row.HeaderCell.Value?.ToString() == "Nachwäsche") row.Cells[col.Index].Value = kndart.Fehlmenge; } } } private void GetInventurColumns() { this.dGVZahlen.Columns.Clear(); DataGridViewColumn col; foreach (KundeArtikel kndart in this.standListe) { string text = Artikel.GetShort(kndart.ArtikelID, null); //string text = kndart.ArtikelName; col = new DataGridViewTextBoxColumn { HeaderText = text, Name = "col_" + text, Tag = kndart, ReadOnly = false, SortMode = DataGridViewColumnSortMode.NotSortable }; this.dGVZahlen.Columns.Add(col); } // Alle Spaltenbreiten an den Zellinhalt anpassen this.dGVZahlen.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // Alle Zeilenhöhen an Zellinhalt anpassen this.dGVZahlen.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; } private void PictureBoxPlus_Click(object sender, EventArgs e) { string text; CustomInputBox input = new CustomInputBox("Möchtest du der Tabelle eine Zeile hinzufügen?", "ZÄHLPUNKT HINZUFÜGEN", "Name", "isAlpha"); if (input.ShowDialog() == DialogResult.OK) { text = input.text; } else return; // Neue Zeile mit Daten erstellen DataGridViewRow newRow = new DataGridViewRow(); newRow.CreateCells(this.dGVZahlen); foreach (DataGridViewCell cell in newRow.Cells) cell.Value = 0; newRow.HeaderCell.Value = text; // An Position 2 einfügen (vor bestehender Zeile 2) this.dGVZahlen.Rows.Insert(0, newRow); } private void DeleteRowToolStripMenuItem_Click(object sender, EventArgs e) { if (_hitInfo.RowIndex >= 0 && _hitInfo.ColumnIndex >= 0) { int row = _hitInfo.RowIndex; int col = _hitInfo.ColumnIndex; string wert = dGVZahlen.Rows[row].Cells[col].Value?.ToString(); if (MessageBox.Show($"Möchtest du die Zeile {row + 1} wirklich löschen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.dGVZahlen.Rows.RemoveAt(row); foreach (DataGridViewColumn column in this.dGVZahlen.Columns) DoCalculation(column.Index); } else return; } } private void DGVZahlen_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { _hitInfo = dGVZahlen.HitTest(e.X, e.Y); contextMenuStripGridView.Show(dGVZahlen, e.Location); } } private void DoCalculation(int colIndex) { int istStand = 0; int sollStand = 0; int reklamation = 0; int nachwaesche = 0; int invAusgleich = 0; int istIndex = FindRowByHeaderText("IST-Stand"); foreach (DataGridViewRow row in dGVZahlen.Rows) { if (row.Index < istIndex) istStand += int.Parse(row.Cells[colIndex].Value.ToString()); switch (row.HeaderCell.Value.ToString()) { case var t when t == "SOLL-Stand": sollStand = int.Parse(row.Cells[colIndex].Value.ToString()); break; case var t when t == "INV-Ausgleich": row.Cells[colIndex].Value = invAusgleich = sollStand - istStand; break; case var t when t == "Schwund": row.Cells[colIndex].Value = invAusgleich - reklamation - nachwaesche; break; case var t when t == "IST-Stand": int rowIndex = row.Index; row.Cells[colIndex].Value = istStand; break; case var t when t == "Reklamation": reklamation = int.Parse(row.Cells[colIndex].Value.ToString()); break; case var t when t == "Nachwäsche": nachwaesche = int.Parse(row.Cells[colIndex].Value.ToString()); break; default: break; } } TosaveInventur = true; } private void DGVZahlen_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DoCalculation(e.ColumnIndex); } public int FindRowByHeaderText(string headerText) { foreach (DataGridViewRow row in dGVZahlen.Rows) { if (!row.IsNewRow && row.HeaderCell.Value != null && row.HeaderCell.Value.ToString() == headerText) { return row.Index; } } return -1; // Nicht gefunden } private void ContextMenuStripGridView_Opening(object sender, CancelEventArgs e) { if (_hitInfo.RowIndex >= 0 && _hitInfo.ColumnIndex >= 0) { int row = _hitInfo.RowIndex; int col = _hitInfo.ColumnIndex; if (dGVZahlen.Rows[row].ReadOnly) deleteRowToolStripMenuItem.Enabled = false; else deleteRowToolStripMenuItem.Enabled = true; } } private void ButtonFreigeben_Click(object sender, EventArgs e) { Aufgabe _aufgabe = Aufgabe.GetAufgabe(null, this.kunde.Aufgabe); string savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren"; if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren"; string delPath = Path.Combine(savePath, $"Warten-{this.kunde.KundeNummer}.csv"); SaveInventurToCSV("Speichern", null); // Überprüfen ob die Datei existiert. if (File.Exists(delPath)) { // Wenn gespeichert wurde und die Datei existiert wird gefragt ob die Inventur abgeschlossen werden soll. if (MessageBox.Show("Möchtest du die Inventur abschließen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { // Wenn die Aufgabe INV enthält und AufgabeCount größer 0 ist, kann die Inventur nicht abgeschlossen werden. if (_aufgabe.Bezeichnung != null && _aufgabe.Bezeichnung.Contains("INV") && this.kunde.AufgabeCount > 0) { if (this.kunde.AufgabeCount > 0) { if (MessageBox.Show("Es ist noch eine Aufgabe zu erledigen. Hast du diese gerade erledigt?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; } else { aufgabeErledigt = true; } } int auftragID = ErstelleInventurAuftrag(); SaveInventurToCSV("Abschließen", auftragID); } else { // Wenn nicht Abgeschlossen werden soll. if (!((Aufgabe)comboBoxAufgabe.SelectedItem).Bezeichnung.Contains("INV") || numericUpDownAufgabeCount.Value == 0) { // Wenn die Aufgabe nicht INV enthält oder der Aufgaben-Zähler auf 0 steht, wird abgefragt ob noch Zahlen notwendig sind. if (MessageBox.Show("Die Inventur wurde gespeichert. Brauchst du noch Zahlen von Expedit? Dann erstelle die Aufgabe mit der notwendigen Anzahl.", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { return; } } else { // Wenn alles passt wird gesucht ob ein Auftrag List _auftragListe = Auftrag.FindeAuftragVonKunde(this.kunde, string.Empty, "Inventur", dateTimePickerInventur.Value.Date); if (_auftragListe.Count > 0) { int? i = this.kunde.AufgabeCount; foreach (Auftrag _auftrag in _auftragListe) { if (i > 0) { _auftrag.AufgabeID = this.kunde.Aufgabe; _auftrag.Save(); } i--; } } } } } else { Program.AddFehler(this.benutzer, $"Inventur konnte nicht gespeichert werden.", $"KundeNr: {this.kunde.KundeNummer} Liefertag: {dateTimePickerLiefertag}", null); MessageBox.Show("Die Inventur konnte nicht gespeichert werden. Der Fehler wurde gemeldet.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } TabControlKunde_SelectedIndexChanged(this.tabControlKunde, null); } private int ErstelleInventurAuftrag() { int auftragId = 0; Auftrag inv = new Auftrag() { KundeID = (int)this.kunde.KundeID, ArbeiterID = (int)this.benutzer.BenutzerID, Typ = AuftragTyp.Inventur, Status = AuftragStatus.Herrichten, Erstellt = DateTime.Now, ErstelltVon = (int)this.benutzer.BenutzerID, Liefertag = dateTimePickerLiefertag.Value.Date, }; int[] inventur = inv.Save(); if (inventur[0] == 1) { auftragId = inventur[1]; foreach (DataGridViewRow row in dGVZahlen.Rows) { if (row.HeaderCell.Value.ToString() == "INV-Ausgleich") { int save = dGVZahlen.Columns.Count; int saved = 0; foreach (DataGridViewColumn column in dGVZahlen.Columns) { KundeArtikel kndart = (KundeArtikel)column.Tag; Artikel art = Artikel.GetArtikel(null, ((KundeArtikel)column.Tag).ArtikelID); if (row.Cells[column.Index].Value == null || int.Parse(row.Cells[column.Index].Value.ToString()) == 0) { save -= 1; continue; } KundeArtikel.SaveKundeArtikel_Numbers(kndart, int.Parse(row.Cells[column.Index].Value.ToString()), 0, 0, null); AuftragArtikel aufart = new AuftragArtikel() { AuftragID = inventur[1], ArtikelID = art.ArtikelID, ArtikelName = art.Bezeichnung, Gesamt = row.Cells[column.Index].Value == null ? 0 : int.Parse(row.Cells[column.Index].Value.ToString()), Anzahl = 0, Erledigt = false, }; saved += aufart.Save(); } if (save != saved) { Program.AddFehler(this.benutzer, "Es wurden nicht alle Artikel der Inventur gespeichert.", $"Auftrag: {inventur[1]} Fehler bei ", null); MessageBox.Show("Es konnten nicht alle Artikel gespeichert werden. Vergleiche den Auftrag mit der CSV.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } return auftragId; } private void ButtonDelete_Click(object sender, EventArgs e) { if (MessageBox.Show("Möchtest du die Inventur wirklich löschen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.dateTimePickerInventur.Checked = this.dateTimePickerLiefertag.Checked = false; foreach(DataGridViewRow row in dGVZahlen.Rows) { if (!dGVZahlen.Rows[row.Index].ReadOnly) this.dGVZahlen.Rows.RemoveAt(row.Index); foreach (DataGridViewColumn column in this.dGVZahlen.Columns) DoCalculation(column.Index); } TosaveInventur = false; } } /// /// DataGridView wird geladen. /// Wenn Inventurdatei vorhanden werden Spalten hinzugefügt und Zeilen aufgefüllt. /// /// private void SaveInventurToCSV(object sender, int? Id) { Kunde _knd = this.kunde; Benutzer _user = this.benutzer; List _artikelliste = this.standListe; string status = string.Empty; string savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren"; if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren"; // Inventur Status Warten wenn noch Zahlen fehlen. if (sender.ToString() == "Speichern") status = "Warten"; else { // Inventur Status Herrichten wenn alle Zahlen vorhanden und Auftrag erstellt wurde. if (sender.ToString() == "Abschließen") { status = $"Herrichten-{Id}"; string deletePath = Path.Combine(savePath, $"Warten-{_knd.KundeNummer}.csv"); if (File.Exists(deletePath)) File.Delete(deletePath); } else // Inventur Status Fertig wenn Inventur fertig hergerichtet und demnäcsht ausgeliefert. { //TODO: Wenn Auftrag Fertig dann Fertig Datei erstellen und Herrichten löschen. status = $"Fertig-{Id}"; string delPath = Path.Combine(savePath, $"Herrichten-{Id}-{_knd.KundeNummer}.csv"); if (File.Exists(delPath)) File.Delete(delPath); } } string artikel = string.Empty; string cols = string.Empty; string fileName = $"{status}-{_knd.KundeNummer}.csv"; // Dateiname: Status-AuftragID-KundeNummer.csv string csvPath; csvPath = Path.Combine(savePath, fileName); // Prüfen ob Header schon existiert //bool headerExists = File.Exists(csvPath); // Artikelbezeichnungen in string convertieren foreach (KundeArtikel art in _artikelliste) artikel += art.ArtikelName + ";"; foreach (var col in dGVZahlen.Columns.Cast().Where(c => c.Visible).OrderBy(c => c.DisplayIndex)) { if (col.Visible) cols += ";" + col.HeaderText + ":" + ((KundeArtikel)col.Tag).ArtikelNR.ToString(); } // Prüfen ob Inventur neu ist //if (headerExists) neueinventur = NeueInventur(csvPath, cols); // Nur Header bei NEUER Datei var csv = new StringBuilder(); csv.AppendLine("=== INVENTUR INFO ==="); csv.AppendLine($"KundeNr: {_knd.KundeNummer}"); csv.AppendLine($"Kunde: {_knd.KundeName}"); csv.AppendLine($"Inventurdatum: {dateTimePickerInventur.Value.Date:d}"); csv.AppendLine($"Liefertag: {dateTimePickerLiefertag.Value.Date:d}"); if (Id != null) csv.AppendLine($"Auftrag: {Id}"); else csv.AppendLine("Auftrag: "); csv.AppendLine(); csv.AppendLine(new string('=', 30)); csv.AppendLine($"Artikel{cols}"); File.WriteAllText(csvPath, csv.ToString(), Encoding.UTF8); // NEUE Artikel ANHÄNGEN (ohne Header) var appendCsv = new StringBuilder(); foreach (DataGridViewRow row in this.dGVZahlen.Rows) { // Nur sichtbare Spalten auslesen var values = new List(); for (int i = 0; i < row.Cells.Count; i++) { if (row.Cells[i].Visible) { if (i == 0) { values.Add(row.HeaderCell.Value.ToString()); } values.Add(row.Cells[i].Value?.ToString() ?? "0"); } } // Eine Zeile pro Row, mit allen Werten getrennt durch ";" appendCsv.AppendLine(string.Join(";", values)); } File.AppendAllText(csvPath, appendCsv.ToString(), Encoding.UTF8); TosaveInventur = false; } private void DateTimePicker_ValueChanged(object sender, EventArgs e) { DateTimePicker dtp = sender as DateTimePicker; if (dtp.Checked == true) TosaveInventur = true; else TosaveInventur = false; } #endregion } }