r196 - trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service
Author: bleny Date: 2013-05-27 12:14:06 +0200 (Mon, 27 May 2013) New Revision: 196 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: introduce computeActualQuantities to factorize code between services 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/ReceptionService.java 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-05-26 06:56:02 UTC (rev 195) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-05-27 10:14:06 UTC (rev 196) @@ -24,15 +24,32 @@ */ import com.franciaflex.magalie.persistence.MagaliePersistenceContext; +import com.franciaflex.magalie.persistence.StorageMovements; import com.franciaflex.magalie.persistence.StoredArticles; -import com.franciaflex.magalie.persistence.dao.*; -import com.franciaflex.magalie.persistence.entity.*; +import com.franciaflex.magalie.persistence.dao.LocationDao; +import com.franciaflex.magalie.persistence.dao.StorageMovementDao; +import com.franciaflex.magalie.persistence.dao.StorageMovementOrderDao; +import com.franciaflex.magalie.persistence.dao.StoredArticleDao; +import com.franciaflex.magalie.persistence.dao.UnavailableArticleDao; +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.Location; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.persistence.entity.UnavailableArticle; import com.franciaflex.magalie.services.MagalieService; import com.franciaflex.magalie.services.MagalieServiceContext; import com.franciaflex.magalie.services.StorageMovementConfirmation; import com.franciaflex.magalie.services.StorageMovementTask; import com.google.common.base.Preconditions; -import com.google.common.collect.*; +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; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -328,61 +345,71 @@ // first get all stored articles in the building at known quantities Iterable<StoredArticle> storedArticles = storedArticleDao.findAllForArticleInBuilding(article, building); - ImmutableMap<Location, StoredArticle> storedArticlesByLocation = - Maps.uniqueIndex( - storedArticles, - StoredArticles.getLocationFunction() - ); + StorageMovementDao storageMovementDao = persistenceContext.getStorageMovementDao(); + List<StorageMovement> storageMovementsForArticle = storageMovementDao.findAllByArticle(article); + // consider storage movements and compute actually available quantities + storedArticles = computeActualQuantities(storedArticles, storageMovementsForArticle); - StorageMovementDao storageMovementDao = persistenceContext.getStorageMovementDao(); + // exclude storageMovements on a location reported in error + LocationErrorsService locationErrorsService = serviceContext.newService(LocationErrorsService.class); - // consider all storage movements, adding quantities when someone added some stock and - // removing quantities if someone has withdraw quantities - List<StorageMovement> storageMovements = storageMovementDao.findAllByArticle(article); + List<Location> allLocationsInError = locationErrorsService.getAllLocationsInError(article); - for (StorageMovement storageMovement : storageMovements) { + storedArticles = Iterables.filter(storedArticles, StoredArticles.articleNotStoredInLocationReportedInError(allLocationsInError)); - Location originLocation = storageMovement.getOriginLocation(); + return storedArticles; - StoredArticle storedArticle = storedArticlesByLocation.get(originLocation); + } - if (storedArticle != null) { + /** + * This method take some storedArticles and update the quantities according + * to given storage movements (adding or removing quantities depending if it's + * a movement from the location or to the location) + */ + protected Iterable<StoredArticle> computeActualQuantities(Iterable<StoredArticle> storedArticles, Iterable<StorageMovement> storageMovements) { - double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); + Multimap<Article, StoredArticle> storedArticlesByArticles = + Multimaps.index(storedArticles, StoredArticles.getArticleFunction()); - storedArticle.setQuantity(actualQuantity); - } + Multimap<Article, StorageMovement> allStorageMovementsInReceptionByArticle = + Multimaps.index(storageMovements, StorageMovements.getArticleFunction()); - Location destinationLocation = storageMovement.getDestinationLocation(); + for (Map.Entry<Article, StoredArticle> articleStored : storedArticlesByArticles.entries()) { - storedArticle = storedArticlesByLocation.get(destinationLocation); + Article article = articleStored.getKey(); - if (storedArticle != null) { + StoredArticle storedArticle = articleStored.getValue(); - double actualQuantity = storedArticle.getQuantity() + storageMovement.getQuantity(); + Location location = storedArticle.getLocation(); - storedArticle.setQuantity(actualQuantity); + for (StorageMovement storageMovement : allStorageMovementsInReceptionByArticle.get(article)) { - } + if (storageMovement.getOriginLocation().equals(location)) { - } + double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); - // don't mention location if stored quantity is 0. + storedArticle.setQuantity(actualQuantity); - storedArticles = Iterables.filter(storedArticles, StoredArticles.notEmpty()); + } - // exclude storageMovements on a location reported in error + if (storageMovement.getDestinationLocation().equals(location)) { - LocationErrorsService locationErrorsService = serviceContext.newService(LocationErrorsService.class); + double actualQuantity = storedArticle.getQuantity() + storageMovement.getQuantity(); - List<Location> allLocationsInError = locationErrorsService.getAllLocationsInError(article); + storedArticle.setQuantity(actualQuantity); - storedArticles = Iterables.filter(storedArticles, StoredArticles.articleNotStoredInLocationReportedInError(allLocationsInError)); + } - return storedArticles; + } + } + + Iterable<StoredArticle> result = Iterables.filter(storedArticles, StoredArticles.notEmpty()); + + return result; + } public void confirmStorageMovement(StorageMovementConfirmation confirmation, MagalieUser magalieUser) { 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-26 06:56:02 UTC (rev 195) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-05-27 10:14:06 UTC (rev 196) @@ -25,7 +25,6 @@ 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.PreparedArticleReceptionDao; @@ -44,8 +43,6 @@ 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; @@ -109,36 +106,11 @@ List<StorageMovement> allStorageMovementsInReception = storageMovementDao.findAllInReception(building); - Multimap<Article, StoredArticle> storedArticlesByArticles = - Multimaps.index(receivedArticles, StoredArticles.getArticleFunction()); + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); - Multimap<Article, StorageMovement> allStorageMovementsInReceptionByArticle = - Multimaps.index(allStorageMovementsInReception, StorageMovements.getArticleFunction()); + receivedArticles = articleStorageService.computeActualQuantities(receivedArticles, allStorageMovementsInReception); - 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); }
participants (1)
-
bleny@users.forge.codelutin.com