// (0)DOE, JOHN ~(1)25731~(2)SPRINGFIELD RETIREMENT CASTLE~(3)~(4)2~(5)201~(6)13~(7)68180041109~(8)AVAPRO 150 MG TABLET~(9)IRBESARTAN 150 MG TABLET~(10)20170204~0730~1~~MICHELLE SMITH ~8880440~INFORME piel o reaccion alergica.~NO conducir si mareado o vision borrosa.~TAKE 1 TABLET DAILY IN THE MORNING ~~~~M~00~28~8880440_00_25/28~ /// <summary> /// <c>Go</c> /// </summary> /// Built as a bridge interface to BestRx, the method reads a Parada packing machine file and pulls out as /// much useable information as it can ad pushes it into the DB. It's too lightweight to be considered a /// true interface, but can be used in a pinch. public void Go() { var rows = Data.Split('\n'); var lastScrip = string.Empty; var lastDoseQty = string.Empty; var lastDoseTime = string.Empty; var firstScrip = true; var committed = false; var doseTimes = new List <string>(); var nameVersion = 1; var scrip = new MotPrescriptionRecord("Add", AutoTruncate); var patient = new MotPatientRecord("Add", AutoTruncate); var facility = new MotFacilityRecord("Add", AutoTruncate); var drug = new MotDrugRecord("Add", AutoTruncate); var practitioner = new MotPrescriberRecord("Add", AutoTruncate); var writeQueue = new MotWriteQueue(); patient.LocalWriteQueue = scrip.LocalWriteQueue = facility.LocalWriteQueue = practitioner.LocalWriteQueue = drug.LocalWriteQueue = writeQueue; patient.QueueWrites = scrip.QueueWrites = facility.QueueWrites = practitioner.QueueWrites = drug.QueueWrites = true; writeQueue.SendEof = false; // Has to be off so we don't lose the socket. writeQueue.DebugMode = DebugMode; try { foreach (var row in rows) // This will generate new records for every row - need to optimize { if (row.Length > 0) // --- The latest test file has a trailing "\r" and a messed up drug name, need to address both { var rawRecord = row.Split('~'); // There's no guarantee that each field has data but the count is right if (lastScrip != rawRecord[15]) // Start a new scrip { if (firstScrip == false) // Commit the previous scrip { if (doseTimes.Count > 1) { // Build and write TQ Record var tq = new MotTimesQtysRecord("Add", AutoTruncate) { // New name DoseScheduleName = facility.LocationName?.Substring(0, 3) + nameVersion }; nameVersion++; // Fill the record tq.LocationID = patient.LocationID; tq.DoseTimesQtys = scrip.DoseTimesQtys; // Assign the DoseSchcedulw name to the scrip & clear the scrip DoseTimeSchedule scrip.DoseScheduleName = tq.DoseScheduleName; scrip.DoseTimesQtys = ""; // Write the record tq.LocalWriteQueue = writeQueue; tq.AddToQueue(); } Console.WriteLine($"Committing on Thread {Thread.CurrentThread.Name}"); scrip.Commit(GatewaySocket); // ReSharper disable once RedundantAssignment committed = true; practitioner.Clear(); facility.Clear(); drug.Clear(); patient.Clear(); scrip.Clear(); } firstScrip = committed = false; lastScrip = rawRecord[15]; doseTimes.Clear(); var names = rawRecord[0].Split(','); patient.LastName = (names[0] ?? "Warning[PFN]").Trim(); patient.FirstName = (names[1] ?? "Warning[PLN]").Trim(); if (rawRecord[2].Length >= 4) { patient.LocationID = rawRecord[2]?.Trim()?.Substring(0, 4); } patient.PatientID = rawRecord[1]; patient.Room = rawRecord[4]; patient.Address1 = ""; patient.Address2 = ""; patient.City = ""; patient.State = "NH"; patient.Zipcode = ""; patient.Status = 1; facility.LocationName = rawRecord[2]; facility.Address1 = ""; facility.Address2 = ""; facility.City = ""; facility.State = "NH"; facility.Zipcode = ""; if (rawRecord[2].Length >= 4) { facility.LocationID = rawRecord[2]?.Trim()?.Substring(0, 4); } drug.NDCNum = rawRecord[7]; drug.DrugID = rawRecord[7]; if (drug.NDCNum == "0") { // It's something goofy like a compound; ignore it EventLogger.Warn($"Ignoring thig with NDC == 0 named {rawRecord[8]}"); continue; //__scrip.ChartOnly = "1"; //__drug.NDCNum = "00000000000"; //var __rand = new Random(); //__drug.RxSys_DrugID = __rand.Next().ToString(); //__drug.DefaultIsolate = 1; } // // Some funny stuff happens here as the umber of items from the split is varible - we've seen 2,3,4, & 5 // Examples // -- Trade And Generic Pair - Each 4 items, same format {[name][strength][unit][route]} // AVAPRO 150 MG TABLE // IRBESARTAN 150 MG TABLET // // -- Trade and Generic Name - 4 items for each but different strength formats // CRESTOR 10 MG TABLET // ROSUVASTATIN TB 10MG 30 // // -- Trade and Generic Name - 4 items for trade, 5 for Generic // ZOLOFT 100 MG TABLET // SERTRALINE HCL 100 MG TABLET // // -- Trade and Generic Name - 6 items for Trade, 5 for Generic // 500 + D 500-200 MG-IU TABLET // OYSTER SHELL CALCIUM 500-200 MG // // Another Trade and Genmeric Name with 4 items for the Trade and 5 for the generic // FOSAMAX 35 MG TABLET // ALENDRONATE SODIUM 35 MG TABLET // // Note that it's also only required to have one or the other, not both // // // Push everything down into a structure and have it return a struct defining both string tempTradeName = string.Empty; if (DrugName.ParseExact(rawRecord[8])) { drug.TradeName = drug.DrugName = $"{DrugName.Name} {DrugName.Strength} {DrugName.Unit} {DrugName.Form}"; drug.ShortName = $"{DrugName.Name} {DrugName.Strength} {DrugName.Unit}"; drug.Unit = DrugName.Unit; drug.Strength = Convert.ToDouble(DrugName.Strength ?? "0.00"); drug.DoseForm = DrugName.Form; tempTradeName = $"{DrugName.Name} {DrugName.Strength} {DrugName.Unit} {DrugName.Form}"; } if (DrugName.ParseExact(rawRecord[9])) { drug.TradeName = drug.DrugName = $"{DrugName.Name} {DrugName.Strength} {DrugName.Unit} {DrugName.Form}"; drug.ShortName = $"{DrugName.Name} {DrugName.Strength} {DrugName.Unit}"; drug.Unit = DrugName.Unit; drug.Strength = Convert.ToDouble(DrugName.Strength ?? "0.00"); drug.DoseForm = DrugName.Form; drug.GenericFor = tempTradeName; } if (!string.IsNullOrEmpty(rawRecord[9]) && string.IsNullOrEmpty(drug.TradeName)) { drug.DrugName = drug.TradeName = rawRecord[9] ?? "Unknown"; } string[] practitionerName = rawRecord[14].Split(' '); practitioner.FirstName = (practitionerName[0] ?? "Warning[DFN]").Trim(); practitioner.LastName = (practitionerName[1] ?? "Warning[DLN]").Trim(); practitioner.Address1 = ""; practitioner.Address2 = ""; practitioner.City = ""; practitioner.State = "NH"; practitioner.Zipcode = ""; try { switch (practitionerName.Length) { case 2: if (practitionerName[0].Length >= 3 && practitionerName[1].Length >= 3) { practitioner.PrescriberID = practitionerName[0]?.Trim()?.Substring(0, 3) + practitionerName[1]?.Trim()?.Substring(0, 3); } practitioner.FirstName = (practitionerName[0] ?? "Warning[DFN]").Trim(); practitioner.LastName = (practitionerName[1] ?? "Warning[DLN]").Trim(); break; case 3: if (practitionerName[1].Length >= 3 && practitionerName[2].Length >= 3) { practitioner.PrescriberID = practitionerName[0]?.Trim()?.Substring(0, 3) + practitionerName[2]?.Trim()?.Substring(0, 3); } practitioner.FirstName = practitionerName[0]?.Trim(); practitioner.MiddleInitial = practitionerName[1].Trim(); practitioner.LastName = practitionerName[2]?.Trim(); break; default: practitioner.PrescriberID = new Random(40000).ToString(); break; } } catch { practitioner.PrescriberID = new Random(60000).ToString(); } patient.PrimaryPrescriberID = practitioner.PrescriberID; scrip.PrescriptionID = rawRecord[15]; scrip.PatientID = patient.PatientID; scrip.PrescriberID = patient.PrimaryPrescriberID; scrip.Status = 1; scrip.RxStartDate = string.IsNullOrEmpty(rawRecord[10]) ? DateTime.Now : scrip.TransformDate(rawRecord[10] ?? ""); if (rawRecord[11] != null && rawRecord[12] != null) { scrip.DoseTimesQtys = $"{Convert.ToInt32(rawRecord[11]):0000}{Convert.ToDouble(rawRecord[12]):00.00}"; } scrip.QtyPerDose = Convert.ToDouble(rawRecord[12] ?? "0.00"); scrip.QtyDispensed = Convert.ToDouble(rawRecord[24] ?? "0.00"); scrip.Sig = $"{rawRecord[18]}\n{rawRecord[19]}\n{rawRecord[20]}"; scrip.Comments = $"{rawRecord[16]}\n{rawRecord[17]}"; scrip.Refills = Convert.ToInt32(rawRecord[23] ?? "0"); scrip.DrugID = drug.NDCNum; scrip.RxType = rawRecord[22].Trim().ToUpper() == "P" ? 2 : 1; lastDoseTime = rawRecord[11]; lastDoseQty = rawRecord[12]; doseTimes.Add(lastDoseTime); practitioner.AddToQueue(); patient.AddToQueue(); facility.AddToQueue(); drug.AddToQueue(); scrip.AddToQueue(); } else { if (lastDoseTime != rawRecord[11] || lastDoseQty != rawRecord[12]) { if (!doseTimes.Contains(rawRecord[11])) // Create a new TQ Dose Schedule here!! { // Kludge if (rawRecord[11] != null) { var tempTest = $"{Convert.ToInt32(rawRecord[11]):0000}"; if (tempTest.Substring(2, 2) == "15" || tempTest.Substring(2, 2) == "45") { tempTest = tempTest.Replace(tempTest.Substring(2, 2), "00"); scrip.DoseTimesQtys += $"{tempTest}{Convert.ToDouble(rawRecord[12]):00.00}"; } else { scrip.DoseTimesQtys += $"{Convert.ToInt32(rawRecord[11]):0000}{Convert.ToDouble(rawRecord[12]):00.00}"; } } lastDoseQty = rawRecord[12]; lastDoseTime = rawRecord[11]; doseTimes.Add(lastDoseTime); } } } } else { // Fell through to here because the row length was 0 if (committed) { continue; } scrip.Commit(GatewaySocket); committed = true; } } } catch (Exception ex) { EventLogger.Error($"Error parsing Parada record {Data}: {ex.Message}"); throw; } }
public void ReadPatientRecords() { try { // Load the translaton table -- Database Column Name to Gateway Tag Name TranslationTable.Add("Patient_ID", "RxSys_PatID"); TranslationTable.Add("Patient_Location_Code", "RxSys_LocID"); TranslationTable.Add("Primary_Prescriber_ID", "RxSys_PrimaryDoc"); TranslationTable.Add("Last_Name", "LastName"); TranslationTable.Add("First_Name", "FirstName"); TranslationTable.Add("Middle_Initial", "MiddleInitial"); TranslationTable.Add("Address_Line_1", "Address1"); TranslationTable.Add("Address_Line_2", "Address1"); TranslationTable.Add("City", "City"); TranslationTable.Add("State_Code", "State"); TranslationTable.Add("Zip_Code", "Zip"); TranslationTable.Add("Zip_Plus_4", "Zip_Plus_4"); TranslationTable.Add("Telephone_Number", "Phone1"); TranslationTable.Add("Area_Code", "AreaCode"); TranslationTable.Add("Extension", "WorkPhone"); TranslationTable.Add("SSN", "SSN"); TranslationTable.Add("Birth_Date", "DOB"); // SqlDateTime TranslationTable.Add("Deceased_Date", "Comments"); // SqlDateTime TranslationTable.Add("Sex", "Gender"); // Search for the patient // Load Patient Record // Search for vPatientAlergyc by Patient_ID - returns {0...1} records // Update Patient Record // Search for vPatientDiagnosis by Patient_ID - returns {0...1} records // Update Patient Record // Search for vPatientNote by Patient_ID - returns {0...1} records // Update Patient Record // Write Patient Record var tmpPhone = string.Empty; var tmpZip = string.Empty; var patientId = string.Empty; var recordSet = Db.ExecuteQuery($"SELECT * FROM vPatient WHERE MSSQLTS > '{LastTouch}';"); if (ValidTable(recordSet)) { foreach (DataRow record in recordSet.Tables[0].Rows) { if ((long)record["MSSQLTS"] > LastTouch) { LastTouch = (long)record["MSSQLTS"]; } // Print the DataType of each column in the table. foreach (DataColumn column in record.Table.Columns) { if (TranslationTable.TryGetValue(column.ColumnName, out var tmp)) { var tag = tmp; var val = record[column.ColumnName].ToString(); switch (column.ColumnName) { case "Patient_ID": patientId = val; break; // Merge Zip Code case "Zip_Code": tmpZip = val; continue; case "Zip_Plus_4": tmpZip += val; val = tmpZip; break; // Merge Phone Number case "Area_Code": tmpPhone = val; continue; case "Telephone_Number": tmpPhone += val; val = tmpPhone; break; case "Birth_Date": val = NormalizeDate(val); break; default: break; } _patient.SetField(tag, val, true); } // Now get the note fields GetAllergies(patientId); GetDiagnosis(patientId); GetNotes(patientId); // Finally, write the recort to the Gateway try { Mutex.WaitOne(); using (var gw = new TcpClient(GatewayIp, GatewayPort)) { using (var stream = gw.GetStream()) { _patient.Write(stream); } } Mutex.ReleaseMutex(); } catch (Exception ex) { EventLogger.Error($"Failed reading patient record: {ex.Message}"); throw; } finally { Mutex.ReleaseMutex(); } _patient.Clear(); } } } } catch (Exception ex) { throw new Exception($"Failed to get Patient Record {ex.Message}"); } }