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~