Warn if the goals set are not satisfied when applying the allocation

FEA: ItEr74S04BugFixing
This commit is contained in:
Óscar González Fernández 2011-04-17 16:43:56 +02:00
parent 3f875ac898
commit 6cf707573a
5 changed files with 100 additions and 20 deletions

View file

@ -43,6 +43,8 @@ public abstract class AllocationModification {
return result;
}
public abstract boolean satisfiesModificationRequested();
/**
* It ensures that the provided allocations have at least one associated
* resource. A {@link AllocationModification} doesn't have associated
@ -77,6 +79,24 @@ public abstract class AllocationModification {
return resourcesOnWhichApplyAllocation.isEmpty();
}
public interface IByType<T> {
public T onResourcesPerDay(ResourcesPerDayModification modification);
public T onHours(HoursModification modification);
}
public <T> T byType(IByType<T> visitor) {
if (this instanceof ResourcesPerDayModification) {
ResourcesPerDayModification r = (ResourcesPerDayModification) this;
return visitor.onResourcesPerDay(r);
} else {
HoursModification h = (HoursModification) this;
return visitor.onHours(h);
}
}
protected void withNewResources(IResourcesSearcher resourcesSearcher) {
resourcesOnWhichApplyAllocation = beingModified
.querySuitableResources(resourcesSearcher);

View file

@ -135,6 +135,11 @@ public abstract class HoursModification extends AllocationModification {
public abstract void allocateFromEndUntil(LocalDate start);
@Override
public boolean satisfiesModificationRequested() {
return hours == getBeingModified().getAssignedHours();
}
public int getHours() {
return hours;
}

View file

@ -307,4 +307,9 @@ public abstract class ResourcesPerDayModification extends
goal);
}
@Override
public boolean satisfiesModificationRequested() {
return getGoal().equals(getBeingModified().getResourcesPerDay());
}
}

View file

@ -27,6 +27,7 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.Validate;
@ -45,6 +46,8 @@ import org.navalplanner.business.planner.entities.DerivedAllocation;
import org.navalplanner.business.planner.entities.ResourceAllocation;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.Task.ModifiedAllocation;
import org.navalplanner.business.planner.entities.allocationalgorithms.AllocationModification;
import org.navalplanner.business.planner.entities.allocationalgorithms.AllocationModification.IByType;
import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification;
import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification;
import org.navalplanner.business.resources.daos.IResourcesSearcher;
@ -54,10 +57,12 @@ import org.navalplanner.business.workingday.EffortDuration;
import org.navalplanner.business.workingday.ResourcesPerDay;
import org.navalplanner.web.common.Util;
import org.navalplanner.web.planner.allocation.ResourceAllocationController.DerivedAllocationColumn;
import org.zkoss.zk.au.out.AuWrongValue;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Detail;
@ -97,9 +102,18 @@ public abstract class AllocationRow {
}
}
public static void loadDataFromLast(Collection<? extends AllocationRow> rows) {
public static void loadDataFromLast(List<? extends AllocationRow> rows,
List<? extends AllocationModification> modifications) {
Validate.isTrue(rows.size() == modifications.size());
Iterator<? extends AllocationModification> iterator = modifications
.iterator();
for (AllocationRow each : rows) {
each.loadDataFromLast();
AllocationModification modification = iterator.next();
if (!modification.satisfiesModificationRequested()) {
each.warnObjectiveNotSatisfied(modification);
}
}
}
@ -374,12 +388,40 @@ public abstract class AllocationRow {
: CONSTRAINT_FOR_RESOURCES_PER_DAY;
}
public void loadDataFromLast() {
private void loadDataFromLast() {
Clients.closeErrorBox(hoursInput);
Clients.closeErrorBox(resourcesPerDayInput);
hoursInput.setValue(temporal.getAssignedHours());
resourcesPerDayInput
.setValue(temporal.getResourcesPerDay().getAmount());
}
private void warnObjectiveNotSatisfied(AllocationModification modification) {
modification.byType(new IByType<Void>() {
@Override
public Void onResourcesPerDay(
ResourcesPerDayModification modification) {
ResourcesPerDay goal = modification.getGoal();
Clients.response(new AuWrongValue(resourcesPerDayInput, _(
"{0} resources per day cannot be fulfilled", goal
.getAmount().toPlainString())));
return null;
}
@Override
public Void onHours(HoursModification modification) {
int goal = modification.getHours();
Clients.response(new AuWrongValue(hoursInput, _(
"{0} hours cannot be fulfilled", goal + "")));
return null;
}
});
}
public void addListenerForHoursInputChange(EventListener listener) {
hoursInput.addEventListener(Events.ON_CHANGE, listener);
}

View file

@ -36,6 +36,7 @@ import org.navalplanner.business.planner.entities.ResourceAllocation;
import org.navalplanner.business.planner.entities.ResourceAllocation.AllocationsSpecified.INotFulfilledReceiver;
import org.navalplanner.business.planner.entities.ResourceAllocation.Direction;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.allocationalgorithms.AllocationModification;
import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification;
import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification;
import org.navalplanner.business.resources.entities.Criterion;
@ -231,28 +232,32 @@ public class AllocationRowsHandler {
public AllocationResult doAllocation() {
checkInvalidValues();
if (!currentRows.isEmpty()) {
switch (calculatedValue) {
case NUMBER_OF_HOURS:
calculateNumberOfHoursAllocation();
break;
case END_DATE:
calculateEndDateOrStartDateAllocation();
break;
case RESOURCES_PER_DAY:
calculateResourcesPerDayAllocation();
break;
default:
throw new RuntimeException("cant handle: " + calculatedValue);
}
List<? extends AllocationModification> modificationsDone;
modificationsDone = doSuitableAllocation();
AllocationRow.loadDataFromLast(currentRows, modificationsDone);
createDerived();
}
createDerived();
AllocationResult result = AllocationResult.create(task,
calculatedValue, currentRows, getWorkableDaysIfApplyable());
AllocationRow.loadDataFromLast(currentRows);
return result;
}
private void calculateNumberOfHoursAllocation() {
private List<? extends AllocationModification> doSuitableAllocation() {
switch (calculatedValue) {
case NUMBER_OF_HOURS:
return calculateNumberOfHoursAllocation();
case END_DATE:
return calculateEndDateOrStartDateAllocation();
case RESOURCES_PER_DAY:
return calculateResourcesPerDayAllocation();
default:
throw new RuntimeException("cant handle: " + calculatedValue);
}
}
private List<ResourcesPerDayModification> calculateNumberOfHoursAllocation() {
List<ResourcesPerDayModification> allocations = AllocationRow
.createAndAssociate(task, currentRows, requestedToRemove);
if (isForwardsAllocation()) {
@ -262,18 +267,20 @@ public class AllocationRowsHandler {
ResourceAllocation.allocating(allocations).allocateFromEndUntil(
formBinder.getAllocationStart());
}
return allocations;
}
public boolean isForwardsAllocation() {
return Direction.FORWARD.equals(task.getAllocationDirection());
}
private void calculateEndDateOrStartDateAllocation() {
private List<ResourcesPerDayModification> calculateEndDateOrStartDateAllocation() {
List<ResourcesPerDayModification> allocations = AllocationRow
.createAndAssociate(task, currentRows, requestedToRemove);
ResourceAllocation.allocating(allocations).untilAllocating(
task.getAllocationDirection(),
formBinder.getAssignedHours(), notFullfiledReceiver());
return allocations;
}
private INotFulfilledReceiver notFullfiledReceiver() {
@ -292,7 +299,7 @@ public class AllocationRowsHandler {
return AllocationRow.find(currentRows, resourceAllocation);
}
private void calculateResourcesPerDayAllocation() {
private List<HoursModification> calculateResourcesPerDayAllocation() {
List<HoursModification> hours = AllocationRow
.createHoursModificationsAndAssociate(task, currentRows,
requestedToRemove);
@ -303,6 +310,7 @@ public class AllocationRowsHandler {
ResourceAllocation.allocatingHours(hours).allocateFromEndUntil(
formBinder.getAllocationStart());
}
return hours;
}
private Integer getWorkableDaysIfApplyable() {