33 lines
1.5 KiB
MySQL
33 lines
1.5 KiB
MySQL
|
|
-- Refund architecture for AI credits (Task 5)
|
||
|
|
-- Tracks refunds for failed or disputed AI credit charges
|
||
|
|
|
||
|
|
BEGIN;
|
||
|
|
|
||
|
|
CREATE TABLE ai_refunds (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
ledger_debit_entry_id UUID NOT NULL REFERENCES ai_credit_ledger(id),
|
||
|
|
credits_refunded INT NOT NULL CHECK (credits_refunded > 0),
|
||
|
|
reason VARCHAR(50) NOT NULL CHECK (reason IN ('provider_failure', 'timeout', 'validation_failure', 'manual', 'user_dispute')),
|
||
|
|
initiated_by VARCHAR(20) NOT NULL CHECK (initiated_by IN ('system', 'admin', 'user_dispute')),
|
||
|
|
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected', 'completed')),
|
||
|
|
notes TEXT,
|
||
|
|
admin_actor_id UUID REFERENCES users(id),
|
||
|
|
idempotency_key VARCHAR(150) UNIQUE,
|
||
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
|
|
resolved_at TIMESTAMPTZ,
|
||
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Indexes for common queries
|
||
|
|
CREATE INDEX idx_ai_refunds_user_id ON ai_refunds(user_id);
|
||
|
|
CREATE INDEX idx_ai_refunds_status ON ai_refunds(status);
|
||
|
|
CREATE INDEX idx_ai_refunds_ledger_entry ON ai_refunds(ledger_debit_entry_id);
|
||
|
|
CREATE INDEX idx_ai_refunds_created_at ON ai_refunds(created_at DESC);
|
||
|
|
|
||
|
|
-- Add entry_type for refunds to ai_credit_ledger (if not exists)
|
||
|
|
-- The existing entry_type column should support 'refund' values
|
||
|
|
-- No schema change needed - just ensure application uses 'refund' entry_type
|
||
|
|
|
||
|
|
COMMIT;
|