private T SaveInterchange(Interchange interchange, string filename, string userName)
        {
            DateTime date = DateTime.MaxValue;

            try
            {
                date = interchange.InterchangeDate;
            }
            catch (Exception exc)
            {
                Trace.TraceWarning("Interchange date '{0}' and time '{1}' could not be parsed. {2}", interchange.GetElement(9), interchange.GetElement(10), exc.Message);
            }

            SqlCommand cmd = new SqlCommand(GetContainerIdSql("ISA") + string.Format(@"
INSERT INTO [{0}].[Interchange] (Id, SenderId, ReceiverId, ControlNumber, [Date], SegmentTerminator, ElementSeparator, ComponentSeparator, Filename, HasError, CreatedBy, CreatedDate)
VALUES (@id, @senderId, @receiverId, @controlNumber, @date, @segmentTerminator, @elementSeparator, @componentSeparator, @filename, 0, @createdBy, getdate())

SELECT @id ", _schema));

            cmd.Parameters.AddWithValue("@senderId", interchange.InterchangeSenderId);
            cmd.Parameters.AddWithValue("@receiverId", interchange.InterchangeReceiverId);
            cmd.Parameters.AddWithValue("@controlNumber", interchange.InterchangeControlNumber);
            cmd.Parameters.AddWithValue("@date", date);
            cmd.Parameters.AddWithValue("@segmentTerminator", interchange.Delimiters.SegmentTerminator);
            cmd.Parameters.AddWithValue("@elementSeparator", interchange.Delimiters.ElementSeparator);
            cmd.Parameters.AddWithValue("@componentSeparator", interchange.Delimiters.SubElementSeparator);
            cmd.Parameters.AddWithValue("@filename", filename);
            cmd.Parameters.AddWithValue("@createdBy", userName);

            var interchangeId = ExecuteScalar(cmd);

            return(base.ConvertT(interchangeId));
        }
Example #2
0
        public void UnbundleItemsFrom856Test()
        {
            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("ORD._856.Example1.txt")).First();

            var list = parser.UnbundleByLoop(interchange, "ITEM");
        }
Example #3
0
        public void TestToInterchangeWithEnvelopeSchemaValidation()
        {
            // ARRANGE
            const string sample      = "EdiFabric.Tests.Edi.X12_810_00204.txt";
            const string envelopeXsd = "EdiFabric.Tests.Xsd.X12Envelope.xsd";

            // ACT
            var interchange = Interchange.LoadFrom(Assembly.GetExecutingAssembly().GetManifestResourceStream(sample));
            var xml         = TestHelper.Serialize(interchange, TargetNamespaceX12);

            var schemas = new XmlSchemaSet();
            var stream  = Assembly.GetExecutingAssembly().GetManifestResourceStream(envelopeXsd);

            if (stream != null)
            {
                var schema = XmlSchema.Read(stream, null);
                schemas.Add(schema);
            }
            var doc    = new XDocument(xml);
            var errors = false;

            doc.Validate(schemas, (o, e) => { errors = true; });

            // ASSERT
            Assert.IsFalse(errors);
        }
        /// <summary>
        /// Separates all <see cref="Segment"/> objects from an <see cref="Interchange"/>
        /// </summary>
        /// <param name="interchange">Object to remove Segments from</param>
        /// <returns>Collection of <see cref="Interchange"/> objects</returns>
        public List <Interchange> UnbundleByTransaction(Interchange interchange)
        {
            var    interchanges = new List <Interchange>();
            char   terminator   = interchange.Delimiters.SegmentTerminator;
            string isa          = interchange.SegmentString;
            string iea          = interchange.TrailerSegments.First().SegmentString;

            foreach (FunctionGroup group in interchange.FunctionGroups)
            {
                foreach (Transaction transaction in group.Transactions)
                {
                    var x12 = new StringBuilder();
                    x12.Append($"{isa}{terminator}");
                    x12.Append($"{group.SegmentString}{terminator}");
                    x12.Append(transaction.SerializeToX12(false));
                    x12.Append($"{group.TrailerSegments.First().SegmentString}{terminator}");
                    x12.Append($"{iea}{terminator}");

                    using (var mstream = new MemoryStream(Encoding.ASCII.GetBytes(x12.ToString())))
                    {
                        interchanges.AddRange(this.ParseMultiple(mstream));
                    }
                }
            }

            return(interchanges);
        }
Example #5
0
        public void TestToEdiWithTrailingSeparator()
        {
            // ARRANGE
            const string sample         = "EdiFabric.Tests.Xml.Edifact_INVOIC_D00A_TrailingSeparator.xml";
            const string expectedResult = "EdiFabric.Tests.Edi.Edifact_INVOIC_D00A_TrailingSeparator.txt";

            var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(expectedResult);

            Debug.Assert(stream != null, "stream != null");

            var reader      = new StreamReader(stream);
            var expectedEdi = new List <string>();

            while (reader.Peek() >= 0)
            {
                expectedEdi.Add(reader.ReadLine());
            }

            // ACT
            var parsedEdi = Interchange.LoadFrom(XElement.Load(Assembly.GetExecutingAssembly().GetManifestResourceStream(sample))).ToEdi();

            // ASSERT
            Assert.AreEqual(expectedEdi.Count, parsedEdi.Count);
            for (int i = 0; i < parsedEdi.Count; i++)
            {
                Assert.IsTrue(parsedEdi[i] == expectedEdi[i]);
            }
        }
Example #6
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);
        }
