trading-platform-database/ddl/schemas/financial/tables/08-wallet_limits.sql

102 lines
4.3 KiB
SQL

-- =====================================================
-- ORBIQUANT IA - WALLET LIMITS TABLE
-- =====================================================
-- Description: Configurable limits and thresholds for wallets
-- Schema: financial
-- =====================================================
-- Separado de wallets para permitir límites más complejos
-- y dinámicos basados en plan, nivel de verificación, etc.
-- =====================================================
CREATE TABLE financial.wallet_limits (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Wallet o configuración global
wallet_id UUID REFERENCES financial.wallets(id) ON DELETE CASCADE,
wallet_type financial.wallet_type, -- Para límites por tipo de wallet
subscription_plan financial.subscription_plan, -- Para límites por plan
-- Límites de transacción única
min_deposit DECIMAL(15,2),
max_deposit DECIMAL(15,2),
min_withdrawal DECIMAL(15,2),
max_withdrawal DECIMAL(15,2),
min_transfer DECIMAL(15,2),
max_transfer DECIMAL(15,2),
-- Límites periódicos
daily_deposit_limit DECIMAL(15,2),
daily_withdrawal_limit DECIMAL(15,2),
daily_transfer_limit DECIMAL(15,2),
weekly_deposit_limit DECIMAL(15,2),
weekly_withdrawal_limit DECIMAL(15,2),
weekly_transfer_limit DECIMAL(15,2),
monthly_deposit_limit DECIMAL(15,2),
monthly_withdrawal_limit DECIMAL(15,2),
monthly_transfer_limit DECIMAL(15,2),
-- Límites de volumen
max_pending_transactions INTEGER,
max_daily_transaction_count INTEGER,
-- Balance limits
min_balance DECIMAL(15,2) DEFAULT 0,
max_balance DECIMAL(15,2),
-- Moneda de los límites
currency financial.currency_code NOT NULL DEFAULT 'USD',
-- Prioridad (mayor número = mayor prioridad)
priority INTEGER DEFAULT 0,
-- Vigencia
active BOOLEAN DEFAULT true,
valid_from TIMESTAMPTZ DEFAULT NOW(),
valid_to TIMESTAMPTZ,
-- Metadata
description TEXT,
metadata JSONB DEFAULT '{}',
-- Timestamps
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- Constraints
CONSTRAINT wallet_or_type_or_plan CHECK (
(wallet_id IS NOT NULL AND wallet_type IS NULL AND subscription_plan IS NULL) OR
(wallet_id IS NULL AND wallet_type IS NOT NULL AND subscription_plan IS NULL) OR
(wallet_id IS NULL AND wallet_type IS NULL AND subscription_plan IS NOT NULL)
),
CONSTRAINT positive_limits CHECK (
(min_deposit IS NULL OR min_deposit > 0) AND
(max_deposit IS NULL OR max_deposit > 0) AND
(min_withdrawal IS NULL OR min_withdrawal > 0) AND
(max_withdrawal IS NULL OR max_withdrawal > 0) AND
(min_transfer IS NULL OR min_transfer > 0) AND
(max_transfer IS NULL OR max_transfer > 0)
),
CONSTRAINT min_max_deposit CHECK (min_deposit IS NULL OR max_deposit IS NULL OR min_deposit <= max_deposit),
CONSTRAINT min_max_withdrawal CHECK (min_withdrawal IS NULL OR max_withdrawal IS NULL OR min_withdrawal <= max_withdrawal),
CONSTRAINT min_max_transfer CHECK (min_transfer IS NULL OR max_transfer IS NULL OR min_transfer <= max_transfer),
CONSTRAINT valid_dates_order CHECK (valid_to IS NULL OR valid_to > valid_from)
);
-- Indexes
CREATE INDEX idx_wl_wallet_id ON financial.wallet_limits(wallet_id) WHERE wallet_id IS NOT NULL;
CREATE INDEX idx_wl_wallet_type ON financial.wallet_limits(wallet_type) WHERE wallet_type IS NOT NULL;
CREATE INDEX idx_wl_subscription_plan ON financial.wallet_limits(subscription_plan) WHERE subscription_plan IS NOT NULL;
CREATE INDEX idx_wl_active ON financial.wallet_limits(active, priority DESC) WHERE active = true;
CREATE INDEX idx_wl_valid_period ON financial.wallet_limits(valid_from, valid_to)
WHERE active = true AND (valid_to IS NULL OR valid_to > NOW());
-- Comments
COMMENT ON TABLE financial.wallet_limits IS 'Configurable transaction limits for wallets';
COMMENT ON COLUMN financial.wallet_limits.wallet_id IS 'Specific wallet (takes highest priority)';
COMMENT ON COLUMN financial.wallet_limits.wallet_type IS 'Limits for all wallets of this type';
COMMENT ON COLUMN financial.wallet_limits.subscription_plan IS 'Limits based on subscription plan';
COMMENT ON COLUMN financial.wallet_limits.priority IS 'Higher number = higher priority when multiple limits apply';
COMMENT ON COLUMN financial.wallet_limits.currency IS 'Currency for all limit amounts';