Add method to limit an EffortDuration
It considers the start and end values of IntraDayDate. FEA: ItEr61S08TimeUnitConfigurablePlanning
This commit is contained in:
parent
5308dab6c3
commit
dae8be725c
2 changed files with 47 additions and 1 deletions
|
|
@ -147,7 +147,8 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
|
|||
}
|
||||
|
||||
/**
|
||||
* It's an interval of {@link IntraDayDate}
|
||||
* It's an interval of {@link IntraDayDate}. It allows to know how much
|
||||
* effort can be spent in this day.
|
||||
*/
|
||||
public static class PartialDay {
|
||||
|
||||
|
|
@ -158,6 +159,9 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
|
|||
Validate.notNull(start);
|
||||
Validate.notNull(end);
|
||||
Validate.isTrue(end.compareTo(start) >= 0);
|
||||
Validate.isTrue(start.areSameDay(end.getDate())
|
||||
|| (start.areSameDay(end.getDate().minusDays(1)) && end
|
||||
.getEffortDuration().isZero()));
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
|
|
@ -170,6 +174,28 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
|
|||
return end;
|
||||
}
|
||||
|
||||
public LocalDate getDate() {
|
||||
return start.getDate();
|
||||
}
|
||||
|
||||
public EffortDuration limitDuration(EffortDuration duration) {
|
||||
EffortDuration alreadyElapsedInDay = start.getEffortDuration();
|
||||
if (alreadyElapsedInDay.isZero()
|
||||
&& end.getEffortDuration().isZero()) {
|
||||
return duration;
|
||||
}
|
||||
if (end.getEffortDuration().isZero()) {
|
||||
if (alreadyElapsedInDay.compareTo(duration) >= 0) {
|
||||
return zero();
|
||||
}
|
||||
return duration.minus(alreadyElapsedInDay);
|
||||
} else {
|
||||
EffortDuration maximumAvailable = end.getEffortDuration()
|
||||
.minus(alreadyElapsedInDay);
|
||||
return EffortDuration.min(maximumAvailable, duration);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Arrays.toString(new Object[] { start, end });
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ import static org.junit.Assert.assertEquals;
|
|||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.navalplanner.business.workingday.EffortDuration.hours;
|
||||
import static org.navalplanner.business.workingday.EffortDuration.minutes;
|
||||
import static org.navalplanner.business.workingday.EffortDuration.zero;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -151,6 +153,24 @@ public class IntraDayDateTest {
|
|||
anotherEnd));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void aPartialDayCanLimitAnEffortDuration() {
|
||||
PartialDay day = new PartialDay(IntraDayDate.create(today,
|
||||
halfHour), IntraDayDate.create(today, oneHour));
|
||||
assertThat(day.limitDuration(hours(10)), equalTo(minutes(30)));
|
||||
assertThat(day.limitDuration(minutes(20)), equalTo(minutes(20)));
|
||||
PartialDay completeDay = new PartialDay(IntraDayDate.startOfDay(today),
|
||||
IntraDayDate.startOfDay(tomorrow));
|
||||
assertThat(completeDay.limitDuration(hours(10)), equalTo(hours(10)));
|
||||
PartialDay startsInTheMiddle = new PartialDay(IntraDayDate.create(
|
||||
today, EffortDuration.hours(3)),
|
||||
IntraDayDate.startOfDay(tomorrow));
|
||||
assertThat(startsInTheMiddle.limitDuration(hours(10)),
|
||||
equalTo(hours(7)));
|
||||
assertThat(startsInTheMiddle.limitDuration(hours(3)), equalTo(zero()));
|
||||
assertThat(startsInTheMiddle.limitDuration(hours(2)), equalTo(zero()));
|
||||
}
|
||||
|
||||
private Matcher<Iterable<PartialDay>> delimitedBy(
|
||||
final IntraDayDate... dates) {
|
||||
return new BaseMatcher<Iterable<PartialDay>>() {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue