function general_validation_message($record, $message, $type)
 {
     //need the plugin class for some utility functions
     $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php';
     require_once $file;
     $msg = "";
     if ($type == "enrolment") {
         if ($record->action != 'create' && $record->action != 'delete') {
             //invalid action
             return "Enrolment in \"{$record->context}\" could not be processed. " . $message;
         }
         if (!$this->track_role_actions && !$this->track_enrolment_actions) {
             //error without sufficient information to properly provide details
             if ($record->action == 'create') {
                 return 'Enrolment could not be created. ' . $message;
             } else {
                 if ($record->action == 'delete') {
                     return 'Enrolment could not be deleted. ' . $message;
                 }
             }
         }
         //collect role assignment and enrolment messages
         $lines = array();
         if ($this->track_role_actions) {
             //determine if a user identifier was set
             $user_identifier_set = !empty($record->username) || !empty($record->email) || !empty($record->idnumber);
             //determine if all required fields were set
             $required_fields_set = !empty($record->role) && $user_identifier_set && !empty($record->context);
             //descriptive string for user and context
             $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record);
             $context_descriptor = rlip_importplugin_version1elis::get_context_descriptor($record);
             switch ($record->action) {
                 case "create":
                     if ($required_fields_set && in_array($record->context, $valid_contexts) && !empty($record->instance)) {
                         //assignment on a specific context
                         $lines[] = "User with {$user_descriptor} could not be assigned role " . "with shortname \"{$record->role}\" on {$context_descriptor}.";
                     } else {
                         if ($required_fields_set && $record->context == 'system') {
                             //assignment on the system context
                             $lines[] = "User with {$user_descriptor} could not be assigned role " . "with shortname \"{$record->role}\" on the system context.";
                         } else {
                             //not valid
                             $lines[] = "Role assignment could not be created.";
                         }
                     }
                     break;
                 case "delete":
                     if ($required_fields_set && in_array($record->context, $valid_contexts) && !empty($record->instance)) {
                         //unassignment from a specific context
                         $lines[] = "User with {$user_descriptor} could not be unassigned role " . "with shortname \"{$record->role}\" on {$context_descriptor}.";
                     } else {
                         if ($required_fields_set && $record->context == 'system') {
                             //unassignment from the system context
                             $lines[] = "User with {$user_descriptor} could not be unassigned role " . "with shortname \"{$record->role}\" on the system context.";
                         } else {
                             //not valid
                             $lines[] = "Role assignment could not be deleted. ";
                         }
                     }
                     break;
             }
         }
         if ($this->track_enrolment_actions) {
             //determine if a user identifier was set
             $user_identifier_set = !empty($record->username) || !empty($record->email) || !empty($record->idnumber);
             //determine if some required field is missing
             $missing_required_field = !$user_identifier_set || empty($record->instance);
             //descriptive string for user
             $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record);
             switch ($record->action) {
                 case "create":
                     if ($missing_required_field) {
                         //required field missing, so use generic failure message
                         $lines[] = "Enrolment could not be created.";
                     } else {
                         //more accurate failure message
                         $lines[] = "User with {$user_descriptor} could not be enrolled in " . "course with shortname \"{$record->instance}\".";
                     }
                     break;
                 case "delete":
                     if ($missing_required_field) {
                         //required field missing, so use generic failure message
                         $lines[] = "Enrolment could not be deleted.";
                     } else {
                         //more accurate failure message
                         $lines[] = "User with {$user_descriptor} could not be unenrolled " . "from course with shortname \"{$record->instance}\".";
                     }
                     break;
             }
         }
         //create combined message, potentially containing role assignment and
         //enrolment components
         $msg = implode(' ', $lines) . ' ' . $message;
     }
     if (isset($record->context) && $record->context == "course") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 if (empty($record->context) || empty($record->idnumber)) {
                     $msg = "Course description could not be created. " . $message;
                 } else {
                     $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be created. " . $message;
                 }
                 break;
             case "update":
                 if (empty($record->context) || empty($record->idnumber)) {
                     $msg = "Course description could not be updated. " . $message;
                 } else {
                     $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 if (empty($record->context) || empty($record->idnumber)) {
                     $msg = "Course description could not be deleted. " . $message;
                 } else {
                     $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'Course could not be processed. ' . $message;
                 break;
         }
     }
     if ($type == "user") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 //make sure all required fields are specified
                 if (empty($record->username) && empty($record->email) && empty($record->idnumber)) {
                     $msg = "User could not be created. " . $message;
                 } else {
                     $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record);
                     $msg = "{$type} with {$user_descriptor} could not be created. " . $message;
                 }
                 break;
             case "update":
                 //make sure all required fields are specified
                 if (empty($record->username) && empty($record->email) && empty($record->idnumber)) {
                     $msg = "User could not be updated. " . $message;
                 } else {
                     $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record);
                     $msg = "{$type} with {$user_descriptor} could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 //make sure all required fields are specified
                 if (empty($record->username) && empty($record->email) && empty($record->idnumber)) {
                     $msg = "User could not be deleted. " . $message;
                 } else {
                     $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record);
                     $msg = "{$type} with {$user_descriptor} could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'User could not be processed. ' . $message;
                 break;
         }
     }
     if (isset($record->context) && $record->context == "track") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Track could not be created. " . $message;
                 } else {
                     $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be created. " . $message;
                 }
                 break;
             case "update":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Track could not be updated. " . $message;
                 } else {
                     $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Track could not be deleted. " . $message;
                 } else {
                     $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'Track could not be processed. ' . $message;
                 break;
         }
     }
     if (isset($record->context) && $record->context == "cluster") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 //make sure all required fields are specified
                 if (empty($record->name)) {
                     $msg = "User set could not be created. " . $message;
                 } else {
                     $msg = "User set with name \"{$record->name}\" could not be created. " . $message;
                 }
                 break;
             case "update":
                 //make sure all required fields are specified
                 if (empty($record->name)) {
                     $msg = "User set could not be updated. " . $message;
                 } else {
                     $msg = "User set with name \"{$record->name}\" could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 //make sure all required fields are specified
                 if (empty($record->name)) {
                     $msg = "User set could not be deleted. " . $message;
                 } else {
                     $msg = "User set with name \"{$record->name}\" could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'User set could not be processed. ' . $message;
                 break;
         }
     }
     if (isset($record->context) && $record->context == "curriculum") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Program could not be created. " . $message;
                 } else {
                     $msg = "Program with idnumber \"{$record->idnumber}\" could not be created. " . $message;
                 }
                 break;
             case "update":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Program could not be updated. " . $message;
                 } else {
                     $msg = "Program with idnumber \"{$record->idnumber}\" could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Program could not be deleted. " . $message;
                 } else {
                     $msg = "Program with idnumber \"{$record->idnumber}\" could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'Program could not be processed. ' . $message;
                 break;
         }
     }
     if (isset($record->context) && $record->context == "class") {
         $type = ucfirst($type);
         switch ($record->action) {
             case "create":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Class instance could not be created. " . $message;
                 } else {
                     $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be created. " . $message;
                 }
                 break;
             case "update":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Class instance could not be updated. " . $message;
                 } else {
                     $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be updated. " . $message;
                 }
                 break;
             case "delete":
                 //make sure all required fields are specified
                 if (empty($record->idnumber)) {
                     $msg = "Class instance could not be deleted. " . $message;
                 } else {
                     $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be deleted. " . $message;
                 }
                 break;
             default:
                 //invalid action
                 $msg = 'Class instance could not be processed. ' . $message;
                 break;
         }
     }
     return $msg;
 }