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 @@
+
+
+
+