Example #7
0
        public List <Interchange> UnbundleByTransaction(Interchange interchange)
        {
            List <Interchange> interchanges = new List <Interchange>();

            char          terminator = interchange._delimiters.SegmentTerminator;
            var           service    = new UnbundlingService(interchange._delimiters.SegmentTerminator);
            string        isa        = interchange.SegmentString;
            string        iea        = interchange.TrailerSegments.First().SegmentString;
            List <string> list       = new List <string>();

            foreach (FunctionGroup group in interchange.FunctionGroups)
            {
                foreach (Transaction transaction in group.Transactions)
                {
                    StringBuilder x12 = new StringBuilder();
                    x12.AppendFormat("{0}{1}", isa, terminator);
                    x12.AppendFormat("{0}{1}", group.SegmentString, terminator);
                    x12.Append(transaction.SerializeToX12(false));
                    x12.AppendFormat("{0}{1}", group.TrailerSegments.First().SegmentString, terminator);
                    x12.AppendFormat("{0}{1}", iea, terminator);
                    using (MemoryStream mstream = new MemoryStream(Encoding.ASCII.GetBytes(x12.ToString())))
                    {
                        interchanges.AddRange(ParseMultiple(mstream));
                    }
                }
            }

            return(interchanges);
        }
Example #8
0
        public List <Interchange> UnbundleByLoop(Interchange interchange, string loopId)
        {
            char          terminator = interchange._delimiters.SegmentTerminator;
            var           service    = new UnbundlingService(interchange._delimiters.SegmentTerminator);
            string        isa        = interchange.SegmentString;
            string        iea        = interchange.TrailerSegments.First().SegmentString;
            List <string> list       = new List <string>();

            foreach (FunctionGroup group in interchange.FunctionGroups)
            {
                foreach (Transaction transaction in group.Transactions)
                {
                    service.UnbundleHLoops(list, transaction, loopId);
                }
            }

            List <Interchange> interchanges = new List <Interchange>();

            foreach (var item in list)
            {
                StringBuilder x12 = new StringBuilder();
                x12.AppendFormat("{0}{1}", isa, terminator);
                x12.Append(item);
                x12.AppendFormat("{0}{1}", iea, terminator);
                using (MemoryStream mstream = new MemoryStream(Encoding.ASCII.GetBytes(x12.ToString())))
                {
                    interchanges.AddRange(ParseMultiple(mstream));
                }
            }
            return(interchanges);
        }
Example #9
0
        public void TestToEdiWithSegmentList()
        {
            // ARRANGE
            const string sample         = "EdiFabric.Tests.Xml.X12_810_00204_SegmentList.xml";
            const string expectedResult = "EdiFabric.Tests.Edi.X12_810_00204.txt";

            var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(expectedResult);

            Debug.Assert(stream != null, "stream != null");

            var reader      = new StreamReader(stream);
            var expectedEdi = new List <string>();

            while (reader.Peek() >= 0)
            {
                expectedEdi.Add(reader.ReadLine());
            }
            var interchangeContext = new InterchangeContext
            {
                RepetitionSeparator = "|"
            };

            // ACT
            var parsedEdi =
                Interchange.LoadFrom(XElement.Load(Assembly.GetExecutingAssembly().GetManifestResourceStream(sample))).ToEdi(interchangeContext);

            // ASSERT
            Assert.AreEqual(expectedEdi.Count, parsedEdi.Count);
            for (int i = 0; i < parsedEdi.Count; i++)
            {
                Assert.IsTrue(parsedEdi[i] == expectedEdi[i]);
            }
        }
