13 KiB
13 KiB
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
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
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
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
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
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
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
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
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
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
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
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:
-- 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