Index: /trunk/grails-app/controllers/CostCodeDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/CostCodeDetailedController.groovy	(revision 441)
+++ /trunk/grails-app/controllers/CostCodeDetailedController.groovy	(revision 441)
@@ -0,0 +1,110 @@
+import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+
+@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager'])
+class CostCodeDetailedController extends BaseController {
+    
+    def index = { redirect(action:list,params:params) }
+
+    // the delete, save and update actions only accept POST requests
+    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def list = {
+        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
+        [ costCodeInstanceList: CostCode.list( params ), costCodeInstanceTotal: CostCode.count() ]
+    }
+
+    def show = {
+
+        // In the case of an actionSubmit button, rewrite action name from 'index'.
+        if(params._action_Show)
+            params.action='show'
+
+        def costCodeInstance = CostCode.get( params.id )
+
+        if(!costCodeInstance) {
+            flash.message = "CostCode not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else { return [ costCodeInstance : costCodeInstance ] }
+    }
+
+    def delete = {
+        def costCodeInstance = CostCode.get( params.id )
+        if(costCodeInstance) {
+            try {
+                costCodeInstance.delete(flush:true)
+                flash.message = "CostCode ${params.id} deleted"
+                redirect(action:list)
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                flash.message = "CostCode ${params.id} could not be deleted"
+                redirect(action:show,id:params.id)
+            }
+        }
+        else {
+            flash.message = "CostCode not found with id ${params.id}"
+            redirect(action:list)
+        }
+    }
+
+    def edit = {
+
+        // In the case of an actionSubmit button, rewrite action name from 'index'.
+        if(params._action_Edit)
+            params.action='edit'
+
+        def costCodeInstance = CostCode.get( params.id )
+
+        if(!costCodeInstance) {
+            flash.message = "CostCode not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else {
+            return [ costCodeInstance : costCodeInstance ]
+        }
+    }
+
+    def update = {
+        def costCodeInstance = CostCode.get( params.id )
+        if(costCodeInstance) {
+            if(params.version) {
+                def version = params.version.toLong()
+                if(costCodeInstance.version > version) {
+                    
+                    costCodeInstance.errors.rejectValue("version", "default.optimistic.locking.failure")
+                    render(view:'edit',model:[costCodeInstance:costCodeInstance])
+                    return
+                }
+            }
+            costCodeInstance.properties = params
+            if(!costCodeInstance.hasErrors() && costCodeInstance.save(flush: true)) {
+                flash.message = "CostCode ${params.id} updated"
+                redirect(action:show,id:costCodeInstance.id)
+            }
+            else {
+                render(view:'edit',model:[costCodeInstance:costCodeInstance])
+            }
+        }
+        else {
+            flash.message = "CostCode not found with id ${params.id}"
+            redirect(action:list)
+        }
+    }
+
+    def create = {
+        def costCodeInstance = new CostCode()
+        costCodeInstance.properties = params
+        return ['costCodeInstance':costCodeInstance]
+    }
+
+    def save = {
+        def costCodeInstance = new CostCode(params)
+        if(!costCodeInstance.hasErrors() && costCodeInstance.save(flush: true)) {
+            flash.message = "CostCode ${costCodeInstance.id} created"
+            redirect(action:show,id:costCodeInstance.id)
+        }
+        else {
+            render(view:'create',model:[costCodeInstance:costCodeInstance])
+        }
+    }
+}
Index: /trunk/grails-app/controllers/InventoryItemDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 440)
+++ /trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 441)
@@ -34,5 +34,5 @@
 
     /**
-    * Disaply the import view.
+    * Display the import view.
     */
     def importInventory = {
@@ -90,4 +90,26 @@
         def s = inventoryCsvService.buildInventory(inventoryItemList)
         render s
+    }
+
+    /**
+    * Display the import view for purchases.
+    */
+    def importInventoryItemPurchases = {
+    }
+
+    /**
+    * Handle the inventory purchases import save.
+    */
+    def importInventoryItemPurchasesSave = {
+        def result = inventoryCsvService.importInventoryItemPurchases(request)
+
+        if(!result.error) {
+            flash.message = g.message(code: "inventory.import.success")
+            redirect(action:search)
+            return
+        }
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        redirect(action: importInventoryItemPurchases)
     }
 
@@ -194,4 +216,6 @@
                                     inventoryMovementListTotal: result.inventoryMovementListTotal,
                                     inventoryMovementListMax: result.inventoryMovementListMax,
+                                    inventoryItemPurchases: result.inventoryItemPurchases,
+                                    inventoryItemPurchasesTotal: result.inventoryItemPurchasesTotal,
                                     showTab: result.showTab]
 
Index: /trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 441)
+++ /trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 441)
@@ -0,0 +1,180 @@
+import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+
+@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager'])
+class InventoryItemPurchaseDetailedController extends BaseController {
+
+    def authService
+    def inventoryPurchaseService
+
+    def index = {
+        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
+    }
+
+    // the delete, save and update actions only accept POST requests
+    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def show = {
+        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
+
+        if(!inventoryItemPurchaseInstance) {
+            flash.message = "InventoryItemPurchase not found with id ${params.id}"
+            redirect(controller: 'inventoryItemDetailed', action:'search')
+        }
+        else { return [ inventoryItemPurchaseInstance : inventoryItemPurchaseInstance ] }
+    }
+
+    def delete = {
+        def result = inventoryPurchaseService.delete(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.delete.success", args: ["InventoryItemPurchase", params.id])
+            redirect(controller: 'inventoryItemDetailed',
+                            action: 'show',
+                            id: result.inventoryItemId,
+                            params: [showTab: "showPurchasingTab"])
+            return
+        }
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+
+        if(result.error.code == "default.not.found") {
+            redirect(controller: 'inventoryItemDetailed', action: 'search')
+            return
+        }
+
+        redirect(action:show, id: params.id)
+    }
+
+    def edit = {
+        def result = inventoryPurchaseService.edit(params)
+
+        if(!result.error)
+            return [ inventoryItemPurchaseInstance : result.inventoryItemPurchaseInstance ]
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
+    }
+
+    def update = {
+        def result = inventoryPurchaseService.update(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.update.success", args: ["Inventory Purchase", params.id])
+            redirect(action:show, id: params.id)
+            return
+        }
+
+        if(result.error.code == "default.not.found") {
+            flash.message = g.message(code: result.error.code, args: result.error.args)
+            redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
+            return
+        }
+
+        render(view:'edit', model:[inventoryItemPurchaseInstance: result.inventoryItemPurchaseInstance.attach()])
+    }
+
+    def create = {
+        def inventoryItemPurchaseInstance = new InventoryItemPurchase()
+        inventoryItemPurchaseInstance.properties = params
+
+        if(!inventoryItemPurchaseInstance.inventoryItem) {
+            flash.message = "Please select an inventory item then the 'purchasing' tab."
+            redirect(controller: 'inventoryItemDetailed', action: 'search')
+            return
+        }
+
+        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance]
+    }
+
+    def save = {
+        def result = inventoryPurchaseService.save(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
+            redirect(controller: 'inventoryItemDetailed',
+                            action: 'show',
+                            id: result.inventoryItemId,
+                            params: [showTab: "showPurchasingTab"])
+            return
+        }
+
+        render(view:'create', model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance])
+    }
+
+    def receive = {
+        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
+
+        if(!inventoryItemPurchaseInstance) {
+            flash.message = "InventoryItemPurchase not found with id ${params.id}"
+            redirect(controller: 'inventoryItemDetailed', action:'search')
+            return
+        }
+
+        inventoryItemPurchaseInstance.properties = params
+        def calcQuantities = inventoryPurchaseService.calcQuantities(inventoryItemPurchaseInstance)
+        inventoryItemPurchaseInstance.quantity = calcQuantities.thisOrderRemaining
+        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
+                        'orderId': inventoryItemPurchaseInstance.id]
+    }
+
+    def receiveSave = {
+        def result = inventoryPurchaseService.receiveSave(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
+            redirect(controller: 'inventoryItemDetailed',
+                            action: 'show',
+                            id: result.inventoryItemId,
+                            params: [showTab: "showPurchasingTab"])
+            return
+        }
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+
+        if(result.error.code == "default.not.found") {
+            redirect(controller: 'inventoryItemDetailed', action: 'search')
+            return
+        }
+
+        render(view:'receive',
+                        model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
+                                    'orderId': result.orderId])
+    }
+
+    def approveInvoicePayment = {
+        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
+
+        if(!inventoryItemPurchaseInstance) {
+            flash.message = "InventoryItemPurchase not found with id ${params.id}"
+            redirect(controller: 'inventoryItemDetailed', action:'search')
+            return
+        }
+
+        inventoryItemPurchaseInstance.properties = params
+        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
+                        'orderId': inventoryItemPurchaseInstance.id]
+    }
+
+    def approveInvoicePaymentSave = {
+        def result = inventoryPurchaseService.approveInvoicePaymentSave(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
+            redirect(controller: 'inventoryItemDetailed',
+                            action: 'show',
+                            id: result.inventoryItemId,
+                            params: [showTab: "showPurchasingTab"])
+            return
+        }
+
+        if(result.error.code == "default.not.found") {
+            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+            redirect(controller: 'inventoryItemDetailed', action: 'search')
+            return
+        }
+
+        render(view:'approveInvoicePayment',
+                    model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
+                                    'orderId': result.orderId])
+    }
+}
Index: /trunk/grails-app/domain/CostCode.groovy
===================================================================
--- /trunk/grails-app/domain/CostCode.groovy	(revision 441)
+++ /trunk/grails-app/domain/CostCode.groovy	(revision 441)
@@ -0,0 +1,16 @@
+class CostCode {
+    String name
+    String description = ""
+    boolean isActive = true
+
+    static hasMany = [inventoryItemPurchases: InventoryItemPurchase]
+
+    static constraints = {
+        name(maxSize:50,unique:true,blank:false)
+        description(maxSize:100)
+    }
+
+    String toString() {
+        "${this.name}"
+    }
+}
Index: /trunk/grails-app/domain/InventoryItemPurchase.groovy
===================================================================
--- /trunk/grails-app/domain/InventoryItemPurchase.groovy	(revision 441)
+++ /trunk/grails-app/domain/InventoryItemPurchase.groovy	(revision 441)
@@ -0,0 +1,34 @@
+class InventoryItemPurchase {
+
+    Person enteredBy
+    InventoryItem inventoryItem
+    CostCode costCode
+    InventoryItemPurchaseType inventoryItemPurchaseType
+
+    Date dateEntered = new Date()
+    Integer quantity
+    String purchaseOrderNumber = ''
+    BigDecimal orderValueAmount
+    Currency orderValueCurrency
+    String invoiceNumber = ''
+
+    Boolean receivedComplete = false
+    Boolean invoicePaymentApproved = false
+
+//     hasMany = []
+
+    static belongsTo = [InventoryItem]
+
+    static constraints = {
+        quantity(min:0)
+        purchaseOrderNumber(blank:false, maxSize:50)
+        invoiceNumber(maxSize:50)
+        orderValueAmount(max: new BigDecimal(1000000000000))
+        orderValueCurrency()
+    }
+
+    String toString() {
+        "${this.quantity} x ${inventoryItem} - ${this.inventoryItemPurchaseType} "
+    }
+
+}
Index: /trunk/grails-app/domain/InventoryItemPurchaseType.groovy
===================================================================
--- /trunk/grails-app/domain/InventoryItemPurchaseType.groovy	(revision 441)
+++ /trunk/grails-app/domain/InventoryItemPurchaseType.groovy	(revision 441)
@@ -0,0 +1,16 @@
+class InventoryItemPurchaseType {
+    String name
+    String description = ""
+    boolean isActive = true
+
+//     static hasMany = []
+
+    static constraints = {
+        name(maxSize:50,unique:true,blank:false)
+        description(maxSize:100)
+    }
+
+    String toString() {
+        "${this.name}"
+    }
+}
Index: /trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- /trunk/grails-app/services/CreateDataService.groovy	(revision 440)
+++ /trunk/grails-app/services/CreateDataService.groovy	(revision 441)
@@ -62,4 +62,5 @@
         createBaseAddressTypes()
         createBaseContactTypes()
+        createBaseInventoryItemPurchaseTypes()
 
         // Tasks
@@ -113,4 +114,5 @@
         createDemoManufacturers()
         createDemoProductionReference()
+        createDemoCostCodes()
 
         // Tasks
@@ -612,4 +614,29 @@
     }
 
+    def createBaseInventoryItemPurchaseTypes() {
+
+        // InventoryItemPurchaseType
+        def inventoryItemPurchaseTypeInstance
+
+        // InventoryItemPurchaseType #1
+        inventoryItemPurchaseTypeInstance = new InventoryItemPurchaseType(name: "Order Placed",
+                                                                                description: "Order has been placed.")
+        saveAndTest(inventoryItemPurchaseTypeInstance)
+
+        // InventoryItemPurchaseType #2
+        inventoryItemPurchaseTypeInstance = new InventoryItemPurchaseType(name: "Received B/order To Come",
+                                                                                description: "Order has been partially received.")
+        saveAndTest(inventoryItemPurchaseTypeInstance)
+        // InventoryItemPurchaseType #3
+        inventoryItemPurchaseTypeInstance = new InventoryItemPurchaseType(name: "Received Complete",
+                                                                                description: "Order has been partially received.")
+        saveAndTest(inventoryItemPurchaseTypeInstance)
+
+        // InventoryItemPurchaseType #4
+        inventoryItemPurchaseTypeInstance = new InventoryItemPurchaseType(name: "Invoice Approved",
+                                                                                description: "Invoice approved for payment.")
+        saveAndTest(inventoryItemPurchaseTypeInstance)
+    }
+
     def createDemoSuppliers() {
 
@@ -656,4 +683,18 @@
         productionReferenceInstance = new ProductionReference(name: "Tuesday Production")
         saveAndTest(productionReferenceInstance)
+    }
+
+    def createDemoCostCodes() {
+
+        // CostCode
+        def costCodeInstance
+
+        // CostCode #1
+        costCodeInstance = new CostCode(name: "RM Reelstand")
+        saveAndTest(costCodeInstance)
+
+        // CostCode #2
+        costCodeInstance = new CostCode(name: "CAPEX Reelstand")
+        saveAndTest(costCodeInstance)
     }
 
Index: /trunk/grails-app/services/InventoryCsvService.groovy
===================================================================
--- /trunk/grails-app/services/InventoryCsvService.groovy	(revision 440)
+++ /trunk/grails-app/services/InventoryCsvService.groovy	(revision 441)
@@ -11,4 +11,6 @@
 
     boolean transactional = false
+
+    def dateUtilService
 
     def g = new org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib()
@@ -47,9 +49,4 @@
             if (multiPartFile.getSize() > fileMaxSize)
                 return fail(code: "default.file.over.max.size", args: [fileMaxSize/kByteMultiplier, "kB"])
-
-            //TODO: delete
-            def columnValue = ''
-            def columnIndex = 0
-            def numberOfColumns = 0
 
             def line = []
@@ -105,25 +102,8 @@
             def tempAlternateItems = []
 
-            def column = ''
-
             def nextLine = {
                     line = reader.readNext()
                     lineNumber ++
                     log.info "Processing line: " + lineNumber
-            }
-
-            def nextColumn = {
-
-                if( columnIndex < numberOfColumns ) {
-                        column = line[columnIndex].trim()
-                }
-                else {
-                    log.info "No more columns on line: " + lineNumber
-                    return false
-                }
-
-                columnIndex++
-                // Success.
-                return column
             }
 
@@ -280,5 +260,5 @@
                         // Manufacturer Type.
                         if(tempPreferredManufacturerItemAndType.size == 2) {
-                            tempPreferredManufacturerType = WordUtils.capitalizeFully(tempPreferredManufacturerItemAndType[1])
+                            tempPreferredManufacturerType = WordUtils.capitalize(tempPreferredManufacturerItemAndType[1])
                             manufacturerTypeInstance = ManufacturerType.findByName(tempPreferredManufacturerType)
                         }
