Index: trunk/grails-app/services/ContactService.groovy
===================================================================
--- trunk/grails-app/services/ContactService.groovy	(revision 402)
+++ trunk/grails-app/services/ContactService.groovy	(revision 402)
@@ -0,0 +1,103 @@
+/**
+ * Provides a service class with methods to interact with the Contact domain class.
+ * Contact stores contact details for various objects in the database.
+ */
+class ContactService {
+
+    boolean transactional = false
+
+    def delete(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Contact", params.id] ]
+            return result
+        }
+
+        result.contactInstance = Contact.get(params.id)
+
+        if(!result.contactInstance)
+            return fail(code:"default.not.found")
+
+        result.ownerInstance = getOwner(result.contactInstance)
+
+        try {
+            result.contactInstance.delete(flush:true)
+            return result //Success.
+        }
+        catch(org.springframework.dao.DataIntegrityViolationException e) {
+            return fail(code:"default.delete.failure")
+        }
+
+    }
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Contact", params.id] ]
+            return result
+        }
+
+        result.ownerInstance = getOwner(params)
+        if(!result.ownerInstance)
+            return fail(code:"contact.owner.not.found")
+
+        result.contactInstance = new Contact()
+        result.contactInstance.properties = params
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        def result = [:]
+        def fail = { Map m ->
+            if(result.contactInstance && m.field)
+                result.contactInstance.errors.rejectValue(m.field, m.code)
+            result.error = [ code: m.code, args: ["Contact", params.id] ]
+            return result
+        }
+
+        result.ownerInstance = getOwner(params)
+        if(!result.ownerInstance)
+            return fail(code:"contact.owner.not.found")
+
+        result.contactInstance = new Contact(params)
+
+        if(result.contactInstance.hasErrors() || !result.contactInstance.save(flush: true))
+            return fail(code:"default.create.failure")
+
+        // success
+        return result
+    }
+
+    private getOwner(Map params) {
+        def ownerInstance
+
+        if(params.manufacturer?.id)
+            return ownerInstance = Manufacturer.get(params.manufacturer.id)
+        if(params.supplier?.id)
+            return ownerInstance = Supplier.get(params.supplier.id)
+        if(params.person?.id)
+            return ownerInstance = Person.get(params.person.id)
+        if(params.site?.id)
+            return ownerInstance = Site.get(params.site.id)
+
+        return false
+    }
+
+    private getOwner(Object object) {
+        def ownerInstance
+
+        if(object.manufacturer)
+            return ownerInstance = object.manufacturer
+        if(object.supplier)
+            return ownerInstance = object.supplier
+        if(object.person)
+            return ownerInstance = object.person
+        if(object.site)
+            return ownerInstance = object.site
+
+        return false
+    }
+
+} // end of class
Index: trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- trunk/grails-app/services/CreateDataService.groovy	(revision 401)
+++ trunk/grails-app/services/CreateDataService.groovy	(revision 402)
@@ -61,4 +61,5 @@
         createBaseManufacturerTypes()
         createBaseAddressTypes()
+        createBaseContactTypes()
 
         // Tasks
@@ -527,4 +528,55 @@
     }
 
+    def createBaseContactTypes() {
+
+        // ContactType
+        def contactTypeInstance
+
+        // ContactType #1
+        contactTypeInstance = new ContactType(name: "Email",
+                                                                                description: "Email address.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #2
+        contactTypeInstance = new ContactType(name: "Alternate Email",
+                                                                                description: "Alternate email address.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #3
+        contactTypeInstance = new ContactType(name: "Mobile",
+                                                                                description: "Modile phone number.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #4
+        contactTypeInstance = new ContactType(name: "Work Phone",
+                                                                                description: "Work phone number.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #5
+        contactTypeInstance = new ContactType(name: "Home Phone",
+                                                                                description: "Home phone number.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #6
+        contactTypeInstance = new ContactType(name: "Work Fax",
+                                                                                description: "Work fax number.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #7
+        contactTypeInstance = new ContactType(name: "Home Fax",
+                                                                                description: "Home fax number.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #8
+        contactTypeInstance = new ContactType(name: "Web Site",
+                                                                                description: "Web site address.")
+        saveAndTest(contactTypeInstance)
+
+        // ContactType #9
+        contactTypeInstance = new ContactType(name: "Person",
+                                                                                description: "Contact person.")
+        saveAndTest(contactTypeInstance)
+    }
+
     def createDemoSuppliers() {
 
