diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java index e740c0de0..b03e4006c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java @@ -20,8 +20,10 @@ package org.navalplanner.web.planner.allocation; +import java.util.List; import java.util.Set; +import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; @@ -85,4 +87,8 @@ public interface IResourceAllocationModel { void accept(AllocationResult modifiedAllocationResult); + List getHoursAggregatedByCriterions(); + + Integer getOrderHours(); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java index 93ae1b3c4..f02415234 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java @@ -25,20 +25,17 @@ import static org.navalplanner.web.I18nHelper._; import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; +import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.planner.entities.AggregateOfResourceAllocations; import org.navalplanner.business.planner.entities.CalculatedValue; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.ResourcesPerDay; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.planner.entities.Task; -import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.web.common.IMessagesForUser; @@ -53,6 +50,8 @@ import org.navalplanner.web.planner.allocation.AdvancedAllocationController.Rest import org.navalplanner.web.planner.order.PlanningState; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; +import org.zkoss.ganttz.timetracker.ICellForDetailItemRenderer; +import org.zkoss.ganttz.timetracker.OnColumnsRowRenderer; import org.zkoss.ganttz.util.OnZKDesktopRegistry; import org.zkoss.ganttz.util.script.IScriptsRegister; import org.zkoss.zk.ui.Component; @@ -63,14 +62,17 @@ import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Datebox; import org.zkoss.zul.Decimalbox; +import org.zkoss.zul.Grid; import org.zkoss.zul.Intbox; import org.zkoss.zul.Label; +import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Radio; import org.zkoss.zul.Radiogroup; +import org.zkoss.zul.RowRenderer; import org.zkoss.zul.SimpleConstraint; import org.zkoss.zul.Tab; import org.zkoss.zul.api.Window; @@ -88,6 +90,8 @@ public class ResourceAllocationController extends GenericForwardComposer { private IResourceAllocationModel resourceAllocationModel; + private Grid orderElementHoursGrid; + private ResourceAllocationRenderer resourceAllocationRenderer = new ResourceAllocationRenderer(); private Component messagesContainer; @@ -156,9 +160,51 @@ public class ResourceAllocationController extends GenericForwardComposer { .from(formBinder.getCalculatedValue()); calculationTypeRadio.doTheSelectionOn(calculationTypeSelector); tbResourceAllocation.setSelected(true); + orderElementHoursGrid.setModel(new ListModelList( + resourceAllocationModel.getHoursAggregatedByCriterions())); + orderElementHoursGrid.setRowRenderer(createOrderElementHoursRenderer()); showWindow(); } + public enum HoursRendererColumn { + + CRITERIONS { + @Override + public Component cell(HoursRendererColumn column, + AggregatedHoursGroup data) { + return new Label(data.getCriterionsJoinedByComma()); + } + }, + HOURS { + @Override + public Component cell(HoursRendererColumn column, + AggregatedHoursGroup data) { + Intbox result = new Intbox(data.getHours()); + result.setDisabled(true); + return result; + } + }; + + public abstract Component cell(HoursRendererColumn column, + AggregatedHoursGroup data); + } + + private static final ICellForDetailItemRenderer hoursCellRenderer = new ICellForDetailItemRenderer() { + + @Override + public Component cellFor( + HoursRendererColumn column, + AggregatedHoursGroup data) { + return column.cell(column, data); + } + }; + + private RowRenderer createOrderElementHoursRenderer() { + return OnColumnsRowRenderer + .create( + hoursCellRenderer, Arrays.asList(HoursRendererColumn.values())); + } + private void showWindow() { Util.reloadBindings(window); try { @@ -321,25 +367,8 @@ public class ResourceAllocationController extends GenericForwardComposer { .setCalculatedValue(calculationTypeRadio.getCalculatedValue()); } - /** - * Returns list of {@link Criterion} separated by comma - * @return - */ - public String getTaskCriterions() { - Set criterionNames = new HashSet(); - - Set criterions = resourceAllocationModel.getCriterions(); - for (Criterion criterion : criterions) { - criterionNames.add(criterion.getName()); - } - - return StringUtils.join(criterionNames, ","); - } - - public String getOrderHours() { - Task task = resourceAllocationModel.getTask(); - return (task != null && task.getHoursSpecifiedAtOrder() != null) ? task - .getHoursSpecifiedAtOrder().toString() : ""; + public Integer getOrderHours() { + return resourceAllocationModel.getOrderHours(); } public List getResourceAllocations() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java index ba7425b0f..2c364dd6c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java @@ -28,8 +28,11 @@ import java.util.Set; import org.hibernate.Hibernate; import org.joda.time.LocalDate; import org.navalplanner.business.orders.daos.IHoursGroupDAO; +import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.daos.ITaskElementDAO; +import org.navalplanner.business.planner.daos.ITaskSourceDAO; import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation; @@ -65,6 +68,9 @@ public class ResourceAllocationModel implements IResourceAllocationModel { @Autowired private IHoursGroupDAO hoursGroupDAO; + @Autowired + private ITaskSourceDAO taskSourceDAO; + private Task task; private org.zkoss.ganttz.data.Task ganttTask; @@ -148,6 +154,7 @@ public class ResourceAllocationModel implements IResourceAllocationModel { this.planningState = planningState; planningState.reassociateResourcesWithSession(resourceDAO); taskElementDAO.reattach(this.task); + reattachTaskSource(); hoursGroupDAO.reattach(this.task.getHoursGroup()); loadCriterionsOfGenericAllocations(); reattachHoursGroup(this.task.getHoursGroup()); @@ -172,6 +179,7 @@ public class ResourceAllocationModel implements IResourceAllocationModel { } private void reattachHoursGroup(HoursGroup hoursGroup) { + hoursGroupDAO.reattachUnmodifiedEntity(hoursGroup); hoursGroup.getPercentage(); } @@ -181,6 +189,18 @@ public class ResourceAllocationModel implements IResourceAllocationModel { } } + private void reattachTaskSource() { + TaskSource taskSource = task.getTaskSource(); + taskSourceDAO.reattach(taskSource); + Set hoursGroups = taskSource.getHoursGroups(); + for (HoursGroup hoursGroup : hoursGroups) { + reattachHoursGroup(hoursGroup); + } + for (AggregatedHoursGroup each : taskSource.getAggregatedByCriterions()) { + Hibernate.initialize(each); + } + } + private void reattachCriterion(Criterion criterion) { criterion.getName(); reattachCriterionType(criterion.getType()); @@ -227,4 +247,17 @@ public class ResourceAllocationModel implements IResourceAllocationModel { return dtos; } + @Override + public List getHoursAggregatedByCriterions() { + return task.getAggregatedByCriterions(); + } + + @Override + public Integer getOrderHours() { + if (task == null) { + return 0; + } + return AggregatedHoursGroup.sum(task.getAggregatedByCriterions()); + } + } diff --git a/navalplanner-webapp/src/main/webapp/planner/order.zul b/navalplanner-webapp/src/main/webapp/planner/order.zul index 13c17351f..794c0ec7f 100644 --- a/navalplanner-webapp/src/main/webapp/planner/order.zul +++ b/navalplanner-webapp/src/main/webapp/planner/order.zul @@ -92,12 +92,42 @@ + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - -