Index: trunk/grails-app/services/AddressService.groovy
===================================================================
--- trunk/grails-app/services/AddressService.groovy	(revision 397)
+++ trunk/grails-app/services/AddressService.groovy	(revision 397)
@@ -0,0 +1,79 @@
+/**
+ * Provides a service class with methods to interact with Address domain class.
+ * Address stores the address for various objects in the database.
+ */
+class AddressService {
+
+    boolean transactional = false
+
+    def getAddress() {
+        """${this.street1}
+        ${this.street2}
+        ${this.city}
+        ${this.state}
+        ${this.postCode}
+        ${this.country}"""
+
+    }
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Address", params.id] ]
+            return result
+        }
+
+        if(!checkForOwner(params))
+            return fail(code:"address.owner.not.found")
+
+        result.addressInstance = new Address()
+        result.addressInstance.properties = params
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        def result = [:]
+        def fail = { Map m ->
+            if(result.addressInstance && m.field)
+                result.addressInstance.errors.rejectValue(m.field, m.code)
+            result.error = [ code: m.code, args: ["Address", params.id] ]
+            return result
+        }
+
+        if(!checkForOwner(params))
+            return fail(code:"address.owner.not.found")
+
+        result.addressInstance = new Address(params)
+
+        if(result.addressInstance.hasErrors() || !result.addressInstance.save(flush: true))
+            return fail(code:"default.create.failure")
+
+        // success
+        return result
+    }
+
+    private checkForOwner(params) {
+        def manufacturerInstance
+        def supplierInstance
+        def personInstance
+        def siteInstance
+
+        if(params.manufacturer?.id)
+            manufacturerInstance = Manufacturer.get(params.manufacturer.id)
+        if(params.supplier?.id)
+            supplierInstance = Supplier.get(params.supplier.id)
+        if(params.person?.id)
+            personInstance = Person.get(params.person.id)
+        if(params.site?.id)
+            siteInstance = Site.get(params.site?.id)
+
+        if(!manufacturerInstance && !supplierInstance && !personInstance && !siteInstance)
+            return false
+
+        return true
+    }
+
+
+} // end of class
Index: trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- trunk/grails-app/services/CreateDataService.groovy	(revision 396)
+++ trunk/grails-app/services/CreateDataService.groovy	(revision 397)
@@ -58,6 +58,7 @@
         createBaseUnitsOfMeasure()
         createBasePeriods()
-        createBaseSupplierType()
-        createBaseManufacturerType()
+        createBaseSupplierTypes()
+        createBaseManufacturerTypes()
+        createBaseAddressTypes()
 
         // Tasks
@@ -470,5 +471,5 @@
     }
 
-    def createBaseSupplierType() {
+    def createBaseSupplierTypes() {
 
         // SupplierType
@@ -486,5 +487,5 @@
     }
 
-    def createBaseManufacturerType() {
+    def createBaseManufacturerTypes() {
 
         // ManufacturerType
@@ -501,4 +502,35 @@
         saveAndTest(manufacturerTypeInstance)
 
+    }
+
+    def createBaseAddressTypes() {
+
+        // AddressType
+        def addressTypeInstance
+
+        // AddressType #1
+        addressTypeInstance = new AddressType(name: "Postal",
+                                                                                description: "A postal address.")
+        saveAndTest(addressTypeInstance)
+
+        // AddressType #2
+        addressTypeInstance = new AddressType(name: "Physical",
+                                                                                description: "A physical address.")
+        saveAndTest(addressTypeInstance)
+
+        // AddressType #3
+        addressTypeInstance = new AddressType(name: "Postal & Physical",
+                                                                                description: "An address that is both the postal and physical address.")
+        saveAndTest(addressTypeInstance)
+
+        // AddressType #4
+        addressTypeInstance = new AddressType(name: "Invoice",
+                                                                                description: "An address to send invoices to.")
+        saveAndTest(addressTypeInstance)
+
+        // AddressType #5
+        addressTypeInstance = new AddressType(name: "Delivery",
+                                                                                description: "An address to send deliveries to.")
+        saveAndTest(addressTypeInstance)
     }
 
