private static IEnumerable<VisitOccurrence> CleanVisitOccurrences(IEnumerable<VisitOccurrence> visitOccurrences, ObservationPeriod[] observationPeriods) { foreach (var visitOccurrence in visitOccurrences) { if (!visitOccurrence.EndDate.HasValue || visitOccurrence.EndDate < visitOccurrence.StartDate) visitOccurrence.EndDate = visitOccurrence.StartDate; var observationPeriod = observationPeriods.FirstOrDefault(op => visitOccurrence.StartDate.Between(op.StartDate, op.EndDate) || visitOccurrence.EndDate.Value.Between(op.StartDate, op.EndDate)); if (observationPeriod == null) continue; if (visitOccurrence.StartDate < observationPeriod.StartDate) visitOccurrence.StartDate = observationPeriod.StartDate; if (visitOccurrence.EndDate > observationPeriod.EndDate) visitOccurrence.EndDate = observationPeriod.EndDate; yield return visitOccurrence; } }
/// <summary> /// Projects Enumeration of ProcedureOccurrence from the raw set of ProcedureOccurence entities. /// During build: /// override the procedure's start date using the end date of the corresponding visit. /// overide TypeConceptId per CDM Mapping spec. /// truncate procedure's dates to the corresponding observation period dates /// </summary> /// <param name="procedureOccurrences">raw set of procedure occurrence entities</param> /// <param name="visitOccurrences">the visit occurrence entities for current person</param> /// <param name="observationPeriods">the observation period entities for current person</param> /// <returns>Enumeration of procedure occurrence entities</returns> public override IEnumerable<ProcedureOccurrence> BuildProcedureOccurrences(ProcedureOccurrence[] procedureOccurrences, Dictionary<long, VisitOccurrence> visitOccurrences, ObservationPeriod[] observationPeriods) { var result = new HashSet<ProcedureOccurrence>(); var cost = new Dictionary<ProcedureOccurrence, List<ProcedureCost>>(); var dateClaimTypeDictionary = new Dictionary<DateTime, Dictionary<string, List<IEntity>>>(); var cdProcedures = new List<ProcedureOccurrence>(); var otherProcedures = new List<ProcedureOccurrence>(); foreach (var procedureOccurrence in procedureOccurrences) { var visitOccurrence = GetVisitOccurrence(procedureOccurrence); if (visitOccurrence == null) continue; procedureOccurrence.VisitOccurrenceId = visitOccurrence.Id; var observationPeriod = observationPeriods.FirstOrDefault(op => op.StartDate.Between(procedureOccurrence.StartDate, procedureOccurrence.EndDate.Value) || op.EndDate.Between(procedureOccurrence.StartDate, procedureOccurrence.EndDate.Value)); if (observationPeriod != null) { if (procedureOccurrence.StartDate < observationPeriod.StartDate) procedureOccurrence.StartDate = observationPeriod.StartDate; if (procedureOccurrence.StartDate > observationPeriod.EndDate) procedureOccurrence.StartDate = observationPeriod.EndDate; } procedureOccurrence.EndDate = null; procedureOccurrence.TypeConceptId = GetProcedureTypeConceptId(procedureOccurrence.TypeConceptId.Value, visitOccurrence.ConceptId); if (procedureOccurrence.TypeConceptId == 38000272 || procedureOccurrence.TypeConceptId == 38000254) { if (procedureOccurrence.ProcedureCosts != null) { if (!cost.ContainsKey(procedureOccurrence)) cost.Add(procedureOccurrence, new List<ProcedureCost>()); cost[procedureOccurrence].AddRange(procedureOccurrence.ProcedureCosts); } cdProcedures.Add(procedureOccurrence); } else { procedureOccurrence.StartDate = visitOccurrence.EndDate.Value; if (CodeValidator.IsValidIcd9Procedure(procedureOccurrence.SourceValue)) otherProcedures.Add(procedureOccurrence); } AddToDateClaimTypeDictionary(dateClaimTypeDictionary, procedureOccurrence, visitOccurrence); } foreach (var procedureOccurrence in BuildProceduresCd(cdProcedures, cost)) { result.Add(procedureOccurrence); } foreach (var procedureOccurrence in BuildProceduresOther(otherProcedures, visitOccurrences, dateClaimTypeDictionary)) { result.Add(procedureOccurrence); } return base.BuildProcedureOccurrences(result.ToArray(), visitOccurrences, observationPeriods); }