r223 - in branches/magalie-eugene: . magalie-persistence magalie-persistence/src/main/java/com/franciaflex/magalie/persistence magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao magalie-persistence/src/main/resources magalie-services magalie-services/src/main/java/com/franciaflex/magalie/services magalie-services/src/main/java/com/franciaflex/magalie/services/service magalie-services/src/test/java/com/franciaflex/magalie/services/service magalie-services/
Author: bleny Date: 2013-05-31 11:59:28 +0200 (Fri, 31 May 2013) New Revision: 223 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: merge trunk into branch Added: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/SimpleWithdrawItemTask.java branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemService.java branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/StorageTransferService.java branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemServiceTest.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SimpleWithdrawItemAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferLocationAction.java branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/simple-withdraw-item-input.jsp branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-input.jsp branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-location-input.jsp Removed: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/BuildingDao.java branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp Modified: branches/magalie-eugene/ branches/magalie-eugene/magalie-persistence/pom.xml branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Locations.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/ArticleJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/KanbanJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationErrorJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/MagalieUserJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedListJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/SupplierJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/UnavailableArticleJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/WarehouseJpaDao.java branches/magalie-eugene/magalie-persistence/src/main/resources/magalie.properties branches/magalie-eugene/magalie-services/pom.xml branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java branches/magalie-eugene/magalie-services/src/test/resources/log4j.properties branches/magalie-eugene/magalie-web/pom.xml branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/Activity.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareArticleReceptionAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PreparePreparedArticleReceptionAction.java branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java branches/magalie-eugene/magalie-web/src/main/resources/struts.properties branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp branches/magalie-eugene/magalie-web/src/main/webapp/css/magalie-ck3x.css branches/magalie-eugene/magalie-web/src/main/webapp/js/magalie.js branches/magalie-eugene/pom.xml Property changes on: branches/magalie-eugene ___________________________________________________________________ Added: svn:mergeinfo + /trunk:191-222 Modified: branches/magalie-eugene/magalie-persistence/pom.xml =================================================================== --- branches/magalie-eugene/magalie-persistence/pom.xml 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/pom.xml 2013-05-31 09:59:28 UTC (rev 223) @@ -29,7 +29,7 @@ <artifactId>hibernate-jpa-2.0-api</artifactId> </dependency> - <!--dependency> + <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <scope>compile</scope> @@ -42,10 +42,14 @@ </dependency> <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-c3p0</artifactId> + </dependency> + + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> - <scope>compile</scope> - </dependency--> + </dependency> <dependency> <groupId>org.nuiton</groupId> @@ -80,7 +84,6 @@ <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> - <scope>test</scope> </dependency> <!-- Test dependencies --> @@ -131,6 +134,37 @@ </dependency> </dependencies> </plugin> + <plugin> + <groupId>de.juplo</groupId> + <artifactId>hibernate4-maven-plugin</artifactId> + <version>1.0.1</version> + <executions> + <execution> + <id>executionCreate</id> + <goals> + <goal>export</goal> + </goals> + <configuration> + <type>CREATE</type> + <outputFile>${project.build.directory}/generated-sources/Create.sql</outputFile> + </configuration> + </execution> + <execution> + <id>executionDrop</id> + <goals> + <goal>export</goal> + </goals> + <configuration> + <type>DROP</type> + <outputFile>${project.build.directory}/generated-sources/Drop.sql</outputFile> + </configuration> + </execution> + </executions> + <configuration> + <hibernateDialect>org.hibernate.dialect.Oracle10gDialect</hibernateDialect> + <target>SCRIPT</target> + </configuration> + </plugin> </plugins> </build> Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Locations.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Locations.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Locations.java 2013-05-31 09:59:28 UTC (rev 223) @@ -25,6 +25,7 @@ import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; @@ -77,6 +78,14 @@ } } + protected static class GetBarcode implements Function<Location, String> { + + @Override + public String apply(Location location) { + return location.getBarcode(); + } + } + public static Predicate<Location> accessibleLocationPredicate(MagalieUser magalieUser) { return new AccessibleLocationPredicate(magalieUser); } @@ -119,4 +128,13 @@ ); return isAcceptableForReception; } + + public static Predicate<Location> barcodeEquals(String originLocationBarcode) { + return Predicates.compose(Predicates.equalTo(originLocationBarcode), getBarcodeFunction()); + } + + public static Function<Location, String> getBarcodeFunction() { + return new GetBarcode(); + } + } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-05-31 09:59:28 UTC (rev 223) @@ -172,4 +172,8 @@ return Functions.compose(Articles.getSupplierFunction(), getArticleFunction()); } + public static Predicate<StoredArticle> locationBarcodeEquals(String originLocationBarcode) { + return Predicates.compose(Locations.barcodeEquals(originLocationBarcode), getLocationFunction()); + } + } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/ArticleJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/ArticleJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/ArticleJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -35,9 +35,10 @@ } @Override - public Article findByCode(String articleCode) { + public Article findByCode(String articleCode) { TypedQuery<Article> query = createQuery("from Article a where a.code = :code"); - query.setParameter(Article.PROPERTY_CODE, articleCode); + query.setParameter("code", articleCode); return findUniqueOrNull(query); } + } Deleted: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/BuildingDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/BuildingDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/BuildingDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -1,31 +0,0 @@ -package com.franciaflex.magalie.persistence.dao; - -/* - * #%L - * MagaLiE :: Persistence - * $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.persistence.entity.Building; - -/** @author bleny */ -public interface BuildingDao { - -} Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/DeliveredRequestedArticleJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -40,8 +40,8 @@ @Override public DeliveredRequestedArticle find(StorageMovementOrder storageMovementOrder) { TypedQuery<DeliveredRequestedArticle> query = - createQuery( - "from DeliveredRequestedArticle dra where dra.storageMovementOrder = :storageMovementOrder"); + entityManager.createQuery( + "from DeliveredRequestedArticle dra where dra.storageMovementOrder = :storageMovementOrder", getEntityClass()); query.setParameter("storageMovementOrder", storageMovementOrder); return findUniqueOrNull(query); } @@ -49,8 +49,8 @@ @Override public List<DeliveredRequestedArticle> findAll(RequestedList requestedList) { TypedQuery<DeliveredRequestedArticle> query = - createQuery( - "from DeliveredRequestedArticle dra where dra.requestedArticle.requestedList = :requestedList"); + entityManager.createQuery( + "from DeliveredRequestedArticle dra where dra.requestedArticle.requestedList = :requestedList", getEntityClass()); query.setParameter("requestedList", requestedList); return findAll(query); } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/KanbanJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/KanbanJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/KanbanJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -38,7 +38,7 @@ @Override public Kanban find(Article article, Warehouse warehouse) { - TypedQuery<Kanban> query = createQuery("from Kanban k where k.article = :article and k.warehouse = :warehouse"); + TypedQuery<Kanban> query = entityManager.createQuery("from Kanban k where k.article = :article and k.warehouse = :warehouse", getEntityClass()); query.setParameter("article", article); query.setParameter("warehouse", warehouse); return query.getSingleResult(); Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -36,4 +36,6 @@ List<Location> findAllWithoutReception(Building building); List<Location> findAllWithoutReception(Warehouse warehouse); + + Location findByBarCode(String barCode, Building building); } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationErrorJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationErrorJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationErrorJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -28,6 +28,7 @@ import com.franciaflex.magalie.persistence.entity.LocationError; import javax.persistence.EntityManager; +import javax.persistence.Query; import javax.persistence.TypedQuery; import java.util.List; @@ -46,8 +47,7 @@ @Override public List<Location> getAllLocationsInError(Article article) { - TypedQuery<Location> query = createQuery(Location.class, - "select se.location from LocationError se where se.article = :article"); + Query query = entityManager.createQuery("select se.location from LocationError se where se.article = :article"); query.setParameter("article", article); List<Location> allLocationsInError = query.getResultList(); return allLocationsInError; @@ -55,7 +55,7 @@ @Override public List<LocationError> findAll() { - TypedQuery<LocationError> query = createQuery("from LocationError se order by se.reportDate"); + Query query = entityManager.createQuery("from LocationError se order by se.reportDate"); List<LocationError> all = query.getResultList(); return all; } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/LocationJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -56,11 +56,11 @@ if (filterOnWarehouse) { hql += " l.warehouse = :warehouse and "; } - hql += " l.code != :codeForReceptionLocations and " - + " l.code != :codeForWarehouseWithoutLocations and " - + " l.fullLocation = false " - + " order by l.warehouse.building.code, l.warehouse.code, l.code"; - TypedQuery<Location> query = createQuery(hql); + hql += " l.code != :codeForReceptionLocations and " + + " l.code != :codeForWarehouseWithoutLocations and " + + " l.fullLocation = false " + + " order by l.warehouse.building.code, l.warehouse.code, l.code"; + TypedQuery <Location> query = createQuery(hql); if (filterOnBuilding) { query.setParameter("building", building); } @@ -81,4 +81,14 @@ public List<Location> findAllWithoutReception(Warehouse warehouse) { return findAllWithoutReception(null, warehouse); } + + @Override + public Location findByBarCode(String barCode, Building building) { + TypedQuery<Location> query = createQuery("from Location l " + + "where CONCAT(l.warehouse.code, l.code) = :barCode " + + "and l.warehouse.building = :building"); + query.setParameter("barCode", barCode); + query.setParameter("building", building); + return findUniqueOrNull(query); + } } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/MagalieUserJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/MagalieUserJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/MagalieUserJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -30,7 +30,7 @@ import javax.persistence.TypedQuery; import java.util.List; -public class MagalieUserJpaDao extends AbstractMagalieUserJpaDao { +public class MagalieUserJpaDao extends AbstractMagalieUserJpaDao { public MagalieUserJpaDao(EntityManager entityManager) { super(entityManager); @@ -45,7 +45,7 @@ @Override public List<MagalieUser> findAll() { - TypedQuery<MagalieUser> query = createQuery("from MagalieUser mu order by mu.login"); + Query query = entityManager.createQuery("from MagalieUser mu order by mu.login"); List<MagalieUser> resultList = query.getResultList(); return resultList; } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedArticleJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -42,11 +42,11 @@ @Override public List<RequestedArticle> findAllUndelivered(Building building, MagalieUser affectedTo, String listType) { 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.listType = :listType " - + " and ra.requestedList not in (select drl.requestedList from DeliveredRequestedList drl where drl.status = :complete or drl.status = :affected and drl.affectedTo != :affectedTo)"); + "from RequestedArticle ra where " + + " ra not in (select dra.requestedArticle from DeliveredRequestedArticle dra) " + + " and ra.requestedList.building = :building " + + " and ra.requestedList.listType = :listType " + + " 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("listType", listType); query.setParameter("complete", DeliveredRequestedListStatus.COMPLETE); Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedListJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedListJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/RequestedListJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -23,8 +23,6 @@ * #L% */ -import com.franciaflex.magalie.persistence.entity.RequestedList; - import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import java.util.List; @@ -37,7 +35,7 @@ @Override public List<String> findAllDistinctListTypes() { - TypedQuery<String> query = createQuery(String.class, "select distinct rl.listType from RequestedList rl"); + TypedQuery<String> query = entityManager.createQuery("select distinct rl.listType from RequestedList rl", String.class); return query.getResultList(); } } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -26,6 +26,7 @@ import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.persistence.entity.StoredArticle; import java.util.List; @@ -37,4 +38,6 @@ List<StorageMovement> findAll(); List<StorageMovement> findAllInReception(Building building); + + List<StorageMovement> findAllImpactingStoredArticle(StoredArticle storedArticle); } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -27,9 +27,10 @@ import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.Building; import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.persistence.entity.StoredArticle; import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import javax.persistence.Query; import java.util.List; public class StorageMovementJpaDao extends AbstractStorageMovementJpaDao { @@ -40,14 +41,14 @@ @Override public List<StorageMovement> findAllByArticle(Article article) { - TypedQuery<StorageMovement> query = createQuery("from StorageMovement sm where sm.article = :article"); + Query query = entityManager.createQuery("from StorageMovement sm where sm.article = :article"); query.setParameter("article", article); return query.getResultList(); } @Override public List<StorageMovement> findAllInReception(Building building) { - TypedQuery<StorageMovement> query = createQuery( + Query query = entityManager.createQuery( " from StorageMovement sm" + " where sm.originLocation.code = :codeForReceptionLocations and sm.originLocation.warehouse.building = :building" + " or " + @@ -58,8 +59,16 @@ } @Override + public List<StorageMovement> findAllImpactingStoredArticle(StoredArticle storedArticle) { + Query query = entityManager.createQuery("from StorageMovement sm where sm.article = :article and (sm.originLocation = :location or sm.destinationLocation = :location)"); + query.setParameter("location", storedArticle.getLocation()); + query.setParameter("article", storedArticle.getArticle()); + return query.getResultList(); + } + + @Override public List<StorageMovement> findAll() { - TypedQuery<StorageMovement> query = createQuery("from StorageMovement sm order by sm.orderDate"); + Query query = entityManager.createQuery("from StorageMovement sm order by sm.orderDate"); return query.getResultList(); } } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StorageMovementOrderJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -28,10 +28,10 @@ import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import javax.persistence.Query; import java.util.List; -public class StorageMovementOrderJpaDao extends AbstractStorageMovementOrderJpaDao{ +public class StorageMovementOrderJpaDao extends AbstractStorageMovementOrderJpaDao { public StorageMovementOrderJpaDao(EntityManager entityManager) { super(entityManager); @@ -39,13 +39,13 @@ @Override public List<StorageMovementOrder> findNotConfirmedByUser(MagalieUser magalieUser, Building building) { - TypedQuery<StorageMovementOrder> query = createQuery( + Query query = entityManager.createQuery( " select distinct smo" + " from StorageMovementOrder smo" + " inner join smo.storageMovements as sm" + " where sm.magalieUser = :magalieUser" + " and sm.originLocation.warehouse.building = :building" + - " and sm.confirmDate is null"); + " and sm.confirmDate is null" ); query.setParameter("magalieUser", magalieUser); query.setParameter("building", building); return query.getResultList(); Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -25,6 +25,7 @@ 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.StoredArticle; import java.util.List; @@ -36,4 +37,9 @@ List<StoredArticle> findAllReceivedForAllSupplier(Building building); List<StoredArticle> findAllReceivedForSupplier(Building building, String supplierId); + + StoredArticle findDetachedById(String storedArticleId); + + List<StoredArticle> findAllByLocation(Location location); + } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -26,6 +26,7 @@ import com.franciaflex.magalie.persistence.Locations; 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.StoredArticle; import javax.persistence.EntityManager; @@ -74,4 +75,22 @@ } return resultList; } + + @Override + public List<StoredArticle> findAllByLocation(Location location) { + TypedQuery<StoredArticle> query = createQuery("from StoredArticle sa where sa.location = :location"); + query.setParameter("location", location); + List<StoredArticle> resultList = findAll(query); + for (StoredArticle storedArticle : resultList) { + entityManager.detach(storedArticle); + } + return resultList; + } + + @Override + public StoredArticle findDetachedById(String storedArticleId) { + StoredArticle storedArticle = findById(storedArticleId); + entityManager.detach(storedArticle); + return storedArticle; + } } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/SupplierJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/SupplierJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/SupplierJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -25,9 +25,7 @@ import com.franciaflex.magalie.persistence.Locations; import com.franciaflex.magalie.persistence.entity.Building; -import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.Supplier; -import com.franciaflex.magalie.persistence.entity.Warehouse; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -42,8 +40,8 @@ @Override public List<Supplier> findAllWithReceivedArticles(Building building) { TypedQuery<Supplier> query = createQuery("select sa.article.supplier from StoredArticle sa where sa.location.code = :code and sa.location.warehouse.building = :building"); - query.setParameter(Warehouse.PROPERTY_BUILDING, building); - query.setParameter(Location.PROPERTY_CODE, Locations.codeForReceptionLocations()); + query.setParameter("building", building); + query.setParameter("code", Locations.codeForReceptionLocations()); return findAll(query); } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/UnavailableArticleJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/UnavailableArticleJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/UnavailableArticleJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -39,8 +39,8 @@ @Override public UnavailableArticle findByArticle(Building building, Article article) { TypedQuery<UnavailableArticle> query = createQuery("from UnavailableArticle ua where ua.article = :article and ua.building = :building"); - query.setParameter(UnavailableArticle.PROPERTY_ARTICLE, article); - query.setParameter(UnavailableArticle.PROPERTY_BUILDING, building); + query.setParameter("article", article); + query.setParameter("building", building); return findUniqueOrNull(query); } } Modified: branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/WarehouseJpaDao.java =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/WarehouseJpaDao.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/WarehouseJpaDao.java 2013-05-31 09:59:28 UTC (rev 223) @@ -39,9 +39,9 @@ @Override public List<Warehouse> findAllWithoutLocations(Building building) { - TypedQuery<Warehouse> query = createQuery("from Warehouse w where w.building = :building and w in (select l.warehouse from Location l where l.code = :code)"); - query.setParameter(Warehouse.PROPERTY_BUILDING, building); - query.setParameter(Warehouse.PROPERTY_CODE, Locations.codeForWarehouseWithoutLocations()); + TypedQuery<Warehouse> query = entityManager.createQuery("from Warehouse w where w.building = :building and w in (select l.warehouse from Location l where l.code = :code)", getEntityClass()); + query.setParameter("building", building); + query.setParameter("code", Locations.codeForWarehouseWithoutLocations()); return query.getResultList(); } } Modified: branches/magalie-eugene/magalie-persistence/src/main/resources/magalie.properties =================================================================== --- branches/magalie-eugene/magalie-persistence/src/main/resources/magalie.properties 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-persistence/src/main/resources/magalie.properties 2013-05-31 09:59:28 UTC (rev 223) @@ -29,3 +29,7 @@ hibernate.show_sql=false hibernate.format_sql=true hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.timeout=1800 +hibernate.c3p0.max_statements=50 Modified: branches/magalie-eugene/magalie-services/pom.xml =================================================================== --- branches/magalie-eugene/magalie-services/pom.xml 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/pom.xml 2013-05-31 09:59:28 UTC (rev 223) @@ -35,11 +35,6 @@ </dependency> <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - </dependency> - - <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> @@ -83,7 +78,6 @@ <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> - <scope>test</scope> </dependency> <!-- Test dependencies --> Copied: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/SimpleWithdrawItemTask.java (from rev 222, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/SimpleWithdrawItemTask.java) =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/SimpleWithdrawItemTask.java (rev 0) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/SimpleWithdrawItemTask.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,36 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + +import java.util.List; + +public class SimpleWithdrawItemTask { + + protected List<StoredArticle> storedArticles; + + protected boolean driverLicenseRequired; + + protected boolean articleUnavailable; + + public SimpleWithdrawItemTask(Iterable<StoredArticle> storedArticles, boolean driverLicenseRequired, boolean articleUnavailable) { + this.storedArticles = Lists.newArrayList(storedArticles); + this.driverLicenseRequired = driverLicenseRequired; + this.articleUnavailable = articleUnavailable; + } + + public List<StoredArticle> getStoredArticles() { + return storedArticles; + } + + public boolean isDriverLicenseRequired() { + Preconditions.checkState( ! articleUnavailable); + return driverLicenseRequired; + } + + public boolean isArticleUnavailable() { + Preconditions.checkState( ! driverLicenseRequired); + return articleUnavailable; + } +} Modified: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -24,6 +24,7 @@ */ import com.franciaflex.magalie.persistence.MagaliePersistenceContext; +import com.franciaflex.magalie.persistence.StorageMovements; import com.franciaflex.magalie.persistence.StoredArticles; import com.franciaflex.magalie.persistence.dao.LocationJpaDao; import com.franciaflex.magalie.persistence.dao.StorageMovementDao; @@ -43,10 +44,10 @@ import com.franciaflex.magalie.services.StorageMovementConfirmation; import com.franciaflex.magalie.services.StorageMovementTask; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; +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; @@ -326,6 +327,8 @@ } } + // TODO brendan 27/05/13 add extra info about the locations + return storageMovementTask; } @@ -340,61 +343,75 @@ // 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; + } + } + + // Warning : + // this function don't add a new StoredArticle + // if exist a storage movement with new article in location + + Iterable<StoredArticle> result = Iterables.filter(storedArticles, StoredArticles.notEmpty()); + + return result; + } public void confirmStorageMovement(StorageMovementConfirmation confirmation, MagalieUser magalieUser) { Modified: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FulfilKanbanService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -23,10 +23,8 @@ * #L% */ -import com.franciaflex.magalie.persistence.Locations; import com.franciaflex.magalie.persistence.MagaliePersistenceContext; import com.franciaflex.magalie.persistence.dao.KanbanDao; -import com.franciaflex.magalie.persistence.dao.LocationDao; import com.franciaflex.magalie.persistence.dao.WarehouseDao; import com.franciaflex.magalie.persistence.dao.WarehouseJpaDao; import com.franciaflex.magalie.persistence.entity.Article; @@ -92,8 +90,12 @@ Building building = destinationWarehouse.getBuilding(); - Location destinationLocation = getDestinationLocation(destinationWarehouse); + SimpleWithdrawItemService simpleWithdrawItemService = + serviceContext.newService(SimpleWithdrawItemService.class); + Location destinationLocation = + simpleWithdrawItemService.getDestinationLocation(destinationWarehouse); + BookArticleRequest bookArticleRequest = new BookArticleRequest( magalieUser, building, article, @@ -106,18 +108,6 @@ } - protected Location getDestinationLocation(Warehouse destinationWarehouse) { - - MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - - LocationDao locationDao = persistenceContext.getLocationDao(); - - Location location = locationDao.find(Locations.codeForWarehouseWithoutLocations(), destinationWarehouse); - - return location; - - } - public List<Warehouse> getDestinationWarehouses(Building building) { MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); Modified: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -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.LocationJpaDao; @@ -47,8 +46,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; @@ -112,36 +109,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); } @@ -151,15 +123,30 @@ MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - StoredArticleJpaDao storedArticleDao = persistenceContext.getStoredArticleDao(); + StoredArticleJpaDao storedArticleDao = + persistenceContext.getStoredArticleDao(); StoredArticle storedArticle = - storedArticleDao.findById(storedArticleId); + storedArticleDao.findDetachedById(storedArticleId); - // FIXME brendan 23/05/13 déduire de la quantité les mouvements de stocks + StorageMovementDao storageMovementDao = + persistenceContext.getStorageMovementDao(); - double quantity = storedArticle.getQuantity(); + List<StorageMovement> allStorageMovementsImpactingStoredArticle = + storageMovementDao.findAllImpactingStoredArticle(storedArticle); + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); + + Iterable<StoredArticle> storedArticleSingleton = Lists.newArrayList(storedArticle); + + storedArticleSingleton = + articleStorageService.computeActualQuantities( + storedArticleSingleton, + allStorageMovementsImpactingStoredArticle); + + double quantity = Iterables.getOnlyElement(storedArticleSingleton).getQuantity(); + ReceptionTask receptionTask = buildReceptionTask(storedArticle, quantity); return receptionTask; Modified: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -62,6 +62,7 @@ protected MagalieServiceContext serviceContext; + @Override public void setServiceContext(MagalieServiceContext serviceContext) { this.serviceContext = serviceContext; } Copied: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemService.java (from rev 222, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemService.java) =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemService.java (rev 0) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,136 @@ +package com.franciaflex.magalie.services.service; + +import com.franciaflex.magalie.persistence.Locations; +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.StorageMovementJpaDao; +import com.franciaflex.magalie.persistence.dao.WarehouseJpaDao; +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.StoredArticle; +import com.franciaflex.magalie.persistence.entity.Warehouse; +import com.franciaflex.magalie.services.MagalieService; +import com.franciaflex.magalie.services.MagalieServiceContext; +import com.franciaflex.magalie.services.SimpleWithdrawItemTask; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Date; + +public class SimpleWithdrawItemService implements MagalieService { + + private static final Log log = LogFactory.getLog(SimpleWithdrawItemService.class); + + protected MagalieServiceContext serviceContext; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public SimpleWithdrawItemTask getSimpleWithdrawItemTask(Building building, MagalieUser magalieUser, String articleBarcode) throws InvalidMagalieBarcodeException { + + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); + + MagalieBarcodeService magalieBarcodeService = + serviceContext.newService(MagalieBarcodeService.class); + + Article article = magalieBarcodeService.getArticle(articleBarcode); + + Iterable<StoredArticle> storedArticles = + articleStorageService.getStoredArticles(building, article); + + Predicate<StoredArticle> articleStoredInAccessibleLocationPredicate = + StoredArticles.articleStoredInAccessibleLocationPredicate(magalieUser); + + boolean articleIsAccessible = + Iterables.any( + storedArticles, + articleStoredInAccessibleLocationPredicate); + + boolean articleUnavailable = Iterables.isEmpty(storedArticles); + + storedArticles = Iterables.filter(storedArticles, articleStoredInAccessibleLocationPredicate); + + SimpleWithdrawItemTask simpleWithdrawItemTask = + new SimpleWithdrawItemTask(storedArticles, ! articleIsAccessible, articleUnavailable); + + return simpleWithdrawItemTask; + + } + + public void confirmStorageMovement(MagalieUser magalieUser, String destinationWarehouseId, StoredArticle storedArticle) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + WarehouseJpaDao warehouseDao = persistenceContext.getWarehouseDao(); + + Date now = serviceContext.getNow(); + + // principle is taking a stored article and get everything (all quantity) + + Location originLocation = storedArticle.getLocation(); + + Article article = storedArticle.getArticle(); + + double quantity = storedArticle.getQuantity(); + + if (log.isInfoEnabled()) { + log.info("user " + magalieUser.getLogin() + " took " + + quantity + " " + article.getUnit() + " from " + + originLocation.getBarcode()); + } + + // find actual destination location + + Warehouse destinationWarehouse = warehouseDao.findById(destinationWarehouseId); + + Location destinationLocation = getDestinationLocation(destinationWarehouse); + + // create new storage movement + + StorageMovement storageMovement = new StorageMovement(); + + storageMovement.setOriginLocation(originLocation); + + storageMovement.setDestinationLocation(destinationLocation); + + storageMovement.setMagalieUser(magalieUser); + + storageMovement.setArticle(article); + + storageMovement.setActualQuantity(quantity); + + storageMovement.setConfirmDate(now); + + // save storage movement + + StorageMovementJpaDao storageMovementDao = persistenceContext.getStorageMovementDao(); + + storageMovementDao.persist(storageMovement); + + persistenceContext.commit(); + + } + + protected Location getDestinationLocation(Warehouse destinationWarehouse) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + LocationDao locationDao = persistenceContext.getLocationDao(); + + Location location = locationDao.find(Locations.codeForWarehouseWithoutLocations(), destinationWarehouse); + + return location; + + } + +} Copied: branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/StorageTransferService.java (from rev 222, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/StorageTransferService.java) =================================================================== --- branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/StorageTransferService.java (rev 0) +++ branches/magalie-eugene/magalie-services/src/main/java/com/franciaflex/magalie/services/service/StorageTransferService.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,125 @@ +package com.franciaflex.magalie.services.service; + + +import com.franciaflex.magalie.persistence.MagaliePersistenceContext; +import com.franciaflex.magalie.persistence.dao.LocationDao; +import com.franciaflex.magalie.persistence.dao.LocationJpaDao; +import com.franciaflex.magalie.persistence.dao.StorageMovementDao; +import com.franciaflex.magalie.persistence.dao.StorageMovementJpaDao; +import com.franciaflex.magalie.persistence.dao.StoredArticleDao; +import com.franciaflex.magalie.persistence.dao.StoredArticleJpaDao; +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.StoredArticle; +import com.franciaflex.magalie.services.MagalieService; +import com.franciaflex.magalie.services.MagalieServiceContext; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +public class StorageTransferService implements MagalieService { + + private static final Log log = LogFactory.getLog(StorageTransferService.class); + + protected MagalieServiceContext serviceContext; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public Location getLocationByBarCode(String barCode, Building building) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + LocationDao locationDao = persistenceContext.getLocationDao(); + + Location location = locationDao.findByBarCode(barCode, building); + + return location; + } + + public Location getLocationById(String id) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + LocationJpaDao locationDao = persistenceContext.getLocationDao(); + + Location location = locationDao.findById(id); + + return location; + } + + public List<StoredArticle> getStoredArticlesInLocation(Location location) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + StoredArticleDao storedArticleDao = persistenceContext.getStoredArticleDao(); + + Iterable<StoredArticle > storedArticles = storedArticleDao.findAllByLocation(location); + + ArticleStorageService articleStorageService = serviceContext.newService(ArticleStorageService.class); + + StorageMovementDao storageMovementDao = persistenceContext.getStorageMovementDao(); + + List<StorageMovement> allImpactingStoredArticle = new LinkedList<StorageMovement>(); + + for (StoredArticle storedArticle : storedArticles) { + allImpactingStoredArticle.addAll(storageMovementDao.findAllImpactingStoredArticle(storedArticle)); + } + + storedArticles = articleStorageService.computeActualQuantities(storedArticles, allImpactingStoredArticle); + + return Lists.newArrayList(storedArticles); + } + + + public StoredArticle findStoredArticle(String storedArticleId) { + + Preconditions.checkArgument(storedArticleId != null); + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + StoredArticleJpaDao storedArticleDao = persistenceContext.getStoredArticleDao(); + + StoredArticle storedArticle = storedArticleDao.findById(storedArticleId); + + return storedArticle; + } + + public void confirmStorageTransfer(MagalieUser magalieUser, StoredArticle storedArticle, double quantity, Location destinationLocation) { + + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + + StorageMovementJpaDao storageMovementDao = persistenceContext.getStorageMovementDao(); + + Date now = serviceContext.getNow(); + + StorageMovement storageMovement = new StorageMovement(); + + Location originLocation = storedArticle.getLocation(); + + storageMovement.setOriginLocation(originLocation); + + storageMovement.setDestinationLocation(destinationLocation); + + storageMovement.setMagalieUser(magalieUser); + + storageMovement.setArticle(storedArticle.getArticle()); + + storageMovement.setActualQuantity(quantity); + + storageMovement.setConfirmDate(now); + + storageMovementDao.persist(storageMovement); + + persistenceContext.commit(); + } +} Modified: branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java =================================================================== --- branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-05-31 09:59:28 UTC (rev 223) @@ -24,12 +24,12 @@ */ import com.franciaflex.magalie.persistence.Locations; -import com.franciaflex.magalie.persistence.dao.StorageMovementDao; import com.franciaflex.magalie.persistence.dao.StorageMovementJpaDao; 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.PreparedArticleReception; import com.franciaflex.magalie.persistence.entity.StorageMovement; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.persistence.entity.Supplier; @@ -202,7 +202,7 @@ } @Test - public void testWeCannotReceiveTheSameItemMultipleTime() throws Exception { + public void testWeCannotReceiveTheSameItemMultipleTime() { testConfirmReception(); @@ -220,4 +220,20 @@ Assert.assertTrue(suppliers.isEmpty()); } + + @Test + public void testReceivePreparedReception() { + + PreparedArticleReception preparedArticleReception = + service.getPreparedArticleReception("PAR2"); + + Assert.assertNotNull(preparedArticleReception); + + ReceptionTask receptionTask = + service.getReceptionTaskForPreparedArticleReception("PAR2"); + + Assert.assertEquals(4., receptionTask.getQuantity(), DELTA); + + } + } Copied: branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemServiceTest.java (from rev 222, trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemServiceTest.java) =================================================================== --- branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemServiceTest.java (rev 0) +++ branches/magalie-eugene/magalie-services/src/test/java/com/franciaflex/magalie/services/service/SimpleWithdrawItemServiceTest.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,97 @@ +package com.franciaflex.magalie.services.service; + +import com.franciaflex.magalie.persistence.StoredArticles; +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.services.AbstractMagalieServiceTest; +import com.franciaflex.magalie.services.SimpleWithdrawItemTask; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.text.ParseException; +import java.util.Date; +import java.util.List; + +public class SimpleWithdrawItemServiceTest extends AbstractMagalieServiceTest { + + private static final Log log = LogFactory.getLog(SimpleWithdrawItemServiceTest.class); + + protected SimpleWithdrawItemService service; + + protected MagalieUser magalieUser; + + protected Building building; + + @Before + public void setUp() throws ParseException { + + loadFixtures("fixtures"); + + service = newService(SimpleWithdrawItemService.class); + + serviceContext.setDate(new Date(1363948427576l)); + + magalieUser = fixture("bruno"); + + building = fixture("B1"); + } + + @Test + public void testSimpleWithdraw() throws InvalidMagalieBarcodeException { + + Article article = fixture("article2"); + + SimpleWithdrawItemTask simpleWithdrawItemTask = + service.getSimpleWithdrawItemTask(building, magalieUser, article.getCode()); + + Assert.assertFalse(simpleWithdrawItemTask.isDriverLicenseRequired()); + + Assert.assertFalse(simpleWithdrawItemTask.isArticleUnavailable()); + + List<StoredArticle> storedArticles = simpleWithdrawItemTask.getStoredArticles(); + + Predicate<StoredArticle> articleStoredInAccessibleLocationPredicate = + StoredArticles.articleStoredInAccessibleLocationPredicate(magalieUser); + + Assert.assertTrue(Iterables.all(storedArticles, articleStoredInAccessibleLocationPredicate)); + + Assert.assertEquals(3, storedArticles.size()); + + } + + @Test + public void testSimpleWithdrawWithoutDriverLicense() throws InvalidMagalieBarcodeException { + + magalieUser = fixture("corinne"); + + Article article = fixture("article1"); + + SimpleWithdrawItemTask simpleWithdrawItemTask = + service.getSimpleWithdrawItemTask(building, magalieUser, article.getCode()); + + Assert.assertFalse(simpleWithdrawItemTask.isDriverLicenseRequired()); + + Assert.assertFalse(simpleWithdrawItemTask.isArticleUnavailable()); + + List<StoredArticle> storedArticles = simpleWithdrawItemTask.getStoredArticles(); + + Predicate<StoredArticle> articleStoredInAccessibleLocationPredicate = + StoredArticles.articleStoredInAccessibleLocationPredicate(magalieUser); + + Assert.assertTrue( + "all given locations must be accessible for user", + Iterables.all(storedArticles, articleStoredInAccessibleLocationPredicate)); + + Assert.assertEquals(1, storedArticles.size()); + + } + +} Modified: branches/magalie-eugene/magalie-services/src/test/resources/log4j.properties =================================================================== --- branches/magalie-eugene/magalie-services/src/test/resources/log4j.properties 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-services/src/test/resources/log4j.properties 2013-05-31 09:59:28 UTC (rev 223) @@ -29,3 +29,4 @@ # log4j.logger.com.franciaflex.magalie=TRACE # log4j.logger.org.hibernate.tool.hbm2ddl.SchemaExport=FATAL +log4j.logger.org.nuiton.jpa.api.hibernate.HibernateUtil=TRACE Modified: branches/magalie-eugene/magalie-web/pom.xml =================================================================== --- branches/magalie-eugene/magalie-web/pom.xml 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/pom.xml 2013-05-31 09:59:28 UTC (rev 223) @@ -122,6 +122,7 @@ <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jcl</artifactId> + <scope>runtime</scope> </dependency> <dependency> @@ -130,13 +131,7 @@ <scope>runtime</scope> </dependency> - <!-- Test dependencies --> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - </dependency> - - <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> Modified: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/Activity.java =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/Activity.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/Activity.java 2013-05-31 09:59:28 UTC (rev 223) @@ -32,6 +32,9 @@ public enum Activity { REQUESTED_LISTS, - KANBANS + KANBANS, + SIMPLE_WITHDRAW, + RECEPTIONS, + PREPARED_RECEPTIONS } Modified: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/FulfilKanbanAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -44,6 +44,7 @@ @Results({ + @Result(name="input", type = "dispatcher", location = "/WEB-INF/content/prepare-withdraw-item-input.jsp"), @Result(name="success", type="redirectAction", params = { "actionName", "withdraw-item!input", "storageMovementOrderId", "${storageMovementOrderId}" }) }) public class FulfilKanbanAction extends MagalieActionSupport implements Preparable { Modified: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareArticleReceptionAction.java =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareArticleReceptionAction.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareArticleReceptionAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -27,6 +27,7 @@ import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.services.service.ReceptionService; import com.franciaflex.magalie.services.service.SuppliersToReceive; +import com.franciaflex.magalie.web.Activity; import com.franciaflex.magalie.web.MagalieActionSupport; import com.franciaflex.magalie.web.MagalieSession; @@ -59,6 +60,8 @@ @Override public String input() { + session.setActivity(Activity.RECEPTIONS); + Building building = session.getBuilding(); suppliersToReceive = service.getReceivedSuppliers(building); Modified: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PreparePreparedArticleReceptionAction.java =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PreparePreparedArticleReceptionAction.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PreparePreparedArticleReceptionAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -2,7 +2,9 @@ import com.franciaflex.magalie.persistence.entity.PreparedArticleReception; import com.franciaflex.magalie.services.service.ReceptionService; +import com.franciaflex.magalie.web.Activity; import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @@ -15,6 +17,12 @@ protected String barcode; + protected MagalieSession session; + + public void setSession(MagalieSession session) { + this.session = session; + } + public void setReceptionService(ReceptionService receptionService) { this.receptionService = receptionService; } @@ -26,6 +34,8 @@ @Override public String execute() { + session.setActivity(Activity.PREPARED_RECEPTIONS); + PreparedArticleReception preparedArticleReception = receptionService.getPreparedArticleReception(barcode); Copied: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java (from rev 222, trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/PrepareWithdrawItemAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,156 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.persistence.entity.Warehouse; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.franciaflex.magalie.services.service.FulfilKanbanService; +import com.franciaflex.magalie.services.service.SimpleWithdrawItemService; +import com.franciaflex.magalie.web.Activity; +import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; +import com.opensymphony.xwork2.Preparable; +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; + +import java.util.List; + +@Results({ + @Result(name="success", type="redirectAction", params = { "actionName", "simple-withdraw-item!input", "articleBarcode", "${articleBarcode}", "destinationWarehouseId", "${destinationWarehouseId}"}) +}) +public class PrepareWithdrawItemAction extends MagalieActionSupport implements Preparable { + + private static final Log log = LogFactory.getLog(PrepareWithdrawItemAction.class); + + protected MagalieSession session; + + protected String articleBarcode; + + protected StorageMovementOrder storageMovementOrder; + + protected List<Warehouse> destinationWarehouses; + + protected String destinationWarehouseId; + + protected Double quantity; + + protected boolean askQuantity; + + protected Article article; + + protected Warehouse destinationWarehouse; + + protected FulfilKanbanService fulfilKanbanService; + + protected SimpleWithdrawItemService simpleWithdrawItemService; + + public void setSession(MagalieSession session) { + this.session = session; + } + + public void setFulfilKanbanService(FulfilKanbanService fulfilKanbanService) { + this.fulfilKanbanService = fulfilKanbanService; + } + + public void setSimpleWithdrawItemService(SimpleWithdrawItemService simpleWithdrawItemService) { + this.simpleWithdrawItemService = simpleWithdrawItemService; + } + + @Override + public void prepare() { + + Building building = session.getBuilding(); + + destinationWarehouses = fulfilKanbanService.getDestinationWarehouses(building); + + // let's help user by selecting by default the previously used destination warehouse + + Warehouse lastUsedDestinationWarehouseForKanbans = session.getLastUsedDestinationWarehouseForKanbans(); + + if (lastUsedDestinationWarehouseForKanbans != null) { + + destinationWarehouseId = lastUsedDestinationWarehouseForKanbans.getId(); + + } + + } + + public boolean isAskQuantity() { + return askQuantity; + } + + public String getDestinationWarehouseId() { + return destinationWarehouseId; + } + + public List<Warehouse> getDestinationWarehouses() { + return destinationWarehouses; + } + + public void setArticleBarcode(String articleBarcode) { + this.articleBarcode = articleBarcode; + } + + public void setDestinationWarehouseId(String destinationWarehouseId) { + this.destinationWarehouseId = destinationWarehouseId; + } + + public void setQuantity(Double quantity) { + this.quantity = quantity; + } + + @Override + public void validate() { + + if (log.isDebugEnabled()) { + log.debug("article barcode is " + articleBarcode); + } + + destinationWarehouse = fulfilKanbanService.getStore(destinationWarehouseId); + + // save used destination warehouse to propose it by default on next kanban + session.setLastUsedDestinationWarehouseForKanbans(destinationWarehouse); + + try { + + article = fulfilKanbanService.getArticle(articleBarcode); + + } catch (InvalidMagalieBarcodeException e) { + + addFieldError("articleBarcode", "Le code barre n'est pas un code valide"); + + } + + if (quantity != null) { + + addFieldError("quantity", "Il ne faut pas préciser la quantité"); + + } + + } + + @Override + public String execute() { + + session.setActivity(Activity.SIMPLE_WITHDRAW); + + return SUCCESS; + + } + + public Article getArticle() { + return article; + } + + public String getArticleBarcode() { + return articleBarcode; + } + + public String getStorageMovementOrderId() { + return storageMovementOrder.getId(); + } + +} Modified: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -42,7 +42,8 @@ import java.util.Map; @Results({ - @Result(name="success", type="redirectAction", params = { "actionName", "prepare-article-reception!input" }) + @Result(name= "RECEPTIONS", type="redirectAction", params = { "actionName", "prepare-article-reception!input" }), + @Result(name= "PREPARED_RECEPTIONS", type="redirectAction", params = { "actionName", "prepare-prepared-article-reception!input" }) }) public class ReceiveArticleAction extends MagalieActionSupport { @@ -130,7 +131,7 @@ service.confirmReception(magalieUser, confirmation); - return SUCCESS; + return session.getActivity().name(); } Copied: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SimpleWithdrawItemAction.java (from rev 222, trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SimpleWithdrawItemAction.java) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SimpleWithdrawItemAction.java (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/SimpleWithdrawItemAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,150 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.StoredArticles; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.services.SimpleWithdrawItemTask; +import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; +import com.franciaflex.magalie.services.service.SimpleWithdrawItemService; +import com.franciaflex.magalie.web.MagalieActionSupport; +import com.franciaflex.magalie.web.MagalieSession; +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; +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="redirectAction", params = { "actionName", "prepare-withdraw-item!input" }), + @Result(name="error", type="redirectAction", params = { "actionName", "prepare-withdraw-item!input" }) +}) +public class SimpleWithdrawItemAction extends MagalieActionSupport { + + private static final Log log = LogFactory.getLog(SimpleWithdrawItemAction.class); + + protected SimpleWithdrawItemService service; + + protected String storedArticleId; + + protected String articleBarcode; + + protected MagalieSession session; + + protected SimpleWithdrawItemTask simpleWithdrawItemTask; + + protected String destinationWarehouseId; + + protected String originLocationBarcode; + + public void setSession(MagalieSession session) { + this.session = session; + } + + public void setArticleBarcode(String articleBarcode) { + this.articleBarcode = articleBarcode; + } + + public void setDestinationWarehouseId(String destinationWarehouseId) { + this.destinationWarehouseId = destinationWarehouseId; + } + + public void setService(SimpleWithdrawItemService service) { + this.service = service; + } + + @Override + public String input() { + + Building building = session.getBuilding(); + + MagalieUser magalieUser = session.getMagalieUser(); + + try { + + simpleWithdrawItemTask = service.getSimpleWithdrawItemTask(building, magalieUser, articleBarcode); + + } catch (InvalidMagalieBarcodeException e) { + + log.error("should never occur, barcode is validated before arriving in this action", e); + + session.addMessage("Le code barre " + articleBarcode + " n'est pas un code valide"); + + return ERROR; + + } + + if (simpleWithdrawItemTask.isDriverLicenseRequired()) { + + session.addMessage("Un permis est requis pour accéder à cet article"); + + return ERROR; + + } + + if (simpleWithdrawItemTask.isArticleUnavailable()) { + + session.addMessage("Cet article n'est pas disponible"); + + return ERROR; + + } + + return INPUT; + + } + + public String getDestinationWarehouseId() { + return destinationWarehouseId; + } + + public String getArticleBarcode() { + return articleBarcode; + } + + public SimpleWithdrawItemTask getSimpleWithdrawItemTask() { + return simpleWithdrawItemTask; + } + + public void setStoredArticleId(String storedArticleId) { + this.storedArticleId = storedArticleId; + } + + public void setOriginLocationBarcode(String originLocationBarcode) { + this.originLocationBarcode = originLocationBarcode; + } + + @Override + public String execute() throws InvalidMagalieBarcodeException { + + MagalieUser magalieUser = session.getMagalieUser(); + + Building building = session.getBuilding(); + + simpleWithdrawItemTask = service.getSimpleWithdrawItemTask(building, magalieUser, articleBarcode); + + Optional<StoredArticle> storedArticleOptional = + Iterables.tryFind( + simpleWithdrawItemTask.getStoredArticles(), + StoredArticles.locationBarcodeEquals(originLocationBarcode)); + + if (storedArticleOptional.isPresent()) { + + service.confirmStorageMovement( + magalieUser, destinationWarehouseId, + storedArticleOptional.get()); + + } else { + + addFieldError("originLocationBarcode", "Ce n'est pas le code-barre d'un emplacement valide"); + + return INPUT; + + } + + return SUCCESS; + + } + +} Copied: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferAction.java (from rev 222, trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferAction.java) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferAction.java (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,162 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.Location; +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.services.service.StorageTransferService; +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; + +import java.util.List; + +/** + * @author Bavencoff + */ + +@Results({ + @Result(name="success", type="redirectAction", params = { "actionName", "storage-transfer-location!input"}) +}) +public class StorageTransferAction extends MagalieActionSupport { + + private static final Log log = LogFactory.getLog(StorageTransferAction.class); + + protected MagalieSession session; + + protected StorageTransferService service; + + protected String originId; + + protected Location origin; + + protected List<StoredArticle> storedArticles; + + protected String storedArticleId; + + protected StoredArticle storedArticle; + + protected String destinationBarCode; + + protected double quantity; + + public void setService(StorageTransferService service) { + this.service = service; + } + + public void setSession(MagalieSession session) { + this.session = session; + } + + public void setOriginId(String originId) { + this.originId = originId; + } + + @Override + public String input() { + + if (log.isDebugEnabled()) { + log.debug("originId : " + originId + "\n" + + "storedArticleId : " + storedArticleId); + } + + origin = service.getLocationById(originId); + + storedArticles = service.getStoredArticlesInLocation(origin); + + if (storedArticleId != null) { + storedArticle = service.findStoredArticle(storedArticleId); + quantity = storedArticle.getQuantity(); + } + + return INPUT; + } + + public Location getOrigin() { + return origin; + } + + public List<StoredArticle> getStoredArticles() { + return storedArticles; + } + + public String getStoredArticleId() { + return storedArticleId; + } + + public StoredArticle getStoredArticle() { + return storedArticle; + } + + public double getQuantity() { + return quantity; + } + + public String getDestinationBarCode (){ + return destinationBarCode; + } + + public void setStoredArticleId(String storedArticleId) { + this.storedArticleId = storedArticleId; + } + + public void setDestinationBarCode(String destinationBarCode) { + this.destinationBarCode = destinationBarCode; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + @Override + public String execute() { + + if (log.isDebugEnabled()) { + log.debug("originId : " + originId + "\n" + + "storedArticleId : " + storedArticleId + "\n" + + "quantity : " + quantity + "\n" + + "destinationBarCode : " + destinationBarCode); + } + + + origin = service.getLocationById(originId); + + storedArticle = service.findStoredArticle(storedArticleId); + + if (quantity == 0) { + addFieldError("quantity", "la quantité ne doit pas être nulle"); + return INPUT; + } + + if (quantity > storedArticle.getQuantity()) { + addFieldError("quantity", "Stock insuffisant"); + return INPUT; + } + + if (destinationBarCode.isEmpty()) { + addFieldError("destinationBarCode", "L'emplacement de destination doit être renseigné"); + return INPUT; + } + + Building building = session.getBuilding(); + + Location destination = service.getLocationByBarCode(destinationBarCode, building); + + if (destination == null) { + addFieldError("destinationBarCode", "Le code barre n'est pas un code valide"); + return INPUT; + } + + if (destination.equals(storedArticle.getLocation())) { + addFieldError("destinationBarCode", "la destination doit être différente de l'origine"); + return INPUT; + } + + service.confirmStorageTransfer(session.getMagalieUser(), storedArticle, quantity, destination); + + return SUCCESS; + } + +} Copied: branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferLocationAction.java (from rev 222, trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferLocationAction.java) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferLocationAction.java (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/java/com/franciaflex/magalie/web/action/StorageTransferLocationAction.java 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,80 @@ +package com.franciaflex.magalie.web.action; + +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.Location; +import com.franciaflex.magalie.persistence.entity.StoredArticle; +import com.franciaflex.magalie.services.service.StorageTransferService; +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; + +import java.util.List; + +/** + * @author Bavencoff + */ + +@Results({ + @Result(name="success", type="redirectAction", params = { "actionName", "storage-transfer!input", "originId", "${originId}" }) +}) +public class StorageTransferLocationAction extends MagalieActionSupport { + + private static final Log log = LogFactory.getLog(StorageTransferAction.class); + + protected MagalieSession session; + + protected StorageTransferService service; + + protected String originBarCode; + + protected Location origin; + + public void setService(StorageTransferService service) { + this.service = service; + } + + public void setSession(MagalieSession session) { + this.session = session; + } + + public void setOriginBarCode(String originBarCode) { + this.originBarCode = originBarCode; + } + + @Override + public String execute() { + + if (log.isDebugEnabled()) { + log.debug("origin BarCode : " + originBarCode); + } + + Building building = session.getBuilding(); + + origin = service.getLocationByBarCode(originBarCode, building); + + if (origin == null) { + addFieldError("originBarCode", "Le code barre n'est pas un code valide"); + return INPUT; + } + + List<StoredArticle> storedArticles = service.getStoredArticlesInLocation(origin); + + if (storedArticles.isEmpty()) { + addFieldError("originBarCode", "Aucun articles dans cet emplacement"); + return INPUT; + } + + return SUCCESS; + } + + public String getOriginId() { + String originId = ""; + if (origin != null) { + originId = origin.getId(); + } + return originId; + } +} Modified: branches/magalie-eugene/magalie-web/src/main/resources/struts.properties =================================================================== --- branches/magalie-eugene/magalie-web/src/main/resources/struts.properties 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/resources/struts.properties 2013-05-31 09:59:28 UTC (rev 223) @@ -24,13 +24,13 @@ struts.ognl.allowStaticMethodAccess=true # Help debugging -struts.devMode=true -struts.ognl.logMissingProperties=true -struts.el.throwExceptionOnFailure=true -struts.i18n.reload=true +struts.devMode=${devMode} +struts.ognl.logMissingProperties=${devMode} +struts.el.throwExceptionOnFailure=${devMode} +struts.i18n.reload=${devMode} struts.custom.i18n.resources=resources -struts.configuration.xml.reload=true -struts.convention.classes.reload=true +struts.configuration.xml.reload=${devMode} +struts.convention.classes.reload=${devMode} # Performance tuning # see http://struts.apache.org/2.2.3/docs/performance-tuning.html Modified: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/choose-activity.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -33,8 +33,10 @@ bindKey('2', function(){ redirectTo($('#deliverRequestedArticleLink'));}); bindKey('3', function(){ redirectTo($('#prepareArticleReceptionLink'));}); bindKey('4', function(){ redirectTo($('#preparePreparedArticleReceptionLink'));}); + bindKey('5', function(){ redirectTo($('#storageTransferLink'));}); + bindKey('6', function(){ redirectTo($('#prepareWithdrawItemLink'));}); <s:if test="movementOrderResume" > - bindKey('5', function(){ redirectTo($('#movementOrderResumeLink'));}); + bindKey('7', function(){ redirectTo($('#movementOrderResumeLink'));}); </s:if> bindKey('Esc', function(){ redirectTo($('#logoutLink'));}); }); @@ -62,11 +64,17 @@ <s:url namespace="/" action="prepare-prepared-article-reception!input" id="preparePreparedArticleReceptionUrl"/> <s:a href="%{preparePreparedArticleReceptionUrl}" cssClass="btn btn-block" id="preparePreparedArticleReceptionLink" >Traiter les réceptions fournisseurs préparées (4)</s:a> +<s:url namespace="/" action="storage-transfer-location!input" id="storageTransferUrl"/> +<s:a href="%{storageTransferUrl}" cssClass="btn btn-block" id="storageTransferLink" >Transfert de stock (5)</s:a> + +<s:url namespace="/" action="prepare-withdraw-item!input" id="prepareWithdrawItemUrl"/> +<s:a href="%{prepareWithdrawItemUrl}" cssClass="btn btn-block" id="prepareWithdrawItemLink" >Prélèvement immédiat (6)</s:a> + <s:if test="movementOrderResume" > <s:url namespace="/" action="withdraw-item!input" id="movementOrderResumeUrl"> <s:param name="storageMovementOrderId" value="%{movementOrderResume.id}" /> </s:url> - <s:a href="%{movementOrderResumeUrl}" cssClass="btn btn-block" id="movementOrderResumeLink" >Reprendre l'ordre de mouvement (5)</s:a> + <s:a href="%{movementOrderResumeUrl}" cssClass="btn btn-block" id="movementOrderResumeLink" >Reprendre l'ordre de mouvement (7)</s:a> </s:if> <s:url namespace="/" action="logout" id="logoutUrl"/> Deleted: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/fulfil-kanban-input.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -1,57 +0,0 @@ -<%-- - #%L - MagaLiE :: UI - $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% - --%> -<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> - -<head> - <title>Traitement des kanbans</title> - <script type="text/javascript"> - $(document).ready(function () { - $("#fulfil-kanban_articleBarcode").focus(); - bindKey('Esc', function(){ redirectTo($('#chooseActivityLink'));}); - }); - </script> -</head> - -<s:url namespace="/" action="choose-activity" id="chooseActivityUrl"/> - -<s:form> - <s:textfield key="articleBarcode" label="Article" inputAppendIcon="barcode" cssClass="input-medium" /> - - <s:select label="Magasin destination" - key="destinationWarehouseId" - list="destinationWarehouses" - listKey="id" - listValue="code" - required="true" - /> - - <s:if test="askQuantity"> - <s:textfield name="quantity" label="Qté" inputAppend="%{article.unit}" cssClass="input-mini" /> - </s:if> - - <div class="btn-group"> - <s:a href="%{chooseActivityUrl}" cssClass="btn" id="chooseActivityLink" >Changer d'activité (Esc)</s:a> - <s:submit name="next" value="Suivant" cssClass="btn btn-primary" /> - </div> -</s:form> \ No newline at end of file Copied: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp (from rev 222, trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/prepare-withdraw-item-input.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,57 @@ +<%-- + #%L + MagaLiE :: UI + $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% + --%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +<head> + <title>Traitement des kanbans</title> + <script type="text/javascript"> + $(document).ready(function () { + $("#fulfil-kanban_articleBarcode").focus(); + bindKey('Esc', function(){ redirectTo($('#chooseActivityLink'));}); + }); + </script> +</head> + +<s:url namespace="/" action="choose-activity" id="chooseActivityUrl"/> + +<s:form> + <s:textfield key="articleBarcode" label="Article" inputAppendIcon="barcode" cssClass="input-medium" /> + + <s:select label="Magasin destination" + key="destinationWarehouseId" + list="destinationWarehouses" + listKey="id" + listValue="code" + required="true" + /> + + <s:if test="askQuantity"> + <s:textfield name="quantity" label="Qté" inputAppend="%{article.unit}" cssClass="input-mini" /> + </s:if> + + <div class="btn-group"> + <s:a href="%{chooseActivityUrl}" cssClass="btn" id="chooseActivityLink" >Changer d'activité (Esc)</s:a> + <s:submit name="next" value="Suivant" cssClass="btn btn-primary" /> + </div> +</s:form> \ No newline at end of file Copied: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/simple-withdraw-item-input.jsp (from rev 222, trunk/magalie-web/src/main/webapp/WEB-INF/content/simple-withdraw-item-input.jsp) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/simple-withdraw-item-input.jsp (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/simple-withdraw-item-input.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +<head> + <title>Prélèvement immédiat</title> + <link rel="stylesheet" href="<s:url value='/css/magalie-ck3x-reduced.css' />"/> +</head> + +<s:url namespace="/" action="choose-activity" id="cancelUrl" /> + +<s:form> + + <ul> + + <s:iterator value="simpleWithdrawItemTask.storedArticles"> + + <li><s:property value="location.barcode" /></li> + </s:iterator> + + </ul> + + <s:textfield key="originLocationBarcode" label="Emplacement prélevé" inputAppendIcon="barcode" cssClass="input-medium" /> + + <s:hidden name="destinationWarehouseId" value="%{destinationWarehouseId}" /> + + <s:hidden name="articleBarcode" value="%{articleBarcode}" /> + + <div class="btn-group"> + <s:a href="%{cancelUrl}" cssClass="btn" id="CancelLink" >Quitter (Esc)</s:a> + <s:submit name="" value="Valider" cssClass="btn btn-primary" /> + </div> + +</s:form> Copied: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-input.jsp (from rev 222, trunk/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-input.jsp) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-input.jsp (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-input.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,89 @@ + +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +<head> + <title>Transfert de stock</title> + <script type="text/javascript"> + $(document).ready(function () { + bindKey("Esc", function(){ redirectTo($('#CancelLink'));}); + <s:if test="storedArticle != null" > + $('#storage-transfer_destinationBarCode').focus(); + </s:if> + }); + + + </script> + <link rel="stylesheet" href="<s:url value='/css/magalie-ck3x-reduced.css' />"/> +</head> + +<s:url namespace="/" action="choose-activity" id="cancelUrl" /> + +<header> + <dl class="dl-horizontal"> + <dt>Source</dt> + <dd><s:property value="origin.warehouse.code + origin.code" /></dd> + <s:if test="storedArticle != null" > + <dt>Article</dt> + <dd><s:property value="storedArticle.article.description" /></dd> + <dt>Réf</dt> + <dd><s:property value="storedArticle.article.code" /></dd> + <dt>Qté disponible</dt> + <dd><s:property value="storedArticle.quantity + ' ' + storedArticle.article.unit" /></dd> + </s:if> + </dl> +</header> + + +<s:if test="storedArticle == null" > + <s:iterator value="storedArticles" status="stat"> + <li> + <s:set var="elementStoredArticleId">storedArticleId<s:property value="#stat.index" /></s:set> + <s:url namespace="/" action="storage-transfer!input" id="storageTransferNextStepUrl"> + <s:param name="originId" value="%{origin.id}" /> + <s:param name="storedArticleId" value="%{id}" /> + </s:url> + <s:if test="#stat.index < shortcuts.size()"> + <script type="text/javascript"> + $(document).ready(function () { + var id = '<s:property value="elementStoredArticleId" />'; + bindKey(<s:property value="shortcuts.get(#stat.index)" />, function(){ redirectTo($('#' + id));}); + }); + </script> + <s:a href="%{storageTransferNextStepUrl}" id="%{elementStoredArticleId}"> + <s:property value="article.description" /> + (<s:property value="article.code" />) + (<s:property value="quantity" /> + <s:property value="article.unit" />) + (<s:property value="shortcuts.get(#stat.index)" />) + </s:a> + </s:if> + <s:else> + <s:a href="%{storageTransferNextStepUrl}" > + <s:property value="article.description" /> + (<s:property value="article.code" />) + (<s:property value="quantity" /> + <s:property value="article.unit" />) + </s:a> + </s:else> + </li> + </s:iterator> + + <s:a href="%{cancelUrl}" cssClass="btn" id="CancelLink" >Quitter (Esc)</s:a> + +</s:if> +<s:else> + <s:form cssClass="form-horizontal"> + <s:hidden name="originId" value="%{origin.id}" /> + <s:hidden name="storedArticleId" value="%{storedArticle.id}" /> + + <s:textfield name="quantity" label="Qté" inputAppend="%{storedArticle.article.unit}" type="number" step="any" min="0" cssClass="input-mini" /> + + <s:textfield key="destinationBarCode" label="Destination" inputAppendIcon="barcode" cssClass="input-small" /> + + <div class="btn-group"> + <s:a href="%{cancelUrl}" cssClass="btn" id="CancelLink" >Quitter (Esc)</s:a> + <s:submit name="" value="Valider" cssClass="btn btn-primary" /> + </div> + </s:form> +</s:else> Copied: branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-location-input.jsp (from rev 222, trunk/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-location-input.jsp) =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-location-input.jsp (rev 0) +++ branches/magalie-eugene/magalie-web/src/main/webapp/WEB-INF/content/storage-transfer-location-input.jsp 2013-05-31 09:59:28 UTC (rev 223) @@ -0,0 +1,24 @@ + +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +<head> + <title>Transfert de stock</title> + <script type="text/javascript"> + $(document).ready(function () { + $("#storage-transfer-location_originBarCode").focus(); + bindKey('Esc', function(){ redirectTo($('#chooseActivityLink'));}); + }); + </script> +</head> + +<s:url namespace="/" action="choose-activity" id="chooseActivityUrl"/> + +<s:form> + <s:textfield key="originBarCode" label="Emplacement de prélévement" inputAppendIcon="barcode" cssClass="input-medium" /> + + <div class="btn-group"> + <s:a href="%{chooseActivityUrl}" cssClass="btn" id="chooseActivityLink" >Changer d'activité (Esc)</s:a> + <s:submit name="next" value="Suivant" cssClass="btn btn-primary" /> + </div> +</s:form> \ No newline at end of file Modified: branches/magalie-eugene/magalie-web/src/main/webapp/css/magalie-ck3x.css =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/css/magalie-ck3x.css 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/webapp/css/magalie-ck3x.css 2013-05-31 09:59:28 UTC (rev 223) @@ -45,6 +45,25 @@ margin-left: 110px; } +.control-group.radio > .controls { + margin-left: 0px; +} + +label.radio { +position:relative; + +} + +input.radio { + position:inherit; + margin-top: 0px; + height:auto; +} + +/*.controls { + margin-left: 30px; +} +*/ .btn-group { margin-top: 3px; position: absolute; Modified: branches/magalie-eugene/magalie-web/src/main/webapp/js/magalie.js =================================================================== --- branches/magalie-eugene/magalie-web/src/main/webapp/js/magalie.js 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/magalie-web/src/main/webapp/js/magalie.js 2013-05-31 09:59:28 UTC (rev 223) @@ -74,7 +74,7 @@ function bindKey(key, handler) { $(document).keydown(function(event) { - if (event.which == KEYS[key]) { + if (event.which == KEYS[key] && !($(document.activeElement).is(":input") && SHORTCUTS.indexOf(key) >= 0)) { event.preventDefault(); handler(); } Modified: branches/magalie-eugene/pom.xml =================================================================== --- branches/magalie-eugene/pom.xml 2013-05-31 07:46:32 UTC (rev 222) +++ branches/magalie-eugene/pom.xml 2013-05-31 09:59:28 UTC (rev 223) @@ -79,6 +79,17 @@ <role>technical writer</role> </roles> </developer> + <developer> + <id>sbavencoff</id> + <name>Sylvain Bavencoff</name> + <email>bavencoff at codelutin.com</email> + <organization>CodeLutin</organization> + <organizationUrl>http://www.codelutin.com</organizationUrl> + <timezone>+2</timezone> + <roles> + <role>developer</role> + </roles> + </developer> </developers> <packaging>pom</packaging> @@ -94,19 +105,18 @@ <nuitonWebVersion>1.13</nuitonWebVersion> <nuitonUtilsVersion>2.6.12</nuitonUtilsVersion> - <h2Version>1.3.170</h2Version> + <h2Version>1.3.172</h2Version> <postgresqlVersion>9.1-901-1.jdbc4</postgresqlVersion> - <struts2Version>2.3.8</struts2Version> + <struts2Version>2.3.14.2</struts2Version> <jqueryPluginVersion>3.5.1</jqueryPluginVersion> <bootstrapPluginVersion>1.6.0</bootstrapPluginVersion> <shiroVersion>1.2.1</shiroVersion> - <slf4jVersion>1.7.2</slf4jVersion> + <slf4jVersion>1.7.5</slf4jVersion> <jettyVersion>${jettyPluginVersion}</jettyVersion> - <hibernateVersion>4.1.9.Final</hibernateVersion> + <hibernateVersion>4.2.2.Final</hibernateVersion> <seleniumVersion>2.28.0</seleniumVersion> <mockitoVersion>1.9.5</mockitoVersion> <nuitonI18nVersion>2.5</nuitonI18nVersion> - <topiaVersion>2.7.1</topiaVersion> <eugeneVersion>2.6.3</eugeneVersion> <!-- license to use --> @@ -115,6 +125,9 @@ <!--Site configuration --> <locales>fr</locales> + <!-- configuration --> + <devMode>true</devMode> + </properties> <dependencyManagement> @@ -142,9 +155,14 @@ </dependency> <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-c3p0</artifactId> + <version>${hibernateVersion}</version> + </dependency> + + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> - <scope>test</scope> <version>${h2Version}</version> </dependency> @@ -199,6 +217,7 @@ <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts2Version}</version> + <scope>compile</scope> </dependency> <dependency> @@ -252,15 +271,22 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-jcl</artifactId> <version>${slf4jVersion}</version> - <scope>runtime</scope> + <scope>test</scope> </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>${log4jVersion}</version> + <scope>test</scope> + </dependency> + <!-- Others --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> - <version>1.4.6</version> + <version>1.4.7</version> </dependency> <dependency> @@ -426,6 +452,20 @@ </properties> </profile> + + <profile> + <id>disableDevModeProfile</id> + <activation> + <property> + <name>performRelease</name> + <value>true</value> + </property> + </activation> + <properties> + <devMode>false</devMode> + </properties> + </profile> + </profiles> </project> \ No newline at end of file
participants (1)
-
bleny@users.forge.codelutin.com