Generate EDI 997 Functional Acknowledgment - olmelabs/EdiEngine GitHub Wiki

Generation EDI 997 Functional Acknowledgment

using System;
using EdiEngine;
using EdiEngine.Runtime;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string edi =
@"ISA*01*0000000000*01*0000000000*ZZ*ABCDEFGHIJKLMNO*ZZ*123456789012345*101127*1719*U*00400*000003438*0*P*>
GS*OW*7705551212*3111350000*20000128*0557*3317*T*004010
ST*940*0001
W05*N*538686**001001*538686
LX*1
W01*12*CA*000100000010*VN*000100*UC*DEC0199******19991205
G69*11.500 STRUD BLUBRY
W76*56*500*LB*24*CF
SE*7*0001
GE*1*3317
IEA*1*000003438";

            EdiDataReader r = new EdiDataReader();
            EdiBatch ediBatch = r.FromString(edi);

           //control whether you need to accept all transaction or report error if such.
            AckBuilderSettings ackSettings = new AckBuilderSettings(AckValidationErrorBehavour.AcceptAll, false, 100, 200);
            var ack = new AckBuilder(ackSettings);

            //create FA object structure
            EdiBatch ackBatch = ack.GetnerateAcknowledgment(ediBatch);

            //Or create ack string/stream 
            string data = ack.WriteToString(ediBatch);

            Console.WriteLine(data);
            Console.ReadLine();
        }
    }
}

Will output the following 997 to console

ISA*00*          *00*          *ZZ*123456789012345*ZZ*ABCDEFGHIJKLMNO*171130*0400*U*00400*000000100*0*P*>
GS*FA*3111350000*7705551212*20171130*0400*200*X*004010
ST*997*0001
AK1*OW*3317
AK9*A*1*1*1
SE*4*0001
GE*1*200
IEA*1*000000100

You can control 997 behavior using following rules

    public class AckBuilderSettings
    {
        public AckBuilderSettings(AckValidationErrorBehavour validationErrorBehavour, 
              bool alwaysGenerateAk2Loop, 
              int isaFirstControlNumber, int gsFirstControlNumber);

        //On Error behavior - see below
        public AckValidationErrorBehavour AckValidationErrorBehavour { get; }

        //Some trading partners require AK2 loop even if group is aacepted.
        public bool AlwaysGenerateAk2Loop { get; }

        public int GsFirstControlNumber { get; }
        public int IsaFirstControlNumber { get; }
    }

    public enum AckValidationErrorBehavour
    {
        AcceptAll = 0, //Always Accept all data (A code)
        AcceptButNoteErrors = 1, //If validation errors found - accept with errors (E code)
        RejectValidationErrors = 2 //reject messages with validation errors (R code)
    }