@@ -291,5 +271,5 @@
 
                         preferredManufacturerInstance = new Manufacturer(name: tempPreferredManufacturerItem,
-                                                                                                            supplierType: manufacturerTypeInstance)
+                                                                                                            manufacturerType: manufacturerTypeInstance)
                         if(!preferredManufacturerInstance.save()) {
                             log.error "Failed to create preferred manufacturer on line: " + lineNumber
@@ -302,6 +282,6 @@
 
                 // Alternate Manufacturers.
-                tempAlternateManufacturers = parseInputList(inventoryParams.manufacturers)
-                inventoryParams.manufacturers = []
+                tempAlternateManufacturers = parseInputList(inventoryParams.alternateManufacturers)
+                inventoryParams.alternateManufacturers = []
 
                 for(tempManufacturer in tempAlternateManufacturers) {
@@ -309,10 +289,10 @@
                     tempManufacturerItem = WordUtils.capitalizeFully(tempManufacturerItemAndType[0])
 
-                    manufacturerInstance = Manufacturer.findByName(tempManufacturerItem)
-                    if(!manufacturerInstance) {
+                    alternateManufacturerInstance = Manufacturer.findByName(tempManufacturerItem)
+                    if(!alternateManufacturerInstance) {
 
                         // ManufacturerType.
                         if(tempManufacturerItemAndType.size == 2) {
-                            tempManufacturerType = WordUtils.capitalizeFully(tempManufacturerItemAndType[1])
+                            tempManufacturerType = WordUtils.capitalize(tempManufacturerItemAndType[1])
                             manufacturerTypeInstance = ManufacturerType.findByName(tempManufacturerType)
                         }
@@ -324,7 +304,7 @@
                         }
 
-                        manufacturerInstance = new Manufacturer(name: tempManufacturerItem,
+                        alternateManufacturerInstance = new Manufacturer(name: tempManufacturerItem,
                                                                                                 manufacturerType: manufacturerTypeInstance)
-                        if(!manufacturerInstance.save()) {
+                        if(!alternateManufacturerInstance.save()) {
                             log.error "Failed to create manufacturers on line: " + lineNumber
                             return fail(code: "inventory.import.failure", args: [lineNumber, logFileLink])
@@ -332,5 +312,5 @@
                     }
 
-                    inventoryParams.manufacturers.add(manufacturerInstance)
+                    inventoryParams.alternateManufacturers.add(alternateManufacturerInstance)
                 }
 
@@ -345,5 +325,5 @@
                         // SupplierType.
                         if(tempPreferredSupplierItemAndType.size == 2) {
-                            tempPreferredSupplierType = WordUtils.capitalizeFully(tempPreferredSupplierItemAndType[1])
+                            tempPreferredSupplierType = WordUtils.capitalize(tempPreferredSupplierItemAndType[1])
                             supplierTypeInstance = SupplierType.findByName(tempPreferredSupplierType)
                         }
@@ -379,5 +359,5 @@
                         // SupplierType.
                         if(tempSupplierItemAndType.size == 2) {
-                            tempSupplierType = WordUtils.capitalizeFully(tempSupplierItemAndType[1])
+                            tempSupplierType = WordUtils.capitalize(tempSupplierItemAndType[1])
                             supplierTypeInstance = SupplierType.findByName(tempSupplierType)
                         }
@@ -397,5 +377,5 @@
                     }
 
-                    inventoryParams.suppliers.add(alternateSupplierInstance)
+                    inventoryParams.alternateSuppliers.add(alternateSupplierInstance)
                 }
 
@@ -475,5 +455,5 @@
                 // Save inventoryItem.
                 if(inventoryItemInstance.hasErrors() || !inventoryItemInstance.save()) {
-                    log.error "Failed to create item on line: " + column + "(" + lineNumber + ")"
+                    log.error "Failed to create item on line: " + lineNumber
                     log.debug inventoryItemInstance.errors
                     return fail(code: "inventory.import.failure", args: [lineNumber, logFileLink])
@@ -641,5 +621,206 @@
         writer.close()
         return sw.toString()
-    } // end buildInventory
+    } // end buildInventory()
+
+    /**
+    * Import inventoryItemPurchases creating items as required.
+    */
+    def importInventoryItemPurchases(request) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+
+            def kByteMultiplier = 1000
+            def fileMaxSize = 800 * kByteMultiplier
+            def logFileLink = g.link(controller: "appCore", action: "appLog") {"log"}
+
+            def multiPartFile = request.getFile('file')
+
+            InputStreamReader sr = new InputStreamReader(multiPartFile.inputStream)
+            CSVReader reader = new CSVReader(sr)
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                reader.close()
+                result.error = [ code: m.code, args: m.args ]
+                return result
+            }
+
+            if(!multiPartFile || multiPartFile.isEmpty())
+                return fail(code: "default.file.not.supplied")
+
+            if (multiPartFile.getSize() > fileMaxSize)
+                return fail(code: "default.file.over.max.size", args: [fileMaxSize/kByteMultiplier, "kB"])
+
+            def line = []
+            def lineNumber = 0
+            def maxNumberOfColumns = 10
+            def inventoryItemPurchaseParams = [:]
+            def inventoryItemPurchaseProperties = ["inventoryItem", "purchaseOrderNumber", "quantity",
+                                                                                "inventoryItemPurchaseType",
+                                                                                "costCode", "enteredBy", "dateEntered",
+                                                                                "orderValueAmount", "orderValueCurrency", "invoiceNumber"]
+
+            def personInstance
+            def costCodeInstance
+            def inventoryItemInstance
+            def inventoryItemPurchaseInstance
+            def inventoryItemPurchaseTypeInstance
+
+            def nextLine = {
+                    line = reader.readNext()
+                    lineNumber ++
+                    log.info "Processing line: " + lineNumber
+            }
+
+            def parseInputDate = {
+                if( (it == null) || (it.trim() == '') ) {
+                    log.error "Failed to find any date on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+
+                def d = it.split("/").collect{it.trim()}
+                if(d.size() != 3) {
+                    log.error "Failed to find full date on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+                dateUtilService.makeDate(d[0], d[1], d[2])
+            }
+
+            // Get first line.
+            nextLine()
+
+            // Check for header line 1.
+            if(line != purchasesTemplateHeaderLine1) {
+                log.error "Failed to find header line 1. "
+                log.error "Required: " + purchasesTemplateHeaderLine1.toString()
+                log.error "Supplied: " + line.toString()
+                return fail(code: "default.file.no.header")
+            }
+
+            log.info "Header line found."
+
+            // Prepare the first body line.
+            nextLine()
+
+            // Primary loop.
+            while(line) {
+
+                if(line.size() > maxNumberOfColumns) {
+                    log.error "Too many columns on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+
+                // Ignore comment lines.
+                if(line.toString().toLowerCase().contains("comment")) {
+                    log.info "Comment line found."
+                    nextLine()
+                    continue
+                }
+
+                // Ignore example lines.
+                if(line.toString().toLowerCase().contains("example")) {
+                    log.info "Example line found."
+                    nextLine()
+                    continue
+                }
+
+                // Parse the line into the params map.
+                inventoryItemPurchaseParams = [:]
+                line.eachWithIndex { it, j ->
+                    inventoryItemPurchaseParams."${inventoryItemPurchaseProperties[j]}" = it.trim()
+                }
+
+                // Debug
+                log.debug " Supplied params: "
+                log.debug inventoryItemPurchaseParams
+
+                // Ignore blank lines.
+                if(inventoryItemPurchaseParams.inventoryItem == '') {
+                    log.info "No inventory item name found."
+                    nextLine()
+                    continue
+                }
+
+                // Inventory Item.
+                inventoryItemPurchaseParams.inventoryItem = WordUtils.capitalize(inventoryItemPurchaseParams.inventoryItem)
+                inventoryItemInstance = InventoryItem.findByName(inventoryItemPurchaseParams.inventoryItem)
+                if(!inventoryItemInstance) {
+                    log.error "Inventory item not found on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+                inventoryItemPurchaseParams.inventoryItem = inventoryItemInstance
+
+                // Quantity.
+                if(inventoryItemPurchaseParams.quantity.isInteger())
+                    inventoryItemPurchaseParams.quantity = inventoryItemPurchaseParams.quantity.toInteger()
+                else {
+                    log.error "Quantity is not a valid number on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+
+                // InventoryItemPurchaseType.
+                inventoryItemPurchaseParams.inventoryItemPurchaseType = WordUtils.capitalizeFully(inventoryItemPurchaseParams.inventoryItemPurchaseType)
+                inventoryItemPurchaseTypeInstance = InventoryItemPurchaseType.findByName(inventoryItemPurchaseParams.inventoryItemPurchaseType)
+                if(!inventoryItemPurchaseTypeInstance) {
+                    log.error "Inventory item purchase type not found on line: " + lineNumber
+                    log.debug inventoryItemPurchaseParams.inventoryItemPurchaseType
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+                inventoryItemPurchaseParams.inventoryItemPurchaseType = inventoryItemPurchaseTypeInstance
+
+                // CostCode.
+                if(inventoryItemPurchaseParams.costCode != '') {
+                    inventoryItemPurchaseParams.costCode = WordUtils.capitalizeFully(inventoryItemPurchaseParams.costCode)
+                    costCodeInstance = CostCode.findByName(inventoryItemPurchaseParams.costCode)
+                    if(!costCodeInstance) {
+                        costCodeInstance = new CostCode(name: inventoryItemPurchaseParams.costCode)
+                        if(!costCodeInstance.save()) {
+                            log.error "Failed to create cost code on line: " + lineNumber
+                            return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                        }
+                    }
+                    inventoryItemPurchaseParams.costCode = costCodeInstance
+                }
+
+                // Entered By.
+                inventoryItemPurchaseParams.enteredBy = inventoryItemPurchaseParams.enteredBy.toLowerCase()
+                personInstance = Person.findByLoginName(inventoryItemPurchaseParams.enteredBy)
+                if(!personInstance) {
+                    log.error "Entered by person not found on line: " + lineNumber
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+                inventoryItemPurchaseParams.enteredBy = personInstance
+
+                // Date Entered.
+                inventoryItemPurchaseParams.dateEntered = parseInputDate(inventoryItemPurchaseParams.dateEntered)
+
+                // Debug
+                log.debug "InventoryItemPurchaseParams: "
+                log.debug inventoryItemPurchaseParams
+
+                // Save inventoryItem.
+                log.info "Creating new purchase."
+                inventoryItemPurchaseInstance = new InventoryItemPurchase(inventoryItemPurchaseParams)
+
+                if(inventoryItemPurchaseInstance.hasErrors() || !inventoryItemPurchaseInstance.save()) {
+                    log.error "Failed to create item on line: " + lineNumber
+                    log.debug inventoryItemPurchaseInstance.errors
+                    return fail(code: "inventoryItemPurchase.import.failure", args: [lineNumber, logFileLink])
+                }
+
+                if(lineNumber % 100 == 0)
+                    cleanUpGorm()
+
+                if(!result.error) nextLine()
+            } //while(line)
+
+            // Success.
+            log.info "End of file."
+            reader.close()
+            return result
+
+
+         } //end withTransaction
+    } // end importInventoryItemPurchases()
 
     private getTemplateHeaderLine1() {
@@ -648,4 +829,9 @@
             "Average Delivery Time", "Average Delivery Period", "Supplier's Part Number", "Preferred Supplier", "Alternate Suppliers",
             "Manufacturer's Part Number", "Preferred Manufacturer", "Alternate Manufacturers", "Alternate Item", "Spare For"]
+    }
+
+    private getPurchasesTemplateHeaderLine1() {
+            ["Inventory Item*", "Purchase Order Number", "Quantity*", "Purchase Type*", "Cost Code*", "Entered By*",
+            "Date Entered*", "Order Value", "Currency", "Invoice Number"]
     }
 
Index: /trunk/grails-app/services/InventoryItemService.groovy
===================================================================
--- /trunk/grails-app/services/InventoryItemService.groovy	(revision 440)
+++ /trunk/grails-app/services/InventoryItemService.groovy	(revision 441)
@@ -28,4 +28,5 @@
     def show(params) {
         def result = [:]
+
         def fail = { Map m ->
             result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
@@ -37,4 +38,38 @@
         if(!result.inventoryItemInstance)
             return fail(code:"default.not.found")
+
+        def p = [:]
+
+        if(params.paginate == "purchases") {
+            params.showTab = "showPurchasingTab"
+            p.max = Math.min(params.max?.toInteger() ?: 10, 100)
+            p.offset = params.offset?.toInteger() ?: 0
+            p.sort = params.sort ?: null
+            p.order = params.order ?: null
+        }
+        else {
+            p.max = 10
+            p.offset = 0
+        }
+
+        result.inventoryItemPurchasesTotal = InventoryItemPurchase.countByInventoryItem(result.inventoryItemInstance)
+
+        result.inventoryItemPurchases = InventoryItemPurchase.withCriteria {
+                eq("inventoryItem", result.inventoryItemInstance)
+                maxResults(p.max)
+                firstResult(p.offset)
+                // Sorting:
+                // Default is to sort by order number then id.
+                // When a sortable column is clicked then we sort by that.
+                // If the sortable column clicked is order number then we add id as the second sort.
+                if(p.sort && p.order) {
+                    order(p.sort, p.order)
+                    if(p.sort == "purchaseOrderNumber") order('id', 'asc')
+                }
+                else {
+                    order('purchaseOrderNumber', 'desc')
+                    order('id', 'asc')
+                }
+            }
 
         result.showTab = [:]
@@ -46,14 +81,18 @@
                 result.showTab.movement =  new String("true")
                 break
+            case "showPurchasingTab":
+                result.showTab.purchasing =  new String("true")
+                break
             default:
                 result.showTab.inventory = new String("true")
         }
 
-        def p = [:]
         p.max = result.inventoryMovementListMax = 10
+        p.offset = 0
         p.order = "desc"
         p.sort = "id"
         result.inventoryMovementList = InventoryMovement.findAllByInventoryItem(result.inventoryItemInstance, p)
         result.inventoryMovementListTotal = InventoryMovement.countByInventoryItem(result.inventoryItemInstance)
+
 
         // Success.
Index: /trunk/grails-app/services/InventoryPurchaseService.groovy
===================================================================
--- /trunk/grails-app/services/InventoryPurchaseService.groovy	(revision 441)
+++ /trunk/grails-app/services/InventoryPurchaseService.groovy	(revision 441)
@@ -0,0 +1,346 @@
+class InventoryPurchaseService {
+
+    boolean transactional = false
+
+    def authService
+    def dateUtilService
+    def inventoryMovementService
+
+    /**
+    * Calulates the quantities for an inventoryItem and purchaseOrderNumber.
+    * @param order An inventory puchase that was the source of the order.
+    * @returns A result map contianing the totalOrdered, totalReceived, totalRemaining, thisOrderRemaining.
+    */
+    def calcQuantities(order) {
+
+        def result = [:]
+
+        result.totalOrdered = 0
+        InventoryItemPurchase.withCriteria {
+            eq("inventoryItem", order.inventoryItem)
+            eq("purchaseOrderNumber", order.purchaseOrderNumber)
+            inventoryItemPurchaseType {
+                    eq("id", 1L)
+            }
+        }.each() {
+            result.totalOrdered += it.quantity
+        }
+
+        result.totalReceived = 0
+        InventoryItemPurchase.withCriteria {
+            eq("inventoryItem", order.inventoryItem)
+            eq("purchaseOrderNumber", order.purchaseOrderNumber)
+            inventoryItemPurchaseType {
+                or {
+                    eq("id", 2L)
+                    eq("id", 3L)
+                }
+            }
+        }.each() {
+            result.totalReceived += it.quantity
+        }
+
+        result.totalRemaining
+        if(result.totalOrdered > result.totalReceived)
+            result.totalRemaining = result.totalOrdered - result.totalReceived
+        else
+            result.totalRemaining = 0
+
+        result.thisOrderRemaining
+        if(result.totalRemaining > order.quantity)
+            result.thisOrderRemaining = order.quantity
+        else
+            result.thisOrderRemaining = result.totalRemaining
+
+        return result
+    }
+
+    def delete(params) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemPurchase && m.field)
+                    result.inventoryItemPurchase.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+                return result
+            }
+
+            result.inventoryItemPurchaseInstance = InventoryItemPurchase.get(params.id)
+
+            if(!result.inventoryItemPurchaseInstance)
+                return fail(code:"default.not.found")
+
+            result.inventoryItemId = result.inventoryItemPurchaseInstance.inventoryItem.id
+            def purchaseTypeId = result.inventoryItemPurchaseInstance.inventoryItemPurchaseType.id
+
+            // Handle Invoice Payment Approved.
+            // Find and mark all orders as invoicePaymentApproved = false.
+            if(purchaseTypeId == 4) {
+                InventoryItemPurchase.withCriteria {
+                    eq("inventoryItem", result.inventoryItemPurchaseInstance.inventoryItem)
+                    eq("purchaseOrderNumber", result.inventoryItemPurchaseInstance.purchaseOrderNumber)
+                    inventoryItemPurchaseType {
+                            eq("id", 1L) // Order Placed.
+                    }
+                }.each() {
+                    it.invoicePaymentApproved = false
+                }
+            }
+
+            // Handle Received.
+            // Refuse to delete if payment approved.
+            // Find and reverse the matching movement.
+            // Find and mark all orders as receivedComplete = false.
+            if(purchaseTypeId == 2 || purchaseTypeId == 3) {
+
+                def paymentAlreadyApproved = InventoryItemPurchase.withCriteria {
+                    eq("inventoryItem", result.inventoryItemPurchaseInstance.inventoryItem)
+                    eq("purchaseOrderNumber", result.inventoryItemPurchaseInstance.purchaseOrderNumber)
+                    inventoryItemPurchaseType {
+                            eq("id", 4L) // Invoice Payment Approved.
+                    }
+                }
+
+                if(paymentAlreadyApproved)
+                    return fail(code:"inventoryItemPurchase.delete.failure.payment.approved")
+
+                def startOfDay = dateUtilService.getMidnight(result.inventoryItemPurchaseInstance.dateEntered)
+                def inventoryMovements = InventoryMovement.withCriteria {
+                    eq("inventoryItem", result.inventoryItemPurchaseInstance.inventoryItem )
+                    eq("quantity", result.inventoryItemPurchaseInstance.quantity)
+                    between("date", startOfDay, startOfDay+1)
+                    inventoryMovementType {
+                        eq("id", 3L) //purchaseReceived.
+                    }
+                    order('id', 'desc') // The newest one will be first.
+                }
+
+                def movementResult = inventoryMovementService.reverseMove(inventoryMovements[0])
+                if(movementResult.error)
+                    return fail(code:"inventoryMovement.quantity.insufficientItemsInStock")
+
+                InventoryItemPurchase.withCriteria {
+                    eq("inventoryItem", result.inventoryItemPurchaseInstance.inventoryItem)
+                    eq("purchaseOrderNumber", result.inventoryItemPurchaseInstance.purchaseOrderNumber)
+                    inventoryItemPurchaseType {
+                            eq("id", 1L) // Order Placed
+                    }
+                }.each() {
+                    it.receivedComplete = false
+                }
+            } // Handle Received.
+
+            // Handle Order Placed.
+            // Refuse to delete if we have received items.
+            // Deletion of received already requires payment approved to be deleted.
+            if(purchaseTypeId == 1) {
+                def calcQuantities = calcQuantities(result.inventoryItemPurchaseInstance)
+                if(calcQuantities.totalReceived > 0)
+                    return fail(code:"inventoryItemPurchase.delete.failure.received.exists")
+            }
+
+            // Success.
+            // By this stage everything should be handled and the delete call is allowed and expected to pass.
+            result.inventoryItemPurchaseInstance.delete()
+            return result
+
+        } // end withTransaction
+    }
+
+    def edit(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+            return result
+        }
+
+        result.inventoryItemPurchaseInstance = InventoryItemPurchase.get(params.id)
+
+        if(!result.inventoryItemPurchaseInstance)
+            return fail(code:"default.not.found")
+
+        // Success.
+        return result
+    }
+
+    def update(params) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemPurchaseInstance && m.field)
+                    result.inventoryItemPurchaseInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+                return result
+            }
+
+            result.inventoryItemPurchaseInstance = InventoryItemPurchase.get(params.id)
+
+            if(!result.inventoryItemPurchaseInstance)
+                return fail(code:"default.not.found")
+
+            // Optimistic locking check.
+            if(params.version) {
+                if(result.inventoryItemPurchaseInstance.version > params.version.toLong())
+                    return fail(field:"version", code:"default.optimistic.locking.failure")
+            }
+
+            result.inventoryItemPurchaseInstance.properties = params
+
+            if(result.inventoryItemPurchaseInstance.hasErrors() || !result.inventoryItemPurchaseInstance.save())
+                return fail(code:"default.update.failure")
+
+            // Success.
+            return result
+
+        } //end withTransaction
+    }  // end update()
+
+    def save(params) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemPurchase && m.field)
+                    result.inventoryItemPurchase.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+                return result
+            }
+
+            result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
+            result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
+            result.inventoryItemPurchaseInstance.inventoryItemPurchaseType = InventoryItemPurchaseType.read(1) // Order
+
+            // Fetch to prevent lazy initialization error.
+            result.inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure
+
+            if(result.inventoryItemPurchaseInstance.hasErrors() || !result.inventoryItemPurchaseInstance.save())
+                return fail(code:"default.create.failure")
+
+            result.inventoryItemId = result.inventoryItemPurchaseInstance.inventoryItem.id
+
+            // success
+            return result
+
+        } // end withTransaction
+    } // save()
+
+    def receiveSave(params) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemPurchase && m.field)
+                    result.inventoryItemPurchase.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+                return result
+            }
+
+            def order = InventoryItemPurchase.get(params.orderId)
+            if(!order)
+                return fail(code:"default.not.found")
+            result.orderId = order.id
+
+            result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
+            result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
+            result.inventoryItemPurchaseInstance.purchaseOrderNumber = order.purchaseOrderNumber
+            result.inventoryItemPurchaseInstance.costCode = order.costCode
+            result.inventoryItemPurchaseInstance.orderValueCurrency = order.orderValueCurrency
+
+            def calcQuantities = calcQuantities(order)
+            if(result.inventoryItemPurchaseInstance.quantity)
+                calcQuantities.totalReceived += result.inventoryItemPurchaseInstance.quantity
+
+            if(calcQuantities.totalReceived >= calcQuantities.totalOrdered) {
+                order.receivedComplete = true
+                result.inventoryItemPurchaseInstance.receivedComplete = true
+                result.inventoryItemPurchaseInstance.inventoryItemPurchaseType = InventoryItemPurchaseType.read(3) // Received Complete.
+            }
+            else {
+                order.receivedComplete = false
+                result.inventoryItemPurchaseInstance.inventoryItemPurchaseType = InventoryItemPurchaseType.read(2) // Received B/oder to Come.
+            }
+
+            // Fetch to prevent lazy initialization error.
+            result.inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure
+
+            if(order.hasErrors() || !order.save())
+                return fail(code:"default.create.failure")
+
+            if(result.inventoryItemPurchaseInstance.hasErrors() || !result.inventoryItemPurchaseInstance.save())
+                return fail(code:"default.create.failure")
+
+            result.inventoryItemId = result.inventoryItemPurchaseInstance.inventoryItem.id
+
+            // Perform the inventory movement.
+            if(result.inventoryItemPurchaseInstance.quantity > 0) {
+                def p = [:]
+                p.inventoryItem = result.inventoryItemPurchaseInstance.inventoryItem
+                p.quantity = result.inventoryItemPurchaseInstance.quantity
+                p.inventoryMovementType = InventoryMovementType.read(3)
+                def movementResult = inventoryMovementService.move(p)
+                if(movementResult.error)
+                    return fail(code:"default.create.failure")
+            }
+
+            // success
+            return result
+
+        } // end withTransaction
+    } // save()
+
+    def approveInvoicePaymentSave(params) {
+        InventoryItemPurchase.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemPurchaseInstance && m.field)
+                    result.inventoryItemPurchaseInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItemPurchase", params.id] ]
+                return result
+            }
+
+            def order = InventoryItemPurchase.get(params.orderId)
+            if(!order)
+                return fail(code:"default.not.found")
+            result.orderId = order.id
+
+            result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
+
+            result.inventoryItemPurchaseInstance = new InventoryItemPurchase(params)
+            result.inventoryItemPurchaseInstance.enteredBy = authService.currentUser
+            result.inventoryItemPurchaseInstance.purchaseOrderNumber = order.purchaseOrderNumber
+            result.inventoryItemPurchaseInstance.costCode = order.costCode
+            result.inventoryItemPurchaseInstance.orderValueCurrency = order.orderValueCurrency
+            result.inventoryItemPurchaseInstance.inventoryItemPurchaseType = InventoryItemPurchaseType.read(4) // Approve.
+
+            order.invoicePaymentApproved = true
+            result.inventoryItemPurchaseInstance.invoicePaymentApproved = true
+
+            // Fetch to prevent lazy initialization error.
+            result.inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure
+
+            if(!result.inventoryItemPurchaseInstance.invoiceNumber)
+                return fail(field:"invoiceNumber", code:"inventoryItemPurchase.invoiceNumber.required")
+
+            order.invoicePaymentApproved = true
+
+            if(order.hasErrors() || !order.save())
+                return fail(code:"default.create.failure")
+
+            if(result.inventoryItemPurchaseInstance.hasErrors() || !result.inventoryItemPurchaseInstance.save())
+                return fail(code:"default.create.failure")
+
+            result.inventoryItemId = result.inventoryItemPurchaseInstance.inventoryItem.id
+
+            // Success..
+            return result
+
+        } // end withTransaction
+    } // approveInvoicePaymentSave()
+
+} // end class
Index: /trunk/grails-app/views/costCodeDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/costCodeDetailed/create.gsp	(revision 441)
+++ /trunk/grails-app/views/costCodeDetailed/create.gsp	(revision 441)
@@ -0,0 +1,62 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Create CostCode</title>
+        <nav:resources override="true"/>
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="navAlt"/>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${costCodeInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${costCodeInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form action="save" method="post" >
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="name">Name:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'name','errors')}">
+                                    <input type="text" maxlength="50" id="name" name="name" value="${fieldValue(bean:costCodeInstance,field:'name')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="description">Description:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'description','errors')}">
+                                    <input type="text" maxlength="100" id="description" name="description" value="${fieldValue(bean:costCodeInstance,field:'description')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="isActive">Is Active:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'isActive','errors')}">
+                                    <g:checkBox name="isActive" value="${costCodeInstance?.isActive}" ></g:checkBox>
+                                </td>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/costCodeDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/costCodeDetailed/edit.gsp	(revision 441)
+++ /trunk/grails-app/views/costCodeDetailed/edit.gsp	(revision 441)
@@ -0,0 +1,66 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Edit CostCode</title>
+        <nav:resources override="true"/>
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="navAlt"/>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${costCodeInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${costCodeInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form method="post" >
+                <input type="hidden" name="id" value="${costCodeInstance?.id}" />
+                <input type="hidden" name="version" value="${costCodeInstance?.version}" />
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="name">Name:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'name','errors')}">
+                                    <input type="text" maxlength="50" id="name" name="name" value="${fieldValue(bean:costCodeInstance,field:'name')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="description">Description:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'description','errors')}">
+                                    <input type="text" maxlength="100" id="description" name="description" value="${fieldValue(bean:costCodeInstance,field:'description')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="isActive">Is Active:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:costCodeInstance,field:'isActive','errors')}">
+                                    <g:checkBox name="isActive" value="${costCodeInstance?.isActive}" ></g:checkBox>
+                                </td>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><g:actionSubmit class="save" value="Update" /></span>
+                    <span class="button"><g:actionSubmit class="cancel" value="Cancel" action="Show"/></span>
+                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/costCodeDetailed/list.gsp
===================================================================
--- /trunk/grails-app/views/costCodeDetailed/list.gsp	(revision 441)
+++ /trunk/grails-app/views/costCodeDetailed/list.gsp	(revision 441)
@@ -0,0 +1,61 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>CostCode List</title>
+        <nav:resources override="true"/>
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="navAlt"/>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <div class="list">
+                <table>
+                    <thead>
+                        <tr>
+                        
+                   	        <g:sortableColumn property="id" title="Id" />
+                        
+                   	        <g:sortableColumn property="name" title="Name" />
+                        
+                   	        <g:sortableColumn property="description" title="Description" />
+                        
+                   	        <g:sortableColumn property="isActive" title="Is Active" />
+
+                            <th></th>
+                        
+                        </tr>
+                    </thead>
+                    <tbody>
+                    <g:each in="${costCodeInstanceList}" status="i" var="costCodeInstance">
+                        <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/costCodeDetailed/show/${costCodeInstance.id}"'/>
+                        
+                            <td>${fieldValue(bean:costCodeInstance, field:'id')}</td>
+                        
+                            <td>${fieldValue(bean:costCodeInstance, field:'name')}</td>
+                        
+                            <td>${fieldValue(bean:costCodeInstance, field:'description')}</td>
+                        
+                            <td>${fieldValue(bean:costCodeInstance, field:'isActive')}</td>
+
+                            <td>
+                                <g:link action="show" id="${costCodeInstance.id}">
+                                    <img  src="${resource(dir:'images/skin',file:'database_go.png')}" alt="Show" />
+                                </g:link>
+                            </td>
+                        
+                        </tr>
+                    </g:each>
+                    </tbody>
+                </table>
+            </div>
+            <div class="paginateButtons">
+                <g:paginate total="${costCodeInstanceTotal}" />
+            </div>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/costCodeDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/costCodeDetailed/show.gsp	(revision 441)
+++ /trunk/grails-app/views/costCodeDetailed/show.gsp	(revision 441)
@@ -0,0 +1,74 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Show CostCode</title>
+        <nav:resources override="true"/>
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="navAlt"/>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <div class="dialog">
+                <table>
+                    <tbody>
+
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Id:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:costCodeInstance, field:'id')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Name:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:costCodeInstance, field:'name')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Description:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:costCodeInstance, field:'description')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Is Active:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:costCodeInstance, field:'isActive')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Inventory Item Purchases:</td>
+                            
+                            <td  valign="top" style="text-align:left;" class="value">
+                                <ul>
+                                <g:each var="i" in="${costCodeInstance.inventoryItemPurchases}">
+                                    <li><g:link controller="inventoryItemPurchaseDetailed" action="show" id="${i.id}">${i?.encodeAsHTML()}</g:link></li>
+                                </g:each>
+                                </ul>
+                            </td>
+                            
+                        </tr>
+                    
+                    </tbody>
+                </table>
+            </div>
+            <div class="buttons">
+                <g:form>
+                    <input type="hidden" name="id" value="${costCodeInstance?.id}" />
+                    <span class="button"><g:actionSubmit class="edit" value="Edit" /></span>
+                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
+                </g:form>
+            </div>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/edit.gsp	(revision 440)
+++ /trunk/grails-app/views/inventoryItemDetailed/edit.gsp	(revision 441)
@@ -164,5 +164,5 @@
                                     <label for="averageDeliveryTime">Estimated Unit Price:</label>
                                 </td>
