public VisitCost CreateEnity(VisitOccurrence visit, IDataRecord reader, KeyMasterOffset keyOffset)
        {
            var paidCopay            = reader.GetDecimal(PaidCopay);
            var paidCoinsurance      = reader.GetDecimal(PaidCoinsurance);
            var paidTowardDeductible = reader.GetDecimal(PaidTowardDeductible);


            decimal?totalOutOfPocket = null;

            if (paidCopay.HasValue && paidCoinsurance.HasValue && paidTowardDeductible.HasValue)
            {
                totalOutOfPocket = paidCopay + paidCoinsurance + paidTowardDeductible;
            }
            else if (paidCoinsurance.HasValue && paidTowardDeductible.HasValue)
            {
                totalOutOfPocket = paidCoinsurance + paidTowardDeductible;
            }

            return(new VisitCost(visit)
            {
                VisitCostId = keyOffset.VisitCostId,
                PaidCopay = paidCopay,
                PaidCoinsurance = paidCoinsurance,
                PaidTowardDeductible = paidTowardDeductible,
                PaidByPayer = reader.GetDecimal(PaidByPayer),
                PaidByCoordinationBenefits = reader.GetDecimal(PaidByCoordinationBenefits),
                TotalPaid = reader.GetDecimal(TotalPaid),
                TotalOutOfPocket = totalOutOfPocket,
                CurrencyConceptId = reader.GetLong(CurrencyConceptId) ?? 0
            });
        }
Exemple #2
0
        public string GetPersonIdFieldName()
        {
            if (Persons != null && Persons.Any())
            {
                return(Persons[0].PersonId);
            }

            if (PayerPlanPeriods != null && PayerPlanPeriods.Any())
            {
                return(PayerPlanPeriods[0].PersonId);
            }

            if (ConditionOccurrence != null && ConditionOccurrence.Any())
            {
                return(ConditionOccurrence[0].PersonId);
            }

            if (Death != null && Death.Any())
            {
                return(Death[0].PersonId);
            }

            if (DrugExposure != null && DrugExposure.Any())
            {
                return(DrugExposure[0].PersonId);
            }

            if (ProcedureOccurrence != null && ProcedureOccurrence.Any())
            {
                return(ProcedureOccurrence[0].PersonId);
            }

            if (Observation != null && Observation.Any())
            {
                return(Observation[0].PersonId);
            }

            if (Measurement != null && Measurement.Any())
            {
                return(Measurement[0].PersonId);
            }

            if (VisitOccurrence != null && VisitOccurrence.Any())
            {
                return(VisitOccurrence[0].PersonId);
            }

            if (Cohort != null && Cohort.Any())
            {
                return(Cohort[0].PersonId);
            }

            if (DeviceExposure != null && DeviceExposure.Any())
            {
                return(DeviceExposure[0].PersonId);
            }

            throw new Exception("Cant find PersonId FieldName " + this.FileName);
        }
        private void AddChildData(VisitOccurrence parent, VisitCost child)
        {
            if (child.PaidCopay == 0 && child.PaidCoinsurance == 0 && child.PaidTowardDeductible == 0 &&
                child.PaidByPayer == 0 && child.TotalPaid == 0)
            {
                return;
            }

            _personBuilders[parent.PersonId].Value.AddChildData(parent, child);
        }
Exemple #4
0
 private void AddRawVisitOccurrence(VisitOccurrence rawVisit, VisitOccurrence finalVisit)
 {
     if (!_rawVisits.ContainsKey(rawVisit.SourceRecordGuid))
     {
         _rawVisits.Add(rawVisit.SourceRecordGuid, finalVisit);
     }
     else
     {
         _rawVisits[rawVisit.SourceRecordGuid] = finalVisit;
     }
 }
Exemple #5
0
        /// <summary>
        /// override the visit's start/end date for visit entities that out of current obervation period
        /// using the start/end date of the corresponding obervation period.
        /// </summary>
        /// <param name="visitOccurrence">the visit occurrence entities for current person</param>
        /// <param name="observationPeriods">the observation period entities for current person</param>
        /// <returns>Enumeration of adjusted visit occurrence entities</returns>
        private static VisitOccurrence AdjustVisitDates(VisitOccurrence visitOccurrence, ObservationPeriod[] observationPeriods)
        {
            if (visitOccurrence.StartDate < observationPeriods[0].StartDate)
            {
                visitOccurrence.StartDate = observationPeriods[0].StartDate;
            }

            if (visitOccurrence.EndDate > observationPeriods[0].EndDate)
            {
                visitOccurrence.EndDate = observationPeriods[0].EndDate;
            }

            return(visitOccurrence);
        }
Exemple #6
0
        public override IEnumerable <IEntity> GetConcepts(Concept concept, IDataRecord reader, KeyMasterOffset keyOffset)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyOffset).ToList();

            if (visitOccurrences.Count > 0)
            {
                var id = reader.GetLong(Id);

                string startTime = null;
                string endTime   = null;

                if (!string.IsNullOrEmpty(StartTime))
                {
                    DateTime dt;
                    if (DateTime.TryParse(reader.GetString(StartTime), out dt))
                    {
                        startTime = dt.ToString("HH:mm:ss", CultureInfo.InvariantCulture);
                    }
                }

                if (!string.IsNullOrEmpty(EndTime))
                {
                    DateTime dt;
                    if (DateTime.TryParse(reader.GetString(EndTime), out dt))
                    {
                        endTime = dt.ToString("HH:mm:ss", CultureInfo.InvariantCulture);
                    }
                }

                var visitOccurrence = new VisitOccurrence((Entity)visitOccurrences[0])
                {
                    CareSiteId = reader.GetInt(CareSiteId) ?? 0,
                    StartTime  = startTime,
                    EndTime    = endTime
                };
                if (id.HasValue)
                {
                    visitOccurrence.Id = id.Value;
                }
                else
                {
                    visitOccurrence.IdUndefined = true;
                }

                yield return(visitOccurrence);
            }
        }
        private string GetProviderKey(VisitOccurrence visitOccurrence, IEntity entity,
                                      Dictionary <DateTime, Dictionary <string, List <IEntity> > >
                                      dateClaimTypeDictionary)
        {
            var claimType = visitOccurrence.SourceValue;

            if (!dateClaimTypeDictionary[entity.StartDate].ContainsKey(claimType))
            {
                claimType = entity.AdditionalFields["claim_type"];
            }

            if (claimType.ToUpper() == "OP")
            {
                return(dateClaimTypeDictionary[entity.StartDate][claimType]
                       .Where(c => c.VisitOccurrenceId == entity.VisitOccurrenceId)
                       .OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
                       .ThenBy(c => c.AdditionalFields["prov"])
                       .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
                       .ThenBy(c => c.AdditionalFields["provcat"])
                       .First().ProviderKey);
            }

            if (claimType.ToUpper() == "ER")
            {
                var prov =
                    dateClaimTypeDictionary[entity.StartDate][claimType].Where(c => c.VisitOccurrenceId == entity.VisitOccurrenceId)
                    .OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
                    .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
                    .ThenBy(c => c.AdditionalFields["prov"])
                    .ThenBy(c => c.AdditionalFields["provcat"])
                    .FirstOrDefault();

                if (prov != null)
                {
                    return(prov.ProviderKey);
                }
            }

            return(entity.ProviderKey =
                       dateClaimTypeDictionary[entity.StartDate][claimType].OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
                       .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
                       .ThenBy(c => c.AdditionalFields["prov"])
                       .ThenBy(c => c.AdditionalFields["provcat"])
                       .First().ProviderKey);
        }
Exemple #8
0
        private static void SetDate(IEntity e, VisitOccurrence visitOccurrence, string value)
        {
            int servDay;

            int.TryParse(value, out servDay);

            if (servDay == 0 || servDay == 1)
            {
                e.StartDate = visitOccurrence.StartDate;
            }
            else if (servDay != 1 && visitOccurrence.StartDate.AddDays(servDay - 1) < visitOccurrence.EndDate)
            {
                e.StartDate = visitOccurrence.StartDate.AddDays(servDay - 1);
            }
            else
            {
                e.StartDate = visitOccurrence.EndDate.Value;
            }
        }
Exemple #9
0
        public VisitCost CreateEnity(VisitOccurrence visit, IDataRecord reader, KeyMasterOffset keyOffset)
        {
            var paidCopay            = reader.GetDecimal(PaidCopay);
            var paidCoinsurance      = reader.GetDecimal(PaidCoinsurance);
            var paidTowardDeductible = reader.GetDecimal(PaidTowardDeductible);

            decimal?totalOutOfPocket = null;

            if (paidCopay.HasValue && paidCoinsurance.HasValue && paidTowardDeductible.HasValue)
            {
                totalOutOfPocket = paidCopay + paidCoinsurance + paidTowardDeductible;
            }
            else if (paidCoinsurance.HasValue && paidTowardDeductible.HasValue)
            {
                totalOutOfPocket = paidCoinsurance + paidTowardDeductible;
            }

            long?  drgConceptId;
            string drgSource;
            long?  revenueCodeConceptId;
            string revenueCodeSource;

            PopulateOthersConcepts(reader, out drgConceptId, out drgSource, out revenueCodeConceptId, out revenueCodeSource);

            return(new VisitCost(visit)
            {
                VisitCostId = keyOffset.VisitCostId,
                PaidCopay = paidCopay,
                PaidCoinsurance = paidCoinsurance,
                PaidTowardDeductible = paidTowardDeductible,
                PaidByPayer = reader.GetDecimal(PaidByPayer),
                PaidByCoordinationBenefits = reader.GetDecimal(PaidByCoordinationBenefits),
                TotalPaid = reader.GetDecimal(TotalPaid),
                TotalOutOfPocket = totalOutOfPocket,
                CurrencyConceptId = reader.GetLong(CurrencyConceptId) ?? 0,
                DrgConceptId = drgConceptId,
                DrgSourceValue = drgSource,
                RevenueCodeConceptId = revenueCodeConceptId,
                RevenueCodeSourceValue = revenueCodeSource
            });
        }
        private static void AddToDateClaimTypeDictionary(Dictionary <DateTime, Dictionary <string, List <IEntity> > > entities,
                                                         IEntity entity, VisitOccurrence visitOccurrence)
        {
            if (!entities.ContainsKey(entity.StartDate))
            {
                entities.Add(entity.StartDate, new Dictionary <string, List <IEntity> >());
            }

            var claimType = entity.AdditionalFields["claim_type"];

            if (!entities[entity.StartDate].ContainsKey(claimType))
            {
                entities[entity.StartDate][claimType] = new List <IEntity>();
            }

            if (DateTime.Parse(entity.AdditionalFields["visit_end_date"]) > visitOccurrence.EndDate.Value)
            {
                entity.AdditionalFields["visit_end_date"] = visitOccurrence.EndDate.Value.ToString(CultureInfo.InvariantCulture);
            }

            entities[entity.StartDate][claimType].Add(entity);
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyMaster).ToList();

             if(visitOccurrences.Count > 0)
             {
            var id = reader.GetLong(Id);
            var visitOccurrence = new VisitOccurrence((Entity) visitOccurrences[0])
                                     {
                                        CareSiteId = reader.GetInt(CareSiteId) ?? 0
                                     };
            if(id.HasValue)
            {
               visitOccurrence.Id = id.Value;
            }
            else
            {
               visitOccurrence.IdUndefined = true;
            }

            yield return visitOccurrence;
             }
        }
