Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Refactor item location handling to use locationRepository directly for effective location retrieval ([CIRC-2538](https://folio-org.atlassian.net/browse/CIRC-2538))
* Fail on startup if Kafka config is invalid ([CIRC-2003](https://folio-org.atlassian.net/browse/CIRC-2003))
* Fix loan status in `AnonymizeLoansTests` fixture for closed loans with open fees ([CIRC-2641](https://folio-org.atlassian.net/browse/CIRC-2641))
* Fix Item check-out for related ECS TLR Page request when ILR exist for different requester ([CIRC-2644](https://folio-org.atlassian.net/browse/CIRC-2644))

## 24.5.0 2026-04-14
* Allow HTTP Connection Pool to be Configurable ([CIRC-2279](https://folio-org.atlassian.net/browse/CIRC-2279))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.lang.invoke.MethodHandles;
import java.util.concurrent.CompletableFuture;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Strings;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.folio.circulation.domain.Item;
Expand Down Expand Up @@ -38,14 +38,14 @@ protected CompletableFuture<Result<Boolean>> isTitleLevelRequestFulfillableByIte
log.info("isTitleLevelRequestFulfillableByItem:: parameters itemId: {}, requestId: {}",
item::getItemId, request::getId);

if (!StringUtils.equals(request.getInstanceId(), item.getInstanceId())) {
if (!Strings.CS.equals(request.getInstanceId(), item.getInstanceId()) && !item.isDcbItem()) {
log.info("isTitleLevelRequestFulfillableByItem:: instanceId mismatch, not fulfillable");
return ofAsync(false);
}

if (request.isRecall()) {
log.info("isTitleLevelRequestFulfillableByItem:: recall request, checking itemId match");
return ofAsync(StringUtils.equals(request.getItemId(), item.getItemId()));
return ofAsync(Strings.CS.equals(request.getItemId(), item.getItemId()));
}

return canRequestBeFulfilledByItem(item, request);
Expand Down
45 changes: 45 additions & 0 deletions src/test/java/api/loans/CheckOutByBarcodeTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -2815,6 +2815,51 @@ void circulationItemCheckOutUpdatesPrimaryEcsRequestStatus() {
assertThat(requestsFixture.getById(requestId).getJson(), isClosedFilled());
}

@Test
void shouldCheckoutItemToRequesterOneWithTitleLevelPageAndDcbItemWhenItemLevelHoldExistForRequesterTwo() {
Comment thread
mukhiddin-yusuf marked this conversation as resolved.
Outdated
circulationSettingsFixture.enableTlrFeature();

IndividualResource realInstance = instancesFixture.basedUponDunkirk();
Comment thread
mukhiddin-yusuf marked this conversation as resolved.

UUID dcbInstanceId = UUID.randomUUID();
IndividualResource dcbHoldings = holdingsFixture.defaultWithHoldings(dcbInstanceId);
String barcode = "00001";
IndividualResource dcbItem = circulationItemsFixture.createCirculationItem(
UUID.randomUUID(), barcode, dcbHoldings.getId(),
locationsFixture.mainFloor().getId(), "DCB instance");

IndividualResource firstRequest = requestsFixture.placeTitleLevelHoldShelfRequest(
realInstance.getId(), usersFixture.steve(), ZonedDateTime.now());
UUID requestId = firstRequest.getId();

requestsStorageClient.replace(requestId,
requestsStorageClient.get(requestId).getJson()
.put("itemId", dcbItem.getId().toString())
.put("holdingsRecordId", dcbHoldings.getId().toString())
.put("item", new JsonObject().put("barcode", barcode)));

UUID randomServicePointId = servicePointsFixture.cd2().getId();
checkInFixture.checkInByBarcode(dcbItem, randomServicePointId);
assertThat(requestsFixture.getById(requestId).getJson(), isOpenInTransit());

checkInFixture.checkInByBarcode(dcbItem, servicePointsFixture.cd1().getId());
assertThat(requestsFixture.getById(requestId).getJson(), isOpenAwaitingPickup());

requestsFixture.place(new RequestBuilder()
.hold()
.fulfillToHoldShelf()
.withItemId(dcbItem.getId())
.withInstanceId(realInstance.getId())
.withRequestDate(ZonedDateTime.now())
.withRequesterId(usersFixture.jessica().getId())
.withPickupServicePointId(servicePointsFixture.cd1().getId()));

UserResource borrower = usersFixture.steve();
checkOutFixture.checkOutByBarcode(dcbItem, borrower);

assertThat(requestsFixture.getById(requestId).getJson(), isClosedFilled());
Comment thread
mukhiddin-yusuf marked this conversation as resolved.
Outdated
}

private IndividualResource placeRequest(String requestLevel, ItemResource item,
IndividualResource requester) {

Expand Down
Loading