{"id":23122858,"url":"https://github.com/folio-org/mod-circulation","last_synced_at":"2026-04-02T21:30:09.660Z","repository":{"id":37432216,"uuid":"83812902","full_name":"folio-org/mod-circulation","owner":"folio-org","description":"FOLIO mod-circulation","archived":false,"fork":false,"pushed_at":"2026-03-26T13:18:46.000Z","size":17476,"stargazers_count":4,"open_issues_count":6,"forks_count":28,"subscribers_count":22,"default_branch":"master","last_synced_at":"2026-03-27T05:25:09.714Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/folio-org.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-03-03T15:30:40.000Z","updated_at":"2026-03-26T13:18:47.000Z","dependencies_parsed_at":"2023-10-13T05:43:53.237Z","dependency_job_id":"8f122572-5286-409a-8dd7-9024b815d579","html_url":"https://github.com/folio-org/mod-circulation","commit_stats":null,"previous_names":[],"tags_count":234,"template":false,"template_full_name":null,"purl":"pkg:github/folio-org/mod-circulation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folio-org%2Fmod-circulation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folio-org%2Fmod-circulation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folio-org%2Fmod-circulation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folio-org%2Fmod-circulation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/folio-org","download_url":"https://codeload.github.com/folio-org/mod-circulation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folio-org%2Fmod-circulation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31316822,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-17T07:31:05.012Z","updated_at":"2026-04-02T21:30:09.632Z","avatar_url":"https://github.com/folio-org.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mod-circulation\n\nCopyright (C) 2017-2023 The Open Library Foundation\n\nThis software is distributed under the terms of the Apache License,\nVersion 2.0. See the file \"[LICENSE](LICENSE)\" for more information.\n\n## Documentation\n\nFurther documentation about this module can be found in the [/doc/](doc) folder:\n\n* [Guide](doc/developer-guide.md) - introduction for developers\n* [Operations guide](doc/operations-guide.md) - introduction for operations\n* [Circulationrules](doc/circulationrules.md) - how the circulation rules file and the circulation rules engine work\n\n## Goal\n\nFOLIO compatible circulation capabilities, including loan items from the inventory.\n\n## Prerequisites\n\n### Required\n\n- Java 11 JDK\n- Maven 3.5.0\n- Implementations of the interfaces described in the [module descriptor](descriptors/ModuleDescriptor-template.json)\n\n### Optional\n\n- Python 3 (for un-registering module during managed demo and tests via Okapi, and the lint-raml tools)\n\n### Environmental\n\nmod-circulation defines many `module permissions` as it integrates with many other parts of FOLIO.\n\nThese require the use of `Okapi 3.x` or later and an implementation of the `_tenantPermissions 1.1` interface.\n\n## Preparation\n\n### Git Submodules\n\nThere are some common RAML definitions that are shared between FOLIO projects via Git submodules.\n\nTo initialise these please run `git submodule init \u0026\u0026 git submodule update` in the root directory.\n\nIf these are not initialised, the inventory-storage module will fail to build correctly, and other operations may also fail.\n\nMore information is available on the [developer site](https://dev.folio.org/guides/developer-setup/#update-git-submodules).\n\n## Common activities\n\n### Running a general build\n\nIn order to run a general build (including the default tests), run `mvn test`.\n\n### Creating the circulation module JAR\n\nIn order to build an executable Jar (e.g. for Okapi to deploy), run `mvn package`.\n\n### Running the tests\n\n#### Using fake modules\n\nIn order to run the tests, using a fake loan storage module, run ./quick-test.sh.\n\n#### Using real modules (via Okapi)\n\nIn order to run the tests against a real storage module, run ./test-via-okapi.sh.\n\nThis requires [Okapi](https://github.com/folio-org/okapi) to be running and the relevant modules to be registered with it.\n\nThe test script will create a tenant and activate the modules for that tenant.\n\nIn order to change the specific versions of these dependencies, edit the test-via-okapi.sh script.\n\n### Checking the RAML and JSON.Schema definitions\n\nFollow the [guide](https://dev.folio.org/guides/raml-cop/) to use raml-cop to assess RAML, schema, and examples.\n\n## Port\n\nWhen running the jar file the module looks for the `http.port` and `port`\nsystem property variables in this order, and uses the default 9801 as fallback. Example:\n\n`java -Dhttp.port=8081 -jar target/mod-circulation.jar`\n\nThe Docker container exposes port 9801.\n\n## Environment variables\n\nModule integrates with Kafka in order to consume/publish domain events. This integration can\nbe configured using the following environment variables:\n\n| Variable name      | Default value     |\n|--------------------|-------------------|\n| KAFKA_HOST         | localhost         |\n| KAFKA_PORT         | 9092              |\n| REPLICATION FACTOR | 1                 |\n| MAX_REQUEST_SIZE   | 4000000           |\n| ENV                | folio             |\n| OKAPI_URL          | http://okapi:9130 |\n\nIf a variable is not present, its default values is used as a fallback. If this configuration is\ninvalid, the module will start, but Kafka integration will not work.\n\nModule supports so-called floating collections but the feature is disabled by default if the environment variable is\nnot present. Floating collections support can be switched on by setting the environment variable\nENABLE_FLOATING_COLLECTIONS to TRUE.\n\n| Variable name               | Default value     |\n|-----------------------------|-------------------|\n| ENABLE_FLOATING_COLLECTIONS | FALSE             |\n\nModule supports reading room circulation (also called \"for-use-at-location\") but the feature is disabled by default,\nif the environment variable is not present.  Reading room circulation can be switched on by setting the environment\nvariable ENABLE_FOR_USE_AT_LOCATION to TRUE.\n\n| Variable name               | Default value     |\n|-----------------------------|-------------------|\n| ENABLE_FOR_USE_AT_LOCATION  | FALSE             |\n\nThe `HTTP_MAXPOOLSIZE` variable specifies the HTTP connection pool size in mod-circulation.\nIf this value is set too low in high-load environments that require a large number of HTTP requests to\nmod-circulation-storage and mod-inventory-storage, it can lead to significant performance bottlenecks\nfor a single instance of mod-circulation. The default value is set to 100.\n\n| Variable name               | Default value     |\n|-----------------------------|-------------------|\n| HTTP_MAXPOOLSIZE            | 100               |\n\nBoolean variable `ECS_TLR_FEATURE_ENABLED` specifies if ECS TLR feature is enabled. Setting it to `true`\nenables switching from default to ECS-specific logic in various scenarios (such as loan renewal).\nDefault value is `false`.\n\n| Variable name               | Default value |\n|-----------------------------|---------------|\n| ECS_TLR_FEATURE_ENABLED     | false         |\n\n## Design Notes\n\n### Known Limitations\n\n#### Requests Created out of Request Date Order\n\nRequests are assigned a position based upon when they were created.\nThis means the requests could be in a different position in the queue than what\nthe request date suggests. We could re-order to queue based upon request date\neach time it is changed, however this would impede the future requirement\nfor the ability to reorder the queue manually.\n\n#### Creating an already closed loan\n\nIt is not possible to create a loan that is already closed via POST\ndue to checks that are performed during this request.\nHowever it can be done when creating a loan in a specific location via PUT\n\n#### API Tests\n\nAs it is intended that API tests can be run against real module instances,\nsome scenarios are not easily replicated without breaking this capability.\n\nFor example, previously there were tests that verified that some of the APIs\ncould handle missing inventory records. As mod-inventory-storage does not allow\nused holdings or instance records to be deleted, these tests were removed.\n\nThese tests need to be replaced by tests that use specialised implementations\nof the storage interfaces, separate to the fakes used for general API tests.\n\n#### Tenant-selected timezone and locale support\n\n* Tenant-selected timezone is supported only for check-out and renewal (and not for overridden renewals or request creation)\n* Date formatting for patron notices does not respect tenant-selected locale\n\n#### Patron notices\n\nPatron notices are only implemented for check-in and check-out\n\n\n### Check Out By Barcode\n\nIn additional to the typical loan creation API, it is possible to check out an item to a loanee (optionally via a proxy), using barcodes.\n\n#### Example Request\n\n```\nPOST http://{okapi-location}/circulation/check-out-by-barcode\n{\n    \"itemBarcode\": \"036000291452\",\n    \"userBarcode\": \"5694596854\",\n    \"loanDate\": \"2018-03-18T11:43:54.000Z\"\n}\n```\n\n#### Example Success Response\n\n```\nHTTP/1.1 201 Created\ncontent-type: application/json; charset=utf-8\ncontent-length: 1095\nlocation: /circulation/loans/e01ed4d3-28c4-4f9b-89a2-e818e0a6e7f5\n\n{\n    \"id\": \"e01ed4d3-28c4-4f9b-89a2-e818e0a6e7f5\",\n    \"status\": {\n        \"name\": \"Open\"\n    },\n    \"action\": \"checkedout\",\n    \"loanDate\": \"2018-03-18T11:43:54.000Z\",\n    \"userId\": \"2f400401-a751-456a-9f57-415cbce65864\",\n    \"itemId\": \"8722fa77-dc6b-4182-9ea0-e3b708bee0f5\",\n    \"dueDate\": \"2018-04-08T11:43:54.000Z\",\n    \"loanPolicyId\": \"af30cbee-5d54-4a83-842b-eaef0f02cfbe\",\n    \"metadata\": {\n        \"createdDate\": \"2018-04-25T18:17:49.545Z\",\n        \"createdByUserId\": \"79ff2a8b-d9c3-5b39-ad4a-0a84025ab085\",\n        \"updatedDate\": \"2018-04-25T18:17:49.545Z\",\n        \"updatedByUserId\": \"79ff2a8b-d9c3-5b39-ad4a-0a84025ab085\"\n    },\n    \"item\": {\n        \"title\": \"The Long Way to a Small, Angry Planet\",\n        \"contributors\": [\n            {\n                \"name\": \"Chambers, Becky\"\n            }\n        ],\n        \"barcode\": \"036000291452\",\n        \"holdingsRecordId\": \"e2309cd0-5b99-4bf2-8620-df7ac8edd38a\",\n        \"instanceId\": \"ffe94513-fd4a-4c17-86ae-bfc936b47c06\",\n        \"callNumber\": \"123456\",\n        \"status\": {\n            \"name\": \"Checked out\"\n        },\n        \"location\": {\n            \"name\": \"3rd Floor\"\n        },\n        \"materialType\": {\n            \"name\": \"Book\"\n        }\n    }\n}\n```\n\n#### Example Failure Response\n\nBelow is an example of a failure response.\n\nThe message explains the reason for the refusal of the request.\n\nThe parameters refer to what part of the request caused the request to be refused.\n\n```\nHTTP/1.1 422 Unprocessable Entity\ncontent-type: application/json; charset=utf-8\ncontent-length: 200\n\n{\n    \"errors\": [\n        {\n            \"message\": \"Cannot check out item via proxy when relationship is invalid\",\n            \"parameters\": [\n                {\n                    \"key\": \"proxyUserBarcode\",\n                    \"value\": \"6430530304\"\n                }\n            ]\n        }\n    ]\n}\n```\n\n#### Validation\n\nBelow is a short summary summary of most of the validation checks performed when using this endpoint.\n\nEach includes an example of the error message provided and the parameter key included with the error.\n\n| Check                                         | Example Message                                              | Parameter Key    | Notes                                                    |\n|-----------------------------------------------|--------------------------------------------------------------|------------------|----------------------------------------------------------|\n| Item does not exist                           | No item with barcode 036000291452 exists                     | itemBarcode      |                                                          |\n| Holding does not exist                        |                                                              |                  | otherwise it is not possible to lookup circulation rules |\n| Item is already checked out                   | Item is already checked out                                  | itemBarcode      |                                                          |\n| Existing open loan for item                   | Cannot check out item that already has an open loan          | itemBarcode      |                                                          |\n| Proxy relationship is valid                   | Cannot check out item via proxy when relationship is invalid |                  | only if proxying                                         |\n| User must be requesting user                  | User checking out must be requester awaiting pickup          | userBarcode      | if there is an outstanding fulfillable request for item  |\n| User does not exist                           | Could not find user with matching barcode                    | userBarcode      |                                                          |\n| User needs to be active and not expired       | Cannot check out to inactive user                            | userBarcode      |                                                          |\n| Proxy user needs to be active and not expired | Cannot check out via inactive proxying user                  | proxyUserBarcode | only if proxying                                         |\n\n### Renew By Barcode\n\nIt is possible to renew an item to a loanee (optionally via a proxy), using barcodes for the item and loanee.\n\n#### Example Request\n\n```\nPOST http://localhost:9605/circulation/renew-by-barcode\n{\n    \"itemBarcode\": \"036000291452\",\n    \"userBarcode\": \"5694596854\"\n}\n```\n\n#### Example Success Response\n\n```\nHTTP/1.1 200 OK\ncontent-type: application/json; charset=utf-8\ncontent-length: 1114\nlocation: /circulation/loans/a2494e15-cecf-4f68-a5bf-701389b278ed\n\n{\n    \"id\": \"a2494e15-cecf-4f68-a5bf-701389b278ed\",\n    \"status\": {\n        \"name\": \"Open\"\n    },\n    \"action\": \"renewed\",\n    \"loanDate\": \"2018-03-04T11:43:54.000Z\",\n    \"userId\": \"891fa646-a46e-4152-9989-efe3b0311e04\",\n    \"itemId\": \"9edc9877-df4c-4dd8-9306-3f1d1444c3f8\",\n    \"dueDate\": \"2018-03-31T23:59:59.000Z\",\n    \"loanPolicyId\": \"750fd537-3438-4f06-b854-94a1c34d199d\",\n    \"renewalCount\": 1,\n    \"metadata\": {\n        \"createdDate\": \"2018-06-08T13:35:39.097Z\",\n        \"createdByUserId\": \"79ff2a8b-d9c3-5b39-ad4a-0a84025ab085\",\n        \"updatedDate\": \"2018-06-08T13:35:39.162Z\",\n        \"updatedByUserId\": \"79ff2a8b-d9c3-5b39-ad4a-0a84025ab085\"\n    },\n    \"item\": {\n        \"holdingsRecordId\": \"092c24f3-44e8-44a5-9389-5b3f50e4895a\",\n        \"instanceId\": \"a1039600-2076-4248-af75-6b561fdb0f09\",\n        \"title\": \"The Long Way to a Small, Angry Planet\",\n        \"barcode\": \"036000291452\",\n        \"contributors\": [\n            {\n                \"name\": \"Chambers, Becky\"\n            }\n        ],\n        \"callNumber\": \"123456\",\n        \"status\": {\n            \"name\": \"Checked out\"\n        },\n        \"location\": {\n            \"name\": \"3rd Floor\"\n        },\n        \"materialType\": {\n            \"name\": \"Book\"\n        }\n    }\n}\n```\n\n#### Example Failure Response\n\nBelow is an example of a failure response.\n\nThe message explains the reason for the refusal of the request.\n\nThe parameters refer to what part of the request caused the request to be refused.\n\n```\nHTTP/1.1 422 Unprocessable Entity\ncontent-type: application/json; charset=utf-8\ncontent-length: 611\n\n{\n    \"errors\": [\n        {\n            \"message\": \"renewal at this time would not change the due date\",\n            \"parameters\": [\n                {\n                    \"key\": \"loanPolicyName\",\n                    \"value\": \"Limited Renewals And Limited Due Date Policy\"\n                },\n                {\n                    \"key\": \"loanPolicyId\",\n                    \"value\": \"9b28ec73-0582-4751-bd5c-65c03965ae65\"\n                }\n            ]\n        },\n        {\n            \"message\": \"loan has reached it's maximum number of renewals\",\n            \"parameters\": [\n                {\n                    \"key\": \"loanPolicyName\",\n                    \"value\": \"Limited Renewals And Limited Due Date Policy\"\n                },\n                {\n                    \"key\": \"loanPolicyId\",\n                    \"value\": \"9b28ec73-0582-4751-bd5c-65c03965ae65\"\n                }\n            ]\n        }\n    ]\n}\n```\n\n### Circulation Rules Caching\n\nThe circulation rules engine used for applying circulation rules has an internal, local cache which is refreshed every 5 seconds and when a PUT to /circulation/rules changes the circulation rules.\n\nThis is per module instance, and so may result in different responses during this window after the circulation rules are changed.\n\n### Circulation Rules\n\n[doc/circulationrules.md](doc/circulationrules.md)\n\nThat document explains how the circulation rules engine calculates the loan policy (that specifies the loan period)\nbased on the patron's patron group and the item's material type, loan type, and location.\n\n### Item Status\n\nDuring the circulation process an item can change between a variety of states,\nbelow is a table describing the most common states defined at the moment.\n\n| Name            | Description                                                                        |\n|-----------------|------------------------------------------------------------------------------------|\n| Available       | This item is available to be lent to a patron                                      |\n| Checked out     | This item is currently checked out to a patron                                     |\n| Awaiting pickup | This item is awaiting pickup by a patron who has a request at the top of the queue |\n\n### Request Status\n\n| Name                   | Description                                                    |\n|------------------------|----------------------------------------------------------------|\n| Open - Not yet filled  | The requested item is not yet available to the requesting user |\n| Open - Awaiting pickup | The item is available to the requesting user                   |\n| Closed - Filled        |                                                                |\n\n### Storing Information from Other Records\n\nIn order to facilitate the searching and sorting of requests by the properties of related records, a snapshot of some\nproperties are stored with the request.\n\nThis snapshot is updated during POST or PUT requests by requesting the current state of those records.\nIt is possible for them to become out of sync with the referenced records.\n\nthe request JSON.schema uses the readOnly property to indicate that these properties, from the perspective of the client, are read only.\n\n#### Properties Stored\n\n##### Requesting User (referenced by requesterId, held in requester property)\n\n* firstName\n* lastName\n* middleName\n* barcode\n\n##### Proxy Requesting User (referenced by proxyUserId, held in proxy property)\n\n* firstName\n* lastName\n* middleName\n* barcode\n\n##### Requested Item (referenced by itemId, held in item property)\n\n* title\n* barcode\n\n### Including Properties From Other Records\n\nIn order to reduce the amount of requests a client needs to make, some properties from other records in responses.\n\nAs this inclusion requires a chain of requests after the loans or requests have been fetched, the responses may take longer than other requests.\n\n#### Loans\n\nLoans include information from the item, including locations, holdingsRecordId and instanceId.\n\n#### Requests\n\nRequests include information from the item, including holdingsRecordId and instanceId.\n\n#### Hold shelf clearance report\n\nTo create hold expiration report that can be used by staff to clear expired and cancelled holds from the shelf and put them back into circulation.\nThen generate a report based on this logic:\n* Find all of the items that are `Awaiting pickup`\n* Choose the item’s which either have an empty request queue or request queue doesn't contain request with status `Open - Awaiting pickup`\n* Select the request for each item that expired or was cancelled on the hold shelf most recently (by ranking the closed requests by a date used only for this purpose)\n* Choose only the requests where the `pickup service point` matches the chosen service point\n\nThe API for generating a report is based on the presence of the 'awaitingPickupRequestClosedDate' property for the request JSONB.\nSuch behavior is required by database trigger for request update in the mod-circulation-storage\nSee [CIRCSTORE-127](https://issues.folio.org/browse/CIRCSTORE-127)\n\nData involved in the formation of the report:\n* Requester name: lastName, firstName\n* Requester barcode\n* Item title\n* Item barcode\n* Call number\n* Request status\n* Hold shelf expiration date: Date with timestamp\n\n#### Example Request\n\n```\nGET http://{okapi-location}/circulation/requests-reports/hold-shelf-clearance/:{servicePointId}\n```\n\n#### Example Success Response\n\n```\nHTTP/1.1 200 Ok\ncontent-type: application/json; charset=utf-8\ncontent-length: 230\n\n{\n  \"requests\": [\n    {\n      \"id\": \"f5cec279-0da6-4b44-a3df-f49b0903f325\",\n      \"requestType\": \"Hold\",\n      \"requestDate\": \"2017-08-05T11:43:23Z\",\n      \"requesterId\": \"61d939e4-f2ae-4c53-95d2-224a802fa2a6\",\n      \"itemId\": \"3e5d5433-a271-499c-94f4-5f3e4652e537\",\n      \"fulfillmentPreference\": \"Hold Shelf\",\n      \"requestExpirationDate\": \"2017-08-31T22:25:37Z\",\n      \"holdShelfExpirationDate\": \"2017-09-01T22:25:37Z\",\n      \"position\": 1,\n      \"status\": \"Closed - Pickup expired\",\n      \"pickupServicePointId\": \"4ae438be-308a-468d-a815-ad109c288f05\",\n      \"awaitingPickupRequestClosedDate\": \"2019-03-11T15:45:23.000+0000\"\n      \"item\": {\n        \"title\": \"Children of Time\",\n        \"barcode\": \"760932543816\",\n        \"callNumber\": \"A344JUI\"\n      },\n      \"requester\": {\n        \"firstName\": \"Stephen\",\n        \"lastName\": \"Jones\",\n        \"middleName\": \"Anthony\",\n        \"barcode\": \"567023127436\"\n      }\n    }\n  ],\n  \"totalRecords\": 1\n}\n```\n### Configuration setting for CheckoutLock Feature\n  To enable this feature for a tenant, we need to add the below configuration in mod-settings. See [UXPROD-3515](https://issues.folio.org/browse/UXPROD-3515) to know more about this feature.\n\n#### Permissions\n  To make a post call to mod-settings, user should have below permissions.\n```\n  mod-settings.entries.item.post\n  mod-settings.global.write.mod-circulation\n```\n\n#### Example request\n```\nPOST https://{okapi-location}/settings/entries\n  {\n    \"id\":\"1e01066d-4bee-4cf7-926c-ba2c9c6c0001\",\n    \"scope\": \"mod-circulation\",\n    \"key\":\"checkoutLockFeature\",\n    \"value\":\"{\\\"checkOutLockFeatureEnabled\\\":true,\\\"noOfRetryAttempts\\\":25,\\\"retryInterval\\\":250,\\\"lockTtl\\\":2500}\"\n}\n```\n\n| parameter | Type        | Description                                                                                           |\n|-----------|-------------|-------------------------------------------------------------------------------------------------------|\n| `id`      | UUID        | id should be provided of type UUID.                                                                   |\n| `scope`   | String      | Scope should be the module name. Here, it will be \"mod-circulation\"                                   |\n| `key`     | String      | Key should be feature name which we are enabling the settings. Here, it will be \"checkoutLockFeature\" |\n| `value`   | Json Object | Settings for checkout lock feature                                                                    |\n\n\n| Value options                | Type    | Description                                                                                                                                                                                    |\n|------------------------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `checkOutLockFeatureEnabled` | boolean | Indicates whether or not to enable this feature for the tenant. Default value is false(disabled).                                                                                              |\n| `noOfRetryAttempts`          | int     | The maximum number of times to retry the lock ackquiring process during checkout. Once the retry is exhausted, system will return error. Default value is 30.                                  |\n| `retryInterval`              | int     | The amount of time to wait between retries in milliseconds. Default value is 250.                                                                                                              |\n| `lockTtl`                    | int     | Maximum amount of time(milliseconds) that the lock should exist for a patron. After this time, the lock will gets deleted and lock will be provided for another request. Default value is 3000 |\n\n## Additional Information\n\nOther [modules](https://dev.folio.org/source-code/#server-side).\n\nOther FOLIO Developer documentation is at [dev.folio.org](https://dev.folio.org/)\n\n### Issue tracker\n\nSee project [CIRC](https://issues.folio.org/browse/CIRC)\nat the [FOLIO issue tracker](https://dev.folio.org/guidelines/issue-tracker/).\n\n### ModuleDescriptor\n\nSee the built `target/ModuleDescriptor.json` for the interfaces that this module\nrequires and provides, the permissions, and the additional module metadata.\n\n### API documentation\n\nThis module's [API documentation](https://dev.folio.org/reference/api/#mod-circulation).\n\n### Code analysis\n\n[SonarQube analysis](https://sonarcloud.io/dashboard?id=org.folio%3Amod-circulation).\n\n### Download and configuration\n\nThe built artifacts for this module are available.\nSee [configuration](https://dev.folio.org/download/artifacts) for repository access,\nand the [Docker image](https://hub.docker.com/r/folioorg/mod-circulation/).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffolio-org%2Fmod-circulation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffolio-org%2Fmod-circulation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffolio-org%2Fmod-circulation/lists"}