diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetModel.java index 96407ec19..2cebb15ad 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetModel.java @@ -22,6 +22,7 @@ package org.libreplan.web.users.dashboard; import java.util.List; import org.joda.time.LocalDate; +import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.resources.entities.Worker; import org.libreplan.business.workingday.EffortDuration; @@ -116,4 +117,15 @@ public interface IMonthlyTimesheetModel { */ EffortDuration getResourceCapacity(LocalDate date); + /** + * Adds the orderElement to the current monthly timehseet. + */ + void addOrderElement(OrderElement orderElement); + + /** + * Returns the {@link Order} of the orderElement avoiding a + * proxy. + */ + Order getOrder(OrderElement orderElement); + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetController.java index 08c13d0d8..194642b2b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetController.java @@ -30,6 +30,7 @@ import org.joda.time.LocalDate; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.workingday.EffortDuration; import org.libreplan.web.common.Util; +import org.libreplan.web.common.components.bandboxsearch.BandboxSearch; import org.libreplan.web.common.entrypoints.IURLHandlerRegistry; import org.libreplan.web.users.services.CustomTargetUrlResolver; import org.springframework.util.Assert; @@ -66,6 +67,8 @@ public class MonthlyTimesheetController extends GenericForwardComposer private Columns columns; + private BandboxSearch orderElementBandboxSearch; + private RowRenderer rowRenderer = new RowRenderer() { private LocalDate first; @@ -101,7 +104,8 @@ public class MonthlyTimesheetController extends GenericForwardComposer } private void renderOrderElementRow(Row row, OrderElement orderElement) { - Util.appendLabel(row, orderElement.getOrder().getName()); + Util.appendLabel(row, monthlyTimesheetModel.getOrder(orderElement) + .getName()); Util.appendLabel(row, orderElement.getName()); appendInputsForDays(row, orderElement); @@ -398,6 +402,16 @@ public class MonthlyTimesheetController extends GenericForwardComposer CustomTargetUrlResolver.USER_DASHBOARD_URL); } + public void addOrderElement() { + OrderElement orderElement = (OrderElement) orderElementBandboxSearch + .getSelectedElement(); + if (orderElement != null) { + monthlyTimesheetModel.addOrderElement(orderElement); + orderElementBandboxSearch.setSelectedElement(null); + Util.reloadBindings(timesheet); + } + } + } /** diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetModel.java index 811a01345..0b6dd1712 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetModel.java @@ -30,7 +30,9 @@ import org.libreplan.business.calendars.entities.ResourceCalendar; import org.libreplan.business.common.daos.IConfigurationDAO; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.costcategories.entities.TypeOfWorkHours; +import org.libreplan.business.orders.daos.IOrderDAO; import org.libreplan.business.orders.daos.ISumChargedEffortDAO; +import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.planner.daos.IResourceAllocationDAO; import org.libreplan.business.planner.entities.SpecificResourceAllocation; @@ -96,6 +98,9 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { @Autowired private IConfigurationDAO configurationDAO; + @Autowired + private IOrderDAO orderDAO; + @Override @Transactional(readOnly = true) public void initCreateOrEdit(LocalDate date) { @@ -110,8 +115,8 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { initCapacityMap(); - initOrderElements(); initWorkReport(); + initOrderElements(); } private void initDates() { @@ -172,8 +177,8 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { private void initOrderElements() { List resourceAllocations = resourceAllocationDAO .findSpecificAllocationsRelatedTo(scenarioManager.getCurrent(), - UserDashboardUtil.getBoundResourceAsList(user), null, - null); + UserDashboardUtil.getBoundResourceAsList(user), + firstDay, lastDay); orderElements = new ArrayList(); for (SpecificResourceAllocation each : resourceAllocations) { @@ -181,10 +186,27 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { forceLoad(orderElement); orderElements.add(orderElement); } + + for (WorkReportLine each : workReport.getWorkReportLines()) { + OrderElement orderElement = each.getOrderElement(); + if (isNotInOrderElements(orderElement)) { + forceLoad(orderElement); + orderElements.add(orderElement); + } + } + } + + private boolean isNotInOrderElements(OrderElement orderElement) { + for (OrderElement each : orderElements) { + if (each.getId().equals(orderElement.getId())) { + return false; + } + } + return true; } private void forceLoad(OrderElement orderElement) { - orderElement.getOrder().getName(); + orderElement.getName(); } @Override @@ -240,15 +262,22 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { EffortDuration effortDuration) { WorkReportLine workReportLine = getWorkReportLine(orderElement, date); if (workReportLine == null) { - workReportLine = WorkReportLine.create(workReport); - workReportLine.setOrderElement(orderElement); - workReportLine.setDate(date.toDateTimeAtStartOfDay().toDate()); - workReportLine.setTypeOfWorkHours(getTypeOfWorkHours()); + workReportLine = createWorkReportLine(orderElement, date); workReport.addWorkReportLine(workReportLine); } workReportLine.setEffort(effortDuration); } + private WorkReportLine createWorkReportLine(OrderElement orderElement, + LocalDate date) { + WorkReportLine workReportLine = WorkReportLine.create(workReport); + workReportLine.setOrderElement(orderElement); + workReportLine.setDate(date.toDateTimeAtStartOfDay().toDate()); + workReportLine.setTypeOfWorkHours(getTypeOfWorkHours()); + workReportLine.setEffort(EffortDuration.zero()); + return workReportLine; + } + private TypeOfWorkHours getTypeOfWorkHours() { return configurationDAO.getConfiguration() .getMonthlyTimesheetsTypeOfWorkHours(); @@ -311,4 +340,17 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel { return capacityMap.get(date); } + @Override + public void addOrderElement(OrderElement orderElement) { + if (isNotInOrderElements(orderElement)) { + orderElements.add(orderElement); + } + } + + @Override + @Transactional(readOnly = true) + public Order getOrder(OrderElement orderElement) { + return orderDAO.loadOrderAvoidingProxyFor(orderElement); + } + } diff --git a/libreplan-webapp/src/main/webapp/myaccount/monthlyTimesheet.zul b/libreplan-webapp/src/main/webapp/myaccount/monthlyTimesheet.zul index 805431337..bb0db9ae3 100644 --- a/libreplan-webapp/src/main/webapp/myaccount/monthlyTimesheet.zul +++ b/libreplan-webapp/src/main/webapp/myaccount/monthlyTimesheet.zul @@ -55,6 +55,13 @@ + + +