public int Get(string participantID) { int result; var phaseSets = _phaseSetsGetter.Get(participantID); var immediateResponsesCount = _testResponsesRepository.GetResponsesFromMostRecentSession(participantID, nameof(phaseSets.Immediate)).Count(); var immediateTestComplete = immediateResponsesCount == phaseSets.Immediate.Count(); if (immediateTestComplete) { var delayedResponsesCount = _testResponsesRepository.GetResponsesFromMostRecentSession(participantID, nameof(phaseSets.Delayed)).Count(); var delayedTestComplete = delayedResponsesCount == phaseSets.Delayed.Count(); if (delayedTestComplete) { var followupResponsesCount = _testResponsesRepository.GetResponsesFromMostRecentSession(participantID, nameof(phaseSets.Followup)).Count(); var followupTestComplete = followupResponsesCount == phaseSets.Followup.Count(); if (followupTestComplete) { result = phaseSets.Immediate.Count() + phaseSets.Delayed.Count() + phaseSets.Followup.Count(); } else { result = phaseSets.Immediate.Count() + phaseSets.Delayed.Count(); } } else { result = phaseSets.Immediate.Count(); } } else { result = 0; } return(result); }
public (DateTime Start, DateTime End) GetUtc(string participantID) { var phaseSets = _phaseSetsGetter.Get(participantID); var progress = _progressGetter.Get(participantID); var testName = _testNameGetter.Get(phaseSets, progress); var testStartDelays = new Dictionary <string, TimeSpan>() { { nameof(phaseSets.Delayed), new TimeSpan(_config.TestWaitDelayedDays, 0, 0, 0) }, { nameof(phaseSets.Followup), new TimeSpan(_config.TestWaitFollowupDays, 0, 0, 0) } }; var testStartDelay = testStartDelays.ContainsKey(testName) ? testStartDelays[testName] : default; bool testNameIsImmediate = string.Equals(testName, nameof(phaseSets.Immediate)); DateTime priorPhaseStartTimeUtc; if (testNameIsImmediate) { var encodingSessionMeta = _sessionMetaRepository.Get(participantID, "Encoding"); priorPhaseStartTimeUtc = encodingSessionMeta.FinishedWhenUtc.HasValue ? encodingSessionMeta.FinishedWhenUtc.Value : throw new Exception("Encoding's FinishedWhenUtc missing unexpectedly."); } else { var priorTestName = _testNameGetter.Get(phaseSets, progress - 1); var priorTestResponses = _testResponsesRepository.GetResponsesFromMostRecentSession(participantID, priorTestName); priorPhaseStartTimeUtc = priorTestResponses.Select(x => x.WhenUtc).Min(); } var middle = priorPhaseStartTimeUtc + testStartDelay; var result = (middle.AddMinutes(-_config.TestStartTimePlusMinusMinutes), middle.AddMinutes(_config.TestStartTimePlusMinusMinutes)); return(result); }