using System; using System.Collections.Generic; using System.Linq; using System.Text; using Pluto.Api; using McKesson.PPS.Fusion.Authentication.Business; using McKesson.PPS.Fusion.MedsAllergies.Business; using McKesson.PPS.Fusion.ProblemsProcedures.Business; using McKesson.PPS.Fusion.OrderEntry.Business; using McKesson.PPS.Fusion.Labs.Business; using McKesson.PPS.Fusion.PatientBanner.Business; using McKesson.PPS.Fusion.Persons.Business; using McKesson.PPS.Fusion.VitalSigns.Business; using McKesson.PPS.Fusion.ProgressNotes.Business; namespace PlutoServer.PracticeChoice.Core { public class Patient { public ChartInfo1 GetChart(string authToken, int patientId, int chartId) { ChartInfo1 chartInfo = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; chartInfo = new ChartInfo1(); chartInfo.Patient = new PatientInfo1(); var personInfo = McKesson.PPS.Fusion.Persons.Business.PersonInfo.GetPersonInfo(new PersonInfoCriteria() { PersonID = patientId }); if(personInfo != null) { chartInfo.Patient.ChartId = chartId; chartInfo.Patient.DOB = personInfo.DateOfBirth.Value; chartInfo.Patient.FirstName = personInfo.FirstName; chartInfo.Patient.Id = personInfo.Id; chartInfo.Patient.LastName = personInfo.LastName; chartInfo.Patient.PrimaryAddress = new AddressInfo1() { Address1 = personInfo.PersonAddress.Address1, Address2 = personInfo.PersonAddress.Address2, City = personInfo.PersonAddress.City, Country = personInfo.PersonAddress.Country.Value, State = personInfo.PersonAddress.State.Value, Zip = personInfo.PersonAddress.Zip }; chartInfo.Patient.PrimaryPhone = this.GetDefaultPhoneNumber(personInfo); } var piCriteria = new PatientInfoCriteria() { ChartID = chartId }; var pi = PatientInfo.GetPatientInfo(piCriteria); if(pi != null) { chartInfo.Patient.Age = pi.Age; chartInfo.Patient.ChartId = chartId; chartInfo.Patient.Gender = pi.Gender; chartInfo.Patient.Weight = pi.Weight; } var problems = this.GetPatientProblems(chartId); if(problems != null) { chartInfo.Problems = problems.ToArray(); } var meds = this.GetPatientMeds(chartId); if(meds != null) { chartInfo.Medications = meds.ToArray(); } var allergies = this.GetPatientAllergies(chartId); if(allergies != null) { chartInfo.Allergies = allergies.ToArray(); } var orders = this.GetPatientOrders(chartId); if(orders != null) { chartInfo.Orders = orders.ToArray(); } var results = this.GetPatientResults(chartId, 1, 5); if(results != null) { chartInfo.Results = results.ToArray(); } var vitalSigns = this.GetPatientVitalSigns(chartId, patientId); if(vitalSigns != null) { chartInfo.VitalSigns = vitalSigns.ToArray(); } var notes = this.GetPatientNotes(patientId, chartId); if(notes != null) { chartInfo.Notes = notes.ToArray(); } } return chartInfo; } private string GetDefaultPhoneNumber(McKesson.PPS.Fusion.Persons.Business.PersonInfo personInfo) { var phoneNbr = string.Empty; if(!string.IsNullOrEmpty(personInfo.PhoneEvening)){ phoneNbr = personInfo.PhoneEvening; }else if(!string.IsNullOrEmpty(personInfo.PhoneDayTime)){ phoneNbr = personInfo.PhoneDayTime; } else if (!string.IsNullOrEmpty(personInfo.PhoneCell)){ phoneNbr = personInfo.PhoneCell; } return phoneNbr; } public IList GetMedications(string authToken, int chartId) { IList medsList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; medsList = this.GetPatientMeds(chartId); } return medsList; } private IList GetPatientMeds(int chartId) { IList medsList = null; var criteria = new MedsFetchByChartIDCriteria(chartId); var meds = MedicationList.GetMedicationList(criteria); if(meds != null) { medsList = new List(); foreach(var med in meds) { medsList.Add(new PrescribedMedicationInfo1() { Id = med.MedicationId, IsActive = med.IsActive, Mode = med.Mode, Name = med.MedicationName, NumberOfRefills = med.Refills, PharmacyAddress = med.PharmacyAddress, PharmacyFax = med.PharmacyFax, PharmacyName = med.PharmacyName, PharmacyPhone = med.PharmacyPhone, ProviderId = med.ProviderId, ProviderName = med.ProviderName, Quantity = med.Quantity, SIG = med.SIG, StartDate = med.StartDate, Status = med.Status.Value, StopDate = med.StartDate, Unit = med.Unit }); } } return medsList; } public IList GetAllergies(string authToken, int chartId) { IList allergyList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; allergyList = this.GetPatientAllergies(chartId); } return allergyList; } private IList GetPatientAllergies(int chartId) { IList allergyList = null; var allergies = AllergyInfoList.GetAllergyList(chartId); if(allergies != null) { allergyList = new List(); foreach(var allergy in allergies) { allergyList.Add(new AllergyInfo1() { EndDate = allergy.EndDate.HasValue ? allergy.EndDate.Value : DateTime.MinValue, Id = allergy.AllergyID, IsActive = allergy.IsActive, Name = allergy.AllergyName, Reaction = allergy.AllergyReactionName, Severity = allergy.AllergySeverityName, StartDate = allergy.StartDate.HasValue ? allergy.StartDate.Value : DateTime.MinValue, Type = allergy.AllergyTypeName }); } } return allergyList; } public IList GetProblems(string authToken, int chartId) { IList problemList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; problemList = this.GetPatientProblems(chartId); } return problemList; } private IList GetPatientProblems(int chartId) { IList problemList = null; var problems = DiagnosisInfoList.GetDiagnosisList(new Csla.SingleCriteria(chartId)); if(problems != null) { problemList = new List(); foreach(var problem in problems) { problemList.Add(new ProblemInfo1() { ActiveDate = problem.ActiveDT, Code = problem.DiagnosisCode, Description = problem.DiagnosisDescription, Id = problem.Id, InActiveDate = problem.InactiveDT, Relevance = problem.RelevanceText, ResolvedDate = problem.ResolvedDate.HasValue ? problem.ResolvedDate.Value : DateTime.MinValue, Status = problem.StatusDescription, Type = problem.DiagnosisTypeName }); } } return problemList; } public IList GetProcedures(string authToken, int chartId) { IList procedureList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var procedures = ProcedureList.GetProcedureList(new Csla.SingleCriteria(chartId)); if(procedures != null) { procedureList = new List(); foreach(var procedure in procedures) { procedureList.Add(new ProcedureInfo1() { Code = procedure.ProcedureCode, Description = procedure.ProcedureDescription, Id = procedure.ProcedureId, IsPerformedElsewhere = procedure.PerformedElsewhere, Modifier1 = procedure.Modifier1, Modifier2 = procedure.Modifier2, Modifier3 = procedure.Modifier3, Modifier4 = procedure.Modifier4 }); } } } return procedureList; } private IList GetPatientOrders(int chartId) { IList orderList = null; var criteria = new McKesson.PPS.Fusion.OrderEntry.Business.ReadOnlyPatientOrderListCriteria() { ChartId = chartId, PageIndex = -1, // to compensate for stupid code in PracticeChoice OrderDal.cs CreateGetPatientOrdersCommand PageSize = 5 }; var orders = McKesson.PPS.Fusion.OrderEntry.Business.ReadOnlyPatientOrderList.GetReadOnlyPatientOrderList(criteria); if(orders != null) { orderList = new List(); foreach(var order in orders) { orderList.Add(new OrderInfo1() { CompletedDate = order.DateCompleted, HasLabs = order.HasLab, Id = order.PatientOrderId, Name = order.OrderName, OrderDate = order.OrderDate, ProviderName = order.ProviderName, Status = order.OrderStatus.Value, Type = order.OrderTypeName }); } } return orderList; } public IList GetResults(string authToken, int chartId, int pageIndex, int pageSize) { IList resultList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; resultList = this.GetPatientResults(chartId, pageIndex, pageSize); } return resultList; } public IList GetVitalSigns(string authToken, int chartId, int patientId) { IList vsList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; vsList = this.GetPatientVitalSigns(chartId, patientId); } return vsList; } public IList GetNotes(string authToken, int patientId, int chartId) { IList notesList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; notesList = this.GetPatientNotes(patientId, chartId); } return notesList; } private IList GetPatientResults(int chartId, int pageIndex, int pageSize) { IList resultList = null; var criteria = new LabResultCriteria() { ChartId = chartId, PageIndex = pageIndex, PageSize = pageSize }; var results = LabResultsOBRList.GetLabResultList(criteria); if(results != null) { resultList = new List(); foreach(var result in results) { result.LabResultsOBXes = LabEntryList.GetLabEntryList(result.LabResultsOBRId); var resultDetails = this.GetResultDetails(result); resultList.Add(new ResultInfo1() { CodingSystem = result.ObservationCodingSystem, DateReviewed = result.DateReviewed.HasValue ? result.DateReviewed.Value : DateTime.MinValue, DateSigned = result.DateSigned.HasValue ? result.DateSigned.Value : DateTime.MinValue, Id = result.LabResultsOBRId, IsReviewed = result.IsReviewed, IsSigned = result.IsSigned, Note = result.Note, OrderedBy = result.OrderedBy, PerformingCenter = new PerformingCenterInfo1() { }, ResultDate = result.Date, ResultDetails = resultDetails == null? null : resultDetails.ToArray(), Status = result.LabStatusName, TestId = result.ObservationBatteryId, TestName = result.ObservationBatteryText, Type = result.LabTypeName }); } } return resultList; } private IList GetResultDetails(LabResultsOBR result) { IList resultDetailsList = null; if(result.LabResultsOBXes != null) { resultDetailsList = new List(); foreach(var obx in result.LabResultsOBXes) { resultDetailsList.Add(new ResultDetailInfo1() { AbnormalFlag = obx.AbnormalFlag, CodingSystem = obx.ObservationCodingSystem, Id = obx.LabResultsOBXId.HasValue?obx.LabResultsOBXId.Value:0, Note = obx.Note, ObservationDate = obx.ObservationDateTime.HasValue?obx.ObservationDateTime.Value:DateTime.MinValue, ObservationId = obx.ObservationIdentifier, ObservationText = obx.ObservationText, ObservationValue = obx.ObservationValue, ReferenceRange = obx.ReferenceRange, Sequence = obx.OBXSequenceNumber, Status = obx.LabResultsStatusName, Units = obx.ObservationUnits }); } } return resultDetailsList; } private IList GetPatientVitalSigns(int chartId, int patientId) { IList vitalSignsList = null; bool isMetricMode = false; var vitalSigns = VitalSignsList.GetVitalSignsList(new VitalSignCriteria(chartId, null, isMetricMode)); if(vitalSigns != null) { vitalSignsList = new List(); foreach(var vs in vitalSigns) { vitalSignsList.Add(new VitalSignInfo1() { BMI = vs.BMI.HasValue?vs.BMI.Value:0, BPCuffSize = vs.BPCuffSize == null?string.Empty: vs.BPCuffSize.Value, BPSite = vs.BPSiteOfMeasurementType == null? string.Empty:vs.BPSiteOfMeasurementType.Value, Comment = vs.Comment, Diastolic = vs.Diastolic.HasValue?vs.Diastolic.Value:0, EncounterDate = vs.EncounterDate.HasValue? vs.EncounterDate.Value:DateTime.MinValue, ExamDate = vs.ExamDate.HasValue? vs.ExamDate.Value:DateTime.MinValue, HeadCircumference = vs.HeadCircumferenceString, HeadCircumferenceEnglish = string.Empty, Height = vs.HeightString, HeightEnglish = string.Empty, Id = vs.Id, IsMetricMode = vs.IsMetricMode, O2Saturation = vs.O2Liters.HasValue?vs.O2Liters.Value:0, Oximetry = vs.Oximetry.HasValue?vs.Oximetry.Value:0, OxymetrySource = vs.OximetrySourceType == null? string.Empty:vs.OximetrySourceType.Value, PainLevel = vs.PainLevel.HasValue?vs.PainLevel.Value:0, PluseRhythmType = vs.PulseRhythmType == null? string.Empty:vs.PulseRhythmType.Value, PosturalLaying = vs.PosturalLying, PosturalSitting = vs.PosturalSitting, PosturalStanding = vs.PosturalStanding, PostureType = vs.PostureType == null? string.Empty:vs.PostureType.Value, PulseRate = vs.PulseRate.HasValue?vs.PulseRate.Value:0, PulseSite = vs.PulseSiteOfMeasurementType == null? string.Empty:vs.PulseSiteOfMeasurementType.Value, PulseVolumeType = vs.PulseVolumeType == null? string.Empty:vs.PulseVolumeType.Value, RespirationRhythmType = vs.RespirationRhythmType == null? string.Empty:vs.RespirationRhythmType.Value, Respirations = vs.Respirations.HasValue?vs.Respirations.Value:0, RespirationsDepth = vs.RespirationsDepthType == null? string.Empty:vs.RespirationsDepthType.Value, Systolic = vs.Systolic.HasValue?vs.Systolic.Value:0, Temperature = vs.TemperatureString, TemperatureEnglish = vs.TemperatureEnglishString, TemperatureSite = vs.TemperatureSiteOfMeasurementType == null? string.Empty:vs.TemperatureSiteOfMeasurementType.Value, Weight = vs.WeightString, WeightEnglish = vs.WeightEnglishString }); } } return vitalSignsList; } private IList GetPatientNotes(int patientId, int chartId) { IList notesList = null; var notes = ProgressNoteList.GetProgressNoteList(new ProgressNoteSearchCriteria() { ChartId = chartId }); if(notes != null) { notesList = new List(); notesList = (from note in notes where note.NoteTypeId == 3 select new PatientNoteInfo1(){ ChartId = chartId, Id = note.NoteId, NoteText = note.NoteOriginalText, Status = note.NoteStatusName, Title = note.NoteTitle, Type = note.NoteTypeName }).ToList(); } return notesList; } public void AddPatientNote(string authToken, int patientId, int chartId, PatientNoteInfo1 patientNote) { MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var newNote = EditableProgressNote.NewProgressNote(); newNote.NoteTitle = patientNote.Title; newNote.NoteText = GetClinicalNote(patientNote.NoteText); //TODO: Remove these hard coding. Phulease newNote.NoteStatusId = McKesson.PPS.Fusion.ProgressNotes.Shared.NoteStatusEnum.SAVE; newNote.NoteTypeId = 3; // Phone Note newNote.CreatedBy = identity.PersonId; newNote.ProviderID = identity.PersonId; // OK this is silly. Why should I set the PatientId property to chartId? // Bug in Progress Notes module. The call to AuditLog is passed in the PatientId // However, the method AuditLog.LogByChartId expects a chartId newNote.PatientId = chartId; newNote.Save(); } } private string GetClinicalNote(string note) { return string.Format("
{0}
", note); } } }