ItEr22S08CUAltaCalendarioLaboralItEr21S10: Allowing to change the parent when creating or editing a derived calendar. Creating a new version when a calendar is edited.

This commit is contained in:
Manuel Rego Casasnovas 2009-08-20 10:00:25 +02:00 committed by Óscar González Fernández
parent 36d251e730
commit cd5a88b405
6 changed files with 189 additions and 30 deletions

View file

@ -136,6 +136,27 @@ public class BaseCalendar extends BaseEntity implements IValidable {
return expiringDate;
}
public void setExpiringDate(Date expiringDate)
throws UnsupportedOperationException, IllegalArgumentException {
setExpiringDate(new LocalDate(expiringDate));
}
public void setExpiringDate(LocalDate expiringDate)
throws UnsupportedOperationException, IllegalArgumentException {
if (nextCalendar == null) {
throw new UnsupportedOperationException(
"Can not set the expiring date "
+ "because of it does not have a next calendar");
}
if (previousCalendar != null) {
if (previousCalendar.getExpiringDate().compareTo(expiringDate) <= 0) {
throw new IllegalArgumentException(
"Expering date must be greater than expiring date of previous calendars");
}
}
this.expiringDate = expiringDate;
}
public Set<ExceptionDay> getOwnExceptions() {
return Collections.unmodifiableSet(exceptions);
}
@ -219,6 +240,12 @@ public class BaseCalendar extends BaseEntity implements IValidable {
}
public ExceptionDay getOwnExceptionDay(LocalDate date) {
if (shouldUsePreviousCalendar(date)) {
return previousCalendar.getOwnExceptionDay(date);
} else if (shouldUseNextCalendar(date)) {
return nextCalendar.getOwnExceptionDay(date);
}
for (ExceptionDay exceptionDay : exceptions) {
if (exceptionDay.getDate().equals(date)) {
return exceptionDay;
@ -233,6 +260,12 @@ public class BaseCalendar extends BaseEntity implements IValidable {
}
public ExceptionDay getExceptionDay(LocalDate date) {
if (shouldUsePreviousCalendar(date)) {
return previousCalendar.getExceptionDay(date);
} else if (shouldUseNextCalendar(date)) {
return nextCalendar.getExceptionDay(date);
}
for (ExceptionDay exceptionDay : getExceptions()) {
if (exceptionDay.getDate().equals(date)) {
return exceptionDay;
@ -438,7 +471,7 @@ public class BaseCalendar extends BaseEntity implements IValidable {
public DayType getType(LocalDate date) {
ExceptionDay exceptionDay = getExceptionDay(date);
if (exceptionDay != null) {
if (exceptions.contains(exceptionDay)) {
if (getOwnExceptionDay(date) != null) {
return DayType.OWN_EXCEPTION;
}
return DayType.ANCESTOR_EXCEPTION;

View file

@ -83,9 +83,9 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
public void goToEditForm(BaseCalendar baseCalendar) {
baseCalendarModel.initEdit(baseCalendar);
if (baseCalendarModel.isDerived()) {
markSelecedParentCombo();
prepareParentCombo();
}
selectDay(new Date());
setSelectedDay(new Date());
getVisibility().showOnly(editWindow);
Util.reloadBindings(editWindow);
}
@ -149,7 +149,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
public void goToCreateForm() {
baseCalendarModel.initCreate();
selectDay(new Date());
setSelectedDay(new Date());
getVisibility().showOnly(createWindow);
Util.reloadBindings(createWindow);
}
@ -162,12 +162,20 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
return visibility;
}
public void selectDay(Date date) {
baseCalendarModel.selectDay(date);
public void setSelectedDay(Date date) {
baseCalendarModel.setSelectedDay(date);
reloadCurrentWindow();
}
public Date getSelectedDay() {
Date selectedDay = baseCalendarModel.getSelectedDay();
if (selectedDay == null) {
return new Date();
}
return selectedDay;
}
public String getTypeOfDay() {
DayType typeOfDay = baseCalendarModel.getTypeOfDay();
if (typeOfDay == null) {
@ -307,14 +315,14 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
public void goToCreateDerivedForm(BaseCalendar baseCalendar) {
baseCalendarModel.initCreateDerived(baseCalendar);
if (baseCalendarModel.isDerived()) {
markSelecedParentCombo();
prepareParentCombo();
}
selectDay(new Date());
setSelectedDay(new Date());
getVisibility().showOnly(createWindow);
Util.reloadBindings(createWindow);
}
private void markSelecedParentCombo() {
private void prepareParentCombo() {
Combobox parentCalendars;
if (baseCalendarModel.isEditing()) {
parentCalendars = (Combobox) editWindow
@ -324,6 +332,11 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
.getFellow("parentCalendars");
}
markSelectedParentCombo(parentCalendars);
addListenerParentCombo(parentCalendars);
}
private void markSelectedParentCombo(final Combobox parentCalendars) {
BaseCalendar parent = baseCalendarModel.getParent();
List<BaseCalendar> possibleParentCalendars = getParentCalendars();
@ -336,6 +349,21 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
}
}
private void addListenerParentCombo(final Combobox parentCalendars) {
parentCalendars.addEventListener(Events.ON_SELECT, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
BaseCalendar selected = (BaseCalendar) parentCalendars
.getSelectedItem()
.getValue();
baseCalendarModel.setParent(selected);
reloadCurrentWindow();
}
});
}
public boolean isDerived() {
return baseCalendarModel.isDerived();
}
@ -351,4 +379,20 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
return baseCalendarModel.getPossibleParentCalendars();
}
public boolean isEditing() {
return baseCalendarModel.isEditing();
}
public Date getExpiringDate() {
return baseCalendarModel.getExpiringDate();
}
public void setExpiringDate(Date date) {
try {
baseCalendarModel.setExpiringDate(date);
} catch (IllegalArgumentException e) {
;
}
}
}

View file

@ -6,6 +6,7 @@ import java.util.List;
import org.apache.commons.lang.Validate;
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
import org.joda.time.LocalDate;
import org.navalplanner.business.calendars.daos.IBaseCalendarDAO;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.calendars.entities.ExceptionDay;
@ -52,7 +53,7 @@ public class BaseCalendarModel implements IBaseCalendarModel {
@Override
@Transactional(readOnly = true)
public List<BaseCalendar> getBaseCalendars() {
return baseCalendarDAO.getBaseCalendars();
return baseCalendarDAO.findLastVersions();
}
@ -72,8 +73,8 @@ public class BaseCalendarModel implements IBaseCalendarModel {
editing = true;
Validate.notNull(baseCalendar);
this.baseCalendar = getFromDB(baseCalendar);
forceLoadExceptionDays(this.baseCalendar);
this.baseCalendar = getFromDB(baseCalendar).newVersion();
forceLoadHoursPerDayAndExceptionDays(this.baseCalendar);
}
@Override
@ -83,7 +84,7 @@ public class BaseCalendarModel implements IBaseCalendarModel {
Validate.notNull(baseCalendar);
this.baseCalendar = getFromDB(baseCalendar).newDerivedCalendar();
forceLoadExceptionDays(this.baseCalendar);
forceLoadHoursPerDayAndExceptionDays(this.baseCalendar);
}
@Override
@ -91,17 +92,37 @@ public class BaseCalendarModel implements IBaseCalendarModel {
this.baseCalendar = baseCalendar;
}
private void forceLoadExceptionDays(BaseCalendar baseCalendar) {
if (baseCalendar == null) {
return;
}
private void forceLoadHoursPerDayAndExceptionDays(BaseCalendar baseCalendar) {
forceLoadHoursPerDayAndExceptionDaysBasic(baseCalendar);
forceLoadHoursPerDayAndExceptionDaysPrevious(baseCalendar);
forceLoadHoursPerDayAndExceptionDaysNext(baseCalendar);
}
private void forceLoadHoursPerDayAndExceptionDaysBasic(BaseCalendar baseCalendar) {
baseCalendar.getHoursPerDay().size();
baseCalendar.getExceptions().size();
forceLoadExceptionDays(baseCalendar.getParent());
forceLoadExceptionDays(baseCalendar.getPreviousCalendar());
forceLoadExceptionDays(baseCalendar.getNextCalendar());
if (baseCalendar.getParent() != null) {
forceLoadHoursPerDayAndExceptionDaysBasic(baseCalendar.getParent());
}
}
private void forceLoadHoursPerDayAndExceptionDaysPrevious(
BaseCalendar baseCalendar) {
if (baseCalendar.getPreviousCalendar() != null) {
forceLoadHoursPerDayAndExceptionDaysBasic(baseCalendar.getPreviousCalendar());
forceLoadHoursPerDayAndExceptionDaysPrevious(baseCalendar
.getPreviousCalendar());
}
}
private void forceLoadHoursPerDayAndExceptionDaysNext(
BaseCalendar baseCalendar) {
if (baseCalendar.getNextCalendar() != null) {
forceLoadHoursPerDayAndExceptionDaysBasic(baseCalendar.getNextCalendar());
forceLoadHoursPerDayAndExceptionDaysNext(baseCalendar
.getNextCalendar());
}
}
@Transactional(readOnly = true)
@ -121,13 +142,21 @@ public class BaseCalendarModel implements IBaseCalendarModel {
@Override
@Transactional(readOnly = true)
public List<BaseCalendar> getPossibleParentCalendars() {
List<BaseCalendar> baseCalendars = baseCalendarDAO.getBaseCalendars();
List<BaseCalendar> baseCalendars = getBaseCalendars();
if (baseCalendar != null) {
for (BaseCalendar calendar : baseCalendars) {
if (calendar.getId().equals(baseCalendar.getId())) {
baseCalendars.remove(calendar);
break;
if (isEditing()) {
if (calendar.getId().equals(
baseCalendar.getPreviousCalendar().getId())) {
baseCalendars.remove(calendar);
break;
}
} else {
if (calendar.getId().equals(baseCalendar.getId())) {
baseCalendars.remove(calendar);
break;
}
}
}
}
@ -150,10 +179,15 @@ public class BaseCalendarModel implements IBaseCalendarModel {
}
@Override
public void selectDay(Date date) {
public void setSelectedDay(Date date) {
this.selectedDate = date;
}
@Override
public Date getSelectedDay() {
return this.selectedDate;
}
@Override
@Transactional(readOnly = true)
public Integer getHoursOfDay() {
@ -257,6 +291,21 @@ public class BaseCalendarModel implements IBaseCalendarModel {
return baseCalendar.getParent();
}
@Override
@Transactional(readOnly = true)
public void setParent(BaseCalendar parent) {
try {
parent = baseCalendarDAO.find(parent.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
forceLoadHoursPerDayAndExceptionDays(parent);
if (baseCalendar != null) {
baseCalendar.setParent(parent);
}
}
@Override
@Transactional(readOnly = true)
public boolean isParent() {
@ -267,6 +316,26 @@ public class BaseCalendarModel implements IBaseCalendarModel {
return !baseCalendarDAO.findByParent(baseCalendar).isEmpty();
}
@Override
public Date getExpiringDate() {
if ((baseCalendar != null)
&& (baseCalendar.getPreviousCalendar() != null)) {
LocalDate expiringDate = baseCalendar.getPreviousCalendar()
.getExpiringDate();
return expiringDate.toDateTimeAtStartOfDay().toDate();
}
return null;
}
@Override
public void setExpiringDate(Date date) {
if ((baseCalendar != null)
&& (baseCalendar.getPreviousCalendar() != null)) {
baseCalendar.getPreviousCalendar().setExpiringDate(date);
}
}
/*
* Final conversation steps
*/

View file

@ -65,7 +65,9 @@ public interface IBaseCalendarModel {
boolean isEditing();
void selectDay(Date date);
void setSelectedDay(Date date);
Date getSelectedDay();
DayType getTypeOfDay();
@ -93,8 +95,14 @@ public interface IBaseCalendarModel {
BaseCalendar getParent();
void setParent(BaseCalendar parent);
boolean isParent();
Date getExpiringDate();
void setExpiringDate(Date date);
/*
* Final conversation steps
*/

View file

@ -37,8 +37,7 @@
</vbox>
<vbox id="dayInformation">
<calendar id="calendarWidget"
onChange="controller.selectDay(calendarWidget.value);" />
<calendar id="calendarWidget" value="@{controller.selectedDay}" />
<hbox>
<label value="Type of day" />
@ -64,6 +63,11 @@
</hbox>
<hbox visible="@{controller.isEditing}">
<label value="Valid from" />
<datebox value="@{controller.expiringDate}" />
</hbox>
<hbox>
<button onClick="controller.save();"
label="${arg.save_button_label}" />

View file

@ -67,12 +67,13 @@ public class BaseCalendarModelTest {
BaseCalendar baseCalendar = baseCalendarModel.getBaseCalendars().get(0);
baseCalendarModel.initEdit(baseCalendar);
setHours(baseCalendar, 4);
setHours(baseCalendarModel.getBaseCalendar(), 4);
try {
baseCalendarModel.confirmSave();
assertThat(baseCalendarModel.getBaseCalendars().size(), equalTo(1));
assertThat(baseCalendarModel.getBaseCalendars().get(0).getId(),
assertThat(baseCalendarModel.getBaseCalendars().get(0)
.getPreviousCalendar().getId(),
equalTo(baseCalendar.getId()));
assertThat(baseCalendarModel.getBaseCalendars().get(0).getHours(
Days.MONDAY), equalTo(4));