/// <summary> /// Erneuert die Einträge in der Monat-Combobox. /// Anhand einer LINQ-Abfrage werden alle entsprechenden Monate bestimmt. /// </summary> private void RenewZeitausgabeComboBoxMonat() { Person person = _user; if (_user.Position == Position.Manager) { person = (Person)comboBoxZeitausgabeMitarbeiter.SelectedItem; } if (person == null) { return; } DateTime[] dates = StorageContainer.Get <Person>().Values .Where(p => checkBoxZeitausgabeAlleMitarbeiter.Checked || p == person) .SelectMany(p => p.Arbeitszeiten).Select(arbeitszeit => arbeitszeit.Datum) .Select(arbeitszeit => Convert.ToDateTime(arbeitszeit.ToString("MM.yyyy"))) .Distinct() .OrderBy(date => date.Year) .ThenBy(date => date.Month) .ToArray(); comboBoxZeitausgabeMonat.Items.Clear(); Array.ForEach(dates, date => comboBoxZeitausgabeMonat.Items.Add(date)); if (comboBoxZeitausgabeMonat.Items.Count > 0) { comboBoxZeitausgabeMonat.SelectedIndex = 0; } }
// Beim Laden der Form alle Personen zur Auswahl hinzufügen private void FormLogin_Load(object sender, EventArgs e) { Array.ForEach(StorageContainer.Get <Person>().Values, person => comboBoxUser.Items.Add(person)); if (comboBoxUser.Items.Count > 0) { comboBoxUser.SelectedIndex = 0; } }
//Zeitausgabe /// <summary> /// Erneuert die Einträge in der Mitarbeiter-Combobox. /// </summary> private void RenewZeitausgabeComboBoxMitarbeiter() { comboBoxZeitausgabeMitarbeiter.Items.Clear(); switch (_user.Position) { case Position.Mitarbeiter: comboBoxZeitausgabeMitarbeiter.Visible = false; checkBoxZeitausgabeAlleMitarbeiter.Checked = false; checkBoxZeitausgabeAlleMitarbeiter.Visible = false; break; case Position.Manager: int index = -1; if (comboBoxZeitausgabeMitarbeiter.SelectedItem != null) { index = comboBoxZeitausgabeMitarbeiter.SelectedIndex; } comboBoxZeitausgabeMitarbeiter.Items.Add(_user); comboBoxZeitausgabeMitarbeiter.Items.AddRange(StorageContainer.Get <Person>().Values.Where(person => person.Position == Position.Mitarbeiter).ToArray()); if (index != -1 && comboBoxZeitausgabeMitarbeiter.Items.Count > index) { comboBoxZeitausgabeMitarbeiter.SelectedIndex = index; } else if (comboBoxZeitausgabeMitarbeiter.Items.Count > 0) { comboBoxZeitausgabeMitarbeiter.SelectedIndex = 0; } comboBoxZeitausgabeMitarbeiter.Visible = true; checkBoxZeitausgabeAlleMitarbeiter.Visible = true; break; default: break; } }
/// <summary> /// Erneuert die Ausgabe in der Zeitausgabe-Textbox. /// Anhand von LINQ-Abfragen werden alle entsprechenden Arbeitszeiten bestimmt. /// </summary> private void RefreshZeitausgabeBeschreibung() { textBoxZeitausgabe.Clear(); if (comboBoxZeitausgabeMonat.SelectedItem == null && !checkBoxZeitausgabeAlleMonate.Checked) { return; } Person[] personen; //Array, welcher nachher alle zu berücksichtigenden Personen enthält if (checkBoxZeitausgabeAlleMitarbeiter.Checked) //Ist die Checkbox für alle Mitarbeiter aktiviert, werden alle Mitarbeiter (Manager ausgeschlossen) berücksichtigt. { List <Person> personenTmp = StorageContainer.Get <Person>().Values .Where(person => person.Position == Position.Mitarbeiter) .ToList(); personenTmp.Add(_user); personen = personenTmp.ToArray(); } else //Ansonsten wird nur die ausgewählte Person berücksichtigt { Person person = _user; if (_user.Position == Position.Manager) { person = (Person)comboBoxZeitausgabeMitarbeiter.SelectedItem; } if (person == null) { return; } personen = new Person[] { person }; } Dictionary <Person, Arbeitszeit[]> arbeitszeiten = new Dictionary <Person, Arbeitszeit[]>(); //Nun werden die Arbeitszeiten von allen zu berücksichtigenden Personen sortiert gesammelt. //Hierbei wird berücksichtigt, welcher Monat gewollt ist, oder ob alle Monate berücksichtigt werden sollen. (Siehe .Where) foreach (Person person in personen) { arbeitszeiten.Add(person, person.Arbeitszeiten .Where(arbeitszeit => checkBoxZeitausgabeAlleMonate.Checked || arbeitszeit.Datum.Month == ((DateTime)comboBoxZeitausgabeMonat.SelectedItem).Month) .OrderBy(arbeitszeit => arbeitszeit.Datum.Year) .ThenBy(arbeitszeit => arbeitszeit.Datum.Month) .ThenBy(arbeitszeit => arbeitszeit.Datum.Day) .ThenBy(arbeitszeit => arbeitszeit.Anfang) .ThenBy(arbeitszeit => arbeitszeit.Zeitspanne.Ticks) .ToArray()); } //Anschließend werden die Arbeitszeiten der Personen ausgegeben. //Hierbei gibt es unterschiedliche Formate: // - eine detaillierte Ausgabe, wenn es sich um eine Person handelt // - eine zusammenfassende Ausgabe, wenn es sich um mehrere Personen handelt if (personen.Length == 1) { Person person = personen[0]; Arbeitszeit[] personenArbeitszeiten = arbeitszeiten[person]; textBoxZeitausgabe.Text = $"Arbeitszeiten von {person.ToString()}{Environment.NewLine}{Environment.NewLine}"; if (personenArbeitszeiten.Length == 0) { textBoxZeitausgabe.Text += $"Keine{Environment.NewLine}"; } else { foreach (Arbeitszeit arbeitszeit in personenArbeitszeiten) { textBoxZeitausgabe.Text += $"{arbeitszeit.Datum.Day}. {arbeitszeit.Datum.ToString("MMMM")} {arbeitszeit.Datum.Year} - {arbeitszeit.Zeitspanne.TotalHours.ToString("#.##")} Std. von {arbeitszeit.Anfang.ToString("HH:mm:ss")} bis {arbeitszeit.Ende.ToString("HH:mm:ss")}: {arbeitszeit.Beschreibung}{Environment.NewLine}"; } } textBoxZeitausgabe.Text += $"{Environment.NewLine}Gesamt: {(personenArbeitszeiten.Length == 0 ? "0,00" : personenArbeitszeiten.Sum(arbeitszeit => arbeitszeit.Zeitspanne.TotalHours).ToString("#.##"))} Std."; } else { foreach (Person person in personen) { textBoxZeitausgabe.Text += $"{person.ToString()} Gesamt: {(arbeitszeiten[person].Length == 0 ? "0,00" : arbeitszeiten[person].Sum(arbeitszeit => arbeitszeit.Zeitspanne.TotalHours).ToString("#.##"))} Std.{Environment.NewLine}"; } textBoxZeitausgabe.Text += $"{Environment.NewLine}Gesamt: {(personen.SelectMany(person => person.Arbeitszeiten).ToArray().Length == 0 ? "0,00" : personen.Sum(person => arbeitszeiten[person].Sum(arbeitszeit => arbeitszeit.Zeitspanne.TotalHours)).ToString("#.##"))} Std."; } }
//Person Management /// <summary> /// Fügt, falls alle Werte korrekt, eine neue Person hinzu /// </summary> private async void buttonAdd_Click(object sender, EventArgs e) { string vorname, name, email, passwort; double gehalt; DateTime geburtsdatum; Position position; vorname = textBoxName.Text; if (string.IsNullOrWhiteSpace(vorname)) { MessageBox.Show("Bitte das Feld \"Name\" ausfüllen!", "Fehlende Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } name = textBoxVorName.Text; if (string.IsNullOrWhiteSpace(name)) { MessageBox.Show("Bitte das Feld \"Vorname\" ausfüllen!", "Fehlende Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } email = textBoxEmail.Text; if (string.IsNullOrWhiteSpace(email)) { MessageBox.Show("Bitte das Feld \"Email\" ausfüllen!", "Fehlende Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } passwort = textBoxPasswort.Text; if (string.IsNullOrWhiteSpace(passwort)) { MessageBox.Show("Bitte das Feld \"Passwort\" ausfüllen!", "Fehlende Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (!double.TryParse(textBoxGehalt.Text, out gehalt)) { MessageBox.Show("Bitte das Feld \"Gehalt\" korrekt ausfüllen!", "Fehlerhafte Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (!DateTime.TryParse(textBoxGeburtsdatum.Text, out geburtsdatum)) { MessageBox.Show("Bitte das Feld \"Geburtsdatum\" korrekt ausfüllen!", "Fehlerhafte Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (comboBoxPosition.SelectedItem == null) { MessageBox.Show($"Bitte eine der {Enum.GetValues(typeof(Position)).Length} möglichen Positionen auswählen!", "Fehlerhafte Angabe", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } position = (Position)comboBoxPosition.SelectedItem; if (StorageContainer.Get <Person>().Values.Any(person => person.Name == vorname && person.Vorname == name)) { MessageBox.Show("Eine Person mit diesem Namen existiert bereits!", "Halt Stop!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } StorageContainer.Get <Person>().Add(new Person(vorname, name, position, geburtsdatum, email, HashUtils.GenerateHash(passwort), gehalt)); await SavePersons(); RenewZeitausgabeComboBoxMitarbeiter(); MessageBox.Show("Person hinzugefügt!", "Erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information); }
/// <summary> /// Schreibt die Daten der Personen aus dem Storage<Person> des StorageContainers in die Personen.csv-Datei. /// </summary> private async Task SavePersons() => await DataWriters.FileDataWriter.WriteAllAsync("Assets/Personen.csv", CSVHandlers.CSVHandlerPerson.RevertAll(StorageContainer.Get <Person>().Values));
public string Get(string key) { return(_container.Get(key)); }