Example #1
0
        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)));
        }