Entwicklung_BLAZOR/InterneDLLs/LambertzPortalODAL/Terminserie.cs
2025-08-23 19:30:21 +02:00

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;
}
}
}