--- grade_object.php	2008-11-24 14:18:20.000000000 -0500
+++ grade_object.php	2008-12-04 18:47:48.000000000 -0500
@@ -124,22 +124,77 @@
         error('Abstract method fetch_all() not overridden in '.get_class($this));
     }
 
-    /**
+    /**  Remote Learner JTM 12/4/2008 4:47:17 PM Avoid Dupication Error
      * Factory method - uses the parameters to retrieve matching instance from the DB.
      * @static final protected
      * @return mixed object instance or false if not found
      */
-    function fetch_helper($table, $classname, $params) {
-        if ($instances = grade_object::fetch_all_helper($table, $classname, $params)) {
-            if (count($instances) > 1) {
-                // we should not tolerate any errors here - problems might appear later
-                error('Found more than one record in fetch() !');
-            }
-            return reset($instances);
+     function fetch_helper($table, $classname, $params) {
+       global $CFG;
+     
+         if ($instances = grade_object::fetch_all_helper($table, $classname, $params)) {
+           if (count($instances) > 1) {
+                if(strcmp($table,'grade_items')==0 && strcmp($classname,'grade_item')==0)
+                {
+                   $itemType=$params['itemtype']; // grade_items.itemtype = mod
+                   $itemModule=$params['itemmodule']; // grade_items.itemmodule = assignment
+                   $courseid=$params['courseid']; // grade_items.courseid
+                   $itemInstance=$params['iteminstance']; // grade_items.iteminstance
+                   $numrecords = count($instances)-1;
+
+                   $sql = "SELECT * FROM {$CFG->prefix}grade_items ";
+                   $sql .="WHERE courseid=$courseid AND iteminstance=$itemInstance ";
+                   $sql .="HAVING itemtype='$itemType' AND itemmodule='$itemModule' ";
+                   $sql .="LIMIT $numrecords";
+
+                   $records = get_records_sql($sql);
+                    foreach ($records as $id => $record) // locate and delete duplicates
+                    {
+
+                       if(! delete_records('grade_items','id', $id))
+                          error('Found more than one record in fetch() - Could not delete duplicate record grade_items.id='. $id .' !');
+
+                    }
+
+                } elseif (strcmp($table,'grade_categories')==0 && strcmp($classname,'grade_category')==0){ // dupicate grade category item
+                      
+                      $courseid=$params['courseid']; // grade_categories.courseid
+                      $parent=$params['parent']; // grade_categories.parent
+                      $numrecords = count($instances)-1;
+
+                      $sql = "SELECT * FROM {$CFG->prefix}grade_categories ";
+                  
+                        if(empty($parent)){ // is parent field NULL ?
+                          $sql .="WHERE courseid=$courseid ";
+                        }else{
+                          $sql .="WHERE courseid=$courseid AND parent=$parent ";
+                        }
+
+                      $sql .="LIMIT $numrecords";
+
+                      $records = get_records_sql($sql);
+
+                      foreach ($records as $id => $record) // locate and delete duplicates (old categories)
+                      {
+
+                       if(! delete_records('grade_categories','id', $id))
+                          error('Found more than one record in fetch() - Could not delete duplicate record grade_categories.id='. $id .' !');
+
+                      }
+
+                }else{
+                   error('Found more than one record in fetch()! In table '. $table . ' classname '. $classname);
+                 }
+           }
+
+             return reset($instances);
         } else {
-            return false;
-        }
-    }
+
+        return false;
+       }
+
+     }
+
 
     /**
      * Factory method - uses the parameters to retrieve all matching instances from the DB.
