ItEr23S08CUEdicionCalendarioLaboral: Adding history information.

This commit is contained in:
Manuel Rego Casasnovas 2009-08-25 10:20:04 +02:00 committed by Óscar González Fernández
parent 13a2c399fa
commit f5ab5b66f8
7 changed files with 281 additions and 64 deletions

View file

@ -149,7 +149,7 @@ public class BaseCalendar extends BaseEntity implements IValidable {
+ "because of it does not have a next calendar");
}
if (previousCalendar != null) {
if (previousCalendar.getExpiringDate().compareTo(expiringDate) <= 0) {
if (expiringDate.compareTo(previousCalendar.getExpiringDate()) <= 0) {
throw new IllegalArgumentException(
"Expering date must be greater than expiring date of previous calendars");
}
@ -417,7 +417,7 @@ public class BaseCalendar extends BaseEntity implements IValidable {
* It makes that the current calendar expires in the current date. And the
* new calendar will be used from now onwards.
*/
public BaseCalendar newVersion() {
public BaseCalendar newVersion() throws IllegalArgumentException {
return newVersion(new LocalDate());
}
@ -426,7 +426,7 @@ public class BaseCalendar extends BaseEntity implements IValidable {
* It makes that the current calendar expires in the specific date. And the
* new calendar will be used from that date onwards.
*/
public BaseCalendar newVersion(Date date) {
public BaseCalendar newVersion(Date date) throws IllegalArgumentException {
return newVersion(new LocalDate(date));
}
@ -435,11 +435,19 @@ public class BaseCalendar extends BaseEntity implements IValidable {
* It makes that the current calendar expires in the specific date. And the
* new calendar will be used from that date onwards.
*/
public BaseCalendar newVersion(LocalDate date) {
public BaseCalendar newVersion(LocalDate date)
throws IllegalArgumentException {
if (nextCalendar != null) {
nextCalendar.newVersion(date);
}
if (previousCalendar != null) {
if (date.compareTo(previousCalendar.getExpiringDate()) <= 0) {
throw new IllegalArgumentException(
"Version date must be greater than expiring date of previous calendars");
}
}
BaseCalendar nextCalendar = newCopy();
this.expiringDate = date;

View file

@ -198,6 +198,14 @@ public class BaseCalendarTest {
assertThat(nextCalendar, equalTo(calendar.getNextCalendar()));
}
@Test(expected = IllegalArgumentException.class)
public void testCreateInvalidNewVersion() {
BaseCalendar nextCalendar = createBasicCalendar().newVersion(
FRIDAY_LOCAL_DATE);
nextCalendar.newVersion(MONDAY_LOCAL_DATE);
}
@Test
public void testGettWorkableHoursNewVersion() {
BaseCalendar origCalendar = createBasicCalendar();

View file

@ -16,6 +16,7 @@ import org.navalplanner.web.common.MessagesForUser;
import org.navalplanner.web.common.OnlyOneVisible;
import org.navalplanner.web.common.Util;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.SuspendNotAllowedException;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
@ -52,6 +53,8 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
private Window editWindow;
private Window historyWindow;
private Window confirmRemove;
private boolean confirmingRemove = false;
@ -75,6 +78,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
super.doAfterCompose(comp);
messagesForUser = new MessagesForUser(messagesContainer);
comp.setVariable("controller", this, true);
historyWindow.setVisible(false);
getVisibility().showOnly(listWindow);
}
@ -290,6 +294,10 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
hoursIntbox.setDisabled(true);
}
if (baseCalendarModel.isViewingHistory()) {
hoursIntbox.setDisabled(true);
}
hoursListcell.appendChild(hoursIntbox);
item.appendChild(hoursListcell);
@ -322,6 +330,11 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
}
});
if (baseCalendarModel.isViewingHistory()) {
defaultCheckbox.setDisabled(true);
}
defaultListcell.appendChild(defaultCheckbox);
item.appendChild(defaultListcell);
}
@ -331,7 +344,11 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
private void reloadCurrentWindow() {
if (baseCalendarModel.isEditing()) {
Util.reloadBindings(editWindow);
if (baseCalendarModel.isViewingHistory()) {
Util.reloadBindings(historyWindow);
} else {
Util.reloadBindings(editWindow);
}
} else {
Util.reloadBindings(createWindow);
}
@ -339,7 +356,11 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
private void reloadDayInformation() {
if (baseCalendarModel.isEditing()) {
Util.reloadBindings(editWindow.getFellow("dayInformation"));
if (baseCalendarModel.isViewingHistory()) {
Util.reloadBindings(historyWindow.getFellow("dayInformation"));
} else {
Util.reloadBindings(editWindow.getFellow("dayInformation"));
}
} else {
Util.reloadBindings(createWindow.getFellow("dayInformation"));
}
@ -357,7 +378,10 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
private void prepareParentCombo() {
Combobox parentCalendars;
if (baseCalendarModel.isEditing()) {
if (baseCalendarModel.isViewingHistory()) {
parentCalendars = (Combobox) historyWindow
.getFellow("parentCalendars");
} else if (baseCalendarModel.isEditing()) {
parentCalendars = (Combobox) editWindow
.getFellow("parentCalendars");
} else {
@ -416,18 +440,24 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
return baseCalendarModel.isEditing();
}
public Date getExpiringDate() {
return baseCalendarModel.getExpiringDate();
public Date getDateValidFrom() {
return baseCalendarModel.getDateValidFrom();
}
public void setExpiringDate(Date date) {
public void setDateValidFrom(Date date) {
try {
baseCalendarModel.setExpiringDate(date);
baseCalendarModel.setDateValidFrom(date);
} catch (IllegalArgumentException e) {
;
throw new WrongValueException(
editWindow.getFellow("dateValidFrom"),
e.getMessage());
}
}
public Date getExpiringDate() {
return baseCalendarModel.getExpiringDate();
}
public void goToCreateCopyForm(BaseCalendar baseCalendar) {
baseCalendarModel.initCreateCopy(baseCalendar);
if (baseCalendarModel.isDerived()) {
@ -521,4 +551,45 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
}
public List<BaseCalendar> getHistoryVersions() {
return baseCalendarModel.getHistoryVersions();
}
public void goToHistoryView(BaseCalendar baseCalendar) {
baseCalendarModel.initHistoryView(baseCalendar);
if (baseCalendarModel.isDerived()) {
prepareParentCombo();
}
try {
Util.reloadBindings(historyWindow);
historyWindow.setVisible(true);
historyWindow.doModal();
} catch (SuspendNotAllowedException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public boolean isViewingHistory() {
return baseCalendarModel.isViewingHistory();
}
public boolean isNotViewingHistory() {
return !isViewingHistory();
}
public boolean isEditingAndNotViewingHistory() {
return isEditing() && !isViewingHistory();
}
public void back() {
baseCalendarModel.cancelHistoryView();
historyWindow.setVisible(false);
Util.reloadBindings(editWindow);
getVisibility().showOnly(editWindow);
}
}

View file

@ -1,5 +1,6 @@
package org.navalplanner.web.calendars;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -39,6 +40,10 @@ public class BaseCalendarModel implements IBaseCalendarModel {
private boolean editing = false;
private BaseCalendar baseCalendarHistory;
private boolean viewingHistory = false;
private ClassValidator<BaseCalendar> baseCalendarValidator = new ClassValidator<BaseCalendar>(
BaseCalendar.class);
@ -56,7 +61,6 @@ public class BaseCalendarModel implements IBaseCalendarModel {
return baseCalendarDAO.findLastVersions();
}
/*
* Initial conversation steps
*/
@ -73,7 +77,15 @@ public class BaseCalendarModel implements IBaseCalendarModel {
editing = true;
Validate.notNull(baseCalendar);
this.baseCalendar = getFromDB(baseCalendar).newVersion();
this.baseCalendar = getFromDB(baseCalendar);
try {
this.baseCalendar = this.baseCalendar.newVersion();
} catch (IllegalArgumentException e) {
LocalDate expiringDate = this.baseCalendar.getPreviousCalendar()
.getExpiringDate();
this.baseCalendar = this.baseCalendar.newVersion(expiringDate
.plusDays(1));
}
forceLoadHoursPerDayAndExceptionDays(this.baseCalendar);
}
@ -102,6 +114,16 @@ public class BaseCalendarModel implements IBaseCalendarModel {
this.baseCalendar = baseCalendar;
}
@Override
@Transactional(readOnly = true)
public void initHistoryView(BaseCalendar baseCalendar) {
viewingHistory = true;
Validate.notNull(baseCalendar);
this.baseCalendarHistory = getFromDB(baseCalendar);
forceLoadHoursPerDayAndExceptionDays(this.baseCalendarHistory);
}
private void forceLoadHoursPerDayAndExceptionDays(BaseCalendar baseCalendar) {
forceLoadHoursPerDayAndExceptionDaysBasic(baseCalendar);
forceLoadHoursPerDayAndExceptionDaysPrevious(baseCalendar);
@ -155,6 +177,9 @@ public class BaseCalendarModel implements IBaseCalendarModel {
@Override
public BaseCalendar getBaseCalendar() {
if (viewingHistory) {
return baseCalendarHistory;
}
return baseCalendar;
}
@ -163,16 +188,17 @@ public class BaseCalendarModel implements IBaseCalendarModel {
public List<BaseCalendar> getPossibleParentCalendars() {
List<BaseCalendar> baseCalendars = getBaseCalendars();
if (baseCalendar != null) {
if (getBaseCalendar() != null) {
for (BaseCalendar calendar : baseCalendars) {
if (isEditing()) {
if (calendar.getId().equals(
baseCalendar.getPreviousCalendar().getId())) {
if ((getBaseCalendar().getPreviousCalendar() != null)
&& (calendar.getId().equals(getBaseCalendar()
.getPreviousCalendar().getId()))) {
baseCalendars.remove(calendar);
break;
}
} else {
if (calendar.getId().equals(baseCalendar.getId())) {
if (calendar.getId().equals(getBaseCalendar().getId())) {
baseCalendars.remove(calendar);
break;
}
@ -201,104 +227,104 @@ public class BaseCalendarModel implements IBaseCalendarModel {
@Override
@Transactional(readOnly = true)
public Integer getHoursOfDay() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return null;
}
return baseCalendar.getWorkableHours(selectedDate);
return getBaseCalendar().getWorkableHours(selectedDate);
}
@Override
@Transactional(readOnly = true)
public DayType getTypeOfDay() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return null;
}
return baseCalendar.getType(selectedDate);
return getBaseCalendar().getType(selectedDate);
}
@Override
@Transactional(readOnly = true)
public void createException(Integer hours) {
if (getTypeOfDay().equals(DayType.OWN_EXCEPTION)) {
baseCalendar.updateExceptionDay(selectedDate, hours);
getBaseCalendar().updateExceptionDay(selectedDate, hours);
} else {
ExceptionDay day = ExceptionDay.create(selectedDate, hours);
baseCalendar.addExceptionDay(day);
getBaseCalendar().addExceptionDay(day);
}
}
@Override
public Integer getHours(Days day) {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return null;
}
return baseCalendar.getHours(day);
return getBaseCalendar().getHours(day);
}
@Override
public Boolean isDefault(Days day) {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return false;
}
return baseCalendar.isDefault(day);
return getBaseCalendar().isDefault(day);
}
@Override
public void unsetDefault(Days day) {
if (baseCalendar != null) {
baseCalendar.setHours(day, 0);
if (getBaseCalendar() != null) {
getBaseCalendar().setHours(day, 0);
}
}
@Override
public void setDefault(Days day) {
if (baseCalendar != null) {
baseCalendar.setDefault(day);
if (getBaseCalendar() != null) {
getBaseCalendar().setDefault(day);
}
}
@Override
public void setHours(Days day, Integer hours) {
if (baseCalendar != null) {
baseCalendar.setHours(day, hours);
if (getBaseCalendar() != null) {
getBaseCalendar().setHours(day, hours);
}
}
@Override
public boolean isExceptional() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return false;
}
ExceptionDay day = baseCalendar.getOwnExceptionDay(selectedDate);
ExceptionDay day = getBaseCalendar().getOwnExceptionDay(selectedDate);
return (day != null);
}
@Override
public void removeException() {
baseCalendar.removeExceptionDay(selectedDate);
getBaseCalendar().removeExceptionDay(selectedDate);
}
@Override
public boolean isDerived() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return false;
}
return baseCalendar.isDerived();
return getBaseCalendar().isDerived();
}
@Override
public BaseCalendar getParent() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return null;
}
return baseCalendar.getParent();
return getBaseCalendar().getParent();
}
@Override
@ -311,26 +337,37 @@ public class BaseCalendarModel implements IBaseCalendarModel {
}
forceLoadHoursPerDayAndExceptionDays(parent);
if (baseCalendar != null) {
baseCalendar.setParent(parent);
if (getBaseCalendar() != null) {
getBaseCalendar().setParent(parent);
}
}
@Override
@Transactional(readOnly = true)
public boolean isParent() {
if (baseCalendar == null) {
if (getBaseCalendar() == null) {
return false;
}
return !baseCalendarDAO.findByParent(baseCalendar).isEmpty();
return !baseCalendarDAO.findByParent(getBaseCalendar()).isEmpty();
}
@Override
public Date getExpiringDate() {
if ((baseCalendar != null)
&& (baseCalendar.getPreviousCalendar() != null)) {
LocalDate expiringDate = baseCalendar.getPreviousCalendar()
if ((getBaseCalendar() != null)
&& (getBaseCalendar().getExpiringDate() != null)) {
return getBaseCalendar().getExpiringDate().toDateTimeAtStartOfDay()
.toDate();
}
return null;
}
@Override
public Date getDateValidFrom() {
if ((getBaseCalendar() != null)
&& (getBaseCalendar().getPreviousCalendar() != null)) {
LocalDate expiringDate = getBaseCalendar().getPreviousCalendar()
.getExpiringDate();
return expiringDate.toDateTimeAtStartOfDay().toDate();
}
@ -339,13 +376,35 @@ public class BaseCalendarModel implements IBaseCalendarModel {
}
@Override
public void setExpiringDate(Date date) {
if ((baseCalendar != null)
&& (baseCalendar.getPreviousCalendar() != null)) {
baseCalendar.getPreviousCalendar().setExpiringDate(date);
public void setDateValidFrom(Date date) {
if ((getBaseCalendar() != null)
&& (getBaseCalendar().getPreviousCalendar() != null)) {
getBaseCalendar().getPreviousCalendar().setExpiringDate(date);
}
}
@Override
public List<BaseCalendar> getHistoryVersions() {
if (getBaseCalendar() == null) {
return null;
}
List<BaseCalendar> history = new ArrayList<BaseCalendar>();
BaseCalendar current = getBaseCalendar().getPreviousCalendar();
while (current != null) {
history.add(current);
current = current.getPreviousCalendar();
}
return history;
}
@Override
public boolean isViewingHistory() {
return this.viewingHistory;
}
/*
* Final conversation steps
*/
@ -354,20 +413,20 @@ public class BaseCalendarModel implements IBaseCalendarModel {
@Transactional
public void confirmSave() throws ValidationException {
InvalidValue[] invalidValues = baseCalendarValidator
.getInvalidValues(baseCalendar);
.getInvalidValues(getBaseCalendar());
if (invalidValues.length > 0) {
throw new ValidationException(invalidValues);
}
baseCalendar.checkValid();
baseCalendarDAO.save(baseCalendar);
getBaseCalendar().checkValid();
baseCalendarDAO.save(getBaseCalendar());
}
@Override
@Transactional
public void confirmRemove() {
try {
baseCalendarDAO.remove(baseCalendar.getId());
baseCalendarDAO.remove(getBaseCalendar().getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
@ -378,8 +437,18 @@ public class BaseCalendarModel implements IBaseCalendarModel {
resetState();
}
@Override
public void cancelHistoryView() {
viewingHistory = false;
resetStateHistory();
}
private void resetState() {
baseCalendar = null;
}
private void resetStateHistory() {
baseCalendarHistory = null;
}
}

View file

@ -59,6 +59,8 @@ public interface IBaseCalendarModel {
void initCreateCopy(BaseCalendar baseCalendar);
void initHistoryView(BaseCalendar baseCalendar);
/*
* Intermediate conversation steps
*/
@ -103,7 +105,13 @@ public interface IBaseCalendarModel {
Date getExpiringDate();
void setExpiringDate(Date date);
Date getDateValidFrom();
void setDateValidFrom(Date date);
List<BaseCalendar> getHistoryVersions();
boolean isViewingHistory();
/*
* Final conversation steps
@ -115,4 +123,6 @@ public interface IBaseCalendarModel {
void cancel();
void cancelHistoryView();
}

View file

@ -1,5 +1,16 @@
<window id="${arg.top_id}" title="${arg.title}" border="normal">
<tabbox>
<tabs>
<tab label="${i18n:_('Data')}" />
<tab label="${i18n:_('History')}"
visible="@{controller.isEditingAndNotViewingHistory}" />
</tabs>
<tabpanels>
<tabpanel>
<vbox>
<hbox>
@ -8,7 +19,8 @@
<hbox>
<label value="${i18n:_('Name')}" />
<textbox value="@{controller.baseCalendar.name}" />
<textbox value="@{controller.baseCalendar.name}"
disabled="@{controller.isViewingHistory}" />
</hbox>
<hbox>
@ -17,7 +29,8 @@
<label value="@{controller.calendarType}" />
<combobox id="parentCalendars"
visible="@{controller.isDerived}"
model="@{controller.parentCalendars}">
model="@{controller.parentCalendars}"
disabled="@{controller.isViewingHistory}">
<comboitem self="@{each='baseCalnedar'}" value="@{baseCalnedar}"
label="@{baseCalnedar.name}" />
</combobox>
@ -49,7 +62,7 @@
<label value="@{controller.hoursOfDay}" />
</hbox>
<hbox>
<hbox visible="@{controller.isNotViewingHistory}">
<vbox>
<button label="${i18n:_('Create exception')}"
onClick="controller.createException();" />
@ -63,18 +76,54 @@
</hbox>
<hbox visible="@{controller.isEditing}">
<hbox visible="@{controller.isEditingAndNotViewingHistory}">
<label value="${i18n:_('Valid from')}" />
<datebox value="@{controller.expiringDate}" />
<datebox id="dateValidFrom" value="@{controller.dateValidFrom}" />
</hbox>
<hbox visible="@{controller.isViewingHistory}">
<label value="${i18n:_('Expiring date')}" />
<datebox value="@{controller.expiringDate}" disabled="true" />
</hbox>
<hbox>
<button onClick="controller.save();"
label="${arg.save_button_label}" />
label="${arg.save_button_label}"
visible="@{controller.isNotViewingHistory}" />
<button onClick="controller.cancel();"
label="${arg.cancel_button_label}" />
label="${arg.cancel_button_label}"
visible="@{controller.isNotViewingHistory}" />
<button onClick="controller.back();"
label="${arg.back_button_label}"
visible="@{controller.isViewingHistory}" />
</hbox>
</vbox>
</tabpanel>
<tabpanel>
<listbox model="@{controller.historyVersions}">
<listhead>
<listheader label="${i18n:_('Name')}" />
<listheader label="${i18n:_('Expiring Date')}" />
<listheader label="${i18n:_('Operations')}" />
</listhead>
<listitem self="@{each='calendar'}" value="@{calendar}">
<listcell label="@{calendar.name}" />
<listcell label="@{calendar.expiringDate}" />
<listcell>
<button label="${i18n:_('View')}"
onClick="controller.goToHistoryView(self.parent.parent.value);">
</button>
</listcell>
</listitem>
</listbox>
</tabpanel>
</tabpanels>
</tabbox>
</window>

View file

@ -21,6 +21,8 @@
<edition top_id="editWindow" title="${i18n:_('Edit Calendar')}"
save_button_label="${i18n:_('Save')}"
cancel_button_label="${i18n:_('Cancel')}" />
<edition top_id="historyWindow" title="${i18n:_('History')}"
back_button_label="${i18n:_('Back')}" />
<window visible="@{controller.confirmingRemove}"
id="confirmRemove" title="${i18n:_('Confirmation')}" sizable="true"
position="center">