85         $score = json_decode($requestData);
    87         $userId = self::getUsrIdForObjectAndUsrIdent(
$objId, $score->userId);
    88         if ($userId == null) {
    90             throw new Exception(
'User not available', 404);
    95             !isset($score->userId) ||
    96             !isset($score->gradingProgress) ||
    97             !isset($score->activityProgress) ||
    98             !isset($score->timestamp) ||
    99             isset($score->timestamp) && !self::validate_iso8601_date($score->timestamp) ||
   100             (isset($score->scoreGiven) && !is_numeric($score->scoreGiven)) ||
   101             (isset($score->scoreGiven) && !isset($score->scoreMaximum)) ||
   102             (isset($score->scoreMaximum) && !is_numeric($score->scoreMaximum))
   106             throw new Exception(
'Incorrect score received', 400);
   110         if (!isset($score->scoreMaximum)) {
   111             $score->scoreMaximum = 1;
   113         if (isset($score->scoreGiven)) {
   114             if ($score->gradingProgress != 
'FullyGraded') {
   115                 $score->scoreGiven = null;
   118         $result = (float) $score->scoreGiven / (
float) $score->scoreMaximum;
   123         $ltiObjRes->readProperties(
$objId);
   125         if (!$ltiObjRes->isAvailable()) {
   126             throw new Exception(
'Tool for Object not available', 404);
   130         if ($result >= $ltiObjRes->getMasteryScore()) {
   135         $lp_percentage = (
int) round(100 * $result);
   138         if (empty($consRes)) {
   143         if (!isset($consRes->id)) {
   144             $consRes->id = $DIC->database()->nextId(
'lti_consumer_results');
   146         $DIC->database()->replace(
   147             'lti_consumer_results',
   149                 'id' => array(
'integer', $consRes->id)
   152                 'obj_id' => array(
'integer', 
$objId),
   153                 'usr_id' => array(
'integer', $userId),
   154                 'result' => array(
'float', $result)
   160         $ltiTimestamp = DateTimeImmutable::createFromFormat(DateTimeInterface::RFC3339_EXTENDED, $score->timestamp);
   161         if (!$ltiTimestamp) { 
   162             $ltiTimestamp = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, $score->timestamp);
   164         if (!$ltiTimestamp) { 
   165             $ltiTimestamp = 
new DateTime(
'now');
   168             'id' => array(
'integer', $DIC->database()->nextId(
'lti_consumer_grades')),
   169             'obj_id' => array(
'integer', 
$objId),
   170             'usr_id' => array(
'integer', $userId),
   171             'score_given' => array(
'float', $score->scoreGiven),
   172             'score_maximum' => array(
'float', $score->scoreMaximum),
   173             'activity_progress' => array(
'text', $score->activityProgress),
   174             'grading_progress' => array(
'text', $score->gradingProgress),
   175             'lti_timestamp' => array(
'timestamp',$ltiTimestamp->format(
"Y-m-d H:i:s")),
   176             'stored' => array(
'timestamp', date(
"Y-m-d H:i:s"))
   178         $DIC->database()->insert(
'lti_consumer_grades', $gradeValues);
 const LP_STATUS_COMPLETED_NUM
 
const LP_STATUS_IN_PROGRESS_NUM
 
static getByKeys(int $a_obj_id, int $a_usr_id, ?bool $a_create=false)
Get a result by object and user key. 
 
static writeStatus(int $a_obj_id, int $a_user_id, int $a_status, int $a_percentage=0, bool $a_force_per=false, ?int &$a_old_status=self::LP_STATUS_NOT_ATTEMPTED_NUM)
Write status for user and object.