//public static void ProcessPD1() { // return; //} public static void ProcessPID(Patient pat, HL7DefSegment segDef, SegmentHL7 seg) { for (int i = 0; i < segDef.hl7DefFields.Count; i++) { int itemOrder = segDef.hl7DefFields[i].OrdinalPos; switch (segDef.hl7DefFields[i].FieldName) { case "pat.addressCityStateZip": pat.Address = seg.GetFieldComponent(itemOrder, 0); pat.Address2 = seg.GetFieldComponent(itemOrder, 1); pat.City = seg.GetFieldComponent(itemOrder, 2); pat.State = seg.GetFieldComponent(itemOrder, 3); pat.Zip = seg.GetFieldComponent(itemOrder, 4); continue; case "pat.birthdateTime": pat.Birthdate = FieldParser.DateTimeParse(seg.GetFieldComponent(itemOrder)); continue; case "pat.ChartNumber": pat.ChartNumber = seg.GetFieldComponent(itemOrder); continue; case "pat.Gender": pat.Gender = FieldParser.GenderParse(seg.GetFieldComponent(itemOrder)); continue; case "pat.HmPhone": pat.HmPhone = FieldParser.PhoneParse(seg.GetFieldComponent(itemOrder)); continue; case "pat.nameLFM": pat.LName = seg.GetFieldComponent(itemOrder, 0); pat.FName = seg.GetFieldComponent(itemOrder, 1); pat.MiddleI = seg.GetFieldComponent(itemOrder, 2); continue; case "pat.PatNum": if (pat.PatNum != 0 && pat.PatNum != PIn.Long(seg.GetFieldComponent(itemOrder))) { throw new Exception("Invalid PatNum"); } continue; case "pat.Position": pat.Position = FieldParser.MaritalStatusParse(seg.GetFieldComponent(itemOrder)); continue; case "pat.Race": PatientRaceOld patientRaceOld = FieldParser.RaceParse(seg.GetFieldComponent(itemOrder)); //Converts deprecated PatientRaceOld enum to list of PatRaces, and adds them to the PatientRaces table for the patient. PatientRaces.Reconcile(pat.PatNum, PatientRaces.GetPatRacesFromPatientRaceOld(patientRaceOld)); continue; case "pat.SSN": pat.SSN = seg.GetFieldComponent(itemOrder); continue; case "pat.WkPhone": pat.WkPhone = FieldParser.PhoneParse(seg.GetFieldComponent(itemOrder)); continue; case "pat.FeeSched": if (Programs.IsEnabled(ProgramName.eClinicalWorks) && ProgramProperties.GetPropVal(ProgramName.eClinicalWorks, "FeeSchedulesSetManually") == "1") { //if using eCW and FeeSchedulesSetManually continue; //do not process fee sched field, manually set by user } else { pat.FeeSched = FieldParser.FeeScheduleParse(seg.GetFieldComponent(itemOrder)); } continue; default: continue; } } return; }
///<summary>If relationship is self, this method does nothing. A new pat will later change guarantor to be same as patnum. </summary> public static void ProcessGT1(Patient pat, HL7DefSegment segDef, SegmentHL7 seg) { //Find the position of the guarNum, guarChartNum, guarName, and guarBirthdate in this HL7 segment based on the definition of a GT1 int guarPatNumOrdinal = -1; int guarChartNumOrdinal = -1; int guarNameOrdinal = -1; int guarBirthdateOrdinal = -1; for (int i = 0; i < segDef.hl7DefFields.Count; i++) { if (segDef.hl7DefFields[i].FieldName == "guar.PatNum") { guarPatNumOrdinal = segDef.hl7DefFields[i].OrdinalPos; } if (segDef.hl7DefFields[i].FieldName == "guar.ChartNumber") { guarChartNumOrdinal = segDef.hl7DefFields[i].OrdinalPos; } if (segDef.hl7DefFields[i].FieldName == "guar.nameLFM") { guarNameOrdinal = segDef.hl7DefFields[i].OrdinalPos; } if (segDef.hl7DefFields[i].FieldName == "guar.birthdateTime") { guarBirthdateOrdinal = segDef.hl7DefFields[i].OrdinalPos; } } //If neither guar.PatNum nor guar.ChartNumber are included in this GT1 definition log a message in the event log and return if (guarPatNumOrdinal == -1 && guarChartNumOrdinal == -1) { HL7MsgCur.Note = "Guarantor not processed. guar.PatNum or guar.ChartNumber must be included in the GT1 definition. PatNum of patient:" + pat.PatNum.ToString(); HL7Msgs.Update(HL7MsgCur); EventLog.WriteEntry("OpenDentHL7", "Guarantor not processed. guar.PatNum or guar.ChartNumber must be included in the GT1 definition. PatNum of patient:" + pat.PatNum.ToString() , EventLogEntryType.Information); return; } //If guar.nameLFM is not included in this GT1 definition log a message in the event log and return if (guarNameOrdinal == -1) { HL7MsgCur.Note = "Guarantor not processed due to guar.nameLFM not included in the GT1 definition. Patnum of patient:" + pat.PatNum.ToString(); HL7Msgs.Update(HL7MsgCur); EventLog.WriteEntry("OpenDentHL7", "Guarantor not processed due to guar.nameLFM not included in the GT1 definition. Patnum of patient:" + pat.PatNum.ToString() , EventLogEntryType.Information); return; } //If the first or last name are not included in this GT1 segment, log a message in the event log and return if (seg.GetFieldComponent(guarNameOrdinal, 0) == "" || seg.GetFieldComponent(guarNameOrdinal, 1) == "") { HL7MsgCur.Note = "Guarantor not processed due to missing first or last name. PatNum of patient:" + pat.PatNum.ToString(); HL7Msgs.Update(HL7MsgCur); EventLog.WriteEntry("OpenDentHL7", "Guarantor not processed due to missing first or last name. PatNum of patient:" + pat.PatNum.ToString() , EventLogEntryType.Information); return; } //Only process GT1 if either guar.PatNum or guar.ChartNumber is included and both guar.LName and guar.FName are included long guarPatNum = 0; string guarChartNum = ""; if (guarPatNumOrdinal != -1) { guarPatNum = PIn.Long(seg.GetFieldFullText(guarPatNumOrdinal)); } if (guarChartNumOrdinal != -1) { guarChartNum = seg.GetFieldComponent(guarChartNumOrdinal); } if (guarPatNum == 0 && guarChartNum == "") //because we have an example where they sent us this (position 2 (guarPatNumOrder or guarChartNumOrder for eCW) is empty): GT1|1||^^||^^^^|||||||| { HL7MsgCur.Note = "Guarantor not processed due to missing both guar.PatNum and guar.ChartNumber. One of those numbers must be included. PatNum of patient:" + pat.PatNum.ToString(); HL7Msgs.Update(HL7MsgCur); EventLog.WriteEntry("OpenDentHL7", "Guarantor not processed due to missing both guar.PatNum and guar.ChartNumber. One of those numbers must be included. PatNum of patient:" + pat.PatNum.ToString() , EventLogEntryType.Information); return; } if (guarPatNum == pat.PatNum || guarChartNum == pat.ChartNumber) //if relationship is self { return; } //Guar must be someone else Patient guar = null; Patient guarOld = null; //Find guarantor by guar.PatNum if defined and in this segment if (guarPatNum != 0) { guar = Patients.GetPat(guarPatNum); } else //guarPatNum was 0 so try to get guar by guar.ChartNumber or name and birthdate //try to find guarantor using chartNumber { guar = Patients.GetPatByChartNumber(guarChartNum); if (guar == null) { //try to find the guarantor by using name and birthdate string guarLName = seg.GetFieldComponent(guarNameOrdinal, 0); string guarFName = seg.GetFieldComponent(guarNameOrdinal, 1); DateTime guarBirthdate = FieldParser.DateTimeParse(seg.GetFieldFullText(guarBirthdateOrdinal)); long guarNumByName = Patients.GetPatNumByNameAndBirthday(guarLName, guarFName, guarBirthdate); if (guarNumByName == 0) //guarantor does not exist in OD //so guar will still be null, triggering creation of new guarantor further down. { } else { guar = Patients.GetPat(guarNumByName); guarOld = guar.Copy(); guar.ChartNumber = guarChartNum; //from now on, we will be able to find guar by chartNumber Patients.Update(guar, guarOld); } } } //At this point we have a guarantor located in OD or guar=null so guar is new patient bool isNewGuar = guar == null; if (isNewGuar) //then we need to add guarantor to db { guar = new Patient(); if (guarPatNum != 0) { guar.PatNum = guarPatNum; } else { guar.ChartNumber = guarChartNum; } guar.PriProv = PrefC.GetLong(PrefName.PracticeDefaultProv); guar.BillingType = PrefC.GetLong(PrefName.PracticeDefaultBillType); } else { guarOld = guar.Copy(); } //Now that we have our guarantor, process the GT1 segment for (int i = 0; i < segDef.hl7DefFields.Count; i++) { int itemOrder = segDef.hl7DefFields[i].OrdinalPos; switch (segDef.hl7DefFields[i].FieldName) { case "guar.addressCityStateZip": guar.Address = seg.GetFieldComponent(itemOrder, 0); guar.Address2 = seg.GetFieldComponent(itemOrder, 1); guar.City = seg.GetFieldComponent(itemOrder, 2); guar.State = seg.GetFieldComponent(itemOrder, 3); guar.Zip = seg.GetFieldComponent(itemOrder, 4); continue; case "guar.birthdateTime": guar.Birthdate = FieldParser.DateTimeParse(seg.GetFieldComponent(itemOrder)); continue; case "guar.ChartNumber": guar.ChartNumber = seg.GetFieldComponent(itemOrder); continue; case "guar.Gender": guar.Gender = FieldParser.GenderParse(seg.GetFieldComponent(itemOrder)); continue; case "guar.HmPhone": guar.HmPhone = FieldParser.PhoneParse(seg.GetFieldComponent(itemOrder)); continue; case "guar.nameLFM": guar.LName = seg.GetFieldComponent(itemOrder, 0); guar.FName = seg.GetFieldComponent(itemOrder, 1); guar.MiddleI = seg.GetFieldComponent(itemOrder, 2); continue; //case "guar.PatNum": Maybe do nothing?? case "guar.SSN": guar.SSN = seg.GetFieldComponent(itemOrder); continue; case "guar.WkPhone": guar.WkPhone = FieldParser.PhoneParse(seg.GetFieldComponent(itemOrder)); continue; default: continue; } } if (isNewGuar) { guarOld = guar.Copy(); if (guar.PatNum == 0) { guar.PatNum = Patients.Insert(guar, false); } else { guar.PatNum = Patients.Insert(guar, true); } guar.Guarantor = guar.PatNum; Patients.Update(guar, guarOld); } else { Patients.Update(guar, guarOld); } pat.Guarantor = guar.PatNum; return; }