using System; using System.Collections.Generic; using System.Linq; using BeWo.Data; 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; namespace BeWo.Service.Plugins { public class OperationService : AbstractIDSpecificDefaultClass { protected String ReturnMessage { get; set; } public virtual String CreateDefaultCustomerServiceRecords(DateTime start, DateTime end, IList cb2scOids) { var vs = PluginLoader.FindClass(); ReturnMessage = ""; DateTimeSpan span = new DateTimeSpan(); span.StartDateTime = start; span.EndDateTime = end.AddDays(1).AddTicks(-1); var c2sList = DAOFactory.GenericDAO.LoadByIDs(cb2scOids); foreach (var c2s in c2sList) { var srList = DAOFactory.SearchDAO.FindServiceRecordsInSpan(c2s.Oid.Value, span).ToList(); if (srList.Count == 0) { srList = ErstelleStundenplanEintraege(span.StartDateTime.Date, span.EndDate.Date, c2s, vs); DAOFactory.GenericDAO.Insert(srList); ReturnMessage += String.Format("Es wurden {0} Einträge erstellt.", srList.Count); } else { if (srList.Count > 1) { ReturnMessage = String.Format("In dem ausgewählten Zeitraum sind bereits {0} Einträge vorhanden, daher können keine weiteren Einträge automatisch erstellt werden.", srList.Count); } else { ReturnMessage = String.Format("In dem ausgewählten Zeitraum ist bereits ein Eintrag vorhanden, daher können keine weiteren Einträge automatisch erstellt werden."); } } } return ReturnMessage; } public virtual List ErstelleStundenplanEintraege(DateTime start, DateTime ende, CostBearer2SupportConcept c2s, VacationService vs) { var customer = c2s.SupportConcept.Customer; var stundenplan = GetStundenplan(customer, start, ende); List serviceRecords = new List(); var defaultSd = GetDefaultServiceDescription(c2s); if (defaultSd == null) { ReturnMessage = "Es konnte keine passende Leistung ermittelt werden."; return serviceRecords; } while (start <= ende) { //var ferien = vs.GetFerien(start, "nrw"); var ft = vs.GetFeiertag(start); //if (ferien == null && ft == null) if (ft == null && !HatAbwesenheit(start, customer)) { var newServiceRecords = CreateServiceRecords(stundenplan, start, c2s, defaultSd); serviceRecords.AddRange(newServiceRecords); } start = start.AddDays(1); } return serviceRecords; } private bool HatAbwesenheit(DateTime start, Customer customer) { foreach (var at in customer.AbsenceTimes) { if (at.Start <= start && (!at.End.HasValue || at.End >= start)) { return true; } } return false; } protected virtual IList CreateServiceRecords(Arbeitszeit arbeitszeit, DateTime datum, CostBearer2SupportConcept c2s, ServiceDescription defaultSd) { var records = new List(); if (arbeitszeit != null && arbeitszeit.ArbeitszeitEintraege != null) { foreach (var ae in arbeitszeit.ArbeitszeitEintraege) { if (IsSameWeekday(ae, datum.DayOfWeek)) { var sr = CreateServiceRecord(ae, datum, c2s, defaultSd); records.Add(sr); } } } return records; } public virtual ServiceRecord CreateServiceRecord(ArbeitszeitEintrag ae, DateTime datum, CostBearer2SupportConcept c2s, ServiceDescription defaultSd) { ServiceRecord sr = new ServiceRecord(); sr.Start = GetDateTime(ae.UhrzeitVon, datum); sr.End = GetDateTime(ae.UhrzeitBis, datum); sr.RoundedDuration = (decimal)sr.End.Value.Subtract(sr.Start.Value).TotalMinutes; if (ae.Employee != null) { sr.Employee = ae.Employee; } else { sr.Employee = LoggedInUserOperationContextExt.Current.User.Employee; } sr.Customer = c2s.SupportConcept.Customer; sr.SupportConcept = c2s.SupportConcept; sr.CostBearer2SupportConcept = c2s; sr.ServiceDescription = defaultSd; sr.ServiceRecordType = ServiceRecordTypeId.DefaultActivity; sr.DistanceInMeter = 0; sr.DurationInStunden = ZeiterfassungsDauer.Minuten; sr.ServiceRecordFormat = ServiceRecordFormate.OriginaleZeiterfassung; sr.Relevance = 0; return sr; } public virtual ServiceDescription GetDefaultServiceDescription(CostBearer2SupportConcept c2s) { foreach (var ap in c2s.ApprovalPeriodList) { if (ap.ServiceCategory != null) { var desc = DAOFactory.SearchDAO.FindServiceDescriptionForCategory(ap.ServiceCategory.Oid.Value); var sd = desc.OrderBy(a => a.Position).FirstOrDefault(); if (sd != null) { return sd; } } } return GetDefaultServiceDescription(); } public virtual ServiceDescription GetDefaultServiceDescription() { return null; } private Arbeitszeit GetStundenplan(Customer customer, DateTime start, DateTime ende) { if (customer == null) { return null; } var stundenplan = SucheStundenplan(customer.Arbeitszeiten, start, ende); return stundenplan; } private static Arbeitszeit SucheStundenplan(IList arbeitszeiten, DateTime start, DateTime ende) { if (arbeitszeiten != null && arbeitszeiten.Count > 0) { foreach (var az in arbeitszeiten) { if ((!az.GueltigVon.HasValue || az.GueltigVon <= ende) && (!az.GueltigBis.HasValue || az.GueltigBis >= start)) { return az; } } } return null; } public static bool IsSameWeekday(ArbeitszeitEintrag ae, DayOfWeek day) { if (day == DayOfWeek.Monday && ae.Tag == AppointmentDayOfWeek.Montag) { return true; } if (day == DayOfWeek.Tuesday && ae.Tag == AppointmentDayOfWeek.Dienstag) { return true; } if (day == DayOfWeek.Wednesday && ae.Tag == AppointmentDayOfWeek.Mittwoch) { return true; } if (day == DayOfWeek.Thursday && ae.Tag == AppointmentDayOfWeek.Donnerstag) { return true; } if (day == DayOfWeek.Friday && ae.Tag == AppointmentDayOfWeek.Freitag) { return true; } if (day == DayOfWeek.Saturday && ae.Tag == AppointmentDayOfWeek.Samstag) { return true; } return false; } public static DateTime? GetDateTime(String timeAsString, DateTime date) { String dateStr = String.Format("{0:dd.MM.yyyy} {1}", date, timeAsString); DateTime dateOut; if (DateTime.TryParse(dateStr, out dateOut)) { return dateOut; } return null; } } }