Example #10
0
        public void TestToInterchangeWithInvalidEnum()
        {
            // ARRANGE
            const string sample = "EdiFabric.Tests.Edi.Hipaa_837P_00401_BadSegment.txt";
            const string expectedErrorMessage = "Instance validation error: 'CL' is not a valid value for S_BHT_BeginningOfHierarchicalTransaction_TS837Q1D_BHT06_ClaimOrEncounterIdentifier.";

            // ACT
            try
            {
                var interchange = Interchange.LoadFrom(Assembly.GetExecutingAssembly().GetManifestResourceStream(sample));
                var message     = interchange.Groups[0].Messages[0];

                if (message.Context.Tag == "837" && message.Context.Origin == "X098")
                {
                    message.DeserializeItem <M_837>();

                    // ASSERT
                    Assert.Fail();
                }
                else
                {
                    Assert.Fail();
                }
            }
            catch (Exception ex)
            {
                // ASSERT
                Assert.IsTrue(ex.InnerException.Message == expectedErrorMessage);
            }
        }
Example #11
0
 public static void Main(string[] args)
 {
     Interchange I1= new Interchange();
     I1.Swap();
     I1.Display();
     Console.ReadLine();
 }
Example #12
0
        public void FlattenUsingXmlDocument()
        {
            Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("OopFactory.X12.Tests.Unit.Parsing._SampleEdiFiles.ORD._820.Example1_MortgageBankers.txt");

            X12Parser   parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(stream).First();
            string      xml         = interchange.Serialize();

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(xml);

            FileStream   fstream = new FileStream("ORD._820.Example1.txt", FileMode.Create);
            StreamWriter writer  = new StreamWriter(fstream);

            writer.WriteLine("Transaction,Creation Date,Submitter Name, Borrower Last Name, Remittance ID");
            foreach (XmlElement transaction in doc.SelectNodes("/Interchange/FunctionGroup/Transaction"))
            {
                foreach (XmlElement entity in transaction.SelectNodes("Loop[@LoopId='ENT']"))
                {
                    foreach (XmlElement remit in entity.SelectNodes("Loop[@LoopId='RMR']"))
                    {
                        writer.WriteLine("{0},{1},{2},{3},{4}",
                                         transaction.SelectSingleNode("ST/ST02").InnerText,
                                         transaction.SelectSingleNode("DTM[DTM01='097']/DTM02").InnerText,
                                         transaction.SelectSingleNode("Loop[@LoopId='N1']/N1[N101='41']/N102").InnerText,
                                         entity.SelectSingleNode("Loop[@LoopId='NM1']/NM1[NM101='BW']/NM103").InnerText,
                                         remit.SelectSingleNode("RMR/RMR02").InnerText);
                    }
                }
            }

            writer.Close();
            fstream.Close();
        }
        public void ParseModifyAndTransformBackToX12(
            [ValueSource(typeof(ResourcePathManager), nameof(ResourcePathManager.ResourcePaths))]
            string resourcePath)
        {
            var stream = GetEdi("INS._270._4010.Example1_DHHS.txt");

            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(stream).First();
            string      xml         = interchange.Serialize();

            var doc = new XmlDocument
            {
                PreserveWhitespace = true
            };

            doc.LoadXml(xml);

            XmlElement dmgElement = (XmlElement)doc.GetElementsByTagName("DMG")[0];

            dmgElement.ParentNode.RemoveChild(dmgElement);

            string x12 = parser.TransformToX12(doc.OuterXml);

            var    modifiedInterchange = parser.ParseMultiple(x12).First();
            string newX12 = modifiedInterchange.SerializeToX12(true);

            var seSegment = modifiedInterchange.FunctionGroups.First().Transactions.First().TrailerSegments.FirstOrDefault(ts => ts.SegmentId == "SE");

            Assert.IsNotNull(seSegment);
            Assert.AreEqual("0001", seSegment.GetElement(2));
            Assert.AreEqual("15", seSegment.GetElement(1));
        }
