Index: trunk/grails-app/services/InventoryItemSearchService.groovy
===================================================================
--- trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 638)
+++ trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 646)
@@ -1,2 +1,3 @@
+import net.kromhouts.HqlBuilder
 import grails.orm.PagedResultList
 import org.compass.core.engine.SearchEngineQueryParseException
@@ -104,4 +105,80 @@
             } // createCriteria
     } // getInventoryBelowReorder
+
+    /**
+    * Search for inventory items that are below reorder point.
+    * @param params The request params.
+    * @param locale The locale to use when generating result.message.
+    */
+    def getReorderSearch(params, locale) {
+        def result = [:]
+
+        def getMessage = { Map m ->
+            messageSource.getMessage(m.code, m.args == null ? null : m.args.toArray(), locale)
+        }
+
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+
+        def sort = "inventoryItem." + (params?.sort ?: "name")
+        def order = params?.order == "desc" ? "desc" : "asc"
+
+        def q = new HqlBuilder(max: params.max, offset: params.offset).query {
+            select 'count(distinct inventoryItem) as inventoryItemCount'
+            from 'InventoryItem as inventoryItem',
+                    'left join inventoryItem.alternateSuppliers as alternateSupplier'
+            where 'inventoryItem.unitsInStock <= inventoryItem.reorderPoint'
+                    and 'inventoryItem.isActive = true'
+                    and 'inventoryItem.isObsolete = false'
+
+                    if(!params.includeReorderListingDisabled)
+                        and "inventoryItem.enableReorderListing = true"
+
+                    if(params.selectedSupplier?.isLong()) {
+                        namedParams.supplier = Supplier.get(params.selectedSupplier.toLong())
+                        if(params.includeAlternateSuppliers)
+                            and "(inventoryItem.preferredSupplier = :supplier or alternateSupplier = :supplier)"
+                        else
+                            and "inventoryItem.preferredSupplier = :supplier"
+                    } // if selectedSupplier
+
+                    if(params.selectedGroups) {
+                        namedParams.selectedGroupIds = params.selectedGroups
+                        and  "inventoryItem.inventoryGroup.id in(:selectedGroupIds)"
+                    }
+
+                    if(!params.includeOnBackOrder) {
+                        // Sub query!
+                        def onBackOrder = new HqlBuilder().query {
+                            from "InventoryItemPurchase p"
+                            where "p.inventoryItem = inventoryItem"
+                                    and "p.inventoryItem = inventoryItem"
+                                    and "p.inventoryItemPurchaseType.id = 1" // Order Placed.
+                                    and "p.receivedComplete = false"
+                        }
+
+                        and "not exists ($onBackOrder.query)"
+                    }
+
+        } // query
+
+        def totalCount = InventoryItem.executeQuery(q.query, q.namedParams)[0].toInteger()
+
+        q.select = 'distinct inventoryItem'
+        q.order = "by $sort $order, inventoryItem.id asc"
+        def list = InventoryItem.executeQuery(q.query, q.namedParams, q.paginateParams)
+
+        result.inventoryItemList = new PagedResultList(list, totalCount)
+
+        // Get the result message.
+        if(result.inventoryItemList.totalCount > 0)
+            result.message = getMessage(code:"inventoryItem.search.text.below.reorder.description")
+        else
+            result.message = getMessage(code:"inventoryItem.search.text.below.reorder.none.found")
+
+        // Success.
+        return result
+
+    } // getReorderSearch
 
     /**
