Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix release 1.2.3 #122

Merged
merged 40 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b727da7
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Feb 18, 2024
240830a
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Feb 20, 2024
6f456c2
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Feb 23, 2024
9486870
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 4, 2024
3f9d4c4
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 4, 2024
2f2a8ca
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 4, 2024
67d5ddd
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 4, 2024
308262c
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 7, 2024
ae1c381
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 7, 2024
a8c3f84
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 7, 2024
0ff140d
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 7, 2024
3f9d6ff
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 11, 2024
4ca665c
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 12, 2024
758246a
Update src/main/java/org/folio/dcb/service/impl/EcsRequestTransaction…
MagzhanArtykov Mar 13, 2024
2426147
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 15, 2024
aea378c
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 15, 2024
97644bb
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 15, 2024
a04fc14
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
2c0e912
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
44fb716
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
d293c44
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
4785c92
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
dce3ca0
MODDCB-90 Accept existing circulation request ID
MagzhanArtykov Mar 18, 2024
3851b69
[MODDCB-105] Accept existing circulation request ID (borrowing trans…
MagzhanArtykov Jul 5, 2024
3c7e748
MODDCB-111: Allow manual transaction status change CREATED -> OPEN (#85)
OleksandrVidinieiev Jul 8, 2024
73436cc
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 7, 2024
4ff843b
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 7, 2024
bed4ab8
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 8, 2024
f8618a7
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 9, 2024
1d6ff53
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 9, 2024
7da92e8
MODDCB-117 ecsRequestPhase to moddcb circulation request schema
MagzhanArtykov Aug 9, 2024
b1d2af6
MODTLR-62 add position to request schema
roman-barannyk Aug 30, 2024
fd8d91f
MODDCB-124 Remove duplicate permissions
OleksandrVidinieiev Nov 4, 2024
20322f6
MODDCB-124 Fix indentation
OleksandrVidinieiev Nov 4, 2024
7de9854
MODDCB-124 Fix formatting
OleksandrVidinieiev Nov 4, 2024
259c600
MODDCB-153 Post-cherry-pick fix
alexanderkurash Dec 2, 2024
7ab54f0
Update NEWS
alexanderkurash Dec 2, 2024
9b20d5a
MODDCB-153 Post-cherry-pick fix #2
alexanderkurash Dec 2, 2024
b8ca4be
[maven-release-plugin] prepare release v1.2.3
alexanderkurash Dec 2, 2024
bccd028
[maven-release-plugin] prepare for next development iteration
alexanderkurash Dec 2, 2024
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
7 changes: 7 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## v1.2.3 2024-12-02
* MODDCB-90: Accept existing circulation request ID
* MODDCB-105: Accept existing circulation request ID (borrowing transaction)
* MODDCB-111: Allow manual transaction status change from CREATED to OPEN
* MODDCB-117: Add ecsRequestPhase to the circulation request schema
* MODDCB-124: Merge esc-tlr feature branch into master

## v1.2.2 2024-11-20
* MODDCB-145: Issue with spaces in service point name

Expand Down
35 changes: 34 additions & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,33 @@
}
]
},
{
"id": "ecs-request-transactions",
"version": "1.0",
"handlers": [
{
"methods": [
"POST"
],
"pathPattern": "/ecs-request-transactions/{ecsRequestTransactionId}",
"permissionsRequired": [
"dcb.ecs-request.transactions.post"
],
"modulePermissions": [
"circulation-storage.requests.item.get",
"circulation-storage.requests.collection.get",
"circulation.requests.item.put",
"inventory-storage.items.item.get",
"inventory-storage.items.collection.get",
"circulation-item.item.post",
"circulation-item.collection.get",
"circulation-item.item.get",
"inventory-storage.material-types.collection.get",
"inventory-storage.loan-types.collection.get"
]
}
]
},
{
"id": "_tenant",
"version": "2.0",
Expand Down Expand Up @@ -204,7 +231,8 @@
"dcb.transactions.post",
"dcb.transactions.put",
"dcb.transactions.get",
"dcb.transactions.collection.get"
"dcb.transactions.collection.get",
"dcb.ecs-request.transactions.post"
]
},
{
Expand All @@ -226,6 +254,11 @@
"permissionName": "dcb.transactions.collection.get",
"displayName": "get updated transaction detail list",
"description": "get list of transaction updated between a given query range"
},
{
"permissionName": "dcb.ecs-request.transactions.post",
"displayName": "creates new ECS request transaction",
"description": "creates new ECS request transaction"
}
],
"metadata": {
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<groupId>org.folio</groupId>
<artifactId>mod-dcb</artifactId>
<name>mod-dcb</name>
<version>1.2.3-SNAPSHOT</version>
<version>1.2.4-SNAPSHOT</version>
<description>Manage DCB related transactions in folio</description>
<packaging>jar</packaging>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ public interface CirculationClient {
void checkOutByBarcode(@RequestBody CheckOutRequest checkOutRequest);

@PutMapping("/requests/{requestId}")
CirculationRequest cancelRequest(@PathVariable("requestId") String requestId, @RequestBody CirculationRequest circulationRequest);
CirculationRequest updateRequest(@PathVariable("requestId") String requestId,
@RequestBody CirculationRequest circulationRequest);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.folio.dcb.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.folio.dcb.domain.dto.DcbTransaction;
import org.folio.dcb.domain.dto.TransactionStatusResponse;
import org.folio.dcb.rest.resource.EcsRequestTransactionsApi;
import org.folio.dcb.service.EcsRequestTransactionsService;
import org.folio.dcb.service.TransactionAuditService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Log4j2
@RequiredArgsConstructor
public class EcsRequestTransactionsApiController implements EcsRequestTransactionsApi {

private final EcsRequestTransactionsService ecsRequestTransactionsService;
private final TransactionAuditService transactionAuditService;

@Override
public ResponseEntity<TransactionStatusResponse> createEcsRequestTransactions(
String ecsRequestTransactionId, DcbTransaction dcbTransaction) {

log.info("createEcsRequestTransactions:: creating ECS Request Transaction {} with ID {}",
dcbTransaction, ecsRequestTransactionId);
TransactionStatusResponse transactionStatusResponse;
try {
transactionStatusResponse = ecsRequestTransactionsService.createEcsRequestTransactions(
ecsRequestTransactionId, dcbTransaction);
} catch (Exception ex) {
transactionAuditService.logErrorIfTransactionAuditNotExists(ecsRequestTransactionId,
dcbTransaction, ex.getMessage());
throw ex;
}
return ResponseEntity.status(HttpStatus.CREATED).body(transactionStatusResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void handleLoanEvent(String data, MessageHeaders messageHeaders) {
public void handleRequestEvent(String data, MessageHeaders messageHeaders) {
String tenantId = getHeaderValue(messageHeaders, XOkapiHeaders.TENANT, null).get(0);
var eventData = parseRequestEvent(data);
if (Objects.nonNull(eventData) && eventData.isDcb() ) {
if (Objects.nonNull(eventData)) {
log.debug("dcb flow for a request event");
String requestId = eventData.getRequestId();
if (Objects.nonNull(requestId)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@

public interface CirculationRequestService {
CirculationRequest getCancellationRequestIfOpenOrNull(String requestId);
CirculationRequest fetchRequestById(String requestId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.folio.dcb.service;

import org.folio.dcb.domain.dto.DcbTransaction;
import org.folio.dcb.domain.dto.TransactionStatusResponse;

public interface EcsRequestTransactionsService {
TransactionStatusResponse createEcsRequestTransactions(String ecsRequestTransactionsId,
DcbTransaction dcbTransaction);
}
1 change: 1 addition & 0 deletions src/main/java/org/folio/dcb/service/RequestService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ public interface RequestService {
*/
CirculationRequest createPageItemRequest(User user, DcbItem dcbItem, String pickupServicePointId);
CirculationRequest createHoldItemRequest(User user, DcbItem dcbItem, String pickupServicePointId);
void updateCirculationRequest(CirculationRequest circulationRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public List<TransactionStatus.StatusEnum> lendingChainProcessor(TransactionStatu
StatusProcessor checkInProcessor = new StatusProcessor(ITEM_CHECKED_OUT, ITEM_CHECKED_IN, false, closeProcessor);
StatusProcessor checkoutProcessor = new StatusProcessor(AWAITING_PICKUP, ITEM_CHECKED_OUT, false, checkInProcessor);
StatusProcessor awaitingPickupProcessor = new StatusProcessor(OPEN, AWAITING_PICKUP, false, checkoutProcessor);
StatusProcessor openProcessor = new StatusProcessor(CREATED, OPEN, true, awaitingPickupProcessor);
StatusProcessor openProcessor = new StatusProcessor(CREATED, OPEN, false, awaitingPickupProcessor);
startChain.setChain(openProcessor);
var statuses = process(startChain, fromStatus, toStatus);
log.info("lendingChainProcessor:: Following statuses needs to be transitioned {} ", statuses);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class CirculationRequestServiceImpl implements CirculationRequestService
private final CirculationRequestClient circulationRequestClient;
private final FolioExecutionContext folioExecutionContext;

private CirculationRequest fetchRequestById(String requestId) {
public CirculationRequest fetchRequestById(String requestId) {
log.info("fetchRequestById:: fetching request for id {} ", requestId);
try {
return circulationRequestClient.fetchRequestById(requestId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void cancelRequest(TransactionEntity dcbTransaction) {
CirculationRequest request = circulationStorageService.getCancellationRequestIfOpenOrNull(dcbTransaction.getRequestId().toString());
if (request != null){
try {
circulationClient.cancelRequest(request.getId(), request);
circulationClient.updateRequest(request.getId(), request);
} catch (FeignException e) {
log.warn("cancelRequest:: error cancelling request using request id {} ", dcbTransaction.getRequestId(), e);
throw new CirculationRequestException(String.format("Error cancelling request using request id %s", dcbTransaction.getRequestId()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package org.folio.dcb.service.impl;

import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.BORROWER;
import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.LENDER;

import java.util.UUID;

import org.folio.dcb.domain.dto.CirculationItem;
import org.folio.dcb.domain.dto.CirculationRequest;
import org.folio.dcb.domain.dto.DcbItem;
import org.folio.dcb.domain.dto.DcbPatron;
import org.folio.dcb.domain.dto.DcbPickup;
import org.folio.dcb.domain.dto.DcbTransaction;
import org.folio.dcb.domain.dto.Item;
import org.folio.dcb.domain.dto.TransactionStatusResponse;
import org.folio.dcb.exception.ResourceAlreadyExistException;
import org.folio.dcb.repository.TransactionRepository;
import org.folio.dcb.service.CirculationItemService;
import org.folio.dcb.service.CirculationRequestService;
import org.folio.dcb.service.EcsRequestTransactionsService;
import org.folio.dcb.service.RequestService;
import org.folio.dcb.utils.RequestStatus;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Service
@RequiredArgsConstructor
@Log4j2
public class EcsRequestTransactionsServiceImpl implements EcsRequestTransactionsService {

private final BaseLibraryService baseLibraryService;
private final TransactionRepository transactionRepository;
private final RequestService requestService;
private final CirculationRequestService circulationRequestService;
private final CirculationItemService circulationItemService;

@Override
public TransactionStatusResponse createEcsRequestTransactions(String ecsRequestTransactionsId,
DcbTransaction dcbTransaction) {

log.info("createEcsRequestTransactions:: creating new transaction request for role {} ",
dcbTransaction.getRole());
checkEcsRequestTransactionExistsAndThrow(ecsRequestTransactionsId);
CirculationRequest circulationRequest = circulationRequestService.fetchRequestById(
dcbTransaction.getRequestId());
if (circulationRequest != null && RequestStatus.isRequestOpen(
RequestStatus.from(circulationRequest.getStatus()))) {
if (dcbTransaction.getRole() == LENDER) {
createLenderEcsRequestTransactions(ecsRequestTransactionsId, dcbTransaction, circulationRequest);
} else if(dcbTransaction.getRole() == BORROWER) {
createBorrowerEcsRequestTransactions(ecsRequestTransactionsId, dcbTransaction,
circulationRequest);
} else {
throw new IllegalArgumentException("Unimplemented role: " + dcbTransaction.getRole());
}
return TransactionStatusResponse.builder()
.status(TransactionStatusResponse.StatusEnum.CREATED)
.item(dcbTransaction.getItem())
.patron(dcbTransaction.getPatron())
.build();
} else {
throw new IllegalArgumentException("Unable to create ECS transaction as could not find open request");
}
}

private void checkEcsRequestTransactionExistsAndThrow(String dcbTransactionId) {
if (transactionRepository.existsById(dcbTransactionId)) {
throw new ResourceAlreadyExistException(
String.format("unable to create ECS transaction with ID %s as it already exists",
dcbTransactionId));
}
}

private void createLenderEcsRequestTransactions(String ecsRequestTransactionsId,
DcbTransaction dcbTransaction, CirculationRequest circulationRequest) {

dcbTransaction.setItem(DcbItem.builder()
.id(String.valueOf(circulationRequest.getItemId()))
.barcode(circulationRequest.getItem().getBarcode())
.build());
dcbTransaction.setPatron(DcbPatron.builder()
.id(String.valueOf(circulationRequest.getRequesterId()))
.barcode(circulationRequest.getRequester().getBarcode())
.build());
dcbTransaction.setPickup(DcbPickup.builder()
.servicePointId(String.valueOf(circulationRequest.getPickupServicePointId()))
.build());
baseLibraryService.saveDcbTransaction(ecsRequestTransactionsId, dcbTransaction,
dcbTransaction.getRequestId());
}

private void createBorrowerEcsRequestTransactions(String ecsRequestTransactionsId,
DcbTransaction dcbTransaction, CirculationRequest circulationRequest) {

var itemVirtual = dcbTransaction.getItem();
if (itemVirtual == null) {
throw new IllegalArgumentException("Item is required for borrower transaction");
}
baseLibraryService.checkItemExistsInInventoryAndThrow(itemVirtual.getBarcode());
CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(itemVirtual, circulationRequest.getPickupServicePointId());
circulationRequest.setItemId(UUID.fromString(item.getId()));
circulationRequest.setItem(Item.builder()
.barcode(item.getBarcode())
.build());
circulationRequest.setHoldingsRecordId(UUID.fromString(item.getHoldingsRecordId()));
requestService.updateCirculationRequest(circulationRequest);
dcbTransaction.setPatron(DcbPatron.builder()
.id(String.valueOf(circulationRequest.getRequesterId()))
.barcode(circulationRequest.getRequester().getBarcode())
.build());
dcbTransaction.setPickup(DcbPickup.builder()
.servicePointId(String.valueOf(circulationRequest.getPickupServicePointId()))
.build());
baseLibraryService.saveDcbTransaction(ecsRequestTransactionsId, dcbTransaction,
dcbTransaction.getRequestId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.springframework.stereotype.Service;

import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.AWAITING_PICKUP;
import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.CREATED;
import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.ITEM_CHECKED_IN;
import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.ITEM_CHECKED_OUT;
import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.OPEN;
Expand Down Expand Up @@ -61,7 +62,9 @@ public void updateTransactionStatus(TransactionEntity dcbTransaction, Transactio
log.debug("updateTransactionStatus:: Updating dcbTransaction {} to status {} ", dcbTransaction, transactionStatus);
var currentStatus = dcbTransaction.getStatus();
var requestedStatus = transactionStatus.getStatus();
if (OPEN == currentStatus && AWAITING_PICKUP == requestedStatus) {
if (CREATED == currentStatus && OPEN == requestedStatus) {
updateTransactionEntity(dcbTransaction, requestedStatus);
} else if (OPEN == currentStatus && AWAITING_PICKUP == requestedStatus) {
log.info("updateTransactionStatus:: Checking in item by barcode: {} ", dcbTransaction.getItemBarcode());
circulationService.checkInByBarcode(dcbTransaction);
updateTransactionEntity(dcbTransaction, requestedStatus);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ public CirculationRequest createHoldItemRequest(User user, DcbItem item, String
return circulationClient.createRequest(circulationRequest);
}

@Override
public void updateCirculationRequest(CirculationRequest circulationRequest) {
log.debug("updateCirculationRequest:: updating circulation request with id {}",
circulationRequest.getId());
circulationClient.updateRequest(circulationRequest.getId(), circulationRequest);
}

private CirculationRequest createCirculationRequest(CirculationRequest.RequestTypeEnum type, User user, DcbItem item, String holdingsId, String instanceId, String pickupServicePointId) {
return CirculationRequest.builder()
.id(UUID.randomUUID().toString())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import lombok.extern.log4j.Log4j2;
import org.folio.dcb.domain.dto.DcbTransaction;
import org.folio.dcb.domain.entity.TransactionAuditEntity;
import org.folio.dcb.domain.entity.TransactionEntity;
import org.folio.dcb.domain.mapper.TransactionMapper;
import org.folio.dcb.repository.TransactionAuditRepository;
import org.folio.dcb.service.TransactionAuditService;
import org.springframework.stereotype.Service;
Expand All @@ -20,7 +18,6 @@ public class TransactionAuditServiceImpl implements TransactionAuditService {
private static final String DUPLICATE_ERROR_ACTION = "DUPLICATE_ERROR";
private static final String DUPLICATE_ERROR_TRANSACTION_ID = "-1";

private final TransactionMapper transactionMapper;
private final TransactionAuditRepository transactionAuditRepository;
@Override
public void logErrorIfTransactionAuditExists(String dcbTransactionId, String errorMsg) {
Expand All @@ -44,8 +41,7 @@ public void logErrorIfTransactionAuditExists(String dcbTransactionId, String err
@Override
public void logErrorIfTransactionAuditNotExists(String dcbTransactionId, DcbTransaction dcbTransaction, String errorMsg) {
TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(dcbTransactionId).orElse(null);
TransactionEntity transactionMapped = transactionMapper.mapToEntity(dcbTransactionId, dcbTransaction);
TransactionAuditEntity auditError = generateTrnAuditEntityByTrnEntityWithError(dcbTransactionId, transactionMapped, errorMsg);
TransactionAuditEntity auditError = generateTrnAuditEntityByTrnEntityWithError(dcbTransactionId, dcbTransaction, errorMsg);

if (auditExisting != null) {
log.debug("logTheErrorForNotExistedTransactionAudit:: dcbTransactionId = {}, dcbTransaction = {}, err = {}", dcbTransactionId, dcbTransaction, errorMsg);
Expand All @@ -68,7 +64,7 @@ private TransactionAuditEntity generateTrnAuditEntityFromTheFoundOneWithError(Tr
return auditError;
}

private TransactionAuditEntity generateTrnAuditEntityByTrnEntityWithError(String dcbTransactionId, TransactionEntity trnE, String errorMsg) {
private TransactionAuditEntity generateTrnAuditEntityByTrnEntityWithError(String dcbTransactionId, DcbTransaction trnE, String errorMsg) {
String errorMessage = String.format("dcbTransactionId = %s; dcb transaction content = %s; error message = %s.", dcbTransactionId, trnE.toString(), errorMsg);

TransactionAuditEntity auditError = new TransactionAuditEntity();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,10 @@ public TransactionEntity getTransactionEntityOrThrow(String dcbTransactionId) {
}

private void checkTransactionExistsAndThrow(String dcbTransactionId) {
if(transactionRepository.existsById(dcbTransactionId)) {
if (transactionRepository.existsById(dcbTransactionId)) {
throw new ResourceAlreadyExistException(
String.format("unable to create transaction with id %s as it already exists", dcbTransactionId));
}
}

}
Loading