Files
BeWoPlaner/ReportImp/SeWo/SeWoSupportConceptAnalysisCreator.cs
2017-06-14 08:28:21 +02:00

225 lines
9.1 KiB
C#

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;
using BeWo.Service.Plugins;
using SeWo.Calculations;
namespace BeWo.SeWo
{
public class SeWoSupportConceptAnalysisCreator : SupportConceptAnalysisCreator
{
public override List<SupportConceptOverviewDC> GetSupportConceptAnalysis(IList<long> 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<SupportConceptOverviewDC>();
foreach (var iCb2Sc in DAOFactory.GenericDAO.GetAllActive<CostBearer2SupportConcept>())
{
var calc = new SupportConceptAnalysisCalculations();
var iDC = new SupportConceptOverviewDC();
if (employeeOid != null)
{
foreach (var e2c in iCb2Sc.SupportConcept.Customer.Employee2CustomerList)
{
if (!iDC.IsRelatedToEmployee)
{
if (employeeOid.Value == e2c.EmployeeOid.Value)
{
iDC.IsRelatedToEmployee = true;
}
}
}
}
iDC.ActivationType = iCb2Sc.SupportConcept.IsActive;
if (iDC.ActivationType == ActivationTypeId.Active &&
iCb2Sc.SupportConcept.Customer.IsActive != ActivationTypeId.Active)
{
iDC.ActivationType = iCb2Sc.SupportConcept.Customer.IsActive;
}
bool cont = (showArchivedScs && iDC.ActivationType == ActivationTypeId.Archived) ||
(!showArchivedScs && iDC.ActivationType == ActivationTypeId.Active);
if (c2sOids != null && iCb2Sc.Oid.HasValue && !c2sOids.Contains(iCb2Sc.Oid.Value))
{
cont = false;
}
if (cont && expiredMonths.HasValue)
{
cont = iCb2Sc.EndDate.HasValue &&
iCb2Sc.EndDate.Value < DateTime.Now.AddMonths(expiredMonths.Value);
}
#if DEBUG
if (iCb2Sc.Oid.HasValue && !iCb2Sc.Oid.Value.Equals(76))
{
//cont = false;
}
#endif
if (cont && (!employeeOid.HasValue || iDC.IsRelatedToEmployee))
{
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;
iDC.FLSBilledTillNow = iDC.FLSRecordedTillNow;
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;
}
}
else
{
iDC.IsApproved = false;
}
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 (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;
}
}
}