Author: bleny Date: 2013-04-18 14:43:33 +0200 (Thu, 18 Apr 2013) New Revision: 112 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: add hook for when a requestedlist is completed Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/DeliveredRequestedArticles.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/RequestedArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/AbstractJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/DeliveredRequestedArticleJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationErrorJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/MagalieUserJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/RequestedArticleJpaDao.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/StorageMovementOrder.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/RequestedArticleService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/DeliveredRequestedArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/DeliveredRequestedArticles.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/DeliveredRequestedArticles.java 2013-04-18 12:43:33 UTC (rev 112) @@ -0,0 +1,19 @@ +package com.franciaflex.magalie.persistence; + +import com.franciaflex.magalie.persistence.entity.DeliveredRequestedArticle; +import com.google.common.base.Predicate; + +public class DeliveredRequestedArticles { + + public static Predicate<DeliveredRequestedArticle> isConfirmedPredicate() { + return new ConfirmedPredicate(); + } + + private static class ConfirmedPredicate implements Predicate<DeliveredRequestedArticle> { + + @Override + public boolean apply(DeliveredRequestedArticle deliveredRequestedArticle) { + return deliveredRequestedArticle.isConfirmed(); + } + } +} 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -1,10 +1,18 @@ package com.franciaflex.magalie.persistence.dao; 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 extends Dao<DeliveredRequestedArticle> { + DeliveredRequestedArticle find(StorageMovementOrder storageMovementOrder); + + List<DeliveredRequestedArticle> findAll(RequestedList requestedList); + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -3,6 +3,7 @@ import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.RequestedArticle; +import com.franciaflex.magalie.persistence.entity.RequestedList; import java.util.List; @@ -13,4 +14,6 @@ List<RequestedArticle> findAllUndelivered(Building building, MagalieUser affectedTo); + List<RequestedArticle> findAll(RequestedList requestedList); + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/AbstractJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/AbstractJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/AbstractJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -2,6 +2,7 @@ import com.franciaflex.magalie.persistence.dao.Dao; import com.franciaflex.magalie.persistence.entity.AbstractEntity; +import com.google.common.collect.Iterables; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -51,4 +52,22 @@ return entityManager.contains(entity); } + protected TypedQuery<E> createQuery(String hql) { + TypedQuery<E> query = entityManager.createQuery(hql, getEntityClass()); + return query; + } + + protected List<E> findAll(TypedQuery<E> query) { + return query.getResultList(); + } + + protected E findUnique(TypedQuery<E> query) { + return query.getSingleResult(); + } + + protected E findUniqueOrNull(TypedQuery<E> query) { + List<E> all = findAll(query); + E onlyElement = Iterables.getOnlyElement(all, null); + return onlyElement; + } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/DeliveredRequestedArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/DeliveredRequestedArticleJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/DeliveredRequestedArticleJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -2,8 +2,12 @@ import com.franciaflex.magalie.persistence.dao.DeliveredRequestedArticleDao; 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; +import java.util.List; public class DeliveredRequestedArticleJpaDao extends AbstractJpaDao<DeliveredRequestedArticle> implements DeliveredRequestedArticleDao { @@ -16,4 +20,21 @@ return DeliveredRequestedArticle.class; } + @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( + "from DeliveredRequestedArticle dra where dra.requestedArticle.requestedList = :requestedList", getEntityClass()); + query.setParameter("requestedList", requestedList); + return findAll(query); + } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationErrorJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationErrorJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationErrorJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -3,10 +3,10 @@ import com.franciaflex.magalie.persistence.dao.LocationErrorDao; import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.LocationError; -import com.google.common.collect.Iterables; import javax.persistence.EntityManager; import javax.persistence.Query; +import javax.persistence.TypedQuery; import java.util.List; public class LocationErrorJpaDao extends AbstractJpaDao<LocationError> implements LocationErrorDao { @@ -22,13 +22,9 @@ @Override public LocationError findByLocation(Location location) { - Query query = entityManager.createQuery("from LocationError se where se.location = :location"); + TypedQuery<LocationError> query = createQuery("from LocationError se where se.location = :location"); query.setParameter("location", location); - LocationError locationError = (LocationError) - Iterables.getOnlyElement( - query.getResultList(), - null); - return locationError; + return findUniqueOrNull(query); } @Override Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -20,10 +20,9 @@ @Override public Location find(String code, Warehouse warehouse) { - TypedQuery<Location> query = entityManager.createQuery("from Location l where l.code = :code and l.warehouse = :warehouse", getEntityClass()); + TypedQuery<Location> query = createQuery("from Location l where l.code = :code and l.warehouse = :warehouse"); query.setParameter("code", code); query.setParameter("warehouse", warehouse); - Location singleResult = query.getSingleResult(); - return singleResult; + return findUnique(query); } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/MagalieUserJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/MagalieUserJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/MagalieUserJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -2,10 +2,10 @@ import com.franciaflex.magalie.persistence.dao.MagalieUserDao; import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.google.common.collect.Iterables; import javax.persistence.EntityManager; import javax.persistence.Query; +import javax.persistence.TypedQuery; import java.util.List; public class MagalieUserJpaDao extends AbstractJpaDao<MagalieUser> implements MagalieUserDao { @@ -21,11 +21,9 @@ @Override public MagalieUser findByLogin(String login) { - Query query = entityManager.createQuery("from MagalieUser mu where mu.login = :login"); + TypedQuery<MagalieUser> query = 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; + return findUnique(query); } @Override Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/RequestedArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/RequestedArticleJpaDao.java 2013-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/RequestedArticleJpaDao.java 2013-04-18 12:43:33 UTC (rev 112) @@ -5,6 +5,7 @@ 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.RequestedList; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -23,19 +24,23 @@ @Override public List<RequestedArticle> findAllUndelivered(Building building, MagalieUser affectedTo) { - TypedQuery<RequestedArticle> query = - entityManager.createQuery( + TypedQuery<RequestedArticle> query = createQuery( "from RequestedArticle ra where " + " ra not in (select dra.requestedArticle from DeliveredRequestedArticle dra) " + " and ra.requestedList.building = :building " - + " and ra.requestedList not in (select drl.requestedList from DeliveredRequestedList drl where drl.status = :complete or drl.status = :affected and drl.affectedTo != :affectedTo)", - getEntityClass() - ); + + " and ra.requestedList not in (select drl.requestedList from DeliveredRequestedList drl where drl.status = :complete or drl.status = :affected and drl.affectedTo != :affectedTo)"); query.setParameter("building", building); query.setParameter("complete", DeliveredRequestedListStatus.COMPLETE); query.setParameter("affected", DeliveredRequestedListStatus.AFFECTED); query.setParameter("affectedTo", affectedTo); - return query.getResultList(); + return findAll(query); } + @Override + public List<RequestedArticle> findAll(RequestedList requestedList) { + TypedQuery<RequestedArticle> query = createQuery("from RequestedArticle ra where ra.requestedList = :requestedList"); + query.setParameter("requestedList", requestedList); + return findAll(query); + } + } 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/DeliveredRequestedArticle.java 2013-04-18 12:43:33 UTC (rev 112) @@ -38,4 +38,8 @@ public void setRequestedArticle(RequestedArticle requestedArticle) { this.requestedArticle = requestedArticle; } + + public boolean isConfirmed() { + return getStorageMovementOrder().isConfirmed(); + } } Modified: 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java 2013-04-18 12:43:33 UTC (rev 112) @@ -143,4 +143,12 @@ Location onlyElement = Iterables.getOnlyElement(getDestinationLocations()); return onlyElement; } + + public boolean isConfirmed() { + boolean isConfirmed = Iterables.all( + getStorageMovements(), + StorageMovements.storageMovementIsConfirmed()); + return isConfirmed; + } + } 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-18 12:43:33 UTC (rev 112) @@ -23,6 +23,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -140,7 +141,7 @@ bookArticleResult.setAvailableQuantity(quantity); - if (storageMovementOrder.getStorageMovements().isEmpty()) { + if (CollectionUtils.isEmpty(storageMovementOrder.getStorageMovements())) { storageMovementOrder = null; @@ -370,6 +371,11 @@ storageMovementOrderDao.merge(storageMovementOrder); + RequestedArticleService requestedArticleService = + serviceContext.newService(RequestedArticleService.class); + + requestedArticleService.onStorageMovementConfirmation(storageMovementOrder); + persistenceContext.commit(); } 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-04-18 12:43:33 UTC (rev 112) @@ -23,6 +23,7 @@ * #L% */ +import com.franciaflex.magalie.persistence.DeliveredRequestedArticles; import com.franciaflex.magalie.persistence.MagaliePersistenceContext; import com.franciaflex.magalie.persistence.RequestedArticles; import com.franciaflex.magalie.persistence.dao.DeliveredRequestedArticleDao; @@ -41,6 +42,7 @@ import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -317,4 +319,59 @@ return all; } + + public void onStorageMovementConfirmation(StorageMovementOrder storageMovementOrder) { + + MagaliePersistenceContext persistenceContext = + serviceContext.getPersistenceContext(); + + DeliveredRequestedArticleDao deliveredRequestedArticleDao = + persistenceContext.getDeliveredRequestedArticleDao(); + + DeliveredRequestedArticle deliveredRequestedArticle = + deliveredRequestedArticleDao.find(storageMovementOrder); + + if (deliveredRequestedArticle != null) { + + // a order is confirmed and this order is about a requested article + // so we may update the status of the list + + RequestedList requestedList = + deliveredRequestedArticle.getRequestedArticle().getRequestedList(); + + RequestedArticleDao requestedArticleDao = + persistenceContext.getRequestedArticleDao(); + + List<RequestedArticle> requestedArticles = + requestedArticleDao.findAll(requestedList); + + List<DeliveredRequestedArticle> deliveredRequestedArticles = + deliveredRequestedArticleDao.findAll(requestedList); + + boolean allIsConfirmed = deliveredRequestedArticles.size() == requestedArticles.size() + && Iterables.all( + deliveredRequestedArticles, + DeliveredRequestedArticles.isConfirmedPredicate()); + + if (allIsConfirmed) { + + if (log.isInfoEnabled()) { + log.info("all requested articles have confirmed order, marking list " + + requestedList.getCode() + " as complete"); + } + + DeliveredRequestedListDao deliveredRequestedListDao = + persistenceContext.getDeliveredRequestedListDao(); + + DeliveredRequestedList deliveredRequestedList = + deliveredRequestedListDao.findByRequestedList(requestedList); + + deliveredRequestedList.setStatus(DeliveredRequestedListStatus.COMPLETE); + + } + + } + + } + } 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-04-18 12:42:00 UTC (rev 111) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-04-18 12:43:33 UTC (rev 112) @@ -13,6 +13,7 @@ import java.text.ParseException; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Queue; @@ -101,4 +102,52 @@ } + @Test + public void testFindOrderRequestedArticlesForUnavailableArticle() { + + RequestedArticle requestedArticle4 = fixture("requestedArticle4"); + + LinkedList<RequestedArticle> fakePriorityQueue = + Lists.newLinkedList(); + + fakePriorityQueue.add(requestedArticle4); + + FindOrderToExecuteResult orderToExecute = + service.findOrderToExecute(fakePriorityQueue, magalieUser, building); + + Assert.assertFalse(orderToExecute.isNothingToDo()); + Assert.assertTrue(orderToExecute.isEverythingUnavailable()); + Assert.assertFalse(orderToExecute.isDriverLicenseRequired()); + Assert.assertFalse(orderToExecute.isSuccess()); + + Assert.assertNull(orderToExecute.getOldAffectation()); + Assert.assertNull(orderToExecute.getNewAffectation()); + + } + + @Test + public void testFindOrderRequestedArticlesNotAvailable() { + + // it is not available in expected quantity because spreading in different buildings + + RequestedArticle requestedArticle1 = fixture("requestedArticle1"); + + LinkedList<RequestedArticle> fakePriorityQueue = + Lists.newLinkedList(); + + fakePriorityQueue.add(requestedArticle1); + + FindOrderToExecuteResult orderToExecute = + service.findOrderToExecute(fakePriorityQueue, magalieUser, building); + + Assert.assertFalse(orderToExecute.isNothingToDo()); + Assert.assertTrue(orderToExecute.isEverythingUnavailable()); + Assert.assertFalse(orderToExecute.isDriverLicenseRequired()); + Assert.assertFalse(orderToExecute.isSuccess()); + + Assert.assertNull(orderToExecute.getOldAffectation()); + Assert.assertNull(orderToExecute.getNewAffectation()); + + } + }