Example #14
0
        static void Main(string[] args)
        {
            string inputFilename    = args[0];
            string outputFilename   = args[1];
            string isaControlNumber = args.Length > 2 ? args[2] : "999";
            string gsControlNumber  = args.Length > 3 ? args[3] : "99";

            var service = new X12AcknowledgmentService();

            using (FileStream fs = new FileStream(inputFilename, FileMode.Open, FileAccess.Read))
            {
                using (X12StreamReader reader = new X12StreamReader(fs, Encoding.UTF8))
                {
                    var firstTrans = reader.ReadNextTransaction();
                    if (reader.LastTransactionCode == "837")
                    {
                        if (reader.TransactionContainsSegment(firstTrans.Transactions[0], "SV2"))
                        {
                            service = new InstitutionalClaimAcknowledgmentService();
                        }
                        if (reader.TransactionContainsSegment(firstTrans.Transactions[0], "SV1"))
                        {
                            service = new X12AcknowledgmentService(new ProfessionalClaimSpecificationFinder());
                        }
                    }
                }
            }

            using (FileStream fs = new FileStream(inputFilename, FileMode.Open, FileAccess.Read))
            {
                // Create aknowledgements and identify errors
                var responses = service.AcknowledgeTransactions(fs);

                // Change any acknowledgment codes here to reject transactions with errors
                // CUSTOM BUSINESS LOGIC HERE

                // Transform to outbound interchange for serialization
                var interchange = new Interchange(DateTime.Now, int.Parse(isaControlNumber), true);
                interchange.AuthorInfoQualifier            = ConfigurationManager.AppSettings["AuthorInfoQualifier"];
                interchange.AuthorInfo                     = ConfigurationManager.AppSettings["AuthorInfo"];
                interchange.SecurityInfoQualifier          = ConfigurationManager.AppSettings["SecurityInfoQualifier"];
                interchange.SecurityInfo                   = ConfigurationManager.AppSettings["SecurityInfo"];
                interchange.InterchangeSenderIdQualifier   = ConfigurationManager.AppSettings["InterchangeSenderIdQualifier"];
                interchange.InterchangeSenderId            = ConfigurationManager.AppSettings["InterchangeSenderId"];
                interchange.InterchangeReceiverIdQualifier = responses.First().SenderIdQualifier;
                interchange.InterchangeReceiverId          = responses.First().SenderId;
                interchange.SetElement(12, "00501");


                var group = interchange.AddFunctionGroup("FA", DateTime.Now, int.Parse(gsControlNumber));
                group.ApplicationSendersCode = ConfigurationManager.AppSettings["InterchangeSenderId"];
                group.VersionIdentifierCode  = "005010X231A1";

                group.Add999Transaction(responses);

                // This is a demonstration example only, change true to false to create continous x12 without line feeds.
                File.WriteAllText(outputFilename, interchange.SerializeToX12(true));
            }
        }
        public void TransactionCreationTest()
        {
            Interchange interchange = CreateSample1WithFunctionGroup();

            interchange.FunctionGroups.First().AddTransaction("837", "0034");

            Assert.AreEqual(TransactionSample1, interchange.SerializeToX12(true));
        }
Example #16
0
    static void Main()
    {
        Interchange I1 = new Interchange();

        I1.Swap();
        I1.Display();
        Console.ReadLine();
    }
