Author: bleny Date: 2013-08-01 14:39:29 +0200 (Thu, 01 Aug 2013) New Revision: 356 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: fixes #2990 by adding supplierGroup column Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Suppliers.java trunk/magalie-persistence/src/main/xmi/magalie.zargo trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SuppliersToReceive.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/webapp/WEB-INF/content/prepare-article-reception-input.jsp Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Suppliers.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Suppliers.java 2013-08-01 10:09:09 UTC (rev 355) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Suppliers.java 2013-08-01 12:39:29 UTC (rev 356) @@ -31,6 +31,15 @@ public class Suppliers { + public static Function<Supplier, String> getSupplierGroup() { + return new GetSupplierGroup(); + } + + public static Comparator<Supplier> orderByNamesComparator() { + Comparator<Supplier> orderByNamesComparator = Ordering.natural().onResultOf(new GetName()); + return orderByNamesComparator; + } + protected static class GetName implements Function<Supplier, String> { @Override @@ -39,9 +48,12 @@ } } - public static Comparator<Supplier> orderByNamesComparator() { - Comparator<Supplier> orderByNamesComparator = Ordering.natural().onResultOf(new GetName()); - return orderByNamesComparator; + protected static class GetSupplierGroup implements Function<Supplier, String> { + + @Override + public String apply(Supplier supplier) { + return supplier.getSupplierGroup(); + } } } Modified: trunk/magalie-persistence/src/main/xmi/magalie.zargo =================================================================== (Binary files differ) Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SuppliersToReceive.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SuppliersToReceive.java 2013-08-01 10:09:09 UTC (rev 355) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/SuppliersToReceive.java 2013-08-01 12:39:29 UTC (rev 356) @@ -26,44 +26,61 @@ import com.franciaflex.magalie.persistence.Suppliers; import com.franciaflex.magalie.persistence.entity.Supplier; import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Ordering; -import java.util.List; -import java.util.Set; +import java.util.Comparator; public class SuppliersToReceive { - protected List<Supplier> suppliers; - protected boolean articlesWithoutSuppliers; protected boolean somethingToReceive; + protected ImmutableSetMultimap<String,Supplier> suppliersByGroup; + public SuppliersToReceive(Iterable<Supplier> suppliers) { somethingToReceive = ! Iterables.isEmpty(suppliers); articlesWithoutSuppliers = Iterables.contains(suppliers, null); - Set<Supplier> sortedSuppliers = Sets.newTreeSet(Suppliers.orderByNamesComparator()); + // on veut présenter les groupes dans l'ordre alphabétique + Comparator<String> supplierGroupsOrder = Ordering.natural(); - Iterables.addAll(sortedSuppliers, Iterables.filter(suppliers, Predicates.notNull())); + // dans chaque groupe, on veut présenter les fournisseurs triés par nom + Comparator<Supplier> suppliersOrdering = Suppliers.orderByNamesComparator(); - this.suppliers = ImmutableList.copyOf(sortedSuppliers); + ImmutableListMultimap<String, Supplier> suppliersIndexedByGroups = + Multimaps.index( + Iterables.filter( + suppliers, + Predicates.notNull()), + Suppliers.getSupplierGroup() + ); + suppliersByGroup = ImmutableSetMultimap + .<String, Supplier> builder() + .orderKeysBy(supplierGroupsOrder) + .orderValuesBy(suppliersOrdering) + .putAll(suppliersIndexedByGroups) + .build(); + } public boolean isSomethingToReceive() { return somethingToReceive; } - public List<Supplier> getSuppliers() { - return suppliers; - } - public boolean isArticlesWithoutSuppliers() { return articlesWithoutSuppliers; } + + public ImmutableSetMultimap<String, Supplier> getSuppliersByGroup() { + return suppliersByGroup; + } + } Modified: trunk/magalie-services/src/main/resources/fixtures.yaml =================================================================== --- trunk/magalie-services/src/main/resources/fixtures.yaml 2013-08-01 10:09:09 UTC (rev 355) +++ trunk/magalie-services/src/main/resources/fixtures.yaml 2013-08-01 12:39:29 UTC (rev 356) @@ -324,15 +324,38 @@ &supplier1 !supplier id: supplier1 name: Somfy + supplierGroup: Matériel supplier2: &supplier2 !supplier id: supplier2 name: Soliris + supplierGroup: Toiles +supplier3: + &supplier3 !supplier + id: supplier3 + name: MégaToiles + supplierGroup: Toiles + +supplier4: + &supplier4 !supplier + id: supplier4 + name: onatout + supplierGroup: Matériel + +supplier5: + &supplier5 !supplier + id: supplier5 + name: SuperStores + supplierGroup: Toiles + suppliers: - *supplier1 - *supplier2 + - *supplier3 + - *supplier4 + - *supplier5 article1: &article1 !article 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-08-01 10:09:09 UTC (rev 355) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ReceptionServiceTest.java 2013-08-01 12:39:29 UTC (rev 356) @@ -41,7 +41,9 @@ import com.franciaflex.magalie.services.exception.InvalidMagalieBarcodeException; import com.franciaflex.magalie.services.exception.PreparedArticleReceptionAlreadyStoredException; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Iterables; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; @@ -51,6 +53,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import java.text.ParseException; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; @@ -96,11 +99,11 @@ Assert.assertTrue(receivedSuppliers.isSomethingToReceive()); - List<Supplier> suppliers = receivedSuppliers.getSuppliers(); + ImmutableSetMultimap<String, Supplier> suppliersByGroup = receivedSuppliers.getSuppliersByGroup(); - Assert.assertEquals(1, suppliers.size()); + Assert.assertEquals(1, suppliersByGroup.size()); - Assert.assertEquals(supplier, suppliers.get(0)); + Assert.assertEquals(supplier, Iterables.get(suppliersByGroup.entries(), 0).getValue()); Assert.assertTrue(receivedSuppliers.isArticlesWithoutSuppliers()); @@ -214,7 +217,7 @@ SuppliersToReceive receivedSuppliers = service.getReceivedSuppliers(building); - List<Supplier> suppliers = receivedSuppliers.getSuppliers(); + ImmutableSetMultimap<String, Supplier> suppliers = receivedSuppliers.getSuppliersByGroup(); Assert.assertTrue(receivedSuppliers.isSomethingToReceive()); @@ -370,4 +373,28 @@ } + @Test + public void testSuppliersPresentation() { + + Iterable<Supplier> suppliers = fixture("suppliers"); + + SuppliersToReceive suppliersToReceive = new SuppliersToReceive(suppliers); + + ImmutableSetMultimap<String,Supplier> suppliersByGroup = suppliersToReceive.getSuppliersByGroup(); + + for (Map.Entry<String, Collection<Supplier>> suppliersByGroupEntry : suppliersByGroup.asMap().entrySet()) { + + String supplierGroup = suppliersByGroupEntry.getKey(); + + Collection<Supplier> suppliersInGroup = suppliersByGroupEntry.getValue(); + + if (log.isDebugEnabled()) { + log.debug(supplierGroup + " ↓\n " + StringUtils.join(suppliersInGroup, "\n ")); + } + + } + + // just check that there is no exception, user can check is order is OK + } + } Modified: trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-article-reception-input.jsp =================================================================== --- trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-article-reception-input.jsp 2013-08-01 10:09:09 UTC (rev 355) +++ trunk/magalie-web/src/main/webapp/WEB-INF/content/prepare-article-reception-input.jsp 2013-08-01 12:39:29 UTC (rev 356) @@ -47,11 +47,19 @@ </s:a> </li> - <s:iterator value="suppliersToReceive.suppliers" status="stat"> + <s:iterator value="suppliersToReceive.suppliersByGroup.entries()" status="stat"> + + <%-- Afficher le nom du groupe --%> + <s:set var="currentGroup"><s:property value="key" /></s:set> + <s:if test="#lastGroup != #currentGroup"> + <s:set var="lastGroup"><s:property value="key" /></s:set> + Groupe <s:property value="key" /> + </s:if> + <li> <s:set var="prepareArticleReceptionId">prepareArticleReceptionId<s:property value="#stat.index" /></s:set> <s:url action="prepare-article-reception" id="prepareArticleReceptionUrl"> - <s:param name="supplierId" value="%{id}" /> + <s:param name="supplierId" value="%{value.id}" /> </s:url> <s:if test="#stat.index + 1 < shortcuts.size()"> <script type="text/javascript"> @@ -60,13 +68,13 @@ bindKey(<s:property value="shortcuts.get(#stat.index + 1)" />, function(){ redirectTo($('#' + id));}); }); </script> - <s:a href="%{prepareArticleReceptionUrl}" id="%{prepareArticleReceptionId}"> - (<s:property value="shortcuts.get(#stat.index + 1)" />) <s:property value="name" /> + <s:a href="%{prepareArticleReceptionUrl}" id="%{prepareArticleReceptionId}"> + (<s:property value="shortcuts.get(#stat.index + 1)" />) <s:property value="value.name" /> </s:a> </s:if> <s:else> <s:a href="%{prepareArticleReceptionUrl}" > - <s:property value="name" /> + <s:property value="value.name" /> </s:a> </s:else> </li>