public OperationResult <int?> CalculateDelay(TrainInformation Train, ESTW Estw) { try { var Result = new OperationResult <int?>(); bool HasPreviousSchedule = false; int PreviousDelay = 0; var settingsResult = m_SettingsBll.GetSettings(); ValidateResult(settingsResult); var delayJustificationEnabled = settingsResult.Result.DelayJustificationEnabled; var delayJustificationMinutes = settingsResult.Result.DelayJustificationMinutes; foreach (var Schedule in Train.Schedules.OrderBy(s => s.LiveArrival)) { if (Schedule.LiveArrival == null) { continue; } var Arrival = Schedule.Schedule.Arrival == null ? Schedule.Schedule.Departure : Schedule.Schedule.Arrival; var DelayArrival = (Schedule.LiveArrival - Arrival).TotalMinutes; if (delayJustificationEnabled && HasPreviousSchedule && DelayArrival - PreviousDelay >= delayJustificationMinutes && !Schedule.Delays.Any(d => d.Type == eDelayType.Arrival)) { Schedule.AddDelay(DelayArrival - PreviousDelay, eDelayType.Arrival); } PreviousDelay = DelayArrival < 0 ? 0 : DelayArrival; if (Schedule.Schedule.Departure != null) { if (Schedule.LiveDeparture != null) { var DelayDeparture = (Schedule.LiveDeparture - Schedule.Schedule.Departure).TotalMinutes; if (delayJustificationEnabled && DelayDeparture - PreviousDelay >= delayJustificationMinutes && !Schedule.Delays.Any(d => d.Type == eDelayType.Departure)) { Schedule.AddDelay(DelayDeparture - PreviousDelay, eDelayType.Departure); } PreviousDelay = DelayDeparture < 0 ? 0 : DelayDeparture; Result.Result = DelayDeparture; } else { var Delay = (Estw.Time - Schedule.Schedule.Departure).TotalMinutes; Result.Result = Delay < DelayArrival ? DelayArrival : Delay; } } else { Result.Result = DelayArrival; } HasPreviousSchedule = true; } Result.Succeeded = true; return(Result); } catch (Exception ex) { return(new OperationResult <int?> { Message = ex.Message }); } }