-                                <td valign="top">
+                                <td valign="top" class="value">
                                     <input  class="medium ${hasErrors(bean:inventoryItemInstance,field:'estimatedUnitPriceAmount','errors')}"
                                                     type="text" id="estimatedUnitPriceAmount" name="estimatedUnitPriceAmount"
Index: /trunk/grails-app/views/inventoryItemDetailed/importInventoryItemPurchases.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/importInventoryItemPurchases.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemDetailed/importInventoryItemPurchases.gsp	(revision 441)
@@ -0,0 +1,35 @@
+<html>
+    <head>
+        <meta name="layout" content="main" />
+        <title>Import Inventory Item Purchases</title>
+        <nav:resources override="true"/>
+        <g:render template="/shared/pictureHead" />
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Import Inventory Purchases</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:uploadForm action="importInventoryItemPurchasesSave" onsubmit="return Lightbox.loading();">
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="file">File:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <input type="file" id="file" name="file" size="40"/>
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:uploadForm>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemDetailed/search.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 440)
+++ /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 441)
@@ -76,5 +76,9 @@
                                         /
                                         <g:link action="importInventory">
-                                            Import
+                                            Import Inventory
+                                        </g:link>
+                                        /
+                                        <g:link action="importInventoryItemPurchases">
+                                            Import Purchases
                                         </g:link>
                                     </td>