Example #17
0
    public static void Main(string[] args)
    {
        Interchange I1 = new Interchange();

        I1.Swap();
        I1.Display();
        Console.ReadLine();
    }
        public void TransactionCreationWithSegmentFromStringTest()
        {
            Interchange interchange = this.CreateSample1WithFunctionGroup();
            Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034");
            Segment     bht         = transaction.AddSegment("BHT*0019*00*3920394930203*20070816*1615*CH");

            Assert.AreEqual("0019", bht.GetElement(1));
        }
        public void UnbundleClaimsIn837FromNthTest()
        {
            X12Parser   parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("INS._837P._4010.FromNth.837_DeIdent_05.dat")).First();

            var list = parser.UnbundleByLoop(interchange, "2300");

            Assert.AreEqual(186, list.Count);
        }
        public void Unbundling835ByLoop2110()
        {
            X12Parser   parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("INS._835._4010.Example1_GripElements.txt")).First();

            var list = parser.UnbundleByLoop(interchange, "2110");

            Assert.AreEqual(9, list.Count);
        }
        public void ClaimCreationTest()
        {
            Interchange interchange = CreateSample1WithFunctionGroup();
            Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034");
            Segment     bhtSegment  = transaction.AddSegment("BHT*0019*00*3920394930203*20070816*1615*CH");
            Segment     refSegment  = transaction.AddSegment("REF*87*004010X096A1");
            Loop        senderLoop  = transaction.AddLoop("NM1*41*2*HOWDEE HOSPITAL*****XX*0123456789");

            senderLoop.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111");
            Loop             receiverLoop = transaction.AddLoop("NM1*40*2*BLUE CROSS BLUE SHIELD OF NC*****46*987654321");
            HierarchicalLoop providerLoop = transaction.AddHLoop("1", "20", true);

            providerLoop.AddSegment("PRV*BI*ZZ*203BA0200N");
            var billingProvider = providerLoop.AddLoop("NM1*85*2*HOWDEE HOSPITAL*****XX*0123456789");

            billingProvider.AddSegment("N3*123 HOWDEE BOULEVARD");
            billingProvider.AddSegment("N4*DURHAM*NC*27701");
            billingProvider.AddSegment("REF*1J*654");
            billingProvider.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111*FX*6145551212");
            HierarchicalLoop subscriberLoop = providerLoop.AddHLoop("2", "22", false);

            subscriberLoop.AddSegment("SBR*P*18*XYZ1234567******BL");
            subscriberLoop.AddSegment("PAT*********Y");
            var subscriberNameLoop = subscriberLoop.AddLoop("NM1*IL*1*DOUGH*MARY****MI*12312312312");

            subscriberNameLoop.AddSegment("N3*BOX 12312");
            subscriberNameLoop.AddSegment("N4*DURHAM*NC*27715");
            subscriberNameLoop.AddSegment("DMG*D8*19670807*F");
            subscriberLoop.AddLoop("NM1*PR*2*BLUE CROSS BLUE SHIELD OF NC*****PI*987654321");
            var claimLoop = subscriberLoop.AddLoop("CLM*2235057*200***13:A:1*Y**Y*A*********N");

            claimLoop.AddSegment("DTP*434*RD8*20070730-20070730");
            claimLoop.AddSegment("CL1*1*9*01");
            claimLoop.AddSegment("AMT*C5*160");
            claimLoop.AddSegment("REF*F8*ASD0000123");
            claimLoop.AddSegment("HI*BK:25000");
            claimLoop.AddSegment("HI*BF:78901");
            claimLoop.AddSegment("HI*BR:4491:D8:20070730");
            claimLoop.AddSegment("HI*BH:41:D8:20070501*BH:27:D8:20070715*BH:33:D8:20070415*BH:C2:D8:20070410");
            claimLoop.AddSegment("HI*BE:30:::20");
            claimLoop.AddSegment("HI*BG:01");
            var physicianLoop = claimLoop.AddLoop("NM1*71*1*SMITH*ELIZABETH*AL***34*243898989");

            physicianLoop.AddSegment("REF*1G*P97777");
            var claimLineLoop = claimLoop.AddLoop("LX*1");

            claimLineLoop.AddSegment("SV2*0300*HC:81000*120*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");
            claimLineLoop = claimLoop.AddLoop("LX*2");
            claimLineLoop.AddSegment("SV2*0320*HC:76092*50*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");
            claimLineLoop = claimLoop.AddLoop("LX*3");
            claimLineLoop.AddSegment("SV2*0270*HC:J1120*30*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");

            Assert.AreEqual(new StreamReader(Extensions.GetEdi("INS._837I._4010.Example1.txt")).ReadToEnd(), interchange.SerializeToX12(true));
        }
        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);
        }
        public void OutlineIsSameAsOriginal()
        {
            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiry))).First();

            Interchange interchangeFromOutline = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiryOutline))).First();

            Assert.AreEqual(interchange.SerializeToX12(false), interchangeFromOutline.SerializeToX12(false));
        }
        private Interchange CreateSample1InterChange(DateTime date)
        {
            Interchange interchange = new Interchange(date, 31, false);

            interchange.InterchangeSenderId   = "9012345720000";
            interchange.InterchangeReceiverId = "9088877320000";

            return(interchange);
        }
