public void CanAddAdjusted_Workdays_Success() { var ts = TimeSpan.FromHours(10); var dt = new DateTimeOffset(2020, 01, 02, 10, 0, 0, TimeSpan.Zero); var result = _timeProvider.Add(dt, ts); var expected = new DateTimeOffset(2020, 01, 03, 11, 0, 0, TimeSpan.Zero); Assert.That(result, Is.EqualTo(expected)); }
private async Task <DateTimeOffset> CalculateTimeToCompletion(InventoryItem item, DateTimeOffset eta) { if (item.Article.ProductionShopCategory == null) { return(eta); } var amountInStock = await _inventoryRepo.FindSpareInventoryAsync(item.Article); if (amountInStock == item.Amount) { return(eta); } var subItem = new InventoryItem(item.Article, item.Amount - amountInStock); var componentEta = _timeProvider.Add(subItem.EarliestProductionStartTime, item.TimeToProduce); //ToDo:3 check if CalculateTimeToCompletionAsync returns the max level as sum of all iterations //or only takes into account the longest timespan at second step return(item.Article.PrimaryBillOfMaterial.Input .Select(async i => await CalculateTimeToCompletion(i, componentEta)) .Max(t => t.Result)); }
/// <inheritdoc /> public async void SetStep(int step) { // don't set step if finalizing if (m_Finalizing) { return; } // buffer the previous step numbers int m_LastStep = m_CurrentStep; int m_LastDataStep = m_CurrentDataStep; // pause the time until we are done switching steps bool pauseState = m_TimeProvider.paused; m_TimeProvider.paused = true; // now advance/move back to the new step Action functor = null; int diff = 0; if (step > m_LastStep) { functor = AdvanceStep; diff = step - m_LastStep; } else if (step < m_LastStep) { functor = RetreatStep; diff = m_LastStep - step; } else { //restore state before attempt m_TimeProvider.paused = pauseState; return; } for (int i = 0; i < diff; ++i) { functor.Invoke(); } // record time for previous step float stepTime = (float)m_TimeProvider.elapsed.TotalSeconds; m_TimeTrackingRepo.currentTime.durationsPerStep[m_LastStep] = stepTime; m_Finalizing = true; // invoke step event m_EventBroker?.Invoke(new WorkflowStepEndedArgs() { lastStep = m_LastStep , lastDataStep = m_LastDataStep , newStep = m_CurrentStep , newDataStep = m_CurrentDataStep , executedRepetitions = m_CurrentRepetition }); try { await WaitForFinalizers(m_FinalizerTokenSource.Token); } catch (TaskCanceledException) { // Cancellation means we ended the workflow(quit), don't finalize m_Finalizing = false; return; } m_Finalizing = false; // stop workflow if we reached the end if (m_CurrentStep >= currentWorkflowData.numTotalSteps) { if (m_LastDataStep != -1) { m_DisposalService.Dispose(m_CurrentWorkflowData.steps[m_LastDataStep].id); } StopWork(); return; } // restore time for current step m_TimeProvider.Reset(false); float currentTime = m_TimeTrackingRepo.currentTime.durationsPerStep[m_CurrentStep]; m_TimeProvider.paused = false; m_TimeProvider.Add(TimeSpan.FromSeconds(currentTime)); LogStepTimings(); AciLog.Log("WorkflowManager", $"Workflow Step, {m_CurrentStep}"); AciLog.Log("WorkflowManager", $"Data Step: {m_CurrentDataStep}"); if (m_LastDataStep != -1) { m_DisposalService.Dispose(m_CurrentWorkflowData.steps[m_LastDataStep].id); } m_StepTriggerFactory.Create(m_CurrentWorkflowData.steps[currentDataStep]); // invoke step event m_EventBroker?.Invoke(new WorkflowStepFinalizedArgs() { lastStep = m_LastStep , lastDataStep = m_LastDataStep , newStep = m_CurrentStep , newDataStep = m_CurrentDataStep , executedRepetitions = m_CurrentRepetition }); }