r167 - in trunk: magalie-persistence/src/main/java/com/franciaflex/magalie/persistence magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa magalie-services/src/main/java/com/franciaflex/magalie/services/service magalie-services/src/test/java/com/franciaflex/magalie/services/service
Author: bleny Date: 2013-05-17 18:33:36 +0200 (Fri, 17 May 2013) New Revision: 167 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: prevent user to recept a same article multiple times Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Articles.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StorageMovementJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Articles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Articles.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Articles.java 2013-05-17 16:33:36 UTC (rev 167) @@ -0,0 +1,20 @@ +package com.franciaflex.magalie.persistence; + +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Supplier; +import com.google.common.base.Function; + +public class Articles { + + protected static class GetSupplierFunction implements Function<Article, Supplier> { + + @Override + public Supplier apply(Article article) { + return article.getSupplier(); + } + } + + public static GetSupplierFunction getSupplierFunction() { + return new GetSupplierFunction(); + } +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-05-17 16:33:36 UTC (rev 167) @@ -27,7 +27,9 @@ import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.persistence.entity.Supplier; import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -142,6 +144,14 @@ return predicate; } + protected static class GetArticleFunction implements Function<StoredArticle, Article> { + + @Override + public Article apply(StoredArticle storedArticle) { + return storedArticle.getArticle(); + } + } + public static Comparator<StoredArticle> articleStoredInLocationsRequiringDriverLicenseFirstComparator() { return new ArticleStoredInLocationsRequiringDriverLicenseFirstComparator(); } @@ -153,4 +163,13 @@ public static Predicate<StoredArticle> notEmpty() { return new NotEmptyPredicate(); } + + public static Function<StoredArticle, Article> getArticleFunction() { + return new GetArticleFunction(); + } + + public static Function<StoredArticle, Supplier> getArticleSupplierFunction() { + return Functions.compose(Articles.getSupplierFunction(), getArticleFunction()); + } + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java 2013-05-17 16:33:36 UTC (rev 167) @@ -24,6 +24,7 @@ */ import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.StorageMovement; import java.util.List; @@ -37,4 +38,5 @@ List<StorageMovement> findAll(); + List<StorageMovement> findAllInReception(Building building); } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StorageMovementJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StorageMovementJpaDao.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StorageMovementJpaDao.java 2013-05-17 16:33:36 UTC (rev 167) @@ -23,8 +23,10 @@ * #L% */ +import com.franciaflex.magalie.persistence.Locations; import com.franciaflex.magalie.persistence.dao.StorageMovementDao; import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.StorageMovement; import javax.persistence.EntityManager; @@ -50,6 +52,18 @@ } @Override + public List<StorageMovement> findAllInReception(Building building) { + Query query = entityManager.createQuery( + " from StorageMovement sm" + + " where sm.originLocation.code = :codeForReceptionLocations and sm.originLocation.warehouse.building = :building" + + " or " + + " sm.destinationLocation.code = :codeForReceptionLocations and sm.destinationLocation.warehouse.building = :building"); + query.setParameter("building", building); + query.setParameter("codeForReceptionLocations", Locations.codeForReceptionLocations()); + return query.getResultList(); + } + + @Override public List<StorageMovement> findAll() { Query query = entityManager.createQuery("from StorageMovement sm order by sm.orderDate"); return query.getResultList(); Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java 2013-05-17 16:33:36 UTC (rev 167) @@ -61,7 +61,11 @@ TypedQuery<StoredArticle> query = createQuery("from StoredArticle sa where sa.location.warehouse.building = :building and sa.location.code = :code"); query.setParameter("building", building); query.setParameter("code", Locations.codeForReceptionLocations()); - return findAll(query); + List<StoredArticle> resultList = findAll(query); + for (StoredArticle storedArticle : resultList) { + entityManager.detach(storedArticle); + } + return resultList; } @Override @@ -70,6 +74,10 @@ query.setParameter("building", building); query.setParameter("supplierId", supplierId); query.setParameter("code", Locations.codeForReceptionLocations()); - return findAll(query); + List<StoredArticle> resultList = findAll(query); + for (StoredArticle storedArticle : resultList) { + entityManager.detach(storedArticle); + } + return resultList; } } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-05-17 16:33:36 UTC (rev 167) @@ -25,11 +25,11 @@ import com.franciaflex.magalie.persistence.Locations; import com.franciaflex.magalie.persistence.MagaliePersistenceContext; +import com.franciaflex.magalie.persistence.StorageMovements; import com.franciaflex.magalie.persistence.StoredArticles; import com.franciaflex.magalie.persistence.dao.LocationDao; import com.franciaflex.magalie.persistence.dao.StorageMovementDao; import com.franciaflex.magalie.persistence.dao.StoredArticleDao; -import com.franciaflex.magalie.persistence.dao.SupplierDao; import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.Location; @@ -41,6 +41,8 @@ import com.franciaflex.magalie.services.MagalieServiceContext; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import com.google.common.collect.Ordering; import com.google.common.collect.Sets; @@ -60,16 +62,18 @@ public List<Supplier> getReceivedSuppliers(Building building) { - MagaliePersistenceContext persistenceContext = - serviceContext.getPersistenceContext(); + List<StoredArticle> allReceivedArticles = getReceivedArticles(building, null); - SupplierDao supplierDao = persistenceContext.getSupplierDao(); + Iterable<Supplier> suppliers = + Sets.newHashSet( // to prevent multiple occurrence of the same supplier + Iterables.transform( + allReceivedArticles, + StoredArticles.getArticleSupplierFunction() + ) + ); - List<Supplier> suppliers = - supplierDao.findAllWithReceivedArticles(building); + return Lists.newArrayList(suppliers); - return suppliers; - } public List<StoredArticle> getReceivedArticles(Building building, String supplierId) { @@ -77,23 +81,61 @@ MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - StoredArticleDao dao = + StoredArticleDao storedArticleDao = persistenceContext.getStoredArticleDao(); - List<StoredArticle> receivedArticles; + Iterable<StoredArticle> receivedArticles; if (supplierId == null) { - receivedArticles = dao.findAllReceivedForAllSupplier(building); + receivedArticles = storedArticleDao.findAllReceivedForAllSupplier(building); } else { - receivedArticles = dao.findAllReceivedForSupplier(building, supplierId); + receivedArticles = storedArticleDao.findAllReceivedForSupplier(building, supplierId); } - return receivedArticles; + // remove all items that have already been moved from the reception location + StorageMovementDao storageMovementDao = + persistenceContext.getStorageMovementDao(); + + List<StorageMovement> allStorageMovementsInReception = + storageMovementDao.findAllInReception(building); + + Multimap<Article, StoredArticle> storedArticlesByArticles = + Multimaps.index(receivedArticles, StoredArticles.getArticleFunction()); + + Multimap<Article, StorageMovement> allStorageMovementsInReceptionByArticle = + Multimaps.index(allStorageMovementsInReception, StorageMovements.getArticleFunction()); + + for (Map.Entry<Article, StoredArticle> articleStored : storedArticlesByArticles.entries()) { + + Article article = articleStored.getKey(); + + StoredArticle storedArticle = articleStored.getValue(); + + Location location = storedArticle.getLocation(); + + for (StorageMovement storageMovement : allStorageMovementsInReceptionByArticle.get(article)) { + + if (storageMovement.getOriginLocation().equals(location)) { + + double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); + + storedArticle.setQuantity(actualQuantity); + + } + + } + + } + + receivedArticles = Iterables.filter(receivedArticles, StoredArticles.notEmpty()); + + return Lists.newArrayList(receivedArticles); + } public ReceptionTask getReceptionTask(String storedArticleId) { Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-05-17 15:42:52 UTC (rev 166) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-05-17 16:33:36 UTC (rev 167) @@ -172,4 +172,20 @@ Assert.assertEquals(1, storageMovements.size()); } + + @Test + public void testWeCannotReceiveTheSameItemMultipleTime() throws Exception { + + testConfirmReception(); + + List<StoredArticle> receivedArticles = + service.getReceivedArticles(building, supplier.getId()); + + Assert.assertTrue(receivedArticles.isEmpty()); + + List<Supplier> receivedSuppliers = service.getReceivedSuppliers(building); + + Assert.assertTrue(receivedSuppliers.isEmpty()); + + } }
participants (1)
-
bleny@users.forge.codelutin.com