Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
72c15ed
Align with Pinakes 0.9.0: feature toggles, closures calendar, patron-…
fabiodalez-dev Oct 28, 2026
e3e6c13
Contract: health sample from a Pinakes 0.9.0 server with the feature …
fabiodalez-dev Oct 28, 2026
4e25f71
Review fixes: return over a closure stops before a booking, safer mov…
fabiodalez-dev Oct 28, 2026
6ad5757
Movements: an omitted accrued_cents falls back to the sum of the accr…
fabiodalez-dev Oct 29, 2026
9d1e87f
Review fixes: app access gates the 0.9.0 flags, closed days in the st…
fabiodalez-dev Oct 29, 2026
4c565c9
Staff loan form: check today for a loan without a start, wait for the…
fabiodalez-dev Oct 29, 2026
c4e60f7
Staff loan form: apply only the latest availability answer
fabiodalez-dev Oct 29, 2026
d90533f
Follow-up alignment with Pinakes 0.9.0: consultation switch, closed-d…
fabiodalez-dev Oct 30, 2026
75a829c
Staff reservations can ignore the patron type's limits, as on the web…
fabiodalez-dev Oct 30, 2026
e89a9bb
Offline author and publisher filters drop the exact-spelling quotes too
fabiodalez-dev Oct 30, 2026
6028e5b
Profile shows the library card code as the printed card's barcode
fabiodalez-dev Oct 30, 2026
d9dd41d
STATUS: staff reservation override, library card barcode, offline fil…
fabiodalez-dev Oct 30, 2026
6738684
Copy editor sets consultation-only copies, as the book page does
fabiodalez-dev Oct 30, 2026
642c042
Staff area: scaffolding for the Pinakes 0.9.0 tools
fabiodalez-dev Nov 1, 2026
a2f866d
Staff area: library settings, patron types and rules, closures calendar
fabiodalez-dev Nov 1, 2026
78822db
Staff area: patron types and the closures calendar are administrator …
fabiodalez-dev Nov 1, 2026
22cd38b
Staff area: patron tools, ledger, visitor log and patron import for P…
fabiodalez-dev Nov 1, 2026
a67ba70
Merge the patron tools, ledger, visitor log and patron import into th…
fabiodalez-dev Nov 1, 2026
abd1496
Library settings: a refused action is not_permitted, the role gate st…
fabiodalez-dev Nov 1, 2026
0b427bd
Merge the library settings, patron types and closures calendar into t…
fabiodalez-dev Nov 1, 2026
1b3600b
Library settings test: patron types and the calendar are administrato…
fabiodalez-dev Nov 1, 2026
63d5fd7
Staff area: cataloguing tools of Pinakes 0.9.0 (suppliers, MARC, copy…
fabiodalez-dev Nov 1, 2026
8f8138d
Merge the suppliers, MARC, copy cataloguing and catalogue cards into …
fabiodalez-dev Nov 1, 2026
acb5d12
Patron import: list the open jobs, resume or cancel them
fabiodalez-dev Nov 1, 2026
f88e75e
Merge the open patron imports list into the 0.9.0 staff tools branch
fabiodalez-dev Nov 1, 2026
5939140
MARC import: resume or cancel the open jobs listed by the server
fabiodalez-dev Nov 1, 2026
69eab3c
Merge the open MARC imports list into the 0.9.0 staff tools branch
fabiodalez-dev Nov 1, 2026
9f53b70
Staff area: stocktake scanner and statistics for Pinakes 0.9.0
fabiodalez-dev Nov 1, 2026
38a8ebd
Merge the stocktake and statistics screens into the 0.9.0 staff tools…
fabiodalez-dev Nov 1, 2026
2af41aa
Library flows: Staff no longer sees the administrator tools
fabiodalez-dev Nov 1, 2026
0f612c1
Merge the reworked library settings flow into the 0.9.0 staff tools b…
fabiodalez-dev Nov 1, 2026
d9184d8
Patron flow tests: open the hub rows directly, match the detail line,…
fabiodalez-dev Nov 1, 2026
3da17b1
Loan create flow: expect the suspended-patron wording
fabiodalez-dev Nov 1, 2026
b6bbdd8
Merge the fixed patron flows into the 0.9.0 staff tools branch
fabiodalez-dev Nov 1, 2026
4f8b5ab
Live smoke for the Pinakes 0.9.0 staff areas
fabiodalez-dev Nov 1, 2026
98e913f
Staff 0.9.0: fixes from the live run
fabiodalez-dev Nov 1, 2026
0e1b3c0
Merge branch 'feat/staff-090-admin' into feat/staff-090-live-smoke
fabiodalez-dev Nov 1, 2026
36b2163
MARC import: open jobs that arrive late stay in view; order-proof cat…
fabiodalez-dev Nov 1, 2026
6fafbaa
Merge branch 'feat/staff-090-admin' into feat/staff-090-catalogue
fabiodalez-dev Nov 1, 2026
09d1e1f
Live smoke 0.9.0: assert the hub refresh, the type hint and the impor…
fabiodalez-dev Nov 1, 2026
522f7eb
Stocktake: a poll in flight never reopens a closed session; desk flow…
fabiodalez-dev Nov 1, 2026
e941496
Tier 2 flow: wait for the club sheet and repeat Save until the create…
fabiodalez-dev Nov 1, 2026
0ad387f
Flows: one helper taps a sheet's Save until the request is sent
fabiodalez-dev Nov 2, 2026
a59cca5
Merge branch 'feat/staff-090-catalogue' into feat/staff-090-admin
fabiodalez-dev Nov 2, 2026
bb19024
Release 1.11.0 (versionCode 25)
fabiodalez-dev Nov 2, 2026
c18bbc1
Stocktake: the outcome list keeps the pages read past the first
fabiodalez-dev Nov 2, 2026
f9e5d8b
Live smoke 0.9.0: stocktake paging over more than one page
fabiodalez-dev Nov 2, 2026
f538e74
Review fixes: drafts survive reloads, one-shot desk tones, stale sess…
fabiodalez-dev Nov 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 23 additions & 0 deletions STATUS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Pinakes Android — Build Status

## 1.11.0 (versionCode 25): Pinakes 0.9.0, and its whole admin from the staff area

Pairs with Pinakes 0.9.0-rc.2 (Mobile API 1.10.0 for the staff areas, the copy editor's consultation switch and `patron_type` on the profile; Mobile API 1.9.0 for `closed_dates`, `loanable`, `reservations_enabled`, `/me/movements` and the new 409 codes; Mobile API 1.9.1 for the `/health` toggles `fines`, `closures_calendar` and `circulation_rules`). Works with older servers: every field is optional, the three flags default to off, and their absence keeps the 1.10.0 behaviour.

- **Feature toggles**: `/health.features.fines`, `closures_calendar` and `circulation_rules` are read and stored with the other flags; catalogue mode turns all three off whatever the server sends.
- **Closures calendar**: `closed_dates` paints closed days grey (legend "Library closed", only when the library has closures), they cannot be picked as a start, a tap says the library is closed, the pre-selected day skips them, and a proposed return date always lands on an open day (the default return moves forward as the server does; a shortened one sent as `end_date` moves back, never past the booked day). Same calendar for the reader and for the staff loan desk.
- **Consultation only and closed waitlists**: with `circulation_rules` on, the book page reads `loanable` and `reservations_enabled` from the availability payload; the loan button stays visible but disabled, with the reason under it ("Consultation only", or no reservations with this card). A 409 `not_loanable` / `reservations_disabled` turns the button the same way at once.
- **Refusal codes**: `not_loanable`, `reservations_disabled`, `reservation_limit_reached`, `media_limit_reached`, `max_loans_reached` and `not_eligible` with `meta.reason` `debt_block` / `card_expired` / `user_suspended` have their own wording for readers and staff; unknown codes keep the server message. Staff borrower pages and the new-loan form name the eligibility reason in the app's words.
- **Balance and movements** (Profile, only with `features.fines`): balance, the "loans blocked" banner with the library's threshold, fines still accruing on overdue loans, and the ledger. A 404 `feature_disabled` closes the page without an error.
- Additive, shown when the server sends them: `patron_type` on the profile, `consultation_only` on a staff copy.
- **Consultation-only copies on their own switch**: Pinakes 0.9.0 moved them off the rules matrix (`/health.features.consultation_only`). The book page now asks for the reader's rules when either `circulation_rules` or `consultation_only` is on, so a consultation-only title shows the disabled button with its reason even with patron-type rules off. A server without the key keeps tying it to `circulation_rules`. `automatic_fines` and `debt_block` need no client change: the server already leaves the accruing fines out and sends `debt_block_threshold_cents: null` and `debt_blocked: false` when they are off.
- **A loan approved on a closed day**: with the library closed today, an auto-approved request comes back `prenotato` with `start_date` (the next open day). The confirmation now says from which day the book can be picked up, instead of "ready for pickup".
- **Quoted searches offline** (Pinakes #501): online, quotes ask the server for the exact spelling. The offline catalogue folds accents and cannot tell spellings apart, so it now drops the quotes and searches the words, as the server reads them (straight and typographic quotes; an inch mark after a digit stays), in the text query and in the author and publisher filters. Before, it looked for the quote characters and found nothing.
- **Staff reservations beyond the patron type's limits**: with `circulation_rules` on, the staff new-reservation form has the website's switch "Ignore the reservation limits of the patron's type", sent as `override_limits` on `POST /staff/reservations`. Without the switch, or with the rules off, the key is left out.
- **Consultation-only copies from the copy editor**: with `features.consultation_only` on, the staff copy editor has the switch the book page has; `consultation_only` is sent on `PUT /staff/copies/{id}` only when it changed. The server refuses it for a copy on loan, awaiting pickup or requested, as the website does. Needs Mobile API 1.10.0 (Pinakes 0.9.0-rc.2), which also sends `patron_type` on `GET /me` for the profile row.
- **Library card barcode**: the profile draws the card code (`codice_tessera`) as Code128, the printed card's default (Pinakes 0.9.0 library cards), so the desk and the visitor-log kiosk can scan the phone. Only printable ASCII is encoded, as on the printed card.
- **Staff patron tools** (Mobile API 1.10.0, each shown only when its flag and the server's `can_*` allow it): the staff patron screen gains a patron section with the photo (take, pick, replace, remove; fetched with the token and kept in memory only), the patron type with the type picker and the "set the expiry from the type" switch, card renewal (Idempotency-Key) and the printable card PDF, and the balance with the debt block leading to the new ledger screen (balance, fines accruing on open loans, paged movements with the operator and the payment receipt PDF, payment, charge and waiver sheets with exact decimal-to-cents parsing and a required Idempotency-Key). The staff return shows the late fine a return today charges, with a waiver switch and its mandatory reason (`waive_fine`/`waive_reason`). The front desk gains the visitor log (card scan in CODE 128 or QR, manual entry, branch choice, a result card with a short tone, guests, and a statistics tab with periods, day and hour bars, latest visits, CSV export and, for administrators, retention and purge) and the patron CSV import (upload with separator choice, preview, column mapping with required fields, invitations, the chunk loop of the catalogue import, counters, error report and example file; the jobs left open here or on another device are listed with Resume and Cancel). A 403 `not_permitted` shows the server message and keeps the staff area.
- **Fixes from a live run against a 0.9.0-rc.2 server**: switching a module in Library settings re-reads `/health` at once, so the hub adds or drops the entry without an app restart; the patron type editor's "Empty: …" hint shows what clearing the field gives, not the type's own value; the staff ledger words the balance about the patron; the finished patron import offers the error report only when it has rows; MARC jobs whose list answers late stay in view; a stocktake status poll answered after a close can no longer reopen the session on screen. `tools/e2e/live_smoke_090.py` drives every staff area on an emulator against a real server.
- No change to the local cache database (Room version 3).
- **Staff: library settings** (Pinakes 0.9.0, Mobile API 1.10.0, areas `library_settings`, `circulation_rules`, `closures_calendar`): three screens in the hub's Library section. *Library settings* has the web's Modules, Loans and Cards tabs: module switches with their help and dependencies (read-only state and no save action when `can_configure` is false), every loan setting with its own input (amounts in the server currency, parsed to cents exactly; fields outside `editable_fields` shown as values, so Staff never sends the money policy), card layout and texts; a save sends only what changed. *Patron types and loan rules* lists the types (default, inactive, patrons) with a sheet for every field (empty inherits, the inherited value as hint), default, order and delete, plus the rules matrix (patron type, "all types" included, by material) whose changed cells are saved together. *Closures calendar* shows the month (by branch) with each closed day's reasons, and edits weekly closed days, closures, yearly switches, the national holiday preset (country, region, year preview), the library's own holidays of every kind, and imports an ICS file. A screen this account may not use (403 `not_permitted` on its first load, or 404 `feature_disabled` for Staff with the module off) closes with the server's message; a refused action inside a screen shows the message and stays. Only the role gate's 403 `forbidden` drops the staff role.
- **Cataloguing (Pinakes 0.9.0, Mobile API 1.10.0)**: the staff hub's Cataloguing section opens Suppliers (list with search and book counts, create with an Idempotency-Key and the server's field errors under each field, edit as a patch, delete saying how many books lose the link), MARC (import: file from the document picker, flavour, encoding, duplicate mode, supplier and covers from `/staff/marc/options`, preview of the first records, then the CSV import's chunk driver with out-of-order recovery, pause, resume and cancel; the unfinished MARC jobs on the server (`GET /staff/marc/imports`, so also one started on another device or whose id the app lost) are listed above the form with Resume and Cancel; export of the whole catalogue or of chosen books in MARC 21, MARCXML or UNIMARC, and the chosen books' catalogue cards) and Copy cataloguing (catalogues, index, term with an ISBN/ISSN scan, results to select, duplicate mode and covers, idempotent import with links to the new records; the plugin's absence is explained instead of the form). The book form gains a supplier picker and the RDA content, media and carrier selects ("derived" names the server's value) only while the lookups carry them, so the keys stay out with the modules off; the record's screen prints its catalogue card and exports it in MARC. The staff book list has no selection mode, so the multi-book actions live in the MARC screen. A 403 `not_permitted` shows the server message and keeps the staff role.
- **Staff: stocktake and statistics** (Pinakes 0.9.0, Mobile API 1.10.0, areas `stocktake` and `statistics`): *Stocktake* lists the sessions by status with their counters and opens new ones from the server's options (name, note, branch, shelf and its level, genre, media type, shelfmark range) under an Idempotency-Key. A session screen is the scanner: the camera reads copy labels continuously (a label held in view is sent once, reading it again after moving away is sent and recorded as a repeat, as on the web), a typed or keyboard-wedge code works the same, every scan carries the shelf being checked and its own Idempotency-Key, and the answer shows at once in the outcome's web colour with the web's tone (silent unless the ringer is on) and a haptic tick. Counters, the latest scans (by outcome, only mine) and the session status are polled every four seconds while the screen is visible, so several operators see each other's progress; a code list (.txt/.csv) can be uploaded; close asks what to do with the missing copies and says how many there are (mark lost only when the server allows it, also to finish a cut-short marking); a refused mark-lost (403 `not_permitted`) shows the server's message and keeps the role; cancel asks first. The report lists the rows by category and downloads the CSV or the PDF (a too-long PDF says to take the CSV). Offline the screens leave and no code is kept for later. *Statistics* shows the overview, loans by month, state and material as bars, the most borrowed books (a tap opens the staff book) and the most active readers, then only the sections the server sends (patron types, fines, stocktake), visitors, and the fines report with its period and CSV, amounts in the server's currency. Bodies captured from a 0.9.0 server back 39 unit and Robolectric tests and `StocktakeFlowTest`.

## 1.10.0 (versionCode 24): loan requests bounded by a scheduled loan

Pairs with Pinakes 0.8.7 (Mobile API 1.8.2). Works with older servers: every new field is optional and its absence keeps the 1.9.0 behaviour.
Expand Down
2 changes: 1 addition & 1 deletion _contract/health-sample.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"data":{"name":"Pinakes","logo":null,"version":"0.7.20.2","api_version":"v1","features":{"catalog":true,"loans":true,"reservations":true,"wishlist":true,"messages":true,"notifications":true,"push":true},"catalogue_mode":false,"app_access_enabled":true,"registration_enabled":true,"private_mode":false,"vapid_public_key":"BAI9Ljyok0x691trnj9VsLYnPPGG651bXV9UDXM-TwKViUOWm9l3HPfRfXodc8-YaR7rMCc6fjrZKJv9ZBZBunE"},"meta":{"https":false,"warning":"insecure_transport"},"error":null}
{"data":{"name":"Pinakes","logo":null,"version":"0.9.0","api_version":"v1","features":{"catalog":true,"loans":true,"reservations":true,"wishlist":true,"messages":true,"notifications":true,"push":true,"reviews":true,"archives":true,"desiderata":true,"staff_catalog":true,"catalog_sync":true,"calendar_feed":true,"automatic_fines":false,"debt_block":false,"consultation_only":true,"fines":false,"closures_calendar":true,"circulation_rules":true,"staff_circulation":true,"staff_copies":true,"staff_series":true,"staff_merges":true,"staff_labels":true,"staff_imports":true,"staff_covers":true,"staff_desiderata":true,"staff_archives":true,"staff_periodicals":true,"staff_bookclub":true,"staff_frbr":true,"staff_digital_library":true,"staff_librarything":true},"catalogue_mode":false,"loan_approval_required":true,"app_access_enabled":true,"registration_enabled":true,"registration":{"require_cognome":true,"require_telefono":true,"require_indirizzo":true,"show_sesso":true,"show_cod_fiscale":true,"custom_fields":[]},"private_mode":false,"vapid_public_key":"BE1SJEHx27wB0gDE4cx6BRrW6HRbSpDuJoGXpMaRMRsZ-7sKEQpOOk1XEy0TBIdiP-ZPF54Hmw5wNsoJI22xWdA"},"meta":{"https":false,"warning":"insecure_transport"},"error":null}
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
minSdk = 26
targetSdk = 35
versionCode = 24
versionName = "1.10.0"
versionCode = 25
versionName = "1.11.0"

vectorDrawables {
useSupportLibrary = true
Expand Down
Loading
Loading