feat(vaccinations): show the planned booster's renewal state on the log

Whether a vaccination is still current was known only on the checkups
page. The vaccination log now shows it on each antigen's heading:
the booster the person planned when they logged a dose, marked as
overdue, due soon (within 30 days) or scheduled, tinted only in the
first two cases.

The state is resolved on the server from the person's own confirmed
booster reminder and published on the list response as renewals, so
the web page and the native client read the same answer. Nothing is
worked out from age, history or the catalogue: an antigen without a
planned booster shows no state. Renewals are null for a grant that does
not reach the measurements section the reminders live in.

Refs #1005
This commit is contained in:
Marc-André Bombeck committed 2026-09-24 09:44:51 +02:00
1 parent b480ac4543
commit 15d6251ad2
17 files changed
+672 -15

No files matched your search

+40
View File
@@ -60594,8 +60594,17 @@ components:
type: array
items:
$ref: "#/components/schemas/Vaccination"
renewals:
anyOf:
- type: array
items:
$ref: "#/components/schemas/VaccinationRenewal"
- type: "null"
description: Each antigen's renewal state, earliest due first. Null when the caller acts under a grant that does not
cover the measurements section the booster reminders live in.
required:
- vaccinations
- renewals
additionalProperties: false
description: The caller's immunization history, newest dose first, with every entry's series already resolved over the
whole live set — never over the filtered page, which would report the oldest dose in a window as the first ever
@@ -60831,6 +60840,37 @@ components:
grant does not cover the document vault: a dose lives in the health background but points into the vault, and a
page's filename is itself the sensitive part. The link is still listed — the caller may know the dose was
transcribed from a page — and `redacted` tells a withheld name apart from a page that simply has no date."
VaccinationRenewal:
type: object
properties:
antigen:
type: string
reminderId:
type: string
dueAt:
type: string
daysUntil:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
state:
type: string
enum:
- current
- dueSoon
- overdue
required:
- antigen
- reminderId
- dueAt
- daysUntil
- state
additionalProperties: false
description: "One antigen's renewal state, read from the booster reminder the person confirmed for it (`dueAt` is that
reminder's next due instant). `daysUntil` counts calendar days on the person's own clock and is negative once
the date has passed. `state` is `overdue` once it has passed, `dueSoon` within 30 days, `current` otherwise.
Render from `state`; do not recompute it. Nothing here is derived from age, history or the catalogue: an antigen
without a confirmed booster has no entry."
CreateVaccinationEnvelope:
type: object
properties: