semillero-special-hotel/prisma/rls_and_seed.sql

223 lines
9.9 KiB
SQL

-- RLS Policies and Seeding Script for Hoteles Estelar Variable Remuneration System
SET app.current_user_role = 'ADMIN';
-- ==========================================
-- 1. SEED DATA
-- ==========================================
-- Seed Regions
INSERT INTO "regions" ("name", "code") VALUES
('Bogotá', 'BOG'),
('Antioquia', 'ANT'),
('Caribe', 'CAR')
ON CONFLICT ("code") DO NOTHING;
-- Seed Hotels
INSERT INTO "hotels" ("name", "code", "region_id", "status") VALUES
('Estelar Parque de la 93', 'EST-P93', (SELECT id FROM regions WHERE code = 'BOG'), 'ACTIVE'),
('Estelar Medellin', 'EST-MDE', (SELECT id FROM regions WHERE code = 'ANT'), 'ACTIVE'),
('Estelar Cartagena', 'EST-CTG', (SELECT id FROM regions WHERE code = 'CAR'), 'ACTIVE')
ON CONFLICT ("code") DO NOTHING;
-- Seed Users
-- password_hash is bcrypt hash of 'password123'
INSERT INTO "users" ("username", "email", "password_hash", "role", "hotel_id", "area", "status", "created_at") VALUES
('admin', 'admin@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'ADMIN', (SELECT id FROM hotels WHERE code = 'EST-P93'), 'Sistemas', 'ACTIVE', NOW()),
('director', 'director@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'DIRECTOR', (SELECT id FROM hotels WHERE code = 'EST-P93'), 'Comercial', 'ACTIVE', NOW()),
('gerente_mde', 'gerente.mde@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'GERENTE', (SELECT id FROM hotels WHERE code = 'EST-MDE'), 'Administracion', 'ACTIVE', NOW()),
('lider_ctg', 'lider.ctg@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'LIDER', (SELECT id FROM hotels WHERE code = 'EST-CTG'), 'Ventas', 'ACTIVE', NOW()),
('analista', 'analista@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'ANALISTA', (SELECT id FROM hotels WHERE code = 'EST-P93'), 'Finanzas', 'ACTIVE', NOW()),
('consulta', 'consulta@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'CONSULTA', (SELECT id FROM hotels WHERE code = 'EST-P93'), 'Auditoria', 'ACTIVE', NOW()),
('colaborador_mde', 'colaborador.mde@estelar.com', '$2b$10$EpjJNrk.wU5YzB3sJsmJg.35A5EJUPhq31O7p8HwS5zM4pU1fT26G', 'COLABORADOR', (SELECT id FROM hotels WHERE code = 'EST-MDE'), 'Ventas', 'ACTIVE', NOW())
ON CONFLICT ("username") DO NOTHING;
-- ==========================================
-- 2. ENABLE ROW-LEVEL SECURITY
-- ==========================================
ALTER TABLE "regions" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "hotels" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "users" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "goals" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "sales_results" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "settlements" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "audit_logs" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "regions" FORCE ROW LEVEL SECURITY;
ALTER TABLE "hotels" FORCE ROW LEVEL SECURITY;
ALTER TABLE "users" FORCE ROW LEVEL SECURITY;
ALTER TABLE "goals" FORCE ROW LEVEL SECURITY;
ALTER TABLE "sales_results" FORCE ROW LEVEL SECURITY;
ALTER TABLE "settlements" FORCE ROW LEVEL SECURITY;
ALTER TABLE "audit_logs" FORCE ROW LEVEL SECURITY;
-- ==========================================
-- 3. CLEAN UP OLD POLICIES
-- ==========================================
DROP POLICY IF EXISTS audit_logs_insert_policy ON "audit_logs";
DROP POLICY IF EXISTS audit_logs_select_policy ON "audit_logs";
DROP POLICY IF EXISTS regions_select_policy ON "regions";
DROP POLICY IF EXISTS regions_modify_policy ON "regions";
DROP POLICY IF EXISTS hotels_select_policy ON "hotels";
DROP POLICY IF EXISTS hotels_modify_policy ON "hotels";
DROP POLICY IF EXISTS users_select_policy ON "users";
DROP POLICY IF EXISTS users_modify_policy ON "users";
DROP POLICY IF EXISTS goals_select_policy ON "goals";
DROP POLICY IF EXISTS goals_modify_policy ON "goals";
DROP POLICY IF EXISTS sales_results_select_policy ON "sales_results";
DROP POLICY IF EXISTS sales_results_modify_policy ON "sales_results";
DROP POLICY IF EXISTS settlements_select_policy ON "settlements";
DROP POLICY IF EXISTS settlements_modify_policy ON "settlements";
DROP POLICY IF EXISTS plans_select_policy ON "compensation_plans";
DROP POLICY IF EXISTS plans_modify_policy ON "compensation_plans";
DROP POLICY IF EXISTS rules_select_policy ON "calculation_rules";
DROP POLICY IF EXISTS rules_modify_policy ON "calculation_rules";
-- ==========================================
-- 4. CREATE RLS POLICIES
-- ==========================================
-- A. Audit Logs Policies (Insert allowed for all, Select only for Admin/Analista, No Updates/Deletes)
CREATE POLICY audit_logs_insert_policy ON "audit_logs"
FOR INSERT WITH CHECK (true);
CREATE POLICY audit_logs_select_policy ON "audit_logs"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA')
OR user_id = NULLIF(current_setting('app.current_user_id', true), '')::integer
);
-- B. Regions Policies
CREATE POLICY regions_select_policy ON "regions"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR id = NULLIF(current_setting('app.current_region_id', true), '')::integer
);
CREATE POLICY regions_modify_policy ON "regions"
FOR ALL USING (current_setting('app.current_user_role', true) IN ('ADMIN', 'DIRECTOR'));
-- C. Hotels Policies
CREATE POLICY hotels_select_policy ON "hotels"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
OR id = NULLIF(current_setting('app.current_hotel_id', true), '')::integer
);
CREATE POLICY hotels_modify_policy ON "hotels"
FOR ALL USING (current_setting('app.current_user_role', true) IN ('ADMIN', 'DIRECTOR'));
-- D. Users Policies
CREATE POLICY users_select_policy ON "users"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR (
current_setting('app.current_user_role', true) = 'GERENTE'
AND hotel_id = NULLIF(current_setting('app.current_hotel_id', true), '')::integer
)
OR (
current_setting('app.current_user_role', true) = 'LIDER'
AND hotel_id IN (SELECT id FROM hotels WHERE region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer)
)
OR id = NULLIF(current_setting('app.current_user_id', true), '')::integer
);
CREATE POLICY users_modify_policy ON "users"
FOR ALL USING (current_setting('app.current_user_role', true) = 'ADMIN');
-- E. Goals Policies
CREATE POLICY goals_select_policy ON "goals"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR target_id = NULLIF(current_setting('app.current_user_id', true), '')::integer
OR target_id IN (
SELECT u.id FROM users u WHERE u.hotel_id = NULLIF(current_setting('app.current_hotel_id', true), '')::integer
)
OR target_id IN (
SELECT u.id FROM users u JOIN hotels h ON u.hotel_id = h.id
WHERE h.region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
)
);
CREATE POLICY goals_modify_policy ON "goals"
FOR ALL USING (current_setting('app.current_user_role', true) IN ('ADMIN', 'DIRECTOR'));
-- F. Sales Results Policies
CREATE POLICY sales_results_select_policy ON "sales_results"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR user_id = NULLIF(current_setting('app.current_user_id', true), '')::integer
OR hotel_id = NULLIF(current_setting('app.current_hotel_id', true), '')::integer
OR hotel_id IN (
SELECT id FROM hotels WHERE region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
)
);
CREATE POLICY sales_results_modify_policy ON "sales_results"
FOR ALL USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA')
OR (
current_setting('app.current_user_role', true) = 'LIDER'
AND hotel_id IN (
SELECT id FROM hotels WHERE region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
)
)
);
-- G. Settlements Policies
CREATE POLICY settlements_select_policy ON "settlements"
FOR SELECT USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA', 'DIRECTOR')
OR user_id = NULLIF(current_setting('app.current_user_id', true), '')::integer
OR user_id IN (
SELECT u.id FROM users u WHERE u.hotel_id = NULLIF(current_setting('app.current_hotel_id', true), '')::integer
)
OR user_id IN (
SELECT u.id FROM users u JOIN hotels h ON u.hotel_id = h.id
WHERE h.region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
)
);
CREATE POLICY settlements_modify_policy ON "settlements"
FOR ALL USING (
current_setting('app.current_user_role', true) IN ('ADMIN', 'ANALISTA')
OR (
current_setting('app.current_user_role', true) = 'LIDER'
AND user_id IN (
SELECT u.id FROM users u JOIN hotels h ON u.hotel_id = h.id
WHERE h.region_id = NULLIF(current_setting('app.current_region_id', true), '')::integer
)
)
);
-- H. Compensation Plans Policies
ALTER TABLE "compensation_plans" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "compensation_plans" FORCE ROW LEVEL SECURITY;
CREATE POLICY plans_select_policy ON "compensation_plans"
FOR SELECT USING (true);
CREATE POLICY plans_modify_policy ON "compensation_plans"
FOR ALL USING (current_setting('app.current_user_role', true) IN ('ADMIN', 'DIRECTOR', 'ANALISTA'));
-- I. Calculation Rules Policies
ALTER TABLE "calculation_rules" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "calculation_rules" FORCE ROW LEVEL SECURITY;
CREATE POLICY rules_select_policy ON "calculation_rules"
FOR SELECT USING (true);
CREATE POLICY rules_modify_policy ON "calculation_rules"
FOR ALL USING (current_setting('app.current_user_role', true) IN ('ADMIN', 'DIRECTOR', 'ANALISTA'));