public void ChangeScanTime(ScanInfo scanInfo, ScanTimeType scanTimeType) { var newTime = scanInfo.ScanTimestamp; Func <CheckpointScan, bool> match = r => r.PersonId.Equals(scanInfo.PersonId, StringComparison.OrdinalIgnoreCase); var readingIn = this.State.ReadingsIn.FirstOrDefault(match); var readingOut = this.State.ReadingsOut.FirstOrDefault(match); switch (scanTimeType) { case ScanTimeType.In: if (readingIn == null) { Trace.TraceWarning("Scan to change time not found (in)."); return; } if (readingOut != null && readingOut.TimeStamp < newTime) { this.Apply(new AttendeeScanOutPreceedsScanIn(scanInfo)); return; } this.Apply(new AttendeeScanInTimeChanged(scanInfo, newTime)); break; case ScanTimeType.Out: if (readingOut == null) { Trace.TraceWarning("Scan to change time not found (out)."); return; } if (readingIn != null && readingIn.TimeStamp > newTime) { this.Apply(new AttendeeScanOutPreceedsScanIn(scanInfo)); return; } this.Apply(new AttendeeScanOutTimeChanged(scanInfo, newTime)); break; case ScanTimeType.Passthrough: if (this.State.CheckpointType == CheckpointType.Passthrough) { if (readingIn == null) { Trace.TraceWarning("Scan to change time not found (passthrough)."); return; } this.Apply(new AttendeePassthroughScanTimeChanged(scanInfo, newTime)); } break; default: throw new ArgumentOutOfRangeException("scanTimeType"); } }
private Task ExecuteScanTimeChange(ChangeScanTimeCommandBase c, ScanTimeType timeType) { var scanInfo = new ScanInfo( c.HappeningId, c.CheckpointId, c.PersonId, c.Id, c.Timestamp, c.NewTime, c.Context.User); return(this.checkpointRepository.Execute( c.CheckpointId, checkpoint => checkpoint.ChangeScanTime(scanInfo, timeType))); }