public function stopTracking(PhabricatorUser $user, $phid, $timestamp, $note)
 {
     if (!PhrequentUserTimeQuery::isUserTrackingObject($user, $phid)) {
         // Don't do anything, it's not being tracked.
         return null;
     }
     $usertime_dao = new PhrequentUserTime();
     $conn = $usertime_dao->establishConnection('r');
     queryfx($conn, 'UPDATE %T usertime ' . 'SET usertime.dateEnded = %d, ' . 'usertime.note = %s ' . 'WHERE usertime.userPHID = %s ' . 'AND usertime.objectPHID = %s ' . 'AND usertime.dateEnded IS NULL ' . 'ORDER BY usertime.dateStarted, usertime.id DESC ' . 'LIMIT 1', $usertime_dao->getTableName(), $timestamp, $note, $user->getPHID(), $phid);
     return $phid;
 }
 public static function getUserTimeSpentOnObject(PhabricatorUser $user, $phid)
 {
     $usertime_dao = new PhrequentUserTime();
     $conn = $usertime_dao->establishConnection('r');
     // First calculate all the time spent where the
     // usertime blocks have ended.
     $sum_ended = queryfx_one($conn, 'SELECT SUM(usertime.dateEnded - usertime.dateStarted) N ' . 'FROM %T usertime ' . 'WHERE usertime.userPHID = %s ' . 'AND usertime.objectPHID = %s ' . 'AND usertime.dateEnded IS NOT NULL', $usertime_dao->getTableName(), $user->getPHID(), $phid);
     // Now calculate the time spent where the usertime
     // blocks have not yet ended.
     $sum_not_ended = queryfx_one($conn, 'SELECT SUM(UNIX_TIMESTAMP() - usertime.dateStarted) N ' . 'FROM %T usertime ' . 'WHERE usertime.userPHID = %s ' . 'AND usertime.objectPHID = %s ' . 'AND usertime.dateEnded IS NULL', $usertime_dao->getTableName(), $user->getPHID(), $phid);
     return $sum_ended['N'] + $sum_not_ended['N'];
 }