Index: /trunk/grails-app/views/inventoryItemDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/show.gsp	(revision 440)
+++ /trunk/grails-app/views/inventoryItemDetailed/show.gsp	(revision 441)
@@ -43,4 +43,5 @@
                     <richui:tabLabel selected="${showTab.detail}" title="Detail" />
                     <richui:tabLabel selected="${showTab.movement}" title="Movement" />
+                    <richui:tabLabel selected="${showTab.purchasing}" title="Purchasing" />
                 </richui:tabLabels>
 
@@ -384,7 +385,142 @@
 <!-- End Movement tab -->
 
+<!-- Start Purchases tab -->
+                    <richui:tabContent>
+
+                        <g:if test="${inventoryItemPurchases.isEmpty()}">
+                            <br />
+                            No Inventory Purchases.
+                            <br />
+                            <br />
+
+                            <div class="buttons">
+                                <g:form controller="inventoryItemPurchaseDetailed">
+                                    <g:hiddenField name="inventoryItem.id" value="${inventoryItemInstance.id}" />
+                                    <span class="button"><g:actionSubmit action="create" class="add" value="Order" /></span>
+                                </g:form>
+                            </div>
+
+                        </g:if>
+                        <g:else>
+
+                            <div class="list">
+                                <table>
+                                    <thead>
+                                        <tr>
+                                            <g:sortableColumn action="show" property="purchaseOrderNumber"
+                                                                                title="Order #" params="[paginate: 'purchases']"  />
+                                            <g:sortableColumn action="show"  property="dateEntered"
+                                                                                title="Date" params="[paginate: 'purchases']" />
+                                            <g:sortableColumn action="show"  property="costCode"
+                                                                                title="Cost Code" params="[paginate: 'purchases']" />
+                                            <g:sortableColumn action="show"  property="quantity"
+                                                                                title="Quantity" params="[paginate: 'purchases']" />
+                                            <g:sortableColumn action="show"  property="orderValueAmount"
+                                                                                title="Order \$" params="[paginate: 'purchases']" />
+                                            <g:sortableColumn action="show"  property="invoiceNumber"
+                                                                                title="Invoice Number" params="[paginate: 'purchases']" />
+                                            <g:sortableColumn action="show"  property="inventoryItemPurchaseType"
+                                                                                title="Type" params="[paginate: 'purchases']" />
+                                            <th>
+                                                <img  src="${resource(dir:'images/skin',file:'database_go_grey.png')}" alt="Show" title="Show" />
+                                            </th>
+                                            <th>
+                                                <img  src="${resource(dir:'images/skin',file:'basket_put_grey.png')}" alt="Receive" title="Receive" />
+                                            </th>
+                                            <th>
+                                                <img  src="${resource(dir:'images/skin',file:'tick_grey.png')}" alt="Approve" title="Approve Payment" />
+                                            </th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        <g:each in="${inventoryItemPurchases}" status="i" var="purchase">
+                                            <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}"/>
+
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'purchaseOrderNumber')}
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    <g:formatDate date="${purchase.dateEntered}" format="EEE, dd-MMM-yyyy"/>
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'costCode')}
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'quantity')}
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'orderValueAmount')}
+                                                    ${fieldValue(bean:purchase, field:'orderValueCurrency')}
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'invoiceNumber')}
+                                                </td>
+                                                <td onclick='window.location = "${request.getContextPath()}/inventoryItemPurchaseDetailed/show/${purchase.id}"'>
+                                                    ${fieldValue(bean:purchase, field:'inventoryItemPurchaseType')}
+                                                </td>
+                                                <td>
+                                                    <g:link controller="inventoryItemPurchaseDetailed" action="show" id="${purchase.id}">
+                                                        <img  src="${resource(dir:'images/skin',file:'database_go.png')}" alt="Show" title="Show" />
+                                                    </g:link>
+                                                </td>
+                                                <g:if test="${purchase.inventoryItemPurchaseType.id == 1}">
+                                                    <g:if test="${!purchase.receivedComplete}">
+                                                        <td>
+                                                            <g:link controller="inventoryItemPurchaseDetailed" action="receive" id="${purchase.id}">
+                                                                <img  src="${resource(dir:'images/skin',file:'basket_put.png')}" alt="Receive" title="Receive" />
+                                                            </g:link>
+                                                        </td>
+                                                    </g:if>
+                                                    <g:else>
+                                                        <td>
+                                                        </td>
+                                                    </g:else>
+                                                    <g:if test="${!purchase.invoicePaymentApproved}">
+                                                        <td>
+                                                            <g:link controller="inventoryItemPurchaseDetailed" action="approveInvoicePayment" id="${purchase.id}">
+                                                                <img  src="${resource(dir:'images/skin',file:'tick.png')}" alt="Approve" title="Approve Payment" />
+                                                            </g:link>
+                                                        </td>
+                                                    </g:if>
+                                                    <g:else>
+                                                        <td>
+                                                        </td>
+                                                    </g:else>
+                                                </g:if>
+                                                <g:else>
+                                                    <td>
+                                                    </td>
+                                                    <td>
+                                                    </td>
+                                                </g:else>
+
+                                            </tr>
+                                        </g:each>
+                                    </tbody>
+                                </table>
+                            </div>
+
+                            <div class="buttons">
+                                <g:form controller="inventoryItemPurchaseDetailed">
+                                    <g:hiddenField name="inventoryItem.id" value="${inventoryItemInstance.id}" />
+                                    Results: ${inventoryItemPurchases.size()} / ${inventoryItemPurchasesTotal}
+                                    <span class="button"><g:actionSubmit action="create" class="add" value="Order" /></span>
+                                </g:form>
+                            </div>
+
+                            <div class="paginateButtons">
+                                <g:paginate action="show"
+                                                        id="${inventoryItemInstance?.id}"
+                                                        total="${inventoryItemPurchasesTotal}"
+                                                        params="[paginate: 'purchases']" />
+                            </div>
+
+                        </g:else>
+
+                    </richui:tabContent>
+<!-- End Movement tab -->
+
                 </richui:tabContents>
             </richui:tabView>
