/**
  * @param Project $project
  * @param bool $languageOverlay
  * @return array
  */
 public function getProcessedSubmission(Project $project, $languageOverlay = FALSE)
 {
     $submissionContentArray = unserialize($project->getSubmissionContent());
     // we don't overlay the form here because we need to review the submission in english
     // todo overlay if needed
     $submissionFormDefinition = $this->formPersistenceManager->load($project->getSubmissionFormIdentifier());
     $submission = array();
     $submission['hasError'] = FALSE;
     $formSections = array();
     foreach ($submissionFormDefinition['renderables'] as $page) {
         // a form page
         foreach ($page['renderables'] as $section) {
             // a form section, containing the questions
             $formSections[$section['identifier']]['label'] = $section['label'];
             $formSections[$section['identifier']]['naAcceptanceLevel'] = $section['properties']['naAcceptanceLevel'];
             $notApplicableAnswerCount = 0;
             $questionCount = 0;
             $optOutAcceptedCount = 0;
             $weightingsSum = 0;
             $answeredQuestionCount = 0;
             foreach ($section['renderables'] as $field) {
                 if ($field['type'] === 'GIB.GradingTool:Question') {
                     // selected answer and their score
                     $questionCount++;
                     $formSections[$section['identifier']]['questions'][$field['identifier']]['label'] = $field['label'];
                     $formSections[$section['identifier']]['questions'][$field['identifier']]['weighting'] = $field['properties']['weighting'];
                     $weightingsSum = $weightingsSum + $field['properties']['weighting'];
                     $formSections[$section['identifier']]['questions'][$field['identifier']]['optOut'] = $field['properties']['optOut'];
                     if (isset($submissionContentArray[$field['identifier']])) {
                         $key = $submissionContentArray[$field['identifier']];
                         foreach ($field['properties']['options'] as $option) {
                             if ($option['_key'] == $key) {
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['identifier'] = $field['identifier'];
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['score'] = $option['score'];
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['key'] = $option['_key'];
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['value'] = $option['_value'];
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['bestPractiseText'] = (int) $option['score'] === 4 ? $field['properties']['abstract'] : NULL;
                                 $formSections[$section['identifier']]['questions'][$field['identifier']]['lowPerformanceText'] = (int) $option['score'] === 1 ? $field['properties']['abstract'] : NULL;
                                 if ($option['score'] == 0) {
                                     $notApplicableAnswerCount++;
                                     $formSections[$section['identifier']]['questions'][$field['identifier']]['score'] = 'N/A';
                                 }
                             }
                         }
                         $answeredQuestionCount++;
                     } else {
                         // if a question was not answered, the submission is invalid
                         $submission['hasError'] = TRUE;
                     }
                 } elseif ($field['type'] === 'GIB.GradingTool:NotApplicableMultiLineText') {
                     if (isset($submissionContentArray[$field['identifier']]) && !empty($submissionContentArray[$field['identifier']])) {
                         // comment for opt-out questions
                         $formSections[$section['identifier']]['questions'][$field['properties']['questionIdentifier']]['comment'] = $submissionContentArray[$field['identifier']];
                     }
                 } elseif ($field['type'] === 'GIB.GradingTool:OptOutAcceptedCheckbox') {
                     $formSections[$section['identifier']]['questions'][$field['properties']['questionIdentifier']]['optOutAcceptedFieldIdentifier'] = $field['identifier'];
                     if (isset($submissionContentArray[$field['identifier']])) {
                         // opt-out question was accepted (or not)
                         if ($submissionContentArray[$field['identifier']] == 1) {
                             $optOutAcceptedCount++;
                         }
                         $formSections[$section['identifier']]['questions'][$field['properties']['questionIdentifier']]['optOutAccepted'] = $submissionContentArray[$field['identifier']];
                     }
                 }
             }
             $formSections[$section['identifier']]['identifier'] = $section['identifier'];
             $formSections[$section['identifier']]['notApplicableAnswerCount'] = $notApplicableAnswerCount;
             $formSections[$section['identifier']]['questionCount'] = $questionCount;
             $formSections[$section['identifier']]['optOutAcceptedCount'] = $optOutAcceptedCount;
             $formSections[$section['identifier']]['weightingAverage'] = $weightingsSum / $questionCount;
             // how many questions must be answered based on the N/A acceptance level
             $formSections[$section['identifier']]['threshold'] = ceil($questionCount - $questionCount * $formSections[$section['identifier']]['naAcceptanceLevel']);
             $neededAnswerCount = $questionCount - $optOutAcceptedCount;
             $answeredQuestionCountAfterOptOut = $answeredQuestionCount - $notApplicableAnswerCount + $optOutAcceptedCount;
             $answeredQuestionRatio = $answeredQuestionCountAfterOptOut / $neededAnswerCount;
             // float: how many question were answered (accepted opt-out questions don't count)
             $formSections[$section['identifier']]['answeredQuestionRatio'] = $answeredQuestionRatio;
             // float: how many questions need to be answered
             $formSections[$section['identifier']]['thresholdRatio'] = 1 - $formSections[$section['identifier']]['naAcceptanceLevel'];
             // TRUE if the threshold was reached
             $formSections[$section['identifier']]['thresholdReached'] = $answeredQuestionRatio < 1 - $formSections[$section['identifier']]['naAcceptanceLevel'] ? FALSE : TRUE;
             if ($formSections[$section['identifier']]['thresholdReached']) {
                 $formSections[$section['identifier']]['weightedScore'] = $this->calculateScoreForSection($formSections[$section['identifier']]['questions']);
             } else {
                 $formSections[$section['identifier']]['weightedScore'] = FALSE;
                 $submission['hasError'] = TRUE;
             }
         }
     }
     $submission['sections'] = $formSections;
     $sectionCount = 0;
     $scoreSum = 0;
     foreach ($formSections as $section) {
         $sectionCount++;
         $scoreSum = $scoreSum + $section['weightedScore'];
     }
     $submission['mean'] = $scoreSum / $sectionCount;
     return $submission;
 }