commit 87d25ab1ac1d92d37404d462f58765a22710ab6a Author: rckrdmrd Date: Sat Jan 10 11:29:18 2026 -0600 [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 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8c1d2a1 --- /dev/null +++ b/.env.example @@ -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 +# ============================================================================= diff --git a/.env.ports b/.env.ports new file mode 100644 index 0000000..664f127 --- /dev/null +++ b/.env.ports @@ -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 +# ============================================================================= diff --git a/README.md b/README.md new file mode 100644 index 0000000..5c0f4eb --- /dev/null +++ b/README.md @@ -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 diff --git a/database/schemas/01-dental-schema-ddl.sql b/database/schemas/01-dental-schema-ddl.sql new file mode 100644 index 0000000..1b791d5 --- /dev/null +++ b/database/schemas/01-dental-schema-ddl.sql @@ -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 +-- ============================================================================ diff --git a/database/seeds/fase8/01-dental-catalogos.sql b/database/seeds/fase8/01-dental-catalogos.sql new file mode 100644 index 0000000..86256cb --- /dev/null +++ b/database/seeds/fase8/01-dental-catalogos.sql @@ -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; diff --git a/docs/00-vision-general/README.md b/docs/00-vision-general/README.md new file mode 100644 index 0000000..285bde4 --- /dev/null +++ b/docs/00-vision-general/README.md @@ -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. diff --git a/docs/00-vision-general/VISION.md b/docs/00-vision-general/VISION.md new file mode 100644 index 0000000..210cb5f --- /dev/null +++ b/docs/00-vision-general/VISION.md @@ -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 diff --git a/docs/01-epicas/DENTAL-001-odontograma.md b/docs/01-epicas/DENTAL-001-odontograma.md new file mode 100644 index 0000000..a21280d --- /dev/null +++ b/docs/01-epicas/DENTAL-001-odontograma.md @@ -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; + create(patientId: string): Promise; + updatePieza(odontogramaId: string, piezaId: string, data: PiezaUpdate): Promise; + getHistorial(patientId: string): Promise; + compare(patientId: string, fecha1: Date, fecha2: Date): Promise; +} + +interface PiezaUpdate { + estado: EstadoPieza; + carasAfectadas?: Record; + 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 diff --git a/docs/01-epicas/DENTAL-002-tratamientos.md b/docs/01-epicas/DENTAL-002-tratamientos.md new file mode 100644 index 0000000..4a4f45e --- /dev/null +++ b/docs/01-epicas/DENTAL-002-tratamientos.md @@ -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; + createProcedimiento(data: CreateProcedimiento): Promise; + + // Tratamientos paciente + getByPatient(patientId: string): Promise; + create(data: CreateTratamientoPaciente): Promise; + updateEstado(id: string, estado: EstadoTratamiento): Promise; + + // Reportes + getPendientes(odontologoId?: string): Promise; + getCompletadosHoy(): Promise; +} + +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 diff --git a/docs/01-epicas/DENTAL-003-ortodoncia.md b/docs/01-epicas/DENTAL-003-ortodoncia.md new file mode 100644 index 0000000..48d815c --- /dev/null +++ b/docs/01-epicas/DENTAL-003-ortodoncia.md @@ -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; + getById(id: string): Promise; + create(data: CreateCasoOrtodoncia): Promise; + registrarCita(casoId: string, data: CitaOrtodoncia): Promise; + finalizar(id: string, data: FinalizarOrtodoncia): Promise; + getProximasCitas(dias: number): Promise; +} + +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 diff --git a/docs/01-epicas/DENTAL-004-protesis.md b/docs/01-epicas/DENTAL-004-protesis.md new file mode 100644 index 0000000..db1dfaf --- /dev/null +++ b/docs/01-epicas/DENTAL-004-protesis.md @@ -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; + getById(id: string): Promise; + create(data: CreateProtesis): Promise; + updateEstado(id: string, estado: EstadoProtesis): Promise; + getPendientesLab(): Promise; + getGarantiasActivas(): Promise; + reclamarGarantia(id: string, motivo: string): Promise; +} + +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 diff --git a/docs/01-epicas/DENTAL-005-radiografias.md b/docs/01-epicas/DENTAL-005-radiografias.md new file mode 100644 index 0000000..552318b --- /dev/null +++ b/docs/01-epicas/DENTAL-005-radiografias.md @@ -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; + getById(id: string): Promise; + create(data: CreateRadiografia): Promise; + updateInterpretacion(id: string, interpretacion: string): Promise; + uploadImage(id: string, file: File): Promise; + getByPieza(piezaId: string): Promise; +} + +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 { + 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 diff --git a/docs/01-epicas/DENTAL-006-presupuestos.md b/docs/01-epicas/DENTAL-006-presupuestos.md new file mode 100644 index 0000000..f1b1dda --- /dev/null +++ b/docs/01-epicas/DENTAL-006-presupuestos.md @@ -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; + getById(id: string): Promise; + create(data: CreatePresupuesto): Promise; + addLinea(presupuestoId: string, linea: CreateLinea): Promise; + removeLinea(presupuestoId: string, lineaId: string): Promise; + aprobar(id: string): Promise; + rechazar(id: string, motivo?: string): Promise; + generarPDF(id: string): Promise; + calcularTotales(id: string): Promise; +} + +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 diff --git a/docs/02-definicion-modulos/_MAP.md b/docs/02-definicion-modulos/_MAP.md new file mode 100644 index 0000000..5230853 --- /dev/null +++ b/docs/02-definicion-modulos/_MAP.md @@ -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 diff --git a/docs/02-definicion-modulos/modulo-odontograma.md b/docs/02-definicion-modulos/modulo-odontograma.md new file mode 100644 index 0000000..e82dfc0 --- /dev/null +++ b/docs/02-definicion-modulos/modulo-odontograma.md @@ -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 = { + 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 diff --git a/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml b/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml new file mode 100644 index 0000000..f53fb28 --- /dev/null +++ b/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml @@ -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" diff --git a/docs/_MAP.md b/docs/_MAP.md new file mode 100644 index 0000000..c3390a1 --- /dev/null +++ b/docs/_MAP.md @@ -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 diff --git a/orchestration/00-guidelines/CONTEXTO-PROYECTO.md b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md new file mode 100644 index 0000000..e9343ee --- /dev/null +++ b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md @@ -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 diff --git a/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md new file mode 100644 index 0000000..91afc15 --- /dev/null +++ b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md @@ -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 diff --git a/orchestration/CONTEXT-MAP.yml b/orchestration/CONTEXT-MAP.yml new file mode 100644 index 0000000..b26933f --- /dev/null +++ b/orchestration/CONTEXT-MAP.yml @@ -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/" diff --git a/orchestration/PROJECT-STATUS.md b/orchestration/PROJECT-STATUS.md new file mode 100644 index 0000000..670ad62 --- /dev/null +++ b/orchestration/PROJECT-STATUS.md @@ -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 diff --git a/orchestration/PROXIMA-ACCION.md b/orchestration/PROXIMA-ACCION.md new file mode 100644 index 0000000..5738907 --- /dev/null +++ b/orchestration/PROXIMA-ACCION.md @@ -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 diff --git a/orchestration/environment/ENVIRONMENT-INVENTORY.yml b/orchestration/environment/ENVIRONMENT-INVENTORY.yml new file mode 100644 index 0000000..bbdfbd8 --- /dev/null +++ b/orchestration/environment/ENVIRONMENT-INVENTORY.yml @@ -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 + 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 + 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 +# ============================================================================= diff --git a/orchestration/inventarios/DATABASE_INVENTORY.yml b/orchestration/inventarios/DATABASE_INVENTORY.yml new file mode 100644 index 0000000..4afebab --- /dev/null +++ b/orchestration/inventarios/DATABASE_INVENTORY.yml @@ -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" diff --git a/orchestration/inventarios/MASTER_INVENTORY.yml b/orchestration/inventarios/MASTER_INVENTORY.yml new file mode 100644 index 0000000..3cf1294 --- /dev/null +++ b/orchestration/inventarios/MASTER_INVENTORY.yml @@ -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" diff --git a/orchestration/trazas/REPORTE-EJECUCION-SPRINT6-2026-01-07.md b/orchestration/trazas/REPORTE-EJECUCION-SPRINT6-2026-01-07.md new file mode 100644 index 0000000..1f79680 --- /dev/null +++ b/orchestration/trazas/REPORTE-EJECUCION-SPRINT6-2026-01-07.md @@ -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) diff --git a/orchestration/trazas/TRAZA-TAREAS-DATABASE.md b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md new file mode 100644 index 0000000..2b05bc8 --- /dev/null +++ b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md @@ -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