Foodsaver passport
Reviewed against the code on 2026-09-23. Workflow pages describe behaviour that can drift, so check the referenced classes before relying on the details here.
Which actions exist around the foodsaver passport, what each of them changes, and which regional workflows the code has to support. The technical anchor is PassportGeneratorTransaction in src/Modules/PassportGenerator/.
Data involved
| Data | Meaning |
|---|---|
fs_foodsaver.verified | The foodsaver has been verified by an ambassador. Changed by POST/DELETE /users/{id}/verifications, history in fs_verify_history. |
fs_foodsaver.last_pass | Date of the last activation or renewal. Start of the validity printed on the pass. Validity ends three years later (PASSPORT_VALIDITY_YEARS). |
fs_pass_gen | One row per activation or renewal (who, whom, when). Shown as pass history in the profile. |
| Wallet passes | Google and Apple wallet objects are derived from last_pass and refreshed on renewal. |
Verification and passport are independent: verifying does not set last_pass, and a pass can be activated for a user who is not verified. Only verified users can render their own pass.
Actions
Ambassador: region passport dialog
POST /regions/{regionId}/passports with three flags, exposed in the dialog as:
| Flag | Label | Effect |
|---|---|---|
renew | Ausweis aktivieren / verlängern | Sets last_pass to today, writes fs_pass_gen, refreshes wallet passes. |
createPdf | Erstelle PDF | Returns a PDF. With renew the printed validity starts today, without it each user's existing last_pass is printed (fallback today if there was never a pass). |
printFromToday | PDF gültig ab heute (ohne Aktivierung) | Only without renew: the PDF prints today plus three years while last_pass stays untouched. The alternative radio "PDF mit bisherigem Gültigkeitsdatum" is the default. |
informUser | mit Benachrichtigung | Only with renew: bell and mail "Dein Ausweis ist aktiviert oder verlängert worden". |
The flags combine to these cases:
| renew | createPdf | printFromToday | Use |
|---|---|---|---|
| yes | yes | - | Activation or renewal with a printed pass. |
| yes | no | - | Digital activation or renewal only, the user prints the pass themselves. |
| no | yes | no | Reprint (lost pass) with the original validity. |
| no | yes | yes | Print before activation, the pass is activated after handover. |
| no | no | - | Nothing happens. |
Foodsaver: own passport
GET /users/current/passport renders the pass with the existing last_pass. It fails when the pass was never activated or has expired. The settings page shows the remaining validity and the wallet buttons.
Regional workflows
Regions handle the physical pass differently. All of these are in use and need to keep working.
- Activate, then print. The ambassador ticks "aktivieren / verlängern" and "Erstelle PDF" in one step and hands over the printed pass. Digital and printed validity match.
- Digital only. The ambassador activates without PDF, the foodsaver prints or adds the pass to a wallet from their settings.
- Print first, activate after handover. The ambassador creates the PDF without "aktivieren / verlängern" and with "PDF gültig ab heute", hands the pass over in person and activates afterwards. The printed date is the print date, the digital validity starts at activation, so the two can differ by the time between print and handover.
- Reprint of a lost pass. PDF without "aktivieren / verlängern" and with "PDF mit bisherigem Gültigkeitsdatum": the printed validity stays the original one, so the printed and the digital pass agree.
Workflows 3 and 4 share the input "PDF without renew" and differ only in the printed date, which is why the dialog asks for it explicitly.
Related permissions
PassportPermissions::mayCreatePassportAsAmbassador(): ambassador of the region or orga.PassportPermissions::mayCreatePassportAsUser(): the user themselves, only when verified.- All users in the request must be members of the region, otherwise the request is rejected with the list of missing users.