Example #25
0
        /// <summary>
        /// Main entry point for the driver
        /// </summary>
        /// <param name="args">Additional arguments for program options</param>
        public static void Main(string[] args)
        {
            var opts = new ExecutionOptions();

            try
            {
                opts.LoadOptions(args);
            }
            catch (ArgumentException exc)
            {
                Console.Write(exc.Message);
                return;
            }

            var parser = new X12Parser();

            foreach (var filename in Directory.GetFiles(opts.InputDirectory, opts.FilenamePattern))
            {
                var inputFile = new FileInfo(filename);
                var list      = new List <Interchange>();

                using (var fs = new FileStream(inputFile.FullName, FileMode.Open, FileAccess.Read))
                {
                    var reader = new X12StreamReader(fs, Encoding.UTF8);
                    X12FlatTransaction transaction = reader.ReadNextTransaction();
                    while (!string.IsNullOrEmpty(transaction.Transactions.First()))
                    {
                        string      x12         = transaction.ToString();
                        Interchange interchange = parser.ParseMultiple(x12).First();
                        if (opts.LoopId == "ST")
                        {
                            list.Add(interchange);
                        }
                        else
                        {
                            list.AddRange(parser.UnbundleByLoop(interchange, opts.LoopId));
                        }

                        transaction = reader.ReadNextTransaction();
                    }
                }

                for (int i = 0; i < list.Count; i++)
                {
                    string outputFilename = string.Format(opts.FormatString, opts.OutputDirectory, inputFile.Name, i + 1, inputFile.Extension);

                    using (var outputFilestream = new FileStream(outputFilename, FileMode.Create, FileAccess.Write))
                        using (var writer = new StreamWriter(outputFilestream))
                        {
                            writer.Write(list[i].SerializeToX12(opts.IncludeWhitespace));
                        }
                }
            }
        }
Example #26
0
        public void Unbundle835FromNthTest()
        {
            // arrange
            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("INS._835._4010.FromNth.835_DeIdent_02.dat")).First();

            // act
            var list = parser.UnbundleByLoop(interchange, "2000");

            // assert
            Assert.AreEqual(6, list.Count);
        }
Example #27
0
        public void TestMessageContextFromType()
        {
            // ARRANGE
            const string sample = "EdiFabric.Tests.Edi.Hipaa_837P_00401.txt";

            // ACT
            var interchange = Interchange.LoadFrom(Assembly.GetExecutingAssembly().GetManifestResourceStream(sample));
            var systemType  = (new MessageContext(interchange.Groups[0].Messages[0].Context.SystemType)).SystemType;

            // ASSERT
            Assert.IsNotNull(systemType);
        }
Example #28
0
        public void CreatePurchaseOrder850()
        {
            string expected = @"ISA*00*          *00*          *01*828513080      *01*001903202U     *100817*0850*U*00401*000000245*0*P*:~
  GS*PO*828513080*001903202U*20100817*0850*245*X*005010X222~
    ST*850*0001~
      BEG*05*SA*S41000439**20100810~
      CUR*BY*USD~
      PER*IC*Doe,Jane******Doe,Jane~
    SE*5*0001~
  GE*1*1~
IEA*1*000000245~";

            var purcaseOrderDate = new DateTime(2010, 8, 17, 08, 50, 0);
            var interchange      = new Interchange(purcaseOrderDate, 245, true)
            {
                InterchangeSenderIdQualifier   = "01",
                InterchangeSenderId            = "828513080",
                InterchangeReceiverIdQualifier = "01",
                InterchangeReceiverId          = "001903202U",
                InterchangeDate = purcaseOrderDate,
            };

            interchange.SetElement(14, "0");

            FunctionGroup group = interchange.AddFunctionGroup("PO", purcaseOrderDate, 1, "005010X222");

            group.ApplicationSendersCode   = "828513080";
            group.ApplicationReceiversCode = "001903202U";
            group.Date          = purcaseOrderDate;
            group.ControlNumber = 245;

            Transaction transaction = group.AddTransaction("850", "0001");

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

            bhtSegment.SetElement(1, "05");
            bhtSegment.SetElement(2, "SA");
            bhtSegment.SetElement(3, "S41000439");
            bhtSegment.SetElement(5, "20100810");

            bhtSegment = transaction.AddSegment("CUR");
            bhtSegment.SetElement(1, "BY");
            bhtSegment.SetElement(2, "USD");

            bhtSegment = transaction.AddSegment("PER");
            bhtSegment.SetElement(1, "IC");
            bhtSegment.SetElement(2, "Doe,Jane");
            bhtSegment.SetElement(8, "Doe,Jane");

            var x12 = interchange.SerializeToX12(true);

            Assert.AreEqual(expected, x12);
        }
        public void UnbundleItemsFrom856Test()
        {
            X12Parser   parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("ORD._856.Example1.txt")).First();

            var list = parser.UnbundleByLoop(interchange, "ITEM");

            foreach (var item in list)
            {
                Trace.WriteLine("...");
                Trace.WriteLine(item.SerializeToX12(true));
            }
        }
