[Bug #996] Calculate correctly the proportion of hours for each day.
Now the proportion is calculated differently for the consolidated values and according to the percentage of the consolidation to which it belongs. FEA: ItEr74S04BugFixing
This commit is contained in:
parent
0ff719101e
commit
7186362a3b
4 changed files with 88 additions and 18 deletions
|
|
@ -36,7 +36,7 @@ public class ProportionalDistributor {
|
|||
sumIntegerParts(initialShares), initialShares));
|
||||
}
|
||||
|
||||
private static int sumIntegerParts(int[] numbers) {
|
||||
public static int sumIntegerParts(int[] numbers) {
|
||||
int sum = 0;
|
||||
for (Number each : numbers) {
|
||||
sum += each.intValue();
|
||||
|
|
|
|||
|
|
@ -1153,6 +1153,15 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
|
|||
this.end.asExclusiveEnd());
|
||||
}
|
||||
|
||||
public List<DayAssignment> getNoConsolidatedAssignmentsOnInterval() {
|
||||
return getNonConsolidatedAssignments(this.start.getDate(),
|
||||
this.end.asExclusiveEnd());
|
||||
}
|
||||
|
||||
public List<DayAssignment> getConsolidatedAssignmentsOnInterval() {
|
||||
return getConsolidatedAssignments(this.start.getDate(), this.end
|
||||
.asExclusiveEnd());
|
||||
}
|
||||
}
|
||||
|
||||
class AllocationIntervalInsideTask extends AllocationInterval {
|
||||
|
|
@ -1201,13 +1210,22 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
|
|||
|
||||
private void updateAssignments(AllocationInterval interval,
|
||||
List<T> assignmentsCreated) {
|
||||
|
||||
removingAssignments(withoutConsolidated(interval
|
||||
.getAssignmentsOnInterval()));
|
||||
addingAssignments(assignmentsCreated);
|
||||
|
||||
updateConsolidatedAssignments(interval);
|
||||
updateOriginalTotalAssigment();
|
||||
updateResourcesPerDay();
|
||||
}
|
||||
|
||||
private void updateConsolidatedAssignments(AllocationInterval interval) {
|
||||
for (DayAssignment day : interval.getAssignmentsOnInterval()) {
|
||||
day.setConsolidated(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void resetAssigmentsFittingAllocationDatesToResultingAssignments(
|
||||
AllocationInterval interval, List<T> assignmentsCreated) {
|
||||
updateAssignments(interval, assignmentsCreated);
|
||||
|
|
@ -1938,6 +1956,18 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
|
|||
getAssignments(), start, endExclusive));
|
||||
}
|
||||
|
||||
public List<DayAssignment> getNonConsolidatedAssignments(LocalDate start,
|
||||
LocalDate endExclusive) {
|
||||
return new ArrayList<DayAssignment>(DayAssignment.getAtInterval(
|
||||
getNonConsolidatedAssignments(), start, endExclusive));
|
||||
}
|
||||
|
||||
public List<DayAssignment> getConsolidatedAssignments(LocalDate start,
|
||||
LocalDate endExclusive) {
|
||||
return new ArrayList<DayAssignment>(DayAssignment.getAtInterval(
|
||||
getConsolidatedAssignments(), start, endExclusive));
|
||||
}
|
||||
|
||||
public int getAssignedHours(LocalDate start, LocalDate endExclusive) {
|
||||
return getAssignedDuration(start, endExclusive).roundToHours();
|
||||
}
|
||||
|
|
@ -2094,4 +2124,12 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
|
|||
: null;
|
||||
}
|
||||
|
||||
}
|
||||
public void setConsolidatedfromInitTo(LocalDate lastConsolidationDate) {
|
||||
for (DayAssignment day : (List<DayAssignment>) getAssignments()) {
|
||||
if (day.getDay().compareTo(lastConsolidationDate) <= 0) {
|
||||
day.setConsolidated(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -313,12 +313,25 @@ public class SpecificResourceAllocation extends
|
|||
LocalDate endExclusive, int newHoursForInterval) {
|
||||
AllocationIntervalInsideTask interval = new AllocationIntervalInsideTask(
|
||||
start, endExclusive);
|
||||
|
||||
List<DayAssignment> assignments = interval.getAssignmentsOnInterval();
|
||||
|
||||
List<DayAssignment> nonConsolidatedAssignments = interval
|
||||
.getNoConsolidatedAssignmentsOnInterval();
|
||||
List<DayAssignment> consolidatedAssignments = interval
|
||||
.getConsolidatedAssignmentsOnInterval();
|
||||
|
||||
int sumHoursConsolidated = ProportionalDistributor
|
||||
.sumIntegerParts(asHours(consolidatedAssignments));
|
||||
int pendingToReassign = newHoursForInterval - sumHoursConsolidated;
|
||||
|
||||
ProportionalDistributor distributor = ProportionalDistributor
|
||||
.create(asHours(assignments));
|
||||
int[] newHoursPerDay = distributor.distribute(newHoursForInterval);
|
||||
resetAssigmentsForInterval(interval,
|
||||
assignmentsForNewHours(assignments, newHoursPerDay));
|
||||
.create(asHours(nonConsolidatedAssignments));
|
||||
|
||||
int[] newHoursPerDay = distributor.distribute(pendingToReassign);
|
||||
|
||||
resetAssigmentsForInterval(interval, assignmentsForNewHours(
|
||||
nonConsolidatedAssignments, newHoursPerDay));
|
||||
}
|
||||
|
||||
private List<SpecificDayAssignment> assignmentsForNewHours(
|
||||
|
|
|
|||
|
|
@ -41,11 +41,11 @@ import org.navalplanner.business.orders.entities.OrderElement;
|
|||
import org.navalplanner.business.planner.daos.ITaskElementDAO;
|
||||
import org.navalplanner.business.planner.entities.DayAssignment;
|
||||
import org.navalplanner.business.planner.entities.ResourceAllocation;
|
||||
import org.navalplanner.business.planner.entities.ResourceAllocation.AllocationsSpecified;
|
||||
import org.navalplanner.business.planner.entities.ResourceAllocation.DetachDayAssignmentOnRemoval;
|
||||
import org.navalplanner.business.planner.entities.SpecificResourceAllocation;
|
||||
import org.navalplanner.business.planner.entities.Task;
|
||||
import org.navalplanner.business.planner.entities.TaskElement;
|
||||
import org.navalplanner.business.planner.entities.ResourceAllocation.AllocationsSpecified;
|
||||
import org.navalplanner.business.planner.entities.ResourceAllocation.DetachDayAssignmentOnRemoval;
|
||||
import org.navalplanner.business.planner.entities.consolidations.CalculatedConsolidatedValue;
|
||||
import org.navalplanner.business.planner.entities.consolidations.CalculatedConsolidation;
|
||||
import org.navalplanner.business.planner.entities.consolidations.ConsolidatedValue;
|
||||
|
|
@ -200,6 +200,9 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel {
|
|||
|
||||
private void addConsolidatedValue(ConsolidatedValue value) {
|
||||
if (consolidation != null && task != null) {
|
||||
if (consolidation.getConsolidatedValues().contains(value)) {
|
||||
return;
|
||||
}
|
||||
if (!consolidation.isCalculated()) {
|
||||
((NonCalculatedConsolidation) consolidation)
|
||||
.addConsolidatedValue((NonCalculatedConsolidatedValue) value);
|
||||
|
|
@ -322,12 +325,6 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel {
|
|||
|
||||
LocalDate firstDayNotConsolidated = task
|
||||
.getFirstDayNotConsolidated().getDate();
|
||||
for (DayAssignment dayAssignment : task.getDayAssignments()) {
|
||||
if (dayAssignment.getDay().compareTo(
|
||||
firstDayNotConsolidated) >= 0) {
|
||||
dayAssignment.setConsolidated(false);
|
||||
}
|
||||
}
|
||||
|
||||
Set<ResourceAllocation<?>> allResourceAllocations = task
|
||||
.getAllResourceAllocations();
|
||||
|
|
@ -339,10 +336,14 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel {
|
|||
if (!consolidation.getConsolidatedValues().isEmpty()) {
|
||||
BigDecimal lastConslidation = task.getConsolidation()
|
||||
.getConsolidatedValues().last().getValue();
|
||||
pendingHours = BigDecimal.ONE.subtract(
|
||||
lastConslidation.divide(new BigDecimal(100),
|
||||
RoundingMode.DOWN)).multiply(
|
||||
new BigDecimal(pendingHours)).intValue();
|
||||
|
||||
pendingHours = BigDecimal.ONE
|
||||
.subtract(
|
||||
lastConslidation.setScale(2).divide(
|
||||
new BigDecimal(100),
|
||||
RoundingMode.DOWN)).multiply(
|
||||
new BigDecimal(pendingHours))
|
||||
.intValue();
|
||||
}
|
||||
if (!taskEndDate.equals(endExclusive)) {
|
||||
if ((taskEndDate != null) && (endExclusive != null)
|
||||
|
|
@ -359,6 +360,24 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel {
|
|||
reassign(resourceAllocation, firstDayNotConsolidated,
|
||||
endExclusive, pendingHours);
|
||||
}
|
||||
|
||||
// delete the assignments with posterior date than endDate
|
||||
List<DayAssignment> toremove = new ArrayList<DayAssignment>();
|
||||
for (DayAssignment dayAssignment : task.getDayAssignments()) {
|
||||
if (dayAssignment.getDay().compareTo(endExclusive) >= 0) {
|
||||
toremove.add(dayAssignment);
|
||||
}
|
||||
}
|
||||
task.getDayAssignments().removeAll(toremove);
|
||||
|
||||
// update the day assignment which not are consolidated
|
||||
// according to the first day not consolidated in the task
|
||||
for (DayAssignment dayAssignment : task.getDayAssignments()) {
|
||||
if (dayAssignment.getDay().compareTo(
|
||||
firstDayNotConsolidated) >= 0) {
|
||||
dayAssignment.setConsolidated(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue