private async Task <IndexClientMessage> CreatePretestEncounters(MESSAGE_HEADER header, PATIENT_IDENTIFICATION pid, ClientStage stagedClient, ClientPretestStage pretest, params LoadAction[] actions) { ENCOUNTERS encounter = null; // PLACER_DETAIL var placerDetail = PLACER_DETAIL.Create(pretest.UserId, pretest.Id); // PRE_TEST PRE_TEST preTest = null; if (actions.Contains(LoadAction.All) || actions.Contains(LoadAction.Pretest)) { preTest = PRE_TEST.Create(pretest); } // HIV_TESTS HIV_TESTS hivTests = null; if (actions.Contains(LoadAction.All) || actions.Contains(LoadAction.Testing)) { var allfinalTests = await _clientFinalTestStageExtractor.Extract(stagedClient.ClientId); var alltests = await _clientTestingStageExtractor.Extract(); var finalTest = allfinalTests.Where(x => x.PretestEncounterId == pretest.Id).ToList() .LastOrDefault(); var tests = alltests.Where(x => x.PretestEncounterId == pretest.Id).ToList(); if (null != finalTest && tests.Any()) { hivTests = HIV_TESTS.Create(tests, finalTest); } } // GET THE LAST ONE encounter = ENCOUNTERS.Create(placerDetail, preTest, hivTests, null, new List <NewTracing>(), null); return(new IndexClientMessage(header, new List <NEWCLIENT> { NEWCLIENT.Create(pid, encounter) }, stagedClient.ClientId)); }
public async Task <IEnumerable <IndexClientMessage> > Load(Guid?htsClientId = null, params LoadAction[] actions) { var messages = new List <IndexClientMessage>(); if (!actions.Any()) { actions = new[] { LoadAction.All } } ; var facs = _practiceRepository.GetAllDefault().ToList(); // Set Facility var facility = facs.FirstOrDefault(x => x.IsDefault); if (null == facility) { throw new Exception($"Default Faciltity Not found"); } // MESSAGE_HEADER var facilityCode = facility.Code; var header = MESSAGE_HEADER.Create(facilityCode); // NEWCLIENT var stagedIndexClients = _clientStageRepository.GetIndexClients(); if (!htsClientId.IsNullOrEmpty()) { stagedIndexClients = stagedIndexClients.Where(x => x.ClientId == htsClientId); } foreach (var stagedClient in stagedIndexClients) { header.UpdateMfl(stagedClient.SiteCode); #region PATIENT_IDENTIFICATION var pid = PATIENT_IDENTIFICATION.Create(stagedClient); #endregion ENCOUNTERS encounter = null; if (!actions.Contains(LoadAction.RegistrationOnly)) { var pretests = _clientPretestStageRepository.GetByClientId(stagedClient.ClientId).ToList(); // PRETEST AND TESTING if (pretests.Any()) { var lastPretest = pretests.OrderByDescending(x => x.EncounterDate).FirstOrDefault(); foreach (var pretest in pretests) { var pretestEncounter = await CreatePretestEncounters(header, pid, stagedClient, pretest, actions); messages.Add(pretestEncounter); } if (null != lastPretest) { var nonPretest = await CreateNonPretestEncounters(header, pid, stagedClient, lastPretest, actions); if (null != nonPretest) { messages.Add(nonPretest); } } } else { var registration = CreateRegistration(header, pid, stagedClient, encounter); messages.Add(registration); } } else { messages.Add(new IndexClientMessage(header, new List <NEWCLIENT> { NEWCLIENT.Create(pid, encounter) }, stagedClient.ClientId)); } } return(messages); }
private async Task <IndexClientMessage> CreateNonPretestEncounters(MESSAGE_HEADER header, PATIENT_IDENTIFICATION pid, ClientStage stagedClient, ClientPretestStage lastPretest, params LoadAction[] actions) { ENCOUNTERS encounter = null; // PLACER_DETAIL var lastplacerDetail = PLACER_DETAIL.Create(lastPretest.UserId, lastPretest.Id); // NewReferral NewReferral newReferral = null; if (actions.Contains(LoadAction.All) || actions.Contains(LoadAction.Referral)) { var allReferrals = await _clientReferralStageExtractor.Extract(stagedClient.ClientId); if (allReferrals.Any()) { var referrall = allReferrals.LastOrDefault(); newReferral = NewReferral.Create(referrall); } } // NewTracing var newTracings = new List <NewTracing>(); if (actions.Contains(LoadAction.All) || actions.Contains(LoadAction.Tracing)) { var allTracing = await _clientTracingStageExtractor.Extract(stagedClient.ClientId); if (allTracing.Any()) { newTracings = NewTracing.Create(allTracing.ToList()); } } // NewLinkage NewLinkage newLinkage = null; if (actions.Contains(LoadAction.All) || actions.Contains(LoadAction.Linkage)) { var allLinkages = await _clientLinkageStageExtractor.Extract(stagedClient.ClientId); if (allLinkages.Any()) { var linkage = allLinkages.LastOrDefault(); newLinkage = linkage.HasData ? NewLinkage.Create(linkage) : null; } } if (null == newReferral && !newTracings.Any() && null == newLinkage) { return(null); } encounter = ENCOUNTERS.Create(lastplacerDetail, null, null, newReferral, newTracings, newLinkage); return(new IndexClientMessage(header, new List <NEWCLIENT> { NEWCLIENT.Create(pid, encounter) }, stagedClient.ClientId)); }
private IndexClientMessage CreateRegistration(MESSAGE_HEADER header, PATIENT_IDENTIFICATION pid, ClientStage stagedClient, ENCOUNTERS encounter) { return(new IndexClientMessage(header, new List <NEWCLIENT> { NEWCLIENT.Create(pid, encounter) }, stagedClient.ClientId)); }
private ENCOUNTERS buildEncounter(Encounter iEncounter, Patient iPatient) { ENCOUNTERS result = new ENCOUNTERS(); if (iPatient.Id.Length > 0) { // PERSON_ID result.PERSON_ID = iPatient.Id; // ADATE if (iEncounter.Period != null && iEncounter.Period.StartElement != null && iEncounter.Period.StartElement.ToDateTime() != null) { result.ADATE = iEncounter.Period.StartElement.ToDateTime().Value; // Check Encounter ID if (iEncounter.Id.Length > 0) { // ENC_ID result.ENC_ID = iEncounter.Id; // DDATE if (iEncounter.Period != null && iEncounter.Period.EndElement != null && iEncounter.Period.EndElement.ToDateTime() != null) { result.DDATE = iEncounter.Period.EndElement.ToDateTime().Value; } else { result.DDATE = null; } // PROVIDER result.PROVIDER = "UNKNOWN"; if (iEncounter.ServiceProvider != null && iEncounter.ServiceProvider.Identifier != null) { string id = iEncounter.ServiceProvider.Identifier.ToString(); Bundle provider = m_FhirClient.Search <Organization>(new string[] { "Identifier=" + id }); result.PROVIDER = provider.Id; } // ENC_COUNT result.ENC_COUNT = 1; if (iEncounter.PartOf != null) { result.ENC_COUNT = 1; } //DRG Information comes from the claim made from this encounter // DRG_VERSION result.DRG_VERSION = null; // DRG_VALUE result.DRG_VALUE = null; Bundle bClaims = m_FhirClient.Search <Claim>(new string[] { "encounter=" + iEncounter.Id }); foreach (var item in bClaims.Entry) { Claim tClaim = (Claim)item.Resource; foreach (var itemD in tClaim.Diagnosis) { //itemD.PackageCode.Coding. // DRG_VERSION result.DRG_VERSION = null; // DRG_VALUE result.DRG_VALUE = itemD.PackageCode.Text; } } // ENCTYPE foreach (var t in iEncounter.Type) { // ; } //result.ENCTYPE = iEncounter.Type; // ENCOUNTER_SUBTYPE //result.ENCOUNTER_SUBTYPE = ; // FACILITY_CODE string fc = "UNK"; foreach (var l in iEncounter.Location) { result.FACILITY_CODE = l.Location.Identifier.Value; //iEncounter. } result.FACILITY_CODE = fc; // DISCHARGE_DISPOSITION result.DISCHARGE_DISPOSITION = "U"; // DISCHARGE_STATUS result.DISCHARGE_STATUS = "UN"; // ADMITTING_SOURCE result.ADMITTING_SOURCE = "UN"; // DEPARTMENT result.DEPARTMENT = "UNK"; } else { // error this date is required log.Info("Patient: " + iPatient.Id + " encounter id is missing."); result = null; } } else { // error this date is required log.Info("Patient: " + iPatient.Id + " encounter date is missing."); result = null; } } else { // Invalid Patient ID log.Info("Error: Missing Patient ID"); result = null; } return(result); }
public List <FHIRPatientSummary> LoadVDW() { List <FHIRPatientSummary> results = new List <FHIRPatientSummary>(); log.Info("Start Importing Patients"); using (var context = new VDW_3_1_Entities()) { try { Bundle bundles = m_FhirClient.Search <Patient>(new string[] { "_count=100" }); // get all the patients from all the pages List <Patient> patients = new List <Patient>(); while (bundles != null) { foreach (Bundle.EntryComponent item in bundles.Entry) { Patient p = (Patient)item.Resource; patients.Add(p); } bundles = m_FhirClient.Continue(bundles); } m_ProgressBar.Maximum = patients.Count; m_ProgressBar.Step = 1; m_ProgressBar.Value = 0; int total = patients.Count; int cur = 1; foreach (var p in patients) { FHIRPatientSummary sum = new FHIRPatientSummary(); sum.PERSON_ID = p.Id; // build and save DEMOGRAPHIC record for patient DEMOGRAPHICS demo = buildDemographic(p); if (demo != null) { try { context.DEMOGRAPHICS.Add(demo); context.SaveChanges(); // build and save CENSUS_LOCATION records List <CENSUS_LOCATION> locs = buildGeocode(p); foreach (var loc in locs) { try { context.CENSUS_LOCATION.Add(loc); context.SaveChanges(); } catch (Exception ex) { log.Info("Error Census Location: " + ex.Message); } } // build and save Encounter records for patient try { Bundle encounters = m_FhirClient.Search <Encounter>(new string[] { "patient=" + p.Id }); foreach (var e_item in encounters.Entry) { Encounter e_temp = (Encounter)e_item.Resource; ENCOUNTERS tENCOUNTERS = buildEncounter(e_temp, p); if (tENCOUNTERS != null) { try { context.ENCOUNTERS.Add(tENCOUNTERS); context.SaveChanges(); } catch (Exception ex) { log.Info("Error Encounter: " + ex.Message); } } else { log.Info("Error Encounter: bad encounter record for patient " + p.Id); } } } catch (Exception ex) { log.Info("Error Encounter: " + ex.Message); } // build and save Diagnose records for patient try { Bundle diagnosis = m_FhirClient.Search <DiagnosticReport>(new string[] { "patient=" + p.Id }); foreach (var d_item in diagnosis.Entry) { DiagnosticReport tDiagnoses = null; ; } } catch (Exception ex) { log.Info("Error Diagnosis: " + ex.Message); } // build and save VITAL_SIGN records for patient try { Bundle o = m_FhirClient.Search <Observation>(new string[] { "patient=" + p.Id }); foreach (var tempD in o.Entry) { Observation obs = (Observation)tempD.Resource; foreach (CodeableConcept cc in obs.Category) { foreach (var code in cc.Coding) { if (code.Code == "vital-signs") { sum.VitalSignTotalCount++; } } } } } catch (Exception ex) { log.Info("Error Vital Sign: " + ex.Message); } } catch (Exception ex) { log.Info("Error: " + ex.Message); } } else { log.Info("Error in patient: " + p.Id); } // Location Count sum.LocationTotalCount = p.Address.Count; // Encounter Count Bundle en = m_FhirClient.Search <Encounter>(new string[] { "patient=" + p.Id }); sum.EncounterTotalCount = en.Entry.Count; // Diagnoses Count Bundle d = m_FhirClient.Search <DiagnosticReport>(new string[] { "patient=" + p.Id }); sum.DiagnosesTotalCount = d.Entry.Count; results.Add(sum); cur++; m_ProgressBar.Value = m_ProgressBar.Value + 1; } log.Info("Number of Patients " + results.Count.ToString()); log.Info("End Importing Patients"); } catch (Exception ex) { log.Info("Error: " + ex.Message); } } return(results); }