From fc3e5bd8c99a31dfefe98e972826ac52f8b3be5a Mon Sep 17 00:00:00 2001 From: x0l08og Date: Thu, 31 Oct 2024 12:45:45 -0400 Subject: [PATCH 1/4] Revert "Change ASN 856 parsing error messages (#153)" This reverts commit 694f2cd0e3341dd2d4eaf61467ef9f91881ddb4d. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b272462..5588a32 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.walmartlabs.x12 gozer gozer - 0.3.6-SNAPSHOT + 0.3.5-SNAPSHOT takari-jar From 6c7315f14fe7710b2e3bfd10a96f7571c4b6447e Mon Sep 17 00:00:00 2001 From: x0l08og Date: Tue, 5 Nov 2024 14:13:11 -0500 Subject: [PATCH 2/4] don't update version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5588a32..b272462 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.walmartlabs.x12 gozer gozer - 0.3.5-SNAPSHOT + 0.3.6-SNAPSHOT takari-jar From 4e6d50583dfb902ef35f9acb69acdf9a457f489c Mon Sep 17 00:00:00 2001 From: x0l08og Date: Fri, 8 Nov 2024 14:45:19 -0500 Subject: [PATCH 3/4] save --- .../DefaultAsn856TransactionSetParser.java | 32 ++++- ...DefaultAsn856TransactionSetParserTest.java | 134 ++++++++++++++++++ 2 files changed, 165 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java b/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java index f068299..662517e 100644 --- a/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java +++ b/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java @@ -66,10 +66,12 @@ import com.walmartlabs.x12.util.loop.X12LoopHolder; import com.walmartlabs.x12.util.loop.X12LoopUtil; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; +import java.util.Optional; /** * ASN 856 is the Advance Shipping Notice Used to communicate the contents of a @@ -725,7 +727,7 @@ protected void doLoopParsing(List loops, AsnTransactionSet asnTx) { X12Loop firstLoop = loops.get(0); this.parseShipmentLoop(firstLoop, asnTx); } else { - asnTx.addX12ErrorDetailForLoop(new X12ErrorDetail("HL", null, "expected one top level Shipment HL")); + asnTx.addX12ErrorDetailForLoop(this.evaluateX12ErrorDetail(loops)); } } @@ -747,4 +749,32 @@ private void handleOptionalSegments(SegmentIterator segments, AsnTransactionSet } } + + private X12ErrorDetail evaluateX12ErrorDetail(List loops) { + long shipmentCount = CollectionUtils.emptyIfNull(loops) + .stream() + .filter(Shipment::isShipmentLoop) + .count(); + + if (shipmentCount <= 0) { + // handled before as default + } else if (shipmentCount == 1) { + Optional nonShipmentLoop = loops.stream() + .filter(loop -> !Shipment.isShipmentLoop(loop)) + .findFirst(); + + if (nonShipmentLoop.isPresent()) { + X12Loop x12Loop = nonShipmentLoop.get(); + if (StringUtils.isBlank(x12Loop.getParentHierarchicalId())) { + String invalidValue = "Missing parent loop on " + x12Loop.getCode() + " loop"; + return new X12ErrorDetail(X12Loop.HIERARCHY_LOOP_ID, null, "Missing parent loop", invalidValue); + } + } + } else { + return new X12ErrorDetail(X12Loop.HIERARCHY_LOOP_ID, null, "Multiple Shipment Loops"); + } + + // default error message + return new X12ErrorDetail(X12Loop.HIERARCHY_LOOP_ID, null, "expected one top level Shipment HL"); + } } diff --git a/src/test/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParserTest.java b/src/test/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParserTest.java index d09e404..b5be2bf 100644 --- a/src/test/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParserTest.java +++ b/src/test/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParserTest.java @@ -209,6 +209,32 @@ public void test_doParse_TwoTopLevelHierarchicalLoops() { AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + // looping check + List loopErrors = asnTx.getLoopingErrors(); + assertEquals(1, loopErrors.size()); + assertEquals("Multiple Shipment Loops", loopErrors.get(0).getIssueText()); + + // BSN + assertEquals("05755986", asnTx.getShipmentIdentification()); + } + + @Test + public void test_doParse_missingShipmentLoops() { + X12Group x12Group = new X12Group(); + + List segments = new ArrayList<>(); + // 2 O loops + segments.add(new X12Segment("ST*856*368090001")); + segments.add(new X12Segment("BSN*00*05755986*20190523*171543*0002")); + segments.add(new X12Segment("HL*1**O")); + segments.add(new X12Segment("HL*2**O")); + segments.add(new X12Segment("SE*296*368090001")); + + X12TransactionSet txSet = txParser.doParse(segments, x12Group); + assertNotNull(txSet); + + AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + // looping check List loopErrors = asnTx.getLoopingErrors(); assertEquals(1, loopErrors.size()); @@ -218,6 +244,114 @@ public void test_doParse_TwoTopLevelHierarchicalLoops() { assertEquals("05755986", asnTx.getShipmentIdentification()); } + @Test + public void test_doParse_orderWithoutParentLoop() { + X12Group x12Group = new X12Group(); + + List segments = new ArrayList<>(); + // O without parent + segments.add(new X12Segment("ST*856*368090001")); + segments.add(new X12Segment("BSN*00*05755986*20190523*171543*0002")); + segments.add(new X12Segment("HL*1**S")); + segments.add(new X12Segment("HL*2**O")); + segments.add(new X12Segment("SE*296*368090001")); + + X12TransactionSet txSet = txParser.doParse(segments, x12Group); + assertNotNull(txSet); + + AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + + // looping check + List loopErrors = asnTx.getLoopingErrors(); + assertEquals(1, loopErrors.size()); + assertEquals("Missing parent loop", loopErrors.get(0).getIssueText()); + assertEquals("Missing parent loop on O loop", loopErrors.get(0).getInvalidValue()); + + // BSN + assertEquals("05755986", asnTx.getShipmentIdentification()); + } + + @Test + public void test_doParse_packWithoutParentLoop() { + X12Group x12Group = new X12Group(); + + List segments = new ArrayList<>(); + // P without parent + segments.add(new X12Segment("ST*856*368090001")); + segments.add(new X12Segment("BSN*00*05755986*20190523*171543*0002")); + segments.add(new X12Segment("HL*1**S")); + segments.add(new X12Segment("HL*2**P")); + segments.add(new X12Segment("SE*296*368090001")); + + X12TransactionSet txSet = txParser.doParse(segments, x12Group); + assertNotNull(txSet); + + AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + + // looping check + List loopErrors = asnTx.getLoopingErrors(); + assertEquals(1, loopErrors.size()); + assertEquals("Missing parent loop", loopErrors.get(0).getIssueText()); + assertEquals("Missing parent loop on P loop", loopErrors.get(0).getInvalidValue()); + + // BSN + assertEquals("05755986", asnTx.getShipmentIdentification()); + } + + @Test + public void test_doParse_tareWithoutParentLoop() { + X12Group x12Group = new X12Group(); + + List segments = new ArrayList<>(); + // T without parent + segments.add(new X12Segment("ST*856*368090001")); + segments.add(new X12Segment("BSN*00*05755986*20190523*171543*0002")); + segments.add(new X12Segment("HL*1**S")); + segments.add(new X12Segment("HL*2**T")); + segments.add(new X12Segment("SE*296*368090001")); + + X12TransactionSet txSet = txParser.doParse(segments, x12Group); + assertNotNull(txSet); + + AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + + // looping check + List loopErrors = asnTx.getLoopingErrors(); + assertEquals(1, loopErrors.size()); + assertEquals("Missing parent loop", loopErrors.get(0).getIssueText()); + assertEquals("Missing parent loop on T loop", loopErrors.get(0).getInvalidValue()); + + // BSN + assertEquals("05755986", asnTx.getShipmentIdentification()); + } + + @Test + public void test_doParse_itemWithoutParentLoop() { + X12Group x12Group = new X12Group(); + + List segments = new ArrayList<>(); + // I without parent + segments.add(new X12Segment("ST*856*368090001")); + segments.add(new X12Segment("BSN*00*05755986*20190523*171543*0002")); + segments.add(new X12Segment("HL*1**S")); + segments.add(new X12Segment("HL*2**I")); + segments.add(new X12Segment("SE*296*368090001")); + + X12TransactionSet txSet = txParser.doParse(segments, x12Group); + assertNotNull(txSet); + + AsnTransactionSet asnTx = (AsnTransactionSet) txSet; + + // looping check + List loopErrors = asnTx.getLoopingErrors(); + assertEquals(1, loopErrors.size()); + assertEquals("Missing parent loop", loopErrors.get(0).getIssueText()); + assertEquals("Missing parent loop on I loop", loopErrors.get(0).getInvalidValue()); + + // BSN + assertEquals("05755986", asnTx.getShipmentIdentification()); + } + @Test public void test_doParse_UnexpectedSegmentBeforeHierarchicalLoops() { X12Group x12Group = new X12Group(); From ee915535072bf60fcffd218198b80a6d8662dd17 Mon Sep 17 00:00:00 2001 From: x0l08og Date: Fri, 8 Nov 2024 14:50:03 -0500 Subject: [PATCH 4/4] tweak --- .../txset/asn856/DefaultAsn856TransactionSetParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java b/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java index 662517e..34c3f18 100644 --- a/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java +++ b/src/main/java/com/walmartlabs/x12/standard/txset/asn856/DefaultAsn856TransactionSetParser.java @@ -757,7 +757,7 @@ private X12ErrorDetail evaluateX12ErrorDetail(List loops) { .count(); if (shipmentCount <= 0) { - // handled before as default + // this scenario has already handled as first HL is not a shipment it was xx } else if (shipmentCount == 1) { Optional nonShipmentLoop = loops.stream() .filter(loop -> !Shipment.isShipmentLoop(loop))