Esempio n. 1
0
        public void TestInterchangeRead()
        {
            // ARRANGE
            const string sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_MultipleInterchange.txt";
            var          ediStream = CommonHelper.LoadStream(sample);
            var          ediItems  = new List <object>();

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                while (ediReader.Read())
                {
                    ediItems.Add(ediReader.Item);
                    if (!(ediReader.Item is UNZ))
                    {
                        continue;
                    }

                    // ASSERT
                    Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
                    Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
                    Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault());
                    Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
                    Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
                    Assert.IsNull(ediItems.OfType <ErrorContext>().SingleOrDefault());
                    ediItems.Clear();
                }
            }
        }
Esempio n. 2
0
        public void TestValidAndInvalidMessageRead()
        {
            // ARRANGE
            const string   sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_ValidAndInvalidMessage.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }

            // ASSERT
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault(m => m.HasErrors));
            Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault(m => !m.HasErrors));
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            var error = ediItems.OfType <TSINVOIC>().SingleOrDefault(m => m.HasErrors);

            Assert.IsNotNull(error);
            Assert.IsNotNull(error.ErrorContext.Errors.Any(e => e.Codes.Contains(SegmentErrorCode.UnrecognizedSegment)));
            Assert.IsNotNull(error.ErrorContext);
            Assert.IsTrue(error.ErrorContext.Errors.All(e => e.SpecType == null));
        }
Esempio n. 3
0
        public void TestMultipleInterchange()
        {
            // ARRANGE
            const string sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_MultipleInterchange.txt";
            var          ediStream = CommonHelper.LoadStream(sample);
            var          expected  = CommonHelper.LoadString(sample, Encoding.UTF8);
            var          ediItems  = new List <EdiItem>();

            // ACT
            var actual = "";

            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                while (ediReader.Read())
                {
                    if (ediReader.Item is UNB && ediItems.Any())
                    {
                        actual = actual + EdifactHelper.Generate(ediItems, null, Environment.NewLine);
                        ediItems.Clear();
                    }

                    ediItems.Add(ediReader.Item);
                }

                actual = actual + EdifactHelper.Generate(ediItems, ediReader.Separators, Environment.NewLine);
            }

            // ASSERT
            Assert.AreEqual(expected, actual);
        }
Esempio n. 4
0
        public void TestTooManyComponentDataElements()
        {
            // ARRANGE
            const string   sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_InvalidSegment2.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }

            // ASSERT
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            var error = ediItems.OfType <TSINVOIC>().SingleOrDefault();

            Assert.IsNotNull(error);
            Assert.IsTrue(error.HasErrors);
            Assert.IsNotNull(error.ErrorContext);
            Assert.IsTrue(error.ErrorContext.Errors.Any(e => e.SpecType != null));
            Assert.IsTrue(error.ErrorContext.Errors.Any(e => e.Errors.Any(d => d.Code == DataElementErrorCode.TooManyComponents)));

            MessageErrorContext mec;

            Assert.IsFalse(error.IsValid(out mec));
            Assert.IsTrue(mec.Errors.Any(e => e.Errors.Any(d => d.Code == DataElementErrorCode.TooManyComponents)));
            Assert.IsTrue(mec.Errors.Count > 1);
        }
Esempio n. 5
0
        public void TestTrailingBlanks()
        {
            // ARRANGE
            const string   sample      = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_TrailingBlanks.txt";
            const string   sampleClean = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A.txt";
            var            ediStream   = CommonHelper.LoadStream(sample);
            var            expected    = CommonHelper.LoadString(sampleClean, Encoding.UTF8);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }
            var actual = EdifactHelper.Generate(ediItems, null, Environment.NewLine);

            // ASSERT
            Assert.IsNotNull(ediItems);
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <ErrorContext>().SingleOrDefault());
            Assert.IsTrue(ediItems.OfType <TSINVOIC>().Count() == 1);
            Assert.AreEqual(expected, actual);
        }
