From ee80802552b6aa9616c83e5f114c15154fa201ce Mon Sep 17 00:00:00 2001 From: abhinavmir Date: Tue, 16 Jun 2026 15:36:47 -0700 Subject: [PATCH] Skip TA1 segment when checking interchange version The version check read the segment immediately following ISA and treated its last element as the GS08 version. When a TA1 interchange acknowledgement segment appears between ISA and GS, the check read TA1 instead of GS and failed with 'ANSI version 000 not consistent with version specified ...', aborting the parse. Scan forward past any interchange-level segments (such as TA1) to the GS segment before reading the version. Adds a 999 test file with a TA1 segment. --- .../java/com/imsweb/x12/reader/X12Reader.java | 34 +++++++++++++------ .../com/imsweb/x12/reader/X12ReaderTest.java | 15 ++++++++ .../837_5010/x12_999_accepted_ta1.txt | 13 +++++++ 3 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/837_5010/x12_999_accepted_ta1.txt diff --git a/src/main/java/com/imsweb/x12/reader/X12Reader.java b/src/main/java/com/imsweb/x12/reader/X12Reader.java index 48c1f6d..e69cd78 100644 --- a/src/main/java/com/imsweb/x12/reader/X12Reader.java +++ b/src/main/java/com/imsweb/x12/reader/X12Reader.java @@ -398,20 +398,32 @@ private boolean checkVersionsAreConsistent(Separators separators, Reader reader) char segmentSeparator = separators.getSegment(); char elementSeparator = separators.getElement(); int c; - StringBuilder line = new StringBuilder(); - - while ((c = reader.read()) != -1 && c != segmentSeparator) - line.append((char)c); - // The version is the last element - // If we got to the end of the file before the end of the line, don't get the version + // The version is held in the last element of the GS segment. The GS segment normally + // immediately follows the ISA segment, but interchange-level segments such as TA1 may + // appear between them (a TA1 acknowledgement is sometimes included even when accepted). + // Skip any such segments and read up to the GS segment to find the version. String version = null; - if (c == segmentSeparator) { - String lineString = line.toString(); - int versionStartPos = lineString.lastIndexOf(elementSeparator); - if (versionStartPos != -1) - version = lineString.substring(versionStartPos + 1); + StringBuilder line = new StringBuilder(); + boolean foundSegment = false; + while ((c = reader.read()) != -1) { + if (c == segmentSeparator) { + String lineString = line.toString().trim(); + if (lineString.startsWith("GS" + elementSeparator) || lineString.equals("GS")) { + foundSegment = true; + int versionStartPos = lineString.lastIndexOf(elementSeparator); + if (versionStartPos != -1) + version = lineString.substring(versionStartPos + 1); + break; + } + line.setLength(0); + } + else + line.append((char)c); } + // If we never reached a GS segment (e.g. end of file), the file is not valid for a version check + if (!foundSegment) + version = null; reader.reset(); boolean result = _TYPES.get(_type).equals(version); diff --git a/src/test/java/com/imsweb/x12/reader/X12ReaderTest.java b/src/test/java/com/imsweb/x12/reader/X12ReaderTest.java index 4302012..c99a144 100644 --- a/src/test/java/com/imsweb/x12/reader/X12ReaderTest.java +++ b/src/test/java/com/imsweb/x12/reader/X12ReaderTest.java @@ -1492,6 +1492,21 @@ void test999Accepted() throws Exception { } + @Test + void test999AcceptedWithTA1() throws Exception { + URL url = this.getClass().getResource("/837_5010/x12_999_accepted_ta1.txt"); + assertNotNull(url); + X12Reader reader = new X12Reader(FileType.ANSI837_5010_X231, new File(url.getFile())); + + // A TA1 segment between ISA and GS must not break the version check or parsing + assertTrue(reader.getFatalErrors().isEmpty()); + List loops = reader.getLoops(); + assertEquals(1, loops.size()); + Loop loop = reader.getLoops().get(0); + assertEquals(1, loop.getLoops().size()); + assertEquals("R", loop.getLoop("GS_LOOP").getLoop("ST_LOOP").getLoop("HEADER").getLoop("2000").getSegment("IK5").getElement("IK501").getValue()); + } + @Test void test999Rejected() throws Exception { URL url = this.getClass().getResource("/837_5010/x12_999_rejected.txt"); diff --git a/src/test/resources/837_5010/x12_999_accepted_ta1.txt b/src/test/resources/837_5010/x12_999_accepted_ta1.txt new file mode 100644 index 0000000..bdd072f --- /dev/null +++ b/src/test/resources/837_5010/x12_999_accepted_ta1.txt @@ -0,0 +1,13 @@ +ISA*00* *00* *ZZ*330897513 *ZZ*YAXBCX *241018*0307*^*00501*000000101*0*P*:~ +TA1*101*241018*0307*A*000~ +GS*FA*330897513*ABCDEF*20241018*0307*294082671*X*005010X231A1~ +ST*999*0001*005010X231A1~ +AK1*HC*101*005010X222A1~ +AK2*837*101*005010X222A1~ +IK3*CLM*289*2010*6~ +IK3*CLM*381*2010*6~ +IK5*R*5~ +AK9*R*1*1*0~ +SE*8*0001~ +GE*1*294082671~ +IEA*1*000000101~