# Reservations

7 of 10 supported
Source: https://plasapi.com/features/patron/reservations/

Let patrons place holds on material, choose where to pick it up, follow their place in the queue and manage their reservations.

## 2.5.1 Reserve material — Supported

Place a hold on a publication that the patron picks up when it is ready.

### What you can build

The central action on a work: the patron reserves, chooses where to pick up, and sees their place in the queue straight away. Fees and limits come from the library system, so the client can show them before the patron confirms.

### Typical flow

1. The patron chooses a publication. The client reads its `reserveId` from `GetHoldings`.
2. The client reads the patron's fee, limits and pick-up locations from `GetPatronConfiguration`.
3. The patron chooses where to pick up (2.5.8).
4. The client creates the reservation with `CreatePatronReservation`.
5. The response is the reservation, including the patron's `queueNumber` when it is known.

### What the API provides

- A publication without a `reserveId` cannot be reserved.
- A reservation fee has `chargedAt`: `reservation` (charged when the hold is placed) or `checkout` (charged at pick-up). `amount` is in minor units, `currency` in ISO 4217.
- Reservation limits come as `daily` and `max`.

### Calls in the API

Requires: 2.2.1

In this order

1. [GET /holdings](https://plasapi.com/provider/v0.6.7/holding/#GetHoldings) — Get holdings
2. [GET /patron/{patronId}/information](https://plasapi.com/provider/v0.6.7/patron/#GetPatronInformation) — Get patron information
3. [GET /patron/{patronId}/configuration](https://plasapi.com/provider/v0.6.7/patron-configuration/#GetPatronConfiguration) — Get patron configuration
4. [GET /locations](https://plasapi.com/provider/v0.6.7/location/#GetLocations) — Get locations
5. [POST /patron/{patronId}/reservation](https://plasapi.com/provider/v0.6.7/patron-reservation/#CreatePatronReservation) — Create reservation

## 2.5.2 View reservations — Supported

Show the patron's reservations and where each one stands.

### What you can build

An overview of everything the patron has reserved: what is ready to pick up, what is in the queue, and what is paused.

### Typical flow

1. The client fetches the reservations with `GetPatronReservations`.
2. Each reservation is shown with its state and, when known, its place in the queue.

### What the API provides

- `state` is `ready_for_pickup`, `in_queue` or `postponed`.
- `queueNumber` 1 means first in line. When the field is missing, the position is unknown.
- `fulfillmentBy` tells how the reservation is fulfilled: `local_circulation`, `interlibrary_loan`, `purchase` or `unknown`.

### Calls in the API

Requires: 2.2.1

- [GET /patron/{patronId}/reservation](https://plasapi.com/provider/v0.6.7/patron-reservation/#GetPatronReservations) — Get patron reservations

## 2.5.3 Cancel reservation — Supported

Let the patron cancel a reservation they no longer need.

### What you can build

Patrons cancel a reservation themselves, without contacting the library.

### Typical flow

1. The patron chooses a reservation and confirms the cancellation.
2. The client calls `DeletePatronReservation`.

### Calls in the API

Requires: 2.2.1

- [DELETE /patron/{patronId}/reservation/{reservationId}](https://plasapi.com/provider/v0.6.7/patron-reservation/#DeletePatronReservation) — Delete reservation

## 2.5.4 Change pick-up location — Supported

Move an existing reservation to another pick-up location.

### Typical flow

1. The client lists the pick-up locations with `GetLocations`.
2. The patron chooses a new one.
3. The client updates the reservation with `UpdatePatronReservation`.

### What the API provides

- `UpdatePatronReservation` changes only `pickupLocation`.

### Calls in the API

Requires: 2.2.1

In this order

1. [GET /locations](https://plasapi.com/provider/v0.6.7/location/#GetLocations) — Get locations
2. [PUT /patron/{patronId}/reservation/{reservationId}](https://plasapi.com/provider/v0.6.7/patron-reservation/#UpdatePatronReservation) — Update reservation

## 2.5.6 Pause reservations — Supported

Pause all of the patron's reservations for a period when they cannot pick up.

### What you can build

Paused reservations stay in the patron's overview, marked as paused.

### Typical flow

1. The patron chooses a period.
2. The client sets `reservation.postpone` with `UpdatePatronInformation`.
3. Reservations in the period show the state `postponed`.

### What the API provides

- The pause applies to the patron, not to a single reservation.
- The period may be open at one end, for example from today with no end date.

### Calls in the API

Requires: 2.2.1

- [PATCH /patron/{patronId}/information](https://plasapi.com/provider/v0.6.7/patron/#UpdatePatronInformation) — Update patron information

## 2.5.7 Change expiration date — Not yet

Let the patron change how long a reservation stays valid.

> Not in PLAS yet. This feature is not supported today. The description shows what it does, so you can see how it fits with the rest.

## 2.5.8 Choose pick-up location when reserving — Supported

Let the patron choose where to pick up while placing a reservation.

### Typical flow

1. The client reads the patron's default pick-up location from `GetPatronInformation` (`pickupLocation`).
2. The patron can choose another one from the list.
3. The chosen location is sent as `pickupLocation` with `CreatePatronReservation`.

### What the API provides

- The options come from, in order of precedence: the item's `pickupLocations` in `GetHoldings`, the holding's `pickupLocations`, the patron's configuration (`GetPatronConfiguration`) and `GetLocations`.
- Each level replaces the ones below it entirely. If no level defines any pick-up locations, the material cannot be reserved.

### Calls in the API

Requires: 2.2.1

In this order

1. [GET /holdings](https://plasapi.com/provider/v0.6.7/holding/#GetHoldings) — Get holdings
2. [GET /patron/{patronId}/information](https://plasapi.com/provider/v0.6.7/patron/#GetPatronInformation) — Get patron information
3. [GET /patron/{patronId}/configuration](https://plasapi.com/provider/v0.6.7/patron-configuration/#GetPatronConfiguration) — Get patron configuration
4. [GET /locations](https://plasapi.com/provider/v0.6.7/location/#GetLocations) — Get locations
5. [POST /patron/{patronId}/reservation](https://plasapi.com/provider/v0.6.7/patron-reservation/#CreatePatronReservation) — Create reservation

## 2.5.9 Interlibrary loan request — Not yet

Let the patron request material from another library.

> Not in PLAS yet. This feature is not supported today. The description shows what it does, so you can see how it fits with the rest.

## 2.5.10 Cancel interlibrary loan request — Not yet

Let the patron cancel a request for material from another library.

> Not in PLAS yet. This feature is not supported today. The description shows what it does, so you can see how it fits with the rest.

## 2.5.11 Reserve on behalf of a patron — Supported

Let library staff place a reservation for a patron.

### Typical flow

1. Staff identify the patron.
2. The reservation is created with `CreatePatronReservation` for that patron.

### What the API provides

- The specification has no separate operation for staff and describes no way to act on a patron's behalf.

### Calls in the API

Requires: 2.2.1

- [POST /patron/{patronId}/reservation](https://plasapi.com/provider/v0.6.7/patron-reservation/#CreatePatronReservation) — Create reservation
