private void CapClaimedValueAtDeliverableGroupLevelIfApplicable(FundingClaimReconciliationAllocationGroup reconciliationAllocationGroup, PolicyConfiguration policyConfiguration) { foreach (ContractAllocation allocation in reconciliationAllocationGroup.ContractAllocations) { foreach (var deliverableGroup in allocation.DeliverableGroups) { DeliverableGroupBehaviour deliverableGroupSetting = policyConfiguration.DeliverableGroupSettings.FirstOrDefault(x => x.DeliverableGroupName == deliverableGroup.DeliverableGroupName); if (deliverableGroupSetting != null) { if (deliverableGroupSetting.IsClaimToProfileCappingNeeded && deliverableGroup.ClaimedValue > deliverableGroup.PlannedValue) { deliverableGroup.CappedClaimValue = deliverableGroup.PlannedValue.GetValueOrDefault(); deliverableGroup.VarianceValue = 0; } } } } }
public void CalculateReconciliation(FundingClaimReconciliationAllocationGroup reconciliationAllocationGroup, PolicyConfiguration policyConfiguration) { //TODO: Guard to be implemented; IoC , Logger CalculatePlannedClaimedAndVarianceAtDeliverableGroupLevel(reconciliationAllocationGroup); CapClaimedValueAtDeliverableGroupLevelIfApplicable(reconciliationAllocationGroup, policyConfiguration); CalculatePlannedClaimedAndVarianceAtAllocationLevel(reconciliationAllocationGroup); CalculatePlannedClaimedAndVarianceAtClaimGroupLevel(reconciliationAllocationGroup); CalculateReconciliationAtReconciliationAllocationGroupLevel(reconciliationAllocationGroup, policyConfiguration); CalculateReconciliationAtAllocationLevel(reconciliationAllocationGroup); }
private void CalculateReconciliationAtReconciliationAllocationGroupLevel(FundingClaimReconciliationAllocationGroup reconciliationAllocationGroup, PolicyConfiguration policyConfiguration) { var reconciliationAllocationGroupSetting = policyConfiguration.ClaimGroupSettings.FirstOrDefault(x => x.ReconciliationAllocationGroupName == reconciliationAllocationGroup.ReconciliationAllocationGroupName && x.ClaimTypeName == reconciliationAllocationGroup.ClaimTypeName); if (reconciliationAllocationGroupSetting == null) { return; } if ((!reconciliationAllocationGroupSetting.ReconcileIfOverDelivery || reconciliationAllocationGroup.ProviderPerformance != ProviderPerformance.OverDeliver) && (!reconciliationAllocationGroupSetting.ReconcileIfUnderDelivery || reconciliationAllocationGroup.ProviderPerformance != ProviderPerformance.UnderDeliver)) { return; } var deminimis = reconciliationAllocationGroup.ProviderPerformance == ProviderPerformance.OverDeliver ? reconciliationAllocationGroupSetting.OverDeliveryDeminimis.GetValueOrDefault() : reconciliationAllocationGroupSetting.UnderDeliveryDeminimis.GetValueOrDefault(); if (Math.Abs(reconciliationAllocationGroup.VarianceValue.GetValueOrDefault()) <= Math.Abs(deminimis)) { return; } reconciliationAllocationGroup.ReconciledValue = reconciliationAllocationGroup.VarianceValue; }