/**
  * Determine grouping status
  * @global  $ilObjDataCache
  * @param array $status
  * @param array $items
  * @param int $user_id
  * @param boolean $is_grouping
  * @return boolean
  */
 public static function determineGroupingStatus($status, $gr_info, $user_id, $is_grouping)
 {
     global $ilObjDataCache;
     $items = $gr_info['items'];
     if ($is_grouping) {
         $max_allowed_failed = count($items) - $gr_info['num_obligatory'];
         $required_completed = $gr_info['num_obligatory'];
     } else {
         $max_allowed_failed = 0;
         $required_completed = count($items);
     }
     // Required for grouping with a number of obligatory items
     $num_failed = 0;
     $num_completed = 0;
     foreach ($items as $item_id) {
         $item_id = $ilObjDataCache->lookupObjId($item_id);
         $gr_status = ilLPStatusWrapper::_determineStatus($item_id, $user_id);
         if ($gr_status == self::LP_STATUS_FAILED_NUM) {
             if (++$num_failed > $max_allowed_failed) {
                 $status['failed'] = true;
                 $status['completed'] = false;
                 return $status;
             }
         }
         if ($gr_status == self::LP_STATUS_COMPLETED_NUM) {
             if (++$num_completed >= $required_completed) {
                 return $status;
             }
         }
     }
     // Not completed since returned above
     $status['completed'] = false;
     return $status;
 }