Esempio n. 6
0
        public void TestSplitWithValidation()
        {
            // ARRANGE
            const string   sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_Split.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A.Rep"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }

            // ASSERT
            Assert.IsNotNull(ediItems);
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            var messages = ediItems.OfType <Rules.EDIFACT_D00A.Rep.TSINVOICSplit>().ToList();

            Assert.IsTrue(messages.Count(m => !m.HasErrors) == 3);
            Assert.IsTrue(messages.Count(m => m.HasErrors) == 1);
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());

            var linLoops = messages.Where(msg => msg.LINLoop1 != null).SelectMany(msg => msg.LINLoop1).ToList();

            Assert.IsTrue(linLoops.Count > 1);
            Assert.IsTrue(linLoops.First().Validate().ToList().Count == 1);

            foreach (var linLoop in linLoops.Skip(1))
            {
                Assert.IsTrue(linLoop.Validate().ToList().Count == 0);
            }
        }
Esempio n. 7
0
        public void TestPostfixLf()
        {
            // ARRANGE
            const string   sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_LF.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            var            expected  = CommonHelper.LoadString(sample, Encoding.UTF8);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Rules.EdifactD00A"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }
            var actual = EdifactHelper.Generate(ediItems, null, "\n", Encoding.UTF8);

            // ASSERT
            Assert.IsNotNull(ediItems);
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <ErrorContext>().SingleOrDefault());
            Assert.AreEqual(expected, actual);
        }
Esempio n. 8
0
        public void TestLoadingWithDelegate()
        {
            // ARRANGE
            const string   sample    = "EdiFabric.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            var            expected  = CommonHelper.LoadString(sample, Encoding.UTF8);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, AssemblyLoadFactory))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }
            var actual = EdifactHelper.Generate(ediItems, null, Environment.NewLine);

            // ASSERT
            Assert.IsNotNull(ediItems);
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <TSINVOIC>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <ErrorContext>().SingleOrDefault());
            Assert.AreEqual(expected, actual);
        }
Esempio n. 9
0
        /// <summary>
        /// Apply custom validation.
        /// </summary>
        public static void CrossSegmentValidation()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\PurchaseOrderInvalid.txt");

            // The custom validation logic is applied in the template by implementing IEdiValidator.
            // See EF_EDIFACT_D96A_TSORDERS_Validation.cs in project EdiFabric.Sdk.Edifact.Templates.D96A.Validation.
            List <IEdiItem> ediItems;

            using (var ediReader = new EdifactReader(ediStream, TemplateFactory.FullTemplateFactory))
                ediItems = ediReader.ReadToEnd().ToList();

            //  Get the purchase order
            var po = ediItems.OfType <TSORDERSValidation>().Single();

            //  Check that the custom validation was triggered
            MessageErrorContext errorContext;

            if (!po.IsValid(out errorContext))
            {
                var customValidation = errorContext.Errors.FirstOrDefault(e => e.Value == "DTM segment is missing.");
                Debug.WriteLine(customValidation.Value);
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Validate EDI transactions async
        /// </summary>
        public static async void Run()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\EDIFACT\MixedTransactions.txt");

            List <IEdiItem> ediItems;

            using (var reader = new EdifactReader(ediStream, "EdiFabric.Examples.EDIFACT.Templates.D96A"))
                ediItems = reader.ReadToEnd().ToList();

            var purchaseOrders = ediItems.OfType <TSORDERS>();

            foreach (var purchaseOrder in purchaseOrders)
            {
                //  Validate
                Tuple <bool, MessageErrorContext> result = await purchaseOrder.IsValidAsync();

                if (!result.Item1)
                {
                    //  Report it back to the sender, log, etc.
                    var errors = result.Item2.Flatten();
                }
                else
                {
                    //  purchaseOrder is valid, handle it downstream
                }
            }
        }
        /// <summary>
        /// Save to DB with code first - this will create a new database the first time
        /// Edit the connection string in app.config, by default it looks for a local SQL Server instance
        /// </summary>
        public static void Run()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\EDIFACT\PurchaseOrder.txt");

            List <IEdiItem> ediItems;

            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Templates.Edifact"))
                ediItems = ediReader.ReadToEnd().ToList();

            var purchaseOrders = ediItems.OfType <TSORDERS>();

            using (var db = new EDIFACTContext())
            {
                foreach (var purchaseOrder in purchaseOrders)
                {
                    purchaseOrder.ClearCache();
                    db.TSORDERS.Add(purchaseOrder);
                }
                db.SaveChanges();
            }
        }
