using System; using System.Collections.Generic; using System.Linq; using System.Text; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using BS.Shared.Extensions; using DevExpress.XtraRichEdit.Commands; using Employee = BeWo.Data.Entities.Employee; namespace BeWo.Service.SBD { internal class VertretungsManager { private static List LoadContactInformationForEntity(long entityOid) where T : BeWoEntityBase { var entity = typeof(T) == typeof(Employee) ? DAOFactory.GenericDAO.LoadByID(entityOid).Person : DAOFactory.GenericDAO.LoadByID(entityOid).Person; return MapperFactory.ContactDC_Contact.MapToNewDCs(entity.Contacts); } public List CreateSubstitutions(DateTime start, DateTime end) { Dictionary employeeIsAbsenceDict = new Dictionary(); Dictionary customerIsAbsenceDict = new Dictionary(); var vertretungsItems = new List(); end = end.Date.AddDays(1).AddTicks(-1); var vertretungen = DAOFactory.SearchDAO.FindVertretungen(start, end).Where(v => v.VertretenderMitarbeiterOid.HasValue).ToList(); var absenceTimes = DAOFactory.SearchDAO.FindAbsenceTimes(start, end).ToList(); var employeeAbsenceTimes = absenceTimes.Where(absenceTime => absenceTime.EmployeeOid.HasValue).ToList(); var customerAbsenceTimes = absenceTimes.Where(absenceTime => absenceTime.CustomerOid.HasValue).ToList(); var customerOids = vertretungen.Where(w => w.CustomerOid.HasValue).Select(s => s.CustomerOid.Value).ToList(); customerOids.AddRangeIfElementsNotIn(absenceTimes.Where(w => w.CustomerOid.HasValue).Select(s => s.CustomerOid.Value).ToList()); var customers = DAOFactory.GenericDAO.LoadByIDs(customerOids); var customerContactInformation = new Dictionary>(); var employees = DAOFactory.GenericDAO.LoadByIDs(employeeAbsenceTimes.Select(absenceTime => absenceTime.EmployeeOid.Value)); var employeeVertretungsItems = new List(); var customerVertretungsItems = new List(); var employeeVertretungsItemsGuids2Ignore = new List(); foreach (var customer in customers) { var contacts = MapperFactory.ContactDC_Contact.MapToNewDCs(customer.Person.Contacts); if (customer.Oid != null) { customerContactInformation.AddOrUpdateValueInDictionary(customer.Oid.Value, contacts); } } // Mitarbeiterabwesenheiten foreach (var absenceTime in employeeAbsenceTimes) { var employee = employees.FirstOrDefault(emp => emp.Oid.HasValue && emp.Oid.Value.Equals(absenceTime.EmployeeOid)); if (employee == null) { continue; } var employeeDC = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(employee); var employeeAddressString = GetEmployeeAddressInfo(employee.Oid.Value); var employeeContactInformationList = LoadContactInformationForEntity(employee.Oid.Value); var absenceTimeDC = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(absenceTime); foreach (var employee2Customer in employee.Employee2CustomerList.Where(e2C => e2C.IsActive == ActivationTypeId.Active)) { foreach (var valueListEntry2Object in employee2Customer.ValueList.Where(entry2Object => entry2Object.Entry.Type == ValueListEntryType.StaffRoleType)) { var customer = employee2Customer.Customer; var customerDC = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(customer); var customerContactInformationList = LoadContactInformationForEntity(customer.Oid.Value); var schools = MapperFactory.CustomerOrganisationRelationDC_Customer2Organisation.MapToNewDCs(customer.Customer2OrganisationList.Where(customer2Organisation => customer2Organisation.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule")))); var assistanceTimeEntries = GetAssistanceTimesForCustomer(customer, employee, absenceTime, start, end); var dateTime = start; while (dateTime <= end) { if (LiegtImZeitraum(dateTime, absenceTime)) { AddToDict(employeeIsAbsenceDict, dateTime, employee.Oid.Value); var dateTimeCopy = dateTime; var relevantAssistanceTimeEntries = assistanceTimeEntries.Where(entry => IsAbsenceTimeInAssistanceTime(dateTimeCopy, entry, absenceTime)); foreach (var assistanceTimeEntry in relevantAssistanceTimeEntries) { var vertretungsObjekte = vertretungen.Where(w => w.EmployeeOid.HasValue && w.EmployeeOid.Equals(employee.Oid) && w.CustomerOid.HasValue && w.CustomerOid.Equals(customer.Oid) && w.VertretungsZeitraumVon.Date <= dateTimeCopy && w.VertretungsZeitraumBis.Date >= dateTimeCopy); var lastSubstitutions = DAOFactory.SearchDAO.GetLastSubstitutionItems(employee.Oid.Value, 3); var lastSubstitutionDCs = MapperFactory.VertretungDC_Vertretung.MapToNewDCs(lastSubstitutions); var assistanceTimeEntryDC = MapperFactory.ArbeitszeitEintragDC_ArbeitszeitEintrag.MapToNewDC(assistanceTimeEntry); var newVertretungsItem = new VertretungsItemDC { Id = Guid.NewGuid(), Datum = dateTime, Absencetime = absenceTimeDC, AssistanceTime = assistanceTimeEntryDC, Employee = employeeDC, EmployeeAddressString = employeeAddressString, LastSubstitutions = lastSubstitutionDCs, Customer = customerDC, CustomerContactInformation = customerContactInformationList, EmployeeContactInformation = employeeContactInformationList, Schools = schools, Bemerkung = absenceTime.Notice }; AddKrankheitsZeitraumAndMeldungToItem(newVertretungsItem, newVertretungsItem.Absencetime); GetVertretungsstatus(newVertretungsItem, dateTime, absenceTime.Start.Value, customer); // Es gibt immer nur ein Vertretungsobjekt var vertretung = vertretungsObjekte.FirstOrDefault(); if (vertretung?.VertretenderMitarbeiterOid != null) { if (GetIsSubstitutedCompletely(new List {assistanceTimeEntry}, vertretung, dateTime)) { var substitutionEmployee = DAOFactory.GenericDAO.LoadByID(vertretung.VertretenderMitarbeiterOid.Value); var substitutionEmployeeDC = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(substitutionEmployee); newVertretungsItem.Vertreter = substitutionEmployeeDC; newVertretungsItem.VertreterInfoString = GetEmployeeAddressInfo(vertretung.VertretenderMitarbeiterOid.Value); newVertretungsItem.Vertretung = MapperFactory.VertretungDC_Vertretung.MapToNewDC(vertretung); newVertretungsItem.Bemerkung = vertretung.Notice; newVertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungVorhanden; } } SetSubstitutionColor(newVertretungsItem); SetSBDInformation(newVertretungsItem, customer, employee, true); SetTeamleitung(employee, newVertretungsItem); employeeVertretungsItems.Add(newVertretungsItem); } } dateTime = dateTime.AddDays(1); } } } } // Klientenabwesenheiten foreach (var absenceTime in customerAbsenceTimes) { var customer = customers.FirstOrDefault(first => first.Oid.HasValue && first.Oid.Equals(absenceTime.CustomerOid)) ?? DAOFactory.GenericDAO.LoadByID(absenceTime.CustomerOid.Value); var absenceTimeDC = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(absenceTime); var customerDC = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(customer); var customerContactInformationList = LoadContactInformationForEntity(customer.Oid.Value); var schools = MapperFactory.CustomerOrganisationRelationDC_Customer2Organisation.MapToNewDCs(customer.Customer2OrganisationList.Where(customer2Organisation => customer2Organisation.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule")))); var schoolAssistanceTimes = GetSchoolAssistanceTimes(customer, start, end, absenceTime); var hauptbetreuer = customer.Employee2CustomerList.FirstOrDefault(f => f.IsActive == ActivationTypeId.Active && f.ValueList.Any(b => b.Entry.Type.Equals(ValueListEntryType.StaffRoleType) && b.Entry.Value.ToLower().Equals("hauptbetreuung")))?.Employee; if (hauptbetreuer == null) { hauptbetreuer = customer.Employee2CustomerList.FirstOrDefault()?.Employee; } MigriereSubstitutionStatus(customer); var assistingEmployees = new List(); customer.Arbeitszeiten.DoForEach(a => assistingEmployees.AddRangeIfElementsNotIn(a.ArbeitszeitEintraege.Where(ae => ae.Employee != null).Select(s => s.Employee))); schoolAssistanceTimes.DoForEach(a => { foreach (var assistanceTimeEntry in a.ArbeitszeitEintraege) { if (assistanceTimeEntry.Employee != null && assistanceTimeEntry.Employee.IsActive != ActivationTypeId.Active) { continue; } if (assistanceTimeEntry.Employee == null) { if (hauptbetreuer != null) { assistingEmployees.AddIfNotIn(hauptbetreuer); } } else { assistingEmployees.AddIfNotIn(assistanceTimeEntry.Employee); } } }); var hasCaregiver = customer.Employee2CustomerList.Any(a => a.ValueList.Any(b => b.Entry.Type.Equals(ValueListEntryType.StaffRoleType) && !b.Entry.Value.ToLower().Equals("ehemalige betreuung"))) || assistingEmployees.Any(); if (hasCaregiver) { var relatedEmployees = new List(assistingEmployees); relatedEmployees.AddRangeIfElementsNotIn( customer.Employee2CustomerList .Where( e2C => e2C.Employee.IsActive == ActivationTypeId.Active && !e2C.ValueList.Any( w => w.Entry.Type.Equals(ValueListEntryType.StaffRoleType) && !w.Entry.Value.ToLower().Equals("ehemalige betreuung"))) .Select(s => s.Employee)); foreach (var employee in relatedEmployees) { var employeeDC = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(employee); var employeeAddressString = GetEmployeeAddressInfo(employee.Oid.Value); var employeeContactInformationList = LoadContactInformationForEntity(employee.Oid.Value); var assistanceTimeEntries = GetAssistanceTimesForCustomer(customer, employee, absenceTime, start, end); var dateTime = start; while (dateTime <= end) { if (LiegtImZeitraum(dateTime, absenceTime)) { AddToDict(customerIsAbsenceDict, dateTime, customer.Oid.Value); var dateTimeCopy = dateTime; var relevantAssistanceTimeEntries = assistanceTimeEntries.Where(entry => IsAbsenceTimeInAssistanceTime(dateTime, entry, absenceTime) && (entry.Employee != null && entry.Employee.Equals(employee) || entry.Employee == null && employee.Equals(hauptbetreuer))).ToList(); var vertretungsObjekte = vertretungen.Where(w => w.EmployeeOid.HasValue && w.EmployeeOid.Equals(employee.Oid) && w.CustomerOid.HasValue && w.CustomerOid.Equals(customer.Oid) && w.VertretungsZeitraumVon.Date <= dateTimeCopy && w.VertretungsZeitraumBis.Date >= dateTimeCopy).ToList(); var lastSubstitutions = DAOFactory.SearchDAO.GetLastSubstitutionItems(employee.Oid.Value, 3); var lastSubstitutionDCs = MapperFactory.VertretungDC_Vertretung.MapToNewDCs(lastSubstitutions); var assistanceTimeEntryDCs = MapperFactory.ArbeitszeitEintragDC_ArbeitszeitEintrag.MapToNewDCs(relevantAssistanceTimeEntries); foreach (var assistanceTimeEntry in relevantAssistanceTimeEntries) { var assistanceTimeEntryDC = MapperFactory.ArbeitszeitEintragDC_ArbeitszeitEintrag.MapToNewDC(assistanceTimeEntry); var newVertretungsItem = new VertretungsItemDC { Id = Guid.NewGuid(), Datum = dateTime, Absencetime = absenceTimeDC, Arbeitszeiten = assistanceTimeEntryDCs, Employee = employeeDC, EmployeeAddressString = employeeAddressString, LastSubstitutions = lastSubstitutionDCs, Customer = customerDC, CustomerContactInformation = customerContactInformationList, EmployeeContactInformation = employeeContactInformationList, Schools = schools, VertretungsStatus = VertretungsStatus.KlientKrank, Bemerkung = absenceTime.Notice, AssistanceTime = assistanceTimeEntryDC }; AddKrankheitsZeitraumAndMeldungToItem(newVertretungsItem, newVertretungsItem.Absencetime); var vertretung = vertretungsObjekte.FirstOrDefault(); if(vertretung?.VertretenderMitarbeiterOid != null) { if(GetIsSubstitutedCompletely(relevantAssistanceTimeEntries, vertretung, dateTime)) { var substitutionEmployee = DAOFactory.GenericDAO.LoadByID(vertretung.VertretenderMitarbeiterOid.Value); var substitutionEmployeeDC = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(substitutionEmployee); newVertretungsItem.Vertreter = substitutionEmployeeDC; newVertretungsItem.VertreterInfoString = GetEmployeeAddressInfo(vertretung.VertretenderMitarbeiterOid.Value); newVertretungsItem.Vertretung = MapperFactory.VertretungDC_Vertretung.MapToNewDC(vertretung); newVertretungsItem.Bemerkung = vertretung.Notice; newVertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungVorhanden; } } // TODO: Hat die vertretungsItemListe Objekte mit dem Klienten im selben Zeitfenster? foreach (var employeeVertretungsItem in employeeVertretungsItems.Where(w => w.Customer.Equals(customerDC))) { if (employeeVertretungsItem.Datum == dateTime) { if (IsAbsenceTimeInAssistanceTime(dateTime, employeeVertretungsItem.AssistanceTime, absenceTime)) { employeeVertretungsItemsGuids2Ignore.AddIfNotIn(employeeVertretungsItem.Id); if (newVertretungsItem.VertretungsStatus == VertretungsStatus.KlientKrank) { newVertretungsItem.VertretungsStatus = VertretungsStatus.KlientUndMitarbeiterKrank; } else { newVertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankKeineVertretungBenoetigt; } } } } SetSubstitutionColor(newVertretungsItem); SetSBDInformation(newVertretungsItem, customer, employee, false); SetTeamleitung(employee, newVertretungsItem); customerVertretungsItems.Add(newVertretungsItem); } } dateTime = dateTime.AddDays(1); } } } else // Kein Betreuer, also auch keine Vertretungen, sondern nur Abwesenheiten { var assistanceTimeEntries = GetAssistanceTimesForCustomer(customer, null, absenceTime, start, end); var dateTime = start; while (dateTime <= end) { if (LiegtImZeitraum(dateTime, absenceTime)) { var relevantAssistanceTimeEntries = assistanceTimeEntries.Where(entry => IsAbsenceTimeInAssistanceTime(dateTime, entry, absenceTime)).ToList(); var assistanceTimeEntryDCs = MapperFactory.ArbeitszeitEintragDC_ArbeitszeitEintrag.MapToNewDCs(relevantAssistanceTimeEntries); var newVertretungsItem = new VertretungsItemDC { Id = Guid.NewGuid(), Datum = dateTime, Absencetime = absenceTimeDC, Arbeitszeiten = assistanceTimeEntryDCs, Customer = customerDC, CustomerContactInformation = customerContactInformationList, Schools = schools, VertretungsStatus = VertretungsStatus.KlientUndMitarbeiterKrank, Bemerkung = absenceTime.Notice }; SetzeSchule(newVertretungsItem, customer); AddKrankheitsZeitraumAndMeldungToItem(newVertretungsItem, absenceTimeDC); SetSubstitutionColor(newVertretungsItem); SetSBDInformation(newVertretungsItem, customer, null, false); customerVertretungsItems.Add(newVertretungsItem); } dateTime = dateTime.AddDays(1); } } } vertretungsItems.AddRange(employeeVertretungsItems.Where(vertretungsItem => !employeeVertretungsItemsGuids2Ignore.Contains(vertretungsItem.Id))); //prüfen, ob Mitarbeiter bereits als Vertretung eingesetzt ist: //customerVertretungsItems = customerVertretungsItems.Where(c => c.Employee != null && c.Equals( !employeeVertretungsItems.Where(ei => ei.Vertreter != null).Select(ei2 => ei2.Vertreter.EmployeeOid).Contains(c.Employee.EmployeeOid))).ToList(); var newList = new List(); foreach (var ci in customerVertretungsItems) { if (ci.Employee == null) { newList.Add(ci); } else { bool istAlsVertreterEingesetzt = false; foreach (var ei in employeeVertretungsItems) { if (ei.Vertreter != null && ei.Vertreter.EmployeeOid == ci.Employee.EmployeeOid) { istAlsVertreterEingesetzt = true; } } if (!istAlsVertreterEingesetzt) { newList.Add(ci); } } } //customerVertretungsItems = customerVertretungsItems.Where(c => c.Employee == null || !employeeVertretungsItems.Where(ei => ei.Vertreter != null).Select(ei2 => ei2.Vertreter.EmployeeOid).Contains(c.Employee.EmployeeOid)).ToList(); customerVertretungsItems = newList; vertretungsItems.AddRange(customerVertretungsItems); SetSubstitutingEmployee2CustomersRelation(vertretungsItems); vertretungsItems = RemoveDuplicates(vertretungsItems); return vertretungsItems; } private List RemoveDuplicates(List vertretungsItems) { var newList = new List(); var keyDict = new Dictionary(); foreach (var ci in vertretungsItems) { if (ci.Customer != null && ci.Employee != null && ci.Absencetime != null && (ci.VertretungsStatus == VertretungsStatus.KlientUndMitarbeiterKrank || ci.VertretungsStatus == VertretungsStatus.MaKrankKeineVertretungBenoetigt || ci.VertretungsStatus == VertretungsStatus.MaKrankVertretungVorhanden)) { String key = ""; if (ci.Vertretung != null && ci.Vertretung.VertretungsZeitraumVon.Hour == 0 && ci.Vertretung.VertretungsZeitraumVon.Minute == 0 && ci.Vertretung.VertretungsZeitraumBis.Hour == 23 && ci.Vertretung.VertretungsZeitraumBis.Minute == 59) { ci.Vertretung.VertretungsZeitraumBis = ci.Vertretung.VertretungsZeitraumBis.Date; key = String.Format("{0}_{1}_{2:dd.MM.yyyy HH:mm} - {3:dd.MM.yyyy HH:mm}_{4}", ci.Customer.Oid, ci.Employee.EmployeeOid, ci.Vertretung.VertretungsZeitraumVon, ci.Vertretung.VertretungsZeitraumBis, ci.Absencetime.AbsenceTimeOid); } else { if (ci.Vertretung == null) { key = String.Format("{0}_{1}_{2}", ci.Customer.Oid, ci.Employee.EmployeeOid, ci.Absencetime.AbsenceTimeOid); } } if (String.IsNullOrEmpty(key) || !keyDict.ContainsKey(key)) { newList.Add(ci); if (!String.IsNullOrEmpty(key)) { keyDict.Add(key, true); } } else { int test = 0; } } else { newList.Add(ci); } } return newList; } private void AddToDict(Dictionary dict, DateTime dateTime, long oid) { String key = String.Format("{0:ddMMyyyy}_{1}", dateTime, oid); if (!dict.ContainsKey(key)) { dict.Add(key, true); } } public List CreateVertretungsListe(DateTime start, DateTime end) { return CreateSubstitutions(start, end); } private static void SetSubstitutingEmployee2CustomersRelation(IEnumerable vertretungsItems) { var vertreterZuKlient = new Dictionary(); foreach (var item in vertretungsItems) { //Suche alle Vertreter für Klienten und merke diese if (item.VertretungsStatus != VertretungsStatus.KlientKrank) { if (item.Vertreter != null && item.Customer != null) { var key = $"{item.Vertreter.EmployeeOid}_{item.Datum:dd.MM.yyyy}"; if (!vertreterZuKlient.ContainsKey(key)) { vertreterZuKlient.Add(key, item.Customer); } } } if (item.MitarbeiterEinsatzBei == "???" && item.Employee != null) { item.MitarbeiterEinsatzBei = ""; var key = $"{item.Employee.EmployeeOid}_{item.Datum:dd.MM.yyyy}"; if (vertreterZuKlient.ContainsKey(key)) { item.MitarbeiterEinsatzBei = $"{vertreterZuKlient[key].LastNameFirstName}"; } } } } private static void SetSBDInformation(VertretungsItemDC vertretungsItem, Customer customer, Employee employee, bool isEmployeeAbsenceTime) { vertretungsItem.CustomerPflege = customer.Pflege ? "Ja" : "Nein"; vertretungsItem.CustomerToilettengang = customer.Toilettengang ? "Ja" : "Nein"; vertretungsItem.CustomerAggressivitaet = customer.Aggressiv ? "Ja" : "Nein"; vertretungsItem.CustomerHygienebelehrung = customer.Hygienebelehrung ? "Ja" : "Nein"; vertretungsItem.CustomerSchutzstufe = customer.Schutzstufe; vertretungsItem.EmployeePflege = employee == null ? "Nein" : employee.Pflege ? "Ja" : "Nein"; vertretungsItem.EmployeeToilettengang = employee == null ? "Nein" : employee.Toilettengang ? "Ja" : "Nein"; vertretungsItem.EmployeeAggressivitaet = employee == null ? "Nein" : employee.Aggressiv ? "Ja" : "Nein"; vertretungsItem.EmployeeHygienebelehrung = employee == null ? "Nein" : employee.Hygienebelehrung ? "Ja" : "Nein"; vertretungsItem.EmployeeSchutzstufe = employee?.Schutzstufe; if (isEmployeeAbsenceTime) { vertretungsItem.Pflege = customer.Pflege ? "Ja" : "Nein"; vertretungsItem.Toilettengang = customer.Toilettengang ? "Ja" : "Nein"; vertretungsItem.Aggressiv = customer.Aggressiv ? "Ja" : "Nein"; if (customer.Person.Sex.HasValue) { vertretungsItem.Geschlecht = Utils.GetSexAbbrevation(customer.Person.Sex); } } else { vertretungsItem.Pflege = employee == null ? "Nein" : employee.Pflege ? "Ja" : "Nein"; vertretungsItem.Toilettengang = employee == null ? "Nein" : employee.Toilettengang ? "Ja" : "Nein"; vertretungsItem.Aggressiv = employee == null ? "Nein" : employee.Aggressiv ? "Ja" : "Nein"; if (employee?.Person.Sex != null) { vertretungsItem.Geschlecht = Utils.GetSexAbbrevation(employee.Person.Sex); } vertretungsItem.MitarbeiterEinsatzBei = "???"; } var customerToolTip = new StringBuilder(); var employeeToolTip = new StringBuilder(); var vertreterToolTip = new StringBuilder(); String customerName = ""; String employeeName = ""; String vertreterName = ""; if (vertretungsItem.Customer != null) { customerName = String.Format("{0} {1}", vertretungsItem.Customer.FirstName, vertretungsItem.Customer.LastName); } if (vertretungsItem.Employee != null) { employeeName = String.Format("{0} {1}", vertretungsItem.Employee.FirstName, vertretungsItem.Employee.LastName); } if (vertretungsItem.Vertreter != null) { vertreterName = String.Format("{0} {1}", vertretungsItem.Vertreter.FirstName, vertretungsItem.Vertreter.LastName); } String schoolString = ""; if (vertretungsItem.Schools != null) { foreach (var item in vertretungsItem.Schools) { if (schoolString.Length > 0) { schoolString += ", "; } schoolString += item.Organisation.Name; } } customerToolTip.AppendLine(""); employeeToolTip.AppendLine(""); vertreterToolTip.AppendLine(""); //Customer Tooltip if (!String.IsNullOrEmpty(customerName)) { customerToolTip.AppendLine(String.Format("", customerName)); } if (!String.IsNullOrEmpty(schoolString)) { customerToolTip.AppendLine(String.Format("")); customerToolTip.AppendLine(String.Format(" ")); customerToolTip.AppendLine(String.Format("", schoolString)); } String contactString = ""; if (vertretungsItem.EmployeeContactInformation != null && vertretungsItem.EmployeeContactInformation.Count > 0) { foreach (var item in vertretungsItem.EmployeeContactInformation) { if (contactString.Length > 0) { contactString += ""; } var typeAsString = string.Empty; switch (item.ContactType) { case ContactType.business_Mail: typeAsString = "E-Mail: "; break; case ContactType.business_Fax: typeAsString = "Fax: "; break; case ContactType.business_Phone: typeAsString = "Tel.: "; break; case ContactType.business_MobilePhone: typeAsString = "Handynr.: "; break; } contactString += typeAsString + item.ContactValue; } } if (!String.IsNullOrEmpty(contactString)) { customerToolTip.AppendLine(String.Format("")); customerToolTip.AppendLine(String.Format(" ")); customerToolTip.AppendLine(String.Format("{0}", contactString)); } var lastSubstitutions = string.Empty; foreach (var item in vertretungsItem.LastSubstitutions) { if (lastSubstitutions.Length > 0) { lastSubstitutions += ""; } var start = item.VertretungsZeitraumVon.Minute == 0 && item.VertretungsZeitraumVon.Hour == 0 ? item.VertretungsZeitraumVon.ToString("dd.MM.yyyy") : item.VertretungsZeitraumVon.ToString("dd.MM.yyyy HH:mm"); var end = item.VertretungsZeitraumBis.Minute == 0 && item.VertretungsZeitraumBis.Hour == 0 ? item.VertretungsZeitraumBis.ToString("dd.MM.yyyy") : item.VertretungsZeitraumBis.ToString("dd.MM.yyyy HH:mm"); lastSubstitutions += $"{start} - {end}"; } if (!String.IsNullOrEmpty(lastSubstitutions)) { customerToolTip.AppendLine(String.Format("")); customerToolTip.AppendLine(String.Format(" ")); customerToolTip.AppendLine(String.Format("{0}", lastSubstitutions)); } var sbdStatus = string.Empty; //if (vertretungsItem.Absencetime != null) //{ if (customer.Pflege) { sbdStatus += "Benötigt Pflege"; } if (customer.Toilettengang) { if (sbdStatus.Length > 0) { sbdStatus += ", "; } sbdStatus += "Toilettengang"; } if (customer.Aggressiv) { if (sbdStatus.Length > 0) { sbdStatus += ", "; } sbdStatus += "Aggressivität"; } if (customer.Hygienebelehrung) { if (sbdStatus.Length > 0) { sbdStatus += ", "; } sbdStatus += "Hygienebelehrung"; } if (!String.IsNullOrWhiteSpace(customer.Schutzstufe)) { if (sbdStatus.Length > 0) { sbdStatus += ", "; } sbdStatus += $"Schutzstufe {customer.Schutzstufe}"; } // Vertretung gewünscht [ab x. Tag] if (customer.SubstitutionNeed == SubstitutionNeed.SubstitutionWanted) { if (sbdStatus.Length > 0) { sbdStatus += ""; } sbdStatus += "Vertretung gewünscht"; if (customer.AbWelchemKrankheitsTag > 0) { sbdStatus += $" ab {customer.AbWelchemKrankheitsTag}. Tag"; } } if (!String.IsNullOrEmpty(sbdStatus)) { customerToolTip.AppendLine(String.Format("")); customerToolTip.AppendLine(String.Format(" ")); customerToolTip.AppendLine(String.Format("{0}", sbdStatus)); } //} //else //{ // if (EmployeePflege?.Equals("Ja") ?? false) // { // result += "Benötigt Pflege"; // } // if (EmployeeToilettengang?.Equals("Ja") ?? false) // { // if (result.Length > 0) // { // result += ", "; // } // result += "Toilettengang"; // } // if (EmployeeAggressivitaet?.Equals("Ja") ?? false) // { // if (result.Length > 0) // { // result += ", "; // } // result += "Aggressivität"; // } // if (EmployeeHygienebelehrung?.Equals("Ja") ?? false) // { // if (result.Length > 0) // { // result += ", "; // } // result += "Hygienebelehrung"; // } // if (string.IsNullOrWhiteSpace(EmployeeSchutzstufe) == false) // { // if (result.Length > 0) // { // result += ", "; // } // result += $"Schutzstufe {EmployeeSchutzstufe}"; // } ////} if (vertretungsItem.Customer != null) { customerToolTip.AppendLine(String.Format("")); customerToolTip.AppendLine(String.Format(" ")); customerToolTip.AppendLine(String.Format("", vertretungsItem.Customer.AddressString)); } // // // // // // // //Employee Tooltip if (!String.IsNullOrEmpty(employeeName)) { employeeToolTip.AppendLine(String.Format("", employeeName)); } //if (!String.IsNullOrEmpty(schoolString)) //{ // employeeToolTip.AppendLine(String.Format("")); // employeeToolTip.AppendLine(String.Format(" ")); // employeeToolTip.AppendLine(String.Format("", schoolString)); //} if (vertretungsItem.Employee != null) { employeeToolTip.AppendLine(String.Format("")); employeeToolTip.AppendLine(String.Format(" ")); employeeToolTip.AppendLine(String.Format("", vertretungsItem.Employee.DetailDescription)); } //Vertreter Tooltip if (!String.IsNullOrEmpty(vertreterName)) { vertreterToolTip.AppendLine(String.Format("", vertreterName)); } //if (!String.IsNullOrEmpty(schoolString)) //{ // vertreterToolTip.AppendLine(String.Format("")); // vertreterToolTip.AppendLine(String.Format(" ")); // vertreterToolTip.AppendLine(String.Format("", schoolString)); //} if (vertretungsItem.Vertreter != null) { vertreterToolTip.AppendLine(String.Format("")); vertreterToolTip.AppendLine(String.Format(" ")); vertreterToolTip.AppendLine(String.Format("", vertretungsItem.Vertreter.DetailDescription)); } customerToolTip.AppendLine(""); employeeToolTip.AppendLine(""); vertreterToolTip.AppendLine(""); // < TextBlock FontWeight='Bold' Text='{0}'/> // // // ", text1, text2); //.Replace("'", "\""); // //tt = @""; vertretungsItem.CustomerToolTip = customerToolTip.ToString(); vertretungsItem.EmployeeToolTip = employeeToolTip.ToString(); vertretungsItem.VertreterToolTip = vertreterToolTip.ToString(); //< Separator Visibility = "{Binding Path=Row.SchoolString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock FontWeight = "Bold" Text = "Schule1:" Visibility = "{Binding Path=Row.SchoolString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock Text = "{Binding Row.SchoolString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" /> //< Separator Visibility = "{Binding Path=Row.Customer.AddressString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock FontWeight = "Bold" Text = "Wohnort:" Visibility = "{Binding Path=Row.Customer.AddressString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock Text = "{Binding Row.Customer.AddressString}" /> //< Separator Visibility = "{Binding Path=Row.CustomerContactInformationString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock FontWeight = "Bold" Text = "Kontakt:" Visibility = "{Binding Path=Row.CustomerContactInformationString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock Text = "{Binding Row.CustomerContactInformationString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" /> //< Separator Visibility = "{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock FontWeight = "Bold" Text = "Schulbegleitender Dienst:" Visibility = "{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" /> //< TextBlock Text = "{Binding Row.SchulbegleitenderDienstString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" /> } private static void SetSubstitutionColor(VertretungsItemDC vertretungsItem) { switch (vertretungsItem.VertretungsStatus) { case VertretungsStatus.MaKrankVertretungBenoetigt: vertretungsItem.KlientStatusColor = "#FF0000"; // Rot break; case VertretungsStatus.MaKrankKeineVertretungBenoetigt: vertretungsItem.KlientStatusColor = "#7FFF7F"; // Grün break; case VertretungsStatus.KlientUndMitarbeiterKrank: vertretungsItem.KlientStatusColor = "#7FFF7F"; // Grün break; case VertretungsStatus.MaKrankVertretungVorhanden: vertretungsItem.KlientStatusColor = "#7FFF7F"; // Grün break; case VertretungsStatus.KlientKrank: vertretungsItem.KlientStatusColor = "#FFFFA5"; // Gelb break; } } private static void MigriereSubstitutionStatus(Customer customer) { if (customer != null) { if (customer.SubstitutionNeed == SubstitutionNeed.SubstitutionNeedUnset) { if (customer.VertretungDringendErforderlich) { customer.SubstitutionNeed = SubstitutionNeed.SubstitutionNeeded; } else { customer.SubstitutionNeed = customer.VertretungGewuenscht ? SubstitutionNeed.SubstitutionWanted : SubstitutionNeed.NoSubstitutionWanted; } } else { customer.SubstitutionNeed = customer.SubstitutionNeed; } } } private static void SetTeamleitung(BeWoEntityBase employee, VertretungsItemDC item) { if (employee.Oid == null) { return; } var sb = new StringBuilder(); var teams = DAOFactory.SearchDAO.FindTeamsOfEmployee(employee.Oid.Value); foreach (var team in teams) { if (team.Leader != null) { if (sb.Length > 0) { sb.Append(", "); } sb.Append(team.Leader.Person.FirstNameLastName); } } item.Teamleitung = sb.ToString(); } private static void SetzeSchule(VertretungsItemDC newItem, Customer customer) { if (customer != null) { foreach (var customer2Organisation in customer.Customer2OrganisationList) { foreach (var valueListEntry2Object in customer2Organisation.ValueList) { if (valueListEntry2Object.Entry.Value != null && valueListEntry2Object.Entry.Value.Contains("Schule")) { newItem.Schule = MapperFactory.CompactOrganisationDC_Organisation.MapToNewDC(customer2Organisation.Organisation); if (customer2Organisation.Organisation.Address != null) { newItem.Schule.Street = customer2Organisation.Organisation.Address.Street; newItem.Schule.PostalCode = customer2Organisation.Organisation.Address.PostalCode; newItem.Schule.Town = customer2Organisation.Organisation.Address.Town; } } } } } } private static bool LiegtImZeitraum(DateTime dateTime, AbsenceTime absenceTime) { return absenceTime.Start < dateTime.Date.AddDays(1) && absenceTime.End >= dateTime.Date; } private static void AddKrankheitsZeitraumAndMeldungToItem(VertretungsItemDC item, AbsenceTimeDC absenceTime) { if (!absenceTime.Start.HasValue || !absenceTime.End.HasValue) { item.Krankheitszeitraum = absenceTime.Start.HasValue ? absenceTime.Start.Value.ToString("dd.MM.yyyy") : "Unbekannt"; item.Krankheitszeitraum += " - "; if (absenceTime.End.HasValue) { item.Krankheitszeitraum += absenceTime.End.Value.ToString("dd.MM.yyyy"); } else { item.Krankheitszeitraum += "Unbekannt"; } } else { if (absenceTime.Start.Value.Date != absenceTime.End.Value.Date) { if (absenceTime.Start.Value.Hour == 0 && absenceTime.Start.Value.Minute == 0 && absenceTime.End.Value.Hour == 0 && absenceTime.End.Value.Minute == 0) { item.Krankheitszeitraum = absenceTime.Start.Value.ToString("dd.MM.yyyy") + " - " + absenceTime.End.Value.ToString("dd.MM.yyyy"); } else { item.Krankheitszeitraum = absenceTime.Start.Value.ToString("dd.MM.yyyy HH:mm") + " - " + absenceTime.End.Value.ToString("dd.MM.yyyy HH:mm"); } } else { if (absenceTime.Start.Value.Hour == 0 && absenceTime.Start.Value.Minute == 0 && absenceTime.End.Value.Hour == 0 && absenceTime.End.Value.Minute == 0) { item.Krankheitszeitraum = absenceTime.Start.Value.ToString("dd.MM.yyyy"); } else { item.Krankheitszeitraum = absenceTime.Start.Value.ToString("dd.MM.yyyy HH:mm") + " - " + absenceTime.End.Value.ToString("HH:mm"); } } } if (absenceTime.KrankheitsMeldung != null) { item.Krankheitsmeldung = absenceTime.KrankheitsMeldung.Value; } else if (absenceTime.Start.HasValue) { item.Krankheitsmeldung = absenceTime.Start.Value; } } private static bool GetIsSubstitutedCompletely(IEnumerable assistanceTimes, Vertretung substitution, DateTime dateTime) { var isSubstituted = true; foreach (var assistanceTime in assistanceTimes) { var assistanceDateTimes = DateTimeUtils.GetAssistanceTimeComparisonDateTime(assistanceTime.UhrzeitVon, assistanceTime.UhrzeitBis, dateTime); if (substitution.VertretungsZeitraumBis.Hour == 0 && substitution.VertretungsZeitraumBis.Minute == 0) { substitution.VertretungsZeitraumBis = substitution.VertretungsZeitraumBis.AddDays(1).AddTicks(-1); } isSubstituted = assistanceDateTimes.Start.AreInBetweenDates(assistanceDateTimes.End, substitution.VertretungsZeitraumVon, substitution.VertretungsZeitraumBis); if (!isSubstituted) { break; } } return isSubstituted; } private static void GetVertretungsstatus(VertretungsItemDC vertretungsItem, DateTime dateTime, DateTime absenceTimeStartDate, Customer customer) { MigriereSubstitutionStatus(customer); if (customer.SubstitutionNeed == SubstitutionNeed.SubstitutionNeeded) { vertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungBenoetigt; vertretungsItem.Dringlichkeit = "Dringend"; vertretungsItem.DringlichkeitColor = "#FF0000"; // rot } else if (customer.SubstitutionNeed == SubstitutionNeed.SubstitutionWanted) { vertretungsItem.Dringlichkeit = "Möglichst"; vertretungsItem.DringlichkeitColor = "#F3D04F"; // Senfgelb } else if (customer.SubstitutionNeed == SubstitutionNeed.NoSubstitutionWanted) { vertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankKeineVertretungBenoetigt; vertretungsItem.Dringlichkeit = "Kein Vertretungsbedarf"; vertretungsItem.DringlichkeitColor = "#FFFFFF"; // weiß } if (customer.AbWelchemKrankheitsTag > 1 && dateTime < absenceTimeStartDate.AddDays(customer.AbWelchemKrankheitsTag - 1)) { vertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankKeineVertretungBenoetigt; vertretungsItem.Dringlichkeit = $"Vertretung erst ab dem {customer.AbWelchemKrankheitsTag}.Tag benötigt"; vertretungsItem.DringlichkeitColor = "#FFFFFF"; // weiß } if (customer.AbWelchemKrankheitsTag <= 1 && customer.SubstitutionNeed != SubstitutionNeed.SubstitutionWanted && customer.SubstitutionNeed != SubstitutionNeed.SubstitutionNeeded) { vertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankKeineVertretungBenoetigt; } } private static string GetEmployeeAddressInfo(long employeeOid) { var result = string.Empty; var employee = DAOFactory.GenericDAO.LoadByID(employeeOid); var address = employee.Person.Address; if (address != null) { var addressInfo = string.Empty; addressInfo += employee.Person.LastNameFirstName; if (!string.IsNullOrWhiteSpace(address.Street)) { if (addressInfo.Length > 0) { addressInfo += "\n\n"; } addressInfo += address.Street; } if (!string.IsNullOrWhiteSpace(address.PostalCode)) { if (addressInfo.Length > 0) { addressInfo += "\n"; } addressInfo += address.PostalCode; } if (!string.IsNullOrWhiteSpace(address.Town)) { if (addressInfo.Length > 0) { addressInfo += " "; } addressInfo += address.Town; } result = addressInfo; } return result; } private static bool IsAbsenceTimeInAssistanceTime(DateTime currentDate, ArbeitszeitEintrag assistanceTime, AbsenceTime absenceTime) { if (currentDate.DayOfWeek != DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(assistanceTime.Tag) || absenceTime.Start == null) { return false; } var assistanceTimeDates = DateTimeUtils.GetAssistanceTimeComparisonDateTime(assistanceTime.UhrzeitVon, assistanceTime.UhrzeitBis, currentDate); var absenceTimeEnd = absenceTime.End; if (absenceTimeEnd.HasValue && absenceTimeEnd.Value.Hour == 0 && absenceTimeEnd.Value.Minute == 0) { absenceTimeEnd = absenceTimeEnd.Value.AddHours(23).AddMinutes(59).AddSeconds(59); } return assistanceTimeDates.Start.IsIntervalOverlappingWithAbsenceTimeInterval(assistanceTimeDates.End, absenceTime.Start.Value, absenceTimeEnd); } private static bool IsAbsenceTimeInAssistanceTime(DateTime currentDate, ArbeitszeitEintragDC assistanceTime, AbsenceTime absenceTime) { if (currentDate.DayOfWeek != DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(assistanceTime.Tag) || absenceTime.Start == null) { return false; } var assistanceTimeDates = DateTimeUtils.GetAssistanceTimeComparisonDateTime(assistanceTime.UhrzeitVon, assistanceTime.UhrzeitBis, currentDate); var absenceTimeEnd = absenceTime.End; //if (absenceTimeEnd.HasValue && absenceTime.Start.Value.Equals(absenceTimeEnd.Value)) //{ // absenceTimeEnd = absenceTimeEnd.Value.AddHours(23).AddMinutes(59).AddSeconds(59); //} if (absenceTimeEnd.HasValue && absenceTimeEnd.Value.Hour == 0 && absenceTimeEnd.Value.Minute == 0 && absenceTimeEnd.Value.Second == 0) { absenceTimeEnd = absenceTimeEnd.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59); } return assistanceTimeDates.Start.IsIntervalOverlappingWithAbsenceTimeInterval(assistanceTimeDates.End, absenceTime.Start.Value, absenceTimeEnd); } private static List GetAssistanceTimesForCustomer(Customer customer, Employee employee, AbsenceTime absenceTime, DateTime start, DateTime end) { var assistanceTimeEntries = new List(); var allSchoolAssistanceTimes = new List(); var allCustomerAssistanceTimes = new List(); var schoolAssistanceTimes = new List(); var customerAssistanceTimes = new List(); var hasSchoolAssistanceTimes = customer.Customer2OrganisationList.Any(a => a.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule"))); if (hasSchoolAssistanceTimes) { var school = customer.Customer2OrganisationList.FirstOrDefault(f => f.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule"))); if (school != null) { allSchoolAssistanceTimes.AddRange(school.Organisation.Arbeitszeiten); } } var hasAssistanceTimes = customer.Arbeitszeiten?.Count > 0; if (hasAssistanceTimes) { allCustomerAssistanceTimes.AddRange(customer.Arbeitszeiten); } var dateTime = start; while (dateTime <= end) { if (LiegtImZeitraum(dateTime, absenceTime)) { customerAssistanceTimes.AddRange(allCustomerAssistanceTimes.Where(w => IsArbeitszeitValid(w, dateTime))); schoolAssistanceTimes.AddRange(allSchoolAssistanceTimes.Where(w => IsArbeitszeitValid(w, dateTime))); } dateTime = dateTime.AddDays(1); } if (customerAssistanceTimes.Count > 0) { customerAssistanceTimes.DoForEach(assistanceTime => assistanceTimeEntries.AddRange(assistanceTime.ArbeitszeitEintraege.Where(entry => entry.Employee == null || entry.Employee.Equals(employee)))); } else { schoolAssistanceTimes.DoForEach(assistanceTime => assistanceTimeEntries.AddRange(assistanceTime.ArbeitszeitEintraege.Where(entry => entry.Employee == null || entry.Employee.Equals(employee)))); } return assistanceTimeEntries; } private static bool IsArbeitszeitValid(Arbeitszeit arbeitszeit, DateTime time) { if (arbeitszeit.GueltigVon == null && arbeitszeit.GueltigBis == null) { return true; } if (arbeitszeit.GueltigVon.HasValue && arbeitszeit.GueltigBis.HasValue) { return time.InBetween(arbeitszeit.GueltigVon.Value, arbeitszeit.GueltigBis.Value, true); } if (arbeitszeit.GueltigVon == null && arbeitszeit.GueltigBis.HasValue) { return time <= arbeitszeit.GueltigBis; } if (arbeitszeit.GueltigBis == null) { return time >= arbeitszeit.GueltigVon; } return false; } private static List GetSchoolAssistanceTimes(Customer customer, DateTime start, DateTime end, AbsenceTime absenceTime) { var allSchoolAssistanceTimes = new List(); var schoolAssistanceTimes = new List(); var hasSchoolAssistanceTimes = customer.Customer2OrganisationList.Any(a => a.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule"))); if (hasSchoolAssistanceTimes) { var school = customer.Customer2OrganisationList.FirstOrDefault(f => f.ValueList.Any(b => b.Entry.Type == ValueListEntryType.EnvironmentOrganisationType && b.Entry.Value.Equals("Schule"))); if (school != null) { allSchoolAssistanceTimes.AddRange(school.Organisation.Arbeitszeiten); } } var dateTime = start; while (dateTime <= end) { if (LiegtImZeitraum(dateTime, absenceTime)) { schoolAssistanceTimes.AddRange(allSchoolAssistanceTimes.Where(w => IsArbeitszeitValid(w, dateTime))); } dateTime = dateTime.AddDays(1); } return schoolAssistanceTimes; } } }