public void CreateDeviceMeterReadingHeaderMapping()
        {
            try
            {
                var dataSet = TableAgent.DataSet.Tables[FbTableName].Rows;
                RecordCount = TableAgent.RowCount;

                foreach (DataRow row in dataSet)
                {
                    // get userid from old aspnetdb matching on patientid #####.#####
                    var patId  = row["PATIENTKEYID"].ToString();
                    var userId = MemoryMappings.GetUserIdFromPatientInfo(MigrationVariables.CurrentSiteId, patId);

                    if (!mHelper.HasPatientMigrated(patId))
                    {
                        if (userId != Guid.Empty)
                        {
                            var dmData    = MemoryMappings.GetAllDiabetesManagementData().Where(w => w.UserId == userId).FirstOrDefault();
                            var meterName = (row["METERNAME"] is DBNull) ? String.Empty : row["METERNAME"].ToString();

                            var dev = new PatientDevice
                            {
                                UserId          = userId,
                                MeterIndex      = (row["NUMEDICSMETERINDEX"] is DBNull) ? 0 : (Int32)row["NUMEDICSMETERINDEX"],
                                Manufacturer    = (row["MANUFACTURER"] is DBNull) ? String.Empty : row["MANUFACTURER"].ToString(),
                                DeviceModel     = (row["METERMODEL"] is DBNull) ? String.Empty : row["METERMODEL"].ToString(),
                                DeviceName      = meterName,
                                SerialNumber    = (row["SERIALNUMBER"] is DBNull) ? string.Empty : row["SERIALNUMBER"].ToString(),
                                SoftwareVersion = (row["SOFTWAREVERSION"] is DBNull) ? String.Empty : row["SOFTWAREVERSION"].ToString(),
                                HardwareVersion = (row["HARDWAREVERSION"] is DBNull) ? String.Empty : row["HARDWAREVERSION"].ToString()
                            };

                            if (dmData != null)
                            {
                                dev.DiabetesManagementData = dmData;
                            }

                            var mrh = new ReadingHeader
                            {
                                ReadingKeyId        = Guid.NewGuid(),
                                UserId              = userId,
                                LegacyDownloadKeyId = (row["DOWNLOADKEYID"] is DBNull) ? String.Empty : row["DOWNLOADKEYID"].ToString(),
                                ServerDateTime      = (row["SERVERDATETIME"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["SERVERDATETIME"].ToString()),
                                MeterDateTime       = (row["METERDATETIME"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["METERDATETIME"].ToString()),
                                Readings            = (row["READINGS"] is DBNull) ? 0 : (Int32)row["READINGS"],
                                SiteSource          = (row["SOURCE"] is DBNull) ? String.Empty : row["SOURCE"].ToString(),
                                ReviewedOn          = (row["REVIEWEDON"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["REVIEWEDON"].ToString()),
                            };

                            if (meterName.ToLower().Contains("omnipod"))
                            {
                                var ePump = MemoryMappings.GetAllPump().Where(w => w.UserId == userId).FirstOrDefault();

                                if (ePump != null)
                                {
                                    mrh.Pump           = new Pump();
                                    mrh.Pump.PumpKeyId = mrh.ReadingKeyId;

                                    if (ePump.PumpPrograms != null)
                                    {
                                        mrh.Pump.PumpPrograms = new List <PumpProgram>();
                                        Array.ForEach(ePump.PumpPrograms.ToArray(), p =>
                                        {
                                            var prog = new PumpProgram
                                            {
                                                CreationDate  = p.CreationDate,
                                                NumOfSegments = p.NumOfSegments,
                                                ProgramKey    = p.ProgramKey,
                                                ProgramName   = p.ProgramName,
                                                Source        = p.Source,
                                                Valid         = p.Valid,
                                                PumpKeyId     = mrh.Pump.PumpKeyId,
                                                IsEnabled     = p.IsEnabled,
                                                ProgramTypeId = p.ProgramTypeId
                                            };

                                            if (p.ProgramTimeSlots != null && p.ProgramTimeSlots.Count != 0)
                                            {
                                                Array.ForEach(p.ProgramTimeSlots.ToArray(), a =>
                                                {
                                                    prog.ProgramTimeSlots.Add(a);
                                                });
                                            }

                                            CompletedPumpProgramMappings.Add(prog);

                                            //if (p.BolusProgramTimeSlots != null && p.BolusProgramTimeSlots.Count != 0)
                                            //{
                                            //    Array.ForEach(p.BolusProgramTimeSlots.ToArray(), r =>
                                            //    {
                                            //        prog.BolusProgramTimeSlots.Add(r);
                                            //    });
                                            //}
                                        });
                                    }

                                    if (ePump.PumpSettings != null)
                                    {
                                        mrh.Pump.PumpSettings = new List <PumpSetting>();
                                        Array.ForEach(ePump.PumpSettings.ToArray(), s =>
                                        {
                                            var ps = new PumpSetting
                                            {
                                                Date         = s.Date,
                                                Description  = s.Description,
                                                SettingName  = s.SettingName,
                                                SettingValue = s.SettingValue,
                                                PumpKeyId    = mrh.Pump.PumpKeyId
                                            };

                                            CompletedPumpSettingMappings.Add(ps);
                                        });
                                    }

                                    mrh.Pump.ActiveProgramId = ePump.ActiveProgramId;
                                    mrh.Pump.Cannula         = ePump.Cannula;
                                    mrh.Pump.Notes           = ePump.Notes;
                                    mrh.Pump.PumpInfusionSet = ePump.PumpInfusionSet;
                                    mrh.Pump.PumpName        = ePump.PumpName;
                                    mrh.Pump.PumpStartDate   = ePump.PumpStartDate;
                                    mrh.Pump.PumpType        = ePump.PumpType;
                                    mrh.Pump.ReplacementDate = ePump.ReplacementDate;
                                    mrh.Pump.UserId          = ePump.UserId;
                                }
                            }

                            bool alreadyMapped = false;

                            if (CompletedMappings.Any(a => a.SerialNumber == dev.SerialNumber))
                            {
                                alreadyMapped = true;

                                var device = CompletedMappings.Where(w => w.SerialNumber == dev.SerialNumber).FirstOrDefault();
                                device.ReadingHeaders.Add(mrh);
                            }
                            else
                            {
                                dev.ReadingHeaders.Add(mrh);
                            }

                            if (CanAddToContext(dev.UserId, dev.SerialNumber) && !alreadyMapped)
                            {
                                if (!CompletedMappings.Any(a => a.SerialNumber == dev.SerialNumber))
                                {
                                    CompletedMappings.Add(dev);
                                }

                                MemoryMappings.AddReadingHeaderkeyId(mrh.LegacyDownloadKeyId.Trim(), mrh.ReadingKeyId);
                            }
                            else
                            {
                                if (alreadyMapped && !String.IsNullOrEmpty(dev.SerialNumber))
                                {
                                    MemoryMappings.AddReadingHeaderkeyId(mrh.LegacyDownloadKeyId.Trim(), mrh.ReadingKeyId);
                                }

                                var fr = (dev.UserId == Guid.Empty) ? "Device has no corresponding user." : (String.IsNullOrEmpty(dev.SerialNumber)) ? "Device has no serial number recorded." : "Device already assigned to user.";

                                MappingStatistics.LogFailedMapping("METERREADERHEADER", row["DOWNLOADKEYID"].ToString(), "PatientDevices", typeof(PatientDevice), JsonConvert.SerializeObject(dev), fr);
                                FailedCount++;
                            }
                        }
                    }
                }

                MappingStatistics.LogMappingStat("METERREADINGHEADER", RecordCount, "PatientDevices", CompletedMappings.Count, FailedCount);
            }
            catch (Exception e)
            {
                throw new Exception("Error creating Patient Device (MeterReadingHeader) mapping.", e);
            }
        }
        public void CreatePumpSettingMapping()
        {
            try
            {
                var dataSet = TableAgent.DataSet.Tables[FbTableName].Rows;
                RecordCount = TableAgent.RowCount;
                var dateSetter = DateTime.Now;

                foreach (DataRow row in dataSet)
                {
                    // get userid from old aspnetdb matching on patientid #####.#####
                    var patId  = row["PATIENTID"].ToString();
                    var userId = MemoryMappings.GetUserIdFromPatientInfo(MigrationVariables.CurrentSiteId, patId);

                    var icDict = new Dictionary <char, ProgramTimeSlot> {
                        { '1', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '2', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '3', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '4', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '5', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '6', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '7', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '8', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } }
                    };

                    var bgDict = new Dictionary <char, ProgramTimeSlot> {
                        { '1', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '2', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '3', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '4', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '5', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '6', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '7', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '8', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } }
                    };

                    var bcDict = new Dictionary <char, ProgramTimeSlot> {
                        { '1', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '2', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '3', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '4', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '5', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '6', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '7', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '8', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } }
                    };

                    var cfDict = new Dictionary <char, ProgramTimeSlot> {
                        { '1', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '2', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '3', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '4', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '5', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '6', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '7', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } },
                        { '8', new ProgramTimeSlot {
                              DateSet = dateSetter
                          } }
                    };

                    PumpProgram icProgram = DefaultPumpProgram();
                    PumpProgram bgProgram = DefaultPumpProgram();
                    PumpProgram bcProgram = DefaultPumpProgram();
                    PumpProgram cfProgram = DefaultPumpProgram();

                    icProgram.ProgramName = "PROG_IC";
                    bgProgram.ProgramName = "PROG_BG";
                    bcProgram.ProgramName = "PROG_BGC";
                    cfProgram.ProgramName = "PROG_CF";

                    icProgram.ProgramTypeId = 4;
                    bgProgram.ProgramTypeId = 5;
                    bcProgram.ProgramTypeId = 7;
                    cfProgram.ProgramTypeId = 3;

                    icProgram.ProgramTimeSlots = new List <ProgramTimeSlot>();
                    bgProgram.ProgramTimeSlots = new List <ProgramTimeSlot>();
                    bcProgram.ProgramTimeSlots = new List <ProgramTimeSlot>();
                    cfProgram.ProgramTimeSlots = new List <ProgramTimeSlot>();

                    if (!mHelper.HasPatientMigrated(patId))
                    {
                        if (userId != Guid.Empty)
                        {
                            var tempList = new List <PumpSetting>();

                            // iterate through table columns and only get columns that are NOT time slots
                            // as these will be settings
                            for (int i = 0; i < row.Table.Columns.Count; i++)
                            {
                                var column = row.Table.Columns[i].ColumnName.Trim();
                                // don't want columns that start with these characters - these are timeslot values which are handled in the 'else' statement
                                var exclude = new List <bool> {
                                    column.StartsWith("ic", StringComparison.OrdinalIgnoreCase),
                                    column.StartsWith("cf", StringComparison.OrdinalIgnoreCase),
                                    column.StartsWith("target", StringComparison.OrdinalIgnoreCase),
                                    column.StartsWith("patientid", StringComparison.OrdinalIgnoreCase)
                                };

                                if (exclude.All(a => !a))
                                {
                                    PumpSetting ps = new PumpSetting();
                                    ps.SettingName  = column;
                                    ps.SettingValue = (row[column] is DBNull) ? String.Empty : row[column].ToString();
                                    ps.Date         = new DateTime(1800, 1, 1);

                                    tempList.Add(ps);

                                    if (CanAddToContext(ps.SettingValue))
                                    {
                                        CompletedMappings.Add(ps);
                                    }
                                    else
                                    {
                                        MappingStatistics.LogFailedMapping("INSULETPUMPSETTINGS", patId, "PumpSettings", typeof(PumpSetting), JsonConvert.SerializeObject(ps), "Pump Setting has no value.");
                                        FailedCount++;
                                    }
                                }
                                else
                                {
                                    if (!(row[column] is DBNull))
                                    {
                                        if (column.StartsWith("cf", StringComparison.OrdinalIgnoreCase) && cfDict.ContainsKey(column.Last()))
                                        {
                                            var cfd = cfDict[column.Last()];
                                            if (column.StartsWith("cfstart", StringComparison.OrdinalIgnoreCase))
                                            {
                                                cfd.StartTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("cfstop", StringComparison.OrdinalIgnoreCase))
                                            {
                                                cfd.StopTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("cfvalue", StringComparison.OrdinalIgnoreCase))
                                            {
                                                cfd.Value = mu.ParseDouble(row[column].ToString());
                                            }
                                        }

                                        if (column.StartsWith("ic", StringComparison.OrdinalIgnoreCase) && icDict.ContainsKey(column.Last()))
                                        {
                                            var icd = icDict[column.Last()];
                                            if (column.StartsWith("icstart", StringComparison.OrdinalIgnoreCase))
                                            {
                                                icd.StartTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("icstop", StringComparison.OrdinalIgnoreCase))
                                            {
                                                icd.StopTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("icvalue", StringComparison.OrdinalIgnoreCase))
                                            {
                                                icd.Value = mu.ParseDouble(row[column].ToString());
                                            }
                                        }

                                        if (column.StartsWith("target", StringComparison.OrdinalIgnoreCase) && bgDict.ContainsKey(column.Last()) && bcDict.ContainsKey(column.Last()))
                                        {
                                            var bgd = bgDict[column.Last()];
                                            var bcd = bcDict[column.Last()];

                                            if (column.StartsWith("targetbgstart", StringComparison.OrdinalIgnoreCase))
                                            {
                                                bgd.StartTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                                bcd.StartTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("targetbgstop", StringComparison.OrdinalIgnoreCase))
                                            {
                                                bgd.StopTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                                bcd.StopTime = mu.ParseFirebirdTimespan(row[column].ToString());
                                            }

                                            if (column.StartsWith("targetbg", StringComparison.OrdinalIgnoreCase))
                                            {
                                                bgd.Value = mu.ParseDouble(row[column].ToString());
                                            }

                                            if (column.StartsWith("targetbgcorrect", StringComparison.OrdinalIgnoreCase))
                                            {
                                                bcd.Value = mu.ParseDouble(row[column].ToString());
                                            }
                                        }
                                    }
                                }
                            }

                            // add to Memory Mappings so that Pump object and retieve
                            // a single user should only have a single collections of PumpSettings in the FB database
                            MemoryMappings.AddPumpSetting(userId, tempList);
                        }
                    }

                    //Purge dictionaries
                    PurgeDictionary(icDict);
                    PurgeDictionary(bgDict);
                    PurgeDictionary(bcDict);
                    PurgeDictionary(cfDict);

                    // add dictionary values (ProgramTimeSlots)
                    var icCollection = AddTimeSlots(icProgram.ProgramTimeSlots.ToList(), icDict.Values);
                    foreach (var item in icCollection)
                    {
                        icProgram.ProgramTimeSlots.Add(item);
                    }

                    var bgCollection = AddTimeSlots(bgProgram.ProgramTimeSlots.ToList(), bgDict.Values);
                    foreach (var item in bgCollection)
                    {
                        bgProgram.ProgramTimeSlots.Add(item);
                    }

                    var bcCollection = AddTimeSlots(bcProgram.ProgramTimeSlots.ToList(), bcDict.Values);
                    foreach (var item in bcCollection)
                    {
                        bcProgram.ProgramTimeSlots.Add(item);
                    }

                    var cfCollection = AddTimeSlots(cfProgram.ProgramTimeSlots.ToList(), cfDict.Values);
                    foreach (var item in cfCollection)
                    {
                        cfProgram.ProgramTimeSlots.Add(item);
                    }

                    // add pump programs to memory mappings
                    AddPumpProgram(userId, icProgram);
                    AddPumpProgram(userId, bgProgram);
                    AddPumpProgram(userId, bcProgram);
                    AddPumpProgram(userId, cfProgram);
                }

                MappingStatistics.LogMappingStat("INSULETPUMPSETTINGS", RecordCount, "PumpSettings", CompletedMappings.Count, FailedCount);
            }
            catch (Exception e)
            {
                throw new Exception("Error creating PumpSetting mapping.", e);
            }
        }