use of org.hisp.dhis.tracker.report.TrackerErrorCode.E1016 in project dhis2-core by dhis2.
the class EnrollmentInExistingValidationHook method validateTeiNotEnrolledAlready.
private void validateTeiNotEnrolledAlready(ValidationErrorReporter reporter, Enrollment enrollment, Program program) {
checkNotNull(enrollment.getTrackedEntity(), TRACKED_ENTITY_INSTANCE_CANT_BE_NULL);
TrackedEntityInstance tei = getTrackedEntityInstance(reporter, enrollment.getTrackedEntity());
Set<Enrollment> payloadEnrollment = reporter.getValidationContext().getBundle().getEnrollments().stream().filter(Objects::nonNull).filter(pi -> pi.getProgram().equals(program.getUid())).filter(pi -> pi.getTrackedEntity().equals(tei.getUid()) && !pi.getEnrollment().equals(enrollment.getEnrollment())).filter(pi -> EnrollmentStatus.ACTIVE == pi.getStatus() || EnrollmentStatus.COMPLETED == pi.getStatus()).collect(Collectors.toSet());
Set<Enrollment> dbEnrollment = reporter.getValidationContext().getBundle().getPreheat().getTrackedEntityToProgramInstanceMap().getOrDefault(enrollment.getTrackedEntity(), new ArrayList<>()).stream().filter(Objects::nonNull).filter(pi -> pi.getProgram().getUid().equals(program.getUid()) && !pi.getUid().equals(enrollment.getEnrollment())).filter(pi -> ProgramStatus.ACTIVE == pi.getStatus() || ProgramStatus.COMPLETED == pi.getStatus()).distinct().map(this::getEnrollmentFromProgramInstance).collect(Collectors.toSet());
// Priority to payload
Collection<Enrollment> mergedEnrollments = Stream.of(payloadEnrollment, dbEnrollment).flatMap(Set::stream).filter(e -> !Objects.equals(e.getEnrollment(), enrollment.getEnrollment())).collect(Collectors.toMap(Enrollment::getEnrollment, p -> p, (Enrollment x, Enrollment y) -> x)).values();
if (EnrollmentStatus.ACTIVE == enrollment.getStatus()) {
Set<Enrollment> activeOnly = mergedEnrollments.stream().filter(e -> EnrollmentStatus.ACTIVE == e.getStatus()).collect(Collectors.toSet());
if (!activeOnly.isEmpty()) {
reporter.addError(enrollment, E1015, tei, program);
}
}
if (Boolean.TRUE.equals(program.getOnlyEnrollOnce()) && !mergedEnrollments.isEmpty()) {
reporter.addError(enrollment, E1016, tei, program);
}
}
Aggregations