diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java index 54181242e3..02892489a0 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java @@ -2,8 +2,10 @@ package se.su.dsv.scipro.finalseminar; import com.google.common.eventbus.EventBus; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.SubQueryExpressionImpl; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.jpa.JPAExpressions; import jakarta.inject.Inject; import jakarta.inject.Provider; import jakarta.persistence.EntityManager; @@ -543,8 +545,15 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L private BooleanExpression unfinishedSeminars(Date after, Date before) { QFinalSeminar seminar = QFinalSeminar.finalSeminar; + QFinalSeminarOpposition opposition = QFinalSeminarOpposition.finalSeminarOpposition; BooleanExpression ungradedParticipant = Expressions.anyOf( - seminar.oppositions.any().grade.isNull(), + seminar.oppositions + .any() + .id.in( + JPAExpressions.select(opposition.id) + .from(opposition) + .where(opposition.grade.isNull().and(opposition.improvementsRequestedAt.isNull())) + ), seminar.activeParticipations.any().grade.isNull(), seminar.respondents.any().grade.isNull() ); diff --git a/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImplIntegrationTest.java b/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImplIntegrationTest.java index 3cced9804a..9d86984f17 100644 --- a/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImplIntegrationTest.java +++ b/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImplIntegrationTest.java @@ -8,6 +8,7 @@ import static se.su.dsv.scipro.test.Matchers.isRight; import com.google.common.collect.Lists; import jakarta.inject.Inject; +import java.time.Duration; import java.time.LocalDate; import java.time.Month; import java.time.ZonedDateTime; @@ -30,6 +31,9 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest { @Inject private FinalSeminarService finalSeminarService; + @Inject + private FinalSeminarOppositionService finalSeminarOppositionService; + private ProjectType projectType; private FinalSeminar futureFinalSeminar; private User user; @@ -309,6 +313,43 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest { assertThat(finalSeminarService.canOppose(user, finalSeminar, otherProject), isRight(anything())); } + @Test + public void seminar_is_not_unfinished_if_opponent_has_improvements_requested() { + FinalSeminar seminar = createFinalSeminar(createProject(), -6); + FinalSeminarOpposition finalSeminarOpposition = addOpposition(seminar, null); + addOppositionReport(finalSeminarOpposition); + + Date after = Date.from(seminar.getStartDate().toInstant().minus(Duration.ofDays(1))); + Date before = Date.from(seminar.getStartDate().toInstant().plus(Duration.ofDays(1))); + + List<FinalSeminar> unfinishedSeminars = finalSeminarService.findUnfinishedSeminars( + after, + before, + new PageRequest(0, 5) + ); + + assertThat(unfinishedSeminars, hasItem(seminar)); + + finalSeminarOppositionService.requestImprovements(finalSeminarOpposition, "improvements"); + + List<FinalSeminar> afterImprovements = finalSeminarService.findUnfinishedSeminars( + after, + before, + new PageRequest(0, 5) + ); + + assertThat(afterImprovements, not(hasItem(seminar))); + } + + private static void addOppositionReport(FinalSeminarOpposition finalSeminarOpposition) { + GradingReportTemplate gradingReportTemplate = new GradingReportTemplate( + finalSeminarOpposition.getProjectType(), + LocalDate.now() + ); + OppositionReport oppositionReport = new OppositionReport(gradingReportTemplate, finalSeminarOpposition); + finalSeminarOpposition.setOppositionReport(oppositionReport); + } + private FinalSeminar createFutureFinalSeminarSomeDaysAgo(final int daysAgo) { FinalSeminar finalSeminar = initFinalSeminar(createProject(), 5); final Date dateCreated = Date.from(ZonedDateTime.now().minusDays(daysAgo).toInstant()); @@ -340,10 +381,10 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest { save(seminar); } - private void addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) { + private FinalSeminarOpposition addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) { FinalSeminarOpposition opposition = createOpposition(seminar); opposition.setGrade(grade); - save(opposition); + return save(opposition); } private OppositionReport createOppositionReport(FinalSeminarOpposition opposition) {