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; namespace BeWo.Report.ReportObjects { public class MitarbeiterstundenkontoRO : AbstractBeWoReportObject { 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 MitarbeiterstundenkontoRO Create(long? employeeOid, long? teamOid, DateTime startDate, DateTime endDate, IEnumerable employeeOids) { Team team = null; var ro = new MitarbeiterstundenkontoRO {ReportStartDate = startDate, ReportEndDate = endDate}; IList employees = null; if (employeeOid.HasValue) { var emp = DAOFactory.GenericDAO.GetByID(employeeOid.Value); employees = new List {emp}; } else if (teamOid.HasValue) { team = DAOFactory.GenericDAO.GetByID(teamOid.Value); employees = team.MemberList; } else if(employeeOids != null) { employees = DAOFactory.GenericDAO.LoadByIDs(employeeOids); } else { employees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); } foreach (var emp in employees) { 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(empDetail); empDetail.Teams = team == null ? DAOFactory.SearchDAO.FindTeamsOfEmployee(emp.Oid.Value) : new List {team}; empDetail.Employee = emp; empDetail.LastName = emp.Person.LastName; empDetail.FirstName = emp.Person.FirstName; empDetail.FullName = String.Format("{0}, {1}", empDetail.LastName, empDetail.FirstName); } } 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)); 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; } } } public class EmployeeDetail { public IList Teams { get; set; } public IList Days { 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 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 int ArbeitstageProWoche { 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 IList ServiceRecords { get; set; } public int? NightStart { get; set; } public int? NightEnd { get; set; } public int? MaxHoursUntilBreak { get; set; } public int? BreakMinutes { get; set; } public decimal SpecialHours { get; set; } } } }