License Management
At a glance
License Management is the operational core for issuing, renewing, verifying, suspending, and revoking player licenses across every national federation. It supports fully configurable license types per tenant, composite fee calculation summed across OrgNode levels, digital QR-based license cards, multi-discipline scoping, medical-certificate validation, bulk operations through the admin UI, and a complete audit trail covering every license-state transition.
How it works
Each tenant (national federation) defines its own LicenseType catalogue — Sweden runs a single type, France runs four (Compétition, Loisir, Jeune, Découverte). Every type carries flags for competition eligibility, insurance inclusion, age limits, duration, renewability, medical-certificate requirements, parental consent, and discipline scope (petanque, jeu provençal, sport-boules, bocce, raffa). When a club submits a license application on behalf of a player, the workflow runs through draft, submitted, under-review, and approved states. On approval, the system generates a license number using the federation's configurable prefix and sequence format, computes the composite fee by summing components set at federation, ligue/region, comité/district, and insurance levels, and issues a digital license card carrying the FIPJP symbol where required.
The system enforces a one-license-per-nation-per-season constraint at the database layer through a unique index on tenant + license_number + discipline, while still allowing the same player to hold parallel licenses across disciplines. Seasons are configurable per tenant (calendar year by default, split year supported). Renewal runs in two modes: per-player and bulk; a configurable grace period allows late renewals before the previous season's license is considered expired. Medical certificates follow a tenant-configurable cycle (e.g. France: every three years with annual self-declaration), with upload, expiry tracking, and validation embedded in the application flow.
Verification happens via QR-code scan at events and via a public cross-tenant API used by foreign federations to validate visiting players. Suspension and revocation are restricted to the federation level — clubs and districts cannot revoke. Unauthorized-player penalties are configurable per tenant (Sweden defaults to 13–0 forfeit, 5 000 SEK fine, and exclusion from the next equivalent event). Bulk import from legacy systems and complete audit trail on every change round out the lifecycle. The admin UI (LicenseList + LicenseDetail) gives federation staff filterable views, mass operations, CSV export, bulk renewal, and BulkEmailComposer for member outreach.
Key capabilities
- Configurable license types per tenant with discipline scoping and unique-per-discipline constraint
- Composite fee calculation across federation, ligue, comité, and insurance components
- Digital and physical license cards with QR verification and FIPJP symbol
- Annual renewal (individual and bulk) with configurable grace period and season model
- Medical certificate management with renewal cycles and self-declaration workflows
- License suspension, revocation, and unauthorized-player penalty enforcement
- Full license history per player across clubs, federations, and seasons with audit trail
In practice
A French club secretary opens the admin LicenseList, filters on season 2026 and status not-renewed, and selects 47 members for bulk renewal. The system recalculates each composite fee (part fédérale + part ligue PACA + part comité 13 + assurance), validates that medical certificates remain inside the three-year cycle (prompting self-declaration where allowed), and creates 47 LicenseApplication records routed through the comité→ligue→FFPJP approval chain. Once approved, license numbers are minted with the FFPJP prefix, digital cards with QR codes are pushed to each player's account, and a Stripe charge is sent to the club.
A regional referee later scans one of the QR codes at a tournament and the public verification API confirms the license is active.
Features in this subsystem
22| ID | Status | Features |
|---|---|---|
| F03.01.01 | Shipped | Configurable license types per tenant — each federation defines its own types (e.g., Sweden: 1 type; France: compétition, loisir, jeune, découverte). Each type has: competition eligibility, insurance inclusion, age limits, duration, renewability ✅ PL-F0301a |
| F03.01.02 | Shipped | License application workflow (club applies on behalf of player → federation reviews → approves → issues) ✅ PL-F0301a |
| F03.01.03 | Shipped | License numbering system (federation prefix + sequential, configurable format per tenant) ✅ PL-F0301a |
| F03.01.04 | Shipped | Annual license renewal (individual and bulk), season configurable per tenant (calendar year default) ✅ PL-F0301a |
| F03.01.05 | Shipped | Composite license fee calculation — fee = sum of configurable components (e.g., part fédérale + part ligue/region + part comité/district + assurance). Each component set at its OrgNode level. Supports regional price variation (France, Spain) ✅ PL-F0301a |
| F03.01.06 | Shipped | License card generation (digital + physical), with FIPJP symbol where required — PL-F0301b ✅ PL-F0301b |
| F03.01.07 | Shipped | License verification — QR code scan at events, public API for cross-tenant verification — PL-F0301b ✅ PL-F0301b |
| F03.01.08 | Shipped | License history tracking (all clubs, all federations, all years) — PL-F0301b ✅ PL-F0301b |
| F03.01.09 | Shipped | License suspension and revocation — only federation can decide (not club/district). Administrative fee configurable. — PL-F0301b ✅ PL-F0301b |
| F03.01.10 | Shipped | Time-limited license type — e.g., France's "licence découverte" (max 3 months, one-time only per player) — PL-F0301b ✅ PL-F0301b |
| F03.01.11 | Shipped | Grace period management for late renewals — PL-F0301c ✅ PL-F0301c |
| F03.01.12 | Shipped | Bulk license import from legacy systems — PL-F0301c ✅ PL-F0301c |
| F03.01.13 | Shipped | Audit trail on all license changes — PL-F0301c ✅ PL-F0301c |
| F03.01.14 | Shipped | One-license-per-nation-per-season enforcement (system-level constraint) — PL-F0301c ✅ PL-F0301c |
| F03.01.15 | Shipped | Season management (configurable per federation — calendar year, split year, etc.) — PL-F0301c ✅ PL-F0301c |
| F03.01.16 | Shipped | Medical certificate management — configurable per tenant: required at first license (France), renewal cycle (every 3 years), digital attestation sur l'honneur for annual renewal, upload/expiry tracking — PL-F0301d ✅ PL-F0301d |
| F03.01.17 | Shipped | License insurance declaration (licensförsäkran) — allows unlicensed player to participate if club has fulfilled obligations and player signs declaration (Sweden-specific but configurable) — PL-F0301d ✅ PL-F0301d |
| F03.01.18 | Shipped | International license issuance — member can request international license + health certificate for play abroad (required in France etc.) — PL-F0301d ✅ PL-F0301d |
| F03.01.19 | Shipped | Foreign license verification — player with foreign license can participate in national events by presenting valid license from issuing federation — PL-F0301d ✅ PL-F0301d |
| F03.01.20 | Shipped | Unauthorized player enforcement — configurable penalties per tenant (e.g., Sweden: 13-0 forfeit + 5000 SEK fine + exclusion from next year's equivalent event) — PL-F0301d ✅ PL-F0301d |
| F03.01.21 | Shipped | Multi-discipline license support — License.discipline field scopes each license to one discipline (petanque, jeu_provencal, sport_boules, bocce, raffa). Unique index (tenant, license_number, discipline). LicenseType.discipline determines which discipline a license type covers. Auto-propagation: discipline copied from LicenseType to License on creation, auto-added to PlayerProfile.disciplines. Duplicate check scoped by discipline — same player can hold licenses for different disciplines in same season. — PL-T013 ✅ PL-T013 |
| F03.01.22 | Shipped | Admin UI för licenshantering — LicenseList med filter (säsong, typ, status, klubb, fritext), massoperationer (godkänn/avslå/påminnelse), CSV-export (UTF-8 BOM), LicenseDetail med audit-tidslinje, bulk-renewal för nästa säsong, massutskick via BulkEmailComposer — PL-T058 ✅ PL-T058 |
Stakeholders who need this subsystem
Surfaces in 5 stakeholder analyses