From 6e40b608a53eca34e23ed7e1a1c8f7a2332810bc Mon Sep 17 00:00:00 2001 From: MoritzWeber0 Date: Sun, 16 Aug 2026 08:54:18 +0200 Subject: [PATCH 1/8] refactor: flatten validity.yaml schema and simplify partials --- content/application/cd/validity.yaml | 751 +++++----- content/application/cie/validity.yaml | 28 +- content/application/db/validity.yaml | 824 ++++++----- content/application/gb/validity.yaml | 922 +++++++------ content/application/nir/validity.yaml | 28 +- content/application/ns/validity.yaml | 651 ++++----- content/application/oebb/validity.yaml | 1209 +++++++++-------- content/application/sncb/validity.yaml | 785 ++++++----- content/application/sncf/validity.yaml | 650 ++++----- layouts/_partials/fip-validity/dialog.html | 9 +- .../_partials/fip-validity/groups-map.html | 5 + layouts/_partials/fip-validity/table.html | 11 +- layouts/_partials/fip-validity/value.html | 13 +- layouts/_shortcodes/fip-validity-table.html | 5 +- 14 files changed, 3184 insertions(+), 2707 deletions(-) create mode 100644 layouts/_partials/fip-validity/groups-map.html diff --git a/content/application/cd/validity.yaml b/content/application/cd/validity.yaml index a9419ffd0..bc725cfed 100644 --- a/content/application/cd/validity.yaml +++ b/content/application/cd/validity.yaml @@ -1,376 +1,377 @@ # This file shows the rules for FIP cards issued by CD. -_anchors: - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - coupon-1: &coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs par an. Chaque champ est valable deux jours. - coupon-2: &coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **2 coupons** - With 4 fields per year. Each field is valid for two days. - fr: | - **2 coupons** - Avec 4 champs par an. Chaque champ est valable deux jours. - coupon-3: &coupon-3 - status: valid - text: - de: | - **3 Freifahrtscheine** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **3 coupons** - With 4 fields per year. Each field is valid for two days. - fr: | - **3 coupons** - Avec 4 champs par an. Chaque champ est valable deux jours. - coupon-crossing-1: &coupon-crossing-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Mit 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs par an. Chaque champ est valable pour une traversée. - coupon-zssk: &coupon-zssk - status: valid - text: - de: | - **Unbegrenzt** - Nur gültig mit einer „In Karta" in der ŽP-App. - en: | - **Unlimited** - Only valid with an "In Karta" in the ŽP app. - fr: | - **Illimité** - Valable uniquement avec une «In Karta» dans l'application ŽP. -attica: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -bdz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -bls: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -bsb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -cfr: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -cfl: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -cie: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -cp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -db: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -dsb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -eil: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -eurostar: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -euskotren: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -fs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -gb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -gysev: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -ht: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -hz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -kd: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-not-available - retired: *coupon-1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available -ks: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -kw: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -lka: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -mav: - fip-coupon: - active: *coupon-3 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -nir: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -ns: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-not-available -oebb: - fip-coupon: - active: *coupon-3 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available -pkp: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-2 - retired: *coupon-2 - retired-relatives: *coupon-2 - widows: *coupon-1 -renfe: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -sbb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -sll: - fip-coupon: - active: *coupon-crossing-1 - active-relatives: *coupon-crossing-1 - retired: *coupon-crossing-1 - retired-relatives: *coupon-crossing-1 - widows: *coupon-crossing-1 -sncb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -sncf: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -sp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -stl: - fip-coupon: - active: *coupon-crossing-1 - active-relatives: *coupon-crossing-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -sv: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -sz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -thi: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -vy: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -vr: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -zfbh: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -zpcg: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - widows: *coupon-1 -zrms: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -zrs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available -zssk: - fip-coupon: - active: *coupon-zssk - active-relatives: *coupon-zssk - retired: *coupon-zssk - retired-relatives: *coupon-zssk - widows: *coupon-zssk +groups: +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **1 coupon** + With 4 fields per year. Each field is valid for two days. + fr: | + **1 coupon** + Avec 4 champs par an. Chaque champ est valable deux jours. +- name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **2 coupons** + With 4 fields per year. Each field is valid for two days. + fr: | + **2 coupons** + Avec 4 champs par an. Chaque champ est valable deux jours. +- name: coupon-3 + status: valid + text: + de: | + **3 Freifahrtscheine** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **3 coupons** + With 4 fields per year. Each field is valid for two days. + fr: | + **3 coupons** + Avec 4 champs par an. Chaque champ est valable deux jours. +- name: coupon-crossing-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Mit 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: | + **1 coupon** + With 2 fields per year. Each field is valid for one crossing. + fr: | + **1 coupon** + Avec 2 champs par an. Chaque champ est valable pour une traversée. +- name: coupon-zssk + status: valid + text: + de: | + **Unbegrenzt** + Nur gültig mit einer „In Karta" in der ŽP-App. + en: | + **Unlimited** + Only valid with an "In Karta" in the ŽP app. + fr: | + **Illimité** + Valable uniquement avec une «In Karta» dans l'application ŽP. +operators: + attica: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + bdz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + bls: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + bsb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + cfr: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + cfl: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + cie: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + cp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + db: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + dsb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + eil: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + eurostar: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + euskotren: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + gb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + gysev: + fip-coupon: + active: coupon-2 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + ht: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + hz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + kd: + fip-coupon: + active: coupon-2 + active-relatives: coupon-not-available + retired: coupon-1 + retired-relatives: coupon-not-available + widows: coupon-not-available + ks: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + kw: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + lka: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + mav: + fip-coupon: + active: coupon-3 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + nir: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + ns: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-not-available + oebb: + fip-coupon: + active: coupon-3 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-not-available + widows: coupon-not-available + pkp: + fip-coupon: + active: coupon-2 + active-relatives: coupon-2 + retired: coupon-2 + retired-relatives: coupon-2 + widows: coupon-1 + renfe: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + sbb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + sll: + fip-coupon: + active: coupon-crossing-1 + active-relatives: coupon-crossing-1 + retired: coupon-crossing-1 + retired-relatives: coupon-crossing-1 + widows: coupon-crossing-1 + sncb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + sncf: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + sp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + stl: + fip-coupon: + active: coupon-crossing-1 + active-relatives: coupon-crossing-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + sv: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + sz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + thi: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + vy: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + vr: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + zfbh: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + zpcg: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + widows: coupon-1 + zrms: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + zrs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + zssk: + fip-coupon: + active: coupon-zssk + active-relatives: coupon-zssk + retired: coupon-zssk + retired-relatives: coupon-zssk + widows: coupon-zssk diff --git a/content/application/cie/validity.yaml b/content/application/cie/validity.yaml index 9ff054180..9d6999544 100644 --- a/content/application/cie/validity.yaml +++ b/content/application/cie/validity.yaml @@ -1,15 +1,15 @@ # This file shows the rules for FIP cards issued by CIE. -_anchors: - reduced-75: &reduced-75 - status: valid - text: - de: "75 % Rabatt" - en: "75 % discount" - fr: "75 % de réduction" - reduced-75-group: &reduced-75-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-75 - retired-relatives: *reduced-75 -gb: - fip-reduced-ticket: *reduced-75-group +groups: +- name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction +operators: + gb: + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-75 + retired-relatives: reduced-75 diff --git a/content/application/db/validity.yaml b/content/application/db/validity.yaml index 3cbfa47c3..5a8e9af76 100644 --- a/content/application/db/validity.yaml +++ b/content/application/db/validity.yaml @@ -1,335 +1,491 @@ # This file shows the rules for FIP cards issued by DB. -_anchors: - coupon-4fields: &coupon-4fields - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields each per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - reduced-50: &reduced-50 - status: valid - text: - de: "50 % Rabatt" - en: "50 % discount" - fr: "50 % de réduction" - reduced-50-group: &reduced-50-group - active: *reduced-50 - active-relatives: *reduced-50 - retired: *reduced-50 - retired-relatives: *reduced-50 - coupon-crossing: &coupon-crossing - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields each per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. - coupon-former-1-onetime: &coupon-former-1-onetime - status: valid - text: - de: | - **1 Freifahrtschein** - Einmalig, innerhalb von 45 Monaten nach Austritt. - en: | - **1 coupon** - One-time, within 45 months after leaving. - fr: | - **1 coupon** - Unique, dans les 45 mois suivant le départ. -sncf: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -stl: - fip-coupon: - active: *coupon-crossing - active-relatives: *coupon-crossing - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -pkp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sncb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -gysev: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ns: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -oebb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -fs: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bls: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bdz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zssk: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sbb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -renfe: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kd: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -dsb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cfl: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cd: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bsb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ltg: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -gb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cfr: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cie: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ht: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -hz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ks: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kw: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -lka: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -mav: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -nir: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sll: - fip-coupon: - active: *coupon-crossing - active-relatives: *coupon-crossing - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sv: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -vr: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -vy: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zfbh: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zpcg: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zrs: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zrms: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-4fields - retired: *coupon-former-1-onetime - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group +groups: +- name: coupon-4fields + status: valid + text: + de: | + **1 Freifahrtschein** + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **1 coupon** + With 4 fields each per year. Each field is valid for two days. + fr: | + **1 coupon** + Avec 4 champs chacun par an. Chaque champ est valable deux jours. +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction +- name: coupon-crossing + status: valid + text: + de: | + **1 Freifahrtschein** + Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: | + **1 coupon** + With 2 fields each per year. Each field is valid for one crossing. + fr: | + **1 coupon** + Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. +- name: coupon-former-1-onetime + status: valid + text: + de: | + **1 Freifahrtschein** + Einmalig, innerhalb von 45 Monaten nach Austritt. + en: | + **1 coupon** + One-time, within 45 months after leaving. + fr: | + **1 coupon** + Unique, dans les 45 mois suivant le départ. +operators: + sncf: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + stl: + fip-coupon: + active: coupon-crossing + active-relatives: coupon-crossing + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + pkp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sncb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + gysev: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ns: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + oebb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + fs: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bls: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bdz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zssk: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sbb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + renfe: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kd: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + dsb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cfl: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cd: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bsb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ltg: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + gb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cfr: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cie: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ht: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + hz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ks: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kw: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + lka: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + mav: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + nir: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sll: + fip-coupon: + active: coupon-crossing + active-relatives: coupon-crossing + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sv: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + vr: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + vy: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zfbh: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zpcg: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrs: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrms: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 diff --git a/content/application/gb/validity.yaml b/content/application/gb/validity.yaml index 3a7711820..e399e5918 100644 --- a/content/application/gb/validity.yaml +++ b/content/application/gb/validity.yaml @@ -1,387 +1,537 @@ # This file shows the rules for FIP cards issued by GB (National Rail). -_anchors: - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - reduced-50: &reduced-50 - status: valid - text: - de: "50 % Rabatt" - en: "50 % discount" - fr: "50 % de réduction" - reduced-50-group: &reduced-50-group - active: *reduced-50 - active-relatives: *reduced-50 - retired: *reduced-50 - retired-relatives: *reduced-50 - reduced-75: &reduced-75 - status: valid - text: - de: "75 % Rabatt" - en: "75 % discount" - fr: "75 % de réduction" - reduced-75-group: &reduced-75-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-75 - retired-relatives: *reduced-75 - reduced-active-75-retired-50-group: &reduced-active-75-retired-50-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-50 - retired-relatives: *reduced-50 - coupon-active-1: &coupon-active-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. - coupon-active-2: &coupon-active-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. -attica: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bdz: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bls: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bsb: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cd: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cfr: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -cfl: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-50-group -cie: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-75-group -cp: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -db: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -dsb: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -fs: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-50-group -gysev: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ht: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -hz: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kd: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ks: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kw: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kml: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -lka: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ltg: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -mav: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -nir: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-active-2 - retired-relatives: *coupon-active-2 - widows: *coupon-active-2 - fip-reduced-ticket: *reduced-75-group -ns: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-50-group -oebb: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-active-1 - retired: *coupon-active-1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -pkp: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -renfe: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sbb: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sll: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sncb: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-active-75-retired-50-group -sncf: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-active-75-retired-50-group -sp: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -stl: - fip-coupon: - active: *coupon-active-2 - active-relatives: *coupon-active-2 - retired: *coupon-active-1 - retired-relatives: *coupon-active-1 - widows: *coupon-active-1 - fip-reduced-ticket: *reduced-50-group -sv: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sz: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -vy: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zfbh: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zpcg: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zrs: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zrms: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zssk: - fip-coupon: - active: *coupon-active-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group +groups: +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction +- name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction +- name: coupon-active-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. +- name: coupon-active-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. +operators: + attica: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bdz: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bls: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bsb: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cd: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cfr: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cfl: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cie: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-75 + retired-relatives: reduced-75 + cp: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + db: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + dsb: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + fs: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + gysev: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ht: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + hz: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kd: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ks: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kw: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kml: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + lka: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ltg: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + mav: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + nir: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-active-2 + retired-relatives: coupon-active-2 + widows: coupon-active-2 + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-75 + retired-relatives: reduced-75 + ns: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + oebb: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-active-1 + retired: coupon-active-1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + pkp: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + renfe: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sbb: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sll: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sncb: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-50 + retired-relatives: reduced-50 + sncf: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-50 + retired-relatives: reduced-50 + sp: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + stl: + fip-coupon: + active: coupon-active-2 + active-relatives: coupon-active-2 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sv: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sz: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + vy: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zfbh: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zpcg: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrs: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrms: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zssk: + fip-coupon: + active: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 diff --git a/content/application/nir/validity.yaml b/content/application/nir/validity.yaml index 6e24b4b04..65ef30505 100644 --- a/content/application/nir/validity.yaml +++ b/content/application/nir/validity.yaml @@ -1,15 +1,15 @@ # This file shows the rules for FIP cards issued by NIR. -_anchors: - reduced-75: &reduced-75 - status: valid - text: - de: "75 % Rabatt" - en: "75 % discount" - fr: "75 % de réduction" - reduced-75-group: &reduced-75-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-75 - retired-relatives: *reduced-75 -gb: - fip-reduced-ticket: *reduced-75-group +groups: +- name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction +operators: + gb: + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-75 + retired-relatives: reduced-75 diff --git a/content/application/ns/validity.yaml b/content/application/ns/validity.yaml index afbae54ca..75879091b 100644 --- a/content/application/ns/validity.yaml +++ b/content/application/ns/validity.yaml @@ -1,326 +1,327 @@ # This file shows the rules for FIP cards issued by NS. -_anchors: - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - free-travel: &free-travel - status: valid - text: - de: | - **Unbegrenzt** - Unbegrenzte Anzahl an Ländercoupons möglich (jeweils ein Coupon pro Anfrage). - en: | - **Unlimited** - Unlimited country coupons can be requested (one coupon per request). - fr: | - **Illimité** - Un nombre illimité de coupons pays peut être demandé (un coupon par demande). - coupon-1: &coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. - coupon-2: &coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. - coupon-4: &coupon-4 - status: valid - text: - de: | - **4 Freifahrtscheine** - Pro Jahr. - en: | - **4 coupons** - Per year. - fr: | - **4 coupons** - Par an. - coupon-1-onetime: &coupon-1-onetime - status: valid - text: - de: | - **1 Freifahrtschein** - Einmalig, innerhalb von 45 Monaten nach Austritt. - en: | - **1 coupon** - One-time, within 45 months after leaving. - fr: | - **1 coupon** - Unique, dans les 45 mois suivant le départ. - relatives-sncf-active: &relatives-sncf-active - status: valid - text: - de: | - **1 / 3 Freifahrtscheine** - Gesamtes Netz: 1 Freifahrtschein pro Jahr. Région Nord: 3 Freifahrtscheine pro Jahr. - en: | - **1 / 3 coupons** - Whole network: 1 coupon per year. Région Nord: 3 coupons per year. - fr: | - **1 / 3 coupons** - Réseau entier : 1 coupon par an. Région Nord : 3 coupons par an. -attica: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -bdz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -bls: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -bsb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -cd: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -cfr: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -cfl: - fip-coupon: - active: *free-travel - active-relatives: *free-travel - retired: *free-travel - retired-relatives: *free-travel -cie: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -cp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -db: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1-onetime - retired-relatives: *coupon-1-onetime -dsb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -fs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -gb: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-2 - retired: *coupon-1 - retired-relatives: *coupon-1 -gysev: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -ht: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -hz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -kd: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -ks: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -kw: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -lka: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -ltg: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -mav: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -nir: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -oebb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1-onetime -pkp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -renfe: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -sbb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -sll: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-2 - retired: *coupon-1 - retired-relatives: *coupon-1 -sncb: - fip-coupon: - active: *free-travel - active-relatives: *free-travel - retired: *free-travel - retired-relatives: *free-travel -sncf: - fip-coupon: - active: *coupon-4 - active-relatives: *relatives-sncf-active - retired: *coupon-1-onetime - retired-relatives: *coupon-1-onetime -sp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -stl: - fip-coupon: - active: *coupon-4 - active-relatives: *coupon-4 - retired: *coupon-2 - retired-relatives: *coupon-2 -sv: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -sz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -vy: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available -zfbh: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zpcg: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -zrms: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -zrs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -zssk: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 -kml: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-1-onetime - retired-relatives: *coupon-not-available +groups: +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: free-travel + status: valid + text: + de: | + **Unbegrenzt** + Unbegrenzte Anzahl an Ländercoupons möglich (jeweils ein Coupon pro Anfrage). + en: | + **Unlimited** + Unlimited country coupons can be requested (one coupon per request). + fr: | + **Illimité** + Un nombre illimité de coupons pays peut être demandé (un coupon par demande). +- name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. +- name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. +- name: coupon-4 + status: valid + text: + de: | + **4 Freifahrtscheine** + Pro Jahr. + en: | + **4 coupons** + Per year. + fr: | + **4 coupons** + Par an. +- name: coupon-1-onetime + status: valid + text: + de: | + **1 Freifahrtschein** + Einmalig, innerhalb von 45 Monaten nach Austritt. + en: | + **1 coupon** + One-time, within 45 months after leaving. + fr: | + **1 coupon** + Unique, dans les 45 mois suivant le départ. +- name: relatives-sncf-active + status: valid + text: + de: | + **1 / 3 Freifahrtscheine** + Gesamtes Netz: 1 Freifahrtschein pro Jahr. Région Nord: 3 Freifahrtscheine pro Jahr. + en: | + **1 / 3 coupons** + Whole network: 1 coupon per year. Région Nord: 3 coupons per year. + fr: | + **1 / 3 coupons** + Réseau entier : 1 coupon par an. Région Nord : 3 coupons par an. +operators: + attica: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + bdz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + bls: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + bsb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + cd: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + cfr: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + cfl: + fip-coupon: + active: free-travel + active-relatives: free-travel + retired: free-travel + retired-relatives: free-travel + cie: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + cp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + db: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1-onetime + retired-relatives: coupon-1-onetime + dsb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + fs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + gb: + fip-coupon: + active: coupon-2 + active-relatives: coupon-2 + retired: coupon-1 + retired-relatives: coupon-1 + gysev: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + ht: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + hz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + kd: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + ks: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + kw: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + lka: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + ltg: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + mav: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + nir: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + oebb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1-onetime + pkp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + renfe: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + sbb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + sll: + fip-coupon: + active: coupon-2 + active-relatives: coupon-2 + retired: coupon-1 + retired-relatives: coupon-1 + sncb: + fip-coupon: + active: free-travel + active-relatives: free-travel + retired: free-travel + retired-relatives: free-travel + sncf: + fip-coupon: + active: coupon-4 + active-relatives: relatives-sncf-active + retired: coupon-1-onetime + retired-relatives: coupon-1-onetime + sp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + stl: + fip-coupon: + active: coupon-4 + active-relatives: coupon-4 + retired: coupon-2 + retired-relatives: coupon-2 + sv: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + sz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + vy: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available + zfbh: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zpcg: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + zrms: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + zrs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + zssk: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + kml: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available diff --git a/content/application/oebb/validity.yaml b/content/application/oebb/validity.yaml index 84d8bef1c..bee62f9ea 100644 --- a/content/application/oebb/validity.yaml +++ b/content/application/oebb/validity.yaml @@ -1,590 +1,621 @@ # This file shows the rules for FIP cards issued by ÖBB. -_anchors: - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - reduced-50: &reduced-50 - status: valid - text: - de: "50 % Rabatt" - en: "50 % discount" - fr: "50 % de réduction" - reduced-50-group: &reduced-50-group - active: *reduced-50 - active-relatives: *reduced-50 - retired: *reduced-50 - retired-relatives: *reduced-50 - widows: *reduced-50 - reduced-no-discount: &reduced-no-discount - status: invalid - text: - de: "Kein Rabatt" - en: "No discount" - fr: "Pas de réduction" - coupon-1: &coupon-1 - status: valid - text: - de: > - **1 Freifahrtschein** - - nur Vollzeit - - en: > - **1 coupon** - - Full-time only - - fr: > - **1 coupon** - - Temps plein uniquement - - coupon-1-1: &coupon-1-1 - status: valid - text: - de: > - **1 Freifahrtschein** - - Vollzeit -
- Teilzeit (mind. 50%): 1 Freifahrtschein -
- en: > - **1 coupon** - - Full-time -
- Part-time (min. 50%): 1 coupon -
- fr: > - **1 coupon** - - Temps plein -
- Temps partiel (min. 50%): 1 coupon -
- coupon-2-1: &coupon-2-1 - status: valid - text: - de: > - **2 Freifahrtscheine** - - Vollzeit -
- Teilzeit (mind. 50%): 1 Freifahrtschein -
- en: > - **2 coupons** - - Full-time -
- Part-time (min. 50%): 1 coupon -
- fr: > - **2 coupons** - - Temps plein -
- Temps partiel (min. 50%): 1 coupon -
- coupon-3-1: &coupon-3-1 - status: valid - text: - de: > - **3 Freifahrtscheine** - - Vollzeit -
- Teilzeit (mind. 50%): 1 Freifahrtschein -
- en: > - **3 coupons** - - Full-time -
- Part-time (min. 50%): 1 coupon -
- fr: > - **3 coupons** - - Temps plein -
- Temps partiel (min. 50%): 1 coupon -
- coupon-y1-9x1-45x0: &coupon-y1-9x1-45x0 - status: valid - text: - de: > - **1 / 1 / 0 Freifahrtscheine** - - Jährlich: 1 Freifahrtschein -
- **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein -
- **Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine -
- en: > - **1 / 1 / 0 coupons** - - Yearly: 1 coupon -
- **One-time within 9 months** after retirement: 1 coupon -
- **One-time within 45 months** after retirement: 0 coupons -
- fr: > - **1 / 1 / 0 coupons** - - Annuel: 1 coupon -
- **Unique dans les 9 mois** après le départ à la retraite: 1 coupon -
- **Unique dans les 45 mois** après le départ à la retraite: 0 coupon -
- coupon-y0-9x1-45x1: &coupon-y0-9x1-45x1 - status: valid - text: - de: > - **0 / 1 / 1 Freifahrtscheine** - - Jährlich: 0 Freifahrtscheine -
- **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein -
- **Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein -
- en: > - **0 / 1 / 1 coupons** - - Yearly: 0 coupons -
- **One-time within 9 months** after retirement: 1 coupon -
- **One-time within 45 months** after retirement: 1 coupon -
- fr: > - **0 / 1 / 1 coupons** - - Annuel: 0 coupon -
- **Unique dans les 9 mois** après le départ à la retraite: 1 coupon -
- **Unique dans les 45 mois** après le départ à la retraite: 1 coupon -
- coupon-y0-9x2-45x1: &coupon-y0-9x2-45x1 - status: valid - text: - de: > - **0 / 2 / 1 Freifahrtscheine** - - Jährlich: 0 Freifahrtscheine -
- **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 2 Freifahrtscheine -
- **Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein -
- en: > - **0 / 2 / 1 coupons** - - Yearly: 0 coupons -
- **One-time within 9 months** after retirement: 2 coupons -
- **One-time within 45 months** after retirement: 1 coupon -
- fr: > - **0 / 2 / 1 coupons** - - Annuel: 0 coupon -
- **Unique dans les 9 mois** après le départ à la retraite: 2 coupons -
- **Unique dans les 45 mois** après le départ à la retraite: 1 coupon -
- coupon-y1-9x3-45x0: &coupon-y1-9x3-45x0 - status: valid - text: - de: > - **1 / 3 / 0 Freifahrtscheine** - - Jährlich: 1 Freifahrtschein -
- **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 3 Freifahrtscheine -
- **Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine -
- en: > - **1 / 3 / 0 coupons** - - Yearly: 1 coupon -
- **One-time within 9 months** after retirement: 3 coupons -
- **One-time within 45 months** after retirement: 0 coupons -
- fr: > - **1 / 3 / 0 coupons** - - Annuel: 1 coupon -
- **Unique dans les 9 mois** après le départ à la retraite: 3 coupons -
- **Unique dans les 45 mois** après le départ à la retraite: 0 coupon -
- coupon-y0-9x0-45x1: &coupon-y0-9x0-45x1 - status: valid - text: - de: > - **0 / 0 / 1 Freifahrtscheine** - - Jährlich: 0 Freifahrtscheine -
- **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine -
- **Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein -
- en: > - **0 / 0 / 1 coupons** - - Yearly: 0 coupons -
- **One-time within 9 months** after retirement: 0 coupons -
- **One-time within 45 months** after retirement: 1 coupon -
- fr: > - **0 / 0 / 1 coupons** - - Annuel: 0 coupon -
- **Unique dans les 9 mois** après le départ à la retraite: 0 coupon -
- **Unique dans les 45 mois** après le départ à la retraite: 1 coupon -
-attica: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: - active: *reduced-50 - active-relatives: *reduced-50 - retired: *reduced-no-discount - retired-relatives: *reduced-no-discount -bdz: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -bls: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -bsb: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -cd: - fip-coupon: - active: *coupon-3-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x3-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -cfl: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -cfr: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -cie: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -cp: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -db: - fip-coupon: - active: *coupon-2-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x2-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -dsb: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -eurostar: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -euskotren: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -fs: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -gb: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -gysev: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -ht: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -kd: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kml: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ks: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kw: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -lka: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ltg: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -mav: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -nir: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -ns: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -oebb: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -pkp: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -renfe: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sbb: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sll: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sncb: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sncf: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sp: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -stl: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sv: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -sz: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -vy: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-not-available - retired: *coupon-y0-9x1-45x1 - retired-relatives: *coupon-not-available - widows: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zssk: - fip-coupon: - active: *coupon-3-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x3-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group -zpcg: - fip-coupon: - active: *coupon-1-1 - active-relatives: *coupon-1 - retired: *coupon-y1-9x1-45x0 - retired-relatives: *coupon-y0-9x1-45x1 - widows: *coupon-y0-9x0-45x1 - fip-reduced-ticket: *reduced-50-group +groups: +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction +- name: reduced-no-discount + status: invalid + text: + de: Kein Rabatt + en: No discount + fr: Pas de réduction +- name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** nur Vollzeit + en: | + **1 coupon** Full-time only + fr: | + **1 coupon** Temps plein uniquement +- name: coupon-1-1 + status: valid + text: + de: | + **1 Freifahrtschein** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
+ en: | + **1 coupon** Full-time
Part-time (min. 50%): 1 coupon
+ fr: | + **1 coupon** Temps plein
Temps partiel (min. 50%): 1 coupon
+- name: coupon-2-1 + status: valid + text: + de: | + **2 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
+ en: | + **2 coupons** Full-time
Part-time (min. 50%): 1 coupon
+ fr: | + **2 coupons** Temps plein
Temps partiel (min. 50%): 1 coupon
+- name: coupon-3-1 + status: valid + text: + de: | + **3 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
+ en: | + **3 coupons** Full-time
Part-time (min. 50%): 1 coupon
+ fr: | + **3 coupons** Temps plein
Temps partiel (min. 50%): 1 coupon
+- name: coupon-y1-9x1-45x0 + status: valid + text: + de: | + **1 / 1 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
+ en: | + **1 / 1 / 0 coupons** Yearly: 1 coupon
**One-time within 9 months** after retirement: 1 coupon
**One-time within 45 months** after retirement: 0 coupons
+ fr: | + **1 / 1 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 mois** après le départ à la retraite: 0 coupon
+- name: coupon-y0-9x1-45x1 + status: valid + text: + de: | + **0 / 1 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: | + **0 / 1 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 1 coupon
**One-time within 45 months** after retirement: 1 coupon
+ fr: | + **0 / 1 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
+- name: coupon-y0-9x2-45x1 + status: valid + text: + de: | + **0 / 2 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 2 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: | + **0 / 2 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 2 coupons
**One-time within 45 months** after retirement: 1 coupon
+ fr: | + **0 / 2 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 2 coupons
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
+- name: coupon-y1-9x3-45x0 + status: valid + text: + de: | + **1 / 3 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 3 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
+ en: | + **1 / 3 / 0 coupons** Yearly: 1 coupon
**One-time within 9 months** after retirement: 3 coupons
**One-time within 45 months** after retirement: 0 coupons
+ fr: | + **1 / 3 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 mois** après le départ à la retraite: 3 coupons
**Unique dans les 45 mois** après le départ à la retraite: 0 coupon
+- name: coupon-y0-9x0-45x1 + status: valid + text: + de: | + **0 / 0 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: | + **0 / 0 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 0 coupons
**One-time within 45 months** after retirement: 1 coupon
+ fr: | + **0 / 0 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 0 coupon
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
+operators: + attica: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-no-discount + retired-relatives: reduced-no-discount + bdz: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + bls: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + bsb: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + cd: + fip-coupon: + active: coupon-3-1 + active-relatives: coupon-1 + retired: coupon-y1-9x3-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + cfl: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + cfr: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + cie: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + cp: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + db: + fip-coupon: + active: coupon-2-1 + active-relatives: coupon-1 + retired: coupon-y0-9x2-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + dsb: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + eurostar: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + euskotren: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + fs: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + gb: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + gysev: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + ht: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + kd: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + kml: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + ks: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + kw: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + lka: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + ltg: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + mav: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + nir: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + ns: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + oebb: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + pkp: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + renfe: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sbb: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sll: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sncb: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sncf: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sp: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + stl: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sv: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + sz: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + vy: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-not-available + retired: coupon-y0-9x1-45x1 + retired-relatives: coupon-not-available + widows: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + zssk: + fip-coupon: + active: coupon-3-1 + active-relatives: coupon-1 + retired: coupon-y1-9x3-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 + zpcg: + fip-coupon: + active: coupon-1-1 + active-relatives: coupon-1 + retired: coupon-y1-9x1-45x0 + retired-relatives: coupon-y0-9x1-45x1 + widows: coupon-y0-9x0-45x1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + widows: reduced-50 diff --git a/content/application/sncb/validity.yaml b/content/application/sncb/validity.yaml index 09394226b..0139acfef 100644 --- a/content/application/sncb/validity.yaml +++ b/content/application/sncb/validity.yaml @@ -1,332 +1,455 @@ # This file shows the rules for FIP cards issued by SNCB. -_anchors: - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - reduced-50: &reduced-50 - status: valid - text: - de: "50 % Rabatt" - en: "50 % discount" - fr: "50 % de réduction" - reduced-50-group: &reduced-50-group - active: *reduced-50 - active-relatives: *reduced-50 - retired: *reduced-50 - retired-relatives: *reduced-50 - reduced-75: &reduced-75 - status: valid - text: - de: "75 % Rabatt" - en: "75 % discount" - fr: "75 % de réduction" - reduced-75-group: &reduced-75-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-75 - retired-relatives: *reduced-75 - coupon-1: &coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. - coupon-2: &coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. - coupon-sncf-nord: &coupon-sncf-nord - status: valid - text: - de: | - **4 / 8 Freifahrtscheine** - Gesamtes Netz: 4 Freifahrtscheine pro Jahr. Région Nord: 8 Freifahrtscheine pro Jahr. - en: | - **4 / 8 coupons** - Whole network: 4 coupons per year. Région Nord: 8 coupons per year. - fr: | - **4 / 8 coupons** - Réseau entier : 4 coupons par an. Région Nord : 8 coupons par an. - relatives-sncf-nord: &relatives-sncf-nord - status: valid - text: - de: | - **2 / 4 Freifahrtscheine** - Gesamtes Netz: 2 Freifahrtscheine pro Jahr. Région Nord: 4 Freifahrtscheine pro Jahr. - en: | - **2 / 4 coupons** - Whole network: 2 coupons per year. Région Nord: 4 coupons per year. - fr: | - **2 / 4 coupons** - Réseau entier : 2 coupons par an. Région Nord : 4 coupons par an. - relatives-sncf-retired: &relatives-sncf-retired - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr (nur Kind). - en: | - **1 coupon** - Per year (child only). - fr: | - **1 coupon** - Par an (enfant uniquement). -bdz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -bls: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -cd: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -cfr: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -cie: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -cp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -db: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -dsb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -euskotren: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -fs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -gb: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-2 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-50 - retired-relatives: *reduced-50 -gysev: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ht: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -hz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -kd: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ks: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -kw: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -lka: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -ltg: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -mav: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -nir: - fip-coupon: - active: *coupon-2 - active-relatives: *coupon-2 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-75-group -oebb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -pkp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -renfe: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -sncf: - fip-coupon: - active: *coupon-sncf-nord - active-relatives: *relatives-sncf-nord - retired: *coupon-not-available - retired-relatives: *relatives-sncf-retired - fip-reduced-ticket: *reduced-50-group -sv: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -sz: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -sbb: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -sp: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -vy: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zpcg: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -zrms: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group -zrs: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-50-group -zssk: - fip-coupon: - active: *coupon-1 - active-relatives: *coupon-1 - retired: *coupon-1 - retired-relatives: *coupon-1 - fip-reduced-ticket: *reduced-50-group +groups: +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction +- name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction +- name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. +- name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. +- name: coupon-sncf-nord + status: valid + text: + de: | + **4 / 8 Freifahrtscheine** + Gesamtes Netz: 4 Freifahrtscheine pro Jahr. Région Nord: 8 Freifahrtscheine pro Jahr. + en: | + **4 / 8 coupons** + Whole network: 4 coupons per year. Région Nord: 8 coupons per year. + fr: | + **4 / 8 coupons** + Réseau entier : 4 coupons par an. Région Nord : 8 coupons par an. +- name: relatives-sncf-nord + status: valid + text: + de: | + **2 / 4 Freifahrtscheine** + Gesamtes Netz: 2 Freifahrtscheine pro Jahr. Région Nord: 4 Freifahrtscheine pro Jahr. + en: | + **2 / 4 coupons** + Whole network: 2 coupons per year. Région Nord: 4 coupons per year. + fr: | + **2 / 4 coupons** + Réseau entier : 2 coupons par an. Région Nord : 4 coupons par an. +- name: relatives-sncf-retired + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr (nur Kind). + en: | + **1 coupon** + Per year (child only). + fr: | + **1 coupon** + Par an (enfant uniquement). +operators: + bdz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + bls: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cd: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cfr: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cie: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + cp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + db: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + dsb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + euskotren: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + fs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + gb: + fip-coupon: + active: coupon-2 + active-relatives: coupon-2 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-50 + retired-relatives: reduced-50 + gysev: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ht: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + hz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kd: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ks: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + kw: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + lka: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + ltg: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + mav: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + nir: + fip-coupon: + active: coupon-2 + active-relatives: coupon-2 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-75 + retired-relatives: reduced-75 + oebb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + pkp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + renfe: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sncf: + fip-coupon: + active: coupon-sncf-nord + active-relatives: relatives-sncf-nord + retired: coupon-not-available + retired-relatives: relatives-sncf-retired + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sv: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sz: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sbb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + sp: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + vy: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zpcg: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrms: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zrs: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 + zssk: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 diff --git a/content/application/sncf/validity.yaml b/content/application/sncf/validity.yaml index 1ed4819f0..766863e71 100644 --- a/content/application/sncf/validity.yaml +++ b/content/application/sncf/validity.yaml @@ -1,326 +1,326 @@ # This file shows the rules for FIP cards issued by SNCF. -_anchors: - coupon-4fields: &coupon-4fields - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields each per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. - coupon-not-available: &coupon-not-available - status: invalid - text: - de: "Nicht verfügbar" - en: "Not available" - fr: "Non disponible" - coupon-2fields: &coupon-2fields - status: valid - text: - de: | - **2 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **2 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **2 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. - coupon-4fields-4: &coupon-4fields-4 - status: valid - text: - de: | - **4 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **4 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **4 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. - coupon-6fields: &coupon-6fields - status: valid - text: - de: | - **6 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **6 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **6 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. - coupon-crossing: &coupon-crossing - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields each per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. - reduced-50: &reduced-50 - status: valid - text: - de: "50 % Rabatt" - en: "50 % discount" - fr: "50 % de réduction" - reduced-75: &reduced-75 - status: valid - text: - de: "75 % Rabatt" - en: "75 % discount" - fr: "75 % de réduction" - reduced-active-75-retired-50-group: &reduced-active-75-retired-50-group - active: *reduced-75 - active-relatives: *reduced-75 - retired: *reduced-50 - retired-relatives: *reduced-50 -db: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sncb: - fip-coupon: - active: *coupon-4fields-4 - active-relatives: *coupon-2fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available -ns: - fip-coupon: - active: *coupon-4fields-4 - active-relatives: *coupon-4fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available -cfl: - fip-coupon: - active: *coupon-6fields - active-relatives: *coupon-6fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available -gb: - fip-coupon: - active: *coupon-2fields - active-relatives: *coupon-2fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available - fip-reduced-ticket: *reduced-active-75-retired-50-group -stl: - fip-coupon: - active: *coupon-crossing - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -pkp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -oebb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -gysev: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -cp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -fs: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -bls: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -bdz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zssk: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sp: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sbb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -renfe: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -kd: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -dsb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -cd: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -bsb: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -ltg: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zfbh: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zrs: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -hz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -ht: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -attica: - fip-coupon: - active: *coupon-not-available - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -mav: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -cie: - fip-coupon: - active: *coupon-2fields - active-relatives: *coupon-2fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available -nir: - fip-coupon: - active: *coupon-2fields - active-relatives: *coupon-2fields - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sll: - fip-coupon: - active: *coupon-crossing - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zrms: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -zpcg: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -vy: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -ks: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -kw: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -lka: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -cfr: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sv: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available -sz: - fip-coupon: - active: *coupon-4fields - active-relatives: *coupon-not-available - retired: *coupon-not-available - retired-relatives: *coupon-not-available +groups: +- name: coupon-4fields + status: valid + text: + de: | + **1 Freifahrtschein** + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **1 coupon** + With 4 fields each per year. Each field is valid for two days. + fr: | + **1 coupon** + Avec 4 champs chacun par an. Chaque champ est valable deux jours. +- name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible +- name: coupon-2fields + status: valid + text: + de: | + **2 Freifahrtscheine** + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **2 coupons** + With 4 fields each per year. Each field is valid for two days. + fr: | + **2 coupons** + Avec 4 champs chacun par an. Chaque champ est valable deux jours. +- name: coupon-4fields-4 + status: valid + text: + de: | + **4 Freifahrtscheine** + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **4 coupons** + With 4 fields each per year. Each field is valid for two days. + fr: | + **4 coupons** + Avec 4 champs chacun par an. Chaque champ est valable deux jours. +- name: coupon-6fields + status: valid + text: + de: | + **6 Freifahrtscheine** + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **6 coupons** + With 4 fields each per year. Each field is valid for two days. + fr: | + **6 coupons** + Avec 4 champs chacun par an. Chaque champ est valable deux jours. +- name: coupon-crossing + status: valid + text: + de: | + **1 Freifahrtschein** + Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: | + **1 coupon** + With 2 fields each per year. Each field is valid for one crossing. + fr: | + **1 coupon** + Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. +- name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction +- name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction +operators: + db: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + sncb: + fip-coupon: + active: coupon-4fields-4 + active-relatives: coupon-2fields + retired: coupon-not-available + retired-relatives: coupon-not-available + ns: + fip-coupon: + active: coupon-4fields-4 + active-relatives: coupon-4fields + retired: coupon-not-available + retired-relatives: coupon-not-available + cfl: + fip-coupon: + active: coupon-6fields + active-relatives: coupon-6fields + retired: coupon-not-available + retired-relatives: coupon-not-available + gb: + fip-coupon: + active: coupon-2fields + active-relatives: coupon-2fields + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-50 + retired-relatives: reduced-50 + stl: + fip-coupon: + active: coupon-crossing + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + pkp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + oebb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + gysev: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + cp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fs: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + bls: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + bdz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zssk: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + sp: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + sbb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + renfe: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + kd: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + dsb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + cd: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + bsb: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + ltg: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zfbh: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zrs: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + hz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + ht: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + attica: + fip-coupon: + active: coupon-not-available + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + mav: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + cie: + fip-coupon: + active: coupon-2fields + active-relatives: coupon-2fields + retired: coupon-not-available + retired-relatives: coupon-not-available + nir: + fip-coupon: + active: coupon-2fields + active-relatives: coupon-2fields + retired: coupon-not-available + retired-relatives: coupon-not-available + sll: + fip-coupon: + active: coupon-crossing + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zrms: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + zpcg: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + vy: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + ks: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + kw: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + lka: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + cfr: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + sv: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + sz: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available diff --git a/layouts/_partials/fip-validity/dialog.html b/layouts/_partials/fip-validity/dialog.html index c92660f62..ea8f39582 100644 --- a/layouts/_partials/fip-validity/dialog.html +++ b/layouts/_partials/fip-validity/dialog.html @@ -10,14 +10,16 @@ {{- end -}} {{- $appPage := .GetPage (printf "/application/%s" .File.ContentBaseName) -}} {{- $entry := false -}} + {{- $groupsMap := dict -}} {{- with $appPage -}} {{- with .Resources.Get "validity.yaml" -}} {{- $validity := . | transform.Unmarshal -}} - {{- $entry = index (index $validity $currentSlug) $type -}} + {{- $groupsMap = partial "fip-validity/groups-map" $validity -}} + {{- $entry = index (index (index $validity "operators") $currentSlug) $type -}} {{- end -}} {{- end -}} {{- if $entry -}} - {{- $issuers = $issuers | append (dict "page" $appPage "entry" $entry) -}} + {{- $issuers = $issuers | append (dict "page" $appPage "entry" $entry "groups" $groupsMap) -}} {{- $issuerPages = $issuerPages | append $appPage -}} {{- end -}} {{- end -}} @@ -36,6 +38,7 @@ {{- range $issuers -}} {{- $slug := .page.File.ContentBaseName -}} {{- $entry := .entry -}} + {{- $groups := .groups -}} diff --git a/layouts/_partials/fip-validity/groups-map.html b/layouts/_partials/fip-validity/groups-map.html new file mode 100644 index 000000000..79130ff84 --- /dev/null +++ b/layouts/_partials/fip-validity/groups-map.html @@ -0,0 +1,5 @@ +{{- $map := dict -}} +{{- range $g := index . "groups" -}} + {{- $map = merge $map (dict $g.name $g) -}} +{{- end -}} +{{- return $map -}} diff --git a/layouts/_partials/fip-validity/table.html b/layouts/_partials/fip-validity/table.html index ea995f095..505a9164e 100644 --- a/layouts/_partials/fip-validity/table.html +++ b/layouts/_partials/fip-validity/table.html @@ -1,6 +1,7 @@ {{- $lang := .lang -}} {{- $page := .page -}} {{- $entries := .entries -}} +{{- $groups := .groups -}} {{- $firstColHeader := or .firstColHeader "operators.listTitle" -}} @@ -23,19 +24,19 @@ {{ partial "link" (dict "Destination" (print "/operator/" $targetSlug) "Text" $targetPage.Title "Page" $page) }} - {{ partial "fip-validity/value" (dict "entry" $entry "field" "active" "lang" $lang "page" $page) }} + {{ partial "fip-validity/value" (dict "entry" $entry "field" "active" "lang" $lang "page" $page "groups" $groups) }} - {{ partial "fip-validity/value" (dict "entry" $entry "field" "active-relatives" "lang" $lang "page" $page) }} + {{ partial "fip-validity/value" (dict "entry" $entry "field" "active-relatives" "lang" $lang "page" $page "groups" $groups) }} - {{ partial "fip-validity/value" (dict "entry" $entry "field" "retired" "lang" $lang "page" $page) }} + {{ partial "fip-validity/value" (dict "entry" $entry "field" "retired" "lang" $lang "page" $page "groups" $groups) }} - {{ partial "fip-validity/value" (dict "entry" $entry "field" "retired-relatives" "lang" $lang "page" $page) }} + {{ partial "fip-validity/value" (dict "entry" $entry "field" "retired-relatives" "lang" $lang "page" $page "groups" $groups) }} - {{ partial "fip-validity/value" (dict "entry" $entry "field" "widows" "lang" $lang "page" $page) }} + {{ partial "fip-validity/value" (dict "entry" $entry "field" "widows" "lang" $lang "page" $page "groups" $groups) }} {{- end -}} diff --git a/layouts/_partials/fip-validity/value.html b/layouts/_partials/fip-validity/value.html index cfcd3a7c9..24e016bf3 100644 --- a/layouts/_partials/fip-validity/value.html +++ b/layouts/_partials/fip-validity/value.html @@ -7,10 +7,15 @@ {{- $status := "unknown" -}} {{- $text := T "fipValidity.unknown" -}} {{- if .entry -}} - {{- $fieldData := index .entry .field -}} - {{- if $fieldData -}} - {{- $status = $fieldData.status -}} - {{- $text = index $fieldData.text .lang -}} + {{- $groupName := index .entry .field -}} + {{- if $groupName -}} + {{- $group := index .groups $groupName -}} + {{- if $group -}} + {{- $status = $group.status -}} + {{- $text = index $group.text .lang -}} + {{- else -}} + {{- warnf "fip-validity: group %q not found (field %q, page: %s)" $groupName .field $.page.File.Path -}} + {{- end -}} {{- end -}} {{- end -}} diff --git a/layouts/_shortcodes/fip-validity-table.html b/layouts/_shortcodes/fip-validity-table.html index d33903be7..ff184a192 100644 --- a/layouts/_shortcodes/fip-validity-table.html +++ b/layouts/_shortcodes/fip-validity-table.html @@ -4,11 +4,12 @@ {{- $excluded := slice "eurostar" "euskotren" -}} {{- $issuerSlug := $page.File.ContentBaseName -}} {{- $validity := $page.Resources.Get "validity.yaml" | transform.Unmarshal -}} +{{- $groupsMap := partial "fip-validity/groups-map" $validity -}} {{- $entries := dict -}} {{- range where $page.Site.RegularPages "Type" "operator" -}} {{- $targetSlug := .File.ContentBaseName -}} {{- if and (ne $targetSlug $issuerSlug) (not (in $excluded $targetSlug)) -}} - {{- $entries = merge $entries (dict $targetSlug (index (index $validity $targetSlug) $type)) -}} + {{- $entries = merge $entries (dict $targetSlug (index (index (index $validity "operators") $targetSlug) $type)) -}} {{- end -}} {{- end -}} -{{ partial "fip-validity/table" (dict "entries" $entries "lang" $lang "page" $page) }} +{{ partial "fip-validity/table" (dict "entries" $entries "lang" $lang "page" $page "groups" $groupsMap) }} From d6e8567779d9d54d7c7c590a88988ced6a6e0175 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 19:57:23 +0200 Subject: [PATCH 2/8] feat: add FIP validity table CMS collection and widgets - Add fip-validity-select and fip-validity-link custom Decap widgets, and a new FIP Validity Tables collection for editing the groups and operators data in each issuer's validity.yaml - Filter validity dropdowns by group type (FIP Coupon vs Reduced Ticket); sort the operators map alphabetically on save - Allow creating new FIP Validity Table entries via Decap's meta.path mechanism, and link to the matching table from the FIP Application page's fip-validity-table shortcode - Rename fip-validity-widget.js to widget.js - Generate the Operators field list in the admin config from content/operator via a Hugo-templated layouts/admin/section.cmsconfig.yml instead of a hand-maintained list in static/admin/config.yml - Exclude the new template from the check-yaml pre-commit hook via prek's glob exclude syntax, since it's Go template source, not plain YAML - Re-save validity.yaml files through the CMS to backfill the new type field on existing validity groups --- .pre-commit-config.yaml | 5 +- content/admin/_index.md | 10 + content/application/cd/validity.yaml | 154 +++++---- content/application/cie/validity.yaml | 14 +- content/application/db/validity.yaml | 222 ++++++------ content/application/gb/validity.yaml | 120 +++---- content/application/nir/validity.yaml | 14 +- content/application/ns/validity.yaml | 194 ++++++----- content/application/oebb/validity.yaml | 266 +++++++++------ content/application/sncb/validity.yaml | 211 ++++++------ content/application/sncf/validity.yaml | 322 ++++++++++-------- hugo.yaml | 11 + .../admin/section.cmsconfig.yml | 156 ++++++++- static/admin/index.html | 2 + static/admin/shortcodes.js | 5 + static/admin/style.css | 40 +++ static/admin/widget.js | 121 +++++++ 17 files changed, 1154 insertions(+), 713 deletions(-) create mode 100644 content/admin/_index.md rename static/admin/config.yml => layouts/admin/section.cmsconfig.yml (69%) create mode 100644 static/admin/style.css create mode 100644 static/admin/widget.js diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d5b7d27f9..93a526529 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,10 @@ repos: - id: check-xml exclude: "^layouts/.*rss\\.xml$" - id: check-yaml - exclude: "validity.yaml$" + exclude: + glob: + - "**/validity.yaml" + - "layouts/admin/section.cmsconfig.yml" - id: debug-statements - id: destroyed-symlinks - id: end-of-file-fixer diff --git a/content/admin/_index.md b/content/admin/_index.md new file mode 100644 index 000000000..f5bf6ac9b --- /dev/null +++ b/content/admin/_index.md @@ -0,0 +1,10 @@ +--- +title: "Admin" +url: "/admin/" +outputs: ["CMSConfig"] +sitemap: + disable: true +build: + list: never + render: always +--- diff --git a/content/application/cd/validity.yaml b/content/application/cd/validity.yaml index bc725cfed..b4d11e4b6 100644 --- a/content/application/cd/validity.yaml +++ b/content/application/cd/validity.yaml @@ -1,71 +1,83 @@ -# This file shows the rules for FIP cards issued by CD. groups: -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs par an. Chaque champ est valable deux jours. -- name: coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **2 coupons** - With 4 fields per year. Each field is valid for two days. - fr: | - **2 coupons** - Avec 4 champs par an. Chaque champ est valable deux jours. -- name: coupon-3 - status: valid - text: - de: | - **3 Freifahrtscheine** - Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **3 coupons** - With 4 fields per year. Each field is valid for two days. - fr: | - **3 coupons** - Avec 4 champs par an. Chaque champ est valable deux jours. -- name: coupon-crossing-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Mit 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs par an. Chaque champ est valable pour une traversée. -- name: coupon-zssk - status: valid - text: - de: | - **Unbegrenzt** - Nur gültig mit einer „In Karta" in der ŽP-App. - en: | - **Unlimited** - Only valid with an "In Karta" in the ŽP app. - fr: | - **Illimité** - Valable uniquement avec une «In Karta» dans l'application ŽP. + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **1 coupon** + With 4 fields per year. Each field is valid for two days. + fr: > + **1 coupon** + + Avec 4 champs par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **2 coupons** + With 4 fields per year. Each field is valid for two days. + fr: > + **2 coupons** + + Avec 4 champs par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-3 + status: valid + text: + de: | + **3 Freifahrtscheine** + Mit 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: | + **3 coupons** + With 4 fields per year. Each field is valid for two days. + fr: > + **3 coupons** + + Avec 4 champs par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-crossing-1 + status: valid + text: + de: > + **1 Freifahrtschein** + + Mit 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: > + **1 coupon** + + With 2 fields per year. Each field is valid for one crossing. + fr: > + **1 coupon** + + Avec 2 champs par an. Chaque champ est valable pour une traversée. + type: fip-coupon + - name: coupon-zssk + status: valid + text: + de: | + **Unbegrenzt** + Nur gültig mit einer „In Karta" in der ŽP-App. + en: | + **Unlimited** + Only valid with an "In Karta" in the ŽP app. + fr: > + **Illimité** + + Valable uniquement avec une «In Karta» dans l'application ŽP. + type: fip-coupon operators: attica: fip-coupon: @@ -95,14 +107,14 @@ operators: retired: coupon-not-available retired-relatives: coupon-not-available widows: coupon-not-available - cfr: + cfl: fip-coupon: active: coupon-1 active-relatives: coupon-1 retired: coupon-1 retired-relatives: coupon-1 widows: coupon-1 - cfl: + cfr: fip-coupon: active: coupon-1 active-relatives: coupon-1 @@ -326,14 +338,14 @@ operators: retired: coupon-not-available retired-relatives: coupon-not-available widows: coupon-not-available - vy: + vr: fip-coupon: active: coupon-1 active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available widows: coupon-not-available - vr: + vy: fip-coupon: active: coupon-1 active-relatives: coupon-not-available diff --git a/content/application/cie/validity.yaml b/content/application/cie/validity.yaml index 9d6999544..f5e3cdf1b 100644 --- a/content/application/cie/validity.yaml +++ b/content/application/cie/validity.yaml @@ -1,11 +1,11 @@ -# This file shows the rules for FIP cards issued by CIE. groups: -- name: reduced-75 - status: valid - text: - de: 75 % Rabatt - en: 75 % discount - fr: 75 % de réduction + - name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction + type: fip-reduced-ticket operators: gb: fip-reduced-ticket: diff --git a/content/application/db/validity.yaml b/content/application/db/validity.yaml index 5a8e9af76..f56a70954 100644 --- a/content/application/db/validity.yaml +++ b/content/application/db/validity.yaml @@ -1,69 +1,68 @@ -# This file shows the rules for FIP cards issued by DB. groups: -- name: coupon-4fields - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields each per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: reduced-50 - status: valid - text: - de: 50 % Rabatt - en: 50 % discount - fr: 50 % de réduction -- name: coupon-crossing - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields each per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. -- name: coupon-former-1-onetime - status: valid - text: - de: | - **1 Freifahrtschein** - Einmalig, innerhalb von 45 Monaten nach Austritt. - en: | - **1 coupon** - One-time, within 45 months after leaving. - fr: | - **1 coupon** - Unique, dans les 45 mois suivant le départ. + - name: coupon-4fields + status: valid + text: + de: > + **1 Freifahrtschein** + + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: > + **1 coupon** + + With 4 fields each per year. Each field is valid for two days. + fr: > + **1 coupon** + + Avec 4 champs chacun par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-crossing + status: valid + text: + de: > + **1 Freifahrtschein** + + Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: > + **1 coupon** + + With 2 fields each per year. Each field is valid for one crossing. + fr: > + **1 coupon** + + Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. + type: fip-coupon + - name: coupon-former-1-onetime + status: valid + text: + de: | + **1 Freifahrtschein** + Einmalig, innerhalb von 45 Monaten nach Austritt. + en: | + **1 coupon** + One-time, within 45 months after leaving. + fr: | + **1 coupon** + Unique, dans les 45 mois suivant le départ. + type: fip-coupon + - name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction + type: fip-reduced-ticket operators: - sncf: + bdz: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available - retired: coupon-former-1-onetime - retired-relatives: coupon-not-available - fip-reduced-ticket: - active: reduced-50 - active-relatives: reduced-50 - retired: reduced-50 - retired-relatives: reduced-50 - stl: - fip-coupon: - active: coupon-crossing - active-relatives: coupon-crossing + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -71,7 +70,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - pkp: + bls: fip-coupon: active: coupon-4fields active-relatives: coupon-4fields @@ -82,10 +81,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sncb: + bsb: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -93,10 +92,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - gysev: + cd: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -104,10 +103,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - ns: + cfl: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -115,10 +114,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - oebb: + cfr: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -126,10 +125,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cp: + cie: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -137,7 +136,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - fs: + cp: fip-coupon: active: coupon-4fields active-relatives: coupon-4fields @@ -148,10 +147,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - bls: + dsb: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -159,7 +158,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - bdz: + fs: fip-coupon: active: coupon-4fields active-relatives: coupon-4fields @@ -170,7 +169,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - zssk: + gb: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -181,10 +180,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sp: + gysev: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -192,7 +191,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sbb: + ht: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -203,7 +202,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - renfe: + hz: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -225,7 +224,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - dsb: + ks: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -236,7 +235,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cfl: + kw: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -247,7 +246,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cd: + lka: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -258,7 +257,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - bsb: + ltg: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -269,7 +268,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - ltg: + mav: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -280,7 +279,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - gb: + nir: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -291,10 +290,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cfr: + ns: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -302,10 +301,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cie: + oebb: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -313,10 +312,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - ht: + pkp: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -324,7 +323,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - hz: + renfe: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -335,7 +334,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - ks: + sbb: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -346,10 +345,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - kw: + sll: fip-coupon: - active: coupon-4fields - active-relatives: coupon-not-available + active: coupon-crossing + active-relatives: coupon-crossing retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -357,10 +356,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - lka: + sncb: fip-coupon: active: coupon-4fields - active-relatives: coupon-not-available + active-relatives: coupon-4fields retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: @@ -368,7 +367,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - mav: + sncf: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -379,7 +378,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - nir: + sp: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -390,7 +389,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sll: + stl: fip-coupon: active: coupon-crossing active-relatives: coupon-crossing @@ -467,6 +466,17 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 + zrms: + fip-coupon: + active: coupon-4fields + active-relatives: coupon-4fields + retired: coupon-former-1-onetime + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 zrs: fip-coupon: active: coupon-4fields @@ -478,10 +488,10 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - zrms: + zssk: fip-coupon: active: coupon-4fields - active-relatives: coupon-4fields + active-relatives: coupon-not-available retired: coupon-former-1-onetime retired-relatives: coupon-not-available fip-reduced-ticket: diff --git a/content/application/gb/validity.yaml b/content/application/gb/validity.yaml index e399e5918..68a06d2dc 100644 --- a/content/application/gb/validity.yaml +++ b/content/application/gb/validity.yaml @@ -1,47 +1,51 @@ -# This file shows the rules for FIP cards issued by GB (National Rail). groups: -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: reduced-50 - status: valid - text: - de: 50 % Rabatt - en: 50 % discount - fr: 50 % de réduction -- name: reduced-75 - status: valid - text: - de: 75 % Rabatt - en: 75 % discount - fr: 75 % de réduction -- name: coupon-active-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. -- name: coupon-active-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-active-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. + type: fip-coupon + - name: coupon-active-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. + type: fip-coupon + - name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction + type: fip-reduced-ticket + - name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction + type: fip-reduced-ticket operators: attica: fip-coupon: @@ -103,25 +107,25 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cfr: + cfl: fip-coupon: active: coupon-active-1 - active-relatives: coupon-not-available - retired: coupon-not-available - retired-relatives: coupon-not-available - widows: coupon-not-available + active-relatives: coupon-active-1 + retired: coupon-active-1 + retired-relatives: coupon-active-1 + widows: coupon-active-1 fip-reduced-ticket: active: reduced-50 active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - cfl: + cfr: fip-coupon: active: coupon-active-1 - active-relatives: coupon-active-1 - retired: coupon-active-1 - retired-relatives: coupon-active-1 - widows: coupon-active-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + widows: coupon-not-available fip-reduced-ticket: active: reduced-50 active-relatives: reduced-50 @@ -235,7 +239,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - ks: + kml: fip-coupon: active: coupon-active-1 active-relatives: coupon-not-available @@ -247,7 +251,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - kw: + ks: fip-coupon: active: coupon-active-1 active-relatives: coupon-not-available @@ -259,7 +263,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - kml: + kw: fip-coupon: active: coupon-active-1 active-relatives: coupon-not-available @@ -499,7 +503,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - zrs: + zrms: fip-coupon: active: coupon-active-1 active-relatives: coupon-not-available @@ -511,7 +515,7 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - zrms: + zrs: fip-coupon: active: coupon-active-1 active-relatives: coupon-not-available diff --git a/content/application/nir/validity.yaml b/content/application/nir/validity.yaml index 65ef30505..f5e3cdf1b 100644 --- a/content/application/nir/validity.yaml +++ b/content/application/nir/validity.yaml @@ -1,11 +1,11 @@ -# This file shows the rules for FIP cards issued by NIR. groups: -- name: reduced-75 - status: valid - text: - de: 75 % Rabatt - en: 75 % discount - fr: 75 % de réduction + - name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction + type: fip-reduced-ticket operators: gb: fip-reduced-ticket: diff --git a/content/application/ns/validity.yaml b/content/application/ns/validity.yaml index 75879091b..0a3b4ab17 100644 --- a/content/application/ns/validity.yaml +++ b/content/application/ns/validity.yaml @@ -1,83 +1,95 @@ -# This file shows the rules for FIP cards issued by NS. groups: -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: free-travel - status: valid - text: - de: | - **Unbegrenzt** - Unbegrenzte Anzahl an Ländercoupons möglich (jeweils ein Coupon pro Anfrage). - en: | - **Unlimited** - Unlimited country coupons can be requested (one coupon per request). - fr: | - **Illimité** - Un nombre illimité de coupons pays peut être demandé (un coupon par demande). -- name: coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. -- name: coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. -- name: coupon-4 - status: valid - text: - de: | - **4 Freifahrtscheine** - Pro Jahr. - en: | - **4 coupons** - Per year. - fr: | - **4 coupons** - Par an. -- name: coupon-1-onetime - status: valid - text: - de: | - **1 Freifahrtschein** - Einmalig, innerhalb von 45 Monaten nach Austritt. - en: | - **1 coupon** - One-time, within 45 months after leaving. - fr: | - **1 coupon** - Unique, dans les 45 mois suivant le départ. -- name: relatives-sncf-active - status: valid - text: - de: | - **1 / 3 Freifahrtscheine** - Gesamtes Netz: 1 Freifahrtschein pro Jahr. Région Nord: 3 Freifahrtscheine pro Jahr. - en: | - **1 / 3 coupons** - Whole network: 1 coupon per year. Région Nord: 3 coupons per year. - fr: | - **1 / 3 coupons** - Réseau entier : 1 coupon par an. Région Nord : 3 coupons par an. + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: free-travel + status: valid + text: + de: > + **Unbegrenzt** + + Unbegrenzte Anzahl an Ländercoupons möglich (jeweils ein Coupon pro Anfrage). + en: > + **Unlimited** + + Unlimited country coupons can be requested (one coupon per request). + fr: > + **Illimité** + + Un nombre illimité de coupons pays peut être demandé (un coupon par demande). + type: fip-coupon + - name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. + type: fip-coupon + - name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. + type: fip-coupon + - name: coupon-4 + status: valid + text: + de: | + **4 Freifahrtscheine** + Pro Jahr. + en: | + **4 coupons** + Per year. + fr: | + **4 coupons** + Par an. + type: fip-coupon + - name: coupon-1-onetime + status: valid + text: + de: | + **1 Freifahrtschein** + Einmalig, innerhalb von 45 Monaten nach Austritt. + en: | + **1 coupon** + One-time, within 45 months after leaving. + fr: | + **1 coupon** + Unique, dans les 45 mois suivant le départ. + type: fip-coupon + - name: relatives-sncf-active + status: valid + text: + de: > + **1 / 3 Freifahrtscheine** + + Gesamtes Netz: 1 Freifahrtschein pro Jahr. Région Nord: 3 Freifahrtscheine pro Jahr. + en: > + **1 / 3 coupons** + + Whole network: 1 coupon per year. Région Nord: 3 coupons per year. + fr: > + **1 / 3 coupons** + + Réseau entier : 1 coupon par an. Région Nord : 3 coupons par an. + type: fip-coupon operators: attica: fip-coupon: @@ -109,18 +121,18 @@ operators: active-relatives: coupon-1 retired: coupon-1 retired-relatives: coupon-1 - cfr: - fip-coupon: - active: coupon-1 - active-relatives: coupon-1 - retired: coupon-1 - retired-relatives: coupon-1 cfl: fip-coupon: active: free-travel active-relatives: free-travel retired: free-travel retired-relatives: free-travel + cfr: + fip-coupon: + active: coupon-1 + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 cie: fip-coupon: active: coupon-1 @@ -181,6 +193,12 @@ operators: active-relatives: coupon-1 retired: coupon-1 retired-relatives: coupon-1 + kml: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-1-onetime + retired-relatives: coupon-not-available ks: fip-coupon: active: coupon-1 @@ -319,9 +337,3 @@ operators: active-relatives: coupon-1 retired: coupon-1 retired-relatives: coupon-1 - kml: - fip-coupon: - active: coupon-1 - active-relatives: coupon-not-available - retired: coupon-1-onetime - retired-relatives: coupon-not-available diff --git a/content/application/oebb/validity.yaml b/content/application/oebb/validity.yaml index bee62f9ea..af5912b9f 100644 --- a/content/application/oebb/validity.yaml +++ b/content/application/oebb/validity.yaml @@ -1,104 +1,158 @@ -# This file shows the rules for FIP cards issued by ÖBB. groups: -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: reduced-50 - status: valid - text: - de: 50 % Rabatt - en: 50 % discount - fr: 50 % de réduction -- name: reduced-no-discount - status: invalid - text: - de: Kein Rabatt - en: No discount - fr: Pas de réduction -- name: coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** nur Vollzeit - en: | - **1 coupon** Full-time only - fr: | - **1 coupon** Temps plein uniquement -- name: coupon-1-1 - status: valid - text: - de: | - **1 Freifahrtschein** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
- en: | - **1 coupon** Full-time
Part-time (min. 50%): 1 coupon
- fr: | - **1 coupon** Temps plein
Temps partiel (min. 50%): 1 coupon
-- name: coupon-2-1 - status: valid - text: - de: | - **2 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
- en: | - **2 coupons** Full-time
Part-time (min. 50%): 1 coupon
- fr: | - **2 coupons** Temps plein
Temps partiel (min. 50%): 1 coupon
-- name: coupon-3-1 - status: valid - text: - de: | - **3 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 Freifahrtschein
- en: | - **3 coupons** Full-time
Part-time (min. 50%): 1 coupon
- fr: | - **3 coupons** Temps plein
Temps partiel (min. 50%): 1 coupon
-- name: coupon-y1-9x1-45x0 - status: valid - text: - de: | - **1 / 1 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
- en: | - **1 / 1 / 0 coupons** Yearly: 1 coupon
**One-time within 9 months** after retirement: 1 coupon
**One-time within 45 months** after retirement: 0 coupons
- fr: | - **1 / 1 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 mois** après le départ à la retraite: 0 coupon
-- name: coupon-y0-9x1-45x1 - status: valid - text: - de: | - **0 / 1 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
- en: | - **0 / 1 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 1 coupon
**One-time within 45 months** after retirement: 1 coupon
- fr: | - **0 / 1 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
-- name: coupon-y0-9x2-45x1 - status: valid - text: - de: | - **0 / 2 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 2 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
- en: | - **0 / 2 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 2 coupons
**One-time within 45 months** after retirement: 1 coupon
- fr: | - **0 / 2 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 2 coupons
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
-- name: coupon-y1-9x3-45x0 - status: valid - text: - de: | - **1 / 3 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 3 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
- en: | - **1 / 3 / 0 coupons** Yearly: 1 coupon
**One-time within 9 months** after retirement: 3 coupons
**One-time within 45 months** after retirement: 0 coupons
- fr: | - **1 / 3 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 mois** après le départ à la retraite: 3 coupons
**Unique dans les 45 mois** après le départ à la retraite: 0 coupon
-- name: coupon-y0-9x0-45x1 - status: valid - text: - de: | - **0 / 0 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
**Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 0 Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach Versetzung in den Ruhestand: 1 Freifahrtschein
- en: | - **0 / 0 / 1 coupons** Yearly: 0 coupons
**One-time within 9 months** after retirement: 0 coupons
**One-time within 45 months** after retirement: 1 coupon
- fr: | - **0 / 0 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 mois** après le départ à la retraite: 0 coupon
**Unique dans les 45 mois** après le départ à la retraite: 1 coupon
+ - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** nur Vollzeit + en: | + **1 coupon** Full-time only + fr: | + **1 coupon** Temps plein uniquement + type: fip-coupon + - name: coupon-1-1 + status: valid + text: + de: > + **1 Freifahrtschein** Vollzeit
Teilzeit (mind. 50%): 1 + Freifahrtschein
+ en: > + **1 coupon** Full-time
Part-time (min. 50%): 1 coupon
+ fr: > + **1 coupon** Temps plein
Temps partiel (min. 50%): 1 + coupon
+ type: fip-coupon + - name: coupon-2-1 + status: valid + text: + de: > + **2 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 + Freifahrtschein
+ en: > + **2 coupons** Full-time
Part-time (min. 50%): 1 + coupon
+ fr: > + **2 coupons** Temps plein
Temps partiel (min. 50%): 1 + coupon
+ type: fip-coupon + - name: coupon-3-1 + status: valid + text: + de: > + **3 Freifahrtscheine** Vollzeit
Teilzeit (mind. 50%): 1 + Freifahrtschein
+ en: > + **3 coupons** Full-time
Part-time (min. 50%): 1 + coupon
+ fr: > + **3 coupons** Temps plein
Temps partiel (min. 50%): 1 + coupon
+ type: fip-coupon + - name: coupon-y1-9x1-45x0 + status: valid + text: + de: > + **1 / 1 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
+ **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 + Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach + Versetzung in den Ruhestand: 0 Freifahrtscheine
+ en: > + **1 / 1 / 0 coupons** Yearly: 1 coupon
**One-time within 9 + months** after retirement: 1 coupon
**One-time within 45 months** + after retirement: 0 coupons
+ fr: > + **1 / 1 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 + mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 + mois** après le départ à la retraite: 0 coupon
+ type: fip-coupon + - name: coupon-y0-9x1-45x1 + status: valid + text: + de: > + **0 / 1 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
+ **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 1 + Freifahrtschein
**Einmalig innerhalb von 45 Monaten** nach + Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: > + **0 / 1 / 1 coupons** Yearly: 0 coupons
**One-time within 9 + months** after retirement: 1 coupon
**One-time within 45 months** + after retirement: 1 coupon
+ fr: > + **0 / 1 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 + mois** après le départ à la retraite: 1 coupon
**Unique dans les 45 + mois** après le départ à la retraite: 1 coupon
+ type: fip-coupon + - name: coupon-y0-9x2-45x1 + status: valid + text: + de: > + **0 / 2 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
+ **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 2 + Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach + Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: > + **0 / 2 / 1 coupons** Yearly: 0 coupons
**One-time within 9 + months** after retirement: 2 coupons
**One-time within 45 months** + after retirement: 1 coupon
+ fr: > + **0 / 2 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 + mois** après le départ à la retraite: 2 coupons
**Unique dans les + 45 mois** après le départ à la retraite: 1 coupon
+ type: fip-coupon + - name: coupon-y1-9x3-45x0 + status: valid + text: + de: > + **1 / 3 / 0 Freifahrtscheine** Jährlich: 1 Freifahrtschein
+ **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 3 + Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach + Versetzung in den Ruhestand: 0 Freifahrtscheine
+ en: > + **1 / 3 / 0 coupons** Yearly: 1 coupon
**One-time within 9 + months** after retirement: 3 coupons
**One-time within 45 months** + after retirement: 0 coupons
+ fr: > + **1 / 3 / 0 coupons** Annuel: 1 coupon
**Unique dans les 9 + mois** après le départ à la retraite: 3 coupons
**Unique dans les + 45 mois** après le départ à la retraite: 0 coupon
+ type: fip-coupon + - name: coupon-y0-9x0-45x1 + status: valid + text: + de: > + **0 / 0 / 1 Freifahrtscheine** Jährlich: 0 Freifahrtscheine
+ **Einmalig innerhalb von 9 Monaten** nach Versetzung in den Ruhestand: 0 + Freifahrtscheine
**Einmalig innerhalb von 45 Monaten** nach + Versetzung in den Ruhestand: 1 Freifahrtschein
+ en: > + **0 / 0 / 1 coupons** Yearly: 0 coupons
**One-time within 9 + months** after retirement: 0 coupons
**One-time within 45 months** + after retirement: 1 coupon
+ fr: > + **0 / 0 / 1 coupons** Annuel: 0 coupon
**Unique dans les 9 + mois** après le départ à la retraite: 0 coupon
**Unique dans les 45 + mois** après le départ à la retraite: 1 coupon
+ type: fip-coupon + - name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction + type: fip-reduced-ticket + - name: reduced-no-discount + status: invalid + text: + de: Kein Rabatt + en: No discount + fr: Pas de réduction + type: fip-reduced-ticket operators: attica: fip-coupon: @@ -593,11 +647,11 @@ operators: retired: reduced-50 retired-relatives: reduced-50 widows: reduced-50 - zssk: + zpcg: fip-coupon: - active: coupon-3-1 + active: coupon-1-1 active-relatives: coupon-1 - retired: coupon-y1-9x3-45x0 + retired: coupon-y1-9x1-45x0 retired-relatives: coupon-y0-9x1-45x1 widows: coupon-y0-9x0-45x1 fip-reduced-ticket: @@ -606,11 +660,11 @@ operators: retired: reduced-50 retired-relatives: reduced-50 widows: reduced-50 - zpcg: + zssk: fip-coupon: - active: coupon-1-1 + active: coupon-3-1 active-relatives: coupon-1 - retired: coupon-y1-9x1-45x0 + retired: coupon-y1-9x3-45x0 retired-relatives: coupon-y0-9x1-45x1 widows: coupon-y0-9x0-45x1 fip-reduced-ticket: diff --git a/content/application/sncb/validity.yaml b/content/application/sncb/validity.yaml index 0139acfef..be397a4f1 100644 --- a/content/application/sncb/validity.yaml +++ b/content/application/sncb/validity.yaml @@ -1,83 +1,96 @@ -# This file shows the rules for FIP cards issued by SNCB. groups: -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: reduced-50 - status: valid - text: - de: 50 % Rabatt - en: 50 % discount - fr: 50 % de réduction -- name: reduced-75 - status: valid - text: - de: 75 % Rabatt - en: 75 % discount - fr: 75 % de réduction -- name: coupon-1 - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr. - en: | - **1 coupon** - Per year. - fr: | - **1 coupon** - Par an. -- name: coupon-2 - status: valid - text: - de: | - **2 Freifahrtscheine** - Pro Jahr. - en: | - **2 coupons** - Per year. - fr: | - **2 coupons** - Par an. -- name: coupon-sncf-nord - status: valid - text: - de: | - **4 / 8 Freifahrtscheine** - Gesamtes Netz: 4 Freifahrtscheine pro Jahr. Région Nord: 8 Freifahrtscheine pro Jahr. - en: | - **4 / 8 coupons** - Whole network: 4 coupons per year. Région Nord: 8 coupons per year. - fr: | - **4 / 8 coupons** - Réseau entier : 4 coupons par an. Région Nord : 8 coupons par an. -- name: relatives-sncf-nord - status: valid - text: - de: | - **2 / 4 Freifahrtscheine** - Gesamtes Netz: 2 Freifahrtscheine pro Jahr. Région Nord: 4 Freifahrtscheine pro Jahr. - en: | - **2 / 4 coupons** - Whole network: 2 coupons per year. Région Nord: 4 coupons per year. - fr: | - **2 / 4 coupons** - Réseau entier : 2 coupons par an. Région Nord : 4 coupons par an. -- name: relatives-sncf-retired - status: valid - text: - de: | - **1 Freifahrtschein** - Pro Jahr (nur Kind). - en: | - **1 coupon** - Per year (child only). - fr: | - **1 coupon** - Par an (enfant uniquement). + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-1 + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr. + en: | + **1 coupon** + Per year. + fr: | + **1 coupon** + Par an. + type: fip-coupon + - name: coupon-2 + status: valid + text: + de: | + **2 Freifahrtscheine** + Pro Jahr. + en: | + **2 coupons** + Per year. + fr: | + **2 coupons** + Par an. + type: fip-coupon + - name: coupon-sncf-nord + status: valid + text: + de: > + **4 / 8 Freifahrtscheine** + + Gesamtes Netz: 4 Freifahrtscheine pro Jahr. Région Nord: 8 Freifahrtscheine pro Jahr. + en: > + **4 / 8 coupons** + + Whole network: 4 coupons per year. Région Nord: 8 coupons per year. + fr: > + **4 / 8 coupons** + + Réseau entier : 4 coupons par an. Région Nord : 8 coupons par an. + type: fip-coupon + - name: relatives-sncf-nord + status: valid + text: + de: > + **2 / 4 Freifahrtscheine** + + Gesamtes Netz: 2 Freifahrtscheine pro Jahr. Région Nord: 4 Freifahrtscheine pro Jahr. + en: > + **2 / 4 coupons** + + Whole network: 2 coupons per year. Région Nord: 4 coupons per year. + fr: > + **2 / 4 coupons** + + Réseau entier : 2 coupons par an. Région Nord : 4 coupons par an. + type: fip-coupon + - name: relatives-sncf-retired + status: valid + text: + de: | + **1 Freifahrtschein** + Pro Jahr (nur Kind). + en: | + **1 coupon** + Per year (child only). + fr: | + **1 coupon** + Par an (enfant uniquement). + type: fip-coupon + - name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction + type: fip-reduced-ticket + - name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction + type: fip-reduced-ticket operators: bdz: fip-coupon: @@ -343,6 +356,17 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 + sbb: + fip-coupon: + active: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available + fip-reduced-ticket: + active: reduced-50 + active-relatives: reduced-50 + retired: reduced-50 + retired-relatives: reduced-50 sncf: fip-coupon: active: coupon-sncf-nord @@ -354,18 +378,18 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sv: + sp: fip-coupon: active: coupon-1 - active-relatives: coupon-1 - retired: coupon-1 - retired-relatives: coupon-1 + active-relatives: coupon-not-available + retired: coupon-not-available + retired-relatives: coupon-not-available fip-reduced-ticket: active: reduced-50 active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sz: + sv: fip-coupon: active: coupon-1 active-relatives: coupon-1 @@ -376,23 +400,12 @@ operators: active-relatives: reduced-50 retired: reduced-50 retired-relatives: reduced-50 - sbb: - fip-coupon: - active: coupon-1 - active-relatives: coupon-not-available - retired: coupon-not-available - retired-relatives: coupon-not-available - fip-reduced-ticket: - active: reduced-50 - active-relatives: reduced-50 - retired: reduced-50 - retired-relatives: reduced-50 - sp: + sz: fip-coupon: active: coupon-1 - active-relatives: coupon-not-available - retired: coupon-not-available - retired-relatives: coupon-not-available + active-relatives: coupon-1 + retired: coupon-1 + retired-relatives: coupon-1 fip-reduced-ticket: active: reduced-50 active-relatives: reduced-50 diff --git a/content/application/sncf/validity.yaml b/content/application/sncf/validity.yaml index 766863e71..76e3082d4 100644 --- a/content/application/sncf/validity.yaml +++ b/content/application/sncf/validity.yaml @@ -1,141 +1,152 @@ -# This file shows the rules for FIP cards issued by SNCF. groups: -- name: coupon-4fields - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **1 coupon** - With 4 fields each per year. Each field is valid for two days. - fr: | - **1 coupon** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. -- name: coupon-not-available - status: invalid - text: - de: Nicht verfügbar - en: Not available - fr: Non disponible -- name: coupon-2fields - status: valid - text: - de: | - **2 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **2 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **2 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. -- name: coupon-4fields-4 - status: valid - text: - de: | - **4 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **4 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **4 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. -- name: coupon-6fields - status: valid - text: - de: | - **6 Freifahrtscheine** - Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. - en: | - **6 coupons** - With 4 fields each per year. Each field is valid for two days. - fr: | - **6 coupons** - Avec 4 champs chacun par an. Chaque champ est valable deux jours. -- name: coupon-crossing - status: valid - text: - de: | - **1 Freifahrtschein** - Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. - en: | - **1 coupon** - With 2 fields each per year. Each field is valid for one crossing. - fr: | - **1 coupon** - Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. -- name: reduced-50 - status: valid - text: - de: 50 % Rabatt - en: 50 % discount - fr: 50 % de réduction -- name: reduced-75 - status: valid - text: - de: 75 % Rabatt - en: 75 % discount - fr: 75 % de réduction + - name: coupon-4fields + status: valid + text: + de: > + **1 Freifahrtschein** + + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: > + **1 coupon** + + With 4 fields each per year. Each field is valid for two days. + fr: > + **1 coupon** + + Avec 4 champs chacun par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-not-available + status: invalid + text: + de: Nicht verfügbar + en: Not available + fr: Non disponible + type: fip-coupon + - name: coupon-2fields + status: valid + text: + de: > + **2 Freifahrtscheine** + + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: > + **2 coupons** + + With 4 fields each per year. Each field is valid for two days. + fr: > + **2 coupons** + + Avec 4 champs chacun par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-4fields-4 + status: valid + text: + de: > + **4 Freifahrtscheine** + + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: > + **4 coupons** + + With 4 fields each per year. Each field is valid for two days. + fr: > + **4 coupons** + + Avec 4 champs chacun par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-6fields + status: valid + text: + de: > + **6 Freifahrtscheine** + + Mit jeweils 4 Feldern pro Jahr. Jedes Feld ist zwei Tage gültig. + en: > + **6 coupons** + + With 4 fields each per year. Each field is valid for two days. + fr: > + **6 coupons** + + Avec 4 champs chacun par an. Chaque champ est valable deux jours. + type: fip-coupon + - name: coupon-crossing + status: valid + text: + de: > + **1 Freifahrtschein** + + Mit jeweils 2 Feldern pro Jahr. Jedes Feld ist für eine Überfahrt gültig. + en: > + **1 coupon** + + With 2 fields each per year. Each field is valid for one crossing. + fr: > + **1 coupon** + + Avec 2 champs chacun par an. Chaque champ est valable pour une traversée. + type: fip-coupon + - name: reduced-50 + status: valid + text: + de: 50 % Rabatt + en: 50 % discount + fr: 50 % de réduction + type: fip-reduced-ticket + - name: reduced-75 + status: valid + text: + de: 75 % Rabatt + en: 75 % discount + fr: 75 % de réduction + type: fip-reduced-ticket operators: - db: + attica: fip-coupon: - active: coupon-4fields + active: coupon-not-available active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - sncb: - fip-coupon: - active: coupon-4fields-4 - active-relatives: coupon-2fields - retired: coupon-not-available - retired-relatives: coupon-not-available - ns: + bdz: fip-coupon: - active: coupon-4fields-4 - active-relatives: coupon-4fields + active: coupon-4fields + active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - cfl: + bls: fip-coupon: - active: coupon-6fields - active-relatives: coupon-6fields + active: coupon-4fields + active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - gb: + bsb: fip-coupon: - active: coupon-2fields - active-relatives: coupon-2fields + active: coupon-4fields + active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - fip-reduced-ticket: - active: reduced-75 - active-relatives: reduced-75 - retired: reduced-50 - retired-relatives: reduced-50 - stl: + cd: fip-coupon: - active: coupon-crossing + active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - pkp: + cfl: fip-coupon: - active: coupon-4fields - active-relatives: coupon-not-available + active: coupon-6fields + active-relatives: coupon-6fields retired: coupon-not-available retired-relatives: coupon-not-available - oebb: + cfr: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - gysev: + cie: fip-coupon: - active: coupon-4fields - active-relatives: coupon-not-available + active: coupon-2fields + active-relatives: coupon-2fields retired: coupon-not-available retired-relatives: coupon-not-available cp: @@ -144,43 +155,48 @@ operators: active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - fs: + db: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - bls: + dsb: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - bdz: + fs: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - zssk: + gb: fip-coupon: - active: coupon-4fields - active-relatives: coupon-not-available + active: coupon-2fields + active-relatives: coupon-2fields retired: coupon-not-available retired-relatives: coupon-not-available - sp: + fip-reduced-ticket: + active: reduced-75 + active-relatives: reduced-75 + retired: reduced-50 + retired-relatives: reduced-50 + gysev: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - sbb: + ht: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - renfe: + hz: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -192,19 +208,19 @@ operators: active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - dsb: + ks: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - cd: + kw: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - bsb: + lka: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available @@ -216,109 +232,115 @@ operators: active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - zfbh: + mav: fip-coupon: - active: coupon-not-available + active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - zrs: + nir: fip-coupon: - active: coupon-4fields - active-relatives: coupon-not-available + active: coupon-2fields + active-relatives: coupon-2fields retired: coupon-not-available retired-relatives: coupon-not-available - hz: + ns: + fip-coupon: + active: coupon-4fields-4 + active-relatives: coupon-4fields + retired: coupon-not-available + retired-relatives: coupon-not-available + oebb: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - ht: + pkp: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - attica: + renfe: fip-coupon: - active: coupon-not-available + active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - mav: + sbb: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - cie: + sll: fip-coupon: - active: coupon-2fields - active-relatives: coupon-2fields + active: coupon-crossing + active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - nir: + sncb: fip-coupon: - active: coupon-2fields + active: coupon-4fields-4 active-relatives: coupon-2fields retired: coupon-not-available retired-relatives: coupon-not-available - sll: + sp: fip-coupon: - active: coupon-crossing + active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - zrms: + stl: fip-coupon: - active: coupon-4fields + active: coupon-crossing active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - zpcg: + sv: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - vy: + sz: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - ks: + vy: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - kw: + zfbh: fip-coupon: - active: coupon-4fields + active: coupon-not-available active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - lka: + zpcg: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - cfr: + zrms: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - sv: + zrs: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available retired: coupon-not-available retired-relatives: coupon-not-available - sz: + zssk: fip-coupon: active: coupon-4fields active-relatives: coupon-not-available diff --git a/hugo.yaml b/hugo.yaml index eec01b2e7..4ab8c3b74 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -36,6 +36,17 @@ module: hugoVersion: min: "0.164.0" +mediaTypes: + application/x-yaml: + suffixes: ["yml"] + +outputFormats: + CMSConfig: + mediaType: "application/x-yaml" + baseName: "config" + isPlainText: true + notAlternative: true + related: includeNewer: true indices: diff --git a/static/admin/config.yml b/layouts/admin/section.cmsconfig.yml similarity index 69% rename from static/admin/config.yml rename to layouts/admin/section.cmsconfig.yml index 6db4b6251..56f308cd5 100644 --- a/static/admin/config.yml +++ b/layouts/admin/section.cmsconfig.yml @@ -1,3 +1,5 @@ +local_backend: true + backend: name: github repo: fipguide/fipguide.github.io @@ -20,12 +22,68 @@ i18n: locales: [en, de, fr] default_locale: en +x_fip_validity_target_fields_coupon: &fip_validity_target_fields_coupon + - label: "Active Employees" + name: "active" + widget: "fip-validity-select" + group_type: "fip-coupon" + - label: "Relatives of Active Employees" + name: "active-relatives" + widget: "fip-validity-select" + group_type: "fip-coupon" + - label: "Retirees" + name: "retired" + widget: "fip-validity-select" + group_type: "fip-coupon" + - label: "Relatives of Retirees" + name: "retired-relatives" + widget: "fip-validity-select" + group_type: "fip-coupon" + - label: "Widows, Widowers and Orphans" + name: "widows" + widget: "fip-validity-select" + group_type: "fip-coupon" + +x_fip_validity_target_fields_reduced: &fip_validity_target_fields_reduced + - label: "Active Employees" + name: "active" + widget: "fip-validity-select" + group_type: "fip-reduced-ticket" + - label: "Relatives of Active Employees" + name: "active-relatives" + widget: "fip-validity-select" + group_type: "fip-reduced-ticket" + - label: "Retirees" + name: "retired" + widget: "fip-validity-select" + group_type: "fip-reduced-ticket" + - label: "Relatives of Retirees" + name: "retired-relatives" + widget: "fip-validity-select" + group_type: "fip-reduced-ticket" + - label: "Widows, Widowers and Orphans" + name: "widows" + widget: "fip-validity-select" + group_type: "fip-reduced-ticket" + +x_fip_validity_columns: &fip_validity_columns + - label: "FIP Coupon" + name: "fip-coupon" + widget: "object" + hint: "Number and validity of FIP Coupons available to this target group." + fields: *fip_validity_target_fields_coupon + - label: "FIP Reduced Ticket" + name: "fip-reduced-ticket" + widget: "object" + hint: "Discount on FIP Reduced Tickets (FIP 50 / FIP 75) available to this target group." + fields: *fip_validity_target_fields_reduced + collections: - name: "news" label: "News" label_singular: "News Article" folder: "content/news" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false create: true delete: false @@ -92,7 +150,7 @@ collections: label: "Countries" label_singular: "Country" folder: "content/country" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" create: false publish: false delete: false @@ -127,7 +185,7 @@ collections: label: "Operators" label_singular: "Operator" folder: "content/operator" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false delete: false i18n: true @@ -172,9 +230,9 @@ collections: - name: "application" label: "FIP Application" - label_singular: "FIP Application" + label_singular: "FIP Application Page" folder: "content/application" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false create: true delete: false @@ -220,7 +278,7 @@ collections: How and when can employees of this issuer request FIP Coupons? --> - {{< fip-validity-table type="fip-coupon" >}} + {{"{{"}}< fip-validity-table type="fip-coupon" >}} ## FIP Reduced Ticket @@ -228,7 +286,7 @@ collections: How and when can employees of this issuer request FIP Reduced Tickets (FIP 50 / FIP 75)? --> - {{< fip-validity-table type="fip-reduced-ticket" >}} + {{"{{"}}< fip-validity-table type="fip-reduced-ticket" >}} editor_components: - "image" - "highlight" @@ -240,11 +298,75 @@ collections: - "wip" - "columns" + - name: "fip-validity" + label: "FIP Validity Tables" + label_singular: "FIP Validity Table" + folder: "content/application" + path: "{{"{{"}}slug}}/validity" + extension: "yaml" + format: "yaml" + summary: "{{"{{"}}dirname}}" + create: true + publish: false + delete: false + editor: + preview: false + fields: + - label: "Validity Groups" + name: "groups" + widget: "list" + summary: "{{"{{"}}fields.name}} ({{"{{"}}fields.type}}, {{"{{"}}fields.status}})" + hint: "The validity groups available for this issuer. Referenced by name in the Operators section below." + fields: + - label: "Name" + name: "name" + widget: "string" + hint: 'Unique identifier of this group, e.g. "coupon-1".' + - label: "Type" + name: "type" + widget: "select" + options: ["fip-coupon", "fip-reduced-ticket"] + required: false + hint: "Which FIP product this group applies to. Restricts which dropdowns it shows up in below. Leave unset to show it under both." + - label: "Status" + name: "status" + widget: "select" + options: ["valid", "invalid", "unknown"] + - label: "Text" + name: "text" + widget: "object" + fields: + - label: "Deutsch" + name: "de" + widget: "markdown" + minimal: true + - label: "English" + name: "en" + widget: "markdown" + minimal: true + - label: "Français" + name: "fr" + widget: "markdown" + minimal: true + - label: "Operators" + name: "operators" + widget: "object" + collapsed: true + hint: "For each target operator, select the applicable validity group per FIP product and target group." + fields: +{{- range (sort (where site.RegularPages "Type" "operator") "File.ContentBaseName") }} + - label: {{ printf "%q" .Title }} + name: {{ printf "%q" .File.ContentBaseName }} + widget: "object" + collapsed: true + fields: *fip_validity_columns +{{- end }} + - name: "booking" label: "Booking Platforms" label_singular: "Booking Platform" folder: "content/booking" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false create: true delete: false @@ -331,7 +453,7 @@ collections: widget: "markdown" i18n: true default: | - {{% booking-section "fip_50" %}} + {{"{{"}}% booking-section "fip_50" %}} ## FIP 50 Tickets @@ -339,9 +461,9 @@ collections: Explain the steps for booking FIP 50 Tickets with this booking platform. --> - {{% /booking-section %}} + {{"{{"}}% /booking-section %}} - {{% booking-section "fip_global_fare" %}} + {{"{{"}}% booking-section "fip_global_fare" %}} ## FIP Global Fare @@ -349,9 +471,9 @@ collections: Explain the steps for booking FIP Global Fares with this booking platform. --> - {{% /booking-section %}} + {{"{{"}}% /booking-section %}} - {{% booking-section "reservations" %}} + {{"{{"}}% booking-section "reservations" %}} ## Reservations @@ -359,7 +481,7 @@ collections: Explain the steps for booking reservations with this booking platform. --> - {{% /booking-section %}} + {{"{{"}}% /booking-section %}} editor_components: - "image" - "highlight-raw" @@ -376,7 +498,7 @@ collections: label: "General Pages" label_singular: "General Page" folder: "content/general" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" create: false publish: false delete: false @@ -411,7 +533,7 @@ collections: label: "FAQ" label_singular: "FAQ Entry" folder: "content/general/faq" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false create: true delete: false @@ -446,7 +568,7 @@ collections: label: "Identify Operator" label_singular: "Identify Operator" folder: "content/identify-operator" - path: "{{slug}}/index" + path: "{{"{{"}}slug}}/index" publish: false create: true delete: false diff --git a/static/admin/index.html b/static/admin/index.html index 268c072ee..a2c611def 100644 --- a/static/admin/index.html +++ b/static/admin/index.html @@ -4,9 +4,11 @@ FIP Guide Content Manager + + diff --git a/static/admin/shortcodes.js b/static/admin/shortcodes.js index 316b498c8..ac07624d9 100644 --- a/static/admin/shortcodes.js +++ b/static/admin/shortcodes.js @@ -921,6 +921,11 @@ options: ["fip-coupon", "fip-reduced-ticket"], param: { required: true }, }, + { + name: "validity_data_link", + label: "FIP Validity Table", + widget: "fip-validity-link", + }, ]; CMS.registerEditorComponent({ diff --git a/static/admin/style.css b/static/admin/style.css new file mode 100644 index 000000000..2e5726597 --- /dev/null +++ b/static/admin/style.css @@ -0,0 +1,40 @@ +[id^="fip-coupon-field-"], +[id^="fip-reduced-ticket-field-"] { + box-sizing: border-box; + display: inline-block; + width: 48%; + vertical-align: top; +} + +[class]:has(> [id^="fip-coupon-field-"]), +[class]:has(> [id^="fip-reduced-ticket-field-"]) { + display: inline-block; + width: 48%; + vertical-align: top; + box-sizing: border-box; +} + +[class]:has(> [id^="fip-coupon-field-"]) { + margin-right: 4%; + margin-top: 16px !important; +} + +[id^="fip-coupon-field-"] > div:first-child, +[id^="fip-reduced-ticket-field-"] > div:first-child { + display: none; +} + +.o-fip-validity-widget__info { + font-size: 0.85rem; + color: #6b7280; +} + +.o-fip-validity-widget__info a { + color: #3a69c7; + font-weight: 600; + text-decoration: none; +} + +.o-fip-validity-widget__info a:hover { + text-decoration: underline; +} diff --git a/static/admin/widget.js b/static/admin/widget.js new file mode 100644 index 000000000..320bdecec --- /dev/null +++ b/static/admin/widget.js @@ -0,0 +1,121 @@ +(function () { + function toPlain(value) { + if (value && typeof value.toJS === "function") { + return value.toJS(); + } + return value || null; + } + + function makeSelectFieldConfig(options) { + var config = { options: options, multiple: false, required: false }; + return { + get: function (key, defaultValue) { + return Object.prototype.hasOwnProperty.call(config, key) + ? config[key] + : defaultValue; + }, + has: function (key) { + return Object.prototype.hasOwnProperty.call(config, key); + }, + }; + } + + var SelectControl = CMS.getWidget("select").control; + + function FipValiditySelectControl(props) { + var groups = props.entry + ? toPlain(props.entry.getIn(["data", "groups"])) + : null; + groups = groups || []; + var groupType = props.field ? props.field.get("group_type") : null; + if (groupType) { + groups = groups.filter(function (group) { + return !group.type || group.type === groupType; + }); + } + var options = groups.map(function (group) { + return { label: group.name, value: group.name }; + }); + return h(SelectControl, { + field: makeSelectFieldConfig(options), + value: props.value || null, + forID: props.forID, + classNameWrapper: props.classNameWrapper, + onChange: props.onChange, + setActiveStyle: props.setActiveStyle, + setInactiveStyle: props.setInactiveStyle, + }); + } + + function FipValiditySelectPreview(props) { + return h("span", {}, props.value || "\u2014"); + } + + CMS.registerWidget( + "fip-validity-select", + FipValiditySelectControl, + FipValiditySelectPreview, + ); + + function FipValidityLinkControl(props) { + var slug = props.entry ? props.entry.get("slug") : null; + var issuerSlug = slug ? slug.replace(/\/[^/]+$/, "") : null; + if (!issuerSlug) { + return h( + "p", + { className: "o-fip-validity-widget__info" }, + "Save this page first to link its FIP Validity Table.", + ); + } + var href = "#/collections/fip-validity/entries/" + issuerSlug + "/validity"; + return h( + "p", + { className: "o-fip-validity-widget__info" }, + h( + "a", + { + href: href, + onClick: function (event) { + if ( + event.button !== 0 || + event.metaKey || + event.ctrlKey || + event.shiftKey || + event.altKey + ) { + return; + } + event.preventDefault(); + window.location.hash = href; + window.location.reload(); + }, + }, + "Edit the FIP Validity Table for \u201c" + issuerSlug + "\u201d \u2192", + ), + ); + } + + CMS.registerWidget( + "fip-validity-link", + FipValidityLinkControl, + FipValidityLinkControl, + ); + + CMS.registerEventListener({ + name: "preSave", + handler: function (data) { + var entry = data && data.entry; + if (!entry || entry.get("collection") !== "fip-validity") { + return undefined; + } + var operators = entry.getIn(["data", "operators"]); + if (!operators || typeof operators.sortBy !== "function") { + return undefined; + } + var sortedOperators = operators.sortBy(function (value, key) { + return key; + }); + return entry.get("data").set("operators", sortedOperators); + }, + }); +})(); From e53517812a445594b3fc0a5ad196facc1b392445 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 20:01:33 +0200 Subject: [PATCH 3/8] feat: hide FIP Validity Tables collection from admin sidebar Set hide: true on the fip-validity collection so it no longer appears in the sidebar nav or as the default landing collection, while staying fully reachable via the FIP Application shortcode's direct link and its own entry URLs. --- layouts/admin/section.cmsconfig.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/layouts/admin/section.cmsconfig.yml b/layouts/admin/section.cmsconfig.yml index 56f308cd5..4b7414e49 100644 --- a/layouts/admin/section.cmsconfig.yml +++ b/layouts/admin/section.cmsconfig.yml @@ -309,6 +309,7 @@ collections: create: true publish: false delete: false + hide: true editor: preview: false fields: From a6433adfd702e56638d07c2e8e202eb4a81fa1b8 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 20:11:33 +0200 Subject: [PATCH 4/8] feat: scope local_backend to hugo serve and derive CMS branch - Only emit local_backend: true when hugo.IsServer is true, so it never appears in production/preview builds, only local dev - Derive the Decap backend branch from a FIPGUIDE_BRANCH env var instead of hardcoding main, falling back to main when unset - Whitelist the FIPGUIDE_ prefix in hugo.yaml's security.funcs.getenv, since os.Getenv is deny-by-default for anything outside HUGO_/CI - Populate FIPGUIDE_BRANCH from Netlify's own in the build command, and from github.ref_name in the Pages deploy workflow --- .github/workflows/deploy.yaml | 1 + hugo.yaml | 4 ++++ layouts/admin/section.cmsconfig.yml | 5 +++-- netlify.toml | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 5708fa148..65dbfe7e1 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -61,6 +61,7 @@ jobs: env: HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache HUGO_ENVIRONMENT: production + FIPGUIDE_BRANCH: ${{ github.ref_name }} TZ: Europe/Berlin run: | hugo \ diff --git a/hugo.yaml b/hugo.yaml index 4ab8c3b74..16e2ce538 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -2,6 +2,10 @@ enableRobotsTXT: true enableGitInfo: true ignoreLogs: ["warning-rendershortcodes-in-html"] +security: + funcs: + getenv: ["^HUGO_", "^CI$", "^FIPGUIDE_"] + defaultContentLanguage: "en" defaultContentLanguageInSubdir: true languages: diff --git a/layouts/admin/section.cmsconfig.yml b/layouts/admin/section.cmsconfig.yml index 4b7414e49..4a9e91f33 100644 --- a/layouts/admin/section.cmsconfig.yml +++ b/layouts/admin/section.cmsconfig.yml @@ -1,9 +1,10 @@ +{{- if hugo.IsServer }} local_backend: true - +{{ end -}} backend: name: github repo: fipguide/fipguide.github.io - branch: main + branch: "{{ or (os.Getenv "FIPGUIDE_BRANCH") "main" }}" auth_scope: repo open_authoring: true site_domain: fipguide.netlify.app diff --git a/netlify.toml b/netlify.toml index fb97f2efd..3b5b5017c 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build] - command = "echo 'resourceDir: /opt/build/cache/resources_cache' >> hugo.yaml && hugo --gc --minify -b $DEPLOY_PRIME_URL && npx -y pagefind --site public" + command = "echo 'resourceDir: /opt/build/cache/resources_cache' >> hugo.yaml && FIPGUIDE_BRANCH=\"$BRANCH\" hugo --gc --minify -b $DEPLOY_PRIME_URL && npx -y pagefind --site public" publish = "public" [build.environment] From 211be17422739ed8ea920f23de10633de660f592 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 20:19:08 +0200 Subject: [PATCH 5/8] fix: disambiguate highlight vs highlight-raw parsing patterns highlight and highlight-raw were both registered with the identical bracket-agnostic pattern shortcodePattern("highlight"), which matches either {{% %}} or {{< >}} syntax. Decap's markdown parser tries every globally registered editor component's pattern (not just the ones listed in a field's own editor_components) and picks whichever matches first via Immutable Map iteration, whose order isn't guaranteed to follow registration order. That let a {{% highlight %}} block get mistakenly tagged as highlight-raw on parse, which then serialized back out as {{< highlight >}} on save. shortcodePattern now takes an optional bracket argument so highlight only matches %-delimited shortcodes and highlight-raw only matches <-delimited ones, making the two mutually exclusive. Existing callers that omit the argument keep the original bracket-agnostic behavior. --- static/admin/shortcodes.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/static/admin/shortcodes.js b/static/admin/shortcodes.js index ac07624d9..e0bc16486 100644 --- a/static/admin/shortcodes.js +++ b/static/admin/shortcodes.js @@ -12,13 +12,23 @@ return result; } - function shortcodePattern(name) { + function shortcodePattern(name, bracket) { + var open = bracket || "[%<]"; + var close = bracket === "%" ? "%" : bracket === "<" ? ">" : "[%>]"; return new RegExp( - "\\{\\{[%<] " + + "\\{\\{" + + open + + " " + name + - "(?![\\w-])([\\s\\S]*?)[%>]\\}\\}([\\s\\S]*?)\\{\\{[%<] \\/" + + "(?![\\w-])([\\s\\S]*?)" + + close + + "\\}\\}([\\s\\S]*?)\\{\\{" + + open + + " \\/" + name + - " [%>]\\}\\}", + " " + + close + + "\\}\\}", ); } @@ -167,7 +177,7 @@ id: "highlight", label: "Highlight", fields: highlightFields, - pattern: shortcodePattern("highlight"), + pattern: shortcodePattern("highlight", "%"), fromBlock: function (match) { return { type: match[1].trim(), body: match[2].trim() }; }, @@ -182,7 +192,7 @@ id: "highlight-raw", label: "Highlight", fields: highlightFields, - pattern: shortcodePattern("highlight"), + pattern: shortcodePattern("highlight", "<"), fromBlock: function (match) { return { type: match[1].trim(), body: match[2].trim() }; }, From 0a5f41b7fec533d20f86744ef371995ad2125229 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 20:25:25 +0200 Subject: [PATCH 6/8] refactor: Clean up Decap styles --- static/admin/style.css | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/static/admin/style.css b/static/admin/style.css index 2e5726597..648e4507d 100644 --- a/static/admin/style.css +++ b/static/admin/style.css @@ -1,11 +1,3 @@ -[id^="fip-coupon-field-"], -[id^="fip-reduced-ticket-field-"] { - box-sizing: border-box; - display: inline-block; - width: 48%; - vertical-align: top; -} - [class]:has(> [id^="fip-coupon-field-"]), [class]:has(> [id^="fip-reduced-ticket-field-"]) { display: inline-block; @@ -19,11 +11,6 @@ margin-top: 16px !important; } -[id^="fip-coupon-field-"] > div:first-child, -[id^="fip-reduced-ticket-field-"] > div:first-child { - display: none; -} - .o-fip-validity-widget__info { font-size: 0.85rem; color: #6b7280; From 0b81f0d692713c6a87474035ba04c33c964a58f2 Mon Sep 17 00:00:00 2001 From: MoritzWeber Date: Sun, 16 Aug 2026 20:31:02 +0200 Subject: [PATCH 7/8] fix: use $HEAD instead of $BRANCH for FIPGUIDE_BRANCH Netlify's $BRANCH is documented as the git ref checked out for the build, not necessarily a plain branch name. For PR-triggered deploy previews it can resolve to a checkout ref like pull/1156/head, which isn't a real branch Decap's GitHub backend can point to. $HEAD is documented as the actual head branch name from the Git provider, so use that instead. --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 3b5b5017c..40eef66bc 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build] - command = "echo 'resourceDir: /opt/build/cache/resources_cache' >> hugo.yaml && FIPGUIDE_BRANCH=\"$BRANCH\" hugo --gc --minify -b $DEPLOY_PRIME_URL && npx -y pagefind --site public" + command = "echo 'resourceDir: /opt/build/cache/resources_cache' >> hugo.yaml && FIPGUIDE_BRANCH=\"$HEAD\" hugo --gc --minify -b $DEPLOY_PRIME_URL && npx -y pagefind --site public" publish = "public" [build.environment] From d4ff6d8006d8e4310fc3a5fcd78e71853ac6ca0a Mon Sep 17 00:00:00 2001 From: MoritzWeber0 Date: Mon, 17 Aug 2026 23:48:49 +0200 Subject: [PATCH 8/8] feat: Use link widget for booking links too --- static/admin/shortcodes.js | 27 +++++++++++++++++++++++++-- static/admin/style.css | 6 +++--- static/admin/widget.js | 34 +++++++++++++++++----------------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/static/admin/shortcodes.js b/static/admin/shortcodes.js index e0bc16486..9bb077ff0 100644 --- a/static/admin/shortcodes.js +++ b/static/admin/shortcodes.js @@ -446,6 +446,19 @@ }, }, }, + { + name: "booking_data_link", + label: "Booking Platform Link", + widget: "cms-edit-link", + get_value: function (props) { + return String(props.value || "") + .replace(/\/index$/, "") + .trim(); + }, + href: "#/collections/booking/entries/{value}/index", + label_template: "Edit the Booking Platform \u201c{value}\u201d \u2192", + empty_hint: "Select a booking platform above to edit it.", + }, { name: "subtitle", label: "Subtitle", @@ -547,8 +560,10 @@ pattern: dualFormPattern("booking"), fromBlock: function (match) { var p = parseHugoParams(match[1]); + var rawId = p.id ? String(p.id) : ""; return { - id: p.id ? String(p.id) + "/index" : "", + id: rawId ? rawId + "/index" : "", + booking_data_link: rawId, subtitle: String(p.subtitle || ""), "classes.first": String(p["classes.first"] || ""), "classes.second": String(p["classes.second"] || ""), @@ -934,7 +949,15 @@ { name: "validity_data_link", label: "FIP Validity Table", - widget: "fip-validity-link", + widget: "cms-edit-link", + get_value: function (props) { + var slug = props.entry ? props.entry.get("slug") : null; + return slug ? String(slug).replace(/\/[^/]+$/, "") : ""; + }, + href: "#/collections/fip-validity/entries/{value}/validity", + label_template: + "Edit the FIP Validity Table for \u201c{value}\u201d \u2192", + empty_hint: "Save this page first to link its FIP Validity Table.", }, ]; diff --git a/static/admin/style.css b/static/admin/style.css index 648e4507d..17b9f19b8 100644 --- a/static/admin/style.css +++ b/static/admin/style.css @@ -11,17 +11,17 @@ margin-top: 16px !important; } -.o-fip-validity-widget__info { +.o-cms-edit-link__info { font-size: 0.85rem; color: #6b7280; } -.o-fip-validity-widget__info a { +.o-cms-edit-link__info a { color: #3a69c7; font-weight: 600; text-decoration: none; } -.o-fip-validity-widget__info a:hover { +.o-cms-edit-link__info a:hover { text-decoration: underline; } diff --git a/static/admin/widget.js b/static/admin/widget.js index 320bdecec..594cca355 100644 --- a/static/admin/widget.js +++ b/static/admin/widget.js @@ -57,20 +57,24 @@ FipValiditySelectPreview, ); - function FipValidityLinkControl(props) { - var slug = props.entry ? props.entry.get("slug") : null; - var issuerSlug = slug ? slug.replace(/\/[^/]+$/, "") : null; - if (!issuerSlug) { - return h( - "p", - { className: "o-fip-validity-widget__info" }, - "Save this page first to link its FIP Validity Table.", - ); + function CmsEditLinkControl(props) { + var field = props.field; + var getValue = field.get("get_value"); + var hrefTemplate = field.get("href"); + var labelTemplate = field.get("label_template"); + var emptyHint = field.get("empty_hint"); + + var value = String(getValue(props) || ""); + + if (!value) { + return h("p", { className: "o-cms-edit-link__info" }, emptyHint); } - var href = "#/collections/fip-validity/entries/" + issuerSlug + "/validity"; + + var href = hrefTemplate.replace(/\{value\}/g, value); + var label = labelTemplate.replace(/\{value\}/g, value); return h( "p", - { className: "o-fip-validity-widget__info" }, + { className: "o-cms-edit-link__info" }, h( "a", { @@ -90,16 +94,12 @@ window.location.reload(); }, }, - "Edit the FIP Validity Table for \u201c" + issuerSlug + "\u201d \u2192", + label, ), ); } - CMS.registerWidget( - "fip-validity-link", - FipValidityLinkControl, - FipValidityLinkControl, - ); + CMS.registerWidget("cms-edit-link", CmsEditLinkControl, CmsEditLinkControl); CMS.registerEventListener({ name: "preSave",