# 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*