private void ExtractTermBasal(ICollection <DataRow> rows)
        {
            var exceptions = new ConcurrentQueue <Exception>();

            Parallel.ForEach(rows, (row) => {
                try
                {
                    Guid keyId  = MemoryMappings.GetReadingHeaderKeyId(row["DOWNLOADKEYID"].ToString());
                    Guid userId = MemoryMappings.GetUserIdFromPatientInfo(MigrationVariables.CurrentSiteId, row["PATIENTKEYID"].ToString());

                    if (!keyId.Equals(Guid.Empty))
                    {
                        var bd = new BasalDelivery();
                        var dd = new BasalDeliveryData();

                        dd.Name  = "TERM_BASAL";
                        dd.Value = (row["READINGNOTE"] is DBNull) ? String.Empty : row["READINGNOTE"].ToString();
                        dd.Date  = (row["READINGDATETIME"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["READINGDATETIME"].ToString());

                        bd.ReadingKeyId    = keyId;
                        bd.UserId          = userId;
                        bd.StartDateTime   = (row["READINGDATETIME"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["READINGDATETIME"].ToString());
                        bd.AmountDelivered = 0;
                        bd.DeliveryRate    = 0;
                        bd.Duration        = String.Empty;
                        bd.IsTemp          = false;
                        bd.BasalDeliveryDatas.Add(dd);

                        BasalDeliveries.Add(bd);
                    }
                    else
                    {
                        var primeKey = $"{row["DOWNLOADKEYID"].ToString()}-{row["SEQ"].ToString()}";
                        MappingStatistics.LogFailedMapping("METERREADING", primeKey, "BASALDELIVERY", typeof(BasalDelivery), String.Empty, "Failed to map TERM_BASAL reading, unable to parse key id.");
                    }
                }
                catch (Exception e)
                {
                    exceptions.Enqueue(e);
                }
            });

            if (exceptions.Count > 0)
            {
                throw new AggregateException(exceptions);
            }
        }
        private void ExtractBasal(ICollection <DataRow> rows)
        {
            var exceptions = new ConcurrentQueue <Exception>();

            Parallel.ForEach(rows, (row) => {
                try
                {
                    Guid keyId  = MemoryMappings.GetReadingHeaderKeyId(row["DOWNLOADKEYID"].ToString());
                    Guid userId = MemoryMappings.GetUserIdFromPatientInfo(MigrationVariables.CurrentSiteId, row["PATIENTKEYID"].ToString());

                    if (!keyId.Equals(Guid.Empty))
                    {
                        var value = (row["CLINIPROVALUE"] is DBNull) ? String.Empty : row["CLINIPROVALUE"].ToString();

                        bool ptGood = Double.TryParse(value, out double rate);

                        var bd = new BasalDelivery();

                        bd.ReadingKeyId    = keyId;
                        bd.UserId          = userId;
                        bd.StartDateTime   = (row["READINGDATETIME"] is DBNull) ? new DateTime(1800, 1, 1) : mu.ParseFirebirdDateTime(row["READINGDATETIME"].ToString());
                        bd.AmountDelivered = 0; // 0 means you must group times and multiple by rate programmaically
                        bd.DeliveryRate    = rate;
                        bd.Duration        = String.Empty;
                        bd.IsTemp          = false;

                        BasalDeliveries.Add(bd);
                    }
                    else
                    {
                        var primeKey = $"{row["DOWNLOADKEYID"].ToString()}-{row["SEQ"].ToString()}";
                        MappingStatistics.LogFailedMapping("METERREADING", primeKey, "BASALDELIVERY", typeof(BasalDelivery), String.Empty, "Failed to map BASAL reading, unable to parse key id.");
                    }
                }
                catch (Exception e)
                {
                    exceptions.Enqueue(e);
                }
            });

            if (exceptions.Count > 0)
            {
                throw new AggregateException(exceptions);
            }
        }