- Add 01-schema.sql: Create commissions schema - Add 02-tables.sql: commission_schemes, commission_assignments, commission_entries, commission_periods - Add 03-functions.sql: calculate_commission(), close_period() - Add 04-triggers.sql: Auto-calculate on insert, prevent double-counting - Add 05-indexes.sql: Performance indexes for queries - Add 06-seed.sql: Sample commission schemes Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
124 lines
4.8 KiB
SQL
124 lines
4.8 KiB
SQL
-- ============================================
|
|
-- TEMPLATE-SAAS: Commissions Indexes
|
|
-- Version: 1.0.0
|
|
-- Module: SAAS-020
|
|
-- ============================================
|
|
|
|
-- ============================================
|
|
-- Schemes Indexes
|
|
-- ============================================
|
|
-- Primary tenant isolation
|
|
CREATE INDEX idx_schemes_tenant ON commissions.schemes(tenant_id);
|
|
|
|
-- Active schemes lookup
|
|
CREATE INDEX idx_schemes_active ON commissions.schemes(tenant_id, is_active)
|
|
WHERE is_active = TRUE AND deleted_at IS NULL;
|
|
|
|
-- Scheme type filtering
|
|
CREATE INDEX idx_schemes_type ON commissions.schemes(tenant_id, type);
|
|
|
|
-- Soft delete filter
|
|
CREATE INDEX idx_schemes_not_deleted ON commissions.schemes(tenant_id)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
-- ============================================
|
|
-- Assignments Indexes
|
|
-- ============================================
|
|
-- Primary tenant isolation
|
|
CREATE INDEX idx_assignments_tenant ON commissions.assignments(tenant_id);
|
|
|
|
-- User assignments lookup (common query)
|
|
CREATE INDEX idx_assignments_user ON commissions.assignments(tenant_id, user_id)
|
|
WHERE is_active = TRUE;
|
|
|
|
-- Scheme assignments lookup
|
|
CREATE INDEX idx_assignments_scheme ON commissions.assignments(tenant_id, scheme_id)
|
|
WHERE is_active = TRUE;
|
|
|
|
-- Active assignments with date range
|
|
CREATE INDEX idx_assignments_active_period ON commissions.assignments(tenant_id, user_id, starts_at, ends_at)
|
|
WHERE is_active = TRUE;
|
|
|
|
-- Find current active assignment for user
|
|
CREATE INDEX idx_assignments_user_current ON commissions.assignments(user_id, scheme_id, starts_at DESC)
|
|
WHERE is_active = TRUE AND (ends_at IS NULL OR ends_at > NOW());
|
|
|
|
-- ============================================
|
|
-- Entries Indexes
|
|
-- ============================================
|
|
-- Primary tenant isolation
|
|
CREATE INDEX idx_entries_tenant ON commissions.entries(tenant_id);
|
|
|
|
-- User entries (for my-earnings queries)
|
|
CREATE INDEX idx_entries_user ON commissions.entries(tenant_id, user_id);
|
|
CREATE INDEX idx_entries_user_status ON commissions.entries(tenant_id, user_id, status);
|
|
|
|
-- Status filtering (pending approvals queue)
|
|
CREATE INDEX idx_entries_status ON commissions.entries(tenant_id, status);
|
|
CREATE INDEX idx_entries_pending ON commissions.entries(tenant_id, created_at)
|
|
WHERE status = 'pending';
|
|
|
|
-- Period association
|
|
CREATE INDEX idx_entries_period ON commissions.entries(period_id)
|
|
WHERE period_id IS NOT NULL;
|
|
|
|
-- Reference lookups (find commission for a sale)
|
|
CREATE INDEX idx_entries_reference ON commissions.entries(tenant_id, reference_type, reference_id);
|
|
|
|
-- Date range queries (reporting)
|
|
CREATE INDEX idx_entries_created ON commissions.entries(tenant_id, created_at DESC);
|
|
CREATE INDEX idx_entries_paid ON commissions.entries(tenant_id, paid_at)
|
|
WHERE paid_at IS NOT NULL;
|
|
|
|
-- Scheme attribution
|
|
CREATE INDEX idx_entries_scheme ON commissions.entries(scheme_id)
|
|
WHERE scheme_id IS NOT NULL;
|
|
|
|
-- Dashboard: pending commissions by user
|
|
CREATE INDEX idx_entries_user_pending ON commissions.entries(user_id, commission_amount DESC)
|
|
WHERE status = 'pending';
|
|
|
|
-- Dashboard: approved commissions awaiting payment
|
|
CREATE INDEX idx_entries_approved_unpaid ON commissions.entries(tenant_id, approved_at)
|
|
WHERE status = 'approved' AND paid_at IS NULL;
|
|
|
|
-- ============================================
|
|
-- Periods Indexes
|
|
-- ============================================
|
|
-- Primary tenant isolation
|
|
CREATE INDEX idx_periods_tenant ON commissions.periods(tenant_id);
|
|
|
|
-- Status filtering
|
|
CREATE INDEX idx_periods_status ON commissions.periods(tenant_id, status);
|
|
|
|
-- Open period lookup (common query)
|
|
CREATE INDEX idx_periods_open ON commissions.periods(tenant_id, starts_at)
|
|
WHERE status = 'open';
|
|
|
|
-- Date range queries
|
|
CREATE INDEX idx_periods_dates ON commissions.periods(tenant_id, starts_at, ends_at);
|
|
|
|
-- Period history
|
|
CREATE INDEX idx_periods_closed ON commissions.periods(tenant_id, closed_at DESC)
|
|
WHERE status IN ('closed', 'processing', 'paid');
|
|
|
|
-- ============================================
|
|
-- Composite indexes for common queries
|
|
-- ============================================
|
|
|
|
-- Dashboard: earnings by user in date range
|
|
CREATE INDEX idx_entries_earnings_dashboard ON commissions.entries(tenant_id, user_id, status, created_at)
|
|
WHERE status NOT IN ('rejected', 'cancelled');
|
|
|
|
-- Period summary calculation
|
|
CREATE INDEX idx_entries_period_summary ON commissions.entries(period_id, status, commission_amount)
|
|
WHERE status IN ('pending', 'approved');
|
|
|
|
-- Top earners query
|
|
CREATE INDEX idx_entries_top_earners ON commissions.entries(tenant_id, user_id, commission_amount DESC, created_at)
|
|
WHERE status NOT IN ('rejected', 'cancelled');
|
|
|
|
-- User's active scheme with rate
|
|
CREATE INDEX idx_assignments_user_scheme ON commissions.assignments(user_id, scheme_id, custom_rate)
|
|
WHERE is_active = TRUE;
|