CREATE TABLE IF NOT EXISTS wallets ( id VARCHAR(64) PRIMARY KEY, user_id VARCHAR(64), api_key_id VARCHAR(64), balance DOUBLE NOT NULL DEFAULT 0, gift_balance DOUBLE NOT NULL DEFAULT 0, limit_mode VARCHAR(64) NOT NULL DEFAULT 'finite', currency VARCHAR(16) NOT NULL DEFAULT 'USD', status VARCHAR(64) NOT NULL DEFAULT 'active', total_recharged DOUBLE NOT NULL DEFAULT 0, total_consumed DOUBLE NOT NULL DEFAULT 0, total_refunded DOUBLE NOT NULL DEFAULT 0, total_adjusted DOUBLE NOT NULL DEFAULT 0, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, UNIQUE KEY wallets_user_id_key (user_id), UNIQUE KEY wallets_api_key_id_key (api_key_id), KEY wallets_api_key_id_idx (api_key_id), KEY wallets_user_id_idx (user_id) ); CREATE TABLE IF NOT EXISTS wallet_transactions ( id VARCHAR(64) PRIMARY KEY, wallet_id VARCHAR(64) NOT NULL, category VARCHAR(64) NOT NULL, reason_code VARCHAR(64) NOT NULL, amount DOUBLE NOT NULL, balance_before DOUBLE NOT NULL, balance_after DOUBLE NOT NULL, recharge_balance_before DOUBLE NOT NULL, recharge_balance_after DOUBLE NOT NULL, gift_balance_before DOUBLE NOT NULL, gift_balance_after DOUBLE NOT NULL, link_type VARCHAR(64), link_id VARCHAR(128), operator_id VARCHAR(64), description TEXT, created_at BIGINT NOT NULL, KEY idx_wallet_tx_wallet_created (wallet_id, created_at), KEY idx_wallet_tx_category_created (category, created_at), KEY idx_wallet_tx_reason_created (reason_code, created_at), KEY idx_wallet_tx_link (link_type, link_id), KEY ix_wallet_transactions_operator_id (operator_id) ); CREATE TABLE IF NOT EXISTS wallet_daily_usage_ledgers ( id VARCHAR(64) PRIMARY KEY, wallet_id VARCHAR(64) NOT NULL, billing_date VARCHAR(16) NOT NULL, billing_timezone VARCHAR(64) NOT NULL, total_cost_usd DOUBLE NOT NULL DEFAULT 0, total_requests BIGINT NOT NULL DEFAULT 0, input_tokens BIGINT NOT NULL DEFAULT 0, output_tokens BIGINT NOT NULL DEFAULT 0, cache_creation_tokens BIGINT NOT NULL DEFAULT 0, cache_read_tokens BIGINT NOT NULL DEFAULT 0, first_finalized_at BIGINT, last_finalized_at BIGINT, aggregated_at BIGINT NOT NULL, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, KEY idx_wallet_daily_usage_wallet_date (wallet_id, billing_timezone, billing_date) ); CREATE TABLE IF NOT EXISTS payment_orders ( id VARCHAR(64) PRIMARY KEY, order_no VARCHAR(128) NOT NULL, wallet_id VARCHAR(64) NOT NULL, user_id VARCHAR(64), amount_usd DOUBLE NOT NULL, pay_amount DOUBLE, pay_currency VARCHAR(16), exchange_rate DOUBLE, refunded_amount_usd DOUBLE NOT NULL DEFAULT 0, refundable_amount_usd DOUBLE NOT NULL DEFAULT 0, payment_method VARCHAR(64) NOT NULL, gateway_order_id VARCHAR(128), gateway_response TEXT, status VARCHAR(64) NOT NULL DEFAULT 'pending', created_at BIGINT NOT NULL, paid_at BIGINT, credited_at BIGINT, expires_at BIGINT, UNIQUE KEY uq_payment_orders_order_no (order_no), KEY idx_payment_orders_wallet_created (wallet_id, created_at), KEY idx_payment_orders_user_created (user_id, created_at), KEY idx_payment_orders_status (status), KEY idx_payment_orders_gateway_order_id (gateway_order_id) ); CREATE TABLE IF NOT EXISTS payment_callbacks ( id VARCHAR(64) PRIMARY KEY, payment_order_id VARCHAR(64), payment_method VARCHAR(64) NOT NULL, callback_key VARCHAR(128) NOT NULL, order_no VARCHAR(128), gateway_order_id VARCHAR(128), payload_hash VARCHAR(128), signature_valid TINYINT(1) NOT NULL DEFAULT 0, status VARCHAR(64) NOT NULL DEFAULT 'received', payload TEXT, error_message TEXT, created_at BIGINT NOT NULL, processed_at BIGINT, UNIQUE KEY uq_payment_callbacks_callback_key (callback_key), KEY idx_payment_callbacks_order (order_no), KEY idx_payment_callbacks_gateway_order (gateway_order_id), KEY idx_payment_callbacks_created (created_at), KEY ix_payment_callbacks_payment_order_id (payment_order_id) ); CREATE TABLE IF NOT EXISTS refund_requests ( id VARCHAR(64) PRIMARY KEY, refund_no VARCHAR(128) NOT NULL, wallet_id VARCHAR(64) NOT NULL, user_id VARCHAR(64), payment_order_id VARCHAR(64), source_type VARCHAR(64) NOT NULL, source_id VARCHAR(128), refund_mode VARCHAR(64) NOT NULL, amount_usd DOUBLE NOT NULL, status VARCHAR(64) NOT NULL DEFAULT 'pending_approval', reason TEXT, requested_by VARCHAR(64), approved_by VARCHAR(64), processed_by VARCHAR(64), gateway_refund_id VARCHAR(128), payout_method VARCHAR(64), payout_reference VARCHAR(255), payout_proof TEXT, failure_reason TEXT, idempotency_key VARCHAR(128), created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, processed_at BIGINT, completed_at BIGINT, UNIQUE KEY uq_refund_requests_refund_no (refund_no), UNIQUE KEY uq_refund_requests_idempotency_key (idempotency_key), KEY idx_refund_wallet_created (wallet_id, created_at), KEY idx_refund_user_created (user_id, created_at), KEY idx_refund_status (status), KEY ix_refund_requests_payment_order_id (payment_order_id), KEY ix_refund_requests_requested_by (requested_by), KEY ix_refund_requests_approved_by (approved_by), KEY ix_refund_requests_processed_by (processed_by) ); CREATE TABLE IF NOT EXISTS redeem_code_batches ( id VARCHAR(64) PRIMARY KEY, name VARCHAR(255) NOT NULL, amount_usd DOUBLE NOT NULL, currency VARCHAR(16) NOT NULL DEFAULT 'USD', balance_bucket VARCHAR(64) NOT NULL DEFAULT 'gift', total_count INT NOT NULL, status VARCHAR(64) NOT NULL DEFAULT 'active', description TEXT, created_by VARCHAR(64), expires_at BIGINT, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, KEY idx_redeem_code_batches_status (status, created_at) ); CREATE TABLE IF NOT EXISTS redeem_codes ( id VARCHAR(64) PRIMARY KEY, batch_id VARCHAR(64) NOT NULL, code_hash VARCHAR(128) NOT NULL, code_prefix VARCHAR(16) NOT NULL, code_suffix VARCHAR(16) NOT NULL, status VARCHAR(64) NOT NULL DEFAULT 'active', redeemed_by_user_id VARCHAR(64), redeemed_wallet_id VARCHAR(64), redeemed_payment_order_id VARCHAR(64), redeemed_at BIGINT, disabled_by VARCHAR(64), created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, UNIQUE KEY uq_redeem_codes_code_hash (code_hash), KEY idx_redeem_codes_batch_created (batch_id, created_at), KEY idx_redeem_codes_status (status, updated_at), KEY idx_redeem_codes_redeemed_user (redeemed_by_user_id, redeemed_at), KEY idx_redeem_codes_redeemed_order (redeemed_payment_order_id) );