public async Task <Standard> GetStandardVersionById(string id, string version = null)
        {
            Standard standard = null;

            try
            {
                var standardId = new StandardId(id);

                switch (standardId.IdType)
                {
                case StandardId.StandardIdType.LarsCode:
                    standard = await _standardRepository.GetStandardVersionByLarsCode(standardId.LarsCode, version);

                    break;

                case StandardId.StandardIdType.IFateReferenceNumber:
                    standard = await _standardRepository.GetStandardVersionByIFateReferenceNumber(standardId.IFateReferenceNumber, version);

                    break;

                case StandardId.StandardIdType.StandardUId:
                    standard = await _standardRepository.GetStandardVersionByStandardUId(standardId.StandardUId);

                    break;

                default:
                    throw new ArgumentOutOfRangeException("id", "StandardId was not of type StandardUId, LarsCode or IfateReferenceNumber");
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"STANDARD VERSION: Failed to get for standard id: {id}");
            }

            return(standard);
        }
        public async Task <LearnerDetailResult> Handle(GetLearnerDetailRequest request,
                                                       CancellationToken cancellationToken)
        {
            var learner = await _learnerRepository.Get(request.Uln, request.StdCode);

            var certificate = await _certificateRepository.GetCertificate(request.Uln, request.StdCode);

            var logs            = new List <CertificateLogSummary>();
            var certificateData = new CertificateData();
            var epao            = new Organisation();

            if (certificate != null)
            {
                if (request.AllRecords)
                {
                    logs.AddRange(await _staffCertificateRepository.GetAllCertificateLogs(certificate.Id));
                }
                else
                {
                    var showSummaryStatus = new[] { CertificateStatus.Submitted }.Concat(CertificateStatus.PrintProcessStatus).ToList();
                    if (showSummaryStatus.Contains(certificate.Status))
                    {
                        logs.AddRange(await _staffCertificateRepository.GetSummaryCertificateLogs(certificate.Id));
                    }
                    else
                    {
                        var latestCertificateLog = await _staffCertificateRepository.GetLatestCertificateLog(certificate.Id);

                        if (latestCertificateLog != null)
                        {
                            logs.Add(latestCertificateLog);
                        }
                    }
                }

                if (logs.Count() > 1)
                {
                    CalculateDifferences(logs);
                }

                certificateData = JsonConvert.DeserializeObject <CertificateData>(certificate.CertificateData) ?? new CertificateData();
                epao            = await _organisationRepository.Get(certificate.OrganisationId) ?? new Organisation();
            }

            var standard = await _standardRepository.GetStandardVersionByLarsCode(request.StdCode, certificateData?.Version);

            var learnerDetail = new LearnerDetailResult()
            {
                Uln                         = request.Uln,
                FamilyName                  = !string.IsNullOrEmpty(certificateData.LearnerFamilyName) ? certificateData.LearnerFamilyName : learner?.FamilyName,
                GivenNames                  = !string.IsNullOrEmpty(certificateData.LearnerGivenNames) ? certificateData.LearnerGivenNames : learner?.GivenNames,
                LearnStartDate              = certificateData.LearningStartDate.HasValue ? certificateData.LearningStartDate : learner?.LearnStartDate,
                StandardCode                = (certificate?.StandardCode).HasValue ? certificate.StandardCode : standard?.LarsCode ?? 0,
                Standard                    = !string.IsNullOrEmpty(certificateData.StandardName) ? certificateData.StandardName : standard?.Title,
                Version                     = !string.IsNullOrEmpty(certificateData.Version) ? certificateData.Version : learner?.Version,
                Level                       = certificateData.StandardLevel > 0 ? certificateData.StandardLevel : standard?.Level ?? 0,
                CertificateReference        = certificate?.CertificateReference,
                CertificateStatus           = certificate?.Status,
                OverallGrade                = certificateData.OverallGrade,
                AchievementDate             = certificateData.AchievementDate,
                Option                      = !string.IsNullOrEmpty(certificateData.CourseOption) ? certificateData.CourseOption : learner?.CourseOption,
                OrganisationName            = epao.EndPointAssessorName,
                OrganisationId              = epao.EndPointAssessorOrganisationId,
                CertificateLogs             = logs,
                FundingModel                = learner?.FundingModel,
                CompletionStatus            = learner?.CompletionStatus,
                CompletionStatusDescription = FormatCompletionStatusDescription(learner?.CompletionStatus),
                IsPrivatelyFunded           = certificate?.IsPrivatelyFunded,
                CertificateId               = certificate?.Id,
                PrintStatusAt               = certificate?.CertificateBatchLog?.StatusAt,
                ReasonForChange             = certificate?.CertificateBatchLog?.ReasonForChange,
                CertificateSendTo           = certificateData.SendTo.ToString(),
                ContactName                 = certificateData.ContactName,
                ContactDept                 = certificateData.Department,
                ContactOrganisation         = certificateData.ContactOrganisation,
                ContactAddLine1             = certificateData.ContactAddLine1,
                ContactAddLine2             = certificateData.ContactAddLine2,
                ContactAddLine3             = certificateData.ContactAddLine3,
                ContactAddLine4             = certificateData.ContactAddLine4,
                ContactPostCode             = certificateData.ContactPostCode,
                LastUpdatedAt               = certificate?.LatestChange()
            };

            return(learnerDetail);
        }