using System; using System.Collections.Generic; using BeWo.Data.Entities; using BS.Shared.Core; using BS.Shared.DataContracts; namespace BeWo.Service.Plugins { public class GroupDurationCalculator : AbstractIDSpecificDefaultClass { public virtual GroupDurationDC CalculateGroupDuration(int personCount, int employeeCount, decimal totalDuration) { return null; } public virtual GroupDurationDC CalculateGroupDuration(int personCount, int employeeCount, decimal totalDuration, long[] costBearer2SupportConceptArray) { return CalculateGroupDuration(personCount, employeeCount, totalDuration); } public virtual void CalculateGroupDuration(ServiceRecordGroup group) { if (group.ServiceRecordList.Count > 0) { var dcalc = PluginLoader.FindClass(); decimal maxRoundedDuration = 0; long[] costBearer2SupportConceptArray = new long[group.ServiceRecordList.Count]; int idx = 0; foreach (var sr in group.ServiceRecordList) { if (dcalc != null) { dcalc.CalculateRoundedDuration(sr); } if (sr.RoundedDuration > maxRoundedDuration) { maxRoundedDuration = sr.RoundedDuration; } costBearer2SupportConceptArray[idx++] = sr.CostBearer2SupportConcept.Oid.Value; } var dc = CalculateGroupDuration(group.CustomerCount, group.EmployeeCount, maxRoundedDuration, costBearer2SupportConceptArray); decimal durationForSingleRecord = 0; decimal durationForGroup = maxRoundedDuration; if (dc != null) { durationForSingleRecord = dc.SingleDuration; durationForGroup = dc.TotalDuration; } else { DateTime dt = DateTime.Now; foreach (var sr in group.ServiceRecordList) { dt = sr.Start.Value; } if (dt < new DateTime(2018, 9, 1)) { durationForSingleRecord = Math.Round(durationForGroup / group.CustomerCount, 2, MidpointRounding.AwayFromZero); } else { durationForSingleRecord = Math.Ceiling(durationForGroup / group.CustomerCount); } } foreach (var sr in group.ServiceRecordList) { sr.RoundedDuration = durationForSingleRecord; sr.GroupRoundedDuration = durationForGroup; } group.RoundedDuration = durationForGroup; } } } }