diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java
index 8fbbacb36..97a5727a2 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java
@@ -32,6 +32,7 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.libreplan.business.common.BaseEntity;
import org.libreplan.business.common.Configuration;
import org.libreplan.business.common.IOnTransaction;
import org.libreplan.business.common.Registry;
@@ -725,4 +726,19 @@ public class Util {
row.addEventListener(Events.ON_CLICK, editButtonListener);
}
+ /**
+ * Checks if the entity is contained in the provided
+ * list.
+ */
+ public static boolean contains(List extends BaseEntity> list,
+ BaseEntity entity) {
+ for (BaseEntity each : list) {
+ if (each.getId() != null && entity.getId() != null
+ && each.getId().equals(entity.getId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetsAreaModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetsAreaModel.java
index 36accd6b6..d1852ba50 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetsAreaModel.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IMonthlyTimesheetsAreaModel.java
@@ -22,6 +22,7 @@ package org.libreplan.web.users.dashboard;
import java.util.List;
import org.libreplan.business.calendars.entities.CalendarAvailability;
+import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.business.users.entities.User;
import org.libreplan.business.workreports.entities.WorkReport;
@@ -46,4 +47,10 @@ public interface IMonthlyTimesheetsAreaModel {
*/
List getMonthlyTimesheets();
+ /**
+ * Returns the number of different {@link OrderElement OrderElements} with
+ * tracked time in the specified workReport.
+ */
+ int getNumberOfOrderElementsWithTrackedTime(WorkReport workReport);
+
}
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 dd4fa07b6..00d24aa6c 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
@@ -55,6 +55,7 @@ import org.libreplan.business.workreports.entities.WorkReportLine;
import org.libreplan.business.workreports.entities.WorkReportType;
import org.libreplan.web.UserUtil;
import org.libreplan.web.calendars.BaseCalendarModel;
+import org.libreplan.web.common.Util;
import org.libreplan.web.common.concurrentdetection.OnConcurrentModification;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -216,12 +217,7 @@ public class MonthlyTimesheetModel implements IMonthlyTimesheetModel {
}
private boolean isNotInOrderElements(OrderElement orderElement) {
- for (OrderElement each : orderElements) {
- if (each.getId().equals(orderElement.getId())) {
- return false;
- }
- }
- return true;
+ return !Util.contains(orderElements, orderElement);
}
private void forceLoad(OrderElement orderElement) {
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaController.java
index efbe400b1..51e36e6bb 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaController.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaController.java
@@ -59,6 +59,11 @@ public class MonthlyTimesheetsAreaController extends GenericForwardComposer {
Util.appendLabel(row, workReport.getTotalEffortDuration()
.toFormattedString());
+ Util.appendLabel(
+ row,
+ monthlyTimesheetsAreaModel
+ .getNumberOfOrderElementsWithTrackedTime(workReport) + "");
+
Util.appendOperationsAndOnClickEvent(row, new EventListener() {
@Override
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaModel.java
index 7641e9a64..7a9eb3031 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaModel.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/MonthlyTimesheetsAreaModel.java
@@ -25,13 +25,16 @@ import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.Months;
+import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.business.resources.entities.Worker;
import org.libreplan.business.users.entities.User;
import org.libreplan.business.workreports.daos.IWorkReportDAO;
import org.libreplan.business.workreports.entities.WorkReport;
+import org.libreplan.business.workreports.entities.WorkReportLine;
import org.libreplan.business.workreports.entities.WorkReportType;
import org.libreplan.web.UserUtil;
+import org.libreplan.web.common.Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@@ -97,4 +100,22 @@ public class MonthlyTimesheetsAreaModel implements IMonthlyTimesheetsAreaModel {
.getStartDate();
}
+ @Override
+ public int getNumberOfOrderElementsWithTrackedTime(WorkReport workReport) {
+ if (workReport == null) {
+ return 0;
+ }
+
+ List orderElements = new ArrayList();
+ for (WorkReportLine line : workReport.getWorkReportLines()) {
+ if (!line.getEffort().isZero()) {
+ OrderElement orderElement = line.getOrderElement();
+ if (!Util.contains(orderElements, orderElement)) {
+ orderElements.add(orderElement);
+ }
+ }
+ }
+ return orderElements.size();
+ }
+
}
diff --git a/libreplan-webapp/src/main/webapp/myaccount/_monthlyTimesheetsArea.zul b/libreplan-webapp/src/main/webapp/myaccount/_monthlyTimesheetsArea.zul
index 5c7c79e3a..ddd98361a 100644
--- a/libreplan-webapp/src/main/webapp/myaccount/_monthlyTimesheetsArea.zul
+++ b/libreplan-webapp/src/main/webapp/myaccount/_monthlyTimesheetsArea.zul
@@ -26,6 +26,7 @@
+