Change getHours method to getDuration.
Instead of returning a number of hours return a EffortDuration. FEA: ItEr60S19TimeUnitDataType
This commit is contained in:
parent
399a2edcd3
commit
6df2e3b75b
7 changed files with 73 additions and 49 deletions
|
|
@ -21,6 +21,7 @@
|
|||
package org.navalplanner.business.calendars.entities;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.EnumMap;
|
||||
|
|
@ -51,7 +52,7 @@ import org.navalplanner.business.workingday.ResourcesPerDay;
|
|||
*/
|
||||
public class BaseCalendar extends IntegrationEntity implements IWorkHours {
|
||||
|
||||
private static final Integer DEFAULT_VALUE = 0;
|
||||
private static final EffortDuration DEFAULT_VALUE = EffortDuration.zero();
|
||||
|
||||
public static BaseCalendar create() {
|
||||
return create(new BaseCalendar(CalendarData.create()));
|
||||
|
|
@ -299,39 +300,39 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours {
|
|||
* calendar restrictions.
|
||||
*/
|
||||
public Integer getCapacityAt(LocalDate date) {
|
||||
return getWorkableHours(date);
|
||||
return roundToHours(getWorkableHours(date));
|
||||
}
|
||||
|
||||
private Integer getWorkableHours(LocalDate date) {
|
||||
private EffortDuration getWorkableHours(LocalDate date) {
|
||||
if (!isActive(date)) {
|
||||
return 0;
|
||||
return EffortDuration.zero();
|
||||
}
|
||||
CalendarException exceptionDay = getExceptionDay(date);
|
||||
if (exceptionDay != null) {
|
||||
return exceptionDay.getHours();
|
||||
return exceptionDay.getDuration();
|
||||
}
|
||||
|
||||
switch (date.getDayOfWeek()) {
|
||||
case DateTimeConstants.MONDAY:
|
||||
return getHours(date, Days.MONDAY);
|
||||
return getDurationAt(date, Days.MONDAY);
|
||||
|
||||
case DateTimeConstants.TUESDAY:
|
||||
return getHours(date, Days.TUESDAY);
|
||||
return getDurationAt(date, Days.TUESDAY);
|
||||
|
||||
case DateTimeConstants.WEDNESDAY:
|
||||
return getHours(date, Days.WEDNESDAY);
|
||||
return getDurationAt(date, Days.WEDNESDAY);
|
||||
|
||||
case DateTimeConstants.THURSDAY:
|
||||
return getHours(date, Days.THURSDAY);
|
||||
return getDurationAt(date, Days.THURSDAY);
|
||||
|
||||
case DateTimeConstants.FRIDAY:
|
||||
return getHours(date, Days.FRIDAY);
|
||||
return getDurationAt(date, Days.FRIDAY);
|
||||
|
||||
case DateTimeConstants.SATURDAY:
|
||||
return getHours(date, Days.SATURDAY);
|
||||
return getDurationAt(date, Days.SATURDAY);
|
||||
|
||||
case DateTimeConstants.SUNDAY:
|
||||
return getHours(date, Days.SUNDAY);
|
||||
return getDurationAt(date, Days.SUNDAY);
|
||||
|
||||
default:
|
||||
throw new RuntimeException("Day of week out of range!");
|
||||
|
|
@ -346,27 +347,27 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours {
|
|||
return true;
|
||||
}
|
||||
|
||||
public Integer getHours(Date date, Days day) {
|
||||
return getHours(new LocalDate(date), day);
|
||||
public EffortDuration getDurationAt(Date date, Days day) {
|
||||
return getDurationAt(new LocalDate(date), day);
|
||||
}
|
||||
|
||||
public Integer getHours(LocalDate date, Days day) {
|
||||
public EffortDuration getDurationAt(LocalDate date, Days day) {
|
||||
CalendarData calendarData = getCalendarData(date);
|
||||
|
||||
Integer hours = calendarData.getHours(day);
|
||||
EffortDuration duration = calendarData.getDurationAt(day);
|
||||
BaseCalendar parent = getParent(date);
|
||||
if ((hours == null) && (parent != null)) {
|
||||
return parent.getHours(date, day);
|
||||
if (duration == null && parent != null) {
|
||||
return parent.getDurationAt(date, day);
|
||||
}
|
||||
|
||||
return valueIfNotNullElseDefaultValue(hours);
|
||||
return valueIfNotNullElseDefaultValue(duration);
|
||||
}
|
||||
|
||||
private Integer valueIfNotNullElseDefaultValue(Integer hours) {
|
||||
if (hours == null) {
|
||||
private EffortDuration valueIfNotNullElseDefaultValue(
|
||||
EffortDuration duration) {
|
||||
if (duration == null) {
|
||||
return DEFAULT_VALUE;
|
||||
}
|
||||
return hours;
|
||||
return duration;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -907,30 +908,29 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours {
|
|||
|
||||
@Override
|
||||
public Integer toHours(LocalDate day, ResourcesPerDay resourcesPerDay) {
|
||||
final Integer workableHours = getWorkableHours(day);
|
||||
return limitOverAssignability(day,
|
||||
roundToHours(resourcesPerDay
|
||||
.asDurationGivenWorkingDayOf(EffortDuration
|
||||
.hours(workableHours))),
|
||||
workableHours);
|
||||
final EffortDuration workableHours = getWorkableHours(day);
|
||||
return roundToHours(limitOverAssignability(day,
|
||||
resourcesPerDay.asDurationGivenWorkingDayOf(workableHours),
|
||||
workableHours));
|
||||
}
|
||||
|
||||
private Integer limitOverAssignability(LocalDate day,
|
||||
int hoursInitiallyCalculated, int workableHoursAtDay) {
|
||||
private EffortDuration limitOverAssignability(LocalDate day,
|
||||
EffortDuration effortInitiallyCalculated,
|
||||
EffortDuration workableHoursAtDay) {
|
||||
boolean overAssignable = isOverAssignable(day);
|
||||
if (overAssignable) {
|
||||
return hoursInitiallyCalculated;
|
||||
return effortInitiallyCalculated;
|
||||
} else {
|
||||
return Math.min(hoursInitiallyCalculated,
|
||||
multiplyByCapacity(workableHoursAtDay));
|
||||
return Collections.min(Arrays.asList(effortInitiallyCalculated,
|
||||
multiplyByCapacity(workableHoursAtDay)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is intended to be overriden
|
||||
*/
|
||||
protected int multiplyByCapacity(Integer workableHours) {
|
||||
return workableHours;
|
||||
protected EffortDuration multiplyByCapacity(EffortDuration duration) {
|
||||
return duration;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -109,6 +109,10 @@ public class CalendarData extends IntegrationEntity {
|
|||
return getHoursForDay(day);
|
||||
}
|
||||
|
||||
public EffortDuration getDurationAt(Days day) {
|
||||
return effortPerDay.get(day.ordinal());
|
||||
}
|
||||
|
||||
public void setHours(Days day, Integer hours)
|
||||
throws IllegalArgumentException {
|
||||
setHoursForDay(day, hours);
|
||||
|
|
|
|||
|
|
@ -103,6 +103,10 @@ public class CalendarException extends IntegrationEntity {
|
|||
return duration != null ? duration.getHours() : 0;
|
||||
}
|
||||
|
||||
public EffortDuration getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public CalendarExceptionType getType() {
|
||||
return type;
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import org.hibernate.validator.AssertTrue;
|
|||
import org.hibernate.validator.NotNull;
|
||||
import org.joda.time.LocalDate;
|
||||
import org.navalplanner.business.resources.entities.Resource;
|
||||
import org.navalplanner.business.workingday.EffortDuration;
|
||||
|
||||
/**
|
||||
* Calendar for a {@link Resource}.
|
||||
|
|
@ -81,14 +82,24 @@ public class ResourceCalendar extends BaseCalendar {
|
|||
return multiplyByCapacity(super.getCapacityAt(date));
|
||||
}
|
||||
|
||||
protected int multiplyByCapacity(Integer workableHours) {
|
||||
if (workableHours == null) {
|
||||
protected Integer multiplyByCapacity(Integer duration) {
|
||||
if (duration == null) {
|
||||
return 0;
|
||||
}
|
||||
if (capacity == null) {
|
||||
return workableHours;
|
||||
return duration;
|
||||
}
|
||||
return capacity * workableHours;
|
||||
return duration * capacity;
|
||||
}
|
||||
|
||||
protected EffortDuration multiplyByCapacity(EffortDuration duration) {
|
||||
if (duration == null) {
|
||||
return EffortDuration.zero();
|
||||
}
|
||||
if (capacity == null) {
|
||||
return duration;
|
||||
}
|
||||
return duration.multiplyBy(capacity);
|
||||
}
|
||||
|
||||
@AssertTrue(message = "Capacity must be a positive integer number")
|
||||
|
|
|
|||
|
|
@ -129,4 +129,8 @@ public class EffortDuration implements Comparable<EffortDuration> {
|
|||
return seconds - other.seconds;
|
||||
}
|
||||
|
||||
public EffortDuration multiplyBy(int integer) {
|
||||
return EffortDuration.seconds(this.seconds * integer);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,13 +33,13 @@ import org.joda.time.LocalDate;
|
|||
import org.navalplanner.business.calendars.daos.IBaseCalendarDAO;
|
||||
import org.navalplanner.business.calendars.daos.ICalendarExceptionTypeDAO;
|
||||
import org.navalplanner.business.calendars.entities.BaseCalendar;
|
||||
import org.navalplanner.business.calendars.entities.BaseCalendar.DayType;
|
||||
import org.navalplanner.business.calendars.entities.CalendarAvailability;
|
||||
import org.navalplanner.business.calendars.entities.CalendarData;
|
||||
import org.navalplanner.business.calendars.entities.CalendarData.Days;
|
||||
import org.navalplanner.business.calendars.entities.CalendarException;
|
||||
import org.navalplanner.business.calendars.entities.CalendarExceptionType;
|
||||
import org.navalplanner.business.calendars.entities.ResourceCalendar;
|
||||
import org.navalplanner.business.calendars.entities.BaseCalendar.DayType;
|
||||
import org.navalplanner.business.calendars.entities.CalendarData.Days;
|
||||
import org.navalplanner.business.common.daos.IConfigurationDAO;
|
||||
import org.navalplanner.business.common.entities.Configuration;
|
||||
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
|
||||
|
|
@ -275,8 +275,8 @@ public class BaseCalendarModel implements IBaseCalendarModel {
|
|||
if (getBaseCalendar() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getBaseCalendar().getHours(selectedDate, day);
|
||||
return BaseCalendar.roundToHours(getBaseCalendar().getDurationAt(
|
||||
selectedDate, day));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.equalTo;
|
|||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE;
|
||||
import static org.navalplanner.business.workingday.EffortDuration.hours;
|
||||
import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE;
|
||||
import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE;
|
||||
import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE;
|
||||
|
|
@ -76,7 +77,8 @@ public class BaseCalendarModelTest {
|
|||
assertThat(baseCalendarModel.getBaseCalendars().get(previous)
|
||||
.getId(), equalTo(baseCalendar.getId()));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous)
|
||||
.getHours(new Date(), Days.MONDAY), equalTo(8));
|
||||
.getDurationAt(new Date(), Days.MONDAY),
|
||||
equalTo(hours(8)));
|
||||
} catch (ValidationException e) {
|
||||
fail("It should not throw an exception");
|
||||
}
|
||||
|
|
@ -108,8 +110,8 @@ public class BaseCalendarModelTest {
|
|||
equalTo(previous + 1));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous).getId(),
|
||||
equalTo(baseCalendar.getId()));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous).getHours(
|
||||
new Date(), Days.MONDAY), equalTo(4));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous)
|
||||
.getDurationAt(new Date(), Days.MONDAY), equalTo(hours(4)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -130,8 +132,7 @@ public class BaseCalendarModelTest {
|
|||
assertThat(baseCalendarModel.getBaseCalendars().size(),
|
||||
equalTo(previous + 1));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous)
|
||||
.getHours(
|
||||
date, Days.MONDAY), equalTo(4));
|
||||
.getDurationAt(date, Days.MONDAY), equalTo(hours(4)));
|
||||
assertThat(baseCalendarModel.getBaseCalendars().get(previous)
|
||||
.getCalendarDataVersions().size(), equalTo(2));
|
||||
} catch (ValidationException e) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue