Author: bleny Date: 2013-03-25 15:46:07 +0100 (Mon, 25 Mar 2013) New Revision: 36 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: introduce services and view for fulfil kanaban Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StorageMovements.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementOrderDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementOrderDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovementOrder.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/FulfilKanbanService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieBarcodeService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieUsersService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/InvalidMagalieBarcodeException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/MagalieException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/UnavailableArticleException.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java trunk/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp Removed: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/ArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java trunk/magalie-persistence/src/main/resources/magalie.properties trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieSession.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java trunk/magalie-web/src/main/webapp/WEB-INF/content/index.jsp trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp trunk/pom.xml Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StorageMovements.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StorageMovements.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StorageMovements.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,20 @@ +package com.franciaflex.magalie; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.StorageMovement; +import com.google.common.base.Function; + +public class StorageMovements { + + protected static class GetArticleFunction implements Function<StorageMovement, Article> { + + @Override + public Article apply(StorageMovement storageMovement) { + return storageMovement.getArticle(); + } + } + + public static Function<StorageMovement, Article> getArticleFunction() { + return new GetArticleFunction(); + } +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/ArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/ArticleDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/ArticleDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -7,4 +7,6 @@ */ public interface ArticleDao extends Dao<Article> { + Article findByCode(String articleCode); + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -7,4 +7,6 @@ */ public interface MagalieUserDao extends Dao<MagalieUser> { + MagalieUser findByLogin(String login); + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -12,6 +12,4 @@ List<StorageMovement> findAllByArticle(Article article); - void persistAll(Iterable<StorageMovement> storageMovements); - } Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementOrderDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementOrderDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StorageMovementOrderDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,7 @@ +package com.franciaflex.magalie.dao; + +import com.franciaflex.magalie.entity.StorageMovementOrder; + +public interface StorageMovementOrderDao extends Dao<StorageMovementOrder> { + +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaArticleDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaArticleDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -2,8 +2,10 @@ import com.franciaflex.magalie.dao.ArticleDao; import com.franciaflex.magalie.entity.Article; +import com.google.common.collect.Iterables; import javax.persistence.EntityManager; +import javax.persistence.Query; public class JpaArticleDao extends AbstractJpaDao<Article> implements ArticleDao { @@ -15,4 +17,16 @@ protected Class<Article> getEntityClass() { return Article.class; } + + @Override + public Article findByCode(String articleCode) { + Query query = entityManager.createQuery("from article a where a.code = :code"); + query.setParameter("code", articleCode); + Article article = (Article) + Iterables.getOnlyElement( + query.getResultList(), + null + ); + return article; + } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -2,8 +2,11 @@ import com.franciaflex.magalie.dao.MagalieUserDao; import com.franciaflex.magalie.entity.MagalieUser; +import com.google.common.collect.Iterables; import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.List; public class JpaMagalieUserDao extends AbstractJpaDao<MagalieUser> implements MagalieUserDao { @@ -15,4 +18,13 @@ protected Class<MagalieUser> getEntityClass() { return MagalieUser.class; } + + @Override + public MagalieUser findByLogin(String login) { + Query query = entityManager.createQuery("from magalieUser mu where mu.login = login"); + query.setParameter("login", login); + List<MagalieUser> resultList = query.getResultList(); + MagalieUser onlyElement = Iterables.getOnlyElement(resultList, null); + return onlyElement; + } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -26,13 +26,4 @@ return query.getResultList(); } - @Override - public void persistAll(Iterable<StorageMovement> storageMovements) { - // EntityTransaction transaction = entityManager.getTransaction(); - // transaction.begin(); - for (StorageMovement storageMovement : storageMovements) { - persist(storageMovement); - } - // transaction.commit(); - } } Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementOrderDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementOrderDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementOrderDao.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,19 @@ +package com.franciaflex.magalie.dao.jpa; + +import com.franciaflex.magalie.dao.StorageMovementOrderDao; +import com.franciaflex.magalie.entity.StorageMovementOrder; + +import javax.persistence.EntityManager; + +public class JpaStorageMovementOrderDao extends AbstractJpaDao<StorageMovementOrder> implements StorageMovementOrderDao { + + public JpaStorageMovementOrderDao(EntityManager entityManager) { + super(entityManager); + } + + @Override + protected Class<StorageMovementOrder> getEntityClass() { + return StorageMovementOrder.class; + } + +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java 2013-03-25 14:46:07 UTC (rev 36) @@ -13,6 +13,7 @@ if (this == o) return true; if (!(o instanceof AbstractJpaEntity)) return false; AbstractJpaEntity that = (AbstractJpaEntity) o; + if (id == null && that.getId() == null) return false; if (!id.equals(that.getId())) return false; return Objects.equal(id, that.getId()); } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java 2013-03-25 14:46:07 UTC (rev 36) @@ -88,4 +88,24 @@ public boolean isConfirmed() { return confirmDate != null; } + + public String getSiteId() { + return getSite().getId(); + } + + public boolean isDriverLicenseRequired() { + return getSite().isDriverLicenseRequired(); + } + + public String getStoreCode() { + return getSite().getStoreCode(); + } + + public String getLocationCode() { + return getSite().getLocationCode(); + } + + public String getSiteBarcode() { + return getSite().getBarcode(); + } } Copied: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovementOrder.java (from rev 31, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java) =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovementOrder.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovementOrder.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,104 @@ +package com.franciaflex.magalie.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.StorageMovements; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.Set; + +@Entity +public class StorageMovementOrder extends AbstractJpaEntity { + + @Id + @GeneratedValue + protected String id; + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @OneToMany(cascade = CascadeType.ALL) + protected Set<StorageMovement> storageMovements; + + public Set<StorageMovement> getStorageMovements() { + return storageMovements; + } + + public void setStorageMovements(Set<StorageMovement> storageMovements) { + this.storageMovements = storageMovements; + } + + public Set<StorageMovement> getSites() { + return storageMovements; + } + + 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 : storageMovements) { + quantity += storageMovement.getQuantity(); + } + return quantity; + } + + public void addStorageMovement(StorageMovement storageMovement) { + if (storageMovements == null) { + storageMovements = Sets.newLinkedHashSet(); + } + storageMovements.add(storageMovement); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} Modified: trunk/magalie-persistence/src/main/resources/magalie.properties =================================================================== --- trunk/magalie-persistence/src/main/resources/magalie.properties 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/main/resources/magalie.properties 2013-03-25 14:46:07 UTC (rev 36) @@ -1,9 +1,9 @@ javax.persistence.jdbc.driver=org.h2.Driver -javax.persistence.jdbc.url=jdbc:h2:file:/tmp/magalie/h2data +javax.persistence.jdbc.url=jdbc:h2:file:/tmp/magalie/h2data;DB_CLOSE_ON_EXIT=FALSE javax.persistence.jdbc.user=sa javax.persistence.jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.hbm2ddl.auto=create-drop +hibernate.hbm2ddl.auto=validate hibernate.show_sql=true hibernate.format_sql=true hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy Modified: trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java =================================================================== --- trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java 2013-03-25 14:46:07 UTC (rev 36) @@ -32,9 +32,9 @@ //// entityManager.persist(new SiteError()); //// entityManager.persist(new StorageMovement()); // -// List<Site> sites = fixtures.fixture("sites"); +// List<Site> storageMovements = fixtures.fixture("storageMovements"); // -// for (Site site : sites) { +// for (Site site : storageMovements) { // // entityManager.persist(site); // Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java 2013-03-25 14:46:07 UTC (rev 36) @@ -2,12 +2,16 @@ import com.franciaflex.magalie.StoredArticles; import com.franciaflex.magalie.dao.StorageMovementDao; +import com.franciaflex.magalie.dao.StorageMovementOrderDao; import com.franciaflex.magalie.dao.StoredArticleDao; import com.franciaflex.magalie.entity.Article; import com.franciaflex.magalie.entity.MagalieUser; import com.franciaflex.magalie.entity.Site; import com.franciaflex.magalie.entity.StorageMovement; +import com.franciaflex.magalie.entity.StorageMovementOrder; import com.franciaflex.magalie.entity.StoredArticle; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -32,7 +36,7 @@ this.serviceContext = serviceContext; } - public WithdrawTask withdrawArticle(MagalieUser magalieUser, Article article, double requestedQuantity) throws UnavailableArticleException, RequiredDriverLicenceException { + public StorageMovementTask withdrawArticle(MagalieUser magalieUser, Article article, double requestedQuantity) throws UnavailableArticleException, RequiredDriverLicenceException { Preconditions.checkNotNull(magalieUser); @@ -75,12 +79,12 @@ ) ); - WithdrawTask withdrawTask = new WithdrawTask(article, requestedQuantity); + StorageMovementOrder storageMovementOrder = new StorageMovementOrder(); + StorageMovementTask storageMovementTask = new StorageMovementTask(storageMovementOrder); + double quantity = 0; - List<StorageMovement> newStorageMovements = Lists.newLinkedList(); - Date orderDate = serviceContext.getDate(); for (StoredArticle storedArticle : sortedStoredArticles) { @@ -91,38 +95,38 @@ double quantityWithdrawn = Math.min(quantityLeft, quantityInSite); - if (quantityWithdrawn > 0.) { + quantity += quantityWithdrawn; - quantity += quantityWithdrawn; + StorageMovement newStorageMovement = new StorageMovement(); - StorageMovement newStorageMovement = new StorageMovement(); + newStorageMovement.setArticle(article); - newStorageMovement.setArticle(article); + newStorageMovement.setOrderDate(orderDate); - newStorageMovement.setOrderDate(orderDate); + newStorageMovement.setMagalieUser(magalieUser); - newStorageMovement.setMagalieUser(magalieUser); + newStorageMovement.setSite(storedArticle.getSite()); - newStorageMovement.setSite(storedArticle.getSite()); + // we remove from the stock so negative number + newStorageMovement.setQuantity( -1. * quantityWithdrawn); - // we remove from the stock so negative number - newStorageMovement.setQuantity( -1. * quantityWithdrawn); + if (quantityWithdrawn > 0.) { - newStorageMovements.add(newStorageMovement); + storageMovementOrder.addStorageMovement(newStorageMovement); - } + } else { - WithdrawArticleFromSiteTask withdrawArticleFromSiteTask = new WithdrawArticleFromSiteTask(storedArticle, quantityWithdrawn); + storageMovementTask.addExtraStorageMovement(newStorageMovement); - withdrawTask.addWithdrawArticleFromSiteTask(withdrawArticleFromSiteTask); + } } - StorageMovementDao storageMovementDao = serviceContext.getStorageMovementDao(); + StorageMovementOrderDao dao = serviceContext.getStorageMovementOrderDao(); - storageMovementDao.persistAll(newStorageMovements); + dao.persist(storageMovementOrder); - return withdrawTask; + return storageMovementTask; } @@ -165,7 +169,7 @@ } - // exclude sites reported in error + // exclude storageMovements reported in error SiteErrorsService siteErrorsService = serviceContext.newService(SiteErrorsService.class); Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-25 14:46:07 UTC (rev 36) @@ -7,12 +7,14 @@ import com.franciaflex.magalie.dao.RequestedArticleDao; import com.franciaflex.magalie.dao.SiteErrorDao; import com.franciaflex.magalie.dao.StorageMovementDao; +import com.franciaflex.magalie.dao.StorageMovementOrderDao; import com.franciaflex.magalie.dao.StoredArticleDao; import com.franciaflex.magalie.dao.jpa.JpaArticleDao; import com.franciaflex.magalie.dao.jpa.JpaMagalieUserDao; import com.franciaflex.magalie.dao.jpa.JpaRequestedArticleDao; import com.franciaflex.magalie.dao.jpa.JpaSiteErrorDao; import com.franciaflex.magalie.dao.jpa.JpaStorageMovementDao; +import com.franciaflex.magalie.dao.jpa.JpaStorageMovementOrderDao; import com.franciaflex.magalie.dao.jpa.JpaStoredArticleDao; import javax.persistence.EntityManager; @@ -109,4 +111,9 @@ public SiteErrorDao getSiteErrorDao() { return new JpaSiteErrorDao(entityManager); } + + @Override + public StorageMovementOrderDao getStorageMovementOrderDao() { + return new JpaStorageMovementOrderDao(entityManager); + } } Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/FulfilKanbanService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/FulfilKanbanService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/FulfilKanbanService.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,52 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class FulfilKanbanService implements MagalieService { + + private static final Log log = LogFactory.getLog(FulfilKanbanService.class); + + protected MagalieServiceContext serviceContext; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public StorageMovementTask fulfilKanbanTask( + String articleBarcode, + MagalieUser magalieUser) throws InvalidMagalieBarcodeException, + UnavailableArticleException, + RequiredDriverLicenceException { + + if (log.isInfoEnabled()) { + log.info(magalieUser + " requested fulfil kanban with barcode " + articleBarcode); + } + + MagalieBarcodeService magalieBarcodeService = + serviceContext.newService(MagalieBarcodeService.class); + + Article article = magalieBarcodeService.getArticle(articleBarcode); + + double quantityInKanban = article.getQuantityInKanban(); + + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); + + + StorageMovementTask storageMovementTask = + articleStorageService.withdrawArticle( + magalieUser, + article, + quantityInKanban); + + return storageMovementTask; + + } +} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieBarcodeService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieBarcodeService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieBarcodeService.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,59 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.dao.ArticleDao; +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; + +public class MagalieBarcodeService implements MagalieService { + + protected MagalieServiceContext serviceContext; + + protected static final String BARCODE_ELEMENTS_SEPARATOR = "_"; + + protected static final String ARTICLE_BARCODE_PREFIX = "ART"; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public Article getArticle(String articleBarcode) throws InvalidMagalieBarcodeException { + + Iterable<String> split = Splitter.on(BARCODE_ELEMENTS_SEPARATOR).split(articleBarcode); + + if (Iterables.size(split) != 2) { + + throw new InvalidMagalieBarcodeException("Unexpected barcode format, 2 parts expected"); + + } + + String prefix = Iterables.get(split, 0); + + if ( ! ARTICLE_BARCODE_PREFIX.equals(prefix)) { + + throw new InvalidMagalieBarcodeException( + "not an article barcode. expected prefix '" + + ARTICLE_BARCODE_PREFIX + ", '" + prefix + "' found."); + + } + + String articleCode = Iterables.get(split, 1); + + ArticleDao articleDao = serviceContext.getArticleDao(); + + Article article = articleDao.findByCode(articleCode); + + if (article == null) { + + throw new InvalidMagalieBarcodeException( + "no article with code " + articleCode); + + } + + return article; + + } + +} Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,20 +0,0 @@ -package com.franciaflex.magalie.services; - -public class MagalieException extends Exception { - - public MagalieException() { - } - - public MagalieException(String message) { - super(message); - } - - public MagalieException(String message, Throwable cause) { - super(message, cause); - } - - public MagalieException(Throwable cause) { - super(cause); - } - -} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java 2013-03-25 14:46:07 UTC (rev 36) @@ -29,6 +29,7 @@ import com.franciaflex.magalie.dao.RequestedArticleDao; import com.franciaflex.magalie.dao.SiteErrorDao; import com.franciaflex.magalie.dao.StorageMovementDao; +import com.franciaflex.magalie.dao.StorageMovementOrderDao; import com.franciaflex.magalie.dao.StoredArticleDao; import java.util.Date; @@ -56,4 +57,5 @@ SiteErrorDao getSiteErrorDao(); + StorageMovementOrderDao getStorageMovementOrderDao(); } Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieUsersService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieUsersService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieUsersService.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,28 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.dao.MagalieUserDao; +import com.franciaflex.magalie.entity.MagalieUser; +import com.google.common.base.Preconditions; + +public class MagalieUsersService implements MagalieService { + + protected MagalieServiceContext serviceContext; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public MagalieUser getMagalieUser(String login) { + + MagalieUserDao dao = serviceContext.getMagalieUserDao(); + + MagalieUser magalieUser = dao.findByLogin(login); + + Preconditions.checkArgument(magalieUser != null, "there is no user with login '" + login + "'"); + + return magalieUser; + + } + +} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java 2013-03-25 14:46:07 UTC (rev 36) @@ -27,6 +27,8 @@ import com.franciaflex.magalie.dao.MagalieUserDao; import com.franciaflex.magalie.entity.Article; import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; public class RequestedItemService implements MagalieService { @@ -36,7 +38,7 @@ this.serviceContext = serviceContext; } - public WithdrawTask getWithdrawTask() throws RequiredDriverLicenceException, UnavailableArticleException { + public StorageMovementTask getWithdrawTask() throws RequiredDriverLicenceException, UnavailableArticleException { ArticleStorageService articleStorageService = serviceContext.newService(ArticleStorageService.class); @@ -48,13 +50,14 @@ Article article1 = articleDao.findById("article1"); - WithdrawTask withdrawTask = articleStorageService.withdrawArticle( - alexandre, - article1, - 40. - ); + StorageMovementTask storageMovementTask = + articleStorageService.withdrawArticle( + alexandre, + article1, + 40. + ); - return withdrawTask; + return storageMovementTask; } } Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,58 +0,0 @@ -package com.franciaflex.magalie.services; - -import com.franciaflex.magalie.entity.Article; -import com.franciaflex.magalie.entity.MagalieUser; - -public class RequiredDriverLicenceException extends MagalieException { - - protected Article article; - - protected MagalieUser magalieUser; - - protected double requestedQuantity; - - protected double accessibleQuantity; - - protected RequiredDriverLicenceException(String message) { - super(message); - } - - public static void throwIfRequestMoreThanAccessible(double requestedQuantity, double accessibleQuantity, MagalieUser magalieUser, Article article) throws RequiredDriverLicenceException { - - if (requestedQuantity > accessibleQuantity) { - - String message = "requested article " + article - + " can not be retrieved since user " + magalieUser - + " has no driver license"; - - RequiredDriverLicenceException newException = new RequiredDriverLicenceException(message); - - newException.article = article; - - newException.magalieUser = magalieUser; - - newException.requestedQuantity = requestedQuantity; - - newException.accessibleQuantity = accessibleQuantity; - - throw newException; - - } - } - - public Article getArticle() { - return article; - } - - public MagalieUser getMagalieUser() { - return magalieUser; - } - - public double getRequestedQuantity() { - return requestedQuantity; - } - - public double getAccessibleQuantity() { - return accessibleQuantity; - } -} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,49 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.StorageMovement; +import com.franciaflex.magalie.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 List<StorageMovement> getSites() { + + List<StorageMovement> sites = Lists.newLinkedList(); + + sites.addAll(storageMovementOrder.getStorageMovements()); + + sites.addAll(extraStorageMovements); + + return sites; + + } + + public void addExtraStorageMovement(StorageMovement extraStorageMovement) { + extraStorageMovements.add(extraStorageMovement); + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } +} Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,49 +0,0 @@ -package com.franciaflex.magalie.services; - -import com.franciaflex.magalie.entity.Article; - -public class UnavailableArticleException extends MagalieException { - - protected Article article; - - protected double availableQuantity; - - protected double requestedQuantity; - - protected UnavailableArticleException(String message) { - super(message); - } - - public static void throwIfRequestMoreThanAvailable(double requestedQuantity, double availableQuantity, Article article) throws UnavailableArticleException { - - if (requestedQuantity > availableQuantity) { - - String message = "requested article " + article - + " is not available at expected quantity: requested = " + requestedQuantity - + " available = " + availableQuantity; - - UnavailableArticleException newException = new UnavailableArticleException(message); - - newException.article = article; - - newException.availableQuantity = availableQuantity; - - newException.requestedQuantity = requestedQuantity; - - throw newException; - - } - } - - public Article getArticle() { - return article; - } - - public double getAvailableQuantity() { - return availableQuantity; - } - - public double getRequestedQuantity() { - return requestedQuantity; - } -} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java 2013-03-25 14:46:07 UTC (rev 36) @@ -18,26 +18,8 @@ return quantity; } - public String getSiteId() { - return storedArticle.getSite().getId(); - } - public boolean isDriverLicenseRequired() { - return storedArticle.getSite().isDriverLicenseRequired(); - } - public String getStoreCode() { - return storedArticle.getSite().getStoreCode(); - } - - public String getLocationCode() { - return storedArticle.getSite().getLocationCode(); - } - - public String getSiteBarcode() { - return storedArticle.getSite().getBarcode(); - } - @Override public String toString() { return ToStringBuilder.reflectionToString(this); Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,80 +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.entity.Article; -import com.google.common.collect.Sets; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.Set; - -public class WithdrawTask { - - protected Set<WithdrawArticleFromSiteTask> sites; - - protected Article article; - - protected double quantity; - - public WithdrawTask(Article article, double quantity) { - this.article = article; - this.quantity = quantity; - } - - public Set<WithdrawArticleFromSiteTask> getSites() { - return sites; - } - - public void setSites(Set<WithdrawArticleFromSiteTask> sites) { - this.sites = sites; - } - - public Article getArticle() { - return article; - } - - public void setArticle(Article article) { - this.article = article; - } - - public double getQuantity() { - return quantity; - } - - public void setQuantity(double quantity) { - this.quantity = quantity; - } - - public void addWithdrawArticleFromSiteTask(WithdrawArticleFromSiteTask withdrawArticleFromSiteTask) { - if (sites == null) { - sites = Sets.newLinkedHashSet(); - } - sites.add(withdrawArticleFromSiteTask); - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } -} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/InvalidMagalieBarcodeException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/InvalidMagalieBarcodeException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/InvalidMagalieBarcodeException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,8 @@ +package com.franciaflex.magalie.services.exception; + +public class InvalidMagalieBarcodeException extends MagalieException { + + public InvalidMagalieBarcodeException(String message) { + super(message); + } +} Copied: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/MagalieException.java (from rev 31, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java) =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/MagalieException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/MagalieException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,20 @@ +package com.franciaflex.magalie.services.exception; + +public class MagalieException extends Exception { + + public MagalieException() { + } + + public MagalieException(String message) { + super(message); + } + + public MagalieException(String message, Throwable cause) { + super(message, cause); + } + + public MagalieException(Throwable cause) { + super(cause); + } + +} Copied: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java (from rev 31, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java) =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,58 @@ +package com.franciaflex.magalie.services.exception; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; + +public class RequiredDriverLicenceException extends MagalieException { + + protected Article article; + + protected MagalieUser magalieUser; + + protected double requestedQuantity; + + protected double accessibleQuantity; + + protected RequiredDriverLicenceException(String message) { + super(message); + } + + public static void throwIfRequestMoreThanAccessible(double requestedQuantity, double accessibleQuantity, MagalieUser magalieUser, Article article) throws RequiredDriverLicenceException { + + if (requestedQuantity > accessibleQuantity) { + + String message = "requested article " + article + + " can not be retrieved since user " + magalieUser + + " has no driver license"; + + RequiredDriverLicenceException newException = new RequiredDriverLicenceException(message); + + newException.article = article; + + newException.magalieUser = magalieUser; + + newException.requestedQuantity = requestedQuantity; + + newException.accessibleQuantity = accessibleQuantity; + + throw newException; + + } + } + + public Article getArticle() { + return article; + } + + public MagalieUser getMagalieUser() { + return magalieUser; + } + + public double getRequestedQuantity() { + return requestedQuantity; + } + + public double getAccessibleQuantity() { + return accessibleQuantity; + } +} Copied: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/UnavailableArticleException.java (from rev 31, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java) =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/UnavailableArticleException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/UnavailableArticleException.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,49 @@ +package com.franciaflex.magalie.services.exception; + +import com.franciaflex.magalie.entity.Article; + +public class UnavailableArticleException extends MagalieException { + + protected Article article; + + protected double availableQuantity; + + protected double requestedQuantity; + + protected UnavailableArticleException(String message) { + super(message); + } + + public static void throwIfRequestMoreThanAvailable(double requestedQuantity, double availableQuantity, Article article) throws UnavailableArticleException { + + if (requestedQuantity > availableQuantity) { + + String message = "requested article " + article + + " is not available at expected quantity: requested = " + requestedQuantity + + " available = " + availableQuantity; + + UnavailableArticleException newException = new UnavailableArticleException(message); + + newException.article = article; + + newException.availableQuantity = availableQuantity; + + newException.requestedQuantity = requestedQuantity; + + throw newException; + + } + } + + public Article getArticle() { + return article; + } + + public double getAvailableQuantity() { + return availableQuantity; + } + + public double getRequestedQuantity() { + return requestedQuantity; + } +} Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-25 14:46:07 UTC (rev 36) @@ -4,6 +4,9 @@ import com.franciaflex.magalie.entity.Article; import com.franciaflex.magalie.entity.MagalieUser; import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.StorageMovement; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; import com.google.common.collect.Iterables; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,12 +37,12 @@ MagalieUser basile = fixture("basile"); Article article = fixture("article1"); - WithdrawTask withdrawTask; + StorageMovementTask storageMovementTask; try { - withdrawTask = service.withdrawArticle(basile, article, 100.); + storageMovementTask = service.withdrawArticle(basile, article, 100.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } Assert.fail(); } catch (UnavailableArticleException e) { @@ -55,12 +58,12 @@ MagalieUser basile = fixture("basile"); Article article = fixture("article1"); - WithdrawTask withdrawTask; + StorageMovementTask storageMovementTask; try { - withdrawTask = service.withdrawArticle(basile, article, 70.); + storageMovementTask = service.withdrawArticle(basile, article, 70.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } Assert.fail(); } catch (RequiredDriverLicenceException e) { @@ -76,12 +79,12 @@ MagalieUser basile = fixture("basile"); Article article = fixture("article1"); - WithdrawTask withdrawTask = null; + StorageMovementTask storageMovementTask = null; try { - withdrawTask = service.withdrawArticle(basile, article, 50.); + storageMovementTask = service.withdrawArticle(basile, article, 50.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { @@ -95,7 +98,7 @@ Assert.fail(); } - Assert.assertEquals(1, withdrawTask.getSites().size()); + Assert.assertEquals(1, storageMovementTask.getSites().size()); } @Test @@ -103,12 +106,12 @@ MagalieUser alexandre = fixture("alexandre"); Article article = fixture("article1"); - WithdrawTask withdrawTask = null; + StorageMovementTask storageMovementTask = null; try { - withdrawTask = service.withdrawArticle(alexandre, article, 50.); + storageMovementTask = service.withdrawArticle(alexandre, article, 50.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { @@ -122,11 +125,11 @@ Assert.fail(); } - Assert.assertEquals(2, withdrawTask.getSites().size()); - WithdrawArticleFromSiteTask site1 = Iterables.get(withdrawTask.getSites(), 0, null); - Assert.assertEquals(20., site1.getQuantity(), DELTA); - WithdrawArticleFromSiteTask site2 = Iterables.get(withdrawTask.getSites(), 1, null); - Assert.assertEquals(30., site2.getQuantity(), DELTA); + Assert.assertEquals(2, storageMovementTask.getSites().size()); + StorageMovement site1 = Iterables.get(storageMovementTask.getSites(), 0, null); + Assert.assertEquals(-20., site1.getQuantity(), DELTA); + StorageMovement site2 = Iterables.get(storageMovementTask.getSites(), 1, null); + Assert.assertEquals(-30., site2.getQuantity(), DELTA); } @Test @@ -137,20 +140,20 @@ Article article = fixture("article1"); - WithdrawTask withdrawTask = null; + StorageMovementTask storageMovementTask = null; try { - withdrawTask = service.withdrawArticle(alexandre, article, 30.); + storageMovementTask = service.withdrawArticle(alexandre, article, 30.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } - Assert.assertEquals(2, withdrawTask.getSites().size()); - WithdrawArticleFromSiteTask site1 = Iterables.get(withdrawTask.getSites(), 0, null); - Assert.assertEquals(20., site1.getQuantity(), DELTA); - Assert.assertEquals("B2", site1.getLocationCode()); - WithdrawArticleFromSiteTask site2 = Iterables.get(withdrawTask.getSites(), 1, null); - Assert.assertEquals(10., site2.getQuantity(), DELTA); - Assert.assertEquals("A1", site2.getLocationCode()); + Assert.assertEquals(2, storageMovementTask.getSites().size()); + StorageMovement storageMovement1 = Iterables.get(storageMovementTask.getSites(), 0, null); + Assert.assertEquals(-20., storageMovement1.getQuantity(), DELTA); + Assert.assertEquals("B2", storageMovement1.getSite().getLocationCode()); + StorageMovement storageMovement2 = Iterables.get(storageMovementTask.getSites(), 1, null); + Assert.assertEquals(-10., storageMovement2.getQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement2.getSite().getLocationCode()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); @@ -164,14 +167,14 @@ } try { - withdrawTask = service.withdrawArticle(cathy, article, 30.); + storageMovementTask = service.withdrawArticle(cathy, article, 30.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } - Assert.assertEquals(1, withdrawTask.getSites().size()); - WithdrawArticleFromSiteTask site1 = Iterables.get(withdrawTask.getSites(), 0, null); - Assert.assertEquals(30., site1.getQuantity(), DELTA); - Assert.assertEquals("A1", site1.getLocationCode()); + Assert.assertEquals(1, storageMovementTask.getSites().size()); + StorageMovement storageMovement = Iterables.get(storageMovementTask.getSites(), 0, null); + Assert.assertEquals(-30., storageMovement.getQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement.getSite().getLocationCode()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); @@ -199,16 +202,16 @@ siteErrorsService.reportError(site2, alexandre); try { - WithdrawTask withdrawTask = service.withdrawArticle(cathy, article, 30.); + StorageMovementTask storageMovementTask = service.withdrawArticle(cathy, article, 30.); if (log.isDebugEnabled()) { - log.debug("withdrawTask = " + withdrawTask); + log.debug("storageMovementTask = " + storageMovementTask); } - Assert.assertEquals(1, withdrawTask.getSites().size()); - WithdrawArticleFromSiteTask site = Iterables.get(withdrawTask.getSites(), 0, null); + Assert.assertEquals(1, storageMovementTask.getSites().size()); + StorageMovement storageMovement = Iterables.get(storageMovementTask.getSites(), 0, null); Assert.assertNotEquals( "site2 must not be returned because it was reported in error", site2.getId(), - site.getSiteId()); + storageMovement.getSite().getId()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,16 +1,19 @@ package com.franciaflex.magalie.services; +import com.franciaflex.magalie.AbstractMagalieServiceTest; import com.google.common.collect.Sets; import org.junit.Test; import java.util.Comparator; import java.util.Set; -public class RequestedItemServiceTest { +public class RequestedItemServiceTest extends AbstractMagalieServiceTest { @Test public void testGetWithdrawTask() throws Exception { + getServiceContext(); + Set<Double> doubles = Sets.newTreeSet(new Comparator<Double>() { @Override public int compare(Double o1, Double o2) { 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-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieInterceptor.java 2013-03-25 14:46:07 UTC (rev 36) @@ -24,9 +24,11 @@ */ import com.franciaflex.magalie.MagalieApplicationConfig; +import com.franciaflex.magalie.entity.MagalieUser; import com.franciaflex.magalie.services.DefaultMagalieServiceContext; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; +import com.franciaflex.magalie.services.MagalieUsersService; import com.google.common.base.Preconditions; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; @@ -82,7 +84,7 @@ } else if (MagalieSession.class.isAssignableFrom(propertyType)) { - toInject = getMagalieSession(invocation); + toInject = getMagalieSession(invocation, serviceContext); } else if (MagalieApplicationConfig.class.isAssignableFrom(propertyType)) { @@ -113,7 +115,7 @@ } - protected MagalieSession getMagalieSession(ActionInvocation invocation) { + protected MagalieSession getMagalieSession(ActionInvocation invocation, MagalieServiceContext serviceContext) { MagalieSession session = (MagalieSession) invocation.getInvocationContext().getSession().get(MagalieSession.SESSION_PARAMETER); @@ -121,6 +123,12 @@ session = new MagalieSession(); + MagalieUsersService magalieUsersService = serviceContext.newService(MagalieUsersService.class); + + MagalieUser magalieUser = magalieUsersService.getMagalieUser("ale"); + + session.setMagalieUser(magalieUser); + invocation.getInvocationContext().getSession().put(MagalieSession.SESSION_PARAMETER, session); } Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieSession.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieSession.java 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieSession.java 2013-03-25 14:46:07 UTC (rev 36) @@ -1,5 +1,7 @@ package com.franciaflex.magalie.web; +import com.franciaflex.magalie.entity.MagalieUser; + import java.io.Serializable; /** @@ -14,5 +16,13 @@ */ public static final String SESSION_PARAMETER = "magalieSession"; + protected MagalieUser magalieUser; + public MagalieUser getMagalieUser() { + return magalieUser; + } + + public void setMagalieUser(MagalieUser magalieUser) { + this.magalieUser = magalieUser; + } } Added: 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 (rev 0) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,81 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.services.FulfilKanbanService; +import com.franciaflex.magalie.services.StorageMovementTask; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; +import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; +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="redirect", location="/", params = { "" , "" }) +}) +public class FulfilKanbanAction extends MagalieActionSupport { + + private static final Log log = LogFactory.getLog(FulfilKanbanAction.class); + + protected MagalieSession session; + + protected FulfilKanbanService service; + + protected String articleBarcode; + + protected StorageMovementTask storageMovementTask; + + public void setArticleBarcode(String articleBarcode) { + this.articleBarcode = articleBarcode; + } + + public void setService(FulfilKanbanService service) { + this.service = service; + } + + @Override + public String execute() { + + if (log.isDebugEnabled()) { + log.debug("article barcode is " + articleBarcode); + } + + MagalieUser magalieUser = session.getMagalieUser(); + + try { + + storageMovementTask = service.fulfilKanbanTask(articleBarcode, magalieUser); + + } catch (InvalidMagalieBarcodeException e) { + + addFieldError("articleBarcode", "Le code barre n'est pas un code valide"); + + return INPUT; + + } catch (UnavailableArticleException e) { + + addActionError("Cet article n'est pas disponible"); + + return INPUT; + + } catch (RequiredDriverLicenceException e) { + + addActionError("Un permis est nécessaire pour obtenir cet article"); + + return INPUT; + + } + + return SUCCESS; + + } + + public StorageMovementTask getStorageMovementTask() { + return storageMovementTask; + } + +} 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-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/WithdrawItemAction.java 2013-03-25 14:46:07 UTC (rev 36) @@ -24,9 +24,9 @@ */ import com.franciaflex.magalie.services.RequestedItemService; -import com.franciaflex.magalie.services.RequiredDriverLicenceException; -import com.franciaflex.magalie.services.UnavailableArticleException; -import com.franciaflex.magalie.services.WithdrawTask; +import com.franciaflex.magalie.services.StorageMovementTask; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; import com.franciaflex.magalie.web.MagalieActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,7 +39,7 @@ protected RequestedItemService service; - protected WithdrawTask withdrawTask; + protected StorageMovementTask storageMovementTask; public void setService(RequestedItemService service) { this.service = service; @@ -53,13 +53,13 @@ } - public WithdrawTask getWithdrawTask() { - return withdrawTask; + public StorageMovementTask getStorageMovementTask() { + return storageMovementTask; } public String getModelAsJson() throws JSONException { - String json = JSONUtil.serialize(getWithdrawTask()); + String json = JSONUtil.serialize(getStorageMovementTask()); return json; @@ -68,7 +68,7 @@ @Override public String input() throws RequiredDriverLicenceException, UnavailableArticleException { - withdrawTask = service.getWithdrawTask(); + storageMovementTask = service.getWithdrawTask(); return INPUT; Added: trunk/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp (rev 0) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp 2013-03-25 14:46:07 UTC (rev 36) @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +<head> + <title>Traitement des kanbans</title> +</head> + +<form class="form-horizontal"> + <s:textfield name="articleBarcode" label="Article" inputAppendIcon="barcode" cssClass="input-small" /> + + <div class="btn-group"> + <s:submit name="next" value="Suivant" cssClass="btn btn-primary btn-small" /> + </div> +</form> \ No newline at end of file Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/index.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/index.jsp 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/index.jsp 2013-03-25 14:46:07 UTC (rev 36) @@ -27,6 +27,7 @@ <%@ taglib prefix="sj" uri="/struts-jquery-tags" %> <s:url namespace="/" action="withdraw-item!input" id="withdrawItemUrl"/> +<s:url namespace="/" action="fulfil-kanban!input" id="fulfilKanbanUrl"/> <header> <dl class="dl-horizontal"> @@ -38,5 +39,5 @@ </header> <s:a href="%{withdrawItemUrl}" cssClass="btn btn-block">Traiter listes à servir</s:a> -<s:a href="" cssClass="btn btn-block">Traiter kanbans</s:a> +<s:a href="%{fulfilKanbanUrl}" cssClass="btn btn-block">Traiter kanbans</s:a> <s:a href="" cssClass="btn btn-block">Traiter les réceptions fournisseurs</s:a> 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-03-22 16:03:14 UTC (rev 35) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp 2013-03-25 14:46:07 UTC (rev 36) @@ -34,20 +34,20 @@ <header> <dl class="dl-horizontal"> <dt>Réf.</dt> - <dd><s:property value="withdrawTask.article.code" /></dd> + <dd><s:property value="storageMovementTask.article.code" /></dd> <dt>Desc.</dt> - <dd><s:property value="withdrawTask.article.description" /></dd> + <dd><s:property value="storageMovementTask.article.description" /></dd> <dt>LàS</dt> <dd>123456789</dd> <dt>Prélev.</dt> - <dd><span id="withdrawn">0</span> / <s:property value="withdrawTask.quantity" /> <s:property value="withdrawTask.article.unit" /></dd> + <dd><span id="withdrawn">0</span> / <s:property value="storageMovementTask.quantity" /> <s:property value="storageMovementTask.article.unit" /></dd> </dl> </header> <section id="sites"> </section> <form class="form-horizontal"> <s:textfield name="site" label="Empl." inputAppendIcon="barcode" cssClass="input-small" /> - <s:textfield name="quantity" label="Qté" inputAppend="%{withdrawTask.article.description}" cssClass="input-mini" /> + <s:textfield name="quantity" label="Qté" inputAppend="%{storageMovementTask.article.unit}" cssClass="input-mini" /> <s:hidden name="model" /> <div class="btn-group"> @@ -60,6 +60,6 @@ <dt>Empl.</dt> <dd data="locationCode"></dd> <dt>Prélev.</dt> - <dd><span data="withdrawn">0</span> / <span data="quantity"></span> <s:property value="withdrawTask.article.description" /></dd> + <dd><span data="withdrawn">0</span> / <span data="quantity"></span> <s:property value="storageMovementTask.article.unit" /></dd> </dl> </div> Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-03-22 16:03:14 UTC (rev 35) +++ trunk/pom.xml 2013-03-25 14:46:07 UTC (rev 36) @@ -209,7 +209,7 @@ <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>${struts2Version}</version> - <scope>runtime</scope> + <scope>compile</scope> </dependency> <dependency>