Esempio n. 12
0
        /// <summary>
        /// Parsing partner specific message by custom template (added an extra field to BGM segment).
        /// </summary>
        public static void ReadCustomTemplate1()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\PurchaseOrderCustom1.txt");

            //  Resolve custom template by partner ID in the FullTemplateFactory
            using (var ediReader = new EdifactReader(ediStream, TemplateFactory.FullTemplateFactory))
            {
                var ediItems = ediReader.ReadToEnd().ToList();

                foreach (var ediItem in ediItems)
                {
                    var msg = ediItem as TSORDERSCustom1;
                    if (msg != null)
                    {
                        MessageErrorContext errorContext;
                        if (msg.IsValid(out errorContext))
                        {
                            //  The purchase order is valid, process it downstream
                        }
                    }

                    Debug.WriteLine(ediItem.GetType().Name);
                }
            }
        }
        /// <summary>
        /// Validate INVOIC
        /// </summary>
        public static void Run()
        {
            var ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\Edifact\Invoice.txt");

            List <IEdiItem> ediItems;

            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Templates.Edifact"))
                ediItems = ediReader.ReadToEnd().ToList();

            var invoices = ediItems.OfType <TSINVOIC>();

            foreach (var invoice in invoices)
            {
                //  Validate
                MessageErrorContext errorContext;
                if (!invoice.IsValid(out errorContext))
                {
                    //  Report it back to the sender, log, etc.
                    var errors = errorContext.Flatten();
                }
                else
                {
                    //  invoice is valid, handle it downstream
                }
            }
        }
        /// <summary>
        /// Reads file with corrupt UNH and valid UNH
        /// </summary>
        public static void Run()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\Edifact\CorruptUnh.txt");

            //  Set the continue on error flag to true
            List <IEdiItem> ediItems;

            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Examples.EDIFACT.Templates.D96A", new EdifactReaderSettings()
            {
                ContinueOnError = true
            }))
                ediItems = ediReader.ReadToEnd().ToList();

            var readerErrors = ediItems.OfType <ReaderErrorContext>();

            if (readerErrors.Any())
            {
                //  The stream is corrupt
                Debug.WriteLine(readerErrors.First().Exception.Message);
            }

            var purchaseOrders = ediItems.OfType <TSORDERS>();

            foreach (var po in purchaseOrders)
            {
                //  All valid purchase orders were extracted
            }
        }
Esempio n. 15
0
        /// <summary>
        /// Reads purchase orders and invoices batched up in the same interchange.
        /// </summary>
        public static void ReadMixedTransactions()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            //  1.  Load to a stream
            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\MixedTransactions.txt");

            //  2.  Read multiple transactions batched up in the same interchange
            using (var ediReader = new EdifactReader(ediStream, TemplateFactory.FullTemplateFactory))
            {
                while (ediReader.Read())
                {
                    //  Process purchase orders if no parsing errors
                    var po = ediReader.Item as TSORDERS;
                    if (po != null && !po.HasErrors)
                    {
                        ProcessPurchaseOrder(ediReader.CurrentInterchangeHeader, ediReader.CurrentGroupHeader, po);
                    }

                    //  Process invoices if no parsing errors
                    var invoice = ediReader.Item as TSINVOIC;
                    if (invoice != null && !invoice.HasErrors)
                    {
                        ProcessInvoice(ediReader.CurrentInterchangeHeader, ediReader.CurrentGroupHeader, invoice);
                    }
                }
            }
        }
