clinica-dental/docs/_definitions/DATABASE-SCHEMA.md
2026-01-16 04:14:26 -06:00

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"
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