using System; using System.Collections.Generic; using System.Linq; 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 BS.Shared.Services; using BeWo.Service.Configuration; namespace BeWo.Service.Plugins { public class SupportConceptAnalysisCreator : AbstractIDSpecificDefaultClass { public virtual List GetSupportConceptAnalysis(IList c2sOids, long? employeeOid, long? teamOid, DateTime? appointedDate, int? expiredMonths, bool showArchivedScs) { DateTime maxDate = appointedDate.HasValue ? appointedDate.Value.AddDays(1) : DateTime.MaxValue; var lResult = new List(); foreach (var iCb2Sc in DAOFactory.GenericDAO.GetAllActive()) { var calc = PluginLoader.FindClass(iCb2Sc.CostBearer.ID) ?? Calculations.GetInstance(iCb2Sc.CostBearer.ID); var iDC = new SupportConceptOverviewDC(); iDC.ActivationType = iCb2Sc.SupportConcept.IsActive; if (iDC.ActivationType == ActivationTypeId.Active && iCb2Sc.SupportConcept.Customer.IsActive != ActivationTypeId.Active) { iDC.ActivationType = iCb2Sc.SupportConcept.Customer.IsActive; } bool cont = true; if (c2sOids != null) { if (!c2sOids.Contains(iCb2Sc.Oid.Value)) { cont = false; } } else { cont = (showArchivedScs && iDC.ActivationType != ActivationTypeId.Deleted) || iDC.ActivationType == ActivationTypeId.Active; if (cont && employeeOid != null) { bool isRelatedToEmployee = false; foreach (var e2c in iCb2Sc.SupportConcept.Customer.Employee2CustomerList) { if (!isRelatedToEmployee) { if (employeeOid.Value == e2c.EmployeeOid.Value) { isRelatedToEmployee = true; } } } if (!isRelatedToEmployee) { cont = false; } } if (cont && expiredMonths.HasValue) { cont = iCb2Sc.EndDate.HasValue && iCb2Sc.EndDate.Value < DateTime.Now.AddMonths(expiredMonths.Value); } if (cont && teamOid != null) { bool isRelatedToTeam = false; var team = DAOFactory.GenericDAO.LoadByID(teamOid.Value); Dictionary teamMemberOidDict = new Dictionary(); foreach (var member in team.MemberList) { if (!teamMemberOidDict.ContainsKey(member.Oid.Value)) { teamMemberOidDict.Add(member.Oid.Value, member.Oid.Value); } //if (team.Leader != null && !teamMemberOidDict.ContainsKey(team.Leader.Oid.Value)) //{ // teamMemberOidDict.Add(team.Leader.Oid.Value, team.Leader.Oid.Value); //} } foreach (var e2c in iCb2Sc.SupportConcept.Customer.Employee2CustomerList) { if (!isRelatedToTeam) { if (teamMemberOidDict.ContainsKey(e2c.EmployeeOid.Value)) { isRelatedToTeam = true; } } } if (!isRelatedToTeam) { cont = false; } } } #if DEBUG if (iCb2Sc.Oid.HasValue && !iCb2Sc.Oid.Value.Equals(319)) { //cont = false; } #endif if (cont) { iDC.CalculationDate = DateTime.Now.Date; iDC.RequestedStartDate = iCb2Sc.RequestedStartDate; iDC.RequestedEndDate = iCb2Sc.RequestedEndDate; iDC.SupportConceptOid = iCb2Sc.SupportConcept.Oid.Value; iDC.CostBearer2SupportConceptOid = iCb2Sc.Oid.Value; iDC.CostBearer = iCb2Sc.CostBearer.Organisation != null ? iCb2Sc.CostBearer.Organisation.Name : string.Empty; iDC.CostBearerId = iCb2Sc.CostBearer.ID; iDC.CustomerOid = iCb2Sc.SupportConcept.Customer.Oid.Value; iDC.CustomerFirstName = iCb2Sc.SupportConcept.Customer.Person.FirstName; iDC.CustomerLastName = iCb2Sc.SupportConcept.Customer.Person.LastName; var costRates = iCb2Sc.CostBearer.CostRatePeriods.MapToNewDCs(); iDC.ServiceUnit = costRates.GetCurrentlyValidRate(CostRatePeriodType.MinutesPerServiceUnit); if (iDC.ServiceUnit == null) { iDC.ServiceUnit = new CostRatePeriodDC(); iDC.ServiceUnit.CostRateType = CostRatePeriodType.MinutesPerServiceUnit; iDC.ServiceUnit.UnitName = "FLS"; iDC.ServiceUnit.CostRateValue = 60; } iDC.CurrentHourlyRate = costRates.GetCurrentlyValidRateValue(CostRatePeriodType.HourlyRate) ?? 0m; iDC.CurrentRateFactor = costRates.GetCurrentlyValidRateValue(CostRatePeriodType.RateFactor) ?? 0m; var relDC = iCb2Sc.MapToNewDC(); DateTime minDate = DateTime.MinValue; if (iCb2Sc.ApprovedStartDate.HasValue) { minDate = iCb2Sc.ApprovedStartDate.Value.Date; } else if (iCb2Sc.RequestedStartDate.HasValue) { minDate = iCb2Sc.RequestedStartDate.Value.Date; } var recordDCs = (from sr in iCb2Sc.ServiceRecords where (sr.Start >= minDate && sr.Start < maxDate) select MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(sr)).ToList(); iDC.FLSRecordedTillNow = calc.GetBillableDurationInMinutes(recordDCs)/60m; //var notBillableAbsenceTimes = calc.GetHoursNotBillableDueToAbsenceTimes(relDC, recordDCs, // iCb2Sc.SupportConcept.Customer.GetAbsencesTimesNotBillableWholeWeeks(), false, // false); //var notBillableMoreThanApproved = calc.GetHoursNotBillableDueToMoreThanApproved(relDC, recordDCs, // false, true); iDC.FLSBilledTillNow = iDC.FLSRecordedTillNow; //- notBillableAbsenceTimes //- notBillableMoreThanApproved; decimal lDurationInWeeksTillNow = calc.GetDurationInWeeksTillNow(relDC, appointedDate) ?? 0; decimal lDurationInWeeks = calc.GetDurationInWeeks(relDC) ?? 0; if (iCb2Sc.Status == CostBearer2SupportConceptStatus.Approved) { iDC.IsApproved = true; if (iCb2Sc.ApprovedStartDate != null && iCb2Sc.ApprovedEndDate != null) { iDC.ApprovedStartDate = iCb2Sc.ApprovedStartDate.Value; iDC.ApprovedEndDate = iCb2Sc.ApprovedEndDate.Value; //lDurationInWeeks = Convert.ToDecimal((iDC.ApprovedEndDate.Value - iDC.ApprovedStartDate.Value).Days + 1) / 7; //lCalcDate = lCalcDate > iCb2Sc.ApprovedEndDate // ? iCb2Sc.ApprovedEndDate.Value.Date.AddDays(1) // : lCalcDate; //lDurationInWeeksTillNow = Convert.ToDecimal((lCalcDate - iCb2Sc.ApprovedStartDate.Value).Days) / 7m; } } else { iDC.IsApproved = false; //if (iCb2Sc.RequestedStartDate != null && iCb2Sc.RequestedEndDate != null) //{ //lDurationInWeeks = Convert.ToDecimal((iCb2Sc.RequestedEndDate.Value - iCb2Sc.RequestedStartDate.Value).Days + 1) / 7; //lCalcDate = lCalcDate > iCb2Sc.RequestedEndDate // ? iCb2Sc.RequestedEndDate.Value.Date // : lCalcDate; //lDurationInWeeksTillNow = Convert.ToDecimal((lCalcDate - iCb2Sc.RequestedStartDate.Value).Days) / 7m; //} } iDC.FLSApprovedPerWeek = calc.GetApprovedHoursPerWeekAverage(relDC, true) ?? 0m; decimal? flsTotal = calc.GetApprovedHoursTotal(relDC, true); iDC.FLSApprovedSum = flsTotal ?? 0m; var approvedTillNow = calc.GetApprovedHoursTillNow(relDC, appointedDate); iDC.FLSApprovedTillNow = approvedTillNow ?? 0; //if (flsTotal.HasValue && lDurationInWeeks != 0) //{ // iDC.FLSApprovedTillNow = flsTotal.Value * ((lDurationInWeeksTillNow + (1m / 7m)) / lDurationInWeeks); //} //else //{ // iDC.FLSApprovedTillNow = iDC.FLSApprovedPerWeek * (lDurationInWeeksTillNow + (1m / 7m)); //} if (iDC.FLSApprovedSum <= 0) { iDC.FLSRecordedTillNowInPercent = 0; } else { iDC.FLSRecordedTillNowInPercent = iDC.FLSRecordedTillNow/iDC.FLSApprovedSum*100; } iDC.FLSDifferenceApprovedRecordedTillNow = iDC.FLSRecordedTillNow - iDC.FLSApprovedTillNow; if (iDC.FLSApprovedTillNow <= 0) { iDC.FLSDifferenceApprovedRecordedTillNowInPercent = 0; } else { iDC.FLSDifferenceApprovedRecordedTillNowInPercent = iDC.FLSRecordedTillNow/iDC.FLSApprovedTillNow* 100; } iDC.FLSOpen = iDC.FLSApprovedSum - iDC.FLSRecordedTillNow; iDC.OpenWeeks = lDurationInWeeks - lDurationInWeeksTillNow; //TODO kostenträger spezifisch!? in Calculations verlagern! iDC.OpenMonths = iDC.OpenWeeks/4.34m; if (iDC.OpenWeeks <= 0) { iDC.FLSOpenPerWeek = 0; } else { iDC.FLSOpenPerWeek = iDC.FLSOpen/iDC.OpenWeeks; } iDC.WeeksTotal = lDurationInWeeks; if (iDC.WeeksTotal != 0) { iDC.DurationPercentage = (lDurationInWeeksTillNow/iDC.WeeksTotal)*100; } lResult.Add(iDC); iDC.BEApprovedPerWeek = iDC.ServiceUnit.GetHoursInBE(iDC.FLSApprovedPerWeek); iDC.BEApprovedSum = iDC.ServiceUnit.GetHoursInBE(iDC.FLSApprovedSum); iDC.BEApprovedTillNow = iDC.ServiceUnit.GetHoursInBE(iDC.FLSApprovedTillNow); iDC.BEBilledTillNow = iDC.ServiceUnit.GetHoursInBE(iDC.FLSBilledTillNow); iDC.BEDifferenceApprovedRecordedTillNow = iDC.ServiceUnit.GetHoursInBE(iDC.FLSDifferenceApprovedRecordedTillNow); iDC.BEDifferenceApprovedRecordedTillNowInPercent = iDC.ServiceUnit.GetHoursInBE(iDC.FLSDifferenceApprovedRecordedTillNowInPercent); iDC.BEOpen = iDC.ServiceUnit.GetHoursInBE(iDC.FLSOpen); iDC.BEOpenPerWeek = iDC.ServiceUnit.GetHoursInBE(iDC.FLSOpenPerWeek); if (iDC.BEOpenPerWeek > iDC.BEOpen) iDC.BEOpenPerWeek = iDC.BEOpen; iDC.BERecordedTillNow = iDC.ServiceUnit.GetHoursInBE(iDC.FLSRecordedTillNow); iDC.BERecordedTillNowInPercent = iDC.ServiceUnit.GetHoursInBE(iDC.FLSRecordedTillNowInPercent); } } return lResult; } } }