private async Task UpsertOptions(StandardCollation standard, bool removingStandard = false)
        {
            // retrieving both live and non-live, so that an existing non-live option can be re-activated
            var existingOptions = await GetOptionsInternal(new List <int> {
                standard.StandardId.Value
            }, isLive : null);

            var optionsToBeRemoved = removingStandard
                ? existingOptions
                : existingOptions
                                     .Where(existingOptionName => !standard.Options.Any(optionName => optionName.Equals(existingOptionName.OptionName, StringComparison.InvariantCulture)));

            foreach (var option in optionsToBeRemoved)
            {
                await UpdateExistingOptionToRemoved(standard, option.OptionName);
            }

            // the OptionName is a natural key, the Id is created in assessor as the IFATE id of an option does not always exist
            // therefore updates are to add previously removed options back for a standard
            var optionsToBeUpdated = standard.Options
                                     .Where(latestOptionName => existingOptions.Any(existingOptionName => existingOptionName.OptionName.Equals(latestOptionName, StringComparison.InvariantCulture)));

            foreach (var optionName in optionsToBeUpdated)
            {
                await UpdateExistingOption(standard, optionName);
            }

            var optionsToBeInserted = standard.Options
                                      .Where(latestOptionName => !existingOptions.Any(existingOptionName => existingOptionName.OptionName.Equals(latestOptionName, StringComparison.InvariantCulture)));

            foreach (var optionName in optionsToBeInserted)
            {
                await InsertNewOption(standard, optionName);
            }
        }
        public void Setup()
        {
            _standardService  = new Mock <IStandardService>();
            _cleanserService  = new Mock <ISpecialCharacterCleanserService>();
            _logger           = new Mock <ILogger <SearchStandardsHandler> >();
            _validator        = new Mock <IEpaOrganisationValidator>();
            _standardSummary1 = new StandardCollation {
                StandardId = 1, Title = "name 100"
            };
            _standardSummary2 = new StandardCollation {
                StandardId = 2, Title = "name 10"
            };
            errorResponse = BuildErrorResponse(errorMessage, ValidationStatusCode.BadRequest);
            _validator.Setup(v => v.ValidatorSearchStandardsRequest(It.IsAny <SearchStandardsValidationRequest>())).Returns(new ValidationResponse());

            _expectedStandards = new List <StandardCollation>
            {
                _standardSummary1,
                _standardSummary2
            };

            _cleanserService.Setup(c => c.UnescapeAndRemoveNonAlphanumericCharacters(_standardSummary1.Title)).Returns(_standardSummary1.Title);
            _cleanserService.Setup(c => c.UnescapeAndRemoveNonAlphanumericCharacters(_standardSummary2.Title)).Returns(_standardSummary2.Title);

            _standardService.Setup(s => s.GetAllStandards()).Returns(Task.FromResult(_expectedStandards.AsEnumerable()));
            _searchStandardsHandler = new SearchStandardsHandler(_standardService.Object, _logger.Object, _cleanserService.Object, _validator.Object);
        }
 private async Task InsertNewOption(StandardCollation standard, string optionName)
 {
     await _unitOfWork.Connection.ExecuteAsync(
         "INSERT INTO [Options] ([StdCode] ,[OptionName]) " +
         "VALUES (@stdCode, @optionName)",
         param : new { StdCode = standard.StandardId, optionName },
         transaction : _unitOfWork.Transaction
         );
 }
 private async Task InsertNewStandard(StandardCollation standard, string standardData)
 {
     await _unitOfWork.Connection.ExecuteAsync(
         "INSERT INTO [StandardCollation] ([StandardId],[ReferenceNumber] ,[Title],[StandardData]) " +
         $@"VALUES (@standardId, @referenceNumber, @Title, @standardData)",
         param : new { standard.StandardId, standard.ReferenceNumber, standard.Title, standardData },
         transaction : _unitOfWork.Transaction
         );
 }
 private async Task UpdateExistingStandardToRemoved(StandardCollation standard)
 {
     await _unitOfWork.Connection.ExecuteAsync(
         "Update [StandardCollation] set IsLive=0, DateRemoved=getutcdate() " +
         "where StandardId = @standardId",
         param : new { standard.StandardId },
         transaction : _unitOfWork.Transaction
         );
 }
 private async Task UpdateExistingStandard(StandardCollation standard, string standardData)
 {
     // when new ReferenceNumber is null (IFA has not supplied one) retain the current ReferenceNumber
     await _unitOfWork.Connection.ExecuteAsync(
         "Update [StandardCollation] set ReferenceNumber = case when @referenceNumber is not null then @referenceNumber else ReferenceNumber end, Title = @Title, StandardData = @StandardData, DateUpdated=getutcdate(), DateRemoved=null, IsLive = 1 " +
         "where StandardId = @standardId",
         param : new { standard.StandardId, standard.ReferenceNumber, standard.Title, standardData },
         transaction : _unitOfWork.Transaction
         );
 }
 private async Task UpdateExistingOptionToRemoved(StandardCollation standard, string optionName)
 {
     await _unitOfWork.Connection.ExecuteAsync(
         "UPDATE [Options] SET " +
         "IsLive = 0, " +
         "DateRemoved = GETUTCDATE() " +
         "WHERE StdCode = @stdCode AND OptionName = @optionName COLLATE SQL_Latin1_General_CP1_CS_AS",
         param : new { StdCode = standard.StandardId, optionName },
         transaction : _unitOfWork.Transaction
         );
 }
 public static string NormalizeCourseOption(StandardCollation standard, string courseOption)
 {
     if (standard.Options is null)
     {
         return(courseOption);
     }
     else
     {
         return(standard.Options.FirstOrDefault(g => g.Equals(courseOption, StringComparison.InvariantCultureIgnoreCase)) ?? courseOption);
     }
 }
        private async Task UpdateExistingStandardToRemoved(StandardCollation standard)
        {
            await _unitOfWork.Connection.ExecuteAsync(
                "UPDATE [StandardCollation] SET " +
                "IsLive = 0, " +
                "DateRemoved = GETUTCDATE() " +
                "WHERE StandardId = @standardId",
                param : new { standard.StandardId },
                transaction : _unitOfWork.Transaction
                );

            await UpsertOptions(standard, true);
        }
        public async Task <StandardCollation> GetStandard(int standardId)
        {
            StandardCollation standardCollation = null;

            try
            {
                standardCollation = await _standardRepository.GetStandardCollationByStandardId(standardId);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"STANDARD COLLATION: Failed to get for standard id: {standardId}");
            }

            return(standardCollation);
        }
        public async Task <StandardCollation> GetStandard(string referenceNumber)
        {
            StandardCollation standardCollation = null;

            try
            {
                standardCollation = await _standardRepository.GetStandardCollationByReferenceNumber(referenceNumber);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"STANDARD COLLATION: Failed to get for standard reference: {referenceNumber}");
            }

            return(standardCollation);
        }
        private async Task UpdateExistingStandard(StandardCollation standard)
        {
            await _unitOfWork.Connection.ExecuteAsync(
                "UPDATE [StandardCollation] SET " +
                // when new ReferenceNumber is null (IFA has not supplied one) retain the current ReferenceNumber
                "ReferenceNumber = CASE WHEN @referenceNumber IS NOT NULL THEN @referenceNumber ELSE ReferenceNumber END, " +
                "Title = @title, " +
                "StandardData = @StandardData, " +
                "DateUpdated = GETUTCDATE(), " +
                "DateRemoved = NULL, " +
                "IsLive = 1 " +
                "WHERE StandardId = @standardId",
                param : new { standard.StandardId, standard.ReferenceNumber, standard.Title, standard.StandardData },
                transaction : _unitOfWork.Transaction
                );

            await UpsertOptions(standard);
        }
        public void Arrange()
        {
            _mediator  = new Mock <IMediator>();
            _logger    = new Mock <ILogger <RegisterQueryController> >();
            _standard1 = new StandardCollation {
                StandardId = 1, Title = "Test 9"
            };
            _standard2 = new StandardCollation {
                StandardId = 1, Title = "Test 2"
            };
            _expectedStandards = new List <StandardCollation>
            {
                _standard1,
                _standard2
            };

            _mediator.Setup(m =>
                            m.Send(It.IsAny <SearchStandardsRequest>(),
                                   new CancellationToken())).ReturnsAsync(_expectedStandards);
            _queryController = new RegisterQueryController(_mediator.Object, _logger.Object);
            _result          = _queryController.SearchStandards(_searchTerm).Result;
        }
        public async Task UpdateStandardCollationToInsertStandard(int standardId, string referenceNumber, string title, string standardData, string optionName)
        {
            var _lastestStandardCollations = Clone(_existingStandardCollations);
            var newStandard = new StandardCollation
            {
                StandardId      = standardId,
                ReferenceNumber = referenceNumber,
                Title           = title,
                StandardData    = JsonConvert.DeserializeObject <StandardData>(standardData),
                Options         = new List <string>
                {
                    optionName
                }
            };

            _lastestStandardCollations.Add(newStandard);

            var result = await _repository.UpsertApprovedStandards(_lastestStandardCollations);

            var insertedStandard = await _repository.GetStandardCollationByStandardId(standardId);

            Assert.AreEqual(newStandard.StandardId, insertedStandard.StandardId);
        }
        private async Task <Certificate> GetCertificate(GetBatchLearnerRequest request, StandardCollation standard)
        {
            Certificate certificate = null;

            if (standard != null && request.IncludeCertificate)
            {
                var certificateRequest = new GetBatchCertificateRequest
                {
                    Uln               = request.Uln,
                    FamilyName        = request.FamilyName,
                    StandardCode      = standard.StandardId.GetValueOrDefault(),
                    StandardReference = standard.ReferenceNumber,
                    UkPrn             = request.UkPrn
                };

                certificate = await _mediator.Send(certificateRequest);
            }

            return(certificate);
        }
        private async Task <LearnerDetailForExternalApi> GetLearnerDetails(GetBatchLearnerRequest request, StandardCollation standard)
        {
            LearnerDetailForExternalApi learnerDetail = null;

            if (standard != null)
            {
                var learner = await _ilrRepository.Get(request.Uln, standard.StandardId.GetValueOrDefault());

                if (learner != null)
                {
                    var epao = await _organisationRepository.GetByUkPrn(learner.UkPrn);

                    learnerDetail = new LearnerDetailForExternalApi()
                    {
                        Uln                            = learner.Uln,
                        GivenNames                     = learner.GivenNames,
                        FamilyName                     = learner.FamilyName,
                        LearnerStartDate               = learner.LearnStartDate,
                        LearnerReferenceNumber         = learner.LearnRefNumber,
                        PlannedEndDate                 = learner.PlannedEndDate,
                        CompletionStatus               = learner.CompletionStatus,
                        Standard                       = standard,
                        EndPointAssessorOrganisationId = epao?.EndPointAssessorOrganisationId ?? learner.EpaOrgId,
                        UkPrn                          = epao?.EndPointAssessorUkprn ?? learner.UkPrn,
                        OrganisationName               = epao?.EndPointAssessorName ?? "Unknown"
                    };
                }
                else
                {
                    _logger.LogError($"Could not find learner for ULN {request.Uln} and StandardCode {standard.StandardId.GetValueOrDefault()}");
                }
            }

            return(learnerDetail);
        }
