using System.Collections.Generic;
public static void Main()
var list = new List<OrderActivityState>
ActivityStateType = OrderActivityStateType.Started,
ModifiedDateTime = new DateTime(2019,09,17,15,15,05,473),
ActivityStateType = OrderActivityStateType.PartiallyReturned,
ModifiedDateTime = new DateTime(2019,09,17,16,02,50,543),
ActivityStateType = OrderActivityStateType.Started,
ModifiedDateTime = new DateTime(2019,09,18,15,28,24,530),
ActivityStateType = OrderActivityStateType.Paused,
ModifiedDateTime = new DateTime(2019,09,18,16,00,15,397),
ActivityStateType = OrderActivityStateType.Started,
ModifiedDateTime = new DateTime(2019,09,19,09,29,16,260),
ActivityStateType = OrderActivityStateType.Finished,
ModifiedDateTime = new DateTime(2019,09,19,09,57,56,807),
var lastExportedFinishedOrPartialReturnIndex = list.FindLastIndex(h => h.IsExported == true && (h.ActivityStateType == OrderActivityStateType.Finished || h.ActivityStateType == OrderActivityStateType.PartiallyReturned));
var lastNotExportedFinishOrPartialReturnIndex = list.FindLastIndex(h => h.IsExported == false && (h.ActivityStateType == OrderActivityStateType.Finished || h.ActivityStateType == OrderActivityStateType.PartiallyReturned));
Console.WriteLine("LastExportedIndex: " + lastExportedFinishedOrPartialReturnIndex);
Console.WriteLine("LastNotExported: "+lastNotExportedFinishOrPartialReturnIndex);
if (lastNotExportedFinishOrPartialReturnIndex == -1)
if (lastExportedFinishedOrPartialReturnIndex > -1 && lastExportedFinishedOrPartialReturnIndex + 1 < list.Count)
startIndex = lastExportedFinishedOrPartialReturnIndex +1;
Console.WriteLine("StartIndex: "+startIndex);
var range = lastNotExportedFinishOrPartialReturnIndex - lastExportedFinishedOrPartialReturnIndex;
Console.WriteLine("Range: " + range);
var test = OrderActivityStateHistoryExtension.GetTotalSpendTime(list.GetRange(startIndex,range), 0);
Console.WriteLine("Test: "+ RoundTimeString(test));
private static string RoundTimeString(TimeSpan input)
if (input <= TimeSpan.FromSeconds(59))
return string.Format("{0:00}{1:00}", 0, 1);
var minutes = input.Minutes;
var seconds = input.Seconds;
hours = hours + 24*input.Days;
return string.Format("{0:00}{1:00}", hours, minutes);
public class OrderActivityState
public long EmployeeId { get; set; }
public OrderActivityStateType ActivityStateType { get; set; }
public DateTime ModifiedDateTime { get; set; }
public decimal Quantity { get; set; }
public decimal RejectedQuantity { get; set; }
public int RejectedReasonId { get; set; }
public List<long> StorageLocationIds { get; set; }
public string EmployeeName { get; set; }
public string EmployeeLastName { get; set; }
public DateTime OriginalModifiedDateTime { get; set; }
public bool IsExported { get; set; }
public OrderActivityState()
StorageLocationIds = new List<long>();
public enum OrderActivityStateType
public static class OrderActivityStateHistoryExtension
public static TimeSpan GetTotalSpendTime(this List<OrderActivityState> states, int returnType)
var orderStates = states;
if (orderStates.Count == 0)
var acceptedQuantity = states.Where(s=>s.Quantity > 0).Sum(s => s.Quantity);
var rejectedQuantity = states.Where(s => s.RejectedQuantity > 0).Sum(s => s.RejectedQuantity);
var quantity = acceptedQuantity + rejectedQuantity;
var last = orderStates.LastOrDefault();
if (last != null && last.ActivityStateType == OrderActivityStateType.Started)
var current = new OrderActivityState();
current.ActivityStateType = OrderActivityStateType.Paused;
current.EmployeeId = last.EmployeeId;
current.EmployeeLastName = last.EmployeeLastName;
current.EmployeeName = last.EmployeeName;
current.ModifiedDateTime = DateTime.Now;
current.OriginalModifiedDateTime = DateTime.Now;
current.Quantity = last.Quantity;
current.StorageLocationIds = last.StorageLocationIds;
orderStates.Add(current);
for (int i = 1; i < orderStates.Count; i += 2)
Console.WriteLine(orderStates[i].ModifiedDateTime.Subtract(orderStates[i - 1].ModifiedDateTime));
totalTicks += orderStates[i].ModifiedDateTime.Subtract(orderStates[i - 1].ModifiedDateTime).Ticks;
return TimeSpan.FromTicks(totalTicks);