private object SaveHierarchicalLoop( HierarchicalLoop loop, object interchangeId, object transactionSetId, string transactionSetCode, object parentLoopId) { var hlId = _idProvider.NextId(_schema, "Loop"); var containerId = _idProvider.NextId(_commonDb.Schema, "Container"); var cmd = new SqlCommand(GetContainerIdSql("HL") + string.Format(@" INSERT INTO [{0}].[Loop] (Id, ParentLoopId, InterchangeId, TransactionSetId, TransactionSetCode, SpecLoopId, LevelId, LevelCode, StartingSegmentId) VALUES (@id, @parentLoopId, @interchangeId, @transactionSetId, @transactionSetCode, @specLoopId, @levelId, @levelCode, 'HL') ", _schema, _commonDb.Schema)); cmd.Parameters.AddWithValue("@id", hlId); cmd.Parameters.AddWithValue("@containerId", containerId); cmd.Parameters.AddWithValue("@parentLoopId", parentLoopId != null && parentLoopId != _defaultIdentityTypeValue ? parentLoopId : DBNull.Value); cmd.Parameters.AddWithValue("@interchangeId", interchangeId); cmd.Parameters.AddWithValue("@transactionSetId", transactionSetId); cmd.Parameters.AddWithValue("@transactionSetCode", transactionSetCode); cmd.Parameters.AddWithValue("@specLoopId", loop.Specification.LoopId); cmd.Parameters.AddWithValue("@levelId", loop.Id); cmd.Parameters.AddWithValue("@levelCode", loop.LevelCode); ExecuteCmd(cmd); return(hlId); }
public void ClaimCreationTest() { Interchange interchange = CreateSample1WithFunctionGroup(); Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034"); Segment bhtSegment = transaction.AddSegment("BHT*0019*00*3920394930203*20070816*1615*CH"); Segment refSegment = transaction.AddSegment("REF*87*004010X096A1"); Loop senderLoop = transaction.AddLoop("NM1*41*2*HOWDEE HOSPITAL*****XX*0123456789"); senderLoop.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111"); Loop receiverLoop = transaction.AddLoop("NM1*40*2*BLUE CROSS BLUE SHIELD OF NC*****46*987654321"); HierarchicalLoop providerLoop = transaction.AddHLoop("1", "20", true); providerLoop.AddSegment("PRV*BI*ZZ*203BA0200N"); var billingProvider = providerLoop.AddLoop("NM1*85*2*HOWDEE HOSPITAL*****XX*0123456789"); billingProvider.AddSegment("N3*123 HOWDEE BOULEVARD"); billingProvider.AddSegment("N4*DURHAM*NC*27701"); billingProvider.AddSegment("REF*1J*654"); billingProvider.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111*FX*6145551212"); HierarchicalLoop subscriberLoop = providerLoop.AddHLoop("2", "22", false); subscriberLoop.AddSegment("SBR*P*18*XYZ1234567******BL"); subscriberLoop.AddSegment("PAT*********Y"); var subscriberNameLoop = subscriberLoop.AddLoop("NM1*IL*1*DOUGH*MARY****MI*12312312312"); subscriberNameLoop.AddSegment("N3*BOX 12312"); subscriberNameLoop.AddSegment("N4*DURHAM*NC*27715"); subscriberNameLoop.AddSegment("DMG*D8*19670807*F"); subscriberLoop.AddLoop("NM1*PR*2*BLUE CROSS BLUE SHIELD OF NC*****PI*987654321"); var claimLoop = subscriberLoop.AddLoop("CLM*2235057*200***13:A:1*Y**Y*A*********N"); claimLoop.AddSegment("DTP*434*RD8*20070730-20070730"); claimLoop.AddSegment("CL1*1*9*01"); claimLoop.AddSegment("AMT*C5*160"); claimLoop.AddSegment("REF*F8*ASD0000123"); claimLoop.AddSegment("HI*BK:25000"); claimLoop.AddSegment("HI*BF:78901"); claimLoop.AddSegment("HI*BR:4491:D8:20070730"); claimLoop.AddSegment("HI*BH:41:D8:20070501*BH:27:D8:20070715*BH:33:D8:20070415*BH:C2:D8:20070410"); claimLoop.AddSegment("HI*BE:30:::20"); claimLoop.AddSegment("HI*BG:01"); var physicianLoop = claimLoop.AddLoop("NM1*71*1*SMITH*ELIZABETH*AL***34*243898989"); physicianLoop.AddSegment("REF*1G*P97777"); var claimLineLoop = claimLoop.AddLoop("LX*1"); claimLineLoop.AddSegment("SV2*0300*HC:81000*120*UN*1"); claimLineLoop.AddSegment("DTP*472*D8*20070730"); claimLineLoop = claimLoop.AddLoop("LX*2"); claimLineLoop.AddSegment("SV2*0320*HC:76092*50*UN*1"); claimLineLoop.AddSegment("DTP*472*D8*20070730"); claimLineLoop = claimLoop.AddLoop("LX*3"); claimLineLoop.AddSegment("SV2*0270*HC:J1120*30*UN*1"); claimLineLoop.AddSegment("DTP*472*D8*20070730"); Assert.AreEqual(new StreamReader(Extensions.GetEdi("INS._837I._4010.Example1.txt")).ReadToEnd(), interchange.SerializeToX12(true)); }
public void Read270Test() { var parser = new X12Parser(); Interchange interchange = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiry))).First(); Assert.AreEqual("9088877320000 ", interchange.InterchangeReceiverId); Transaction transaction = interchange.FunctionGroups.First().Transactions.First(); Segment bht = transaction.Segments.First(); Assert.AreEqual("10001234", bht.GetElement(3)); HierarchicalLoop subscriberLoop = transaction.FindHLoop("3"); Loop subscriberNameLoop = subscriberLoop.Loops.First(); Assert.AreEqual("SMITH", subscriberNameLoop.GetElement(3), "Subscriber last name not expected."); Assert.AreEqual("11122333301", subscriberNameLoop.GetElement(9), "Subscriber member id not expected."); }
private T SaveHierarchicalLoop(HierarchicalLoop loop, T interchangeId, T transactionSetId, string transactionSetCode, T?parentLoopId) { SqlCommand cmd = new SqlCommand(GetContainerIdSql("HL") + string.Format(@" INSERT INTO [{0}].[Loop] (Id, ParentLoopId, InterchangeId, TransactionSetId, TransactionSetCode, SpecLoopId, LevelId, LevelCode, StartingSegmentId) VALUES (@id, @parentLoopId, @interchangeId, @transactionSetId, @transactionSetCode, @specLoopId, @levelId, @levelCode, 'HL') SELECT @id", _schema, _commonDb.Schema)); cmd.Parameters.AddWithValue("@parentLoopId", (object)parentLoopId ?? DBNull.Value); cmd.Parameters.AddWithValue("@interchangeId", interchangeId); cmd.Parameters.AddWithValue("@transactionSetId", transactionSetId); cmd.Parameters.AddWithValue("@transactionSetCode", transactionSetCode); cmd.Parameters.AddWithValue("@specLoopId", loop.Specification.LoopId); cmd.Parameters.AddWithValue("@levelId", loop.Id); cmd.Parameters.AddWithValue("@levelCode", loop.LevelCode); return(ConvertT(ExecuteScalar(cmd))); }
private List <AsnHlOneShipment> ExtractHlOne(HierarchicalLoop hlOne) { /////////////////////////////////////////////////////////////// // Root of Hierarchical Loop /////////////////////////////////////////////////////////////// var hl = new AsnHlOneShipment() { HL01_IdNumber = hlOne.Id, HL02_ParentId = hlOne.ParentId, HL03_LevelCode = hlOne.LevelCode, HL04_ChildCode = hlOne.HierarchicalChildCode, }; // TD1 segment if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD1") != null) { var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD1"); hl.TD101_PackagingCode = td.GetElement(1); hl.TD102_LadingQuantity = td.GetElement(2); } // TD5 segment if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD5") != null) { var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD5"); hl.TD501_RoutingSequenceCode = td.GetElement(1); hl.TD502_IdCodeQualifier = td.GetElement(2); hl.TD503_IdCode = td.GetElement(3); hl.TD504_TransportationMethodMode = td.GetElement(4); } // TD3 segment if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD3") != null) { var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD3"); hl.TD301_EquipmentDescriptionCode = td.GetElement(1); hl.TD302_EquipmentInitial = td.GetElement(2); hl.TD303_EquipmentNumber = td.GetElement(3); } // Possible multiple REF segments if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "REF") != null) { var asnref = hlOne.Segments.Where(x => x.SegmentId == "REF").ToList(); var asnrefs = new List <AsnHlOneShipmentRef>(); foreach (var seg in asnref) { var r = new AsnHlOneShipmentRef() { REF01_ReferenceIdentificationQualifier = seg.GetElement(1), REF02_ReferenceIdentification = seg.GetElement(2), REF03_Description = seg.GetElement(3) }; asnrefs.Add(r); } hl.Refs = asnrefs; } // Possible multiple N1 loops if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "N1") != null) { var n1 = hlOne.Loops.Where(x => x.SegmentId == "N1").ToList(); hl.Names = ExtractNames(n1); } // Start of chaining to fill out the guts of the hierarchy var hlTwos = ExtractHlTwo(hlOne.HLoops.ToList()); hl.Orders = hlTwos; var hLoop = new List <AsnHlOneShipment>(); hLoop.Add(hl); return(hLoop); }
/// <summary> /// Generates the health care claim837 professional. /// </summary> /// <returns>A _healthCareClaim837Professional message.</returns> public virtual HealthCareClaim837Professional GenerateHealthCareClaim837Professional( ) { var healthCareClaim837ProfessionalFactory = IoC.CurrentContainer.Resolve <IHealthCareClaim837ProfessionalFactory> (); var currenDateTime = DateTime.Now; var autoIncrementedHierarchicalIDNumber = 1; // NOTE: The first HL01 within each ST-SE envelope must begin with "1". var interchangeCopntrolNumber = GetInterchangeControlNumber(Key); // Interchange. var message = new Interchange( currenDateTime, interchangeCopntrolNumber, false, // TODO: Use web.config to set InterchangeUsageIndicator. PayorType.HealthCareClaim837Setup.X12Delimiters.SegmentDelimiter, PayorType.HealthCareClaim837Setup.X12Delimiters.ElementDelimiter, PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter) { InterchangeSenderIdQualifier = InterchangeIDQualifier.MutuallyDefined, InterchangeSenderId = PayorType.HealthCareClaim837Setup.InterchangeSenderNumber, InterchangeReceiverIdQualifier = InterchangeIDQualifier.MutuallyDefined, InterchangeReceiverId = PayorType.HealthCareClaim837Setup.InterchangeReceiverNumber, }; message.SetElement(11, PayorType.HealthCareClaim837Setup.X12Delimiters.RepetitionDelimiter.ToString(CultureInfo.InvariantCulture)); message.SetElement(12, InterchangeVersionControlNumber.ApprovedForPublicationByASCX12ProceduresReviewBoardThroughOctober2003); message.SetElement(14, AcknowledgmentRequested.InterchangeAcknowledgmentRequested); // Functional group. var group = message.AddFunctionGroup(FunctionalIdentifierCode.HealthCareClaim, currenDateTime, interchangeCopntrolNumber, ImplementationConventionReference.Version5010); group.ApplicationSendersCode = PayorType.HealthCareClaim837Setup.InterchangeSenderNumber; group.ApplicationReceiversCode = PayorType.HealthCareClaim837Setup.InterchangeReceiverNumber; group.ResponsibleAgencyCode = ResponsibleAgencyCode.AccreditedStandardsCommitteeX12; var interchangeControlNumberString = interchangeCopntrolNumber.ToString(CultureInfo.InvariantCulture); var transactionControlIdentifier = interchangeControlNumberString.Length < 4 ? interchangeControlNumberString.PadLeft(4, '0') : interchangeControlNumberString; // Transaction set. var transaction = group.AddTransaction(TransactionSetIdentifierCode.HealthCareClaim, transactionControlIdentifier); transaction.SetElement(3, ImplementationConventionReference.Version5010); // Beginning of hierarchical transaction. var bhtSegment = transaction.AddSegment(BeginningOfHierarchicalTransaction); bhtSegment.SetElement(1, HierarchicalStructureCode.InformationSourceOrSubscriberOrDependent); bhtSegment.SetElement(2, TransactionSetPurposeCode.Original); bhtSegment.SetElement(3, BatchControlNumber.ToString(CultureInfo.InvariantCulture)); bhtSegment.SetElement(4, currenDateTime.Date.ToString("yyyyMMdd")); bhtSegment.SetElement(5, currenDateTime.ToString("HHmm")); bhtSegment.SetElement(6, TransactionTypeCode.Chargeable); // Submitter name. var submitterLoop = transaction.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Submitter)); submitterLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; submitterLoop.NM103_NameLastOrOrganizationName = PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName; submitterLoop.NM108_IdCodeQualifier = IdentificationCodeQualifier.ElectronicTransmitterIdentificationNumber; submitterLoop.NM109_IdCode = PayorType.BillingOffice.ElectronicTransmitterIdentificationNumber; // Submitter EDI contact information. var perSegment = submitterLoop.AddSegment(new TypedSegmentPER()); perSegment.PER01_ContactFunctionCode = ContactFunctionCode.InfromationContact; // NOTE: PER02_Name is situational. But, as we have provided a nonperson entity for submitter, this field is required. perSegment.PER02_Name = PayorType.BillingOffice.AdministratorStaff.StaffProfile.StaffName.Complete; perSegment.PER03_CommunicationNumberQualifier = CommunicationNumberQualifer.Telephone; var staffPhone = PayorType.BillingOffice.AdministratorStaff.PhoneNumbers.FirstOrDefault( phoneNumber => phoneNumber.StaffPhoneType.WellKnownName == StaffPhoneType.Work); if (staffPhone == null || staffPhone.Phone == null) { throw new ArgumentException( string.Format( "Unable to find '{0}' staff work phone number", PayorType.BillingOffice.AdministratorStaff.StaffProfile.StaffName.Complete)); } perSegment.PER04_CommunicationNumber = staffPhone.Phone.PhoneNumber.RemoveNonAlphanumericChar(); if (!string.IsNullOrEmpty(staffPhone.Phone.PhoneExtensionNumber)) { perSegment.PER05_CommunicationNumberQualifier = CommunicationNumberQualifer.TelephoneExtension; perSegment.PER06_CommunicationNumber = staffPhone.Phone.PhoneExtensionNumber; } // Receiver name. var receiverLoop = transaction.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Receiver)); receiverLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; receiverLoop.NM103_NameLastOrOrganizationName = PayorType.Name; receiverLoop.NM108_IdCodeQualifier = IdentificationCodeQualifier.ElectronicTransmitterIdentificationNumber; receiverLoop.NM109_IdCode = PayorType.SubmitterIdentifier; // Billing provider hierarchical level. ***** HL1 ***** var provider2000AHierachicalLoop = transaction.AddHLoop( autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture), HierarchicalLevelCode.InformationSource, HierarchicalChildCode.AdditionalSubordinateHLDataSegmentInThisHierarchicalStructure); // Billing provide specialty information. var prvSegment = provider2000AHierachicalLoop.AddSegment(new TypedSegmentPRV()); prvSegment.PRV01_ProviderCode = ProviderCode.Billing; prvSegment.PRV02_ReferenceIdQualifier = ReferenceIdentificationQualifier.HealthCareProviderTaxonomyCode; prvSegment.PRV03_ProviderTaxonomyCode = ProviderTaxonomyCode; // Billing provider Name var provider2010AaLoop = provider2000AHierachicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.BillingProvider)); provider2010AaLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; provider2010AaLoop.NM103_NameLastOrOrganizationName = PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName; provider2010AaLoop.NM108_IdCodeQualifier = IdentificationCodeQualifier.CentersForMedicareAndMedicaidServicesNationalProviderIdentifier; var agencyNpi = PayorType.BillingOffice.Agency.AgencyIdentifiers.FirstOrDefault( identifier => identifier.AgencyIdentifierType.WellKnownName == AgencyIdentifierType.Npi); if (agencyNpi == null || agencyNpi.IdentifierNumber == null) { throw new ArgumentException( string.Format( "Unable to find '{0}' agency NPI identifier number", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName)); } provider2010AaLoop.NM109_IdCode = agencyNpi.IdentifierNumber; var agencyBillingAddressAndPhone = PayorType.BillingOffice.Agency.AddressesAndPhones.FirstOrDefault( address => address.AgencyAddress.AgencyAddressType.WellKnownName == AgencyAddressType.Billing); if (agencyBillingAddressAndPhone == null || agencyBillingAddressAndPhone.AgencyAddress == null) { throw new ArgumentException( string.Format( "Unable to find '{0}' agency Billing address", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName)); } // Billing provider address. var provider2010AaN3Segment = provider2010AaLoop.AddSegment(new TypedSegmentN3()); provider2010AaN3Segment.N301_AddressInformation = agencyBillingAddressAndPhone.AgencyAddress.Address.FirstStreetAddress + (string.IsNullOrWhiteSpace( agencyBillingAddressAndPhone.AgencyAddress.Address.SecondStreetAddress) ? string.Empty : " " + agencyBillingAddressAndPhone.AgencyAddress.Address.SecondStreetAddress); // Billing provider City,State,Zip code var provider2010AaN4Segment = provider2010AaLoop.AddSegment(new TypedSegmentN4()); provider2010AaN4Segment.N401_CityName = agencyBillingAddressAndPhone.AgencyAddress.Address.CityName; provider2010AaN4Segment.N402_StateOrProvinceCode = agencyBillingAddressAndPhone.AgencyAddress.Address.StateProvince.ShortName; provider2010AaN4Segment.N403_PostalCode = agencyBillingAddressAndPhone.AgencyAddress.Address.PostalCode.Code; var agencyFederalTaxID = PayorType.BillingOffice.Agency.AgencyIdentifiers.FirstOrDefault( identifier => identifier.AgencyIdentifierType.WellKnownName == AgencyIdentifierType.FederalTaxId); if (agencyFederalTaxID == null || agencyFederalTaxID.IdentifierNumber == null) { throw new ArgumentException( string.Format( "Unable to find '{0}' agency Federal Tax ID", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName)); } // Billing provider - tax identification var provider2010AaRefSegment = provider2010AaLoop.AddSegment(new TypedSegmentREF()); provider2010AaRefSegment.REF01_ReferenceIdQualifier = ReferenceIdentificationQualifier.EmployersIdentificationNumber; provider2010AaRefSegment.REF02_ReferenceId = agencyFederalTaxID.IdentifierNumber; //If it is the same as Billing provider, no need. /* * var provider2010ABLoop = provider2000AHierachicalLoop.AddLoop ( new TypedLoopNM1 ( EntityIdentifierCode.PayToProvider ) ); * provider2010ABLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; * * // NOTE: Pay-To address is same as Billing provider address ie., same N3 and N4 segments. * provider2010ABLoop.AddSegment ( provider2010AAN3Segment ); * provider2010ABLoop.AddSegment ( provider2010AAN4Segment ); */ var claimDictionary = GroupClaimsByPrimaryPayorCoverage(Claims); //TODO: needs confirm if this loop pulling the correct data *** need bill every insurance or just the primary??? foreach (var keyValuePair in claimDictionary) { var payorCoverage = keyValuePair.Key; var claimList = keyValuePair.Value; var isPatientTheSubscriber = payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.WellKnownName.Equals(PayorSubscriberRelationshipType.Self); autoIncrementedHierarchicalIDNumber++; // Subscriber hierarchical level. **** HL 2 ****** var subscriber2000BHierarchicalLoop = provider2000AHierachicalLoop.AddHLoop( autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture), HierarchicalLevelCode.Subscriber, isPatientTheSubscriber ? HierarchicalChildCode.NoSubordinateHLSegmentInThisHierarchicalStructure : HierarchicalChildCode.AdditionalSubordinateHLDataSegmentInThisHierarchicalStructure); // Subscriber information. var sbrSegment = subscriber2000BHierarchicalLoop.AddSegment(new TypedSegmentSBR()); sbrSegment.SBR01_PayerResponsibilitySequenceNumberCode = payorCoverage.PayorCoverageType.ShortName; if (isPatientTheSubscriber) { sbrSegment.SBR02_IndividualRelationshipCode = payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.ShortName; } // Subscriber Name var subscriberName2010BaLoop = subscriber2000BHierarchicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.InsuredOrSubscriber)); subscriberName2010BaLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.Person; subscriberName2010BaLoop.NM104_NameFirst = payorCoverage.PayorSubscriber.Name.First; subscriberName2010BaLoop.NM103_NameLastOrOrganizationName = payorCoverage.PayorSubscriber.Name.Last; subscriberName2010BaLoop.NM108_IdCodeQualifier = IdentificationCodeQualifier.MemberIdentificationNumber; subscriberName2010BaLoop.NM109_IdCode = payorCoverage.MemberNumber; if (isPatientTheSubscriber) { // Subscriber address var provider2010BaN3Segment = subscriberName2010BaLoop.AddSegment(new TypedSegmentN3()); provider2010BaN3Segment.N301_AddressInformation = payorCoverage.PayorSubscriber.Address.FirstStreetAddress + (string.IsNullOrWhiteSpace( payorCoverage.PayorSubscriber.Address.SecondStreetAddress) ? string.Empty : " " + payorCoverage.PayorSubscriber.Address.SecondStreetAddress); // Subscriber city,state,postal code. var provider2010BaN4Segment = subscriberName2010BaLoop.AddSegment(new TypedSegmentN4()); provider2010BaN4Segment.N401_CityName = payorCoverage.PayorSubscriber.Address.CityName; provider2010BaN4Segment.N402_StateOrProvinceCode = payorCoverage.PayorSubscriber.Address.StateProvince.ShortName; provider2010BaN4Segment.N403_PostalCode = payorCoverage.PayorSubscriber.Address.PostalCode.Code; // Demographic information var subscriberDmgSegment = subscriberName2010BaLoop.AddSegment(new TypedSegmentDMG()); subscriberDmgSegment.DMG01_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD; subscriberDmgSegment.DMG02_DateOfBirth = payorCoverage.PayorSubscriber.BirthDate; subscriberDmgSegment.DMG03_Gender = ConvertToGenderCodeFromAdministrativeGender(payorCoverage.PayorSubscriber.AdministrativeGender); } // Loop 2010BB - Payer Name. var subscriberName2010BbLoop = subscriber2000BHierarchicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Payer)); subscriberName2010BbLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; subscriberName2010BbLoop.NM103_NameLastOrOrganizationName = payorCoverage.Payor.Name; subscriberName2010BbLoop.NM108_IdCodeQualifier = IdentificationCodeQualifier.PayorIdentification; subscriberName2010BbLoop.NM109_IdCode = payorCoverage.Payor.ElectronicTransmitterIdentificationNumber; // TODO: Kate needs to get back on this. HierarchicalLoop parentHierarchicalLoop = subscriber2000BHierarchicalLoop; if (!isPatientTheSubscriber) { autoIncrementedHierarchicalIDNumber++; // PATIENT HIERARCHICAL LEVEL Loop Repeat: >1 **** HL 3 ****** var patientDetailLoop2000CLoop = subscriber2000BHierarchicalLoop.AddHLoop( autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture), HierarchicalLevelCode.Dependent, HierarchicalChildCode.NoSubordinateHLSegmentInThisHierarchicalStructure); parentHierarchicalLoop = patientDetailLoop2000CLoop; var hl3PatSegment = patientDetailLoop2000CLoop.AddSegment(new TypedSegmentPAT()); hl3PatSegment.PAT01_IndividualRelationshipCode = payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.ShortName; var hl3Nm1Segment = patientDetailLoop2000CLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Patient)); hl3Nm1Segment.NM102_EntityTypeQualifier = EntityTypeQualifier.Person; hl3Nm1Segment.NM104_NameFirst = payorCoverage.PatientAccount.Name.First; //TODO: confirm it comes from primaryPayorCoverage.PatientAccount, not from Claim.PatientAccount, the later make more sense hl3Nm1Segment.NM103_NameLastOrOrganizationName = payorCoverage.PatientAccount.Name.Last; var hl3Nm1N3Segment = hl3Nm1Segment.AddSegment(new TypedSegmentN3()); hl3Nm1N3Segment.N301_AddressInformation = payorCoverage.PatientAccount.HomeAddress.FirstStreetAddress + (string.IsNullOrWhiteSpace( payorCoverage.PatientAccount.HomeAddress.SecondStreetAddress) ? string.Empty : " " + payorCoverage.PatientAccount.HomeAddress.SecondStreetAddress); var hl3Nm1N4Segment = hl3Nm1Segment.AddSegment(new TypedSegmentN4()); hl3Nm1N4Segment.N401_CityName = payorCoverage.PatientAccount.HomeAddress.CityName; hl3Nm1N4Segment.N402_StateOrProvinceCode = payorCoverage.PatientAccount.HomeAddress.StateProvince.ShortName; hl3Nm1N4Segment.N403_PostalCode = payorCoverage.PatientAccount.HomeAddress.PostalCode.Code; var hl3Nm1DmgSegment = hl3Nm1Segment.AddSegment(new TypedSegmentDMG()); hl3Nm1DmgSegment.DMG01_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD; hl3Nm1DmgSegment.DMG02_DateOfBirth = payorCoverage.PatientAccount.BirthDate; hl3Nm1DmgSegment.DMG03_Gender = ConvertToGenderCodeFromAdministrativeGender(payorCoverage.PatientAccount.AdministrativeGender); } // 2300 Claim Information loop repeat 100 // LX loop repeat 50 => total 5000 claims in a HCC837 message or a Subscriber HL? ( seems the later make more sense) // TODO: confirm it with Kate and how to handle it if exceed the max loop repeat foreach (var claim in claimList) { var claim2300Loop = parentHierarchicalLoop.AddLoop(new TypedLoopCLM()); // Claim 2300 loop: repeat 100 claim2300Loop.CLM01_PatientControlNumber = claim.Key.ToString(CultureInfo.InvariantCulture); claim2300Loop.CLM02_TotalClaimChargeAmount = decimal.Parse(X12Utility.ConvertToDecimalString(claim.ChargeAmount.Amount)); claim2300Loop.CLM05._1_FacilityCodeValue = PlaceOfServiceCode.Office; claim2300Loop.CLM05._2_FacilityCodeQualifier = FacilityCodeQualifier.PlaceOfServiceCodesForProfessionalOrDentalService; claim2300Loop.CLM05._3_ClaimFrequencyTypeCode = ClaimFrequencyTypeCode.Original; claim2300Loop.CLM06_ProviderOrSupplierSignatureIndicator = YesOrNoConditionResponseCode.YesIndicator; claim2300Loop.CLM07_ProviderAcceptAssignmentCode = ProviderAcceptAssignementCode.Assigned; claim2300Loop.CLM08_BenefitsAssignmentCerficationIndicator = YesOrNoConditionResponseCode.Yes; claim2300Loop.CLM09_ReleaseOfInformationCode = ReleaseOfInformationCode.Yes; // TODO: diagnosis code -- Diagnosis is associated with Claim Line Item // List the principal Dx with BK and others with BF, like HI✽BK:8901✽BF:87200✽BF:5559~, up to 12 diagnosis // assume the 1st Dx is the principal Dx var hiSegment = claim2300Loop.AddSegment(new TypedSegmentHI()); var index = 0; foreach (var claimLineItem in claim.ClaimLineItems) { index++; if (index == 1) { hiSegment.HI01_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMPrincipleDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 2) { hiSegment.HI02_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 3) { hiSegment.HI03_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 4) { hiSegment.HI04_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 5) { hiSegment.HI05_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 6) { hiSegment.HI06_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 7) { hiSegment.HI07_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 8) { hiSegment.HI08_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 9) { hiSegment.HI09_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 10) { hiSegment.HI10_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 11) { hiSegment.HI11_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } else if (index == 12) { hiSegment.HI12_HealthCareCodeInformation = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, CodeListQualifierCode.ICD9CMDiagnostics, claimLineItem.Diagnosis.CodedConceptCode); } } var autoIncrementedServiceLineNumber = 0; foreach (var claimLineItem in claim.ClaimLineItems) { autoIncrementedServiceLineNumber++; var lxLoop = claim2300Loop.AddLoop(new TypedLoopLX(string.Empty)); // LX loop repeat: 50 lxLoop.LX01_AssignedNumber = autoIncrementedServiceLineNumber.ToString(CultureInfo.InvariantCulture); var sv1Segment = lxLoop.AddSegment(new TypedSegmentSV1()); sv1Segment.SV101_CompositeMedicalProcedure = X12Utility.BuildCompositeElement( PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter, ProductOrServiceIDQualifier.HCPCS, //TODO: Confirm with Kate if we can use HCPCS for all procedures. claimLineItem.Procedure.CodedConceptCode); sv1Segment.SV102_MonetaryAmount = X12Utility.ConvertToDecimalString(claimLineItem.ChargeAmount.Amount); sv1Segment.SV103_UnitBasisMeasCode = UnitsOrBasisOfMeasurementCode.Unit; sv1Segment.SV104_Quantity = claimLineItem.BillingUnitCount.Count.ToString(CultureInfo.InvariantCulture); sv1Segment.SV107_CompDiagCodePoint = DiagnosisCodePointer; var dtpSegment = lxLoop.AddSegment(new TypedSegmentDTP()); dtpSegment.DTP01_DateTimeQualifier = DateTimeQualifier.Service; dtpSegment.DTP02_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD; dtpSegment.DTP03_Date = claim.ServiceDate; } } } var healthCareClaim837ProfessionalX12Message = message.SerializeToX12(true); //TODO: Configure the whitespace option. var healthCareClaim837Professional = healthCareClaim837ProfessionalFactory.CreateHealthCareClaim837Professional(this, Encoding.ASCII.GetBytes(healthCareClaim837ProfessionalX12Message)); var lookupValueRepository = IoC.CurrentContainer.Resolve <ILookupValueRepository>(); ReviseClaimBatchStatus(lookupValueRepository.GetLookupByWellKnownName <ClaimBatchStatus>(WellKnownNames.ClaimModule.ClaimBatchStatus.Hcc837PGenerated)); return(healthCareClaim837Professional); }