From 2b07654d61577cccd40a39bcbbcc9251fdc792c6 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 22 Nov 2012 10:51:21 +0100 Subject: [PATCH] Add checkbox to mark task as finished in personal timesheets popup FEA: ItEr77S12AdaptPlanningAccordingTimesheets --- .../workreports/daos/IWorkReportLineDAO.java | 2 +- .../workreports/daos/WorkReportLineDAO.java | 7 +-- .../workreports/entities/WorkReport.java | 10 +++++ .../workreports/entities/WorkReportLine.java | 10 +---- .../dashboard/IPersonalTimesheetModel.java | 23 ++++++++++ .../PersonalTimesheetController.java | 26 +++++++++++ .../dashboard/PersonalTimesheetModel.java | 44 +++++++++++++++++-- .../web/workreports/WorkReportModel.java | 17 ++----- .../webapp/myaccount/personalTimesheet.zul | 4 ++ 9 files changed, 115 insertions(+), 28 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java index 09ee268d7..39f8ddd1f 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java @@ -69,7 +69,7 @@ public interface IWorkReportLineDAO extends Pair findMinAndMaxDatesByOrderElement( OrderElement orderElement); - List findByOrderElementNotInWorkReportAnotherTransaction( + List findFinishedByOrderElementNotInWorkReportAnotherTransaction( OrderElement orderElement, WorkReport workReport); Boolean isFinished(OrderElement orderElement); diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java index 9375eb105..153e707c2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java @@ -171,13 +171,13 @@ public class WorkReportLineDAO extends IntegrationEntityDAO @Override @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) - public List findByOrderElementNotInWorkReportAnotherTransaction( + public List findFinishedByOrderElementNotInWorkReportAnotherTransaction( OrderElement orderElement, WorkReport workReport) { - return findByOrderElementNotInWorkReport(orderElement, workReport); + return findFinishedByOrderElementNotInWorkReport(orderElement, workReport); } @SuppressWarnings("unchecked") - private List findByOrderElementNotInWorkReport( + private List findFinishedByOrderElementNotInWorkReport( OrderElement orderElement, WorkReport workReport) { Criteria criteria = getSession().createCriteria(WorkReportLine.class); @@ -185,6 +185,7 @@ public class WorkReportLineDAO extends IntegrationEntityDAO if (!workReport.isNewObject()) { criteria.add(Restrictions.ne("workReport", workReport)); } + criteria.add(Restrictions.eq("finished", true)); return (List) criteria.list(); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReport.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReport.java index caca48337..ca76e34c2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReport.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReport.java @@ -555,4 +555,14 @@ public class WorkReport extends IntegrationEntity implements return true; } + public boolean isFinished(OrderElement orderElement) { + for (WorkReportLine line : workReportLines) { + if (line.isFinished() + && Util.equals(line.getOrderElement(), orderElement)) { + return true; + } + } + return false; + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReportLine.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReportLine.java index c291fecc6..8e3f1a492 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReportLine.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/entities/WorkReportLine.java @@ -571,15 +571,9 @@ public class WorkReportLine extends IntegrationEntity implements Comparable, } List lines = Registry.getWorkReportLineDAO() - .findByOrderElementNotInWorkReportAnotherTransaction( + .findFinishedByOrderElementNotInWorkReportAnotherTransaction( orderElement, workReport); - for (WorkReportLine line : lines) { - if (line.isFinished()) { - return false; - } - } - - return true; + return lines.isEmpty(); } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IPersonalTimesheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IPersonalTimesheetModel.java index 02fdf6019..043419713 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IPersonalTimesheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/IPersonalTimesheetModel.java @@ -30,6 +30,7 @@ import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.resources.entities.Worker; import org.libreplan.business.workingday.EffortDuration; import org.libreplan.business.workreports.entities.WorkReport; +import org.libreplan.business.workreports.entities.WorkReportLine; /** * Interface for creation/edition of a personal timesheet model @@ -227,4 +228,26 @@ public interface IPersonalTimesheetModel { */ LocalDate getNext(); + /** + * Returns true (or false) if the specified + * orderElement is marked as finished (or not) in the current + * personal timesheet for the specified date. + */ + Boolean isFinished(OrderElement orderElement, LocalDate date); + + /** + * Mark the specified orderElement as finished in the current + * personal timesheet for the specified date.
+ * + * Marks the current personal timesheet as modified. + */ + void setFinished(OrderElement orderElement, LocalDate textboxDate, + Boolean finished); + + /** + * Checks if the specified orderElement is marked or not as + * finished in any {@link WorkReportLine}. + */ + Boolean isFinished(OrderElement orderElement); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetController.java index 0331f63f5..e2e4ea710 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetController.java @@ -60,6 +60,7 @@ import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Cell; +import org.zkoss.zul.Checkbox; import org.zkoss.zul.Column; import org.zkoss.zul.Columns; import org.zkoss.zul.Frozen; @@ -124,6 +125,8 @@ public class PersonalTimesheetController extends GenericForwardComposer private Div personalTimesheetPopupEffort; + private Div personalTimesheetPopupFinished; + @Resource private IPersonalTimesheetController personalTimesheetController; @@ -289,6 +292,29 @@ public class PersonalTimesheetController extends GenericForwardComposer } }); personalTimesheetPopupEffort.appendChild(effortTextbox); + + personalTimesheetPopupFinished.getChildren().clear(); + Checkbox finishedCheckbox = Util.bind(new Checkbox(), + new Util.Getter() { + @Override + public Boolean get() { + return personalTimesheetModel.isFinished( + orderElement, textboxDate); + } + }, new Util.Setter() { + @Override + public void set(Boolean value) { + personalTimesheetModel.setFinished(orderElement, + textboxDate, value); + markAsModified(textbox); + } + }); + if (!finishedCheckbox.isChecked()) { + finishedCheckbox.setDisabled(personalTimesheetModel + .isFinished(orderElement)); + } + personalTimesheetPopupFinished.appendChild(finishedCheckbox); + return effortTextbox; } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java index 6f5b9a097..854d8cb5f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java @@ -396,14 +396,21 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel { @Transactional(readOnly = true) public void setEffortDuration(OrderElement orderElement, LocalDate date, EffortDuration effortDuration) { + WorkReportLine workReportLine = getOrCreateWorkReportLine(orderElement, + date); + workReportLine.setEffort(effortDuration); + modified = true; + markAsModified(orderElement, date); + } + + private WorkReportLine getOrCreateWorkReportLine(OrderElement orderElement, + LocalDate date) { WorkReportLine workReportLine = getWorkReportLine(orderElement, date); if (workReportLine == null) { workReportLine = createWorkReportLine(orderElement, date); workReport.addWorkReportLine(workReportLine); } - workReportLine.setEffort(effortDuration); - modified = true; - markAsModified(orderElement, date); + return workReportLine; } private void markAsModified(OrderElement orderElement, LocalDate date) { @@ -619,4 +626,35 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel { return periodicity.next(date); } + @Override + public Boolean isFinished(OrderElement orderElement, LocalDate date) { + WorkReportLine workReportLine = getWorkReportLine(orderElement, date); + if (workReportLine == null) { + return false; + } + return workReportLine.isFinished(); + } + + @Override + public void setFinished(OrderElement orderElement, LocalDate date, + Boolean finished) { + WorkReportLine workReportLine = getOrCreateWorkReportLine(orderElement, + date); + workReportLine.setFinished(finished); + modified = true; + markAsModified(orderElement, date); + } + + @Override + public Boolean isFinished(OrderElement orderElement) { + if (workReport.isFinished(orderElement)) { + return true; + } + + List lines = workReportLineDAO + .findFinishedByOrderElementNotInWorkReportAnotherTransaction( + orderElement, workReport); + return !lines.isEmpty(); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java index 5cf147a77..a90b86bec 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java @@ -34,7 +34,6 @@ import java.util.Set; import org.apache.commons.lang.Validate; import org.hibernate.Hibernate; import org.libreplan.business.common.IntegrationEntity; -import org.libreplan.business.common.Util; import org.libreplan.business.common.daos.IConfigurationDAO; import org.libreplan.business.common.entities.EntityNameEnum; import org.libreplan.business.common.exceptions.InstanceNotFoundException; @@ -661,22 +660,14 @@ public class WorkReportModel extends IntegrationEntityModel implements @Override @Transactional(readOnly = true) public boolean isFinished(OrderElement orderElement) { - for (WorkReportLine line : workReport.getWorkReportLines()) { - if (line.isFinished() - && Util.equals(line.getOrderElement(), orderElement)) { - return true; - } + if (workReport.isFinished(orderElement)) { + return true; } List lines = workReportLineDAO - .findByOrderElementNotInWorkReportAnotherTransaction( + .findFinishedByOrderElementNotInWorkReportAnotherTransaction( orderElement, workReport); - for (WorkReportLine line : lines) { - if (line.isFinished()) { - return true; - } - } - return false; + return !lines.isEmpty(); } } diff --git a/libreplan-webapp/src/main/webapp/myaccount/personalTimesheet.zul b/libreplan-webapp/src/main/webapp/myaccount/personalTimesheet.zul index 282ea222a..281cf9a51 100644 --- a/libreplan-webapp/src/main/webapp/myaccount/personalTimesheet.zul +++ b/libreplan-webapp/src/main/webapp/myaccount/personalTimesheet.zul @@ -158,6 +158,10 @@