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:
- Načte aktivní tiery seřazené podle rank DESC.
- Pro každý tier zkontroluje všechny requirement podmínky (AND-ed):
total_deposited >=,total_wagered >=, dny odfirst_seen_at >=. - Highest matched rank vyhrává.
Všechny prahy jsou currency-aware — lifetime_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).