# DISENO DE BASE DE DATOS - ERP CONSTRUCCION

**Fecha:** 2025-12-05
**DBMS:** PostgreSQL 15+ con PostGIS
**Patron:** Multi-Schema + RLS
**Total Schemas:** 12 schemas
**Alineado con:** ERP Generico v1.0

---

## Arquitectura Multi-Schema

Basado en ADR-007 y patron Gamilit. Extiende los schemas del ERP Generico con schemas especificos para construccion.

### Schemas del ERP Construccion

| Schema | Proposito | Modulos | Tablas | DDL Spec | Origen |
|--------|-----------|---------|--------|----------|--------|
| `auth` | Autenticacion y autorizacion | MAI-001, MAI-013 | 10 | Generico | GENERICO |
| `core` | Datos maestros | MAI-001 | 15 | Generico | GENERICO |
| `construction` | Obras, lotes, prototipos, avances | MAI-002, MAI-003, MAI-005 | 25 | [✓](schemas/DDL-SPEC-construction.md) | ESPECIFICO |
| `compliance` | Cumplimiento INFONAVIT | MAI-011 | 10 | [✓](schemas/DDL-SPEC-compliance.md) | ESPECIFICO |
| `finance` | Finanzas y Controlling | MAE-014 | 15 | [✓](schemas/DDL-SPEC-finance.md) | ESPECIFICO |
| `assets` | Activos y Maquinaria | MAE-015 | 12 | [✓](schemas/DDL-SPEC-assets.md) | ESPECIFICO |
| `documents` | Gestion Documental (DMS) | MAE-016 | 10 | [✓](schemas/DDL-SPEC-documents.md) | ESPECIFICO |
| `estimates` | Estimaciones y facturacion | MAI-008 | 12 | Pendiente | ESPECIFICO |
| `inventory` | Inventarios y almacenes | MAI-004 | 12 | Pendiente | GENERICO+EXT |
| `purchase` | Compras y requisiciones | MAI-004 | 10 | Pendiente | GENERICO+EXT |
| `hr` | RRHH, asistencias, destajo | MAI-007 | 10 | Pendiente | GENERICO+EXT |
| `quality` | Calidad y Postventa | MAI-009 | 8 | Pendiente | ESPECIFICO |

**Total Tablas:** ~139 tablas
**DDL Specs Completadas:** 5/12 (42%)
**Reutilizacion del ERP Generico:** 55%

---

## Convenciones de Nomenclatura

### Tablas
- snake_case
- Plural (ej: `fraccionamientos`, `lotes`, `estimaciones`)
- Prefijo de schema en queries (`construction.lotes`)

### Campos
- snake_case
- Sufijos estandar:
  - `_id`: Foreign key
  - `_at`: Timestamp
  - `_by`: Usuario (creador, modificador)
  - `_code`: Codigo unico de negocio (ej: `lote_code`)

### Constraints
- PK: `pk_{table}`
- FK: `fk_{table}_{referenced_table}`
- UNIQUE: `uq_{table}_{columns}`
- CHECK: `chk_{table}_{condition}`

---

## Patrones Estandar

### 1. Campos Obligatorios en TODA Tabla

```sql
CREATE TABLE schema.table_name (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  tenant_id UUID NOT NULL REFERENCES auth.tenants(id),

  -- Auditoria
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  created_by UUID REFERENCES auth.users(id),
  updated_at TIMESTAMP,
  updated_by UUID REFERENCES auth.users(id),

  -- Soft delete
  deleted_at TIMESTAMP,
  deleted_by UUID REFERENCES auth.users(id),

  -- ... campos especificos
);
```

### 2. RLS Policy Estandar

```sql
-- Habilitar RLS
ALTER TABLE schema.table_name ENABLE ROW LEVEL SECURITY;

-- Policy: Solo ver datos de su tenant
CREATE POLICY tenant_isolation_policy
ON schema.table_name
USING (tenant_id = current_setting('app.current_tenant_id')::UUID);
```

### 3. Indices Estandar

```sql
-- Indice en tenant_id (SIEMPRE)
CREATE INDEX idx_{table}_tenant_id ON schema.table_name(tenant_id);

-- Indice en created_at (para queries ordenadas)
CREATE INDEX idx_{table}_created_at ON schema.table_name(created_at);

-- Indice compuesto para soft delete
CREATE INDEX idx_{table}_active ON schema.table_name(tenant_id, id)
WHERE deleted_at IS NULL;
```

---

## Estructura de Directorio

