639 lines
25 KiB
C#
639 lines
25 KiB
C#
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<DayOfWeek, bool> 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<DayOfWeek, bool>();
|
|
//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<DateTime> GetTermine()
|
|
{
|
|
text = "";
|
|
|
|
List<DateTime> result = new List<DateTime>();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|