using System; using System.Collections.Generic; using System.Linq; using System.Windows.Ink; using BS.Shared.Core; using BeWo.Data.Access; using BeWo.Data.Entities; using BS.Shared; using BS.Shared.Extensions; using System.Diagnostics; namespace BeWo.Service.Dienstplanung { public class MitarbeiterstundenkontoRONeu { List _EmployeeDetailList = new List(); List _TeamDetailList = new List(); public DateTime ReportStartDate { get; set; } public DateTime ReportEndDate { get; set; } public decimal SollGesamt { get; set; } public decimal FlsSollGesamt { get; set; } public decimal FlsIstGesamt { get; set; } public decimal FlsDiffGesamt { get; set; } public decimal StundenGesamt { get; set; } public decimal RelationIstSollGesamt { get; set; } public decimal MittelbarIst { get; set; } public decimal RelationFlsZuMittelbar { get; set; } public List EmployeeDetailList { get { return this._EmployeeDetailList; } set { this._EmployeeDetailList = value; } } public List TeamDetailList { get { return this._TeamDetailList; } set { this._TeamDetailList = value; } } public static MitarbeiterstundenkontoRONeu Create(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate, IEnumerable employeeOids) { Team team = null; Dictionary empOidDict = new Dictionary(); var ro = new MitarbeiterstundenkontoRONeu {ReportStartDate = startDate, ReportEndDate = endDate}; IList employees = null; if (employeeOid.HasValue) { var emp = DAOFactory.GenericDAO.GetByID(employeeOid.Value); employees = new List {emp}; } else if (teamOids != null) { foreach (var teamOid in teamOids) { team = DAOFactory.GenericDAO.GetByID(teamOid); if (employees == null) { employees = team.MemberList; } else { employees.AddRange(team.MemberList); team = null; } } } else if(employeeOids != null) { employees = DAOFactory.GenericDAO.LoadByIDs(employeeOids); } else { employees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); } if (employees == null) { employees = new List(); } foreach (var emp in employees) { if (!empOidDict.ContainsKey(emp.Oid.Value)) { var empDetail = new EmployeeDetail(); bool add = true; if (emp.IsActive == ActivationTypeId.Archived) { Contract c = emp.GetValidContractForDate(ro.ReportStartDate); if (c == null) // Kein Vertrag vom 1. gefunden, gucken, ob es einen gibt, der mitten im Monat beginnt. { var c2 = GetNextValidContractForDate(ro.ReportStartDate, emp); if (c2 != null && c2.EntryDate.HasValue && c2.EntryDate.Value < ro.ReportEndDate) c = c2; } if (c == null) { add = false; } } if (add) { ro.EmployeeDetailList.Add(CreateEmployeeDetail(emp, team)); } if (!empOidDict.ContainsKey(emp.Oid.Value)) { empOidDict.Add(emp.Oid.Value, true); } } } var teamOid2Details = new Dictionary(); foreach (var employee in ro.EmployeeDetailList) { if (employee.Teams.Count > 0) { foreach (var t in employee.Teams) { TeamDetail td; if (!teamOid2Details.ContainsKey(t.Oid.Value)) { td = new TeamDetail {TeamName = t.Name, TeamLeader = t.Leader}; ro.TeamDetailList.Add(td); teamOid2Details.Add(t.Oid.Value, td); } else { td = teamOid2Details[t.Oid.Value]; } td.EmployeeDetailList.Add(employee); } } } ro.TeamDetailList.Sort((t1, t2) => t1.TeamName.CompareTo(t2.TeamName)); foreach (var teamDetail in ro.TeamDetailList) { if (teamDetail.EmployeeDetailList != null) { teamDetail.EmployeeDetailList.Sort((e1, e2) => e1.FullName.CompareTo(e2.FullName)); } } ro.EmployeeDetailList.Sort((e1, e2) => e1.FullName.CompareTo(e2.FullName)); return ro; } private static Contract GetNextValidContractForDate(DateTime dt, Employee emp) { Contract contractNextToStartDate = emp.GetValidContractForDate(dt); if (contractNextToStartDate == null) { foreach (var item in emp.Contracts) { if (item.EntryDate.HasValue && item.EntryDate.Value >= dt) { if (contractNextToStartDate == null || item.EntryDate.Value < contractNextToStartDate.EntryDate.Value) { contractNextToStartDate = item; } } } } return contractNextToStartDate; } public class TeamDetail { private List _EmployeeDetailList = new List(); public string TeamName { get; set; } public Employee TeamLeader { get; set; } public decimal SollGesamt { get; set; } public decimal FlsSollGesamt { get; set; } public decimal FlsIstGesamt { get; set; } public decimal FlsDiffGesamt { get; set; } public decimal StundenGesamt { get; set; } public decimal RelationIstSollGesamt { get; set; } public decimal MittelbarIst { get; set; } public decimal RelationFlsZuMittelbar { get; set; } public List EmployeeDetailList { get { return this._EmployeeDetailList; } set { this._EmployeeDetailList = value; } } } [DebuggerDisplay("{Employee.Oid} {Employee.Person.FirstNameLastName} Soll: {StundenSollOhneUrlaubKrankheit} Ist: {StundenGesamtIst}")] public class EmployeeDetail { public IList Teams { get; set; } public IList Days { get; set; } public IList ServiceRecordsInSelectedTimeSpan { get; set; } public Employee Employee { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get; set; } public bool HasContract { get; set; } public decimal FlsIst { get; set; } public decimal MittelbarIst { get; set; } public decimal Bu { get; set; } public decimal StundenSollMax { get; set; } //FLS Max - Urlaub/Krankheit und Fortbildung public decimal StundenSollOhneUrlaubKrankheit { get; set; } public decimal FlsSoll { get; set; } public decimal FlsDiff { get; set; } public decimal? Fehlzeiten { get; set; } public decimal? TageUrlaub { get; set; } public decimal? TageKrankheit { get; set; } public decimal? UrlaubUndKrankheit { get; set; } public decimal? UrlaubGesamtImAktuellenJahr { get; set; } public decimal? UrlaubSoll { get; set; } public decimal? UrlaubsKonto { get; set; } public decimal StundenMittelbarIst { get; set; } public decimal StundenGesamtIst { get; set; } public decimal RelationFlsZuMittelbar { get; set; } public decimal RelationIstSoll { get; set; } public decimal? Ueberstunden { get; set; } public decimal? UeberstundenVormonat { get; set; } public decimal? UeberstundenGesamt { get; set; } public decimal UeberstundenAusbezahlt { get; set; } public decimal WorkDaysThisMonth { get; set; } public decimal SollProTag { get; set; } public decimal SollProWoche { get; set; } public decimal Custom1 { get; set; } public decimal Custom2 { get; set; } public decimal Custom3 { get; set; } public decimal Custom4 { get; set; } public decimal Custom5 { get; set; } public decimal Custom6 { get; set; } public decimal Custom7 { get; set; } public decimal Custom8 { get; set; } public decimal Custom9 { get; set; } public decimal Custom10 { get; set; } public String Regelarbeitszeit { get; set; } public int ArbeitstageProWoche { get; set; } public decimal ArbeitstageImBerichtszeitraum { get; set; } public AbsenceTimeDaysNeu AbsenceTimeDays { get; set; } public decimal? HourlyRate { get; set; } public decimal? WeeklyFLS { get; set; } public decimal? EmployeeSalaryByContract { get; set; } public decimal? EmployeeSalaryByHours { get; set; } public EmploymentType EmploymentType { get; set; } } public class DayDetail { public DateTime Date { get; set; } public DateTime? StartDateTime1 { get; set; } public DateTime? EndDateTime1 { get; set; } public DateTime? StartDateTime2 { get; set; } public DateTime? EndDateTime2 { get; set; } public DateTime? StartDateTime3 { get; set; } public DateTime? EndDateTime3 { get; set; } public DateTime? StartDateTime4 { get; set; } public DateTime? EndDateTime4 { get; set; } public decimal HoursSaturday { get; set; } public decimal HoursSunday { get; set; } public decimal HoursHoliday { get; set; } public decimal HoursHoliday2 { get; set; } public IList AbsenceTimes { get; set; } public decimal HoursInVacation { get; set; } public decimal HoursSick { get; set; } public decimal MinutesTotal { get; set; } public String Custom1 { get; set; } public String Custom2 { get; set; } public String Custom3 { get; set; } public String Custom4 { get; set; } public String Custom5 { get; set; } public String Custom6 { get; set; } public String Custom7 { get; set; } public String Custom8 { get; set; } public String Custom9 { get; set; } public String Custom10 { get; set; } public IList ServiceRecords { get; set; } public int? NightStart { get; set; } public int? NightEnd { get; set; } public int? MaxHoursUntilBreak { get; set; } public decimal PauseInMinuten { get; set; } public int? BreakMinutes { get; set; } public int? MaxHoursUntilBreak2 { get; set; } public int? BreakMinutes2 { get; set; } public decimal SpecialHours { get; set; } public IList ZusammenhaengendeZeitraeume { get; set; } public String ZeitraeumeString { get { String str = ""; if (AbsenceTimes != null) { foreach (var at in AbsenceTimes) { if (at.AbsenceReason != null) { if (str.Length > 0) { str += ", "; } str += at.AbsenceReason.Description ; } } } if (ZusammenhaengendeZeitraeume != null) { foreach (var dts in ZusammenhaengendeZeitraeume) { if (dts.StartDateTime != dts.EndDateTime) { if (str.Length > 0) { str += ", "; } str += String.Format("{0:HH:mm} - {1:HH:mm}", dts.StartDateTime, dts.EndDateTime); } } } return str; } } } public static EmployeeDetail CreateEmployeeDetail(Employee employee, Team team) { var employeeDetail = new EmployeeDetail { Teams = team == null ? DAOFactory.SearchDAO.FindTeamsOfEmployee(employee.Oid.Value) : new List { team }, Employee = employee, LastName = employee.Person.LastName, FirstName = employee.Person.FirstName, FullName = $"{employee.Person.LastName}, {employee.Person.FirstName}" }; return employeeDetail; } } }