[MIGRATION-V2] feat: Migrar clinica-dental a estructura v2

- Prefijo v2: CDN
- TRACEABILITY-MASTER.yml creado
- Listo para integracion como submodulo

Workspace: v2.0.0 | SIMCO: v4.0.0
This commit is contained in:
rckrdmrd 2026-01-10 11:29:18 -06:00
commit 87d25ab1ac
27 changed files with 5978 additions and 0 deletions

307
.env.example Normal file
View File

@ -0,0 +1,307 @@
# =============================================================================
# .env.example - CLINICA DENTAL
# =============================================================================
# Copia este archivo a .env y configura los valores
# Generado por: @PERFIL_DEVENV
# Referencia: orchestration/environment/ENVIRONMENT-INVENTORY.yml
# =============================================================================
# =============================================================================
# APLICACION
# =============================================================================
NODE_ENV=development
APP_NAME=clinica-dental
APP_VERSION=1.0.0
# =============================================================================
# PUERTOS - Asignados por DEVENV-PORTS-INVENTORY.yml
# =============================================================================
FRONTEND_PORT=3130
BACKEND_PORT=3131
# Alias para compatibilidad
PORT=3131
# =============================================================================
# BASE DE DATOS - PostgreSQL
# =============================================================================
# Desarrollo: Puerto 5441 (asignado en DEVENV-PORTS-INVENTORY.yml)
# Produccion: Puerto 5432 (estandar)
# =============================================================================
DB_HOST=localhost
DB_PORT=5441
DB_NAME=clinica_dental_dev
DB_USER=dental_dev
# IMPORTANTE: Generar password seguro con: openssl rand -base64 32
DB_PASSWORD=CAMBIAR_POR_PASSWORD_SEGURO
# Connection string completo (calculado de las variables anteriores)
DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
# Pool de conexiones
DB_POOL_SIZE=10
DB_CONNECTION_TIMEOUT=5000
# SSL (false para desarrollo, true para produccion)
DB_SSL=false
# =============================================================================
# BASE DE DATOS - Ambientes adicionales
# =============================================================================
# Test (mismo servidor, diferente BD)
# DB_NAME_TEST=clinica_dental_test
# Staging (servidor externo)
# DB_HOST_STAGING=staging-db.example.com
# DB_NAME_STAGING=clinica_dental_staging
# DB_USER_STAGING=dental_staging
# Produccion (servidor externo)
# DB_HOST_PROD=prod-db.example.com
# DB_NAME_PROD=clinica_dental_prod
# DB_USER_PROD=dental_prod
# =============================================================================
# REDIS - Cache y Sesiones
# =============================================================================
# Desarrollo: Puerto 6388 (asignado en DEVENV-PORTS-INVENTORY.yml)
# Produccion: Puerto 6379 (estandar)
# =============================================================================
REDIS_HOST=localhost
REDIS_PORT=6388
REDIS_DB=0
# Password (vacio para desarrollo, requerido en produccion)
REDIS_PASSWORD=
# Connection string
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}
# Configuracion de cache
REDIS_CACHE_TTL=3600
REDIS_MAX_MEMORY=256mb
# =============================================================================
# AUTENTICACION - JWT
# =============================================================================
# IMPORTANTE: Generar secreto seguro con: openssl rand -base64 64
# Minimo 32 caracteres requeridos
# =============================================================================
JWT_SECRET=CAMBIAR_POR_SECRETO_SEGURO_DE_AL_MENOS_32_CARACTERES
# Tiempos de expiracion
JWT_EXPIRES_IN=24h
JWT_REFRESH_EXPIRES_IN=7d
# Algoritmo (default: HS256)
JWT_ALGORITHM=HS256
# =============================================================================
# CORS - Cross-Origin Resource Sharing
# =============================================================================
FRONTEND_URL=http://localhost:3130
# Multiples origenes separados por coma
ALLOWED_ORIGINS=http://localhost:3130,http://localhost:3131
# Metodos permitidos
CORS_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS
# Headers permitidos
CORS_HEADERS=Content-Type,Authorization,X-Requested-With
# =============================================================================
# LOGGING
# =============================================================================
# Niveles: debug, info, warn, error
LOG_LEVEL=debug
# Formatos: pretty (desarrollo), json (produccion)
LOG_FORMAT=pretty
# Archivo de logs (opcional)
# LOG_FILE=./logs/app.log
# Rotacion de logs
# LOG_MAX_SIZE=10m
# LOG_MAX_FILES=5
# =============================================================================
# ALMACENAMIENTO DE ARCHIVOS (Radiografias y documentos)
# =============================================================================
# Tipo: local, s3, minio
STORAGE_TYPE=local
# Path local (para desarrollo)
STORAGE_PATH=./uploads
# Tamano maximo de archivo (20MB en bytes - para radiografias)
MAX_FILE_SIZE=20971520
# Tipos permitidos (incluye DICOM para imagenes medicas)
ALLOWED_FILE_TYPES=image/jpeg,image/png,image/dicom,application/pdf,application/dicom
# Directorio para radiografias
XRAY_STORAGE_PATH=./uploads/radiografias
# =============================================================================
# AWS S3 (para produccion)
# =============================================================================
# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# AWS_REGION=us-east-1
# AWS_S3_BUCKET=clinica-dental-uploads
# AWS_S3_XRAY_BUCKET=clinica-dental-radiografias
# =============================================================================
# EMAIL - SMTP
# =============================================================================
# MailHog para desarrollo: puerto 1025
# Servidor real para produccion
# =============================================================================
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_SECURE=false
# Credenciales (para produccion)
# SMTP_USER=
# SMTP_PASSWORD=
# Remitente por defecto
SMTP_FROM_NAME=Clinica Dental
SMTP_FROM_EMAIL=noreply@clinica-dental.local
# =============================================================================
# SEGURIDAD ADICIONAL
# =============================================================================
# Rate limiting
RATE_LIMIT_WINDOW=900000
RATE_LIMIT_MAX=100
# Helmet (headers de seguridad)
HELMET_ENABLED=true
# CSRF Protection
CSRF_ENABLED=false
# Throttle por IP
THROTTLE_TTL=60
THROTTLE_LIMIT=10
# =============================================================================
# MONITOREO Y METRICAS
# =============================================================================
# Health check endpoint
HEALTH_CHECK_ENABLED=true
# Metricas Prometheus (opcional)
# METRICS_ENABLED=false
# METRICS_PORT=9090
# Sentry (opcional)
# SENTRY_DSN=
# =============================================================================
# CONFIGURACION ESPECIFICA DENTAL
# =============================================================================
# Nomenclatura dental (FDI por defecto)
DENTAL_FDI_NOTATION=true
# Version del formato de odontograma
ODONTOGRAM_VERSION=2.0
# Recordatorios de citas (dias antes)
APPOINTMENT_REMINDER_DAYS=2
# Validez de presupuestos (dias)
BUDGET_VALIDITY_DAYS=30
# Tipos de radiografias habilitados
XRAY_TYPES=periapical,panoramica,oclusal,bitewing,cefalometrica
# =============================================================================
# CUMPLIMIENTO NORMATIVO (NOM-024-SSA3-2012)
# =============================================================================
# Habilitar auditoria (obligatorio en produccion)
AUDIT_ENABLED=true
# Retencion de logs de auditoria (dias)
AUDIT_RETENTION_DAYS=1825
# Encriptacion de datos sensibles
DATA_ENCRYPTION=false
# Firma electronica de expedientes
ELECTRONIC_SIGNATURE=false
# =============================================================================
# DESARROLLO Y DEBUG
# =============================================================================
# Habilitar debug de TypeORM
# TYPEORM_LOGGING=true
# Swagger UI
SWAGGER_ENABLED=true
SWAGGER_TITLE=Clinica Dental API
SWAGGER_VERSION=1.0.0
# Hot reload
HOT_RELOAD=true
# =============================================================================
# PRODUCCION
# =============================================================================
# Estas variables deben configurarse via secrets manager en produccion:
#
# - DB_PASSWORD (secreto)
# - JWT_SECRET (secreto)
# - REDIS_PASSWORD (secreto)
# - AWS_ACCESS_KEY_ID (si usa S3)
# - AWS_SECRET_ACCESS_KEY (si usa S3)
# - SMTP_USER (si usa email)
# - SMTP_PASSWORD (si usa email)
# - SENTRY_DSN (si usa Sentry)
# - ENCRYPTION_KEY (para datos sensibles)
#
# Diferencias de configuracion en produccion:
# - NODE_ENV=production
# - LOG_LEVEL=info
# - LOG_FORMAT=json
# - DB_PORT=5432 (estandar)
# - DB_SSL=true
# - REDIS_PORT=6379 (estandar)
# - STORAGE_TYPE=s3
# - SWAGGER_ENABLED=false
# - HOT_RELOAD=false
# - AUDIT_ENABLED=true
# - DATA_ENCRYPTION=true
# - ELECTRONIC_SIGNATURE=true
#
# IMPORTANTE: Cumplimiento NOM-024-SSA3-2012
# - Logs de auditoria inmutables
# - Retencion minima 5 anos
# - Backups diarios
# =============================================================================
# =============================================================================
# REFERENCIAS
# =============================================================================
# Inventario de entorno: orchestration/environment/ENVIRONMENT-INVENTORY.yml
# Inventario de puertos: orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml
# Perfil DevEnv: orchestration/agents/perfiles/PERFIL-DEVENV.md
# Nomenclatura FDI: https://www.fdiworlddental.org/tooth-numbering-system
# =============================================================================

20
.env.ports Normal file
View File

@ -0,0 +1,20 @@
# =============================================================================
# .env.ports - CLINICA DENTAL
# =============================================================================
# Archivo de referencia de puertos asignados
# Generado por: @PERFIL_DEVENV
# =============================================================================
# Servicios principales
FRONTEND_PORT=3130
BACKEND_PORT=3131
# Base de datos
DB_PORT=5441
# Redis
REDIS_PORT=6388
# =============================================================================
# Referencia: DEVENV-PORTS-INVENTORY.yml
# =============================================================================

81
README.md Normal file
View File

@ -0,0 +1,81 @@
# Clinica Dental - ERP Especializado
**Version:** 0.1.0
**Estado:** Desarrollo
**Tipo:** VERTICAL (erp-clinicas)
**Sistema:** SIMCO + NEXUS v3.4
---
## Descripcion
Sistema de gestion integral para clinicas dentales. Vertical especializada basada en erp-clinicas.
### Funcionalidades Principales
- Gestion de pacientes con expedientes y odontograma digital
- Consultas dentales: diagnostico y tratamientos
- Control de ortodoncia y protesis
- Presupuestos y planes de tratamiento
- Inventario de materiales dentales
- Facturacion de servicios
---
## Stack Tecnologico
| Capa | Tecnologia |
|------|------------|
| Database | PostgreSQL 16+ con RLS |
| Backend | (pendiente) Express.js / NestJS |
| Frontend | (pendiente) React + Vite |
---
## Estructura del Proyecto
```
clinica-dental/
├── database/
│ ├── schemas/ # DDL especifico dental
│ └── seeds/ # Datos iniciales
├── docs/
│ └── 00-vision-general/
├── orchestration/
│ ├── 00-guidelines/
│ ├── environment/
│ ├── inventarios/
│ └── trazas/
└── README.md
```
---
## Herencia
Este proyecto hereda de:
- **erp-clinicas** (modulos base de clinicas)
- **erp-core** (modulos genericos ERP)
---
## Inicio Rapido
```bash
# Database (requiere PostgreSQL y erp-clinicas cargado)
psql -d erp_clinicas -f database/schemas/01-dental-schema-ddl.sql
psql -d erp_clinicas -f database/seeds/fase8/01-dental-catalogos.sql
```
---
## Referencias
- Contexto: `orchestration/00-guidelines/CONTEXTO-PROYECTO.md`
- Herencia: `orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md`
- Inventario: `orchestration/inventarios/MASTER_INVENTORY.yml`
---
**Creado:** 2026-01-04
**Actualizado:** 2026-01-07

View File

