From f0eeed0ca56f92b250827f2fba270d75792c9567 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Fri, 22 May 2009 12:31:29 +0200 Subject: [PATCH] ItEr09S08HistoriaLaboralTraballadorItEr08S11: Add work relationships view window Implemented WorkRelationships view Use Case Modified controller structure to satisfy behaviour defined --- .../entities/CriterionSatisfaction.java | 17 +++++++++- .../resources/entities/LeaveCriterions.java | 29 +++++++++++++++++ .../entities/PredefinedCriterionTypes.java | 7 ++++- .../business/resources/entities/Resource.java | 2 +- .../resources/services/ResourceService.java | 1 + .../services/impl/ResourceServiceImpl.java | 1 + .../resources/entities/Resources.hbm.xml | 2 +- .../web/resources/IWorkerModel.java | 5 ++- .../WorkRelationshipsController.java | 31 +++++++++++++++++++ .../web/resources/WorkerCRUDController.java | 27 +++++++++++++--- .../web/resources/WorkerModel.java | 11 +++++++ .../main/webapp/resources/worker/_edition.zul | 4 +++ .../resources/worker/_workRelationships.zul | 31 +++++++++++++++++++ .../main/webapp/resources/worker/worker.zul | 5 ++- .../resources/WorkerCRUDControllerTest.java | 15 ++++++--- 15 files changed, 173 insertions(+), 15 deletions(-) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkRelationshipsController.java create mode 100644 navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java index ae8b3f3ff..8c6f5b4ef 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java @@ -49,7 +49,11 @@ public class CriterionSatisfaction { } public Date getEndDate() { - return new Date(finishDate.getTime()); + if (isFinished() ) { + return new Date(finishDate.getTime()); + } else { + return null; + } } public Criterion getCriterion() { @@ -85,4 +89,15 @@ public class CriterionSatisfaction { return finishDate != null; } + public void setEndDate(Date date) { + if ( (startDate.equals(date) || startDate.before(date)) ) + finishDate = date; + } + + public void setStartDate(Date date) { + if ( (finishDate == null || finishDate.after(date)) ) + startDate = date; + } + + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java new file mode 100644 index 000000000..08c14d366 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java @@ -0,0 +1,29 @@ +package org.navalplanner.business.resources.entities; + +import java.util.ArrayList; +import java.util.List; + +public enum LeaveCriterions { + MEDICAL_LEAVE("medicalLeaveWorkingRelationship"), PATERNITY_LEAVE( + "paternityLeaveWorkingRelationship"); + + public static List getCriterions() { + ArrayList result = new ArrayList(); + for (LeaveCriterions leaveCriterions : values()) { + result.add(leaveCriterions.criterion()); + } + return result; + } + + private final String criterionName; + + private LeaveCriterions(String name) { + this.criterionName = name; + } + + public Criterion criterion() { + return PredefinedCriterionTypes.LEAVE + .createCriterion(criterionName); + } + +} \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java index 719f9f8e0..d7f37cc4e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java @@ -16,11 +16,16 @@ public enum PredefinedCriterionTypes implements ICriterionType { } }, LOCATION_GROUP(false, true, true, true, Resource.class) { - @Override public List getPredefined() { return Arrays.asList(); } + }, + LEAVE(false, false, false, false, Worker.class) { + @Override + public List getPredefined() { + return LeaveCriterions.getCriterions(); + } }; private final boolean allowHierarchy; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index 5ea2a5ae2..6ec3fa38f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -56,7 +56,7 @@ public abstract class Resource { } public Set getAllSatisfactions() { - return Collections.unmodifiableSet(criterionSatisfactions); + return new HashSet(criterionSatisfactions); } public Collection getSatisfactionsFor( diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java index 7c6f075b4..c8cb71561 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Set; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +//import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java index d065d8306..42ac64e6c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java @@ -6,6 +6,7 @@ import java.util.Set; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.IResourceDao; + import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml index cf92b12c7..9c02bb5e8 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml @@ -39,7 +39,7 @@ - + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java index 961bb5932..2f7e0159a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java @@ -2,7 +2,9 @@ package org.navalplanner.web.resources; import java.util.List; +import java.util.Set; import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Worker; /** @@ -21,4 +23,5 @@ public interface IWorkerModel { void prepareEditFor(Worker worker); -} \ No newline at end of file + Set getCriterionSatisfactions(Worker worker); +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkRelationshipsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkRelationshipsController.java new file mode 100644 index 000000000..1fc24507f --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkRelationshipsController.java @@ -0,0 +1,31 @@ +package org.navalplanner.web.resources; + +import java.util.HashSet; +import java.util.Set; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; +import org.zkoss.zk.ui.util.GenericForwardComposer; + +/** + * Subcontroller for {@link Worker} resource
+ * @author Lorenzo Tilve Álvaro + */ +public class WorkRelationshipsController extends GenericForwardComposer { + + private IWorkerModel workerModel; + private WorkerCRUDController workerCRUDController; + + public WorkRelationshipsController(IWorkerModel workerModel, + WorkerCRUDController workerCRUDController) { + this.workerModel = workerModel; + this.workerCRUDController = workerCRUDController; + } + + public Set getCriterionSatisfactions() { + if (this.workerCRUDController.getWorker() == null) { + return new HashSet(); + } else { + return workerModel.getCriterionSatisfactions( + this.workerCRUDController.getWorker()); + } + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java index 3a03ba08a..e5f045e82 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java @@ -1,9 +1,12 @@ package org.navalplanner.web.resources; import java.util.List; +import java.util.Set; import org.hibernate.validator.InvalidValue; import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.Level; @@ -26,6 +29,8 @@ public class WorkerCRUDController extends GenericForwardComposer { private Window editWindow; + private Window workRelationshipsWindow; + private IWorkerModel workerModel; private OnlyOneVisible visibility; @@ -34,15 +39,18 @@ public class WorkerCRUDController extends GenericForwardComposer { private Component messagesContainer; + private GenericForwardComposer workRelationship; + public WorkerCRUDController() { } public WorkerCRUDController(Window createWindow, Window listWindow, - Window editWindow, IWorkerModel workerModel, - IMessagesForUser messages) { + Window editWindow, Window workRelationshipsWindow, + IWorkerModel workerModel, IMessagesForUser messages) { this.createWindow = createWindow; this.listWindow = listWindow; this.editWindow = editWindow; + this.workRelationshipsWindow = workRelationshipsWindow; this.workerModel = workerModel; this.messages = messages; } @@ -78,6 +86,11 @@ public class WorkerCRUDController extends GenericForwardComposer { Util.reloadBindings(editWindow); } + public void goToWorkRelationshipsForm(Worker worker) { + getVisibility().showOnly(workRelationshipsWindow); + Util.reloadBindings(workRelationshipsWindow); + } + public void goToCreateForm() { workerModel.prepareForCreate(); getVisibility().showOnly(createWindow); @@ -92,14 +105,20 @@ public class WorkerCRUDController extends GenericForwardComposer { if (messagesContainer == null) throw new RuntimeException("messagesContainer is needed"); messages = new MessagesForUser(messagesContainer); + this.workRelationship = + new WorkRelationshipsController(this.workerModel,this); } private OnlyOneVisible getVisibility() { if (visibility == null) { visibility = new OnlyOneVisible(listWindow, editWindow, - createWindow); + createWindow, workRelationshipsWindow ); } return visibility; } -} + public GenericForwardComposer getWorkRelationship() { + return this.workRelationship; + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java index 14e4f0da2..05c3e7dca 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java @@ -7,9 +7,12 @@ import org.hibernate.validator.ClassValidator; import org.hibernate.validator.InvalidValue; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; +import java.util.Set; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.ResourceService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; /** * Model for worker
@@ -45,6 +48,7 @@ public class WorkerModel implements IWorkerModel { } @Override + public Worker getWorker() { return worker; } @@ -55,6 +59,7 @@ public class WorkerModel implements IWorkerModel { } @Override + @Transactional(readOnly=true) public void prepareEditFor(Worker worker) { Validate.notNull(worker, "worker is not null"); try { @@ -62,6 +67,12 @@ public class WorkerModel implements IWorkerModel { } catch (InstanceNotFoundException e) { throw new RuntimeException(e); } + this.worker.getAllSatisfactions(); + for ( CriterionSatisfaction cs : this.worker.getAllSatisfactions() ) {} + } + + public Set getCriterionSatisfactions(Worker worker) { + return worker.getAllSatisfactions(); } } diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul index 4baf083ed..1d805e751 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul @@ -26,4 +26,8 @@ + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul new file mode 100644 index 000000000..a67780b6e --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul index 9f56fa134..c1b895709 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul @@ -7,6 +7,7 @@ + - + diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java index b43746d91..932801864 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java @@ -28,6 +28,7 @@ public class WorkerCRUDControllerTest { private Window createWindow; private Window listWindow; private Window editWindow; + private Window workRelationshipsWindow; private WorkerCRUDController createControllerForModel( IWorkerModel workerModel) { @@ -39,12 +40,15 @@ public class WorkerCRUDControllerTest { createWindow = createNiceMock(Window.class); listWindow = createNiceMock(Window.class); editWindow = createNiceMock(Window.class); + workRelationshipsWindow = createNiceMock(Window.class); WorkerCRUDController workerCRUDController = new WorkerCRUDController( - createWindow, listWindow, editWindow, workerModel, messages); + createWindow, listWindow, editWindow, workRelationshipsWindow, + workerModel, messages); return workerCRUDController; } + @Test public void testSave() throws Exception { IWorkerModel workerModel = createMock(IWorkerModel.class); @@ -53,7 +57,7 @@ public class WorkerCRUDControllerTest { WorkerCRUDController workerCRUDController = createControllerForModel( workerModel, messagesForUser); - replay(createWindow, listWindow, editWindow); + replay(createWindow, listWindow, editWindow, workRelationshipsWindow); // expectations workerModel.prepareForCreate(); expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes(); @@ -82,7 +86,8 @@ public class WorkerCRUDControllerTest { expect(createWindow.setVisible(true)).andReturn(false); expect(createWindow.setVisible(false)).andReturn(true); expect(listWindow.setVisible(true)).andReturn(false); - replay(createWindow, listWindow, editWindow, workerModel); + expect(workRelationshipsWindow.setVisible(true)).andReturn(false); + replay(createWindow, listWindow, editWindow, workRelationshipsWindow, workerModel); // actions workerCRUDController.goToCreateForm(); workerCRUDController.cancel(); @@ -107,8 +112,8 @@ public class WorkerCRUDControllerTest { .anyTimes(); workerModel.save(); messagesForUser.showMessage(same(Level.INFO), isA(String.class)); - replay(createWindow, listWindow, editWindow, workerModel, - messagesForUser); + replay(createWindow, listWindow, editWindow, workRelationshipsWindow, + workerModel, messagesForUser); // perform actions List workers = workerCRUDController.getWorkers(); assertEquals(workersToReturn, workers);