-- ============================================================================
-- RLS POLICIES - Row Level Security Policies for ERP Construccion
-- Version: 1.0.0
-- Fecha: 2026-01-24
-- ============================================================================
-- DESCRIPCION:
--   Este archivo contiene TODAS las politicas de Row Level Security (RLS)
--   para las tablas multi-tenant del ERP Construccion.
--
-- POLITICA:
--   Todas las tablas con columna tenant_id deben tener RLS habilitado y
--   una politica de aislamiento de tenant usando current_setting('app.current_tenant_id').
--
-- USO:
--   SET app.current_tenant_id = 'uuid-del-tenant';
--   -- Todas las queries automaticamente filtraran por tenant_id
--
-- PREREQUISITOS:
--   Ejecutar DESPUES de todos los DDL de schemas (01-07)
-- ============================================================================

-- ============================================================================
-- SCHEMA: construction (24 tablas)
-- ============================================================================

-- fraccionamientos
ALTER TABLE construction.fraccionamientos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_fraccionamientos ON construction.fraccionamientos;
CREATE POLICY tenant_isolation_fraccionamientos ON construction.fraccionamientos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- etapas
ALTER TABLE construction.etapas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_etapas ON construction.etapas;
CREATE POLICY tenant_isolation_etapas ON construction.etapas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- manzanas
ALTER TABLE construction.manzanas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_manzanas ON construction.manzanas;
CREATE POLICY tenant_isolation_manzanas ON construction.manzanas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- prototipos
ALTER TABLE construction.prototipos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_prototipos ON construction.prototipos;
CREATE POLICY tenant_isolation_prototipos ON construction.prototipos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- lotes
ALTER TABLE construction.lotes ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_lotes ON construction.lotes;
CREATE POLICY tenant_isolation_lotes ON construction.lotes
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- torres
ALTER TABLE construction.torres ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_torres ON construction.torres;
CREATE POLICY tenant_isolation_torres ON construction.torres
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- niveles
ALTER TABLE construction.niveles ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_niveles ON construction.niveles;
CREATE POLICY tenant_isolation_niveles ON construction.niveles
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- departamentos
ALTER TABLE construction.departamentos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_departamentos ON construction.departamentos;
CREATE POLICY tenant_isolation_departamentos ON construction.departamentos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- conceptos
ALTER TABLE construction.conceptos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_conceptos ON construction.conceptos;
CREATE POLICY tenant_isolation_conceptos ON construction.conceptos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- presupuestos
ALTER TABLE construction.presupuestos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_presupuestos ON construction.presupuestos;
CREATE POLICY tenant_isolation_presupuestos ON construction.presupuestos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- presupuesto_partidas
ALTER TABLE construction.presupuesto_partidas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_presupuesto_partidas ON construction.presupuesto_partidas;
CREATE POLICY tenant_isolation_presupuesto_partidas ON construction.presupuesto_partidas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- programa_obra
ALTER TABLE construction.programa_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_programa_obra ON construction.programa_obra;
CREATE POLICY tenant_isolation_programa_obra ON construction.programa_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- programa_actividades
ALTER TABLE construction.programa_actividades ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_programa_actividades ON construction.programa_actividades;
CREATE POLICY tenant_isolation_programa_actividades ON construction.programa_actividades
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- avances_obra
ALTER TABLE construction.avances_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_avances_obra ON construction.avances_obra;
CREATE POLICY tenant_isolation_avances_obra ON construction.avances_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- fotos_avance
ALTER TABLE construction.fotos_avance ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_fotos_avance ON construction.fotos_avance;
CREATE POLICY tenant_isolation_fotos_avance ON construction.fotos_avance
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- bitacora_obra
ALTER TABLE construction.bitacora_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_bitacora_obra ON construction.bitacora_obra;
CREATE POLICY tenant_isolation_bitacora_obra ON construction.bitacora_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- checklists
ALTER TABLE construction.checklists ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_checklists ON construction.checklists;
CREATE POLICY tenant_isolation_checklists ON construction.checklists
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- checklist_items
ALTER TABLE construction.checklist_items ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_checklist_items ON construction.checklist_items;
CREATE POLICY tenant_isolation_checklist_items ON construction.checklist_items
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- inspecciones
ALTER TABLE construction.inspecciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_inspecciones ON construction.inspecciones;
CREATE POLICY tenant_isolation_inspecciones ON construction.inspecciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- inspeccion_resultados
ALTER TABLE construction.inspeccion_resultados ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_inspeccion_resultados ON construction.inspeccion_resultados;
CREATE POLICY tenant_isolation_inspeccion_resultados ON construction.inspeccion_resultados
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- tickets_postventa
ALTER TABLE construction.tickets_postventa ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_tickets_postventa ON construction.tickets_postventa;
CREATE POLICY tenant_isolation_tickets_postventa ON construction.tickets_postventa
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- subcontratistas
ALTER TABLE construction.subcontratistas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_subcontratistas ON construction.subcontratistas;
CREATE POLICY tenant_isolation_subcontratistas ON construction.subcontratistas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- contratos
ALTER TABLE construction.contratos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_contratos ON construction.contratos;
CREATE POLICY tenant_isolation_contratos ON construction.contratos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- contrato_partidas
ALTER TABLE construction.contrato_partidas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_contrato_partidas ON construction.contrato_partidas;
CREATE POLICY tenant_isolation_contrato_partidas ON construction.contrato_partidas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: hr (3 tablas)
-- ============================================================================

