Example #1
0
        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));
        }
Example #5
0
        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));
        }
Example #9
0
        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);
            }
        }
Example #13
0
        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);
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #17
0
        /// <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);
        }
Example #18
0
        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;
        }
Example #20
0
        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));
        }
Example #22
0
        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));
        }