527 lines
13 KiB
Markdown
527 lines
13 KiB
Markdown
# Database Schema - clinica-dental
|
|
|
|
**Alias:** @PROJ_DEF_DB
|
|
**Version:** 1.0.0
|
|
**Ultima actualizacion:** 2026-01-16
|
|
|
|
---
|
|
|
|
## 1. RESUMEN
|
|
|
|
| Metrica | Valor |
|
|
|---------|-------|
|
|
| **Total Schemas** | 1 (dental) |
|
|
| **Total Tablas** | 11 |
|
|
| **Total Catalogos** | 2 |
|
|
| **Total Enums** | 4 |
|
|
| **Total Relaciones** | 15+ |
|
|
|
|
---
|
|
|
|
## 2. HERENCIA DE SCHEMAS
|
|
|
|
```yaml
|
|
herencia:
|
|
desde_erp_core:
|
|
- auth # Autenticacion y sesiones
|
|
- tenants # Multi-tenancy
|
|
- users # Usuarios del sistema
|
|
desde_erp_clinicas:
|
|
- clinica # Pacientes, citas, consultas
|
|
propio:
|
|
- dental # Especializacion odontologica
|
|
```
|
|
|
|
---
|
|
|
|
## 3. ENUMS
|
|
|
|
```yaml
|
|
enums:
|
|
estado_pieza:
|
|
valores: ["sano", "caries", "obturacion", "endodoncia", "corona", "puente", "implante", "ausente", "extraccion_indicada", "diente_temporal", "fractura", "movilidad"]
|
|
uso: "Estado de una pieza dental"
|
|
|
|
cara_dental:
|
|
valores: ["mesial", "distal", "oclusal", "incisal", "vestibular", "bucal", "lingual", "palatino"]
|
|
uso: "Caras de una pieza dental"
|
|
|
|
estado_tratamiento:
|
|
valores: ["pendiente", "en_proceso", "completado", "cancelado"]
|
|
uso: "Estado de un tratamiento"
|
|
|
|
tipo_ortodoncia:
|
|
valores: ["brackets_metalicos", "brackets_esteticos", "brackets_linguales", "alineadores", "removible", "retenedor"]
|
|
uso: "Tipo de tratamiento ortodontico"
|
|
```
|
|
|
|
---
|
|
|
|
## 4. CATALOGOS
|
|
|
|
### 4.1 dental.piezas_dentales
|
|
|
|
```yaml
|
|
tabla: "piezas_dentales"
|
|
schema: "dental"
|
|
tipo: "catalogo_global"
|
|
descripcion: "Catalogo de piezas dentales (nomenclatura FDI)"
|
|
registros: 52
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "numero"
|
|
tipo: "VARCHAR(10)"
|
|
unique: true
|
|
descripcion: "Numero FDI (11-48, 51-85)"
|
|
- nombre: "nombre"
|
|
tipo: "VARCHAR(50)"
|
|
not_null: true
|
|
- nombre: "cuadrante"
|
|
tipo: "INTEGER"
|
|
check: "BETWEEN 1 AND 8"
|
|
- nombre: "es_temporal"
|
|
tipo: "BOOLEAN"
|
|
default: false
|
|
- nombre: "descripcion"
|
|
tipo: "TEXT"
|
|
```
|
|
|
|
### 4.2 dental.tratamientos_catalogo
|
|
|
|
```yaml
|
|
tabla: "tratamientos_catalogo"
|
|
schema: "dental"
|
|
tipo: "catalogo_tenant"
|
|
descripcion: "Catalogo de tratamientos dentales por tenant"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "codigo"
|
|
tipo: "VARCHAR(20)"
|
|
not_null: true
|
|
- nombre: "nombre"
|
|
tipo: "VARCHAR(100)"
|
|
not_null: true
|
|
- nombre: "categoria"
|
|
tipo: "VARCHAR(50)"
|
|
descripcion: "prevencion, restauracion, endodoncia, etc."
|
|
- nombre: "duracion_minutos"
|
|
tipo: "INTEGER"
|
|
default: 30
|
|
- nombre: "precio_base"
|
|
tipo: "NUMERIC(10,2)"
|
|
- nombre: "requiere_rx"
|
|
tipo: "BOOLEAN"
|
|
default: false
|
|
- nombre: "requiere_anestesia"
|
|
tipo: "BOOLEAN"
|
|
default: false
|
|
- nombre: "active"
|
|
tipo: "BOOLEAN"
|
|
default: true
|
|
constraints:
|
|
- nombre: "uq_tratamientos_tenant_codigo"
|
|
tipo: "UNIQUE"
|
|
columnas: ["tenant_id", "codigo"]
|
|
```
|
|
|
|
---
|
|
|
|
## 5. TABLAS PRINCIPALES
|
|
|
|
### 5.1 dental.odontogramas
|
|
|
|
```yaml
|
|
tabla: "odontogramas"
|
|
schema: "dental"
|
|
modulo: "DENTAL-001"
|
|
descripcion: "Odontogramas de pacientes"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
fk: "clinica.patients"
|
|
- nombre: "fecha_creacion"
|
|
tipo: "DATE"
|
|
default: "CURRENT_DATE"
|
|
- nombre: "fecha_actualizacion"
|
|
tipo: "DATE"
|
|
- nombre: "notas"
|
|
tipo: "TEXT"
|
|
indices:
|
|
- "idx_odontogramas_tenant"
|
|
- "idx_odontogramas_patient"
|
|
```
|
|
|
|
### 5.2 dental.odontograma_piezas
|
|
|
|
```yaml
|
|
tabla: "odontograma_piezas"
|
|
schema: "dental"
|
|
modulo: "DENTAL-001"
|
|
descripcion: "Estado de cada pieza en el odontograma"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "odontograma_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
fk: "dental.odontogramas"
|
|
- nombre: "pieza_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
fk: "dental.piezas_dentales"
|
|
- nombre: "estado"
|
|
tipo: "dental.estado_pieza"
|
|
default: "sano"
|
|
- nombre: "caras_afectadas"
|
|
tipo: "JSONB"
|
|
descripcion: '{"mesial": "caries", "oclusal": "obturacion"}'
|
|
- nombre: "observaciones"
|
|
tipo: "TEXT"
|
|
constraints:
|
|
- nombre: "uq_odontograma_pieza"
|
|
tipo: "UNIQUE"
|
|
columnas: ["odontograma_id", "pieza_id"]
|
|
```
|
|
|
|
### 5.3 dental.tratamientos_paciente
|
|
|
|
```yaml
|
|
tabla: "tratamientos_paciente"
|
|
schema: "dental"
|
|
modulo: "DENTAL-002"
|
|
descripcion: "Tratamientos realizados a pacientes"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "odontograma_id"
|
|
tipo: "UUID"
|
|
fk: "dental.odontogramas"
|
|
- nombre: "tratamiento_id"
|
|
tipo: "UUID"
|
|
fk: "dental.tratamientos_catalogo"
|
|
- nombre: "odontologo_id"
|
|
tipo: "UUID"
|
|
fk: "clinica.doctors"
|
|
- nombre: "consultation_id"
|
|
tipo: "UUID"
|
|
fk: "clinica.consultations"
|
|
- nombre: "pieza_id"
|
|
tipo: "UUID"
|
|
fk: "dental.piezas_dentales"
|
|
- nombre: "caras_tratadas"
|
|
tipo: "dental.cara_dental[]"
|
|
- nombre: "fecha_inicio"
|
|
tipo: "DATE"
|
|
default: "CURRENT_DATE"
|
|
- nombre: "fecha_fin"
|
|
tipo: "DATE"
|
|
- nombre: "estado"
|
|
tipo: "dental.estado_tratamiento"
|
|
default: "pendiente"
|
|
- nombre: "precio"
|
|
tipo: "NUMERIC(10,2)"
|
|
- nombre: "descuento"
|
|
tipo: "NUMERIC(5,2)"
|
|
default: 0
|
|
- nombre: "precio_final"
|
|
tipo: "NUMERIC(10,2)"
|
|
indices:
|
|
- "idx_tratamientos_paciente_tenant"
|
|
- "idx_tratamientos_paciente_patient"
|
|
- "idx_tratamientos_paciente_estado"
|
|
```
|
|
|
|
### 5.4 dental.ortodoncia
|
|
|
|
```yaml
|
|
tabla: "ortodoncia"
|
|
schema: "dental"
|
|
modulo: "DENTAL-003"
|
|
descripcion: "Casos de ortodoncia"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "odontologo_id"
|
|
tipo: "UUID"
|
|
- nombre: "tipo"
|
|
tipo: "dental.tipo_ortodoncia"
|
|
not_null: true
|
|
- nombre: "marca"
|
|
tipo: "VARCHAR(100)"
|
|
- nombre: "fecha_inicio"
|
|
tipo: "DATE"
|
|
not_null: true
|
|
- nombre: "fecha_estimada_fin"
|
|
tipo: "DATE"
|
|
- nombre: "fecha_real_fin"
|
|
tipo: "DATE"
|
|
- nombre: "estado"
|
|
tipo: "dental.estado_tratamiento"
|
|
default: "en_proceso"
|
|
- nombre: "meses_estimados"
|
|
tipo: "INTEGER"
|
|
- nombre: "costo_total"
|
|
tipo: "NUMERIC(10,2)"
|
|
- nombre: "enganche"
|
|
tipo: "NUMERIC(10,2)"
|
|
- nombre: "mensualidad"
|
|
tipo: "NUMERIC(10,2)"
|
|
indices:
|
|
- "idx_ortodoncia_tenant"
|
|
- "idx_ortodoncia_patient"
|
|
- "idx_ortodoncia_estado"
|
|
```
|
|
|
|
### 5.5 dental.protesis
|
|
|
|
```yaml
|
|
tabla: "protesis"
|
|
schema: "dental"
|
|
modulo: "DENTAL-004"
|
|
descripcion: "Trabajos protesicos"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "odontologo_id"
|
|
tipo: "UUID"
|
|
- nombre: "tipo"
|
|
tipo: "VARCHAR(50)"
|
|
not_null: true
|
|
descripcion: "corona, puente, parcial, total, implante"
|
|
- nombre: "piezas_involucradas"
|
|
tipo: "TEXT[]"
|
|
- nombre: "laboratorio_id"
|
|
tipo: "UUID"
|
|
- nombre: "fecha_envio_lab"
|
|
tipo: "DATE"
|
|
- nombre: "fecha_recepcion_lab"
|
|
tipo: "DATE"
|
|
- nombre: "material"
|
|
tipo: "VARCHAR(100)"
|
|
- nombre: "color"
|
|
tipo: "VARCHAR(50)"
|
|
- nombre: "estado"
|
|
tipo: "dental.estado_tratamiento"
|
|
default: "en_proceso"
|
|
- nombre: "fecha_colocacion"
|
|
tipo: "DATE"
|
|
- nombre: "tiene_garantia"
|
|
tipo: "BOOLEAN"
|
|
default: false
|
|
- nombre: "meses_garantia"
|
|
tipo: "INTEGER"
|
|
- nombre: "costo_laboratorio"
|
|
tipo: "NUMERIC(10,2)"
|
|
- nombre: "precio_paciente"
|
|
tipo: "NUMERIC(10,2)"
|
|
indices:
|
|
- "idx_protesis_tenant"
|
|
- "idx_protesis_patient"
|
|
```
|
|
|
|
### 5.6 dental.radiografias
|
|
|
|
```yaml
|
|
tabla: "radiografias"
|
|
schema: "dental"
|
|
modulo: "DENTAL-005"
|
|
descripcion: "Radiografias dentales"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "consultation_id"
|
|
tipo: "UUID"
|
|
- nombre: "tipo"
|
|
tipo: "VARCHAR(50)"
|
|
not_null: true
|
|
descripcion: "periapical, panoramica, cefalometrica, oclusal"
|
|
- nombre: "pieza_id"
|
|
tipo: "UUID"
|
|
fk: "dental.piezas_dentales"
|
|
- nombre: "fecha"
|
|
tipo: "DATE"
|
|
default: "CURRENT_DATE"
|
|
- nombre: "url_imagen"
|
|
tipo: "VARCHAR(255)"
|
|
- nombre: "interpretacion"
|
|
tipo: "TEXT"
|
|
indices:
|
|
- "idx_radiografias_tenant"
|
|
- "idx_radiografias_patient"
|
|
```
|
|
|
|
### 5.7 dental.presupuestos
|
|
|
|
```yaml
|
|
tabla: "presupuestos"
|
|
schema: "dental"
|
|
modulo: "DENTAL-006"
|
|
descripcion: "Presupuestos de tratamiento"
|
|
columnas:
|
|
- nombre: "id"
|
|
tipo: "UUID"
|
|
pk: true
|
|
- nombre: "tenant_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "patient_id"
|
|
tipo: "UUID"
|
|
not_null: true
|
|
- nombre: "odontologo_id"
|
|
tipo: "UUID"
|
|
- nombre: "numero"
|
|
tipo: "VARCHAR(20)"
|
|
- nombre: "fecha"
|
|
tipo: "DATE"
|
|
default: "CURRENT_DATE"
|
|
- nombre: "fecha_vencimiento"
|
|
tipo: "DATE"
|
|
- nombre: "estado"
|
|
tipo: "VARCHAR(20)"
|
|
default: "pendiente"
|
|
descripcion: "pendiente, aprobado, rechazado, vencido"
|
|
- nombre: "subtotal"
|
|
tipo: "NUMERIC(12,2)"
|
|
default: 0
|
|
- nombre: "descuento_porcentaje"
|
|
tipo: "NUMERIC(5,2)"
|
|
default: 0
|
|
- nombre: "descuento_monto"
|
|
tipo: "NUMERIC(12,2)"
|
|
default: 0
|
|
- nombre: "total"
|
|
tipo: "NUMERIC(12,2)"
|
|
default: 0
|
|
- nombre: "requiere_financiamiento"
|
|
tipo: "BOOLEAN"
|
|
default: false
|
|
- nombre: "enganche"
|
|
tipo: "NUMERIC(12,2)"
|
|
- nombre: "numero_pagos"
|
|
tipo: "INTEGER"
|
|
- nombre: "monto_pago"
|
|
tipo: "NUMERIC(12,2)"
|
|
indices:
|
|
- "idx_presupuestos_tenant"
|
|
- "idx_presupuestos_patient"
|
|
- "idx_presupuestos_estado"
|
|
```
|
|
|
|
---
|
|
|
|
## 6. RELACIONES
|
|
|
|
```
|
|
dental Schema:
|
|
|
|
┌─────────────────────┐
|
|
│ piezas_dentales │ (catalogo global)
|
|
└──────────┬──────────┘
|
|
│
|
|
┌─────────────────┼─────────────────┬───────────────────┐
|
|
│ │ │ │
|
|
▼ ▼ ▼ ▼
|
|
┌──────────┐ ┌─────────────┐ ┌───────────┐ ┌─────────────┐
|
|
│odontograma│ │tratamientos │ │radiografias│ │presupuesto_ │
|
|
│_piezas │ │_paciente │ │ │ │lineas │
|
|
└────┬─────┘ └──────┬──────┘ └───────────┘ └──────┬──────┘
|
|
│ │ │
|
|
│ │ │
|
|
▼ │ ▼
|
|
┌──────────┐ │ ┌─────────────┐
|
|
│odontogramas│◄────────┘ │presupuestos │
|
|
└────┬─────┘ └─────────────┘
|
|
│
|
|
│ clinica Schema (heredado):
|
|
│
|
|
▼
|
|
┌──────────┐ ┌──────────┐ ┌────────────────┐
|
|
│ patients │◄────────│ doctors │◄────────│ specialties │
|
|
└──────────┘ └──────────┘ └────────────────┘
|
|
│ │
|
|
│ │
|
|
▼ ▼
|
|
┌──────────┐ ┌──────────────┐
|
|
│ortodoncia│ │consultations │
|
|
└────┬─────┘ └──────────────┘
|
|
│
|
|
▼
|
|
┌──────────────┐
|
|
│ortodoncia_ │
|
|
│citas │
|
|
└──────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 7. ROW LEVEL SECURITY
|
|
|
|
Todas las tablas del schema `dental` tienen RLS habilitado con politica de aislamiento por tenant:
|
|
|
|
```sql
|
|
-- Patron aplicado a todas las tablas
|
|
CREATE POLICY tenant_isolation_{tabla} ON dental.{tabla}
|
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
|
```
|
|
|
|
---
|
|
|
|
## 8. REFERENCIAS
|
|
|
|
- DDL completo: `database/schemas/01-dental-schema-ddl.sql`
|
|
- Seeds: `database/seeds/fase8/01-dental-catalogos.sql`
|
|
- Inventario: `orchestration/inventarios/DATABASE_INVENTORY.yml`
|
|
- Entities: Ver @PROJ_DEF_ENTITIES
|
|
- Herencia: `orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md`
|
|
|
|
---
|
|
|
|
*Database Schema | clinica-dental | v1.0.0*
|
|
*Ultima actualizacion: 2026-01-16*
|