using AForge.Video.DirectShow; using BrightIdeasSoftware; using DatenDB; using Deckungsbeitrag.AA_Klassen; 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 bool _tosave = false; 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); ComboBox_Laden(); if (this.kunde == null) this.kunde = Funktionen.KundenAuswahl(); if (this.kunde != null) DatenLesen(); else this.Close(); formloading = false; } 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() { //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(); // Wenn bereits ein Stand gespeichert ist, kommt er aus der DB. Wenn kein Stand gespeichert kommt Liste aus Sortiment. if (KundeArtikel.GetList(kundeid).Count > 0) { this.standListe = KundeArtikel.GetList(kundeid); if (this.standListe[0].ArtikelID == null || this.standListe[0].Reihung == 0) { CompareToSortiment(); } Load_Gridview(this.standListe); } 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)) { 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++; } standListe = standListe.OrderBy(x => x.Reihung).ToList(); //GridView mit der jeweiligen Liste füllen. Load_Gridview(standListe); } // 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; } // ComboBox-Item für Lieferrhythmus wird gewählt this.comboBoxLRSommer.SelectedValue = (Liefertage)this.kunde.SommerLieferRhythmus; this.comboBoxLRWinter.SelectedValue = (Liefertage)this.kunde.WinterLieferRhythmus; // 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(); } private void CompareToSortiment() { int reihung = 1; Kunde _kunde = Kunde.GetKunde(null, this.standListe[0].KundeID, null); foreach (Sortiment sort in sortimentListe.FindAll(Sortiment => Sortiment.KundeNummer == _kunde.KundeNummer)) { KundeArtikel kndart = this.standListe.Find(s => s.ArtikelNR == sort.ArtNr); kndart.ArtikelID = Artikel.GetArtikelID(sort.ArtNr); kndart.Reihung = reihung; kndart.Save(); reihung++; } 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) { if (_tosave) { if (MessageBox.Show("Möchtest du die Änderungen speichern?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.kunde.Save(); } // Kundenliste öffnen und Kunde auswählen. this.kunde = Funktionen.KundenAuswahl(); if (kunde != null) DatenLesen(); } 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.Korrektur = int.Parse(row.Cells[6].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.Korrektur = int.Parse(row.Cells[6].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(); } 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(); } } } } } 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 (textBoxAnmerkung.TextLength > 0) 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; 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; } _tosave = true; } private void NumericUpDownAufgabeCount_ValueChanged(object sender, EventArgs e) { NumericUpDown numeric = (NumericUpDown)sender; if (formloading) return; if (numeric.Value > 0) NumericUpDownAufgabeCount_Leave(this, null); else { meldung.GetFehler(this, $"Du hast für deine Aufgabe noch keine Auftraganzahl eingegeben. Hole das bitte jetzt nach."); 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) { if (_tosave) { if (MessageBox.Show("Möchtest du die Änderungen speichern?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.kunde.Save(); } } private void CheckBoxNW_Click(object sender, EventArgs e) { if (formloading) return; this.kunde.HatNachwaesche = this.checkBoxNW.Checked; _tosave = true; } } } //INSTALL-REMINDER: Tabelle KundeArtikel Spalten ArtikelID und Reihung hinzufügen. //CHANGES: KundeArtikel wird mit Reihung gespeichert und angezeigt.