Author: bleny Date: 2013-07-12 19:43:32 +0200 (Fri, 12 Jul 2013) New Revision: 305 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: break everything to go real time Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RealTimeStorageMovementTask.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/GetRealTimeStorageMovementTaskJsonAction.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SaveRealTimeStorageMovementJsonAction.java Removed: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/BookArticleResult.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/OrderResumeService.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/DeliveredRequestedArticle.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StoredArticle.java trunk/magalie-persistence/src/main/xmi/magalie.zargo trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementConfirmation.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FindOrderToExecuteResult.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ChooseActivityAction.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java trunk/magalie-web/src/main/resources/struts.xml trunk/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js trunk/pom.xml Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleDao.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleDao.java 2013-07-12 17:43:32 UTC (rev 305) @@ -25,15 +25,12 @@ import com.franciaflex.magalie.persistence.entity.DeliveredRequestedArticle; import com.franciaflex.magalie.persistence.entity.RequestedList; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import java.util.List; /** @author bleny */ public interface DeliveredRequestedArticleDao { - DeliveredRequestedArticle find(StorageMovementOrder storageMovementOrder); - List<DeliveredRequestedArticle> findAll(RequestedList requestedList); } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java 2013-07-12 17:43:32 UTC (rev 305) @@ -25,7 +25,6 @@ import com.franciaflex.magalie.persistence.entity.DeliveredRequestedArticle; import com.franciaflex.magalie.persistence.entity.RequestedList; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -38,15 +37,6 @@ } @Override - public DeliveredRequestedArticle find(StorageMovementOrder storageMovementOrder) { - TypedQuery<DeliveredRequestedArticle> query = - entityManager.createQuery( - "from DeliveredRequestedArticle dra where dra.storageMovementOrder = :storageMovementOrder", getEntityClass()); - query.setParameter("storageMovementOrder", storageMovementOrder); - return findUniqueOrNull(query); - } - - @Override public List<DeliveredRequestedArticle> findAll(RequestedList requestedList) { TypedQuery<DeliveredRequestedArticle> query = entityManager.createQuery( Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderDao.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderDao.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,36 +0,0 @@ -package com.franciaflex.magalie.persistence.dao; - -/* - * #%L - * MagaLiE :: Persistence - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.entity.Building; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; - -import java.util.List; - -public interface StorageMovementOrderDao { - - public List<StorageMovementOrder> findNotConfirmedByUser(MagalieUser magalieUser, Building building); - -} Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,53 +0,0 @@ -package com.franciaflex.magalie.persistence.dao; - -/* - * #%L - * MagaLiE :: Persistence - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.entity.Building; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; - -import javax.persistence.EntityManager; -import javax.persistence.Query; -import java.util.List; - -public class StorageMovementOrderJpaDao extends AbstractStorageMovementOrderJpaDao { - - public StorageMovementOrderJpaDao(EntityManager entityManager) { - super(entityManager); - } - - @Override - public List<StorageMovementOrder> findNotConfirmedByUser(MagalieUser magalieUser, Building building) { - Query query = entityManager.createQuery( - " select distinct smo" + - " from StorageMovementOrder smo" + - " inner join smo.storageMovements as sm" + - " where sm.magalieUser = :magalieUser" + - " and sm.originLocation.warehouse.building = :building" + - " and sm.confirmDate is null" ); - query.setParameter("magalieUser", magalieUser); - query.setParameter("building", building); - return query.getResultList(); - } -} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/DeliveredRequestedArticle.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/DeliveredRequestedArticle.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/DeliveredRequestedArticle.java 2013-07-12 17:43:32 UTC (rev 305) @@ -23,6 +23,9 @@ * #L% */ +import com.franciaflex.magalie.persistence.StorageMovements; +import com.google.common.collect.Iterables; + import javax.persistence.Entity; @Entity @@ -31,7 +34,10 @@ private static final long serialVersionUID = 1L; public boolean isConfirmed() { - return getStorageMovementOrder().isConfirmed(); + boolean isConfirmed = Iterables.all( + getStorageMovements(), + StorageMovements.storageMovementIsConfirmed()); + return isConfirmed; } } //DeliveredRequestedArticle Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,124 +0,0 @@ -package com.franciaflex.magalie.persistence.entity; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.StorageMovements; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.nuiton.jpa.api.JpaEntities; - -import javax.persistence.Entity; -import java.util.Set; - -@Entity -public class StorageMovementOrder extends AbstractJpaStorageMovementOrder { - - private static final long serialVersionUID = 1L; - - protected Set<Article> getArticles() { - Set<Article> articles = - Sets.newHashSet( - Iterables.transform( - getStorageMovements(), - StorageMovements.getArticleFunction() - ) - ); - return articles; - } - - public Article getArticle() { - Article onlyElement = Iterables.getOnlyElement(getArticles()); - return onlyElement; - } - - public double getQuantity() { - double quantity = 0.; - for (StorageMovement storageMovement : this.storageMovements) { - quantity += storageMovement.getExpectedQuantity(); - } - return quantity; - } - - public void addStorageMovement(StorageMovement storageMovement) { - if (this.storageMovements == null) { - this.storageMovements= Lists.newLinkedList(); - } - super.addStorageMovements(storageMovement); - } - - public Set<Location> getLocations() { - Set<Location> locations = - Sets.newHashSet( - Iterables.transform( - getStorageMovements(), - StorageMovements.getOriginFunction() - ) - ); - return locations; - } - - public StorageMovement findStorageMovementByLocationId(String locationId) { - StorageMovement storageMovement = - Iterables.find( - getStorageMovements(), - Predicates.compose( - JpaEntities.entityHasId(locationId), - StorageMovements.getOriginFunction() - ), - null - ); - return storageMovement; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - - protected Set<Location> getDestinationLocations() { - Set<Location> locations = - Sets.newHashSet( - Iterables.transform( - getStorageMovements(), - StorageMovements.getDestinationFunction() - ) - ); - return locations; - } - - public Location getDestinationLocation() { - Location onlyElement = Iterables.getOnlyElement(getDestinationLocations()); - return onlyElement; - } - - public boolean isConfirmed() { - boolean isConfirmed = Iterables.all( - getStorageMovements(), - StorageMovements.storageMovementIsConfirmed()); - return isConfirmed; - } -} //StorageMovementOrder Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StoredArticle.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StoredArticle.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StoredArticle.java 2013-07-12 17:43:32 UTC (rev 305) @@ -35,7 +35,7 @@ @Override public String toString() { return Objects.toStringHelper(this) - .add(PROPERTY_QUANTITY, quantity + " " + getArticle().getCode()) + .add(PROPERTY_QUANTITY, quantity + " " + getArticle().getUnit()) .add(PROPERTY_ARTICLE, article) .add(PROPERTY_LOCATION, location) .toString(); Modified: trunk/magalie-persistence/src/main/xmi/magalie.zargo =================================================================== (Binary files differ) Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementConfirmation.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementConfirmation.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementConfirmation.java 2013-07-12 17:43:32 UTC (rev 305) @@ -23,31 +23,34 @@ * #L% */ -import java.util.Map; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + import java.util.Set; public class StorageMovementConfirmation { - protected String storageMovementOrderId; + protected String articleId; - protected Map<String, Double> locationsIdsToActualQuantities; + protected Set<String> storageMovementIds; protected Set<String> locationInErrorIds; - public String getStorageMovementOrderId() { - return storageMovementOrderId; + protected String requestedArticleId; + + public String getArticleId() { + return articleId; } - public void setStorageMovementOrderId(String storageMovementOrderId) { - this.storageMovementOrderId = storageMovementOrderId; + public void setArticleId(String articleId) { + this.articleId = articleId; } - public Map<String, Double> getLocationsIdsToActualQuantities() { - return locationsIdsToActualQuantities; + public Set<String> getStorageMovementIds() { + return storageMovementIds; } - public void setLocationsIdsToActualQuantities(Map<String, Double> locationsIdsToActualQuantities) { - this.locationsIdsToActualQuantities = locationsIdsToActualQuantities; + public void setStorageMovementIds(Set<String> storageMovementIds) { + this.storageMovementIds = storageMovementIds; } public Set<String> getLocationInErrorIds() { @@ -57,4 +60,17 @@ public void setLocationInErrorIds(Set<String> locationInErrorIds) { this.locationInErrorIds = locationInErrorIds; } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } + + public String getRequestedArticleId() { + return requestedArticleId; + } + + public void setRequestedArticleId(String requestedArticleId) { + this.requestedArticleId = requestedArticleId; + } } Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,76 +0,0 @@ -package com.franciaflex.magalie.services; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.entity.Article; -import com.franciaflex.magalie.persistence.entity.StorageMovement; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.google.common.collect.Lists; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; - -import java.util.List; - -public class StorageMovementTask { - - protected StorageMovementOrder storageMovementOrder; - - protected List<StorageMovement> extraStorageMovements = Lists.newLinkedList(); - - public StorageMovementTask(StorageMovementOrder storageMovementOrder) { - this.storageMovementOrder = storageMovementOrder; - } - - public double getQuantity() { - return storageMovementOrder.getQuantity(); - } - - public Article getArticle() { - return storageMovementOrder.getArticle(); - } - - public String getStorageMovementOrderId() { - return storageMovementOrder.getId(); - } - - public List<StorageMovement> getStorageMovements() { - - List<StorageMovement> storageMovements = Lists.newLinkedList(); - - storageMovements.addAll(storageMovementOrder.getStorageMovements()); - - storageMovements.addAll(extraStorageMovements); - - return storageMovements; - - } - - public void addExtraStorageMovement(StorageMovement extraStorageMovement) { - extraStorageMovements.add(extraStorageMovement); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this); - } -} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-07-12 17:43:32 UTC (rev 305) @@ -26,9 +26,10 @@ import com.franciaflex.magalie.persistence.JpaMagaliePersistenceContext; import com.franciaflex.magalie.persistence.StorageMovements; import com.franciaflex.magalie.persistence.StoredArticles; +import com.franciaflex.magalie.persistence.dao.ArticleJpaDao; import com.franciaflex.magalie.persistence.dao.LocationJpaDao; import com.franciaflex.magalie.persistence.dao.StorageMovementDao; -import com.franciaflex.magalie.persistence.dao.StorageMovementOrderJpaDao; +import com.franciaflex.magalie.persistence.dao.StorageMovementJpaDao; import com.franciaflex.magalie.persistence.dao.StoredArticleDao; import com.franciaflex.magalie.persistence.dao.UnavailableArticleJpaDao; import com.franciaflex.magalie.persistence.entity.Article; @@ -36,21 +37,23 @@ import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.StorageMovement; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.persistence.entity.UnavailableArticle; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; import com.franciaflex.magalie.services.StorageMovementConfirmation; -import com.franciaflex.magalie.services.StorageMovementTask; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Ordering; import com.google.common.collect.Sets; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -69,81 +72,15 @@ this.serviceContext = serviceContext; } - /** - * Everything starts here, every time an article is requested, a call to - * this method must be used. - * - * @param bookArticleRequest the request gather all the details we must know - * before computing a storage movement order - */ - public BookArticleResult bookArticle(BookArticleRequest bookArticleRequest) { - - Preconditions.checkNotNull(bookArticleRequest.getMagalieUser()); - - Preconditions.checkNotNull(bookArticleRequest.getBuilding()); - - Article article = bookArticleRequest.getArticle(); - - Preconditions.checkNotNull(article); - - Preconditions.checkNotNull(bookArticleRequest.getDestinationLocation()); - - Preconditions.checkArgument(bookArticleRequest.getRequestedQuantity() > 0.); - - if (log.isInfoEnabled()) { - log.info("will process article request" + bookArticleRequest); - } - - // we will proceed in three main steps - - // fist, get a snapshot of the actual current state of the stock - Iterable<StoredArticle> storedArticles = getStoredArticles(bookArticleRequest.getBuilding(), article); - - // second step, sort all those stored article by priority - Set<StoredArticle> sortedStoredArticles = sortStoredArticlesByPriority(storedArticles); - - // third step, compute actual order with priorities and actual quantities - BookArticleResult bookArticleResult = buildStorageMovementOrder(bookArticleRequest, sortedStoredArticles); - - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - - boolean saveStorageMovementOrder = bookArticleResult.isSuccess(); - - if (saveStorageMovementOrder) { - - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - StorageMovementOrderJpaDao dao = persistenceContext.getStorageMovementOrderDao(); - - dao.persist(storageMovementOrder); - - } - - updateArticleAvailability(bookArticleResult); - - persistenceContext.commit(); - - return bookArticleResult; - - } - /** Add or remove a line in table {@link UnavailableArticle} */ - protected void updateArticleAvailability(BookArticleResult bookArticleResult) { + protected void updateArticleAvailability(Building building, Article article, boolean articleIsAvailable) { - BookArticleRequest bookArticleRequest = bookArticleResult.getBookArticleRequest(); - - Article article = bookArticleRequest.getArticle(); - - Building building = bookArticleRequest.getBuilding(); - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); UnavailableArticleJpaDao dao = persistenceContext.getUnavailableArticleDao(); UnavailableArticle unavailableArticle = dao.findByArticle(building, article); - boolean articleIsAvailable = !bookArticleResult.isArticleUnavailable(); - if (articleIsAvailable) { if (unavailableArticle != null) { @@ -180,93 +117,6 @@ } - protected BookArticleResult buildStorageMovementOrder(BookArticleRequest bookArticleRequest, Set<StoredArticle> sortedStoredArticles) { - - Article article = bookArticleRequest.getArticle(); - - MagalieUser magalieUser = bookArticleRequest.getMagalieUser(); - - double requestedQuantity = bookArticleRequest.getRequestedQuantity(); - - BookArticleResult bookArticleResult = new BookArticleResult(); - - bookArticleResult.setBookArticleRequest(bookArticleRequest); - - StorageMovementOrder storageMovementOrder = new StorageMovementOrder(); - - double quantity = 0; - - Date orderDate = serviceContext.getNow(); - - for (StoredArticle storedArticle : sortedStoredArticles) { - - double quantityLeft = requestedQuantity - quantity; - - double quantityInLocation = storedArticle.getQuantity(); - - double quantityWithdrawn = Math.min(quantityLeft, quantityInLocation); - - if (quantityWithdrawn > 0.) { - - Location originLocation = storedArticle.getLocation(); - - bookArticleResult.userMustAccessLocation(originLocation); - - quantity += quantityWithdrawn; - - StorageMovement newStorageMovement = new StorageMovement(); - - newStorageMovement.setArticle(article); - - newStorageMovement.setOrderDate(orderDate); - - newStorageMovement.setMagalieUser(magalieUser); - - newStorageMovement.setOriginLocation(originLocation); - - newStorageMovement.setDestinationLocation(bookArticleRequest.getDestinationLocation()); - - newStorageMovement.setExpectedQuantity(quantityWithdrawn); - - storageMovementOrder.addStorageMovement(newStorageMovement); - - } - } - - // TODO brendan 15/04/13 refactor - - if (CollectionUtils.isEmpty(storageMovementOrder.getStorageMovements())) { - - storageMovementOrder = null; - - } else { - - if (quantity < requestedQuantity) { - - if (bookArticleRequest.isBestEffortPolicy()) { - - log.debug("best effort policy, requested quantity was " - + requestedQuantity + " but only " + quantity + - " available"); - - } else { - - // strict policy, we must deliver all requested quantity - - storageMovementOrder = null; - - } - - } - - } - - bookArticleResult.setStorageMovementOrder(storageMovementOrder); - - return bookArticleResult; - - } - protected Set<StoredArticle> sortStoredArticlesByPriority(Iterable<StoredArticle> storedArticles) { Ordering<StoredArticle> orderingByPriority = @@ -287,54 +137,6 @@ } - public StorageMovementTask getStorageMovementTask(String storageMovementOrderId) { - - StorageMovementOrderJpaDao dao = serviceContext.getPersistenceContext().getStorageMovementOrderDao(); - - StorageMovementOrder storageMovementOrder = dao.findById(storageMovementOrderId); - - Preconditions.checkArgument( - storageMovementOrder != null, - "cet ordre de mouvement n'existe pas " + storageMovementOrderId); - - Preconditions.checkState( - ! storageMovementOrder.isConfirmed(), - "ordre de mouvement déjà confirmé"); - - StorageMovementTask storageMovementTask = new StorageMovementTask(storageMovementOrder); - - Article article = storageMovementOrder.getArticle(); - - Set<Location> locationsInOrder = storageMovementOrder.getLocations(); - - // we suppose the order concerns movement in the same building - Building building = Iterables.get(locationsInOrder, 0).getWarehouse().getBuilding(); - - Iterable<StoredArticle> storedArticles = getStoredArticles(building, article); - - for (StoredArticle storedArticle : storedArticles) { - - Location location = storedArticle.getLocation(); - - if (!locationsInOrder.contains(location)) { - - StorageMovement newStorageMovement = new StorageMovement(); - - newStorageMovement.setArticle(article); - - newStorageMovement.setOriginLocation(location); - - newStorageMovement.setExpectedQuantity(0.); - - storageMovementTask.addExtraStorageMovement(newStorageMovement); - - } - } - - return storageMovementTask; - - } - /** Get a snapshot of the actual current state of the stock. */ protected Iterable<StoredArticle> getStoredArticles(Building building, Article article) { @@ -417,103 +219,255 @@ public void confirmStorageMovement(StorageMovementConfirmation confirmation, MagalieUser magalieUser) { - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + Preconditions.checkNotNull(confirmation); - StorageMovementOrderJpaDao storageMovementOrderDao = - persistenceContext.getStorageMovementOrderDao(); + if (log.isDebugEnabled()) { + log.debug(magalieUser + " will make confirmation " + confirmation); + } - LocationJpaDao locationDao = persistenceContext.getLocationDao(); + JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - StorageMovementOrder storageMovementOrder = - storageMovementOrderDao.findById( - confirmation.getStorageMovementOrderId()); + ArticleJpaDao articleDao = persistenceContext.getArticleDao(); + Article article = articleDao.findById(confirmation.getArticleId()); + Date confirmDate = serviceContext.getNow(); + StorageMovementJpaDao storageMovementDao = persistenceContext.getStorageMovementDao(); + + Set<StorageMovement> confirmedStorageMovements = Sets.newHashSet(); + + for (String storageMovementId : confirmation.getStorageMovementIds()) { + + StorageMovement storageMovement = + storageMovementDao.findById(storageMovementId); + + storageMovement.setConfirmDate(confirmDate); + + confirmedStorageMovements.add(storageMovement); + + if (log.isDebugEnabled()) { + log.debug("confirmed storage movement " + storageMovement); + } + + } + LocationErrorsService locationErrorsService = serviceContext.newService(LocationErrorsService.class); - Location destinationLocation = storageMovementOrder.getDestinationLocation(); + LocationJpaDao locationDao = persistenceContext.getLocationDao(); - for (Map.Entry<String, Double> locationIdToActualQuantity : confirmation.getLocationsIdsToActualQuantities().entrySet()) { + for (String locationInErrorId : confirmation.getLocationInErrorIds()) { - String locationId = locationIdToActualQuantity.getKey(); + Location locationInError = locationDao.findById(locationInErrorId); - double actualQuantity = locationIdToActualQuantity.getValue(); + locationErrorsService.reportError(locationInError, article, magalieUser, confirmDate); - StorageMovement storageMovement = - storageMovementOrder.findStorageMovementByLocationId(locationId); + } - if (storageMovement == null) { + RequestedArticleService requestedArticleService = + serviceContext.newService(RequestedArticleService.class); - // user made a movement out of the order from its own initiative - storageMovement = new StorageMovement(); + requestedArticleService.onStorageMovementConfirmation(confirmation, confirmedStorageMovements); - Location originLocation = locationDao.findById(locationId); + persistenceContext.commit(); - storageMovement.setOriginLocation(originLocation); + } - storageMovement.setDestinationLocation(destinationLocation); + public void cancelStorageMovement(StorageMovementConfirmation confirmation) { - storageMovement.setMagalieUser(magalieUser); + if (log.isDebugEnabled()) { + log.debug(" will make cancellation " + confirmation); + } - storageMovement.setArticle(storageMovementOrder.getArticle()); + JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - storageMovement.setExpectedQuantity(0.); + StorageMovementJpaDao storageMovementDao = persistenceContext.getStorageMovementDao(); - storageMovementOrder.getStorageMovements().add(storageMovement); + Set<StorageMovement> cancelledStorageMovements = Sets.newHashSet(); + for (String storageMovementId : confirmation.getStorageMovementIds()) { + + StorageMovement storageMovement = + storageMovementDao.findById(storageMovementId); + + cancelledStorageMovements.add(storageMovement); + + storageMovementDao.remove(storageMovement); + + if (log.isDebugEnabled()) { + log.debug("cancelled storage movement " + storageMovement); } - storageMovement.setConfirmDate(confirmDate); + } - storageMovement.setActualQuantity(actualQuantity); + persistenceContext.commit(); + } + + public RealTimeStorageMovementTask getRealTimeStorageMovementTask(Building building, MagalieUser magalieUser, String articleId) { + + Preconditions.checkNotNull(magalieUser); + + Preconditions.checkNotNull(building); + + JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + ArticleJpaDao articleDao = persistenceContext.getArticleDao(); + + Article article = articleDao.findById(articleId); + + Preconditions.checkNotNull(article); + + if (log.isInfoEnabled()) { + log.info("will process real time article request in building " + + building + " by user " + magalieUser + " for article " + article); } - for (String locationInErrorId : confirmation.getLocationInErrorIds()) { + // we will proceed in three main steps - Location locationInError = locationDao.findById(locationInErrorId); + // fist, get a snapshot of the actual current state of the stock + Iterable<StoredArticle> storedArticles = getStoredArticles(building, article); - locationErrorsService.reportError(locationInError, storageMovementOrder.getArticle(), magalieUser, confirmDate); + if (log.isTraceEnabled()) { + log.trace("found " + Iterables.size(storedArticles) + " stored articles " + storedArticles); + } + // second step, remove all already used location, to find all used location, looking + // for not already confirmed storage movements + StorageMovementJpaDao storageMovementDao = + persistenceContext.getStorageMovementDao(); + + Map<String, Object> storageMovementProperties = Maps.newHashMap(); + + storageMovementProperties.put(StorageMovement.PROPERTY_MAGALIE_USER, magalieUser); + storageMovementProperties.put(StorageMovement.PROPERTY_ARTICLE, article); + storageMovementProperties.put(StorageMovement.PROPERTY_CONFIRM_DATE, null); + + List<StorageMovement> storageMovements = + storageMovementDao.findAllByProperties(storageMovementProperties); + + if (log.isDebugEnabled()) { + log.debug("found " + storageMovements.size() + " movements already done " + storageMovements); } - storageMovementOrderDao.merge(storageMovementOrder); + ImmutableSet<Location> alreadyUsedLocations = + ImmutableSet.copyOf( + Iterables.transform( + storageMovements, + StorageMovements.getOriginFunction() + ) + ); - RequestedArticleService requestedArticleService = - serviceContext.newService(RequestedArticleService.class); + if (log.isTraceEnabled()) { + log.trace("already used locations " + alreadyUsedLocations); + } - requestedArticleService.onStorageMovementConfirmation(storageMovementOrder); + Predicate<StoredArticle> articleStoredInAlreadyUsedLocation = + Predicates.compose( + Predicates.in(alreadyUsedLocations), + StoredArticles.getLocationFunction()); - persistenceContext.commit(); + storedArticles = Iterables.filter(storedArticles, Predicates.not(articleStoredInAlreadyUsedLocation)); - if (log.isInfoEnabled()) { - log.info("confirmed storage movement order: " + storageMovementOrder); + if (log.isTraceEnabled()) { + log.trace("after removing already used locations " + Iterables.size(storedArticles) + " stored articles remaining " + storedArticles); } + // third step, sort all those stored article by priority + Set<StoredArticle> sortedStoredArticles = sortStoredArticlesByPriority(storedArticles); + + RealTimeStorageMovementTask realTimeStorageMovementTask = + new RealTimeStorageMovementTask(); + + if (sortedStoredArticles.isEmpty()) { + + realTimeStorageMovementTask.setArticleUnavailable(true); + + } else { + + Predicate<StoredArticle> articleStoredInAccessibleLocationPredicate = + StoredArticles.articleStoredInAccessibleLocationPredicate(magalieUser); + + Optional<StoredArticle> accessibleStoredArticleOptional = + Iterables.tryFind(sortedStoredArticles, articleStoredInAccessibleLocationPredicate); + + if (accessibleStoredArticleOptional.isPresent()) { + + StoredArticle accessibleStoredArticle = accessibleStoredArticleOptional.get(); + + realTimeStorageMovementTask.setStoredArticle(accessibleStoredArticle); + + } else { + + realTimeStorageMovementTask.setDriverLicenseRequired(true); + + } + + } + + boolean articleAvailable = ! realTimeStorageMovementTask.isArticleUnavailable(); + + updateArticleAvailability(building, article, articleAvailable); + + return realTimeStorageMovementTask; + } - public void cancelStorageMovement(String storageMovementOrderId) { + public Article getArticle(String articleId) { - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + ArticleJpaDao articleDao = serviceContext.getPersistenceContext().getArticleDao(); - StorageMovementOrderJpaDao storageMovementOrderDao = - persistenceContext.getStorageMovementOrderDao(); + Article article = articleDao.findById(articleId); - StorageMovementOrder storageMovementOrder = storageMovementOrderDao.findById(storageMovementOrderId); + return article; - RequestedArticleService requestedArticleService - = serviceContext.newService(RequestedArticleService.class); + } - requestedArticleService.cancelStorageMovement(storageMovementOrder); + public StorageMovement saveStorageMovement(MagalieUser magalieUser, String articleId, String originLocationId, String destinationLocationId, double quantity) { - storageMovementOrderDao.remove(storageMovementOrder); + JpaMagaliePersistenceContext persistenceContext = + serviceContext.getPersistenceContext(); + ArticleJpaDao articleDao = persistenceContext.getArticleDao(); + + Article article = articleDao.findById(articleId); + + LocationJpaDao locationDao = persistenceContext.getLocationDao(); + + Location originLocation = locationDao.findById(originLocationId); + + Location destinationLocation = locationDao.findById(destinationLocationId); + + StorageMovement storageMovement = new StorageMovement(); + + storageMovement.setOriginLocation(originLocation); + + storageMovement.setDestinationLocation(destinationLocation); + + storageMovement.setMagalieUser(magalieUser); + + storageMovement.setArticle(article); + + storageMovement.setActualQuantity(quantity); + + Date now = serviceContext.getNow(); + + storageMovement.setOrderDate(now); + + StorageMovementJpaDao storageMovementDao = + persistenceContext.getStorageMovementDao(); + + storageMovementDao.persist(storageMovement); + persistenceContext.commit(); if (log.isInfoEnabled()) { - log.info("cancelled storage movement order " + storageMovementOrder); + log.info("saved real time storage movement " + storageMovement); } + + return storageMovement; + } + } Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/BookArticleResult.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/BookArticleResult.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/BookArticleResult.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,87 +0,0 @@ -package com.franciaflex.magalie.services.service; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.Locations; -import com.franciaflex.magalie.persistence.entity.Location; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; - -public class BookArticleResult { - - protected StorageMovementOrder storageMovementOrder; - - protected BookArticleRequest bookArticleRequest; - - protected Location inaccessibleLocation; - - public void setStorageMovementOrder(StorageMovementOrder storageMovementOrder) { - this.storageMovementOrder = storageMovementOrder; - } - - public StorageMovementOrder getStorageMovementOrder() { - Preconditions.checkState(isSuccess()); - return storageMovementOrder; - } - - public void setBookArticleRequest(BookArticleRequest bookArticleRequest) { - this.bookArticleRequest = bookArticleRequest; - } - - public BookArticleRequest getBookArticleRequest() { - return bookArticleRequest; - } - - public void userMustAccessLocation(Location location) { - - if (inaccessibleLocation == null) { - - MagalieUser magalieUser = bookArticleRequest.getMagalieUser(); - - Predicate<Location> isLocationInaccessiblePredicate = Locations.inaccessibleLocationPredicate(magalieUser); - - if (isLocationInaccessiblePredicate.apply(location)) { - - this.inaccessibleLocation = location; - - } - - } - - } - - public boolean isArticleInaccessible() { - return inaccessibleLocation != null; - } - - public boolean isArticleUnavailable() { - return storageMovementOrder == null; - } - - public boolean isSuccess() { - return ! isArticleInaccessible() && ! isArticleUnavailable(); - } -} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FindOrderToExecuteResult.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FindOrderToExecuteResult.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FindOrderToExecuteResult.java 2013-07-12 17:43:32 UTC (rev 305) @@ -24,11 +24,11 @@ */ import com.franciaflex.magalie.persistence.entity.DeliveredRequestedList; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.persistence.entity.RequestedArticle; public class FindOrderToExecuteResult { - protected StorageMovementOrder storageMovementOrder; + protected RequestedArticle requestedArticle; protected boolean nothingToDo; @@ -41,15 +41,15 @@ protected DeliveredRequestedList newAffectation; public boolean isSuccess() { - return storageMovementOrder != null; + return requestedArticle != null; } - public void setStorageMovementOrder(StorageMovementOrder storageMovementOrder) { - this.storageMovementOrder = storageMovementOrder; + public RequestedArticle getRequestedArticle() { + return requestedArticle; } - public StorageMovementOrder getStorageMovementOrder() { - return storageMovementOrder; + public void setRequestedArticle(RequestedArticle requestedArticle) { + this.requestedArticle = requestedArticle; } public void setNothingToDo(boolean nothingToDo) { @@ -91,4 +91,5 @@ public DeliveredRequestedList getNewAffectation() { return newAffectation; } + } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java 2013-07-12 17:43:32 UTC (rev 305) @@ -32,7 +32,6 @@ import com.franciaflex.magalie.persistence.entity.Company; import com.franciaflex.magalie.persistence.entity.Kanban; import com.franciaflex.magalie.persistence.entity.Location; -import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.Warehouse; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; @@ -85,35 +84,6 @@ } - public BookArticleResult fulfilKanbanTask( - Article article, - MagalieUser magalieUser, - Warehouse destinationWarehouse, - double quantityInKanban) { - - ArticleStorageService articleStorageService = - serviceContext.newService(ArticleStorageService.class); - - Building building = destinationWarehouse.getBuilding(); - - SimpleWithdrawItemService simpleWithdrawItemService = - serviceContext.newService(SimpleWithdrawItemService.class); - - Location destinationLocation = - simpleWithdrawItemService.getDestinationLocation(destinationWarehouse); - - BookArticleRequest bookArticleRequest = - new BookArticleRequest( - magalieUser, building, article, - quantityInKanban, destinationLocation, true); - - BookArticleResult bookArticleResult = - articleStorageService.bookArticle(bookArticleRequest); - - return bookArticleResult; - - } - public List<Warehouse> getDestinationWarehouses(Building building) { JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); @@ -136,4 +106,16 @@ return article; } + + public Location getDestinationLocation(Warehouse destinationWarehouse) { + + SimpleWithdrawItemService simpleWithdrawItemService = + serviceContext.newService(SimpleWithdrawItemService.class); + + Location destinationLocation = + simpleWithdrawItemService.getDestinationLocation(destinationWarehouse); + + return destinationLocation; + + } } Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/OrderResumeService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/OrderResumeService.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/OrderResumeService.java 2013-07-12 17:43:32 UTC (rev 305) @@ -1,61 +0,0 @@ -package com.franciaflex.magalie.services.service; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - - -import com.franciaflex.magalie.persistence.JpaMagaliePersistenceContext; -import com.franciaflex.magalie.persistence.dao.StorageMovementOrderDao; -import com.franciaflex.magalie.persistence.entity.Building; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.franciaflex.magalie.services.MagalieService; -import com.franciaflex.magalie.services.MagalieServiceContext; -import com.google.common.collect.Iterables; - -import java.util.List; - -public class OrderResumeService implements MagalieService { - - protected MagalieServiceContext serviceContext; - - @Override - public void setServiceContext(MagalieServiceContext serviceContext) { - this.serviceContext = serviceContext; - } - - public StorageMovementOrder findMovementOrderResume(MagalieUser magalieUser, Building building) { - - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - - StorageMovementOrderDao storageMovementOrderDao = persistenceContext.getStorageMovementOrderDao(); - - List<StorageMovementOrder> notConfirmedByUser = storageMovementOrderDao.findNotConfirmedByUser(magalieUser, building); - - StorageMovementOrder orderToResume = Iterables.getFirst(notConfirmedByUser, null); - - return orderToResume; - - } - -} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RealTimeStorageMovementTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RealTimeStorageMovementTask.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RealTimeStorageMovementTask.java 2013-07-12 17:43:32 UTC (rev 305) @@ -0,0 +1,43 @@ +package com.franciaflex.magalie.services.service; + +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.google.common.base.Preconditions; + +public class RealTimeStorageMovementTask { + + protected StoredArticle storedArticle; + + protected boolean articleUnavailable; + + protected boolean driverLicenseRequired; + + public StoredArticle getStoredArticle() { + return storedArticle; + } + + public void setStoredArticle(StoredArticle storedArticle) { + this.storedArticle = storedArticle; + } + + public boolean isArticleUnavailable() { + if (articleUnavailable) { + Preconditions.checkState( ! driverLicenseRequired); + } + return articleUnavailable; + } + + public void setArticleUnavailable(boolean articleUnavailable) { + this.articleUnavailable = articleUnavailable; + } + + public void setDriverLicenseRequired(boolean driverLicenseRequired) { + this.driverLicenseRequired = driverLicenseRequired; + } + + public boolean isDriverLicenseRequired() { + if (driverLicenseRequired) { + Preconditions.checkState( ! articleUnavailable); + } + return driverLicenseRequired; + } +} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-07-12 17:43:32 UTC (rev 305) @@ -32,27 +32,26 @@ import com.franciaflex.magalie.persistence.dao.RequestedArticleDao; import com.franciaflex.magalie.persistence.dao.RequestedArticleJpaDao; import com.franciaflex.magalie.persistence.dao.RequestedListJpaDao; -import com.franciaflex.magalie.persistence.dao.StorageMovementOrderJpaDao; -import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedArticle; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedList; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedListStatus; -import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.RequestedArticle; import com.franciaflex.magalie.persistence.entity.RequestedList; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.persistence.entity.StorageMovement; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; +import com.franciaflex.magalie.services.StorageMovementConfirmation; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Collection; import java.util.Comparator; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -99,192 +98,194 @@ protected FindOrderToExecuteResult findOrderToExecute(Set<RequestedArticle> requestedArticlesByPriority, MagalieUser magalieUser, Building building) { - ArticleStorageService articleStorageService = - serviceContext.newService(ArticleStorageService.class); + throw new UnsupportedOperationException(); - BookArticleResult bookArticleResult = null; +// ArticleStorageService articleStorageService = +// serviceContext.newService(ArticleStorageService.class); +// +// BookArticleResult bookArticleResult = null; +// +// RequestedArticle requestedArticle = null; +// +// boolean success = false; +// +// Iterator<RequestedArticle> requestedArticleIterator = requestedArticlesByPriority.iterator(); +// +// boolean driverLicenseRequired = false; +// +// boolean somethingIsAvailable = false; +// +// while (!success && requestedArticleIterator.hasNext()) { +// +// requestedArticle = requestedArticleIterator.next(); +// +// Article article = requestedArticle.getArticle(); +// +// double quantity = requestedArticle.getQuantity(); +// +// Location destinationLocation = requestedArticle.getDestinationLocation(); +// +// BookArticleRequest bookArticleRequest = new BookArticleRequest(magalieUser, building, article, quantity, destinationLocation, false); +// +// // bookArticleResult = articleStorageService.bookArticle(bookArticleRequest); +// +// boolean articleIsAvailable = !bookArticleResult.isArticleUnavailable(); +// +// if (articleIsAvailable) { +// +// somethingIsAvailable = true; +// +// driverLicenseRequired |= bookArticleResult.isArticleInaccessible(); +// +// } +// +// success = bookArticleResult.isSuccess(); +// +// } +// +// FindOrderToExecuteResult findOrderToExecuteResult = new FindOrderToExecuteResult(); +// +// if (success) { +// +// if (log.isInfoEnabled()) { +// log.info("order to execute found: " + requestedArticle); +// } +// +// Preconditions.checkState(requestedArticle != null); +// +// JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); +// +// DeliveredRequestedArticleJpaDao dao = persistenceContext.getDeliveredRequestedArticleDao(); +// +// DeliveredRequestedArticle newDeliveredRequestedArticle = new DeliveredRequestedArticle(); +// +// newDeliveredRequestedArticle.setRequestedArticle(requestedArticle); +// +// StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); +// +// // newDeliveredRequestedArticle.setStorageMovementOrder(storageMovementOrder); +// +// dao.persist(newDeliveredRequestedArticle); +// +// findOrderToExecuteResult.setStorageMovementOrder(storageMovementOrder); +// +// // deal with affectations +// DeliveredRequestedListJpaDao deliveredRequestedListDao = +// persistenceContext.getDeliveredRequestedListDao(); +// +// DeliveredRequestedList oldAffectation = +// deliveredRequestedListDao.findByAffectedTo(magalieUser); +// +// RequestedList requestedList = requestedArticle.getRequestedList(); +// +// DeliveredRequestedList newAffectation = +// deliveredRequestedListDao.findByRequestedList(requestedList); +// +// if (newAffectation == null) { +// +// newAffectation = new DeliveredRequestedList(); +// +// deliveredRequestedListDao.persist(newAffectation); +// +// } +// +// newAffectation.setAffectedTo(magalieUser); +// +// newAffectation.setRequestedList(requestedList); +// +// newAffectation.setStatus(DeliveredRequestedListStatus.AFFECTED); +// +// deliveredRequestedListDao.merge(newAffectation); +// +// if (oldAffectation == null) { +// +// if (log.isInfoEnabled()) { +// log.info("user has no previous affectation"); +// } +// +// findOrderToExecuteResult.setNewAffectation(newAffectation); +// +// } else { +// +// if (log.isInfoEnabled()) { +// log.info("user is affected to " + oldAffectation.getRequestedList().getCode()); +// } +// +// boolean affectationChanged = !oldAffectation.getRequestedList().equals(requestedList); +// +// if (affectationChanged) { +// +// if (log.isInfoEnabled()) { +// log.info("user changed affectation from " +// + oldAffectation.getRequestedList().getCode() +// + " to " + requestedList.getCode()); +// } +// +// boolean isFinished = oldAffectation.getStatus().equals(DeliveredRequestedListStatus.COMPLETE); +// +// if (!isFinished) { +// +// if (log.isInfoEnabled()) { +// log.info("request list " + oldAffectation.getRequestedList() +// + " is not complete, putting it back to pending"); +// } +// +// oldAffectation.setStatus(DeliveredRequestedListStatus.PENDING); +// +// oldAffectation.setAffectedTo(null); +// +// } +// +// findOrderToExecuteResult.setOldAffectation(oldAffectation); +// +// findOrderToExecuteResult.setNewAffectation(newAffectation); +// +// } +// +// } +// +// persistenceContext.commit(); +// +// } else { +// +// if (requestedArticlesByPriority.isEmpty()) { +// +// if (log.isInfoEnabled()) { +// log.info("no order to execute found: nothing to do"); +// } +// +// findOrderToExecuteResult.setNothingToDo(true); +// +// } else { +// +// if (somethingIsAvailable) { +// +// if (log.isInfoEnabled()) { +// log.info("no order to execute found: there is something available to do but driver license is required"); +// } +// +// Preconditions.checkState(driverLicenseRequired); +// +// findOrderToExecuteResult.setDriverLicenseRequired(driverLicenseRequired); +// +// } else { +// +// if (log.isInfoEnabled()) { +// log.info("no order to execute found: everything is unavailable"); +// } +// +// Preconditions.checkState(!driverLicenseRequired); +// +// findOrderToExecuteResult.setEverythingUnavailable(true); +// +// } +// +// } +// +// } +// +// return findOrderToExecuteResult; - RequestedArticle requestedArticle = null; - - boolean success = false; - - Iterator<RequestedArticle> requestedArticleIterator = requestedArticlesByPriority.iterator(); - - boolean driverLicenseRequired = false; - - boolean somethingIsAvailable = false; - - while (!success && requestedArticleIterator.hasNext()) { - - requestedArticle = requestedArticleIterator.next(); - - Article article = requestedArticle.getArticle(); - - double quantity = requestedArticle.getQuantity(); - - Location destinationLocation = requestedArticle.getDestinationLocation(); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(magalieUser, building, article, quantity, destinationLocation, false); - - bookArticleResult = articleStorageService.bookArticle(bookArticleRequest); - - boolean articleIsAvailable = !bookArticleResult.isArticleUnavailable(); - - if (articleIsAvailable) { - - somethingIsAvailable = true; - - driverLicenseRequired |= bookArticleResult.isArticleInaccessible(); - - } - - success = bookArticleResult.isSuccess(); - - } - - FindOrderToExecuteResult findOrderToExecuteResult = new FindOrderToExecuteResult(); - - if (success) { - - if (log.isInfoEnabled()) { - log.info("order to execute found: " + requestedArticle); - } - - Preconditions.checkState(requestedArticle != null); - - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - - DeliveredRequestedArticleJpaDao dao = persistenceContext.getDeliveredRequestedArticleDao(); - - DeliveredRequestedArticle newDeliveredRequestedArticle = new DeliveredRequestedArticle(); - - newDeliveredRequestedArticle.setRequestedArticle(requestedArticle); - - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - newDeliveredRequestedArticle.setStorageMovementOrder(storageMovementOrder); - - dao.persist(newDeliveredRequestedArticle); - - findOrderToExecuteResult.setStorageMovementOrder(storageMovementOrder); - - // deal with affectations - DeliveredRequestedListJpaDao deliveredRequestedListDao = - persistenceContext.getDeliveredRequestedListDao(); - - DeliveredRequestedList oldAffectation = - deliveredRequestedListDao.findByAffectedTo(magalieUser); - - RequestedList requestedList = requestedArticle.getRequestedList(); - - DeliveredRequestedList newAffectation = - deliveredRequestedListDao.findByRequestedList(requestedList); - - if (newAffectation == null) { - - newAffectation = new DeliveredRequestedList(); - - deliveredRequestedListDao.persist(newAffectation); - - } - - newAffectation.setAffectedTo(magalieUser); - - newAffectation.setRequestedList(requestedList); - - newAffectation.setStatus(DeliveredRequestedListStatus.AFFECTED); - - deliveredRequestedListDao.merge(newAffectation); - - if (oldAffectation == null) { - - if (log.isInfoEnabled()) { - log.info("user has no previous affectation"); - } - - findOrderToExecuteResult.setNewAffectation(newAffectation); - - } else { - - if (log.isInfoEnabled()) { - log.info("user is affected to " + oldAffectation.getRequestedList().getCode()); - } - - boolean affectationChanged = !oldAffectation.getRequestedList().equals(requestedList); - - if (affectationChanged) { - - if (log.isInfoEnabled()) { - log.info("user changed affectation from " - + oldAffectation.getRequestedList().getCode() - + " to " + requestedList.getCode()); - } - - boolean isFinished = oldAffectation.getStatus().equals(DeliveredRequestedListStatus.COMPLETE); - - if (!isFinished) { - - if (log.isInfoEnabled()) { - log.info("request list " + oldAffectation.getRequestedList() - + " is not complete, putting it back to pending"); - } - - oldAffectation.setStatus(DeliveredRequestedListStatus.PENDING); - - oldAffectation.setAffectedTo(null); - - } - - findOrderToExecuteResult.setOldAffectation(oldAffectation); - - findOrderToExecuteResult.setNewAffectation(newAffectation); - - } - - } - - persistenceContext.commit(); - - } else { - - if (requestedArticlesByPriority.isEmpty()) { - - if (log.isInfoEnabled()) { - log.info("no order to execute found: nothing to do"); - } - - findOrderToExecuteResult.setNothingToDo(true); - - } else { - - if (somethingIsAvailable) { - - if (log.isInfoEnabled()) { - log.info("no order to execute found: there is something available to do but driver license is required"); - } - - Preconditions.checkState(driverLicenseRequired); - - findOrderToExecuteResult.setDriverLicenseRequired(driverLicenseRequired); - - } else { - - if (log.isInfoEnabled()) { - log.info("no order to execute found: everything is unavailable"); - } - - Preconditions.checkState(!driverLicenseRequired); - - findOrderToExecuteResult.setEverythingUnavailable(true); - - } - - } - - } - - return findOrderToExecuteResult; - } protected Set<RequestedArticle> getRequestedArticlesByPriority(List<RequestedArticle> requests, MagalieUser magalieUser) { @@ -328,47 +329,70 @@ } - public void onStorageMovementConfirmation(StorageMovementOrder storageMovementOrder) { + public void onStorageMovementConfirmation(StorageMovementConfirmation confirmation, Collection<StorageMovement> storageMovements) { - JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + String requestedArticleId = confirmation.getRequestedArticleId(); - DeliveredRequestedList deliveredRequestedList = getDeliveredRequestedList(storageMovementOrder.getId()); + if (requestedArticleId != null) { - if (deliveredRequestedList != null) { + // confirmation concerns a requested article, add a delivered requested article - // a order is confirmed and this order is about a requested article - // so we may update the status of the list + JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - RequestedList requestedList = deliveredRequestedList.getRequestedList(); - RequestedArticleJpaDao requestedArticleDao = persistenceContext.getRequestedArticleDao(); + RequestedArticle requestedArticle = + requestedArticleDao.findById(requestedArticleId); + + DeliveredRequestedArticle newDeliveredRequestedArticle = new DeliveredRequestedArticle(); + + newDeliveredRequestedArticle.setRequestedArticle(requestedArticle); + + newDeliveredRequestedArticle.addAllStorageMovements(storageMovements); + DeliveredRequestedArticleJpaDao deliveredRequestedArticleDao = persistenceContext.getDeliveredRequestedArticleDao(); - List<RequestedArticle> requestedArticles = - requestedArticleDao.findAll(requestedList); + deliveredRequestedArticleDao.persist(newDeliveredRequestedArticle); - List<DeliveredRequestedArticle> deliveredRequestedArticles = + // maybe requested list is finished, let's update the status + + RequestedList requestedList = requestedArticle.getRequestedList(); + + List<RequestedArticle> allRequestedArticlesForList = + requestedArticleDao.findAll(requestedList); + + List<DeliveredRequestedArticle> deliveredRequestedArticlesForList = deliveredRequestedArticleDao.findAll(requestedList); - boolean allIsConfirmed = deliveredRequestedArticles.size() == requestedArticles.size() - && Iterables.all( - deliveredRequestedArticles, - DeliveredRequestedArticles.isConfirmedPredicate()); + boolean allIsConfirmed = + deliveredRequestedArticlesForList.size() == allRequestedArticlesForList.size() + && Iterables.all( + deliveredRequestedArticlesForList, + DeliveredRequestedArticles.isConfirmedPredicate()); if (allIsConfirmed) { + DeliveredRequestedListJpaDao deliveredRequestedListDao = + persistenceContext.getDeliveredRequestedListDao(); + + DeliveredRequestedList deliveredRequestedList = + deliveredRequestedListDao.findByRequestedList(requestedList); + + Preconditions.checkNotNull(deliveredRequestedList); + if (log.isInfoEnabled()) { log.info("all requested articles have confirmed order, marking list " - + requestedList.getCode() + " as complete"); + + requestedList.getCode() + " as complete"); } deliveredRequestedList.setStatus(DeliveredRequestedListStatus.COMPLETE); } + persistenceContext.commit(); + } } @@ -434,58 +458,52 @@ } - /** @return null if storage movement order is not about a requested-list (for example, kanban) */ - public DeliveredRequestedList getDeliveredRequestedList(String storageMovementOrderId) { + public Optional<DeliveredRequestedList> getDeliveredRequestedList(StorageMovementConfirmation confirmation) { - JpaMagaliePersistenceContext persistenceContext = - serviceContext.getPersistenceContext(); + String requestedArticleId = confirmation.getRequestedArticleId(); - DeliveredRequestedArticleJpaDao deliveredRequestedArticleDao = - persistenceContext.getDeliveredRequestedArticleDao(); + Optional<DeliveredRequestedList> result; - StorageMovementOrderJpaDao storageMovementOrderDao = - persistenceContext.getStorageMovementOrderDao(); + if (requestedArticleId == null) { - StorageMovementOrder storageMovementOrder = - storageMovementOrderDao.findById(storageMovementOrderId); + result = Optional.absent(); - DeliveredRequestedArticle deliveredRequestedArticle = - deliveredRequestedArticleDao.find(storageMovementOrder); + } else { - DeliveredRequestedList deliveredRequestedList = null; + JpaMagaliePersistenceContext persistenceContext = + serviceContext.getPersistenceContext(); - if (deliveredRequestedArticle != null) { + RequestedArticleJpaDao requestedArticleDao = + persistenceContext.getRequestedArticleDao(); - RequestedList requestedList = - deliveredRequestedArticle.getRequestedArticle().getRequestedList(); + RequestedArticle requestedArticle = + requestedArticleDao.findById(requestedArticleId); + RequestedList requestedList = requestedArticle.getRequestedList(); + DeliveredRequestedListJpaDao deliveredRequestedListDao = persistenceContext.getDeliveredRequestedListDao(); - deliveredRequestedList = + DeliveredRequestedList deliveredRequestedList = deliveredRequestedListDao.findByRequestedList(requestedList); + return Optional.of(deliveredRequestedList); + } - return deliveredRequestedList; + return result; } - public void cancelStorageMovement(StorageMovementOrder storageMovementOrder) { + public RequestedArticle getRequestedArticle(String requestedArticleId) { - JpaMagaliePersistenceContext persistenceContext = - serviceContext.getPersistenceContext(); + JpaMagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - DeliveredRequestedArticleJpaDao deliveredRequestedArticleDao = - persistenceContext.getDeliveredRequestedArticleDao(); + RequestedArticleJpaDao requestedArticleDao = persistenceContext.getRequestedArticleDao(); - DeliveredRequestedArticle deliveredRequestedArticle = - deliveredRequestedArticleDao.find(storageMovementOrder); + RequestedArticle requestedArticle = requestedArticleDao.findById(requestedArticleId); - if (deliveredRequestedArticle != null) { - deliveredRequestedArticleDao.remove(deliveredRequestedArticle); - } + return requestedArticle; } - } Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java 2013-07-12 17:43:32 UTC (rev 305) @@ -28,7 +28,6 @@ import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.StorageMovement; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import com.franciaflex.magalie.services.AbstractMagalieServiceTest; import com.google.common.collect.Iterables; import org.apache.commons.logging.Log; Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-07-12 17:43:32 UTC (rev 305) @@ -28,7 +28,6 @@ import com.franciaflex.magalie.persistence.entity.DeliveredRequestedListStatus; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.RequestedArticle; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import com.franciaflex.magalie.services.AbstractMagalieServiceTest; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java 2013-07-12 17:43:32 UTC (rev 305) @@ -26,6 +26,8 @@ import com.franciaflex.magalie.MagalieApplicationConfig; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; +import com.franciaflex.magalie.services.service.BuildingsService; +import com.franciaflex.magalie.services.service.MagalieUsersService; import com.franciaflex.magalie.web.action.ChooseCompanyAction; import com.franciaflex.magalie.web.action.IndexAction; import com.franciaflex.magalie.web.action.LoginAction; @@ -131,6 +133,12 @@ try { + // TODO brendan 12/07/13 remove + if (magalieSession.getMagalieUser() == null) { + magalieSession.setBuilding(serviceContext.newService(BuildingsService.class).getBuilding("building_1")); + magalieSession.setMagalieUser(serviceContext.newService(MagalieUsersService.class).getMagalieUser("magalie_user_bruno")); + } + // prevent accessing a page without a session if (magalieSession.getMagalieUser() == null) { Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ChooseActivityAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ChooseActivityAction.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ChooseActivityAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -25,8 +25,6 @@ import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.franciaflex.magalie.services.service.OrderResumeService; import com.franciaflex.magalie.web.MagalieActionSupport; import com.franciaflex.magalie.web.MagalieSession; @@ -38,27 +36,17 @@ protected Building building; - protected OrderResumeService service; - - protected StorageMovementOrder movementOrderResume; - public void setSession(MagalieSession session) { this.session = session; } - public void setService(OrderResumeService service) { - this.service = service; - } - @Override - public String execute() throws Exception { + public String execute() { magalieUser = session.getMagalieUser(); building = session.getBuilding(); - movementOrderResume = service.findMovementOrderResume(magalieUser, building); - return SUCCESS; } @@ -71,12 +59,4 @@ return building; } - public StorageMovementOrder getMovementOrderResume() { - return movementOrderResume; - } - - public OrderResumeService getService() { - return service; - } - } Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -26,8 +26,8 @@ import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedList; import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.RequestedArticle; import com.franciaflex.magalie.persistence.entity.RequestedList; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import com.franciaflex.magalie.services.service.FindOrderToExecuteResult; import com.franciaflex.magalie.services.service.RequestedArticleService; import com.franciaflex.magalie.web.Activity; @@ -42,7 +42,7 @@ import java.util.List; @Results({ - @Result(name="success", type="redirectAction", params = { "actionName", "withdraw-item!input", "storageMovementOrderId", "${storageMovementOrderId}" }) + @Result(name="success", type="redirectAction", params = { "actionName", "withdraw-item!input", "requestedArticleId", "${requestedArticleId}" }) }) public class DeliverRequestedArticleAction extends MagalieActionSupport { @@ -52,14 +52,14 @@ protected RequestedArticleService service; - protected StorageMovementOrder storageMovementOrder; - protected RequestedList requestedList; protected List<String> listTypes; protected String listType; + protected RequestedArticle requestedArticle; + public void setService(RequestedArticleService service) { this.service = service; } @@ -127,7 +127,7 @@ } - storageMovementOrder = findOrderToExecuteResult.getStorageMovementOrder(); + requestedArticle = findOrderToExecuteResult.getRequestedArticle(); result = SUCCESS; @@ -159,7 +159,8 @@ } - public String getStorageMovementOrderId() { - return storageMovementOrder.getId(); + public String getRequestedArticleId() { + return requestedArticle.getId(); } + } Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -26,12 +26,10 @@ import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.Company; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.Warehouse; import com.franciaflex.magalie.services.exception.ArticleNotAvailableForKanbanException; import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; -import com.franciaflex.magalie.services.service.BookArticleResult; import com.franciaflex.magalie.services.service.FulfilKanbanService; import com.franciaflex.magalie.web.Activity; import com.franciaflex.magalie.web.MagalieActionSupport; @@ -47,7 +45,7 @@ @Results({ @Result(name="input", type = "dispatcher", location = "/WEB-INF/content/prepare-withdraw-item-input.jsp"), - @Result(name="success", type="redirectAction", params = { "actionName", "withdraw-item!input", "storageMovementOrderId", "${storageMovementOrderId}" }) + @Result(name="success", type="redirectAction", params = { "actionName", "withdraw-item!input", "articleId", "${articleId}", "destinationLocationId", "${destinationLocationId}", "expectedQuantity", "${quantity}" }) }) public class FulfilKanbanAction extends MagalieActionSupport implements Preparable { @@ -59,8 +57,6 @@ protected String articleBarcode; - protected StorageMovementOrder storageMovementOrder; - protected List<Warehouse> destinationWarehouses; protected String destinationWarehouseId; @@ -73,6 +69,8 @@ protected Warehouse destinationWarehouse; + protected String destinationLocationId; + public void setService(FulfilKanbanService service) { this.service = service; } @@ -135,8 +133,6 @@ log.debug("article barcode is " + articleBarcode); } - MagalieUser magalieUser = session.getMagalieUser(); - Company company = session.getCompany(); if (destinationWarehouseId == null) { @@ -198,40 +194,23 @@ } - BookArticleResult bookArticleResult = - service.fulfilKanbanTask(article, magalieUser, destinationWarehouse, quantity); + Location destinationLocation = service.getDestinationLocation(destinationWarehouse); - if (bookArticleResult.isArticleUnavailable()) { + destinationLocationId = destinationLocation.getId(); - addActionError("Article sans stock"); - - return INPUT; - - } - - if (bookArticleResult.isArticleInaccessible()) { - - addActionError("Un permis est nécessaire pour obtenir cet article"); - - return INPUT; - - } - - storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - return SUCCESS; } - public Article getArticle() { - return article; + public String getArticleId() { + return article.getId(); } - public String getArticleBarcode() { - return articleBarcode; + public Double getQuantity() { + return quantity; } - public String getStorageMovementOrderId() { - return storageMovementOrder.getId(); + public String getDestinationLocationId() { + return destinationLocationId; } } Added: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/GetRealTimeStorageMovementTaskJsonAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/GetRealTimeStorageMovementTaskJsonAction.java (rev 0) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/GetRealTimeStorageMovementTaskJsonAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -0,0 +1,54 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.services.service.ArticleStorageService; +import com.franciaflex.magalie.services.service.RealTimeStorageMovementTask; +import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; +import org.apache.struts2.convention.annotation.Result; +import org.apache.struts2.convention.annotation.Results; + +@Results({ + @Result(name="success", type="json") +}) +public class GetRealTimeStorageMovementTaskJsonAction extends MagalieActionSupport { + + protected ArticleStorageService service; + + protected MagalieSession session; + + protected String articleId; + + protected RealTimeStorageMovementTask realTimeStorageMovementTask; + + public void setService(ArticleStorageService service) { + this.service = service; + } + + public void setArticleId(String articleId) { + this.articleId = articleId; + } + + public void setSession(MagalieSession session) { + this.session = session; + } + + @Override + public String execute() { + + MagalieUser magalieUser = session.getMagalieUser(); + + Building building = session.getBuilding(); + + realTimeStorageMovementTask = service.getRealTimeStorageMovementTask(building, magalieUser, articleId); + + return SUCCESS; + + } + + public RealTimeStorageMovementTask getRealTimeStorageMovementTask() { + return realTimeStorageMovementTask; + } + +} Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -26,7 +26,6 @@ import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.Company; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import com.franciaflex.magalie.persistence.entity.Warehouse; import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; import com.franciaflex.magalie.services.service.FulfilKanbanService; @@ -53,8 +52,6 @@ protected String articleBarcode; - protected StorageMovementOrder storageMovementOrder; - protected List<Warehouse> destinationWarehouses; protected String destinationWarehouseId; @@ -175,8 +172,4 @@ return articleBarcode; } - public String getStorageMovementOrderId() { - return storageMovementOrder.getId(); - } - } Added: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SaveRealTimeStorageMovementJsonAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SaveRealTimeStorageMovementJsonAction.java (rev 0) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SaveRealTimeStorageMovementJsonAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -0,0 +1,92 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.services.service.ArticleStorageService; +import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; +import com.google.common.base.Preconditions; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.convention.annotation.Result; +import org.apache.struts2.convention.annotation.Results; + +@Results({ + @Result(name="success", type="json") +}) +public class SaveRealTimeStorageMovementJsonAction extends MagalieActionSupport { + + private static final Log log = LogFactory.getLog(SaveRealTimeStorageMovementJsonAction.class); + + protected ArticleStorageService service; + + protected MagalieSession session; + + protected String articleId; + + protected String originLocationId; + + protected String destinationLocationId; + + protected double quantity; + + protected StorageMovement storageMovement; + + public void setService(ArticleStorageService service) { + this.service = service; + } + + public void setSession(MagalieSession session) { + this.session = session; + } + + public void setArticleId(String articleId) { + this.articleId = articleId; + } + + public void setDestinationLocationId(String destinationLocationId) { + this.destinationLocationId = destinationLocationId; + } + + public void setOriginLocationId(String originLocationId) { + this.originLocationId = originLocationId; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + @Override + public String execute() throws Exception { + + try { + + Preconditions.checkNotNull(articleId); + + Preconditions.checkNotNull(originLocationId); + + Preconditions.checkNotNull(destinationLocationId); + + MagalieUser magalieUser = session.getMagalieUser(); + + storageMovement = service.saveStorageMovement(magalieUser, articleId, originLocationId, destinationLocationId, quantity); + + return SUCCESS; + + } catch (Exception e) { + + if (log.isErrorEnabled()) { + log.error("", e); + } + + throw e; + + } + + } + + public StorageMovement getStorageMovement() { + return storageMovement; + } + +} Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java 2013-07-12 17:43:32 UTC (rev 305) @@ -24,16 +24,20 @@ */ import com.franciaflex.magalie.MagalieTechnicalException; +import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedList; import com.franciaflex.magalie.persistence.entity.DeliveredRequestedListStatus; import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.RequestedArticle; import com.franciaflex.magalie.services.StorageMovementConfirmation; -import com.franciaflex.magalie.services.StorageMovementTask; import com.franciaflex.magalie.services.service.ArticleStorageService; import com.franciaflex.magalie.services.service.RequestedArticleService; import com.franciaflex.magalie.web.MagalieActionSupport; import com.franciaflex.magalie.web.MagalieSession; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import com.opensymphony.xwork2.Preparable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.convention.annotation.Result; @@ -48,7 +52,7 @@ @Result(name="KANBANS", type="redirectAction", params = { "actionName", "fulfil-kanban!input" }), @Result(name="REQUESTED_LISTS", type="redirectAction", params = { "actionName", "deliver-requested-article!input" }) }) -public class WithdrawItemAction extends MagalieActionSupport { +public class WithdrawItemAction extends MagalieActionSupport implements Preparable { private static final Log log = LogFactory.getLog(WithdrawItemAction.class); @@ -56,14 +60,32 @@ protected RequestedArticleService requestedArticleService; - protected String storageMovementOrderId; - - protected StorageMovementTask storageMovementTask; - protected StorageMovementConfirmation confirmation; protected MagalieSession session; + protected String articleId; + + protected String destinationLocationId; + + protected Double expectedQuantity; + + protected String requestedArticleId; + + protected Article article; + + public void setArticleId(String articleId) { + this.articleId = articleId; + } + + public void setDestinationLocationId(String destinationLocationId) { + this.destinationLocationId = destinationLocationId; + } + + public void setExpectedQuantity(Double expectedQuantity) { + this.expectedQuantity = expectedQuantity; + } + public void setSession(MagalieSession session) { this.session = session; } @@ -76,33 +98,61 @@ this.requestedArticleService = requestedArticleService; } - public void setStorageMovementOrderId(String storageMovementOrderId) { - this.storageMovementOrderId = storageMovementOrderId; + @Override + public void prepare() { + } @Override public String input() { - Preconditions.checkNotNull(storageMovementOrderId); + if (requestedArticleId != null) { - storageMovementTask = articleStorageService.getStorageMovementTask(storageMovementOrderId); + RequestedArticle requestedArticle = + requestedArticleService.getRequestedArticle(requestedArticleId); + expectedQuantity = requestedArticle.getQuantity(); + + destinationLocationId = requestedArticle.getDestinationLocation().getId(); + + article = requestedArticle.getArticle(); + + articleId = article.getId(); + + } + + Preconditions.checkNotNull(articleId); + + Preconditions.checkNotNull(destinationLocationId); + + article = articleStorageService.getArticle(articleId); + return INPUT; } - public String getStorageMovementOrderId() { - return storageMovementOrderId; + public String getRequestedArticleId() { + return requestedArticleId; } - public StorageMovementTask getStorageMovementTask() { - return storageMovementTask; + public Article getArticle() { + return article; } + public Double getExpectedQuantity() { + return expectedQuantity; + } + public String getModelAsJson() throws JSONException { - String json = JSONUtil.serialize(getStorageMovementTask()); + Map<String,Object> model = Maps.newHashMap(); + model.put("articleId", articleId); + model.put("destinationLocationId", destinationLocationId); + model.put("expectedQuantity", expectedQuantity); + + String json = JSONUtil.serialize(model); + return json; } @@ -133,11 +183,13 @@ articleStorageService.confirmStorageMovement(confirmation, magalieUser); - DeliveredRequestedList deliveredRequestedList = - requestedArticleService.getDeliveredRequestedList(confirmation.getStorageMovementOrderId()); + Optional<DeliveredRequestedList> deliveredRequestedListOptional = + requestedArticleService.getDeliveredRequestedList(confirmation); - if (deliveredRequestedList != null) { + if (deliveredRequestedListOptional.isPresent()) { + DeliveredRequestedList deliveredRequestedList = deliveredRequestedListOptional.get(); + if (deliveredRequestedList.getStatus() == DeliveredRequestedListStatus.COMPLETE) { session.addMessage("La liste " + deliveredRequestedList.getRequestedList().getCode() + " est terminée"); @@ -152,13 +204,14 @@ } - public String cancel(){ + public String cancel() { - articleStorageService.cancelStorageMovement(storageMovementOrderId); + articleStorageService.cancelStorageMovement(confirmation); String resultName = session.getActivity().name(); return resultName; } + } Modified: trunk/magalie-web/src/main/resources/struts.xml =================================================================== --- trunk/magalie-web/src/main/resources/struts.xml 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/resources/struts.xml 2013-07-12 17:43:32 UTC (rev 305) @@ -35,7 +35,7 @@ <interceptor-stack name="magalieStack"> <interceptor-ref name="magalieInterceptor" /> - <interceptor-ref name="defaultStack" /> + <interceptor-ref name="paramsPrepareParamsStack" /> </interceptor-stack> </interceptors> Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp 2013-07-12 17:43:32 UTC (rev 305) @@ -35,9 +35,6 @@ bindKey('4', function(){ redirectTo($('#preparePreparedArticleReceptionLink'));}); bindKey('5', function(){ redirectTo($('#storageTransferLink'));}); bindKey('6', function(){ redirectTo($('#prepareWithdrawItemLink'));}); - <s:if test="movementOrderResume" > - bindKey('7', function(){ redirectTo($('#movementOrderResumeLink'));}); - </s:if> bindKey('Esc', function(){ redirectTo($('#logoutLink'));}); }); </script> @@ -67,12 +64,5 @@ <s:url action="prepare-withdraw-item!input" id="prepareWithdrawItemUrl"/> <s:a href="%{prepareWithdrawItemUrl}" cssClass="btn btn-block" id="prepareWithdrawItemLink" >Sorties toiles (6)</s:a> -<s:if test="movementOrderResume" > - <s:url action="withdraw-item!input" id="movementOrderResumeUrl"> - <s:param name="storageMovementOrderId" value="%{movementOrderResume.id}" /> - </s:url> - <s:a href="%{movementOrderResumeUrl}" cssClass="btn btn-block" id="movementOrderResumeLink" >Reprendre l'ordre de mouvement (7)</s:a> -</s:if> - <s:url action="logout" id="logoutUrl"/> <s:a href="%{logoutUrl}" cssClass="btn btn-block" id="logoutLink" >Déconnexion (Esc)</s:a> Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp 2013-07-12 17:43:32 UTC (rev 305) @@ -23,6 +23,8 @@ <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> +<%-- XXX bleny cette page est utilisée comme vue pour deux actions ! --%> + <head> <title>Traitement des kanbans</title> <script type="text/javascript"> Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp 2013-07-12 17:43:32 UTC (rev 305) @@ -25,43 +25,54 @@ <head> <script> + <s:url action="get-real-time-storage-movement-task-json" id="getRealTimeStorageMovementTaskJsonUrl" /> + var getRealTimeStorageMovementTaskJsonUrl = '<s:property value="%{getRealTimeStorageMovementTaskJsonUrl}" />'; + <s:url action="save-real-time-storage-movement-json" id="saveRealTimeStorageMovementJsonUrl" /> + var saveRealTimeStorageMovementJsonUrl = '<s:property value="%{saveRealTimeStorageMovementJsonUrl}" />'; var model = <s:property value="modelAsJson" escapeHtml="false" />; </script> <script src="<s:url value='/js/withdraw-item-input.js' />"></script> - <title>Traitement des listes à servir</title> + <title>Prélèvement d'un article</title> <link rel="stylesheet" href="<s:url value='/css/magalie-ck3x-reduced.css' />"/> </head> <header> <dl class="dl-horizontal"> <dt>Réf.</dt> - <dd><s:property value="storageMovementTask.article.code" /></dd> + <dd><s:property value="article.code" /></dd> <dt>Desc.</dt> - <dd><s:property value="storageMovementTask.article.description" /></dd> + <dd><s:property value="article.description" /></dd> <dt>Prélev.</dt> - <dd><span id="withdrawn">0</span> / <s:property value="storageMovementTask.quantity" /> <s:property value="storageMovementTask.article.unit" /></dd> + <dd> + <span id="withdrawn">0</span> + <s:if test="expectedQuantity"> + / <s:property value="expectedQuantity" /> + </s:if> + <s:property value="article.unit" /> + </dd> </dl> </header> <section id="storageMovements"> </section> <s:form cssClass="form-horizontal"> <s:textfield name="locationBarcode" label="Empl." inputAppendIcon="barcode" cssClass="input-small" /> - <s:textfield name="quantity" label="Qté" inputAppend="%{storageMovementTask.article.unit}" cssClass="input-mini" /> + <s:textfield name="quantity" label="Qté" inputAppend="%{article.unit}" cssClass="input-mini" /> <s:hidden name="confirmation" /> <div class="btn-group"> <s:url action="withdraw-item!cancel" id="cancelUrl" > - <s:param name="storageMovementOrderId" value="%{storageMovementOrderId}" /> + <%--s:param name="storageMovementOrderId" value="%{storageMovementOrderId}" /--%> </s:url> <s:a href="%{cancelUrl}" cssClass="btn btn-small" id="cancelLink" >Quitter (Esc)</s:a> <input type="button" id="reportError" value="Anomalie (F5)" class="btn btn-danger btn-small" /> - <s:submit name="next" value="Suivant" cssClass="btn btn-primary btn-small" /> + <input type="button" id="next" value="Suivant" class="btn btn-primary btn-small" /> + <s:submit name="confirm" value="Terminer" cssClass="btn btn-success btn-small" /> </div> </s:form> <div id="storageMovementTemplate" class="template"> <div> - <span data="originLocation.warehouse.code"></span> - <span data="originLocation.code"></span> - <span data="withdrawn">0</span> / <span data="expectedQuantity"></span> <s:property value="storageMovementTask.article.unit" /> + <span data="storedArticle.location.warehouse.code"></span> + <span data="storedArticle.location.code"></span> + <span data="withdrawn">0</span> / <span data="expectedQuantity"></span> / <span data="storedArticle.quantity"></span> <s:property value="article.unit" /> </div> </div> Modified: trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js =================================================================== --- trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js 2013-07-12 17:43:32 UTC (rev 305) @@ -21,22 +21,47 @@ * #L% */ -model.storageMovementsIndex = 0; -model.allowSubmit = false; +//model.allowSubmit = false; +// +//model.isFulfilled = function() { +// var isFull = this.withdrawn() === this.quantity; +// return isFull; +//}; +// +//model.allIsUsed = function() { +// return this.storageMovementsIndex == null; +//}; +// +//model.canTerminate = function() { +// var canTerminate = this.isFulfilled() || this.allIsUsed(); +// return canTerminate; +//}; +// +// +// +// +//model.nextLocation = function() { +// this.storageMovementsIndex += 1; +// if (this.storageMovementsIndex >= this.storageMovements.length) { +// this.storageMovementsIndex = null; +// } else { +// var storageMovement = this.storageMovements[this.storageMovementsIndex]; +// if (storageMovement.expectedQuantity == 0.) { +// console.debug("will use extra location " + storageMovement.storedArticle.location.code); +// var remainingQuantity = this.quantity - this.withdrawn(); +// storageMovement.expectedQuantity = remainingQuantity; +//// var availableQuantityInLocation = storageMovement.availableQuantity; +//// storageMovement.expectedQuantity = Math.min(remainingQuantity, availableQuantityInLocation); +// console.debug("pushing new value to withdraw: " + storageMovement.expectedQuantity); +// } +// } +//}; +// -model.isFulfilled = function() { - var isFull = this.withdrawn() === this.quantity; - return isFull; -}; -model.allIsUsed = function() { - return this.storageMovementsIndex == null; -}; -model.canTerminate = function() { - var canTerminate = this.isFulfilled() || this.allIsUsed(); - return canTerminate; -}; +model.storageMovements = []; +model.storageMovementsIndex = -1; model.withdrawn = function() { var withdrawn = 0; @@ -46,17 +71,54 @@ return withdrawn; }; +model.remaining = function() { + var remaining = null; + if (this.expectedQuantity) { + remaining = this.expectedQuantity - this.withdrawn(); + } + if (remaining < 0.) { + remaining = 0.; + } + return remaining; +} + +model.newEmptyStorageMovementForNextLocation = function() { + var storageMovement; + $.ajax({ + dataType: "json", + url: getRealTimeStorageMovementTaskJsonUrl, + data: { articleId: this.articleId }, + async: false, + success: function(data) { + storageMovement = data.realTimeStorageMovementTask; + }, + fail: function(jqXHR, textStatus, errorThrown) { + console.error(jqXHR); + console.error(textStatus); + console.error(errorThrown); + } + }); + if (storageMovement.articleUnavailable) { + alert('Pas de stock'); + } else { + storageMovement.expectedQuantity = Math.min(model.remaining(), storageMovement.storedArticle.quantity); + this.storageMovements.push(storageMovement); + this.storageMovementsIndex += 1; + } +} + model.getStorageMovement = function(barcode) { if (barcode == '') { throw new ValidationError("Il faut indiquer le code barre d'un emplacement"); } var storageMovement; for (var i = 0; i < this.storageMovements.length; i++) { - if (barcode == this.storageMovements[i].originLocation.barcode) { + if (barcode == this.storageMovements[i].storedArticle.location.barcode) { storageMovement = this.storageMovements[i]; } } if (storageMovement == null) { + // TODO try to load it ! throw new ValidationError(barcode + " n'est pas le code barre d'un emplacement valide"); } return storageMovement; @@ -68,10 +130,29 @@ } var storageMovement = this.getStorageMovement(barcode); storageMovement.used = true; - storageMovement.defect = - storageMovement.expectedQuantity != 0. // don't mark a location in error just because we wasn't supposed to withdraw item from it in the order - && quantity != storageMovement.expectedQuantity; + storageMovement.defect = quantity < storageMovement.expectedQuantity && confirm('Signaler anomalie ?'); storageMovement.withdrawn = quantity; + var model = this; + $.ajax({ + dataType: "json", + url: saveRealTimeStorageMovementJsonUrl, + data: { + articleId: model.articleId, + originLocationId: storageMovement.storedArticle.location.id, + destinationLocationId: model.destinationLocationId, + quantity: storageMovement.withdrawn + }, + async: false, + success: function(data) { + console.log(data); + storageMovement.id = data.storageMovement.id; + }, + fail: function(jqXHR, textStatus, errorThrown) { + console.l(jqXHR); + console.error(textStatus); + console.error(errorThrown); + } + }); }; model.reportError = function(barcode) { @@ -80,41 +161,26 @@ storageMovement.defect = true; }; -model.nextLocation = function() { - this.storageMovementsIndex += 1; - if (this.storageMovementsIndex >= this.storageMovements.length) { - this.storageMovementsIndex = null; - } else { - var storageMovement = this.storageMovements[this.storageMovementsIndex]; - if (storageMovement.expectedQuantity == 0.) { - console.debug("will use extra location " + storageMovement.originLocation.code); - var remainingQuantity = this.quantity - this.withdrawn(); - storageMovement.expectedQuantity = remainingQuantity; -// var availableQuantityInLocation = storageMovement.availableQuantity; -// storageMovement.expectedQuantity = Math.min(remainingQuantity, availableQuantityInLocation); - console.debug("pushing new value to withdraw: " + storageMovement.expectedQuantity); - } - } -}; - model.getConfirmation = function() { - var locationsIdsToActualQuantities = {}; + var storageMovementIds = []; var locationInErrorIds = []; - $.each(model.storageMovements, function(key, storageMovement) { + $.each(this.storageMovements, function(key, storageMovement) { if (storageMovement.used) { - locationsIdsToActualQuantities[storageMovement.originLocation.id] = storageMovement.withdrawn; + storageMovementIds.push(storageMovement.id); if (storageMovement.defect) { - locationInErrorIds.push(storageMovement.originLocation.id); + locationInErrorIds.push(storageMovement.storedArticle.location.id); } } }); + var model = this; var confirmation = { - storageMovementOrderId: this.storageMovementOrderId, - locationsIdsToActualQuantities: locationsIdsToActualQuantities, + requestedArticleId: model.requestedArticleId, + articleId: model.articleId, + storageMovementIds: storageMovementIds, locationInErrorIds: locationInErrorIds }; return confirmation; -} +}; var view = { @@ -145,7 +211,7 @@ } else { $(storageMovementElement).addClass('success'); } - } else if (storageMovement.originLocation.id === model.storageMovements[model.storageMovementsIndex].originLocation.id && ! model.canTerminate()) { + } else if (storageMovement.storedArticle.location.id === model.storageMovements[model.storageMovementsIndex].storedArticle.location.id) { $(storageMovementElement).addClass('pending'); } else { $(storageMovementElement).hide(); @@ -159,7 +225,7 @@ // reset field to prevent reuse of the value by mistake $('#withdraw-item_locationBarcode').val(''); // set default value of quantity to what should be withdrawn on the current location - if (model.storageMovementsIndex != null) { + if (model.storageMovementsIndex != null && model.storageMovementsIndex >= 0) { $('#withdraw-item_quantity').val(model.storageMovements[model.storageMovementsIndex].expectedQuantity); } }, @@ -184,26 +250,25 @@ var controller = { + onShowFirstLocation : function () { + + model.newEmptyStorageMovementForNextLocation(); + + }, + onNext : function() { try { - if (model.allowSubmit) { + var barcode = $('#withdraw-item_locationBarcode').val(); + var quantity = parseFloat($('#withdraw-item_quantity').val()); - } else { + model.withdraw(barcode, quantity); - var barcode = $('#withdraw-item_locationBarcode').val(); - var quantity = parseFloat($('#withdraw-item_quantity').val()); + model.newEmptyStorageMovementForNextLocation(); - model.withdraw(barcode, quantity); + view.refresh(); - // if used location focused as current, highlight next location to go - if (barcode == model.storageMovements[model.storageMovementsIndex].originLocation.barcode) { - model.nextLocation(); - } - - } - } catch (ex) { if (ex instanceof ValidationError) { @@ -212,32 +277,24 @@ throw ex; } } + }, onReportError : function() { try { - if (model.allowSubmit) { + var barcode = $('#withdraw-item_locationBarcode').val(); + var quantity = parseFloat($('#withdraw-item_quantity').val()); - } else { + model.withdraw(barcode, quantity); - var barcode = $('#withdraw-item_locationBarcode').val(); - var quantity = parseFloat($('#withdraw-item_quantity').val()); + model.reportError(barcode); - model.withdraw(barcode, quantity); + model.newEmptyStorageMovementForNextLocation(); - model.reportError(barcode); + view.refresh(); - // if used location focused as current, highlight next location to go - if (barcode == model.storageMovements[model.storageMovementsIndex].originLocation.barcode) { - model.nextLocation(); - } - - view.refresh(); - - } - } catch (ex) { if (ex instanceof ValidationError) { @@ -249,18 +306,10 @@ }, onSubmit : function(e) { - if (model.allowSubmit) { - // push model as Json in a hidden field - $('#withdraw-item_confirmation').val(JSON.stringify(model.getConfirmation())); - } else { - e.preventDefault(); - if (model.canTerminate()) { - model.allowSubmit = true; - } + // push model as Json in a hidden field + $('#withdraw-item_confirmation').val(JSON.stringify(model.getConfirmation())); - view.refresh(); - } }, }; @@ -270,8 +319,10 @@ $('#withdraw-item').submit(controller.onSubmit); $('#reportError').click(controller.onReportError); $('#reportCancel').click(controller.onCancel); - $('#withdraw-item_next').click(controller.onNext); + $('#next').click(controller.onNext); + // $('#withdraw-item_confirm').click(controller.confirm); bindKey('F5', controller.onReportError); bindKey('Esc', function(){ redirectTo($('#cancelLink'));}); + controller.onShowFirstLocation(); view.refresh(); }); Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-07-11 19:43:16 UTC (rev 304) +++ trunk/pom.xml 2013-07-12 17:43:32 UTC (rev 305) @@ -125,7 +125,7 @@ <seleniumVersion>2.28.0</seleniumVersion> <mockitoVersion>1.9.5</mockitoVersion> <nuitonI18nVersion>2.5</nuitonI18nVersion> - <eugeneVersion>2.6.3</eugeneVersion> + <eugeneVersion>2.6.4-SNAPSHOT</eugeneVersion> <!-- license to use --> <license.licenseName>agpl_v3</license.licenseName>