ItEr09S08HistoriaLaboralTraballadorItEr08S11: Creation of new work relationships entries

This commit is contained in:
Lorenzo Tilve 2009-06-01 16:33:48 +02:00 committed by Javier Moran Rua
parent cb6527aa99
commit dc9b8faa86
12 changed files with 195 additions and 20 deletions

View file

@ -11,6 +11,8 @@ import org.navalplanner.business.resources.entities.Criterion;
*/ */
public interface ICriterionDAO extends IGenericDao<Criterion, Long> { public interface ICriterionDAO extends IGenericDao<Criterion, Long> {
public void removeByNameAndType(Criterion criterion);
Criterion findByNameAndType(Criterion criterion); Criterion findByNameAndType(Criterion criterion);
boolean existsByNameAndType(Criterion entity); boolean existsByNameAndType(Criterion entity);

View file

@ -1,5 +1,7 @@
package org.navalplanner.business.resources.daos.impl; package org.navalplanner.business.resources.daos.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
@ -34,4 +36,14 @@ public class CriterionDAO extends GenericDaoHibernate<Criterion, Long>
return result; return result;
} }
@Override
public void removeByNameAndType(Criterion criterion) {
Criterion reloaded = findByNameAndType(criterion);
try {
remove(reloaded.getId());
} catch (InstanceNotFoundException ex) {
throw new RuntimeException(ex);
}
}
} }

View file

