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));
 }
Example #5
0
        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);
        }
Example #6
0
        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);
        }