Skip to content

Commit 05fb292

Browse files
[MODORDERS-1321]. Add 'Suppress from discovery' toggle for instance interaction (#1140)
* [MODORDERS-1321]. Add 'Suppress from discovery' toggle for instance interaction * [MODORDERS-1321]. Update acq-models
1 parent 6b27093 commit 05fb292

10 files changed

Lines changed: 94 additions & 88 deletions

File tree

descriptors/ModuleDescriptor-template.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@
139139
},
140140
{
141141
"id": "order-lines",
142-
"version": "4.0",
142+
"version": "4.1",
143143
"handlers": [
144144
{
145145
"methods": [

src/main/java/org/folio/rest/impl/TitlesApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.beans.factory.annotation.Autowired;
2828

2929
public class TitlesApi extends BaseApi implements OrdersTitles {
30+
3031
@Autowired
3132
private TitlesService titlesService;
3233
@Autowired

src/main/java/org/folio/service/inventory/InventoryInstanceManager.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import java.util.List;
3333
import java.util.Objects;
3434
import java.util.concurrent.CompletionException;
35-
import java.util.stream.Collectors;
3635
import java.util.stream.Stream;
3736

3837
import static java.util.Collections.singletonList;
@@ -54,6 +53,7 @@
5453
import static org.folio.service.inventory.InventoryUtils.INVENTORY_LOOKUP_ENDPOINTS;
5554

5655
public class InventoryInstanceManager {
56+
5757
private static final Logger logger = LogManager.getLogger(InventoryInstanceManager.class);
5858

5959
public static final String ID = "id";
@@ -100,10 +100,11 @@ public Future<SharingInstance> createShadowInstanceIfNeeded(String instanceId, R
100100
.compose(consortiumConfiguration -> createShadowInstanceIfNeeded(instanceId, consortiumConfiguration.orElse(null), requestContext));
101101
}
102102

103-
public Future<String> getOrCreateInstanceRecord(Title title, boolean isInstanceMatchingDisabled, RequestContext requestContext) {
103+
public Future<String> getOrCreateInstanceRecord(Title title, boolean isInstanceMatchingDisabled,
104+
boolean suppressDiscovery, RequestContext requestContext) {
104105
logger.debug("InventoryInstanceManager.getOrCreateInstanceRecord title.id={}", title.getId());
105106
if (CollectionUtils.isEmpty(title.getProductIds()) || isInstanceMatchingDisabled) {
106-
return createInstanceRecord(title, requestContext);
107+
return createInstanceRecord(title, suppressDiscovery, requestContext);
107108
}
108109

109110
return searchInstancesByProducts(title.getProductIds(), requestContext)
@@ -112,7 +113,7 @@ public Future<String> getOrCreateInstanceRecord(Title title, boolean isInstanceM
112113
String instanceId = getFirstObjectFromResponse(instances, INSTANCES).getString(ID);
113114
return Future.succeededFuture(instanceId);
114115
}
115-
return createInstanceRecord(title, requestContext);
116+
return createInstanceRecord(title, suppressDiscovery, requestContext);
116117
});
117118
}
118119

@@ -124,7 +125,7 @@ public Future<PoLine> openOrderHandleInstance(PoLine poLine, boolean isInstanceM
124125
.map(poLine::withInstanceId);
125126
}
126127

127-
public Future<String> createInstanceRecord(Title title, RequestContext requestContext) {
128+
public Future<String> createInstanceRecord(Title title, boolean suppressDiscovery, RequestContext requestContext) {
128129
logger.debug("InventoryInstanceManager.createInstanceRecord title.id={}", title.getId());
129130
JsonObject lookupObj = new JsonObject();
130131
Future<Void> instanceTypeFuture = InventoryUtils.getEntryId(configurationEntriesCache, inventoryCache, INSTANCE_TYPES, MISSING_INSTANCE_TYPE, requestContext)
@@ -138,7 +139,7 @@ public Future<String> createInstanceRecord(Title title, RequestContext requestCo
138139
Future<Void> contributorNameTypeIdFuture = verifyContributorNameTypesExist(title.getContributors(), requestContext);
139140

140141
return GenericCompositeFuture.join(List.of(instanceTypeFuture, statusFuture, contributorNameTypeIdFuture))
141-
.map(cf -> buildInstanceRecordJsonObject(title, lookupObj))
142+
.map(cf -> buildInstanceRecordJsonObject(title, suppressDiscovery, lookupObj))
142143
.compose(instanceJson -> createInstance(instanceJson, requestContext));
143144
}
144145

@@ -152,13 +153,13 @@ Future<JsonObject> searchInstancesByProducts(List<ProductId> productIds, Request
152153
return restClient.getAsJsonObject(requestEntry, requestContext);
153154
}
154155

155-
JsonObject buildInstanceRecordJsonObject(Title title, JsonObject lookupObj) {
156+
JsonObject buildInstanceRecordJsonObject(Title title, boolean suppressDiscovery, JsonObject lookupObj) {
156157
JsonObject instance = new JsonObject();
157158

158159
// MODORDERS-145 The Source and source code are required by schema
159160
instance.put(INSTANCE_SOURCE, SOURCE_FOLIO);
160161
instance.put(INSTANCE_TITLE, title.getTitle());
161-
instance.put(INSTANCE_DISCOVERY_SUPPRESS, false);
162+
instance.put(INSTANCE_DISCOVERY_SUPPRESS, suppressDiscovery);
162163

163164
if (title.getEdition() != null) {
164165
instance.put(INSTANCE_EDITIONS, new JsonArray(singletonList(title.getEdition())));
@@ -180,7 +181,7 @@ JsonObject buildInstanceRecordJsonObject(Title title, JsonObject lookupObj) {
180181
invContributor.put(CONTRIBUTOR_NAME_TYPE_ID, polContributor.getContributorNameTypeId());
181182
invContributor.put(CONTRIBUTOR_NAME, polContributor.getContributor());
182183
return invContributor;
183-
}).collect(toList());
184+
}).toList();
184185
instance.put(INSTANCE_CONTRIBUTORS, contributors);
185186
}
186187

@@ -194,7 +195,7 @@ JsonObject buildInstanceRecordJsonObject(Title title, JsonObject lookupObj) {
194195
identifier.put(INSTANCE_IDENTIFIER_TYPE_VALUE, pId.getProductId());
195196
return identifier;
196197
})
197-
.collect(toList());
198+
.toList();
198199
instance.put(INSTANCE_IDENTIFIERS, new JsonArray(identifiers));
199200
}
200201
return instance;
@@ -326,7 +327,7 @@ private JsonObject buildInstanceRecordJsonObject(PoLine poLine, JsonObject looku
326327
invContributor.put(CONTRIBUTOR_NAME_TYPE_ID, polContributor.getContributorNameTypeId());
327328
invContributor.put(CONTRIBUTOR_NAME, polContributor.getContributor());
328329
return invContributor;
329-
}).collect(toList());
330+
}).toList();
330331
instance.put(INSTANCE_CONTRIBUTORS, contributors);
331332
}
332333

