Files
BeWoPlaner/ReportImp/LebenshilfeFrankfurtOder/BesondereWohnform/CustomerAbsenceTimes.cs
Christian 7324b78f9b LH Frankfurt Oder: Anpassungen Rechnung für Wohnstätten
Pas: Anpassung Stundenkonto für die Jahresansicht
Frau Hildmann, Anspassung Kalkulation
2026-03-10 00:30:24 +01:00

148 lines
5.1 KiB
C#

using BS.Shared.DataContracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LebenshilfeFrankfurtOder.BesondereWohnform
{
public class CustomerAbsenceTimes
{
private Dictionary<string, bool> abwesenheitsDict = new Dictionary<string, bool>();
public int TageAbwesendGesamt { get; set; }
public int MehrAls3TageAbwesendAH { get; set; }
public List<DateTime> TageMehrAls3TageAbwesendAHList { get; set; } = new List<DateTime>();
public DateTime Monat { get; }
public IList<AbsenceTimeDC> AbsenceTimeList { get; }
public CustomerAbsenceTimes(IList<AbsenceTimeDC> atList, DateTime monat)
{
AbsenceTimeList = atList;
Monat = monat;
BerechneCustomerAbsenceTimes();
}
public bool TagWirdAlsAbwesendBerechnet(DateTime tag)
{
return TageMehrAls3TageAbwesendAHList.Contains(tag.Date);
}
public void BerechneCustomerAbsenceTimes()
{
abwesenheitsDict.Clear();
TageMehrAls3TageAbwesendAHList.Clear();
DateTime monatStart = new DateTime(Monat.Year, Monat.Month, 1);
DateTime monatEnde = monatStart.AddMonths(1).AddDays(-1);
DateTime dritterTagFolgeMonat = monatEnde.AddDays(3); //Prüfe bis zum 3. des Folgemonats, ob es monatsübergreifende Abwesenheiten gibt, die länger als 3 Tage dauern. z.B. 31.01. bis 3.2.
DateTime minAtDate = DateTime.MaxValue.Date;
//Fülle Dictionary mit Abwesenheiten
foreach (var at in AbsenceTimeList)
{
if (IstWstAbwesenheit(at) && IstAusserHausAbwesenheit(at))
{
//Prüfe für alle Abwesenheiten für Wohnstätten die außer Haus sind, ob diese im ausgewählten Monat liegen
if (at.Start.HasValue && at.Start.Value.Date <= monatEnde &&
(!at.End.HasValue || at.End.Value.Date >= monatStart))
{
if (at.Start.Value.Date < minAtDate)
{
minAtDate = at.Start.Value.Date;
}
DateTime dt = at.Start.Value;
DateTime ende = dritterTagFolgeMonat;
if (at.End.HasValue && at.End.Value.Date < ende)
{
ende = at.End.Value.Date;
}
while (dt <= ende)
{
String key = String.Format("{0:yyyyMMdd}", dt);
if (!abwesenheitsDict.ContainsKey(key))
{
abwesenheitsDict.Add(key, true);
}
dt = dt.AddDays(1);
}
}
}
}
DateTime datum = minAtDate;
int tageAbwesendAmStueck = 0;
//int tageAbwesendAmStueckDiesenMonat = 0;
var tageAbwesendAmStueckDiesenMonat = new List<DateTime>();
while (datum <= dritterTagFolgeMonat)
{
String key = String.Format("{0:yyyyMMdd}", datum);
if (abwesenheitsDict.ContainsKey(key))
{
tageAbwesendAmStueck++;
if (datum >= monatStart && datum <= monatEnde)
{
TageAbwesendGesamt++;
//tageAbwesendAmStueckDiesenMonat++;
tageAbwesendAmStueckDiesenMonat.Add(datum);
}
}
else
{
if (tageAbwesendAmStueck > 3)
{
MehrAls3TageAbwesendAH += tageAbwesendAmStueckDiesenMonat.Count;
TageMehrAls3TageAbwesendAHList.AddRange(tageAbwesendAmStueckDiesenMonat);
}
tageAbwesendAmStueck = 0;
tageAbwesendAmStueckDiesenMonat.Clear();
}
datum = datum.AddDays(1);
}
if (tageAbwesendAmStueck > 3)
{
MehrAls3TageAbwesendAH += tageAbwesendAmStueckDiesenMonat.Count;
TageMehrAls3TageAbwesendAHList.AddRange(tageAbwesendAmStueckDiesenMonat);
}
}
private bool IstWstAbwesenheit(AbsenceTimeDC at)
{
if (at.Reason.Description.Contains("WST"))
{
return true;
}
return false;
}
private bool IstAusserHausAbwesenheit(AbsenceTimeDC at)
{
String name = at.Reason.Description.ToLower();
if (name.Contains("(ah)") || name.Contains("(ak)") || name.Contains("(kh)") || name.Contains("(au)") || name.Contains("(ac)"))
{
return true;
}
return false;
}
}
}