From 0ab2ab469359e6a4050a9aa6046cadc216a5b918 Mon Sep 17 00:00:00 2001 From: Niels Thykier Date: Thu, 7 Dec 2023 13:00:41 +0100 Subject: [PATCH] DT-638: UC10 - Carrier - Process Transport Document Surrender Request for Amendment Signed-off-by: Niels Thykier --- .../standards/ebl/EblScenarioListBuilder.java | 54 +++++++++++++++++-- ...essSurrenderRequestForAmendmentAction.java | 54 +++++++++++++++++++ .../models/CarrierShippingInstructions.java | 15 +++++- .../standards/ebl/party/EblCarrier.java | 19 +++++++ 4 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 ebl/src/main/java/org/dcsa/conformance/standards/ebl/action/UC10_Carrier_ProcessSurrenderRequestForAmendmentAction.java diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/EblScenarioListBuilder.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/EblScenarioListBuilder.java index faa9098a..e42d9520 100644 --- a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/EblScenarioListBuilder.java +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/EblScenarioListBuilder.java @@ -127,14 +127,24 @@ private EblScenarioListBuilder thenAllPathsFrom(TransportDocumentStatus transpor .then(shipper_GetTransportDocument(TD_PENDING_SURRENDER_FOR_DELIVERY) .thenAllPathsFrom(TD_PENDING_SURRENDER_FOR_DELIVERY)) ); - case TD_PENDING_SURRENDER_FOR_AMENDMENT -> then(noAction()); // TODO: Implement + case TD_PENDING_SURRENDER_FOR_AMENDMENT -> thenEither( + uc10a_carrier_acceptSurrenderRequestForAmendment().then( + shipper_GetTransportDocument(TD_SURRENDERED_FOR_AMENDMENT) + .thenAllPathsFrom(TD_SURRENDERED_FOR_AMENDMENT) + ), + uc10r_carrier_rejectSurrenderRequestForAmendment().then( + shipper_GetTransportDocument(TD_ISSUED) + .thenHappyPathFrom(TD_ISSUED) + ) + ); + case TD_SURRENDERED_FOR_AMENDMENT -> then(noAction()); // TODO: Implement case TD_PENDING_SURRENDER_FOR_DELIVERY -> thenEither( uc13a_carrier_acceptSurrenderRequestForDelivery().then( shipper_GetTransportDocument(TD_SURRENDERED_FOR_DELIVERY) .thenAllPathsFrom(TD_SURRENDERED_FOR_DELIVERY) ), uc13r_carrier_rejectSurrenderRequestForDelivery().then( - shipper_GetTransportDocument(TD_SURRENDERED_FOR_DELIVERY) + shipper_GetTransportDocument(TD_ISSUED) .thenHappyPathFrom(TD_ISSUED) ) ); @@ -151,13 +161,19 @@ private EblScenarioListBuilder thenHappyPathFrom(TransportDocumentStatus transpo uc8_carrier_issueTransportDocument() .then( shipper_GetTransportDocument(TD_ISSUED) - .thenAllPathsFrom(TD_ISSUED))); + .thenHappyPathFrom(TD_ISSUED))); case TD_ISSUED -> then( uc12_carrier_awaitSurrenderRequestForDelivery() .then(shipper_GetTransportDocument(TD_PENDING_SURRENDER_FOR_DELIVERY) .thenHappyPathFrom(TD_PENDING_SURRENDER_FOR_DELIVERY)) ); - case TD_PENDING_SURRENDER_FOR_AMENDMENT -> then(noAction()); // TODO: Implement + case TD_PENDING_SURRENDER_FOR_AMENDMENT -> then( + uc10a_carrier_acceptSurrenderRequestForAmendment().then( + shipper_GetTransportDocument(TD_SURRENDERED_FOR_AMENDMENT) + .thenHappyPathFrom(TD_SURRENDERED_FOR_AMENDMENT) + ) + ); + case TD_SURRENDERED_FOR_AMENDMENT -> then(noAction()); // TODO: Implement case TD_PENDING_SURRENDER_FOR_DELIVERY -> then( uc13a_carrier_acceptSurrenderRequestForDelivery().then( shipper_GetTransportDocument(TD_SURRENDERED_FOR_DELIVERY) @@ -361,6 +377,36 @@ private static EblScenarioListBuilder uc9_carrier_awaitSurrenderRequestForAmendm EBL_NOTIFICATIONS_API, EBL_TD_NOTIFICATION_SCHEMA_NAME))); } + private static EblScenarioListBuilder uc10a_carrier_acceptSurrenderRequestForAmendment() { + EblComponentFactory componentFactory = threadLocalComponentFactory.get(); + String carrierPartyName = threadLocalCarrierPartyName.get(); + String shipperPartyName = threadLocalShipperPartyName.get(); + return new EblScenarioListBuilder( + previousAction -> + new UC10_Carrier_ProcessSurrenderRequestForAmendmentAction( + carrierPartyName, + shipperPartyName, + (EblAction) previousAction, + componentFactory.getMessageSchemaValidator( + EBL_NOTIFICATIONS_API, EBL_TD_NOTIFICATION_SCHEMA_NAME), + true)); + } + + private static EblScenarioListBuilder uc10r_carrier_rejectSurrenderRequestForAmendment() { + EblComponentFactory componentFactory = threadLocalComponentFactory.get(); + String carrierPartyName = threadLocalCarrierPartyName.get(); + String shipperPartyName = threadLocalShipperPartyName.get(); + return new EblScenarioListBuilder( + previousAction -> + new UC10_Carrier_ProcessSurrenderRequestForAmendmentAction( + carrierPartyName, + shipperPartyName, + (EblAction) previousAction, + componentFactory.getMessageSchemaValidator( + EBL_NOTIFICATIONS_API, EBL_TD_NOTIFICATION_SCHEMA_NAME), + false)); + } + private static EblScenarioListBuilder uc12_carrier_awaitSurrenderRequestForDelivery() { EblComponentFactory componentFactory = threadLocalComponentFactory.get(); String carrierPartyName = threadLocalCarrierPartyName.get(); diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/action/UC10_Carrier_ProcessSurrenderRequestForAmendmentAction.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/action/UC10_Carrier_ProcessSurrenderRequestForAmendmentAction.java new file mode 100644 index 00000000..d117a446 --- /dev/null +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/action/UC10_Carrier_ProcessSurrenderRequestForAmendmentAction.java @@ -0,0 +1,54 @@ +package org.dcsa.conformance.standards.ebl.action; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.util.stream.Stream; +import lombok.Getter; +import org.dcsa.conformance.core.check.*; + +@Getter +public class UC10_Carrier_ProcessSurrenderRequestForAmendmentAction extends StateChangingSIAction { + private final JsonSchemaValidator requestSchemaValidator; + private final boolean acceptAmendmentRequest; + + public UC10_Carrier_ProcessSurrenderRequestForAmendmentAction( + String carrierPartyName, + String shipperPartyName, + EblAction previousAction, + JsonSchemaValidator requestSchemaValidator, + boolean acceptAmendmentRequest) { + super(carrierPartyName, shipperPartyName, previousAction, acceptAmendmentRequest ? "UC10a" : "UC10r", 204); + this.requestSchemaValidator = requestSchemaValidator; + this.acceptAmendmentRequest = acceptAmendmentRequest; + } + + @Override + public String getHumanReadablePrompt() { + if (acceptAmendmentRequest) { + return ("UC10a: Accept surrender request for amendment for transport document with reference %s" + .formatted(getDspSupplier().get().transportDocumentReference())); + } + return ("UC10r: Reject surrender request for amendment for transport document with reference %s" + .formatted(getDspSupplier().get().transportDocumentReference())); + } + + @Override + public ObjectNode asJsonNode() { + return super.asJsonNode() + .put("documentReference", getDspSupplier().get().transportDocumentReference()) + .put("acceptAmendmentRequest", acceptAmendmentRequest); + } + + @Override + public ConformanceCheck createCheck(String expectedApiVersion) { + return new ConformanceCheck(getActionTitle()) { + @Override + protected Stream createSubChecks() { + return getTDNotificationChecks( + getMatchedExchangeUuid(), + expectedApiVersion, + requestSchemaValidator + ); + } + }; + } +} diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/models/CarrierShippingInstructions.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/models/CarrierShippingInstructions.java index 32eaf0b8..d3b6b167 100644 --- a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/models/CarrierShippingInstructions.java +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/models/CarrierShippingInstructions.java @@ -185,10 +185,23 @@ public void confirmShippingInstructionsComplete(String documentReference) { changeSIState(SI_STATUS, SI_COMPLETED); } + + public void acceptSurrenderForAmendment(String documentReference) { + checkState(documentReference, getTransportDocumentState(), s -> s == TD_PENDING_SURRENDER_FOR_AMENDMENT); + var td = getTransportDocument().orElseThrow(); + td.put(TRANSPORT_DOCUMENT_STATUS, TD_SURRENDERED_FOR_AMENDMENT.wireName()); + } + + public void rejectSurrenderForAmendment(String documentReference) { + checkState(documentReference, getTransportDocumentState(), s -> s == TD_PENDING_SURRENDER_FOR_AMENDMENT); + var td = getTransportDocument().orElseThrow(); + td.put(TRANSPORT_DOCUMENT_STATUS, TD_ISSUED.wireName()); + } + public void acceptSurrenderForDelivery(String documentReference) { checkState(documentReference, getTransportDocumentState(), s -> s == TD_PENDING_SURRENDER_FOR_DELIVERY); var td = getTransportDocument().orElseThrow(); - td.put(TRANSPORT_DOCUMENT_STATUS, TD_SURRENDERED_FOR_AMENDMENT.wireName()); + td.put(TRANSPORT_DOCUMENT_STATUS, TD_SURRENDERED_FOR_DELIVERY.wireName()); } public void rejectSurrenderForDelivery(String documentReference) { diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/EblCarrier.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/EblCarrier.java index 9a3ae3d3..1b491c7e 100644 --- a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/EblCarrier.java +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/EblCarrier.java @@ -75,6 +75,7 @@ protected Map, Consumer> getActionP Map.entry(UC6_Carrier_PublishDraftTransportDocumentAction.class, this::publishDraftTransportDocument), Map.entry(UC8_Carrier_IssueTransportDocumentAction.class, this::issueTransportDocument), Map.entry(UC9_Carrier_AwaitSurrenderRequestForAmendmentAction.class, this::notifyOfSurrenderForAmendment), + Map.entry(UC10_Carrier_ProcessSurrenderRequestForAmendmentAction.class, this::processSurrenderRequestForAmendment), Map.entry(UC12_Carrier_AwaitSurrenderRequestForDeliveryAction.class, this::notifyOfSurrenderForDelivery), Map.entry(UC13_Carrier_ProcessSurrenderRequestForDeliveryAction.class, this::processSurrenderRequestForDelivery), Map.entry(UC14_Carrier_ConfirmShippingInstructionsCompleteAction.class, this::confirmShippingInstructionsComplete) @@ -194,6 +195,24 @@ private void notifyOfSurrenderForDelivery(JsonNode actionPrompt) { addOperatorLogEntry("Sent notification for surrender for delivery of transport document with reference '%s'".formatted(documentReference)); } + private void processSurrenderRequestForAmendment(JsonNode actionPrompt) { + log.info("Carrier.processSurrenderRequestForAmendment(%s)".formatted(actionPrompt.toPrettyString())); + + var documentReference = actionPrompt.required("documentReference").asText(); + var sir = tdrToSir.getOrDefault(documentReference, documentReference); + var accept = actionPrompt.required("acceptAmendmentRequest").asBoolean(true); + + var si = CarrierShippingInstructions.fromPersistentStore(persistentMap, sir); + if (accept) { + si.acceptSurrenderForAmendment(documentReference); + } else { + si.rejectSurrenderForAmendment(documentReference); + } + si.save(persistentMap); + generateAndEmitNotificationFromTransportDocument(actionPrompt, si, true); + + addOperatorLogEntry("Processed surrender request for delivery of transport document with reference '%s'".formatted(documentReference)); + } private void processSurrenderRequestForDelivery(JsonNode actionPrompt) { log.info("Carrier.processSurrenderRequestForDelivery(%s)".formatted(actionPrompt.toPrettyString()));