2023-06-07 09:45:20 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
2024-04-25 02:15:41 +02:00
using BeWo.Data.Access ;
2023-06-07 09:45:20 +02:00
using BeWo.Data.Entities ;
using BeWo.Report.ReportObjects ;
2026-07-14 15:41:32 +02:00
using BeWo.Service.Dienstplanung ;
2023-08-30 00:27:43 +02:00
using BS.Shared ;
2023-09-08 15:52:55 +02:00
using BS.Shared.DataContracts ;
2023-06-07 09:45:20 +02:00
2023-08-23 23:15:58 +02:00
namespace SHKServiceSBD
2023-06-07 09:45:20 +02:00
{
public class CustomMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
{
2024-05-22 13:31:05 +02:00
private Dictionary < string , decimal > _SollStundenProTagDict = new Dictionary < string , decimal > ( ) ; //Speicher die Sollstunden aus den Betreuungszeiten des Kindes pro EmployeeOid und Tag (Key = {employee oid}_{datum])
2024-04-25 02:15:41 +02:00
private Organisation _Martinsschule = null ;
2025-09-09 00:44:55 +02:00
private DateTime _BerichtsAnfang = DateTime . MinValue ;
public override void CreateEmployeeDetails ( MitarbeiterstundenkontoRO ro )
{
base . CreateEmployeeDetails ( ro ) ;
foreach ( var ed in ro . EmployeeDetailList )
{
var c = ed . Employee . GetValidContractForDate ( _BerichtsAnfang ) ;
if ( c ! = null )
{
ed . Custom14 = c . HourlyRate ? ? 0 ;
ed . Custom15 = ed . Custom14 * Math . Round ( ed . UeberstundenGesamt ? ? 0 , 2 , MidpointRounding . AwayFromZero ) ;
}
}
}
2023-08-30 00:27:43 +02:00
protected override void StarteBerechnung ( DateTime berichtsAnfang , DateTime berichtsEnde , MitarbeiterstundenkontoRO . EmployeeDetail empDetail )
2023-09-08 15:52:55 +02:00
{
2025-09-09 00:44:55 +02:00
_BerichtsAnfang = berichtsAnfang ;
2024-04-25 02:15:41 +02:00
SucheMartinsschule ( ) ;
2023-09-08 15:52:55 +02:00
SetzeBundesland ( empDetail ) ;
2024-04-25 02:15:41 +02:00
BerechneBewilligteSollZeitProWoche ( empDetail , berichtsAnfang ) ;
BerechneAlleSollZeiten ( empDetail , berichtsAnfang , berichtsEnde ) ;
2023-09-08 15:52:55 +02:00
2024-04-25 02:15:41 +02:00
}
private void SucheMartinsschule ( )
{
if ( _Martinsschule = = null )
{
_Martinsschule = DAOFactory . SearchDAO . FindOrganisation ( "Martinsschule" , false ) . FirstOrDefault ( ) ;
}
2023-09-08 15:52:55 +02:00
}
private void SetzeBundesland ( MitarbeiterstundenkontoRO . EmployeeDetail empDetail )
2023-08-30 00:27:43 +02:00
{
string bundesland = "hessen" ;
2023-09-08 15:52:55 +02:00
2023-08-30 00:27:43 +02:00
//Ermittle Bundesland und geplante Sollzeit anhand der Schule des betreuten Kindes;
foreach ( var e2c in empDetail . Employee . Employee2CustomerList )
{
var kind = e2c . Customer ;
foreach ( var c2o in kind . Customer2OrganisationList )
{
if ( c2o . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) )
{
foreach ( var vv in c2o . Organisation . VarFieldValueList )
{
if ( vv . VarFieldDefOid = = 1 )
{
var varFieldValue = BS . Shared . Core . Utils . XMLDeserializeFromString ( vv . SerializedValue , Type . GetType ( vv . TypeName ) ) ;
if ( varFieldValue ! = null & & varFieldValue . ToString ( ) = = "Bayern" )
{
bundesland = "Bayern" ;
}
}
}
}
}
2023-09-08 15:52:55 +02:00
}
2023-08-30 00:27:43 +02:00
2023-09-08 15:52:55 +02:00
this . vacationService . Bundesland = bundesland ;
}
2025-02-20 00:20:46 +01:00
private bool IstTeamMartinsschule ( MitarbeiterstundenkontoRO . EmployeeDetail empDetail , DateTime stichtag )
2024-04-25 02:15:41 +02:00
{
2025-02-20 00:20:46 +01:00
var istImTeam = empDetail . Teams ! = null & & empDetail . Teams . Any ( t = > t . Name = = "Martinsschule" ) ;
2024-04-25 02:15:41 +02:00
2025-02-20 00:20:46 +01:00
if ( istImTeam )
2024-04-25 02:15:41 +02:00
{
2025-02-20 00:20:46 +01:00
return true ;
2024-04-25 02:15:41 +02:00
}
2025-02-20 00:20:46 +01:00
//Prüfe ob Vertragsart zum Stichtag "Martinsschule" ist
var c = empDetail . Employee . GetValidContractForDate ( stichtag ) ;
if ( c ! = null & & c . ContractTypeValueListEntry ! = null & & c . ContractTypeValueListEntry . Value = = "Martinsschule" )
2024-04-25 02:15:41 +02:00
{
2025-02-20 00:20:46 +01:00
return true ;
2024-04-25 02:15:41 +02:00
}
2025-02-20 00:20:46 +01:00
return false ;
2024-04-25 02:15:41 +02:00
}
2025-02-20 00:20:46 +01:00
//private IList<Arbeitszeit> GetSollArbeitszeiten(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Customer customer)
//{
// //Prüfe ob Mitarbeiter zu Team Martinsschule gehört, dann nehme die Betreuungszeiten (Stundenplan) der Schule, sonst den des betreuten Klienten
// if (IstTeamMartinsschule(empDetail) && _Martinsschule != null)
// {
// return _Martinsschule.Arbeitszeiten;
// }
// else
// {
// return customer.Arbeitszeiten;
// }
//}
2024-04-25 02:15:41 +02:00
private void BerechneAlleSollZeiten ( MitarbeiterstundenkontoRO . EmployeeDetail empDetail , DateTime berichtsAnfang , DateTime berichtsEnde )
2023-09-08 15:52:55 +02:00
{
//Abesenheit "MA krank in der Schulzeit":
//Wenn ein Kind zugeordnet ist, dann wird die Zeit von dem entsprechenden Tag aus der Betreuungszeit genommen und bei Krank eingetragen
//Wenn ein die Ma der Martinschule zugeordnet sind, dann wird die Zeit genommen, die in der Organisation Martinschule hinterlegt ist und bei Krank eingetragen
//Wenn kein Kind zugeordnet ist, dann Vertragliche Arbeitszeit, und bei Krank eingetragen
2024-04-25 02:15:41 +02:00
//Prüfe Team Martinsschule
2024-05-22 13:31:05 +02:00
DateTime ersterVertragsStart = berichtsAnfang ;
DateTime letzerVertragsEnde = berichtsEnde ;
foreach ( var c in empDetail . Employee . Contracts )
{
if ( c . EntryDate . HasValue & & c . EntryDate . Value < ersterVertragsStart )
{
ersterVertragsStart = c . EntryDate . Value ;
}
}
2024-06-12 16:46:46 +02:00
2025-09-09 00:44:55 +02:00
DateTime vertragsStart = ersterVertragsStart ;
DateTime vertragsEnde = letzerVertragsEnde ;
var contract = empDetail . Employee . GetValidContractForDate ( vertragsStart ) ;
while ( contract ! = null )
{
vertragsEnde = berichtsEnde ;
if ( contract . ContractEndDate . HasValue & & contract . ContractEndDate < vertragsEnde )
2024-06-12 16:46:46 +02:00
{
2025-09-09 00:44:55 +02:00
vertragsEnde = contract . ContractEndDate . Value ;
2024-06-12 16:46:46 +02:00
}
2025-09-09 00:44:55 +02:00
bool istTeamMartinsschule = IstTeamMartinsschule ( empDetail , vertragsStart ) ;
if ( istTeamMartinsschule & & _Martinsschule ! = null )
2024-06-12 16:46:46 +02:00
{
2025-09-09 00:44:55 +02:00
BerechneSollZeitenDictionary ( _Martinsschule . Arbeitszeiten , empDetail , vertragsStart , vertragsEnde , false ) ;
2024-06-12 16:46:46 +02:00
}
2025-09-09 00:44:55 +02:00
foreach ( var e2c in empDetail . Employee . Employee2CustomerList )
{
var start = vertragsStart ;
var ende = vertragsEnde ;
if ( e2c . StartDate . HasValue & & e2c . StartDate > start )
{
start = e2c . StartDate . Value ;
}
if ( e2c . EndDate . HasValue & & e2c . EndDate < ende )
{
ende = e2c . EndDate . Value ;
}
if ( start < = ende )
{
var kind = e2c . Customer ;
BerechneSollZeitenDictionary ( kind . Arbeitszeiten , empDetail , start , ende , false ) ;
}
}
//Füge Soll für Kinder, die bei den Mitarbeiterarbeitszeiten eingetragen wurden hinzu:
BerechneSollZeitenDictionary ( empDetail . Employee . Arbeitszeiten , empDetail , vertragsStart , vertragsEnde , true ) ;
2024-06-12 16:46:46 +02:00
2025-09-09 00:44:55 +02:00
var ctemp = GetNextValidContractForDate ( vertragsEnde . AddDays ( 1 ) , empDetail . Employee ) ;
if ( ctemp ! = null & & ctemp . Oid ! = contract . Oid )
{
contract = ctemp ;
}
else
2024-05-24 11:40:53 +02:00
{
2025-09-09 00:44:55 +02:00
contract = null ;
}
2023-09-08 15:52:55 +02:00
2025-09-09 00:44:55 +02:00
if ( contract ! = null & & contract . EntryDate . HasValue & & contract . EntryDate > = vertragsStart )
{
vertragsStart = contract . EntryDate . Value ;
2024-05-24 11:40:53 +02:00
}
2023-09-08 15:52:55 +02:00
}
}
2024-04-25 02:15:41 +02:00
private void BerechneBewilligteSollZeitProWoche ( MitarbeiterstundenkontoRO . EmployeeDetail empDetail , DateTime datum )
2023-09-08 15:52:55 +02:00
{
2024-04-25 02:15:41 +02:00
decimal sollProWoche = 0 ;
2025-02-20 00:20:46 +01:00
if ( IstTeamMartinsschule ( empDetail , datum ) & & _Martinsschule ! = null )
2024-04-25 02:15:41 +02:00
{
sollProWoche = BerechneSollZeitFuerWoche ( empDetail . Employee , _Martinsschule . Arbeitszeiten , datum ) ;
}
2023-09-08 15:52:55 +02:00
foreach ( var e2c in empDetail . Employee . Employee2CustomerList )
{
var kind = e2c . Customer ;
2024-04-25 02:15:41 +02:00
sollProWoche + = BerechneSollZeitFuerWoche ( empDetail . Employee , kind . Arbeitszeiten , datum ) ;
2023-09-08 15:52:55 +02:00
}
2024-04-25 02:15:41 +02:00
empDetail . Custom1 = sollProWoche ;
2023-08-30 00:27:43 +02:00
}
2024-04-25 02:15:41 +02:00
private decimal BerechneSollZeitFuerWoche ( Employee e , IList < Arbeitszeit > arbeitszeiten , DateTime datum )
2023-09-08 15:52:55 +02:00
{
decimal soll = 0 ;
2024-04-25 02:15:41 +02:00
if ( arbeitszeiten ! = null )
{
foreach ( var az in arbeitszeiten )
2023-09-08 15:52:55 +02:00
{
2024-04-25 02:15:41 +02:00
if ( ( ! az . GueltigVon . HasValue | | az . GueltigVon . Value < = datum ) & & ( ! az . GueltigBis . HasValue | | az . GueltigBis . Value > = datum ) )
2023-09-08 15:52:55 +02:00
{
foreach ( var ae in az . ArbeitszeitEintraege )
{
2024-04-25 02:15:41 +02:00
if ( ae . Employee = = null | | ae . Employee . Oid = = e . Oid )
2023-09-08 15:52:55 +02:00
{
2024-04-25 02:15:41 +02:00
soll + = ae . BerechneStunden ( ) ;
}
}
}
}
2023-09-08 15:52:55 +02:00
2024-04-25 02:15:41 +02:00
}
2025-09-09 00:44:55 +02:00
2024-04-25 02:15:41 +02:00
return soll ;
2023-09-08 15:52:55 +02:00
2024-04-25 02:15:41 +02:00
}
2023-09-08 15:52:55 +02:00
2025-05-15 20:41:41 +02:00
private void BerechneSollZeitenDictionary ( IList < Arbeitszeit > arbeitszeiten , MitarbeiterstundenkontoRO . EmployeeDetail empDetail , DateTime start , DateTime ende , bool arbeitszeitenSindVomMitarbeiter )
2024-04-25 02:15:41 +02:00
{
DateTime dt = start ;
while ( dt < = ende )
{
String key = String . Format ( "{0}_{1:yyyyMMdd}" , empDetail . Employee . Oid , dt ) ;
if ( ! _SollStundenProTagDict . ContainsKey ( key ) )
{
decimal soll = 0 ;
2024-06-07 14:34:27 +02:00
bool gibtAz = false ;
2024-04-25 02:15:41 +02:00
foreach ( var az in arbeitszeiten )
{
2024-06-07 14:34:27 +02:00
2024-04-25 02:15:41 +02:00
if ( ( ! az . GueltigVon . HasValue | | az . GueltigVon . Value < = dt ) & & ( ! az . GueltigBis . HasValue | | az . GueltigBis . Value > = dt ) )
{
2025-05-15 20:41:41 +02:00
if ( ! arbeitszeitenSindVomMitarbeiter )
{
gibtAz = true ;
}
2024-04-25 02:15:41 +02:00
foreach ( var ae in az . ArbeitszeitEintraege )
{
2025-05-15 20:41:41 +02:00
if ( arbeitszeitenSindVomMitarbeiter )
{
//Wenn das Flag arbeitszeitenSindVomMitarbeiter gesetzt ist, werden nur Einträge geprüft, bei dem auch ein Klient zugeordnet ist
if ( ae . Customer ! = null )
{
if ( ae . IstAmGleichenWochentag ( dt ) )
{
gibtAz = true ;
soll + = ae . BerechneStunden ( ) ;
}
}
}
else
2024-04-25 02:15:41 +02:00
{
2025-05-15 20:41:41 +02:00
if ( ae . Employee = = null | | ae . Employee . Oid = = empDetail . Employee . Oid )
2024-04-25 02:15:41 +02:00
{
2025-05-15 20:41:41 +02:00
if ( ae . IstAmGleichenWochentag ( dt ) )
{
soll + = ae . BerechneStunden ( ) ;
}
2024-04-25 02:15:41 +02:00
}
2023-09-08 15:52:55 +02:00
}
}
}
}
2024-06-07 14:34:27 +02:00
if ( gibtAz )
{
_SollStundenProTagDict [ key ] = soll ;
}
2023-09-08 15:52:55 +02:00
}
2024-05-13 17:56:09 +02:00
dt = dt . AddDays ( 1 ) ;
2023-09-08 15:52:55 +02:00
}
}
2025-09-09 00:44:55 +02:00
protected override decimal? GetSollNachArbeitszeiten ( Employee emp , DateTime start , DateTime ende )
{
var soll = base . GetSollNachArbeitszeiten ( emp , start , ende ) ;
2025-09-17 11:02:35 +02:00
return soll ;
2025-09-09 00:44:55 +02:00
if ( soll = = null )
{
DateTime startTemp = start ;
while ( startTemp < ende )
{
String key = String . Format ( "{0}_{1:yyyyMMdd}" , emp . Oid , startTemp ) ;
if ( _SollStundenProTagDict . ContainsKey ( key ) )
{
if ( soll = = null )
{
soll = 0 ;
}
soll + = _SollStundenProTagDict [ key ] ;
}
startTemp = startTemp . AddDays ( 1 ) ;
}
}
return soll ;
}
2026-03-10 00:05:42 +01:00
protected override decimal GetSollNachArbeitszeitenFuerTag ( Employee emp , DateTime tag )
{
if ( tag . Day = = 24 & & tag . Month = = 12 & & tag . Year = = 2025 )
{
}
decimal soll = 0 ;
var fak = GetFeiertagsFaktor ( tag ) ;
if ( BerechneFeiertageAlsArbeitszeit ( ) )
{
if ( fak = = 1 )
{
fak = 0 ;
}
}
if ( fak < 1 )
{
if ( emp . Arbeitszeiten ! = null )
{
foreach ( var az in emp . Arbeitszeiten )
{
if ( ( ! az . GueltigVon . HasValue | | az . GueltigVon . Value < = tag ) & &
( ! az . GueltigBis . HasValue | | az . GueltigBis . Value > = tag ) )
{
var std = GetArbeitszeitStundenFuerTag ( az , tag ) ;
soll + = ( std * ( 1 - fak ) ) ;
}
}
}
}
return soll ;
}
2023-08-30 00:27:43 +02:00
public virtual bool IstSchule ( String name )
{
if ( ! String . IsNullOrEmpty ( name ) )
{
return name . ToLower ( ) . Contains ( "schule" ) | | name . ToLower ( ) . Contains ( "kindergarten" ) ;
}
return false ;
}
2026-07-14 15:41:32 +02:00
public override bool AddServiceRecordToDuration ( StundenkontoServiceRecord item )
2023-08-30 00:27:43 +02:00
{
2026-07-14 15:41:32 +02:00
if ( item . ServiceDescription ! = null & & item . ServiceDescription . Category ! = null )
2023-08-30 00:27:43 +02:00
{
2024-11-14 10:24:19 +01:00
if ( ! item . ServiceDescription . Name . Contains ( "Pause" ) & & item . ServiceDescription . Name ! = "Zeitabzug" )
2023-08-30 00:27:43 +02:00
{
2026-07-14 15:41:32 +02:00
if ( item . ServiceDescription . Category . Name = = "Arbeitszeit" | | item . ServiceDescription . Category . Name = = "Buchhaltung" )
2023-08-30 00:27:43 +02:00
{
return true ;
}
}
}
2024-11-14 10:24:19 +01:00
if ( item . ServiceDescription . Name . Contains ( "Pause" ) )
{
int test = 0 ;
}
2023-08-30 00:27:43 +02:00
return false ;
}
public override decimal BerechneSollProWoche ( Contract c , MitarbeiterstundenkontoRO . EmployeeDetail ed )
{
2024-06-19 16:13:56 +02:00
//if (c != null && c.MonthlyTotalHours.HasValue && c.MonthlyTotalHours.Value > 0)
//{
// if (ed != null && ed.Employee != null && ed.Employee.IsActive == ActivationTypeId.Active)
// {
// var name = ed.LastName;
// }
// var sollProWoche = Math.Round(c.MonthlyTotalHours.Value / 4.348m, 2, MidpointRounding.AwayFromZero);
// if (ed.SollProTag == 0)
// {
// ed.SollProTag = sollProWoche / 5;
// }
// return sollProWoche;
//}
2023-08-30 00:27:43 +02:00
return base . BerechneSollProWoche ( c , ed ) ;
}
public override void BerechneSollStundenFuerDayDetail ( MitarbeiterstundenkontoRO . EmployeeDetail ed , MitarbeiterstundenkontoRO . DayDetail dd )
{
base . BerechneSollStundenFuerDayDetail ( ed , dd ) ;
}
2026-07-14 15:41:32 +02:00
protected override ServiceRecordSummary BerechneStunden ( MitarbeiterstundenkontoRO . EmployeeDetail empDetail , IList < StundenkontoServiceRecord > groupFilteredRecords , DateTime berichtsAnfang ,
2023-08-30 00:27:43 +02:00
DateTime berichtsEnde )
{
decimal flsGesamt = 0 ;
decimal arbeitszeit = 0 ;
var sum = new ServiceRecordSummary ( ) ;
2026-07-14 15:41:32 +02:00
sum . RecordsImBerichtszeitraum = new List < StundenkontoServiceRecord > ( ) ;
2023-08-30 00:27:43 +02:00
//base.CorrectOverlappingTimes(groupFilteredRecords);
foreach ( var item in groupFilteredRecords )
{
if ( ! IsServiceRecordFehlzeit ( item ) )
{
2026-07-14 15:41:32 +02:00
if ( item . Start > = berichtsAnfang & & item . Start < berichtsEnde )
2023-08-30 00:27:43 +02:00
{
//if (AddServiceRecordToDuration(item))
//{
2023-12-22 00:24:48 +01:00
var duration = GetDuration ( item , empDetail ) ;
2023-08-30 00:27:43 +02:00
if ( item . ServiceDescription ! = null & &
2026-07-14 15:41:32 +02:00
item . ServiceDescription . Category ! = null )
2023-08-30 00:27:43 +02:00
{
2026-07-14 15:41:32 +02:00
if ( item . ServiceDescription . Category . Name = = "Arbeitszeit" | | item . ServiceDescription . Category . Name = = "Buchhaltung" )
2023-08-30 00:27:43 +02:00
{
2024-11-14 10:24:19 +01:00
if ( ! item . ServiceDescription . Name . Contains ( "Pause" ) )
2023-08-30 00:27:43 +02:00
{
2023-12-22 00:24:48 +01:00
arbeitszeit + = duration ;
2023-08-30 00:27:43 +02:00
}
2024-11-14 10:24:19 +01:00
else
{
2026-02-10 18:50:23 +01:00
//arbeitszeit -= duration;
2024-11-14 10:24:19 +01:00
}
2023-08-30 00:27:43 +02:00
}
2026-07-14 15:41:32 +02:00
else if ( item . ServiceDescription . Category . IsBillable )
2023-08-30 00:27:43 +02:00
{
flsGesamt + = duration ;
}
}
sum . RecordsImBerichtszeitraum . Add ( item ) ;
}
}
}
sum . IstAbrechenbar = flsGesamt ;
sum . IstNichtAbrechenbar = arbeitszeit - flsGesamt ;
return sum ;
}
2026-07-14 15:41:32 +02:00
public override IList < MitarbeiterstundenkontoRO . DayDetail > CreateDayDetails ( DateTime berichtStart , DateTime berichtEnde , MitarbeiterstundenkontoRO . EmployeeDetail ed , IList < StundenkontoServiceRecord > recordsAll )
2023-08-30 00:27:43 +02:00
{
var list = base . CreateDayDetails ( berichtStart , berichtEnde , ed , recordsAll ) ;
foreach ( var dd in list )
{
dd . PauseInMinuten = 0 ;
foreach ( var sr in recordsAll )
{
2026-07-14 15:41:32 +02:00
if ( sr . Start > = berichtStart & & sr . Start < berichtEnde & & sr . Start . Day = = dd . Date . Day )
2023-08-30 00:27:43 +02:00
{
2023-11-01 16:13:22 +01:00
decimal duration = GetDuration ( sr , ed ) ;
2023-08-30 00:27:43 +02:00
2024-11-14 10:24:19 +01:00
if ( sr . ServiceDescription . Name . Contains ( "Pause" ) )
2023-08-30 00:27:43 +02:00
{
dd . PauseInMinuten + = duration ;
2024-11-14 10:24:19 +01:00
dd . MinutesTotal - = duration ;
2023-08-30 00:27:43 +02:00
}
}
}
2024-01-03 12:18:26 +01:00
var absenceTimes = ed . Employee . AbsenceTimes ;
if ( dd . AbsenceTimes = = null & & absenceTimes ! = null )
{
foreach ( var absenceTime in absenceTimes )
{
if ( absenceTime . Start < dd . Date . AddDays ( 1 ) & & ( ! absenceTime . End . HasValue | | absenceTime . End > = dd . Date ) )
{
if ( dd . AbsenceTimes = = null )
{
dd . AbsenceTimes = new List < AbsenceTime > ( ) ;
}
dd . AbsenceTimes . Add ( absenceTime ) ;
}
}
}
2024-05-22 13:31:05 +02:00
bool feiertagAnrechnen = true ;
2023-08-30 00:27:43 +02:00
if ( dd . AbsenceTimes ! = null )
{
2025-09-09 00:44:55 +02:00
if ( dd . Date . Year = = 2024 & & dd . Date . Month = = 12 & & dd . Date . Day = = 24 )
{
int test = 0 ;
}
2023-08-30 00:27:43 +02:00
foreach ( var at in dd . AbsenceTimes )
{
if ( IstAnrechenbareAbsenceTime ( at ) )
{
2024-07-11 11:25:55 +02:00
var sollProTag = BerechneSollAmTag ( ed , dd . Date ) ;
2024-03-03 19:07:45 +01:00
2024-05-22 13:31:05 +02:00
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "krank in der schulzeit" ) | |
at . AbsenceReason . Description . ToLower ( ) . Contains ( "mutterschutz" ) )
{
2025-05-15 20:41:41 +02:00
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "mutterschutz" ) & & IstTeamMartinsschule ( ed , dd . Date ) )
{
//sollProTag unverändert laut Frau Hildmann am 22.04.2025
}
else
2024-05-22 13:31:05 +02:00
{
2025-05-15 20:41:41 +02:00
var key = String . Format ( "{0}_{1:yyyyMMdd}" , ed . Employee . Oid , dd . Date ) ;
if ( _SollStundenProTagDict . ContainsKey ( key ) )
{
sollProTag = _SollStundenProTagDict [ key ] ;
}
2024-05-22 13:31:05 +02:00
}
}
var faktor = GetFeiertagsFaktor ( dd . Date ) ;
if ( faktor > 0 )
{
2024-09-01 20:47:02 +02:00
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "krank ohne lohnfortzahlung" ) )
2024-05-22 13:31:05 +02:00
{
feiertagAnrechnen = false ;
dd . HoursSick = sollProTag ;
}
}
2024-03-03 19:07:45 +01:00
if ( faktor < 1 & & dd . Date . DayOfWeek ! = DayOfWeek . Saturday & & dd . Date . DayOfWeek ! = DayOfWeek . Sunday )
2023-09-08 15:52:55 +02:00
{
2024-03-03 19:07:45 +01:00
if ( IsKrankheitAbsenceTime ( at ) )
{
2024-05-22 13:31:05 +02:00
dd . HoursSick = sollProTag ;
2024-03-03 19:07:45 +01:00
}
else if ( IsUrlaubAbsenceTime ( at ) )
{
2024-05-22 13:31:05 +02:00
dd . HoursInVacation = sollProTag ;
2025-09-09 00:44:55 +02:00
if ( faktor > 0 )
{
dd . HoursInVacation * = faktor ;
}
2024-03-03 19:07:45 +01:00
}
else
{
2024-05-22 13:31:05 +02:00
dd . MinutesTotal = sollProTag * 60 ;
2024-03-03 19:07:45 +01:00
}
2023-09-08 15:52:55 +02:00
}
2023-08-30 00:27:43 +02:00
}
else
{
2024-02-19 14:15:43 +01:00
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "eigenes kind krank" ) | |
at . AbsenceReason . Description . ToLower ( ) . Contains ( "ohne lohnfortzahlung" ) | |
at . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) | |
at . AbsenceReason . Description . ToLower ( ) . Contains ( "mutterschutz" ) | |
2024-04-25 02:15:41 +02:00
at . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | |
2024-02-19 14:15:43 +01:00
at . AbsenceReason . Description . ToLower ( ) . Contains ( "unbezahlter urlaub" ) )
2023-11-24 02:46:50 +01:00
{
dd . Custom1 = "x" ; // String.Format("{0:0.00}", ed.SollProTag * 60);
}
2024-09-06 00:43:52 +02:00
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "krank ohne lohnfortzahlung" ) )
{
feiertagAnrechnen = false ;
}
2023-08-30 00:27:43 +02:00
}
}
}
2023-09-08 15:52:55 +02:00
if ( dd . Feiertag = = null )
{
2024-02-19 14:15:43 +01:00
//var ft = GetFerienTag(dd.Date);
//if (ft != null)
//{
// dd.Feiertag = new FeiertagDC();
// dd.Feiertag.Datum = dd.Date;
// dd.Feiertag.Name = ft.Name;
//}
2023-09-08 15:52:55 +02:00
}
if ( dd . IstFeiertag & & dd . Date . DayOfWeek ! = DayOfWeek . Saturday & & dd . Date . DayOfWeek ! = DayOfWeek . Sunday )
{
2024-07-11 11:25:55 +02:00
if ( feiertagAnrechnen & & HatVertrag ( ed , dd . Date ) )
2024-05-22 13:31:05 +02:00
{
2024-07-11 11:25:55 +02:00
var soll = BerechneSollAmTag ( ed , dd . Date ) * 60 ;
2024-09-01 20:47:02 +02:00
soll * = GetFeiertagsFaktor ( dd . Date ) ;
2024-06-19 16:13:56 +02:00
if ( dd . MinutesTotal < = soll )
{
dd . MinutesTotal = soll ;
}
else
{
int test = 0 ;
}
2024-05-22 13:31:05 +02:00
}
else
{
dd . MinutesTotal = 0 ;
}
2023-09-08 15:52:55 +02:00
}
2024-11-14 10:24:19 +01:00
2023-08-30 00:27:43 +02:00
}
return list ;
}
2024-09-06 00:43:52 +02:00
public override decimal BerechneSollStundenFuerTag ( MitarbeiterstundenkontoRO . EmployeeDetail ed , DateTime date )
{
2025-09-09 00:44:55 +02:00
if ( date = = new DateTime ( 2024 , 12 , 24 ) )
2024-09-06 00:43:52 +02:00
{
int test = 0 ;
}
var soll = base . BerechneSollStundenFuerTag ( ed , date ) ;
if ( soll > 0 & & IstFeiertag ( date ) )
{
var at = GetAbsenceTimeForDate ( ed , date ) ;
if ( at ! = null )
{
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "krank ohne lohnfortzahlung" ) )
{
return 0 ;
}
}
}
return soll ;
}
2024-07-11 11:25:55 +02:00
private bool HatVertrag ( MitarbeiterstundenkontoRO . EmployeeDetail ed , DateTime date )
{
return ed . Employee . GetValidContractForDate ( date ) ! = null ;
}
2023-10-26 00:06:56 +02:00
protected override bool HatArbeitszeitImZeitraum ( IList < Arbeitszeit > arbeitszeiten , DateTime start , DateTime ende )
{
return false ;
}
//protected override decimal? GetSollNachArbeitszeiten(Employee emp, DateTime start, DateTime ende)
//{
// return null;
//}
//public override AbsenceTimeDays GetAbsenceTimeDaysWithWorkWeeks(Employee emp, DateTime start, DateTime end, int arbeitstageProWoche)
//{
// return base.GetAbsenceTimeDaysWithWorkWeeks(emp.AbsenceTimes, start, end, arbeitstageProWoche);
//}
2023-08-30 00:27:43 +02:00
public override bool IstAnrechenbareAbsenceTime ( AbsenceTime item )
{
2024-02-19 14:15:43 +01:00
if ( item . AbsenceReason . Description . ToLower ( ) . Contains ( "freizeitausgleich" ) | |
item . AbsenceReason . Description . ToLower ( ) . Contains ( "krank in der freistellung" ) | |
item . AbsenceReason . Description . ToLower ( ) . Contains ( "krank beweglicher " ) | |
item . AbsenceReason . Description . ToLower ( ) . Contains ( "unbezahlter urlaub" ) | |
2024-07-11 11:25:55 +02:00
item . AbsenceReason . Description . ToLower ( ) . Contains ( "interner termin" ) | |
item . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | |
2024-05-22 13:31:05 +02:00
//item.AbsenceReason.Description.ToLower().Contains("mutterschutz") ||
2024-02-19 14:15:43 +01:00
item . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) )
2023-08-30 00:27:43 +02:00
{
return false ;
}
return base . IstAnrechenbareAbsenceTime ( item ) ;
}
2023-09-08 15:52:55 +02:00
public override bool IsKrankheitAbsenceTime ( AbsenceTime item )
2023-08-30 00:27:43 +02:00
{
2024-05-22 13:31:05 +02:00
if ( item . AbsenceReason . Description . ToLower ( ) . Contains ( "beschäftigungsverbot" ) )
{
return true ;
}
if ( item . AbsenceReason . Description . ToLower ( ) . IndexOf ( "unbezahlter urlaub" ) > = 0 )
2023-08-30 00:27:43 +02:00
{
return false ;
}
2024-07-11 11:25:55 +02:00
if ( item . AbsenceReason . Description . ToLower ( ) . IndexOf ( "krankengeld" ) > = 0 )
{
return false ;
}
2023-09-08 15:52:55 +02:00
return base . IsKrankheitAbsenceTime ( item ) ;
2023-08-30 00:27:43 +02:00
}
2024-02-19 14:15:43 +01:00
public override bool IsUrlaubAbsenceTime ( AbsenceTime item )
{
if ( ( item . AbsenceReason . Description . ToLower ( ) . IndexOf ( "krank" ) > = 0 ) )
{
return false ;
}
return base . IsUrlaubAbsenceTime ( item ) ;
}
2023-09-08 15:52:55 +02:00
2023-08-30 00:27:43 +02:00
public override bool SollPauseBerechnen ( )
{
return true ;
}
2023-06-07 09:45:20 +02:00
2023-08-23 23:15:58 +02:00
public override bool ShouldCreateDayDetails ( )
{
return true ;
}
2023-11-23 02:16:27 +01:00
public override bool BerechneFeiertageAlsArbeitszeit ( )
{
return true ;
}
public override bool AbsenceTimeAufIstStundenAddieren ( AbsenceTime at )
{
return false ;
}
2024-06-19 16:13:56 +02:00
public override decimal GetArbeitstageImBereich ( DateTime von , DateTime bis , Employee emp )
{
DateTime start = von ;
DateTime end = bis ;
TimeSpan ts = end . Subtract ( start ) ;
var maxDays = ( decimal ) ts . TotalDays ;
while ( start < end )
{
int arbeitstageProWoche = 5 ;
var c = GetContractForDate ( emp , start , start ) ;
if ( c ! = null & & c . WeeklyDays . HasValue & & c . WeeklyDays > 0 )
{
arbeitstageProWoche = c . WeeklyDays . Value ;
}
if ( arbeitstageProWoche < = 5 & & ( start . DayOfWeek = = DayOfWeek . Saturday | | start . DayOfWeek = = DayOfWeek . Sunday ) )
{
maxDays - = 1 ;
}
else if ( arbeitstageProWoche = = 6 & & start . DayOfWeek = = DayOfWeek . Sunday )
{
maxDays - = 1 ;
}
else
{
2025-09-17 11:02:35 +02:00
var istArbeitstag = true ;
if ( arbeitstageProWoche < 5 )
2024-06-19 16:13:56 +02:00
{
2025-09-17 11:02:35 +02:00
//Wenn Tage < 5 hole die zu arbeitenden Wochentage aus dem Stundenplan des betreuten Kindes
decimal stundenAnDiesemTag = 0 ;
foreach ( var e2c in emp . Employee2CustomerList )
2024-06-19 16:13:56 +02:00
{
2025-09-17 11:02:35 +02:00
if ( ( ! e2c . StartDate . HasValue | | e2c . StartDate . Value . Date < = start . Date ) & & ( ! e2c . EndDate . HasValue | | e2c . EndDate . Value . Date > = start . Date ) )
2024-06-19 16:13:56 +02:00
{
2025-09-17 11:02:35 +02:00
var kind = e2c . Customer ;
foreach ( var az in kind . Arbeitszeiten )
2024-06-19 16:13:56 +02:00
{
2025-09-17 11:02:35 +02:00
if ( ( ! az . GueltigVon . HasValue | | az . GueltigVon . Value . Date < = start . Date ) & & ( ! az . GueltigBis . HasValue | | az . GueltigBis . Value . Date > = start . Date ) )
{
istArbeitstag = false ;
foreach ( var ae in az . ArbeitszeitEintraege )
{
if ( ae . Customer = = null | | ae . Customer . Oid = = kind . Oid )
{
if ( ae . IstAmGleichenWochentag ( start ) )
{
stundenAnDiesemTag + = ae . BerechneStunden ( ) ;
}
}
}
if ( stundenAnDiesemTag > 0 )
{
istArbeitstag = true ;
}
}
}
}
}
if ( ! istArbeitstag )
{
maxDays - - ; // Kein Arbeitstag, also Anzahl um eins verringern
}
}
if ( istArbeitstag )
{
foreach ( var at in emp . AbsenceTimes )
{
if ( at . AbsenceReason . Description . ToLower ( ) . Contains ( "unbezahlter urlaub" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "krankengeld" ) | | at . AbsenceReason . Description . ToLower ( ) . Contains ( "elternzeit" ) )
{
if ( at . Start . Value < = start & & ( ! at . End . HasValue | | at . End . Value > = start ) )
{
if ( maxDays > = 1 )
{
maxDays - - ;
}
2024-06-19 16:13:56 +02:00
}
}
}
}
}
start = start . AddDays ( 1 ) ;
}
return maxDays ;
}
2023-11-24 02:46:50 +01:00
public override decimal? GetSollStundenForAbsenceTime ( MitarbeiterstundenkontoRO . EmployeeDetail ed , AbsenceTime at , DateTime datum )
{
2024-07-11 11:25:55 +02:00
if ( at . AbsenceReason . Description . Contains ( "krank in der Schulzeit" ) | | at . AbsenceReason . Description . Contains ( "Mutterschutz" ) )
2023-11-24 02:46:50 +01:00
{
2024-05-22 13:31:05 +02:00
var key = String . Format ( "{0}_{1:yyyyMMdd}" , ed . Employee . Oid , datum ) ;
if ( _SollStundenProTagDict . ContainsKey ( key ) )
{
return _SollStundenProTagDict [ key ] ;
}
2023-11-24 02:46:50 +01:00
}
return base . GetSollStundenForAbsenceTime ( ed , at , datum ) ;
}
2024-05-22 13:31:05 +02:00
public override decimal BerechneStundenDurchAbwesenheiten ( AbsenceTimeDays ath , DateTime start , DateTime ende , Contract c , MitarbeiterstundenkontoRO . EmployeeDetail ed )
{
if ( ath . StundenGesamt . HasValue )
{
return ath . StundenGesamt . Value ;
}
return base . BerechneStundenDurchAbwesenheiten ( ath , start , ende , c , ed ) ;
}
2023-08-23 23:15:58 +02:00
public override MitarbeiterstundenkontoRO . DayDetail CreateDayDetail ( DateTime date , MitarbeiterstundenkontoRO . EmployeeDetail ed )
{
var dd = base . CreateDayDetail ( date , ed ) ;
dd . MaxHoursUntilBreak = null ;
dd . MaxHoursUntilBreak2 = null ;
dd . BreakMinutes = null ;
dd . BreakMinutes2 = null ;
return dd ;
}
2023-06-07 09:45:20 +02:00
2026-07-14 15:41:32 +02:00
protected override decimal GetDuration ( StundenkontoServiceRecord sr , MitarbeiterstundenkontoRO . EmployeeDetail ed )
2023-12-22 00:24:48 +01:00
{
var d = base . GetDuration ( sr , ed ) ;
2026-07-14 15:41:32 +02:00
if ( sr . ServiceDescription . Category . Name = = "Buchhaltung" & & sr . ServiceDescription . Name . Contains ( "negativ" ) )
2023-12-22 00:24:48 +01:00
{
d * = - 1 ;
}
2024-11-14 10:24:19 +01:00
if ( sr . ServiceDescription . Name . Contains ( "Pause" ) )
{
int test = 0 ;
}
2023-12-22 00:24:48 +01:00
return d ;
}
2023-09-08 15:52:55 +02:00
public override decimal GetFeiertagsFaktor ( DateTime start )
{
2024-02-19 14:15:43 +01:00
//if (GetFerienTag(start) != null)
//{
// return 1;
//}
2024-09-01 20:47:02 +02:00
if ( start . Month = = 12 )
{
if ( start . Day = = 24 | | start . Day = = 31 )
{
return 0.5 m ;
}
}
2023-09-08 15:52:55 +02:00
return base . GetFeiertagsFaktor ( start ) ;
}
2026-07-14 15:41:32 +02:00
public override decimal BerechnePauseMinuten ( IList < StundenkontoServiceRecord > srListAlle )
2024-11-14 10:24:19 +01:00
{
2026-07-14 15:41:32 +02:00
var srList = srListAlle . Where ( s = > s . ServiceDescription . Category . Name = = "Arbeitszeit" ) ;
2024-11-14 10:24:19 +01:00
decimal pausenZeit = 0 ;
2026-07-14 15:41:32 +02:00
List < StundenkontoServiceRecord > pausen = new List < StundenkontoServiceRecord > ( ) ;
List < StundenkontoServiceRecord > nichtpausen = new List < StundenkontoServiceRecord > ( ) ;
2024-11-14 10:24:19 +01:00
foreach ( var sr in srList )
{
2026-02-10 18:50:23 +01:00
if ( sr . ServiceDescription . Name . Contains ( "Pause" ) )
2024-11-14 10:24:19 +01:00
{
pausen . Add ( sr ) ;
}
else
{
nichtpausen . Add ( sr ) ;
}
}
foreach ( var pause in pausen )
{
pausenZeit + = pause . RoundedDuration ;
}
return pausenZeit ;
}
2024-06-12 16:46:46 +02:00
protected override bool StundenDurchAbwesenheitenDuerfenNegativSein ( )
{
return true ;
}
2023-09-08 15:52:55 +02:00
public FerienDC GetFerienTag ( DateTime start )
{
return vacationService . GetFerien ( start , vacationService . Bundesland ) ;
}
2024-09-01 20:47:02 +02:00
2023-06-07 09:45:20 +02:00
}
}