Spelartransfer mellan klubbar och nationer
At a glance
Player Transfers between clubs and nations is the federation-specific transfer engine layered on top of the generic transfer model — tenant-configurable windows including year-wrapping strict periods, per-season transfer caps that exclude cancelled and rejected requests, multi-step approval chains, federation gatekeeping for ITC with release blocking, quarantine periods set by the receiving federation, FIPJP routing for intercontinental confederation crossings, tenant-configurable fees, and full ITC traceability with dedicated audit and history endpoints.
How it works
Where F03.03 covers the generic transfer model, F03.07 implements the federation-specific configuration surface and the international (ITC) protocol in depth. TransferConfig per tenant defines window_type (always_open, deadline, or strict_period), window_start/window_end as MonthDay (supporting year-wrapping windows like Nov–Jan), deadline date, max_per_season cap, required_approvals chain, exception_conditions that bypass window restrictions, itc_federation_approval_required, itc_competition_eligibility_delay_days, and itc_fee_amount/currency/payer. France caps at 1 transfer per season; Sweden runs always_open with no cap; Germany uses a strict Nov–Dec window with residence-change exceptions.
Intra-national transfer runs through the configured approval chain — old club approves and the workflow advances to pending_new_club; if the old club rejects the transfer terminates with status=rejected. The new club approval is the final step in Sweden (transfer is approved, old ClubMembership becomes EXPIRED, new is created as ACTIVE, License.club_id updates) but advances to pending_federation in France. Cancelled and rejected transfers do not count against the per-season cap.
International transfers follow the ITC protocol: when itc_federation_approval_required is true, the ITC starts in pending_federation_approval; PATCH /itc/{itc_number}/federation-approve advances it to pending_release. The release endpoint is blocked while federation approval is missing. A confederation lookup (~50 countries mapped to CEP, COPAB, CAP, CAPP) auto-detects intercontinental cases — when releasing and receiving federations belong to different confederations, the transfer routes through pending_fipjp instead of released, and PATCH /itc/{itc_number}/fipjp-approve captures FIPJP's decision and reference number. Continental transfers (same confederation) skip FIPJP. Quarantine is set at ITC completion using the receiving federation's itc_competition_eligibility_delay_days (France 30, Germany 15); GET /itc/{itc_number}/eligibility checks competition eligibility for any check_date.
Fees are captured from the releasing federation's TransferConfig at ITC request time; PATCH /itc/{itc_number}/fee/pay records payment. FIPJP forbids fees on the ITC certificate itself, but tenants may charge internal handling fees. Traceability spans GET /itc/history/{player_id} (full ITC history with is_intercontinental, confederation_code, federation_approval_status, fipjp_reference, competition_eligible_from, fee), GET /itc/{itc_number}/audit (per-ITC audit trail), and the unified GET /transfers/history/{player_id} extended with ITC traceability fields.
Key capabilities
- Per-tenant transfer windows including year-wrapping strict periods and exception overrides
- Per-season transfer caps with cancelled/rejected exclusion (France 1, Sweden unlimited)
- Multi-step approval chain with old-club, new-club, and federation steps
- ITC federation gatekeeping with pending_federation_approval status and release blocking
- Confederation auto-detection (CEP, COPAB, CAP, CAPP) and FIPJP routing for intercontinental transfers
- Competition eligibility delay (quarantine) configured by receiving federation
- Per-tenant configurable transfer fees with mark-paid endpoint and full audit trail
In practice
A Brazilian player relocates to Germany and requests an ITC transfer in the DPV tenant. The system looks up confederations — Brazil maps to COPAB, Germany to CEP — and flags the ITC as intercontinental. DPV's TransferConfig has itc_federation_approval_required=true, so the ITC starts in pending_federation_approval; the DPV federation officer reviews and approves, advancing to pending_release.
The Brazilian federation reviews the release request, confirms no outstanding obligations, and releases — but because the case is intercontinental, the status becomes pending_fipjp instead of released. FIPJP reviews and approves with a reference number. The German federation issues the new license; the 15-day competition eligibility delay is set on the ITC.
The player checks GET /itc/{itc_number}/eligibility a week later and is told tournament play is still blocked until the eligibility date. The full chain is queryable via the ITC audit endpoint.
Features in this subsystem
10| ID | Status | Features |
|---|---|---|
| F03.07.01 | Shipped | Per-tenant transferfönster (datum) — Konfigurerbart via TransferConfig.window_type (always_open / deadline / strict_period), window_start/window_end (MonthDay) för strict_period, deadline (MonthDay) för deadline-typ. Stöder årsövergripande fönster (t.ex. Nov–Jan). Undantagsvillkor (exception_conditions) kringgår fönsterrestriktion. Verifierat med 9 integrationstester (always_open, strict_period in/out/wrap, deadline before/after, exception override, per-tenant isolation) — PL-F0307a ✅ PL-F0307a |
| F03.07.02 | Shipped | France — 1 transfer per säsong — TransferConfig.max_per_season=1 för franska federationen. Begränsningen är per spelare per säsong. Cancelled/rejected transfers räknas inte mot gränsen. Annan spelare i samma säsong påverkas inte. Verifierat med 6 integrationstester (first allowed, second blocked, cancelled/rejected don't count, config stored, per-player isolation) — PL-F0307a ✅ PL-F0307a |
| F03.07.03 | Shipped | Sverige — fri transfer utan fönster — TransferConfig.window_type="always_open" utan max_per_season-begränsning. Ingen competition eligibility delay. Spelare kan genomföra flera godkända transfers under samma säsong. Verifierat med 5 integrationstester (always_open config, no max, transfer succeeds, multiple allowed, no delay) — PL-F0307a ✅ PL-F0307a |
| F03.07.04 | Shipped | Avgivande klubb-godkännande — old_club i required_approvals-kedjan. Godkännande avancerar workflow till nästa steg (pending_new_club). Avslag terminerar transfern (status=rejected). Registrerar approver user ID, beslutsdatum och kommentar. Konfigurerbart — kan utelämnas i tenants som inte kräver det. Verifierat med 5 integrationstester (in chain, approve advances, reject blocks, optional in minimal config, user ID recording) — PL-F0307a ✅ PL-F0307a |
| F03.07.05 | Shipped | Mottagande klubb-godkännande — new_club i required_approvals-kedjan. I Sverige: sista steget → transfer godkänns, gammal ClubMembership→EXPIRED, ny ACTIVE skapad, License.club_id uppdaterat. I Frankrike: avancerar till pending_federation. Avslag terminerar transfern. Verifierat med 6 integrationstester (in chain, advances to federation in FR, final step in SE, reject blocks, membership updated, license updated) — PL-F0307a ✅ PL-F0307a |
| F03.07.06 | Shipped | Federation-godkännande för internationell transfer — TransferConfig.itc_federation_approval_required (opt-in, default false). När aktivt: ITC startar i pending_federation_approval-status. PATCH /itc/{itc_number}/federation-approve godkänner/avvisar internt. Godkännande → pending_release. Avslag → rejected. Release-endpoint blockeras medan federation-godkännande saknas. Audit trail inkluderar federation_approved/federation_rejected. Verifierat med 7 integrationstester (approval required/not required, approve advances, reject blocks, release blocked, double approve rejected, audit trail) — PL-F0307b ✅ PL-F0307b |
| F03.07.07 | Shipped | Karantänsperiod för internationell transfer — TransferConfig.itc_competition_eligibility_delay_days (t.ex. France: 30 dagar, Deutschland: 15 dagar). Sätts vid ITC-komplettering baserat på MOTTAGANDE federationens config. competition_eligible_from datum lagras på ITC. GET /itc/{itc_number}/eligibility kontrollerar tävlingsbehörighet med valfritt check_date. Verifierat med 4 integrationstester (quarantine set, no quarantine, during quarantine, after quarantine) — PL-F0307b ✅ PL-F0307b |
| F03.07.08 | Shipped | ITC via FIPJP (interkontinentala transfers) — Konfederationsmappning för ~50 länder (CEP, COPAB, CAP, CAPP). is_intercontinental auto-detekteras när konfederationer skiljer sig. Interkontinentala transfers: release → pending_fipjp istället för released. PATCH /itc/{itc_number}/fipjp-approve — FIPJP godkänner/avvisar med referensnummer. Kontinentala (samma konfederation) transfers släpps direkt. Verifierat med 8 integrationstester (confederation lookup, intercontinental detection, FIPJP required, approve/reject, non-intercontinental blocked, continental skip) — PL-F0307b ✅ PL-F0307b |
| F03.07.09 | Shipped | Transferhistorik och spårbarhet — GET /itc/history/{player_id} med komplett ITC-historik inkl. alla spårbarhetsfält (is_intercontinental, confederation_code, federation_approval_status, fipjp_reference, competition_eligible_from, fee). Valfri include_audit=true för full audit trail per ITC. GET /itc/{itc_number}/audit för dedikerad audit trail. Enhetlig GET /transfers/history/{player_id} utökad med ITC-spårbarhetsfält. Verifierat med 6 integrationstester (history, traceability fields, audit trail, unified history, pagination) — PL-F0307b ✅ PL-F0307b |
| F03.07.10 | Shipped | Avgift per transfer (per tenant konfigurerbar) — TransferConfig.itc_fee_amount/itc_fee_currency/itc_fee_payer. Avgift fångas från avgivande federationens config vid ITC-förfrågan. PATCH /itc/{itc_number}/fee/pay markerar betald. GET /itc/{itc_number}/fee returnerar avgiftsdetaljer. FIPJP förbjuder avgifter på själva ITC-certifikatet men nationella förbund kan ta interna handläggningsavgifter. Verifierat med 7 integrationstester (fee captured, no fee, mark paid, no fee 400, idempotent, audit trail, DE config) — PL-F0307b ✅ PL-F0307b |