Skip to content

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 ​

DataMeaning
fs_foodsaver.verifiedThe foodsaver has been verified by an ambassador. Changed by POST/DELETE /users/{id}/verifications, history in fs_verify_history.
fs_foodsaver.last_passDate of the last activation or renewal. Start of the validity printed on the pass. Validity ends three years later (PASSPORT_VALIDITY_YEARS).
fs_pass_genOne row per activation or renewal (who, whom, when). Shown as pass history in the profile.
Wallet passesGoogle 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:

FlagLabelEffect
renewAusweis aktivieren / verlängernSets last_pass to today, writes fs_pass_gen, refreshes wallet passes.
createPdfErstelle PDFReturns 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).
printFromTodayPDF 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.
informUsermit BenachrichtigungOnly with renew: bell and mail "Dein Ausweis ist aktiviert oder verlängert worden".

The flags combine to these cases:

renewcreatePdfprintFromTodayUse
yesyes-Activation or renewal with a printed pass.
yesno-Digital activation or renewal only, the user prints the pass themselves.
noyesnoReprint (lost pass) with the original validity.
noyesyesPrint before activation, the pass is activated after handover.
nono-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.

  1. 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.
  2. Digital only. The ambassador activates without PDF, the foodsaver prints or adds the pass to a wallet from their settings.
  3. 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.
  4. 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.

  • 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.