Example #30
0
        public void UnbundleClaimsIn837ByServiceLineTest()
        {
            // arrange
            string lastServiceLine = @"ISA*00*          *01*SECRET    *ZZ*SUBMITTERS.ID  *ZZ*RECEIVERS.ID   *930602*1253*^*00401*000000905*1*T*:~
  GS*HC*SENDER CODE*RECEIVER CODE*1994033*0802*1*X*004010X098A1~
    ST*837*0021~
      BHT*0019*00*0123*19981015*1023*RP~
      REF*87*004010X098~
      NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~
        PER*IC*JERRY*TE*3055552222*EX*231~
      NM1*40*2*REPRICER XYZ*****46*66783JJT~
      HL*1**20*1~
        NM1*85*2*PREMIER BILLING SERVICE*****24*587654321~
          N3*234 Seaway St~
          N4*Miami*FL*33111~
        NM1*87*2*KILDARE ASSOC*****24*581234567~
          N3*2345 OCEAN BLVD~
          N4*MIAMI*FL*33111~
        HL*2*1*22*0~
          SBR*P*18*12312-A******HM~
          NM1*IL*1*SMITH*TED****34*000221111~
            N3*236 N MAIN ST~
            N4*MIAMI*FL*33413~
            DMG*D8*19430501*M~
          NM1*PR*2*ALLIANCE HEALTH AND LIFE INSURANCE*****PI*741234~
          CLM*26462967*100***11::1*Y*A*Y*Y*C~
            DTP*431*D8*19981003~
            REF*D9*17312345600006351~
            HI*BK:0340*BF:V7389~
            NM1*82*1*KILDARE*BEN****34*112233334~
              PRV*PE*ZZ*203BF0100Y~
            NM1*77*2*KILDARE ASSOCIATES*****24*581234567~
              N3*2345 OCEAN BLVD~
              N4*MIAMI*FL*33111~
            LX*4~
              SV1*HC:86663*10*UN*1***2**N~
              DTP*472*D8*19981010~
    SE*33*0021~
  GE*1*1~
IEA*1*000000905~";

            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(Extensions.GetEdi("INS._837P._4010.Spec_4.1.1_PatientIsSubscriber.txt")).First();

            // act
            var list = parser.UnbundleByLoop(interchange, "2400");

            // assert
            Assert.AreEqual(4, list.Count);
            Assert.AreEqual(lastServiceLine, list[3].SerializeToX12(true));
        }
        public void ParseToXml()
        {
            string resourcePath = Convert.ToString(TestContext.DataRow["ResourcePath"]);

            Trace.WriteLine(resourcePath);
            Stream stream = GetEdi(resourcePath);

            X12Parser   parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(stream).First();
            string      xml         = interchange.Serialize();

#if DEBUG
            new FileStream(resourcePath.Replace(".txt", ".xml"), FileMode.Create).PrintToFile(xml);
#endif
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            int    index = 1;
            string query = GetXPathQuery(index);
            while (!string.IsNullOrWhiteSpace(query))
            {
                string  expected = GetExpectedValue(index);
                XmlNode node     = doc.SelectSingleNode((string)query);
                Assert.IsNotNull(node, "Query '{0}' not found in {1}.", query, resourcePath);
                Assert.AreEqual(expected, node.InnerText, "Value {0} not expected from query {1} in {2}.", node.InnerText, query, resourcePath);
                Trace.WriteLine(String.Format("Query '{0}' succeeded.", query));
                query = GetXPathQuery(++index);
            }

            if (resourcePath.Contains("_837D"))
            {
                stream      = GetEdi(resourcePath);
                parser      = new X12Parser(new DentalClaimSpecificationFinder());
                interchange = parser.ParseMultiple(stream).First();
                xml         = interchange.Serialize();
#if DEBUG
                new FileStream(resourcePath.Replace(".txt", "_837D.xml"), FileMode.Create).PrintToFile(xml);
#endif
            }

            if (resourcePath.Contains("_837I"))
            {
                stream      = GetEdi(resourcePath);
                parser      = new X12Parser(new InstitutionalClaimSpecificationFinder());
                interchange = parser.ParseMultiple(stream).First();
                xml         = interchange.Serialize();
#if DEBUG
                new FileStream(resourcePath.Replace(".txt", "_837I.xml"), FileMode.Create).PrintToFile(xml);
#endif
            }
        }
