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))