3204 Show the remaining targets

This commit is contained in:
Andreas Svanberg 2024-01-18 10:39:11 +01:00
parent 2a0eb66b2f
commit 671cf74104
4 changed files with 35 additions and 4 deletions

@ -29,4 +29,14 @@ public interface ReviewerCapacityService {
List<TargetHistory> getTargetHistory(User reviewer, Year year);
record TargetHistory(Year year, int springTarget, int autumnTarget, int completedInSpring, int completedInAutumn) {}
/**
* Remaining targets are the set target by the administrators minus the number of assigned and completed reviews.
* @param reviewer the reviewer
* @param year year to get the remaining targets for
* @return the remaining targets for the given reviewer and year
*/
RemainingTargets getRemainingTargets(User reviewer, Year year);
record RemainingTargets(int spring, int autumn) {}
}

@ -100,7 +100,7 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
int completedInSpring = decisionRepository.countDecisions(reviewer,
startOfSpring(reviewerTarget.getYear()), endOfSpring(reviewerTarget.getYear()));
int completedInAutumn = decisionRepository.countDecisions(reviewer,
startOfAutumn(reviewerTarget.getYear()), endOfAutumn(reviewerTarget));
startOfAutumn(reviewerTarget.getYear()), endOfAutumn(reviewerTarget.getYear()));
return new TargetHistory(
Year.of(reviewerTarget.getYear()),
reviewerTarget.getSpring(),
@ -112,6 +112,14 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
.toList();
}
@Override
public RemainingTargets getRemainingTargets(User reviewer, Year year) {
Target target = getTarget(reviewer, year);
int springDecisions = decisionRepository.countDecisions(reviewer, startOfSpring(year.getValue()), endOfSpring(year.getValue()));
int autumnReviews = decisionRepository.countDecisions(reviewer, startOfAutumn(year.getValue()), endOfAutumn(year.getValue()));
return new RemainingTargets(target.spring() - springDecisions, target.autumn() - autumnReviews);
}
private Optional<ReviewerTarget> getTarget(User reviewer, LocalDate date) {
return reviewerTargetRepository.getReviewerTarget(reviewer, Year.from(date));
}
@ -182,12 +190,12 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
}
else {
return decisionRepository.countDecisions(reviewer,
startOfAutumn(fromDate.getYear()), LocalDate.of(fromDate.getYear(), Month.DECEMBER, 31));
startOfAutumn(fromDate.getYear()), endOfAutumn(fromDate.getYear()));
}
}
private static LocalDate endOfAutumn(ReviewerTarget reviewerTarget) {
return LocalDate.of(reviewerTarget.getYear(), Month.DECEMBER, 31);
private static LocalDate endOfAutumn(int year) {
return LocalDate.of(year, Month.DECEMBER, 31);
}
private static LocalDate startOfAutumn(int year) {

@ -75,11 +75,15 @@
<label class="form-label" wicket:for="springTarget">Spring</label>
<input type="number" class="form-control form-control-sm" min="0" wicket:id="springTarget">
<small class="text-muted"><span wicket:id="springHours"></span> hours</small>
<br>
<small class="text-muted">Remaining targets: <span wicket:id="remainingSpring">-3</span></small>
</div>
<div class="col-sm-6 mb-3">
<label class="form-label" wicket:for="autumnTarget">Autumn</label>
<input type="number" class="form-control form-control-sm" min="0" wicket:id="autumnTarget">
<small class="text-muted"><span wicket:id="autumnHours"></span> hours</small>
<br>
<small class="text-muted">Remaining targets: <span wicket:id="remainingAutumn">-3</span></small>
</div>
<div class="col mb-3">
<label class="form-label" wicket:for="note">Note</label>

@ -21,6 +21,7 @@ import se.su.dsv.scipro.data.DetachableServiceModel;
import se.su.dsv.scipro.profile.UserLabel;
import se.su.dsv.scipro.profile.UserProfileImage;
import se.su.dsv.scipro.reviewing.ReviewerCapacityService;
import se.su.dsv.scipro.reviewing.ReviewerCapacityService.RemainingTargets;
import se.su.dsv.scipro.reviewing.ReviewerCapacityService.Target;
import se.su.dsv.scipro.reviewing.ReviewerCapacityService.TargetHistory;
import se.su.dsv.scipro.springdata.services.UnitService;
@ -194,6 +195,14 @@ public class AdminReviewerCapacityManagementPage extends AbstractAdminProjectPag
autumnTargetField.add(AjaxFormComponentUpdatingBehavior.onUpdate("change", target -> target.add(autumnHours)));
add(autumnTargetField);
IModel<RemainingTargets> remainingTargets = LoadableDetachableModel.of(() ->
reviewerCapacityService.getRemainingTargets(
reviewer.getObject(),
selectedPeriod.getObject()));
add(new Label("remainingSpring", remainingTargets.map(RemainingTargets::spring)));
add(new Label("remainingAutumn", remainingTargets.map(RemainingTargets::autumn)));
note = LoadableDetachableModel.of(() ->
reviewerCapacityService.getTarget(reviewer.getObject(), selectedPeriod.getObject()).note());
TextArea<String> noteField = new TextArea<>("note", note);