Ejemplo n.º 1
0
        public void ParseInterchangeToXml()
        {
            var x = new XmlDocument();

            var         i   = new Interchange(DateTime.Now, 1, true);
            var         fg  = i.AddFunctionGroup("HS", DateTime.Now, 11, "005010X279A1");
            Transaction st  = fg.AddTransaction("270", "1001");
            var         xml = i.Serialize(true);

            x.PreserveWhitespace = true;
            x.LoadXml(xml);
            var assertCount = new Action <string, int>((s, c) =>
            {
                var o = int.Parse(x.SelectSingleNode(s).InnerText);
                Assert.IsNotNull(o);
                Assert.AreEqual(c, o, s + " count is wrong");
            });

            assertCount("Interchange/IEA/IEA01", 1);
            assertCount("Interchange/FunctionGroup/GE/GE01", 1);
            assertCount("Interchange/FunctionGroup/Transaction/SE/SE01", 2);

            var prsr = new X12Parser();
            var edi  = prsr.TransformToX12(x.OuterXml);

            prsr.ParseMultiple(edi);
        }
Ejemplo n.º 2
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));
            }
        }
        private Interchange CreateSample1WithFunctionGroup()
        {
            Interchange   interchange = CreateSample1InterChange(DateTime.Parse("2002-08-16 11:44AM"));
            FunctionGroup fg          = interchange.AddFunctionGroup("HC", DateTime.Parse("2007-08-16 4:15PM"), 31);

            fg.ApplicationSendersCode   = "901234572000";
            fg.ApplicationReceiversCode = "908887732000";
            return(interchange);
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        public void Acknowledge837ITest()
        {
            var service   = new InstitutionalClaimAcknowledgmentService();
            var responses = service.AcknowledgeTransactions(this.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);
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        public void TestEmptyElement()
        {
            string      expectedSegmentString = "BEG*05*SA*S41000439";
            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");

            string segmentString = string.Empty;

            Segment bhtSegment = transaction.AddSegment("BEG");

            segmentString = bhtSegment.SegmentString;              //test getting it prematurely
            bhtSegment.SetElement(1, "05");
            bhtSegment.SetElement(2, "SA");
            bhtSegment.SetElement(3, "S41000439");
            bhtSegment.SetElement(5, "");

            segmentString = bhtSegment.SegmentString;

            Assert.AreEqual(expectedSegmentString, segmentString);
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
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));
        }
Ejemplo n.º 10
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 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);
        }
