using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using Microsoft.Data.SqlClient; using De.Lambertz.Essentials; namespace De.Lambertz.ODAL { public class Terminserie { private int id = 0; private DateTime startTermin; private char serienmuster; //T;W;M;J private int subSelektion = 0; //Siehe Maske private int intervall1 = 0; //Siehe Maske private int intervall2 = 0; //Siehe Maske private int intervall3 = 0; //Siehe Maske private int endeNach = 0; private DateTime endeTermin; private int verwalter = 0; private Dictionary selektierteTage = null; // private bool keinEnde = false; private string text = ""; public Terminserie() { } public Terminserie(Terminserie original) { id = original.Id; startTermin = original.StartTermin; serienmuster = original.Serienmuster; subSelektion = original.SubSelektion; intervall1 = original.Intervall1; intervall2 = original.Intervall2; intervall3 = original.Intervall3; endeNach = original.EndeNach; endeTermin = original.EndeTermin; verwalter = original.Verwalter; // keinEnde = original.KeinEnde; } public void Reset() { //id = 0; startTermin = DateTime.MinValue; endeTermin = DateTime.MinValue; //serienmuster = ' '; subSelektion = 0; intervall1 = 0; intervall2 = 0; intervall3 = 0; endeNach = 0; selektierteTage = null; verwalter = 0; // keinEnde = false; } public int Id { get { return id; } set { id = value; } } public int Verwalter { get { return verwalter; } set { verwalter = value; } } public DateTime StartTermin { get { return startTermin; } set { startTermin = value; } } public char Serienmuster { get { return serienmuster; } set { serienmuster = value; } } public int SubSelektion { get { return subSelektion; } set { subSelektion = value; } } public int Intervall1 { get { return intervall1; } set { intervall1 = value; } } public int Intervall2 { get { return intervall2; } set { intervall2 = value; } } public int Intervall3 { get { return intervall3; } set { intervall3 = value; } } public int EndeNach { get { int result; if (KeinEnde) { result = 12; } else { result = endeNach; } return result; } set { endeNach = value; } } public DateTime EndeTermin { get { return endeTermin; } set { endeTermin = value; } } public bool KeinEnde { get { return keinEnde; } set { keinEnde = value; } } public void Laden(int terminserienId) { using (SqlConnection con = new SqlConnection(DBTools.ConnectionStringODAL())) { con.Open(); String sql = "select StartTermin, SerienMuster, SubSelektion, Intervall1, Intervall2, Intervall3, EndeNach, EndeTermin, Verwalter from ODAL.TERMINSERIEN where TSID = @p1"; SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddWithValue("@p1", terminserienId); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { Id = terminserienId; StartTermin = DBTools.DBGetDate(reader, 0); Serienmuster = DBTools.DBGetChar(reader, 1); SubSelektion = DBTools.DBGetInt(reader, 2); Intervall1 = DBTools.DBGetInt(reader, 3); Intervall2 = DBTools.DBGetInt(reader, 4); Intervall3 = DBTools.DBGetInt(reader, 5); EndeNach = DBTools.DBGetInt(reader, 6); EndeTermin = DBTools.DBGetDate(reader, 7); Verwalter = DBTools.DBGetInt(reader, 8); if (reader.IsDBNull(6)) { KeinEnde = true; } } } } } public bool IsADaySelected() { bool result = false; if (intervall2 > 0) { result = true; } return result; } public bool IsDaySelected(DayOfWeek wochentag) { bool result = false; if (selektierteTage == null) { int kennzahl = intervall2; selektierteTage = new Dictionary(); //Sonntag double temp = kennzahl / 64; bool istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 64; } selektierteTage.Add(DayOfWeek.Sunday, istSelektiert); //Samstag temp = kennzahl / 32; istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 32; } selektierteTage.Add(DayOfWeek.Saturday, istSelektiert); //Freitag temp = kennzahl / 16; istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 16; } selektierteTage.Add(DayOfWeek.Friday, istSelektiert); //Donnerstag temp = kennzahl / 8; istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 8; } selektierteTage.Add(DayOfWeek.Thursday, istSelektiert); //Mittwoch temp = kennzahl / 4; istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 4; } selektierteTage.Add(DayOfWeek.Wednesday, istSelektiert); //Dienstag temp = kennzahl / 2; istSelektiert = false; if (temp >= 1) { istSelektiert = true; kennzahl = kennzahl - 2; } selektierteTage.Add(DayOfWeek.Tuesday, istSelektiert); //Dienstag temp = kennzahl; istSelektiert = false; if (temp >= 1) { istSelektiert = true; } selektierteTage.Add(DayOfWeek.Monday, istSelektiert); } if (selektierteTage.ContainsKey(wochentag)) { result = selektierteTage[wochentag]; } return result; } public List GetTermine() { text = ""; List result = new List(); result.Add(startTermin); int anzahlWiederholungen; if (keinEnde) { anzahlWiederholungen = 11; text = " ohne Ende"; } else { anzahlWiederholungen = endeNach; text = "; endet nach " + endeNach + " Terminen" ; } DateTime termin; int temp; switch (serienmuster) { case 'T': termin = startTermin; if (subSelektion == 1) { for (int i = 0; i < anzahlWiederholungen; i++) { termin = termin.AddDays(intervall1); result.Add(termin); } text = "Alle " + intervall1 + " Tage" + text; } else { for (int i = 0; i < anzahlWiederholungen; i++) { do { termin = termin.AddDays(1); } while (termin.DayOfWeek == DayOfWeek.Saturday || termin.DayOfWeek == DayOfWeek.Sunday); result.Add(termin); } text = "Jeden Arbeitstag" + text; } break; case 'W': string tempText = text; //Start der Woche ermitteln temp = startTermin.DayOfWeek - (DayOfWeek)0 - 1; if (temp < 0) { temp = -6; } else { temp = temp * -1; } termin = startTermin.AddDays(temp); //Montag dieser Woche int wochenIntervall = intervall1 * 7; //Wochenversatz (Immer auf Montag) if (intervall1 > 1) { text = "Wöchentlich ("; } else { text = "Alle " + intervall1 + " Wochen ("; } for (int ii = 0; ii < 7; ii++) //Jeden Tag der Woche prüfen { DateTime wochentag = termin.AddDays(ii); if (IsDaySelected(wochentag.DayOfWeek)) { switch(wochentag.DayOfWeek) { case DayOfWeek.Monday: text = text + "Mo "; break; case DayOfWeek.Tuesday: text = text + "Di "; break; case DayOfWeek.Wednesday: text = text + "Mi "; break; case DayOfWeek.Thursday: text = text + "Do "; break; case DayOfWeek.Friday: text = text + "Fr "; break; case DayOfWeek.Saturday: text = text + "Sa "; break; case DayOfWeek.Sunday: text = text + "So "; break; } } } text = text + ")"; int anzahltermine = 0; if (IsADaySelected()) { while (anzahltermine < anzahlWiederholungen) { for (int ii = 0; ii < 7; ii++) //Jeden Tag der Woche prüfen { DateTime wochentag = termin.AddDays(ii); if (IsDaySelected(wochentag.DayOfWeek)) { if (wochentag > startTermin) //Nur Termine nach dem Starttermin (relevant für erste Woche) { result.Add(wochentag); anzahltermine++; } } } termin = termin.AddDays(wochenIntervall); } } text = text + tempText; break; case 'M': //Auf den ersten des Monats setzten temp = startTermin.Day; temp = temp * -1; temp = temp + 1; termin = startTermin.AddDays(temp); int relevantesIntervall = 0; if (subSelektion == 1) { for (int i = 0; i < anzahlWiederholungen; i++) //X Widerholungen (x Monate) { termin = termin.AddMonths(intervall2); //Termin bleibt auf dem Ersten des Monats //Um Intervall 1 (Tag des Monats) verschieben (Wenn zu weit verschobem, dann schrittweise zurück) DateTime tagesVerstz = termin.AddDays(intervall1 - 1); while (tagesVerstz.Month != termin.Month) { tagesVerstz = tagesVerstz.AddDays(-1); } result.Add(tagesVerstz); } relevantesIntervall = intervall1; } else { int tagDesMonats = intervall1 + 1; int wochentag = intervall2 - 2; for (int i = 0; i < anzahlWiederholungen; i++) //X Widerholungen (x Monate) { termin = termin.AddMonths(intervall3); //Termin bleibt auf dem Ersten des Monats if (wochentag >= 0) { int vergleichssTag = wochentag + 1; if (vergleichssTag == 7) { vergleichssTag = 0; } //Bestimmter Wochentag des Monats int zähler = 0; int tdm = 0; DateTime zuPrüfenderMonat = termin; while (zähler < tagDesMonats) { int tempTag = zuPrüfenderMonat.DayOfWeek - (DayOfWeek)0; //Wochentagnummer = Intervall2 if (tempTag == vergleichssTag) { zähler++; tdm = zuPrüfenderMonat.Day; } zuPrüfenderMonat = zuPrüfenderMonat.AddDays(1); if (zuPrüfenderMonat.Month != termin.Month) { zähler = tagDesMonats; } } result.Add(termin.AddDays(tdm-1)); } else { if (wochentag == -2) { //Tag des Monats if (tagDesMonats < 5) { result.Add(termin.AddDays(tagDesMonats - 1)); } else { DateTime tempMonth = termin.AddMonths(1); tempMonth = tempMonth.AddDays(-1); result.Add(tempMonth); } } else if (wochentag == -1) { if (tagDesMonats < 5) { int zähler = 0; DateTime tempMonth = termin; tempMonth = tempMonth.AddDays(-1); do { tempMonth = tempMonth.AddDays(1); if (tempMonth.DayOfWeek != DayOfWeek.Sunday && tempMonth.DayOfWeek != DayOfWeek.Saturday) { zähler++; } } while (zähler < tagDesMonats); result.Add(tempMonth); } else { DateTime tempMonth = termin.AddMonths(1); do { tempMonth = tempMonth.AddDays(-1); } while (tempMonth.DayOfWeek == DayOfWeek.Sunday || tempMonth.DayOfWeek == DayOfWeek.Saturday); result.Add(tempMonth); } } } } relevantesIntervall = intervall2; } if (relevantesIntervall > 1) { if (subSelektion == 1) { text = "Jeden " + relevantesIntervall + "ten des Monats" + text; } else { text = "Alle " + relevantesIntervall + " Monate" + text; } } else { text = "Monatlich" + text; } break; case 'J': text = "Jährlich" + text; //Auf den ersten des Jahres setzten temp = startTermin.DayOfYear; temp = temp * -1; temp = temp + 1; termin = startTermin.AddDays(temp); for (int i = 0; i < anzahlWiederholungen; i++) //X Widerholungen (1 jahre) { termin = termin.AddYears(1); //Termin bleibt auf dem Ersten des Jahres if (subSelektion == 1) { DateTime jahr = termin.AddMonths(intervall2); jahr = jahr.AddDays(intervall1 - 1); result.Add(jahr); } else { DateTime jahr = termin.AddMonths(intervall3); int tagDesMonats = intervall1 + 1; int wochentag = intervall2 - 2; if (wochentag >= 0) { int vergleichssTag = wochentag + 1; if (vergleichssTag == 7) { vergleichssTag = 0; } //Bestimmter Wochentag des Monats int zähler = 0; int tdm = 0; DateTime zuPrüfenderMonat = jahr; while (zähler < tagDesMonats) { int tempTag = zuPrüfenderMonat.DayOfWeek - (DayOfWeek)0; //Wochentagnummer = Intervall2 if (tempTag == vergleichssTag) { zähler++; tdm = zuPrüfenderMonat.Day; } zuPrüfenderMonat = zuPrüfenderMonat.AddDays(1); if (zuPrüfenderMonat.Month != jahr.Month) { zähler = tagDesMonats; } } result.Add(jahr.AddDays(tdm-1)); } else { if (wochentag == -2) { //Tag des Monats if (tagDesMonats < 5) { result.Add(jahr.AddDays(tagDesMonats - 1)); } else { DateTime tempMonth = jahr.AddMonths(1); tempMonth = tempMonth.AddDays(-1); result.Add(tempMonth); } } else if (wochentag == -1) { if (tagDesMonats < 5) { int zähler = 0; DateTime tempMonth = jahr; tempMonth = tempMonth.AddDays(-1); do { tempMonth = tempMonth.AddDays(1); if (tempMonth.DayOfWeek == DayOfWeek.Sunday || tempMonth.DayOfWeek == DayOfWeek.Saturday) { zähler++; } } while (zähler < tagDesMonats); result.Add(tempMonth); } else { DateTime tempMonth = jahr.AddMonths(1); do { tempMonth = tempMonth.AddDays(-1); } while (tempMonth.DayOfWeek == DayOfWeek.Sunday || tempMonth.DayOfWeek == DayOfWeek.Saturday); result.Add(tempMonth); } } } } } break; } return result; } public override string ToString() { GetTermine(); return this.text; } } }