Exemplo n.º 1
0
        private OverlappingApprenticeship MapFrom(ApprenticeshipResult source)
        {
            var result = new OverlappingApprenticeship
            {
                Apprenticeship = new Api.Types.Apprenticeship.Apprenticeship
                {
                    Id                = source.Id,
                    CommitmentId      = source.CommitmentId,
                    StartDate         = source.StartDate,
                    EndDate           = source.EndDate,
                    ULN               = source.Uln,
                    EmployerAccountId = source.EmployerAccountId,
                    ProviderId        = source.ProviderId,
                    TrainingType      = (Api.Types.Apprenticeship.Types.TrainingType)source.TrainingType,
                    TrainingCode      = source.TrainingCode,
                    TrainingName      = source.TrainingName,
                    Cost              = source.Cost,
                    PaymentStatus     = (Api.Types.Apprenticeship.Types.PaymentStatus)source.PaymentStatus,
                    AgreementStatus   = (Api.Types.AgreementStatus)source.AgreementStatus,
                    DateOfBirth       = source.DateOfBirth,
                    EmployerRef       = source.EmployerRef,
                    ProviderRef       = source.ProviderRef,
                    FirstName         = source.FirstName,
                    LastName          = source.LastName
                },
                RequestApprenticeshipId = source.RequestApprenticeshipId,
                EmployerAccountId       = source.EmployerAccountId,
                LegalEntityName         = source.LegalEntityName,
                ProviderId           = source.ProviderId,
                ProviderName         = source.ProviderName,
                ValidationFailReason = (ValidationFailReason)source.ValidationFailReason,
            };

            return(result);
        }
        protected void SetupSuccessfulOverlapCheck()
        {
            var apprenticeship       = Commitment.Apprenticeships.First();
            var apprenticeshipResult = new ApprenticeshipResult {
                Uln = apprenticeship.ULN
            };

            ApprenticeshipRepository.Setup(x => x.GetActiveApprenticeshipsByUlns(It.IsAny <IEnumerable <string> >())).ReturnsAsync(new List <ApprenticeshipResult> {
                apprenticeshipResult
            });
            OverlapRules.Setup(x => x.DetermineOverlap(It.Is <ApprenticeshipOverlapValidationRequest>(r => r.Uln == apprenticeship.ULN && r.ApprenticeshipId == apprenticeship.Id && r.StartDate == apprenticeship.StartDate.Value && r.EndDate == apprenticeship.EndDate.Value), apprenticeshipResult)).Returns(ValidationFailReason.None);
        }
        /// <summary>
        /// Calculates what date should be used as the overlap end date for an apprenticeship when validating start date / end date overlaps.
        /// </summary>
        private DateTime CalculateOverlapApprenticeshipEndDate(ApprenticeshipResult apprenticeship)
        {
            switch (apprenticeship.PaymentStatus)
            {
            case PaymentStatus.Withdrawn:
                return(apprenticeship.StopDate.Value);

            case PaymentStatus.Completed:
                if (apprenticeship.CompletionDate.Value <= apprenticeship.EndDate)
                {
                    return(apprenticeship.CompletionDate.Value);
                }
                return(apprenticeship.EndDate);

            default:
                return(apprenticeship.EndDate);
            }
        }
        public ValidationFailReason DetermineOverlap(ApprenticeshipOverlapValidationRequest request, ApprenticeshipResult apprenticeship)
        {
            if (!request.Uln.Equals(apprenticeship.Uln, StringComparison.InvariantCultureIgnoreCase))
            {
                return(ValidationFailReason.None);
            }

            if (request.ApprenticeshipId.HasValue && request.ApprenticeshipId.Value == apprenticeship.Id)
            {
                return(ValidationFailReason.None);
            }

            //Get the appropriate dates for the apprenticeship
            var apprenticeshipStartDate = apprenticeship.StartDate;
            var apprenticeshipEndDate   = apprenticeship.PaymentStatus == PaymentStatus.Withdrawn
                ? apprenticeship.StopDate.Value
                : apprenticeship.EndDate;

            //Stopped before or on start date (effectively deleted) should be ignored
            if (apprenticeship.PaymentStatus == PaymentStatus.Withdrawn &&
                apprenticeshipStartDate.Date.Equals(apprenticeship.StopDate.Value.Date))
            {
                return(ValidationFailReason.None);
            }

            var overlapsStart = IsApprenticeshipDateBetween(request.StartDate, apprenticeshipStartDate, apprenticeshipEndDate);
            var overlapsEnd   = IsApprenticeshipDateBetween(request.EndDate, apprenticeshipStartDate, apprenticeshipEndDate);

            //Contained
            if (overlapsStart && overlapsEnd)
            {
                return(ValidationFailReason.DateWithin);
            }

            //Overlap start date
            if (overlapsStart)
            {
                return(ValidationFailReason.OverlappingStartDate);
            }

            //Overlap end date
            if (overlapsEnd)
            {
                return(ValidationFailReason.OverlappingEndDate);
            }

            //Straddle
            if (IsApprenticeshipDateStraddle(request.StartDate, request.EndDate, apprenticeshipStartDate, apprenticeshipEndDate))
            {
                return(ValidationFailReason.DateEmbrace);
            }

            return(ValidationFailReason.None);
        }