Index: /trunk/grails-app/controllers/InventoryItemDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 488)
+++ /trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 489)
@@ -136,6 +136,9 @@
         // Restore search unless a new search is being requested.
         if(!params.quickSearch && !filterParams) {
-            if(session.inventoryItemQuickSearch)
+            if(session.inventoryItemQuickSearch) {
                 params.quickSearch = session.inventoryItemQuickSearch
+                if(session.inventoryItemQuickSearchDaysBack)
+                    params.daysBack = session.inventoryItemQuickSearchDaysBack.toString()
+            }
             else if(session.inventoryItemSearchFilterParams) {
                 session.inventoryItemSearchFilterParams.each() { params[it.key] = it.value }
@@ -163,5 +166,6 @@
             session.inventoryItemSearchFilterParams = new LinkedHashMap(filterParams)
             session.inventoryItemSearchFilter = new LinkedHashMap(params.filter)
-            session.inventoryItemQuickSearch = null
+            session.removeAttribute("inventoryItemQuickSearch")
+            session.removeAttribute("inventoryItemQuickSearchDaysBack")
         }
         else {
@@ -174,7 +178,9 @@
             filterParams.quickSearch = result.quickSearch
             // Remember search.
-            session.inventoryItemSearchFilterParams = null
-            session.inventoryItemSearchFilter = null
+            session.removeAttribute("inventoryItemSearchFilterParams")
+            session.removeAttribute("inventoryItemSearchFilter")
             session.inventoryItemQuickSearch = result.quickSearch
+            if(result.daysBack)
+                session.inventoryItemQuickSearchDaysBack = result.daysBack
         }
 
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 488)
+++ /trunk/grails-app/i18n/messages.properties	(revision 489)
@@ -297,2 +297,5 @@
 inventoryItem.search.text.all.description=All inventory items.
 inventoryItem.search.text.all.none.found=No inventory items found.
+inventoryItem.search.text.recently.used=Recently Used
+inventoryItem.search.text.recently.used.description=Items used in the last {0} days.
+inventoryItem.search.text.recently.used.none.found=No items used in the last {0} days.
Index: /trunk/grails-app/services/InventoryItemSearchService.groovy
===================================================================
--- /trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 488)
+++ /trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 489)
@@ -1,2 +1,4 @@
+import grails.orm.PagedResultList
+
 /**
 * Service class that encapsulates the business logic for InventoryItem searches.
@@ -6,4 +8,5 @@
     boolean transactional = false
 
+    def dateUtilService
     def messageSource
 
@@ -37,4 +40,12 @@
                 else
                     result.message = getMessage(code:"inventoryItem.search.text.below.reorder.none.found")
+                break
+            case "recentlyUsed":
+                result.daysBack = params.daysBack?.isInteger() ? params.daysBack.toInteger() : 14
+                result.inventoryItemList = getRecentlyUsed(params, result.daysBack)
+                if(result.inventoryItemList.totalCount > 0)
+                    result.message = getMessage(code:"inventoryItem.search.text.recently.used.description", args:[result.daysBack])
+                else
+                    result.message = getMessage(code:"inventoryItem.search.text.recently.used.none.found", args:[result.daysBack])
                 break
             default:
@@ -93,3 +104,37 @@
     } // getInventoryBelowReorder
 
+    /**
+    * Get a list of recently used inventory items.
+    * @param params The request params.
+    * @param daysBack The number of days back to get results for.
+    */
+    def getRecentlyUsed(params, daysBack) {
+        def paginateParams = [:]
+        paginateParams.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        paginateParams.offset = params?.offset?.toInteger() ?: 0
+
+        def sort = "inventoryItem." + (params?.sort ?: "name")
+        def order = params?.order == "desc" ? "desc" : "asc"
+        def orderBy = " order by " + sort + ' ' + order
+
+        def namedParams = [:]
+        namedParams.startOfDay = dateUtilService.today - daysBack
+
+        def baseQuery = "from InventoryItem as inventoryItem \
+                                        left join inventoryItem.inventoryMovements as inventoryMovement \
+                                        where (inventoryItem.isActive = true \
+                                                    and inventoryMovement.date > :startOfDay \
+                                                    and inventoryMovement.inventoryMovementType = 1 \
+                                                    )"
+
+        def searchQuery = "select distinct inventoryItem " + baseQuery + orderBy
+        def list = InventoryItem.executeQuery(searchQuery, namedParams, paginateParams)
+
+        def countQuery = "select count(distinct inventoryItem) as inventoryItemCount " + baseQuery
+        def totalCount = InventoryItem.executeQuery(countQuery, namedParams)[0].toInteger()
+
+        def inventoryItemInstanceList = new PagedResultList(list, totalCount)
+        return inventoryItemInstanceList
+    } // getRecentlyUsed
+
 } // end class
Index: /trunk/grails-app/views/inventoryItemDetailed/search.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 488)
+++ /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 489)
@@ -217,4 +217,16 @@
                                                 <g:message code="inventoryItem.search.text.below.reorder.all" />
                                 </g:link> - <g:message code="inventoryItem.search.text.below.reorder.all.description" />
+                                <br />
+                                <g:link controller="inventoryItemDetailed"
+                                                action="search"
+                                                params="[quickSearch: 'recentlyUsed', daysBack: '14']">
+                                                <g:message code="inventoryItem.search.text.recently.used" />
+                                </g:link> - <g:message code="inventoryItem.search.text.recently.used.description" args="[14]"/>
+                                <br />
+                                <g:link controller="inventoryItemDetailed"
+                                                action="search"
+                                                params="[quickSearch: 'recentlyUsed', daysBack: '30']">
+                                                <g:message code="inventoryItem.search.text.recently.used" />
+                                </g:link> - <g:message code="inventoryItem.search.text.recently.used.description" args="[30]"/>
                             </td>
                         </tr>
