template-saas-database-v2/ddl/schemas/commissions/04-rls.sql
Adrian Flores Cortes 8915b7ce71 [SAAS-020] feat: Add Commissions DDL schema
- 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>
2026-01-24 22:51:06 -06:00

123 lines
4.5 KiB
SQL

-- ============================================
-- TEMPLATE-SAAS: Commissions Row Level Security
-- Version: 1.0.0
-- Module: SAAS-020
-- ============================================
-- ============================================
-- Enable RLS on all tables
-- ============================================
ALTER TABLE commissions.schemes ENABLE ROW LEVEL SECURITY;
ALTER TABLE commissions.assignments ENABLE ROW LEVEL SECURITY;
ALTER TABLE commissions.entries ENABLE ROW LEVEL SECURITY;
ALTER TABLE commissions.periods ENABLE ROW LEVEL SECURITY;
-- ============================================
-- Schemes Policies
-- ============================================
CREATE POLICY schemes_tenant_isolation ON commissions.schemes
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY schemes_insert ON commissions.schemes
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY schemes_update ON commissions.schemes
FOR UPDATE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY schemes_delete ON commissions.schemes
FOR DELETE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- ============================================
-- Assignments Policies
-- ============================================
CREATE POLICY assignments_tenant_isolation ON commissions.assignments
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY assignments_insert ON commissions.assignments
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY assignments_update ON commissions.assignments
FOR UPDATE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY assignments_delete ON commissions.assignments
FOR DELETE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- ============================================
-- Entries Policies
-- ============================================
CREATE POLICY entries_tenant_isolation ON commissions.entries
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY entries_insert ON commissions.entries
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY entries_update ON commissions.entries
FOR UPDATE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY entries_delete ON commissions.entries
FOR DELETE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- User can view their own entries (additional policy)
CREATE POLICY entries_user_view ON commissions.entries
FOR SELECT
USING (
tenant_id = current_setting('app.current_tenant_id', true)::UUID
AND (
user_id = current_setting('app.current_user_id', true)::UUID
OR current_setting('app.user_role', true) IN ('admin', 'manager')
)
);
-- ============================================
-- Periods Policies
-- ============================================
CREATE POLICY periods_tenant_isolation ON commissions.periods
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY periods_insert ON commissions.periods
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY periods_update ON commissions.periods
FOR UPDATE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
CREATE POLICY periods_delete ON commissions.periods
FOR DELETE
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- ============================================
-- Bypass policies for service role (optional)
-- ============================================
-- These allow backend services with elevated privileges to bypass RLS
-- when needed (e.g., for admin operations, reporting, etc.)
-- CREATE POLICY schemes_service_bypass ON commissions.schemes
-- FOR ALL
-- TO template_saas_service
-- USING (true);
-- CREATE POLICY assignments_service_bypass ON commissions.assignments
-- FOR ALL
-- TO template_saas_service
-- USING (true);
-- CREATE POLICY entries_service_bypass ON commissions.entries
-- FOR ALL
-- TO template_saas_service
-- USING (true);
-- CREATE POLICY periods_service_bypass ON commissions.periods
-- FOR ALL
-- TO template_saas_service
-- USING (true);