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)
            {
                if (apprenticeship.ContinuationOfId.HasValue && request.StartDate < apprenticeship.PreviousApprenticeshipStopDate)
                {
                    return(ValidationFailReason.OverlappingStartDate);
                }

                return(ValidationFailReason.None);
            }

            //Get the appropriate dates for the apprenticeship
            var apprenticeshipStartDate = apprenticeship.StartDate;
            var apprenticeshipEndDate   = CalculateOverlapApprenticeshipEndDate(apprenticeship);

            //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);
        }
Exemple #2
0
        internal async Task <bool> CommitmentHasOverlappingApprenticeships(Commitment commitment)
        {
            var potentiallyOverlappingApprenticeships = await GetPotentiallyOverlappingApprenticeships(commitment);

            foreach (var potentiallyOverlappingApprenticeship in potentiallyOverlappingApprenticeships)
            {
                foreach (var commitmentApprenticeship in commitment.Apprenticeships.Where(x => x.ULN == potentiallyOverlappingApprenticeship.Uln))
                {
                    var overlapRequest = new ApprenticeshipOverlapValidationRequest {
                        ApprenticeshipId = commitmentApprenticeship.Id, Uln = commitmentApprenticeship.ULN, StartDate = commitmentApprenticeship.StartDate.Value, EndDate = commitmentApprenticeship.EndDate.Value
                    };
                    var validationFailReason = _overlapRules.DetermineOverlap(overlapRequest, potentiallyOverlappingApprenticeship);

                    if (validationFailReason != ValidationFailReason.None)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemple #3
0
        public async Task <ApprenticeshipOverlapValidationResult> ValidateOverlapping(ApprenticeshipOverlapValidationRequest request)
        {
            var wrapper = new List <ApprenticeshipOverlapValidationRequest> {
                request
            };
            var url           = $"{_configuration.BaseUrl}api/validation/apprenticeships/overlapping";
            var wrappedResult = await GetValidation(url, wrapper);

            return(wrappedResult.SingleOrDefault());
        }