-
 
         </div>
Index: /trunk/grails-app/views/inventoryItemPurchaseDetailed/approveInvoicePayment.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemPurchaseDetailed/approveInvoicePayment.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemPurchaseDetailed/approveInvoicePayment.gsp	(revision 441)
@@ -0,0 +1,98 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Approve Payment InventoryItemPurchase</title>
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Approve Payment</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${inventoryItemPurchaseInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${inventoryItemPurchaseInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form action="approveInvoicePaymentSave" method="post" >
+                <g:hiddenField name="inventoryItem.id" value="${inventoryItemPurchaseInstance.inventoryItem?.id}" />
+                <g:hiddenField name="orderId" value="${orderId}" />
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="inventoryItem">Inventory Item:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <g:link controller="inventoryItemDetailed"
+                                                    action="show"
+                                                    id="${inventoryItemPurchaseInstance.inventoryItem.id}">
+                                        ${inventoryItemPurchaseInstance.inventoryItem.encodeAsHTML()}
+                                    </g:link>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="purchaseOrderNumber">Purchase Order #:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    ${inventoryItemPurchaseInstance.purchaseOrderNumber.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="costCode">Cost Code:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'costCode','errors')}">
+                                    ${inventoryItemPurchaseInstance.costCode.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="quantity">Invoice #:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'invoiceNumber','errors')}">
+                                    <input type="text" id="invoiceNumber" name="invoiceNumber" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'invoiceNumber')}" />
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="quantity">Quantity:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'quantity','errors')}">
+                                    <input type="text" id="quantity" name="quantity" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'quantity')}" />
+                                    ${inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="orderValue">Purchase Order $:</label>
+                                </td>
+                                <td valign="top">
+                                    <input  class="medium ${hasErrors(bean:inventoryItemPurchaseInstance,field:'orderValueAmount','errors')}"
+                                                    type="text" id="orderValueAmount" name="orderValueAmount"
+                                                    value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'orderValueAmount')}" />
+                                    ${inventoryItemPurchaseInstance.orderValueCurrency?.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemPurchaseDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemPurchaseDetailed/create.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemPurchaseDetailed/create.gsp	(revision 441)
@@ -0,0 +1,93 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Create InventoryItemPurchase</title>
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Order Inventory</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${inventoryItemPurchaseInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${inventoryItemPurchaseInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form action="save" method="post" >
+                <g:hiddenField name="inventoryItem.id" value="${inventoryItemPurchaseInstance?.inventoryItem?.id}" />
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="inventoryItem">Inventory Item:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <g:link controller="inventoryItemDetailed"
+                                                    action="show"
+                                                    id="${inventoryItemPurchaseInstance.inventoryItem.id}">
+                                        ${inventoryItemPurchaseInstance.inventoryItem.encodeAsHTML()}
+                                    </g:link>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="purchaseOrderNumber">Purchase Order #:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'purchaseOrderNumber','errors')}">
+                                    <input type="text" maxlength="50" id="purchaseOrderNumber" name="purchaseOrderNumber" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'purchaseOrderNumber')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="costCode">Cost Code:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'costCode','errors')}">
+                                    <g:select optionKey="id"
+                                                        from="${ CostCode.findAllByIsActive(true).sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) } }"
+                                                        name="costCode.id"
+                                                        value="${inventoryItemPurchaseInstance?.costCode?.id}"
+                                                        noSelection="['null':'']"></g:select>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="quantity">Quantity:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'quantity','errors')}">
+                                    <input type="text" id="quantity" name="quantity" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'quantity')}" />
+                                    ${inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="orderValue">Purchase Order $:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <input  class="medium ${hasErrors(bean:inventoryItemPurchaseInstance,field:'orderValueAmount','errors')}"
+                                                    type="text" id="orderValueAmount" name="orderValueAmount"
+                                                    value="${inventoryItemPurchaseInstance.orderValueAmount}" />
+                                    <g:currencySelect name="orderValueCurrency"
+                                                                        value="${inventoryItemPurchaseInstance.orderValueCurrency}" />
+                                </td>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemPurchaseDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemPurchaseDetailed/edit.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemPurchaseDetailed/edit.gsp	(revision 441)
@@ -0,0 +1,131 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Edit InventoryItemPurchase</title>
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Edit InventoryItemPurchase</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${inventoryItemPurchaseInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${inventoryItemPurchaseInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form method="post" >
+                <input type="hidden" name="id" value="${inventoryItemPurchaseInstance?.id}" />
+                <input type="hidden" name="version" value="${inventoryItemPurchaseInstance?.version}" />
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                    
+                            <tr class="prop">
+                                <td valign="top" class="name">Inventory Item:</td>
+                                
+                                <td valign="top" class="value"><g:link controller="inventoryItemDetailed" action="show" id="${inventoryItemPurchaseInstance?.inventoryItem?.id}">${inventoryItemPurchaseInstance?.inventoryItem?.encodeAsHTML()}</g:link></td>
+                                
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">Inventory Item Purchase Type:</td>
+                                
+                                <td valign="top" class="value">${inventoryItemPurchaseInstance?.inventoryItemPurchaseType?.encodeAsHTML()}</td>
+                                
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">Purchase Order Number:</td>
+                                
+                                <td valign="top" class="value">${fieldValue(bean:inventoryItemPurchaseInstance, field:'purchaseOrderNumber')}</td>
+                                
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="costCode">Cost Code:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'costCode','errors')}">
+                                    <g:select optionKey="id"
+                                                        from="${ CostCode.findAllByIsActive(true).sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) } }"
+                                                        name="costCode.id"
+                                                        value="${inventoryItemPurchaseInstance?.costCode?.id}" ></g:select>
+                                </td>
+                            </tr>
+                    
+                            <tr class="prop">
+                                <td valign="top" class="name">Quantity:</td>
+                                
+                                <td valign="top" class="value">${fieldValue(bean:inventoryItemPurchaseInstance, field:'quantity')}</td>
+                                
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="orderValueAmount">Order Value:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'orderValueAmount','errors')}">
+                                    <input type="text" id="orderValueAmount" name="orderValueAmount" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'orderValueAmount')}" />
+                                    <g:currencySelect name="orderValueCurrency" value="${inventoryItemPurchaseInstance?.orderValueCurrency}" ></g:currencySelect>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="invoiceNumber">Invoice Number:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'invoiceNumber','errors')}">
+                                    <input type="text" maxlength="50" id="invoiceNumber" name="invoiceNumber" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'invoiceNumber')}"/>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="receivedComplete">Received Complete:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    ${inventoryItemPurchaseInstance?.receivedComplete}
+                                </td>
+                            </tr>
+                            
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="invoicePaymentApproved">Invoice Payment Approved:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    ${inventoryItemPurchaseInstance?.invoicePaymentApproved}
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">Date Entered:</td>
+                                
+                                <td valign="top" class="value">
+                                    <g:formatDate date="${inventoryItemPurchaseInstance?.dateEntered}" format="EEE, dd-MMM-yyyy @ HH:mm"/>
+                                </td>
+                                
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">Entered By:</td>
+                                
+                                <td valign="top" class="value"><g:link controller="person" action="show" id="${inventoryItemPurchaseInstance?.enteredBy?.id}">${inventoryItemPurchaseInstance?.enteredBy?.encodeAsHTML()}</g:link></td>
+                                
+                            </tr>
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><g:actionSubmit class="save" value="Update" /></span>
+                    <span class="button"><g:actionSubmit class="cancel" value="Cancel" action="Show"/></span>
+                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemPurchaseDetailed/receive.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemPurchaseDetailed/receive.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemPurchaseDetailed/receive.gsp	(revision 441)
@@ -0,0 +1,90 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Receive InventoryItemPurchase</title>
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Receive Inventory</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <g:hasErrors bean="${inventoryItemPurchaseInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${inventoryItemPurchaseInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+            <g:form action="receiveSave" method="post" >
+                <g:hiddenField name="inventoryItem.id" value="${inventoryItemPurchaseInstance.inventoryItem?.id}" />
+                <g:hiddenField name="orderId" value="${orderId}" />
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="inventoryItem">Inventory Item:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <g:link controller="inventoryItemDetailed"
+                                                    action="show"
+                                                    id="${inventoryItemPurchaseInstance.inventoryItem.id}">
+                                        ${inventoryItemPurchaseInstance.inventoryItem.encodeAsHTML()}
+                                    </g:link>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="purchaseOrderNumber">Purchase Order #:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    ${inventoryItemPurchaseInstance.purchaseOrderNumber.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="costCode">Cost Code:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'costCode','errors')}">
+                                    ${inventoryItemPurchaseInstance.costCode.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="quantity">Quantity:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryItemPurchaseInstance,field:'quantity','errors')}">
+                                    <input type="text" id="quantity" name="quantity" value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'quantity')}" />
+                                    ${inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="orderValueAmount">Purchase Order $:</label>
+                                </td>
+                                <td valign="top">
+                                    <input  class="medium ${hasErrors(bean:inventoryItemPurchaseInstance,field:'orderValueAmount','errors')}"
+                                                    type="text" id="orderValueAmount" name="orderValueAmount"
+                                                    value="${fieldValue(bean:inventoryItemPurchaseInstance,field:'orderValueAmount')}" />
+                                    ${inventoryItemPurchaseInstance.orderValueCurrency?.encodeAsHTML()}
+                                </td>
+                            </tr>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
Index: /trunk/grails-app/views/inventoryItemPurchaseDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemPurchaseDetailed/show.gsp	(revision 441)
+++ /trunk/grails-app/views/inventoryItemPurchaseDetailed/show.gsp	(revision 441)
@@ -0,0 +1,117 @@
+
+
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Show InventoryItemPurchase</title>
+    </head>
+    <body>
+        <div class="nav">
+            <h1>Show InventoryItemPurchase</h1>
+        </div>
+        <div class="body">
+            <g:render template="/shared/messages" />
+            <div class="dialog">
+                <table>
+                    <tbody>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Inventory Item:</td>
+                            
+                            <td valign="top" class="value"><g:link controller="inventoryItemDetailed" action="show" id="${inventoryItemPurchaseInstance?.inventoryItem?.id}">${inventoryItemPurchaseInstance?.inventoryItem?.encodeAsHTML()}</g:link></td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Inventory Item Purchase Type:</td>
+                            
+                            <td valign="top" class="value">${inventoryItemPurchaseInstance?.inventoryItemPurchaseType?.encodeAsHTML()}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Purchase Order Number:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:inventoryItemPurchaseInstance, field:'purchaseOrderNumber')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Cost Code:</td>
+                            
+                            <td valign="top" class="value"><g:link controller="costCodeDetailed" action="show" id="${inventoryItemPurchaseInstance?.costCode?.id}">${inventoryItemPurchaseInstance?.costCode?.encodeAsHTML()}</g:link></td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Quantity:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:inventoryItemPurchaseInstance, field:'quantity')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Order Value:</td>
+                            
+                            <td valign="top" class="value">
+                                ${fieldValue(bean:inventoryItemPurchaseInstance, field:'orderValueAmount')}
+                                ${inventoryItemPurchaseInstance.orderValueCurrency?.encodeAsHTML()}
+                            </td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Invoice Number:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:inventoryItemPurchaseInstance, field:'invoiceNumber')}</td>
+                            
+                        </tr>
+                        
+                        <tr class="prop">
+                            <td valign="top" class="name">
+                                <label for="receivedComplete">Received Complete:</label>
+                            </td>
+                            <td valign="top" class="value">
+                                ${inventoryItemPurchaseInstance?.receivedComplete}
+                            </td>
+                        </tr>
+                        
+                        <tr class="prop">
+                            <td valign="top" class="name">
+                                <label for="invoicePaymentApproved">Invoice Payment Approved:</label>
+                            </td>
+                            <td valign="top" class="value">
+                                ${inventoryItemPurchaseInstance?.invoicePaymentApproved}
+                            </td>
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Date Entered:</td>
+                            
+                            <td valign="top" class="value">
+                                <g:formatDate date="${inventoryItemPurchaseInstance?.dateEntered}" format="EEE, dd-MMM-yyyy @ HH:mm"/>
+                            </td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Entered By:</td>
+                            
+                            <td valign="top" class="value"><g:link controller="person" action="show" id="${inventoryItemPurchaseInstance?.enteredBy?.id}">${inventoryItemPurchaseInstance?.enteredBy?.encodeAsHTML()}</g:link></td>
+                            
+                        </tr>
+                    
+                    </tbody>
+                </table>
+            </div>
+            <div class="buttons">
+                <g:form>
+                    <input type="hidden" name="id" value="${inventoryItemPurchaseInstance?.id}" />
+                    <span class="button"><g:actionSubmit class="edit" value="Edit" /></span>
+                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
+                </g:form>
+            </div>
+        </div>
+    </body>
+</html>
