diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IOrderSequenceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IOrderSequenceDAO.java index 61abbc539..423d3749c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IOrderSequenceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IOrderSequenceDAO.java @@ -33,4 +33,7 @@ public interface IOrderSequenceDAO extends IGenericDAO { List getAll(); + List findOrderSquencesNotIn( + List orderSequences); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/OrderSequenceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/OrderSequenceDAO.java index 4bcee5230..def2cc553 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/OrderSequenceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/OrderSequenceDAO.java @@ -20,8 +20,10 @@ package org.navalplanner.business.common.daos; +import java.util.ArrayList; import java.util.List; +import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.entities.OrderSequence; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -42,4 +44,18 @@ public class OrderSequenceDAO extends GenericDAOHibernate return list(OrderSequence.class); } -} + @Override + @SuppressWarnings("unchecked") + public List findOrderSquencesNotIn( + List orderSequences) { + List orderSequenceIds = new ArrayList(); + for (OrderSequence orderSequence : orderSequences) { + orderSequenceIds.add(orderSequence.getId()); + } + + return getSession().createCriteria(OrderSequence.class).add( + Restrictions.not(Restrictions.in("id", orderSequenceIds))) + .list(); + } + +} \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/OrderSequence.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/OrderSequence.java index fb52570ba..efe4534ff 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/OrderSequence.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/entities/OrderSequence.java @@ -20,6 +20,9 @@ package org.navalplanner.business.common.entities; +import java.text.DecimalFormat; +import java.text.NumberFormat; + import org.hibernate.criterion.Order; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; @@ -125,4 +128,14 @@ public class OrderSequence extends BaseEntity { return false; } + public static String formatValue(int numberOfDigits, int value) { + String format = ""; + for (int i = 0; i < numberOfDigits; i++) { + format += "0"; + } + + NumberFormat numberFormat = new DecimalFormat(format); + return numberFormat.format(value); + } + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationController.java index 349e34e94..f0ff44333 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationController.java @@ -26,15 +26,23 @@ import java.util.List; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.entities.Configuration; +import org.navalplanner.business.common.entities.OrderSequence; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.web.common.components.bandboxsearch.BandboxSearch; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.SelectEvent; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Button; +import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Intbox; import org.zkoss.zul.Messagebox; +import org.zkoss.zul.Row; +import org.zkoss.zul.RowRenderer; +import org.zkoss.zul.Textbox; import org.zkoss.zul.api.Listitem; import org.zkoss.zul.api.Window; @@ -54,6 +62,8 @@ public class ConfigurationController extends GenericForwardComposer { private Component messagesContainer; + private OrderSequenceRowRenderer orderSequenceRowRenderer = new OrderSequenceRowRenderer(); + @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); @@ -118,4 +128,138 @@ public class ConfigurationController extends GenericForwardComposer { configurationModel.setCompanyCode(companyCode); } + public List getOrderSequences() { + return configurationModel.getOrderSequences(); + } + + public void addOrderSequence() { + configurationModel.addOrderSequence(); + reloadOrderSequencesList(); + } + + public void removeOrderSequence(OrderSequence orderSequence) { + configurationModel.removeOrderSequence(orderSequence); + reloadOrderSequencesList(); + } + + private void reloadOrderSequencesList() { + Util + .reloadBindings(configurationWindow + .getFellow("orderSequencesList")); + } + + public OrderSequenceRowRenderer getOrderSequenceRowRenderer() { + return orderSequenceRowRenderer; + } + + private class OrderSequenceRowRenderer implements RowRenderer { + + @Override + public void render(Row row, Object data) throws Exception { + OrderSequence orderSequence = (OrderSequence) data; + row.setValue(orderSequence); + + appendActiveCheckbox(row, orderSequence); + appendPrefixTextbox(row, orderSequence); + appendNumberOfDigitsInbox(row, orderSequence); + appendLastValueInbox(row, orderSequence); + appendOperations(row, orderSequence); + } + + private void appendActiveCheckbox(Row row, + final OrderSequence orderSequence) { + Checkbox checkbox = Util.bind(new Checkbox(), + new Util.Getter() { + + @Override + public Boolean get() { + return orderSequence.isActive(); + } + }, new Util.Setter() { + + @Override + public void set(Boolean value) { + orderSequence.setActive(value); + } + }); + + row.appendChild(checkbox); + } + + private void appendPrefixTextbox(Row row, + final OrderSequence orderSequence) { + Textbox textbox = Util.bind(new Textbox(), + new Util.Getter() { + + @Override + public String get() { + return orderSequence.getPrefix(); + } + }, new Util.Setter() { + + @Override + public void set(String value) { + orderSequence.setPrefix(value); + } + }); + textbox.setConstraint("no empty:" + _("cannot be null or empty")); + + row.appendChild(textbox); + } + + private void appendNumberOfDigitsInbox(Row row, + final OrderSequence orderSequence) { + final Intbox tempIntbox = new Intbox(); + Intbox intbox = Util.bind(tempIntbox, new Util.Getter() { + + @Override + public Integer get() { + return orderSequence.getNumberOfDigits(); + } + }, new Util.Setter() { + + @Override + public void set(Integer value) { + try { + orderSequence.setNumberOfDigits(value); + } catch (IllegalArgumentException e) { + throw new WrongValueException(tempIntbox, e.getMessage()); + } + } + }); + intbox.setConstraint("no empty:" + _("cannot be null or empty")); + + row.appendChild(intbox); + } + + private void appendLastValueInbox(Row row, + final OrderSequence orderSequence) { + Textbox textbox = Util.bind(new Textbox(), + new Util.Getter() { + + @Override + public String get() { + return OrderSequence.formatValue(orderSequence + .getNumberOfDigits(), orderSequence + .getLastValue()); + } + }); + + row.appendChild(textbox); + } + + private void appendOperations(Row row, final OrderSequence orderSequence) { + Button removeButton = Util.createRemoveButton(new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + removeOrderSequence(orderSequence); + } + }); + + row.appendChild(removeButton); + } + + } + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationModel.java index f4259ab97..5c525f2a8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ConfigurationModel.java @@ -20,12 +20,19 @@ package org.navalplanner.web.common; +import static org.navalplanner.web.I18nHelper._; + +import java.util.Collections; import java.util.List; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.daos.IConfigurationDAO; +import org.navalplanner.business.common.daos.IOrderSequenceDAO; import org.navalplanner.business.common.entities.Configuration; +import org.navalplanner.business.common.entities.OrderSequence; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -44,12 +51,17 @@ public class ConfigurationModel implements IConfigurationModel { */ private Configuration configuration; + private List orderSequences; + @Autowired private IConfigurationDAO configurationDAO; @Autowired private IBaseCalendarDAO baseCalendarDAO; + @Autowired + private IOrderSequenceDAO orderSequenceDAO; + @Override @Transactional(readOnly = true) public List getCalendars() { @@ -68,6 +80,7 @@ public class ConfigurationModel implements IConfigurationModel { @Transactional(readOnly = true) public void init() { this.configuration = getCurrentConfiguration(); + this.orderSequences = orderSequenceDAO.getAll(); } private Configuration getCurrentConfiguration() { @@ -99,13 +112,53 @@ public class ConfigurationModel implements IConfigurationModel { @Override @Transactional public void confirm() { + if (orderSequences.isEmpty()) { + throw new ValidationException( + _("At least one order sequence is needed")); + } + + if (!checkConstraintJustOneOrderSequenceActive()) { + throw new ValidationException( + _("Just one order sequence must be active")); + } + configurationDAO.save(configuration); + storeAndRemoveOrderSequences(); + } + + private void storeAndRemoveOrderSequences() { + for (OrderSequence orderSequence : orderSequences) { + orderSequenceDAO.save(orderSequence); + } + + List toRemove = orderSequenceDAO + .findOrderSquencesNotIn(orderSequences); + for (OrderSequence orderSequence : toRemove) { + try { + orderSequenceDAO.remove(orderSequence.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + } + + private boolean checkConstraintJustOneOrderSequenceActive() { + boolean someoneActive = false; + for (OrderSequence orderSequence : orderSequences) { + if (orderSequence.isActive()) { + if (someoneActive) { + return false; + } + someoneActive = true; + } + } + return someoneActive; } @Override @Transactional(readOnly = true) public void cancel() { - configuration = getCurrentConfiguration(); + init(); } @Override @@ -123,4 +176,19 @@ public class ConfigurationModel implements IConfigurationModel { } } + @Override + public List getOrderSequences() { + return Collections.unmodifiableList(orderSequences); + } + + @Override + public void addOrderSequence() { + orderSequences.add(OrderSequence.create("")); + } + + @Override + public void removeOrderSequence(OrderSequence orderSequence) { + orderSequences.remove(orderSequence); + } + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IConfigurationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IConfigurationModel.java index 224bbdf34..01b9d9035 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IConfigurationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IConfigurationModel.java @@ -23,6 +23,7 @@ package org.navalplanner.web.common; import java.util.List; import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.common.entities.OrderSequence; /** * Contract for {@link ConfigurationModel}. @@ -50,6 +51,10 @@ public interface IConfigurationModel { String getCompanyCode(); void setCompanyCode(String companyCode); + List getOrderSequences(); + void addOrderSequence(); + void removeOrderSequence(OrderSequence orderSequence); + /* * Final conversation steps */ diff --git a/navalplanner-webapp/src/main/webapp/common/configuration.zul b/navalplanner-webapp/src/main/webapp/common/configuration.zul index 518d259c4..a2f8136e3 100644 --- a/navalplanner-webapp/src/main/webapp/common/configuration.zul +++ b/navalplanner-webapp/src/main/webapp/common/configuration.zul @@ -63,6 +63,28 @@ + + + + + +