static void Main(string[] args) { string inputFilename = args[0]; string outputFilename = args[1]; string isaControlNumber = args.Length > 2 ? args[2] : "999"; string gsControlNumber = args.Length > 3 ? args[3] : "99"; var service = new X12AcknowledgmentService(); using (FileStream fs = new FileStream(inputFilename, FileMode.Open, FileAccess.Read)) { using (X12StreamReader reader = new X12StreamReader(fs, Encoding.UTF8)) { var firstTrans = reader.ReadNextTransaction(); if (reader.LastTransactionCode == "837") { if (reader.TransactionContainsSegment(firstTrans.Transactions[0], "SV2")) { service = new InstitutionalClaimAcknowledgmentService(); } if (reader.TransactionContainsSegment(firstTrans.Transactions[0], "SV1")) { service = new X12AcknowledgmentService(new ProfessionalClaimSpecificationFinder()); } } } } using (FileStream fs = new FileStream(inputFilename, FileMode.Open, FileAccess.Read)) { // Create aknowledgements and identify errors var responses = service.AcknowledgeTransactions(fs); // Change any acknowledgment codes here to reject transactions with errors // CUSTOM BUSINESS LOGIC HERE // Transform to outbound interchange for serialization var interchange = new Interchange(DateTime.Now, int.Parse(isaControlNumber), true); interchange.AuthorInfoQualifier = ConfigurationManager.AppSettings["AuthorInfoQualifier"]; interchange.AuthorInfo = ConfigurationManager.AppSettings["AuthorInfo"]; interchange.SecurityInfoQualifier = ConfigurationManager.AppSettings["SecurityInfoQualifier"]; interchange.SecurityInfo = ConfigurationManager.AppSettings["SecurityInfo"]; interchange.InterchangeSenderIdQualifier = ConfigurationManager.AppSettings["InterchangeSenderIdQualifier"]; interchange.InterchangeSenderId = ConfigurationManager.AppSettings["InterchangeSenderId"]; interchange.InterchangeReceiverIdQualifier = responses.First().SenderIdQualifier; interchange.InterchangeReceiverId = responses.First().SenderId; interchange.SetElement(12, "00501"); var group = interchange.AddFunctionGroup("FA", DateTime.Now, int.Parse(gsControlNumber)); group.ApplicationSendersCode = ConfigurationManager.AppSettings["InterchangeSenderId"]; group.VersionIdentifierCode = "005010X231A1"; group.Add999Transaction(responses); // This is a demonstration example only, change true to false to create continous x12 without line feeds. File.WriteAllText(outputFilename, interchange.SerializeToX12(true)); } }
public void TransactionCreationTest() { Interchange interchange = CreateSample1WithFunctionGroup(); interchange.FunctionGroups.First().AddTransaction("837", "0034"); Assert.AreEqual(TransactionSample1, interchange.SerializeToX12(true)); }
public void TransactionCreationWithSegmentFromStringTest() { Interchange interchange = CreateSample1WithFunctionGroup(); Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034"); Segment bht = transaction.AddSegment("BHT*0019*00*3920394930203*20070816*1615*CH"); Assert.AreEqual("0019", bht.GetElement(1)); Trace.Write(interchange.SerializeToX12(true)); }
public void OutlineIsSameAsOriginal() { var parser = new X12Parser(); Interchange interchange = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiry))).First(); Interchange interchangeFromOutline = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiryOutline))).First(); Assert.AreEqual(interchange.SerializeToX12(false), interchangeFromOutline.SerializeToX12(false)); }
public void CreatePurchaseOrder850() { string expected = @"ISA*00* *00* *01*828513080 *01*001903202U *100817*0850*U*00401*000000245*0*P*:~ GS*PO*828513080*001903202U*20100817*0850*245*X*005010X222~ ST*850*0001~ BEG*05*SA*S41000439**20100810~ CUR*BY*USD~ PER*IC*Doe,Jane******Doe,Jane~ SE*5*0001~ GE*1*1~ IEA*1*000000245~"; var purcaseOrderDate = new DateTime(2010, 8, 17, 08, 50, 0); var interchange = new Interchange(purcaseOrderDate, 245, true) { InterchangeSenderIdQualifier = "01", InterchangeSenderId = "828513080", InterchangeReceiverIdQualifier = "01", InterchangeReceiverId = "001903202U", InterchangeDate = purcaseOrderDate, }; interchange.SetElement(14, "0"); FunctionGroup group = interchange.AddFunctionGroup("PO", purcaseOrderDate, 1, "005010X222"); group.ApplicationSendersCode = "828513080"; group.ApplicationReceiversCode = "001903202U"; group.Date = purcaseOrderDate; group.ControlNumber = 245; Transaction transaction = group.AddTransaction("850", "0001"); Segment bhtSegment = transaction.AddSegment("BEG"); bhtSegment.SetElement(1, "05"); bhtSegment.SetElement(2, "SA"); bhtSegment.SetElement(3, "S41000439"); bhtSegment.SetElement(5, "20100810"); bhtSegment = transaction.AddSegment("CUR"); bhtSegment.SetElement(1, "BY"); bhtSegment.SetElement(2, "USD"); bhtSegment = transaction.AddSegment("PER"); bhtSegment.SetElement(1, "IC"); bhtSegment.SetElement(2, "Doe,Jane"); bhtSegment.SetElement(8, "Doe,Jane"); var x12 = interchange.SerializeToX12(true); Assert.AreEqual(expected, x12); }
public void InterchangeCreationTest() { DateTime date = DateTime.Parse("2002-08-16 11:44AM"); Interchange interchange = CreateSample1InterChange(date); string actualX12 = interchange.SerializeToX12(true); Assert.AreEqual(InterchangeSample1, actualX12); Assert.AreEqual("00", interchange.AuthorInfoQualifier); Assert.AreEqual("00", interchange.SecurityInfoQualifier); Assert.AreEqual("01", interchange.InterchangeSenderIdQualifier); Assert.AreEqual("01", interchange.InterchangeReceiverIdQualifier); Assert.AreEqual(date, interchange.InterchangeDate); }
public void TransactionCreationWithSegmentToStringTest() { Interchange interchange = CreateSample1WithFunctionGroup(); Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034"); Segment bht = transaction.AddSegment("BHT"); bht.SetElement(1, "0019"); bht.SetElement(2, "00"); bht.SetElement(3, "3920394930203"); bht.SetElement(4, "20070816"); bht.SetElement(5, "1615"); bht.SetElement(6, "CH"); Assert.AreEqual("BHT*0019*00*3920394930203*20070816*1615*CH", bht.SegmentString); Trace.Write(interchange.SerializeToX12(false)); }
public void Acknowledge837ITest() { var service = new InstitutionalClaimAcknowledgmentService(); var responses = service.AcknowledgeTransactions(GetEdi("837I_4010_Batch1.txt")); Assert.AreEqual(1, responses.Count); var response = responses.First(); Assert.AreEqual("612200041", response.GroupControlNumber); Assert.AreEqual(54, response.TransactionSetResponses.Count); var interchange = new Interchange(DateTime.Now, 1, true); var group = interchange.AddFunctionGroup("FA", DateTime.Now, 1); group.VersionIdentifierCode = "005010X231A1"; group.Add999Transaction(responses); Trace.WriteLine(interchange.SerializeToX12(true)); }
public void CreatePurchaseOrder850() { DateTime purcaseOrderDate = new DateTime(2010, 8, 17, 08, 50, 0); Interchange interchange = new Interchange(purcaseOrderDate, 245, true) { InterchangeSenderIdQualifier = "01", InterchangeSenderId = "828513080", InterchangeReceiverIdQualifier = "01", InterchangeReceiverId = "001903202U", InterchangeDate = purcaseOrderDate, }; interchange.SetElement(14, "0"); //No Aknowlegement is 0 FunctionGroup group = interchange.AddFunctionGroup("PO", purcaseOrderDate, 1, "005010X222"); group.ApplicationSendersCode = "828513080"; group.ApplicationReceiversCode = "001903202U"; group.Date = purcaseOrderDate; group.ControlNumber = 245; Transaction transaction = group.AddTransaction("850", "0001"); Segment bhtSegment = transaction.AddSegment("BEG"); bhtSegment.SetElement(1, "05"); bhtSegment.SetElement(2, "SA"); bhtSegment.SetElement(3, "S41000439"); bhtSegment.SetElement(5, "20100810"); bhtSegment = transaction.AddSegment("CUR"); bhtSegment.SetElement(1, "BY"); bhtSegment.SetElement(2, "USD"); bhtSegment = transaction.AddSegment("PER"); bhtSegment.SetElement(1, "IC"); bhtSegment.SetElement(2, "Doe,Jane"); bhtSegment.SetElement(8, "Doe,Jane"); var x12 = interchange.SerializeToX12(true); System.Diagnostics.Trace.Write(x12); }
public void ParseModifyAndTransformBackToX12() { var stream = GetEdi("INS._270._4010.Example1_DHHS.txt"); var parser = new X12Parser(); Interchange interchange = parser.ParseMultiple(stream).First(); string originalX12 = interchange.SerializeToX12(true); string xml = interchange.Serialize(); XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.LoadXml(xml); XmlElement dmgElement = (XmlElement)(doc.GetElementsByTagName("DMG")[0]); dmgElement.ParentNode.RemoveChild(dmgElement); Console.WriteLine(doc.OuterXml); string x12 = parser.TransformToX12(doc.OuterXml); Console.WriteLine("ISA Segmemt:"); Console.WriteLine(x12.Substring(0, 106)); Console.WriteLine("Directly from XML:"); Console.WriteLine(x12); var modifiedInterchange = parser.ParseMultiple(x12).First(); string newX12 = modifiedInterchange.SerializeToX12(true); Console.WriteLine("After passing through interchange object:"); Console.WriteLine(newX12); var seSegment = modifiedInterchange.FunctionGroups.First().Transactions.First().TrailerSegments.FirstOrDefault(ts => ts.SegmentId == "SE"); Assert.IsNotNull(seSegment); Assert.AreEqual("0001", seSegment.GetElement(2)); Assert.AreEqual("15", seSegment.GetElement(1)); }
public void ParseAndTransformToX12() { string resourcePath = Convert.ToString(TestContext.DataRow["ResourcePath"]); // "INS._837P._4010.Spec_4.1.1_PatientIsSubscriber.txt"; if (!resourcePath.Contains("_0x1D")) { Trace.WriteLine(resourcePath); Stream stream = GetEdi(resourcePath); var parser = new X12Parser(); Interchange interchange = parser.ParseMultiple(stream).First(); string originalX12 = interchange.SerializeToX12(true); string xml = interchange.Serialize(); string x12 = parser.TransformToX12(xml); Interchange newInterchange = parser.ParseMultiple(x12).First(); string newX12 = newInterchange.SerializeToX12(true); Assert.AreEqual(originalX12, newX12); Trace.Write(x12); } }
public void ParseAndTransformToX12( [ValueSource(typeof(ResourcePathManager), nameof(ResourcePathManager.ResourcePaths))] string resourcePath) { if (!resourcePath.Contains("_0x1D")) { // arrange Stream stream = GetEdi(resourcePath); // act var parser = new X12Parser(); Interchange interchange = parser.ParseMultiple(stream).First(); string originalX12 = interchange.SerializeToX12(true); string xml = interchange.Serialize(); string x12 = parser.TransformToX12(xml); Interchange newInterchange = parser.ParseMultiple(x12).First(); string newX12 = newInterchange.SerializeToX12(true); // assert Assert.AreEqual(originalX12, newX12); } }
public void Create810_4010Version() { var message = new Interchange(new DateTime(1999, 1, 4, 15, 32, 0), 35, false, '~', '*', '>') { SecurityInfoQualifier = "00", InterchangeSenderIdQualifier = "30", InterchangeSenderId = "943274043", InterchangeReceiverIdQualifier = "16", InterchangeReceiverId = "0069088189999" }; var fg = message.AddFunctionGroup("IN", new DateTime(1999, 1, 4, 15, 32, 0), 1); fg.ApplicationSendersCode = "943274043TO"; fg.ApplicationReceiversCode = "0069088189999"; fg.ResponsibleAgencyCode = "X"; fg.VersionIdentifierCode = "004010"; var trans = fg.AddTransaction("810", "0001"); var big = trans.AddSegment(new TypedSegmentBIG()); big.BIG01_InvoiceDate = new DateTime(1998, 10, 14); big.BIG02_InvoiceNumber = "3662"; big.BIG07_TransactionTypeCode = "N6"; var billTo = trans.AddLoop(new TypedLoopN1()); billTo.N101_EntityIdentifierCodeEnum = EntityIdentifierCode.BillToParty; billTo.N102_Name = "The Scheduling Coordinator, Inc"; var billToAddress = billTo.AddSegment(new TypedSegmentN3()); billToAddress.N301_AddressInformation = "53241 Hamilton Dr"; var billToLocale = billTo.AddSegment(new TypedSegmentN4()); billToLocale.N401_CityName = "Palo Alto"; billToLocale.N402_StateOrProvinceCode = "CA"; billToLocale.N403_PostalCode = "95622"; billToLocale.N404_CountryCode = "US"; var remitTo = trans.AddLoop(new TypedLoopN1()); remitTo.N101_EntityIdentifierCodeEnum = EntityIdentifierCode.PartyToReceiveCommercialInvoiceRemittance; remitTo.N102_Name = "Bank of America- (Mkt and GMC)"; var remitToAddress = remitTo.AddSegment(new TypedSegmentN3()); remitToAddress.N301_AddressInformation = "1850 Gateway Boulevard"; var remitToLocale = remitTo.AddSegment(new TypedSegmentN4()); remitToLocale.N401_CityName = "Concord"; remitToLocale.N402_StateOrProvinceCode = "CA"; remitToLocale.N403_PostalCode = "94520"; remitToLocale.N404_CountryCode = "US"; var remitToRef1 = remitTo.AddSegment(new TypedSegmentREF()); remitToRef1.REF01_ReferenceIdQualifier = "11"; remitToRef1.REF02_ReferenceId = "1233626208"; var remitToRef2 = remitTo.AddSegment(new TypedSegmentREF()); remitToRef2.REF01_ReferenceIdQualifier = "01"; remitToRef2.REF02_ReferenceId = "026009593"; var itd = trans.AddSegment(new TypedSegmentITD()); itd.ITD01_TermsTypeCode = "03"; itd.ITD06_TermsNetDueDate = new DateTime(1998, 10, 20); var it1 = trans.AddLoop(new TypedLoopIT1()); it1.IT101_AssignedIdentification = "1"; it1.IT102_QuantityInvoiced = 1; it1.IT103_UnitOrBasisForMeasurementCode = UnitOrBasisOfMeasurementCode.Each; it1.IT104_UnitPrice = 2896035.3m; var pid = it1.AddLoop(new TypedLoopPID()); pid.PID01_ItemDescriptionType = "X"; pid.PID05_Description = "RMR Scheduling Coordinator - Estimated RMR"; var tds = trans.AddSegment(new TypedSegmentTDS()); tds.TDS01_AmountN2 = 289603530; var ctt = trans.AddSegment(new TypedSegmentCTT()); ctt.CTT01_NumberOfLineItems = 1; var x12 = message.SerializeToX12(true); Trace.Write(x12); Assert.AreEqual(ExpectedX12, x12); }
public void CreatePurchaseOrderChangeNotice860() { DateTime purcaseOrderDate = new DateTime(2010, 8, 17, 08, 50, 0); DateTime changeOrderDate = DateTime.Now; DateTime requestedShipDate = DateTime.Now.AddDays(2d); Interchange interchange = new Interchange(changeOrderDate, 245, true) { InterchangeSenderIdQualifier = "01", InterchangeSenderId = "828513080", InterchangeReceiverIdQualifier = "01", InterchangeReceiverId = "001903202U", InterchangeDate = changeOrderDate, }; interchange.SetElement(14, "0"); //No Aknowlegement is 0 FunctionGroup group = interchange.AddFunctionGroup("PO", changeOrderDate, 1, "005010X222"); group.ApplicationSendersCode = "828513080"; group.ApplicationReceiversCode = "001903202U"; group.Date = changeOrderDate; group.ControlNumber = 245; Transaction transaction = group.AddTransaction("860", "0001"); //BCH - Beginning Segment for Purchase Order Change //Mandatory / Max Use=1 time Segment bhtSegment = transaction.AddSegment("BCH"); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.TransactionSetPurpose, "01"); //01 is cancelllation 04 is change bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.TransactionSetTypeCode, "SA"); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.PurchaseOrderDate, purcaseOrderDate.ToString("yyyyMMdd")); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.ChangeRequestDate, changeOrderDate.ToString("yyyyMMdd")); //REF- Reference Identification //Optional / Max Use=1 time bhtSegment = transaction.AddSegment("REF"); bhtSegment.SetElement((int)ReferenceIdentificationIndex.ReferenceIdentificationQualifier, "IA"); bhtSegment.SetElement((int)ReferenceIdentificationIndex.ReferenceNumber, "1to30chars"); //DTM – Date/Time Reference //Optional/ Max Use=1 time bhtSegment = transaction.AddSegment("DTM"); bhtSegment.SetElement((int)DateTimeReferenceIndex.TermsTypeCode, "010"); bhtSegment.SetElement((int)DateTimeReferenceIndex.RequestedShipDate, requestedShipDate.ToString("yyyyMMdd")); //Add to test //N1 – Name //Optional / Max Use=1 //N3 – Address Information //Conditional – use if N1 used/ Max Use=2 //N4 – Geographic Location //Conditional – use if N3 used / Max Use=1 time //POC – Line Item Change //Mandatory / Max Use=1 times per loop / Max Loop=99 times //DTM – Date/Time Reference //Mandatory / Max Use=1 times per loop //CTT – Transaction Totals //Mandatory / Max Use=1 time var x12 = interchange.SerializeToX12(true); System.Diagnostics.Trace.Write(x12); }
public void Create270Test() { /*Good documentation sources for understanding X12 * http://docs.oracle.com/cd/E19398-01/820-1275/agdaw/index.html * https://www.empireblue.com/provider/noapplication/f4/s3/t2/pw_ad086848.pdf?refer=ehpprovider */ //Create the top level interchange #region Create Interchange var Message = new Interchange(DateTime.Now, 31, false) { AuthorInfoQualifier = "00", //ISA01 - Authorization Info Qual - 00(No Auth present) AuthorInfo = String.Format("{0,-10}", " "), //ISA02 - Authorization Info Must be 10 spaces if ISA01 = 00 SecurityInfoQualifier = "00", //ISA03 - Security Info Qual (00 no password) SecurityInfo = String.Format("{0,-10}", " "), //ISA04 - Password, 10 spaces if no password InterchangeSenderIdQualifier = "01", //ISA05 01=Duns 14=Duns plus suffix 20=Health insurance number (HIN) 27=CMS carrier ID number 28=CMS fiscal intermediary ID number 29=CMS Medicare provider /supplier ID 30 U.S. federal tax ID 33=NAIC ID ZZ=Mutually defined. InterchangeSenderId = "9012345720000 ", //ISA06 Registration information for sender InterchangeReceiverIdQualifier = "01", //ISA07 Mutually defined InterchangeReceiverId = "9088877320000 ", //ISA08 - Depends on who is processing it. Variable by company. We need to get a table of these values InterchangeDate = DateTime.Parse("2002/08/16") //ISA09 - Date we sent this }; Message.SetElement(10, "1144"); //ISA10 Interchange time Format HHMM Message.SetElement(11, "U"); //ISA11 Interchange Control standards ID Message.SetElement(12, "00401"); //ISA12 Interchange control version number - set by receiver Message.SetElement(13, "000000031"); //ISA13 Interchange control number - Must be unique within 180 days Message.SetElement(14, "0"); //ISA14 Interchange Ack requested - For 270 must be 0 Message.SetElement(15, "T"); //ISA15 Usage (T=Test, P=Production) //Message.SetElement(16, "^"); //ISA16 Component Element sep - Can't be in any value in document Debug.WriteLine("Interchange level:"); Debug.WriteLine("ISA*00* *00* *01*9012345720000 *01*9088877320000 *020816*1144*U*00401*000000031*0*T*:~IEA*0*000000031~"); Debug.WriteLine(Message.SerializeToX12(false)); Assert.AreEqual("ISA*00* *00* *01*9012345720000 *01*9088877320000 *020816*1144*U*00401*000000031*0*T*:~IEA*0*000000031~", Message.SerializeToX12(false)); #endregion #region Create GS - Function Group //GS - First record of a functional group var Group = Message.AddFunctionGroup("HS", DateTime.Now, 31, "00501X092A1"); Group.FunctionalIdentifierCode = "HS"; //GS01 FA=999, HS=270, HB=271 Group.ApplicationSendersCode = "901234572000"; //GS02 - RegistationCode given by receiver organization Group.ApplicationReceiversCode = "908887732000"; //GS03 - Recievers code (Get from the receiver organization) Group.Date = DateTime.Parse("2007/08/16"); //GS04 - Date sent from us Group.SetElement(5, "1615"); //GS05 - HHMM time from sending system Group.ControlNumber = 31; //GS06 Must equal following GE02 and be unique to each functional group in message Group.ResponsibleAgencyCode = "X"; //GS07 X=ASCX12 Group.VersionIdentifierCode = "00501X092A1"; //GS08 00501X092A1 for 270/271, 005010 for 999 Debug.WriteLine("Function Group level:"); Debug.WriteLine("GS*HS*901234572000*908887732000*20070816*1615*31*X*00501X092A1~GE*0*31~"); Debug.WriteLine(Group.SerializeToX12(false)); Assert.AreEqual("GS*HS*901234572000*908887732000*20070816*1615*31*X*00501X092A1~GE*0*31~", Group.SerializeToX12(false)); #endregion #region Create Transaction var TransactionSet = Group.AddTransaction("270", "1234"); //1234 is the ST02 control number #endregion #region Create BHT - Beginning of Hierarchal Transaction // Beginning of Hierarchical Transaction var BHTSegment = TransactionSet.AddSegment(new TypedSegmentBHT()); BHTSegment.BHT01_HierarchicalStructureCode = "0022"; //BHT01 - Order for structure: 22 - Information Source, Information Reciever, Subscriber, Dependent BHTSegment.BHT02_TransactionSetPurposeCode = "13"; //BHT02 - Transaction Set purpose 01- Cancel (Cancel a previous 270), 13 - Request BHTSegment.BHT03_ReferenceIdentification = "10001234"; //BHT03 - Value used to track this request (From our side) Max 50 char BHTSegment.BHT04_Date = DateTime.Parse("2007/08/16"); //BHT04 - CCYYMMDD (CC = First two digits of year 20..) - When transaction was created BHTSegment.BHT05_Time = "1319"; //BHT05 - Time Transaction created HHMM BHTSegment.BHT06_TransactionTypeCode = "00"; //BHT06 - Transaction Type - RT for getting Medicaid SpendDown info Debug.WriteLine("BHT - Beginning of Hierarchal Transaction:"); Debug.WriteLine("ST*270*1234~BHT*0022*13*10001234*20070816*1319*00~SE*3*1234~"); Debug.WriteLine(TransactionSet.SerializeToX12(false)); Assert.AreEqual("ST*270*1234~BHT*0022*13*10001234*20070816*1319*00~SE*3*1234~", TransactionSet.SerializeToX12(false)); #endregion /* Note on the following HL levels * HL1 - Information Source level - Payer that maintains the info regarding the patient's coverage * HL2 - Information Receiver Level - The Entity requesting info regarding the patient's coverage * HL3 - Subscriber level - the subscriber, who may or may not be the patient - the member. * HL4 - Dependent level - The dependent of the member, who may or may not be the patient, is related to the subscriber/mnember */ #region HL1 Level - Information Source - Loop 2100A var HL1InformationSourceLevel = TransactionSet.AddHLoop("1", "20", true); //"1" is HL01 the Id number for this loop, "20" is HL02 - "20" means it is an info source //Billing info HL1 level var HL1SourceLoop = HL1InformationSourceLevel.AddLoop(new TypedLoopNM1("PR")); //InformationSourceLoop.NM101_EntityIdCode = "PR"; //2B Third-Party Administrator, 36 Employer, GP Gateway Provider, P5 Plan Sponsor, PR Payer HL1SourceLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; HL1SourceLoop.NM103_NameLastOrOrganizationName = "ABC BILLING SERVICE"; HL1SourceLoop.NM104_NameFirst = ""; HL1SourceLoop.NM105_NameMiddle = ""; HL1SourceLoop.NM106_NamePrefix = ""; HL1SourceLoop.NM107_NameSuffix = ""; HL1SourceLoop.NM108_IdCodeQualifier = "PI"; //code describing what the NM109 is /* * 24 Employer's Identification Number * 46 Electronic Transmitter Identification Number (ETIN) * FI Federal Taxpayer's Identification Number * NI National Association of Insurance Commissioners (NAIC) Identification * PI Payor Identification * XV Centers for Medicare and Medicaid Services PlanID * CODE SOURCE: CODE SOURCE: * 540: Centers for Medicare and Medicaid Services PlanID Centers for Medicare and Medicaid Services PlanID * XX Centers for Medicare and Medicaid Services National Provider Identifier * CODE SOURCE: CODE SOURCE: * 537: Centers for Medicare and Medicaid Services National Provider Identifier Centers for Medicare and Medicaid Services National Provider Identifier */ HL1SourceLoop.NM109_IdCode = "842610001"; //Code defining a party or other value lookup from external code list Debug.WriteLine("HL1 level:"); Debug.WriteLine(HL1InformationSourceLevel.SerializeToX12(false)); Debug.WriteLine("HL*1**20*1~NM1*PR*2*ABC BILLING SERVICE*****PI*842610001~"); Assert.AreEqual("HL*1**20*1~NM1*PR*2*ABC BILLING SERVICE*****PI*842610001~", HL1InformationSourceLevel.SerializeToX12(false)); #endregion #region HL2 Level - Information Receiver - Loop 2100B var HL2SourceLoop = HL1InformationSourceLevel.AddHLoop("2", "21", true);//This is the 2100 Loop - The receiver information var HL2Info = HL2SourceLoop.AddLoop(new TypedLoopNM1("1P")); HL2Info.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; HL2Info.NM103_NameLastOrOrganizationName = "BONE AND JOINT CLINIC"; HL2Info.NM104_NameFirst = ""; HL2Info.NM105_NameMiddle = ""; HL2Info.NM106_NamePrefix = ""; HL2Info.NM107_NameSuffix = ""; HL2Info.NM108_IdCodeQualifier = "SV"; //code describing what the NM109 is //HL2Info.NM108_IdCodeQualifierEnum = IdentificationCodeQualifier.CanadianPetroleumAssociation; HL2Info.NM109_IdCode = "2000035"; Debug.WriteLine("HL2 Level:"); Debug.WriteLine(HL2SourceLoop.SerializeToX12(false)); Debug.WriteLine("HL*2*1*21*1~NM1*1P*2*BONE AND JOINT CLINIC*****SV*2000035~"); Assert.AreEqual("HL*2*1*21*1~NM1*1P*2*BONE AND JOINT CLINIC*****SV*2000035~", HL2SourceLoop.SerializeToX12(false)); #endregion #region HL3 Level - Member info level var HL3Info = HL2SourceLoop.AddHLoop("3", "22", false); //We need to create a TypedLoopTRN HL3Info.AddSegment("TRN*1*93175-012547*9877281234"); var Member = HL3Info.AddLoop(new TypedLoopNM1("IL")); Member.NM102_EntityTypeQualifier = EntityTypeQualifier.Person; Member.NM103_NameLastOrOrganizationName = "SMITH"; Member.NM104_NameFirst = "ROBERT"; Member.NM105_NameMiddle = "MI"; Member.NM109_IdCode = "11122333301"; TypedSegmentDMG Birthday = Member.AddSegment(new TypedSegmentDMG()); Birthday.DMG02_DateOfBirth = DateTime.Parse("05/19/1943"); TypedSegmentDTP SubscribeDate = Member.AddSegment(new TypedSegmentDTP()); SubscribeDate.DTP01_DateTimeQualifier = DTPQualifier.Plan; SubscribeDate.DTP02_DateTimePeriodFormatQualifier = DTPFormatQualifier.CCYYMMDD; SubscribeDate.DTP03_Date = new DateTimePeriod(DateTime.Parse("05/01/2006")); //Need to create enumeration of the EQ categories, so not just asking for the general 30 information. Member.AddLoop("EQ*30"); Debug.WriteLine("HL3 Test:"); Debug.WriteLine(HL3Info.SerializeToX12(false)); Debug.WriteLine("HL*3*2*22*0~TRN*1*93175-012547*9877281234~NM1*IL*1*SMITH*ROBERT*MI****11122333301~DMG*D8*19430519~DTP*291*D8*20060501~EQ*30~"); Assert.AreEqual("HL*3*2*22*0~TRN*1*93175-012547*9877281234~NM1*IL*1*SMITH*ROBERT*MI****11122333301~DMG*D8*19430519~DTP*291*D8*20060501~EQ*30~", HL3Info.SerializeToX12(false)); #endregion //Test entire 270 Debug.WriteLine(""); Debug.WriteLine("Overall Whole:"); Debug.WriteLine(Message.SerializeToX12(false)); Debug.WriteLine(inquiry); Debug.WriteLine("Outlined Result:"); Debug.WriteLine(Message.SerializeToX12(true)); Debug.WriteLine("XML version of the above to help in understanding layout."); Debug.WriteLine(Message.Serialize()); Assert.AreEqual(inquiry, Message.SerializeToX12(false)); }
public void Create837_5010Version() { var message = new Interchange(Convert.ToDateTime("01/01/03"), 000905, false) { InterchangeSenderIdQualifier = "ZZ", InterchangeSenderId = "SUBMITTERS.ID", InterchangeReceiverIdQualifier = "ZZ", InterchangeReceiverId = "RECEIVERS.ID", SecurityInfo = "SECRET", SecurityInfoQualifier = "01", }; message.SetElement(12, "00501"); message.SetElement(10, "1253"); message.SetElement(11, "^"); var group = message.AddFunctionGroup("HC", DateTime.Now, 1, "005010X222"); group.ApplicationSendersCode = "SENDER CODE"; group.ApplicationReceiversCode = "RECEIVER CODE"; group.Date = Convert.ToDateTime("12/31/1999"); group.ControlNumber = 1; group.SetElement(5, "0802"); var transaction = group.AddTransaction("837", "0021"); transaction.SetElement(2, "0021"); transaction.SetElement(3, "005010X222"); var bhtSegment = transaction.AddSegment(new TypedSegmentBHT()); bhtSegment.BHT01_HierarchicalStructureCode = "0019"; bhtSegment.BHT02_TransactionSetPurposeCode = "00"; bhtSegment.BHT03_ReferenceIdentification = "244579"; bhtSegment.BHT04_Date = DateTime.Parse("2006-10-15"); bhtSegment.BHT05_Time = "1023"; bhtSegment.BHT06_TransactionTypeCode = "CH"; var submitterLoop = transaction.AddLoop(new TypedLoopNM1("41")); //submitter identifier code submitterLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; submitterLoop.NM103_NameLastOrOrganizationName = "PREMIER BILLING SERVICE"; submitterLoop.NM104_NameFirst = ""; submitterLoop.NM109_IdCode = "TGJ23"; submitterLoop.NM108_IdCodeQualifier = "46"; var perSegment = submitterLoop.AddSegment(new TypedSegmentPER()); perSegment.PER01_ContactFunctionCode = "IC"; //information contact function code perSegment.PER02_Name = "JERRY"; perSegment.PER03_CommunicationNumberQualifier = CommunicationNumberQualifer.Telephone; perSegment.PER04_CommunicationNumber = "3055552222"; perSegment.PER05_CommunicationNumberQualifier = CommunicationNumberQualifer.TelephoneExtension; perSegment.PER06_CommunicationNumber = "231"; var submitterLoop2 = transaction.AddLoop(new TypedLoopNM1("40")); submitterLoop2.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; submitterLoop2.NM103_NameLastOrOrganizationName = "KEY INSURANCE COMPANY"; submitterLoop2.NM104_NameFirst = ""; submitterLoop2.NM109_IdCode = "66783JJT"; submitterLoop2.NM108_IdCodeQualifier = "46"; var provider2000AHLoop = transaction.AddHLoop("1", "20", true); //*********HL 1 ****** var prvSegment = provider2000AHLoop.AddSegment(new TypedSegmentPRV()); //Specialty Segment prvSegment.PRV01_ProviderCode = "BI"; prvSegment.PRV02_ReferenceIdQualifier = "PXC"; prvSegment.PRV03_ProviderTaxonomyCode = "203BF0100Y"; var provider2010ACLoop = provider2000AHLoop.AddLoop(new TypedLoopNM1("85")); provider2010ACLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; provider2010ACLoop.NM103_NameLastOrOrganizationName = "BEN KILDARE SERVICE"; provider2010ACLoop.NM109_IdCode = "9876543210"; provider2010ACLoop.NM108_IdCodeQualifier = "XX"; var provider2010AC_N3Segment = provider2010ACLoop.AddSegment(new TypedSegmentN3()); provider2010AC_N3Segment.N301_AddressInformation = "234 SEAWAY ST"; var provider2010AC_N4Segment = provider2010ACLoop.AddSegment(new TypedSegmentN4()); provider2010AC_N4Segment.N401_CityName = "MIAMI"; provider2010AC_N4Segment.N402_StateOrProvinceCode = "FL"; provider2010AC_N4Segment.N403_PostalCode = "33111"; var provider2010AC_REFSegment = provider2010ACLoop.AddSegment(new TypedSegmentREF()); provider2010AC_REFSegment.REF01_ReferenceIdQualifier = "EI"; provider2010AC_REFSegment.REF02_ReferenceId = "587654321"; var provider2010ACLoop2 = provider2000AHLoop.AddLoop(new TypedLoopNM1("87")); provider2010ACLoop2.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; var provider2010AC_N3Segment2 = provider2010ACLoop2.AddSegment(new TypedSegmentN3()); provider2010AC_N3Segment2.N301_AddressInformation = "2345 OCEAN BLVD"; var provider2010AC_N4Segment2 = provider2010ACLoop2.AddSegment(new TypedSegmentN4()); provider2010AC_N4Segment2.N401_CityName = "MAIMI"; // MISSPELLED IN COMPARETO DOC provider2010AC_N4Segment2.N402_StateOrProvinceCode = "FL"; provider2010AC_N4Segment2.N403_PostalCode = "33111"; var subscriber2000BHLoop = provider2000AHLoop.AddHLoop("2", "22", true); // **** HL 2 ****** var segmentSBR = subscriber2000BHLoop.AddSegment(new TypedSegmentSBR()); segmentSBR.SBR01_PayerResponsibilitySequenceNumberCode = "P"; segmentSBR.SBR03_PolicyOrGroupNumber = "2222-SJ"; segmentSBR.SBR09_ClaimFilingIndicatorCode = "CI"; var subscriberName2010BALoop = subscriber2000BHLoop.AddLoop(new TypedLoopNM1("IL")); subscriberName2010BALoop.NM102_EntityTypeQualifier = EntityTypeQualifier.Person; subscriberName2010BALoop.NM104_NameFirst = "JANE"; subscriberName2010BALoop.NM103_NameLastOrOrganizationName = "SMITH"; subscriberName2010BALoop.NM109_IdCode = "JS00111223333"; subscriberName2010BALoop.NM108_IdCodeQualifier = "MI"; var subscriber_DMGSegment = subscriberName2010BALoop.AddSegment(new TypedSegmentDMG()); subscriber_DMGSegment.DMG01_DateTimePeriodFormatQualifier = "D8"; subscriber_DMGSegment.DMG02_DateOfBirth = DateTime.Parse("5/1/1943"); subscriber_DMGSegment.DMG03_Gender = Gender.Female; var subscriberName2010BALoop2 = subscriber2000BHLoop.AddLoop(new TypedLoopNM1("PR")); subscriberName2010BALoop2.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity; subscriberName2010BALoop2.NM103_NameLastOrOrganizationName = "KEY INSURANCE COMPANY"; subscriberName2010BALoop2.NM108_IdCodeQualifier = "PI"; subscriberName2010BALoop2.NM109_IdCode = "999996666"; var refSegment2 = subscriberName2010BALoop2.AddSegment(new TypedSegmentREF()); refSegment2.REF01_ReferenceIdQualifier = "G2"; refSegment2.REF02_ReferenceId = "KA6663"; var HL3Loop = subscriber2000BHLoop.AddHLoop("3", "23", false); // **** HL 3 ****** var HL3PATSegment = HL3Loop.AddSegment(new TypedSegmentPAT()); HL3PATSegment.PAT01_IndividualRelationshipCode = "19"; var HL3NM1Segment = HL3Loop.AddLoop(new TypedLoopNM1("QC")); HL3NM1Segment.NM102_EntityTypeQualifier = EntityTypeQualifier.Person; HL3NM1Segment.NM104_NameFirst = "TED"; HL3NM1Segment.NM103_NameLastOrOrganizationName = "SMITH"; // add N3 and N4 segments under the above NM1 loop var HL3NM1_N3_Segment = HL3NM1Segment.AddSegment(new TypedSegmentN3()); HL3NM1_N3_Segment.N301_AddressInformation = "236 N MAIN ST"; var HL3NM1_N4_Segment = HL3NM1Segment.AddSegment(new TypedSegmentN4()); HL3NM1_N4_Segment.N401_CityName = "MIAMI"; HL3NM1_N4_Segment.N402_StateOrProvinceCode = "FL"; HL3NM1_N4_Segment.N403_PostalCode = "33413"; var HL3NM1_DMG_Segment = HL3NM1Segment.AddSegment(new TypedSegmentDMG()); HL3NM1_DMG_Segment.DMG01_DateTimePeriodFormatQualifier = "D8"; HL3NM1_DMG_Segment.DMG02_DateOfBirth = Convert.ToDateTime("5/1/1973"); HL3NM1_DMG_Segment.DMG03_Gender = Gender.Male; var claim2300Loop = HL3Loop.AddLoop(new TypedLoopCLM()); claim2300Loop.CLM01_PatientControlNumber = "26463774"; claim2300Loop.CLM02_TotalClaimChargeAmount = Convert.ToDecimal(100); claim2300Loop.CLM05 = claim2300Loop.CreateTypedElementServiceLocationInfo(PlaceOfServiceCodes.Office, "B", "1"); claim2300Loop.CLM06_ProviderOrSupplierSignatureIndicator = YesNoConditionOrResponseCode.Yes; claim2300Loop.CLM07_ProviderAcceptAssignmentCode = "A"; claim2300Loop.CLM08_BenefitsAssignmentCerficationIndicator = YesNoConditionOrResponseCode.Yes; claim2300Loop.CLM09_ReleaseOfInformationCode = "I"; var refSegment = claim2300Loop.AddSegment(new TypedSegmentREF()); refSegment.REF01_ReferenceIdQualifier = "D9"; refSegment.REF02_ReferenceId = "17312345600006351"; var hiSegment = claim2300Loop.AddSegment(new TypedSegmentHI()); hiSegment.HI01_HealthCareCodeInformation = hiSegment.CreateNewTypedElementHealthCareCodeInformation(1, CodeListQualifierCode.PrincipalDiagnosis, "0340"); hiSegment.HI02_HealthCareCodeInformation = hiSegment.CreateNewTypedElementHealthCareCodeInformation(2, CodeListQualifierCode.Diagnosis, "V7389"); var lxLoop = claim2300Loop.AddLoop(new TypedLoopLX() { LX01_AssignedNumber = 1 }); lxLoop.LX01_AssignedNumber = 1; var sv1Segment = lxLoop.AddSegment(new TypedSegmentSV1()); sv1Segment.SV101_CompositeMedicalProcedure = sv1Segment.CreateTypedElementCompositeMedicalProcedureIdentifier( ProductOrServiceIdQualifiers.HealthCareFinancingAdministrationCommonProceduralCodingSystem, "99213"); sv1Segment.SV102_MonetaryAmount = 40; sv1Segment.SV103_UnitBasisMeasCode = UnitOrBasisOfMeasurementCode.Unit; sv1Segment.SV104_Quantity = 1; sv1Segment.SV107_CompDiagCodePoint = sv1Segment.CreateTypedElementCompositDiagnosisCodePointer(1); var dtpSegment = lxLoop.AddSegment(new TypedSegmentDTP()); dtpSegment.DTP01_DateTimeQualifier = DTPQualifier.Service; dtpSegment.DTP02_DateTimePeriodFormatQualifier = DTPFormatQualifier.CCYYMMDD; DateTime theDate = DateTime.ParseExact("20061003", "yyyyMMdd", null); dtpSegment.DTP03_Date = new DateTimePeriod(theDate); var lxLoop2 = claim2300Loop.AddLoop(new TypedLoopLX()); lxLoop2.LX01_AssignedNumber = 2; var sv1Segment2 = lxLoop2.AddSegment(new TypedSegmentSV1()); sv1Segment2.SV101_CompositeMedicalProcedure = sv1Segment2.CreateTypedElementCompositeMedicalProcedureIdentifier( ProductOrServiceIdQualifiers.HealthCareFinancingAdministrationCommonProceduralCodingSystem, "87070"); sv1Segment2.SV102_MonetaryAmount = 15; sv1Segment2.SV103_UnitBasisMeasCode = UnitOrBasisOfMeasurementCode.Unit; sv1Segment2.SV104_Quantity = 1; sv1Segment2.SV107_CompDiagCodePoint = sv1Segment.CreateTypedElementCompositDiagnosisCodePointer(1); var dtpSegment2 = lxLoop2.AddSegment(new TypedSegmentDTP()); dtpSegment2.DTP01_DateTimeQualifier = DTPQualifier.Service; dtpSegment2.DTP02_DateTimePeriodFormatQualifier = DTPFormatQualifier.CCYYMMDD; DateTime theDate2 = DateTime.ParseExact("20061003", "yyyyMMdd", null); dtpSegment2.DTP03_Date = new DateTimePeriod(theDate2); var lxLoop3 = claim2300Loop.AddLoop(new TypedLoopLX()); lxLoop3.LX01_AssignedNumber = 3; var sv1Segment3 = lxLoop3.AddSegment(new TypedSegmentSV1()); sv1Segment3.SV101_CompositeMedicalProcedure = sv1Segment3.CreateTypedElementCompositeMedicalProcedureIdentifier( ProductOrServiceIdQualifiers.HealthCareFinancingAdministrationCommonProceduralCodingSystem, "99214"); sv1Segment3.SV102_MonetaryAmount = 35; sv1Segment3.SV103_UnitBasisMeasCode = UnitOrBasisOfMeasurementCode.Unit; sv1Segment3.SV104_Quantity = 1; sv1Segment3.SV107_CompDiagCodePoint = sv1Segment3.CreateTypedElementCompositDiagnosisCodePointer(2); var dtpSegment3 = lxLoop3.AddSegment(new TypedSegmentDTP()); dtpSegment3.DTP01_DateTimeQualifier = DTPQualifier.Service; dtpSegment3.DTP02_DateTimePeriodFormatQualifier = DTPFormatQualifier.CCYYMMDD; DateTime theDate3 = DateTime.ParseExact("20061010", "yyyyMMdd", null); dtpSegment3.DTP03_Date = new DateTimePeriod(theDate3); var lxLoop4 = claim2300Loop.AddLoop(new TypedLoopLX()); lxLoop4.LX01_AssignedNumber = 4; var sv1Segment4 = lxLoop4.AddSegment(new TypedSegmentSV1()); sv1Segment4.SV101_CompositeMedicalProcedure = sv1Segment4.CreateTypedElementCompositeMedicalProcedureIdentifier( ProductOrServiceIdQualifiers.HealthCareFinancingAdministrationCommonProceduralCodingSystem, "86663"); sv1Segment4.SV102_MonetaryAmount = 10; sv1Segment4.SV103_UnitBasisMeasCode = UnitOrBasisOfMeasurementCode.Unit; sv1Segment4.SV104_Quantity = 1; sv1Segment4.SV107_CompDiagCodePoint = sv1Segment3.SV107_CompDiagCodePoint = sv1Segment3.CreateTypedElementCompositDiagnosisCodePointer(2); var dtpSegment4 = lxLoop4.AddSegment(new TypedSegmentDTP()); dtpSegment4.DTP01_DateTimeQualifier = DTPQualifier.Service; dtpSegment4.DTP02_DateTimePeriodFormatQualifier = DTPFormatQualifier.CCYYMMDD_CCYYMMDD; DateTime theDate4 = DateTime.ParseExact("20061010", "yyyyMMdd", null); dtpSegment4.DTP03_Date = new DateTimePeriod(theDate4, DateTime.ParseExact("20061025", "yyyyMMdd", null)); var x12 = message.SerializeToX12(true); Assert.AreEqual(new StreamReader(Extensions.GetEdi("INS._837P._5010.Example1_HealthInsurance.txt")).ReadToEnd(), message.SerializeToX12(true)); //Trace.Write(new StreamReader(Extensions.GetEdi("INS._837P._5010.Example1_HealthInsurance.txt")).ReadToEnd()); //Trace.Write(x12); }
/// <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); }
public void CreatePurchaseOrderChangeNotice860() { string expected = @"ISA*00* *00* *01*828513080 *01*001903202U *100818*0850*U*00401*000000245*0*P*:~ GS*PO*828513080*001903202U*20100818*0850*245*X*005010X222~ ST*860*0001~ BCH*01*SA****20100817*****20100818~ REF*IA*1to30chars~ DTM*010*20100819~ SE*5*0001~ GE*1*1~ IEA*1*000000245~"; var purcaseOrderDate = new DateTime(2010, 8, 17, 08, 50, 0); DateTime changeOrderDate = purcaseOrderDate.AddDays(1d); DateTime requestedShipDate = purcaseOrderDate.AddDays(2d); var interchange = new Interchange(changeOrderDate, 245, true) { InterchangeSenderIdQualifier = "01", InterchangeSenderId = "828513080", InterchangeReceiverIdQualifier = "01", InterchangeReceiverId = "001903202U", InterchangeDate = changeOrderDate, }; interchange.SetElement(14, "0"); FunctionGroup group = interchange.AddFunctionGroup("PO", changeOrderDate, 1, "005010X222"); group.ApplicationSendersCode = "828513080"; group.ApplicationReceiversCode = "001903202U"; group.Date = changeOrderDate; group.ControlNumber = 245; Transaction transaction = group.AddTransaction("860", "0001"); Segment bhtSegment = transaction.AddSegment("BCH"); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.TransactionSetPurpose, "01"); //01 is cancelllation 04 is change bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.TransactionSetTypeCode, "SA"); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.PurchaseOrderDate, purcaseOrderDate.ToString("yyyyMMdd")); bhtSegment.SetElement((int)BeginningSegmentPurchaseOrderChangeIndex.ChangeRequestDate, changeOrderDate.ToString("yyyyMMdd")); bhtSegment = transaction.AddSegment("REF"); bhtSegment.SetElement((int)ReferenceIdentificationIndex.ReferenceIdentificationQualifier, "IA"); bhtSegment.SetElement((int)ReferenceIdentificationIndex.ReferenceNumber, "1to30chars"); bhtSegment = transaction.AddSegment("DTM"); bhtSegment.SetElement((int)DateTimeReferenceIndex.TermsTypeCode, "010"); bhtSegment.SetElement((int)DateTimeReferenceIndex.RequestedShipDate, requestedShipDate.ToString("yyyyMMdd")); //Add to test //N1 – Name //Optional / Max Use=1 //N3 – Address Information //Conditional – use if N1 used/ Max Use=2 //N4 – Geographic Location //Conditional – use if N3 used / Max Use=1 time //POC – Line Item Change //Mandatory / Max Use=1 times per loop / Max Loop=99 times //DTM – Date/Time Reference //Mandatory / Max Use=1 times per loop //CTT – Transaction Totals //Mandatory / Max Use=1 time var x12 = interchange.SerializeToX12(true); Assert.AreEqual(expected, x12); }
public void ExportExcel() { CancellationRequested = false; IsExporting = true; var config = new FileConfigModel() { SenderID = "660001234", SenderIDQualifier = "30" }; var controlNumber = 1000; var parts = new List <List <ClaimLine> >(); var allIds = new List <ClaimLine>(ExcelList); while (allIds.Count > 0) { int take = allIds.Count() > FileRecordLimit ? FileRecordLimit : allIds.Count(); List <ClaimLine> part = allIds.Take(take).ToList(); parts.Add(part); allIds.RemoveRange(0, take); } var batchTimeStamp = DateTime.UtcNow.ToString("yyyyMMddhhmmtt"); IsLoading = true; foreach (var part in parts) { var partIndex = parts.IndexOf(part) + 1; var ix = new Interchange(DateTime.UtcNow, partIndex, true, '~', '*', ':'); ix.SetElement(12, "00501"); ix.SetElement(11, "^"); var fg = ix.AddFunctionGroup("HC", DateTime.UtcNow, partIndex, ClaimTypeProfessional); ix.InterchangeSenderIdQualifier = "30"; ix.InterchangeSenderId = "660001234"; ix.InterchangeReceiverIdQualifier = "30"; ix.InterchangeReceiverId = "GHP660001234"; fg.ApplicationReceiversCode = ix.InterchangeReceiverId.Clean(); fg.ApplicationSendersCode = ix.InterchangeSenderId.Clean(); foreach (var claim in part) { if (claim.IsError) { if (claim.Message?.Contains("Skipped") != true) { claim.Message = $"Skipped >{claim.Message}"; } continue; } try { claim.Message = "Processing..."; CreateProfessionalTransaction(claim, fg, config, controlNumber); claim.Message = $"OK"; } catch (Exception ex) { claim.Message = $"Error {ex.Message}"; } controlNumber++; if (CancellationRequested) { LoadingMessage = "Canceling..."; break; } } if (!CancellationRequested) { LoadingMessage = $"{controlNumber} of {ExcelList.Count}"; var cursorPosition = $"{partIndex}_of_{parts.Count}"; var fileName = $"EXCEL_837P_" + batchTimeStamp + $"_{cursorPosition}" + ".edi"; var fullPath = Path.Combine(FolderDestination, fileName); var text = ix.SerializeToX12(false); var bytes = System.Text.Encoding.ASCII.GetBytes(text); File.WriteAllBytes(fullPath, bytes); } } LoadingMessage = "Done!"; Task.Delay(500).ContinueWith((a) => { IsLoading = false; }); if (!CancellationRequested) { System.Diagnostics.Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", FolderDestination); } else { CancellationRequested = false; } IsExporting = false; }
public void CreatePurchaseOrder850() { DateTime purcaseOrderDate = DateTime.Now; Interchange interchange = new Interchange(purcaseOrderDate, 245, true) { InterchangeSenderIdQualifier = "01", InterchangeSenderId = "828513080", InterchangeReceiverIdQualifier = "01", InterchangeReceiverId = "001903202U", InterchangeDate = purcaseOrderDate, }; interchange.SetElement(14, "0"); //No Aknowlegement is 0 FunctionGroup group = interchange.AddFunctionGroup("PO", purcaseOrderDate, 1, "005010X222"); group.ApplicationSendersCode = "828513080"; group.ApplicationReceiversCode = "001903202U"; group.Date = purcaseOrderDate; group.ControlNumber = 245; Transaction transaction = group.AddTransaction("850", "0001"); Segment bhtSegment = transaction.AddSegment("BEG"); bhtSegment.SetElement(1, "00"); bhtSegment.SetElement(2, "SA"); bhtSegment.SetElement(3, "S41000439"); bhtSegment.SetElement(5, "20100810"); bhtSegment = transaction.AddSegment("CUR"); bhtSegment.SetElement(1, "BY"); bhtSegment.SetElement(2, "USD"); bhtSegment = transaction.AddSegment("PER"); bhtSegment.SetElement(1, "IC"); bhtSegment.SetElement(2, "Doe,Jane"); bhtSegment.SetElement(8, "Doe,Jane"); // Bill to address Loop loop = transaction.AddLoop("N1"); loop.SetElement(1, "BT"); loop.SetElement(2, "Doe Jane"); loop.SetElement(3, 92); loop.SetElement(4, 10001); Segment segment = loop.AddSegment("N3"); segment.SetElement(1, "Street"); segment.SetElement(2, "City State Pin Country"); segment = loop.AddSegment("N4"); segment.SetElement(1, "City"); segment.SetElement(2, "SS"); segment.SetElement(3, "PIN"); segment.SetElement(4, "SC"); // ship to address loop = transaction.AddLoop("N1"); loop.SetElement(1, "ST"); loop.SetElement(2, "Doe Jane"); loop.SetElement(3, 92); loop.SetElement(4, 10001); segment = loop.AddSegment("N3"); segment.SetElement(1, "Street"); segment.SetElement(2, "City State Pin Country"); segment = loop.AddSegment("N4"); segment.SetElement(1, "City"); segment.SetElement(2, "SS"); segment.SetElement(3, "PIN"); segment.SetElement(4, "SC"); // add products ordered loop = transaction.AddLoop("PO1"); loop.SetElement(1, "1"); loop.SetElement(2, 10); loop.SetElement(3, "EA"); loop.SetElement(4, "10.2"); loop.SetElement(6, "IB"); loop.SetElement(7, "100001"); var x12 = interchange.SerializeToX12(true); Console.WriteLine(x12); }
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 CreatePurchaseOrder850(PurchaseOrder purchaseOrder, string fileName) { DateTime purcaseOrderDate = DateTime.Now; Interchange interchange = new Interchange(purcaseOrderDate, Convert.ToInt32(purchaseOrder.Number), true) { InterchangeSenderIdQualifier = "ZZ", InterchangeSenderId = InterchangeSenderId, InterchangeReceiverIdQualifier = "ZZ", InterchangeReceiverId = InterchangeReceiverId, InterchangeDate = purcaseOrderDate, }; interchange.SetElement(14, "0"); //No Aknowlegement is 0 FunctionGroup group = interchange.AddFunctionGroup("PO", purcaseOrderDate, Convert.ToInt32(purchaseOrder.Number), "004010"); group.ApplicationSendersCode = InterchangeSenderId; group.ApplicationReceiversCode = InterchangeReceiverId; // group.Date = purcaseOrderDate; // group.ControlNumber = Convert.ToInt32(purchaseOrder.Number); Transaction transaction = group.AddTransaction("850", "0001"); Segment bhtSegment = transaction.AddSegment("BEG"); bhtSegment.SetElement(1, "00"); bhtSegment.SetElement(2, "SA"); bhtSegment.SetElement(3, purchaseOrder.Number); bhtSegment.SetElement(5, purcaseOrderDate.ToString("yyyyMMdd")); //bhtSegment = transaction.AddSegment("CUR"); //bhtSegment.SetElement(1, "BY"); //bhtSegment.SetElement(2, "USD"); //bhtSegment = transaction.AddSegment("PER"); //bhtSegment.SetElement(1, "IC"); //bhtSegment.SetElement(2, "Doe,Jane"); //bhtSegment.SetElement(8, "Doe,Jane"); //bill to section Loop loop = transaction.AddLoop("N1"); loop.SetElement(1, "BT"); loop.SetElement(2, purchaseOrder.Customer.BillingName); loop.SetElement(3, 92); loop.SetElement(4, purchaseOrder.Customer.BillingAddress.Id); Segment segment = loop.AddSegment("N3"); segment.SetElement(1, purchaseOrder.Customer.BillingAddress.Street); segment.SetElement(2, purchaseOrder.Customer.BillingAddress.City + " " + purchaseOrder.Customer.BillingAddress.State + " " + purchaseOrder.Customer.BillingAddress.PostalCode + " " + purchaseOrder.Customer.BillingAddress.Country); segment = loop.AddSegment("N4"); segment.SetElement(1, purchaseOrder.Customer.BillingAddress.City); segment.SetElement(2, purchaseOrder.Customer.BillingAddress.ShortState); // short state segment.SetElement(3, purchaseOrder.Customer.BillingAddress.PostalCode); segment.SetElement(4, purchaseOrder.Customer.BillingAddress.ShortCountry); //short country //ship to to section loop = transaction.AddLoop("N1"); loop.SetElement(1, "ST"); loop.SetElement(2, purchaseOrder.Customer.ShippingName); loop.SetElement(3, 92); loop.SetElement(4, purchaseOrder.Customer.ShippingAddress.Id); segment = loop.AddSegment("N3"); segment.SetElement(1, purchaseOrder.Customer.ShippingAddress.Street); segment.SetElement(2, purchaseOrder.Customer.ShippingAddress.City + " " + purchaseOrder.Customer.ShippingAddress.State + " " + purchaseOrder.Customer.ShippingAddress.PostalCode + " " + purchaseOrder.Customer.ShippingAddress.Country); segment = loop.AddSegment("N4"); segment.SetElement(1, purchaseOrder.Customer.ShippingAddress.City); segment.SetElement(2, purchaseOrder.Customer.BillingAddress.ShortState); // short state segment.SetElement(3, purchaseOrder.Customer.BillingAddress.PostalCode); segment.SetElement(4, purchaseOrder.Customer.BillingAddress.ShortCountry); //short country int count = 1; foreach (LineItem lineItem in purchaseOrder.Items) { loop = transaction.AddLoop("PO1"); loop.SetElement(1, count++); loop.SetElement(2, lineItem.Quantity); loop.SetElement(3, "EA"); loop.SetElement(4, lineItem.Price); loop.SetElement(6, "CGT"); loop.SetElement(7, lineItem.SupplierItemNumber); } loop = transaction.AddLoop("CTT"); loop.SetElement(1, --count); var x12 = interchange.SerializeToX12(true); Console.WriteLine(x12); // Write the string to a file. fileName += purchaseOrder.Number + ".850"; System.IO.StreamWriter file = new System.IO.StreamWriter(fileName); file.WriteLine(x12); file.Close(); }
public void FunctionGroupCreationTest() { Interchange interchange = CreateSample1WithFunctionGroup(); Assert.AreEqual(FunctionGroupSample1, interchange.SerializeToX12(true)); }