- Configure workspace Git repository with comprehensive .gitignore - Add Odoo as submodule for ERP reference code - Include documentation: SETUP.md, GIT-STRUCTURE.md - Add gitignore templates for projects (backend, frontend, database) - Structure supports independent repos per project/subproject level Workspace includes: - core/ - Reusable patterns, modules, orchestration system - projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.) - knowledge-base/ - Reference code and patterns (includes Odoo submodule) - devtools/ - Development tools and templates - customers/ - Client implementations template 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
114 lines
4.6 KiB
SQL
114 lines
4.6 KiB
SQL
-- ============================================================================
|
|
-- CONSTRUCTION Schema DDL - Gestion de Obras
|
|
-- Modulo: MAA-001 a MAA-006 (Fundamentos de Construccion)
|
|
-- Version: 1.0.0
|
|
-- Fecha: 2025-12-06
|
|
-- ============================================================================
|
|
-- POLITICA: CARGA LIMPIA (ver DIRECTIVA-POLITICA-CARGA-LIMPIA.md)
|
|
-- Este archivo es parte de la fuente de verdad DDL.
|
|
-- ============================================================================
|
|
|
|
-- Verificar que init-database.sql se ejecuto
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'core') THEN
|
|
RAISE EXCEPTION 'Schema core no existe. Ejecutar primero init-scripts/01-init-database.sql';
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Crear schema si no existe
|
|
CREATE SCHEMA IF NOT EXISTS construction;
|
|
|
|
-- Configurar search_path
|
|
SET search_path TO construction, core, core_shared, public;
|
|
|
|
-- ============================================================================
|
|
-- TABLAS BASE MINIMAS (requeridas por otros modulos como HSE)
|
|
-- ============================================================================
|
|
|
|
-- Tabla: Proyectos (desarrollo inmobiliario)
|
|
CREATE TABLE IF NOT EXISTS construction.proyectos (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES core.tenants(id),
|
|
codigo VARCHAR(20) NOT NULL,
|
|
nombre VARCHAR(200) NOT NULL,
|
|
descripcion TEXT,
|
|
direccion TEXT,
|
|
ciudad VARCHAR(100),
|
|
estado VARCHAR(100),
|
|
fecha_inicio DATE,
|
|
fecha_fin_estimada DATE,
|
|
estado_proyecto VARCHAR(20) NOT NULL DEFAULT 'activo',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
created_by UUID REFERENCES core.users(id),
|
|
|
|
CONSTRAINT uq_proyectos_codigo UNIQUE (tenant_id, codigo)
|
|
);
|
|
|
|
-- Tabla: Fraccionamientos (obras dentro de un proyecto)
|
|
CREATE TABLE IF NOT EXISTS construction.fraccionamientos (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES core.tenants(id),
|
|
proyecto_id UUID NOT NULL REFERENCES construction.proyectos(id),
|
|
codigo VARCHAR(20) NOT NULL,
|
|
nombre VARCHAR(200) NOT NULL,
|
|
descripcion TEXT,
|
|
direccion TEXT,
|
|
ubicacion_geo GEOMETRY(Point, 4326),
|
|
fecha_inicio DATE,
|
|
fecha_fin_estimada DATE,
|
|
estado VARCHAR(20) NOT NULL DEFAULT 'activo',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
created_by UUID REFERENCES core.users(id),
|
|
|
|
CONSTRAINT uq_fraccionamientos_codigo UNIQUE (tenant_id, codigo)
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- INDICES
|
|
-- ============================================================================
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_proyectos_tenant ON construction.proyectos(tenant_id);
|
|
CREATE INDEX IF NOT EXISTS idx_fraccionamientos_tenant ON construction.fraccionamientos(tenant_id);
|
|
CREATE INDEX IF NOT EXISTS idx_fraccionamientos_proyecto ON construction.fraccionamientos(proyecto_id);
|
|
|
|
-- ============================================================================
|
|
-- ROW LEVEL SECURITY
|
|
-- ============================================================================
|
|
|
|
ALTER TABLE construction.proyectos ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE construction.fraccionamientos ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY tenant_isolation_proyectos ON construction.proyectos
|
|
FOR ALL
|
|
USING (tenant_id = current_setting('app.current_tenant', true)::UUID);
|
|
|
|
CREATE POLICY tenant_isolation_fraccionamientos ON construction.fraccionamientos
|
|
FOR ALL
|
|
USING (tenant_id = current_setting('app.current_tenant', true)::UUID);
|
|
|
|
-- ============================================================================
|
|
-- TRIGGERS
|
|
-- ============================================================================
|
|
|
|
CREATE TRIGGER trg_proyectos_updated_at
|
|
BEFORE UPDATE ON construction.proyectos
|
|
FOR EACH ROW EXECUTE FUNCTION core_shared.set_updated_at();
|
|
|
|
CREATE TRIGGER trg_fraccionamientos_updated_at
|
|
BEFORE UPDATE ON construction.fraccionamientos
|
|
FOR EACH ROW EXECUTE FUNCTION core_shared.set_updated_at();
|
|
|
|
-- ============================================================================
|
|
-- COMENTARIOS
|
|
-- ============================================================================
|
|
|
|
COMMENT ON TABLE construction.proyectos IS 'Proyectos de desarrollo inmobiliario';
|
|
COMMENT ON TABLE construction.fraccionamientos IS 'Fraccionamientos/obras dentro de un proyecto';
|
|
|
|
-- ============================================================================
|
|
-- FIN
|
|
-- ============================================================================
|