Esempio n. 16
0
        public void EdifactReader_ReadCharacterFromShortStream()
        {
            const string value = @"UNOD";
            var          bytes = Utf8.GetBytes(value);
            var          sr    = new EdifactReader(new MemoryStream(bytes), Utf8, EdifactCharacterSet.UNOX, '.');

            Assert.AreEqual(sr.CharSet, EdifactCharacterSet.UNOD);
        }
Esempio n. 17
0
        public void EdifactReader_CharacterSetMissingFromStream_Fallback()
        {
            const string value = @"dummy";
            var          bytes = Utf8.GetBytes(value);
            var          sr    = new EdifactReader(new MemoryStream(bytes), Utf8, EdifactCharacterSet.UNOX, '.');

            Assert.AreEqual(sr.CharSet, EdifactCharacterSet.UNOX);
        }
Esempio n. 18
0
 public static List <EdiMessage <S_UNB, S_UNG> > ParseEdifactMultiple(string sample, Encoding encoding = null,
                                                                      string rulesAssemblyName         = null, string rulesNameSpacePrefix = null)
 {
     using (var ediReader = EdifactReader.Create(Load(sample), encoding, rulesAssemblyName, rulesNameSpacePrefix)
            )
     {
         return(ediReader.ReadAllMessages().ToList());
     }
 }
Esempio n. 19
0
 public static EdiMessage <S_UNB, S_UNG> ParseEdifact(string sample, Encoding encoding = null,
                                                      string rulesAssemblyName         = null, string rulesNameSpacePrefix = null)
 {
     using (var ediReader = EdifactReader.Create(Load(sample), encoding, rulesAssemblyName, rulesNameSpacePrefix)
            )
     {
         return(ediReader.ReadMessage() ? ediReader.Message : null);
     }
 }
Esempio n. 20
0
 public static IEnumerable <object> ParseEdifact(string sample, Encoding encoding = null,
                                                 string rulesAssembly             = null, string rulesNameSpacePrefix = null)
 {
     using (
         var ediReader = EdifactReader.Create(Load(sample), rulesAssembly ?? "EdiFabric.Rules", rulesNameSpacePrefix ?? "EdiFabric.Rules",
                                              encoding ?? Encoding.Default))
     {
         return(ediReader.ReadToEnd().ToList());
     }
 }
Esempio n. 21
0
        static void Main(string[] args)
        {
            var            ediStream = File.OpenRead(@"\\valsrv03\sistemas\test\DELFORGA-SLHINJECTOPLAST 29082018 1047323639.edi");
            List <EdiItem> edifactItems;

            using (var ediReader = new EdifactReader(ediStream, "EdiFabric.Templates.Edifact"))
            {
                edifactItems = ediReader.ReadToEnd().ToList();
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Detect duplicate groups.
        /// </summary>
        public static void GenerateContrlWithDuplicateGroup()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\DuplicateGroup.txt");

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    var contrl = a.Message as TSCONTRL;

                    if (contrl != null && a.AckType == AckType.Technical)
                    {
                        // a.Message is technical acknowledgment
                    }

                    if (contrl != null && a.AckType == AckType.Functional)
                    {
                        var ack = AckBuilders.BuildAck(a.InterchangeHeader, a.GroupHeader, contrl);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (!a.ErrorContext.HasErrors)
                    {
                        if (a.InDuplicateGroup)
                        {
                            Debug.WriteLine(string.Format("Interchange with control number {0}", a.InterchangeHeader.InterchangeControlReference_5));
                            Debug.WriteLine(string.Format("Group with control number {0}", a.GroupHeader.GroupReferenceNumber_5));
                            Debug.WriteLine("Message {0} with control number {1}", a.Message.Name, a.Message.GetTransactionContext().HeaderControlNumber);
                            Debug.WriteLine("Is in duplicate group: {0}", a.InDuplicateGroup);
                            // reject message
                        }
                    }
                },
                // Turn on UCM for valid messages
                GenerateForValidMessages = true,
                GroupDuplicates          = true
            };

            using (var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings))
            {
                using (var ediReader = new EdifactReader(edi, TemplateFactory.FullTemplateFactory))
                {
                    while (ediReader.Read())
                    {
                        ackMan.Publish(ediReader.Item);
                    }
                }
            }
        }
Esempio n. 23
0
        public static void ParseModifiedPO(string ediFile)
        {
            Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + ediFile);

            List <IEdiItem> ediItems;

            using (var ediReader = new EdifactReader(ediStream, ModifiedTypeFactory))
                ediItems = ediReader.ReadToEnd().ToList();

            var modifiedPurchaseOrders = ediItems.OfType <TSORDERSModified>();
        }
Esempio n. 24
0
        /// <summary>
        /// Auto increment custom control numbers.
        /// </summary>
        public static void GenerateContrlWithControlNumbers()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\PurchaseOrder.txt");
            int unbControlNumber = 28;
            int ungControlNumber = 35;

            Debug.WriteLine("Start interchange control number: {0}", unbControlNumber);
            Debug.WriteLine("Start group control number: {0}", ungControlNumber);

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    var contrl = a.Message as TSCONTRL;

                    if (contrl != null && a.AckType == AckType.Technical)
                    {
                        // a.Message is technical acknowledgment
                    }

                    if (contrl != null && a.AckType == AckType.Functional)
                    {
                        var ack = AckBuilders.BuildAck(a.InterchangeHeader, a.GroupHeader, contrl, ++unbControlNumber, ++ungControlNumber);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (!a.ErrorContext.HasErrors)
                    {
                        // do something with the message a.Message
                        Debug.WriteLine("Message {0} with control number {1} is valid.", a.ErrorContext.Name, a.ErrorContext.ControlNumber);
                    }
                },
            };

            using (var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings))
            {
                using (var ediReader = new EdifactReader(edi, TemplateFactory.FullTemplateFactory))
                {
                    while (ediReader.Read())
                    {
                        ackMan.Publish(ediReader.Item);
                    }
                }
            }

            Debug.WriteLine("Last interchange control number: {0}", unbControlNumber);
            Debug.WriteLine("Last group control number: {0}", ungControlNumber);
        }
Esempio n. 25
0
        /// <summary>
        /// Detects duplicate groups.
        /// </summary>
        public static void GenerateContrlWithDuplicateGroup()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = Assembly.GetExecutingAssembly().GetManifestResourceStream("EdiFabric.Sdk.Edifact.Edi.DetectDuplicateGroup.txt");

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    if (a.Message.Name == "CONTRL" && a.AckType == AckType.Technical)
                    {
                        // a.AckInterchange is technical acknowledgment
                    }

                    if (a.Message.Name == "CONTRL" && a.AckType == AckType.Functional)
                    {
                        var ack = BuildAck(a.InterchangeHeader, a.GroupHeader, a.Message);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (!a.ErrorContext.HasErrors)
                    {
                        if (a.InDuplicateGroup)
                        {
                            Debug.WriteLine(string.Format("Interchange with control number {0}", a.InterchangeHeader.InterchangeControlReference_5));
                            Debug.WriteLine(string.Format("Group with control number {0}", a.GroupHeader.GroupReferenceNumber_5));
                            Debug.WriteLine("Message {0} with control number {1}", a.Message.Name, a.Message.GetTransactionContext().HeaderControlNumber);
                            Debug.WriteLine("Is in duplicate group: {0}", a.InDuplicateGroup);
                            // reject message
                        }
                    }
                },
                // Turn on UCM for valid messages
                GenerateForValidMessages = true,
                GroupDuplicates          = true
            };

            var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings);

            using (var ediReader = new EdifactReader(edi, "EdiFabric.Sdk.Edifact"))
            {
                while (ediReader.Read())
                {
                    ackMan.Publish(ediReader.Item);
                }
            }
            ackMan.Complete();
        }
