Author: bleny Date: 2013-03-27 15:56:51 +0100 (Wed, 27 Mar 2013) New Revision: 51 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: introduce destination site, going back to always positive quantities Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StorageMovements.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovement.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp trunk/magalie-web/src/main/webapp/css/magalie-ck3x.css trunk/magalie-web/src/main/webapp/css/magalie.css trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StorageMovements.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StorageMovements.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StorageMovements.java 2013-03-27 14:56:51 UTC (rev 51) @@ -17,11 +17,11 @@ } } - protected static class GetSiteFunction implements Function<StorageMovement, Site> { + protected static class GetOriginSiteFunction implements Function<StorageMovement, Site> { @Override public Site apply(StorageMovement storageMovement) { - return storageMovement.getSite(); + return storageMovement.getOriginSite(); } } @@ -37,8 +37,8 @@ return new GetArticleFunction(); } - public static Function<StorageMovement, Site> getSiteFunction() { - return new GetSiteFunction(); + public static Function<StorageMovement, Site> getOriginSiteFunction() { + return new GetOriginSiteFunction(); } public static Predicate<StorageMovement> storageMovementIsConfirmed() { 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-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/StoredArticleDao.java 2013-03-27 14:56:51 UTC (rev 51) @@ -7,6 +7,6 @@ public interface StoredArticleDao extends Dao<StoredArticle> { - List<StoredArticle> findAllForArticle(Article article); + List<StoredArticle> findAllByArticle(Article article); } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/dao/jpa/StoredArticleJpaDao.java 2013-03-27 14:56:51 UTC (rev 51) @@ -20,7 +20,7 @@ } @Override - public List<StoredArticle> findAllForArticle(Article article) { + public List<StoredArticle> findAllByArticle(Article article) { Query query = entityManager.createQuery("from StoredArticle sa where sa.article = :article"); query.setParameter("article", article); List<StoredArticle> resultList = query.getResultList(); Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovement.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovement.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovement.java 2013-03-27 14:56:51 UTC (rev 51) @@ -14,9 +14,12 @@ protected String id; @ManyToOne - protected Site site; + protected Site originSite; @ManyToOne + protected Site destinationSite; + + @ManyToOne protected Article article; @ManyToOne @@ -37,14 +40,22 @@ this.id = id; } - public Site getSite() { - return site; + public Site getOriginSite() { + return originSite; } - public void setSite(Site site) { - this.site = site; + public void setOriginSite(Site originSite) { + this.originSite = originSite; } + public Site getDestinationSite() { + return destinationSite; + } + + public void setDestinationSite(Site destinationSite) { + this.destinationSite = destinationSite; + } + public Article getArticle() { return article; } @@ -89,23 +100,4 @@ return confirmDate != null; } - public String getSiteId() { - return getSite().getId(); - } - - public boolean isDriverLicenseRequired() { - return getSite().isDriverLicenseRequired(); - } - - public String getStoreCode() { - return getSite().getStoreCode(); - } - - public String getLocationCode() { - return getSite().getLocationCode(); - } - - public String getSiteBarcode() { - return getSite().getBarcode(); - } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/StorageMovementOrder.java 2013-03-27 14:56:51 UTC (rev 51) @@ -102,7 +102,7 @@ Sets.newHashSet( Iterables.transform( getStorageMovements(), - StorageMovements.getSiteFunction() + StorageMovements.getOriginSiteFunction() ) ); return sites; Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/StorageMovementTask.java 2013-03-27 14:56:51 UTC (rev 51) @@ -26,7 +26,7 @@ return storageMovementOrder.getArticle(); } - public List<StorageMovement> getSites() { + public List<StorageMovement> getStorageMovements() { List<StorageMovement> sites = Lists.newLinkedList(); Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-03-27 14:56:51 UTC (rev 51) @@ -41,6 +41,14 @@ public StorageMovementOrder bookArticle(MagalieUser magalieUser, Article article, double requestedQuantity) throws UnavailableArticleException, RequiredDriverLicenceException { + return bookArticle(magalieUser, article, requestedQuantity, null); + + } + + public StorageMovementOrder bookArticle( + MagalieUser magalieUser, Article article, double requestedQuantity, Site destinationSite) + throws UnavailableArticleException, RequiredDriverLicenceException { + Preconditions.checkNotNull(magalieUser); Preconditions.checkNotNull(article); @@ -106,11 +114,12 @@ newStorageMovement.setMagalieUser(magalieUser); - newStorageMovement.setSite(storedArticle.getSite()); + newStorageMovement.setOriginSite(storedArticle.getSite()); - // we remove from the stock so negative number - newStorageMovement.setQuantity( -1. * quantityWithdrawn); + newStorageMovement.setDestinationSite(destinationSite); + newStorageMovement.setQuantity(quantityWithdrawn); + if (quantityWithdrawn > 0.) { storageMovementOrder.addStorageMovement(newStorageMovement); @@ -155,7 +164,7 @@ newStorageMovement.setArticle(article); - newStorageMovement.setSite(site); + newStorageMovement.setOriginSite(site); newStorageMovement.setQuantity(0.); @@ -172,7 +181,7 @@ StoredArticleDao storedArticleDao = serviceContext.getStoredArticleDao(); - List<StoredArticle> storedArticles = storedArticleDao.findAllForArticle(article); + List<StoredArticle> storedArticles = storedArticleDao.findAllByArticle(article); // consider storage movements and compute actually available quantities @@ -188,11 +197,11 @@ for (StorageMovement storageMovement : storageMovements) { - Site site = storageMovement.getSite(); + Site originSite = storageMovement.getOriginSite(); - StoredArticle storedArticle = storedArticlesBySite.get(site); + StoredArticle storedArticle = storedArticlesBySite.get(originSite); - double actualQuantity = storedArticle.getQuantity() + storageMovement.getQuantity(); + double actualQuantity = storedArticle.getQuantity() - storageMovement.getQuantity(); if (actualQuantity > 0.) { Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-03-27 14:56:51 UTC (rev 51) @@ -128,9 +128,9 @@ Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); StorageMovement site1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(-20., site1.getQuantity(), DELTA); + Assert.assertEquals(20., site1.getQuantity(), DELTA); StorageMovement site2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); - Assert.assertEquals(-30., site2.getQuantity(), DELTA); + Assert.assertEquals(30., site2.getQuantity(), DELTA); } @Test @@ -150,11 +150,11 @@ } Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); StorageMovement storageMovement1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(-20., storageMovement1.getQuantity(), DELTA); - Assert.assertEquals("B2", storageMovement1.getSite().getLocationCode()); + Assert.assertEquals(20., storageMovement1.getQuantity(), DELTA); + Assert.assertEquals("B2", storageMovement1.getOriginSite().getLocationCode()); StorageMovement storageMovement2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); - Assert.assertEquals(-10., storageMovement2.getQuantity(), DELTA); - Assert.assertEquals("A1", storageMovement2.getSite().getLocationCode()); + Assert.assertEquals(10., storageMovement2.getQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement2.getOriginSite().getLocationCode()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); @@ -174,8 +174,8 @@ } Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(-30., storageMovement.getQuantity(), DELTA); - Assert.assertEquals("A1", storageMovement.getSite().getLocationCode()); + Assert.assertEquals(30., storageMovement.getQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement.getOriginSite().getLocationCode()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); @@ -212,7 +212,7 @@ Assert.assertNotEquals( "site2 must not be returned because it was reported in error", site2.getId(), - storageMovement.getSite().getId()); + storageMovement.getOriginSite().getId()); } catch (RequiredDriverLicenceException e) { if (log.isDebugEnabled()) { log.debug("exception raised = " + e); Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/withdraw-item-input.jsp 2013-03-27 14:56:51 UTC (rev 51) @@ -43,10 +43,10 @@ <dd><span id="withdrawn">0</span> / <s:property value="storageMovementTask.quantity" /> <s:property value="storageMovementTask.article.unit" /></dd> </dl> </header> -<section id="sites"> +<section id="storageMovements"> </section> <form class="form-horizontal"> - <s:textfield name="site" label="Empl." inputAppendIcon="barcode" cssClass="input-small" /> + <s:textfield name="siteBarcode" label="Empl." inputAppendIcon="barcode" cssClass="input-small" /> <s:textfield name="quantity" label="Qté" inputAppend="%{storageMovementTask.article.unit}" cssClass="input-mini" /> <s:hidden name="model" /> @@ -55,10 +55,10 @@ <s:submit name="next" value="Suivant" cssClass="btn btn-primary btn-small" /> </div> </form> -<div id="siteTemplate" class="template"> +<div id="storageMovementTemplate" class="template"> <dl class="dl-horizontal"> <dt>Empl.</dt> - <dd data="locationCode"></dd> + <dd data="originSite.locationCode"></dd> <dt>Prélev.</dt> <dd><span data="withdrawn">0</span> / <span data="quantity"></span> <s:property value="storageMovementTask.article.unit" /></dd> </dl> Modified: trunk/magalie-web/src/main/webapp/css/magalie-ck3x.css =================================================================== --- trunk/magalie-web/src/main/webapp/css/magalie-ck3x.css 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-web/src/main/webapp/css/magalie-ck3x.css 2013-03-27 14:56:51 UTC (rev 51) @@ -81,12 +81,12 @@ margin-left: 60px; } -#sites { +#storageMovements { overflow-y: scroll; height: 150px; } -#sites dl { +#storageMovements dl { margin: 0; height: 50px; box-sizing: border-box; Modified: trunk/magalie-web/src/main/webapp/css/magalie.css =================================================================== --- trunk/magalie-web/src/main/webapp/css/magalie.css 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-web/src/main/webapp/css/magalie.css 2013-03-27 14:56:51 UTC (rev 51) @@ -30,15 +30,15 @@ left: 180px; } -#sites .success { +#storageMovements .success { background-color: #77ee77; } -#sites .pending { +#storageMovements .pending { background-color: #ffff99; } -#sites .defect { +#storageMovements .defect { background-color: #ff9999; } Modified: trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js =================================================================== --- trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js 2013-03-27 14:02:44 UTC (rev 50) +++ trunk/magalie-web/src/main/webapp/js/withdraw-item-input.js 2013-03-27 14:56:51 UTC (rev 51) @@ -35,7 +35,7 @@ "use strict"; -model.sitesIndex = 0; +model.storageMovementsIndex = 0; model.allowSubmit = false; model.isFulfilled = function() { @@ -44,7 +44,7 @@ }; model.allIsUsed = function() { - return this.sitesIndex == null; + return this.storageMovementsIndex == null; }; model.canTerminate = function() { @@ -54,31 +54,31 @@ model.withdrawn = function() { var withdrawn = 0; - for (var i = 0; i < this.sites.length; i++) { - withdrawn += this.sites[i].withdrawn || 0; + for (var i = 0; i < this.storageMovements.length; i++) { + withdrawn += this.storageMovements[i].withdrawn || 0; } return withdrawn; }; model.withdraw = function(barcode, quantity) { - var site; - for (var i = 0; i < this.sites.length; i++) { - if (barcode == this.sites[i].siteBarcode) { - site = this.sites[i]; + var storageMovement; + for (var i = 0; i < this.storageMovements.length; i++) { + if (barcode == this.storageMovements[i].originSite.barcode) { + storageMovement = this.storageMovements[i]; } } - if (site == null) { + if (storageMovement == null) { alert(barcode + " n'est pas le code barre d'un emplacement valide"); } - site.used = true; - site.defect = quantity != site.quantity; - site.withdrawn = quantity; + storageMovement.used = true; + storageMovement.defect = quantity != storageMovement.quantity; + storageMovement.withdrawn = quantity; }; model.nextSite = function() { - this.sitesIndex += 1; - if (this.sitesIndex >= this.sites.length) { - this.sitesIndex = null; + this.storageMovementsIndex += 1; + if (this.storageMovementsIndex >= this.storageMovements.length) { + this.storageMovementsIndex = null; } }; @@ -95,27 +95,27 @@ refreshSites : function() { - var sitesElement = $('#sites'); + var storageMovementsElement = $('#storageMovements'); // reset the view - sitesElement.children().remove(); + storageMovementsElement.children().remove(); - // add each site in the model - $.each(model.sites, function(key, site) { - var siteElement = processTemplate('siteTemplate', site); - $(siteElement).attr('id', 'site-' + key); - sitesElement.append(siteElement); - if (site.used) { - if (site.defect) { - $(siteElement).addClass('defect'); + // add each storage movement in the model + $.each(model.storageMovements, function(key, storageMovement) { + var storageMovementElement = processTemplate('storageMovementTemplate', storageMovement); + $(storageMovementElement).attr('id', 'storageMovement-' + key); + storageMovementsElement.append(storageMovementElement); + if (storageMovement.used) { + if (storageMovement.defect) { + $(storageMovementElement).addClass('defect'); } else { - $(siteElement).addClass('success'); + $(storageMovementElement).addClass('success'); } - } else if (site.siteId === model.sites[model.sitesIndex].siteId) { - $(siteElement).addClass('pending'); - sitesElement.scrollTop(siteElement[0].offsetTop); + } else if (storageMovement.originSite.id === model.storageMovements[model.storageMovementsIndex].originSite.id) { + $(storageMovementElement).addClass('pending'); + storageMovementsElement.scrollTop(storageMovementElement[0].offsetTop); } else { - $(siteElement).hide(); + $(storageMovementElement).hide(); } }); @@ -125,8 +125,8 @@ // reset field to prevent reuse of the value by mistake $('#site').val(''); // set default value of quantity to what should be withdrawn on the current site - if (model.sitesIndex != null) { - $('#quantity').val(model.sites[model.sitesIndex].quantity); + if (model.storageMovementsIndex != null) { + $('#quantity').val(model.storageMovements[model.storageMovementsIndex].quantity); } }, @@ -155,7 +155,7 @@ } else { - var barcode = $('#site').val(); + var barcode = $('#siteBarcode').val(); var quantity = parseInt($('#quantity').val()); if ( ! isFinite(quantity) || quantity < 0) { alert('Il faut entrer une quantité valide'); @@ -165,7 +165,7 @@ model.withdraw(barcode, quantity); // if used site focused as current, highlight next site to go - if (barcode == model.sites[model.sitesIndex].siteBarcode) { + if (barcode == model.storageMovements[model.storageMovementsIndex].originSite.barcode) { model.nextSite(); }