Přeskočit na hlavní obsah

VIP tier engine

Operátorem definovaný tier žebřík s auto-promocí podle lifetime activity. Default seed: Bronze → Silver → Gold → Platinum.

Tier shape

{
"code": "gold", // lowercase, alphanumeric_underscore
"name": "Gold",
"rank": 2, // ordering: 0 = baseline
"color": "#FFD700", // hex pro badge
"glyph": "★★★", // unicode badge
"requirements": {
"lifetime_deposit_subunit": 500000, // €5000
"lifetime_wagered_subunit": 2500000, // €25000
"min_days_active": 14
},
"demotion": { "inactivity_days": 60 }, // null = sticky tier
"perks": {
"cashback_pct": 5,
"dedicated_host": true,
"priority_kyc": true
},
"is_active": true
}

Requirements + perks jsou operator-defined; casinocrm.io nevynucuje konkrétní hodnoty, jen strukturní shape.

Auto-promotion

recomputeTierForPlayer(tenantId, playerId) vyhodnotí eligibility:

  1. Načte aktivní tiery seřazené podle rank DESC.
  2. Pro každý tier zkontroluje všechny requirement podmínky (AND-ed): total_deposited >=, total_wagered >=, dny od first_seen_at >=.
  3. Highest matched rank vyhrává.

Všechny prahy jsou currency-awarelifetime_deposit_subunit je denominovaný v base měně tenanta a players.total_deposited je už udržovaný v base stream-processorem. Žádná FX matematika at evaluation.

Demotion

Per-tier demotion pravidla (demotion.inactivity_days). Pokud aktuální tier hráče má demotion pravidlo + překročili inactivity okno, drop o jeden tier (ne celou cestu na baseline — concierge model).

reconcileTierDemotions běží denně jako cron-able skript.

Manual override

POST /v1/players/:id/tier { to_code: "platinum", reason: "VIP host invitation" } zapíše history entry s trigger=manual. Užitečné pro concierge promoce, kde operátor chce někoho v Platinum bez splnění auto thresholds.

Další auto-recompute respektuje override: pokud hráč STÁLE nesplňuje Platinum thresholds, manual tier se drží. Auto path mění tiery jen když eligibility computation říká, že má.

History

player_tier_history — append-only audit:

SELECT from_code, to_code, trigger, occurred_at
FROM player_tier_history
WHERE player_id = $1
ORDER BY occurred_at DESC
LIMIT 50;

trigger je auto (engine), manual (admin), nebo reset (one-time backfill).

Události

Engine přímo nevysílá události; tier změny se objeví v player_tier_history. Future enhancement: vysílat tier_promoted / tier_demoted kanonické události pro journey triggery.

Stream-processor wiring

Per-event tier recompute je odložený v MVP — používáme denní reconciliation cron + on-demand admin recompute přes POST /v1/players/:id/tier. Operátoři, co potřebují real-time, mohou flipnout per-event volání nastavením RECOMPUTE_TIER_ON_EVENT=1 v stream-processor envu (přidá ~5ms HTTP latence per money event).