-- employees
ALTER TABLE hr.employees ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_employees ON hr.employees;
CREATE POLICY tenant_isolation_employees ON hr.employees
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- puestos
ALTER TABLE hr.puestos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_puestos ON hr.puestos;
CREATE POLICY tenant_isolation_puestos ON hr.puestos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- employee_fraccionamientos
ALTER TABLE hr.employee_fraccionamientos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_employee_fraccionamientos ON hr.employee_fraccionamientos;
CREATE POLICY tenant_isolation_employee_fraccionamientos ON hr.employee_fraccionamientos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: hse (34 tablas)
-- ============================================================================

-- incidentes
ALTER TABLE hse.incidentes ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_incidentes ON hse.incidentes;
CREATE POLICY tenant_isolation_incidentes ON hse.incidentes
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- capacitaciones
ALTER TABLE hse.capacitaciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_capacitaciones ON hse.capacitaciones;
CREATE POLICY tenant_isolation_capacitaciones ON hse.capacitaciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- capacitacion_matriz
ALTER TABLE hse.capacitacion_matriz ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_capacitacion_matriz ON hse.capacitacion_matriz;
CREATE POLICY tenant_isolation_capacitacion_matriz ON hse.capacitacion_matriz
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- instructores
ALTER TABLE hse.instructores ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_instructores ON hse.instructores;
CREATE POLICY tenant_isolation_instructores ON hse.instructores
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- capacitacion_sesiones
ALTER TABLE hse.capacitacion_sesiones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_capacitacion_sesiones ON hse.capacitacion_sesiones;
CREATE POLICY tenant_isolation_capacitacion_sesiones ON hse.capacitacion_sesiones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- constancias_dc3
ALTER TABLE hse.constancias_dc3 ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_constancias_dc3 ON hse.constancias_dc3;
CREATE POLICY tenant_isolation_constancias_dc3 ON hse.constancias_dc3
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- tipos_inspeccion
ALTER TABLE hse.tipos_inspeccion ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_tipos_inspeccion ON hse.tipos_inspeccion;
CREATE POLICY tenant_isolation_tipos_inspeccion ON hse.tipos_inspeccion
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- programa_inspecciones
ALTER TABLE hse.programa_inspecciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_programa_inspecciones ON hse.programa_inspecciones;
CREATE POLICY tenant_isolation_programa_inspecciones ON hse.programa_inspecciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- hse.inspecciones (different from construction.inspecciones)
ALTER TABLE hse.inspecciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_hse_inspecciones ON hse.inspecciones;
CREATE POLICY tenant_isolation_hse_inspecciones ON hse.inspecciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- hallazgos
ALTER TABLE hse.hallazgos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_hallazgos ON hse.hallazgos;
CREATE POLICY tenant_isolation_hallazgos ON hse.hallazgos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- epp_catalogo
ALTER TABLE hse.epp_catalogo ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_epp_catalogo ON hse.epp_catalogo;
CREATE POLICY tenant_isolation_epp_catalogo ON hse.epp_catalogo
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- epp_matriz_puesto
ALTER TABLE hse.epp_matriz_puesto ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_epp_matriz_puesto ON hse.epp_matriz_puesto;
CREATE POLICY tenant_isolation_epp_matriz_puesto ON hse.epp_matriz_puesto
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- epp_asignaciones
ALTER TABLE hse.epp_asignaciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_epp_asignaciones ON hse.epp_asignaciones;
CREATE POLICY tenant_isolation_epp_asignaciones ON hse.epp_asignaciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- epp_inventario
ALTER TABLE hse.epp_inventario ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_epp_inventario ON hse.epp_inventario;
CREATE POLICY tenant_isolation_epp_inventario ON hse.epp_inventario
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- epp_movimientos
ALTER TABLE hse.epp_movimientos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_epp_movimientos ON hse.epp_movimientos;
CREATE POLICY tenant_isolation_epp_movimientos ON hse.epp_movimientos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- cumplimiento_obra
ALTER TABLE hse.cumplimiento_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_cumplimiento_obra ON hse.cumplimiento_obra;
CREATE POLICY tenant_isolation_cumplimiento_obra ON hse.cumplimiento_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- comision_seguridad
ALTER TABLE hse.comision_seguridad ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_comision_seguridad ON hse.comision_seguridad;
CREATE POLICY tenant_isolation_comision_seguridad ON hse.comision_seguridad
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- programa_seguridad
ALTER TABLE hse.programa_seguridad ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_programa_seguridad ON hse.programa_seguridad;
CREATE POLICY tenant_isolation_programa_seguridad ON hse.programa_seguridad
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- documentos_stps
ALTER TABLE hse.documentos_stps ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_documentos_stps ON hse.documentos_stps;
CREATE POLICY tenant_isolation_documentos_stps ON hse.documentos_stps
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- auditorias
ALTER TABLE hse.auditorias ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_auditorias ON hse.auditorias;
CREATE POLICY tenant_isolation_auditorias ON hse.auditorias
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- residuos_generacion
ALTER TABLE hse.residuos_generacion ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_residuos_generacion ON hse.residuos_generacion;
CREATE POLICY tenant_isolation_residuos_generacion ON hse.residuos_generacion
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- almacen_temporal
ALTER TABLE hse.almacen_temporal ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_almacen_temporal ON hse.almacen_temporal;
CREATE POLICY tenant_isolation_almacen_temporal ON hse.almacen_temporal
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- proveedores_ambientales
ALTER TABLE hse.proveedores_ambientales ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_proveedores_ambientales ON hse.proveedores_ambientales;
CREATE POLICY tenant_isolation_proveedores_ambientales ON hse.proveedores_ambientales
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- manifiestos_residuos
ALTER TABLE hse.manifiestos_residuos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_manifiestos_residuos ON hse.manifiestos_residuos;
CREATE POLICY tenant_isolation_manifiestos_residuos ON hse.manifiestos_residuos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- impacto_ambiental
ALTER TABLE hse.impacto_ambiental ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_impacto_ambiental ON hse.impacto_ambiental;
CREATE POLICY tenant_isolation_impacto_ambiental ON hse.impacto_ambiental
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- quejas_ambientales
ALTER TABLE hse.quejas_ambientales ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_quejas_ambientales ON hse.quejas_ambientales;
CREATE POLICY tenant_isolation_quejas_ambientales ON hse.quejas_ambientales
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- tipos_permiso_trabajo
ALTER TABLE hse.tipos_permiso_trabajo ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_tipos_permiso_trabajo ON hse.tipos_permiso_trabajo;
CREATE POLICY tenant_isolation_tipos_permiso_trabajo ON hse.tipos_permiso_trabajo
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- permisos_trabajo
ALTER TABLE hse.permisos_trabajo ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_permisos_trabajo ON hse.permisos_trabajo;
CREATE POLICY tenant_isolation_permisos_trabajo ON hse.permisos_trabajo
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- indicadores_config
ALTER TABLE hse.indicadores_config ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_indicadores_config ON hse.indicadores_config;
CREATE POLICY tenant_isolation_indicadores_config ON hse.indicadores_config
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- indicadores_valores
ALTER TABLE hse.indicadores_valores ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_indicadores_valores ON hse.indicadores_valores;
CREATE POLICY tenant_isolation_indicadores_valores ON hse.indicadores_valores
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- horas_trabajadas
ALTER TABLE hse.horas_trabajadas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_horas_trabajadas ON hse.horas_trabajadas;
CREATE POLICY tenant_isolation_horas_trabajadas ON hse.horas_trabajadas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- dias_sin_accidente
ALTER TABLE hse.dias_sin_accidente ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_dias_sin_accidente ON hse.dias_sin_accidente;
CREATE POLICY tenant_isolation_dias_sin_accidente ON hse.dias_sin_accidente
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- reportes_programados
ALTER TABLE hse.reportes_programados ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_reportes_programados ON hse.reportes_programados;
CREATE POLICY tenant_isolation_reportes_programados ON hse.reportes_programados
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- alertas_indicadores
ALTER TABLE hse.alertas_indicadores ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_alertas_indicadores ON hse.alertas_indicadores;
CREATE POLICY tenant_isolation_alertas_indicadores ON hse.alertas_indicadores
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: estimates (8 tablas)
-- ============================================================================

