Index: branches/features/purchaseOrders/grails-app/services/CreateDataService.groovy
===================================================================
--- branches/features/purchaseOrders/grails-app/services/CreateDataService.groovy	(revision 889)
+++ branches/features/purchaseOrders/grails-app/services/CreateDataService.groovy	(revision 891)
@@ -89,4 +89,5 @@
         createBaseEntryTypes()
 
+
         // Record that data has been created.
         appConfigService.set("baseDataCreated")
@@ -144,4 +145,7 @@
 //         createDemoMaintenanceActions()
         createDemoTaskRecurringSchedules()
+
+        // PurchaseOrderNumbers
+        createDemoPurchaseOrderNumbers()
 
         // Record that data has been created.
@@ -1736,4 +1740,10 @@
     }
 
+    def createDemoPurchaseOrderNumbers() {
+        for (int i=10000; i<10100; i++) {
+            saveAndTest(new PurchaseOrderNumber(value:"P${i}"))
+        }
+    }
+
     /**
     * SearchableIndex and mirroring is disabled at startup.
Index: branches/features/purchaseOrders/grails-app/services/InventoryItemService.groovy
===================================================================
--- branches/features/purchaseOrders/grails-app/services/InventoryItemService.groovy	(revision 889)
+++ branches/features/purchaseOrders/grails-app/services/InventoryItemService.groovy	(revision 891)
@@ -63,5 +63,5 @@
                 }
                 else {
-                    order('purchaseOrderNumber', 'desc')
+                    order('purchaseOrder', 'desc')
                     order('id', 'asc')
                 }
Index: branches/features/purchaseOrders/grails-app/services/InventoryPurchaseService.groovy
===================================================================
--- branches/features/purchaseOrders/grails-app/services/InventoryPurchaseService.groovy	(revision 889)
+++ branches/features/purchaseOrders/grails-app/services/InventoryPurchaseService.groovy	(revision 891)
@@ -6,4 +6,5 @@
     def dateUtilService
     def inventoryMovementService
+    def purchaseOrderService
 
     /**
@@ -23,8 +24,11 @@
         result.totalReceivedAmount = 0
         result.totalPaymentApproved = 0
-        InventoryItemPurchase.withCriteria {
-            eq("inventoryItem", order.inventoryItem)
-            eq("purchaseOrderNumber", order.purchaseOrderNumber)
-        }.each() {
+        def purchaseOrder = order.purchaseOrder
+        def relevantLineItems = purchaseOrder.inventoryItemPurchases.findAll{it.inventoryItem == order.inventoryItem}
+//        InventoryItemPurchase.withCriteria {
+//            eq("inventoryItem", order.inventoryItem)
+//            eq("purchaseOrderNumber", order.purchaseOrderNumber)
+//        }.each() {
+        relevantLineItems.each {
             if(it.inventoryItemPurchaseType.id == 1L) { // Orders.
                 result.totalOrdered += it.quantity
@@ -77,10 +81,10 @@
 
         namedParams.inventoryItem = inventoryItemPurchase.inventoryItem
-        namedParams.purchaseOrderNumber = inventoryItemPurchase.purchaseOrderNumber
+        namedParams.purchaseOrder = inventoryItemPurchase.purchaseOrder
         namedParams.orderPlaced = InventoryItemPurchaseType.read(1)
 
         def order = InventoryItemPurchase.find("from InventoryItemPurchase as p \
                                                                                 where( p.inventoryItem = :inventoryItem \
-                                                                                            and p.purchaseOrderNumber = :purchaseOrderNumber \
+                                                                                            and p.purchaseOrder = :purchaseOrder \
                                                                                             and p.inventoryItemPurchaseType = :orderPlaced )",
                                                                             namedParams)
@@ -322,5 +326,5 @@
 
             result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
-            result.inventoryItemPurchaseInstance.purchaseOrderNumber = result.inventoryItemPurchaseInstance.purchaseOrderNumber.trim()
+            result.inventoryItemPurchaseInstance.purchaseOrder = purchaseOrderService.getOrCreatePurchaseOrder(params)
             result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
             result.inventoryItemPurchaseInstance.inventoryItemPurchaseType = InventoryItemPurchaseType.read(1) // Order
@@ -344,5 +348,5 @@
 
         } // end withTransaction
-    } // save()
+    }  // save()
 
     def receiveSave(params) {
@@ -363,7 +367,10 @@
             result.orderId = order.id
 
+            def purchaseOrderNumber = PurchaseOrderNumber.findByValue(order.purchaseOrderNumber)
+            def purchaseOrder = purchaseOrderNumber.purchaseOrder
+
             result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
             result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
-            result.inventoryItemPurchaseInstance.purchaseOrderNumber = order.purchaseOrderNumber
+            result.inventoryItemPurchaseInstance.purchaseOrder = purchaseOrder
             result.inventoryItemPurchaseInstance.costCode = order.costCode
             result.inventoryItemPurchaseInstance.orderValueCurrency = order.orderValueCurrency
@@ -438,5 +445,5 @@
             result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
             result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
-            result.inventoryItemPurchaseInstance.purchaseOrderNumber = order.purchaseOrderNumber
+            result.inventoryItemPurchaseInstance.purchaseOrder = order.purchaseOrder
             result.inventoryItemPurchaseInstance.costCode = order.costCode
             result.inventoryItemPurchaseInstance.orderValueCurrency = order.orderValueCurrency
Index: branches/features/purchaseOrders/grails-app/services/PurchaseOrderService.groovy
===================================================================
--- branches/features/purchaseOrders/grails-app/services/PurchaseOrderService.groovy	(revision 891)
+++ branches/features/purchaseOrders/grails-app/services/PurchaseOrderService.groovy	(revision 891)
@@ -0,0 +1,43 @@
+class PurchaseOrderService {
+
+    boolean transactional = false
+
+    def serviceMethod() {
+
+    }
+
+    PurchaseOrderNumber findNextUnusedPurchaseOrderNumber() {
+        def empty = PurchaseOrderNumber.list().find{it.purchaseOrder==null}
+        return empty
+    }
+
+    PurchaseOrder getOrCreatePurchaseOrder(params) {
+        def id = params.purchaseOrderNumber.id
+        if (params.purchaseOrderNumber.id instanceof Long) {
+            id = params.purchaseOrderNumber.id
+        } else {
+            id = params.purchaseOrderNumber.id.toString().toLong()
+        }
+        def pon = PurchaseOrderNumber.get(id)
+        def po = pon?.purchaseOrder
+        if (!po) {
+            po = createPurchaseOrder(pon,params)
+        }
+        return po
+    }
+
+    PurchaseOrder createPurchaseOrder(pon,params) {
+        def supplier = Supplier.get(params.supplier.id)
+        def po = new PurchaseOrder(supplier:supplier)
+        pon.purchaseOrder = po
+        po.purchaseOrderNumber = pon
+        pon.save(failOnError:true) // should cascade to save the PO as well. I wonder why it doesn't.
+        po.save(failOnError:true)
+        return po
+    }
+
+    List<PurchaseOrder> findDraftPurchaseOrderNumbers() {
+        def drafts = PurchaseOrder.list().findAll{it.ordered == null}.collect{it.purchaseOrderNumber}
+        return drafts
+    }
+}
