diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java index 50a1bdd86..2548c41b4 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java @@ -11,6 +11,8 @@ import org.navalplanner.business.resources.entities.Criterion; */ public interface ICriterionDAO extends IGenericDao { + public void removeByNameAndType(Criterion criterion); + Criterion findByNameAndType(Criterion criterion); boolean existsByNameAndType(Criterion entity); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java index 93baff310..0d40ba343 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java @@ -1,5 +1,7 @@ package org.navalplanner.business.resources.daos.impl; +import java.util.logging.Level; +import java.util.logging.Logger; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -34,4 +36,14 @@ public class CriterionDAO extends GenericDaoHibernate return result; } + @Override + public void removeByNameAndType(Criterion criterion) { + Criterion reloaded = findByNameAndType(criterion); + try { + remove(reloaded.getId()); + } catch (InstanceNotFoundException ex) { + throw new RuntimeException(ex); + } + } + } 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 8c6f5b4ef..0ed4278be 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 @@ -45,7 +45,7 @@ public class CriterionSatisfaction { private Resource resource; public Date getStartDate() { - return new Date(startDate.getTime()); + return startDate==null ? null: new Date(startDate.getTime()); } public Date getEndDate() { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java index 992c15660..3b232c708 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java @@ -48,7 +48,11 @@ public class CriterionServiceImpl implements CriterionService { } public void remove(Criterion criterion) throws InstanceNotFoundException { - criterionDAO.remove(criterion.getId()); + if (criterion.getId() != null ) { + criterionDAO.remove(criterion.getId()); + } else { + criterionDAO.removeByNameAndType(criterion); + } } public void save(Criterion entity) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java index bd3e2d829..b4a624200 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java @@ -1,10 +1,14 @@ package org.navalplanner.web.resources.worker; +import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; 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.ICriterionType; import org.navalplanner.business.resources.entities.Worker; /** @@ -31,4 +35,9 @@ public interface IWorkerModel { Worker findResource(long workerId); + Map, Collection> getLaboralRelatedCriterions(); + + Set getLaboralRelatedCriterionSatisfactions( + Worker worker); + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkRelationshipsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkRelationshipsController.java index 1b5aff7a7..61302a13e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkRelationshipsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkRelationshipsController.java @@ -1,11 +1,22 @@ package org.navalplanner.web.resources.worker; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.Map.Entry; +import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; +import org.navalplanner.business.resources.entities.CriterionWithItsType; +import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.Worker; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Datebox; +import org.zkoss.zul.Listbox; /** * Subcontroller for {@link Worker} resource
@@ -15,20 +26,78 @@ public class WorkRelationshipsController extends GenericForwardComposer { private IWorkerModel workerModel; private WorkerCRUDController workerCRUDController; + private CriterionSatisfaction newRelationship = new CriterionSatisfaction(); + private Collection workCriterions; + private Listbox selectedWorkCriterion; + private Datebox newWorkRelationshipStartDate; + private Datebox newWorkRelationshipEndDate; + private HashMap fromCriterionToType; public WorkRelationshipsController(IWorkerModel workerModel, WorkerCRUDController workerCRUDController) { this.workerModel = workerModel; this.workerCRUDController = workerCRUDController; + this.newRelationship = new CriterionSatisfaction(); + this.workCriterions = new ArrayList(); + Map, Collection> map = workerModel + .getLaboralRelatedCriterions(); + this.fromCriterionToType = new HashMap(); + for (Entry, Collection> entry : map + .entrySet()) { + this.workCriterions.addAll(entry.getValue()); + for (Criterion criterion : entry.getValue()) { + this.fromCriterionToType.put(criterion, + new CriterionWithItsType(entry.getKey(), criterion)); + } + } } public Set getCriterionSatisfactions() { if (this.workerCRUDController.getWorker() == null) { - return new HashSet(); + return new HashSet(); } else { + // Obtain just workRelationshipSatisfactions return workerModel - .getCriterionSatisfactions(this.workerCRUDController + .getLaboralRelatedCriterionSatisfactions(this.workerCRUDController .getWorker()); } } + + public void addCriterionSatisfaction() { + + Criterion selectedCriterion = (Criterion) selectedWorkCriterion + .getSelectedItem().getValue(); + CriterionWithItsType criterionWithItsType = fromCriterionToType + .get(selectedCriterion); + if (newWorkRelationshipEndDate == null) { + this.workerCRUDController.getWorker().activate( + criterionWithItsType, + newWorkRelationshipStartDate.getValue()); + } else { + this.workerCRUDController.getWorker().activate( + criterionWithItsType, + newWorkRelationshipStartDate.getValue(), + newWorkRelationshipEndDate.getValue()); + } + + this.workerCRUDController + .goToWorkRelationshipsForm(this.workerCRUDController + .getWorker()); + + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + this.selectedWorkCriterion.setSelectedIndex(0); + } + + public CriterionSatisfaction getNewRelationship() { + return this.newRelationship; + } + + public Collection getWorkCriterions() { + return this.workCriterions; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java index c04aeb9b3..8f583b04b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java @@ -31,6 +31,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements private Window workRelationshipsWindow; + private Window addWorkRelationshipWindow; + private IWorkerModel workerModel; private IRedirectorRegistry redirectorRegistry; @@ -52,11 +54,13 @@ public class WorkerCRUDController extends GenericForwardComposer implements public WorkerCRUDController(Window createWindow, Window listWindow, Window editWindow, Window workRelationshipsWindow, + Window addWorkRelationshipWindow, IWorkerModel workerModel, IMessagesForUser messages) { this.createWindow = createWindow; this.listWindow = listWindow; this.editWindow = editWindow; this.workRelationshipsWindow = workRelationshipsWindow; + this.addWorkRelationshipWindow = addWorkRelationshipWindow; this.workerModel = workerModel; this.messages = messages; } @@ -98,18 +102,30 @@ public class WorkerCRUDController extends GenericForwardComposer implements Util.reloadBindings(editWindow); } + public void goToEditForm() { + getVisibility().showOnly(editWindow); + Util.reloadBindings(editWindow); + } + public void goToWorkRelationshipsForm(Worker worker) { getVisibility().showOnly(workRelationshipsWindow); Util.reloadBindings(workRelationshipsWindow); } + public void goToWorkRelationshipsForm() { + getVisibility().showOnly(workRelationshipsWindow); + Util.reloadBindings(workRelationshipsWindow); + } + + public void goToAddWorkRelationshipForm() { + getVisibility().showOnly(addWorkRelationshipWindow); + Util.reloadBindings(addWorkRelationshipWindow); + } + public void goToCreateForm() { workerModel.prepareForCreate(); getVisibility().showOnly(createWindow); Util.reloadBindings(createWindow); - this.workRelationship = new WorkRelationshipsController( - this.workerModel, this); - } @Override @@ -124,6 +140,10 @@ public class WorkerCRUDController extends GenericForwardComposer implements if (messagesContainer == null) throw new RuntimeException("messagesContainer is needed"); messages = new MessagesForUser(messagesContainer); + this.workRelationship = + new WorkRelationshipsController(this.workerModel,this); + this.workRelationship.doAfterCompose( + comp.getFellow("addWorkRelationshipWindow")); Redirector redirector = redirectorRegistry .getRedirectorFor(WorkerCRUDLinks.class); redirector.applyTo(this); @@ -142,7 +162,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements private OnlyOneVisible getVisibility() { if (visibility == null) { visibility = new OnlyOneVisible(listWindow, editWindow, - createWindow, workRelationshipsWindow); + createWindow, workRelationshipsWindow, + addWorkRelationshipWindow ); } return visibility; } @@ -151,4 +172,4 @@ public class WorkerCRUDController extends GenericForwardComposer implements return this.workRelationship; } -} \ No newline at end of file +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java index e37f1ab4f..01dce1624 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java @@ -39,6 +39,9 @@ import org.springframework.transaction.annotation.Transactional; public class WorkerModel implements IWorkerModel { private final ResourceService resourceService; + private final ICriterionType[] laboralRelatedTypes = { + PredefinedCriterionTypes.LEAVE, + PredefinedCriterionTypes.WORK_RELATIONSHIP }; private Worker worker; private ClassValidator workerValidator; private final CriterionService criterionService; @@ -293,4 +296,24 @@ public class WorkerModel implements IWorkerModel { } } + @Override + @Transactional(readOnly = true) + public Map, Collection> getLaboralRelatedCriterions() { + Map, Collection> result = new HashMap, Collection>(); + for (ICriterionType type : laboralRelatedTypes) { + result.put(type, criterionService.getCriterionsFor(type)); + } + return result; + } + + @Override + public Set getLaboralRelatedCriterionSatisfactions( + Worker worker) { + Set result = new HashSet(); + for (ICriterionType criterionType : laboralRelatedTypes) { + result.addAll(worker.getSatisfactionsFor(criterionType)); + } + return result; + + } } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_addWorkRelationship.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_addWorkRelationship.zul new file mode 100644 index 000000000..ddfa9b78e --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_addWorkRelationship.zul @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + \ 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 343413d2b..0d6e200e4 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul @@ -8,6 +8,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 cd4187039..d26d2c142 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 @@ -31,7 +31,7 @@ public class WorkerCRUDControllerTest { private Window listWindow; private Window editWindow; private Window workRelationshipsWindow; - + private Window addWorkRelationshipWindow; private WorkerCRUDController createControllerForModel( IWorkerModel workerModel) { return createControllerForModel(workerModel, null); @@ -43,11 +43,13 @@ public class WorkerCRUDControllerTest { listWindow = createNiceMock(Window.class); editWindow = createNiceMock(Window.class); workRelationshipsWindow = createNiceMock(Window.class); + addWorkRelationshipWindow = createNiceMock(Window.class); WorkerCRUDController workerCRUDController = new WorkerCRUDController( createWindow, listWindow, editWindow, workRelationshipsWindow, - workerModel, messages); + addWorkRelationshipWindow, workerModel, messages); return workerCRUDController; + } @@ -59,7 +61,8 @@ public class WorkerCRUDControllerTest { WorkerCRUDController workerCRUDController = createControllerForModel( workerModel, messagesForUser); - replay(createWindow, listWindow, editWindow, workRelationshipsWindow); + replay(createWindow, listWindow, editWindow, workRelationshipsWindow, + addWorkRelationshipWindow); // expectations workerModel.prepareForCreate(); expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes(); @@ -76,7 +79,6 @@ public class WorkerCRUDControllerTest { // verify verify(workerModel, messagesForUser); } - @Test public void testGoToSaveAndThenCancel() { IWorkerModel workerModel = createMock(IWorkerModel.class); @@ -89,7 +91,9 @@ public class WorkerCRUDControllerTest { expect(createWindow.setVisible(false)).andReturn(true); expect(listWindow.setVisible(true)).andReturn(false); expect(workRelationshipsWindow.setVisible(true)).andReturn(false); - replay(createWindow, listWindow, editWindow, workRelationshipsWindow, workerModel); + expect(addWorkRelationshipWindow.setVisible(true)).andReturn(false); + replay(createWindow, listWindow, editWindow, workRelationshipsWindow, + addWorkRelationshipWindow, workerModel); // actions workerCRUDController.goToCreateForm(); workerCRUDController.cancel(); @@ -115,7 +119,7 @@ public class WorkerCRUDControllerTest { workerModel.save(); messagesForUser.showMessage(same(Level.INFO), isA(String.class)); replay(createWindow, listWindow, editWindow, workRelationshipsWindow, - workerModel, messagesForUser); + addWorkRelationshipWindow, workerModel, messagesForUser); // perform actions List workers = workerCRUDController.getWorkers(); assertEquals(workersToReturn, workers);