-- estimaciones
ALTER TABLE estimates.estimaciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_estimaciones ON estimates.estimaciones;
CREATE POLICY tenant_isolation_estimaciones ON estimates.estimaciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- estimacion_conceptos
ALTER TABLE estimates.estimacion_conceptos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_estimacion_conceptos ON estimates.estimacion_conceptos;
CREATE POLICY tenant_isolation_estimacion_conceptos ON estimates.estimacion_conceptos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- generadores
ALTER TABLE estimates.generadores ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_generadores ON estimates.generadores;
CREATE POLICY tenant_isolation_generadores ON estimates.generadores
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- anticipos
ALTER TABLE estimates.anticipos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_anticipos ON estimates.anticipos;
CREATE POLICY tenant_isolation_anticipos ON estimates.anticipos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- amortizaciones
ALTER TABLE estimates.amortizaciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_amortizaciones ON estimates.amortizaciones;
CREATE POLICY tenant_isolation_amortizaciones ON estimates.amortizaciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- retenciones
ALTER TABLE estimates.retenciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_retenciones ON estimates.retenciones;
CREATE POLICY tenant_isolation_retenciones ON estimates.retenciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- fondo_garantia
ALTER TABLE estimates.fondo_garantia ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_fondo_garantia ON estimates.fondo_garantia;
CREATE POLICY tenant_isolation_fondo_garantia ON estimates.fondo_garantia
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- estimacion_workflow
ALTER TABLE estimates.estimacion_workflow ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_estimacion_workflow ON estimates.estimacion_workflow;
CREATE POLICY tenant_isolation_estimacion_workflow ON estimates.estimacion_workflow
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: infonavit (8 tablas)
-- ============================================================================

