3147 Send the correct examination date if an author performs their required final seminar participations after uploading the final thesis.

This commit is contained in:
Andreas Svanberg 2023-10-30 14:14:30 +01:00
parent 0d95489908
commit 30984192bb

@ -9,6 +9,9 @@ import se.su.dsv.scipro.components.ConfirmationLink;
import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
import se.su.dsv.scipro.file.FileDescription;
import se.su.dsv.scipro.file.FileService;
import se.su.dsv.scipro.finalseminar.FinalSeminar;
import se.su.dsv.scipro.finalseminar.FinalSeminarParticipation;
import se.su.dsv.scipro.finalseminar.FinalSeminarService;
import se.su.dsv.scipro.finalthesis.FinalThesis;
import se.su.dsv.scipro.finalthesis.FinalThesisService;
import se.su.dsv.scipro.io.dto.ResearchAreaWithID;
@ -33,10 +36,15 @@ import se.su.dsv.scipro.util.Either;
import javax.inject.Inject;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class SendToExaminer extends GenericPanel<Project> {
@Inject
@ -55,6 +63,8 @@ public class SendToExaminer extends GenericPanel<Project> {
ReflectionService reflectionService;
@Inject
RoughDraftApprovalService roughDraftApprovalService;
@Inject
FinalSeminarService finalSeminarService;
private IModel<Boolean> needsSending;
@ -185,7 +195,7 @@ public class SendToExaminer extends GenericPanel<Project> {
GradeCalculator gradeCalculator = gradeCalculatorService.getSupervisorCalculator(project);
SupervisorGradingReport supervisorGradingReport = gradingReportService.getSupervisorGradingReport(getModelObject(), author);
GradingReport.Grade grade = gradeCalculator.getGrade(supervisorGradingReport);
LocalDate authorSubmissionDate = finalThesis.getUploadDate();
LocalDate examinationDate = getExaminationDate(author, project, finalThesis);
Either<ReportGradeError, Void> reported =
gradingService.reportGrade(
token,
@ -193,7 +203,7 @@ public class SendToExaminer extends GenericPanel<Project> {
author.getIdentifier(),
examination.id(),
grade.name(),
authorSubmissionDate);
examinationDate);
if (!reported.isRight()) {
getSession().error("Failed to send " + author.getFullName() + " for examining");
@ -209,6 +219,27 @@ public class SendToExaminer extends GenericPanel<Project> {
}
}
private LocalDate getExaminationDate(User author, Project project, FinalThesis finalThesis) {
var oppositions = finalSeminarService.findUserOpposing(project, author);
var participations = finalSeminarService.findUserParticipating(project, author);
Optional<LocalDate> seminarDate = Stream.concat(oppositions.stream(), participations.stream())
.filter(FinalSeminarParticipation::isApproved)
.map(FinalSeminarParticipation::getFinalSeminar)
.map(FinalSeminar::getDateCreated)
.max(Comparator.naturalOrder())
.map(Date::toInstant)
.map(instant -> instant.atZone(ZoneId.systemDefault()))
.map(ZonedDateTime::toLocalDate);
if (seminarDate.isPresent() && seminarDate.get().isAfter(finalThesis.getUploadDate())) {
return seminarDate.get();
}
else {
return finalThesis.getUploadDate();
}
}
private boolean sendProjectLevelComponentsToExaminer(Project project, String token, FinalThesis finalThesis) {
sendTitlesToDaisy(project, finalThesis);