```
database-design/
+-- README.md (este archivo)
+-- database-roadmap.md
+-- schemas/
|   +-- DDL-SPEC-construction.md     [✓] MAI-002, MAI-003, MAI-005 (25 tablas)
|   +-- DDL-SPEC-compliance.md       [✓] MAI-011 INFONAVIT (10 tablas)
|   +-- DDL-SPEC-finance.md          [✓] MAE-014 Finanzas (15 tablas)
|   +-- DDL-SPEC-assets.md           [✓] MAE-015 Activos (12 tablas)
|   +-- DDL-SPEC-documents.md        [✓] MAE-016 DMS (10 tablas)
|   +-- DDL-SPEC-estimates.md        [ ] MAI-008 Estimaciones (pendiente)
|   +-- DDL-SPEC-purchasing.md       [ ] MAI-004 Compras (pendiente)
|   +-- DDL-SPEC-hr.md               [ ] MAI-007 RRHH (pendiente)
|   +-- DDL-SPEC-quality.md          [ ] MAI-009 Calidad (pendiente)
+-- migrations/ (no usado - ADR-011)
+-- seeds/
    +-- construction-seeds.sql
```

---

## Estrategia de Base de Datos

### ADR-011: Database Clean Load Strategy

**NO SE USAN MIGRATIONS.** En su lugar:

1. **DDL Files:** Scripts completos por schema
2. **Reset Script:** `scripts/reset-database.sh`
3. **Seeds:** Datos iniciales por schema y ambiente

### Orden de Implementacion

Basado en dependencias entre schemas:

1. **auth** (CRITICO - sin dependencias)
   - Referencia: ERP Generico
   - Extensiones: roles construccion (director, residente, almacenista)

2. **core** (datos maestros)
   - Referencia: ERP Generico
   - Extensiones: unidades de medida construccion

3. **construction** (ESPECIFICO - depende de auth, core)
   - Fraccionamientos, etapas, manzanas, lotes
   - Torres, niveles, departamentos
   - Prototipos, presupuestos, avances

4. **estimates** (ESPECIFICO - depende de construction)
   - Estimaciones, generadores, anticipos, retenciones

5. **infonavit** (ESPECIFICO - depende de construction)
   - Registros INFONAVIT, actas, reportes

6. **inventory** (GENERICO + extension)
   - Almacen por proyecto
   - Requisiciones de obra

7. **purchase** (GENERICO + extension)
   - Requisiciones de obra
   - Ordenes por proyecto

8. **hr** (GENERICO + extension)
   - Asistencias GPS
   - Destajo

---

## Dependencias entre Schemas

```
auth (base)
  |
  +-- core (datos maestros)
  |     |
  |     +-- construction (proyectos/obras)
  |     |     |
  |     |     +-- estimates (estimaciones)
  |     |     +-- infonavit (cumplimiento)
  |     |
  |     +-- inventory (inventarios)
  |     |     |
  |     |     +-- purchase (compras)
  |     |
  |     +-- hr (recursos humanos)
```

---

## Proximos Pasos

### Completados
1. [x] Crear estructura database-design/ (Sprint 2.1)
2. [x] DDL-SPEC-construction.md - Proyectos, Presupuestos, Control de Obra
3. [x] DDL-SPEC-compliance.md - INFONAVIT Cumplimiento
4. [x] DDL-SPEC-finance.md - Finanzas y Controlling
5. [x] DDL-SPEC-assets.md - Activos y Maquinaria
6. [x] DDL-SPEC-documents.md - Gestion Documental

### Pendientes
7. [ ] DDL-SPEC-estimates.md - Estimaciones y Facturacion
8. [ ] DDL-SPEC-purchasing.md - Compras y Requisiciones
9. [ ] DDL-SPEC-hr.md - RRHH y Asistencias
10. [ ] DDL-SPEC-quality.md - Calidad y Postventa
11. [ ] Crear INVENTARIO-OBJETOS-BD.yml

---

## Resumen de Objetos de Base de Datos

| Schema | Tablas | ENUMs | Funciones | Triggers | RLS |
|--------|--------|-------|-----------|----------|-----|
| construction | 25 | 8 | 6 | 4 | ✓ |
| compliance | 10 | 6 | 4 | 3 | ✓ |
| finance | 15 | 7 | 8 | 5 | ✓ |
| assets | 12 | 5 | 5 | 4 | ✓ |
| documents | 10 | 5 | 4 | 3 | ✓ |
| **Total** | **72** | **31** | **27** | **19** | ✓ |

---

## Referencias

- [ADR-007: Database Design](../../adr/ADR-007-database-design.md)
- [ADR-011: Database Clean Load](../../adr/ADR-011-database-clean-load-strategy.md)
- [ERP Generico Database Design](/projects/erp-generic/docs/02-modelado/database-design/)
- [Mapeo MAI-MGN](../../00-analisis-referencias/MAPEO-MAI-TO-MGN.md)

---

**Ultima actualizacion:** 2025-12-05
**Version:** 1.1.0