@ -0,0 +1,502 @@
-- ============================================================================
-- DENTAL SCHEMA - Especialización de ERP-Clínicas
-- Clínica Dental
-- ============================================================================
-- Fecha: 2026-01-04
-- Versión: 1.0
-- Hereda de: erp-clinicas FASE-8
-- ============================================================================
-- Schema
CREATE SCHEMA IF NOT EXISTS dental;
-- ============================================================================
-- ENUMS
-- ============================================================================
DO $$ BEGIN
CREATE TYPE dental.estado_pieza AS ENUM (
'sano', 'caries', 'obturacion', 'endodoncia', 'corona',
'puente', 'implante', 'ausente', 'extraccion_indicada',
'diente_temporal', 'fractura', 'movilidad'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
DO $$ BEGIN
CREATE TYPE dental.cara_dental AS ENUM (
'mesial', 'distal', 'oclusal', 'incisal',
'vestibular', 'bucal', 'lingual', 'palatino'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
DO $$ BEGIN
CREATE TYPE dental.estado_tratamiento AS ENUM (
'pendiente', 'en_proceso', 'completado', 'cancelado'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
DO $$ BEGIN
CREATE TYPE dental.tipo_ortodoncia AS ENUM (
'brackets_metalicos', 'brackets_esteticos', 'brackets_linguales',
'alineadores', 'removible', 'retenedor'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
-- ============================================================================
-- CATÁLOGOS
-- ============================================================================
-- Piezas dentales
CREATE TABLE IF NOT EXISTS dental.piezas_dentales (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
numero VARCHAR(10) NOT NULL UNIQUE, -- '11', '12', ... '48', '51'...'85'
nombre VARCHAR(50) NOT NULL,
cuadrante INTEGER NOT NULL CHECK (cuadrante BETWEEN 1 AND 8),
es_temporal BOOLEAN DEFAULT false,
descripcion TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.piezas_dentales IS 'Catálogo de piezas dentales (nomenclatura FDI)';
-- Tratamientos dentales
CREATE TABLE IF NOT EXISTS dental.tratamientos_catalogo (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
codigo VARCHAR(20) NOT NULL,
nombre VARCHAR(100) NOT NULL,
categoria VARCHAR(50), -- 'prevencion', 'restauracion', 'endodoncia', etc.
descripcion TEXT,
duracion_minutos INTEGER DEFAULT 30,
precio_base NUMERIC(10,2),
requiere_rx BOOLEAN DEFAULT false,
requiere_anestesia BOOLEAN DEFAULT false,
active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
CONSTRAINT uq_tratamientos_tenant_codigo UNIQUE(tenant_id, codigo)
);
COMMENT ON TABLE dental.tratamientos_catalogo IS 'Catálogo de tratamientos dentales';
-- ============================================================================
-- TABLAS PRINCIPALES
-- ============================================================================
-- Odontograma
CREATE TABLE IF NOT EXISTS dental.odontogramas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL, -- Referencia a clinica.patients
fecha_creacion DATE NOT NULL DEFAULT CURRENT_DATE,
fecha_actualizacion DATE,
notas TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.odontogramas IS 'Odontogramas de pacientes';
-- Estado de piezas dentales por odontograma
CREATE TABLE IF NOT EXISTS dental.odontograma_piezas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
odontograma_id UUID NOT NULL REFERENCES dental.odontogramas(id) ON DELETE CASCADE,
pieza_id UUID NOT NULL REFERENCES dental.piezas_dentales(id),
-- Estado general
estado dental.estado_pieza DEFAULT 'sano',
-- Estados por cara (JSONB para flexibilidad)
caras_afectadas JSONB, -- {"mesial": "caries", "oclusal": "obturacion"}
-- Notas
observaciones TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
CONSTRAINT uq_odontograma_pieza UNIQUE(odontograma_id, pieza_id)
);
COMMENT ON TABLE dental.odontograma_piezas IS 'Estado de cada pieza dental en el odontograma';
-- Tratamientos de paciente
CREATE TABLE IF NOT EXISTS dental.tratamientos_paciente (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL,
odontograma_id UUID REFERENCES dental.odontogramas(id),
tratamiento_id UUID REFERENCES dental.tratamientos_catalogo(id),
odontologo_id UUID, -- Referencia a clinica.doctors
consultation_id UUID, -- Referencia a clinica.consultations
-- Pieza(s) tratada(s)
pieza_id UUID REFERENCES dental.piezas_dentales(id),
caras_tratadas dental.cara_dental[],
-- Datos del tratamiento
fecha_inicio DATE NOT NULL DEFAULT CURRENT_DATE,
fecha_fin DATE,
estado dental.estado_tratamiento DEFAULT 'pendiente',
-- Costo
precio NUMERIC(10,2),
descuento NUMERIC(5,2) DEFAULT 0,
precio_final NUMERIC(10,2),
-- Notas
notas TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.tratamientos_paciente IS 'Tratamientos realizados a pacientes';
-- Ortodoncia
CREATE TABLE IF NOT EXISTS dental.ortodoncia (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL,
odontologo_id UUID,
-- Tipo de tratamiento
tipo dental.tipo_ortodoncia NOT NULL,
marca VARCHAR(100),
-- Fechas
fecha_inicio DATE NOT NULL,
fecha_estimada_fin DATE,
fecha_real_fin DATE,
-- Estado
estado dental.estado_tratamiento DEFAULT 'en_proceso',
meses_estimados INTEGER,
-- Costo
costo_total NUMERIC(10,2),
enganche NUMERIC(10,2),
mensualidad NUMERIC(10,2),
-- Notas
notas TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.ortodoncia IS 'Tratamientos de ortodoncia';
-- Citas de ortodoncia (seguimiento)
CREATE TABLE IF NOT EXISTS dental.ortodoncia_citas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
ortodoncia_id UUID NOT NULL REFERENCES dental.ortodoncia(id) ON DELETE CASCADE,
appointment_id UUID, -- Referencia a clinica.appointments
-- Datos de la cita
fecha DATE NOT NULL,
numero_cita INTEGER,
-- Procedimiento
procedimiento TEXT,
arco_superior VARCHAR(50),
arco_inferior VARCHAR(50),
ligas VARCHAR(50),
-- Observaciones
observaciones TEXT,
proxima_cita DATE,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.ortodoncia_citas IS 'Citas de seguimiento de ortodoncia';
-- Prótesis
CREATE TABLE IF NOT EXISTS dental.protesis (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL,
odontologo_id UUID,
-- Tipo
tipo VARCHAR(50) NOT NULL, -- 'corona', 'puente', 'parcial', 'total', 'implante'
-- Piezas involucradas
piezas_involucradas TEXT[], -- ['11', '12', '13']
-- Laboratorio
laboratorio_id UUID, -- Referencia a proveedor
fecha_envio_lab DATE,
fecha_recepcion_lab DATE,
-- Material
material VARCHAR(100),
color VARCHAR(50),
-- Estado
estado dental.estado_tratamiento DEFAULT 'en_proceso',
fecha_colocacion DATE,
-- Garantía
tiene_garantia BOOLEAN DEFAULT false,
meses_garantia INTEGER,
-- Costo
costo_laboratorio NUMERIC(10,2),
precio_paciente NUMERIC(10,2),
-- Notas
notas TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.protesis IS 'Registro de prótesis dentales';
-- Radiografías
CREATE TABLE IF NOT EXISTS dental.radiografias (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL,
consultation_id UUID,
-- Tipo
tipo VARCHAR(50) NOT NULL, -- 'periapical', 'panoramica', 'cefalometrica', 'oclusal'
pieza_id UUID REFERENCES dental.piezas_dentales(id),
-- Archivo
fecha DATE NOT NULL DEFAULT CURRENT_DATE,
url_imagen VARCHAR(255),
-- Interpretación
interpretacion TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.radiografias IS 'Registro de radiografías dentales';
-- Presupuestos
CREATE TABLE IF NOT EXISTS dental.presupuestos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
patient_id UUID NOT NULL,
odontologo_id UUID,
-- Datos
numero VARCHAR(20),
fecha DATE NOT NULL DEFAULT CURRENT_DATE,
fecha_vencimiento DATE,
-- Estado
estado VARCHAR(20) DEFAULT 'pendiente', -- 'pendiente', 'aprobado', 'rechazado', 'vencido'
-- Totales
subtotal NUMERIC(12,2) DEFAULT 0,
descuento_porcentaje NUMERIC(5,2) DEFAULT 0,
descuento_monto NUMERIC(12,2) DEFAULT 0,
total NUMERIC(12,2) DEFAULT 0,
-- Plan de pago
requiere_financiamiento BOOLEAN DEFAULT false,
enganche NUMERIC(12,2),
numero_pagos INTEGER,
monto_pago NUMERIC(12,2),
-- Notas
notas TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.presupuestos IS 'Presupuestos de tratamiento';
-- Líneas de presupuesto
CREATE TABLE IF NOT EXISTS dental.presupuesto_lineas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
presupuesto_id UUID NOT NULL REFERENCES dental.presupuestos(id) ON DELETE CASCADE,
tratamiento_id UUID REFERENCES dental.tratamientos_catalogo(id),
-- Pieza
pieza_id UUID REFERENCES dental.piezas_dentales(id),
descripcion TEXT,
-- Cantidades
cantidad INTEGER DEFAULT 1,
precio_unitario NUMERIC(10,2),
descuento NUMERIC(5,2) DEFAULT 0,
subtotal NUMERIC(10,2),
-- Secuencia
sequence INTEGER DEFAULT 10,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE dental.presupuesto_lineas IS 'Líneas de presupuesto';
-- ============================================================================
-- EXTENSIONES A TABLAS DE ERP-CLINICAS
-- ============================================================================
DO $$
BEGIN
-- Extensión a clinica.patients
IF EXISTS (SELECT 1 FROM information_schema.tables
WHERE table_schema = 'clinica' AND table_name = 'patients') THEN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = 'clinica' AND table_name = 'patients'
AND column_name = 'odontograma_activo_id') THEN
ALTER TABLE clinica.patients ADD COLUMN odontograma_activo_id UUID;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = 'clinica' AND table_name = 'patients'
AND column_name = 'tiene_ortodoncia') THEN
ALTER TABLE clinica.patients ADD COLUMN tiene_ortodoncia BOOLEAN DEFAULT false;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = 'clinica' AND table_name = 'patients'
AND column_name = 'tiene_protesis') THEN
ALTER TABLE clinica.patients ADD COLUMN tiene_protesis BOOLEAN DEFAULT false;
END IF;
END IF;
END $$;
-- ============================================================================
-- SEED: Piezas dentales (catálogo global)
-- ============================================================================
INSERT INTO dental.piezas_dentales (numero, nombre, cuadrante, es_temporal) VALUES
-- Cuadrante 1 - Superior derecho (permanentes)
('18', 'Tercer molar superior derecho', 1, false),
('17', 'Segundo molar superior derecho', 1, false),
('16', 'Primer molar superior derecho', 1, false),
('15', 'Segundo premolar superior derecho', 1, false),
('14', 'Primer premolar superior derecho', 1, false),
('13', 'Canino superior derecho', 1, false),
('12', 'Incisivo lateral superior derecho', 1, false),
('11', 'Incisivo central superior derecho', 1, false),
-- Cuadrante 2 - Superior izquierdo (permanentes)
('21', 'Incisivo central superior izquierdo', 2, false),
('22', 'Incisivo lateral superior izquierdo', 2, false),
('23', 'Canino superior izquierdo', 2, false),
('24', 'Primer premolar superior izquierdo', 2, false),
('25', 'Segundo premolar superior izquierdo', 2, false),
('26', 'Primer molar superior izquierdo', 2, false),
('27', 'Segundo molar superior izquierdo', 2, false),
('28', 'Tercer molar superior izquierdo', 2, false),
-- Cuadrante 3 - Inferior izquierdo (permanentes)
('31', 'Incisivo central inferior izquierdo', 3, false),
('32', 'Incisivo lateral inferior izquierdo', 3, false),
('33', 'Canino inferior izquierdo', 3, false),
('34', 'Primer premolar inferior izquierdo', 3, false),
('35', 'Segundo premolar inferior izquierdo', 3, false),
('36', 'Primer molar inferior izquierdo', 3, false),
('37', 'Segundo molar inferior izquierdo', 3, false),
('38', 'Tercer molar inferior izquierdo', 3, false),
-- Cuadrante 4 - Inferior derecho (permanentes)
('41', 'Incisivo central inferior derecho', 4, false),
('42', 'Incisivo lateral inferior derecho', 4, false),
('43', 'Canino inferior derecho', 4, false),
('44', 'Primer premolar inferior derecho', 4, false),
('45', 'Segundo premolar inferior derecho', 4, false),
('46', 'Primer molar inferior derecho', 4, false),
('47', 'Segundo molar inferior derecho', 4, false),
('48', 'Tercer molar inferior derecho', 4, false),
-- Cuadrante 5 - Superior derecho (temporales)
('55', 'Segundo molar temporal superior derecho', 5, true),
('54', 'Primer molar temporal superior derecho', 5, true),
('53', 'Canino temporal superior derecho', 5, true),
('52', 'Incisivo lateral temporal superior derecho', 5, true),
('51', 'Incisivo central temporal superior derecho', 5, true),
-- Cuadrante 6 - Superior izquierdo (temporales)
('61', 'Incisivo central temporal superior izquierdo', 6, true),
('62', 'Incisivo lateral temporal superior izquierdo', 6, true),
('63', 'Canino temporal superior izquierdo', 6, true),
('64', 'Primer molar temporal superior izquierdo', 6, true),
('65', 'Segundo molar temporal superior izquierdo', 6, true),
-- Cuadrante 7 - Inferior izquierdo (temporales)
('71', 'Incisivo central temporal inferior izquierdo', 7, true),
('72', 'Incisivo lateral temporal inferior izquierdo', 7, true),
('73', 'Canino temporal inferior izquierdo', 7, true),
('74', 'Primer molar temporal inferior izquierdo', 7, true),
('75', 'Segundo molar temporal inferior izquierdo', 7, true),
-- Cuadrante 8 - Inferior derecho (temporales)
('81', 'Incisivo central temporal inferior derecho', 8, true),
('82', 'Incisivo lateral temporal inferior derecho', 8, true),
('83', 'Canino temporal inferior derecho', 8, true),
('84', 'Primer molar temporal inferior derecho', 8, true),
('85', 'Segundo molar temporal inferior derecho', 8, true)
ON CONFLICT (numero) DO NOTHING;
-- ============================================================================
-- ÍNDICES
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_tratamientos_catalogo_tenant ON dental.tratamientos_catalogo(tenant_id);
CREATE INDEX IF NOT EXISTS idx_tratamientos_catalogo_categoria ON dental.tratamientos_catalogo(tenant_id, categoria);
CREATE INDEX IF NOT EXISTS idx_odontogramas_tenant ON dental.odontogramas(tenant_id);
CREATE INDEX IF NOT EXISTS idx_odontogramas_patient ON dental.odontogramas(patient_id);
CREATE INDEX IF NOT EXISTS idx_odontograma_piezas_odontograma ON dental.odontograma_piezas(odontograma_id);
CREATE INDEX IF NOT EXISTS idx_odontograma_piezas_pieza ON dental.odontograma_piezas(pieza_id);
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_tenant ON dental.tratamientos_paciente(tenant_id);
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_patient ON dental.tratamientos_paciente(patient_id);
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_estado ON dental.tratamientos_paciente(tenant_id, estado);
CREATE INDEX IF NOT EXISTS idx_ortodoncia_tenant ON dental.ortodoncia(tenant_id);
CREATE INDEX IF NOT EXISTS idx_ortodoncia_patient ON dental.ortodoncia(patient_id);
CREATE INDEX IF NOT EXISTS idx_ortodoncia_estado ON dental.ortodoncia(tenant_id, estado);
CREATE INDEX IF NOT EXISTS idx_ortodoncia_citas_ortodoncia ON dental.ortodoncia_citas(ortodoncia_id);
CREATE INDEX IF NOT EXISTS idx_protesis_tenant ON dental.protesis(tenant_id);
CREATE INDEX IF NOT EXISTS idx_protesis_patient ON dental.protesis(patient_id);
CREATE INDEX IF NOT EXISTS idx_radiografias_tenant ON dental.radiografias(tenant_id);
CREATE INDEX IF NOT EXISTS idx_radiografias_patient ON dental.radiografias(patient_id);
CREATE INDEX IF NOT EXISTS idx_presupuestos_tenant ON dental.presupuestos(tenant_id);
CREATE INDEX IF NOT EXISTS idx_presupuestos_patient ON dental.presupuestos(patient_id);
CREATE INDEX IF NOT EXISTS idx_presupuestos_estado ON dental.presupuestos(tenant_id, estado);
CREATE INDEX IF NOT EXISTS idx_presupuesto_lineas_presupuesto ON dental.presupuesto_lineas(presupuesto_id);
-- ============================================================================
-- RLS
-- ============================================================================
ALTER TABLE dental.tratamientos_catalogo ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.odontogramas ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.odontograma_piezas ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.tratamientos_paciente ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.ortodoncia ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.ortodoncia_citas ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.protesis ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.radiografias ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.presupuestos ENABLE ROW LEVEL SECURITY;
ALTER TABLE dental.presupuesto_lineas ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_tratamientos_cat ON dental.tratamientos_catalogo;
CREATE POLICY tenant_isolation_tratamientos_cat ON dental.tratamientos_catalogo
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_odontogramas ON dental.odontogramas;
CREATE POLICY tenant_isolation_odontogramas ON dental.odontogramas
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_odontograma_piezas ON dental.odontograma_piezas;
CREATE POLICY tenant_isolation_odontograma_piezas ON dental.odontograma_piezas
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_tratamientos_pac ON dental.tratamientos_paciente;
CREATE POLICY tenant_isolation_tratamientos_pac ON dental.tratamientos_paciente
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_ortodoncia ON dental.ortodoncia;
CREATE POLICY tenant_isolation_ortodoncia ON dental.ortodoncia
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_ortodoncia_citas ON dental.ortodoncia_citas;
CREATE POLICY tenant_isolation_ortodoncia_citas ON dental.ortodoncia_citas
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_protesis ON dental.protesis;
CREATE POLICY tenant_isolation_protesis ON dental.protesis
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_radiografias ON dental.radiografias;
CREATE POLICY tenant_isolation_radiografias ON dental.radiografias
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_presupuestos ON dental.presupuestos;
CREATE POLICY tenant_isolation_presupuestos ON dental.presupuestos
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_presupuesto_lineas ON dental.presupuesto_lineas;
CREATE POLICY tenant_isolation_presupuesto_lineas ON dental.presupuesto_lineas
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- ============================================================================
-- FIN DENTAL SCHEMA
-- ============================================================================

View File

@ -0,0 +1,101 @@
-- ============================================================================
-- SEED DATA: Catálogos de Clínica Dental
-- Especialización de ERP-Clínicas
-- ============================================================================
-- NOTA: Ejecutar después de SET app.current_tenant_id = 'UUID-DEL-TENANT';
-- ============================================================================
-- Tratamientos dentales
INSERT INTO dental.tratamientos_catalogo (tenant_id, codigo, nombre, categoria, duracion_minutos, precio_base, requiere_rx, requiere_anestesia)
SELECT current_setting('app.current_tenant_id', true)::UUID, codigo, nombre, categoria, duracion, precio, rx, anestesia
FROM (VALUES
-- Prevención
('PREV-001', 'Limpieza dental básica', 'prevencion', 45, 600.00, false, false),
('PREV-002', 'Limpieza dental profunda', 'prevencion', 60, 1200.00, false, true),
('PREV-003', 'Aplicación de flúor', 'prevencion', 15, 300.00, false, false),
('PREV-004', 'Sellador de fosetas', 'prevencion', 20, 400.00, false, false),
-- Restauración
('REST-001', 'Resina simple (1 cara)', 'restauracion', 30, 800.00, true, true),
('REST-002', 'Resina compuesta (2 caras)', 'restauracion', 45, 1000.00, true, true),
('REST-003', 'Resina compleja (3+ caras)', 'restauracion', 60, 1300.00, true, true),
('REST-004', 'Incrustación de resina', 'restauracion', 90, 2500.00, true, true),
('REST-005', 'Incrustación de porcelana', 'restauracion', 90, 4000.00, true, true),
-- Endodoncia
('ENDO-001', 'Endodoncia unirradicular', 'endodoncia', 60, 3000.00, true, true),
('ENDO-002', 'Endodoncia birradicular', 'endodoncia', 90, 4000.00, true, true),
('ENDO-003', 'Endodoncia multirradicular', 'endodoncia', 120, 5000.00, true, true),
('ENDO-004', 'Retratamiento endodóntico', 'endodoncia', 120, 5500.00, true, true),
-- Periodoncia
('PERIO-001', 'Raspado y alisado radicular (cuadrante)', 'periodoncia', 60, 1500.00, true, true),
('PERIO-002', 'Cirugía periodontal', 'periodoncia', 120, 6000.00, true, true),
-- Cirugía
('CIRUG-001', 'Extracción simple', 'cirugia', 30, 800.00, true, true),
('CIRUG-002', 'Extracción de tercer molar', 'cirugia', 60, 3500.00, true, true),
('CIRUG-003', 'Extracción quirúrgica compleja', 'cirugia', 90, 5000.00, true, true),
-- Prótesis
('PROT-001', 'Corona de porcelana', 'protesis', 60, 6000.00, true, true),
('PROT-002', 'Corona de zirconia', 'protesis', 60, 8000.00, true, true),
('PROT-003', 'Puente fijo (3 unidades)', 'protesis', 120, 18000.00, true, true),
('PROT-004', 'Prótesis parcial removible', 'protesis', 120, 8000.00, true, false),
('PROT-005', 'Prótesis total', 'protesis', 180, 12000.00, true, false),
-- Implantes
('IMPL-001', 'Implante dental (sin corona)', 'implantes', 90, 15000.00, true, true),
('IMPL-002', 'Corona sobre implante', 'implantes', 60, 8000.00, false, false),
-- Ortodoncia
('ORTO-001', 'Brackets metálicos (tratamiento completo)', 'ortodoncia', 60, 35000.00, true, false),
('ORTO-002', 'Brackets estéticos (tratamiento completo)', 'ortodoncia', 60, 45000.00, true, false),
('ORTO-003', 'Alineadores invisibles', 'ortodoncia', 45, 60000.00, true, false),
('ORTO-004', 'Control mensual ortodoncia', 'ortodoncia', 30, 800.00, false, false),
('ORTO-005', 'Retenedor fijo', 'ortodoncia', 45, 3000.00, false, false),
-- Estética
('ESTE-001', 'Blanqueamiento en consultorio', 'estetica', 90, 5000.00, false, false),
('ESTE-002', 'Blanqueamiento casero', 'estetica', 30, 3000.00, false, false),
('ESTE-003', 'Carilla de resina', 'estetica', 60, 3500.00, false, false),
('ESTE-004', 'Carilla de porcelana', 'estetica', 60, 8000.00, false, false),
-- Diagnóstico
('DIAG-001', 'Radiografía periapical', 'diagnostico', 5, 100.00, false, false),
('DIAG-002', 'Radiografía panorámica', 'diagnostico', 10, 500.00, false, false),
('DIAG-003', 'Radiografía cefalométrica', 'diagnostico', 10, 400.00, false, false),
('DIAG-004', 'Tomografía dental', 'diagnostico', 15, 1500.00, false, false)
) AS t(codigo, nombre, categoria, duracion, precio, rx, anestesia)
WHERE current_setting('app.current_tenant_id', true) IS NOT NULL
AND current_setting('app.current_tenant_id', true) != ''
ON CONFLICT (tenant_id, codigo) DO NOTHING;
-- Skills específicos dentales
INSERT INTO hr.skills (tenant_id, skill_type_id, name, requiere_cedula)
SELECT
current_setting('app.current_tenant_id', true)::UUID,
st.id,
unnest(ARRAY[
'Odontología General',
'Ortodoncia',
'Endodoncia',
'Periodoncia',
'Cirugía Maxilofacial',
'Odontopediatría',
'Prostodoncia',
'Implantología',
'Estética Dental',
'Rehabilitación Oral'
]),
true
FROM hr.skill_types st
WHERE st.name = 'Especialidad Médica'
AND st.tenant_id = current_setting('app.current_tenant_id', true)::UUID
ON CONFLICT DO NOTHING;
-- Ubicaciones (unidades dentales)
INSERT INTO hr.work_locations (tenant_id, name, tipo_consultorio, capacidad, equipamiento)
SELECT current_setting('app.current_tenant_id', true)::UUID, name, tipo, capacidad, equipamiento::TEXT[]
FROM (VALUES
('Unidad Dental 1', 'especialidad', 1, ARRAY['sillon', 'rayos_x', 'ultrasonido']),
('Unidad Dental 2', 'especialidad', 1, ARRAY['sillon', 'rayos_x', 'ultrasonido']),
('Unidad Dental 3', 'especialidad', 1, ARRAY['sillon', 'rayos_x']),
('Quirófano Dental', 'quirofano', 1, ARRAY['sillon', 'rayos_x', 'equipo_cirugia']),
('Sala de Rayos X', 'laboratorio', 2, ARRAY['panoramico', 'cefalometrico']),
('Laboratorio Dental', 'laboratorio', 2, ARRAY['modelos', 'protesis'])
) AS t(name, tipo, capacidad, equipamiento)
WHERE current_setting('app.current_tenant_id', true) IS NOT NULL
AND current_setting('app.current_tenant_id', true) != ''
ON CONFLICT DO NOTHING;

View File

@ -0,0 +1,44 @@
# Vision General - Clinica Dental
## Proposito
Sistema de gestion integral para clinicas dentales que permite:
1. **Gestion de Pacientes**
- Expedientes con historial completo
- Odontograma digital interactivo
- Historial de tratamientos
2. **Consultas Dentales**
- Registro de diagnosticos
- Planes de tratamiento
- Presupuestos detallados
3. **Especialidades**
- Ortodoncia (brackets, alineadores)
- Endodoncia (tratamientos de conductos)
- Protesis (coronas, puentes, dentaduras)
- Cirugia (extracciones, implantes)
4. **Operaciones**
- Inventario de materiales
- Facturacion de servicios
- Agenda de citas
## Usuarios
| Rol | Acceso |
|-----|--------|
| Odontologo | Consultas, diagnosticos, tratamientos |
| Auxiliar dental | Apoyo en procedimientos |
| Recepcionista | Citas, cobros |
| Administrador | Gestion completa |
## Alcance
- **Incluido:** Gestion clinica, odontograma, tratamientos, facturacion
- **Excluido:** Contabilidad avanzada (usa erp-core), nomina
## Referencias
Ver `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` para detalles completos del negocio.

View File

@ -0,0 +1,348 @@
# VISION - Sistema de Gestion Clinica Dental
**Proyecto:** clinica-dental
**Version:** 1.0.0
**Fecha:** 2026-01-07
**Estado:** Fase 0 - Documentacion
---
## 1. PROPOSITO
Sistema de gestion integral para clinicas odontologicas que permite administrar pacientes, expedientes clinicos, odontogramas digitales, tratamientos dentales, citas, facturacion e inventario de materiales.
### Problema que Resuelve
- Falta de registro digital estructurado del estado dental de pacientes
- Dificultad para dar seguimiento a tratamientos de larga duracion (ortodoncia)
- Gestion manual de citas y disponibilidad de sillones
- Control deficiente de inventario de materiales dentales
- Falta de trazabilidad en procedimientos y presupuestos
### Propuesta de Valor
- **Odontograma digital interactivo** con nomenclatura FDI
- **Historial por pieza dental** con fotos y radiografias
- **Seguimiento de tratamientos** con alertas de proximas citas
- **Presupuestos detallados** con planes de pago
- **Control de inventario** de materiales por procedimiento
---
## 2. OBJETIVOS PRINCIPALES
### O1: Gestion de Pacientes y Expedientes
- Registro completo de datos del paciente
- Historial clinico odontologico
- Alergias y contraindicaciones
- Consentimientos informados digitales
### O2: Odontograma Digital
- Representacion grafica de 32 piezas (adulto) o deciduos
- Estado por pieza: sano, caries, obturacion, ausente, etc.
- Registro de caras afectadas (M, D, O, V, L)
- Historial de cambios por fecha
### O3: Gestion de Tratamientos
- Catalogo de procedimientos dentales
- Planes de tratamiento personalizados
- Seguimiento de citas por tratamiento
- Presupuestos con opciones de pago
### O4: Especialidades Integradas
- Ortodoncia (brackets, alineadores, retenedores)
- Endodoncia (tratamientos de conductos)
- Periodoncia (raspados, cirugia)
- Prostodoncia (coronas, puentes, implantes)
- Estetica dental (blanqueamiento, carillas)
### O5: Operacion de Clinica
- Agenda de citas por odontologo y sillon
- Control de inventario de materiales
- Facturacion integrada
- Reportes de productividad
---
## 3. USUARIOS Y ROLES
| Rol | Descripcion | Permisos Principales |
|-----|-------------|---------------------|
| **Odontologo** | Medico tratante | Consultas, diagnosticos, tratamientos, prescripciones |
| **Auxiliar Dental** | Apoyo en procedimientos | Ver expedientes, actualizar estado, preparar materiales |
| **Recepcionista** | Atencion al paciente | Agendar citas, cobros, captura de datos |
| **Higienista** | Profilaxis dental | Limpiezas, aplicar fluor, selladores |
| **Tecnico Dental** | Trabajos protesicos | Ver ordenes de laboratorio, actualizar estatus |
| **Administrador** | Gestion general | Configuracion, reportes, usuarios, catalogs |
---
## 4. FUNCIONALIDADES CORE
### 4.1 Modulo Odontograma
```yaml
entidad_principal: odontograma
campos:
- id: UUID
- paciente_id: UUID (FK)
- fecha_registro: TIMESTAMP
- tipo: ENUM (adulto, deciduo)
- piezas: JSONB[]
funcionalidades:
- Vista grafica interactiva de dentadura
- Click en pieza para ver/editar estado
- Colores por estado (verde=sano, rojo=caries, gris=ausente)
- Historial de cambios por pieza
- Comparativa entre fechas
```
### 4.2 Modulo Tratamientos
```yaml
entidad_principal: tratamiento
campos:
- id: UUID
- paciente_id: UUID (FK)
- pieza_id: UUID (FK, opcional)
- procedimiento_id: UUID (FK catalogo)
- fecha_inicio: DATE
- fecha_fin: DATE
- estado: ENUM (pendiente, en_proceso, completado, cancelado)
- costo: DECIMAL
- odontologo_id: UUID (FK)
funcionalidades:
- Plan de tratamiento con multiples procedimientos
- Asociacion a pieza dental especifica
- Seguimiento de citas relacionadas
- Presupuesto automatico
- Notas clinicas por cita
```
### 4.3 Modulo Ortodoncia
```yaml
entidad_principal: caso_ortodoncia
campos:
- id: UUID
- paciente_id: UUID (FK)
- tipo: ENUM (brackets_metalicos, brackets_ceramicos, alineadores, retenedores)
- fecha_colocacion: DATE
- fecha_estimada_retiro: DATE
- citas_control: INTEGER (cada cuantas semanas)
- estado: ENUM (activo, pausado, finalizado)
funcionalidades:
- Registro de estudios iniciales (Rx, fotos, modelos)
- Seguimiento de citas de ajuste
- Fotos de progreso
- Control de retenedores post-tratamiento
```
### 4.4 Modulo Protesis
```yaml
entidad_principal: trabajo_protesico
campos:
- id: UUID
- paciente_id: UUID (FK)
- tipo: ENUM (corona, puente, dentadura_parcial, dentadura_total, implante)
- piezas_involucradas: INTEGER[]
- laboratorio_id: UUID (FK)
- fecha_impresion: DATE
- fecha_entrega_estimada: DATE
- estado: ENUM (impresion, laboratorio, prueba, cementado, entregado)
funcionalidades:
- Ordenes de trabajo a laboratorio
- Seguimiento de estatus
- Registro de pruebas y ajustes
- Garantias
```
---
## 5. NOMENCLATURA DENTAL (FDI)
### Sistema de Numeracion
```
SUPERIOR
Derecho | Izquierdo
18-11 | 21-28
---------|----------
48-41 | 31-38
Derecho | Izquierdo
INFERIOR
Cuadrante 1: Superior derecho (11-18)
Cuadrante 2: Superior izquierdo (21-28)
Cuadrante 3: Inferior izquierdo (31-38)
Cuadrante 4: Inferior derecho (41-48)
```
### Dientes Deciduos (Ninos)
```
Cuadrante 5: Superior derecho deciduo (51-55)
Cuadrante 6: Superior izquierdo deciduo (61-65)
Cuadrante 7: Inferior izquierdo deciduo (71-75)
Cuadrante 8: Inferior derecho deciduo (81-85)
```
### Caras Dentales
| Abreviatura | Nombre | Descripcion |
|-------------|--------|-------------|
| M | Mesial | Hacia el centro de la arcada |
| D | Distal | Alejandose del centro |
| O | Oclusal | Superficie de masticacion (molares) |
| I | Incisal | Borde de corte (incisivos) |
| V | Vestibular | Hacia los labios/mejillas |
| B | Bucal | Sinonimo de vestibular |
| L | Lingual | Hacia la lengua (inferiores) |
| P | Palatino | Hacia el paladar (superiores) |
---
## 6. CATALOGO DE PROCEDIMIENTOS
### Prevencion
- Limpieza dental (profilaxis)
- Aplicacion de fluor
- Selladores de fosetas y fisuras
- Detartraje (remocion de sarro)
### Restauracion
- Resina (por cara)
- Amalgama
- Incrustacion (inlay/onlay)
- Reconstruccion
### Endodoncia
- Tratamiento de conductos (unirradicular)
- Tratamiento de conductos (birradicular)
- Tratamiento de conductos (multirradicular)
- Retratamiento
- Apicoectomia
### Periodoncia
- Raspado y alisado radicular
- Cirugia periodontal
- Injerto de encia
- Ferulizacion
### Cirugia
- Extraccion simple
- Extraccion quirurgica
- Tercer molar retenido
- Frenectomia
- Biopsia
### Protesis
- Corona metal-porcelana
- Corona libre de metal (zirconia)
- Puente fijo
- Dentadura parcial removible
- Dentadura total
- Implante dental
### Ortodoncia
- Colocacion de brackets
- Ajuste mensual
- Retiro de aparatologia
- Retenedor fijo
- Retenedor removible
- Alineadores transparentes
### Estetica
- Blanqueamiento en consultorio
- Blanqueamiento casero
- Carillas de porcelana
- Carillas de resina
- Cierre de diastemas
---
## 7. INTEGRACIONES
| Sistema | Proposito | Prioridad |
|---------|-----------|-----------|
| Radiografias digitales | Captura de Rx periapicales, panoramicas | P1 |
| Laboratorio dental | Ordenes de trabajo protesico | P2 |
| Proveedores | Pedidos de materiales | P2 |
| Facturacion electronica | CFDI 4.0 | P1 |
---
## 8. METRICAS DE EXITO
| Metrica | Descripcion | Objetivo |
|---------|-------------|----------|
| Consultas/dia | Pacientes atendidos por odontologo | 8-12 |
| Tratamientos completados | Planes finalizados por mes | 80% |
| Tasa retencion ortodoncia | Pacientes que completan tratamiento | 90% |
| Ticket promedio | Ingreso por paciente | $2,500+ |
| Ocupacion sillones | Uso de unidades dentales | 85% |
| Satisfaccion paciente | NPS | 8.5+ |
---
## 9. FASES DE DESARROLLO
### Fase 1: Core (MVP)
- Gestion de pacientes
- Odontograma basico
- Agenda de citas
- Facturacion simple
### Fase 2: Tratamientos
- Catalogo de procedimientos
- Planes de tratamiento
- Presupuestos
- Seguimiento de citas
### Fase 3: Especialidades
- Ortodoncia completa
- Endodoncia
- Protesis y laboratorio
- Periodoncia
### Fase 4: Optimizacion
- Reportes avanzados
- Integracion con Rx digitales
- App movil para pacientes
- Recordatorios automaticos
---
## 10. HERENCIA Y DEPENDENCIAS
### Hereda de erp-clinicas
- Modulo Pacientes
- Modulo Expedientes
- Modulo Citas
- Modulo Consultas
- Modulo Recetas
### Hereda de erp-core
- Autenticacion y usuarios
- Roles y permisos
- Facturacion
- Inventario
- Catalogos base
### Especifico Dental (Nuevo)
- Odontograma
- Tratamientos dentales
- Ortodoncia
- Protesis
- Nomenclatura FDI
---
**Documento creado:** 2026-01-07
**Autor:** Agente Orquestador Workspace
**Basado en:** SIMCO v2.5, CONTEXTO-PROYECTO.md

View File

@ -0,0 +1,235 @@
# DENTAL-001: Odontograma Digital
## Metadata
- **Codigo:** DENTAL-001
- **Modulo:** Odontograma
- **Prioridad:** P0
- **Estado:** DDL Completado
- **Fase:** 1 - Core
## Descripcion
Sistema de odontograma digital interactivo que permite registrar y visualizar el estado de cada pieza dental del paciente, siguiendo la nomenclatura FDI (Federation Dentaire Internationale).
## Objetivos
1. Representacion grafica de dentadura completa
2. Registro de estado por pieza dental
3. Registro de afectaciones por cara dental
4. Historial de cambios por fecha
5. Comparativa entre odontogramas
## Alcance
### Incluido
- Vista grafica interactiva (32 piezas adulto + 20 deciduos)
- Estados por pieza: sano, caries, obturacion, endodoncia, corona, etc.
- Caras dentales: Mesial, Distal, Oclusal, Vestibular, Lingual
- Colores por estado (verde=sano, rojo=caries, gris=ausente)
- Historial cronologico
- Notas por pieza
### Excluido
- Edicion de imagen (dibujo libre)
- Generacion 3D
- Integracion directa con camaras intraorales
## Nomenclatura FDI
### Sistema de Numeracion (Adultos)
```
SUPERIOR
Derecho | Izquierdo
18-11 | 21-28
---------|----------
48-41 | 31-38
Derecho | Izquierdo
INFERIOR
Cuadrante 1: Superior derecho (11-18)
Cuadrante 2: Superior izquierdo (21-28)
Cuadrante 3: Inferior izquierdo (31-38)
Cuadrante 4: Inferior derecho (41-48)
```
### Dientes Deciduos (Ninos)
```
Cuadrante 5: Superior derecho deciduo (51-55)
Cuadrante 6: Superior izquierdo deciduo (61-65)
Cuadrante 7: Inferior izquierdo deciduo (71-75)
Cuadrante 8: Inferior derecho deciduo (81-85)
```
## Modelo de Datos
### Tablas
**dental.piezas_dentales** (Catalogo)
- id, numero, nombre, cuadrante, es_temporal
**dental.odontogramas**
- id, tenant_id, patient_id
- fecha_creacion, fecha_actualizacion
- notas
**dental.odontograma_piezas**
- id, tenant_id, odontograma_id, pieza_id
- estado (ENUM: sano, caries, obturacion, etc.)
- caras_afectadas (JSONB)
- observaciones
### Estados de Pieza (ENUM)
| Estado | Color | Descripcion |
|--------|-------|-------------|
| sano | Verde | Pieza sin alteraciones |
| caries | Rojo | Caries activa |
| obturacion | Azul | Restauracion existente |
| endodoncia | Morado | Tratamiento de conductos |
| corona | Dorado | Corona protesica |
| puente | Naranja | Parte de puente |
| implante | Plateado | Implante dental |
| ausente | Gris | Pieza faltante |
| extraccion_indicada | Rojo oscuro | Pendiente de extraccion |
### Caras Dentales
| Abreviatura | Nombre | Descripcion |
|-------------|--------|-------------|
| M | Mesial | Hacia el centro de la arcada |
| D | Distal | Alejandose del centro |
| O | Oclusal | Superficie de masticacion |
| V | Vestibular | Hacia labios/mejillas |
| L | Lingual | Hacia la lengua |
| P | Palatino | Hacia el paladar |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /patients/:id/odontograma | Odontograma actual |
| GET | /patients/:id/odontogramas | Historial de odontogramas |
| POST | /patients/:id/odontograma | Crear nuevo odontograma |
| PUT | /odontogramas/:id | Actualizar odontograma |
| GET | /odontogramas/:id/piezas | Listar piezas |
| PUT | /odontogramas/:id/piezas/:piezaId | Actualizar pieza |
| GET | /odontogramas/:id/historial | Historial de cambios |
| GET | /odontogramas/comparar | Comparar dos fechas |
## Interfaz del Servicio
```typescript
interface OdontogramaService {
getByPatient(patientId: string): Promise<Odontograma>;
create(patientId: string): Promise<Odontograma>;
updatePieza(odontogramaId: string, piezaId: string, data: PiezaUpdate): Promise<Pieza>;
getHistorial(patientId: string): Promise<Odontograma[]>;
compare(patientId: string, fecha1: Date, fecha2: Date): Promise<OdontogramaComparison>;
}
interface PiezaUpdate {
estado: EstadoPieza;
carasAfectadas?: Record<CaraDental, EstadoPieza>;
observaciones?: string;
}
```
## Componente Frontend
### OdontogramaViewer
```typescript
interface OdontogramaViewerProps {
patientId: string;
editable: boolean;
onPiezaClick: (pieza: Pieza) => void;
showDeciduo: boolean;
}
// Colores por estado
const ESTADO_COLORS = {
sano: '#22c55e', // green-500
caries: '#ef4444', // red-500
obturacion: '#3b82f6', // blue-500
endodoncia: '#a855f7', // purple-500
corona: '#f59e0b', // amber-500
ausente: '#9ca3af', // gray-400
implante: '#64748b' // slate-500
};
```
### PiezaEditor (Modal)
```typescript
interface PiezaEditorProps {
pieza: Pieza;
onSave: (data: PiezaUpdate) => void;
onClose: () => void;
}
// Vista de caras (5 cuadrados)
// [V]
// [M] [O] [D]
// [L]
```
## Flujos
### Ver Odontograma
```
1. Odontologo abre expediente de paciente
2. Sistema carga odontograma activo
3. Renderiza vista grafica con colores
4. Click en pieza muestra detalle
5. Puede ver historial de cambios
```
### Actualizar Estado
```
1. Odontologo hace click en pieza
2. Abre modal de edicion
3. Selecciona nuevo estado
4. Marca caras afectadas (si aplica)
5. Agrega observaciones
6. Guarda cambios
7. Sistema actualiza vista y registra historial
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL odontogramas | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| Seeds piezas | Completado | 52 piezas FDI |
| odontograma.module.ts | Pendiente | `backend/modules/odontograma/` |
| odontograma.service.ts | Pendiente | `backend/services/` |
| OdontogramaViewer.tsx | Pendiente | `frontend/components/` |
| PiezaEditor.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- clinica.patients (erp-clinicas)
- Auth/Tenants (erp-core)
### Bloquea a
- DENTAL-002 (Tratamientos - asociacion a pieza)
- DENTAL-006 (Presupuestos - lineas por pieza)
## Criterios de Aceptacion
- [ ] Vista grafica de 32 piezas adulto
- [ ] Vista grafica de 20 piezas deciduo
- [ ] Click en pieza abre editor
- [ ] Estados se reflejan en colores
- [ ] Caras afectadas se registran
- [ ] Historial muestra cambios
- [ ] Comparativa entre fechas funciona
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,212 @@
# DENTAL-002: Tratamientos Dentales
## Metadata
- **Codigo:** DENTAL-002
- **Modulo:** Tratamientos
- **Prioridad:** P0
- **Estado:** DDL Completado
- **Fase:** 2 - Tratamientos
## Descripcion
Sistema de gestion de tratamientos odontologicos: catalogo de procedimientos, planes de tratamiento personalizados, seguimiento de citas, asociacion a piezas dentales y costos.
## Objetivos
1. Catalogo de procedimientos dentales
2. Planes de tratamiento por paciente
3. Asociacion tratamiento-pieza dental
4. Seguimiento de estado
5. Registro de costos
## Alcance
### Incluido
- Catalogo de tratamientos por tenant
- Categorias: prevencion, restauracion, endodoncia, etc.
- Asociacion a pieza y caras especificas
- Estados: pendiente, en_proceso, completado, cancelado
- Duracion estimada y real
- Precios y descuentos
- Vinculacion con citas
### Excluido
- Generacion automatica de presupuestos (ver DENTAL-006)
- Integracion con inventario de materiales
- Consentimientos informados digitales
## Catalogo de Procedimientos
### Prevencion
| Codigo | Procedimiento | Duracion | Precio Base |
|--------|---------------|----------|-------------|
| PREV-001 | Limpieza dental (profilaxis) | 30 min | $500 |
| PREV-002 | Aplicacion de fluor | 15 min | $200 |
| PREV-003 | Selladores de fosetas | 20 min | $350 |
| PREV-004 | Detartraje | 45 min | $800 |
### Restauracion
| Codigo | Procedimiento | Duracion | Precio Base |
|--------|---------------|----------|-------------|
| REST-001 | Resina simple (1 cara) | 30 min | $600 |
| REST-002 | Resina compuesta (2+ caras) | 45 min | $900 |
| REST-003 | Incrustacion inlay | 60 min | $2,500 |
| REST-004 | Incrustacion onlay | 60 min | $3,000 |
| REST-005 | Reconstruccion | 60 min | $1,500 |
### Endodoncia
| Codigo | Procedimiento | Duracion | Precio Base |
|--------|---------------|----------|-------------|
| ENDO-001 | Conductos unirradicular | 60 min | $2,500 |
| ENDO-002 | Conductos birradicular | 90 min | $3,500 |
| ENDO-003 | Conductos multirradicular | 120 min | $4,500 |
| ENDO-004 | Retratamiento | 90 min | $3,000 |
### Cirugia
| Codigo | Procedimiento | Duracion | Precio Base |
|--------|---------------|----------|-------------|
| CIR-001 | Extraccion simple | 30 min | $600 |
| CIR-002 | Extraccion quirurgica | 45 min | $1,200 |
| CIR-003 | Tercer molar retenido | 60 min | $2,500 |
## Modelo de Datos
### Tablas
**dental.tratamientos_catalogo**
- id, tenant_id, codigo, nombre
- categoria, descripcion
- duracion_minutos, precio_base
- requiere_rx, requiere_anestesia
- active
**dental.tratamientos_paciente**
- id, tenant_id, patient_id
- odontograma_id, tratamiento_id
- odontologo_id, consultation_id
- pieza_id, caras_tratadas[]
- fecha_inicio, fecha_fin
- estado, precio, descuento, precio_final
- notas
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /tratamientos/catalogo | Listar catalogo |
| POST | /tratamientos/catalogo | Crear procedimiento |
| PUT | /tratamientos/catalogo/:id | Actualizar |
| DELETE | /tratamientos/catalogo/:id | Desactivar |
| GET | /patients/:id/tratamientos | Tratamientos de paciente |
| POST | /patients/:id/tratamientos | Crear tratamiento |
| PUT | /tratamientos/:id | Actualizar tratamiento |
| PUT | /tratamientos/:id/estado | Cambiar estado |
| GET | /tratamientos/pendientes | Tratamientos pendientes |
| GET | /tratamientos/hoy | Tratamientos del dia |
## Interfaz del Servicio
```typescript
interface TratamientosService {
// Catalogo
getCatalogo(filters?: CatalogoFilters): Promise<Tratamiento[]>;
createProcedimiento(data: CreateProcedimiento): Promise<Tratamiento>;
// Tratamientos paciente
getByPatient(patientId: string): Promise<TratamientoPaciente[]>;
create(data: CreateTratamientoPaciente): Promise<TratamientoPaciente>;
updateEstado(id: string, estado: EstadoTratamiento): Promise<TratamientoPaciente>;
// Reportes
getPendientes(odontologoId?: string): Promise<TratamientoPaciente[]>;
getCompletadosHoy(): Promise<TratamientoPaciente[]>;
}
interface CreateTratamientoPaciente {
patientId: string;
tratamientoId: string;
odontologoId: string;
piezaId?: string;
carasTratadas?: CaraDental[];
precio?: number;
descuento?: number;
notas?: string;
}
```
## Flujos
### Registrar Tratamiento
```
1. Odontologo en consulta del paciente
2. Revisa odontograma actual
3. Identifica pieza a tratar
4. Selecciona procedimiento del catalogo
5. Especifica caras afectadas (si aplica)
6. Confirma precio (puede aplicar descuento)
7. Guarda tratamiento como "pendiente" o "en_proceso"
8. Sistema actualiza estado del odontograma
```
### Completar Tratamiento
```
1. Odontologo abre tratamiento en curso
2. Registra notas del procedimiento
3. Cambia estado a "completado"
4. Sistema registra fecha de finalizacion
5. Actualiza odontograma automaticamente
6. Tratamiento listo para facturacion
```
## Estados de Tratamiento
```
pendiente ──► en_proceso ──► completado
│ │
└──────────────┴──► cancelado
```
| Estado | Descripcion | Facturar |
|--------|-------------|----------|
| pendiente | Agendado, no iniciado | No |
| en_proceso | En ejecucion | Parcial |
| completado | Finalizado | Si |
| cancelado | No se realizara | No |
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL tratamientos | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| tratamientos.module.ts | Pendiente | `backend/modules/tratamientos/` |
| tratamientos.service.ts | Pendiente | `backend/services/` |
| Seeds catalogo | Pendiente | `database/seeds/` |
| TratamientosList.tsx | Pendiente | `frontend/components/` |
| TratamientoForm.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- DENTAL-001 (Odontograma)
- clinica.patients (erp-clinicas)
- clinica.consultations (erp-clinicas)
### Bloquea a
- DENTAL-006 (Presupuestos)
- Facturacion
## Criterios de Aceptacion
- [ ] Catalogo de procedimientos por tenant
- [ ] CRUD de tratamientos por paciente
- [ ] Asociacion a pieza dental
- [ ] Estados se actualizan correctamente
- [ ] Historial de tratamientos visible
- [ ] Precio final calcula con descuento
- [ ] Integracion con citas funciona
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,249 @@
# DENTAL-003: Ortodoncia
## Metadata
- **Codigo:** DENTAL-003
- **Modulo:** Ortodoncia
- **Prioridad:** P1
- **Estado:** DDL Completado
- **Fase:** 3 - Especialidades
## Descripcion
Sistema de gestion de tratamientos de ortodoncia: registro de casos, tipos de aparatologia, seguimiento de citas de ajuste, control de progreso, planes de pago, y finalizacion con retenedores.
## Objetivos
1. Registro de casos de ortodoncia
2. Tipos de aparatologia (brackets, alineadores)
3. Citas de ajuste mensuales
4. Seguimiento de progreso
5. Plan de pagos (enganche + mensualidades)
## Alcance
### Incluido
- Tipos: brackets metalicos, esteticos, linguales, alineadores
- Registro de fecha inicio/fin estimada
- Citas de control con detalles de ajuste
- Fotos de progreso (vinculo a storage)
- Control de arcos, ligas, elasticos
- Plan de pago con financiamiento
### Excluido
- Cefalometria digital
- Simulacion de resultados
- Analisis de modelos 3D
## Tipos de Ortodoncia
| Tipo | Descripcion | Duracion Tipica |
|------|-------------|-----------------|
| brackets_metalicos | Brackets tradicionales | 18-24 meses |
| brackets_esteticos | Brackets ceramicos/zafiro | 18-24 meses |
| brackets_linguales | Brackets en cara interna | 18-30 meses |
| alineadores | Alineadores transparentes | 12-18 meses |
| removible | Aparatos removibles | Variable |
| retenedor | Post-tratamiento | Indefinido |
## Modelo de Datos
### Tablas
**dental.ortodoncia**
- id, tenant_id, patient_id, odontologo_id
- tipo (ENUM), marca
- fecha_inicio, fecha_estimada_fin, fecha_real_fin
- estado, meses_estimados
- costo_total, enganche, mensualidad
- notas
**dental.ortodoncia_citas**
- id, tenant_id, ortodoncia_id
- appointment_id
- fecha, numero_cita
- procedimiento
- arco_superior, arco_inferior, ligas
- observaciones, proxima_cita
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /ortodoncia | Listar casos activos |
| GET | /ortodoncia/:id | Detalle de caso |
| POST | /ortodoncia | Crear caso |
| PUT | /ortodoncia/:id | Actualizar caso |
| PUT | /ortodoncia/:id/finalizar | Finalizar tratamiento |
| GET | /ortodoncia/:id/citas | Historial de citas |
| POST | /ortodoncia/:id/citas | Registrar cita |
| GET | /patients/:id/ortodoncia | Casos del paciente |
| GET | /ortodoncia/proximas-citas | Citas proximas |
## Interfaz del Servicio
```typescript
interface OrtodonticService {
getCasosActivos(): Promise<CasoOrtodoncia[]>;
getById(id: string): Promise<CasoOrtodoncia>;
create(data: CreateCasoOrtodoncia): Promise<CasoOrtodoncia>;
registrarCita(casoId: string, data: CitaOrtodoncia): Promise<CitaOrtodoncia>;
finalizar(id: string, data: FinalizarOrtodoncia): Promise<CasoOrtodoncia>;
getProximasCitas(dias: number): Promise<CitaOrtodoncia[]>;
}
interface CreateCasoOrtodoncia {
patientId: string;
odontologoId: string;
tipo: TipoOrtodoncia;
marca?: string;
fechaInicio: Date;
mesesEstimados: number;
costoTotal: number;
enganche?: number;
mensualidad?: number;
}
interface CitaOrtodoncia {
fecha: Date;
numeroCita: number;
procedimiento: string;
arcoSuperior?: string;
arcoInferior?: string;
ligas?: string;
observaciones?: string;
proximaCita?: Date;
}
```
## Flujos
### Iniciar Caso de Ortodoncia
```
1. Consulta de valoracion ortodontica
2. Estudios iniciales (Rx panoramica, fotos, modelos)
3. Diagnostico y plan de tratamiento
4. Presentar presupuesto al paciente
5. Paciente acepta y paga enganche
6. Crear caso de ortodoncia en sistema
7. Agendar cita de colocacion
8. Colocar aparatologia
9. Registrar primera cita
```
### Cita de Ajuste Mensual
```
1. Paciente llega a cita programada
2. Revision de aparatologia
3. Cambio de arcos/ligas si necesario
4. Registrar procedimiento realizado
5. Tomar fotos de progreso (opcional)
6. Agendar proxima cita
7. Cobrar mensualidad
```
### Finalizacion
```
1. Tratamiento activo completo
2. Retiro de aparatologia
3. Colocacion de retenedores
4. Marcar caso como "finalizado"
5. Crear nuevo caso tipo "retenedor"
6. Programar citas de revision (3, 6, 12 meses)
```
## Plan de Pagos
```typescript
interface PlanPagoOrtodoncia {
costoTotal: number; // $45,000
enganche: number; // $10,000
saldoPendiente: number; // $35,000
numeroPagos: number; // 18
montoPago: number; // $1,944.44
fechaInicio: Date;
pagosRealizados: number;
saldoActual: number;
}
```
## Componentes Frontend
### OrtodonciaTimeline
```typescript
// Visualizacion de progreso del tratamiento
interface OrtodonciaTimelineProps {
caso: CasoOrtodoncia;
citas: CitaOrtodoncia[];
}
// Muestra:
// - Linea de tiempo con citas
// - Progreso vs estimado
// - Proxima cita destacada
// - Fotos de progreso
```
### CitaOrtodonticaForm
```typescript
interface CitaOrtodonticaFormProps {
casoId: string;
numeroCita: number;
onSave: (data: CitaOrtodoncia) => void;
}
// Campos:
// - Procedimiento realizado
// - Arco superior/inferior
// - Ligas/elasticos
// - Observaciones
// - Fecha proxima cita
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL ortodoncia | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| ortodoncia.module.ts | Pendiente | `backend/modules/ortodoncia/` |
| ortodoncia.service.ts | Pendiente | `backend/services/` |
| OrtodonciaTimeline.tsx | Pendiente | `frontend/components/` |
| CitaOrtodonticaForm.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- clinica.patients (erp-clinicas)
- clinica.appointments (erp-clinicas)
- DENTAL-006 (Presupuestos - para plan de pago)
### Bloquea a
- Reportes de ortodoncia
- Recordatorios automaticos
## Criterios de Aceptacion
- [ ] CRUD de casos de ortodoncia
- [ ] Tipos de aparatologia correctos
- [ ] Citas de ajuste se registran
- [ ] Progreso visual en timeline
- [ ] Plan de pago funciona
- [ ] Finalizacion crea caso retenedor
- [ ] Proximas citas se listan
## Metricas
| Metrica | Descripcion |
|---------|-------------|
| Casos activos | Tratamientos en curso |
| Tasa finalizacion | % que completan tratamiento |
| Duracion promedio | Meses reales vs estimados |
| Desercion | Pacientes que abandonan |
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,227 @@
# DENTAL-004: Protesis Dentales
## Metadata
- **Codigo:** DENTAL-004
- **Modulo:** Protesis
- **Prioridad:** P1
- **Estado:** DDL Completado
- **Fase:** 3 - Especialidades
## Descripcion
Sistema de gestion de trabajos protesicos: coronas, puentes, dentaduras, implantes. Incluye ordenes de trabajo a laboratorio, seguimiento de estatus, materiales, colores, y garantias.
## Objetivos
1. Registro de trabajos protesicos
2. Ordenes a laboratorio dental
3. Seguimiento de estatus
4. Control de materiales y colores
5. Gestion de garantias
## Alcance
### Incluido
- Tipos: corona, puente, parcial removible, total, implante
- Piezas involucradas en el trabajo
- Integracion con laboratorios externos
- Fechas: impresion, envio lab, recepcion, colocacion
- Material y color (guia VITA)
- Garantias configurables
- Costo laboratorio vs precio paciente
### Excluido
- Diseno CAD/CAM propio
- Impresion 3D in-house
- Inventario de protesis prefabricadas
## Tipos de Protesis
| Tipo | Descripcion | Piezas |
|------|-------------|--------|
| corona | Corona unitaria | 1 |
| puente | Puente fijo | 3+ |
| parcial | Dentadura parcial removible | Variable |
| total | Dentadura completa | 14/16 |
| implante | Implante con corona | 1 |
## Modelo de Datos
### Tabla: dental.protesis
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| patient_id | UUID | FK patients |
| odontologo_id | UUID | FK doctors |
| tipo | VARCHAR(50) | corona, puente, etc. |
| piezas_involucradas | TEXT[] | ['11', '12', '13'] |
| laboratorio_id | UUID | FK proveedores |
| fecha_envio_lab | DATE | Envio de impresion |
| fecha_recepcion_lab | DATE | Recepcion del trabajo |
| material | VARCHAR(100) | Zirconia, metal-porcelana |
| color | VARCHAR(50) | A2, B1, etc. |
| estado | ENUM | en_proceso, completado |
| fecha_colocacion | DATE | Fecha de cementado |
| tiene_garantia | BOOLEAN | |
| meses_garantia | INTEGER | 12, 24, etc. |
| costo_laboratorio | NUMERIC | Costo del lab |
| precio_paciente | NUMERIC | Precio cobrado |
## Estados del Trabajo
```
impresion ──► laboratorio ──► prueba ──► ajuste ──► cementado ──► entregado
└──► devolucion (si hay problemas)
```
| Estado | Descripcion |
|--------|-------------|
| impresion | Toma de impresion/escaneo |
| laboratorio | Enviado al laboratorio |
| prueba | Prueba en boca |
| ajuste | Requiere ajustes |
| cementado | Cementado definitivo |
| entregado | Finalizado |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /protesis | Listar trabajos |
| GET | /protesis/:id | Detalle de trabajo |
| POST | /protesis | Crear trabajo |
| PUT | /protesis/:id | Actualizar trabajo |
| PUT | /protesis/:id/estado | Cambiar estado |
| GET | /patients/:id/protesis | Trabajos del paciente |
| GET | /protesis/laboratorio | Pendientes en lab |
| GET | /protesis/garantias | Garantias activas |
| POST | /protesis/:id/garantia | Reclamacion garantia |
## Interfaz del Servicio
```typescript
interface ProtesisService {
getAll(filters?: ProtesisFilters): Promise<TrabajoProtesico[]>;
getById(id: string): Promise<TrabajoProtesico>;
create(data: CreateProtesis): Promise<TrabajoProtesico>;
updateEstado(id: string, estado: EstadoProtesis): Promise<TrabajoProtesico>;
getPendientesLab(): Promise<TrabajoProtesico[]>;
getGarantiasActivas(): Promise<TrabajoProtesico[]>;
reclamarGarantia(id: string, motivo: string): Promise<TrabajoProtesico>;
}
interface CreateProtesis {
patientId: string;
odontologoId: string;
tipo: TipoProtesis;
piezasInvolucradas: string[];
laboratorioId?: string;
material: string;
color: string;
tieneGarantia: boolean;
mesesGarantia?: number;
costoLaboratorio: number;
precioPaciente: number;
}
```
## Flujos
### Crear Trabajo Protesico
```
1. Paciente requiere corona/puente
2. Preparacion dental (tallado)
3. Toma de impresion o escaneo digital
4. Seleccion de material y color
5. Crear registro en sistema (estado: impresion)
6. Generar orden de laboratorio
7. Enviar al laboratorio (estado: laboratorio)
```
### Recepcion y Colocacion
```
1. Laboratorio entrega trabajo
2. Registrar recepcion (estado: prueba)
3. Prueba en boca del paciente
4. Si ajustes necesarios: devolver a lab
5. Si ok: cementar (estado: cementado)
6. Dar indicaciones al paciente
7. Marcar como entregado
8. Registrar garantia
```
### Reclamacion de Garantia
```
1. Paciente reporta problema
2. Verificar periodo de garantia
3. Evaluar tipo de falla
4. Si aplica garantia:
- Crear nuevo trabajo sin costo
- Enviar a laboratorio para refaccion
5. Si no aplica: presupuesto normal
```
## Guia de Colores VITA
| Codigo | Nombre | Descripcion |
|--------|--------|-------------|
| A1 | Muy claro | Blanquecino |
| A2 | Claro | Ligeramente amarillo |
| A3 | Medio | Amarillo medio |
| A3.5 | Medio-oscuro | Amarillo intenso |
| A4 | Oscuro | Amarillo oscuro |
| B1 | Claro | Ligeramente naranja |
| B2 | Medio | Naranja claro |
| C1, C2 | Gris | Tonos grisaceos |
| D2, D3 | Rojizo | Tonos rojizos |
## Materiales Comunes
| Material | Uso | Durabilidad |
|----------|-----|-------------|
| Metal-porcelana | Posterior | Alta |
| Zirconia | Anterior/Posterior | Muy alta |
| Disilicato litio | Anterior | Alta |
| Resina | Provisional | Baja |
| Acrilico | Dentaduras | Media |
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL protesis | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| protesis.module.ts | Pendiente | `backend/modules/protesis/` |
| protesis.service.ts | Pendiente | `backend/services/` |
| OrdenLaboratorio.tsx | Pendiente | `frontend/components/` |
| ProtesisTracker.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- clinica.patients (erp-clinicas)
- DENTAL-001 (Odontograma - piezas)
- Catalogo proveedores (laboratorios)
### Bloquea a
- Reportes de protesis
- Integracion con laboratorios digitales
## Criterios de Aceptacion
- [ ] CRUD de trabajos protesicos
- [ ] Estados se actualizan correctamente
- [ ] Piezas involucradas se registran
- [ ] Orden a laboratorio se genera
- [ ] Color y material se guardan
- [ ] Garantias se controlan
- [ ] Costos lab vs paciente
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,250 @@
# DENTAL-005: Radiografias Dentales
## Metadata
- **Codigo:** DENTAL-005
- **Modulo:** Radiografias
- **Prioridad:** P2
- **Estado:** DDL Completado
- **Fase:** 4 - Optimizacion
## Descripcion
Sistema de gestion de radiografias dentales: registro de diferentes tipos de Rx, asociacion a piezas y consultas, almacenamiento de imagenes, e interpretacion diagnostica.
## Objetivos
1. Registro de radiografias por tipo
2. Asociacion a pieza dental
3. Almacenamiento de imagenes
4. Interpretacion diagnostica
5. Historial por paciente
## Alcance
### Incluido
- Tipos: periapical, panoramica, cefalometrica, oclusal, bitewing
- Asociacion a pieza especifica (periapicales)
- Vinculo a consulta donde se tomo
- URL a imagen almacenada
- Campo de interpretacion (texto)
- Historial cronologico
### Excluido
- Captura directa desde sensor RVG
- Analisis automatico con IA
- Visor DICOM integrado
- Cefalometria digital
## Tipos de Radiografias
| Tipo | Descripcion | Uso Comun |
|------|-------------|-----------|
| periapical | Rx de 1-2 piezas | Diagnostico de caries, endodoncia |
| bitewing | Interproximal | Caries interproximales |
| oclusal | Vista oclusal | Piso de boca, paladar |
| panoramica | Ortopantomografia | Vision general, ortodoncia |
| cefalometrica | Lateral de craneo | Ortodoncia |
## Modelo de Datos
### Tabla: dental.radiografias
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| patient_id | UUID | FK patients |
| consultation_id | UUID | FK consultations (opcional) |
| tipo | VARCHAR(50) | periapical, panoramica, etc. |
| pieza_id | UUID | FK piezas_dentales (opcional) |
| fecha | DATE | Fecha de la toma |
| url_imagen | VARCHAR(255) | URL en storage |
| interpretacion | TEXT | Hallazgos |
| created_at | TIMESTAMPTZ | Timestamp creacion |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /patients/:id/radiografias | Radiografias del paciente |
| GET | /radiografias/:id | Detalle de radiografia |
| POST | /radiografias | Registrar radiografia |
| PUT | /radiografias/:id | Actualizar (interpretacion) |
| DELETE | /radiografias/:id | Eliminar |
| POST | /radiografias/:id/upload | Subir imagen |
| GET | /radiografias/:id/imagen | Obtener URL imagen |
| GET | /radiografias/pieza/:piezaId | Rx de una pieza |
## Interfaz del Servicio
```typescript
interface RadiografiasService {
getByPatient(patientId: string): Promise<Radiografia[]>;
getById(id: string): Promise<Radiografia>;
create(data: CreateRadiografia): Promise<Radiografia>;
updateInterpretacion(id: string, interpretacion: string): Promise<Radiografia>;
uploadImage(id: string, file: File): Promise<string>;
getByPieza(piezaId: string): Promise<Radiografia[]>;
}
interface CreateRadiografia {
patientId: string;
consultationId?: string;
tipo: TipoRadiografia;
piezaId?: string;
fecha: Date;
interpretacion?: string;
}
interface Radiografia {
id: string;
patientId: string;
tipo: TipoRadiografia;
pieza?: PiezaDental;
fecha: Date;
urlImagen?: string;
interpretacion?: string;
createdAt: Date;
}
```
## Flujos
### Registrar Radiografia
```
1. Durante consulta, odontologo solicita Rx
2. Tecnico toma la radiografia
3. Exporta imagen del sensor/equipo
4. En sistema, crear registro de radiografia
5. Subir imagen al storage
6. Asociar a pieza (si periapical)
7. Odontologo escribe interpretacion
8. Guardar registro
```
### Consultar Historial
```
1. Odontologo abre expediente del paciente
2. Navega a seccion "Radiografias"
3. Ve listado cronologico
4. Filtra por tipo o pieza
5. Click en miniatura abre visor
6. Puede comparar con Rx anteriores
```
## Interpretacion Estructurada
```typescript
interface InterpretacionRadiografia {
hallazgos: string[]; // Lista de hallazgos
diagnostico?: string; // Diagnostico principal
recomendaciones?: string; // Tratamiento sugerido
comparativaAnterior?: string; // Cambios vs Rx previa
}
// Ejemplo:
{
hallazgos: [
"Lesion radiolucida apical en pieza 36",
"Obturacion deficiente en conducto distal",
"Ensanchamiento del ligamento periodontal"
],
diagnostico: "Periodontitis apical cronica",
recomendaciones: "Retratamiento de conductos + corona"
}
```
## Almacenamiento de Imagenes
```typescript
// Estructura de paths
// storage/
// └── {tenant_id}/
// └── radiografias/
// └── {patient_id}/
// └── {radiografia_id}.jpg
// Integracion con modulo Storage
async uploadImage(radiografiaId: string, file: File): Promise<string> {
const radiografia = await this.getById(radiografiaId);
const path = `radiografias/${radiografia.patientId}/${radiografiaId}`;
const url = await this.storageService.upload(file, path);
await this.update(radiografiaId, { urlImagen: url });
return url;
}
```
## Visor de Radiografias
```typescript
interface RadiogViewer {
// Funcionalidades basicas
zoom: (factor: number) => void;
pan: (x: number, y: number) => void;
rotate: (degrees: number) => void;
// Ajustes de imagen
brightness: (value: number) => void;
contrast: (value: number) => void;
invert: () => void;
// Herramientas
ruler: () => void; // Medir distancias
annotate: () => void; // Agregar notas
}
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL radiografias | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| radiografias.module.ts | Pendiente | `backend/modules/radiografias/` |
| radiografias.service.ts | Pendiente | `backend/services/` |
| RadiografiasGrid.tsx | Pendiente | `frontend/components/` |
| RadiogViewer.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- clinica.patients (erp-clinicas)
- clinica.consultations (erp-clinicas)
- DENTAL-001 (Odontograma - piezas)
- Storage service (para imagenes)
### Bloquea a
- Exportacion a PACS
- Analisis con IA
## Criterios de Aceptacion
- [ ] Registro de Rx por tipo
- [ ] Asociacion a pieza funciona
- [ ] Upload de imagen funciona
- [ ] Visor basico (zoom, pan)
- [ ] Interpretacion se guarda
- [ ] Historial por paciente
- [ ] Filtros funcionan
## Consideraciones
### Formatos Soportados
- JPEG (comprimido)
- PNG (sin perdida)
- DICOM (futuro)
### Tamano Maximo
- 10 MB por imagen
- Resolucion recomendada: 1024x768 min
### Retencion
- Minimo 5 anos (regulatorio)
- Backup automatico
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,261 @@
# DENTAL-006: Presupuestos
## Metadata
- **Codigo:** DENTAL-006
- **Modulo:** Presupuestos
- **Prioridad:** P0
- **Estado:** DDL Completado
- **Fase:** 2 - Tratamientos
## Descripcion
Sistema de presupuestos dentales: creacion de planes de tratamiento con costos, lineas de presupuesto por procedimiento y pieza, descuentos, planes de pago, y seguimiento de aceptacion.
## Objetivos
1. Presupuestos detallados por paciente
2. Lineas por procedimiento y pieza
3. Descuentos globales y por linea
4. Opciones de financiamiento
5. Seguimiento de estado
## Alcance
### Incluido
- Presupuestos con numero correlativo
- Lineas con tratamiento, pieza, cantidad, precio
- Descuentos porcentuales y en monto
- Fecha de vencimiento
- Estados: pendiente, aprobado, rechazado, vencido
- Plan de pago (enganche + mensualidades)
- Impresion/PDF del presupuesto
### Excluido
- Firma electronica
- Consentimiento informado integrado
- Generacion automatica desde odontograma
## Modelo de Datos
### Tablas
**dental.presupuestos**
- id, tenant_id, patient_id, odontologo_id
- numero (correlativo)
- fecha, fecha_vencimiento
- estado (pendiente, aprobado, rechazado, vencido)
- subtotal, descuento_porcentaje, descuento_monto, total
- requiere_financiamiento, enganche, numero_pagos, monto_pago
- notas
**dental.presupuesto_lineas**
- id, tenant_id, presupuesto_id
- tratamiento_id, pieza_id
- descripcion
- cantidad, precio_unitario, descuento, subtotal
- sequence
## Estados del Presupuesto
```
pendiente ──► aprobado ──► en_tratamiento ──► completado
├──► rechazado
└──► vencido (automatico por fecha)
```
| Estado | Descripcion |
|--------|-------------|
| pendiente | Presentado, esperando decision |
| aprobado | Aceptado por el paciente |
| rechazado | Rechazado por el paciente |
| vencido | Expiro la vigencia |
| en_tratamiento | Tratamientos en curso |
| completado | Todos los tratamientos finalizados |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /presupuestos | Listar presupuestos |
| GET | /presupuestos/:id | Detalle |
| POST | /presupuestos | Crear presupuesto |
| PUT | /presupuestos/:id | Actualizar |
| DELETE | /presupuestos/:id | Eliminar (solo pendientes) |
| PUT | /presupuestos/:id/aprobar | Aprobar |
| PUT | /presupuestos/:id/rechazar | Rechazar |
| GET | /patients/:id/presupuestos | Presupuestos del paciente |
| GET | /presupuestos/:id/pdf | Generar PDF |
| POST | /presupuestos/:id/lineas | Agregar linea |
| PUT | /presupuestos/:id/lineas/:lineaId | Actualizar linea |
| DELETE | /presupuestos/:id/lineas/:lineaId | Eliminar linea |
## Interfaz del Servicio
```typescript
interface PresupuestosService {
getAll(filters?: PresupuestoFilters): Promise<Presupuesto[]>;
getById(id: string): Promise<Presupuesto>;
create(data: CreatePresupuesto): Promise<Presupuesto>;
addLinea(presupuestoId: string, linea: CreateLinea): Promise<PresupuestoLinea>;
removeLinea(presupuestoId: string, lineaId: string): Promise<void>;
aprobar(id: string): Promise<Presupuesto>;
rechazar(id: string, motivo?: string): Promise<Presupuesto>;
generarPDF(id: string): Promise<Buffer>;
calcularTotales(id: string): Promise<PresupuestoTotales>;
}
interface CreatePresupuesto {
patientId: string;
odontologoId: string;
fechaVencimiento?: Date;
descuentoPorcentaje?: number;
requiereFinanciamiento?: boolean;
enganche?: number;
numeroPagos?: number;
notas?: string;
}
interface CreateLinea {
tratamientoId: string;
piezaId?: string;
descripcion?: string;
cantidad: number;
precioUnitario: number;
descuento?: number;
}
```
## Flujos
### Crear Presupuesto
```
1. Odontologo realiza exploracion
2. Identifica tratamientos necesarios
3. Crear nuevo presupuesto
4. Agregar lineas:
- Seleccionar tratamiento del catalogo
- Asociar pieza dental (si aplica)
- Ajustar precio si es diferente al base
- Aplicar descuento por linea
5. Aplicar descuento global (si aplica)
6. Configurar plan de pago (si requiere)
7. Guardar presupuesto
8. Presentar al paciente (imprimir o enviar)
```
### Aprobar Presupuesto
```
1. Paciente acepta presupuesto
2. Marcar como "aprobado"
3. Si requiere financiamiento:
- Registrar enganche recibido
- Generar calendario de pagos
4. Crear tratamientos a partir de lineas
5. Agendar primera cita
```
## Calculo de Totales
```typescript
function calcularTotales(presupuesto: Presupuesto): PresupuestoTotales {
// Sumar lineas
const subtotal = presupuesto.lineas.reduce((sum, linea) => {
const lineaTotal = linea.cantidad * linea.precioUnitario;
const lineaDescuento = lineaTotal * (linea.descuento / 100);
return sum + (lineaTotal - lineaDescuento);
}, 0);
// Descuento global
let descuentoMonto = 0;
if (presupuesto.descuentoPorcentaje > 0) {
descuentoMonto = subtotal * (presupuesto.descuentoPorcentaje / 100);
}
const total = subtotal - descuentoMonto;
// Plan de pago
let montoPago = 0;
if (presupuesto.requiereFinanciamiento && presupuesto.numeroPagos > 0) {
const saldo = total - (presupuesto.enganche || 0);
montoPago = saldo / presupuesto.numeroPagos;
}
return { subtotal, descuentoMonto, total, montoPago };
}
```
## Formato PDF
```
┌─────────────────────────────────────────────────────────┐
│ [LOGO] CLINICA DENTAL XYZ │
│ RFC: ABC123456789 │
│ Direccion: Calle 123, Ciudad │
├─────────────────────────────────────────────────────────┤
│ PRESUPUESTO No. PRE-2026-0001 │
│ Fecha: 07/01/2026 Vigencia: 07/02/2026 │
├─────────────────────────────────────────────────────────┤
│ PACIENTE: Juan Perez Garcia │
│ ODONTOLOGO: Dr. Maria Lopez │
├─────────────────────────────────────────────────────────┤
│ # │ Tratamiento │ Pieza │ Cant │ P.U. │Total │
│────┼──────────────────────┼───────┼──────┼───────┼──────│
│ 1 │ Limpieza dental │ - │ 1 │ $500 │ $500 │
│ 2 │ Resina simple │ 36 │ 1 │ $600 │ $600 │
│ 3 │ Endodoncia unirrad. │ 16 │ 1 │$2,500 │$2,500│
│ 4 │ Corona zirconia │ 16 │ 1 │$6,000 │$6,000│
├─────────────────────────────────────────────────────────┤
│ Subtotal: $9,600 │
│ Descuento (10%): -$960 │
│ TOTAL: $8,640 │
├─────────────────────────────────────────────────────────┤
│ PLAN DE PAGO: │
│ Enganche: $2,640 12 pagos de: $500 │
├─────────────────────────────────────────────────────────┤
│ Notas: │
│ - Vigencia de 30 dias │
│ - Precios incluyen materiales │
│ - No incluye radiografias adicionales │
└─────────────────────────────────────────────────────────┘
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL presupuestos | Completado | `database/schemas/01-dental-schema-ddl.sql` |
| presupuestos.module.ts | Pendiente | `backend/modules/presupuestos/` |
| presupuestos.service.ts | Pendiente | `backend/services/` |
| pdf.generator.ts | Pendiente | `backend/services/` |
| PresupuestoForm.tsx | Pendiente | `frontend/components/` |
| PresupuestoViewer.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- clinica.patients (erp-clinicas)
- DENTAL-001 (Odontograma - piezas)
- DENTAL-002 (Tratamientos - catalogo)
### Bloquea a
- Facturacion
- Reportes financieros
## Criterios de Aceptacion
- [ ] CRUD de presupuestos
- [ ] Agregar/quitar lineas
- [ ] Calculos correctos
- [ ] Descuentos funcionan
- [ ] Estados se actualizan
- [ ] Plan de pago se configura
- [ ] PDF se genera correctamente
- [ ] Vencimiento automatico
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,153 @@
# Clinica Dental - Mapa de Modulos
**Proyecto:** clinica-dental
**Seccion:** 02-definicion-modulos
**Fecha:** 2026-01-07
---
## Estructura de Modulos
```
02-definicion-modulos/
├── _MAP.md <- ESTE ARCHIVO
├── modulo-odontograma.md <- Registro grafico dental
├── modulo-tratamientos.md <- Gestion de procedimientos
├── modulo-prevencion.md <- Profilaxis y selladores
├── modulo-restauracion.md <- Resinas y amalgamas
├── modulo-ortodoncia.md <- Brackets y alineadores
├── modulo-endodoncia.md <- Tratamientos de conductos
├── modulo-periodoncia.md <- Enfermedad periodontal
├── modulo-protesis.md <- Coronas, puentes, implantes
├── modulo-cirugia.md <- Extracciones y cirugia
└── modulo-estetica.md <- Blanqueamiento, carillas
```
---
## Modulos Especializados (Odontologia)
### Core - Prioridad P1
| Modulo | Archivo | Estado | Descripcion |
|--------|---------|--------|-------------|
| Odontograma | modulo-odontograma.md | EN_PROGRESO | Registro grafico del estado dental |
| Tratamientos | modulo-tratamientos.md | PENDIENTE | Gestion de procedimientos y planes |
| Prevencion | modulo-prevencion.md | PENDIENTE | Limpiezas, fluor, selladores |
| Restauracion | modulo-restauracion.md | PENDIENTE | Resinas, amalgamas, incrustaciones |
### Especializados - Prioridad P2
| Modulo | Archivo | Estado | Descripcion |
|--------|---------|--------|-------------|
| Ortodoncia | modulo-ortodoncia.md | PENDIENTE | Brackets, alineadores, retenedores |
| Endodoncia | modulo-endodoncia.md | PENDIENTE | Tratamientos de conductos |
| Periodoncia | modulo-periodoncia.md | PENDIENTE | Raspados, cirugia periodontal |
| Protesis | modulo-protesis.md | PENDIENTE | Coronas, puentes, dentaduras |
| Cirugia | modulo-cirugia.md | PENDIENTE | Extracciones, implantes |
| Estetica | modulo-estetica.md | PENDIENTE | Blanqueamiento, carillas |
---
## Modulos Heredados (de erp-clinicas)
| Modulo | Fuente | Adaptacion |
|--------|--------|------------|
| Pacientes | erp-clinicas | Sin cambios |
| Expedientes | erp-clinicas | Agregar seccion odontograma |
| Citas | erp-clinicas | Sin cambios |
| Consultas | erp-clinicas | Agregar exploracion dental |
| Recetas | erp-clinicas | Sin cambios |
---
## Modulos Heredados (de erp-core)
| Modulo | Fuente | Adaptacion |
|--------|--------|------------|
| Autenticacion | erp-core | Sin cambios |
| Usuarios | erp-core | Sin cambios |
| Roles/Permisos | erp-core | Agregar roles odontologicos |
| Facturacion | erp-core | Sin cambios |
| Inventario | erp-core | Materiales dentales |
| Catalogos | erp-core | Agregar catalogos dentales |
---
## Entidades por Modulo
### Odontograma
- `odontograma` - Registro principal
- `pieza_dental` - Estado por pieza
- `historial_pieza` - Cambios historicos
### Tratamientos
- `tratamiento` - Plan de tratamiento
- `procedimiento` - Catalogo de procedimientos
- `tratamiento_procedimiento` - Detalle
- `presupuesto` - Costos estimados
### Ortodoncia
- `caso_ortodoncia` - Caso clinico
- `ajuste_ortodoncia` - Registro de ajustes
- `estudio_ortodoncia` - Rx, fotos, modelos
### Protesis
- `trabajo_protesico` - Orden de trabajo
- `laboratorio_dental` - Laboratorios externos
- `prueba_protesis` - Registro de pruebas
---
## Relaciones entre Modulos
```
┌─────────────┐
│ Paciente │
│(erp-clinicas)│
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ ┌───▼───┐ ┌──────▼──────┐
│ Odontograma │ │ Citas │ │ Expediente │
└──────┬──────┘ └───┬───┘ └──────┬──────┘
│ │ │
└─────┬──────┴──────┬─────┘
│ │
┌──────▼──────┐ ┌────▼────┐
│ Tratamientos│ │Consultas│
└──────┬──────┘ └────┬────┘
│ │
┌───────────────┼─────────────┤
│ │ │
┌───▼───┐ ┌──────▼──────┐ ┌────▼────┐
│Ortodo-│ │ Protesis │ │ Recetas │
│ncia │ └─────────────┘ └─────────┘
└───────┘
```
---
## Estado de Documentacion
| Modulo | README | ESPECIFICACION | FLUJOS | TESTS |
|--------|--------|----------------|--------|-------|
| Odontograma | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
| Tratamientos | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
| Ortodoncia | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
| Protesis | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
---
## Proximos Pasos
1. **Completar modulo-odontograma.md** - Especificacion completa
2. **Documentar modulo-tratamientos.md** - Planes y presupuestos
3. **Definir entidades** en DATABASE_INVENTORY.yml
4. **Crear User Stories** para Sprint 1
---
**Ultima actualizacion:** 2026-01-07
**Version:** 1.0.0

View File

@ -0,0 +1,560 @@
# Modulo Odontograma
**Proyecto:** clinica-dental
**Modulo:** ODT-001
**Prioridad:** P1 - Core
**Estado:** Especificacion
**Fecha:** 2026-01-07
---
## 1. DESCRIPCION GENERAL
El odontograma es el registro grafico del estado dental del paciente. Representa visualmente cada pieza dental con su condicion actual, tratamientos realizados e historial de cambios.
### Proposito
- Visualizar estado completo de la dentadura
- Registrar condicion de cada pieza dental
- Documentar caras afectadas
- Mantener historial de cambios
- Facilitar diagnostico y plan de tratamiento
### Alcance
- Adultos (32 piezas permanentes)
- Ninos (20 piezas deciduas)
- Estados por pieza
- Historial temporal
- Anotaciones por pieza
---
## 2. ENTIDADES
### 2.1 odontograma
```yaml
tabla: dental.odontogramas
descripcion: "Registro principal del estado dental"
campos:
- nombre: id
tipo: UUID
pk: true
descripcion: "Identificador unico"
- nombre: paciente_id
tipo: UUID
fk: clinicas.pacientes(id)
not_null: true
descripcion: "Paciente al que pertenece"
- nombre: tipo
tipo: ENUM
valores: ['adulto', 'deciduo', 'mixto']
default: 'adulto'
descripcion: "Tipo de denticion"
- nombre: fecha_registro
tipo: TIMESTAMP
default: NOW()
descripcion: "Fecha de creacion"
- nombre: fecha_actualizacion
tipo: TIMESTAMP
descripcion: "Ultima modificacion"
- nombre: odontologo_id
tipo: UUID
fk: core.usuarios(id)
descripcion: "Odontologo que registro"
- nombre: notas_generales
tipo: TEXT
descripcion: "Observaciones generales"
- nombre: activo
tipo: BOOLEAN
default: true
descripcion: "Odontograma vigente"
indices:
- nombre: idx_odontograma_paciente
campos: [paciente_id]
- nombre: idx_odontograma_fecha
campos: [fecha_registro DESC]
rls:
- policy: "tenant_isolation"
using: "tenant_id = current_tenant_id()"
```
### 2.2 pieza_dental
```yaml
tabla: dental.piezas_dentales
descripcion: "Estado individual de cada pieza"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: odontograma_id
tipo: UUID
fk: dental.odontogramas(id)
not_null: true
on_delete: CASCADE
- nombre: numero_pieza
tipo: INTEGER
not_null: true
check: "(numero_pieza BETWEEN 11 AND 48) OR (numero_pieza BETWEEN 51 AND 85)"
descripcion: "Numero FDI de la pieza"
- nombre: estado
tipo: ENUM
valores: ['sano', 'caries', 'obturacion_resina', 'obturacion_amalgama',
'endodoncia', 'corona', 'puente_pilar', 'puente_ponico',
'implante', 'ausente', 'extraccion_indicada', 'supernumerario',
'retenido', 'fracturado']
default: 'sano'
descripcion: "Estado actual de la pieza"
- nombre: caras_afectadas
tipo: TEXT[]
descripcion: "Array de caras: M, D, O, V, L, I, P"
- nombre: movilidad
tipo: INTEGER
check: "movilidad BETWEEN 0 AND 3"
descripcion: "Grado de movilidad (0=normal, 3=severa)"
- nombre: sensibilidad
tipo: BOOLEAN
default: false
descripcion: "Sensibilidad al frio/calor"
- nombre: notas
tipo: TEXT
descripcion: "Observaciones especificas"
- nombre: fecha_actualizacion
tipo: TIMESTAMP
default: NOW()
indices:
- nombre: idx_pieza_odontograma
campos: [odontograma_id]
- nombre: idx_pieza_numero
campos: [odontograma_id, numero_pieza]
unique: true
constraints:
- nombre: uk_pieza_odontograma
tipo: UNIQUE
campos: [odontograma_id, numero_pieza]
```
### 2.3 historial_pieza
```yaml
tabla: dental.historial_piezas
descripcion: "Cambios historicos en cada pieza"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: pieza_id
tipo: UUID
fk: dental.piezas_dentales(id)
not_null: true
on_delete: CASCADE
- nombre: estado_anterior
tipo: VARCHAR(50)
- nombre: estado_nuevo
tipo: VARCHAR(50)
not_null: true
- nombre: caras_anterior
tipo: TEXT[]
- nombre: caras_nuevo
tipo: TEXT[]
- nombre: tratamiento_id
tipo: UUID
fk: dental.tratamientos(id)
descripcion: "Tratamiento que causo el cambio"
- nombre: fecha_cambio
tipo: TIMESTAMP
default: NOW()
- nombre: odontologo_id
tipo: UUID
fk: core.usuarios(id)
- nombre: motivo
tipo: TEXT
descripcion: "Razon del cambio"
indices:
- nombre: idx_historial_pieza
campos: [pieza_id]
- nombre: idx_historial_fecha
campos: [fecha_cambio DESC]
```
---
## 3. NOMENCLATURA FDI
### Sistema de Numeracion
```
SUPERIOR
┌───────────┬───────────┐
│ Derecho │ Izquierdo │
│ 18-11 │ 21-28 │
├───────────┼───────────┤
│ 48-41 │ 31-38 │
│ Derecho │ Izquierdo │
└───────────┴───────────┘
INFERIOR
```
### Dientes Permanentes (32 piezas)
| Cuadrante | Posicion | Piezas | Descripcion |
|-----------|----------|--------|-------------|
| 1 | Superior Derecho | 11-18 | Incisivo central a 3er molar |
| 2 | Superior Izquierdo | 21-28 | Incisivo central a 3er molar |
| 3 | Inferior Izquierdo | 31-38 | Incisivo central a 3er molar |
| 4 | Inferior Derecho | 41-48 | Incisivo central a 3er molar |
### Dientes Deciduos (20 piezas)
| Cuadrante | Posicion | Piezas | Descripcion |
|-----------|----------|--------|-------------|
| 5 | Superior Derecho | 51-55 | Incisivo a 2do molar |
| 6 | Superior Izquierdo | 61-65 | Incisivo a 2do molar |
| 7 | Inferior Izquierdo | 71-75 | Incisivo a 2do molar |
| 8 | Inferior Derecho | 81-85 | Incisivo a 2do molar |
### Caras Dentales
| Sigla | Nombre | Aplicable a |
|-------|--------|-------------|
| M | Mesial | Todas |
| D | Distal | Todas |
| O | Oclusal | Premolares, Molares |
| I | Incisal | Incisivos, Caninos |
| V | Vestibular | Todas |
| B | Bucal | Sinonimo de V |
| L | Lingual | Inferiores |
| P | Palatino | Superiores |
---
## 4. ESTADOS DE PIEZAS
### Catalogo de Estados
```yaml
estados:
- codigo: SANO
nombre: "Sano"
color: "#4CAF50"
descripcion: "Pieza sin patologia"
- codigo: CARIES
nombre: "Caries"
color: "#F44336"
descripcion: "Lesion cariosa activa"
- codigo: OBT_RES
nombre: "Obturacion Resina"
color: "#2196F3"
descripcion: "Restauracion con resina"
- codigo: OBT_AMG
nombre: "Obturacion Amalgama"
color: "#9E9E9E"
descripcion: "Restauracion con amalgama"
- codigo: ENDO
nombre: "Endodoncia"
color: "#9C27B0"
descripcion: "Tratamiento de conductos"
- codigo: CORONA
nombre: "Corona"
color: "#FFC107"
descripcion: "Corona protesica"
- codigo: PUENTE_P
nombre: "Puente Pilar"
color: "#FF9800"
descripcion: "Pieza pilar de puente"
- codigo: PUENTE_O
nombre: "Puente Ponico"
color: "#FF5722"
descripcion: "Pieza artificial de puente"
- codigo: IMPLANTE
nombre: "Implante"
color: "#00BCD4"
descripcion: "Implante dental"
- codigo: AUSENTE
nombre: "Ausente"
color: "#BDBDBD"
descripcion: "Pieza extraida"
- codigo: EXT_IND
nombre: "Extraccion Indicada"
color: "#E91E63"
descripcion: "Requiere extraccion"
- codigo: FRACTURADO
nombre: "Fracturado"
color: "#795548"
descripcion: "Pieza fracturada"
```
---
## 5. API ENDPOINTS
### Odontograma
```yaml
endpoints:
- method: GET
path: /api/v1/pacientes/{pacienteId}/odontograma
descripcion: "Obtener odontograma actual"
response: Odontograma con todas las piezas
- method: POST
path: /api/v1/pacientes/{pacienteId}/odontograma
descripcion: "Crear nuevo odontograma"
body:
tipo: string (adulto|deciduo|mixto)
notas_generales: string (opcional)
response: Odontograma creado
- method: PUT
path: /api/v1/odontogramas/{odontogramaId}
descripcion: "Actualizar odontograma"
body:
notas_generales: string
response: Odontograma actualizado
```
### Piezas Dentales
```yaml
endpoints:
- method: GET
path: /api/v1/odontogramas/{odontogramaId}/piezas
descripcion: "Obtener todas las piezas"
response: Array de piezas
- method: GET
path: /api/v1/odontogramas/{odontogramaId}/piezas/{numeroPieza}
descripcion: "Obtener pieza especifica"
response: Pieza con historial
- method: PUT
path: /api/v1/odontogramas/{odontogramaId}/piezas/{numeroPieza}
descripcion: "Actualizar estado de pieza"
body:
estado: string
caras_afectadas: string[]
movilidad: number (0-3)
sensibilidad: boolean
notas: string
motivo: string
response: Pieza actualizada + entrada en historial
- method: GET
path: /api/v1/piezas/{piezaId}/historial
descripcion: "Historial de cambios de pieza"
query:
desde: date
hasta: date
response: Array de cambios
```
---
## 6. FLUJOS DE USUARIO
### 6.1 Crear Odontograma Inicial
```
1. Paciente nuevo o sin odontograma
2. Odontologo abre pantalla de odontograma
3. Sistema detecta que no existe → muestra dialogo
4. Selecciona tipo: Adulto / Deciduo / Mixto
5. Sistema crea odontograma con 32/20 piezas en estado SANO
6. Odontologo realiza exploracion
7. Marca cada pieza segun estado actual
8. Guarda odontograma
```
### 6.2 Actualizar Estado de Pieza
```
1. Odontologo abre odontograma existente
2. Click en pieza a modificar
3. Panel lateral muestra estado actual + historial
4. Selecciona nuevo estado del dropdown
5. Marca caras afectadas (checkboxes)
6. Agrega notas (opcional)
7. Indica motivo del cambio
8. Guarda cambios
9. Sistema registra en historial
```
### 6.3 Comparar Odontogramas
```
1. Odontologo solicita comparacion
2. Selecciona dos fechas
3. Sistema muestra lado a lado
4. Resalta piezas con cambios
5. Permite ver detalle de cada cambio
```
---
## 7. COMPONENTES UI
### 7.1 OdontogramaView
```typescript
interface OdontogramaViewProps {
pacienteId: string;
readOnly?: boolean;
onPiezaClick?: (pieza: PiezaDental) => void;
}
// Estados visuales
const COLORES_ESTADO: Record<EstadoPieza, string> = {
sano: '#4CAF50',
caries: '#F44336',
obturacion_resina: '#2196F3',
// ...
};
```
### 7.2 PiezaDentalComponent
```typescript
interface PiezaDentalProps {
numero: number;
estado: EstadoPieza;
carasAfectadas: string[];
selected: boolean;
onClick: () => void;
}
// Renderiza SVG de pieza con colores por estado
// Marca visual de caras afectadas
```
### 7.3 HistorialPiezaPanel
```typescript
interface HistorialPiezaPanelProps {
piezaId: string;
onClose: () => void;
}
// Muestra timeline de cambios
// Permite filtrar por fecha
// Link a tratamientos relacionados
```
---
## 8. VALIDACIONES
### Reglas de Negocio
```yaml
validaciones:
- regla: "Pieza ausente no puede tener caras afectadas"
condicion: estado == 'ausente' AND caras_afectadas.length > 0
error: "Una pieza ausente no puede tener caras afectadas"
- regla: "Corona cubre todas las caras"
condicion: estado == 'corona' AND caras_afectadas != ['M','D','O','V','L']
accion: "Auto-completar todas las caras"
- regla: "Numero de pieza valido"
condicion: NOT (numero IN rango_valido)
error: "Numero de pieza dental invalido"
- regla: "Implante requiere pieza ausente previa"
condicion: estado == 'implante' AND estado_anterior != 'ausente'
warning: "Normalmente se coloca implante en espacio de pieza ausente"
```
---
## 9. CASOS DE USO
### CU-ODT-001: Exploración Inicial
**Actor:** Odontólogo
**Precondición:** Paciente registrado sin odontograma
**Flujo:**
1. Abrir expediente del paciente
2. Ir a sección Odontograma
3. Crear nuevo odontograma (tipo adulto)
4. Realizar exploración pieza por pieza
5. Marcar estados encontrados
6. Guardar odontograma
**Postcondición:** Odontograma creado con estado inicial
### CU-ODT-002: Registrar Tratamiento
**Actor:** Odontólogo
**Precondición:** Odontograma existente, tratamiento a realizar
**Flujo:**
1. Abrir odontograma del paciente
2. Seleccionar pieza tratada
3. Cambiar estado (ej: caries → obturación_resina)
4. Marcar caras tratadas
5. Vincular con tratamiento
6. Guardar cambios
**Postcondición:** Estado actualizado, historial registrado
---
## 10. DEPENDENCIAS
### Depende de
- `clinicas.pacientes` - Paciente al que pertenece
- `core.usuarios` - Odontólogo que registra
- `dental.tratamientos` - Vinculación de cambios
### Dependientes
- `dental.tratamientos` - Referencia piezas afectadas
- `dental.presupuestos` - Calcula costos por pieza
- `reportes` - Estadísticas de salud dental
---
**Documento creado:** 2026-01-07
**Autor:** Agente Orquestador Workspace
**Version:** 1.0.0

View File

@ -0,0 +1,34 @@
# TRACEABILITY-MASTER.yml v2.0
# Proyecto: Clinica Dental
# Prefijo v2: CDN
traceability_version: "2.0"
project:
code: "CDN"
name: "Clinica Dental - Sistema de Gestion para Clinicas Dentales"
updated: "2026-01-10"
epics_summary:
total: 0
completed: 0
in_progress: 0
planned: 0
nomenclature_mapping:
legacy: "CDN-EP"
epics: []
dependency_graph: {}
inventories:
master: "docs/90-transversal/inventarios/"
health:
last_validated: "2026-01-10"
score: 0.50
issues:
- severity: "low"
type: "initialization"
description: "Proyecto en migracion inicial v2"

137
docs/_MAP.md Normal file
View File

@ -0,0 +1,137 @@
# Clinica Dental - Mapa de Documentacion
**Proyecto:** clinica-dental
**Tipo:** ERP Especializado (hereda de erp-clinicas)
**Fecha:** 2026-01-07
**Estado:** Fase 0 - Preparacion
---
## Estructura de Documentacion
```
docs/
├── _MAP.md <- ESTE ARCHIVO
├── 00-vision-general/
│ ├── README.md <- Indice de vision
│ └── VISION.md <- Vision estrategica [PENDIENTE]
├── 02-definicion-modulos/
│ ├── _MAP.md <- Indice de modulos [PENDIENTE]
│ ├── modulo-odontograma.md <- Odontograma digital [PENDIENTE]
│ ├── modulo-tratamientos.md <- Tratamientos dentales [PENDIENTE]
│ ├── modulo-ortodoncia.md <- Control ortodoncia [PENDIENTE]
│ ├── modulo-protesis.md <- Trabajos protesicos [PENDIENTE]
│ ├── modulo-endodoncia.md <- Tratamientos conductos [PENDIENTE]
│ ├── modulo-periodoncia.md <- Enfermedad periodontal [PENDIENTE]
│ ├── modulo-prevencion.md <- Profilaxis, selladores [PENDIENTE]
│ └── modulo-estetica.md <- Blanqueamiento, carillas [PENDIENTE]
├── 03-especificaciones/
│ └── ... (futuras especificaciones tecnicas)
└── 90-transversal/
└── ... (documentacion transversal)
```
---
## Modulos Especializados (Odontologia)
### Modulos Core
| Modulo | Prioridad | Estado | Descripcion |
|--------|-----------|--------|-------------|
| Odontograma | P1 | Pendiente | Registro grafico del estado dental |
| Tratamientos | P1 | Pendiente | Gestion de procedimientos dentales |
| Prevencion | P1 | Pendiente | Limpiezas, selladores, fluor |
| Restauracion | P1 | Pendiente | Resinas, amalgamas, incrustaciones |
### Modulos Especializados
| Modulo | Prioridad | Estado | Descripcion |
|--------|-----------|--------|-------------|
| Ortodoncia | P2 | Pendiente | Brackets, alineadores, retenedores |
| Protesis | P2 | Pendiente | Coronas, puentes, dentaduras |
| Endodoncia | P2 | Pendiente | Tratamientos de conductos |
| Periodoncia | P2 | Pendiente | Raspados, cirugia periodontal |
| Estetica | P2 | Pendiente | Blanqueamiento, carillas |
---
## Modulos Heredados (de erp-clinicas)
| Modulo | Fuente | Adaptacion Requerida |
|--------|--------|----------------------|
| Pacientes | erp-clinicas | Ninguna |
| Expedientes | erp-clinicas | Agregar odontograma |
| Citas | erp-clinicas | Ninguna |
| Consultas | erp-clinicas | Agregar exploracion dental |
| Recetas | erp-clinicas | Ninguna |
| Facturacion | erp-core | Ninguna |
| Inventario | erp-core | Materiales dentales |
---
## Entidades Especificas
### Odontograma
Registro grafico del estado dental del paciente.
```
Nomenclatura FDI:
- Cuadrante 1: Superior derecho (11-18)
- Cuadrante 2: Superior izquierdo (21-28)
- Cuadrante 3: Inferior izquierdo (31-38)
- Cuadrante 4: Inferior derecho (41-48)
- Deciduos: 51-55, 61-65, 71-75, 81-85
```
### Estados de Piezas
- Sano
- Caries
- Obturacion (resina/amalgama)
- Endodoncia
- Corona
- Puente
- Implante
- Ausente
- Extraccion indicada
### Caras Dentales
- Mesial (M)
- Distal (D)
- Oclusal/Incisal (O/I)
- Vestibular/Bucal (V/B)
- Lingual/Palatino (L/P)
---
## Navegacion Rapida
### Por Rol de Usuario
- **Odontologo:** Consultas, diagnosticos, tratamientos
- **Auxiliar dental:** Apoyo en procedimientos
- **Recepcionista:** Citas, cobros
- **Higienista:** Limpiezas, profilaxis
- **Tecnico dental:** Elaboracion de protesis
- **Administrador:** Gestion general
### Por Componente Tecnico
- **Database:** Ver orchestration/inventarios/DATABASE_INVENTORY.yml
- **Backend:** Ver orchestration/inventarios/BACKEND_INVENTORY.yml
- **Frontend:** Ver orchestration/inventarios/FRONTEND_INVENTORY.yml
---
## Referencias
- [CONTEXTO-PROYECTO.md](../orchestration/00-guidelines/CONTEXTO-PROYECTO.md)
- [HERENCIA-ERP-CLINICAS.md](../orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md)
- [PROXIMA-ACCION.md](../orchestration/PROXIMA-ACCION.md)
- [CONTEXT-MAP.yml](../orchestration/CONTEXT-MAP.yml)
---
**Ultima actualizacion:** 2026-01-07
**Version:** 1.0.0

View File

@ -0,0 +1,162 @@
# Contexto del Proyecto - Clínica Dental
## 1. Información General
| Campo | Valor |
|-------|-------|
| **Nombre:** | Clínica Dental |
| **Tipo:** | ERP Especializado |
| **Giro:** | Servicios Odontológicos |
| **Base:** | erp-clinicas |
| **Fecha creación:** | 2026-01-04 |
---
## 2. Descripción del Negocio
Sistema de gestión integral para clínicas dentales que incluye:
- **Gestión de pacientes:** Expedientes con odontograma
- **Consultas dentales:** Diagnóstico, tratamientos
- **Odontograma digital:** Estado de cada pieza dental
- **Tratamientos:** Seguimiento de procedimientos
- **Ortodoncia:** Control de tratamientos ortodónticos
- **Prótesis:** Registro de trabajos protésicos
- **Presupuestos:** Planes de tratamiento con costos
- **Inventario:** Materiales dentales
- **Facturación:** Cobro de servicios
## 3. Usuarios del Sistema
| Rol | Funciones |
|-----|-----------|
| Odontólogo | Consultas, diagnósticos, tratamientos |
| Auxiliar dental | Apoyo en procedimientos |
| Recepcionista | Citas, cobros |
| Higienista | Limpiezas, profilaxis |
| Técnico dental | Elaboración de prótesis |
| Administrador | Gestión general |
## 4. Procesos Principales
### 4.1 Flujo de Consulta Dental
```
1. Paciente llega / se verifica cita
2. Recepción registra llegada
3. Revisión de odontograma previo
4. Odontólogo realiza exploración
5. Actualización de odontograma
6. Diagnóstico y plan de tratamiento
7. Presupuesto (si es necesario)
8. Procedimiento (si aplica)
9. Próxima cita
10. Cobro en recepción
```
### 4.2 Flujo de Ortodoncia
```
1. Consulta de valoración
2. Estudios (Rx, fotos, modelos)
3. Plan de tratamiento
4. Presupuesto y financiamiento
5. Colocación de aparatología
6. Citas de control (mensual)
7. Retiro de aparatología
8. Colocación de retenedores
9. Citas de revisión
```
## 5. Entidades Principales
### 5.1 Odontograma
El odontograma es el registro gráfico del estado dental:
| Campo | Descripción |
|-------|-------------|
| Pieza | Número de diente (1-32 o deciduos) |
| Estado | Sano, caries, extracción, etc. |
| Caras afectadas | Mesial, Distal, Oclusal, etc. |
| Tratamientos | Historial de procedimientos |
### 5.2 Nomenclatura Dental
**Sistema FDI (dos dígitos):**
- Cuadrante 1: Superior derecho (11-18)
- Cuadrante 2: Superior izquierdo (21-28)
- Cuadrante 3: Inferior izquierdo (31-38)
- Cuadrante 4: Inferior derecho (41-48)
**Dientes deciduos:**
- Cuadrantes 5-8 (51-55, 61-65, 71-75, 81-85)
### 5.3 Tratamientos Comunes
| Categoría | Tratamientos |
|-----------|-------------|
| Prevención | Limpieza, selladores, fluoruro |
| Restauración | Resinas, amalgamas, incrustaciones |
| Endodoncia | Tratamiento de conductos |
| Periodoncia | Raspados, cirugía periodontal |
| Cirugía | Extracciones, implantes |
| Prótesis | Coronas, puentes, dentaduras |
| Ortodoncia | Brackets, alineadores |
| Estética | Blanqueamiento, carillas |
## 6. Catálogos Específicos
### 6.1 Especialidades Odontológicas
- Odontología General
- Ortodoncia
- Endodoncia
- Periodoncia
- Cirugía Maxilofacial
- Odontopediatría
- Prostodoncia
- Estética Dental
- Implantología
### 6.2 Estados de Piezas Dentales
- Sano
- Caries
- Obturación (resina/amalgama)
- Endodoncia
- Corona
- Puente
- Implante
- Ausente
- Extracción indicada
### 6.3 Caras Dentales
- Mesial (M)
- Distal (D)
- Oclusal/Incisal (O/I)
- Vestibular/Bucal (V/B)
- Lingual/Palatino (L/P)
## 7. Integraciones
| Sistema | Propósito |
|---------|-----------|
| Radiografías digitales | Captura de Rx periapicales, panorámicas |
| Laboratorio dental | Pedidos de prótesis |
| Proveedores | Materiales dentales |
## 8. Métricas Clave
| Métrica | Descripción |
|---------|-------------|
| Consultas/día | Número de pacientes atendidos |
| Tratamientos completados | Planes terminados |
| Tasa retención ortodoncia | Pacientes que completan tratamiento |
| Ticket promedio | Ingreso por paciente |
| Ocupación unidades | Uso de sillones dentales |
---
**Última actualización:** 2026-01-04

View File

@ -0,0 +1,116 @@
# Herencia ERP-Clínicas - Clínica Dental
## Información del Proyecto
| Campo | Valor |
|-------|-------|
| **Proyecto:** | clinica-dental |
| **Hereda de:** | erp-clinicas |
| **Fecha creación:** | 2026-01-04 |
| **Versión ERP-Clínicas:** | 1.0 FASE-8 |
---
## 1. Relación de Herencia
```
erp-core (FASE-8)
└── erp-clinicas (Base Genérica)
└── clinica-dental (Especialización)
```
## 2. Qué Se Hereda de ERP-Clínicas
### 2.1 Schemas y Tablas
| Schema | Tablas | Heredadas |
|--------|--------|-----------|
| clinica | 13 tablas base | ✅ |
| financial | 4 tablas FASE-8 | ✅ |
| hr | 11 tablas FASE-8 | ✅ |
| inventory | 5 tablas FASE-8 | ✅ |
| purchase | 1 tabla FASE-8 | ✅ |
### 2.2 Funcionalidades Heredadas
- Sistema de citas y consultas
- Expedientes clínicos
- Gestión de pacientes
- Sistema de prescripciones
- Gestión de personal (odontólogos)
- Inventario de materiales
- Pagos y facturación
## 3. Especializaciones Dentales
### 3.1 Adaptaciones de Terminología
| ERP-Clínicas | Dental |
|--------------|--------|
| Médico | Odontólogo |
| Especialidad Médica | Especialidad Odontológica |
| Consulta | Consulta Dental |
| Receta | Receta Dental |
| Consultorio | Consultorio Dental/Unidad |
### 3.2 Tablas Adicionales
| Tabla | Propósito |
|-------|-----------|
| dental.odontograma | Estado dental del paciente |
| dental.piezas_dentales | Catálogo de piezas dentales |
| dental.tratamientos | Catálogo de tratamientos dentales |
| dental.tratamientos_paciente | Tratamientos realizados |
| dental.ortodoncia | Seguimiento de ortodoncia |
| dental.protesis | Registro de prótesis |
| dental.radiografias | Registro de radiografías |
| dental.presupuestos | Presupuestos de tratamiento |
### 3.3 Campos Adicionales
| Tabla Base | Campos Dental |
|------------|---------------|
| patients | odontograma_id, tiene_ortodoncia, tiene_protesis |
| consultations | tratamiento_id, pieza_dental, procedimiento |
| prescriptions | uso_dental, indicaciones_especiales |
## 4. Normativa Aplicable
| Normativa | Descripción |
|-----------|-------------|
| NOM-013-SSA2-2015 | Prevención y control enfermedades bucales |
| NOM-004-SSA3-2012 | Expediente clínico |
| COFEPRIS | Registro de establecimientos |
## 5. Instalación
### 5.1 Orden de Ejecución
```bash
# 1. Base ERP-Clínicas (heredado)
psql -f erp-clinicas/database/init/01-extensions.sql
psql -f erp-clinicas/database/init/02-core-schema.sql
psql -f erp-clinicas/database/init/03-clinical-tables.sql
psql -f erp-clinicas/database/schemas/04-financial-ext-schema-ddl.sql
psql -f erp-clinicas/database/schemas/05-hr-ext-fase8-schema-ddl.sql
psql -f erp-clinicas/database/schemas/06-inventory-ext-fase8-schema-ddl.sql
psql -f erp-clinicas/database/schemas/07-purchase-ext-fase8-schema-ddl.sql
psql -f erp-clinicas/database/schemas/08-clinica-ext-fase8-schema-ddl.sql
# 2. Especialización Dental
psql -f clinica-dental/database/schemas/01-dental-schema-ddl.sql
# 3. Seeds
psql -f erp-clinicas/database/seeds/fase8/*.sql
psql -f clinica-dental/database/seeds/fase8/*.sql
```
## 6. Versionado
| Versión | Fecha | Cambios |
|---------|-------|---------|
| 1.0 | 2026-01-04 | Creación inicial, herencia de erp-clinicas FASE-8 |
---
**Última actualización:** 2026-01-04

View File

@ -0,0 +1,301 @@
# CONTEXT-MAP: CLINICA-DENTAL
# Sistema: SIMCO - NEXUS v4.0
# Proposito: Mapear contexto automatico por nivel y tarea
# Version: 1.0.0
# Fecha: 2026-01-07
metadata:
proyecto: "clinica-dental"
nivel: "VERTICAL"
version: "1.0.0"
ultima_actualizacion: "2026-01-07"
workspace_root: "/home/isem/workspace-v1"
project_root: "/home/isem/workspace-v1/projects/clinica-dental"
hereda_de: "/home/isem/workspace-v1/projects/erp-clinicas"
# ===============================================================================
# VARIABLES DEL PROYECTO (PRE-RESUELTAS)
# ===============================================================================
variables:
# Identificacion
PROJECT: "clinica-dental"
PROJECT_NAME: "CLINICA-DENTAL"
PROJECT_LEVEL: "VERTICAL"
PARENT_PROJECT: "erp-clinicas"
# Base de datos
DB_NAME: "clinica_dental"
DB_DDL_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database/schemas"
DB_SCRIPTS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database"
DB_SEEDS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database/seeds"
RECREATE_CMD: "drop-and-recreate-database.sh"
# Backend
BACKEND_ROOT: "/home/isem/workspace-v1/projects/clinica-dental/backend"
BACKEND_SRC: "/home/isem/workspace-v1/projects/clinica-dental/backend/src"
BACKEND_TESTS: "/home/isem/workspace-v1/projects/clinica-dental/backend/tests"
# Frontend
FRONTEND_ROOT: "/home/isem/workspace-v1/projects/clinica-dental/frontend"
FRONTEND_SRC: "/home/isem/workspace-v1/projects/clinica-dental/frontend/src"
# Documentacion
DOCS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/docs"
ORCHESTRATION_PATH: "/home/isem/workspace-v1/projects/clinica-dental/orchestration"
# ===============================================================================
# ALIASES RESUELTOS
# ===============================================================================
aliases:
# Directivas globales
"@SIMCO": "/home/isem/workspace-v1/orchestration/directivas/simco"
"@PRINCIPIOS": "/home/isem/workspace-v1/orchestration/directivas/principios"
"@PERFILES": "/home/isem/workspace-v1/orchestration/agents/perfiles"
"@CATALOG": "/home/isem/workspace-v1/shared/catalog"
# Proyecto padre (erp-clinicas)
"@PARENT": "/home/isem/workspace-v1/projects/erp-clinicas"
"@PARENT_CORE": "/home/isem/workspace-v1/projects/erp-core"
# Proyecto especifico
"@DDL": "/home/isem/workspace-v1/projects/clinica-dental/database/schemas"
"@SEEDS": "/home/isem/workspace-v1/projects/clinica-dental/database/seeds"
"@BACKEND": "/home/isem/workspace-v1/projects/clinica-dental/backend/src"
"@FRONTEND": "/home/isem/workspace-v1/projects/clinica-dental/frontend/src"
"@DOCS": "/home/isem/workspace-v1/projects/clinica-dental/docs"
# Inventarios
"@INVENTORY": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios"
"@INV_DB": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/DATABASE_INVENTORY.yml"
"@INV_BE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/BACKEND_INVENTORY.yml"
"@INV_FE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/FRONTEND_INVENTORY.yml"
# Trazas
"@TRAZA_DB": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-DATABASE.md"
"@TRAZA_BE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-BACKEND.md"
"@TRAZA_FE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-FRONTEND.md"
# ===============================================================================
# CONTEXTO POR NIVEL
# ===============================================================================
contexto_por_nivel:
L0_sistema:
descripcion: "Principios fundamentales y perfil de agente"
tokens_estimados: 4500
obligatorio: true
archivos:
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-CAPVED.md"
proposito: "Ciclo de vida de tareas"
tokens: 800
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-DOC-PRIMERO.md"
proposito: "Documentacion antes de codigo"
tokens: 500
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ANTI-DUPLICACION.md"
proposito: "Verificar catalogo antes de crear"
tokens: 600
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-VALIDACION-OBLIGATORIA.md"
proposito: "Build/lint deben pasar"
tokens: 600
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ECONOMIA-TOKENS.md"
proposito: "Limites de contexto"
tokens: 500
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-NO-ASUMIR.md"
proposito: "Preguntar si falta informacion"
tokens: 500
- path: "/home/isem/workspace-v1/orchestration/referencias/ALIASES.yml"
proposito: "Resolucion de @ALIAS"
tokens: 400
L1_proyecto:
descripcion: "Contexto especifico de CLINICA-DENTAL"
tokens_estimados: 3000
obligatorio: true
archivos:
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/00-guidelines/CONTEXTO-PROYECTO.md"
proposito: "Variables y configuracion del proyecto"
tokens: 1500
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/PROXIMA-ACCION.md"
proposito: "Estado actual y siguiente paso"
tokens: 500
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md"
proposito: "Herencia de modulos del padre"
tokens: 800
L2_operacion:
descripcion: "SIMCO especificos segun operacion y dominio"
tokens_estimados: 2500
archivos_por_operacion:
CREAR:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-CREAR.md"
MODIFICAR:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-MODIFICAR.md"
VALIDAR:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-VALIDAR.md"
DELEGAR:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DELEGACION.md"
archivos_por_dominio:
DDL:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DDL.md"
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/DATABASE_INVENTORY.yml"
BACKEND:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-BACKEND.md"
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/BACKEND_INVENTORY.yml"
FRONTEND:
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-FRONTEND.md"
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/FRONTEND_INVENTORY.yml"
L3_tarea:
descripcion: "Contexto especifico de la tarea"
tokens_max: 8000
dinamico: true
# ===============================================================================
# INTEGRACION CON DOCUMENTACION (docs/)
# ===============================================================================
integracion_docs:
mapa_docs: "@DOCS/_MAP.md"
estructura:
vision: "@DOCS/00-vision-general/"
modulos: "@DOCS/02-definicion-modulos/"
modulos_especializados:
- modulo_odontograma:
descripcion: "Registro grafico del estado dental"
ruta: "@DOCS/02-definicion-modulos/modulo-odontograma.md"
- modulo_tratamientos:
descripcion: "Gestion de tratamientos dentales"
ruta: "@DOCS/02-definicion-modulos/modulo-tratamientos.md"
- modulo_ortodoncia:
descripcion: "Control de tratamientos ortodonticos"
ruta: "@DOCS/02-definicion-modulos/modulo-ortodoncia.md"
- modulo_protesis:
descripcion: "Registro de trabajos protesicos"
ruta: "@DOCS/02-definicion-modulos/modulo-protesis.md"
# ===============================================================================
# MAPA TAREA -> ARCHIVOS (Especifico CLINICA-DENTAL)
# ===============================================================================
mapa_tarea_contexto:
database:
crear_tabla:
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
inventario: "@INV_DB"
referencia: "@DDL/*.sql"
docs: "@DOCS/02-definicion-modulos/"
crear_odontograma:
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
inventario: "@INV_DB"
referencia: "@DDL/01-dental-schema-ddl.sql"
backend:
crear_entity:
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
inventario: "@INV_BE"
referencia: "@BACKEND/modules/*/entities/*.entity.ts"
crear_service:
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
inventario: "@INV_BE"
referencia: "@BACKEND/modules/*/services/*.service.ts"
crear_controller:
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
inventario: "@INV_BE"
referencia: "@BACKEND/modules/*/controllers/*.controller.ts"
frontend:
crear_componente:
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
inventario: "@INV_FE"
referencia: "@FRONTEND/components/**/*.tsx"
crear_pagina:
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
inventario: "@INV_FE"
referencia: "@FRONTEND/pages/**/*.tsx"
# ===============================================================================
# INFORMACION ESPECIFICA DEL PROYECTO
# ===============================================================================
info_proyecto:
tipo: "ERP Especializado - Clinica Odontologica"
estado: "Fase 0 - Preparacion"
version: "0.1.0"
stack:
backend: "NestJS (hereda de erp-clinicas)"
frontend: "React + TailwindCSS"
database: "PostgreSQL 16+ con RLS"
entidades_especializadas:
- odontograma
- tratamientos_dentales
- piezas_dentales
- ortodoncias
- protesis
modulos_heredados:
- pacientes (de erp-clinicas)
- expedientes (de erp-clinicas)
- citas (de erp-clinicas)
- consultas (de erp-clinicas)
- recetas (de erp-clinicas)
- facturacion (de erp-core)
- inventario (de erp-core)
nomenclatura_dental:
sistema: "FDI (dos digitos)"
cuadrantes:
superior_derecho: "11-18"
superior_izquierdo: "21-28"
inferior_izquierdo: "31-38"
inferior_derecho: "41-48"
deciduos: "51-55, 61-65, 71-75, 81-85"
# ===============================================================================
# VALIDACION DE TOKENS
# ===============================================================================
validacion_tokens:
limite_absoluto: 25000
limite_seguro: 18000
limite_alerta: 20000
presupuesto:
L0_sistema: 4500
L1_proyecto: 3000
L2_operacion: 2500
L3_tarea_max: 8000
total_base: 10000
disponible_tarea: 8000
# ===============================================================================
# HERENCIA
# ===============================================================================
herencia:
tipo: "VERTICAL"
hereda_de:
- "/home/isem/workspace-v1/projects/erp-clinicas/"
- "/home/isem/workspace-v1/projects/erp-core/"
- "/home/isem/workspace-v1/orchestration/"
# ===============================================================================
# BUSQUEDA DE HISTORICO
# ===============================================================================
busqueda_historico:
habilitado: true
ubicaciones:
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/"
- "/home/isem/workspace-v1/projects/erp-clinicas/orchestration/trazas/"
- "/home/isem/workspace-v1/orchestration/errores/REGISTRO-ERRORES.yml"
- "/home/isem/workspace-v1/shared/knowledge-base/lessons-learned/"

View File

@ -0,0 +1,56 @@
# PROJECT STATUS - Clinica Dental
**Fecha:** 2026-01-07
**Estado:** En Desarrollo
**Fase:** Database
---
## Resumen
| Aspecto | Estado | Notas |
|---------|--------|-------|
| Database | Completado | DDL y seeds listos |
| Backend | Pendiente | - |
| Frontend | Pendiente | - |
| Tests | Pendiente | - |
| Documentacion | Parcial | Contexto completo, falta epicas |
---
## Progreso por Modulo
| Modulo | DDL | Backend | Frontend | Tests |
|--------|-----|---------|----------|-------|
| Odontograma | OK | - | - | - |
| Tratamientos | OK | - | - | - |
| Ortodoncia | OK | - | - | - |
| Protesis | OK | - | - | - |
---
## Dependencias
- **erp-clinicas:** Modulos base de gestion clinica
- **erp-core:** Auth, users, tenants, billing
---
## Proximas Acciones
1. Implementar backend para modulo odontograma
2. Crear componente visual de odontograma
3. Integrar con sistema de citas de erp-clinicas
---
## Riesgos
| Riesgo | Probabilidad | Impacto | Mitigacion |
|--------|--------------|---------|------------|
| Complejidad odontograma UI | Media | Alto | Usar librerias SVG |
| Integracion con erp-clinicas | Baja | Medio | Seguir patrones existentes |
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,197 @@
# PROXIMA ACCION - Clinica Dental
**Proyecto:** clinica-dental
**Estado:** Fase 0 - Preparacion
**Fecha:** 2026-01-07
**Hereda de:** erp-clinicas > erp-core
---
## RESUMEN DEL ESTADO ACTUAL
### Estructura Base: CREADA
| Artefacto | Estado | Ubicacion |
|-----------|--------|-----------|
| README.md | EXISTE | raiz |
| CONTEXTO-PROYECTO.md | EXISTE | orchestration/00-guidelines/ |
| HERENCIA-ERP-CLINICAS.md | EXISTE | orchestration/00-guidelines/ |
| ENVIRONMENT-INVENTORY.yml | EXISTE | orchestration/environment/ |
| MASTER_INVENTORY.yml | EXISTE | orchestration/inventarios/ |
| PROJECT-STATUS.md | EXISTE | orchestration/ |
| CONTEXT-MAP.yml | CREADO | orchestration/ |
| PROXIMA-ACCION.md | CREADO | orchestration/ |
| DDL Dental | EXISTE | database/schemas/ |
### Documentacion: MINIMA
| Artefacto | Estado | Prioridad |
|-----------|--------|-----------|
| docs/00-vision-general/VISION.md | FALTA | P0 |
| docs/00-vision-general/_MAP.md | FALTA | P1 |
| docs/02-definicion-modulos/_MAP.md | FALTA | P0 |
| modulo-odontograma.md | FALTA | P1 |
| modulo-tratamientos.md | FALTA | P1 |
| modulo-ortodoncia.md | FALTA | P2 |
| modulo-protesis.md | FALTA | P2 |
| orchestration/_MAP.md | FALTA | P1 |
---
## PROXIMA ACCION INMEDIATA
### Tarea: Crear docs/00-vision-general/VISION.md
**Prioridad:** P0
**Estimacion:** 2-3 horas
**Responsable:** Agente Requirements Analyst
**Descripcion:**
Documentar la vision estrategica del proyecto de clinica dental, incluyendo:
- Propuesta de valor
- Target market
- Diferenciadores vs erp-clinicas base
- Roadmap de funcionalidades dentales especificas
**Contenido esperado:**
```markdown
# Vision - Clinica Dental
## 1. Proposito
Sistema de gestion integral para clinicas odontologicas...
## 2. Propuesta de Valor
- Odontograma digital interactivo
- Seguimiento de tratamientos dentales
- Gestion de ortodoncia
- Control de protesis
## 3. Usuarios Objetivo
- Odontologos
- Auxiliares dentales
- Recepcionistas
- Higienistas
- Tecnicos dentales
- Administradores
## 4. Diferenciadores
- Sistema FDI de nomenclatura dental
- Odontograma por paciente
- Historial por pieza dental
...
```
---
## BACKLOG DE TAREAS
### Sprint 1: Vision y Navegacion (6h)
| # | Tarea | Prioridad | Horas |
|---|-------|-----------|-------|
| 1 | Crear VISION.md | P0 | 2-3 |
| 2 | Crear docs/00-vision-general/_MAP.md | P1 | 1 |
| 3 | Crear docs/02-definicion-modulos/_MAP.md | P0 | 1-2 |
| 4 | Crear orchestration/_MAP.md | P1 | 1 |
### Sprint 2: Modulos Core (8h)
| # | Tarea | Prioridad | Horas |
|---|-------|-----------|-------|
| 1 | modulo-odontograma.md | P1 | 2-3 |
| 2 | modulo-tratamientos.md | P1 | 1.5-2 |
| 3 | modulo-prevencion.md | P1 | 1-1.5 |
| 4 | modulo-restauracion.md | P1 | 1-1.5 |
### Sprint 3: Modulos Especializados (6h)
| # | Tarea | Prioridad | Horas |
|---|-------|-----------|-------|
| 1 | modulo-ortodoncia.md | P2 | 1.5-2 |
| 2 | modulo-protesis.md | P2 | 1.5-2 |
| 3 | modulo-endodoncia.md | P2 | 1-1.5 |
| 4 | modulo-periodoncia.md | P2 | 1-1.5 |
---
## DEPENDENCIAS
### De erp-clinicas (heredados):
- Modulo Pacientes
- Modulo Expedientes
- Modulo Citas
- Modulo Consultas
- Modulo Recetas
### De erp-core (heredados):
- Modulo Autenticacion
- Modulo Usuarios
- Modulo Facturacion
- Modulo Inventario
- Modulo Catalogs
### Especificos Dental:
- Odontograma (nuevo)
- Tratamientos dentales (nuevo)
- Ortodoncia (nuevo)
- Protesis (nuevo)
---
## ENTIDADES ESPECIALIZADAS
### Odontograma
```yaml
campos:
- id: UUID
- paciente_id: UUID (FK)
- fecha_registro: TIMESTAMP
- tipo: ENUM (adulto, deciduo)
- piezas: JSONB[]
pieza_dental:
- numero: INT (1-32 adulto, 51-85 deciduo)
- estado: ENUM (sano, caries, obturacion, etc)
- caras_afectadas: TEXT[] (M, D, O, V, L)
- tratamientos: FK[]
```
### Nomenclatura FDI
```yaml
cuadrantes:
1: "Superior derecho (11-18)"
2: "Superior izquierdo (21-28)"
3: "Inferior izquierdo (31-38)"
4: "Inferior derecho (41-48)"
deciduos:
5: "51-55"
6: "61-65"
7: "71-75"
8: "81-85"
```
---
## METRICAS DE PROGRESO
| Metrica | Valor Actual | Objetivo |
|---------|--------------|----------|
| Archivos SIMCO | 9 | 20+ |
| Modulos documentados | 0 | 8 |
| User Stories | 0 | 25+ |
| Cobertura docs | ~30% | 100% |
---
## NOTAS
- Hereda base completa de erp-clinicas
- Especializar en odontologia
- Odontograma es el diferenciador principal
- Nomenclatura FDI es estandar internacional
---
**Ultima actualizacion:** 2026-01-07
**Autor:** Agente Orquestador Workspace
**Version:** 1.0.0

View File

@ -0,0 +1,804 @@
# =============================================================================
# ENVIRONMENT-INVENTORY.yml - CLINICA-DENTAL
# =============================================================================
# Inventario Completo de Entorno de Desarrollo y Produccion
# Generado por: @PERFIL_DEVENV
# Basado en: orchestration/templates/TEMPLATE-ENVIRONMENT-INVENTORY.yml
# =============================================================================
version: "1.1.0"
fecha_creacion: "2026-01-04"
fecha_actualizacion: "2026-01-04"
responsable: "@PERFIL_DEVENV"
# -----------------------------------------------------------------------------
# IDENTIFICACION DEL PROYECTO
# -----------------------------------------------------------------------------
proyecto:
nombre: "Clinica Dental"
alias: "clinica-dental"
codigo: "CD"
nivel: "NIVEL_2B.3"
tipo: "vertical-especializada"
estado: "desarrollo"
descripcion: "Sistema de gestion para clinicas dentales y odontologicas"
parent: "erp-clinicas"
herencia:
- erp-core
- erp-clinicas
normativas:
- "NOM-024-SSA3-2012 (Expediente clinico electronico)"
- "NOM-013-SSA2-2015 (Prevencion y control enfermedades bucales)"
# -----------------------------------------------------------------------------
# HERRAMIENTAS Y RUNTIME
# -----------------------------------------------------------------------------
herramientas:
runtime:
node:
version: "20.x"
version_minima: "18.x"
requerido: true
notas: "LTS recomendado para NestJS y React"
python:
version: ""
requerido: false
notas: "No requerido para este proyecto"
package_managers:
npm:
version: "10.x"
requerido: true
pnpm:
version: "8.x"
requerido: false
notas: "Alternativa opcional"
build_tools:
- nombre: "Vite"
version: "5.x"
uso: "Frontend build y dev server"
- nombre: "TypeScript"
version: "5.x"
uso: "Compilacion de codigo"
- nombre: "NestJS CLI"
version: "10.x"
uso: "Backend scaffolding y build"
linters:
- nombre: "ESLint"
version: "8.x"
config: ".eslintrc.js"
- nombre: "Prettier"
version: "3.x"
config: ".prettierrc"
testing:
- nombre: "Jest"
version: "29.x"
tipo: "unit backend"
config: "jest.config.js"
- nombre: "Vitest"
version: "1.x"
tipo: "unit frontend"
config: "vitest.config.ts"
- nombre: "Supertest"
version: "6.x"
tipo: "e2e"
config: "jest-e2e.config.js"
# -----------------------------------------------------------------------------
# SERVICIOS Y PUERTOS
# -----------------------------------------------------------------------------
servicios:
frontend:
nombre: "clinica-dental-frontend"
framework: "React"
version: "18.x"
puerto: 3130
comando_dev: "npm run dev"
comando_build: "npm run build"
comando_preview: "npm run preview"
ubicacion: "apps/frontend/"
url_local: "http://localhost:3130"
build_output: "dist/"
backend:
nombre: "clinica-dental-backend"
framework: "NestJS"
version: "10.x"
puerto: 3131
comando_dev: "npm run start:dev"
comando_build: "npm run build"
comando_prod: "npm run start:prod"
ubicacion: "apps/backend/"
url_local: "http://localhost:3131"
api_prefix: "/api/v1"
swagger_url: "http://localhost:3131/api/docs"
# -----------------------------------------------------------------------------
# BASE DE DATOS - CONFIGURACION COMPLETA
# -----------------------------------------------------------------------------
base_de_datos:
principal:
engine: "PostgreSQL"
version: "15"
host_variable: "DB_HOST"
puerto_variable: "DB_PORT"
ambientes:
development:
host: "localhost"
puerto: 5441
nombre: "clinica_dental_dev"
usuario: "dental_dev"
password_ref: "DB_PASSWORD en .env"
ssl: false
pool_size: 10
conexion: "postgresql://dental_dev:{password}@localhost:5441/clinica_dental_dev"
test:
host: "localhost"
puerto: 5441
nombre: "clinica_dental_test"
usuario: "dental_dev"
password_ref: "DB_PASSWORD en .env"
ssl: false
pool_size: 5
conexion: "postgresql://dental_dev:{password}@localhost:5441/clinica_dental_test"
staging:
host: "${DB_HOST}"
puerto: 5432
nombre: "clinica_dental_staging"
usuario: "dental_staging"
password_ref: "DB_PASSWORD en variables de CI/CD"
ssl: true
pool_size: 20
conexion: "postgresql://dental_staging:{password}@${DB_HOST}:5432/clinica_dental_staging?sslmode=require"
production:
host: "${DB_HOST}"
puerto: 5432
nombre: "clinica_dental_prod"
usuario: "dental_prod"
password_ref: "DB_PASSWORD en secrets manager"
ssl: true
pool_size: 50
conexion: "postgresql://dental_prod:{password}@${DB_HOST}:5432/clinica_dental_prod?sslmode=require"
schemas:
- nombre: "public"
descripcion: "Schema principal PostgreSQL"
- nombre: "dental"
descripcion: "Entidades odontologicas (odontograma, piezas, tratamientos, ortodoncia)"
- nombre: "clinical"
descripcion: "Heredado de erp-clinicas (consultorios, citas, historiales)"
- nombre: "financial"
descripcion: "Heredado de erp-core (pagos, facturacion, presupuestos)"
- nombre: "hr"
descripcion: "Heredado de erp-core (empleados, especialidades)"
- nombre: "inventory"
descripcion: "Heredado de erp-core (materiales, insumos dentales)"
scripts_inicializacion:
orden:
- "database/init/00-extensions.sql"
- "database/init/01-schemas.sql"
- "database/schemas/01-dental-schema-ddl.sql"
- "database/seeds/fase8/01-dental-catalogos.sql"
- "database/seeds/fase8/02-piezas-dentales-fdi.sql"
datos_iniciales:
piezas_dentales:
total: 52
nomenclatura: "FDI (Federation Dentaire Internationale)"
cuadrantes:
- id: 1
nombre: "Superior derecho"
piezas: "18-11"
tipo: "permanente"
- id: 2
nombre: "Superior izquierdo"
piezas: "21-28"
tipo: "permanente"
- id: 3
nombre: "Inferior izquierdo"
piezas: "31-38"
tipo: "permanente"
- id: 4
nombre: "Inferior derecho"
piezas: "41-48"
tipo: "permanente"
- id: 5
nombre: "Superior derecho temporal"
piezas: "55-51"
tipo: "temporal"
- id: 6
nombre: "Superior izquierdo temporal"
piezas: "61-65"
tipo: "temporal"
- id: 7
nombre: "Inferior izquierdo temporal"
piezas: "71-75"
tipo: "temporal"
- id: 8
nombre: "Inferior derecho temporal"
piezas: "81-85"
tipo: "temporal"
redis:
host_variable: "REDIS_HOST"
puerto_variable: "REDIS_PORT"
ambientes:
development:
host: "localhost"
puerto: 6388
database: 0
password: ""
conexion: "redis://localhost:6388/0"
production:
host: "${REDIS_HOST}"
puerto: 6379
database: 0
password_ref: "REDIS_PASSWORD en secrets"
conexion: "redis://:${REDIS_PASSWORD}@${REDIS_HOST}:6379/0"
uso:
- "Cache de sesiones"
- "Cache de odontogramas"
- "Rate limiting"
- "Queue de tareas (Bull)"
# -----------------------------------------------------------------------------
# VARIABLES DE ENTORNO - DESARROLLO
# -----------------------------------------------------------------------------
variables_entorno:
archivos:
ejemplo: ".env.example"
desarrollo: ".env"
test: ".env.test"
produccion: ".env.production"
development:
- nombre: "NODE_ENV"
valor: "development"
descripcion: "Ambiente de ejecucion"
requerido: true
sensible: false
- nombre: "APP_NAME"
valor: "clinica-dental"
descripcion: "Nombre de la aplicacion"
requerido: true
sensible: false
- nombre: "APP_VERSION"
valor: "1.0.0"
descripcion: "Version de la aplicacion"
requerido: false
sensible: false
# Puertos
- nombre: "FRONTEND_PORT"
valor: "3130"
descripcion: "Puerto del frontend React"
requerido: true
sensible: false
- nombre: "BACKEND_PORT"
valor: "3131"
descripcion: "Puerto del backend NestJS"
requerido: true
sensible: false
# Base de datos
- nombre: "DB_HOST"
valor: "localhost"
descripcion: "Host de PostgreSQL"
requerido: true
sensible: false
- nombre: "DB_PORT"
valor: "5441"
descripcion: "Puerto de PostgreSQL"
requerido: true
sensible: false
- nombre: "DB_NAME"
valor: "clinica_dental_dev"
descripcion: "Nombre de la base de datos"
requerido: true
sensible: false
- nombre: "DB_USER"
valor: "dental_dev"
descripcion: "Usuario de PostgreSQL"
requerido: true
sensible: false
- nombre: "DB_PASSWORD"
valor: ""
descripcion: "Password de PostgreSQL"
requerido: true
sensible: true
generacion: "openssl rand -base64 32"
- nombre: "DATABASE_URL"
valor: "postgresql://dental_dev:${DB_PASSWORD}@localhost:5441/clinica_dental_dev"
descripcion: "Connection string completo"
requerido: true
sensible: true
# Redis
- nombre: "REDIS_HOST"
valor: "localhost"
descripcion: "Host de Redis"
requerido: true
sensible: false
- nombre: "REDIS_PORT"
valor: "6388"
descripcion: "Puerto de Redis"
requerido: true
sensible: false
- nombre: "REDIS_URL"
valor: "redis://localhost:6388/0"
descripcion: "Connection string de Redis"
requerido: true
sensible: false
# Autenticacion
- nombre: "JWT_SECRET"
valor: ""
descripcion: "Secreto para firmar JWT (min 32 caracteres)"
requerido: true
sensible: true
generacion: "openssl rand -base64 64"
- nombre: "JWT_EXPIRES_IN"
valor: "24h"
descripcion: "Tiempo de expiracion del access token"
requerido: true
sensible: false
- nombre: "JWT_REFRESH_EXPIRES_IN"
valor: "7d"
descripcion: "Tiempo de expiracion del refresh token"
requerido: true
sensible: false
# CORS
- nombre: "FRONTEND_URL"
valor: "http://localhost:3130"
descripcion: "URL del frontend para CORS"
requerido: true
sensible: false
- nombre: "ALLOWED_ORIGINS"
valor: "http://localhost:3130,http://localhost:3131"
descripcion: "Origenes permitidos (comma separated)"
requerido: true
sensible: false
# Logging
- nombre: "LOG_LEVEL"
valor: "debug"
descripcion: "Nivel de logging (debug, info, warn, error)"
requerido: false
sensible: false
- nombre: "LOG_FORMAT"
valor: "pretty"
descripcion: "Formato de logs (pretty, json)"
requerido: false
sensible: false
# File Storage (radiografias, documentos)
- nombre: "STORAGE_TYPE"
valor: "local"
descripcion: "Tipo de storage (local, s3, minio)"
requerido: false
sensible: false
- nombre: "STORAGE_PATH"
valor: "./uploads"
descripcion: "Path para almacenamiento local"
requerido: false
sensible: false
- nombre: "MAX_FILE_SIZE"
valor: "20971520"
descripcion: "Tamano maximo de archivo en bytes (20MB para radiografias)"
requerido: false
sensible: false
- nombre: "ALLOWED_FILE_TYPES"
valor: "image/jpeg,image/png,image/dicom,application/pdf"
descripcion: "Tipos de archivo permitidos"
requerido: false
sensible: false
# Email (opcional)
- nombre: "SMTP_HOST"
valor: "localhost"
descripcion: "Host SMTP para emails"
requerido: false
sensible: false
- nombre: "SMTP_PORT"
valor: "1025"
descripcion: "Puerto SMTP (1025 para MailHog)"
requerido: false
sensible: false
# Configuracion Dental Especifica
- nombre: "DENTAL_FDI_NOTATION"
valor: "true"
descripcion: "Usar notacion FDI para piezas dentales"
requerido: false
sensible: false
- nombre: "ODONTOGRAM_VERSION"
valor: "2.0"
descripcion: "Version del formato de odontograma"
requerido: false
sensible: false
production:
notas: |
En produccion, las siguientes variables deben configurarse
via secrets manager o variables de CI/CD:
- DB_PASSWORD (secreto)
- JWT_SECRET (secreto)
- REDIS_PASSWORD (secreto)
- AWS_ACCESS_KEY_ID (si usa S3)
- AWS_SECRET_ACCESS_KEY (si usa S3)
IMPORTANTE - Cumplimiento Normativo:
- NOM-024-SSA3-2012: Logs de auditoria obligatorios
- Encriptacion de datos sensibles (historiales)
- Backups diarios con retencion minima 5 anos
diferencias:
- nombre: "NODE_ENV"
valor: "production"
- nombre: "LOG_LEVEL"
valor: "info"
- nombre: "LOG_FORMAT"
valor: "json"
- nombre: "DB_PORT"
valor: "5432"
- nombre: "REDIS_PORT"
valor: "6379"
- nombre: "STORAGE_TYPE"
valor: "s3"
- nombre: "AUDIT_ENABLED"
valor: "true"
- nombre: "DATA_ENCRYPTION"
valor: "true"
# -----------------------------------------------------------------------------
# CONTENEDORES DOCKER
# -----------------------------------------------------------------------------
docker:
compose_file: "docker-compose.yml"
compose_dev: "docker-compose.dev.yml"
compose_prod: "docker-compose.prod.yml"
services:
- nombre: "db"
imagen: "postgres:15-alpine"
puerto_host: 5441
puerto_container: 5432
variables:
POSTGRES_DB: "clinica_dental_dev"
POSTGRES_USER: "dental_dev"
POSTGRES_PASSWORD: "${DB_PASSWORD}"
volumes:
- "postgres_data:/var/lib/postgresql/data"
healthcheck: "pg_isready -U dental_dev"
- nombre: "redis"
imagen: "redis:7-alpine"
puerto_host: 6388
puerto_container: 6379
volumes:
- "redis_data:/data"
healthcheck: "redis-cli ping"
- nombre: "mailhog"
imagen: "mailhog/mailhog"
puerto_smtp: 1025
puerto_web: 8025
uso: "Testing de emails en desarrollo"
volumes:
- nombre: "postgres_data"
descripcion: "Datos persistentes de PostgreSQL"
- nombre: "redis_data"
descripcion: "Datos persistentes de Redis"
- nombre: "uploads_data"
descripcion: "Radiografias y documentos"
networks:
- nombre: "clinica_dental_network"
driver: "bridge"
# -----------------------------------------------------------------------------
# MIGRACIONES Y SEEDS
# -----------------------------------------------------------------------------
migraciones:
herramienta: "TypeORM"
directorio: "apps/backend/src/database/migrations"
comandos:
generar: "npm run migration:generate -- -n NombreMigracion"
ejecutar: "npm run migration:run"
revertir: "npm run migration:revert"
mostrar: "npm run migration:show"
seeds:
directorio: "database/seeds"
orden:
- "fase8/01-dental-catalogos.sql"
- "fase8/02-piezas-dentales-fdi.sql"
comandos:
ejecutar: "npm run seed"
desarrollo: "npm run seed:dev"
# -----------------------------------------------------------------------------
# SCRIPTS DE DESARROLLO
# -----------------------------------------------------------------------------
scripts:
setup:
descripcion: "Configurar entorno desde cero"
pasos:
- comando: "npm install"
descripcion: "Instalar dependencias"
- comando: "cp .env.example .env"
descripcion: "Crear archivo de configuracion"
- comando: "docker-compose up -d db redis"
descripcion: "Levantar servicios de infraestructura"
- comando: "npm run db:create"
descripcion: "Crear base de datos"
- comando: "npm run migration:run"
descripcion: "Ejecutar migraciones"
- comando: "npm run seed"
descripcion: "Cargar datos iniciales (incluye 52 piezas FDI)"
desarrollo:
frontend: "cd apps/frontend && npm run dev"
backend: "cd apps/backend && npm run start:dev"
ambos: "npm run dev:all"
docker: "docker-compose up -d"
testing:
unit: "npm run test"
unit_watch: "npm run test:watch"
e2e: "npm run test:e2e"
coverage: "npm run test:cov"
build:
frontend: "cd apps/frontend && npm run build"
backend: "cd apps/backend && npm run build"
docker: "docker-compose -f docker-compose.prod.yml build"
database:
create: "npm run db:create"
drop: "npm run db:drop"
reset: "npm run db:reset"
migrations_run: "npm run migration:run"
migrations_revert: "npm run migration:revert"
seed: "npm run seed"
linting:
lint: "npm run lint"
lint_fix: "npm run lint:fix"
format: "npm run format"
# -----------------------------------------------------------------------------
# INSTRUCCIONES DE SETUP
# -----------------------------------------------------------------------------
setup_instrucciones: |
## Setup del Entorno de Desarrollo - Clinica Dental
### Prerequisitos
- Node.js 20.x (LTS)
- PostgreSQL 15 (o Docker)
- Redis 7 (o Docker)
- npm 10.x
- Git
### Opcion 1: Setup con Docker (Recomendado)
```bash
# 1. Clonar repositorio
git clone <url_repo>
cd clinica-dental
# 2. Instalar dependencias
npm install
# 3. Configurar variables de entorno
cp .env.example .env
# Editar .env - generar passwords seguros:
# openssl rand -base64 32 # para DB_PASSWORD
# openssl rand -base64 64 # para JWT_SECRET
# 4. Levantar infraestructura
docker-compose up -d db redis
# 5. Crear base de datos y ejecutar migraciones
npm run db:create
npm run migration:run
npm run seed # Carga 52 piezas dentales FDI
# 6. Iniciar desarrollo
npm run dev:all
```
### Opcion 2: Setup con PostgreSQL Local
```bash
# 1-3. Igual que arriba
# 4. Crear usuario y base de datos en PostgreSQL
sudo -u postgres psql
CREATE USER dental_dev WITH PASSWORD 'tu_password';
CREATE DATABASE clinica_dental_dev OWNER dental_dev;
GRANT ALL PRIVILEGES ON DATABASE clinica_dental_dev TO dental_dev;
\q
# 5. Configurar Redis local o Docker
docker run -d --name redis-dental -p 6388:6379 redis:7-alpine
# 6-7. Continuar con migraciones y seeds
```
### Verificar Instalacion
- Frontend: http://localhost:3130
- Backend API: http://localhost:3131/api/v1
- Swagger Docs: http://localhost:3131/api/docs
- Health Check: http://localhost:3131/health
### Usuarios de Prueba (despues de seed)
- Admin: admin@clinica-dental.local / Admin123!
- Odontologo: doctor@clinica-dental.local / Doctor123!
- Recepcion: recepcion@clinica-dental.local / Recep123!
### Nomenclatura Dental FDI
El sistema usa la nomenclatura FDI (Federation Dentaire Internationale):
- Cuadrante 1: Superior derecho (18-11)
- Cuadrante 2: Superior izquierdo (21-28)
- Cuadrante 3: Inferior izquierdo (31-38)
- Cuadrante 4: Inferior derecho (41-48)
- Cuadrantes 5-8: Denticion temporal
# -----------------------------------------------------------------------------
# TROUBLESHOOTING
# -----------------------------------------------------------------------------
troubleshooting:
- problema: "Puerto 3130 o 3131 en uso"
solucion: |
Verificar con: lsof -i :3130
Terminar proceso: kill -9 <PID>
O cambiar puertos en .env
- problema: "Error de conexion a PostgreSQL"
solucion: |
1. Verificar que PostgreSQL esta corriendo:
docker-compose ps
# o: systemctl status postgresql
2. Verificar credenciales en .env
3. Verificar que la BD existe:
psql -h localhost -p 5441 -U dental_dev -l
- problema: "Error de conexion a Redis"
solucion: |
1. Verificar que Redis esta corriendo:
docker-compose ps
# o: redis-cli -p 6388 ping
2. Verificar puerto en .env
- problema: "Migraciones fallan"
solucion: |
1. Verificar que la BD existe
2. Verificar permisos del usuario
3. Revisar logs: npm run migration:run --verbose
4. Si es necesario, resetear: npm run db:reset
- problema: "Piezas dentales no cargadas"
solucion: |
Ejecutar seeds manualmente:
npm run seed
Verificar: SELECT COUNT(*) FROM dental.piezas_dentales;
Debe retornar 52 (32 permanentes + 20 temporales)
- problema: "Radiografias no se suben"
solucion: |
1. Verificar STORAGE_PATH existe y tiene permisos
2. Verificar MAX_FILE_SIZE en .env (default 20MB)
3. Verificar ALLOWED_FILE_TYPES incluye el tipo de archivo
- problema: "JWT errors"
solucion: |
Verificar que JWT_SECRET esta configurado (min 32 caracteres)
Generar nuevo: openssl rand -base64 64
- problema: "CORS errors en frontend"
solucion: |
Verificar FRONTEND_URL y ALLOWED_ORIGINS en .env
Deben coincidir con la URL del frontend
# -----------------------------------------------------------------------------
# CONFIGURACION DE PRODUCCION
# -----------------------------------------------------------------------------
produccion:
checklist:
- item: "Variables de entorno configuradas via secrets manager"
- item: "SSL/TLS habilitado para BD y Redis"
- item: "Backups automaticos configurados (retencion 5 anos)"
- item: "Monitoreo y alertas activas"
- item: "Rate limiting configurado"
- item: "CORS restringido a dominios autorizados"
- item: "Logs en formato JSON para agregacion"
- item: "Audit logging habilitado (NOM-024-SSA3-2012)"
- item: "Encriptacion de datos sensibles"
infraestructura_recomendada:
base_de_datos: "AWS RDS PostgreSQL 15 o equivalente"
cache: "AWS ElastiCache Redis o equivalente"
storage: "AWS S3 o equivalente (para radiografias)"
cdn: "CloudFront o equivalente"
ci_cd: "GitHub Actions / GitLab CI"
escalado:
backend_replicas: 2
pool_db_size: 50
redis_maxmemory: "512mb"
storage_bucket_region: "us-east-1"
cumplimiento:
nom_024_ssa3:
descripcion: "Expediente clinico electronico"
requisitos:
- "Logs de auditoria inmutables"
- "Firma electronica de expedientes"
- "Control de versiones de historiales"
retencion_datos:
expedientes: "5 anos minimo"
radiografias: "5 anos minimo"
logs_auditoria: "5 anos"
# -----------------------------------------------------------------------------
# REFERENCIAS
# -----------------------------------------------------------------------------
referencias:
perfil_devenv: "orchestration/agents/perfiles/PERFIL-DEVENV.md"
inventario_master: "orchestration/inventarios/DEVENV-MASTER-INVENTORY.yml"
inventario_puertos: "orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml"
contexto_proyecto: "orchestration/00-guidelines/CONTEXTO-PROYECTO.md"
parent_clinicas: "../erp-clinicas/orchestration/environment/ENVIRONMENT-INVENTORY.yml"
schema_dental: "database/schemas/01-dental-schema-ddl.sql"
nomenclatura_fdi: "https://www.fdiworlddental.org/tooth-numbering-system"
# =============================================================================
# FIN DE INVENTARIO
# =============================================================================

View File

@ -0,0 +1,284 @@
---
# DATABASE INVENTORY - Clinica Dental
# Version: 1.0.0
# Ultima actualizacion: 2026-01-07
proyecto: "clinica-dental"
schema_principal: "dental"
version_ddl: "1.0"
estado: "completado"
herencia:
vertical_padre: "erp-clinicas"
suite_core: "erp-core"
schemas_heredados:
- name: "auth"
desde: "erp-core"
- name: "tenants"
desde: "erp-core"
- name: "users"
desde: "erp-core"
- name: "clinica"
desde: "erp-clinicas"
tablas: ["patients", "doctors", "appointments", "consultations"]
enums:
- name: "estado_pieza"
values:
- "sano"
- "caries"
- "obturacion"
- "endodoncia"
- "corona"
- "puente"
- "implante"
- "ausente"
- "extraccion_indicada"
- "diente_temporal"
- "fractura"
- "movilidad"
- name: "cara_dental"
values:
- "mesial"
- "distal"
- "oclusal"
- "incisal"
- "vestibular"
- "bucal"
- "lingual"
- "palatino"
- name: "estado_tratamiento"
values:
- "pendiente"
- "en_proceso"
- "completado"
- "cancelado"
- name: "tipo_ortodoncia"
values:
- "brackets_metalicos"
- "brackets_esteticos"
- "brackets_linguales"
- "alineadores"
- "removible"
- "retenedor"
catalogos:
- name: "piezas_dentales"
descripcion: "Catalogo de piezas dentales (nomenclatura FDI)"
registros: 52
columnas:
- "id: UUID PK"
- "numero: VARCHAR(10) UNIQUE"
- "nombre: VARCHAR(50)"
- "cuadrante: INTEGER (1-8)"
- "es_temporal: BOOLEAN"
- "descripcion: TEXT"
- name: "tratamientos_catalogo"
descripcion: "Catalogo de tratamientos por tenant"
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "codigo: VARCHAR(20)"
- "nombre: VARCHAR(100)"
- "categoria: VARCHAR(50)"
- "duracion_minutos: INTEGER"
- "precio_base: NUMERIC(10,2)"
- "requiere_rx: BOOLEAN"
- "requiere_anestesia: BOOLEAN"
tablas:
- name: "odontogramas"
descripcion: "Odontogramas de pacientes"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK (clinica.patients)"
- "fecha_creacion: DATE"
- "fecha_actualizacion: DATE"
- "notas: TEXT"
indices:
- "idx_odontogramas_tenant"
- "idx_odontogramas_patient"
- name: "odontograma_piezas"
descripcion: "Estado de cada pieza en el odontograma"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "odontograma_id: UUID FK"
- "pieza_id: UUID FK (piezas_dentales)"
- "estado: dental.estado_pieza"
- "caras_afectadas: JSONB"
- "observaciones: TEXT"
indices:
- "idx_odontograma_piezas_odontograma"
- "idx_odontograma_piezas_pieza"
- name: "tratamientos_paciente"
descripcion: "Tratamientos realizados a pacientes"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK"
- "odontograma_id: UUID FK"
- "tratamiento_id: UUID FK (tratamientos_catalogo)"
- "odontologo_id: UUID FK"
- "consultation_id: UUID FK"
- "pieza_id: UUID FK"
- "caras_tratadas: dental.cara_dental[]"
- "fecha_inicio: DATE"
- "fecha_fin: DATE"
- "estado: dental.estado_tratamiento"
- "precio: NUMERIC(10,2)"
- "descuento: NUMERIC(5,2)"
- "precio_final: NUMERIC(10,2)"
indices:
- "idx_tratamientos_paciente_tenant"
- "idx_tratamientos_paciente_patient"
- "idx_tratamientos_paciente_estado"
- name: "ortodoncia"
descripcion: "Casos de ortodoncia"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK"
- "odontologo_id: UUID FK"
- "tipo: dental.tipo_ortodoncia"
- "marca: VARCHAR(100)"
- "fecha_inicio: DATE"
- "fecha_estimada_fin: DATE"
- "fecha_real_fin: DATE"
- "estado: dental.estado_tratamiento"
- "meses_estimados: INTEGER"
- "costo_total: NUMERIC(10,2)"
- "enganche: NUMERIC(10,2)"
- "mensualidad: NUMERIC(10,2)"
indices:
- "idx_ortodoncia_tenant"
- "idx_ortodoncia_patient"
- "idx_ortodoncia_estado"
- name: "ortodoncia_citas"
descripcion: "Citas de seguimiento de ortodoncia"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "ortodoncia_id: UUID FK"
- "appointment_id: UUID FK"
- "fecha: DATE"
- "numero_cita: INTEGER"
- "procedimiento: TEXT"
- "arco_superior: VARCHAR(50)"
- "arco_inferior: VARCHAR(50)"
- "ligas: VARCHAR(50)"
- "proxima_cita: DATE"
indices:
- "idx_ortodoncia_citas_ortodoncia"
- name: "protesis"
descripcion: "Trabajos protesicos"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK"
- "odontologo_id: UUID FK"
- "tipo: VARCHAR(50)"
- "piezas_involucradas: TEXT[]"
- "laboratorio_id: UUID FK"
- "fecha_envio_lab: DATE"
- "fecha_recepcion_lab: DATE"
- "material: VARCHAR(100)"
- "color: VARCHAR(50)"
- "estado: dental.estado_tratamiento"
- "fecha_colocacion: DATE"
- "tiene_garantia: BOOLEAN"
- "meses_garantia: INTEGER"
- "costo_laboratorio: NUMERIC(10,2)"
- "precio_paciente: NUMERIC(10,2)"
indices:
- "idx_protesis_tenant"
- "idx_protesis_patient"
- name: "radiografias"
descripcion: "Radiografias dentales"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK"
- "consultation_id: UUID FK"
- "tipo: VARCHAR(50)"
- "pieza_id: UUID FK"
- "fecha: DATE"
- "url_imagen: VARCHAR(255)"
- "interpretacion: TEXT"
indices:
- "idx_radiografias_tenant"
- "idx_radiografias_patient"
- name: "presupuestos"
descripcion: "Presupuestos de tratamiento"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "patient_id: UUID FK"
- "odontologo_id: UUID FK"
- "numero: VARCHAR(20)"
- "fecha: DATE"
- "fecha_vencimiento: DATE"
- "estado: VARCHAR(20)"
- "subtotal: NUMERIC(12,2)"
- "descuento_porcentaje: NUMERIC(5,2)"
- "descuento_monto: NUMERIC(12,2)"
- "total: NUMERIC(12,2)"
- "requiere_financiamiento: BOOLEAN"
- "enganche: NUMERIC(12,2)"
- "numero_pagos: INTEGER"
- "monto_pago: NUMERIC(12,2)"
indices:
- "idx_presupuestos_tenant"
- "idx_presupuestos_patient"
- "idx_presupuestos_estado"
- name: "presupuesto_lineas"
descripcion: "Lineas de presupuesto"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "presupuesto_id: UUID FK"
- "tratamiento_id: UUID FK"
- "pieza_id: UUID FK"
- "descripcion: TEXT"
- "cantidad: INTEGER"
- "precio_unitario: NUMERIC(10,2)"
- "descuento: NUMERIC(5,2)"
- "subtotal: NUMERIC(10,2)"
- "sequence: INTEGER"
indices:
- "idx_presupuesto_lineas_presupuesto"
resumen:
total_enums: 4
total_catalogos: 2
total_tablas: 10
total_con_rls: 10
archivos_ddl:
- "database/schemas/01-dental-schema-ddl.sql"
archivos_seeds:
- "database/seeds/fase8/01-dental-catalogos.sql"
ultima_actualizacion: "2026-01-07"
actualizado_por: "Orquestador Workspace"

View File

@ -0,0 +1,76 @@
---
# MASTER INVENTORY - Clinica Dental
# Version: 1.0.0
# Ultima actualizacion: 2026-01-07
proyecto: "clinica-dental"
descripcion: "ERP especializado para clinicas dentales"
version: "0.1.0"
estado: "desarrollo"
tipo: "vertical"
base: "erp-clinicas"
progreso:
fase_actual: "Database"
porcentaje: 15
database_completado: true
backend_completado: false
frontend_completado: false
herencia:
vertical_padre: "erp-clinicas"
suite_core: "erp-core"
modulos_heredados:
- "auth"
- "users"
- "tenants"
- "roles"
- "patients"
- "appointments"
- "billing"
modulos_especificos:
- id: "DENTAL-001"
nombre: "odontograma"
descripcion: "Registro grafico del estado dental"
estado: "ddl_completado"
- id: "DENTAL-002"
nombre: "tratamientos-dentales"
descripcion: "Procedimientos odontologicos"
estado: "ddl_completado"
- id: "DENTAL-003"
nombre: "ortodoncia"
descripcion: "Control de tratamientos ortodonticos"
estado: "ddl_completado"
- id: "DENTAL-004"
nombre: "protesis"
descripcion: "Registro de trabajos protesicos"
estado: "ddl_completado"
database:
schema: "dental"
archivo_ddl: "database/schemas/01-dental-schema-ddl.sql"
archivo_seeds: "database/seeds/fase8/01-dental-catalogos.sql"
tablas_especificas:
- "dental_pieces"
- "dental_charts"
- "dental_treatments"
- "orthodontic_cases"
- "prosthetics"
catalogos:
- "especialidades_odontologicas"
- "estados_piezas_dentales"
- "caras_dentales"
- "tipos_tratamiento_dental"
proximas_tareas:
- "Implementar backend modulo odontograma"
- "Crear frontend para odontograma digital"
- "Integracion con erp-clinicas"
ultima_actualizacion: "2026-01-07"
actualizado_por: "Orquestador"

View File

@ -0,0 +1,209 @@
# Reporte de Ejecucion - Sprint 6
## Clinica Dental Documentation
**Fecha:** 2026-01-07
**Ejecutor:** Claude Opus 4.5 (Orquestador Workspace)
**Framework:** NEXUS v4.0 + SIMCO v2.5
---
## Resumen Ejecutivo
Sprint 6 completado exitosamente. Se documentaron los 6 modulos especializados del sistema de clinica dental con especificaciones tecnicas completas, modelo de datos, endpoints API, flujos, y criterios de aceptacion.
## Tareas Ejecutadas
| ID | Tarea | Estado | Resultado |
|----|-------|--------|-----------|
| S6.1 | Explorar estructura | ✅ Completado | Proyecto analizado |
| S6.2 | Crear inventarios | ✅ Completado | DATABASE_INVENTORY.yml |
| S6.3 | Crear epicas modulos | ✅ Completado | 6 epicas |
| S6.4 | Validar Sprint 6 | ✅ Completado | Este reporte |
## Proyecto Analizado
### Informacion General
| Campo | Valor |
|-------|-------|
| Proyecto | clinica-dental |
| Tipo | ERP Especializado (Vertical) |
| Base | erp-clinicas |
| Suite Core | erp-core |
| Estado | Database completado, Backend pendiente |
### Herencia
```
erp-core
└── erp-clinicas
└── clinica-dental (DENTAL-001 a DENTAL-006)
```
**Modulos heredados:**
- auth, users, tenants, roles (erp-core)
- patients, doctors, appointments, consultations (erp-clinicas)
## Archivos Creados
### Inventarios (1 archivo)
| Archivo | Ubicacion | Contenido |
|---------|-----------|-----------|
| DATABASE_INVENTORY.yml | orchestration/inventarios/ | 4 ENUMs, 2 catalogos, 10 tablas |
### Epicas (6 archivos)
| Archivo | Modulo | Estado DDL | Fase |
|---------|--------|------------|------|
| DENTAL-001-odontograma.md | Odontograma Digital | Completado | 1 - Core |
| DENTAL-002-tratamientos.md | Tratamientos Dentales | Completado | 2 - Tratamientos |
| DENTAL-003-ortodoncia.md | Ortodoncia | Completado | 3 - Especialidades |
| DENTAL-004-protesis.md | Protesis Dentales | Completado | 3 - Especialidades |
| DENTAL-005-radiografias.md | Radiografias | Completado | 4 - Optimizacion |
| DENTAL-006-presupuestos.md | Presupuestos | Completado | 2 - Tratamientos |
## Modelo de Datos Documentado
### Schema: dental
**ENUMs:**
| Nombre | Valores |
|--------|---------|
| estado_pieza | sano, caries, obturacion, endodoncia, corona, puente, implante, ausente, etc. |
| cara_dental | mesial, distal, oclusal, incisal, vestibular, bucal, lingual, palatino |
| estado_tratamiento | pendiente, en_proceso, completado, cancelado |
| tipo_ortodoncia | brackets_metalicos, brackets_esteticos, brackets_linguales, alineadores, removible, retenedor |
**Tablas:**
| Tabla | Descripcion | RLS |
|-------|-------------|-----|
| piezas_dentales | Catalogo 52 piezas FDI | No (catalogo) |
| tratamientos_catalogo | Procedimientos por tenant | Si |
| odontogramas | Odontogramas de pacientes | Si |
| odontograma_piezas | Estado por pieza | Si |
| tratamientos_paciente | Tratamientos realizados | Si |
| ortodoncia | Casos de ortodoncia | Si |
| ortodoncia_citas | Citas de seguimiento | Si |
| protesis | Trabajos protesicos | Si |
| radiografias | Radiografias dentales | Si |
| presupuestos | Presupuestos de tratamiento | Si |
| presupuesto_lineas | Lineas de presupuesto | Si |
## Nomenclatura FDI Documentada
```
SUPERIOR
Derecho | Izquierdo
18-11 | 21-28
---------|----------
48-41 | 31-38
Derecho | Izquierdo
INFERIOR
Dientes permanentes: 32 (cuadrantes 1-4)
Dientes deciduos: 20 (cuadrantes 5-8)
Total piezas catalogadas: 52
```
## Endpoints Documentados
| Modulo | Endpoints |
|--------|-----------|
| Odontograma | 8 endpoints |
| Tratamientos | 10 endpoints |
| Ortodoncia | 9 endpoints |
| Protesis | 9 endpoints |
| Radiografias | 8 endpoints |
| Presupuestos | 12 endpoints |
| **Total** | **56 endpoints** |
## Cobertura por Fase
```
Fase 1 - Core: 1 modulo (DENTAL-001)
Fase 2 - Tratamientos: 2 modulos (DENTAL-002, DENTAL-006)
Fase 3 - Especialidades: 2 modulos (DENTAL-003, DENTAL-004)
Fase 4 - Optimizacion: 1 modulo (DENTAL-005)
```
## Dependencias Entre Modulos
```
clinica.patients (erp-clinicas)
├── DENTAL-001 (Odontograma)
│ │
│ ├── DENTAL-002 (Tratamientos)
│ │ │
│ │ └── DENTAL-006 (Presupuestos)
│ │
│ ├── DENTAL-003 (Ortodoncia)
│ │
│ ├── DENTAL-004 (Protesis)
│ │
│ └── DENTAL-005 (Radiografias)
└── clinica.consultations
└── (vinculo a tratamientos y radiografias)
```
## Validacion de Calidad
### Checklist SIMCO
| Criterio | Status |
|----------|--------|
| Metadata completa | ✅ |
| Objetivos definidos | ✅ |
| Alcance claro | ✅ |
| Modelo de datos | ✅ |
| Endpoints documentados | ✅ |
| Interfaz de servicio | ✅ |
| Flujos principales | ✅ |
| Dependencias mapeadas | ✅ |
| Criterios de aceptacion | ✅ |
### Consistencia
- Formato uniforme en todas las epicas
- Nomenclatura DENTAL-XXX consistente
- Estados de tratamiento uniformes
- Nomenclatura FDI correcta (52 piezas)
## Archivos DDL Existentes
| Archivo | Lineas | Estado |
|---------|--------|--------|
| database/schemas/01-dental-schema-ddl.sql | 503 | Completado |
| database/seeds/fase8/01-dental-catalogos.sql | (pendiente) | Referenciado |
## Metricas del Sprint
| Metrica | Valor |
|---------|-------|
| Archivos creados | 7 (1 inventario + 6 epicas) |
| Lineas documentadas | ~2,800 |
| Endpoints especificados | 56 |
| Tablas documentadas | 11 |
| ENUMs documentados | 4 |
| Piezas dentales FDI | 52 |
## Proximos Pasos
1. **Sprint 7:** Documentar clinica-veterinaria
2. **Sprint 8:** Consolidacion y validacion final
3. **Implementacion:** Backend modulos DENTAL-001 a DENTAL-006
4. **Frontend:** Componente OdontogramaViewer como prioridad
## Observaciones
- Proyecto hereda correctamente de erp-clinicas
- DDL ya implementado y funcional
- Documentacion alineada con VISION.md existente
- Nomenclatura FDI completamente catalogada
- 10 de 11 tablas con RLS habilitado
---
**Sprint 6 Completado:** 2026-01-07
**Validado por:** Orquestador Workspace (NEXUS v4.0)

View File

@ -0,0 +1,52 @@
# TRAZA DE TAREAS - DATABASE
**Proyecto:** clinica-dental
**Capa:** Database
**Version:** 1.0.0
---
## HISTORIAL
### [2026-01-04] DENTAL-DDL-001
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~2h
#### Descripcion
Creacion del schema dental con tablas especificas para odontologia.
#### Archivos Creados
- `database/schemas/01-dental-schema-ddl.sql`
#### Resultado
Schema dental creado con tablas para odontograma, tratamientos, ortodoncia y protesis.
---
### [2026-01-04] DENTAL-SEEDS-001
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~1h
#### Descripcion
Seeds iniciales con catalogos odontologicos.
#### Archivos Creados
- `database/seeds/fase8/01-dental-catalogos.sql`
#### Resultado
Catalogos cargados: especialidades, estados de piezas, caras dentales.
---
## TAREAS PENDIENTES
| ID | Tarea | Prioridad | Dependencias |
|----|-------|-----------|--------------|
| DENTAL-DDL-002 | RLS policies para tablas dental | P1 | - |
| DENTAL-DDL-003 | Funciones de validacion odontograma | P2 | - |
---
**Ultima actualizacion:** 2026-01-07