From 8a6dd8a5114eecad5d97fd8a5d00b860cc10f6f5 Mon Sep 17 00:00:00 2001 From: Janis Saldabols Date: Thu, 1 Aug 2024 17:59:40 +0300 Subject: [PATCH] PR-1861 Implement CreateUserFiscalTransaction for charging fees --- src/main/java/org/folio/ncip/Constants.java | 2 + .../java/org/folio/ncip/FolioNcipHelper.java | 4 +- .../folio/ncip/FolioRemoteServiceManager.java | 22 ++++++-- .../CreateUserFiscalTransactionService.java | 13 +++++ .../FolioCancelRequestItemService.java | 2 +- ...lioCreateUserFiscalTransactionService.java | 53 +++++++++++++++++++ src/main/resources/toolkit.properties | 1 + .../ncip/CreateUserFiscalTransaction.java | 39 ++++++++++++++ .../java/org/folio/ncip/NcipTestSuite.java | 2 +- .../ncip-createUserFiscalTransaction.xml | 24 +++++++++ ...cip-createUserFiscalTransactionBlocked.xml | 24 +++++++++ ...cip-createUserFiscalTransactionNoTrans.xml | 17 ++++++ 12 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/folio/ncip/services/CreateUserFiscalTransactionService.java create mode 100644 src/main/java/org/folio/ncip/services/FolioCreateUserFiscalTransactionService.java create mode 100644 src/test/java/org/folio/ncip/CreateUserFiscalTransaction.java create mode 100644 src/test/resources/mockdata/ncip-createUserFiscalTransaction.xml create mode 100644 src/test/resources/mockdata/ncip-createUserFiscalTransactionBlocked.xml create mode 100644 src/test/resources/mockdata/ncip-createUserFiscalTransactionNoTrans.xml diff --git a/src/main/java/org/folio/ncip/Constants.java b/src/main/java/org/folio/ncip/Constants.java index d2f4ac9..e796cfb 100644 --- a/src/main/java/org/folio/ncip/Constants.java +++ b/src/main/java/org/folio/ncip/Constants.java @@ -44,6 +44,7 @@ public class Constants { public static final String REQUEST_ITEM_MISSING_PROBLEM = "Problem occurred while fetching item"; public static final String CANCEL_REQUEST_ITEM_PROBLEM = "Problem performing CancelRequestItem"; public static final String DELETE_ITEM_PROBLEM = "Problem performing DeleteItem"; + public static final String CREATE_USER_FISCAL_TRANSACTION_PROBLEM = "Problem performing CreateUserFiscalTransaction"; //MISC public static final String NCIP_TOOLKIT_PROPS = "ncip_toolkit_props"; @@ -79,6 +80,7 @@ public class Constants { public static final String REQUEST_CANCEL_ADDITIONAL_INFO = "NCIP cancel"; public static final String REQUEST_CANCEL_PATRON_ADDITIONAL_INFO = "Patron did not pickup item"; public static final String AUTH_TYPE_PIN = "pin"; + public static final String PATRON_GROUP = "patronGroup"; //ENDPOINTS diff --git a/src/main/java/org/folio/ncip/FolioNcipHelper.java b/src/main/java/org/folio/ncip/FolioNcipHelper.java index 351f5ef..d4ce548 100644 --- a/src/main/java/org/folio/ncip/FolioNcipHelper.java +++ b/src/main/java/org/folio/ncip/FolioNcipHelper.java @@ -26,6 +26,7 @@ import org.extensiblecatalog.ncip.v2.common.Translator; import org.extensiblecatalog.ncip.v2.common.TranslatorFactory; import org.extensiblecatalog.ncip.v2.service.BibliographicRecordIdentifierCode; +import org.extensiblecatalog.ncip.v2.service.CurrencyCode; import org.extensiblecatalog.ncip.v2.service.FiscalActionType; import org.extensiblecatalog.ncip.v2.service.FiscalTransactionType; import org.extensiblecatalog.ncip.v2.service.LocationType; @@ -101,7 +102,7 @@ private Future initToolkitDefaults() { private void setUpMapping(){ SchemeValuePair.allowNullScheme(RequestType.class.getName(), RequestScopeType.class.getName(), BibliographicRecordIdentifierCode.class.getName(), LocationType.class.getName(), PickupLocation.class.getName(), - FiscalActionType.class.getName(), FiscalTransactionType.class.getName()); + FiscalActionType.class.getName(), FiscalTransactionType.class.getName(), CurrencyCode.class.getName()); SchemeValuePair.mapBehavior(RequestType.class.getName(), SchemeValueBehavior.ALLOW_ANY); SchemeValuePair.mapBehavior(RequestScopeType.class.getName(), SchemeValueBehavior.ALLOW_ANY); SchemeValuePair.mapBehavior(BibliographicRecordIdentifierCode.class.getName(), SchemeValueBehavior.ALLOW_ANY); @@ -109,6 +110,7 @@ private void setUpMapping(){ SchemeValuePair.mapBehavior(PickupLocation.class.getName(), SchemeValueBehavior.ALLOW_ANY); SchemeValuePair.mapBehavior(FiscalActionType.class.getName(), SchemeValueBehavior.ALLOW_ANY); SchemeValuePair.mapBehavior(FiscalTransactionType.class.getName(), SchemeValueBehavior.ALLOW_ANY); + SchemeValuePair.mapBehavior(CurrencyCode.class.getName(), SchemeValueBehavior.ALLOW_ANY); } public InputStream ncipProcess(RoutingContext context) throws Exception { diff --git a/src/main/java/org/folio/ncip/FolioRemoteServiceManager.java b/src/main/java/org/folio/ncip/FolioRemoteServiceManager.java index 16a80d1..4ad6ca7 100644 --- a/src/main/java/org/folio/ncip/FolioRemoteServiceManager.java +++ b/src/main/java/org/folio/ncip/FolioRemoteServiceManager.java @@ -20,6 +20,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.message.ParameterizedMessage; +import org.extensiblecatalog.ncip.v2.service.FiscalTransactionInformation; import org.extensiblecatalog.ncip.v2.service.RemoteServiceManager; import org.extensiblecatalog.ncip.v2.service.UserId; import org.folio.util.StringUtil; @@ -565,7 +566,7 @@ public JsonObject acceptItem(AcceptItemInitiationData initData, UserId userId, S returnValues.mergeIn(new JsonObject(requestRespone)).put("item", new JsonObject(itemResponse)) .put("holdings", new JsonObject(holdingsResponse)); - addDefaultPatronFee(initData, user.getString("id"), user.getString("patronGroup"), baseUrl); + addDefaultPatronFee(initData.getFiscalTransactionInformation(), user.getString("id"), user.getString(Constants.PATRON_GROUP), baseUrl); } catch (Exception e) { // IF ANY OF THE ABOVE FAILED - ATTEMPT TO DELETE THE INSTANCE, HOLDINGS ITEM // THAT MAY HAVE BEEN CREATED ALONG THE WAY @@ -575,9 +576,9 @@ public JsonObject acceptItem(AcceptItemInitiationData initData, UserId userId, S return returnValues; } - protected void addDefaultPatronFee(AcceptItemInitiationData initData, String userId, String patronGroupId, String baseUrl) throws Exception { - if (initData.getFiscalTransactionInformation() != null && initData.getFiscalTransactionInformation().getFiscalActionType() != null && - Constants.CHARGE_DEFAULT_PATRON_FEE.equalsIgnoreCase(initData.getFiscalTransactionInformation().getFiscalActionType().getValue())) { + protected void addDefaultPatronFee(FiscalTransactionInformation fiscalTransactionInformation, String userId, String patronGroupId, String baseUrl) throws Exception { + if (fiscalTransactionInformation != null && fiscalTransactionInformation.getFiscalActionType() != null && + Constants.CHARGE_DEFAULT_PATRON_FEE.equalsIgnoreCase(fiscalTransactionInformation.getFiscalActionType().getValue())) { try { JsonObject owner = new JsonObject(callApiGet(baseUrl + Constants.FEE_OWNER_URL)); JsonArray ownersArray = owner.getJsonArray("owners"); @@ -736,7 +737,7 @@ private String retreiveItemTitle(AcceptItemInitiationData initData) { public JsonObject gatherPatronData(JsonObject user, String userId) throws Exception { String baseUrl = okapiHeaders.get(Constants.X_OKAPI_URL); - String groupId = user.getString("patronGroup"); + String groupId = user.getString(Constants.PATRON_GROUP); final String userIdQuery = "query=(" + PercentCodec.encode("userId==" + StringUtil.cqlEncode(userId) + ")"); final long LONG_DELAY_MS = 10000; @@ -1085,4 +1086,15 @@ public void deleteItem(String itemId, String agencyId) throws Exception { throw exception; } } + + public void createUserFiscalTransaction(UserId userId, FiscalTransactionInformation fiscalTransactionInformation) throws Exception { + try { + String baseUrl = okapiHeaders.get(Constants.X_OKAPI_URL); + JsonObject user = lookupPatronRecord(userId); + addDefaultPatronFee(fiscalTransactionInformation, user.getString("id"), user.getString(Constants.PATRON_GROUP), baseUrl); + } catch (Exception exception) { + logger.error("Exception occurred during CreateUserFiscalTransaction"); + throw exception; + } + } } diff --git a/src/main/java/org/folio/ncip/services/CreateUserFiscalTransactionService.java b/src/main/java/org/folio/ncip/services/CreateUserFiscalTransactionService.java new file mode 100644 index 0000000..70572b7 --- /dev/null +++ b/src/main/java/org/folio/ncip/services/CreateUserFiscalTransactionService.java @@ -0,0 +1,13 @@ +package org.folio.ncip.services; + +import org.extensiblecatalog.ncip.v2.service.CreateUserFiscalTransactionInitiationData; +import org.extensiblecatalog.ncip.v2.service.CreateUserFiscalTransactionResponseData; +import org.extensiblecatalog.ncip.v2.service.NCIPService; +import org.extensiblecatalog.ncip.v2.service.RemoteServiceManager; +import org.extensiblecatalog.ncip.v2.service.ServiceContext; +import org.extensiblecatalog.ncip.v2.service.ServiceException; +import org.extensiblecatalog.ncip.v2.service.ValidationException; + +public interface CreateUserFiscalTransactionService extends NCIPService { + CreateUserFiscalTransactionResponseData performService(CreateUserFiscalTransactionInitiationData initData, ServiceContext serviceContext, RemoteServiceManager remoteServiceManager) throws ServiceException, ValidationException; +} diff --git a/src/main/java/org/folio/ncip/services/FolioCancelRequestItemService.java b/src/main/java/org/folio/ncip/services/FolioCancelRequestItemService.java index e3b85dd..b05324e 100644 --- a/src/main/java/org/folio/ncip/services/FolioCancelRequestItemService.java +++ b/src/main/java/org/folio/ncip/services/FolioCancelRequestItemService.java @@ -20,7 +20,7 @@ public class FolioCancelRequestItemService extends FolioNcipService implements CancelRequestItemService { - private static final Logger LOGGER = Logger.getLogger(FolioCheckInItemService.class); + private static final Logger LOGGER = Logger.getLogger(FolioCancelRequestItemService.class); @Override public CancelRequestItemResponseData performService(CancelRequestItemInitiationData cancelRequestItemInitiationData, diff --git a/src/main/java/org/folio/ncip/services/FolioCreateUserFiscalTransactionService.java b/src/main/java/org/folio/ncip/services/FolioCreateUserFiscalTransactionService.java new file mode 100644 index 0000000..06416e4 --- /dev/null +++ b/src/main/java/org/folio/ncip/services/FolioCreateUserFiscalTransactionService.java @@ -0,0 +1,53 @@ +package org.folio.ncip.services; + +import org.apache.log4j.Logger; +import org.extensiblecatalog.ncip.v2.service.CreateUserFiscalTransactionInitiationData; +import org.extensiblecatalog.ncip.v2.service.CreateUserFiscalTransactionResponseData; +import org.extensiblecatalog.ncip.v2.service.Problem; +import org.extensiblecatalog.ncip.v2.service.ProblemType; +import org.extensiblecatalog.ncip.v2.service.RemoteServiceManager; +import org.extensiblecatalog.ncip.v2.service.ServiceContext; +import org.extensiblecatalog.ncip.v2.service.ServiceException; +import org.extensiblecatalog.ncip.v2.service.UserId; +import org.extensiblecatalog.ncip.v2.service.ValidationException; +import org.folio.ncip.Constants; +import org.folio.ncip.FolioRemoteServiceManager; + +import java.util.ArrayList; + +public class FolioCreateUserFiscalTransactionService extends FolioNcipService implements CreateUserFiscalTransactionService { + private static final Logger LOGGER = Logger.getLogger(FolioCreateUserFiscalTransactionService.class); + + @Override + public CreateUserFiscalTransactionResponseData performService(CreateUserFiscalTransactionInitiationData initData, ServiceContext serviceContext, RemoteServiceManager remoteServiceManager) throws ServiceException, ValidationException { + CreateUserFiscalTransactionResponseData responseData = new CreateUserFiscalTransactionResponseData(); + UserId userId = initData.getUserId(); + try { + validateUserId(userId); + initData.getFiscalTransactionInformation().getFiscalActionType(); + } catch (Exception exception) { + Problem problem = new Problem(new ProblemType(Constants.CREATE_USER_FISCAL_TRANSACTION_PROBLEM), Constants.CREATE_USER_FISCAL_TRANSACTION_PROBLEM, + exception.getMessage()); + LOGGER.error("Request validation failed"); + return addProblem(responseData, problem); + } + + try { + ((FolioRemoteServiceManager)remoteServiceManager).createUserFiscalTransaction(userId, initData.getFiscalTransactionInformation()); + } catch(Exception e) { + Problem problem = new Problem(new ProblemType(Constants.CREATE_USER_FISCAL_TRANSACTION_PROBLEM), Constants.UNKNOWN_DATA_ELEMENT, + Constants.CREATE_USER_FISCAL_TRANSACTION_PROBLEM, e.getMessage()); + return addProblem(responseData, problem); + } + responseData.setUserId(userId); + return responseData; + } + + private CreateUserFiscalTransactionResponseData addProblem(CreateUserFiscalTransactionResponseData responseData, Problem problem){ + if (responseData.getProblems() == null) { + responseData.setProblems(new ArrayList<>()); + } + responseData.getProblems().add(problem); + return responseData; + } +} diff --git a/src/main/resources/toolkit.properties b/src/main/resources/toolkit.properties index 2871ee8..5028a2d 100644 --- a/src/main/resources/toolkit.properties +++ b/src/main/resources/toolkit.properties @@ -26,6 +26,7 @@ CheckInItemService.class=org.folio.ncip.services.FolioCheckInItemService RequestItemService.class=org.folio.ncip.services.FolioRequestItemService CancelRequestItemService.class=org.folio.ncip.services.FolioCancelRequestItemService DeleteItemService.class=org.folio.ncip.services.FolioDeleteItemService +CreateUserFiscalTransactionService.class=org.folio.ncip.services.FolioCreateUserFiscalTransactionService CoreConfiguration.AddedSVPClassesAllowNullScheme=org.extensiblecatalog.ncip.v2.service.RequestedActionType diff --git a/src/test/java/org/folio/ncip/CreateUserFiscalTransaction.java b/src/test/java/org/folio/ncip/CreateUserFiscalTransaction.java new file mode 100644 index 0000000..8b356e8 --- /dev/null +++ b/src/test/java/org/folio/ncip/CreateUserFiscalTransaction.java @@ -0,0 +1,39 @@ +package org.folio.ncip; + +import io.restassured.response.Response; +import org.junit.Test; + +import java.net.MalformedURLException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class CreateUserFiscalTransaction extends TestBase { + + private static final String USER_ID = "8377631"; + private static final String PROBLEM = "Problem"; + + @Test + public void callCreateUserFiscalTransaction() throws MalformedURLException { + Response response = postData("src/test/resources/mockdata/ncip-createUserFiscalTransaction.xml"); + String body = response.getBody().prettyPrint(); + assertEquals(200, response.getStatusCode()); + assertTrue(body.contains(USER_ID)); + } + + @Test + public void callCreateUserFiscalTransactionNoTransaction() throws MalformedURLException { + Response response = postData("src/test/resources/mockdata/ncip-createUserFiscalTransactionNoTrans.xml"); + String body = response.getBody().prettyPrint(); + assertEquals(200, response.getStatusCode()); + assertTrue(body.contains(PROBLEM)); + } + + @Test + public void callCreateUserFiscalTransactionBlocked() throws MalformedURLException { + Response response = postData("src/test/resources/mockdata/ncip-createUserFiscalTransactionBlocked.xml"); + String body = response.getBody().prettyPrint(); + assertEquals(200, response.getStatusCode()); + assertTrue(body.contains(PROBLEM)); + } +} diff --git a/src/test/java/org/folio/ncip/NcipTestSuite.java b/src/test/java/org/folio/ncip/NcipTestSuite.java index d1bab42..080c841 100644 --- a/src/test/java/org/folio/ncip/NcipTestSuite.java +++ b/src/test/java/org/folio/ncip/NcipTestSuite.java @@ -14,7 +14,7 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - LookupUser.class, RequestItem.class, CancelRequestItem.class, DeleteItem.class, AcceptItem.class + LookupUser.class, RequestItem.class, CancelRequestItem.class, DeleteItem.class, AcceptItem.class, CreateUserFiscalTransaction.class }) public class NcipTestSuite { diff --git a/src/test/resources/mockdata/ncip-createUserFiscalTransaction.xml b/src/test/resources/mockdata/ncip-createUserFiscalTransaction.xml new file mode 100644 index 0000000..5f47074 --- /dev/null +++ b/src/test/resources/mockdata/ncip-createUserFiscalTransaction.xml @@ -0,0 +1,24 @@ + + + + + + Relais + + + Lehigh University + + + + LEH + 8377631 + + + charge-default-patron-fee + ILL-fee + + 0 + + + + \ No newline at end of file diff --git a/src/test/resources/mockdata/ncip-createUserFiscalTransactionBlocked.xml b/src/test/resources/mockdata/ncip-createUserFiscalTransactionBlocked.xml new file mode 100644 index 0000000..b56370d --- /dev/null +++ b/src/test/resources/mockdata/ncip-createUserFiscalTransactionBlocked.xml @@ -0,0 +1,24 @@ + + + + + + Relais + + + Lehigh University + + + + LEH + 5551213 + + + charge-default-patron-fee + ILL-fee + + 0 + + + + \ No newline at end of file diff --git a/src/test/resources/mockdata/ncip-createUserFiscalTransactionNoTrans.xml b/src/test/resources/mockdata/ncip-createUserFiscalTransactionNoTrans.xml new file mode 100644 index 0000000..14f946c --- /dev/null +++ b/src/test/resources/mockdata/ncip-createUserFiscalTransactionNoTrans.xml @@ -0,0 +1,17 @@ + + + + + + Relais + + + Lehigh University + + + + LEH + 8377631 + + + \ No newline at end of file