Author: bleny Date: 2013-06-07 11:40:51 +0200 (Fri, 07 Jun 2013) New Revision: 241 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: fixes #2167 store information of storage movements and received prepared reception Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java trunk/magalie-persistence/src/main/xmi/magalie.properties trunk/magalie-persistence/src/main/xmi/magalie.zargo trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java trunk/magalie-services/src/main/resources/fixtures.yaml trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java trunk/magalie-web/src/main/webapp/WEB-INF/content/receive-article-input.jsp Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java 2013-06-07 09:40:51 UTC (rev 241) @@ -42,4 +42,6 @@ List<StoredArticle> findAllByLocation(Location location); + StoredArticle findInReception(Article article); + } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleJpaDao.java 2013-06-07 09:40:51 UTC (rev 241) @@ -93,4 +93,13 @@ entityManager.detach(storedArticle); return storedArticle; } + + @Override + public StoredArticle findInReception(Article article) { + TypedQuery<StoredArticle> query = createQuery("from StoredArticle sa where sa.article = :article and sa.location.code = :codeForReceptionLocations"); + query.setParameter("article", article); + query.setParameter("codeForReceptionLocations", Locations.codeForReceptionLocations()); + return findUnique(query); + } + } Modified: trunk/magalie-persistence/src/main/xmi/magalie.properties =================================================================== --- trunk/magalie-persistence/src/main/xmi/magalie.properties 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-persistence/src/main/xmi/magalie.properties 2013-06-07 09:40:51 UTC (rev 241) @@ -21,6 +21,7 @@ # #L% ### com.franciaflex.magalie.persistence.entity.Article.attribute.fixedLocations.stereotype=unique +com.franciaflex.magalie.persistence.entity.ReceivedPreparedArticleReception.attribute.storageMovements.stereotype=unique com.franciaflex.magalie.persistence.entity.Company.class.stereotype=notGeneratedValue com.franciaflex.magalie.persistence.entity.Article.class.stereotype=notGeneratedValue Modified: trunk/magalie-persistence/src/main/xmi/magalie.zargo =================================================================== (Binary files differ) Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ReceptionService.java 2013-06-07 09:40:51 UTC (rev 241) @@ -29,6 +29,7 @@ import com.franciaflex.magalie.persistence.dao.LocationDao; import com.franciaflex.magalie.persistence.dao.LocationJpaDao; import com.franciaflex.magalie.persistence.dao.PreparedArticleReceptionJpaDao; +import com.franciaflex.magalie.persistence.dao.ReceivedPreparedArticleReceptionJpaDao; import com.franciaflex.magalie.persistence.dao.StorageMovementDao; import com.franciaflex.magalie.persistence.dao.StorageMovementJpaDao; import com.franciaflex.magalie.persistence.dao.StoredArticleDao; @@ -38,6 +39,7 @@ 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.ReceivedPreparedArticleReception; import com.franciaflex.magalie.persistence.entity.StorageMovement; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.persistence.entity.Supplier; @@ -173,8 +175,19 @@ PreparedArticleReception preparedArticleReception = getPreparedArticleReception(barcode); + JpaMagaliePersistenceContext persistenceContext = + serviceContext.getPersistenceContext(); + + StoredArticleJpaDao storedArticleDao = + persistenceContext.getStoredArticleDao(); + + Article article = preparedArticleReception.getArticle(); + + StoredArticle storedArticle = + storedArticleDao.findInReception(article); + ReceptionTask receptionTask = buildReceptionTask( - preparedArticleReception.getStoredArticle(), + storedArticle, preparedArticleReception.getQuantity()); return receptionTask; @@ -257,7 +270,7 @@ } - public void confirmReception(MagalieUser magalieUser, ReceptionConfirmation receptionConfirmation) { + public void confirmReception(MagalieUser magalieUser, ReceptionConfirmation receptionConfirmation, String preparedArticleReceptionBarcode) { String storedArticleId = receptionConfirmation.getStoredArticleId(); @@ -276,6 +289,8 @@ Date now = serviceContext.getNow(); + Set<StorageMovement> storageMovements = Sets.newHashSet(); + for (Map.Entry<String, Double> locationToStoredQuantity : receptionConfirmation.getLocationIdToStoredQuantities().entrySet()) { StorageMovement storageMovement = new StorageMovement(); @@ -298,8 +313,32 @@ storageMovementDao.persist(storageMovement); + storageMovements.add(storageMovement); + } + if (preparedArticleReceptionBarcode != null) { + + PreparedArticleReceptionJpaDao preparedArticleReceptionDao = + persistenceContext.getPreparedArticleReceptionDao(); + + PreparedArticleReception preparedArticleReception = + preparedArticleReceptionDao.findByBarcode(preparedArticleReceptionBarcode); + + ReceivedPreparedArticleReception newReceivedPreparedArticleReception = + new ReceivedPreparedArticleReception(); + + newReceivedPreparedArticleReception.setPreparedArticleReception(preparedArticleReception); + + newReceivedPreparedArticleReception.setStorageMovements(storageMovements); + + ReceivedPreparedArticleReceptionJpaDao receivedPreparedArticleReceptionDao = + persistenceContext.getReceivedPreparedArticleReceptionDao(); + + receivedPreparedArticleReceptionDao.persist(newReceivedPreparedArticleReception); + + } + persistenceContext.commit(); } Modified: trunk/magalie-services/src/main/resources/fixtures.yaml =================================================================== --- trunk/magalie-services/src/main/resources/fixtures.yaml 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-services/src/main/resources/fixtures.yaml 2013-06-07 09:40:51 UTC (rev 241) @@ -654,21 +654,21 @@ &preparedArticleReception1 !prepared-article-reception id: preparedArticleReception1 barcode: PAR1 - storedArticle: *storedArticleRec1 + article: *article6 quantity: 3 preparedArticleReception2: &preparedArticleReception2 !prepared-article-reception id: preparedArticleReception2 barcode: PAR2 - storedArticle: *storedArticleRec1 + article: *article6 quantity: 4 preparedArticleReception3: &preparedArticleReception3 !prepared-article-reception id: preparedArticleReception3 barcode: PAR3 - storedArticle: *storedArticleRec1 + article: *article6 quantity: 3 preparedArticleReceptions: Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-06-07 09:40:51 UTC (rev 241) @@ -24,12 +24,14 @@ */ import com.franciaflex.magalie.persistence.Locations; +import com.franciaflex.magalie.persistence.dao.ReceivedPreparedArticleReceptionJpaDao; 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.ReceivedPreparedArticleReception; import com.franciaflex.magalie.persistence.entity.StorageMovement; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.persistence.entity.Supplier; @@ -45,6 +47,7 @@ import java.text.ParseException; import java.util.Date; import java.util.List; +import java.util.Map; public class ReceptionServiceTest extends AbstractMagalieServiceTest { @@ -191,7 +194,7 @@ receptionConfirmation.setLocationIdToStoredQuantities( ImmutableMap.of(fixedLocation.getId(), storedArticle.getQuantity())); - service.confirmReception(magalieUser, receptionConfirmation); + service.confirmReception(magalieUser, receptionConfirmation, null); StorageMovementJpaDao storageMovementDao = serviceContext.getPersistenceContext().getStorageMovementDao(); @@ -224,16 +227,59 @@ @Test public void testReceivePreparedReception() { + // we will try to receive a prepared article reception with following barcode + String barcode = "PAR2"; + PreparedArticleReception preparedArticleReception = - service.getPreparedArticleReception("PAR2"); + service.getPreparedArticleReception(barcode); Assert.assertNotNull(preparedArticleReception); ReceptionTask receptionTask = - service.getReceptionTaskForPreparedArticleReception("PAR2"); + service.getReceptionTaskForPreparedArticleReception(barcode); + + // checks that given reception task asks to store quantity given Assert.assertEquals(4., receptionTask.getQuantity(), DELTA); + + // now, try to confirm reception + ReceptionConfirmation receptionConfirmation = new ReceptionConfirmation(); + + receptionConfirmation.setStoredArticleId(receptionTask.getStoredArticle().getId()); + + // just store the whole quantity in the first location given + Map<String, Double> locationIdToStoredQuantities = + ImmutableMap.of( + receptionTask.getLocations().get(0).getId(), + receptionTask.getQuantity()); + + receptionConfirmation.setLocationIdToStoredQuantities(locationIdToStoredQuantities); + + // confirm + service.confirmReception(magalieUser, receptionConfirmation, barcode); + + // now check that confirmation has stored a relation between the prepared article reception + // and the implied storage movements + + ReceivedPreparedArticleReceptionJpaDao receivedPreparedArticleReceptionDao = + serviceContext.getPersistenceContext().getReceivedPreparedArticleReceptionDao(); + + List<ReceivedPreparedArticleReception> allReceivedPreparedArticleReceptions = + receivedPreparedArticleReceptionDao.findAll(); + + Assert.assertEquals(1, allReceivedPreparedArticleReceptions.size()); + + ReceivedPreparedArticleReception receivedPreparedArticleReception = + Iterables.getOnlyElement(allReceivedPreparedArticleReceptions); + + Assert.assertEquals( + "at confirmation we stored the total quantity in a single location, so one storage movement", + locationIdToStoredQuantities.size(), + receivedPreparedArticleReception.getStorageMovements().size()); + + Assert.assertEquals(barcode, receivedPreparedArticleReception.getPreparedArticleReception().getBarcode()); + } } Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/ReceiveArticleAction.java 2013-06-07 09:40:51 UTC (rev 241) @@ -31,6 +31,7 @@ import com.franciaflex.magalie.web.MagalieActionSupport; import com.franciaflex.magalie.web.MagalieSession; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.convention.annotation.Result; @@ -74,7 +75,7 @@ } public void setPreparedArticleReceptionBarcode(String preparedArticleReceptionBarcode) { - this.preparedArticleReceptionBarcode = preparedArticleReceptionBarcode; + this.preparedArticleReceptionBarcode = Strings.emptyToNull(preparedArticleReceptionBarcode); } @Override @@ -110,6 +111,10 @@ } + public String getPreparedArticleReceptionBarcode() { + return preparedArticleReceptionBarcode; + } + public void setConfirmation(String confirmationJson) { try { Map deserialize = (Map) JSONUtil.deserialize(confirmationJson); @@ -129,7 +134,7 @@ MagalieUser magalieUser = session.getMagalieUser(); - service.confirmReception(magalieUser, confirmation); + service.confirmReception(magalieUser, confirmation, preparedArticleReceptionBarcode); return session.getActivity().name(); Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/receive-article-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/receive-article-input.jsp 2013-06-06 16:22:20 UTC (rev 240) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/receive-article-input.jsp 2013-06-07 09:40:51 UTC (rev 241) @@ -47,6 +47,7 @@ <s:form cssClass="form-horizontal"> <s:textfield name="locationBarcode" label="Empl." inputAppendIcon="barcode" cssClass="input-small" /> <s:textfield name="quantity" label="Qté" inputAppend="%{receptionTask.storedArticle.article.unit}" cssClass="input-mini" /> + <s:hidden name="preparedArticleReceptionBarcode" value="%{preparedArticleReceptionBarcode}" /> <s:hidden name="confirmation" /> <div class="btn-group">