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;
        }