0c07812ecc
Adds nullable FK campaign_id to referral_earnings table, enabling direct campaign ROI analytics without JOINing through registrations. - Model: campaign_id column + AdvertisingCampaign relationship - CRUD: get_user_campaign_id() helper, campaign_id param in create_referral_earning - Service: resolve campaign_id in all earning creation paths - Cabinet API: campaign_name in earnings response - Migration 0002: add column + deterministic backfill via DISTINCT ON