-- registro_infonavit
ALTER TABLE infonavit.registro_infonavit ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_registro_infonavit ON infonavit.registro_infonavit;
CREATE POLICY tenant_isolation_registro_infonavit ON infonavit.registro_infonavit
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- oferta_vivienda
ALTER TABLE infonavit.oferta_vivienda ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_oferta_vivienda ON infonavit.oferta_vivienda;
CREATE POLICY tenant_isolation_oferta_vivienda ON infonavit.oferta_vivienda
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- derechohabientes
ALTER TABLE infonavit.derechohabientes ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_derechohabientes ON infonavit.derechohabientes;
CREATE POLICY tenant_isolation_derechohabientes ON infonavit.derechohabientes
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- asignacion_vivienda
ALTER TABLE infonavit.asignacion_vivienda ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_asignacion_vivienda ON infonavit.asignacion_vivienda;
CREATE POLICY tenant_isolation_asignacion_vivienda ON infonavit.asignacion_vivienda
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- actas
ALTER TABLE infonavit.actas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_actas ON infonavit.actas;
CREATE POLICY tenant_isolation_actas ON infonavit.actas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- acta_viviendas
ALTER TABLE infonavit.acta_viviendas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_acta_viviendas ON infonavit.acta_viviendas;
CREATE POLICY tenant_isolation_acta_viviendas ON infonavit.acta_viviendas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- reportes_infonavit
ALTER TABLE infonavit.reportes_infonavit ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_reportes_infonavit ON infonavit.reportes_infonavit;
CREATE POLICY tenant_isolation_reportes_infonavit ON infonavit.reportes_infonavit
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- historico_puntos
ALTER TABLE infonavit.historico_puntos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_historico_puntos ON infonavit.historico_puntos;
CREATE POLICY tenant_isolation_historico_puntos ON infonavit.historico_puntos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: inventory (4 tablas de extension construccion)
-- ============================================================================

