@@ -16,6 +16,9 @@ namespace BeWo.Service.Plugins
{
public class VacationService : AbstractIDSpecificDefaultClass < VacationService >
{
private List < DateTime > _Feiertage { get ; set ; }
public virtual bool IstFeiertag ( DateTime start )
{
List < DateTime > feiertage = GetFeiertage ( start . Year ) ;
@@ -180,6 +183,11 @@ namespace BeWo.Service.Plugins
return list ;
}
private void SetLokaleFeiertagListe ( int year )
{
_Feiertage = GetFeiertage ( year ) ;
}
public virtual List < long > GetVacationReasonIDs ( )
{
var res = new List < long > ( ) ;
@@ -212,10 +220,26 @@ namespace BeWo.Service.Plugins
{
List < UrlaubskontoDarstellungDC > dcs = new List < UrlaubskontoDarstellungDC > ( ) ;
EmployeeServiceImp es = new EmployeeServiceImp ( ) ;
var ent = DAOFactory . GenericDAO . LoadByID < Employee > ( ( long ) emp . EmployeeOid ) ;
var urlaubskonten = BerechneUrlaubskonto ( ent , year ) ;
var aktuellesKonto = urlaubskonten . First ( u = > u . Key = = year ) ;
decimal summeAllerUrlaube = 0 ;
decimal geschenktInDiesemJahr = 0 ;
var geschenkteUrlaubstage = es . GetGeschenkteUrlaubstageForEmployee ( ( long ) emp . EmployeeOid ) ;
foreach ( var tage in geschenkteUrlaubstage )
{
if ( tage . Date . Year = = year )
geschenktInDiesemJahr + = tage . AnzahlTage ;
}
// Benötigt werden:
// Vetragliche Urlaubstage für´ s Jahr
ContractDC contract = null ;
List < ContractDC> contracts = new List < ContractDC > ( ) ;
foreach ( var c in emp . Contracts ) // Vertrag für Jahr raussuchen
{
DateTime contractEndDate = new DateTime ( ) ;
@@ -225,27 +249,79 @@ namespace BeWo.Service.Plugins
contractEndDate = c . ContractEndDate . Value ;
if ( year > = c . EntryDate . Value . Year & & year < = contractEndDate . Year )
{
contract = c ;
break ;
contracts . Add ( c ) ;
// break;
}
}
if ( contract = = null ) // Kein Vertrag = kein Urlaubskonto
if ( contracts . Count = = 0 ) // Kein Vertrag = kein Urlaubskonto
return null ;
dcs . Add ( new UrlaubskontoDarstellungDC ( )
{
Erlaeuterung = "Urlaubstage im Jahr " + year + ":" ,
AnzahlTage = contract . EmploymentType . LeaveDays = = null ? string . Format ( "{0:0.00}" , ( decimal ) contract . LeaveDays ) : string . Format ( "{0:0.00}" , ( decimal ) contract . EmploymentType . LeaveDays ) ,
Herkunft = string . Format ( "EmpOid:{0} ContractOid:{1}" , emp . EmployeeOid , contract . ContractOid ) ,
Tooltip = null ,
IsDeletable = false ,
DatumZurSortierung = null
} ) ;
// Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
foreach ( var contract in contracts )
{
decimal tageNachAbzug = 0 ;
decimal abzuziehendeTage = 0 ;
int arbeitstage = contract . WeeklyDays ! = null ? ( int ) contract . WeeklyDays : 0 ;
DateTime ? endDate = contract . ContractEndDate = = null ? new DateTime ( year , 12 , 31 ) : contract . ContractEndDate ;
var leaveDays = contract . EmploymentType . LeaveDays = = null ? contract . LeaveDays : contract . EmploymentType . LeaveDays ;
if ( contract . EntryDate . Value . Year = = year | | endDate . Value . Year = = year ) // Endet oder beginnt Vertrag in gewähltem Jahr
{
if ( contract . EntryDate . Value . Year = = year )
{
if ( endDate > = new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) ) // Wenn Vertrag länger gilt als das gewählte Jahr
{
int restlicheTageImJahr = Convert . ToInt32 ( ( new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) - contract . EntryDate . Value . Date ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , null , arbeitstage , restlicheTageImJahr , leaveDays ) ;
}
else // Wenn Ende des Vertrags im gleichen Jahr vor Jahresende ist
{
int restlicheTageImJahr = Convert . ToInt32 ( ( contract . ContractEndDate . Value . Date - contract . EntryDate . Value . Date ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , contract . ContractEndDate . Value . Date , arbeitstage , restlicheTageImJahr , leaveDays ) ;
}
}
else if ( endDate . Value . Year = = year )
{
int restlicheTageImJahr = Convert . ToInt32 ( ( ( DateTime ) endDate - new DateTime ( year , 1 , 1 ) ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , endDate , arbeitstage , restlicheTageImJahr , leaveDays ) ;
}
abzuziehendeTage = ( decimal ) leaveDays - tageNachAbzug ;
#region
//if (abzuziehendeTage != 0)
//{
// dcs.Add(new UrlaubskontoDarstellungDC()
// {
// Erlaeuterung = "Wegen Vertragsbeginn/-ende abzuziehende Tage: ",
// AnzahlTage = string.Format("-{0:0.00}", abzuziehendeTage),
// Herkunft = string.Format("EmpOid:{0}", emp.EmployeeOid),
// Tooltip = null,
// IsDeletable = false,
// DatumZurSortierung = null
// });
//}
#endregion
}
var contractStart = contract . EntryDate . Value . ToString ( ) . Split ( ' ' ) ;
var contractEnd = contract . ContractEndDate ! = null ? contract . ContractEndDate . Value . ToString ( ) . Split ( ' ' ) : null ;
var obereZeile = new UrlaubskontoDarstellungDC ( )
{
AnzahlTage = contract . EmploymentType . LeaveDays = = null ? string . Format ( "{0:0.00}" , ( decimal ) contract . LeaveDays - abzuziehendeTage ) : string . Format ( "{0:0.00}" , ( decimal ) contract . EmploymentType . LeaveDays - abzuziehendeTage ) ,
Herkunft = string . Format ( "EmpOid:{0} ContractOid:{1}" , emp . EmployeeOid , contract . ContractOid ) ,
Tooltip = null ,
IsDeletable = false ,
DatumZurSortierung = null
} ;
obereZeile . Erlaeuterung = contractEnd = = null ? "Urlaubstage laut Vertrag vom " + contractStart [ 0 ] + ":" : "Urlaubstage laut Vertrag vom " + contractStart [ 0 ] + " bis " + contractEnd [ 0 ] + ":" ;
dcs . Add ( obereZeile ) ;
}
// Geschenkte Urlaubstage im Jahr
var geschenkteUrlaubstage = es . GetGeschenkteUrlaubstageForEmployee ( ( long ) emp . EmployeeOid ) ;
if ( geschenkteUrlaubstage . Count > 0 & & geschenkteUrlaubstage . Any ( g = > g . Date . Year = = year ) )
{
#region
//Gesamtanzahl der gesch. Urlaubstage fürs Jahr summieren
//decimal summeGeschenkteUrlaubstage = 0;
//foreach (var tage in geschenkteUrlaubstage)
@@ -263,8 +339,8 @@ namespace BeWo.Service.Plugins
// IsDeletable = false,
// DatumZurSortierung = null
//});
// Einen Eintrag pro G eschenktem Urlaubstag
#endregion
// Einen Eintrag pro g eschenktem Urlaubstag
foreach ( var eintrag in geschenkteUrlaubstage )
{
if ( eintrag . Date . Year = = year )
@@ -287,19 +363,16 @@ namespace BeWo.Service.Plugins
var absReason = GetVacationReasonIDs ( ) ;
var absences = emp . AbsenceTimes . Where ( x = > absReason . Contains ( x . Reason . AbsenceReasonOid . Value ) & & ( x . Start . HasValue & & x . Start . Value . Year = = year )
| | absReason . Contains ( x . Reason . AbsenceReasonOid . Value ) & & ( x . End . HasValue & & x . End . Value . Year = = year ) )
. OrderBy ( x = > x . Start ) ;
. OrderBy ( x = > x . Start ) . ToList ( ) ;
// Verfallener Resturlaub
var ent = DAOFactory . GenericDAO . LoadByID < Employee > ( ( long ) emp . EmployeeOid ) ;
var urlaubskontos = BerechneUrlaubskonto ( ent , year ) ;
var aktuellesKonto = urlaubskontos . First ( u = > u . Key = = year ) ;
// Verfallsdatum der Urlaubstage des letzten Jahres
var expDate = GetExpirationDate ( year ) . ToString ( ) . Split ( ' ' ) ;
// Resturlaub und den verbleibenden Resturlaub nach Verfall erstellen
if ( aktuellesKonto . Value . ResturlaubVorjahrTotal ! = 0 )
{
#region
//dcs.Add(new UrlaubskontoDarstellungDC()
//{
// Erlaeuterung = "Resturlaub aus " + (year - 1),
@@ -318,72 +391,34 @@ namespace BeWo.Service.Plugins
// Tooltip = null,
// IsDeletable = false
//});
#endregion
dcs . Add ( new UrlaubskontoDarstellungDC ( )
{
//Erlaeuterung = "\tübrig: ",
Erlaeuterung = "Resturlaub aus " + ( year - 1 ) + " nach Verfall :" ,
AnzahlTage = string . Format ( "+{0:0.00}" , aktuellesKonto . Value . ResturlaubVorjahrTotal - aktuellesKonto . Value . VerfallenerUrlaub ) ,
Erlaeuterung = "Resturlaub aus " + ( year - 1 ) + " :" ,
AnzahlTage = string . Format ( "+{0:0.00}" , aktuellesKonto . Value . ResturlaubVorjahrTotal ) ,
Herkunft = string . Format ( "EmpOid:{0} Urlaubskonto:{1}" , emp . EmployeeOid , year ) ,
Tooltip = null ,
IsDeletable = false
} ) ;
}
// Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
decimal tageNachAbzug = 0 ;
int arbeitstage = contract . WeeklyDays ! = null ? ( int ) contract . WeeklyDays : 0 ;
DateTime ? endDate = contract . ContractEndDate = = null ? new DateTime ( year , 12 , 31 ) : contract . ContractEndDate ;
/*HIER NOCHMAL DRÜBER GUCKEN, VERMUTLICH FEHLER*/
if ( contract . EntryDate . Value . Year = = year | | endDate . Value . Year = = year ) // Endet oder beginnt Vertrag in gewähltem Jahr
if ( aktuellesKonto . Value . VerfallenerUrlaub ! = 0 )
{
if ( contract . EntryDate . Value . Year = = year )
dcs . Add ( new UrlaubskontoDarstellungDC ( )
{
if ( endDate > = new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) ) // Wenn Vertrag länger gilt als das gewählte Jahr
{
int restlicheTageImJahr = Convert . ToInt32 ( ( new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) - contract . Entry Date . Value . Date ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , null , arbeitstage , restlicheTageImJahr , aktuellesKonto . Value . Urlaubsanspruch ) ;
}
else // Wenn Ende des Vertrags im gleichen Jahr vor Jahresende ist
{
int restlicheTageImJahr = Convert . ToInt32 ( ( contract . ContractEndDate . Value . Date - contract . EntryDate . Value . Date ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , contract . ContractEndDate . Value . Date , arbeitstage , restlicheTageImJahr , aktuellesKonto . Value . Urlaubsanspruch ) ;
}
}
if ( endDate . Value . Year = = year )
{
int restlicheTageImJahr = Convert . ToInt32 ( ( ( DateTime ) endDate - new DateTime ( year , 1 , 1 ) ) . TotalDays ) ;
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , endDate , arbeitstage , restlicheTageImJahr , aktuellesKonto . Value . Urlaubsanspruch ) ;
}
var abzuziehendeTage = aktuellesKonto . Value . Urlaubsanspruch - tageNachAbzug ;
if ( abzuziehendeTage ! = 0 )
{
dcs . Add ( new UrlaubskontoDarstellungDC ( )
{
Erlaeuterung = "Wegen Vertragsbeginn/-ende abzuziehende Tage: " ,
AnzahlTage = string . Format ( "-{0:0.00}" , abzuziehendeTage ) ,
Herkunft = string . Format ( "EmpOid:{0}" , emp . EmployeeOid ) ,
Tooltip = null ,
IsDeletable = false ,
DatumZurSortierung = null
} ) ;
}
Erlaeuterung = string . Format ( "Urlaub am {0} verfallen: " , expDate [ 0 ] ) ,
AnzahlTage = string . Format ( "-{0:0.00}" , aktuellesKonto . Value . VerfallenerUrlaub ) ,
DatumZurSortierung = GetExpiration Date( year ) ,
Tooltip = null ,
IsDeletable = false
} ) ;
}
// Urlaube im Jahr
List < A bsenceTimeDC > urlaubstage = new List < AbsenceTimeDC > ( ) ;
foreach ( var abs in absences )
{
if ( abs . Reason . Description . ToLower ( ) . Contains ( "urlaub" ) )
{
urlaubstage . Add ( abs ) ;
}
}
if ( urlaubstage . Count > 0 )
// Urlaube im Jahr
if ( a bsences . Count > 0 )
{
// Gesamtzahl an genommenen Urlaubstagen
decimal summeAllerUrlaube = 0 ;
#region
//dcs.Add(new UrlaubskontoDarstellungDC()
//{
// Erlaeuterung = "Urlaubstage genommen:",
@@ -392,16 +427,16 @@ namespace BeWo.Service.Plugins
// Tooltip = "ABCDEFG",
// IsDeletable = false
//});
#endregion
// Urlaube durchgehen und die Tage zählen
foreach ( var spanne in urlaubstage )
foreach ( var spanne in absences )
{
decimal summeTage = 0 ;
#region
if ( spanne . End = = null ) // Kein Ende
spanne . End = new DateTime ( year , 12 , 31 ) ;
else if ( spanne . Start = = spanne . End ) // Nur ein Tag
if ( spanne . Start = = spanne . End ) // Nur ein Tag
summeTage + + ;
// Mehrere Tage
else
@@ -427,45 +462,66 @@ namespace BeWo.Service.Plugins
}
}
#endregion
// Urlaubs als Eintrag hinzufügen
// Urlaub als Eintrag hinzufügen
var startAsArray = spanne . Start . Value . ToString ( ) . Split ( ' ' ) ;
var endAsArray = spanne . End . Value . ToString ( ) . Split ( ' ' ) ;
dcs . Add ( new UrlaubskontoDarstellungDC ( )
{
Erlaeuterung = string . Format ( "Urlaub genommen von {0} bis {1} " , startAsArray [ 0 ] , endAsArray [ 0 ] ) ,
Erlaeuterung = startAsArray [ 0 ] = = endAsArray [ 0 ] ? string . Format ( "Urlaub genommen am {0}" , startAsArray [ 0 ] ) :
string . Format ( "Urlaub genommen vom {0} bis {1}" , startAsArray [ 0 ] , endAsArray [ 0 ] ) ,
AnzahlTage = string . Format ( "-{0:0.00}" , summeTage ) ,
Herkunft = string . Format ( "AbsenceOid: {0}" , spanne . AbsenceTimeOid ) ,
Tooltip = null ,
Tooltip = spanne . Notice ,
IsDeletable = false ,
DatumZurSortierung = spanne . Start . Value
} ) ;
summeAllerUrlaube + = summeTage ;
}
#region
// Eintrag finden, in dem die errechnete Summe aller Urlaubstage eingesetzt werden soll*
int index = 0 ;
for ( int i = 0 ; i < dcs . Count ; i + + )
{
if ( dcs [ i ] . Tooltip = = "ABCDEFG" )
{
dcs[ i ] . AnzahlTage = string. Format( "-{0:0.00}", summeAllerUrlaube) ;
dcs[ i ] . Tooltip = null ;
break ;
}
}
//int index = 0 ;
//for (int i = 0; i < dcs.Count; i++ )
// {
// if (dcs[i].Tooltip == "ABCDEFG")
// {
// dcs[i]. AnzahlTage = string. Format( "-{0:0.00}", summeAllerUrlaube) ;
// dcs[i].Tooltip = null;
// break;
// }
// }
#endregion
}
// Anzahl der daraus resultierenden Resturlaubstage
dcs . Add ( new UrlaubskontoDarstellungDC ( )
var letzteZeile = new UrlaubskontoDarstellungDC ( )
{
AnzahlTage = string . Format ( "={0:0.00}" , aktuellesKonto . Value . Resturlaub ) , //TESTEN, OB DAS IMMER GEHT
Erlaeuterung = "Summe der verbleibenden Urlaubstage: " ,
AnzahlTage = string . Format ( "={0:0.00}" , aktuellesKonto . Value . Resturlaub ) ,
Herkunft = "UrlaubskontoEmpOid" + aktuellesKonto . Value . EmployeeOid ,
Tooltip = null ,
IsDeletable = false ,
DatumZurSortierung = new DateTime ( 2999 , 12 , 31 )
} ) ;
} ;
#region
//if (contracts.Count > 1)
//{
// decimal urlaubsanspruchKombiniert = 0;
// foreach (var dc in dcs)
// {
// if (dc.Erlaeuterung.Contains("Urlaubstage laut Vertrag vom "))
// urlaubsanspruchKombiniert += Convert.ToDecimal(dc.AnzahlTage);
// }
// //urlaubsanspruchKombiniert -= summeAllerUrlaube;
// //urlaubsanspruchKombiniert += geschenktInDiesemJahr;
// letzteZeile.AnzahlTage = string.Format("={0:0.00}", urlaubsanspruchKombiniert - summeAllerUrlaube + geschenktInDiesemJahr);
//}
//else // Existiert nur ein Vertrag, stimmt der Resturlaub
// letzteZeile.AnzahlTage = string.Format("={0:0.00}", aktuellesKonto.Value.Resturlaub);
#endregion
dcs . Add ( letzteZeile ) ;
var sortierteDCs = dcs . OrderBy ( dc = > dc . DatumZurSortierung ) . ToList ( ) ;
@@ -476,6 +532,8 @@ namespace BeWo.Service.Plugins
{
try
{
SetLokaleFeiertagListe ( year ) ;
var absReason = GetVacationReasonIDs ( ) ;
var absences = emp . AbsenceTimes . Where ( x = > absReason . Contains ( x . AbsenceReason . Oid . Value ) & &
( x . Start . HasValue & & x . Start . Value . Year < = year ) )
@@ -483,7 +541,8 @@ namespace BeWo.Service.Plugins
. OrderBy ( x = > x . Start ) ;
var empService = new ServiceImplementations . EmployeeServiceImp ( ) ;
var geschenkteUrlaubstage = empService . GetGeschenkteUrlaubstageForEmployee ( ( long ) emp . Oid ) ;
//var geschenkteUrlaubstage = empService.GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
// Startzeitpunkt für Berechnung berechnen
var firstContractYear = emp . Contracts ? . Min ( x = > x . EntryDate ) ? . Year ? ? int . MaxValue ;
@@ -508,42 +567,55 @@ namespace BeWo.Service.Plugins
if ( konten . ContainsKey ( i ) )
{
var tmp = konten [ i ] ;
decimal anzGeschenkteTage = 0.0 m ;
if ( geschenkteUrlaubstage ! = null )
{
foreach ( var item in geschenkteUrlaubstage )
{
if ( item . Date . Year = = i )
anzGeschenkteTage + = item . AnzahlTage ;
}
}
if ( contract . EmploymentType . LeaveDays ! = null )
contract . LeaveDays = contract . EmploymentType . LeaveDays ;
tmp . U rlaubsanspruch + = contract . LeaveDays + anzGeschenkteTage ? ? 0 ;
tmp . Resturlaub = tmp . Urlaubsanspruch ;
var u rlaubsanspruchFuerVertragInLoop = contract . LeaveDays ? ? 0 ;
//tmp.Urlaubsanspruch += contract.LeaveDays ?? 0;
//tmp.Resturlaub = tmp.Urlaubsanspruch;
int arbeitstage = contract . WeeklyDays ! = null ? ( int ) contract . WeeklyDays : 0 ;
DateTime ? endDate = contract . ContractEndDate = = null ? new DateTime ( year , 12 , 31 ) : contract . ContractEndDate ;
if ( contract . EntryDate . Value . Year = = i )
if ( contract . EntryDate . Value . Year = = i | | endDate . Value . Year = = i ) // Endet oder beginnt Vertrag in gewähltem Jahr
{
if ( endDate > = new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) )
decimal errechneteTage = 0 ;
decimal weggefallen = 0 ;
if ( contract . EntryDate . Value . Year = = i )
{
int restlicheTageImJahr = Convert . ToInt32 ( ( new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) - contract . EntryDate . Value . Date ) . TotalDays ) ;
tmp . Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , null , arbeitstage , restlicheTageImJahr , tmp . Urlaubsanspruch ) ;
if ( endDate > = new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) )
{
int restlicheTageImJahr = Convert . ToInt32 ( ( new DateTime ( contract . EntryDate . Value . Year , 12 , 31 ) - contract . EntryDate . Value . Date ) . TotalDays ) ;
//tmp.Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, null, arbeitstage, restlicheTageImJahr, tmp.Urlaubsanspruch);
errechneteTage = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , null , arbeitstage , restlicheTageImJahr , urlaubsanspruchFuerVertragInLoop ) ;
weggefallen = urlaubsanspruchFuerVertragInLoop - errechneteTage ;
tmp . Resturlaub + = errechneteTage ;
}
else // Wenn Ende des Vertrags im gleichen Jahr vor Ende des Jahres ist
{
int restlicheTageImJahr = Convert . ToInt32 ( ( contract . ContractEndDate . Value . Date - contract . EntryDate . Value . Date ) . TotalDays ) ;
//tmp.Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, contract.ContractEndDate.Value.Date, arbeitstage, restlicheTageImJahr, tmp.Urlaubsanspruch);
errechneteTage + = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , contract . ContractEndDate . Value . Date , arbeitstage , restlicheTageImJahr , urlaubsanspruchFuerVertragInLoop ) ;
weggefallen = urlaubsanspruchFuerVertragInLoop - errechneteTage ;
tmp . Resturlaub + = errechneteTage ;
}
}
else // Wenn Ende des Vertrags im gleichen Jahr vor Ende des Jahres ist
else if ( endDate . Value . Year = = i )
{
int restlicheTageImJahr = Convert . ToInt32 ( ( contract . ContractEndDat e. Value . Date - contract . EntryDat e. Value . Date ) . TotalDays ) ;
tmp . Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation( ( DateTime) contract. EntryDate, contract . ContractEndDate . Value . Date , arbeitstage, restlicheTageImJahr, tmp . Urlaubsanspruch) ;
int restlicheTageImJahr = Convert . ToInt32 ( ( ( DateTim e) endDate - new DateTim e( i , 1 , 1 ) ) . TotalDays ) ;
//tmp. Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation(( DateTime) contract. EntryDate, endDate, arbeitstage, restlicheTageImJahr, tmp. Urlaubsanspruch) ;
errechneteTage + = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , endDate , arbeitstage , restlicheTageImJahr , urlaubsanspruchFuerVertragInLoop ) ;
weggefallen = urlaubsanspruchFuerVertragInLoop - errechneteTage ;
tmp . Resturlaub + = errechneteTage ;
}
tmp . Urlaubsanspruch + = urlaubsanspruchFuerVertragInLoop - weggefallen ;
}
if ( endDate . Value . Year = = i )
else
{
int restlicheTageImJahr = Convert . ToInt32 ( ( ( DateTime ) endDate - new DateTime ( i , 1 , 1 ) ) . TotalDays ) ;
tmp . Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( ( DateTime ) contract . EntryDate , endDate , arbeitstage , restlicheTageImJahr , tmp. Urlaubsanspruch ) ;
tmp . Urlaubsanspruch + = urlaubsanspruchFuerVertragInLoop ;
tmp . Resturlaub = tmp . Urlaubsanspruch ;
}
}
}
@@ -563,6 +635,9 @@ namespace BeWo.Service.Plugins
// Urlaubsanspruch berechnen
var yearFiller = firstYear ;
absencesYear = absencesYear . OrderBy ( x = > x . Item1 ) . ToList ( ) ;
Dictionary < int , decimal > zuVerfallZuAddieren = new Dictionary < int , decimal > ( ) ;
foreach ( var tuple in absencesYear )
{
var absYear = tuple . Item1 ;
@@ -582,34 +657,77 @@ namespace BeWo.Service.Plugins
var current = konten [ absYear ] ;
//var start = DateTimeExtensions.GetMax(absence.Start, new DateTime(absYear, 1, 1));
var start = ( absence . Start . Value . Year = = year ) ? absence . Start . Value : new DateTime ( year , 1 , 1 ) ;
//if (absYear == 2021)
// Console.WriteLine("Hier") ;
var start = DateTimeExtensions . GetMax ( absence . Start , new DateTime ( absYear , 1 , 1 ) ) ;
//var start = (absence.Start.Value.Year == year) ? absence.Start.Value : new DateTime(year, 1, 1); // Funktioniert nicht richtig
var end = DateTimeExtensions . GetMin ( absence . End , new DateTime ( absYear , 12 , 31 ) ) ;
var dauer = BerechneAnzahlUrlaubstage ( emp , absence , y ear) ;
var dauer = BerechneAnzahlUrlaubstage ( emp , absence , absY ear) ;
var expiration = GetExpirationDate ( year ) ;
current . UrlaubsVerfallsdatum = expiration ;
// Resturlaub vom Vorjahr verwenden, wenn möglich
if ( current . ResturlaubVorjahr > 0 & & start < = expiration )
{
var firstEnd = ( DateTime ) DateTimeExtensions . GetMin ( end , expiration ) ;
var dauerVorjahr = ( decimal ) ( firstEnd - absence . Start . Value ) . Days + 1 ;
var firstEnd = ( DateTime ) DateTimeExtensions . GetMin ( end , expiration ) ; // Ende von Urlaub oder Verfallsdatum, je nachdem was früher ist
var dauerVorjahr = 0 ; // (decimal)(firstEnd - absence.Start.Value).Days + 1;
DateTime zaehlerDatum = ( DateTime ) start ;
while ( zaehlerDatum < = firstEnd )
{
if ( zaehlerDatum . DayOfWeek ! = DayOfWeek . Saturday & & zaehlerDatum . DayOfWeek ! = DayOfWeek . Sunday & & ! _Feiertage . Contains ( zaehlerDatum ) )
dauerVorjahr + + ;
zaehlerDatum = zaehlerDatum . AddDays ( 1 ) ;
}
var bucheVorjahr = Math . Min ( current . ResturlaubVorjahr , dauerVorjahr ) ;
current . ResturlaubVorjahr - = bucheVorjahr ;
dauer - = bucheVorjahr ;
if ( dauer < 0 )
{
if ( ! zuVerfallZuAddieren . ContainsKey ( absYear ) )
zuVerfallZuAddieren . Add ( absYear , 0 ) ;
zuVerfallZuAddieren [ absYear ] - = dauer ;
}
}
else if ( start > expiration )
{
current . VerfallenerUrlaub = current . ResturlaubVorjahr ;
current . VerfallenerUrlaub = zuVerfallZuAddieren . ContainsKey ( absYear ) ? current . ResturlaubVorjahr + zuVerfallZuAddieren [ absYear ] : current. ResturlaubVorjahr ;
}
// Restliche Dauer vom Urlaub abziehen
current . Resturlaub - = dauer ;
current . Resturlaub - = dauer < 0 ? 0 : dauer ; // ausprobieren
}
// Als letztes geschenkte Urlaubstage draufrechnen
var geschenkteUrlaubstage = empService . GetGeschenkteUrlaubstageForEmployee ( ( long ) emp . Oid ) ;
foreach ( var konto in konten )
{
var i = konto . Key ;
decimal anzGeschenkteTage = 0.0 m ;
if ( geschenkteUrlaubstage ! = null )
{
foreach ( var item in geschenkteUrlaubstage )
{
if ( item . Date . Year = = i )
anzGeschenkteTage + = item . AnzahlTage ;
}
}
konto . Value . Urlaubsanspruch + = anzGeschenkteTage ;
konto . Value . Resturlaub + = anzGeschenkteTage ;
}
return konten ;
}
catch ( Exception e )
@@ -618,6 +736,7 @@ namespace BeWo.Service.Plugins
}
}
private decimal CalcCorrectNumberOfLeaveDaysForSpecialContractSituation ( DateTime entryDate , DateTime ? endDate , int anzahlArbeitstage , int restlicheTageImJahr , decimal? urlaubstageProJahr )
{
decimal urlaubstage = 0 ;
@@ -629,16 +748,18 @@ namespace BeWo.Service.Plugins
//Prüfen, ob Enddatum Ende des Jahres oder früher ist
if ( endDate = = null )
{
if ( anzahlArbeitstage < 5 ) // weniger als 5 Tage
urlaubstage = ( decimal) urlaubstageProJahr / 5 m * anzahlArbeitstage ;
else
{
if ( anzahlArbeitstage = = 5 ) // 5 Tage
urlaubstage = ( decimal) urlaubstageProJahr ;
else if ( anzahlArbeitstage = = 6 ) // 6 Tage
urlaubstage = ( decimal ) urlaubstageProJahr ;
}
//if ( anzahlArbeitstage < 5) // weniger als 5 Tage
// urlaubstage = ( decimal) urlaubstageProJahr / 5m * anzahlArbeitstage;
// else
// {
// if ( anzahlArbeitstage == 5) // 5 Tage
// urlaubstage = ( decimal) urlaubstageProJahr;
// else if ( anzahlArbeitstage == 6) // 6 Tage
urlaubstage = ( decimal ) urlaubstageProJahr ;
// }
}
else if ( endDate . Value . Day = = 31 & & endDate . Value . Month = = 12 )
urlaubstage = ( decimal ) urlaubstageProJahr ;
else
{
if ( anzahlArbeitstage < 5 ) // weniger als 5 Tage