// Return value indicate if ST segment is valid or not private bool ProcessSTSegment() { string location = "EDIReader.ProcessSTSegment"; string errors = string.Empty; Stopwatch sw = new Stopwatch(); sw.Start(); LastState = EDIState.ST; int currentTransactionSetType; if (CurrentSegmentDetails == null || CurrentSegmentDetails.Length < 2 || int.TryParse(CurrentSegmentDetails[1], out currentTransactionSetType) == false) { InvalidTransactionSetCount++; //TODO: Add error Logger.Error(location, EventId.EDIReaderInvalidSegment, "{0} - Invalid segment - {1}", GetCurrentPosContext(), CurrentSegment); Errors.AddSegmentError(CurrentSegment, X12ErrorCode.UnexpectedSegmentCode , X12ErrorCode.GetStandardSegmentErrorDescription(X12ErrorCode.UnexpectedSegmentCode), SegmentNumber , this.CurrentSegmentStartPos, this.CurrentSegmentEndPos - 1, EdiErrorType.Error); } else { ValidTransactionSetCount++; // TODO: Optimization - Load DocumentPlug, reconstruct ISA and GA segment if transaction set type changed //if (PrevTransactionSetType != currentTransactionSetType) { // Make sure that ISA and GA fields are already present if (ISARecordFields == null || GSRecordFields == null) { throw new EDIReaderException( string.Format("ISA and GA segments should be present before ST segment. {0}", GetCurrentPosContext())); } if (ISARecordFields.Length != MaxISAFieldRecordCount || GSRecordFields.Length == 0) { throw new EDIReaderException( string.Format("ISA and GA segments length ({0}, {1}) does not match expected length ({2}, non-zero). {3}", ISARecordFields.Length, GSRecordFields.Length, MaxISAFieldRecordCount, GetCurrentPosContext())); } //TODO: For testing invoking DocumentPlugFactory.CreateEDIDocumentPlug if (DocumentPlug == null) { if (FPManager == null) { DocumentPlug = DocumentPlugFactory.CreateEDIDocumentPlug(currentTransactionSetType); } else { DocumentPlug = CreateEDIDocumentPlug(currentTransactionSetType, ISARecordFields); } } else // Make sure that DocumentPlug and ST document type match { // DocumentPlug.DocumentType = 0 indicates that there was problem retrieving DocumentType // while constructing DocumentPlug if (DocumentPlug.DocumentType != 0 && DocumentPlug.DocumentType != currentTransactionSetType) { string errorDescription = "Spec Cert relates to document {0}, however ST01 value is {1}.; test File is rejected"; errorDescription = string.Format(errorDescription, DocumentPlug.DocumentType, currentTransactionSetType); FieldError fieldError = DataTypeHelper.GenerateFieldError(X12ErrorCode.DeInvalidCodeValueCode, errorDescription, CurrentSegmentDetails[0]); long currentSegmentFieldStartIndex = this.CurrentSegmentStartPos + 3; // length of "ST<delimiter>" long currentSegmentFieldEndIndex = currentSegmentFieldStartIndex + CurrentSegmentDetails[1].Length - 1; Logger.Error(location, EventId.EDIReaderInvalidTransactionSetType, errorDescription); Errors.AddFieldError(CurrentSegmentDetails[0], "ST01", fieldError.ErrorCode, fieldError.Description, SegmentNumber, 1, CurrentSegmentDetails[1], currentSegmentFieldStartIndex, currentSegmentFieldEndIndex, EdiErrorType.Error); return(false); } } CurrentPluglet = DocumentPlug.RootPluglet; CurrentPluglet.ResetCurrentOccurances(); // Construct start segment list CurrentPluglet.InitializeStartSegmentList(); FatpipeDocumentInst.TransactionSetType = currentTransactionSetType; if (CurrentSegmentDetails.Length > 2) { FatpipeDocumentInst.TransactionNumber = CurrentSegmentDetails[2]; } FatpipeDocumentInst.DocumentPlug = DocumentPlug; FatpipeDocumentInst.RootFragment = CurrentPluglet.ConstructDocumentFragment(null, null); // Construct ISA node //CreateAndAddNewSegment(EDIState.ISA.ToString(), ISARecordFields); // Construct GS node //CreateAndAddNewSegment(EDIState.GS.ToString(), GSRecordFields); //GSSegmentProcessed = true; //GSPluglet = CurrentPluglet; PrevTransactionSetType = currentTransactionSetType; } //else //{ // // Move to GS node to start new segment // CurrentPluglet = GSPluglet; // // Remove previous TransactionSet // if (FatpipeDocumentInst.RootFragment.Children != null) // { // IDocumentFragment transactionSetChild = FatpipeDocumentInst.RootFragment.Children.Any( c => c.Pluglet.Tag == "TransactionSet"); // FatpipeDocumentInst.RootFragment.Children.Remove(transactionSetChild); // } // // Set errors to null // FatpipeDocumentInst.Errors = null; //} // Construct ST node CreateAndAddNewSegment(EDIState.ST.ToString(), CurrentSegmentDetails); } sw.Stop(); Logger.Debug(location, "Stop - {0}. Elapsed time {1} ms", GetCurrentPosContext(), sw.ElapsedMilliseconds); return(true); }