Ejemplo n.º 12
0
        public List <Interchange> ParseMultiple(Stream stream, Encoding encoding)
        {
            var envelopes = new List <Interchange>();

            using (X12StreamReader reader = new X12StreamReader(stream, encoding))
            {
                Interchange envelop = new Interchange(_specFinder, reader.CurrentIsaSegment);
                envelopes.Add(envelop);
                Container     currentContainer = envelop;
                FunctionGroup fg = null;
                Transaction   tr = null;
                Dictionary <string, HierarchicalLoop> hloops = new Dictionary <string, HierarchicalLoop>();

                string segmentString = reader.ReadNextSegment();
                string segmentId     = reader.ReadSegmentId(segmentString);
                int    segmentIndex  = 1;
                while (segmentString.Length > 0)
                {
                    switch (segmentId)
                    {
                    case "ISA":
                        envelop = new Interchange(_specFinder, segmentString + reader.Delimiters.SegmentTerminator);
                        envelopes.Add(envelop);
                        currentContainer = envelop;
                        fg     = null;
                        tr     = null;
                        hloops = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "IEA":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment {0} does not have a matching ISA segment preceding it.", segmentString));
                        }
                        envelop.SetTerminatingTrailerSegment(segmentString);
                        break;

                    case "GS":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(String.Format("Segment '{0}' cannot occur before and ISA segment.", segmentString));
                        }

                        currentContainer = fg = envelop.AddFunctionGroup(segmentString);;
                        break;

                    case "GE":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(String.Format("Segment '{0}' does not have a matching GS segment precending it.", segmentString));
                        }
                        fg.SetTerminatingTrailerSegment(segmentString);
                        fg = null;
                        break;

                    case "ST":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(string.Format("segment '{0}' cannot occur without a preceding GS segment.", segmentString));
                        }
                        segmentIndex     = 1;
                        currentContainer = tr = fg.AddTransaction(segmentString);
                        hloops           = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "SE":
                        if (tr == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment '{0}' does not have a matching ST segment preceding it.", segmentString));
                        }

                        tr.SetTerminatingTrailerSegment(segmentString);
                        tr = null;
                        break;

                    case "HL":
                        Segment hlSegment = new Segment(null, reader.Delimiters, segmentString);
                        string  id        = hlSegment.GetElement(1);
                        string  parentId  = hlSegment.GetElement(2);

                        if (parentId == "")
                        {
                            currentContainer = tr.AddHLoop(segmentString);
                        }
                        else
                        {
                            if (hloops.ContainsKey(parentId))
                            {
                                currentContainer = hloops[parentId].AddHLoop(segmentString);
                            }
                            else
                            {
                                throw new InvalidOperationException(String.Format("Hierarchical Loop {0} expects Parent ID {1} which did not occur preceding it.", id, parentId));
                            }
                        }
                        if (hloops.ContainsKey(id))
                        {
                            throw new InvalidOperationException(String.Format("Hierarchical Loop {0} cannot be added to transaction {1} because the ID {2} already exists.", segmentString, tr.ControlNumber, id));
                        }
                        hloops.Add(id, (HierarchicalLoop)currentContainer);
                        break;

                    case "TA1":     // Technical acknowledgement
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment {0} does not have a matching ISA segment preceding it.", segmentString));
                        }
                        envelop.AddSegment(segmentString);
                        break;

                    default:
                        while (currentContainer != null)
                        {
                            if (currentContainer.AddSegment(segmentString) != null)
                            {
                                break;
                            }
                            else
                            {
                                if (currentContainer is LoopContainer)
                                {
                                    LoopContainer loopContainer = (LoopContainer)currentContainer;

                                    Loop newLoop = loopContainer.AddLoop(segmentString);
                                    if (newLoop != null)
                                    {
                                        currentContainer = newLoop;
                                        break;
                                    }
                                    else
                                    {
                                        if (currentContainer is Transaction)
                                        {
                                            var tran = (Transaction)currentContainer;

                                            throw new TransactionValidationException(
                                                      "Segment '{3}' in segment position {4} within transaction '{1}' cannot be identified within the supplied specification for transaction set {0}.", tran.IdentifierCode, tran.ControlNumber, "", segmentString, segmentIndex);
                                        }
                                        else
                                        {
                                            currentContainer = currentContainer.Parent;
                                            continue;
                                        }
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        break;
                    }
                    segmentString = reader.ReadNextSegment();
                    segmentId     = reader.ReadSegmentId(segmentString);
                    segmentIndex++;
                }
                return(envelopes);
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Parses all interchanges from an X12 document
        /// </summary>
        /// <param name="stream">Stream pointing to source X12 data</param>
        /// <param name="encoding">Stream encoding for reading data</param>
        /// <returns><see cref="Interchange"/> collection parsed from X12</returns>
        /// <exception cref="InvalidOperationException">Thrown on any missing segments or parent IDs</exception>
        public List <Interchange> ParseMultiple(Stream stream, Encoding encoding)
        {
            var envelopes = new List <Interchange>();

            using (var reader = new X12StreamReader(stream, encoding, this.ignoredChars))
            {
                var envelop = new Interchange(this.specFinder, reader.CurrentIsaSegment);
                envelopes.Add(envelop);
                Container     currentContainer = envelop;
                FunctionGroup fg     = null;
                Transaction   tr     = null;
                var           hloops = new Dictionary <string, HierarchicalLoop>();

                string segmentString  = reader.ReadNextSegment();
                string segmentId      = reader.ReadSegmentId(segmentString);
                int    segmentIndex   = 1;
                var    containerStack = new Stack <string>();
                while (segmentString.Length > 0)
                {
                    switch (segmentId)
                    {
                    case "ISA":
                        envelop = new Interchange(this.specFinder, segmentString + reader.Delimiters.SegmentTerminator);
                        envelopes.Add(envelop);
                        currentContainer = envelop;
                        fg     = null;
                        tr     = null;
                        hloops = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "IEA":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMismatchSegment, segmentString, "ISA"));
                        }

                        envelop.SetTerminatingTrailerSegment(segmentString);
                        break;

                    case "GS":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMissingPrecedingSegment, segmentString, "ISA"));
                        }

                        currentContainer = fg = envelop.AddFunctionGroup(segmentString);
                        break;

                    case "GE":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMismatchSegment, segmentString, "GS"));
                        }

                        fg.SetTerminatingTrailerSegment(segmentString);
                        fg = null;
                        break;

                    case "ST":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMissingGsSegment, segmentString));
                        }

                        segmentIndex     = 1;
                        currentContainer = tr = fg.AddTransaction(segmentString);
                        hloops           = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "SE":
                        if (tr == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMismatchSegment, segmentString, "ST"));
                        }

                        tr.SetTerminatingTrailerSegment(segmentString);
                        tr = null;
                        break;

                    case "HL":
                        var    hierarchicalLoopSegment = new Segment(null, reader.Delimiters, segmentString);
                        string id        = hierarchicalLoopSegment.GetElement(1);
                        string parentId  = hierarchicalLoopSegment.GetElement(2);
                        string levelCode = hierarchicalLoopSegment.GetElement(3);

                        while (!(currentContainer is HierarchicalLoopContainer hlCurrentContainer && hlCurrentContainer.AllowsHierarchicalLoop(levelCode)))
                        {
                            if (currentContainer.Parent != null)
                            {
                                currentContainer = currentContainer.Parent;
                            }
                            else
                            {
                                throw new InvalidOperationException(string.Format(
                                                                        Resources.X12ParserInvalidHLoopSpecification,
                                                                        segmentString,
                                                                        tr.ControlNumber));
                            }
                        }

                        bool parentFound = false;
                        if (!string.IsNullOrEmpty(parentId))
                        {
                            if (hloops.ContainsKey(parentId))
                            {
                                parentFound      = true;
                                currentContainer = hloops[parentId].AddHLoop(segmentString);
                            }
                            else
                            {
                                if (this.throwExceptionOnSyntaxErrors)
                                {
                                    throw new InvalidOperationException(string.Format(Resources.X12ParserMissingParentIdError, id, parentId));
                                }

                                this.OnParserWarning(new X12ParserWarningEventArgs
                                {
                                    FileIsValid = false,
                                    InterchangeControlNumber     = envelop.InterchangeControlNumber,
                                    FunctionalGroupControlNumber = fg.ControlNumber,
                                    TransactionControlNumber     = tr.ControlNumber,
                                    SegmentPositionInInterchange = segmentIndex,
                                    Segment   = segmentString,
                                    SegmentId = segmentId,
                                    Message   = string.Format(Resources.X12ParserMissingParentIdWarning, id, parentId)
                                });
                            }
                        }

                        if (string.IsNullOrEmpty(parentId) || !parentFound)
                        {
                            while (!(currentContainer is HierarchicalLoopContainer hlCurrentContainer && hlCurrentContainer.HasHierachicalSpecs()))
                            {
                                currentContainer = currentContainer.Parent;
                            }

                            currentContainer = ((HierarchicalLoopContainer)currentContainer).AddHLoop(segmentString);
                        }

                        if (hloops.ContainsKey(id))
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserHLoopIdExists, segmentString, tr.ControlNumber, id));
                        }

                        hloops.Add(id, (HierarchicalLoop)currentContainer);
                        break;

                    case "TA1":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format(Resources.X12ParserMismatchSegment, segmentString, "ISA"));
                        }

                        envelop.AddSegment(segmentString);
                        break;

                    default:
                        var originalContainer = currentContainer;
                        containerStack.Clear();
                        while (currentContainer != null)
                        {
                            if (currentContainer.AddSegment(segmentString) != null)
                            {
                                if (segmentId == "LE")
                                {
                                    currentContainer = currentContainer.Parent;
                                }

                                break;
                            }

                            if (currentContainer is LoopContainer loopContainer)
                            {
                                Loop newLoop = loopContainer.AddLoop(segmentString);
                                if (newLoop != null)
                                {
                                    currentContainer = newLoop;
                                    break;
                                }

                                if (currentContainer is Transaction tran)
                                {
                                    if (this.throwExceptionOnSyntaxErrors)
                                    {
                                        throw new TransactionValidationException(
                                                  Resources.X12ParserSegmentCannotBeIdentitied,
                                                  tran.IdentifierCode,
                                                  tran.ControlNumber,
                                                  string.Empty,
                                                  segmentString,
                                                  segmentIndex,
                                                  string.Join(",", containerStack));
                                    }

                                    currentContainer = originalContainer;
                                    currentContainer.AddSegment(segmentString, true);
                                    this.OnParserWarning(new X12ParserWarningEventArgs
                                    {
                                        FileIsValid = false,
                                        InterchangeControlNumber     = envelop.InterchangeControlNumber,
                                        FunctionalGroupControlNumber = fg.ControlNumber,
                                        TransactionControlNumber     = tran.ControlNumber,
                                        SegmentPositionInInterchange = segmentIndex,
                                        SegmentId = segmentId,
                                        Segment   = segmentString,
                                        Message   = string.Format(
                                            Resources.X12ParserSegmentWarning,
                                            tran.IdentifierCode,
                                            tran.ControlNumber,
                                            segmentString,
                                            segmentIndex,
                                            string.Join(",", containerStack),
                                            containerStack.LastOrDefault())
                                    });
                                    break;
                                }

                                if (currentContainer is Loop containerLoop)
                                {
                                    containerStack.Push(containerLoop.Specification.LoopId);
                                }

                                if (currentContainer is HierarchicalLoop hloop)
                                {
                                    containerStack.Push($"{hloop.Specification.LoopId}[{hloop.Id}]");
                                }

                                currentContainer = currentContainer.Parent;
                                continue;
                            }

                            break;
                        }

                        break;
                    }

                    segmentString = reader.ReadNextSegment();
                    segmentId     = reader.ReadSegmentId(segmentString);
                    segmentIndex++;
                }

                return(envelopes);
            }
        }
Ejemplo n.º 14
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();
        }
Ejemplo n.º 15
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);
        }
Ejemplo n.º 16
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);
        }
Ejemplo n.º 17
0
        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;
        }
Ejemplo n.º 18
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);
        }
Ejemplo n.º 19
0
        public List <Interchange> ParseMultiple(Stream stream, Encoding encoding)
        {
            var envelopes = new List <Interchange>();

            using (X12StreamReader reader = new X12StreamReader(stream, encoding, _ignoredChars))
            {
                Interchange envelop = new Interchange(_specFinder, reader.CurrentIsaSegment);
                envelopes.Add(envelop);
                Container     currentContainer = envelop;
                FunctionGroup fg = null;
                Transaction   tr = null;
                Dictionary <string, HierarchicalLoop> hloops = new Dictionary <string, HierarchicalLoop>();

                string         segmentString  = reader.ReadNextSegment();
                string         segmentId      = reader.ReadSegmentId(segmentString);
                int            segmentIndex   = 1;
                Stack <string> containerStack = new Stack <string>();
                while (segmentString.Length > 0)
                {
                    switch (segmentId)
                    {
                    case "ISA":
                        envelop = new Interchange(_specFinder, segmentString + reader.Delimiters.SegmentTerminator);
                        envelopes.Add(envelop);
                        currentContainer = envelop;
                        fg     = null;
                        tr     = null;
                        hloops = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "IEA":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment {0} does not have a matching ISA segment preceding it.", segmentString));
                        }
                        envelop.SetTerminatingTrailerSegment(segmentString);
                        break;

                    case "GS":
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(String.Format("Segment '{0}' cannot occur before and ISA segment.", segmentString));
                        }

                        currentContainer = fg = envelop.AddFunctionGroup(segmentString);;
                        break;

                    case "GE":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(String.Format("Segment '{0}' does not have a matching GS segment precending it.", segmentString));
                        }
                        fg.SetTerminatingTrailerSegment(segmentString);
                        fg = null;
                        break;

                    case "ST":
                        if (fg == null)
                        {
                            throw new InvalidOperationException(string.Format("segment '{0}' cannot occur without a preceding GS segment.", segmentString));
                        }
                        segmentIndex     = 1;
                        currentContainer = tr = fg.AddTransaction(segmentString);
                        hloops           = new Dictionary <string, HierarchicalLoop>();
                        break;

                    case "SE":
                        if (tr == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment '{0}' does not have a matching ST segment preceding it.", segmentString));
                        }

                        tr.SetTerminatingTrailerSegment(segmentString);
                        tr = null;
                        break;

                    case "HL":
                        Segment hlSegment = new Segment(null, reader.Delimiters, segmentString);
                        string  id        = hlSegment.GetElement(1);
                        string  parentId  = hlSegment.GetElement(2);
                        string  levelCode = hlSegment.GetElement(3);

                        while (!(currentContainer is HierarchicalLoopContainer) || !((HierarchicalLoopContainer)currentContainer).AllowsHierarchicalLoop(levelCode))
                        {
                            if (currentContainer.Parent != null)
                            {
                                currentContainer = currentContainer.Parent;
                            }
                            else
                            {
                                throw new InvalidOperationException(String.Format("Heierchical Loop {0}  cannot be added to transaction set {1} because it's specification cannot be identified.", segmentString, tr.ControlNumber));
                            }
                        }
                        bool parentFound = false;
                        if (parentId != "")
                        {
                            if (hloops.ContainsKey(parentId))
                            {
                                parentFound      = true;
                                currentContainer = hloops[parentId].AddHLoop(segmentString);
                            }
                            else
                            {
                                if (_throwExceptionOnSyntaxErrors)
                                {
                                    throw new InvalidOperationException(String.Format("Hierarchical Loop {0} expects Parent ID {1} which did not occur preceding it.  To change this to a warning, pass throwExceptionOnSyntaxErrors = false to the X12Parser constructor.", id, parentId));
                                }
                                else
                                {
                                    OnParserWarning(new X12ParserWarningEventArgs
                                    {
                                        FileIsValid = false,
                                        InterchangeControlNumber     = envelop.InterchangeControlNumber,
                                        FunctionalGroupControlNumber = fg.ControlNumber,
                                        TransactionControlNumber     = tr.ControlNumber,
                                        SegmentPositionInInterchange = segmentIndex,
                                        Segment   = segmentString,
                                        SegmentId = segmentId,
                                        Message   = String.Format("Hierarchical Loop {0} expects Parent ID {1} which did not occur preceding it.  This will be parsed as if it has no parent, but the file may not be valid.", id, parentId)
                                    });
                                }
                            }
                        }

                        if (parentId == "" || !parentFound)
                        {
                            while (!(currentContainer is HierarchicalLoopContainer && ((HierarchicalLoopContainer)currentContainer).HasHierachicalSpecs()))
                            {
                                currentContainer = currentContainer.Parent;
                            }
                            currentContainer = ((HierarchicalLoopContainer)currentContainer).AddHLoop(segmentString);
                            //hloops = new Dictionary<string, HierarchicalLoop>();
                        }
                        if (hloops.ContainsKey(id))
                        {
                            throw new InvalidOperationException(String.Format("Hierarchical Loop {0} cannot be added to transaction {1} because the ID {2} already exists.", segmentString, tr.ControlNumber, id));
                        }
                        hloops.Add(id, (HierarchicalLoop)currentContainer);
                        break;

                    case "TA1":     // Technical acknowledgement
                        if (envelop == null)
                        {
                            throw new InvalidOperationException(string.Format("Segment {0} does not have a matching ISA segment preceding it.", segmentString));
                        }
                        envelop.AddSegment(segmentString);
                        break;

                    default:
                        var originalContainer = currentContainer;
                        containerStack.Clear();
                        while (currentContainer != null)
                        {
                            if (currentContainer.AddSegment(segmentString) != null)
                            {
                                if (segmentId == "LE")
                                {
                                    currentContainer = currentContainer.Parent;
                                }
                                break;
                            }
                            else
                            {
                                if (currentContainer is LoopContainer)
                                {
                                    LoopContainer loopContainer = (LoopContainer)currentContainer;

                                    Loop newLoop = loopContainer.AddLoop(segmentString);
                                    if (newLoop != null)
                                    {
                                        currentContainer = newLoop;
                                        break;
                                    }
                                    else
                                    {
                                        if (currentContainer is Transaction)
                                        {
                                            var tran = (Transaction)currentContainer;

                                            if (_throwExceptionOnSyntaxErrors)
                                            {
                                                throw new TransactionValidationException(
                                                          "Segment '{3}' in segment position {4} within transaction '{1}' cannot be identified within the supplied specification for transaction set {0} in any of the expected loops: {5}.  To change this to a warning, pass throwExceptionOnSyntaxErrors = false to the X12Parser constructor.", tran.IdentifierCode, tran.ControlNumber, "", segmentString, segmentIndex, string.Join(",", containerStack));
                                            }
                                            else
                                            {
                                                currentContainer = originalContainer;
                                                currentContainer.AddSegment(segmentString, true);
                                                OnParserWarning(new X12ParserWarningEventArgs
                                                {
                                                    FileIsValid = false,
                                                    InterchangeControlNumber     = envelop.InterchangeControlNumber,
                                                    FunctionalGroupControlNumber = fg.ControlNumber,
                                                    TransactionControlNumber     = tran.ControlNumber,
                                                    SegmentPositionInInterchange = segmentIndex,
                                                    SegmentId = segmentId,
                                                    Segment   = segmentString,
                                                    Message   = string.Format("Segment '{3}' in segment position {4} within transaction '{1}' cannot be identified within the supplied specification for transaction set {0} in any of the expected loops: {5}.  It will be added to loop {6}, but this may invalidate all subsequent segments.", tran.IdentifierCode, tran.ControlNumber, "", segmentString, segmentIndex, string.Join(",", containerStack), containerStack.LastOrDefault())
                                                });
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            if (currentContainer is Loop)
                                            {
                                                containerStack.Push(((Loop)currentContainer).Specification.LoopId);
                                            }
                                            if (currentContainer is HierarchicalLoop)
                                            {
                                                var hloop = ((HierarchicalLoop)currentContainer);
                                                containerStack.Push(string.Format("{0}[{1}]", hloop.Specification.LoopId, hloop.Id));
                                            }

                                            currentContainer = currentContainer.Parent;
                                            continue;
                                        }
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        break;
                    }
                    segmentString = reader.ReadNextSegment();
                    segmentId     = reader.ReadSegmentId(segmentString);
                    segmentIndex++;
                }
                return(envelopes);
            }
        }