-- almacenes_proyecto
ALTER TABLE inventory.almacenes_proyecto ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_almacenes_proyecto ON inventory.almacenes_proyecto;
CREATE POLICY tenant_isolation_almacenes_proyecto ON inventory.almacenes_proyecto
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- requisiciones_obra
ALTER TABLE inventory.requisiciones_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_requisiciones_obra ON inventory.requisiciones_obra;
CREATE POLICY tenant_isolation_requisiciones_obra ON inventory.requisiciones_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- requisicion_lineas
ALTER TABLE inventory.requisicion_lineas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_requisicion_lineas ON inventory.requisicion_lineas;
CREATE POLICY tenant_isolation_requisicion_lineas ON inventory.requisicion_lineas
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- consumos_obra
ALTER TABLE inventory.consumos_obra ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_consumos_obra ON inventory.consumos_obra;
CREATE POLICY tenant_isolation_consumos_obra ON inventory.consumos_obra
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- SCHEMA: purchase (5 tablas de extension construccion)
-- ============================================================================

-- purchase_order_construction
ALTER TABLE purchase.purchase_order_construction ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_purchase_order_construction ON purchase.purchase_order_construction;
CREATE POLICY tenant_isolation_purchase_order_construction ON purchase.purchase_order_construction
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- supplier_construction
ALTER TABLE purchase.supplier_construction ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_supplier_construction ON purchase.supplier_construction;
CREATE POLICY tenant_isolation_supplier_construction ON purchase.supplier_construction
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- comparativo_cotizaciones
ALTER TABLE purchase.comparativo_cotizaciones ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_comparativo_cotizaciones ON purchase.comparativo_cotizaciones;
CREATE POLICY tenant_isolation_comparativo_cotizaciones ON purchase.comparativo_cotizaciones
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- comparativo_proveedores
ALTER TABLE purchase.comparativo_proveedores ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_comparativo_proveedores ON purchase.comparativo_proveedores;
CREATE POLICY tenant_isolation_comparativo_proveedores ON purchase.comparativo_proveedores
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- comparativo_productos
ALTER TABLE purchase.comparativo_productos ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_comparativo_productos ON purchase.comparativo_productos;
CREATE POLICY tenant_isolation_comparativo_productos ON purchase.comparativo_productos
    USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- ============================================================================
-- RESUMEN DE POLITICAS RLS
-- ============================================================================
-- Total de tablas con RLS:
--   - construction: 24 tablas
--   - hr: 3 tablas
--   - hse: 34 tablas
--   - estimates: 8 tablas
--   - infonavit: 8 tablas
--   - inventory: 4 tablas
--   - purchase: 5 tablas
--   -----------------------
--   TOTAL: 86 tablas
-- ============================================================================

-- ============================================================================
-- FIN DE RLS POLICIES
-- ============================================================================
