Skip to main content
Petanque Life

Spelartransfer mellan klubbar och nationer

F03.07 10 features Planned

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