public DataLockSteps(DataLockContext dataLockContext, CommitmentsContext commitmentsContext, SubmissionContext submissionContext, EmployerAccountContext employerAccountContext, LookupContext lookupContext)
 {
     DataLockContext        = dataLockContext;
     CommitmentsContext     = commitmentsContext;
     SubmissionContext      = submissionContext;
     EmployerAccountContext = employerAccountContext;
     LookupContext          = lookupContext;
 }
예제 #2
0
 public EmployerAccountSteps(EmployerAccountContext employerAccountContext,
                             EarningsAndPaymentsContext earningsAndPaymentsContext,
                             SubmissionContext submissionContext)
 {
     EmployerAccountContext     = employerAccountContext;
     EarningsAndPaymentsContext = earningsAndPaymentsContext;
     SubmissionContext          = submissionContext;
 }
예제 #3
0
 public EarningAndPaymentSteps(EmployerAccountContext employerAccountContext,
                               EarningsAndPaymentsContext earningsAndPaymentsContext,
                               DataLockContext dataLockContext,
                               SubmissionContext submissionContext,
                               LookupContext lookupContext,
                               CommitmentsContext commitmentsContext)
 {
     EmployerAccountContext     = employerAccountContext;
     EarningsAndPaymentsContext = earningsAndPaymentsContext;
     DataLockContext            = dataLockContext;
     SubmissionContext          = submissionContext;
     LookupContext      = lookupContext;
     CommitmentsContext = commitmentsContext;
 }
예제 #4
0
        public static void AssertPaymentsAndEarningsResults(EarningsAndPaymentsContext earningsAndPaymentsContext, SubmissionContext submissionContext, EmployerAccountContext employerAccountContext)
        {
            if (TestEnvironment.ValidateSpecsOnly)
            {
                return;
            }

            ValidateOverallEarningsAndPayments(earningsAndPaymentsContext, submissionContext, employerAccountContext);
            ValidateLearnerSpecificEarningsAndPayments(earningsAndPaymentsContext, submissionContext, employerAccountContext);
        }
        protected override IEnumerable <PaymentResult> FilterPayments(PeriodValue period, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var providerPeriod = (ProviderEarnedPeriodValue)period;
            var earnedPeriod   = GetPaymentFilterPeriodName(providerPeriod);

            var providerPaymentsInPeriod = submissionResults.Where(r => r.ProviderId.Equals(providerPeriod.ProviderId, StringComparison.CurrentCultureIgnoreCase))
                                           .SelectMany(r => r.Payments)
                                           .Where(p => p.DeliveryPeriod == earnedPeriod &&
                                                  p.FundingSource != FundingSource.CoInvestedEmployer);

            return(FilterPeriodPayments(providerPaymentsInPeriod));
        }
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var payments = GetPaymentsForBreakdown(breakdown, submissionResults)
                           .Where(p => p.FundingSource == FundingSource.Levy && p.ContractType == ContractType.ContractWithEmployer && p.Amount >= 0)
                           .ToArray();

            foreach (var period in breakdown.EmployersLevyAccountDebited)
            {
                var employerPayments = payments.Where(p => p.EmployerAccountId == period.EmployerAccountId).ToArray();
                var prevPeriod       = new EmployerAccountPeriodValue
                {
                    EmployerAccountId = period.EmployerAccountId,
                    PeriodName        = period.PeriodName.ToPeriodDateTime().AddMonths(-1).ToPeriodName(),
                    Value             = period.Value
                };

                AssertResultsForPeriod(prevPeriod, employerPayments);
            }
        }
예제 #7
0
        protected override IEnumerable <PaymentResult> FilterPayments(PeriodValue period, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var employerPeriod = (EmployerAccountProviderPeriodValue)period;
            var employer       = employerAccountContext.EmployerAccounts.SingleOrDefault(a => a.Id == employerPeriod.EmployerAccountId);
            var isDasEmployer  = employer?.IsDasEmployer ?? false;
            var earningPeriod  = employerPeriod.PeriodName.ToPeriodDateTime().AddMonths(-1).ToPeriodName();

            return(submissionResults.Where(l => l.ProviderId.Equals(employerPeriod.ProviderId, System.StringComparison.CurrentCultureIgnoreCase))
                   .SelectMany(r => r.Payments).Where(p => (p.EmployerAccountId == employerPeriod.EmployerAccountId || !isDasEmployer && p.EmployerAccountId == 0) &&
                                                      p.DeliveryPeriod == earningPeriod &&
                                                      (p.TransactionType == TransactionType.First16To18EmployerIncentive || p.TransactionType == TransactionType.Second16To18EmployerIncentive)));
        }
예제 #8
0
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var allEarnings = GetEarningsForBreakdown(breakdown, submissionResults);

            foreach (var period in breakdown.ProviderEarnedTotal)
            {
                AssertResultsForPeriod(period, allEarnings);
            }
        }
 protected abstract IEnumerable <PaymentResult> FilterPayments(PeriodValue period, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext);
예제 #10
0
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var payments = GetPaymentsForBreakdown(breakdown, submissionResults)
                           .Where(p => p.FundingSource == FundingSource.CoInvestedSfa &&
                                  p.ContractType == ContractType.ContractWithEmployer)
                           .ToArray();

            foreach (var period in breakdown.SfaLevyCoFundBudget)
            {
                AssertResultsForPeriod(period, payments);
            }
        }
예제 #11
0
 public abstract void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext);
예제 #12
0
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var payments = GetPaymentsForBreakdown(breakdown, submissionResults)
                           .Where(p => p.FundingSource == FundingSource.Levy &&
                                  p.ContractType == ContractType.ContractWithEmployer && p.Amount <= 0)
                           .ToArray();

            foreach (var period in breakdown.EmployersLevyAccountCredited)
            {
                var employerPayments = payments.Where(p => p.EmployerAccountId == period.EmployerAccountId).ToList();

                var positivePayments = employerPayments.Select(x =>
                                                               new PaymentResult
                {
                    Amount            = x.Amount * -1,
                    CalculationPeriod = x.CalculationPeriod,
                    ContractType      = x.ContractType,
                    DeliveryPeriod    = x.DeliveryPeriod,
                    EmployerAccountId = x.EmployerAccountId,
                    FundingSource     = x.FundingSource,
                    TransactionType   = x.TransactionType
                });

                var prevPeriod = new EmployerAccountPeriodValue
                {
                    EmployerAccountId = period.EmployerAccountId,
                    PeriodName        = period.PeriodName.ToPeriodDateTime().AddMonths(-1).ToPeriodName(),
                    Value             = period.Value
                };

                AssertResultsForPeriod(prevPeriod, positivePayments.ToArray());
            }
        }
예제 #13
0
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var allPayments = GetPaymentsForBreakdown(breakdown, submissionResults)
                              .Where(p => p.FundingSource != FundingSource.CoInvestedEmployer && p.Amount > 0)
                              .ToArray();

            foreach (var period in breakdown.ProviderPaidBySfa)
            {
                var prevPeriod = new PeriodValue
                {
                    PeriodName = period.PeriodName.ToPeriodDateTime().AddMonths(-1).ToPeriodName(),
                    Value      = period.Value
                };

                AssertResultsForPeriod(prevPeriod, allPayments);
            }
        }
 public EmployerAccountSteps(EmployerAccountContext employerAccountContext)
 {
     EmployerAccountContext = employerAccountContext;
 }
예제 #15
0
        public static void AssertPaymentsAndEarningsResults(EarningsAndPaymentsContext earningsAndPaymentsContext, SubmissionContext submissionContext, EmployerAccountContext employerAccountContext)
        {
            if (TestEnvironment.ValidateSpecsOnly)
            {
                return;
            }

            var submissionResults = submissionContext.SubmissionResults.ToArray();

            new EmployerEarnedFor16To18IncentiveRule().AssertPeriodValues(earningsAndPaymentsContext.EmployerEarnedFor16To18Incentive, submissionResults, employerAccountContext);
            new ProviderEarnedForOnProgrammeRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForOnProgramme, submissionResults, employerAccountContext);
            new ProviderEarnedForCompletionRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForCompletion, submissionResults, employerAccountContext);
            new ProviderEarnedForBalancingRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForBalancing, submissionResults, employerAccountContext);
            new ProviderEarnedFor16To18IncentiveRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedFor16To18Incentive, submissionResults, employerAccountContext);
            new ProviderEarnedForEnglishAndMathOnProgrammeRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForEnglishAndMathOnProgramme, submissionResults, employerAccountContext);
            new ProviderEarnedForEnglishAndMathBalancing().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForEnglishAndMathBalancing, submissionResults, employerAccountContext);
            new ProviderEarnedForFrameworkUpliftOnProgrammeRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForFrameworkUpliftOnProgramme, submissionResults, employerAccountContext);
            new ProviderEarnedForFrameworkUpliftOnCompletionRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForFrameworkUpliftOnCompletion, submissionResults, employerAccountContext);
            new ProviderEarnedForFrameworkUpliftOnBalancingRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForFrameworkUpliftOnBalancing, submissionResults, employerAccountContext);
            new ProviderEarnedForLearningSupportRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForLearningSupport, submissionResults, employerAccountContext);
            new ProviderEarnedForDisadvantageUpliftRule().AssertPeriodValues(earningsAndPaymentsContext.ProviderEarnedForDisadvantageUplift, submissionResults, employerAccountContext);
        }
예제 #16
0
 private static void ValidateOverallEarningsAndPayments(EarningsAndPaymentsContext earningsAndPaymentsContext, SubmissionContext submissionContext, EmployerAccountContext employerAccountContext)
 {
     foreach (var breakdown in earningsAndPaymentsContext.OverallEarningsAndPayments)
     {
         foreach (var rule in Rules)
         {
             rule.AssertBreakdown(breakdown, submissionContext.SubmissionResults, employerAccountContext);
         }
     }
 }
예제 #17
0
 private static void ValidateLearnerSpecificEarningsAndPayments(EarningsAndPaymentsContext earningsAndPaymentsContext, SubmissionContext submissionContext, EmployerAccountContext employerAccountContext)
 {
     foreach (var breakdown in earningsAndPaymentsContext.LearnerOverallEarningsAndPayments)
     {
         var learnerResults = submissionContext.SubmissionResults.Where(r => r.LearnerId == breakdown.LearnerId).ToArray();
         try
         {
             foreach (var rule in Rules)
             {
                 rule.AssertBreakdown(breakdown, learnerResults, employerAccountContext);
             }
         }
         catch (Exception ex)
         {
             throw new Exception($"{ex.Message} (learner {breakdown.LearnerId})", ex);
         }
     }
 }
예제 #18
0
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var payments = submissionResults.SelectMany(r => r.Payments)
                           .Where(r => r.FundingSource == FundingSource.Levy &&
                                  r.ContractType == ContractType.ContractWithEmployer);

            foreach (var period in breakdown.EmployerLevyTransactions)
            {
                var employerPayments = payments.Where(p => p.EmployerAccountId == period.EmployerAccountId).ToList();
                AssertResultsForPeriod(period, employerPayments.ToArray());
            }
        }
        public override void AssertBreakdown(EarningsAndPaymentsBreakdown breakdown, IEnumerable <LearnerResults> submissionResults, EmployerAccountContext employerAccountContext)
        {
            var allPayments = GetPaymentsForBreakdown(breakdown, submissionResults)
                              .Where(p => p.FundingSource == FundingSource.CoInvestedEmployer)
                              .ToArray();

            foreach (var period in breakdown.PaymentDueFromEmployers)
            {
                // Currently have to assume there is only 1 non-levy employer in spec as there is no way to tell employer if there is no commitment.
                var employerAccount     = employerAccountContext.EmployerAccounts.SingleOrDefault(a => a.Id == period.EmployerAccountId);
                var isDasEmployer       = employerAccount == null ? false : employerAccount.IsDasEmployer;
                var paymentsForEmployer = allPayments.Where(p => p.EmployerAccountId == period.EmployerAccountId || (!isDasEmployer && p.EmployerAccountId == 0)).ToArray();
                var prevPeriod          = new EmployerAccountPeriodValue
                {
                    EmployerAccountId = period.EmployerAccountId,
                    PeriodName        = period.PeriodName.ToPeriodDateTime().AddMonths(-1).ToPeriodName(),
                    Value             = period.Value
                };

                AssertResultsForPeriod(prevPeriod, paymentsForEmployer);
            }
        }
        public virtual void AssertPeriodValues(IEnumerable <PeriodValue> periodValues, LearnerResults[] submissionResults, EmployerAccountContext employerAccountContext)
        {
            foreach (var period in periodValues)
            {
                var payments     = FilterPayments(period, submissionResults, employerAccountContext);
                var paidInPeriod = payments.Sum(p => p.Amount);

                if (Math.Round(paidInPeriod, 2) != Math.Round(period.Value, 2))
                {
                    throw new Exception(FormatAssertionFailureMessage(period, paidInPeriod));
                }
            }
        }