@ -45,7 +45,7 @@ public class CriterionSatisfaction {
private Resource resource; private Resource resource;
public Date getStartDate() { public Date getStartDate() {
return new Date(startDate.getTime()); return startDate==null ? null: new Date(startDate.getTime());
} }
public Date getEndDate() { public Date getEndDate() {

View file

@ -48,7 +48,11 @@ public class CriterionServiceImpl implements CriterionService {
} }
public void remove(Criterion criterion) throws InstanceNotFoundException { 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) { public void save(Criterion entity) {

View file

@ -1,10 +1,14 @@
package org.navalplanner.web.resources.worker; package org.navalplanner.web.resources.worker;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import org.navalplanner.business.common.exceptions.ValidationException; 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.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.ICriterionType;
import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.entities.Worker;
/** /**
@ -31,4 +35,9 @@ public interface IWorkerModel {
Worker findResource(long workerId); Worker findResource(long workerId);
Map<ICriterionType<?>, Collection<Criterion>> getLaboralRelatedCriterions();
Set<CriterionSatisfaction> getLaboralRelatedCriterionSatisfactions(
Worker worker);
} }

View file

@ -1,11 +1,22 @@
package org.navalplanner.web.resources.worker; 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.HashSet;
import java.util.Map;
import java.util.Set; 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.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.CriterionWithItsType;
import org.navalplanner.business.resources.entities.ICriterionType;
import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.entities.Worker;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Listbox;
/** /**
* Subcontroller for {@link Worker} resource <br /> * Subcontroller for {@link Worker} resource <br />
@ -15,20 +26,78 @@ public class WorkRelationshipsController extends GenericForwardComposer {
private IWorkerModel workerModel; private IWorkerModel workerModel;
private WorkerCRUDController workerCRUDController; private WorkerCRUDController workerCRUDController;
private CriterionSatisfaction newRelationship = new CriterionSatisfaction();
private Collection<Criterion> workCriterions;
private Listbox selectedWorkCriterion;
private Datebox newWorkRelationshipStartDate;
private Datebox newWorkRelationshipEndDate;
private HashMap<Criterion, CriterionWithItsType> fromCriterionToType;
public WorkRelationshipsController(IWorkerModel workerModel, public WorkRelationshipsController(IWorkerModel workerModel,
WorkerCRUDController workerCRUDController) { WorkerCRUDController workerCRUDController) {
this.workerModel = workerModel; this.workerModel = workerModel;
this.workerCRUDController = workerCRUDController; this.workerCRUDController = workerCRUDController;
this.newRelationship = new CriterionSatisfaction();
this.workCriterions = new ArrayList<Criterion>();
Map<ICriterionType<?>, Collection<Criterion>> map = workerModel
.getLaboralRelatedCriterions();
this.fromCriterionToType = new HashMap<Criterion, CriterionWithItsType>();
for (Entry<ICriterionType<?>, Collection<Criterion>> entry : map
.entrySet()) {
this.workCriterions.addAll(entry.getValue());
for (Criterion criterion : entry.getValue()) {
this.fromCriterionToType.put(criterion,
new CriterionWithItsType(entry.getKey(), criterion));
}
}
} }
public Set<CriterionSatisfaction> getCriterionSatisfactions() { public Set<CriterionSatisfaction> getCriterionSatisfactions() {
if (this.workerCRUDController.getWorker() == null) { if (this.workerCRUDController.getWorker() == null) {
return new HashSet(); return new HashSet<CriterionSatisfaction>();
} else { } else {
// Obtain just workRelationshipSatisfactions
return workerModel return workerModel
.getCriterionSatisfactions(this.workerCRUDController .getLaboralRelatedCriterionSatisfactions(this.workerCRUDController
.getWorker()); .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<Criterion> getWorkCriterions() {
return this.workCriterions;
}
} }

View file

@ -31,6 +31,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements
private Window workRelationshipsWindow; private Window workRelationshipsWindow;
private Window addWorkRelationshipWindow;
private IWorkerModel workerModel; private IWorkerModel workerModel;
private IRedirectorRegistry redirectorRegistry; private IRedirectorRegistry redirectorRegistry;
@ -52,11 +54,13 @@ public class WorkerCRUDController extends GenericForwardComposer implements
public WorkerCRUDController(Window createWindow, Window listWindow, public WorkerCRUDController(Window createWindow, Window listWindow,
Window editWindow, Window workRelationshipsWindow, Window editWindow, Window workRelationshipsWindow,
Window addWorkRelationshipWindow,
IWorkerModel workerModel, IMessagesForUser messages) { IWorkerModel workerModel, IMessagesForUser messages) {
this.createWindow = createWindow; this.createWindow = createWindow;
this.listWindow = listWindow; this.listWindow = listWindow;
this.editWindow = editWindow; this.editWindow = editWindow;
this.workRelationshipsWindow = workRelationshipsWindow; this.workRelationshipsWindow = workRelationshipsWindow;
this.addWorkRelationshipWindow = addWorkRelationshipWindow;
this.workerModel = workerModel; this.workerModel = workerModel;
this.messages = messages; this.messages = messages;
} }
@ -98,18 +102,30 @@ public class WorkerCRUDController extends GenericForwardComposer implements
Util.reloadBindings(editWindow); Util.reloadBindings(editWindow);
} }
public void goToEditForm() {
getVisibility().showOnly(editWindow);
Util.reloadBindings(editWindow);
}
public void goToWorkRelationshipsForm(Worker worker) { public void goToWorkRelationshipsForm(Worker worker) {
getVisibility().showOnly(workRelationshipsWindow); getVisibility().showOnly(workRelationshipsWindow);
Util.reloadBindings(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() { public void goToCreateForm() {
workerModel.prepareForCreate(); workerModel.prepareForCreate();
getVisibility().showOnly(createWindow); getVisibility().showOnly(createWindow);
Util.reloadBindings(createWindow); Util.reloadBindings(createWindow);
this.workRelationship = new WorkRelationshipsController(
this.workerModel, this);
} }
@Override @Override
@ -124,6 +140,10 @@ public class WorkerCRUDController extends GenericForwardComposer implements
if (messagesContainer == null) if (messagesContainer == null)
throw new RuntimeException("messagesContainer is needed"); throw new RuntimeException("messagesContainer is needed");
messages = new MessagesForUser(messagesContainer); messages = new MessagesForUser(messagesContainer);
this.workRelationship =
new WorkRelationshipsController(this.workerModel,this);
this.workRelationship.doAfterCompose(
comp.getFellow("addWorkRelationshipWindow"));
Redirector<WorkerCRUDLinks> redirector = redirectorRegistry Redirector<WorkerCRUDLinks> redirector = redirectorRegistry
.getRedirectorFor(WorkerCRUDLinks.class); .getRedirectorFor(WorkerCRUDLinks.class);
redirector.applyTo(this); redirector.applyTo(this);
@ -142,7 +162,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements
private OnlyOneVisible getVisibility() { private OnlyOneVisible getVisibility() {
if (visibility == null) { if (visibility == null) {
visibility = new OnlyOneVisible(listWindow, editWindow, visibility = new OnlyOneVisible(listWindow, editWindow,
createWindow, workRelationshipsWindow); createWindow, workRelationshipsWindow,
addWorkRelationshipWindow );
} }
return visibility; return visibility;
} }
@ -151,4 +172,4 @@ public class WorkerCRUDController extends GenericForwardComposer implements
return this.workRelationship; return this.workRelationship;
} }
} }

View file

@ -39,6 +39,9 @@ import org.springframework.transaction.annotation.Transactional;
public class WorkerModel implements IWorkerModel { public class WorkerModel implements IWorkerModel {
private final ResourceService resourceService; private final ResourceService resourceService;
private final ICriterionType<?>[] laboralRelatedTypes = {
PredefinedCriterionTypes.LEAVE,
PredefinedCriterionTypes.WORK_RELATIONSHIP };
private Worker worker; private Worker worker;
private ClassValidator<Worker> workerValidator; private ClassValidator<Worker> workerValidator;
private final CriterionService criterionService; private final CriterionService criterionService;
@ -293,4 +296,24 @@ public class WorkerModel implements IWorkerModel {
} }
} }
@Override
@Transactional(readOnly = true)
public Map<ICriterionType<?>, Collection<Criterion>> getLaboralRelatedCriterions() {
Map<ICriterionType<?>, Collection<Criterion>> result = new HashMap<ICriterionType<?>, Collection<Criterion>>();
for (ICriterionType<?> type : laboralRelatedTypes) {
result.put(type, criterionService.getCriterionsFor(type));
}
return result;
}
@Override
public Set<CriterionSatisfaction> getLaboralRelatedCriterionSatisfactions(
Worker worker) {
Set<CriterionSatisfaction> result = new HashSet<CriterionSatisfaction>();
for (ICriterionType<?> criterionType : laboralRelatedTypes) {
result.addAll(worker.getSatisfactionsFor(criterionType));
}
return result;
}
} }

View file

@ -0,0 +1,28 @@
<window id="${arg.top_id}" title="${arg.title}"
apply="${controller.workRelationshipsController}">
<grid id="history">
<columns>
<column label="Date start"/>
<column label="Date end"/>
<column label="Relationship"/>
</columns>
<rows>
<row>
<datebox id="newWorkRelationshipStartDate" width="150px" />
<!-- value="@{controller.workRelationship.newRelationship.startDate}" -->
<datebox id="newWorkRelationshipEndDate" width="150px" />
<!-- value="@{controller.workRelationship.newRelationship.endDate}" -->
<listbox onSelect="" mold="select" rows="1" id="selectedWorkCriterion"
model="@{controller.workRelationship.workCriterions}">
<listitem self="@{each='workCriterion'}"
label="@{workCriterion.name}"
value="@{workCriterion}" />
</listbox>
</row>
</rows>
</grid>
<button onClick="controller.workRelationship.addCriterionSatisfaction();"
label="Add Work Relationship" />
<button onClick="controller.goToWorkRelationshipsForm()"
label="Cancel and back to Work Relationships"/>
</window>

View file

@ -13,10 +13,7 @@
value="@{criterionSatisfaction}"> value="@{criterionSatisfaction}">
<datebox id="date_start" <datebox id="date_start"
value="@{criterionSatisfaction.startDate}" width="150px" /> value="@{criterionSatisfaction.startDate}" width="150px" />
<!--datebox id="date_start" <!--onChange="controller.goToValidation" -->
value="@{criterionSatisfaction.startDate}"
onChange="controller.goToEditForm();"
width="150px" /-->
<datebox id="date_end" <datebox id="date_end"
value="@{criterionSatisfaction.endDate}" width="150px" /> value="@{criterionSatisfaction.endDate}" width="150px" />
<label value="@{criterionSatisfaction.criterion.name}" /> <label value="@{criterionSatisfaction.criterion.name}" />
@ -26,6 +23,9 @@
<button onClick="controller.save();" label="${arg.save_button_label}" /> <button onClick="controller.save();" label="${arg.save_button_label}" />
<button onClick="controller.cancel();" label="${arg.cancel_button_label}" /> <button onClick="controller.cancel();" label="${arg.cancel_button_label}" />
<button label="Edit personal data" <button label="Edit personal data"
onClick="controller.goToEditForm(controller.worker)"> onClick="controller.goToEditForm()">
</button>
<button label="New entry"
onClick="controller.goToAddWorkRelationshipForm()">
</button> </button>
</window> </window>

View file

@ -8,6 +8,7 @@
<?component name="list" inline="true" macroURI="_list.zul"?> <?component name="list" inline="true" macroURI="_list.zul"?>
<?component name="edition" inline="true" macroURI="_edition.zul"?> <?component name="edition" inline="true" macroURI="_edition.zul"?>
<?component name="workRelationships" inline="true" macroURI="_workRelationships.zul"?> <?component name="workRelationships" inline="true" macroURI="_workRelationships.zul"?>
<?component name="addWorkRelationship" inline="true" macroURI="_addWorkRelationship.zul"?>
<zk> <zk>
<window self="@{define(content)}" <window self="@{define(content)}"
apply="org.navalplanner.web.resources.worker.WorkerCRUDController" apply="org.navalplanner.web.resources.worker.WorkerCRUDController"
@ -21,5 +22,7 @@
save_button_label="Save" cancel_button_label="Cancel" /> save_button_label="Save" cancel_button_label="Cancel" />
<workRelationships top_id="workRelationshipsWindow" title="Work Relationships" <workRelationships top_id="workRelationshipsWindow" title="Work Relationships"
save_button_label="Save" cancel_button_label="Cancel" /> save_button_label="Save" cancel_button_label="Cancel" />
<addWorkRelationship top_id="addWorkRelationshipWindow" title="Add Work Relationship"
save_button_label="Save" cancel_button_label="Cancel" />
</window> </window>
</zk> </zk>

View file

@ -31,7 +31,7 @@ public class WorkerCRUDControllerTest {
private Window listWindow; private Window listWindow;
private Window editWindow; private Window editWindow;
private Window workRelationshipsWindow; private Window workRelationshipsWindow;
private Window addWorkRelationshipWindow;
private WorkerCRUDController createControllerForModel( private WorkerCRUDController createControllerForModel(
IWorkerModel workerModel) { IWorkerModel workerModel) {
return createControllerForModel(workerModel, null); return createControllerForModel(workerModel, null);
@ -43,11 +43,13 @@ public class WorkerCRUDControllerTest {
listWindow = createNiceMock(Window.class); listWindow = createNiceMock(Window.class);
editWindow = createNiceMock(Window.class); editWindow = createNiceMock(Window.class);
workRelationshipsWindow = createNiceMock(Window.class); workRelationshipsWindow = createNiceMock(Window.class);
addWorkRelationshipWindow = createNiceMock(Window.class);
WorkerCRUDController workerCRUDController = new WorkerCRUDController( WorkerCRUDController workerCRUDController = new WorkerCRUDController(
createWindow, listWindow, editWindow, workRelationshipsWindow, createWindow, listWindow, editWindow, workRelationshipsWindow,
workerModel, messages); addWorkRelationshipWindow, workerModel, messages);
return workerCRUDController; return workerCRUDController;
} }
@ -59,7 +61,8 @@ public class WorkerCRUDControllerTest {
WorkerCRUDController workerCRUDController = createControllerForModel( WorkerCRUDController workerCRUDController = createControllerForModel(
workerModel, messagesForUser); workerModel, messagesForUser);
replay(createWindow, listWindow, editWindow, workRelationshipsWindow); replay(createWindow, listWindow, editWindow, workRelationshipsWindow,
addWorkRelationshipWindow);
// expectations // expectations
workerModel.prepareForCreate(); workerModel.prepareForCreate();
expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes(); expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes();
@ -76,7 +79,6 @@ public class WorkerCRUDControllerTest {
// verify // verify
verify(workerModel, messagesForUser); verify(workerModel, messagesForUser);
} }
@Test @Test
public void testGoToSaveAndThenCancel() { public void testGoToSaveAndThenCancel() {
IWorkerModel workerModel = createMock(IWorkerModel.class); IWorkerModel workerModel = createMock(IWorkerModel.class);
@ -89,7 +91,9 @@ public class WorkerCRUDControllerTest {
expect(createWindow.setVisible(false)).andReturn(true); expect(createWindow.setVisible(false)).andReturn(true);
expect(listWindow.setVisible(true)).andReturn(false); expect(listWindow.setVisible(true)).andReturn(false);
expect(workRelationshipsWindow.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 // actions
workerCRUDController.goToCreateForm(); workerCRUDController.goToCreateForm();
workerCRUDController.cancel(); workerCRUDController.cancel();
@ -115,7 +119,7 @@ public class WorkerCRUDControllerTest {
workerModel.save(); workerModel.save();
messagesForUser.showMessage(same(Level.INFO), isA(String.class)); messagesForUser.showMessage(same(Level.INFO), isA(String.class));
replay(createWindow, listWindow, editWindow, workRelationshipsWindow, replay(createWindow, listWindow, editWindow, workRelationshipsWindow,
workerModel, messagesForUser); addWorkRelationshipWindow, workerModel, messagesForUser);
// perform actions // perform actions
List<Worker> workers = workerCRUDController.getWorkers(); List<Worker> workers = workerCRUDController.getWorkers();
assertEquals(workersToReturn, workers); assertEquals(workersToReturn, workers);