public override void Given()
        {
            CreateMapper();
            ProviderUkprn = 987654321;
            ProfileId     = 1;

            _expectedApiResult = new LearnerRecordDetails {
                ProfileId = ProfileId, Uln = 1234567890, Name = "Test User", IsLearnerRecordAdded = true, HasLrsEnglishAndMaths = false, IsEnglishAndMathsAchieved = true, IsSendLearner = false
            };
            ViewModel = new UpdateEnglishAndMathsQuestionViewModel {
                ProfileId = ProfileId, EnglishAndMathsStatus = EnglishAndMathsStatus.AchievedWithSend
            };

            InternalApiClient.GetLearnerRecordDetailsAsync(ProviderUkprn, ProfileId).Returns(_expectedApiResult);
            InternalApiClient.UpdateLearnerRecordAsync(Arg.Is <UpdateLearnerRecordRequest>
                                                           (x => x.ProfileId == ViewModel.ProfileId &&
                                                           x.Ukprn == ProviderUkprn &&
                                                           x.Uln == _expectedApiResult.Uln &&
                                                           x.EnglishAndMathsStatus == ViewModel.EnglishAndMathsStatus &&
                                                           x.PerformedBy == $"{Givenname} {Surname}"))
            .Returns(false);

            Loader = new TrainingProviderLoader(InternalApiClient, Mapper);
        }
 public async override Task When()
 {
     _actualResult = await _apiClient.GetLearnerRecordDetailsAsync(_providerUkprn, _profileId, _pathwayId);
 }
        private static TqRegistrationProfile ProcessProfileAndQualificationsAchieved(LearnerRecordDetails learnerRecord, TqRegistrationProfile profile)
        {
            if (learnerRecord.IsLearnerVerified == false && learnerRecord.IsLearnerVerified == profile.IsLearnerVerified)
            {
                return(null);
            }

            var isProfileChanged      = false;
            var learnerLearningEvents = learnerRecord.LearningEventDetails.Where(x => x.IsQualificationAllowed);

            if (learnerRecord.IsLearnerVerified != profile.IsLearnerVerified)
            {
                profile.IsLearnerVerified = learnerRecord.IsLearnerVerified;
                profile.ModifiedOn        = DateTime.UtcNow;
                profile.ModifiedBy        = learnerRecord.PerformedBy;
                isProfileChanged          = true;
            }

            if (!profile.IsEnglishAndMathsAchieved.HasValue || !profile.IsEnglishAndMathsAchieved.Value)
            {
                if (learnerLearningEvents.Any())
                {
                    var isQualificationAchievedChanged = false;

                    foreach (var learnerLearningEvent in learnerLearningEvents)
                    {
                        var existingQualificationAchieved = profile.QualificationAchieved.FirstOrDefault(q => q.QualificationId == learnerLearningEvent.QualificationId);

                        if (existingQualificationAchieved != null)
                        {
                            if (existingQualificationAchieved.QualificationGradeId != learnerLearningEvent.QualificationGradeId || existingQualificationAchieved.IsAchieved != learnerLearningEvent.IsAchieved)
                            {
                                existingQualificationAchieved.QualificationGradeId = learnerLearningEvent.QualificationGradeId;
                                existingQualificationAchieved.IsAchieved           = learnerLearningEvent.IsAchieved;
                                existingQualificationAchieved.ModifiedBy           = learnerRecord.PerformedBy;
                                existingQualificationAchieved.ModifiedOn           = DateTime.UtcNow;
                                isQualificationAchievedChanged = true;
                            }
                        }
                        else
                        {
                            profile.QualificationAchieved.Add(new QualificationAchieved
                            {
                                TqRegistrationProfileId = profile.Id,
                                QualificationId         = learnerLearningEvent.QualificationId,
                                QualificationGradeId    = learnerLearningEvent.QualificationGradeId,
                                IsAchieved = learnerLearningEvent.IsAchieved,
                                CreatedBy  = learnerRecord.PerformedBy
                            });
                            isQualificationAchievedChanged = true;
                        }
                    }

                    if (isQualificationAchievedChanged)
                    {
                        profile.IsEnglishAndMathsAchieved = learnerLearningEvents.Any(e => e.IsAchieved && e.IsEnglishSubject) && learnerLearningEvents.Any(e => e.IsAchieved && e.IsMathsSubject);
                        profile.IsRcFeed   = false;
                        profile.ModifiedOn = DateTime.UtcNow;
                        profile.ModifiedBy = learnerRecord.PerformedBy;
                        isProfileChanged   = true;
                    }
                }
            }

            return(isProfileChanged ? profile : null);
        }
        private static void ProcessLearningEvents(List <Qualification> qualifications, LearnerRecordDetails learnerRecord)
        {
            if (learnerRecord.IsLearnerVerified == false)
            {
                return;
            }

            foreach (var learnerEvent in learnerRecord.LearningEventDetails)
            {
                var qualification      = qualifications.FirstOrDefault(q => q.IsActive && q.Code.Equals(learnerEvent.QualificationCode, StringComparison.InvariantCultureIgnoreCase));
                var qualificationGrade = qualification?.QualificationType?.QualificationGrades?.FirstOrDefault(g => g.IsActive && g.Grade.Equals(learnerEvent.Grade, StringComparison.InvariantCultureIgnoreCase));

                if (qualification != null && qualificationGrade != null)
                {
                    learnerEvent.IsQualificationAllowed = true;
                    learnerEvent.IsAchieved             = qualificationGrade.IsAllowable;
                    learnerEvent.QualificationGradeId   = qualificationGrade.Id;
                    learnerEvent.QualificationId        = qualification.Id;
                    learnerEvent.IsEnglishSubject       = qualification.TlLookup?.Code.Equals("Eng", StringComparison.InvariantCultureIgnoreCase) ?? false;
                    learnerEvent.IsMathsSubject         = qualification.TlLookup?.Code.Equals("Math", StringComparison.InvariantCultureIgnoreCase) ?? false;
                }
            }
        }