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); }
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); }
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()); }