Skip to content

Commit 0ede6b7

Browse files
CIRC-2029 Returning DCB title in response if the item is a virtual item (folio-org#1423)
* CIRC-2029 Return dcb instance title for dcb item * CIRC-2029 Adding test case for checkin,checkout,loan and requests
1 parent 576840d commit 0ede6b7

10 files changed

Lines changed: 100 additions & 25 deletions

File tree

src/main/java/org/folio/circulation/domain/Item.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,8 @@ public boolean isDcbItem() {
407407
public String getLendingLibraryCode() {
408408
return getProperty(itemRepresentation, "lendingLibraryCode");
409409
}
410+
411+
public String getDcbItemTitle() {
412+
return getProperty(itemRepresentation, "instanceTitle");
413+
}
410414
}

src/main/java/org/folio/circulation/domain/RequestRepresentation.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public JsonObject extendedRepresentation(Request request) {
2727
final JsonObject requestRepresentation = request.asJson();
2828

2929
addItemProperties(requestRepresentation, request.getItem());
30-
addInstanceProperties(requestRepresentation, request.getInstance());
30+
addInstanceProperties(requestRepresentation, request.getInstance(), request.getItem());
3131
addAdditionalLoanProperties(requestRepresentation, request.getLoan());
3232
addAdditionalRequesterProperties(requestRepresentation, request.getRequester());
3333
addAdditionalProxyProperties(requestRepresentation, request.getProxy());
@@ -94,14 +94,15 @@ private static void addItemProperties(JsonObject request, Item item) {
9494
write(request, "item", itemSummary);
9595
}
9696

97-
private static void addInstanceProperties(JsonObject request, Instance instance) {
97+
private static void addInstanceProperties(JsonObject request, Instance instance, Item item) {
9898
if (instance == null || instance.isNotFound()) {
9999
log.info("Unable to add instance properties to request {}, instance is {}",
100100
request.getString("id"), request.getString("instanceId"));
101101
return;
102102
}
103103
JsonObject instanceSummary = new JsonObject();
104-
write(instanceSummary, "title", instance.getTitle());
104+
write(instanceSummary, "title", item != null && item.isDcbItem() ?
105+
item.getDcbItemTitle() : instance.getTitle());
105106
write(instanceSummary, "identifiers", identifiersToJson(instance.getIdentifiers()));
106107
write(instanceSummary, "contributorNames", mapContributorNamesToJson(instance));
107108
write(instanceSummary, "publication", publicationsToJson(instance.getPublication()));

src/main/java/org/folio/circulation/domain/notice/TemplateContextUtil.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private static JsonObject createItemContext(Item item) {
197197
String yearCaptionsToken = String.join("; ", item.getYearCaption());
198198
String copyNumber = item.getCopyNumber() != null ? item.getCopyNumber() : "";
199199

200-
JsonObject itemContext = createInstanceContext(item.getInstance())
200+
JsonObject itemContext = createInstanceContext(item.getInstance(), item)
201201
.put("barcode", item.getBarcode())
202202
.put("status", item.getStatus().getValue())
203203
.put("enumeration", item.getEnumeration())
@@ -245,15 +245,16 @@ private static JsonObject createItemContext(Item item) {
245245
private static JsonObject createItemContext(Request request) {
246246
return request.hasItem()
247247
? createItemContext(request.getItem())
248-
: createInstanceContext(request.getInstance());
248+
: createInstanceContext(request.getInstance(), request.getItem());
249249
}
250250

251-
private static JsonObject createInstanceContext(Instance instance) {
251+
private static JsonObject createInstanceContext(Instance instance, Item item) {
252252
JsonObject instanceContext = new JsonObject();
253253

254254
if (instance != null) {
255255
instanceContext
256-
.put("title", instance.getTitle())
256+
.put("title", item != null && item.isDcbItem() ?
257+
item.getDcbItemTitle() : instance.getTitle())
257258
.put("primaryContributor", instance.getPrimaryContributorName())
258259
.put("allContributors", instance.getContributorNames().collect(joining("; ")));
259260
}

src/main/java/org/folio/circulation/domain/representations/ItemSummaryRepresentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public JsonObject createItemSummary(Item item) {
3333
write(itemSummary, "id", item.getItemId());
3434
write(itemSummary, "holdingsRecordId", item.getHoldingsRecordId());
3535
write(itemSummary, "instanceId", item.getInstanceId());
36-
write(itemSummary, "title", item.getTitle());
36+
write(itemSummary, "title", item.isDcbItem() ? item.getDcbItemTitle() : item.getTitle());
3737
write(itemSummary, "barcode", item.getBarcode());
3838
write(itemSummary, "contributors", mapContributorNamesToJson(item));
3939
write(itemSummary, "callNumber", item.getCallNumber());

src/test/java/api/loans/CheckInByBarcodeTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,8 @@ void canCheckInAnDcbItem() {
428428
IndividualResource holdings = holdingsFixture.defaultWithHoldings(instance.getId());
429429
IndividualResource locationsResource = locationsFixture.mainFloor();
430430
var barcode = "100002222";
431-
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(barcode, holdings.getId(), locationsResource.getId());
431+
var instanceTitle = "virtual title";
432+
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(barcode, holdings.getId(), locationsResource.getId(), instanceTitle);
432433
final CheckInByBarcodeResponse checkInResponse = checkInFixture.checkInByBarcode(circulationItem, ZonedDateTime.now(), checkInServicePointId);
433434

434435
assertThat("Response should include an item",
@@ -438,6 +439,9 @@ void canCheckInAnDcbItem() {
438439

439440
assertThat("barcode is included for item",
440441
itemFromResponse.getString("barcode"), is(barcode));
442+
443+
assertThat("item title should match dcb instance title",
444+
itemFromResponse.getString("title"), is(instanceTitle));
441445
}
442446

443447
@Test
@@ -448,7 +452,7 @@ void slipContainsLendingLibraryCodeForDcb() {
448452
IndividualResource locationsResource = locationsFixture.mainFloor();
449453
var barcode = "100002222";
450454
var lendingLibraryCode = "11223";
451-
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItemWithLandingLibrary(barcode, holdings.getId(), locationsResource.getId(), lendingLibraryCode);
455+
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItemWithLendingLibrary(barcode, holdings.getId(), locationsResource.getId(), lendingLibraryCode);
452456

453457
final CheckInByBarcodeResponse checkInResponse = checkInFixture.checkInByBarcode(circulationItem, ZonedDateTime.now(), checkInServicePointId);
454458
JsonObject staffSlipContext = checkInResponse.getStaffSlipContext();

src/test/java/api/loans/CheckOutByBarcodeTests.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -965,7 +965,9 @@ void canCheckOutAnDcbItem() {
965965
IndividualResource holdings = holdingsFixture.defaultWithHoldings(instance.getId());
966966
IndividualResource locationsResource = locationsFixture.mainFloor();
967967
var barcode = "100002222";
968-
IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(barcode, holdings.getId(), locationsResource.getId());
968+
var instanceTitle = "virtual Title";
969+
IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(
970+
barcode, holdings.getId(), locationsResource.getId(), instanceTitle);
969971
final IndividualResource jessica = usersFixture.jessica();
970972
final IndividualResource response = checkOutFixture.checkOutByBarcode(
971973
new CheckOutByBarcodeRequestBuilder()
@@ -986,6 +988,9 @@ void canCheckOutAnDcbItem() {
986988
assertThat("status should be open",
987989
loan.getJsonObject("status").getString("name"), is("Open"));
988990

991+
assertThat("item title should match dcb instance title",
992+
loan.getJsonObject("item").getString("title"), is(instanceTitle));
993+
989994
circulationItem = circulationItemsClient.get(circulationItem);
990995

991996
assertThat(circulationItem, hasItemStatus(CHECKED_OUT));

src/test/java/api/loans/LoanAPITests.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1287,15 +1287,20 @@ void loanInCollectionDoesNotProvideItemInformationForUnknownItem() {
12871287
void loanInCollectionDoesProvideItemInformationForCirculationItem() {
12881288
IndividualResource instance = instancesFixture.basedUponDunkirk();
12891289
IndividualResource holdings = holdingsFixture.defaultWithHoldings(instance.getId());
1290+
var instanceTitle = "virtual Title";
12901291

12911292
IndividualResource locationsResource = locationsFixture.mainFloor();
1292-
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItem("100002222", holdings.getId(), locationsResource.getId());
1293+
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(
1294+
"100002222", holdings.getId(), locationsResource.getId(), instanceTitle);
12931295
loansFixture.createLoan(circulationItem, usersFixture.jessica());
12941296

12951297
JsonObject loan = loansFixture.getLoans().getFirst();
12961298

12971299
assertThat("should be item information available",
12981300
loan.containsKey("item"), is(true));
1301+
1302+
assertThat("item title should match dcb instance title",
1303+
loan.getJsonObject("item").getString("title"), is(instanceTitle));
12991304
}
13001305

13011306
@Test

src/test/java/api/requests/RequestsAPICreationTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4822,6 +4822,36 @@ void recallTlrShouldSucceedWhenItNeedsToPickLeastRecalledLoanAndRequestsWithNoLo
48224822
assertThat(recallTlr5.getJson().getString("itemId"), is(notRecalledItem.getId().toString()));
48234823
}
48244824

4825+
@Test
4826+
void createHoldRequestForDcbItemAndResponseContainsDcbTitle() {
4827+
IndividualResource instance = instancesFixture.basedUponDunkirk();
4828+
IndividualResource holdings = holdingsFixture.defaultWithHoldings(instance.getId());
4829+
var instanceTitle = "virtual Title";
4830+
4831+
IndividualResource locationsResource = locationsFixture.thirdFloor();
4832+
final IndividualResource circulationItem = circulationItemsFixture.createCirculationItem(
4833+
"100002222", holdings.getId(), locationsResource.getId(), instanceTitle);
4834+
4835+
final IndividualResource requestPickupServicePoint = servicePointsFixture.cd2();
4836+
4837+
checkInFixture.checkInByBarcode(circulationItem, requestPickupServicePoint.getId());
4838+
4839+
final IndividualResource holdRequest = requestsClient.create(new RequestBuilder()
4840+
.hold()
4841+
.forItem(circulationItem)
4842+
.withInstanceId(instance.getId())
4843+
.withPickupServicePointId(requestPickupServicePoint.getId())
4844+
.by(usersFixture.james()));
4845+
4846+
JsonObject requestedItem = holdRequest.getJson().getJsonObject("item");
4847+
4848+
assertThat(holdRequest.getJson().getString("requestType"), is(HOLD.getValue()));
4849+
assertThat(requestedItem.getString("status"), is(ItemStatus.IN_TRANSIT.getValue()));
4850+
assertThat(holdRequest.getJson().getString("status"), is(RequestStatus.OPEN_NOT_YET_FILLED.getValue()));
4851+
assertThat(holdRequest.getJson().getJsonObject("instance").getString("title"), is(instanceTitle));
4852+
4853+
}
4854+
48254855
private void setUpNoticesForTitleLevelRequests(boolean isNoticeEnabledInTlrSettings,
48264856
boolean isNoticeEnabledInNoticePolicy) {
48274857

src/test/java/api/support/builders/CirculationItemsBuilder.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class CirculationItemsBuilder extends JsonBuilder implements Builder {
1414
private final UUID loanTypeId;
1515
private final boolean isDcb;
1616
private final String lendingLibraryCode;
17+
private final String instanceTitle;
1718

1819
public CirculationItemsBuilder() {
1920
this(UUID.randomUUID(),
@@ -23,7 +24,8 @@ public CirculationItemsBuilder() {
2324
UUID.randomUUID(),
2425
UUID.randomUUID(),
2526
true,
26-
"11223");
27+
"11223",
28+
null);
2729
}
2830

2931
private CirculationItemsBuilder(
@@ -34,7 +36,8 @@ private CirculationItemsBuilder(
3436
UUID materialTypeId,
3537
UUID loanTypeId,
3638
boolean isDcb,
37-
String lendingLibraryCode) {
39+
String lendingLibraryCode,
40+
String instanceTitle) {
3841

3942
this.itemId = itemId;
4043
this.barcode = barcode;
@@ -44,6 +47,7 @@ private CirculationItemsBuilder(
4447
this.loanTypeId = loanTypeId;
4548
this.isDcb = isDcb;
4649
this.lendingLibraryCode = lendingLibraryCode;
50+
this.instanceTitle = instanceTitle;
4751
}
4852

4953
public JsonObject create() {
@@ -57,6 +61,7 @@ public JsonObject create() {
5761
representation.put("temporaryLoanTypeId", loanTypeId);
5862
representation.put("dcbItem", isDcb);
5963
representation.put("lendingLibraryCode", lendingLibraryCode);
64+
representation.put("instanceTitle", instanceTitle);
6065

6166
return representation;
6267
}
@@ -70,7 +75,8 @@ public CirculationItemsBuilder withBarcode(String barcode) {
7075
this.materialTypeId,
7176
this.loanTypeId,
7277
this.isDcb,
73-
this.lendingLibraryCode);
78+
this.lendingLibraryCode,
79+
this.instanceTitle);
7480
}
7581

7682
public CirculationItemsBuilder withHoldingId(UUID holdingId) {
@@ -82,7 +88,8 @@ public CirculationItemsBuilder withHoldingId(UUID holdingId) {
8288
this.materialTypeId,
8389
this.loanTypeId,
8490
this.isDcb,
85-
this.lendingLibraryCode);
91+
this.lendingLibraryCode,
92+
this.instanceTitle);
8693
}
8794

8895
public CirculationItemsBuilder withItemId(UUID itemId) {
@@ -94,7 +101,8 @@ public CirculationItemsBuilder withItemId(UUID itemId) {
94101
this.materialTypeId,
95102
this.loanTypeId,
96103
this.isDcb,
97-
this.lendingLibraryCode);
104+
this.lendingLibraryCode,
105+
this.instanceTitle);
98106
}
99107

100108
public CirculationItemsBuilder withLocationId(UUID locationId) {
@@ -106,7 +114,8 @@ public CirculationItemsBuilder withLocationId(UUID locationId) {
106114
this.materialTypeId,
107115
this.loanTypeId,
108116
this.isDcb,
109-
this.lendingLibraryCode);
117+
this.lendingLibraryCode,
118+
this.instanceTitle);
110119
}
111120

112121
public CirculationItemsBuilder withLendingLibraryCode(String lendingLibraryCode) {
@@ -118,7 +127,8 @@ public CirculationItemsBuilder withLendingLibraryCode(String lendingLibraryCode)
118127
this.materialTypeId,
119128
this.loanTypeId,
120129
this.isDcb,
121-
lendingLibraryCode);
130+
lendingLibraryCode,
131+
this.instanceTitle);
122132
}
123133

124134
public CirculationItemsBuilder withLoanType(UUID loanTypeId) {
@@ -130,7 +140,8 @@ public CirculationItemsBuilder withLoanType(UUID loanTypeId) {
130140
this.materialTypeId,
131141
loanTypeId,
132142
this.isDcb,
133-
this.lendingLibraryCode);
143+
this.lendingLibraryCode,
144+
this.instanceTitle);
134145
}
135146

136147
public CirculationItemsBuilder withMaterialType(UUID materialTypeId) {
@@ -142,7 +153,21 @@ public CirculationItemsBuilder withMaterialType(UUID materialTypeId) {
142153
materialTypeId,
143154
this.loanTypeId,
144155
this.isDcb,
145-
this.lendingLibraryCode);
156+
this.lendingLibraryCode,
157+
this.instanceTitle);
158+
}
159+
160+
public CirculationItemsBuilder withInstanceTitle(String instanceTitle) {
161+
return new CirculationItemsBuilder(
162+
this.itemId,
163+
this.barcode,
164+
this.holdingId,
165+
this.locationId,
166+
this.materialTypeId,
167+
this.loanTypeId,
168+
this.isDcb,
169+
this.lendingLibraryCode,
170+
instanceTitle);
146171
}
147172

148173
}

src/test/java/api/support/fixtures/CirculationItemsFixture.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ public CirculationItemsFixture(
2020
this.loanTypesFixture = loanTypesFixture;
2121
}
2222

23-
public IndividualResource createCirculationItem(String barcode, UUID holdingId, UUID locationId) {
23+
public IndividualResource createCirculationItem(String barcode, UUID holdingId, UUID locationId, String instanceTitle) {
2424
CirculationItemsBuilder circulationItemsBuilder = new CirculationItemsBuilder().withBarcode(barcode).withHoldingId(holdingId)
2525
.withLoanType(loanTypesFixture.canCirculate().getId()).withMaterialType(materialTypesFixture.book().getId())
26-
.withLocationId(locationId);
26+
.withLocationId(locationId).withInstanceTitle(instanceTitle);
2727
return circulationItemClient.create(circulationItemsBuilder);
2828
}
2929

30-
public IndividualResource createCirculationItemWithLandingLibrary(String barcode, UUID holdingId, UUID locationId, String landingLibrary) {
30+
public IndividualResource createCirculationItemWithLendingLibrary(String barcode, UUID holdingId, UUID locationId, String lendingLibrary) {
3131
CirculationItemsBuilder circulationItemsBuilder = new CirculationItemsBuilder().withBarcode(barcode).withHoldingId(holdingId)
3232
.withLoanType(loanTypesFixture.canCirculate().getId()).withMaterialType(materialTypesFixture.book().getId())
33-
.withLocationId(locationId).withLendingLibraryCode(landingLibrary);
33+
.withLocationId(locationId).withLendingLibraryCode(lendingLibrary);
3434
return circulationItemClient.create(circulationItemsBuilder);
3535
}
3636
}

0 commit comments

Comments
 (0)