Transfers
En bref
Transfers handle player movement between clubs (intra-national, single tenant) and between federations (international, cross-tenant). Every dimension — transfer windows, max-per-season limits, approval chains, active-league quarantine, carta-de-libertad release letters, post-transfer eligibility delays, escalation paths, and exception conditions — is tenant-configurable, and international transfers run through the FIPJP ITC protocol over public peer-to-peer APIs between national tenants with full embedded audit trails.
Comment ça fonctionne
A transfer request is initiated by the player or new club, then routed through a tenant-defined approval chain whose steps may include the player, old club, new club, district/region, and federation. Each tenant's transfer_config defines a window_type (always_open, deadline, or strict_period), a max-per-season limit (Sweden caps at 2; many others are unlimited), an outstanding-obligations check (Sweden blocks for up to 2 years on unpaid fees; sanctions always block), and optional carta-de-libertad / release-letter requirements. A separate quarantine flag prevents transfers while a tenant-scoped league season is active (e.g. Denmark Landsturneringen). Cross-region/cross-district moves can require additional approval (Spain: autonomous federation; France: inter-comité mutation).
When all approval steps complete, the system updates the old ClubMembership to EXPIRED, creates a new ACTIVE membership, and updates License.club_id to the new club. A configurable post-transfer competition-eligibility delay (France: ~30 days délai de carence) holds the player out of competitions in the new club for the configured period — distinct from the active-league quarantine. If any step rejects, the player can escalate to the next OrgNode level via the configured escalation path; tenants may also grant exception conditions (Germany: Wohnsitzwechsel) that bypass window restrictions when documented and federation-approved.
International transfers follow the FIPJP ITC protocol over public cross-tenant APIs: the player requests in the new nation, the new tenant calls the old tenant's public API to verify the current license, an ITC request is sent, the old tenant reviews and approves or rejects, the existing license is marked transferred-out, and the new tenant issues a license for the current season — enforcing one-nation-per-season at the data layer. Transfer fees are configurable per tenant (who pays, how much, currency) although FIPJP forbids fees on the ITC certificate itself. Every transfer carries an embedded TransferAuditEntry list with action, performer, timestamp, and status transitions, exposed through GET /transfers/{id}/audit. A unified per-player transfer history covers all clubs, all nations, and all seasons.
Capacités clés
- Intra-national and international (cross-tenant) transfer workflows
- Tenant-configurable window types, max-per-season limits, and approval chains
- Outstanding-obligations and active-sanction blocking with configurable lookback
- Carta-de-libertad / release-letter submit-verify-reject workflow
- ITC generation and verification over public peer-to-peer APIs between tenants
- Post-transfer competition-eligibility delay and active-league quarantine
- Refusal escalation, exception conditions, and full embedded audit trail
En pratique
A French player wants to move from JS Marseille to AS Lyon mid-season. The system checks the FFPJP transfer window — closed — and surfaces the option to request an exception. The player files for inter-comité mutation; the request enters the configured chain: old club approves, new club approves, comité 13 approves, comité 69 approves, then the FFPJP signs off.
The system updates ClubMembership records, moves the license to AS Lyon, and sets a 30-day délai de carence. The player sees the new club affiliation in their profile but is blocked from entering competitions for AS Lyon until the eligibility date. The full chain — every approver, timestamp, and comment — is queryable via the audit endpoint, and the player's transfer history now lists both clubs against the 2026 season.
Fonctionnalités de ce sous-système
19| ID | Status | Fonctionnalités |
|---|---|---|
| F03.03.01 | Livré | Intra-national club transfer (OrgNode change within same tenant) — PL-F0303a ✅ PL-F0303a |
| F03.03.02 | Livré | International transfer (cross-tenant, nation to nation via public APIs) — PL-F0303a ✅ PL-F0303a |
| F03.03.03 | Livré | Configurable transfer window per tenant — open period (Germany: Nov-Dec), free period before deadline (Sweden), or always open (Denmark). Tenant admin configures. — PL-F0303a ✅ PL-F0303a |
| F03.03.04 | Livré | Configurable transfer approval workflow per tenant — who must approve (player, old club, new club, federation, district/region). Each step configurable. — PL-F0303a ✅ PL-F0303a |
| F03.03.05 | Livré | Max transfers per season — configurable limit per tenant (Sweden: 2, others: unlimited) — PL-F0303a ✅ PL-F0303a |
| F03.03.06 | Livré | Transfer quarantine during active league — configurable: player cannot transfer while league season is active (Denmark Landsturneringen). Tenant-scoped league check. — PL-F0303b ✅ PL-F0303b |
| F03.03.07 | Livré | Cross-region/cross-district transfer — additional approval required when transferring between OrgNode subtrees (Spain: autonomous federation approval, France: inter-comité mutation). Configurable approval type per tenant. — PL-F0303b ✅ PL-F0303b |
| F03.03.08 | Livré | Outstanding obligations check — system blocks transfer if player has unpaid fees/active sanctions. Configurable blocking period (Sweden: max 2 years). Sanctions always checked. — PL-F0303b ✅ PL-F0303b |
| F03.03.09 | Livré | Carta de libertad / release letter — some nations require formal release document from departing club. Configurable per tenant. Submit/verify/reject workflow. — PL-F0303b ✅ PL-F0303b |
| F03.03.10 | Livré | ITC generation and verification via public API (peer-to-peer between tenants). Verify endpoint validates authenticity and status. — PL-F0303b ✅ PL-F0303b |
| F03.03.11 | Livré | ITC workflow: player requests in new nation → new nation verifies license status via public API → sends ITC request → old nation reviews and approves/rejects → license marked "transferred out" → new nation issues license — PL-F0303c ✅ PL-F0303c |
| F03.03.12 | Livré | Transfer fee handling — configurable per tenant (who pays, amount) — PL-F0303c ✅ PL-F0303c |
| F03.03.13 | Livré | Transfer history per player (all clubs, all nations, all seasons) — PL-F0303c ✅ PL-F0303c |
| F03.03.14 | Livré | One-nation-per-season validation on international transfer — PL-F0303c ✅ PL-F0303c |
| F03.03.15 | Livré | Post-transfer competition eligibility delay — configurable per tenant (France: délai de carence ~30 days after mutation before player is competition-eligible in new club). Distinct from transfer quarantine (F03.03.06). — PL-F0303c ✅ PL-F0303c |
| F03.03.16 | Livré | Transfer refusal appeal/escalation — when a step in the transfer workflow is rejected (e.g., old club refuses), player can escalate to higher OrgNode level (France: appeal to comité départemental). Configurable escalation path per tenant. — PL-F0303d ✅ PL-F0303d |
| F03.03.17 | Livré | Transfer exception conditions — configurable per tenant: allow transfer outside normal window if specific conditions are met (Germany: Wohnsitzwechsel/residence change). Exception must be documented and approved by federation. — PL-F0303d ✅ PL-F0303d |
| F03.03.18 | Livré | Multi-club membership toggle — configurable per tenant: some nations allow support membership in multiple clubs (Sweden), others forbid all multi-club affiliation (France: double appartenance interdit). — PL-F0303d ✅ PL-F0303d |
| F03.03.19 | Livré | Audit trail on all transfers — embedded TransferAuditEntry list with action, performer, timestamp, status transitions. Audit endpoint GET /transfers/{id}/audit. — PL-F0303d ✅ PL-F0303d |