From e7e26822401c7dcf3d9809d47a9dfada39f40725 Mon Sep 17 00:00:00 2001 From: Maksat <144414992+Maksat-Galymzhan@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:10:47 +0500 Subject: [PATCH] CIRC-1980: Error message - after Service point changed from "yes" to "no" as Pickup location (#1482) * CIRC-1980: Fix intervalId absence in hold shelf expiry period --------- Co-authored-by: alexanderkurash --- .../domain/UpdateRequestQueue.java | 14 +++++- .../java/api/loans/CheckInByBarcodeTests.java | 50 +++++++++++++++++++ .../api/support/fixtures/RecordCreator.java | 4 ++ .../fixtures/ServicePointsFixture.java | 4 ++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/folio/circulation/domain/UpdateRequestQueue.java b/src/main/java/org/folio/circulation/domain/UpdateRequestQueue.java index 261c4c8898..c85ea50747 100644 --- a/src/main/java/org/folio/circulation/domain/UpdateRequestQueue.java +++ b/src/main/java/org/folio/circulation/domain/UpdateRequestQueue.java @@ -12,6 +12,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -38,6 +39,7 @@ public class UpdateRequestQueue { private final ConfigurationRepository configurationRepository; private final RequestQueueService requestQueueService; private final CalendarRepository calendarRepository; + private static final String NOT_DEFINED_INTERVAL = ""; public UpdateRequestQueue( RequestQueueRepository requestQueueRepository, @@ -184,8 +186,16 @@ private RequestQueue setHoldShelfExpirationDateWithExpirationDateManagement( ExpirationDateManagement expirationDateManagement = calculatedRequest.getPickupServicePoint() .getHoldShelfClosedLibraryDateManagement(); - String intervalId = calculatedRequest.getPickupServicePoint().getHoldShelfExpiryPeriod() - .getIntervalId().toUpperCase(); + + String intervalId = Optional.of(calculatedRequest) + .map(Request::getPickupServicePoint) + .map(ServicePoint::getHoldShelfExpiryPeriod) + .map(TimePeriod::getIntervalId) + .map(String::toUpperCase) + .orElse(NOT_DEFINED_INTERVAL); + + log.info("setHoldShelfExpirationDateWithExpirationDateManagement:: interval: {}", intervalId); + log.info("setHoldShelfExpirationDateWithExpirationDateManagement expDate before:{}", calculatedRequest.getHoldShelfExpirationDate()); // Old data where strategy is not set so default value but TimePeriod has MINUTES / HOURS diff --git a/src/test/java/api/loans/CheckInByBarcodeTests.java b/src/test/java/api/loans/CheckInByBarcodeTests.java index 6b8ee96495..48973a4ff5 100644 --- a/src/test/java/api/loans/CheckInByBarcodeTests.java +++ b/src/test/java/api/loans/CheckInByBarcodeTests.java @@ -45,6 +45,7 @@ import static org.folio.circulation.domain.RequestType.HOLD; import static org.folio.circulation.domain.RequestType.RECALL; import static org.folio.circulation.domain.notice.TemplateContextUtil.CURRENT_DATE_TIME; +import static org.folio.circulation.domain.policy.ExpirationDateManagement.KEEP_THE_CURRENT_DUE_DATE; import static org.folio.circulation.domain.representations.logs.LogEventType.CHECK_IN; import static org.folio.circulation.domain.representations.logs.LogEventType.NOTICE; import static org.folio.circulation.domain.representations.logs.LogEventType.NOTICE_ERROR; @@ -76,6 +77,7 @@ import java.util.Map; import java.util.UUID; +import api.support.builders.ServicePointBuilder; import org.folio.circulation.domain.ItemStatus; import org.folio.circulation.domain.Request; import org.folio.circulation.domain.RequestStatus; @@ -1662,6 +1664,54 @@ void linkItemToHoldTLRWithHoldShelfWhenCheckedInItemThenFulfilledWithSuccess(){ assertThat(itemRepresentation.getJsonObject("status").getString("name"), is("Awaiting pickup")); } + @Test + void checkInItemWhenServicePointHasChangedToNoPickupLocation() { + configurationsFixture.enableTlrFeature(); + var instanceId = instancesFixture.basedUponDunkirk().getId(); + var defaultWithHoldings = holdingsFixture.defaultWithHoldings(instanceId); + var checkedOutItem = itemsClient.create(buildCheckedOutItemWithHoldingRecordsId( + defaultWithHoldings.getId())); + var holdRequestBeforeFulfilled = requestsClient.create( + buildHoldTLRWithHoldShelffulfillmentPreference(instanceId)); + + String servicePointCode = servicePointsFixture.cd1().getJson().getString("code"); + String servicePointName = "custom service point"; + int shelvingLagTime = 0; + String discoveryDisplayName = servicePointsFixture.cd1().getJson() + .getString("discoveryDisplayName"); + String description = servicePointsFixture.cd1().getJson().getString("description"); + + ServicePointBuilder changedServicePoint = new ServicePointBuilder( + servicePointsFixture.cd1().getId(), servicePointName, servicePointCode, discoveryDisplayName, + description, shelvingLagTime, Boolean.FALSE, null, KEEP_THE_CURRENT_DUE_DATE.name()); + +// Update existing service point + servicePointsFixture.update(servicePointCode, changedServicePoint); + + checkInFixture.checkInByBarcode(checkedOutItem, servicePointsFixture.cd1().getId()); + + //validating request before fulfilled + var holdRequestAfterFulfilled = requestsClient.get(holdRequestBeforeFulfilled.getId()); + JsonObject representationBefore = holdRequestBeforeFulfilled.getJson(); + assertThat(representationBefore.getString("itemId"), nullValue()); + validateTLRequestByFields(representationBefore, HOLD_SHELF, instanceId, OPEN_NOT_YET_FILLED); + + //validating request after fulfilled + JsonObject representation = holdRequestAfterFulfilled.getJson(); + assertThat(representation.getString("itemId"), is(checkedOutItem.getId().toString())); + assertThat(representation.getString("holdingsRecordId"), is(defaultWithHoldings.getId())); + + validateTLRequestByFields(representation, HOLD_SHELF, instanceId, OPEN_AWAITING_PICKUP); + + IndividualResource itemAfter = itemsClient.get(checkedOutItem.getId()); + JsonObject itemRepresentation = itemAfter.getJson(); + assertThat(itemRepresentation.getJsonObject("status").getString("name"), + is("Awaiting pickup")); + + JsonObject servicePointRepresentation = representation.getJsonObject("pickupServicePoint"); + assertThat(servicePointRepresentation.getBoolean("pickupLocation"), is(false)); + } + @Test void linkItemToHoldTLRWithDeliveryWhenCheckedInThenFulfilledWithSuccess(){ reconfigureTlrFeature(TlrFeatureStatus.NOT_CONFIGURED); diff --git a/src/test/java/api/support/fixtures/RecordCreator.java b/src/test/java/api/support/fixtures/RecordCreator.java index a6a0c6900b..45228a55c3 100644 --- a/src/test/java/api/support/fixtures/RecordCreator.java +++ b/src/test/java/api/support/fixtures/RecordCreator.java @@ -49,6 +49,10 @@ IndividualResource createIfAbsent(JsonObject record) { return createIfAbsent(identityMapKey.apply(record), record); } + void update(String key, JsonObject updateRecord) { + identityMap.put(key, client.create(updateRecord)); + } + private IndividualResource createIfAbsent(String key, JsonObject record) { return needsCreating(key) ? create(record) : getExistingRecord(key); } diff --git a/src/test/java/api/support/fixtures/ServicePointsFixture.java b/src/test/java/api/support/fixtures/ServicePointsFixture.java index aaf734c60f..52df0996c4 100644 --- a/src/test/java/api/support/fixtures/ServicePointsFixture.java +++ b/src/test/java/api/support/fixtures/ServicePointsFixture.java @@ -89,4 +89,8 @@ public IndividualResource create(ServicePointBuilder builder) { public Collection getAllServicePoints() { return servicePointRecordCreator.getIdentityMap().values(); } + + public void update(String servicePointCode, ServicePointBuilder builder) { + servicePointRecordCreator.update(servicePointCode, builder.create()); + } }