From ef85e837946c711bc894984b1d804ce5df86be00 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Wed, 3 Jun 2009 12:31:44 +0200 Subject: [PATCH] ItEr11S07HistoriaLaboralTraballadorItEr10S07: Refactorization of edition and creation of worker history entries Added delete and edit buttons to worker history list entries Pending of a new approach to inisialization of empty criterionSatisfactions Javier Moran Rua : Deleted comment lines --- .../entities/CriterionSatisfaction.java | 8 +- .../business/resources/entities/Resource.java | 32 +++---- .../services/impl/CriterionServiceImpl.java | 2 +- .../worker/WorkRelationshipsController.java | 94 ++++++++++++++----- .../worker/WorkerCRUDController.java | 41 +++++++- .../WorkOrganizationController.java | 19 +++- ...tionship.zul => _editWorkRelationship.zul} | 16 ++-- .../main/webapp/resources/worker/_edition.zul | 10 +- .../resources/worker/_workRelationships.zul | 26 ++--- .../main/webapp/resources/worker/worker.zul | 14 ++- .../webapp/workorders/workorganization.zul | 33 +++---- .../resources/WorkerCRUDControllerTest.java | 11 ++- 12 files changed, 211 insertions(+), 95 deletions(-) rename navalplanner-webapp/src/main/webapp/resources/worker/{_addWorkRelationship.zul => _editWorkRelationship.zul} (57%) 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 0ed4278be..40ab932f9 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 @@ -3,6 +3,9 @@ package org.navalplanner.business.resources.entities; import java.util.Date; import org.apache.commons.lang.Validate; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.resources.daos.ICriterionSatisfactionDAO; +import org.springframework.beans.factory.annotation.Autowired; /** * Declares a interval of time in which the criterion is satisfied
@@ -15,6 +18,10 @@ public class CriterionSatisfaction { @SuppressWarnings("unused") private long version; + @Autowired + private ICriterionSatisfactionDAO criterionSatisfactionDAO; + + /** * Required by hibernate. Do not use directly */ @@ -99,5 +106,4 @@ public class CriterionSatisfaction { startDate = date; } - } 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 993bb1758..0b2735645 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 @@ -20,7 +20,6 @@ import org.navalplanner.business.resources.daos.ResourcesDaoRegistry; // child another simple resource, general methods like getChilds() do not make // sense for simple entities, etc.). In consequence, I prefer the modeling // option shown below. - /** * This class acts as the base class for all resources. * @author Fernando Bellas Permuy @@ -28,9 +27,7 @@ import org.navalplanner.business.resources.daos.ResourcesDaoRegistry; public abstract class Resource { private Long id; - private long version; - private Set criterionSatisfactions = new HashSet(); public Long getId() { @@ -119,9 +116,7 @@ public abstract class Resource { Collection satisfactionsFor = getSatisfactionsFor(criterionType); ArrayList result = new ArrayList(); for (CriterionSatisfaction criterionSatisfaction : satisfactionsFor) { - if (end == null && criterionSatisfaction.isActiveAt(start) - || end != null - && criterionSatisfaction.isActiveIn(start, end)) { + if (end == null && criterionSatisfaction.isActiveAt(start) || end != null && criterionSatisfaction.isActiveIn(start, end)) { result.add(criterionSatisfaction); } } @@ -184,8 +179,9 @@ public abstract class Resource { CriterionSatisfaction newSatisfaction = new CriterionSatisfaction( start, criterion, this); criterionSatisfactions.add(newSatisfaction); - if (finish != null) + if (finish != null) { newSatisfaction.finish(finish); + } if (!type.allowMultipleActiveCriterionsPerResource()) { for (CriterionSatisfaction criterionSatisfaction : getActiveSatisfactionsAt( type, start)) { @@ -211,8 +207,9 @@ public abstract class Resource { Set posterior) { Date earliest = null; for (CriterionSatisfaction criterionSatisfaction : posterior) { - if (earliest == null) + if (earliest == null) { earliest = criterionSatisfaction.getStartDate(); + } earliest = Collections.min(Arrays.asList(earliest, criterionSatisfaction.getStartDate())); } @@ -222,16 +219,14 @@ public abstract class Resource { private Set getSatisfactionsPosteriorTo( ICriterionType type, CriterionSatisfaction newSatisfaction) { Date start = newSatisfaction.getStartDate(); - Date finish = newSatisfaction.isFinished() ? newSatisfaction - .getEndDate() : null; + Date finish = newSatisfaction.isFinished() ? newSatisfaction.getEndDate() : null; Set posterior = new HashSet(); if (finish != null) { posterior.addAll(getActiveSatisfactionsAt(type, finish)); } else { ArrayList result = new ArrayList(); for (CriterionSatisfaction satisfaction : getSatisfactionsFor(type)) { - if (!satisfaction.isFinished() - && satisfaction.getStartDate().after(start)) { + if (!satisfaction.isFinished() && satisfaction.getStartDate().after(start)) { result.add(satisfaction); } } @@ -242,8 +237,7 @@ public abstract class Resource { } public void deactivate(CriterionWithItsType criterionWithItsType) { - for (CriterionSatisfaction criterionSatisfaction : getActiveSatisfactionsFor(criterionWithItsType - .getCriterion())) { + for (CriterionSatisfaction criterionSatisfaction : getActiveSatisfactionsFor(criterionWithItsType.getCriterion())) { criterionSatisfaction.finish(new Date()); } } @@ -268,9 +262,13 @@ public abstract class Resource { public boolean canBeActivated(CriterionWithItsType criterionWithItsType, Date start, Date finish) { ICriterionType type = criterionWithItsType.getType(); - return type.criterionCanBeRelatedTo(getClass()) - && (type.allowMultipleActiveCriterionsPerResource() || noneOf( - criterionWithItsType, start, finish)); + return type.criterionCanBeRelatedTo(getClass()) && (type.allowMultipleActiveCriterionsPerResource() || noneOf( + criterionWithItsType, start, finish)); + } + + public void removeCriterionSatisfaction(CriterionSatisfaction satisfaction) + throws InstanceNotFoundException { + criterionSatisfactions.remove(satisfaction); } } 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 3b232c708..a0e0f8794 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 @@ -190,7 +190,7 @@ public class CriterionServiceImpl implements CriterionService { @Override public Criterion load(Criterion criterion) { try { - return criterionDAO.find(criterion.getId()); + return criterionDAO.find(criterion); } catch (InstanceNotFoundException e) { throw new RuntimeException(e); } 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 61302a13e..a1b7f8f40 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,13 +1,18 @@ package org.navalplanner.web.resources.worker; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.CriterionWithItsType; @@ -25,25 +30,32 @@ import org.zkoss.zul.Listbox; public class WorkRelationshipsController extends GenericForwardComposer { private IWorkerModel workerModel; + private WorkerCRUDController workerCRUDController; - private CriterionSatisfaction newRelationship = new CriterionSatisfaction(); + +/* private CriterionSatisfaction newRelationship = new CriterionSatisfaction(); */ + + private CriterionSatisfaction editRelationship = new CriterionSatisfaction(); + private Collection workCriterions; + private Listbox selectedWorkCriterion; - private Datebox newWorkRelationshipStartDate; - private Datebox newWorkRelationshipEndDate; + +/* 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(); + Map, Collection> map = + workerModel.getLaboralRelatedCriterions(); this.fromCriterionToType = new HashMap(); - for (Entry, Collection> entry : map - .entrySet()) { + for (Entry, Collection> entry : map.entrySet()) { this.workCriterions.addAll(entry.getValue()); for (Criterion criterion : entry.getValue()) { this.fromCriterionToType.put(criterion, @@ -56,34 +68,64 @@ public class WorkRelationshipsController extends GenericForwardComposer { if (this.workerCRUDController.getWorker() == null) { return new HashSet(); } else { - // Obtain just workRelationshipSatisfactions - return workerModel - .getLaboralRelatedCriterionSatisfactions(this.workerCRUDController - .getWorker()); + return workerModel.getLaboralRelatedCriterionSatisfactions( + this.workerCRUDController.getWorker()); } } - public void addCriterionSatisfaction() { + public void deleteCriterionSatisfaction(CriterionSatisfaction satisfaction) + throws InstanceNotFoundException { + workerCRUDController.getWorker().removeCriterionSatisfaction(satisfaction); + this.workerCRUDController.goToEditForm(); + } - Criterion selectedCriterion = (Criterion) selectedWorkCriterion - .getSelectedItem().getValue(); - CriterionWithItsType criterionWithItsType = fromCriterionToType - .get(selectedCriterion); - if (newWorkRelationshipEndDate == null) { + public void setEditCriterionSatisfaction(CriterionSatisfaction crit) { + // the component should be preselected. + this.editRelationship = crit; + } + + public void saveCriterionSatisfaction() throws InstanceNotFoundException { + + // Add new criterion + Criterion selectedCriterion = (Criterion) selectedWorkCriterion.getSelectedItem().getValue(); + CriterionWithItsType criterionWithItsType = fromCriterionToType.get(selectedCriterion); + System.out.println( "SAVE!!: " + selectedCriterion.getName() ); + + if (editRelationship.getStartDate() == null) { this.workerCRUDController.getWorker().activate( criterionWithItsType, - newWorkRelationshipStartDate.getValue()); + editRelationship.getStartDate()); } else { this.workerCRUDController.getWorker().activate( criterionWithItsType, - newWorkRelationshipStartDate.getValue(), - newWorkRelationshipEndDate.getValue()); + editRelationship.getStartDate(), + editRelationship.getEndDate()); } - this.workerCRUDController - .goToWorkRelationshipsForm(this.workerCRUDController - .getWorker()); + // Delete the former one + workerCRUDController.getWorker(). + removeCriterionSatisfaction(this.editRelationship); + this.workerCRUDController.goToEditForm(); + } + + public void addCriterionSatisfaction() { + Criterion selectedCriterion = (Criterion) selectedWorkCriterion.getSelectedItem().getValue(); + CriterionWithItsType criterionWithItsType = fromCriterionToType.get(selectedCriterion); + // never accessed: Unnecesary as edition does this. + System.out.println( "SELECTED: " + criterionWithItsType.toString() ); + + if (editRelationship.getStartDate() == null) { + this.workerCRUDController.getWorker().activate( + criterionWithItsType, + editRelationship.getStartDate()); + } else { + this.workerCRUDController.getWorker().activate( + criterionWithItsType, + editRelationship.getStartDate(), + editRelationship.getEndDate()); + } + this.workerCRUDController.goToEditForm(); } @Override @@ -92,8 +134,8 @@ public class WorkRelationshipsController extends GenericForwardComposer { this.selectedWorkCriterion.setSelectedIndex(0); } - public CriterionSatisfaction getNewRelationship() { - return this.newRelationship; + public CriterionSatisfaction getEditRelationship() { + return this.editRelationship; } public Collection getWorkCriterions() { 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 8f583b04b..5839fefa2 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 @@ -1,10 +1,18 @@ package org.navalplanner.web.resources.worker; +import java.util.Date; import java.util.List; 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.CriterionTypeBase; +import org.navalplanner.business.resources.entities.CriterionWithItsType; +import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.business.resources.entities.WorkingRelationship; +import org.navalplanner.business.resources.services.CriterionService; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.IRedirectorRegistry; import org.navalplanner.web.common.Level; @@ -33,6 +41,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements private Window addWorkRelationshipWindow; + private Window editWorkRelationshipWindow; + private IWorkerModel workerModel; private IRedirectorRegistry redirectorRegistry; @@ -43,24 +53,27 @@ public class WorkerCRUDController extends GenericForwardComposer implements private Component messagesContainer; - private GenericForwardComposer workRelationship; + private WorkRelationshipsController workRelationship; private LocalizationsController localizationsForEditionController; private LocalizationsController localizationsForCreationController; + private CriterionService criterionService; + public WorkerCRUDController() { } public WorkerCRUDController(Window createWindow, Window listWindow, Window editWindow, Window workRelationshipsWindow, - Window addWorkRelationshipWindow, + Window addWorkRelationshipWindow, Window editWorkRelationshipWindow, IWorkerModel workerModel, IMessagesForUser messages) { this.createWindow = createWindow; this.listWindow = listWindow; this.editWindow = editWindow; this.workRelationshipsWindow = workRelationshipsWindow; this.addWorkRelationshipWindow = addWorkRelationshipWindow; + this.editWorkRelationshipWindow = editWorkRelationshipWindow; this.workerModel = workerModel; this.messages = messages; } @@ -118,8 +131,24 @@ public class WorkerCRUDController extends GenericForwardComposer implements } public void goToAddWorkRelationshipForm() { + Criterion selectedCriterion = criterionService.load( + WorkingRelationship.HIRED.criterion()); + CriterionWithItsType criteriontype = new CriterionWithItsType( + PredefinedCriterionTypes.WORK_RELATIONSHIP, selectedCriterion); + this.workerModel.getWorker().activate(criteriontype,new Date()); + /* CriterionSatisfaction newSatisfaction = + new CriterionSatisfaction( + new Date(), + selectedCriterion, + this.workerModel.getWorker()); */ + CriterionSatisfaction newSatisfaction = + this.workerModel.getWorker(). + getActiveSatisfactionsFor(selectedCriterion).iterator().next(); + this.workRelationship.setEditCriterionSatisfaction(newSatisfaction); getVisibility().showOnly(addWorkRelationshipWindow); Util.reloadBindings(addWorkRelationshipWindow); +// getVisibility().showOnly(editWorkRelationshipWindow); +// Util.reloadBindings(editWorkRelationshipWindow); } public void goToCreateForm() { @@ -128,6 +157,12 @@ public class WorkerCRUDController extends GenericForwardComposer implements Util.reloadBindings(createWindow); } + public void goToEditWorkRelationshipForm(CriterionSatisfaction satisfaction) { + this.workRelationship.setEditCriterionSatisfaction(satisfaction); + getVisibility().showOnly(editWorkRelationshipWindow); + Util.reloadBindings(editWorkRelationshipWindow); + } + @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); @@ -163,7 +198,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements if (visibility == null) { visibility = new OnlyOneVisible(listWindow, editWindow, createWindow, workRelationshipsWindow, - addWorkRelationshipWindow ); + addWorkRelationshipWindow, editWorkRelationshipWindow ); } return visibility; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workorders/WorkOrganizationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workorders/WorkOrganizationController.java index c08de5981..cd89eb48b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/workorders/WorkOrganizationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workorders/WorkOrganizationController.java @@ -1,7 +1,10 @@ package org.navalplanner.web.workorders; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.util.GenericForwardComposer; - +import org.zkoss.zul.Treecell; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.Treerow; /** * Controller for {@link WorkOrganization} view of WorkOrder entitites
@@ -12,4 +15,16 @@ public class WorkOrganizationController extends GenericForwardComposer { public WorkOrganizationController() { } -} + public void move(Component self, Component dragged) { + + Treeitem elem = new Treeitem("Elemento"); + //elem.appendChild(dragged); + self.appendChild(elem); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + comp.setVariable("controller", this, true); + } + +} \ 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/_editWorkRelationship.zul similarity index 57% rename from navalplanner-webapp/src/main/webapp/resources/worker/_addWorkRelationship.zul rename to navalplanner-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul index ddfa9b78e..71bfa62d4 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/_addWorkRelationship.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul @@ -1,6 +1,6 @@ - + @@ -8,10 +8,10 @@ - - - - + + - diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul index 792622a77..5b967acf0 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_workRelationships.zul @@ -1,30 +1,34 @@ - - - + + + - - - - diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul index 0d6e200e4..97b29da1b 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul @@ -8,7 +8,8 @@ - + + - + + + + diff --git a/navalplanner-webapp/src/main/webapp/workorders/workorganization.zul b/navalplanner-webapp/src/main/webapp/workorders/workorganization.zul index 20e38712a..246bcf991 100644 --- a/navalplanner-webapp/src/main/webapp/workorders/workorganization.zul +++ b/navalplanner-webapp/src/main/webapp/workorders/workorganization.zul @@ -8,15 +8,15 @@ - - + - + @@ -26,15 +26,15 @@ - + - (calculated) hours + --- hours - + @@ -48,29 +48,30 @@ - + - + - - - - - - - - + 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 d26d2c142..c21dff6fe 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 @@ -32,6 +32,7 @@ public class WorkerCRUDControllerTest { private Window editWindow; private Window workRelationshipsWindow; private Window addWorkRelationshipWindow; + private Window editWorkRelationshipWindow; private WorkerCRUDController createControllerForModel( IWorkerModel workerModel) { return createControllerForModel(workerModel, null); @@ -44,10 +45,11 @@ public class WorkerCRUDControllerTest { editWindow = createNiceMock(Window.class); workRelationshipsWindow = createNiceMock(Window.class); addWorkRelationshipWindow = createNiceMock(Window.class); + editWorkRelationshipWindow = createNiceMock(Window.class); WorkerCRUDController workerCRUDController = new WorkerCRUDController( createWindow, listWindow, editWindow, workRelationshipsWindow, - addWorkRelationshipWindow, workerModel, messages); + addWorkRelationshipWindow, editWorkRelationshipWindow ,workerModel, messages); return workerCRUDController; } @@ -62,7 +64,7 @@ public class WorkerCRUDControllerTest { WorkerCRUDController workerCRUDController = createControllerForModel( workerModel, messagesForUser); replay(createWindow, listWindow, editWindow, workRelationshipsWindow, - addWorkRelationshipWindow); + addWorkRelationshipWindow, editWorkRelationshipWindow); // expectations workerModel.prepareForCreate(); expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes(); @@ -93,7 +95,7 @@ public class WorkerCRUDControllerTest { expect(workRelationshipsWindow.setVisible(true)).andReturn(false); expect(addWorkRelationshipWindow.setVisible(true)).andReturn(false); replay(createWindow, listWindow, editWindow, workRelationshipsWindow, - addWorkRelationshipWindow, workerModel); + addWorkRelationshipWindow, editWorkRelationshipWindow, workerModel); // actions workerCRUDController.goToCreateForm(); workerCRUDController.cancel(); @@ -119,7 +121,8 @@ public class WorkerCRUDControllerTest { workerModel.save(); messagesForUser.showMessage(same(Level.INFO), isA(String.class)); replay(createWindow, listWindow, editWindow, workRelationshipsWindow, - addWorkRelationshipWindow, workerModel, messagesForUser); + addWorkRelationshipWindow, editWorkRelationshipWindow, + workerModel, messagesForUser); // perform actions List workers = workerCRUDController.getWorkers(); assertEquals(workersToReturn, workers);