Esempio n. 26
0
        /// <summary>
        /// Auto increments non default control numbers.
        /// </summary>
        public static void GenerateContrlWithControlNumbers()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = Assembly.GetExecutingAssembly().GetManifestResourceStream("EdiFabric.Sdk.Edifact.Edi.PurchaseOrder.txt");
            int unbControlNumber = 28;
            int ungControlNumber = 35;

            Debug.WriteLine("Start interchange control number: {0}", unbControlNumber);
            Debug.WriteLine("Start group control number: {0}", ungControlNumber);

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    if (a.Message.Name == "CONTRL" && a.AckType == AckType.Technical)
                    {
                        // a.AckInterchange is technical acknowledgment
                    }

                    if (a.Message.Name == "CONTRL" && a.AckType == AckType.Functional)
                    {
                        var ack = BuildAck(a.InterchangeHeader, a.GroupHeader, a.Message, ++unbControlNumber, ++ungControlNumber);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (!a.ErrorContext.HasErrors)
                    {
                        // do something with the message a.Message
                        Debug.WriteLine("Message {0} with control number {1} is valid.", a.ErrorContext.Name, a.ErrorContext.ControlNumber);
                    }
                },
            };

            var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings);

            using (var ediReader = new EdifactReader(edi, "EdiFabric.Sdk.Edifact"))
            {
                while (ediReader.Read())
                {
                    ackMan.Publish(ediReader.Item);
                }
            }
            ackMan.Complete();

            Debug.WriteLine("Last interchange control number: {0}", unbControlNumber);
            Debug.WriteLine("Last group control number: {0}", ungControlNumber);
        }
Esempio n. 27
0
        /// <summary>
        /// Generate CONTRL for a valid message.
        /// </summary>
        public static void GenerateContrlForValid()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files.Edifact\PurchaseOrder.txt");

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    var contrl = a.Message as TSCONTRL;

                    if (contrl != null && a.AckType == AckType.Technical)
                    {
                        // a.Message is technical acknowledgment
                    }

                    if (contrl != null && a.AckType == AckType.Functional)
                    {
                        //  Inspect the acknowledgment
                        var ackCode = contrl.UCI.Actioncoded_04;

                        var ack = AckBuilders.BuildAck(a.InterchangeHeader, a.GroupHeader, contrl);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (!a.ErrorContext.HasErrors)
                    {
                        // do something with the message a.Message
                        Debug.WriteLine("Message {0} with control number {1} is valid.", a.ErrorContext.Name, a.ErrorContext.ControlNumber);
                    }
                },
                // Turn on UCM for valid messages
                GenerateForValidMessages = true
            };

            using (var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings))
            {
                using (var ediReader = new EdifactReader(edi, TemplateFactory.FullTemplateFactory))
                {
                    while (ediReader.Read())
                    {
                        ackMan.Publish(ediReader.Item);
                    }
                }
            }
        }
