From a43fe366d305c1c4190839ee6abbf4a773feaeae Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 27 Oct 2010 10:09:51 +0200 Subject: [PATCH] Adds the generated code sequence to resource calendars . Replaces the generated code by the code sequence for each resource calendar and add the generated code to the base calendar children (CalendarException, CalendarData, CalendarAvailability). FEA :ItEr61S04NavalPlanEntities --- .../calendars/entities/BaseCalendar.java | 56 +++++++ .../common/entities/EntityNameEnum.java | 5 +- .../calendars/entities/Calendars.hbm.xml | 4 + .../calendars/BaseCalendarCRUDController.java | 31 ++-- .../BaseCalendarEditionController.java | 144 +++++++++++++++++- .../web/calendars/BaseCalendarModel.java | 32 +++- .../web/calendars/IBaseCalendarModel.java | 2 + .../web/calendars/ResourceCalendarModel.java | 25 +++ .../machine/MachineCRUDController.java | 9 +- .../worker/WorkerCRUDController.java | 10 +- .../src/main/webapp/calendars/_edition.zul | 17 ++- 11 files changed, 292 insertions(+), 43 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java index e70dd2d5b..672572fba 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java @@ -32,12 +32,14 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; +import org.hibernate.validator.NotNull; import org.hibernate.validator.Valid; import org.joda.time.DateTimeConstants; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.entities.CalendarData.Days; import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.entities.EntitySequence; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.business.workingday.ResourcesPerDay; @@ -113,6 +115,8 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { @Valid private List calendarAvailabilities = new ArrayList(); + private Integer lastSequenceCode = 0; + public enum DayType { NORMAL, ZERO_HOURS, OWN_EXCEPTION, ANCESTOR_EXCEPTION } @@ -504,6 +508,7 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { private void copyFields(BaseCalendar copy) { copy.name = this.name; + copy.setCodeAutogenerated(this.isCodeAutogenerated()); copy.calendarDataVersions = new ArrayList(); for (CalendarData calendarData : this.calendarDataVersions) { copy.calendarDataVersions.add(calendarData.copy()); @@ -1085,4 +1090,55 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { } + public void generateCalendarExceptionCodes(int numberOfDigits) { + for (CalendarException exception : this.getExceptions()) { + if ((exception.getCode() == null) + || (exception.getCode().isEmpty()) + || (!exception.getCode().startsWith(this.getCode()))) { + this.incrementLastSequenceCode(); + String exceptionCode = EntitySequence.formatValue( + numberOfDigits, this.getLastSequenceCode()); + exception.setCode(this.getCode() + + EntitySequence.CODE_SEPARATOR_CHILDREN + + exceptionCode); + } + } + + for (CalendarData data : this.getCalendarDataVersions()) { + if ((data.getCode() == null) || (data.getCode().isEmpty()) + || (!data.getCode().startsWith(this.getCode()))) { + this.incrementLastSequenceCode(); + String dataCode = EntitySequence.formatValue(numberOfDigits, + this.getLastSequenceCode()); + data.setCode(this.getCode() + + EntitySequence.CODE_SEPARATOR_CHILDREN + dataCode); + } + } + + for (CalendarAvailability availability : this + .getCalendarAvailabilities()) { + if ((availability.getCode() == null) + || (availability.getCode().isEmpty()) + || (!availability.getCode().startsWith(this.getCode()))) { + this.incrementLastSequenceCode(); + String availabilityCode = EntitySequence.formatValue( + numberOfDigits, this.getLastSequenceCode()); + availability.setCode(this.getCode() + + EntitySequence.CODE_SEPARATOR_CHILDREN + + availabilityCode); + } + } + } + + public void incrementLastSequenceCode() { + if (lastSequenceCode == null) { + lastSequenceCode = 0; + } + lastSequenceCode++; + } + + @NotNull(message = "last sequence code not specified") + public Integer getLastSequenceCode() { + return lastSequenceCode; + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/EntityNameEnum.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/EntityNameEnum.java index 1a085fb15..f529de35b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/EntityNameEnum.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/EntityNameEnum.java @@ -41,9 +41,9 @@ import org.navalplanner.business.workreports.entities.WorkReport; public enum EntityNameEnum { ORDER("Order"), CRITERION("Criterion"), LABEL("Label"), MACHINE("Machine"), WORKER( - "Worker"), UNIT_TYPE("Unit type"), CALENDAR("Calendar"), WORK_HOURS_TYPE( + "Worker"), UNIT_TYPE("Unit type"), CALENDAR("Calendar"), WORK_HOURS_TYPE( "Type of work hours"), MATERIAL_CATEGORY("Material category"), WORK_REPORT( - "Work report"); + "Work report"), RESOURCE_CALENDAR("Resource calendar"); private String description; @@ -72,6 +72,7 @@ public enum EntityNameEnum { case UNIT_TYPE: return (IIntegrationEntityDAO) Registry.getUnitTypeDAO(); case CALENDAR: + case RESOURCE_CALENDAR: return (IIntegrationEntityDAO) Registry .getCalendarDataDAO(); case WORK_HOURS_TYPE: diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml index 6753e41b0..d7160c448 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml @@ -19,6 +19,8 @@ + + @@ -121,6 +123,8 @@ + + () { + + @Override + public String get() { + return calendarException.getCode(); + } + }, new Util.Setter() { + + @Override + public void set(String value) { + try { + calendarException.setCode(value); + } catch (IllegalArgumentException e) { + throw new WrongValueException(code, e.getMessage()); + } + } + }); + + code.setConstraint("no empty:" + _("cannot be null or empty")); + + listcell.appendChild(code); + item.appendChild(listcell); + } + private void appendOperationsListcell(Listitem item, CalendarException calendarException) { Listcell listcell = new Listcell(); listcell.appendChild(createRemoveButton(calendarException)); @@ -1015,6 +1058,7 @@ public abstract class BaseCalendarEditionController extends appendValidFromListcell(item, calendarAvailability); appendExpirationDateListcell(item, calendarAvailability); + appendAvailabilityCodeListcell(item, calendarAvailability); appendOperationsListcell(item, calendarAvailability); } @@ -1096,6 +1140,40 @@ public abstract class BaseCalendarEditionController extends item.appendChild(listcell); } + private void appendAvailabilityCodeListcell(Listitem item, + final CalendarAvailability availability) { + item.setValue(availability); + Listcell listcell = new Listcell(); + final Textbox code = new Textbox(); + + if (getBaseCalendar() != null) { + code.setDisabled(getBaseCalendar().isCodeAutogenerated()); + } + + Util.bind(code, new Util.Getter() { + + @Override + public String get() { + return availability.getCode(); + } + }, new Util.Setter() { + + @Override + public void set(String value) { + try { + availability.setCode(value); + } catch (IllegalArgumentException e) { + throw new WrongValueException(code, e.getMessage()); + } + } + }); + + code.setConstraint("no empty:" + _("cannot be null or empty")); + + listcell.appendChild(code); + item.appendChild(listcell); + } + private void appendOperationsListcell(Listitem item, CalendarAvailability calendarAvailability) { Listcell listcell = new Listcell(); @@ -1142,6 +1220,10 @@ public abstract class BaseCalendarEditionController extends Util.reloadBindings(window.getFellow("calendarAvailabilities")); } + public void reloadExceptionsList() { + Util.reloadBindings(window.getFellow("exceptionsList")); + } + public boolean isNotResourceCalendar() { BaseCalendar baseCalendar = baseCalendarModel.getBaseCalendar(); if ((baseCalendar == null) @@ -1150,4 +1232,52 @@ public abstract class BaseCalendarEditionController extends } return true; } + + public void validateCalendarExceptionCodes(){ + Listbox listbox = (Listbox) window.getFellow("exceptionsList"); + if (listbox != null) { + for (int i = 0; i < listbox.getItemCount(); i++) { + Listitem item = (Listitem) listbox.getItems().get(i); + if (item.getChildren().size() == 5) { + Textbox code = (Textbox) ((Listcell) item.getChildren() + .get(3)).getFirstChild(); + if (code != null && !code.isDisabled() + && code.getValue().isEmpty()) { + throw new WrongValueException(code, + _("It can not be empty")); + } + } + } + } + } + + public void onCheckGenerateCode(Event e) { + CheckEvent ce = (CheckEvent) e; + if (ce.isChecked()) { + try { + baseCalendarModel.setCodeAutogenerated(ce.isChecked()); + } catch (ConcurrentModificationException err) { + messagesForUser.showMessage(Level.ERROR, err.getMessage()); + } + } + reloadCodeInformation(); + } + + private void reloadCodeInformation() { + Util.reloadBindings(window.getFellow("txtCode")); + reloadExceptionsList(); + reloadActivationPeriods(); + } + + public void onSelectException(Event event) { + Listbox listBox = (Listbox) event.getTarget(); + Listitem item = (Listitem) listBox.getSelectedItem(); + if (item != null) { + CalendarException calendarException = (CalendarException) item + .getValue(); + setSelectedDay(calendarException.getDate().toDateTimeAtStartOfDay() + .toDate()); + reloadDayInformation(); + } + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java index 02788d35f..eeb962643 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java @@ -136,6 +136,14 @@ public class BaseCalendarModel extends IntegrationEntityModel implements this.baseCalendar = getFromDB(baseCalendar).newDerivedCalendar(); forceLoad(this.baseCalendar); + this.baseCalendar.setCode(""); + + boolean codeGenerated = configurationDAO.getConfiguration() + .getGenerateCodeForBaseCalendars(); + if (codeGenerated) { + setDefaultCode(); + } + this.baseCalendar.setCodeAutogenerated(codeGenerated); } @Override @@ -146,6 +154,11 @@ public class BaseCalendarModel extends IntegrationEntityModel implements this.baseCalendar = getFromDB(baseCalendar).newCopy(); forceLoad(this.baseCalendar); + this.baseCalendar.setCode(""); + + if (this.baseCalendar.isCodeAutogenerated()) { + setDefaultCode(); + } } @Override @@ -274,7 +287,7 @@ public class BaseCalendarModel extends IntegrationEntityModel implements if (getTypeOfDay(date).equals(DayType.OWN_EXCEPTION)) { getBaseCalendar().updateExceptionDay(date, duration, type); } else { - CalendarException day = CalendarException.create(date, + CalendarException day = CalendarException.create("", date, duration, type); getBaseCalendar().addExceptionDay(day); @@ -492,6 +505,14 @@ public class BaseCalendarModel extends IntegrationEntityModel implements } } + @Transactional + public void generateCalendarCodes() { + if (getBaseCalendar().isCodeAutogenerated()) { + baseCalendar + .generateCalendarExceptionCodes(getNumberOfDigitsCode()); + } + } + @Override @Transactional public void confirmRemove() { @@ -659,6 +680,7 @@ public class BaseCalendarModel extends IntegrationEntityModel implements CalendarAvailability calendarAvailability = CalendarAvailability .create(startDate, null); + calendarAvailability.setCode(""); getBaseCalendar().addNewCalendarAvailability(calendarAvailability); } } @@ -686,7 +708,13 @@ public class BaseCalendarModel extends IntegrationEntityModel implements @Override public Set getChildren() { - return new HashSet(); + Set children = new HashSet(); + if (baseCalendar != null) { + children.addAll(baseCalendar.getExceptions()); + children.addAll(baseCalendar.getCalendarDataVersions()); + children.addAll(baseCalendar.getCalendarAvailabilities()); + } + return children; } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java index 74af23db3..581701c30 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java @@ -199,4 +199,6 @@ public interface IBaseCalendarModel extends IIntegrationEntityModel { void setDurationAt(Days day, EffortDuration value); + void generateCalendarCodes(); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java index fc1c2b5f5..fc3c0d187 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java @@ -23,6 +23,9 @@ package org.navalplanner.web.calendars; import org.apache.commons.lang.Validate; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.navalplanner.business.common.daos.IConfigurationDAO; +import org.navalplanner.business.common.entities.EntityNameEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -44,17 +47,30 @@ public class ResourceCalendarModel extends BaseCalendarModel implements public void initCreate() { editing = false; this.baseCalendar = ResourceCalendar.create(); + this.baseCalendar.setCode(""); } + @Autowired + private IConfigurationDAO configurationDAO; + @Override @Transactional(readOnly = true) public void initCreateDerived(BaseCalendar baseCalendar) { editing = false; Validate.notNull(baseCalendar); + // the code always is autogenerated when it is created. + boolean codeGenerated = true; + this.baseCalendar = getFromDB(baseCalendar) .newDerivedResourceCalendar(); forceLoad(this.baseCalendar); + this.baseCalendar.setCode(""); + + if (codeGenerated) { + setDefaultCode(); + } + this.baseCalendar.setCodeAutogenerated(codeGenerated); } @Override @@ -65,6 +81,15 @@ public class ResourceCalendarModel extends BaseCalendarModel implements this.baseCalendar = getFromDB(baseCalendar).newCopyResourceCalendar(); forceLoad(this.baseCalendar); + this.baseCalendar.setCode(""); + + if (this.baseCalendar.isCodeAutogenerated()) { + setDefaultCode(); + } } + @Override + public EntityNameEnum getEntityName() { + return EntityNameEnum.RESOURCE_CALENDAR; + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java index 0f29ef0ae..e4b116a3e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java @@ -355,7 +355,10 @@ public class MachineCRUDController extends GenericForwardComposer { parentCalendar = machineModel.getDefaultCalendar(); } - machineModel.setCalendar(parentCalendar.newDerivedResourceCalendar()); + resourceCalendarModel.initCreateDerived(parentCalendar); + resourceCalendarModel.generateCalendarCodes(); + machineModel.setCalendar((ResourceCalendar) resourceCalendarModel + .getBaseCalendar()); } private Window editCalendarWindow; @@ -375,7 +378,7 @@ public class MachineCRUDController extends GenericForwardComposer { baseCalendarEditionController = new BaseCalendarEditionController( resourceCalendarModel, editCalendarWindow, - createNewVersionWindow) { + createNewVersionWindow, messagesForUser) { @Override public void goToList() { @@ -394,9 +397,11 @@ public class MachineCRUDController extends GenericForwardComposer { @Override public void save() { + validateCalendarExceptionCodes(); ResourceCalendar calendar = (ResourceCalendar) resourceCalendarModel .getBaseCalendar(); if (calendar != null) { + resourceCalendarModel.generateCalendarCodes(); machineModel.setCalendarOfMachine(calendar); } reloadWindow(); 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 309261601..9275669d4 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 @@ -398,7 +398,11 @@ public class WorkerCRUDController extends GenericForwardComposer implements if (parentCalendar == null) { parentCalendar = workerModel.getDefaultCalendar(); } - workerModel.setCalendar(parentCalendar.newDerivedResourceCalendar()); + + resourceCalendarModel.initCreateDerived(parentCalendar); + resourceCalendarModel.generateCalendarCodes(); + workerModel.setCalendar((ResourceCalendar) resourceCalendarModel + .getBaseCalendar()); } public void editCalendar() { @@ -438,7 +442,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements baseCalendarEditionController = new BaseCalendarEditionController( resourceCalendarModel, editCalendarWindow, - createNewVersionWindow) { + createNewVersionWindow, messages) { @Override public void goToList() { @@ -457,10 +461,12 @@ public class WorkerCRUDController extends GenericForwardComposer implements @Override public void save() { + validateCalendarExceptionCodes(); Integer capacity = workerModel.getCapacity(); ResourceCalendar calendar = (ResourceCalendar) resourceCalendarModel .getBaseCalendar(); if (calendar != null) { + resourceCalendarModel.generateCalendarCodes(); workerModel.setCalendar(calendar); } reloadCurrentWindow(); diff --git a/navalplanner-webapp/src/main/webapp/calendars/_edition.zul b/navalplanner-webapp/src/main/webapp/calendars/_edition.zul index 00faed1d7..6269db2ff 100644 --- a/navalplanner-webapp/src/main/webapp/calendars/_edition.zul +++ b/navalplanner-webapp/src/main/webapp/calendars/_edition.zul @@ -45,7 +45,7 @@