MH: Fehler bei Drucken des Dienstplans behoben

This commit is contained in:
Marcel Hirschle
2021-09-14 14:08:08 +02:00
parent b402d6c32e
commit 3e20250e84
5 changed files with 265 additions and 141 deletions

View File

@@ -670,8 +670,8 @@
</Grid>
</TabItem>
<TabItem Header="Urlaubstage" Selector.Selected="LeaveDaysTabItem_Selected" x:Name="LeaveDaysTabItem"> <!--Grid: datagrid_leavedays-->
<GroupBox Grid.Column="0" x:Name="groupbox_giftLeaveDays" Grid.Row="1" Grid.ColumnSpan="2" Header="Urlaubstage schenken" Style="{StaticResource ObjectEditGroupBox}">
<TabItem Header="Urlaubskonto" Selector.Selected="LeaveDaysTabItem_Selected" x:Name="LeaveDaysTabItem"> <!--Grid: datagrid_leavedays-->
<GroupBox Grid.Column="0" x:Name="groupbox_giftLeaveDays" Grid.Row="1" Grid.ColumnSpan="2" Header="Urlaubskonto" Style="{StaticResource ObjectEditGroupBox}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
@@ -681,7 +681,7 @@
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<dxe:ComboBoxEdit x:Name="_YearPicker" Height="25" Grid.Row="0" Width="100" Margin="0 5 0 5" HorizontalAlignment="Left" EditValueChanged="_YearPicker_EditValueChanged"/>
<dxe:ComboBoxEdit x:Name="_YearPicker" Height="25" PopupMaxHeight="150" Grid.Row="0" Width="100" Margin="0 5 0 5" HorizontalAlignment="Left" EditValueChanged="_YearPicker_EditValueChanged"/>
<Button Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" Margin="0 5 0 5" Name="button_openLeaveDayDialogue" Click="button_openLeaveDayDialogue_Click" Style="{DynamicResource {x:Type Button}}" Content="Urlaubstag(e) schenken" Visibility="Collapsed"/>
<controls:PopupNonTopmost Grid.Row="0" Grid.Column="0" Topmost="False" x:Name="popup_giftLeaveday" Width="350" StaysOpen="True" Placement="MousePoint">

View File

@@ -692,7 +692,7 @@ namespace BeWo.View.Detail
private void InitDateComboBox()
{
var year = new List<int>();
for (int i = DateTime.Today.Year + 1; i > 2010; i--)
for (int i = DateTime.Today.Year + 1; i > DateTime.Today.Year - 20; i--)
{
year.Add(i);
}

View File

@@ -1351,8 +1351,7 @@ namespace BeWo.View.Detail.Report
+ "/ReportView.aspx"
+ "?type=" + Utils.EnumName(ReportTypes.RosterReport)
+ "&wid=" + wOid
+ "&dt=" + date.ToString("MM.yyyy")
+ "&ft=";
+ "&dt=" + date.ToString("dd.MM.yyyy");
List<int> tage = new List<int>();
@@ -1362,8 +1361,12 @@ namespace BeWo.View.Detail.Report
if (feiertag.Datum.Month == date.Month)
tage.Add(feiertag.Datum.Day);
}
if (tage.Count > 0)
{
url += "&ft=";
url += string.Join(";", tage);
url += string.Join(";", tage);
}
linkPdfExport.NavigateUri = new Uri(url);
}

View File

@@ -718,7 +718,7 @@ namespace Host
private XtraReport CreateRosterReport()
{
DateTime dt = DateTime.ParseExact(Request.Params["dt"], "MM.yyyy", CultureInfo.InvariantCulture);
DateTime dt = DateTime.ParseExact(Request.Params["dt"], "dd.MM.yyyy", CultureInfo.InvariantCulture);
long wOid = int.Parse(Request.Params["wid"]);
List<int> feiertage = new List<int>();

View File

@@ -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 Geschenktem Urlaubstag
#endregion
// Einen Eintrag pro geschenktem 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.EntryDate.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 = GetExpirationDate(year),
Tooltip = null,
IsDeletable = false
});
}
// Urlaube im Jahr
List<AbsenceTimeDC> 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(absences.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.0m;
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.Urlaubsanspruch += contract.LeaveDays + anzGeschenkteTage ?? 0;
tmp.Resturlaub = tmp.Urlaubsanspruch;
var urlaubsanspruchFuerVertragInLoop = 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.ContractEndDate.Value.Date - contract.EntryDate.Value.Date).TotalDays);
tmp.Resturlaub = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, contract.ContractEndDate.Value.Date, arbeitstage, restlicheTageImJahr, tmp.Urlaubsanspruch);
int restlicheTageImJahr = Convert.ToInt32(((DateTime)endDate - new DateTime(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, year);
var dauer = BerechneAnzahlUrlaubstage(emp, absence, absYear);
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.0m;
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 / 5m * 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