@@ -341,7 +342,7 @@ private JsonObject buildInstanceRecordJsonObject(PoLine poLine, JsonObject looku
341342
identifier.put(INSTANCE_IDENTIFIER_TYPE_VALUE, pId.getProductId());
342343
return identifier;
343344
})
344-
.collect(toList());
345+
.toList();
345346
instance.put(INSTANCE_IDENTIFIERS, new JsonArray(identifiers));
346347
}
347348
return instance;
@@ -386,7 +387,7 @@ private Future<List<JsonObject>> getContributorNameTypeByIds(List<String> ids, R
386387
return restClient.getAsJsonObject(requestEntry, requestContext)
387388
.map(entries -> entries.getJsonArray(CONTRIBUTOR_NAME_TYPES).stream()
388389
.map(JsonObject::mapFrom)
389-
.collect(Collectors.toList())
390+
.toList()
390391
)
391392
.recover(e -> {
392393
logger.error("The issue happened getting contributor name types", e);
@@ -446,7 +447,7 @@ private Future<SharingInstance> createShadowInstanceIfNeeded(String instanceId,
446447
}
447448
var targetTenant = TenantTool.tenantId(requestContext.getHeaders());
448449
logger.info("createShadowInstanceIfNeeded:: Getting instance: {} from tenant: {}", instanceId, targetTenant);
449-
return getInstanceById(instanceId, true, requestContext)
450+
return getInstanceById(instanceId, requestContext)
450451
.compose(instance -> {
451452
if (Objects.nonNull(instance) && !instance.isEmpty()) {
452453
logger.info("createShadowInstanceIfNeeded:: Shadow instance {} already exists in tenant: {}, skipping...", instanceId, targetTenant);
@@ -457,9 +458,8 @@ private Future<SharingInstance> createShadowInstanceIfNeeded(String instanceId,
457458
});
458459
}
459460

460-
private Future<JsonObject> getInstanceById(String instanceId, boolean skipNotFoundException, RequestContext requestContext) {
461+
private Future<JsonObject> getInstanceById(String instanceId, RequestContext requestContext) {
461462
RequestEntry requestEntry = new RequestEntry(INVENTORY_LOOKUP_ENDPOINTS.get(INSTANCE_RECORDS_BY_ID_ENDPOINT)).withId(instanceId);
462-
return restClient.getAsJsonObject(requestEntry, skipNotFoundException, requestContext);
463+
return restClient.getAsJsonObject(requestEntry, true, requestContext);
463464
}
464-
465465
}

src/main/java/org/folio/service/orders/flows/update/open/OpenCompositeOrderPieceService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.folio.service.titles.TitlesService;
3737

3838
public class OpenCompositeOrderPieceService {
39+
3940
private static final Logger logger = LogManager.getLogger(OpenCompositeOrderPieceService.class);
4041

4142
private final InventoryItemManager inventoryItemManager;
@@ -134,7 +135,7 @@ private Future<Piece> openOrderUpdateInventory(Piece piece, CompositePurchaseOrd
134135
protectionService.isOperationRestricted(title.getAcqUnitIds(), ProtectedOperationType.CREATE, requestContext)
135136
)
136137
.compose(v ->
137-
openOrderUpdateInventory(order, order.getPoLines().get(0), piece, isInstanceMatchingDisabled, requestContext)
138+
openOrderUpdateInventory(order, order.getPoLines().getFirst(), piece, isInstanceMatchingDisabled, requestContext)
138139
)
139140
.map(v -> piece);
140141
}
@@ -174,8 +175,9 @@ public Future<Void> openOrderUpdateInventory(CompositePurchaseOrder compPO, PoLi
174175
return inventoryItemManager.updateItemWithPieceFields(piece, requestContext);
175176
}
176177
var locationContext = createContextWithNewTenantId(requestContext, piece.getReceivingTenantId());
178+
var suppressDiscovery = Optional.ofNullable(poLine.getSuppressInstanceFromDiscovery()).orElse(false);
177179
return titlesService.getTitleById(piece.getTitleId(), requestContext)
178-
.compose(title -> titlesService.updateTitleWithInstance(title, isInstanceMatchingDisabled, locationContext, requestContext).map(title::withInstanceId))
180+
.compose(title -> titlesService.updateTitleWithInstance(title, isInstanceMatchingDisabled, suppressDiscovery, locationContext, requestContext).map(title::withInstanceId))
179181
.compose(title -> getOrCreateHolding(poLine, piece, title, locationContext))
180182
.compose(holdingId -> updateItemsIfNeeded(compPO, poLine, holdingId, locationContext))
181183
.map(itemId -> Optional.ofNullable(itemId).map(piece::withItemId))

src/main/java/org/folio/service/titles/TitleInstanceService.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,28 @@ public TitleInstanceService(InventoryInstanceManager inventoryInstanceManager) {
1515
}
1616

1717
public Future<String> getOrCreateInstance(Title title, RequestContext requestContext) {
18-
return getOrCreateInstance(title, false, requestContext);
18+
return getOrCreateInstance(title, false, false, requestContext);
1919
}
2020

21-
public Future<String> getOrCreateInstance(Title title, boolean isInstanceMatchingDisabled, RequestContext requestContext) {
21+
public Future<String> getOrCreateInstance(Title title, boolean isInstanceMatchingDisabled,
22+
boolean suppressDiscovery, RequestContext requestContext) {
2223
return createShadowInstance(title.getInstanceId(), requestContext)
23-
.compose(shadowInstId -> createInventoryInstance(shadowInstId, title, isInstanceMatchingDisabled, requestContext));
24+
.compose(shadowInstId -> createInventoryInstance(shadowInstId, title, isInstanceMatchingDisabled, suppressDiscovery, requestContext));
2425
}
2526

2627
private Future<String> createShadowInstance(String instanceId, RequestContext requestContext) {
2728
return inventoryInstanceManager.createShadowInstanceIfNeeded(instanceId, requestContext)
2829
.map(sharingInstance -> sharingInstance != null ? instanceId : null);
2930
}
3031

31-
private Future<String> createInventoryInstance(String shadowInstId, Title title, boolean isInstanceMatchingDisabled, RequestContext requestContext) {
32+
private Future<String> createInventoryInstance(String shadowInstId, Title title, boolean isInstanceMatchingDisabled,
33+
boolean suppressDiscovery, RequestContext requestContext) {
3234
if (shadowInstId != null) {
3335
return Future.succeededFuture(shadowInstId);
3436
}
3537
if (title.getInstanceId() != null) {
3638
return Future.succeededFuture(title.getInstanceId());
3739
}
38-
return inventoryInstanceManager.getOrCreateInstanceRecord(title, isInstanceMatchingDisabled, requestContext);
40+
return inventoryInstanceManager.getOrCreateInstanceRecord(title, isInstanceMatchingDisabled, suppressDiscovery, requestContext);
3941
}
40-
4142
}

src/main/java/org/folio/service/titles/TitlesService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757

5858
@Log4j2
5959
public class TitlesService {
60+
6061
private static final String ENDPOINT = resourcesPath(TITLES);
6162
private static final String BY_ID_ENDPOINT = ENDPOINT + "/{id}";
6263

@@ -159,18 +160,18 @@ public Future<Map<String, List<Title>>> fetchNonPackageTitles(CompositePurchaseO
159160
}
160161

161162
private List<String> getNonPackageLineIds(List<PoLine> poLines) {
162-
return poLines.stream().filter(line -> !line.getIsPackage()).map(PoLine::getId).collect(toList());
163+
return poLines.stream().filter(line -> !line.getIsPackage()).map(PoLine::getId).toList();
163164
}
164165

165166
public Future<String> updateTitleWithInstance(String titleId, RequestContext locationContext,
166167
RequestContext requestContext) {
167168
return getTitleById(titleId, requestContext)
168-
.compose(title -> updateTitleWithInstance(title, false, locationContext, requestContext));
169+
.compose(title -> updateTitleWithInstance(title, false, false, locationContext, requestContext));
169170
}
170171

171-
public Future<String> updateTitleWithInstance(Title title, boolean isInstanceMatchingDisabled,
172+
public Future<String> updateTitleWithInstance(Title title, boolean isInstanceMatchingDisabled, boolean suppressDiscovery,
172173
RequestContext locationContext, RequestContext requestContext) {
173-
return titleInstanceService.getOrCreateInstance(title, isInstanceMatchingDisabled, locationContext)
174+
return titleInstanceService.getOrCreateInstance(title, isInstanceMatchingDisabled, suppressDiscovery, locationContext)
174175
.map(title::withInstanceId)
175176
.compose(entity -> saveTitle(entity, requestContext)
176177
.map(v -> entity.getInstanceId()));

src/test/java/org/folio/ApiTestSuite.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,6 @@ class WrapperPiecesAPITestNested extends WrapperPiecesAPITest {
572572
class TitlesServiceTestNested extends TitlesServiceTest {
573573
}
574574

575-
576575
@Nested
577576
class CacheableExchangeRateServiceTestNested extends CacheableExchangeRateServiceTest {
578577
}

0 commit comments

Comments
 (0)