Example #32
0
        /// <summary>
        ///     Parse input EDI file and convert it into JSON file.
        /// </summary>
        /// <param name="inputFileName"></param>
        public void Parse(string inputFileName)
        {
            fileProvider.InputAddress = inputFileName;

            char segmentSeparator, dataElementSeparator, dataComponentSeparator;

            var lines = GetLinesAndSeparators(fileProvider, errors, out segmentSeparator,
                out dataElementSeparator,
                out dataComponentSeparator);

            // Separator errors are FATAL errors!
            if (errors.Logs.Count != 0)
            {
                errors.Report();
                fileProvider.WriteAllLines(fileProvider.ErrorsAddress, errors.Logs);
                return;
            }

            var interchange = new Interchange
            {
                SegmentSeparator = segmentSeparator,
                DataElementSeparator = dataElementSeparator,
                DataComponentSeparator = dataComponentSeparator
            };

            var segments = ReadAllSegments(lines, interchange.SegmentSeparator, interchange.DataElementSeparator,
                errors);

            TraversAllSegments(interchange, segments, errors);

            // Check if errors happened and Assert the top level EDI structure, like missed IEA segment.
            if (errors.Logs.Count != 0)
            {
                errors.Report();
                fileProvider.WriteAllLines(fileProvider.ErrorsAddress, errors.Logs);
                return;
            }

            // create JSON:
            var serializedInterchange = JsonConvert.SerializeObject(interchange, Formatting.Indented);

            // output JSON:
            fileProvider.WriteAllText(fileProvider.OutputAddress, serializedInterchange);

            Console.WriteLine("Success.");
            //Console.WriteLine("Press Enter to finish.");
            //Console.ReadLine();
        }
Example #33
0
        private static void TraversAllSegments(Interchange interchange, IReadOnlyList<Segment> segments, Errors errors)
        {
            if (segments == null || segments.Count == 0)
            {
                errors.NewError("No segments provided for parsing.");
                return;
            }

            Group currentGroup = null;
            Document currentDocument = null;

            if (
                !errors.Assert(() => segments[0].Name == "ISA",
                    "FATAL Error: The first segment ('" + segments[0].Name + "') is not ISA segment."))
                return; // FATAL error

            interchange.ISASegment = new ISASegment(segments[0].Elements);

            for (var i = 1; i < segments.Count; i++)
            {
                switch (segments[i].Name)
                {
                    case "ST":
                        currentDocument = new Document();
                        currentDocument.STSegment = new STSegment(segments[i].Elements);
                        break;
                    case "SE":
                        if (currentDocument != null)
                        {
                            currentDocument.SESegment = new SESegment(segments[i].Elements);
                            if (currentGroup != null)
                                currentGroup.Documents.Add(currentDocument);
                            else
                                errors.NewError(string.Format("Segment:'{0}' placed before GS segment",
                                    segments[i].AsString));
                            currentDocument = null;
                        }
                        else
                            errors.NewError(string.Format("Segment:'{0}' placed before ST segment", segments[i].AsString));
                        break;
                    case "GS":
                        currentGroup = new Group();
                        currentGroup.GSSegment = new GSSegment(segments[i].Elements);
                        break;
                    case "GE":
                        if (currentGroup != null)
                        {
                            currentGroup.GESegment = new GESegment(segments[i].Elements);
                            interchange.Groups.Add(currentGroup);
                            currentGroup = null;
                        }
                        else
                            errors.NewError(string.Format("Segment:'{0}' placed before GS segment", segments[i].AsString));
                        break;
                    case "IEA":
                        interchange.IEASegment = new IEASegment(segments[i].Elements);
                        break;
                    default:
                        if (currentDocument != null)
                            currentDocument.Segments.Add(segments[i]);
                        else
                            errors.NewError(string.Format("Segment:'{0}' placed before ST segment", segments[i].AsString));
                        break;
                }
            }

            // Validate a new interchange:
            interchange.Validate(errors);
        }