Esempio n. 28
0
        public void TestSplitMessage()
        {
            // ARRANGE
            const string   sample    = "EdiWeave.UnitTests.Edifact.Edi.Edifact_INVOIC_D00A_Split.txt";
            var            ediStream = CommonHelper.LoadStream(sample);
            List <EdiItem> ediItems;

            // ACT
            using (var ediReader = new EdifactReader(ediStream, "EdiWeave.Rules.EdifactD00A.Rep"))
            {
                ediItems = ediReader.ReadToEnd().ToList();
            }

            // ASSERT
            Assert.IsNotNull(ediItems);
            Assert.IsNotNull(ediItems.OfType <UNB>().SingleOrDefault());
            Assert.IsNull(ediItems.OfType <UNG>().SingleOrDefault());
            var messages = ediItems.OfType <EdiWeave.Rules.EDIFACT_D00A.Rep.TSINVOICSplit>().ToList();

            Assert.IsTrue(messages.Count(m => !m.HasErrors) == 3);

            foreach (var msg in messages)
            {
                Assert.IsTrue(msg.MessagePart > 0);
                Assert.IsTrue(!string.IsNullOrEmpty(msg.ControlNumber));
                Assert.IsTrue(!string.IsNullOrEmpty(msg.Name));
                Assert.IsTrue(!string.IsNullOrEmpty(msg.Format));
                Assert.IsTrue(!string.IsNullOrEmpty(msg.Version));

                MessageErrorContext mec;
                if (!msg.IsValid(out mec))
                {
                    Assert.IsTrue(mec.MessagePart > 0);
                    Assert.IsTrue(!string.IsNullOrEmpty(mec.ControlNumber));
                    Assert.IsTrue(!string.IsNullOrEmpty(mec.Name));
                }
            }

            Assert.IsNull(ediItems.OfType <UNE>().SingleOrDefault());
            Assert.IsNotNull(ediItems.OfType <UNZ>().SingleOrDefault());
            var errors = ediItems.OfType <EdiWeave.Rules.EDIFACT_D00A.Rep.TSINVOICSplit>().Where(m => m.HasErrors).ToList();

            Assert.IsTrue(errors.Count() == 1);

            foreach (var err in errors)
            {
                Assert.IsTrue(err.MessagePart > 0);
                Assert.IsTrue(!string.IsNullOrEmpty(err.ControlNumber));
                Assert.IsTrue(!string.IsNullOrEmpty(err.Name));
            }
        }
Esempio n. 29
0
        /// <summary>
        /// Detect duplicate messages.
        /// </summary>
        public static void Run()
        {
            Debug.WriteLine("******************************");
            Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
            Debug.WriteLine("******************************");

            var edi = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\Edifact\DuplicateMessage.txt");

            var settings = new AckSettings
            {
                AckHandler = (s, a) =>
                {
                    var contrl = a.Message as TSCONTRL;

                    if (contrl != null && a.AckType == AckType.Technical)
                    {
                        // a.Message is technical acknowledgment
                    }

                    if (contrl != null && a.AckType == AckType.Functional)
                    {
                        var ack = AckBuilders.BuildAck(a.InterchangeHeader, a.GroupHeader, contrl);
                        Debug.Write(ack);
                    }
                },
                MessageHandler = (s, a) =>
                {
                    if (a.ErrorContext.HasErrors && a.ErrorContext.Codes.Any(c => c == Core.ErrorCodes.MessageErrorCode.DuplicateMessageControlNumber))
                    {
                        // do something with the message a.Message
                        Debug.WriteLine("Message {0} with control number {1} is duplicate.", a.ErrorContext.Name, a.ErrorContext.ControlNumber);
                    }
                },
                // Turn on UCM for valid messages
                GenerateForValidMessages = true,
                TransactionSetDuplicates = true,
                TechnicalAck             = TechnicalAck.Enforce
            };

            using (var ackMan = new Plugins.Acknowledgments.Edifact.AckMan(settings))
            {
                using (var ediReader = new EdifactReader(edi, "EdiFabric.Examples.EDIFACT.Templates.D96A"))
                {
                    while (ediReader.Read())
                    {
                        ackMan.Publish(ediReader.Item);
                    }
                }
            }
        }
Esempio n. 30
0
 public static IEnumerable <object> ParseEdifact(string sample, Encoding encoding = null,
                                                 string rulesAssemblyName         = null, string rulesNameSpacePrefix = null)
 {
     using (
         var ediReader = EdifactReader.Create(Load(sample),
                                              new ReaderSettings
     {
         Encoding = encoding,
         RulesAssemblyName = rulesAssemblyName,
         RulesNamespacePrefix = rulesNameSpacePrefix
     }))
     {
         return(ediReader.ReadToEnd().ToList());
     }
 }