Use EffortDuration to compute time instead of using raw hours.

FEA: ItEr75S27PerProjectDashboard
This commit is contained in:
Nacho Barrientos 2011-11-02 17:18:31 +01:00 committed by Manuel Rego Casasnovas
parent b1f2c89589
commit 5c2be621fe
7 changed files with 40 additions and 30 deletions

View file

@ -22,8 +22,6 @@
package org.libreplan.business.planner.entities;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
@ -33,6 +31,7 @@ import org.apache.commons.lang.Validate;
import org.joda.time.LocalDate;
import org.libreplan.business.planner.entities.DayAssignment;
import org.libreplan.business.workingday.EffortDuration;
/**
* Computes aggregate values on a set{@link DayAssignment}.
@ -67,10 +66,10 @@ public class AggregateOfDayAssignments {
assignments);
}
public int getTotalHours() {
int sum = 0;
public EffortDuration getTotalTime() {
EffortDuration sum = EffortDuration.zero();
for (DayAssignment dayAssignment : dayAssignments) {
sum += dayAssignment.getDuration().getHours();
sum = EffortDuration.sum(sum, dayAssignment.getDuration());
}
return sum;
}

View file

@ -29,6 +29,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.LocalDate;
import org.libreplan.business.common.BaseEntity;
import org.libreplan.business.workingday.EffortDuration;
/**
*
@ -159,14 +160,15 @@ public class PlanningData extends BaseEntity {
private BigDecimal calculateTheoreticalAdvanceByNumHoursForCriticalPath(
List<Task> criticalPath, Date limit) {
int theoreticalNumHours = 0, totalNumHours = 0;
EffortDuration theoreticalCompletedTime = EffortDuration.zero();
EffortDuration totalAssignedTime = EffortDuration.zero();
for (Task each: criticalPath) {
theoreticalNumHours += each.getTheoreticalCompletedHoursUntilDate(limit);
totalNumHours += AggregateOfDayAssignments.create(
each.getDayAssignments()).getTotalHours();
EffortDuration.sum(theoreticalCompletedTime, each.getTheoreticalCompletedTimeUntilDate(limit));
EffortDuration.sum(totalAssignedTime, AggregateOfDayAssignments.create(
each.getDayAssignments()).getTotalTime());
}
return divide(new BigDecimal(theoreticalNumHours), totalNumHours);
return theoreticalCompletedTime.dividedByAndResultAsBigDecimal(totalAssignedTime);
}
private BigDecimal calculateTheoreticalAdvanceByDurationForCriticalPath(

View file

@ -1087,10 +1087,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained {
}
@Override
public Integer getTheoreticalCompletedHoursUntilDate(Date date) {
public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) {
return AggregateOfDayAssignments.createByDataRange(
this.getDayAssignments(),
this.getStartDate(),
date).getTotalHours();
date).getTotalTime();
}
}

View file

@ -701,17 +701,16 @@ public abstract class TaskElement extends BaseEntity {
return result;
}
public abstract Integer getTheoreticalCompletedHoursUntilDate(Date date);
public abstract EffortDuration getTheoreticalCompletedTimeUntilDate(Date date);
public BigDecimal getTheoreticalAdvancePercentageUntilDate(Date date) {
int totalAllocatedHours = AggregateOfDayAssignments.create(
this.getDayAssignments()).getTotalHours();
int totalTheoreticalCompletedHours = this.getTheoreticalCompletedHoursUntilDate(date);
if(Math.min(totalAllocatedHours, totalTheoreticalCompletedHours) == 0) {
EffortDuration totalAllocatedTime = AggregateOfDayAssignments.create(
this.getDayAssignments()).getTotalTime();
EffortDuration totalTheoreticalCompletedTime = this.getTheoreticalCompletedTimeUntilDate(date);
if(totalAllocatedTime.isZero() || totalTheoreticalCompletedTime.isZero()) {
return BigDecimal.ZERO;
}
Validate.isTrue(totalTheoreticalCompletedHours <= totalAllocatedHours);
return new BigDecimal(totalTheoreticalCompletedHours).divide(
new BigDecimal(totalAllocatedHours), 8, BigDecimal.ROUND_HALF_EVEN);
Validate.isTrue(totalTheoreticalCompletedTime.getSeconds() <= totalAllocatedTime.getSeconds());
return totalTheoreticalCompletedTime.dividedByAndResultAsBigDecimal(totalAllocatedTime);
}
}

View file

@ -37,6 +37,7 @@ import org.libreplan.business.common.entities.ProgressType;
import org.libreplan.business.orders.entities.TaskSource;
import org.libreplan.business.resources.daos.IResourcesSearcher;
import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.business.workingday.EffortDuration;
import org.libreplan.business.workingday.IntraDayDate;
/**
@ -306,10 +307,11 @@ public class TaskGroup extends TaskElement {
}
@Override
public Integer getTheoreticalCompletedHoursUntilDate(Date date) {
int sum = 0;
public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) {
EffortDuration sum = EffortDuration.zero();
for(TaskElement each: taskElements) {
sum += each.getTheoreticalCompletedHoursUntilDate(date);
sum = EffortDuration.sum(sum, each.getTheoreticalCompletedTimeUntilDate(date));
}
return sum;
}

View file

@ -32,6 +32,7 @@ import org.joda.time.DateTime;
import org.joda.time.Days;
import org.libreplan.business.resources.daos.IResourcesSearcher;
import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.business.workingday.EffortDuration;
import org.libreplan.business.workingday.IntraDayDate;
/**
@ -182,9 +183,9 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain
}
@Override
public Integer getTheoreticalCompletedHoursUntilDate(Date date) {
public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) {
// TODO Auto-generated method stub FIXME
return null;
return EffortDuration.zero();
}
}

View file

@ -58,6 +58,7 @@ import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderLine;
import org.libreplan.business.orders.entities.SchedulingDataForVersion;
import org.libreplan.business.orders.entities.TaskSource;
import org.libreplan.business.planner.entities.AggregateOfDayAssignments;
import org.libreplan.business.planner.entities.SpecificResourceAllocation;
import org.libreplan.business.planner.entities.Task;
import org.libreplan.business.planner.entities.TaskElement;
@ -309,20 +310,22 @@ public class TaskTest {
@Test
public void theoreticalHoursIsZeroIfNoResourcesAreAllocated() {
assertThat(task.getTheoreticalCompletedHoursUntilDate(new Date()), equalTo(0));
assertThat(task.getTheoreticalCompletedTimeUntilDate(new Date()), equalTo(EffortDuration.zero()));
}
@Test
public void theoreticalHoursIsTotalIfDateIsLaterThanEndDate() {
prepareTaskForTheoreticalAdvanceTesting();
assertThat(task.getTheoreticalCompletedHoursUntilDate(task.getEndDate()), equalTo(task.getTotalHours()));
EffortDuration totalAllocatedTime = AggregateOfDayAssignments.create(
task.getDayAssignments()).getTotalTime();
assertThat(task.getTheoreticalCompletedTimeUntilDate(task.getEndDate()), equalTo(totalAllocatedTime));
}
@Test
public void theoreticalHoursIsZeroIfDateIsEarlierThanStartDate() {
prepareTaskForTheoreticalAdvanceTesting();
assertThat(task.getTheoreticalCompletedHoursUntilDate(task.getStartDate()), equalTo(0));
assertThat(task.getTheoreticalCompletedTimeUntilDate(task.getStartDate()), equalTo(EffortDuration.zero()));
}
@ -330,14 +333,18 @@ public class TaskTest {
public void theoreticalHoursWithADateWithinStartAndEndDateHead() {
prepareTaskForTheoreticalAdvanceTesting();
LocalDate limit = task.getStartAsLocalDate().plusDays(1);
assertThat(task.getTheoreticalCompletedHoursUntilDate(limit.toDateTimeAtStartOfDay().toDate()), equalTo(8));
EffortDuration expected = EffortDuration.hours(8);
assertThat(task.getTheoreticalCompletedTimeUntilDate(limit.toDateTimeAtStartOfDay().toDate()),
equalTo(expected));
}
@Test
public void theoreticalHoursWithADateWithinStartAndEndDateTail() {
prepareTaskForTheoreticalAdvanceTesting();
LocalDate limit = task.getEndAsLocalDate().minusDays(1);
assertThat(task.getTheoreticalCompletedHoursUntilDate(limit.toDateTimeAtStartOfDay().toDate()), equalTo(32));
EffortDuration expected = EffortDuration.hours(32);
assertThat(task.getTheoreticalCompletedTimeUntilDate(limit.toDateTimeAtStartOfDay().toDate()),
equalTo(expected));
}
@Test