예제 #17
0
        private CertificateData CombineCertificateData(CertificateData data, Ilr ilr, StandardCollation standard, Provider provider)
        {
            var epaDetails = data.EpaDetails ?? new EpaDetails();

            if (epaDetails.Epas is null)
            {
                epaDetails.Epas = new List <EpaRecord>();
            }

            var epaOutcome = data.OverallGrade == CertificateGrade.Fail ? EpaOutcome.Fail : EpaOutcome.Pass;

            if (data.AchievementDate != null && !epaDetails.Epas.Any(rec => rec.EpaDate == data.AchievementDate.Value && rec.EpaOutcome == epaOutcome))
            {
                var record = new EpaRecord {
                    EpaDate = data.AchievementDate.Value, EpaOutcome = epaOutcome
                };
                epaDetails.Epas.Add(record);

                var latestRecord = epaDetails.Epas.OrderByDescending(epa => epa.EpaDate).First();
                epaDetails.LatestEpaDate    = latestRecord.EpaDate;
                epaDetails.LatestEpaOutcome = latestRecord.EpaOutcome;
            }

            return(new CertificateData()
            {
                LearnerGivenNames = ilr.GivenNames,
                LearnerFamilyName = ilr.FamilyName,
                LearningStartDate = ilr.LearnStartDate,
                StandardReference = standard.ReferenceNumber,
                StandardName = standard.Title,
                StandardLevel = standard.StandardData.Level.GetValueOrDefault(),
                StandardPublicationDate = standard.StandardData.EffectiveFrom,
                FullName = $"{ilr.GivenNames} {ilr.FamilyName}",
                ProviderName = provider.ProviderName,

                ContactName = data.ContactName,
                ContactOrganisation = data.ContactOrganisation,
                Department = data.Department,
                ContactAddLine1 = data.ContactAddLine1,
                ContactAddLine2 = data.ContactAddLine2,
                ContactAddLine3 = data.ContactAddLine3,
                ContactAddLine4 = data.ContactAddLine4,
                ContactPostCode = data.ContactPostCode,
                Registration = data.Registration,
                AchievementDate = data.AchievementDate,
                CourseOption = CertificateHelpers.NormalizeCourseOption(standard, data.CourseOption),
                OverallGrade = CertificateHelpers.NormalizeOverallGrade(data.OverallGrade),

                EpaDetails = epaDetails
            });
        }
        private CertificateData CombineCertificateData(CertificateData certData, CertificateData requestData, StandardCollation standard)
        {
            var epaDetails = certData.EpaDetails ?? new EpaDetails();

            if (epaDetails.Epas is null)
            {
                epaDetails.Epas = new List <EpaRecord>();
            }

            var epaOutcome = certData.OverallGrade == CertificateGrade.Fail ? EpaOutcome.Fail : EpaOutcome.Pass;

            if (requestData.AchievementDate != null && !epaDetails.Epas.Any(rec => rec.EpaDate == requestData.AchievementDate.Value && rec.EpaOutcome == epaOutcome))
            {
                var record = new EpaRecord {
                    EpaDate = requestData.AchievementDate.Value, EpaOutcome = epaOutcome
                };
                epaDetails.Epas.Add(record);

                // sort pass outcomes before fail outcomes as pass is the final state even if earlier than the fail
                var latestRecord = epaDetails.Epas
                                   .OrderByDescending(epa => epa.EpaOutcome != EpaOutcome.Fail ? 1 : 0)
                                   .ThenByDescending(epa => epa.EpaDate)
                                   .First();

                epaDetails.LatestEpaDate    = latestRecord.EpaDate;
                epaDetails.LatestEpaOutcome = latestRecord.EpaOutcome;
            }

            return(new CertificateData()
            {
                LearnerGivenNames = certData.LearnerGivenNames,
                LearnerFamilyName = certData.LearnerFamilyName,
                LearningStartDate = certData.LearningStartDate,
                StandardReference = certData.StandardReference,
                StandardName = certData.StandardName,
                StandardLevel = certData.StandardLevel,
                StandardPublicationDate = certData.StandardPublicationDate,
                FullName = certData.FullName,
                ProviderName = certData.ProviderName,

                ContactName = requestData.ContactName,
                ContactOrganisation = requestData.ContactOrganisation,
                Department = requestData.Department,
                ContactAddLine1 = requestData.ContactAddLine1,
                ContactAddLine2 = requestData.ContactAddLine2,
                ContactAddLine3 = requestData.ContactAddLine3,
                ContactAddLine4 = requestData.ContactAddLine4,
                ContactPostCode = requestData.ContactPostCode,
                Registration = requestData.Registration,
                AchievementDate = requestData.AchievementDate,
                CourseOption = CertificateHelpers.NormalizeCourseOption(standard, requestData.CourseOption),
                OverallGrade = CertificateHelpers.NormalizeOverallGrade(requestData.OverallGrade),

                EpaDetails = epaDetails
            });
        }