// 2.
        private void MapReturnedDataDirectToEntity(ZkTimeDataEventArgs e)
        {
            var unprocessedDataEntityList = e.UserClockingData.Select(rawZkTimeDataObj => new ZkTimeClockingRecord
            {
                IsActive          = true,
                ClockingTime      = rawZkTimeDataObj.ClockingTime,
                ZkTimeBadgeNumber = rawZkTimeDataObj.StaffId,
                ZkTimeSiteNumber  = rawZkTimeDataObj.SiteId,
                ZkTimeSiteName    = rawZkTimeDataObj.SiteName,
                ZkTimeUserName    = rawZkTimeDataObj.StaffName,
                ShiftId           = rawZkTimeDataObj.ShiftId
            }).ToList();

            PersistUnprocessedZkTimeData(unprocessedDataEntityList);
        }
        public void Init(bool firstRun, DateTime mostRecentClockingTime)
        {
            if (!firstRun)
            {
                _firstRun = false;
            }

            var dataToImport = new List <ZkTimeDataToImportModel>();
            var maxDate      = DateTime.Now;

            if (!_firstRun)
            {
                if (DateTime.Equals(_lastClockingTimeValue, DateTime.MinValue))
                {
                    if (!DateTime.Equals(mostRecentClockingTime, DateTime.MinValue))
                    {
                        maxDate = mostRecentClockingTime;
                    }
                }
                else
                {
                    maxDate = _lastClockingTimeValue;
                }
            }
            else
            {
                maxDate = maxDate.AddMonths(_minusNMonths);
            }

            _firstRun = false;

            // clocking in/out terminal IDs as set in the ZKTimeDB
            //var machineNumbers = new List<int> { 12, 22, 32, 42, 62, 72, 73, 82 };
            var machineNumbers = new List <int> {
                72, 73, 82
            };                                                 // Baldock only

            var zkUserRecords   = _zktctx.GetTable <ZkUser>();
            var machineRecords  = _zktctx.GetTable <Machine>();
            var clockingRecords = _zktctx.GetTable <Clocking>();

            // leave to last possible line to get closest to now
            var minDate = DateTime.Now;

            try
            {
                var q =
                    from c in clockingRecords
                    join u in zkUserRecords on c.UserId equals u.UserId
                    join m in machineRecords on c.MachineNumber equals m.MachineNumber
                    where machineNumbers.Contains(m.MachineNumber) &&
                    c.ClockingTime > maxDate &&
                    c.ClockingTime <= minDate
                    select new ZkTimeDataToImportModel
                {
                    SiteId       = m.MachineNumber,
                    SiteName     = m.MachineAlias,
                    StaffId      = int.Parse(u.BadgeNumber),
                    StaffName    = u.Name,
                    ClockingTime = c.ClockingTime
                };

                dataToImport.AddRange(q);

                dataToImport = dataToImport.OrderBy(zkt => zkt.ClockingTime)
                               .ToList();

                _lastClockingTimeValue = dataToImport.Select(zkt => zkt.ClockingTime)
                                         .LastOrDefault();

                if (dataToImport.Count > 0)
                {
                    var dataToReturnForImport = new ZkTimeDataEventArgs
                    {
                        UserClockingData = dataToImport
                    };

                    ZkTimeDataReadyEvent(null, dataToReturnForImport);
                }
                else
                {
                    NoNewZkTimeDataEvent(null, null);
                }
            }
            catch (SqlException ex)
            {
                throw new NotImplementedException();
            }
            catch (Exception ex)
            {
                throw new NotImplementedException();
            }
        }