Overview
When a patron places a Direct Consortial Borrowing request it goes through some initial [[preflight checks]] to make sure there isn’t anything immediately fatal that will prevent the request from being fulfillled.
If those checks are passed, the request is not accepted by DCB and the patron’s requesting system is notified so that the patron can be informed.
Once those checks are received, the request is stored with DCB and then goes through a largely deterministic sequence:
Preliminary States - ensure we have good data to propagate requests in downstream systems
SUBMITTED_TO_DCB
PATRON_VERIFIED
RESOLVED
Circulation Tracking - to track and synchronise downstream systems
REQUEST_PLACED_AT_SUPPLYING_AGENCY
CONFIRMED
REQUEST_PLACED_AT_BORROWING_AGENCY
PICKUP_TRANSIT
RECEIVED_AT_PICKUP
READY_FOR_PICKUP
LOANED
RETURN_TRANSIT
Finishing States - to terminate and clean up traces of finished requests where possible
Preliminary Finishing
NOT_SUPPLIED_CURRENT_SUPPLIER
NO_ITEMS_AVAILABLE_AT_ANY_AGENCY
Circulation FInishing
CANCELLED
Happy Path Finishing
COMPLETED
FINALISED
Unexpected Termination
ERROR
Preliminary States
The initial sequence of states that a request goes through to verify a patron’s identity and resolve to an selectable item.
Until it completes this deterministic sequence, the request only exists in DCB and not in downstream systems.
There is no polling in these states.
DCB STATE | Max backoff / Next Poll interval / Next Step
| Max backoff / Next Poll interval / Next Step
| What tracking for next step in 2l process | What tracking for next step in 3l process |
---|---|---|---|---|
None | None | Auto Triggers ValidatePatronTransition Moves us to PATRON_VERIFIED | ||
None | None | Auto Triggers PatronRequestResolutionStateTransition Moves us to RESOLVED | ||
None | None | Auto Triggers PlacePatronRequestAtSupplyingAgencyStateTransition Moves us to REQUEST_PLACED_AT_SUPPLYING_AGENCY |
Circulation States
When a request has gone through preliminary verification and resolution states DCB attempts to place, update and track its progress in downstream systems.
Once the initial circulation state is entered, polling is triggered to handle state transitions based on the criteria defined
A request is expected to transition through each state in the given circulation sequence
this is the “happy path”
In rare scenarios, DCB may not always pick up all state transitions, depending on downstream system processing and polling intervals
in this case the request is flagged as out of sequence
this is not always fatal for a request - and they are often picked up again when they are in RETURN TRANSIT, the loan to patron having been skipped by DCB
DCB STATE | Max backoff / Next Poll interval / Next Step
| Max backoff / Next Poll interval / Next Step
| What tracking for next step in 2l process | What tracking for next step in 3l process |
---|---|---|---|---|
REQUEST_PLACED_AT_SUPPLYING_AGENCY | 10ms | 10ms
| wait for SupplierRequest= CONFIRMED | TRANSIT → HandleSupplierRequestConfirmed Moves us into the CONFIRMED state | |
CONFIRMED | 10m | 10m | Auto Triggers PlacePatronRequestAtBorrowingAgencyStateTransition Moves us to REQUEST_PLACED_AT_BORROWING_AGENCY | |
REQUEST_PLACED_AT_BORROWING_AGENCY | 10m | 1h | wait for SupplyingItem State = TRANSIT -> HandleSupplierInTransit Moves us to PICKUP_TRANSIT | |
PICKUP_TRANSIT | 10m | 1h | wait for BorrowingItem = RECEIVED | LOANED | ON_HOLD_SHELF Then HandleBorrowerItemReceived moves us to RECEIVED_AT_PICKUP | |
RECEIVED_AT_PICKUP | 10m | 1h | wait for BorrowingItem = ON_HOLD_SHELF | LOANED Then HandleBorrowerItemOnHoldShelf moves us to READY_FOR_PICKUP | |
READY_FOR_PICKUP | 10m | 1h | wait for BorrowingItem = LOANED Then HandleBorrowerItemLoaned moves us to LOANED | |
LOANED | 10m | 6h | wait for BorrowingItem = AVAILABLE | TRANSIT OR SupplierItem=AVAILABLE HandleBorrowerRequestReturnTransit moves us to RETURN_TRANSIT N.b. CLOSED==FOLIO Specific N.b. Additional check needed here - item loaned other | |
RETURN_TRANSIT | 10m | 1h | SupplierItem = AVAILABLE | SupplierRequest=CLOSED Then HandleSupplierItemAvailable moves us to COMPLETED N.b. CLOSED==FOLIO Specific N.b. Additional check needed here - item loaned other |
Finishing States
When a request completes its cycle, or if it terminates prematurely, it enters a finishing state.
In most cases this indicates the end of the request, resulting in a finishing sequence
in the future,
NOT_SUPPLIED_CURRENT_SUPPLIER
will trigger a re-request
The finishing sequence may or may not involve clean up of virtual records, depending on whether the request
DCB STATE | Max backoff / Next Poll interval / Next Step
| Max backoff / Next Poll interval / Next Step
| What tracking for next step in 2l process | What tracking for next step in 3l process |
---|---|---|---|---|
Preliminary Finishing (follows a preliminary state before a request enters tracked circulation) | ||||
NOT_SUPPLIED_CURRENT_SUPPLIER | None | None | Auto Triggers: ResolveNextSupplierTransition Moves us to NO_ITEMS_AVAILABLE_AT_ANY_AGENCY | |
NO_ITEMS_AVAILABLE_AT_ANY_AGENCY | None | None | TERMINAL STATE (For now) | |
Circulation Finishing (interrupts tracked circulation, and is typically manually instigated) | ||||
CANCELLED | None | None | Auto Triggers: FinaliseRequestTransition moves us to FINALISED | |
Happy Path Finishing (follows directly after the end of tracked circulation) | ||||
COMPLETED | None | None | Auto Triggers: FinaliseRequestTransition moves us to FINALISED | |
FINALISED | None | None | TERMINAL STATE | TERMINAL STATE |
Unexpected Termination (can happen at any stage) | ||||
ERROR | None | None | TERMINAL STATE | TERMINAL STATE |
Explanatory Notes
Max backoff / Next Poll interval / Next Step (see table below)
None: no downstream polling will happen
Time: add time period to now to calculate “Check Due Time” (not called that in code) when the next check should happen
Polling interval : (configured at an environment level in dcb-service config):
indicates how often to trigger a polling cycle generally, and then within each cycle, only check those items with states that have passed a Check Due Time
Force check update: check now regardless of Check Due Time
Changes
Reduced from 60s to 10ms rather than as 0s appears to be treated as effectively terminating.
DCB-1289 Generalise transition to FINALISE and apply to CANCELLED to extend cleanup