Author: bleny Date: 2013-04-25 10:54:53 +0200 (Thu, 25 Apr 2013) New Revision: 126 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: refs #2165 suggest more locations Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.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/StoredArticleJpaDao.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/ReceptionService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java trunk/magalie-web/src/main/webapp/js/receive-article-input.js Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java 2013-04-24 13:55:31 UTC (rev 125) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java 2013-04-25 08:54:53 UTC (rev 126) @@ -23,11 +23,16 @@ * #L% */ +import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.Warehouse; +import java.util.List; + public interface LocationDao extends Dao<Location> { Location find(String code, Warehouse warehouse); + List<Location> findAllWithoutReception(Building building); + } 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-24 13:55:31 UTC (rev 125) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/LocationJpaDao.java 2013-04-25 08:54:53 UTC (rev 126) @@ -23,12 +23,15 @@ * #L% */ +import com.franciaflex.magalie.persistence.Locations; import com.franciaflex.magalie.persistence.dao.LocationDao; +import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.Warehouse; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; +import java.util.List; public class LocationJpaDao extends AbstractJpaDao<Location> implements LocationDao { @@ -48,4 +51,18 @@ query.setParameter("warehouse", warehouse); return findUnique(query); } + + @Override + public List<Location> findAllWithoutReception(Building building) { + TypedQuery<Location> query = createQuery( + " from Location l where" + + " l.warehouse.building = :building and " + + " l.code != :codeForReceptionLocations and " + + " l.code != :codeForWarehouseWithoutLocations " + + " order by l.warehouse.building.code, l.warehouse.code, l.code"); + query.setParameter("building", building); + query.setParameter("codeForReceptionLocations", Locations.codeForReceptionLocations()); + query.setParameter("codeForWarehouseWithoutLocations", Locations.codeForWarehouseWithoutLocations()); + return findAll(query); + } } 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-04-24 13:55:31 UTC (rev 125) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java 2013-04-25 08:54:53 UTC (rev 126) @@ -47,9 +47,10 @@ @Override public List<StoredArticle> findAllForArticleInBuilding(Article article, Building building) { - Query query = entityManager.createQuery("from StoredArticle sa where sa.article = :article and sa.location.warehouse.building = :building"); + Query query = entityManager.createQuery("from StoredArticle sa where sa.article = :article and sa.location.warehouse.building = :building and sa.location.code != :receptionLocationCode"); query.setParameter("article", article); query.setParameter("building", building); + query.setParameter("receptionLocationCode", Locations.codeForReceptionLocations()); List<StoredArticle> resultList = query.getResultList(); for (StoredArticle storedArticle : resultList) { entityManager.detach(storedArticle); 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-24 13:55:31 UTC (rev 125) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-25 08:54:53 UTC (rev 126) @@ -51,6 +51,7 @@ import org.apache.commons.logging.LogFactory; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.PriorityQueue; @@ -277,39 +278,62 @@ List<StoredArticle> storedArticles = storedArticleDao.findAllForArticleInBuilding(article, building); + ImmutableMap<Location, StoredArticle> storedArticlesByLocation = + Maps.uniqueIndex( + storedArticles, + StoredArticles.getLocationFunction() + ); + // consider storage movements and compute actually available quantities StorageMovementDao storageMovementDao = persistenceContext.getStorageMovementDao(); List<StorageMovement> storageMovements = storageMovementDao.findAllByArticle(article); - ImmutableMap<Location, StoredArticle> storedArticlesByLocation = - Maps.uniqueIndex( - storedArticles, - StoredArticles.getLocationFunction() - ); - for (StorageMovement storageMovement : storageMovements) { Location originLocation = storageMovement.getOriginLocation(); StoredArticle storedArticle = storedArticlesByLocation.get(originLocation); - double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); + if (storedArticle != null) { - if (actualQuantity > 0.) { + double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); storedArticle.setQuantity(actualQuantity); + } - } else { + Location destinationLocation = storageMovement.getDestinationLocation(); + storedArticle = storedArticlesByLocation.get(destinationLocation); + + if (storedArticle != null) { + + double actualQuantity = storedArticle.getQuantity() + storageMovement.getQuantity(); + + storedArticle.setQuantity(actualQuantity); + + } + + } + + LinkedList<StoredArticle> toRemove = Lists.newLinkedList(); + + for (StoredArticle storedArticle : storedArticles) { + + double actualQuantity = storedArticle.getQuantity(); + + if ( ! (actualQuantity > 0.)) { + // location is empty, do not include it as a location where you can take an article - storedArticles.remove(storedArticle); + toRemove.add(storedArticle); } } + storedArticles.removeAll(toRemove); + // exclude storageMovements reported in error LocationErrorsService locationErrorsService = serviceContext.newService(LocationErrorsService.class); 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-04-24 13:55:31 UTC (rev 125) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-04-25 08:54:53 UTC (rev 126) @@ -1,6 +1,7 @@ package com.franciaflex.magalie.services.service; import com.franciaflex.magalie.persistence.MagaliePersistenceContext; +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; @@ -14,11 +15,15 @@ import com.franciaflex.magalie.persistence.entity.Supplier; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; public class ReceptionService implements MagalieService { @@ -81,7 +86,7 @@ Building building = storedArticle.getLocation().getWarehouse().getBuilding(); - List<Location> locations = findLocationsToReceiveArticle(article, building); + List<Location> locations = findLocationsToReceiveArticle(building, article); ReceptionTask receptionTask = new ReceptionTask(storedArticle, locations); @@ -89,22 +94,48 @@ } - protected List<Location> findLocationsToReceiveArticle(Article article, Building building) { + protected List<Location> findLocationsToReceiveArticle(Building building, Article article) { - List<Location> locations = Lists.newLinkedList(); + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); + List<StoredArticle> storedArticles = + articleStorageService.getStoredArticles(building, article); + + Ordering<StoredArticle> comparator = Ordering.compound( + Lists.newArrayList( + StoredArticles.locationWithHighestQuantityFirst() + ) + ); + + Set<StoredArticle> sortedStoredArticles = Sets.newTreeSet(comparator); + + sortedStoredArticles.addAll(storedArticles); + + Set<Location> result = Sets.newLinkedHashSet(); + if (article.getFixedLocations() != null) { - locations.addAll(article.getFixedLocations()); + result.addAll(article.getFixedLocations()); } - // TODO brendan 24/04/13 add already stored locations + Iterables.addAll( + result, + Iterables.transform( + sortedStoredArticles, + StoredArticles.getLocationFunction())); - // TODO brendan 24/04/13 add other suggested location + MagaliePersistenceContext persistenceContext = + serviceContext.getPersistenceContext(); - return locations; + LocationDao locationDao = + persistenceContext.getLocationDao(); + result.addAll(locationDao.findAllWithoutReception(building)); + + return Lists.newArrayList(result); + } public void confirmReception(MagalieUser magalieUser, ReceptionConfirmation receptionConfirmation) { 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-04-24 13:55:31 UTC (rev 125) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-04-25 08:54:53 UTC (rev 126) @@ -95,7 +95,7 @@ Location fixedLocation = Iterables.getOnlyElement(article.getFixedLocations()); - Assert.assertTrue(receptionTask.getLocations().contains(fixedLocation)); + Assert.assertEquals(fixedLocation, receptionTask.getLocations().get(0)); } Modified: trunk/magalie-web/src/main/webapp/js/receive-article-input.js =================================================================== --- trunk/magalie-web/src/main/webapp/js/receive-article-input.js 2013-04-24 13:55:31 UTC (rev 125) +++ trunk/magalie-web/src/main/webapp/js/receive-article-input.js 2013-04-25 08:54:53 UTC (rev 126) @@ -60,7 +60,7 @@ } var locationIdToStoredQuantities = {}; $.each(model.locations, function(key, location) { - if (location.used) { + if (location.used && location.stored > 0.) { locationIdToStoredQuantities[location.id] = location.stored; } });