Exemple #12
0
        public override IEnumerable <IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyMaster).ToList();

            if (visitOccurrences.Count > 0)
            {
                var id = reader.GetLong(Id);
                var visitOccurrence = new VisitOccurrence((Entity)visitOccurrences[0])
                {
                    CareSiteId = reader.GetInt(CareSiteId) ?? 0
                };
                if (id.HasValue)
                {
                    visitOccurrence.Id = id.Value;
                }
                else
                {
                    visitOccurrence.IdUndefined = true;
                }

                yield return(visitOccurrence);
            }
        }
        private string GetProviderKey(VisitOccurrence visitOccurrence, IEntity entity,
                                           Dictionary<DateTime, Dictionary<string, List<IEntity>>>
                                              dateClaimTypeDictionary)
        {
            var claimType = visitOccurrence.SourceValue;

             if (!dateClaimTypeDictionary[entity.StartDate].ContainsKey(claimType))
            claimType = entity.AdditionalFields["claim_type"];

             if (claimType.ToUpper() == "OP")
             {
            return dateClaimTypeDictionary[entity.StartDate][claimType]
               .Where(c => c.VisitOccurrenceId == entity.VisitOccurrenceId)
               .OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
               .ThenBy(c => c.AdditionalFields["prov"])
               .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
               .ThenBy(c => c.AdditionalFields["provcat"])
               .First().ProviderKey;
             }

             if (claimType.ToUpper() == "ER")
             {
            var prov =
               dateClaimTypeDictionary[entity.StartDate][claimType].Where(c => c.VisitOccurrenceId == entity.VisitOccurrenceId)
                                                                   .OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
                                                                   .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
                                                                   .ThenBy(c => c.AdditionalFields["prov"])
                                                                   .ThenBy(c => c.AdditionalFields["provcat"])
                                                                   .FirstOrDefault();

            if (prov != null) return prov.ProviderKey;
             }

             return entity.ProviderKey =
                dateClaimTypeDictionary[entity.StartDate][claimType].OrderBy(c => DateTime.Parse(c.AdditionalFields["visit_start_date"]))
                                                                      .ThenBy(c => DateTime.Parse(c.AdditionalFields["visit_end_date"]))
                                                                      .ThenBy(c => c.AdditionalFields["prov"])
                                                                      .ThenBy(c => c.AdditionalFields["provcat"])
                                                                      .First().ProviderKey;
        }
        private static void AddToDateClaimTypeDictionary(Dictionary<DateTime, Dictionary<string, List<IEntity>>> entities,
                                                       IEntity entity, VisitOccurrence visitOccurrence)
        {
            if (!entities.ContainsKey(entity.StartDate))
            entities.Add(entity.StartDate, new Dictionary<string, List<IEntity>>());

             var claimType = entity.AdditionalFields["claim_type"];
             if (!entities[entity.StartDate].ContainsKey(claimType))
            entities[entity.StartDate][claimType] = new List<IEntity>();

             if (DateTime.Parse(entity.AdditionalFields["visit_end_date"]) > visitOccurrence.EndDate.Value)
            entity.AdditionalFields["visit_end_date"] = visitOccurrence.EndDate.Value.ToString(CultureInfo.InvariantCulture);

             entities[entity.StartDate][claimType].Add(entity);
        }
        /// <summary>
        /// Projects Enumeration of Visit Occurrence from the raw set of Visit Occurrence entities. 
        ///  </summary>
        /// <param name="rawVisitOccurrences">raw set of Visit Occurrence entities</param>
        /// <param name="observationPeriods">the observation periods entities for current person</param>
        /// <returns>Enumeration of Visit Occurrence</returns>
        public override IEnumerable<VisitOccurrence> BuildVisitOccurrences(VisitOccurrence[] rawVisitOccurrences, ObservationPeriod[] observationPeriods)
        {
            var visitOccurrences = CleanVisitOccurrences(rawVisitOccurrences, observationPeriods).ToList();

             var ipVisits = GetIPClaims(visitOccurrences).ToList();
             var erVisits = new List<VisitOccurrence>();
             var opVisits = new List<VisitOccurrence>();

             foreach (var visitOccurrence in visitOccurrences.Where(visitOccurrence => visitOccurrence.ConceptId != 9201))
             {
            var ip = ipVisits.FirstOrDefault(v => visitOccurrence.StartDate.Between(v.StartDate, v.EndDate.Value));

            if (visitOccurrence.ConceptId == 9203)
            {
               if (ip == null || (visitOccurrence.StartDate == ip.StartDate && visitOccurrence.EndDate == ip.StartDate))
               //ER - 9203
               {
                  erVisits.Add(visitOccurrence);
               }
               else
               {
                  if (!rawVisits.ContainsKey(visitOccurrence.SourceRecordGuid))
                     rawVisits.Add(visitOccurrence.SourceRecordGuid, ip);
               }
            }
            else if (ip == null)
            {
               opVisits.Add(visitOccurrence);
            }
            else
            {
               if (!rawVisits.ContainsKey(visitOccurrence.SourceRecordGuid))
                  rawVisits.Add(visitOccurrence.SourceRecordGuid, ip);
            }
             }

             foreach (var ipVisit in ipVisits)
             {
            yield return ipVisit;
             }

             // collapse claims with the same FST_DT in ER table as one unique ER visit
             foreach (var patplanidGroup in erVisits.GroupBy(vo => vo.AdditionalFields["pat_planid"]))
             {
            foreach (var erGroup in patplanidGroup.GroupBy(v => v.StartDate))
            {
               var visit = erGroup.First();
               visit.EndDate = erGroup.Max(v => v.EndDate);
               foreach (
                   var visitOccurrence in
                       erGroup.Where(visitOccurrence => !rawVisits.ContainsKey(visitOccurrence.SourceRecordGuid)))
               {
                  rawVisits.Add(visitOccurrence.SourceRecordGuid, visit);
               }

               yield return visit;
            }
             }

             foreach (var patplanidGroup in opVisits.GroupBy(vo => vo.AdditionalFields["pat_planid"]))
             {
            foreach (var opGroup in patplanidGroup.GroupBy(v => v.StartDate))
            {
               foreach (var opGroup1 in opGroup.GroupBy(v => v.AdditionalFields["prov"]))
               {
                  var visit = opGroup1.First();
                  visit.EndDate = opGroup1.Max(v => v.EndDate);
                  foreach (
                      var visitOccurrence in
                          opGroup1.Where(visitOccurrence => !rawVisits.ContainsKey(visitOccurrence.SourceRecordGuid))
                      )
                  {
                     rawVisits.Add(visitOccurrence.SourceRecordGuid, visit);
                  }

                  yield return visit;
               }
            }
             }
        }
        public void TestPremierPersonUniqueEntities()
        {
            var conditionOccurrences = new List<ConditionOccurrence>();
             var drugExposures = new List<DrugExposure>();
             var visitOccurrences = new Dictionary<long, VisitOccurrence>();
             var builder = new PremierPersonBuilder(new ChunkBuilder(new ChunkData(), typeof(PremierPersonBuilder)));

             var ent = new Entity
             {
            Id = 1,
            ConceptId = 1,
            PersonId = 1,
            ProviderId = 1,
            VisitOccurrenceId = 1,
            StartDate = new DateTime(2013, 1, 1),
            EndDate = new DateTime(2013, 1, 1),
            TypeConceptId = 1,
            SourceValue = "1"
             };
             var visitOccurrence =
            new VisitOccurrence(new Entity
            {
               PersonId = 1,
               StartDate = new DateTime(2000, 1, 1),
               EndDate = new DateTime(2020, 1, 1)
            })
            {
               AdditionalFields = new Dictionary<string, string> {{"disc_mon_seq", "1"}},
               Id = 1
            };

             visitOccurrences.Add(visitOccurrence.Id, visitOccurrence);

             conditionOccurrences.Add(new ConditionOccurrence(ent));
             conditionOccurrences.Add(new ConditionOccurrence(ent));

             drugExposures.Add(new DrugExposure(new Entity
             {
            PersonId = 1,
            ConceptId = 535714,
            VisitOccurrenceId = 1,
            TypeConceptId = 38000179,
            SourceValue = "90384"
             }
            ));
             drugExposures.Add(new DrugExposure(new Entity
             {
            PersonId = 1,
            ConceptId = 535714,
            VisitOccurrenceId = 1,
            TypeConceptId = 38000179,
            SourceValue = "99.11"
             }
            ));

             var coResult = builder.BuildConditionOccurrences(conditionOccurrences.ToArray(), visitOccurrences, new ObservationPeriod[] {});
             var deResult = builder.BuildDrugExposures(drugExposures.ToArray(), visitOccurrences, new ObservationPeriod[] { });

             Assert.AreEqual(1, coResult.Count());
             Assert.AreEqual(2, deResult.Count());
        }
Exemple #17
0
        //HIX-1225
        public void TestGetIPClaims4()
        {
            var buider =
                new OptumExtendedSesPersonBuilder();

            var vo = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2008-12-12"),
                EndDate          = DateTime.Parse("2008-12-14"),
                ConceptId        = 9201,
                ProviderId       = 9555473479
            };

            vo.AdditionalFields.Add("pat_planid", "208426549285164");
            vo.AdditionalFields.Add("prov", "9555473479");
            vo.AdditionalFields.Add("provcat", "0001");

            var vo1 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2008-12-12"),
                EndDate          = DateTime.Parse("2008-12-14"),
                ConceptId        = 9201,
                ProviderId       = 9555473479
            };

            vo1.AdditionalFields.Add("pat_planid", "208426549285164");
            vo1.AdditionalFields.Add("prov", "9555473479");
            vo1.AdditionalFields.Add("provcat", "0001");

            var vo2 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2008-12-12"),
                EndDate          = DateTime.Parse("2008-12-14"),
                ConceptId        = 9201,
                ProviderId       = 9559292731
            };

            vo2.AdditionalFields.Add("pat_planid", "208426549893784");
            vo2.AdditionalFields.Add("prov", "9559292731");
            vo2.AdditionalFields.Add("provcat", "0001");

            var vo3 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2008-12-12"),
                EndDate          = DateTime.Parse("2008-12-14"),
                ConceptId        = 9201,
                ProviderId       = 9559292731
            };

            vo3.AdditionalFields.Add("pat_planid", "208426549893784");
            vo3.AdditionalFields.Add("prov", "9559292731");
            vo3.AdditionalFields.Add("provcat", "0001");

            var result =
                buider.GetIPClaims(new List <VisitOccurrence> {
                vo3, vo2, vo1, vo
            })
                .OrderBy(v => v.StartDate)
                .ThenBy(v => v.EndDate.Value).ToList();

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(DateTime.Parse("2008-12-12"), result[0].StartDate);
            Assert.AreEqual(DateTime.Parse("2008-12-14"), result[0].EndDate);
        }
        public void TestPremierPersonUniqueEntities()
        {
            var conditionOccurrences = new List <ConditionOccurrence>();
            var drugExposures        = new List <DrugExposure>();
            var visitOccurrences     = new Dictionary <long, VisitOccurrence>();
            var builder = new PremierPersonBuilder(new ChunkBuilder(new ChunkData(), typeof(PremierPersonBuilder)));

            var ent = new Entity
            {
                Id                = 1,
                ConceptId         = 1,
                PersonId          = 1,
                ProviderId        = 1,
                VisitOccurrenceId = 1,
                StartDate         = new DateTime(2013, 1, 1),
                EndDate           = new DateTime(2013, 1, 1),
                TypeConceptId     = 1,
                SourceValue       = "1"
            };
            var visitOccurrence =
                new VisitOccurrence(new Entity
            {
                PersonId  = 1,
                StartDate = new DateTime(2000, 1, 1),
                EndDate   = new DateTime(2020, 1, 1)
            })
            {
                AdditionalFields = new Dictionary <string, string> {
                    { "disc_mon_seq", "1" }
                },
                Id = 1
            };

            visitOccurrences.Add(visitOccurrence.Id, visitOccurrence);

            conditionOccurrences.Add(new ConditionOccurrence(ent));
            conditionOccurrences.Add(new ConditionOccurrence(ent));

            drugExposures.Add(new DrugExposure(new Entity
            {
                PersonId          = 1,
                ConceptId         = 535714,
                VisitOccurrenceId = 1,
                TypeConceptId     = 38000179,
                SourceValue       = "90384"
            }
                                               ));
            drugExposures.Add(new DrugExposure(new Entity
            {
                PersonId          = 1,
                ConceptId         = 535714,
                VisitOccurrenceId = 1,
                TypeConceptId     = 38000179,
                SourceValue       = "99.11"
            }
                                               ));


            var coResult = builder.BuildConditionOccurrences(conditionOccurrences.ToArray(), visitOccurrences, new ObservationPeriod[] {});
            var deResult = builder.BuildDrugExposures(drugExposures.ToArray(), visitOccurrences, new ObservationPeriod[] { });

            Assert.AreEqual(1, coResult.Count());
            Assert.AreEqual(2, deResult.Count());
        }
 public void AddChildData(VisitOccurrence parent, VisitCost child)
 {
     parent.VisitCosts = new List <VisitCost> {
         child
     };
 }
        public override IEnumerable <VisitOccurrence> BuildVisitOccurrences(VisitOccurrence[] rawVisitOccurrences,
                                                                            ObservationPeriod[] observationPeriods)
        {
            var ipVisitsRaw          = new List <VisitOccurrence>();
            var erVisitsRaw          = new List <VisitOccurrence>();
            var erVisits             = new List <VisitOccurrence>();
            var nonHospitalVisitsRaw = new List <VisitOccurrence>();
            var othersRaw            = new List <VisitOccurrence>();
            var remainingRaw         = new List <VisitOccurrence>();
            var remaining            = new List <VisitOccurrence>();

            foreach (var visitOccurrence in rawVisitOccurrences)
            {
                if (!visitOccurrence.EndDate.HasValue)
                {
                    visitOccurrence.EndDate = visitOccurrence.StartDate;
                }


                if (visitOccurrence.StartDate > visitOccurrence.EndDate.Value)
                {
                    visitOccurrence.EndDate = visitOccurrence.StartDate;
                }

                var result = Vocabulary.Lookup(visitOccurrence.ConceptId.ToString(), "CMSPlaceOfService",
                                               DateTime.MinValue);

                var conceptId = result.Any() ? result[0].ConceptId ?? 0 : 0;
                visitOccurrence.ConceptId = conceptId;

                if (conceptId == 9201)
                {
                    ipVisitsRaw.Add(visitOccurrence);
                }
                else if (conceptId == 9203)
                {
                    erVisitsRaw.Add(visitOccurrence);
                }
                else
                {
                    othersRaw.Add(visitOccurrence);
                }
            }


            var ipVisits = CollapseVisits(ipVisitsRaw);

            // Collapse records that have the same VISIT_DETAIL_START_DATETIME into one Visit.
            foreach (var erGroup in erVisitsRaw.GroupBy(v => v.StartDate))
            {
                var erVisit = erGroup.First();
                erVisit.EndDate = erGroup.Max(v => v.EndDate);

                var             ip    = ipVisits.FirstOrDefault(v => erVisit.StartDate.Between(v.StartDate, v.EndDate.Value));
                VisitOccurrence visit = null;
                if (ip != null)
                {
                    //    If an emergency room visit starts on the first day of an Inpatient visit(defined in the step above), then
                    //    Assign the emergency room visit the autogenerated VISIT_OCCURRENCE_ID of the Inpatient visit.
                    //    Set VISIT_CONCEPT_ID = 262(it would previously have been 9201).
                    if (ip.StartDate == erVisit.StartDate)
                    {
                        ip.ConceptId = 262;
                    }

                    if (ip.EndDate < erVisit.EndDate)
                    {
                        ip.EndDate = erVisit.EndDate;
                    }

                    visit = ip;
                }
                else
                {
                    visit = erVisit;
                    erVisits.Add(visit);
                }

                foreach (var visitOccurrence in erGroup)
                {
                    AddRawVisitOccurrence(visitOccurrence, visit);
                }
            }

            // Rolling additional visit detail into Inpatient
            foreach (var otherVisit in othersRaw)
            {
                var ip = ipVisits.FirstOrDefault(v => otherVisit.StartDate.Between(v.StartDate, v.EndDate.Value));

                //For all other VISIT_DETAIL records, first look to see if they occur at any point within a previously defined inpatient visit.
                if (ip != null)
                {
                    AddRawVisitOccurrence(otherVisit, ip);
                }
                else
                {
                    if (otherVisit.ConceptId == 42898160)
                    {
                        nonHospitalVisitsRaw.Add(otherVisit);
                    }
                    else
                    {
                        remainingRaw.Add(otherVisit);
                    }
                }
            }

            var nonHospitalVisits = CollapseVisits(nonHospitalVisitsRaw);

            // Rolling additional visit detail into Non-hospital institution visit
            foreach (var remainingVisit in remainingRaw)
            {
                var nonHospital =
                    nonHospitalVisits.FirstOrDefault(
                        v => remainingVisit.StartDate.Between(v.StartDate, v.EndDate.Value));
                if (nonHospital != null)
                {
                    AddRawVisitOccurrence(remainingVisit, nonHospital);
                }
                else
                {
                    remaining.Add(remainingVisit);
                }
            }

            // All other VISIT_DETAIL records
            foreach (var byStart in remaining.GroupBy(v => v.StartDate))
            {
                foreach (var byEnd in byStart.GroupBy(v => v.EndDate))
                {
                    foreach (var byCareSiteId in byEnd.GroupBy(v => v.CareSiteId))
                    {
                        var visit = byCareSiteId.OrderBy(v => v.ConceptId).First();

                        //var startDate = byCareSiteId.Min(v => v.StartDate);
                        //var endDate = byCareSiteId.Max(v => v.EndDate);

                        //visit.StartDate = startDate;
                        //visit.EndDate = endDate;

                        foreach (var vo in byCareSiteId)
                        {
                            AddRawVisitOccurrence(vo, visit);
                        }

                        yield return(visit);
                    }
                }
            }

            foreach (var visitOccurrence in ipVisits)
            {
                yield return(visitOccurrence);
            }

            foreach (var visitOccurrence in erVisits)
            {
                yield return(visitOccurrence);
            }

            foreach (var visitOccurrence in nonHospitalVisits)
            {
                yield return(visitOccurrence);
            }
        }
        public override IEnumerable <IEntity> GetConcepts(Concept concept, IDataRecord reader,
                                                          KeyMasterOffsetManager keyOffset)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyOffset).ToList();

            if (visitOccurrences.Count > 0)
            {
                int    dischargeToConceptId   = 0;
                string dischargeToSourceValue = null;
                if (Concepts.Length > 1)
                {
                    var dischargeConcepts = base.GetConcepts(Concepts[1], reader, null).ToList();
                    dischargeToSourceValue = reader.GetString(Concepts[1].Fields[0].Key);
                    if (dischargeConcepts.Count > 0)
                    {
                        dischargeToConceptId   = dischargeConcepts[0].ConceptId;
                        dischargeToSourceValue = dischargeConcepts[0].SourceValue;
                    }
                }
                else
                {
                    dischargeToConceptId   = reader.GetInt(DischargeToConceptId) ?? 0;
                    dischargeToSourceValue = reader.GetString(DischargeToSourceValue);
                }


                int    admittingSourceConceptId = 0;
                string admittingSourceValue     = null;
                if (Concepts.Length > 2)
                {
                    var admittingConcepts = base.GetConcepts(Concepts[2], reader, null).ToList();
                    admittingSourceValue = reader.GetString(Concepts[2].Fields[0].Key);
                    if (admittingConcepts.Count > 0)
                    {
                        admittingSourceConceptId = admittingConcepts[0].ConceptId;
                        admittingSourceValue     = admittingConcepts[0].SourceValue;
                    }
                }
                else
                {
                    admittingSourceConceptId = reader.GetInt(AdmittingSourceConceptId) ?? 0;
                    admittingSourceValue     = reader.GetString(AdmittingSourceValue);
                }

                var id = reader.GetLong(Id);

                string startTime = null;
                string endTime   = null;

                if (!string.IsNullOrEmpty(StartTime))
                {
                    if (DateTime.TryParse(reader.GetString(StartTime), out var dt))
                    {
                        startTime = dt.ToString("HH:mm:ss", CultureInfo.InvariantCulture);
                    }
                }

                if (!string.IsNullOrEmpty(EndTime))
                {
                    if (DateTime.TryParse(reader.GetString(EndTime), out var dt))
                    {
                        endTime = dt.ToString("HH:mm:ss", CultureInfo.InvariantCulture);
                    }
                }

                var visitOccurrence = new VisitOccurrence((Entity)visitOccurrences[0])
                {
                    CareSiteId = reader.GetInt(CareSiteId) ?? 0,
                    StartTime  = startTime,
                    EndTime    = endTime,
                    AdmittingSourceConceptId   = admittingSourceConceptId,
                    AdmittingSourceValue       = admittingSourceValue,
                    DischargeToConceptId       = dischargeToConceptId,
                    DischargeToSourceValue     = dischargeToSourceValue,
                    PrecedingVisitOccurrenceId = reader.GetInt(PrecedingVisitOccurrenceId)
                };
                if (id.HasValue)
                {
                    visitOccurrence.Id = id.Value;
                }
                else
                {
                    visitOccurrence.IdUndefined = true;
                }

                yield return(visitOccurrence);
            }
        }
        /// <summary>
        /// Build person entity and all person related entities like: DrugExposures, ConditionOccurrences, ProcedureOccurrences... from raw data sets
        /// </summary>
        public override Attrition Build(ChunkData data, KeyMasterOffsetManager om)
        {
            Offset    = om;
            ChunkData = data;
            var result = BuildPerson(PersonRecords.ToList());
            var person = result.Key;

            if (person == null)
            {
                return(result.Value);
            }

            if (!ObservationPeriodsRaw.Any(op => op.StartDate < op.EndDate))
            {
                return(Attrition.InvalidObservationTime);
            }

            var op = ObservationPeriodsRaw.Where(op =>
                                                 op.StartDate < op.EndDate &&
                                                 op.StartDate.Year >= person.YearOfBirth &&
                                                 op.EndDate.Value.Year >= person.YearOfBirth &&
                                                 op.StartDate.Year <= DateTime.Now.Year).ToArray();

            if (op.Length == 0)
            {
                return(Attrition.InvalidObservationTime);
            }

            var observationPeriods =
                BuildObservationPeriods(person.ObservationPeriodGap, op).ToArray();

            var payerPlanPeriods = BuildPayerPlanPeriods(PayerPlanPeriodsRaw.Where(pp =>
                                                                                   pp.StartDate.Year >= person.YearOfBirth &&
                                                                                   pp.EndDate.Value.Year >= person.YearOfBirth &&
                                                                                   pp.StartDate.Year <= DateTime.Now.Year).ToArray(), null).ToArray();

            var visitDetails = new Dictionary <long, VisitDetail>();
            var visitDetIds  = new List <long>();

            foreach (var vd in BuildVisitDetails(null, VisitOccurrencesRaw.Where(vo =>
                                                                                 vo.StartDate.Year >= person.YearOfBirth &&
                                                                                 vo.EndDate.Value.Year >= person.YearOfBirth &&
                                                                                 vo.StartDate.Year <= DateTime.Now.Year &&
                                                                                 vo.EndDate.Value.Year <= DateTime.Now.Year).ToArray(), observationPeriods).ToArray())
            {
                if (person.MonthOfBirth.HasValue && vd.StartDate.Year < person.YearOfBirth.Value &&
                    vd.StartDate.Month < person.MonthOfBirth ||
                    vd.StartDate.Year < person.YearOfBirth.Value)
                {
                    if (vd.StartDate.Year < person.YearOfBirth.Value)
                    {
                        if (DateTime.TryParse(person.AdditionalFields["frd"], out var frd))
                        {
                            vd.StartDate = frd;
                            vd.EndDate   = frd;
                        }
                        else
                        {
                            continue;
                        }
                    }
                }

                if (visitDetails.ContainsKey(vd.Id))
                {
                    continue;
                }

                visitDetails.Add(vd.Id, vd);
                visitDetIds.Add(vd.Id);
            }

            long?prevVisitDetId = null;

            foreach (var visitId in visitDetIds.OrderBy(v => v))
            {
                if (prevVisitDetId.HasValue)
                {
                    visitDetails[visitId].PrecedingVisitDetailId = prevVisitDetId;
                }

                prevVisitDetId = visitId;
            }

            var visitOccurrences = new Dictionary <long, VisitOccurrence>();
            var visitIds         = new List <long>();

            foreach (var byStartDate in visitDetails.Values.GroupBy(v => v.StartDate))
            {
                var vd                = byStartDate.First();
                var providerId        = byStartDate.Min(v => v.ProviderId);
                var careSiteId        = byStartDate.Min(v => v.CareSiteId);
                var sourceValue       = byStartDate.Min(v => v.SourceValue);
                var visitOccurrenceId = byStartDate.Min(v => v.Id);
                var visitOccurrence   = new VisitOccurrence(vd)
                {
                    //Id = Offset.GetKeyOffset(vd.PersonId).VisitOccurrenceId,
                    Id          = visitOccurrenceId,
                    ProviderId  = providerId,
                    CareSiteId  = careSiteId,
                    SourceValue = sourceValue
                };

                foreach (var visitDetail in byStartDate)
                {
                    visitDetail.VisitOccurrenceId = visitOccurrence.Id;
                }

                visitOccurrences.Add(visitOccurrence.Id, visitOccurrence);
                visitIds.Add(visitOccurrence.Id);
            }


            long?prevVisitId = null;

            foreach (var visitId in visitIds.OrderBy(v => v))
            {
                if (prevVisitId.HasValue)
                {
                    visitOccurrences[visitId].PrecedingVisitOccurrenceId = prevVisitId;
                }

                prevVisitId = visitId;
            }

            SetVisitOccurrenceId(ConditionOccurrencesRaw, visitDetails);
            SetVisitOccurrenceId(ProcedureOccurrencesRaw, visitDetails);
            SetVisitOccurrenceId(DrugExposuresRaw, visitDetails);
            SetVisitOccurrenceId(DeviceExposureRaw, visitDetails);
            SetVisitOccurrenceId(ObservationsRaw, visitDetails);
            SetVisitOccurrenceId(MeasurementsRaw, visitDetails);

            var drugExposures        = BuildDrugExposures(DrugExposuresRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();
            var deviceExposure       = BuildDeviceExposure(DeviceExposureRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();
            var conditionOccurrences = BuildConditionOccurrences(ConditionOccurrencesRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();
            var procedureOccurrences = BuildProcedureOccurrences(ProcedureOccurrencesRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();

            var observations = BuildObservations(ObservationsRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();
            var measurements = BuildMeasurement(MeasurementsRaw.ToArray(), visitOccurrences, observationPeriods).ToArray();

            var death = BuildDeath(DeathRecords.ToArray(), visitOccurrences, observationPeriods);


            if (death != null)
            {
                person.TimeOfDeath = death.StartDate;

                if (death.StartDate < observationPeriods.Min(op => op.StartDate))
                {
                    return(Attrition.UnacceptablePatientQuality);
                }

                if (death.StartDate.Year < person.YearOfBirth || death.StartDate.Year > DateTime.Now.Year)
                {
                    death = null;
                }
            }

            // push built entities to ChunkBuilder for further save to CDM database
            AddToChunk(person,
                       death,
                       observationPeriods,
                       payerPlanPeriods,
                       Clean(drugExposures, person).ToArray(),
                       Clean(conditionOccurrences, person).ToArray(),
                       Clean(procedureOccurrences, person).ToArray(),
                       Clean(observations, person).ToArray(),
                       Clean(measurements, person).ToArray(),
                       visitOccurrences.Values.ToArray(),
                       visitDetails.Values.ToArray(), null,
                       Clean(deviceExposure, person).ToArray(), null);

            var pg = new PregnancyAlgorithm();

            foreach (var r in pg.GetPregnancyEpisodes(Vocabulary, person, observationPeriods,
                                                      ChunkData.ConditionOccurrences.Where(e => e.PersonId == person.PersonId).ToArray(),
                                                      ChunkData.ProcedureOccurrences.Where(e => e.PersonId == person.PersonId).ToArray(),
                                                      ChunkData.Observations.Where(e => e.PersonId == person.PersonId).ToArray(),
                                                      ChunkData.Measurements.Where(e => e.PersonId == person.PersonId).ToArray(),
                                                      ChunkData.DrugExposures.Where(e => e.PersonId == person.PersonId).ToArray()))
            {
                r.Id = Offset.GetKeyOffset(r.PersonId).ConditionEraId;
                ChunkData.ConditionEra.Add(r);
            }


            return(Attrition.None);
        }
        public override IEnumerable <IEntity> GetConcepts(Concept concept, IDataRecord reader,
                                                          KeyMasterOffsetManager keyOffset)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyOffset).ToList();

            if (visitOccurrences.Count > 0)
            {
                int    dischargeToConceptId   = 0;
                string dischargeToSourceValue = null;
                if (Concepts != null)
                {
                    var dischargeConcept = Concepts.FirstOrDefault(c => c.Name == "DischargeToConceptId");
                    if (dischargeConcept != null)
                    {
                        var dischargeConcepts = base.GetConcepts(dischargeConcept, reader, null).ToList();
                        dischargeToSourceValue = reader.GetString(dischargeConcept.Fields[0].Key);
                        if (dischargeConcepts.Count > 0)
                        {
                            dischargeToConceptId   = dischargeConcepts[0].ConceptId;
                            dischargeToSourceValue = dischargeConcepts[0].SourceValue;
                        }
                    }
                }
                else
                {
                    dischargeToConceptId   = reader.GetInt(DischargeToConceptId) ?? 0;
                    dischargeToSourceValue = reader.GetString(DischargeToSourceValue);
                }


                int    admittingSourceConceptId = 0;
                string admittingSourceValue     = null;
                if (Concepts != null)
                {
                    var admittingConcept = Concepts.FirstOrDefault(c => c.Name == "AdmittedFromConceptId");
                    if (admittingConcept != null)
                    {
                        var admittingConcepts = base.GetConcepts(admittingConcept, reader, null).ToList();
                        admittingSourceValue = reader.GetString(admittingConcept.Fields[0].Key);
                        if (admittingConcepts.Count > 0)
                        {
                            admittingSourceConceptId = admittingConcepts[0].ConceptId;
                            admittingSourceValue     = admittingConcepts[0].SourceValue;
                        }
                    }
                }
                else
                {
                    admittingSourceConceptId = reader.GetInt(AdmittingSourceConceptId) ?? 0;
                    admittingSourceValue     = reader.GetString(AdmittingSourceValue);
                }

                var id = reader.GetLong(Id);

                var visitOccurrence = new VisitOccurrence((Entity)visitOccurrences[0])
                {
                    CareSiteId = reader.GetLong(CareSiteId) ?? 0,
                    AdmittingSourceConceptId   = admittingSourceConceptId,
                    AdmittingSourceValue       = admittingSourceValue,
                    DischargeToConceptId       = dischargeToConceptId,
                    DischargeToSourceValue     = dischargeToSourceValue,
                    PrecedingVisitOccurrenceId = reader.GetInt(PrecedingVisitOccurrenceId)
                };
                if (id.HasValue)
                {
                    visitOccurrence.Id = id.Value;
                }
                else
                {
                    visitOccurrence.IdUndefined = true;
                }

                yield return(visitOccurrence);
            }
        }
Exemple #24
0
        public void TestGetIPClaims3()
        {
            var buider =
                new OptumExtendedSesPersonBuilder();

            var vo = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2008-09-29"),
                EndDate          = DateTime.Parse("2011-05-09"),
                ConceptId        = 9201
            };

            vo.AdditionalFields.Add("pat_planid", "952690485125145");

            var vo1 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2011-04-14"),
                EndDate          = DateTime.Parse("2011-04-16"),
                ConceptId        = 9201
            };

            vo1.AdditionalFields.Add("pat_planid", "952690488174899");

            var vo2 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2011-04-14"),
                EndDate          = DateTime.Parse("2011-05-09"),
                ConceptId        = 9201
            };

            vo2.AdditionalFields.Add("pat_planid", "952690488174899");

            var vo3 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2011-05-09"),
                EndDate          = DateTime.Parse("2011-05-09"),
                ConceptId        = 9201
            };

            vo3.AdditionalFields.Add("pat_planid", "952690488174899");

            var vo4 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2014-07-18"),
                EndDate          = DateTime.Parse("2014-07-19"),
                ConceptId        = 9201
            };

            vo4.AdditionalFields.Add("pat_planid", "952690488174899");

            var vo5 = new VisitOccurrence(new Entity())
            {
                AdditionalFields = new Dictionary <string, string>(),
                StartDate        = DateTime.Parse("2014-07-18"),
                EndDate          = DateTime.Parse("2014-07-19"),
                ConceptId        = 9201
            };

            vo5.AdditionalFields.Add("pat_planid", "952690488174899");

            var result =
                buider.GetIPClaims(new List <VisitOccurrence> {
                vo5, vo4, vo3, vo2, vo1, vo
            })
                .OrderBy(v => v.StartDate)
                .ThenBy(v => v.EndDate.Value).ToList();

            Assert.AreEqual(3, result.Count);
            Assert.AreEqual(DateTime.Parse("2008-09-29"), result[0].StartDate);
            Assert.AreEqual(DateTime.Parse("2011-05-09"), result[0].EndDate);

            Assert.AreEqual(DateTime.Parse("2011-04-14"), result[1].StartDate);
            Assert.AreEqual(DateTime.Parse("2011-05-09"), result[1].EndDate);

            Assert.AreEqual(DateTime.Parse("2014-07-18"), result[2].StartDate);
            Assert.AreEqual(DateTime.Parse("2014-07-19"), result[2].EndDate);
        }