Files
BeWoPlaner/Service/Plugins/GroupDurationCalculator.cs
2020-02-06 18:56:40 +01:00

92 lines
3.1 KiB
C#

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<GroupDurationCalculator>
{
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<ServiceRecordDurationCalculator>();
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;
}
}
}
}