[MIGRATION-V2] feat: Migrar clinica-dental a estructura v2
- Prefijo v2: CDN - TRACEABILITY-MASTER.yml creado - Listo para integracion como submodulo Workspace: v2.0.0 | SIMCO: v4.0.0
This commit is contained in:
commit
87d25ab1ac
307
.env.example
Normal file
307
.env.example
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# .env.example - CLINICA DENTAL
|
||||||
|
# =============================================================================
|
||||||
|
# Copia este archivo a .env y configura los valores
|
||||||
|
# Generado por: @PERFIL_DEVENV
|
||||||
|
# Referencia: orchestration/environment/ENVIRONMENT-INVENTORY.yml
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# APLICACION
|
||||||
|
# =============================================================================
|
||||||
|
NODE_ENV=development
|
||||||
|
APP_NAME=clinica-dental
|
||||||
|
APP_VERSION=1.0.0
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# PUERTOS - Asignados por DEVENV-PORTS-INVENTORY.yml
|
||||||
|
# =============================================================================
|
||||||
|
FRONTEND_PORT=3130
|
||||||
|
BACKEND_PORT=3131
|
||||||
|
|
||||||
|
# Alias para compatibilidad
|
||||||
|
PORT=3131
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# BASE DE DATOS - PostgreSQL
|
||||||
|
# =============================================================================
|
||||||
|
# Desarrollo: Puerto 5441 (asignado en DEVENV-PORTS-INVENTORY.yml)
|
||||||
|
# Produccion: Puerto 5432 (estandar)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_PORT=5441
|
||||||
|
DB_NAME=clinica_dental_dev
|
||||||
|
DB_USER=dental_dev
|
||||||
|
|
||||||
|
# IMPORTANTE: Generar password seguro con: openssl rand -base64 32
|
||||||
|
DB_PASSWORD=CAMBIAR_POR_PASSWORD_SEGURO
|
||||||
|
|
||||||
|
# Connection string completo (calculado de las variables anteriores)
|
||||||
|
DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
|
||||||
|
|
||||||
|
# Pool de conexiones
|
||||||
|
DB_POOL_SIZE=10
|
||||||
|
DB_CONNECTION_TIMEOUT=5000
|
||||||
|
|
||||||
|
# SSL (false para desarrollo, true para produccion)
|
||||||
|
DB_SSL=false
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# BASE DE DATOS - Ambientes adicionales
|
||||||
|
# =============================================================================
|
||||||
|
# Test (mismo servidor, diferente BD)
|
||||||
|
# DB_NAME_TEST=clinica_dental_test
|
||||||
|
|
||||||
|
# Staging (servidor externo)
|
||||||
|
# DB_HOST_STAGING=staging-db.example.com
|
||||||
|
# DB_NAME_STAGING=clinica_dental_staging
|
||||||
|
# DB_USER_STAGING=dental_staging
|
||||||
|
|
||||||
|
# Produccion (servidor externo)
|
||||||
|
# DB_HOST_PROD=prod-db.example.com
|
||||||
|
# DB_NAME_PROD=clinica_dental_prod
|
||||||
|
# DB_USER_PROD=dental_prod
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# REDIS - Cache y Sesiones
|
||||||
|
# =============================================================================
|
||||||
|
# Desarrollo: Puerto 6388 (asignado en DEVENV-PORTS-INVENTORY.yml)
|
||||||
|
# Produccion: Puerto 6379 (estandar)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
REDIS_HOST=localhost
|
||||||
|
REDIS_PORT=6388
|
||||||
|
REDIS_DB=0
|
||||||
|
|
||||||
|
# Password (vacio para desarrollo, requerido en produccion)
|
||||||
|
REDIS_PASSWORD=
|
||||||
|
|
||||||
|
# Connection string
|
||||||
|
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}
|
||||||
|
|
||||||
|
# Configuracion de cache
|
||||||
|
REDIS_CACHE_TTL=3600
|
||||||
|
REDIS_MAX_MEMORY=256mb
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# AUTENTICACION - JWT
|
||||||
|
# =============================================================================
|
||||||
|
# IMPORTANTE: Generar secreto seguro con: openssl rand -base64 64
|
||||||
|
# Minimo 32 caracteres requeridos
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
JWT_SECRET=CAMBIAR_POR_SECRETO_SEGURO_DE_AL_MENOS_32_CARACTERES
|
||||||
|
|
||||||
|
# Tiempos de expiracion
|
||||||
|
JWT_EXPIRES_IN=24h
|
||||||
|
JWT_REFRESH_EXPIRES_IN=7d
|
||||||
|
|
||||||
|
# Algoritmo (default: HS256)
|
||||||
|
JWT_ALGORITHM=HS256
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CORS - Cross-Origin Resource Sharing
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
FRONTEND_URL=http://localhost:3130
|
||||||
|
|
||||||
|
# Multiples origenes separados por coma
|
||||||
|
ALLOWED_ORIGINS=http://localhost:3130,http://localhost:3131
|
||||||
|
|
||||||
|
# Metodos permitidos
|
||||||
|
CORS_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS
|
||||||
|
|
||||||
|
# Headers permitidos
|
||||||
|
CORS_HEADERS=Content-Type,Authorization,X-Requested-With
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# LOGGING
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Niveles: debug, info, warn, error
|
||||||
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
|
# Formatos: pretty (desarrollo), json (produccion)
|
||||||
|
LOG_FORMAT=pretty
|
||||||
|
|
||||||
|
# Archivo de logs (opcional)
|
||||||
|
# LOG_FILE=./logs/app.log
|
||||||
|
|
||||||
|
# Rotacion de logs
|
||||||
|
# LOG_MAX_SIZE=10m
|
||||||
|
# LOG_MAX_FILES=5
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ALMACENAMIENTO DE ARCHIVOS (Radiografias y documentos)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Tipo: local, s3, minio
|
||||||
|
STORAGE_TYPE=local
|
||||||
|
|
||||||
|
# Path local (para desarrollo)
|
||||||
|
STORAGE_PATH=./uploads
|
||||||
|
|
||||||
|
# Tamano maximo de archivo (20MB en bytes - para radiografias)
|
||||||
|
MAX_FILE_SIZE=20971520
|
||||||
|
|
||||||
|
# Tipos permitidos (incluye DICOM para imagenes medicas)
|
||||||
|
ALLOWED_FILE_TYPES=image/jpeg,image/png,image/dicom,application/pdf,application/dicom
|
||||||
|
|
||||||
|
# Directorio para radiografias
|
||||||
|
XRAY_STORAGE_PATH=./uploads/radiografias
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# AWS S3 (para produccion)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# AWS_ACCESS_KEY_ID=
|
||||||
|
# AWS_SECRET_ACCESS_KEY=
|
||||||
|
# AWS_REGION=us-east-1
|
||||||
|
# AWS_S3_BUCKET=clinica-dental-uploads
|
||||||
|
# AWS_S3_XRAY_BUCKET=clinica-dental-radiografias
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# EMAIL - SMTP
|
||||||
|
# =============================================================================
|
||||||
|
# MailHog para desarrollo: puerto 1025
|
||||||
|
# Servidor real para produccion
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
SMTP_HOST=localhost
|
||||||
|
SMTP_PORT=1025
|
||||||
|
SMTP_SECURE=false
|
||||||
|
|
||||||
|
# Credenciales (para produccion)
|
||||||
|
# SMTP_USER=
|
||||||
|
# SMTP_PASSWORD=
|
||||||
|
|
||||||
|
# Remitente por defecto
|
||||||
|
SMTP_FROM_NAME=Clinica Dental
|
||||||
|
SMTP_FROM_EMAIL=noreply@clinica-dental.local
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# SEGURIDAD ADICIONAL
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Rate limiting
|
||||||
|
RATE_LIMIT_WINDOW=900000
|
||||||
|
RATE_LIMIT_MAX=100
|
||||||
|
|
||||||
|
# Helmet (headers de seguridad)
|
||||||
|
HELMET_ENABLED=true
|
||||||
|
|
||||||
|
# CSRF Protection
|
||||||
|
CSRF_ENABLED=false
|
||||||
|
|
||||||
|
# Throttle por IP
|
||||||
|
THROTTLE_TTL=60
|
||||||
|
THROTTLE_LIMIT=10
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# MONITOREO Y METRICAS
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Health check endpoint
|
||||||
|
HEALTH_CHECK_ENABLED=true
|
||||||
|
|
||||||
|
# Metricas Prometheus (opcional)
|
||||||
|
# METRICS_ENABLED=false
|
||||||
|
# METRICS_PORT=9090
|
||||||
|
|
||||||
|
# Sentry (opcional)
|
||||||
|
# SENTRY_DSN=
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CONFIGURACION ESPECIFICA DENTAL
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Nomenclatura dental (FDI por defecto)
|
||||||
|
DENTAL_FDI_NOTATION=true
|
||||||
|
|
||||||
|
# Version del formato de odontograma
|
||||||
|
ODONTOGRAM_VERSION=2.0
|
||||||
|
|
||||||
|
# Recordatorios de citas (dias antes)
|
||||||
|
APPOINTMENT_REMINDER_DAYS=2
|
||||||
|
|
||||||
|
# Validez de presupuestos (dias)
|
||||||
|
BUDGET_VALIDITY_DAYS=30
|
||||||
|
|
||||||
|
# Tipos de radiografias habilitados
|
||||||
|
XRAY_TYPES=periapical,panoramica,oclusal,bitewing,cefalometrica
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CUMPLIMIENTO NORMATIVO (NOM-024-SSA3-2012)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Habilitar auditoria (obligatorio en produccion)
|
||||||
|
AUDIT_ENABLED=true
|
||||||
|
|
||||||
|
# Retencion de logs de auditoria (dias)
|
||||||
|
AUDIT_RETENTION_DAYS=1825
|
||||||
|
|
||||||
|
# Encriptacion de datos sensibles
|
||||||
|
DATA_ENCRYPTION=false
|
||||||
|
|
||||||
|
# Firma electronica de expedientes
|
||||||
|
ELECTRONIC_SIGNATURE=false
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# DESARROLLO Y DEBUG
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Habilitar debug de TypeORM
|
||||||
|
# TYPEORM_LOGGING=true
|
||||||
|
|
||||||
|
# Swagger UI
|
||||||
|
SWAGGER_ENABLED=true
|
||||||
|
SWAGGER_TITLE=Clinica Dental API
|
||||||
|
SWAGGER_VERSION=1.0.0
|
||||||
|
|
||||||
|
# Hot reload
|
||||||
|
HOT_RELOAD=true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# PRODUCCION
|
||||||
|
# =============================================================================
|
||||||
|
# Estas variables deben configurarse via secrets manager en produccion:
|
||||||
|
#
|
||||||
|
# - DB_PASSWORD (secreto)
|
||||||
|
# - JWT_SECRET (secreto)
|
||||||
|
# - REDIS_PASSWORD (secreto)
|
||||||
|
# - AWS_ACCESS_KEY_ID (si usa S3)
|
||||||
|
# - AWS_SECRET_ACCESS_KEY (si usa S3)
|
||||||
|
# - SMTP_USER (si usa email)
|
||||||
|
# - SMTP_PASSWORD (si usa email)
|
||||||
|
# - SENTRY_DSN (si usa Sentry)
|
||||||
|
# - ENCRYPTION_KEY (para datos sensibles)
|
||||||
|
#
|
||||||
|
# Diferencias de configuracion en produccion:
|
||||||
|
# - NODE_ENV=production
|
||||||
|
# - LOG_LEVEL=info
|
||||||
|
# - LOG_FORMAT=json
|
||||||
|
# - DB_PORT=5432 (estandar)
|
||||||
|
# - DB_SSL=true
|
||||||
|
# - REDIS_PORT=6379 (estandar)
|
||||||
|
# - STORAGE_TYPE=s3
|
||||||
|
# - SWAGGER_ENABLED=false
|
||||||
|
# - HOT_RELOAD=false
|
||||||
|
# - AUDIT_ENABLED=true
|
||||||
|
# - DATA_ENCRYPTION=true
|
||||||
|
# - ELECTRONIC_SIGNATURE=true
|
||||||
|
#
|
||||||
|
# IMPORTANTE: Cumplimiento NOM-024-SSA3-2012
|
||||||
|
# - Logs de auditoria inmutables
|
||||||
|
# - Retencion minima 5 anos
|
||||||
|
# - Backups diarios
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# REFERENCIAS
|
||||||
|
# =============================================================================
|
||||||
|
# Inventario de entorno: orchestration/environment/ENVIRONMENT-INVENTORY.yml
|
||||||
|
# Inventario de puertos: orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml
|
||||||
|
# Perfil DevEnv: orchestration/agents/perfiles/PERFIL-DEVENV.md
|
||||||
|
# Nomenclatura FDI: https://www.fdiworlddental.org/tooth-numbering-system
|
||||||
|
# =============================================================================
|
||||||
20
.env.ports
Normal file
20
.env.ports
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# .env.ports - CLINICA DENTAL
|
||||||
|
# =============================================================================
|
||||||
|
# Archivo de referencia de puertos asignados
|
||||||
|
# Generado por: @PERFIL_DEVENV
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Servicios principales
|
||||||
|
FRONTEND_PORT=3130
|
||||||
|
BACKEND_PORT=3131
|
||||||
|
|
||||||
|
# Base de datos
|
||||||
|
DB_PORT=5441
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
REDIS_PORT=6388
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Referencia: DEVENV-PORTS-INVENTORY.yml
|
||||||
|
# =============================================================================
|
||||||
81
README.md
Normal file
81
README.md
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# Clinica Dental - ERP Especializado
|
||||||
|
|
||||||
|
**Version:** 0.1.0
|
||||||
|
**Estado:** Desarrollo
|
||||||
|
**Tipo:** VERTICAL (erp-clinicas)
|
||||||
|
**Sistema:** SIMCO + NEXUS v3.4
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de gestion integral para clinicas dentales. Vertical especializada basada en erp-clinicas.
|
||||||
|
|
||||||
|
### Funcionalidades Principales
|
||||||
|
|
||||||
|
- Gestion de pacientes con expedientes y odontograma digital
|
||||||
|
- Consultas dentales: diagnostico y tratamientos
|
||||||
|
- Control de ortodoncia y protesis
|
||||||
|
- Presupuestos y planes de tratamiento
|
||||||
|
- Inventario de materiales dentales
|
||||||
|
- Facturacion de servicios
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stack Tecnologico
|
||||||
|
|
||||||
|
| Capa | Tecnologia |
|
||||||
|
|------|------------|
|
||||||
|
| Database | PostgreSQL 16+ con RLS |
|
||||||
|
| Backend | (pendiente) Express.js / NestJS |
|
||||||
|
| Frontend | (pendiente) React + Vite |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estructura del Proyecto
|
||||||
|
|
||||||
|
```
|
||||||
|
clinica-dental/
|
||||||
|
├── database/
|
||||||
|
│ ├── schemas/ # DDL especifico dental
|
||||||
|
│ └── seeds/ # Datos iniciales
|
||||||
|
├── docs/
|
||||||
|
│ └── 00-vision-general/
|
||||||
|
├── orchestration/
|
||||||
|
│ ├── 00-guidelines/
|
||||||
|
│ ├── environment/
|
||||||
|
│ ├── inventarios/
|
||||||
|
│ └── trazas/
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Herencia
|
||||||
|
|
||||||
|
Este proyecto hereda de:
|
||||||
|
- **erp-clinicas** (modulos base de clinicas)
|
||||||
|
- **erp-core** (modulos genericos ERP)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inicio Rapido
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Database (requiere PostgreSQL y erp-clinicas cargado)
|
||||||
|
psql -d erp_clinicas -f database/schemas/01-dental-schema-ddl.sql
|
||||||
|
psql -d erp_clinicas -f database/seeds/fase8/01-dental-catalogos.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referencias
|
||||||
|
|
||||||
|
- Contexto: `orchestration/00-guidelines/CONTEXTO-PROYECTO.md`
|
||||||
|
- Herencia: `orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md`
|
||||||
|
- Inventario: `orchestration/inventarios/MASTER_INVENTORY.yml`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Creado:** 2026-01-04
|
||||||
|
**Actualizado:** 2026-01-07
|
||||||
502
database/schemas/01-dental-schema-ddl.sql
Normal file
502
database/schemas/01-dental-schema-ddl.sql
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
-- ============================================================================
|
||||||
|
-- DENTAL SCHEMA - Especialización de ERP-Clínicas
|
||||||
|
-- Clínica Dental
|
||||||
|
-- ============================================================================
|
||||||
|
-- Fecha: 2026-01-04
|
||||||
|
-- Versión: 1.0
|
||||||
|
-- Hereda de: erp-clinicas FASE-8
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Schema
|
||||||
|
CREATE SCHEMA IF NOT EXISTS dental;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ENUMS
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE dental.estado_pieza AS ENUM (
|
||||||
|
'sano', 'caries', 'obturacion', 'endodoncia', 'corona',
|
||||||
|
'puente', 'implante', 'ausente', 'extraccion_indicada',
|
||||||
|
'diente_temporal', 'fractura', 'movilidad'
|
||||||
|
);
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE dental.cara_dental AS ENUM (
|
||||||
|
'mesial', 'distal', 'oclusal', 'incisal',
|
||||||
|
'vestibular', 'bucal', 'lingual', 'palatino'
|
||||||
|
);
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE dental.estado_tratamiento AS ENUM (
|
||||||
|
'pendiente', 'en_proceso', 'completado', 'cancelado'
|
||||||
|
);
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE dental.tipo_ortodoncia AS ENUM (
|
||||||
|
'brackets_metalicos', 'brackets_esteticos', 'brackets_linguales',
|
||||||
|
'alineadores', 'removible', 'retenedor'
|
||||||
|
);
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- CATÁLOGOS
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Piezas dentales
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.piezas_dentales (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
numero VARCHAR(10) NOT NULL UNIQUE, -- '11', '12', ... '48', '51'...'85'
|
||||||
|
nombre VARCHAR(50) NOT NULL,
|
||||||
|
cuadrante INTEGER NOT NULL CHECK (cuadrante BETWEEN 1 AND 8),
|
||||||
|
es_temporal BOOLEAN DEFAULT false,
|
||||||
|
descripcion TEXT,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.piezas_dentales IS 'Catálogo de piezas dentales (nomenclatura FDI)';
|
||||||
|
|
||||||
|
-- Tratamientos dentales
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.tratamientos_catalogo (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
codigo VARCHAR(20) NOT NULL,
|
||||||
|
nombre VARCHAR(100) NOT NULL,
|
||||||
|
categoria VARCHAR(50), -- 'prevencion', 'restauracion', 'endodoncia', etc.
|
||||||
|
descripcion TEXT,
|
||||||
|
duracion_minutos INTEGER DEFAULT 30,
|
||||||
|
precio_base NUMERIC(10,2),
|
||||||
|
requiere_rx BOOLEAN DEFAULT false,
|
||||||
|
requiere_anestesia BOOLEAN DEFAULT false,
|
||||||
|
active BOOLEAN DEFAULT true,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
CONSTRAINT uq_tratamientos_tenant_codigo UNIQUE(tenant_id, codigo)
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.tratamientos_catalogo IS 'Catálogo de tratamientos dentales';
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- TABLAS PRINCIPALES
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Odontograma
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.odontogramas (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL, -- Referencia a clinica.patients
|
||||||
|
fecha_creacion DATE NOT NULL DEFAULT CURRENT_DATE,
|
||||||
|
fecha_actualizacion DATE,
|
||||||
|
notas TEXT,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.odontogramas IS 'Odontogramas de pacientes';
|
||||||
|
|
||||||
|
-- Estado de piezas dentales por odontograma
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.odontograma_piezas (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
odontograma_id UUID NOT NULL REFERENCES dental.odontogramas(id) ON DELETE CASCADE,
|
||||||
|
pieza_id UUID NOT NULL REFERENCES dental.piezas_dentales(id),
|
||||||
|
-- Estado general
|
||||||
|
estado dental.estado_pieza DEFAULT 'sano',
|
||||||
|
-- Estados por cara (JSONB para flexibilidad)
|
||||||
|
caras_afectadas JSONB, -- {"mesial": "caries", "oclusal": "obturacion"}
|
||||||
|
-- Notas
|
||||||
|
observaciones TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
CONSTRAINT uq_odontograma_pieza UNIQUE(odontograma_id, pieza_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.odontograma_piezas IS 'Estado de cada pieza dental en el odontograma';
|
||||||
|
|
||||||
|
-- Tratamientos de paciente
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.tratamientos_paciente (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL,
|
||||||
|
odontograma_id UUID REFERENCES dental.odontogramas(id),
|
||||||
|
tratamiento_id UUID REFERENCES dental.tratamientos_catalogo(id),
|
||||||
|
odontologo_id UUID, -- Referencia a clinica.doctors
|
||||||
|
consultation_id UUID, -- Referencia a clinica.consultations
|
||||||
|
-- Pieza(s) tratada(s)
|
||||||
|
pieza_id UUID REFERENCES dental.piezas_dentales(id),
|
||||||
|
caras_tratadas dental.cara_dental[],
|
||||||
|
-- Datos del tratamiento
|
||||||
|
fecha_inicio DATE NOT NULL DEFAULT CURRENT_DATE,
|
||||||
|
fecha_fin DATE,
|
||||||
|
estado dental.estado_tratamiento DEFAULT 'pendiente',
|
||||||
|
-- Costo
|
||||||
|
precio NUMERIC(10,2),
|
||||||
|
descuento NUMERIC(5,2) DEFAULT 0,
|
||||||
|
precio_final NUMERIC(10,2),
|
||||||
|
-- Notas
|
||||||
|
notas TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.tratamientos_paciente IS 'Tratamientos realizados a pacientes';
|
||||||
|
|
||||||
|
-- Ortodoncia
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.ortodoncia (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL,
|
||||||
|
odontologo_id UUID,
|
||||||
|
-- Tipo de tratamiento
|
||||||
|
tipo dental.tipo_ortodoncia NOT NULL,
|
||||||
|
marca VARCHAR(100),
|
||||||
|
-- Fechas
|
||||||
|
fecha_inicio DATE NOT NULL,
|
||||||
|
fecha_estimada_fin DATE,
|
||||||
|
fecha_real_fin DATE,
|
||||||
|
-- Estado
|
||||||
|
estado dental.estado_tratamiento DEFAULT 'en_proceso',
|
||||||
|
meses_estimados INTEGER,
|
||||||
|
-- Costo
|
||||||
|
costo_total NUMERIC(10,2),
|
||||||
|
enganche NUMERIC(10,2),
|
||||||
|
mensualidad NUMERIC(10,2),
|
||||||
|
-- Notas
|
||||||
|
notas TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.ortodoncia IS 'Tratamientos de ortodoncia';
|
||||||
|
|
||||||
|
-- Citas de ortodoncia (seguimiento)
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.ortodoncia_citas (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
ortodoncia_id UUID NOT NULL REFERENCES dental.ortodoncia(id) ON DELETE CASCADE,
|
||||||
|
appointment_id UUID, -- Referencia a clinica.appointments
|
||||||
|
-- Datos de la cita
|
||||||
|
fecha DATE NOT NULL,
|
||||||
|
numero_cita INTEGER,
|
||||||
|
-- Procedimiento
|
||||||
|
procedimiento TEXT,
|
||||||
|
arco_superior VARCHAR(50),
|
||||||
|
arco_inferior VARCHAR(50),
|
||||||
|
ligas VARCHAR(50),
|
||||||
|
-- Observaciones
|
||||||
|
observaciones TEXT,
|
||||||
|
proxima_cita DATE,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.ortodoncia_citas IS 'Citas de seguimiento de ortodoncia';
|
||||||
|
|
||||||
|
-- Prótesis
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.protesis (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL,
|
||||||
|
odontologo_id UUID,
|
||||||
|
-- Tipo
|
||||||
|
tipo VARCHAR(50) NOT NULL, -- 'corona', 'puente', 'parcial', 'total', 'implante'
|
||||||
|
-- Piezas involucradas
|
||||||
|
piezas_involucradas TEXT[], -- ['11', '12', '13']
|
||||||
|
-- Laboratorio
|
||||||
|
laboratorio_id UUID, -- Referencia a proveedor
|
||||||
|
fecha_envio_lab DATE,
|
||||||
|
fecha_recepcion_lab DATE,
|
||||||
|
-- Material
|
||||||
|
material VARCHAR(100),
|
||||||
|
color VARCHAR(50),
|
||||||
|
-- Estado
|
||||||
|
estado dental.estado_tratamiento DEFAULT 'en_proceso',
|
||||||
|
fecha_colocacion DATE,
|
||||||
|
-- Garantía
|
||||||
|
tiene_garantia BOOLEAN DEFAULT false,
|
||||||
|
meses_garantia INTEGER,
|
||||||
|
-- Costo
|
||||||
|
costo_laboratorio NUMERIC(10,2),
|
||||||
|
precio_paciente NUMERIC(10,2),
|
||||||
|
-- Notas
|
||||||
|
notas TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.protesis IS 'Registro de prótesis dentales';
|
||||||
|
|
||||||
|
-- Radiografías
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.radiografias (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL,
|
||||||
|
consultation_id UUID,
|
||||||
|
-- Tipo
|
||||||
|
tipo VARCHAR(50) NOT NULL, -- 'periapical', 'panoramica', 'cefalometrica', 'oclusal'
|
||||||
|
pieza_id UUID REFERENCES dental.piezas_dentales(id),
|
||||||
|
-- Archivo
|
||||||
|
fecha DATE NOT NULL DEFAULT CURRENT_DATE,
|
||||||
|
url_imagen VARCHAR(255),
|
||||||
|
-- Interpretación
|
||||||
|
interpretacion TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.radiografias IS 'Registro de radiografías dentales';
|
||||||
|
|
||||||
|
-- Presupuestos
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.presupuestos (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
patient_id UUID NOT NULL,
|
||||||
|
odontologo_id UUID,
|
||||||
|
-- Datos
|
||||||
|
numero VARCHAR(20),
|
||||||
|
fecha DATE NOT NULL DEFAULT CURRENT_DATE,
|
||||||
|
fecha_vencimiento DATE,
|
||||||
|
-- Estado
|
||||||
|
estado VARCHAR(20) DEFAULT 'pendiente', -- 'pendiente', 'aprobado', 'rechazado', 'vencido'
|
||||||
|
-- Totales
|
||||||
|
subtotal NUMERIC(12,2) DEFAULT 0,
|
||||||
|
descuento_porcentaje NUMERIC(5,2) DEFAULT 0,
|
||||||
|
descuento_monto NUMERIC(12,2) DEFAULT 0,
|
||||||
|
total NUMERIC(12,2) DEFAULT 0,
|
||||||
|
-- Plan de pago
|
||||||
|
requiere_financiamiento BOOLEAN DEFAULT false,
|
||||||
|
enganche NUMERIC(12,2),
|
||||||
|
numero_pagos INTEGER,
|
||||||
|
monto_pago NUMERIC(12,2),
|
||||||
|
-- Notas
|
||||||
|
notas TEXT,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.presupuestos IS 'Presupuestos de tratamiento';
|
||||||
|
|
||||||
|
-- Líneas de presupuesto
|
||||||
|
CREATE TABLE IF NOT EXISTS dental.presupuesto_lineas (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
tenant_id UUID NOT NULL,
|
||||||
|
presupuesto_id UUID NOT NULL REFERENCES dental.presupuestos(id) ON DELETE CASCADE,
|
||||||
|
tratamiento_id UUID REFERENCES dental.tratamientos_catalogo(id),
|
||||||
|
-- Pieza
|
||||||
|
pieza_id UUID REFERENCES dental.piezas_dentales(id),
|
||||||
|
descripcion TEXT,
|
||||||
|
-- Cantidades
|
||||||
|
cantidad INTEGER DEFAULT 1,
|
||||||
|
precio_unitario NUMERIC(10,2),
|
||||||
|
descuento NUMERIC(5,2) DEFAULT 0,
|
||||||
|
subtotal NUMERIC(10,2),
|
||||||
|
-- Secuencia
|
||||||
|
sequence INTEGER DEFAULT 10,
|
||||||
|
-- Control
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE dental.presupuesto_lineas IS 'Líneas de presupuesto';
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- EXTENSIONES A TABLAS DE ERP-CLINICAS
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
-- Extensión a clinica.patients
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.tables
|
||||||
|
WHERE table_schema = 'clinica' AND table_name = 'patients') THEN
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = 'clinica' AND table_name = 'patients'
|
||||||
|
AND column_name = 'odontograma_activo_id') THEN
|
||||||
|
ALTER TABLE clinica.patients ADD COLUMN odontograma_activo_id UUID;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = 'clinica' AND table_name = 'patients'
|
||||||
|
AND column_name = 'tiene_ortodoncia') THEN
|
||||||
|
ALTER TABLE clinica.patients ADD COLUMN tiene_ortodoncia BOOLEAN DEFAULT false;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = 'clinica' AND table_name = 'patients'
|
||||||
|
AND column_name = 'tiene_protesis') THEN
|
||||||
|
ALTER TABLE clinica.patients ADD COLUMN tiene_protesis BOOLEAN DEFAULT false;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- SEED: Piezas dentales (catálogo global)
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
INSERT INTO dental.piezas_dentales (numero, nombre, cuadrante, es_temporal) VALUES
|
||||||
|
-- Cuadrante 1 - Superior derecho (permanentes)
|
||||||
|
('18', 'Tercer molar superior derecho', 1, false),
|
||||||
|
('17', 'Segundo molar superior derecho', 1, false),
|
||||||
|
('16', 'Primer molar superior derecho', 1, false),
|
||||||
|
('15', 'Segundo premolar superior derecho', 1, false),
|
||||||
|
('14', 'Primer premolar superior derecho', 1, false),
|
||||||
|
('13', 'Canino superior derecho', 1, false),
|
||||||
|
('12', 'Incisivo lateral superior derecho', 1, false),
|
||||||
|
('11', 'Incisivo central superior derecho', 1, false),
|
||||||
|
-- Cuadrante 2 - Superior izquierdo (permanentes)
|
||||||
|
('21', 'Incisivo central superior izquierdo', 2, false),
|
||||||
|
('22', 'Incisivo lateral superior izquierdo', 2, false),
|
||||||
|
('23', 'Canino superior izquierdo', 2, false),
|
||||||
|
('24', 'Primer premolar superior izquierdo', 2, false),
|
||||||
|
('25', 'Segundo premolar superior izquierdo', 2, false),
|
||||||
|
('26', 'Primer molar superior izquierdo', 2, false),
|
||||||
|
('27', 'Segundo molar superior izquierdo', 2, false),
|
||||||
|
('28', 'Tercer molar superior izquierdo', 2, false),
|
||||||
|
-- Cuadrante 3 - Inferior izquierdo (permanentes)
|
||||||
|
('31', 'Incisivo central inferior izquierdo', 3, false),
|
||||||
|
('32', 'Incisivo lateral inferior izquierdo', 3, false),
|
||||||
|
('33', 'Canino inferior izquierdo', 3, false),
|
||||||
|
('34', 'Primer premolar inferior izquierdo', 3, false),
|
||||||
|
('35', 'Segundo premolar inferior izquierdo', 3, false),
|
||||||
|
('36', 'Primer molar inferior izquierdo', 3, false),
|
||||||
|
('37', 'Segundo molar inferior izquierdo', 3, false),
|
||||||
|
('38', 'Tercer molar inferior izquierdo', 3, false),
|
||||||
|
-- Cuadrante 4 - Inferior derecho (permanentes)
|
||||||
|
('41', 'Incisivo central inferior derecho', 4, false),
|
||||||
|
('42', 'Incisivo lateral inferior derecho', 4, false),
|
||||||
|
('43', 'Canino inferior derecho', 4, false),
|
||||||
|
('44', 'Primer premolar inferior derecho', 4, false),
|
||||||
|
('45', 'Segundo premolar inferior derecho', 4, false),
|
||||||
|
('46', 'Primer molar inferior derecho', 4, false),
|
||||||
|
('47', 'Segundo molar inferior derecho', 4, false),
|
||||||
|
('48', 'Tercer molar inferior derecho', 4, false),
|
||||||
|
-- Cuadrante 5 - Superior derecho (temporales)
|
||||||
|
('55', 'Segundo molar temporal superior derecho', 5, true),
|
||||||
|
('54', 'Primer molar temporal superior derecho', 5, true),
|
||||||
|
('53', 'Canino temporal superior derecho', 5, true),
|
||||||
|
('52', 'Incisivo lateral temporal superior derecho', 5, true),
|
||||||
|
('51', 'Incisivo central temporal superior derecho', 5, true),
|
||||||
|
-- Cuadrante 6 - Superior izquierdo (temporales)
|
||||||
|
('61', 'Incisivo central temporal superior izquierdo', 6, true),
|
||||||
|
('62', 'Incisivo lateral temporal superior izquierdo', 6, true),
|
||||||
|
('63', 'Canino temporal superior izquierdo', 6, true),
|
||||||
|
('64', 'Primer molar temporal superior izquierdo', 6, true),
|
||||||
|
('65', 'Segundo molar temporal superior izquierdo', 6, true),
|
||||||
|
-- Cuadrante 7 - Inferior izquierdo (temporales)
|
||||||
|
('71', 'Incisivo central temporal inferior izquierdo', 7, true),
|
||||||
|
('72', 'Incisivo lateral temporal inferior izquierdo', 7, true),
|
||||||
|
('73', 'Canino temporal inferior izquierdo', 7, true),
|
||||||
|
('74', 'Primer molar temporal inferior izquierdo', 7, true),
|
||||||
|
('75', 'Segundo molar temporal inferior izquierdo', 7, true),
|
||||||
|
-- Cuadrante 8 - Inferior derecho (temporales)
|
||||||
|
('81', 'Incisivo central temporal inferior derecho', 8, true),
|
||||||
|
('82', 'Incisivo lateral temporal inferior derecho', 8, true),
|
||||||
|
('83', 'Canino temporal inferior derecho', 8, true),
|
||||||
|
('84', 'Primer molar temporal inferior derecho', 8, true),
|
||||||
|
('85', 'Segundo molar temporal inferior derecho', 8, true)
|
||||||
|
ON CONFLICT (numero) DO NOTHING;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ÍNDICES
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tratamientos_catalogo_tenant ON dental.tratamientos_catalogo(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tratamientos_catalogo_categoria ON dental.tratamientos_catalogo(tenant_id, categoria);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_odontogramas_tenant ON dental.odontogramas(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_odontogramas_patient ON dental.odontogramas(patient_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_odontograma_piezas_odontograma ON dental.odontograma_piezas(odontograma_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_odontograma_piezas_pieza ON dental.odontograma_piezas(pieza_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_tenant ON dental.tratamientos_paciente(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_patient ON dental.tratamientos_paciente(patient_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tratamientos_paciente_estado ON dental.tratamientos_paciente(tenant_id, estado);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_ortodoncia_tenant ON dental.ortodoncia(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_ortodoncia_patient ON dental.ortodoncia(patient_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_ortodoncia_estado ON dental.ortodoncia(tenant_id, estado);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_ortodoncia_citas_ortodoncia ON dental.ortodoncia_citas(ortodoncia_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_protesis_tenant ON dental.protesis(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_protesis_patient ON dental.protesis(patient_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_radiografias_tenant ON dental.radiografias(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_radiografias_patient ON dental.radiografias(patient_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_presupuestos_tenant ON dental.presupuestos(tenant_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_presupuestos_patient ON dental.presupuestos(patient_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_presupuestos_estado ON dental.presupuestos(tenant_id, estado);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_presupuesto_lineas_presupuesto ON dental.presupuesto_lineas(presupuesto_id);
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- RLS
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
ALTER TABLE dental.tratamientos_catalogo ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.odontogramas ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.odontograma_piezas ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.tratamientos_paciente ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.ortodoncia ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.ortodoncia_citas ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.protesis ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.radiografias ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.presupuestos ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE dental.presupuesto_lineas ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_tratamientos_cat ON dental.tratamientos_catalogo;
|
||||||
|
CREATE POLICY tenant_isolation_tratamientos_cat ON dental.tratamientos_catalogo
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_odontogramas ON dental.odontogramas;
|
||||||
|
CREATE POLICY tenant_isolation_odontogramas ON dental.odontogramas
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_odontograma_piezas ON dental.odontograma_piezas;
|
||||||
|
CREATE POLICY tenant_isolation_odontograma_piezas ON dental.odontograma_piezas
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_tratamientos_pac ON dental.tratamientos_paciente;
|
||||||
|
CREATE POLICY tenant_isolation_tratamientos_pac ON dental.tratamientos_paciente
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_ortodoncia ON dental.ortodoncia;
|
||||||
|
CREATE POLICY tenant_isolation_ortodoncia ON dental.ortodoncia
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_ortodoncia_citas ON dental.ortodoncia_citas;
|
||||||
|
CREATE POLICY tenant_isolation_ortodoncia_citas ON dental.ortodoncia_citas
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_protesis ON dental.protesis;
|
||||||
|
CREATE POLICY tenant_isolation_protesis ON dental.protesis
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_radiografias ON dental.radiografias;
|
||||||
|
CREATE POLICY tenant_isolation_radiografias ON dental.radiografias
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_presupuestos ON dental.presupuestos;
|
||||||
|
CREATE POLICY tenant_isolation_presupuestos ON dental.presupuestos
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
DROP POLICY IF EXISTS tenant_isolation_presupuesto_lineas ON dental.presupuesto_lineas;
|
||||||
|
CREATE POLICY tenant_isolation_presupuesto_lineas ON dental.presupuesto_lineas
|
||||||
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- FIN DENTAL SCHEMA
|
||||||
|
-- ============================================================================
|
||||||
101
database/seeds/fase8/01-dental-catalogos.sql
Normal file
101
database/seeds/fase8/01-dental-catalogos.sql
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
-- ============================================================================
|
||||||
|
-- SEED DATA: Catálogos de Clínica Dental
|
||||||
|
-- Especialización de ERP-Clínicas
|
||||||
|
-- ============================================================================
|
||||||
|
-- NOTA: Ejecutar después de SET app.current_tenant_id = 'UUID-DEL-TENANT';
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Tratamientos dentales
|
||||||
|
INSERT INTO dental.tratamientos_catalogo (tenant_id, codigo, nombre, categoria, duracion_minutos, precio_base, requiere_rx, requiere_anestesia)
|
||||||
|
SELECT current_setting('app.current_tenant_id', true)::UUID, codigo, nombre, categoria, duracion, precio, rx, anestesia
|
||||||
|
FROM (VALUES
|
||||||
|
-- Prevención
|
||||||
|
('PREV-001', 'Limpieza dental básica', 'prevencion', 45, 600.00, false, false),
|
||||||
|
('PREV-002', 'Limpieza dental profunda', 'prevencion', 60, 1200.00, false, true),
|
||||||
|
('PREV-003', 'Aplicación de flúor', 'prevencion', 15, 300.00, false, false),
|
||||||
|
('PREV-004', 'Sellador de fosetas', 'prevencion', 20, 400.00, false, false),
|
||||||
|
-- Restauración
|
||||||
|
('REST-001', 'Resina simple (1 cara)', 'restauracion', 30, 800.00, true, true),
|
||||||
|
('REST-002', 'Resina compuesta (2 caras)', 'restauracion', 45, 1000.00, true, true),
|
||||||
|
('REST-003', 'Resina compleja (3+ caras)', 'restauracion', 60, 1300.00, true, true),
|
||||||
|
('REST-004', 'Incrustación de resina', 'restauracion', 90, 2500.00, true, true),
|
||||||
|
('REST-005', 'Incrustación de porcelana', 'restauracion', 90, 4000.00, true, true),
|
||||||
|
-- Endodoncia
|
||||||
|
('ENDO-001', 'Endodoncia unirradicular', 'endodoncia', 60, 3000.00, true, true),
|
||||||
|
('ENDO-002', 'Endodoncia birradicular', 'endodoncia', 90, 4000.00, true, true),
|
||||||
|
('ENDO-003', 'Endodoncia multirradicular', 'endodoncia', 120, 5000.00, true, true),
|
||||||
|
('ENDO-004', 'Retratamiento endodóntico', 'endodoncia', 120, 5500.00, true, true),
|
||||||
|
-- Periodoncia
|
||||||
|
('PERIO-001', 'Raspado y alisado radicular (cuadrante)', 'periodoncia', 60, 1500.00, true, true),
|
||||||
|
('PERIO-002', 'Cirugía periodontal', 'periodoncia', 120, 6000.00, true, true),
|
||||||
|
-- Cirugía
|
||||||
|
('CIRUG-001', 'Extracción simple', 'cirugia', 30, 800.00, true, true),
|
||||||
|
('CIRUG-002', 'Extracción de tercer molar', 'cirugia', 60, 3500.00, true, true),
|
||||||
|
('CIRUG-003', 'Extracción quirúrgica compleja', 'cirugia', 90, 5000.00, true, true),
|
||||||
|
-- Prótesis
|
||||||
|
('PROT-001', 'Corona de porcelana', 'protesis', 60, 6000.00, true, true),
|
||||||
|
('PROT-002', 'Corona de zirconia', 'protesis', 60, 8000.00, true, true),
|
||||||
|
('PROT-003', 'Puente fijo (3 unidades)', 'protesis', 120, 18000.00, true, true),
|
||||||
|
('PROT-004', 'Prótesis parcial removible', 'protesis', 120, 8000.00, true, false),
|
||||||
|
('PROT-005', 'Prótesis total', 'protesis', 180, 12000.00, true, false),
|
||||||
|
-- Implantes
|
||||||
|
('IMPL-001', 'Implante dental (sin corona)', 'implantes', 90, 15000.00, true, true),
|
||||||
|
('IMPL-002', 'Corona sobre implante', 'implantes', 60, 8000.00, false, false),
|
||||||
|
-- Ortodoncia
|
||||||
|
('ORTO-001', 'Brackets metálicos (tratamiento completo)', 'ortodoncia', 60, 35000.00, true, false),
|
||||||
|
('ORTO-002', 'Brackets estéticos (tratamiento completo)', 'ortodoncia', 60, 45000.00, true, false),
|
||||||
|
('ORTO-003', 'Alineadores invisibles', 'ortodoncia', 45, 60000.00, true, false),
|
||||||
|
('ORTO-004', 'Control mensual ortodoncia', 'ortodoncia', 30, 800.00, false, false),
|
||||||
|
('ORTO-005', 'Retenedor fijo', 'ortodoncia', 45, 3000.00, false, false),
|
||||||
|
-- Estética
|
||||||
|
('ESTE-001', 'Blanqueamiento en consultorio', 'estetica', 90, 5000.00, false, false),
|
||||||
|
('ESTE-002', 'Blanqueamiento casero', 'estetica', 30, 3000.00, false, false),
|
||||||
|
('ESTE-003', 'Carilla de resina', 'estetica', 60, 3500.00, false, false),
|
||||||
|
('ESTE-004', 'Carilla de porcelana', 'estetica', 60, 8000.00, false, false),
|
||||||
|
-- Diagnóstico
|
||||||
|
('DIAG-001', 'Radiografía periapical', 'diagnostico', 5, 100.00, false, false),
|
||||||
|
('DIAG-002', 'Radiografía panorámica', 'diagnostico', 10, 500.00, false, false),
|
||||||
|
('DIAG-003', 'Radiografía cefalométrica', 'diagnostico', 10, 400.00, false, false),
|
||||||
|
('DIAG-004', 'Tomografía dental', 'diagnostico', 15, 1500.00, false, false)
|
||||||
|
) AS t(codigo, nombre, categoria, duracion, precio, rx, anestesia)
|
||||||
|
WHERE current_setting('app.current_tenant_id', true) IS NOT NULL
|
||||||
|
AND current_setting('app.current_tenant_id', true) != ''
|
||||||
|
ON CONFLICT (tenant_id, codigo) DO NOTHING;
|
||||||
|
|
||||||
|
-- Skills específicos dentales
|
||||||
|
INSERT INTO hr.skills (tenant_id, skill_type_id, name, requiere_cedula)
|
||||||
|
SELECT
|
||||||
|
current_setting('app.current_tenant_id', true)::UUID,
|
||||||
|
st.id,
|
||||||
|
unnest(ARRAY[
|
||||||
|
'Odontología General',
|
||||||
|
'Ortodoncia',
|
||||||
|
'Endodoncia',
|
||||||
|
'Periodoncia',
|
||||||
|
'Cirugía Maxilofacial',
|
||||||
|
'Odontopediatría',
|
||||||
|
'Prostodoncia',
|
||||||
|
'Implantología',
|
||||||
|
'Estética Dental',
|
||||||
|
'Rehabilitación Oral'
|
||||||
|
]),
|
||||||
|
true
|
||||||
|
FROM hr.skill_types st
|
||||||
|
WHERE st.name = 'Especialidad Médica'
|
||||||
|
AND st.tenant_id = current_setting('app.current_tenant_id', true)::UUID
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- Ubicaciones (unidades dentales)
|
||||||
|
INSERT INTO hr.work_locations (tenant_id, name, tipo_consultorio, capacidad, equipamiento)
|
||||||
|
SELECT current_setting('app.current_tenant_id', true)::UUID, name, tipo, capacidad, equipamiento::TEXT[]
|
||||||
|
FROM (VALUES
|
||||||
|
('Unidad Dental 1', 'especialidad', 1, ARRAY['sillon', 'rayos_x', 'ultrasonido']),
|
||||||
|
('Unidad Dental 2', 'especialidad', 1, ARRAY['sillon', 'rayos_x', 'ultrasonido']),
|
||||||
|
('Unidad Dental 3', 'especialidad', 1, ARRAY['sillon', 'rayos_x']),
|
||||||
|
('Quirófano Dental', 'quirofano', 1, ARRAY['sillon', 'rayos_x', 'equipo_cirugia']),
|
||||||
|
('Sala de Rayos X', 'laboratorio', 2, ARRAY['panoramico', 'cefalometrico']),
|
||||||
|
('Laboratorio Dental', 'laboratorio', 2, ARRAY['modelos', 'protesis'])
|
||||||
|
) AS t(name, tipo, capacidad, equipamiento)
|
||||||
|
WHERE current_setting('app.current_tenant_id', true) IS NOT NULL
|
||||||
|
AND current_setting('app.current_tenant_id', true) != ''
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
44
docs/00-vision-general/README.md
Normal file
44
docs/00-vision-general/README.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Vision General - Clinica Dental
|
||||||
|
|
||||||
|
## Proposito
|
||||||
|
|
||||||
|
Sistema de gestion integral para clinicas dentales que permite:
|
||||||
|
|
||||||
|
1. **Gestion de Pacientes**
|
||||||
|
- Expedientes con historial completo
|
||||||
|
- Odontograma digital interactivo
|
||||||
|
- Historial de tratamientos
|
||||||
|
|
||||||
|
2. **Consultas Dentales**
|
||||||
|
- Registro de diagnosticos
|
||||||
|
- Planes de tratamiento
|
||||||
|
- Presupuestos detallados
|
||||||
|
|
||||||
|
3. **Especialidades**
|
||||||
|
- Ortodoncia (brackets, alineadores)
|
||||||
|
- Endodoncia (tratamientos de conductos)
|
||||||
|
- Protesis (coronas, puentes, dentaduras)
|
||||||
|
- Cirugia (extracciones, implantes)
|
||||||
|
|
||||||
|
4. **Operaciones**
|
||||||
|
- Inventario de materiales
|
||||||
|
- Facturacion de servicios
|
||||||
|
- Agenda de citas
|
||||||
|
|
||||||
|
## Usuarios
|
||||||
|
|
||||||
|
| Rol | Acceso |
|
||||||
|
|-----|--------|
|
||||||
|
| Odontologo | Consultas, diagnosticos, tratamientos |
|
||||||
|
| Auxiliar dental | Apoyo en procedimientos |
|
||||||
|
| Recepcionista | Citas, cobros |
|
||||||
|
| Administrador | Gestion completa |
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
- **Incluido:** Gestion clinica, odontograma, tratamientos, facturacion
|
||||||
|
- **Excluido:** Contabilidad avanzada (usa erp-core), nomina
|
||||||
|
|
||||||
|
## Referencias
|
||||||
|
|
||||||
|
Ver `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` para detalles completos del negocio.
|
||||||
348
docs/00-vision-general/VISION.md
Normal file
348
docs/00-vision-general/VISION.md
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
# VISION - Sistema de Gestion Clinica Dental
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Version:** 1.0.0
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
**Estado:** Fase 0 - Documentacion
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. PROPOSITO
|
||||||
|
|
||||||
|
Sistema de gestion integral para clinicas odontologicas que permite administrar pacientes, expedientes clinicos, odontogramas digitales, tratamientos dentales, citas, facturacion e inventario de materiales.
|
||||||
|
|
||||||
|
### Problema que Resuelve
|
||||||
|
|
||||||
|
- Falta de registro digital estructurado del estado dental de pacientes
|
||||||
|
- Dificultad para dar seguimiento a tratamientos de larga duracion (ortodoncia)
|
||||||
|
- Gestion manual de citas y disponibilidad de sillones
|
||||||
|
- Control deficiente de inventario de materiales dentales
|
||||||
|
- Falta de trazabilidad en procedimientos y presupuestos
|
||||||
|
|
||||||
|
### Propuesta de Valor
|
||||||
|
|
||||||
|
- **Odontograma digital interactivo** con nomenclatura FDI
|
||||||
|
- **Historial por pieza dental** con fotos y radiografias
|
||||||
|
- **Seguimiento de tratamientos** con alertas de proximas citas
|
||||||
|
- **Presupuestos detallados** con planes de pago
|
||||||
|
- **Control de inventario** de materiales por procedimiento
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. OBJETIVOS PRINCIPALES
|
||||||
|
|
||||||
|
### O1: Gestion de Pacientes y Expedientes
|
||||||
|
- Registro completo de datos del paciente
|
||||||
|
- Historial clinico odontologico
|
||||||
|
- Alergias y contraindicaciones
|
||||||
|
- Consentimientos informados digitales
|
||||||
|
|
||||||
|
### O2: Odontograma Digital
|
||||||
|
- Representacion grafica de 32 piezas (adulto) o deciduos
|
||||||
|
- Estado por pieza: sano, caries, obturacion, ausente, etc.
|
||||||
|
- Registro de caras afectadas (M, D, O, V, L)
|
||||||
|
- Historial de cambios por fecha
|
||||||
|
|
||||||
|
### O3: Gestion de Tratamientos
|
||||||
|
- Catalogo de procedimientos dentales
|
||||||
|
- Planes de tratamiento personalizados
|
||||||
|
- Seguimiento de citas por tratamiento
|
||||||
|
- Presupuestos con opciones de pago
|
||||||
|
|
||||||
|
### O4: Especialidades Integradas
|
||||||
|
- Ortodoncia (brackets, alineadores, retenedores)
|
||||||
|
- Endodoncia (tratamientos de conductos)
|
||||||
|
- Periodoncia (raspados, cirugia)
|
||||||
|
- Prostodoncia (coronas, puentes, implantes)
|
||||||
|
- Estetica dental (blanqueamiento, carillas)
|
||||||
|
|
||||||
|
### O5: Operacion de Clinica
|
||||||
|
- Agenda de citas por odontologo y sillon
|
||||||
|
- Control de inventario de materiales
|
||||||
|
- Facturacion integrada
|
||||||
|
- Reportes de productividad
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. USUARIOS Y ROLES
|
||||||
|
|
||||||
|
| Rol | Descripcion | Permisos Principales |
|
||||||
|
|-----|-------------|---------------------|
|
||||||
|
| **Odontologo** | Medico tratante | Consultas, diagnosticos, tratamientos, prescripciones |
|
||||||
|
| **Auxiliar Dental** | Apoyo en procedimientos | Ver expedientes, actualizar estado, preparar materiales |
|
||||||
|
| **Recepcionista** | Atencion al paciente | Agendar citas, cobros, captura de datos |
|
||||||
|
| **Higienista** | Profilaxis dental | Limpiezas, aplicar fluor, selladores |
|
||||||
|
| **Tecnico Dental** | Trabajos protesicos | Ver ordenes de laboratorio, actualizar estatus |
|
||||||
|
| **Administrador** | Gestion general | Configuracion, reportes, usuarios, catalogs |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. FUNCIONALIDADES CORE
|
||||||
|
|
||||||
|
### 4.1 Modulo Odontograma
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
entidad_principal: odontograma
|
||||||
|
campos:
|
||||||
|
- id: UUID
|
||||||
|
- paciente_id: UUID (FK)
|
||||||
|
- fecha_registro: TIMESTAMP
|
||||||
|
- tipo: ENUM (adulto, deciduo)
|
||||||
|
- piezas: JSONB[]
|
||||||
|
|
||||||
|
funcionalidades:
|
||||||
|
- Vista grafica interactiva de dentadura
|
||||||
|
- Click en pieza para ver/editar estado
|
||||||
|
- Colores por estado (verde=sano, rojo=caries, gris=ausente)
|
||||||
|
- Historial de cambios por pieza
|
||||||
|
- Comparativa entre fechas
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Modulo Tratamientos
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
entidad_principal: tratamiento
|
||||||
|
campos:
|
||||||
|
- id: UUID
|
||||||
|
- paciente_id: UUID (FK)
|
||||||
|
- pieza_id: UUID (FK, opcional)
|
||||||
|
- procedimiento_id: UUID (FK catalogo)
|
||||||
|
- fecha_inicio: DATE
|
||||||
|
- fecha_fin: DATE
|
||||||
|
- estado: ENUM (pendiente, en_proceso, completado, cancelado)
|
||||||
|
- costo: DECIMAL
|
||||||
|
- odontologo_id: UUID (FK)
|
||||||
|
|
||||||
|
funcionalidades:
|
||||||
|
- Plan de tratamiento con multiples procedimientos
|
||||||
|
- Asociacion a pieza dental especifica
|
||||||
|
- Seguimiento de citas relacionadas
|
||||||
|
- Presupuesto automatico
|
||||||
|
- Notas clinicas por cita
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 Modulo Ortodoncia
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
entidad_principal: caso_ortodoncia
|
||||||
|
campos:
|
||||||
|
- id: UUID
|
||||||
|
- paciente_id: UUID (FK)
|
||||||
|
- tipo: ENUM (brackets_metalicos, brackets_ceramicos, alineadores, retenedores)
|
||||||
|
- fecha_colocacion: DATE
|
||||||
|
- fecha_estimada_retiro: DATE
|
||||||
|
- citas_control: INTEGER (cada cuantas semanas)
|
||||||
|
- estado: ENUM (activo, pausado, finalizado)
|
||||||
|
|
||||||
|
funcionalidades:
|
||||||
|
- Registro de estudios iniciales (Rx, fotos, modelos)
|
||||||
|
- Seguimiento de citas de ajuste
|
||||||
|
- Fotos de progreso
|
||||||
|
- Control de retenedores post-tratamiento
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 Modulo Protesis
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
entidad_principal: trabajo_protesico
|
||||||
|
campos:
|
||||||
|
- id: UUID
|
||||||
|
- paciente_id: UUID (FK)
|
||||||
|
- tipo: ENUM (corona, puente, dentadura_parcial, dentadura_total, implante)
|
||||||
|
- piezas_involucradas: INTEGER[]
|
||||||
|
- laboratorio_id: UUID (FK)
|
||||||
|
- fecha_impresion: DATE
|
||||||
|
- fecha_entrega_estimada: DATE
|
||||||
|
- estado: ENUM (impresion, laboratorio, prueba, cementado, entregado)
|
||||||
|
|
||||||
|
funcionalidades:
|
||||||
|
- Ordenes de trabajo a laboratorio
|
||||||
|
- Seguimiento de estatus
|
||||||
|
- Registro de pruebas y ajustes
|
||||||
|
- Garantias
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. NOMENCLATURA DENTAL (FDI)
|
||||||
|
|
||||||
|
### Sistema de Numeracion
|
||||||
|
|
||||||
|
```
|
||||||
|
SUPERIOR
|
||||||
|
Derecho | Izquierdo
|
||||||
|
18-11 | 21-28
|
||||||
|
---------|----------
|
||||||
|
48-41 | 31-38
|
||||||
|
Derecho | Izquierdo
|
||||||
|
INFERIOR
|
||||||
|
|
||||||
|
Cuadrante 1: Superior derecho (11-18)
|
||||||
|
Cuadrante 2: Superior izquierdo (21-28)
|
||||||
|
Cuadrante 3: Inferior izquierdo (31-38)
|
||||||
|
Cuadrante 4: Inferior derecho (41-48)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dientes Deciduos (Ninos)
|
||||||
|
|
||||||
|
```
|
||||||
|
Cuadrante 5: Superior derecho deciduo (51-55)
|
||||||
|
Cuadrante 6: Superior izquierdo deciduo (61-65)
|
||||||
|
Cuadrante 7: Inferior izquierdo deciduo (71-75)
|
||||||
|
Cuadrante 8: Inferior derecho deciduo (81-85)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Caras Dentales
|
||||||
|
|
||||||
|
| Abreviatura | Nombre | Descripcion |
|
||||||
|
|-------------|--------|-------------|
|
||||||
|
| M | Mesial | Hacia el centro de la arcada |
|
||||||
|
| D | Distal | Alejandose del centro |
|
||||||
|
| O | Oclusal | Superficie de masticacion (molares) |
|
||||||
|
| I | Incisal | Borde de corte (incisivos) |
|
||||||
|
| V | Vestibular | Hacia los labios/mejillas |
|
||||||
|
| B | Bucal | Sinonimo de vestibular |
|
||||||
|
| L | Lingual | Hacia la lengua (inferiores) |
|
||||||
|
| P | Palatino | Hacia el paladar (superiores) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. CATALOGO DE PROCEDIMIENTOS
|
||||||
|
|
||||||
|
### Prevencion
|
||||||
|
- Limpieza dental (profilaxis)
|
||||||
|
- Aplicacion de fluor
|
||||||
|
- Selladores de fosetas y fisuras
|
||||||
|
- Detartraje (remocion de sarro)
|
||||||
|
|
||||||
|
### Restauracion
|
||||||
|
- Resina (por cara)
|
||||||
|
- Amalgama
|
||||||
|
- Incrustacion (inlay/onlay)
|
||||||
|
- Reconstruccion
|
||||||
|
|
||||||
|
### Endodoncia
|
||||||
|
- Tratamiento de conductos (unirradicular)
|
||||||
|
- Tratamiento de conductos (birradicular)
|
||||||
|
- Tratamiento de conductos (multirradicular)
|
||||||
|
- Retratamiento
|
||||||
|
- Apicoectomia
|
||||||
|
|
||||||
|
### Periodoncia
|
||||||
|
- Raspado y alisado radicular
|
||||||
|
- Cirugia periodontal
|
||||||
|
- Injerto de encia
|
||||||
|
- Ferulizacion
|
||||||
|
|
||||||
|
### Cirugia
|
||||||
|
- Extraccion simple
|
||||||
|
- Extraccion quirurgica
|
||||||
|
- Tercer molar retenido
|
||||||
|
- Frenectomia
|
||||||
|
- Biopsia
|
||||||
|
|
||||||
|
### Protesis
|
||||||
|
- Corona metal-porcelana
|
||||||
|
- Corona libre de metal (zirconia)
|
||||||
|
- Puente fijo
|
||||||
|
- Dentadura parcial removible
|
||||||
|
- Dentadura total
|
||||||
|
- Implante dental
|
||||||
|
|
||||||
|
### Ortodoncia
|
||||||
|
- Colocacion de brackets
|
||||||
|
- Ajuste mensual
|
||||||
|
- Retiro de aparatologia
|
||||||
|
- Retenedor fijo
|
||||||
|
- Retenedor removible
|
||||||
|
- Alineadores transparentes
|
||||||
|
|
||||||
|
### Estetica
|
||||||
|
- Blanqueamiento en consultorio
|
||||||
|
- Blanqueamiento casero
|
||||||
|
- Carillas de porcelana
|
||||||
|
- Carillas de resina
|
||||||
|
- Cierre de diastemas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. INTEGRACIONES
|
||||||
|
|
||||||
|
| Sistema | Proposito | Prioridad |
|
||||||
|
|---------|-----------|-----------|
|
||||||
|
| Radiografias digitales | Captura de Rx periapicales, panoramicas | P1 |
|
||||||
|
| Laboratorio dental | Ordenes de trabajo protesico | P2 |
|
||||||
|
| Proveedores | Pedidos de materiales | P2 |
|
||||||
|
| Facturacion electronica | CFDI 4.0 | P1 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. METRICAS DE EXITO
|
||||||
|
|
||||||
|
| Metrica | Descripcion | Objetivo |
|
||||||
|
|---------|-------------|----------|
|
||||||
|
| Consultas/dia | Pacientes atendidos por odontologo | 8-12 |
|
||||||
|
| Tratamientos completados | Planes finalizados por mes | 80% |
|
||||||
|
| Tasa retencion ortodoncia | Pacientes que completan tratamiento | 90% |
|
||||||
|
| Ticket promedio | Ingreso por paciente | $2,500+ |
|
||||||
|
| Ocupacion sillones | Uso de unidades dentales | 85% |
|
||||||
|
| Satisfaccion paciente | NPS | 8.5+ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. FASES DE DESARROLLO
|
||||||
|
|
||||||
|
### Fase 1: Core (MVP)
|
||||||
|
- Gestion de pacientes
|
||||||
|
- Odontograma basico
|
||||||
|
- Agenda de citas
|
||||||
|
- Facturacion simple
|
||||||
|
|
||||||
|
### Fase 2: Tratamientos
|
||||||
|
- Catalogo de procedimientos
|
||||||
|
- Planes de tratamiento
|
||||||
|
- Presupuestos
|
||||||
|
- Seguimiento de citas
|
||||||
|
|
||||||
|
### Fase 3: Especialidades
|
||||||
|
- Ortodoncia completa
|
||||||
|
- Endodoncia
|
||||||
|
- Protesis y laboratorio
|
||||||
|
- Periodoncia
|
||||||
|
|
||||||
|
### Fase 4: Optimizacion
|
||||||
|
- Reportes avanzados
|
||||||
|
- Integracion con Rx digitales
|
||||||
|
- App movil para pacientes
|
||||||
|
- Recordatorios automaticos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. HERENCIA Y DEPENDENCIAS
|
||||||
|
|
||||||
|
### Hereda de erp-clinicas
|
||||||
|
- Modulo Pacientes
|
||||||
|
- Modulo Expedientes
|
||||||
|
- Modulo Citas
|
||||||
|
- Modulo Consultas
|
||||||
|
- Modulo Recetas
|
||||||
|
|
||||||
|
### Hereda de erp-core
|
||||||
|
- Autenticacion y usuarios
|
||||||
|
- Roles y permisos
|
||||||
|
- Facturacion
|
||||||
|
- Inventario
|
||||||
|
- Catalogos base
|
||||||
|
|
||||||
|
### Especifico Dental (Nuevo)
|
||||||
|
- Odontograma
|
||||||
|
- Tratamientos dentales
|
||||||
|
- Ortodoncia
|
||||||
|
- Protesis
|
||||||
|
- Nomenclatura FDI
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Documento creado:** 2026-01-07
|
||||||
|
**Autor:** Agente Orquestador Workspace
|
||||||
|
**Basado en:** SIMCO v2.5, CONTEXTO-PROYECTO.md
|
||||||
235
docs/01-epicas/DENTAL-001-odontograma.md
Normal file
235
docs/01-epicas/DENTAL-001-odontograma.md
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
# DENTAL-001: Odontograma Digital
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-001
|
||||||
|
- **Modulo:** Odontograma
|
||||||
|
- **Prioridad:** P0
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 1 - Core
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de odontograma digital interactivo que permite registrar y visualizar el estado de cada pieza dental del paciente, siguiendo la nomenclatura FDI (Federation Dentaire Internationale).
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Representacion grafica de dentadura completa
|
||||||
|
2. Registro de estado por pieza dental
|
||||||
|
3. Registro de afectaciones por cara dental
|
||||||
|
4. Historial de cambios por fecha
|
||||||
|
5. Comparativa entre odontogramas
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Vista grafica interactiva (32 piezas adulto + 20 deciduos)
|
||||||
|
- Estados por pieza: sano, caries, obturacion, endodoncia, corona, etc.
|
||||||
|
- Caras dentales: Mesial, Distal, Oclusal, Vestibular, Lingual
|
||||||
|
- Colores por estado (verde=sano, rojo=caries, gris=ausente)
|
||||||
|
- Historial cronologico
|
||||||
|
- Notas por pieza
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Edicion de imagen (dibujo libre)
|
||||||
|
- Generacion 3D
|
||||||
|
- Integracion directa con camaras intraorales
|
||||||
|
|
||||||
|
## Nomenclatura FDI
|
||||||
|
|
||||||
|
### Sistema de Numeracion (Adultos)
|
||||||
|
|
||||||
|
```
|
||||||
|
SUPERIOR
|
||||||
|
Derecho | Izquierdo
|
||||||
|
18-11 | 21-28
|
||||||
|
---------|----------
|
||||||
|
48-41 | 31-38
|
||||||
|
Derecho | Izquierdo
|
||||||
|
INFERIOR
|
||||||
|
|
||||||
|
Cuadrante 1: Superior derecho (11-18)
|
||||||
|
Cuadrante 2: Superior izquierdo (21-28)
|
||||||
|
Cuadrante 3: Inferior izquierdo (31-38)
|
||||||
|
Cuadrante 4: Inferior derecho (41-48)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dientes Deciduos (Ninos)
|
||||||
|
|
||||||
|
```
|
||||||
|
Cuadrante 5: Superior derecho deciduo (51-55)
|
||||||
|
Cuadrante 6: Superior izquierdo deciduo (61-65)
|
||||||
|
Cuadrante 7: Inferior izquierdo deciduo (71-75)
|
||||||
|
Cuadrante 8: Inferior derecho deciduo (81-85)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tablas
|
||||||
|
|
||||||
|
**dental.piezas_dentales** (Catalogo)
|
||||||
|
- id, numero, nombre, cuadrante, es_temporal
|
||||||
|
|
||||||
|
**dental.odontogramas**
|
||||||
|
- id, tenant_id, patient_id
|
||||||
|
- fecha_creacion, fecha_actualizacion
|
||||||
|
- notas
|
||||||
|
|
||||||
|
**dental.odontograma_piezas**
|
||||||
|
- id, tenant_id, odontograma_id, pieza_id
|
||||||
|
- estado (ENUM: sano, caries, obturacion, etc.)
|
||||||
|
- caras_afectadas (JSONB)
|
||||||
|
- observaciones
|
||||||
|
|
||||||
|
### Estados de Pieza (ENUM)
|
||||||
|
|
||||||
|
| Estado | Color | Descripcion |
|
||||||
|
|--------|-------|-------------|
|
||||||
|
| sano | Verde | Pieza sin alteraciones |
|
||||||
|
| caries | Rojo | Caries activa |
|
||||||
|
| obturacion | Azul | Restauracion existente |
|
||||||
|
| endodoncia | Morado | Tratamiento de conductos |
|
||||||
|
| corona | Dorado | Corona protesica |
|
||||||
|
| puente | Naranja | Parte de puente |
|
||||||
|
| implante | Plateado | Implante dental |
|
||||||
|
| ausente | Gris | Pieza faltante |
|
||||||
|
| extraccion_indicada | Rojo oscuro | Pendiente de extraccion |
|
||||||
|
|
||||||
|
### Caras Dentales
|
||||||
|
|
||||||
|
| Abreviatura | Nombre | Descripcion |
|
||||||
|
|-------------|--------|-------------|
|
||||||
|
| M | Mesial | Hacia el centro de la arcada |
|
||||||
|
| D | Distal | Alejandose del centro |
|
||||||
|
| O | Oclusal | Superficie de masticacion |
|
||||||
|
| V | Vestibular | Hacia labios/mejillas |
|
||||||
|
| L | Lingual | Hacia la lengua |
|
||||||
|
| P | Palatino | Hacia el paladar |
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /patients/:id/odontograma | Odontograma actual |
|
||||||
|
| GET | /patients/:id/odontogramas | Historial de odontogramas |
|
||||||
|
| POST | /patients/:id/odontograma | Crear nuevo odontograma |
|
||||||
|
| PUT | /odontogramas/:id | Actualizar odontograma |
|
||||||
|
| GET | /odontogramas/:id/piezas | Listar piezas |
|
||||||
|
| PUT | /odontogramas/:id/piezas/:piezaId | Actualizar pieza |
|
||||||
|
| GET | /odontogramas/:id/historial | Historial de cambios |
|
||||||
|
| GET | /odontogramas/comparar | Comparar dos fechas |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface OdontogramaService {
|
||||||
|
getByPatient(patientId: string): Promise<Odontograma>;
|
||||||
|
create(patientId: string): Promise<Odontograma>;
|
||||||
|
updatePieza(odontogramaId: string, piezaId: string, data: PiezaUpdate): Promise<Pieza>;
|
||||||
|
getHistorial(patientId: string): Promise<Odontograma[]>;
|
||||||
|
compare(patientId: string, fecha1: Date, fecha2: Date): Promise<OdontogramaComparison>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PiezaUpdate {
|
||||||
|
estado: EstadoPieza;
|
||||||
|
carasAfectadas?: Record<CaraDental, EstadoPieza>;
|
||||||
|
observaciones?: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Componente Frontend
|
||||||
|
|
||||||
|
### OdontogramaViewer
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface OdontogramaViewerProps {
|
||||||
|
patientId: string;
|
||||||
|
editable: boolean;
|
||||||
|
onPiezaClick: (pieza: Pieza) => void;
|
||||||
|
showDeciduo: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Colores por estado
|
||||||
|
const ESTADO_COLORS = {
|
||||||
|
sano: '#22c55e', // green-500
|
||||||
|
caries: '#ef4444', // red-500
|
||||||
|
obturacion: '#3b82f6', // blue-500
|
||||||
|
endodoncia: '#a855f7', // purple-500
|
||||||
|
corona: '#f59e0b', // amber-500
|
||||||
|
ausente: '#9ca3af', // gray-400
|
||||||
|
implante: '#64748b' // slate-500
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### PiezaEditor (Modal)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface PiezaEditorProps {
|
||||||
|
pieza: Pieza;
|
||||||
|
onSave: (data: PiezaUpdate) => void;
|
||||||
|
onClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vista de caras (5 cuadrados)
|
||||||
|
// [V]
|
||||||
|
// [M] [O] [D]
|
||||||
|
// [L]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Ver Odontograma
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo abre expediente de paciente
|
||||||
|
2. Sistema carga odontograma activo
|
||||||
|
3. Renderiza vista grafica con colores
|
||||||
|
4. Click en pieza muestra detalle
|
||||||
|
5. Puede ver historial de cambios
|
||||||
|
```
|
||||||
|
|
||||||
|
### Actualizar Estado
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo hace click en pieza
|
||||||
|
2. Abre modal de edicion
|
||||||
|
3. Selecciona nuevo estado
|
||||||
|
4. Marca caras afectadas (si aplica)
|
||||||
|
5. Agrega observaciones
|
||||||
|
6. Guarda cambios
|
||||||
|
7. Sistema actualiza vista y registra historial
|
||||||
|
```
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL odontogramas | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| Seeds piezas | Completado | 52 piezas FDI |
|
||||||
|
| odontograma.module.ts | Pendiente | `backend/modules/odontograma/` |
|
||||||
|
| odontograma.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| OdontogramaViewer.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| PiezaEditor.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- Auth/Tenants (erp-core)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- DENTAL-002 (Tratamientos - asociacion a pieza)
|
||||||
|
- DENTAL-006 (Presupuestos - lineas por pieza)
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] Vista grafica de 32 piezas adulto
|
||||||
|
- [ ] Vista grafica de 20 piezas deciduo
|
||||||
|
- [ ] Click en pieza abre editor
|
||||||
|
- [ ] Estados se reflejan en colores
|
||||||
|
- [ ] Caras afectadas se registran
|
||||||
|
- [ ] Historial muestra cambios
|
||||||
|
- [ ] Comparativa entre fechas funciona
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
212
docs/01-epicas/DENTAL-002-tratamientos.md
Normal file
212
docs/01-epicas/DENTAL-002-tratamientos.md
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
# DENTAL-002: Tratamientos Dentales
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-002
|
||||||
|
- **Modulo:** Tratamientos
|
||||||
|
- **Prioridad:** P0
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 2 - Tratamientos
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de gestion de tratamientos odontologicos: catalogo de procedimientos, planes de tratamiento personalizados, seguimiento de citas, asociacion a piezas dentales y costos.
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Catalogo de procedimientos dentales
|
||||||
|
2. Planes de tratamiento por paciente
|
||||||
|
3. Asociacion tratamiento-pieza dental
|
||||||
|
4. Seguimiento de estado
|
||||||
|
5. Registro de costos
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Catalogo de tratamientos por tenant
|
||||||
|
- Categorias: prevencion, restauracion, endodoncia, etc.
|
||||||
|
- Asociacion a pieza y caras especificas
|
||||||
|
- Estados: pendiente, en_proceso, completado, cancelado
|
||||||
|
- Duracion estimada y real
|
||||||
|
- Precios y descuentos
|
||||||
|
- Vinculacion con citas
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Generacion automatica de presupuestos (ver DENTAL-006)
|
||||||
|
- Integracion con inventario de materiales
|
||||||
|
- Consentimientos informados digitales
|
||||||
|
|
||||||
|
## Catalogo de Procedimientos
|
||||||
|
|
||||||
|
### Prevencion
|
||||||
|
| Codigo | Procedimiento | Duracion | Precio Base |
|
||||||
|
|--------|---------------|----------|-------------|
|
||||||
|
| PREV-001 | Limpieza dental (profilaxis) | 30 min | $500 |
|
||||||
|
| PREV-002 | Aplicacion de fluor | 15 min | $200 |
|
||||||
|
| PREV-003 | Selladores de fosetas | 20 min | $350 |
|
||||||
|
| PREV-004 | Detartraje | 45 min | $800 |
|
||||||
|
|
||||||
|
### Restauracion
|
||||||
|
| Codigo | Procedimiento | Duracion | Precio Base |
|
||||||
|
|--------|---------------|----------|-------------|
|
||||||
|
| REST-001 | Resina simple (1 cara) | 30 min | $600 |
|
||||||
|
| REST-002 | Resina compuesta (2+ caras) | 45 min | $900 |
|
||||||
|
| REST-003 | Incrustacion inlay | 60 min | $2,500 |
|
||||||
|
| REST-004 | Incrustacion onlay | 60 min | $3,000 |
|
||||||
|
| REST-005 | Reconstruccion | 60 min | $1,500 |
|
||||||
|
|
||||||
|
### Endodoncia
|
||||||
|
| Codigo | Procedimiento | Duracion | Precio Base |
|
||||||
|
|--------|---------------|----------|-------------|
|
||||||
|
| ENDO-001 | Conductos unirradicular | 60 min | $2,500 |
|
||||||
|
| ENDO-002 | Conductos birradicular | 90 min | $3,500 |
|
||||||
|
| ENDO-003 | Conductos multirradicular | 120 min | $4,500 |
|
||||||
|
| ENDO-004 | Retratamiento | 90 min | $3,000 |
|
||||||
|
|
||||||
|
### Cirugia
|
||||||
|
| Codigo | Procedimiento | Duracion | Precio Base |
|
||||||
|
|--------|---------------|----------|-------------|
|
||||||
|
| CIR-001 | Extraccion simple | 30 min | $600 |
|
||||||
|
| CIR-002 | Extraccion quirurgica | 45 min | $1,200 |
|
||||||
|
| CIR-003 | Tercer molar retenido | 60 min | $2,500 |
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tablas
|
||||||
|
|
||||||
|
**dental.tratamientos_catalogo**
|
||||||
|
- id, tenant_id, codigo, nombre
|
||||||
|
- categoria, descripcion
|
||||||
|
- duracion_minutos, precio_base
|
||||||
|
- requiere_rx, requiere_anestesia
|
||||||
|
- active
|
||||||
|
|
||||||
|
**dental.tratamientos_paciente**
|
||||||
|
- id, tenant_id, patient_id
|
||||||
|
- odontograma_id, tratamiento_id
|
||||||
|
- odontologo_id, consultation_id
|
||||||
|
- pieza_id, caras_tratadas[]
|
||||||
|
- fecha_inicio, fecha_fin
|
||||||
|
- estado, precio, descuento, precio_final
|
||||||
|
- notas
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /tratamientos/catalogo | Listar catalogo |
|
||||||
|
| POST | /tratamientos/catalogo | Crear procedimiento |
|
||||||
|
| PUT | /tratamientos/catalogo/:id | Actualizar |
|
||||||
|
| DELETE | /tratamientos/catalogo/:id | Desactivar |
|
||||||
|
| GET | /patients/:id/tratamientos | Tratamientos de paciente |
|
||||||
|
| POST | /patients/:id/tratamientos | Crear tratamiento |
|
||||||
|
| PUT | /tratamientos/:id | Actualizar tratamiento |
|
||||||
|
| PUT | /tratamientos/:id/estado | Cambiar estado |
|
||||||
|
| GET | /tratamientos/pendientes | Tratamientos pendientes |
|
||||||
|
| GET | /tratamientos/hoy | Tratamientos del dia |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface TratamientosService {
|
||||||
|
// Catalogo
|
||||||
|
getCatalogo(filters?: CatalogoFilters): Promise<Tratamiento[]>;
|
||||||
|
createProcedimiento(data: CreateProcedimiento): Promise<Tratamiento>;
|
||||||
|
|
||||||
|
// Tratamientos paciente
|
||||||
|
getByPatient(patientId: string): Promise<TratamientoPaciente[]>;
|
||||||
|
create(data: CreateTratamientoPaciente): Promise<TratamientoPaciente>;
|
||||||
|
updateEstado(id: string, estado: EstadoTratamiento): Promise<TratamientoPaciente>;
|
||||||
|
|
||||||
|
// Reportes
|
||||||
|
getPendientes(odontologoId?: string): Promise<TratamientoPaciente[]>;
|
||||||
|
getCompletadosHoy(): Promise<TratamientoPaciente[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateTratamientoPaciente {
|
||||||
|
patientId: string;
|
||||||
|
tratamientoId: string;
|
||||||
|
odontologoId: string;
|
||||||
|
piezaId?: string;
|
||||||
|
carasTratadas?: CaraDental[];
|
||||||
|
precio?: number;
|
||||||
|
descuento?: number;
|
||||||
|
notas?: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Registrar Tratamiento
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo en consulta del paciente
|
||||||
|
2. Revisa odontograma actual
|
||||||
|
3. Identifica pieza a tratar
|
||||||
|
4. Selecciona procedimiento del catalogo
|
||||||
|
5. Especifica caras afectadas (si aplica)
|
||||||
|
6. Confirma precio (puede aplicar descuento)
|
||||||
|
7. Guarda tratamiento como "pendiente" o "en_proceso"
|
||||||
|
8. Sistema actualiza estado del odontograma
|
||||||
|
```
|
||||||
|
|
||||||
|
### Completar Tratamiento
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo abre tratamiento en curso
|
||||||
|
2. Registra notas del procedimiento
|
||||||
|
3. Cambia estado a "completado"
|
||||||
|
4. Sistema registra fecha de finalizacion
|
||||||
|
5. Actualiza odontograma automaticamente
|
||||||
|
6. Tratamiento listo para facturacion
|
||||||
|
```
|
||||||
|
|
||||||
|
## Estados de Tratamiento
|
||||||
|
|
||||||
|
```
|
||||||
|
pendiente ──► en_proceso ──► completado
|
||||||
|
│ │
|
||||||
|
└──────────────┴──► cancelado
|
||||||
|
```
|
||||||
|
|
||||||
|
| Estado | Descripcion | Facturar |
|
||||||
|
|--------|-------------|----------|
|
||||||
|
| pendiente | Agendado, no iniciado | No |
|
||||||
|
| en_proceso | En ejecucion | Parcial |
|
||||||
|
| completado | Finalizado | Si |
|
||||||
|
| cancelado | No se realizara | No |
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL tratamientos | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| tratamientos.module.ts | Pendiente | `backend/modules/tratamientos/` |
|
||||||
|
| tratamientos.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| Seeds catalogo | Pendiente | `database/seeds/` |
|
||||||
|
| TratamientosList.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| TratamientoForm.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- DENTAL-001 (Odontograma)
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- clinica.consultations (erp-clinicas)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- DENTAL-006 (Presupuestos)
|
||||||
|
- Facturacion
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] Catalogo de procedimientos por tenant
|
||||||
|
- [ ] CRUD de tratamientos por paciente
|
||||||
|
- [ ] Asociacion a pieza dental
|
||||||
|
- [ ] Estados se actualizan correctamente
|
||||||
|
- [ ] Historial de tratamientos visible
|
||||||
|
- [ ] Precio final calcula con descuento
|
||||||
|
- [ ] Integracion con citas funciona
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
249
docs/01-epicas/DENTAL-003-ortodoncia.md
Normal file
249
docs/01-epicas/DENTAL-003-ortodoncia.md
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
# DENTAL-003: Ortodoncia
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-003
|
||||||
|
- **Modulo:** Ortodoncia
|
||||||
|
- **Prioridad:** P1
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 3 - Especialidades
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de gestion de tratamientos de ortodoncia: registro de casos, tipos de aparatologia, seguimiento de citas de ajuste, control de progreso, planes de pago, y finalizacion con retenedores.
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Registro de casos de ortodoncia
|
||||||
|
2. Tipos de aparatologia (brackets, alineadores)
|
||||||
|
3. Citas de ajuste mensuales
|
||||||
|
4. Seguimiento de progreso
|
||||||
|
5. Plan de pagos (enganche + mensualidades)
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Tipos: brackets metalicos, esteticos, linguales, alineadores
|
||||||
|
- Registro de fecha inicio/fin estimada
|
||||||
|
- Citas de control con detalles de ajuste
|
||||||
|
- Fotos de progreso (vinculo a storage)
|
||||||
|
- Control de arcos, ligas, elasticos
|
||||||
|
- Plan de pago con financiamiento
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Cefalometria digital
|
||||||
|
- Simulacion de resultados
|
||||||
|
- Analisis de modelos 3D
|
||||||
|
|
||||||
|
## Tipos de Ortodoncia
|
||||||
|
|
||||||
|
| Tipo | Descripcion | Duracion Tipica |
|
||||||
|
|------|-------------|-----------------|
|
||||||
|
| brackets_metalicos | Brackets tradicionales | 18-24 meses |
|
||||||
|
| brackets_esteticos | Brackets ceramicos/zafiro | 18-24 meses |
|
||||||
|
| brackets_linguales | Brackets en cara interna | 18-30 meses |
|
||||||
|
| alineadores | Alineadores transparentes | 12-18 meses |
|
||||||
|
| removible | Aparatos removibles | Variable |
|
||||||
|
| retenedor | Post-tratamiento | Indefinido |
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tablas
|
||||||
|
|
||||||
|
**dental.ortodoncia**
|
||||||
|
- id, tenant_id, patient_id, odontologo_id
|
||||||
|
- tipo (ENUM), marca
|
||||||
|
- fecha_inicio, fecha_estimada_fin, fecha_real_fin
|
||||||
|
- estado, meses_estimados
|
||||||
|
- costo_total, enganche, mensualidad
|
||||||
|
- notas
|
||||||
|
|
||||||
|
**dental.ortodoncia_citas**
|
||||||
|
- id, tenant_id, ortodoncia_id
|
||||||
|
- appointment_id
|
||||||
|
- fecha, numero_cita
|
||||||
|
- procedimiento
|
||||||
|
- arco_superior, arco_inferior, ligas
|
||||||
|
- observaciones, proxima_cita
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /ortodoncia | Listar casos activos |
|
||||||
|
| GET | /ortodoncia/:id | Detalle de caso |
|
||||||
|
| POST | /ortodoncia | Crear caso |
|
||||||
|
| PUT | /ortodoncia/:id | Actualizar caso |
|
||||||
|
| PUT | /ortodoncia/:id/finalizar | Finalizar tratamiento |
|
||||||
|
| GET | /ortodoncia/:id/citas | Historial de citas |
|
||||||
|
| POST | /ortodoncia/:id/citas | Registrar cita |
|
||||||
|
| GET | /patients/:id/ortodoncia | Casos del paciente |
|
||||||
|
| GET | /ortodoncia/proximas-citas | Citas proximas |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface OrtodonticService {
|
||||||
|
getCasosActivos(): Promise<CasoOrtodoncia[]>;
|
||||||
|
getById(id: string): Promise<CasoOrtodoncia>;
|
||||||
|
create(data: CreateCasoOrtodoncia): Promise<CasoOrtodoncia>;
|
||||||
|
registrarCita(casoId: string, data: CitaOrtodoncia): Promise<CitaOrtodoncia>;
|
||||||
|
finalizar(id: string, data: FinalizarOrtodoncia): Promise<CasoOrtodoncia>;
|
||||||
|
getProximasCitas(dias: number): Promise<CitaOrtodoncia[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateCasoOrtodoncia {
|
||||||
|
patientId: string;
|
||||||
|
odontologoId: string;
|
||||||
|
tipo: TipoOrtodoncia;
|
||||||
|
marca?: string;
|
||||||
|
fechaInicio: Date;
|
||||||
|
mesesEstimados: number;
|
||||||
|
costoTotal: number;
|
||||||
|
enganche?: number;
|
||||||
|
mensualidad?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CitaOrtodoncia {
|
||||||
|
fecha: Date;
|
||||||
|
numeroCita: number;
|
||||||
|
procedimiento: string;
|
||||||
|
arcoSuperior?: string;
|
||||||
|
arcoInferior?: string;
|
||||||
|
ligas?: string;
|
||||||
|
observaciones?: string;
|
||||||
|
proximaCita?: Date;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Iniciar Caso de Ortodoncia
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Consulta de valoracion ortodontica
|
||||||
|
2. Estudios iniciales (Rx panoramica, fotos, modelos)
|
||||||
|
3. Diagnostico y plan de tratamiento
|
||||||
|
4. Presentar presupuesto al paciente
|
||||||
|
5. Paciente acepta y paga enganche
|
||||||
|
6. Crear caso de ortodoncia en sistema
|
||||||
|
7. Agendar cita de colocacion
|
||||||
|
8. Colocar aparatologia
|
||||||
|
9. Registrar primera cita
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cita de Ajuste Mensual
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente llega a cita programada
|
||||||
|
2. Revision de aparatologia
|
||||||
|
3. Cambio de arcos/ligas si necesario
|
||||||
|
4. Registrar procedimiento realizado
|
||||||
|
5. Tomar fotos de progreso (opcional)
|
||||||
|
6. Agendar proxima cita
|
||||||
|
7. Cobrar mensualidad
|
||||||
|
```
|
||||||
|
|
||||||
|
### Finalizacion
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Tratamiento activo completo
|
||||||
|
2. Retiro de aparatologia
|
||||||
|
3. Colocacion de retenedores
|
||||||
|
4. Marcar caso como "finalizado"
|
||||||
|
5. Crear nuevo caso tipo "retenedor"
|
||||||
|
6. Programar citas de revision (3, 6, 12 meses)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plan de Pagos
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface PlanPagoOrtodoncia {
|
||||||
|
costoTotal: number; // $45,000
|
||||||
|
enganche: number; // $10,000
|
||||||
|
saldoPendiente: number; // $35,000
|
||||||
|
numeroPagos: number; // 18
|
||||||
|
montoPago: number; // $1,944.44
|
||||||
|
fechaInicio: Date;
|
||||||
|
pagosRealizados: number;
|
||||||
|
saldoActual: number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Componentes Frontend
|
||||||
|
|
||||||
|
### OrtodonciaTimeline
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Visualizacion de progreso del tratamiento
|
||||||
|
interface OrtodonciaTimelineProps {
|
||||||
|
caso: CasoOrtodoncia;
|
||||||
|
citas: CitaOrtodoncia[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Muestra:
|
||||||
|
// - Linea de tiempo con citas
|
||||||
|
// - Progreso vs estimado
|
||||||
|
// - Proxima cita destacada
|
||||||
|
// - Fotos de progreso
|
||||||
|
```
|
||||||
|
|
||||||
|
### CitaOrtodonticaForm
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface CitaOrtodonticaFormProps {
|
||||||
|
casoId: string;
|
||||||
|
numeroCita: number;
|
||||||
|
onSave: (data: CitaOrtodoncia) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Campos:
|
||||||
|
// - Procedimiento realizado
|
||||||
|
// - Arco superior/inferior
|
||||||
|
// - Ligas/elasticos
|
||||||
|
// - Observaciones
|
||||||
|
// - Fecha proxima cita
|
||||||
|
```
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL ortodoncia | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| ortodoncia.module.ts | Pendiente | `backend/modules/ortodoncia/` |
|
||||||
|
| ortodoncia.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| OrtodonciaTimeline.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| CitaOrtodonticaForm.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- clinica.appointments (erp-clinicas)
|
||||||
|
- DENTAL-006 (Presupuestos - para plan de pago)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- Reportes de ortodoncia
|
||||||
|
- Recordatorios automaticos
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] CRUD de casos de ortodoncia
|
||||||
|
- [ ] Tipos de aparatologia correctos
|
||||||
|
- [ ] Citas de ajuste se registran
|
||||||
|
- [ ] Progreso visual en timeline
|
||||||
|
- [ ] Plan de pago funciona
|
||||||
|
- [ ] Finalizacion crea caso retenedor
|
||||||
|
- [ ] Proximas citas se listan
|
||||||
|
|
||||||
|
## Metricas
|
||||||
|
|
||||||
|
| Metrica | Descripcion |
|
||||||
|
|---------|-------------|
|
||||||
|
| Casos activos | Tratamientos en curso |
|
||||||
|
| Tasa finalizacion | % que completan tratamiento |
|
||||||
|
| Duracion promedio | Meses reales vs estimados |
|
||||||
|
| Desercion | Pacientes que abandonan |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
227
docs/01-epicas/DENTAL-004-protesis.md
Normal file
227
docs/01-epicas/DENTAL-004-protesis.md
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
# DENTAL-004: Protesis Dentales
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-004
|
||||||
|
- **Modulo:** Protesis
|
||||||
|
- **Prioridad:** P1
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 3 - Especialidades
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de gestion de trabajos protesicos: coronas, puentes, dentaduras, implantes. Incluye ordenes de trabajo a laboratorio, seguimiento de estatus, materiales, colores, y garantias.
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Registro de trabajos protesicos
|
||||||
|
2. Ordenes a laboratorio dental
|
||||||
|
3. Seguimiento de estatus
|
||||||
|
4. Control de materiales y colores
|
||||||
|
5. Gestion de garantias
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Tipos: corona, puente, parcial removible, total, implante
|
||||||
|
- Piezas involucradas en el trabajo
|
||||||
|
- Integracion con laboratorios externos
|
||||||
|
- Fechas: impresion, envio lab, recepcion, colocacion
|
||||||
|
- Material y color (guia VITA)
|
||||||
|
- Garantias configurables
|
||||||
|
- Costo laboratorio vs precio paciente
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Diseno CAD/CAM propio
|
||||||
|
- Impresion 3D in-house
|
||||||
|
- Inventario de protesis prefabricadas
|
||||||
|
|
||||||
|
## Tipos de Protesis
|
||||||
|
|
||||||
|
| Tipo | Descripcion | Piezas |
|
||||||
|
|------|-------------|--------|
|
||||||
|
| corona | Corona unitaria | 1 |
|
||||||
|
| puente | Puente fijo | 3+ |
|
||||||
|
| parcial | Dentadura parcial removible | Variable |
|
||||||
|
| total | Dentadura completa | 14/16 |
|
||||||
|
| implante | Implante con corona | 1 |
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tabla: dental.protesis
|
||||||
|
|
||||||
|
| Campo | Tipo | Descripcion |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| id | UUID | PK |
|
||||||
|
| tenant_id | UUID | FK tenants |
|
||||||
|
| patient_id | UUID | FK patients |
|
||||||
|
| odontologo_id | UUID | FK doctors |
|
||||||
|
| tipo | VARCHAR(50) | corona, puente, etc. |
|
||||||
|
| piezas_involucradas | TEXT[] | ['11', '12', '13'] |
|
||||||
|
| laboratorio_id | UUID | FK proveedores |
|
||||||
|
| fecha_envio_lab | DATE | Envio de impresion |
|
||||||
|
| fecha_recepcion_lab | DATE | Recepcion del trabajo |
|
||||||
|
| material | VARCHAR(100) | Zirconia, metal-porcelana |
|
||||||
|
| color | VARCHAR(50) | A2, B1, etc. |
|
||||||
|
| estado | ENUM | en_proceso, completado |
|
||||||
|
| fecha_colocacion | DATE | Fecha de cementado |
|
||||||
|
| tiene_garantia | BOOLEAN | |
|
||||||
|
| meses_garantia | INTEGER | 12, 24, etc. |
|
||||||
|
| costo_laboratorio | NUMERIC | Costo del lab |
|
||||||
|
| precio_paciente | NUMERIC | Precio cobrado |
|
||||||
|
|
||||||
|
## Estados del Trabajo
|
||||||
|
|
||||||
|
```
|
||||||
|
impresion ──► laboratorio ──► prueba ──► ajuste ──► cementado ──► entregado
|
||||||
|
│
|
||||||
|
└──► devolucion (si hay problemas)
|
||||||
|
```
|
||||||
|
|
||||||
|
| Estado | Descripcion |
|
||||||
|
|--------|-------------|
|
||||||
|
| impresion | Toma de impresion/escaneo |
|
||||||
|
| laboratorio | Enviado al laboratorio |
|
||||||
|
| prueba | Prueba en boca |
|
||||||
|
| ajuste | Requiere ajustes |
|
||||||
|
| cementado | Cementado definitivo |
|
||||||
|
| entregado | Finalizado |
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /protesis | Listar trabajos |
|
||||||
|
| GET | /protesis/:id | Detalle de trabajo |
|
||||||
|
| POST | /protesis | Crear trabajo |
|
||||||
|
| PUT | /protesis/:id | Actualizar trabajo |
|
||||||
|
| PUT | /protesis/:id/estado | Cambiar estado |
|
||||||
|
| GET | /patients/:id/protesis | Trabajos del paciente |
|
||||||
|
| GET | /protesis/laboratorio | Pendientes en lab |
|
||||||
|
| GET | /protesis/garantias | Garantias activas |
|
||||||
|
| POST | /protesis/:id/garantia | Reclamacion garantia |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface ProtesisService {
|
||||||
|
getAll(filters?: ProtesisFilters): Promise<TrabajoProtesico[]>;
|
||||||
|
getById(id: string): Promise<TrabajoProtesico>;
|
||||||
|
create(data: CreateProtesis): Promise<TrabajoProtesico>;
|
||||||
|
updateEstado(id: string, estado: EstadoProtesis): Promise<TrabajoProtesico>;
|
||||||
|
getPendientesLab(): Promise<TrabajoProtesico[]>;
|
||||||
|
getGarantiasActivas(): Promise<TrabajoProtesico[]>;
|
||||||
|
reclamarGarantia(id: string, motivo: string): Promise<TrabajoProtesico>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateProtesis {
|
||||||
|
patientId: string;
|
||||||
|
odontologoId: string;
|
||||||
|
tipo: TipoProtesis;
|
||||||
|
piezasInvolucradas: string[];
|
||||||
|
laboratorioId?: string;
|
||||||
|
material: string;
|
||||||
|
color: string;
|
||||||
|
tieneGarantia: boolean;
|
||||||
|
mesesGarantia?: number;
|
||||||
|
costoLaboratorio: number;
|
||||||
|
precioPaciente: number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Crear Trabajo Protesico
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente requiere corona/puente
|
||||||
|
2. Preparacion dental (tallado)
|
||||||
|
3. Toma de impresion o escaneo digital
|
||||||
|
4. Seleccion de material y color
|
||||||
|
5. Crear registro en sistema (estado: impresion)
|
||||||
|
6. Generar orden de laboratorio
|
||||||
|
7. Enviar al laboratorio (estado: laboratorio)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Recepcion y Colocacion
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Laboratorio entrega trabajo
|
||||||
|
2. Registrar recepcion (estado: prueba)
|
||||||
|
3. Prueba en boca del paciente
|
||||||
|
4. Si ajustes necesarios: devolver a lab
|
||||||
|
5. Si ok: cementar (estado: cementado)
|
||||||
|
6. Dar indicaciones al paciente
|
||||||
|
7. Marcar como entregado
|
||||||
|
8. Registrar garantia
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reclamacion de Garantia
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente reporta problema
|
||||||
|
2. Verificar periodo de garantia
|
||||||
|
3. Evaluar tipo de falla
|
||||||
|
4. Si aplica garantia:
|
||||||
|
- Crear nuevo trabajo sin costo
|
||||||
|
- Enviar a laboratorio para refaccion
|
||||||
|
5. Si no aplica: presupuesto normal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Guia de Colores VITA
|
||||||
|
|
||||||
|
| Codigo | Nombre | Descripcion |
|
||||||
|
|--------|--------|-------------|
|
||||||
|
| A1 | Muy claro | Blanquecino |
|
||||||
|
| A2 | Claro | Ligeramente amarillo |
|
||||||
|
| A3 | Medio | Amarillo medio |
|
||||||
|
| A3.5 | Medio-oscuro | Amarillo intenso |
|
||||||
|
| A4 | Oscuro | Amarillo oscuro |
|
||||||
|
| B1 | Claro | Ligeramente naranja |
|
||||||
|
| B2 | Medio | Naranja claro |
|
||||||
|
| C1, C2 | Gris | Tonos grisaceos |
|
||||||
|
| D2, D3 | Rojizo | Tonos rojizos |
|
||||||
|
|
||||||
|
## Materiales Comunes
|
||||||
|
|
||||||
|
| Material | Uso | Durabilidad |
|
||||||
|
|----------|-----|-------------|
|
||||||
|
| Metal-porcelana | Posterior | Alta |
|
||||||
|
| Zirconia | Anterior/Posterior | Muy alta |
|
||||||
|
| Disilicato litio | Anterior | Alta |
|
||||||
|
| Resina | Provisional | Baja |
|
||||||
|
| Acrilico | Dentaduras | Media |
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL protesis | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| protesis.module.ts | Pendiente | `backend/modules/protesis/` |
|
||||||
|
| protesis.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| OrdenLaboratorio.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| ProtesisTracker.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- DENTAL-001 (Odontograma - piezas)
|
||||||
|
- Catalogo proveedores (laboratorios)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- Reportes de protesis
|
||||||
|
- Integracion con laboratorios digitales
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] CRUD de trabajos protesicos
|
||||||
|
- [ ] Estados se actualizan correctamente
|
||||||
|
- [ ] Piezas involucradas se registran
|
||||||
|
- [ ] Orden a laboratorio se genera
|
||||||
|
- [ ] Color y material se guardan
|
||||||
|
- [ ] Garantias se controlan
|
||||||
|
- [ ] Costos lab vs paciente
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
250
docs/01-epicas/DENTAL-005-radiografias.md
Normal file
250
docs/01-epicas/DENTAL-005-radiografias.md
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
# DENTAL-005: Radiografias Dentales
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-005
|
||||||
|
- **Modulo:** Radiografias
|
||||||
|
- **Prioridad:** P2
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 4 - Optimizacion
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de gestion de radiografias dentales: registro de diferentes tipos de Rx, asociacion a piezas y consultas, almacenamiento de imagenes, e interpretacion diagnostica.
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Registro de radiografias por tipo
|
||||||
|
2. Asociacion a pieza dental
|
||||||
|
3. Almacenamiento de imagenes
|
||||||
|
4. Interpretacion diagnostica
|
||||||
|
5. Historial por paciente
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Tipos: periapical, panoramica, cefalometrica, oclusal, bitewing
|
||||||
|
- Asociacion a pieza especifica (periapicales)
|
||||||
|
- Vinculo a consulta donde se tomo
|
||||||
|
- URL a imagen almacenada
|
||||||
|
- Campo de interpretacion (texto)
|
||||||
|
- Historial cronologico
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Captura directa desde sensor RVG
|
||||||
|
- Analisis automatico con IA
|
||||||
|
- Visor DICOM integrado
|
||||||
|
- Cefalometria digital
|
||||||
|
|
||||||
|
## Tipos de Radiografias
|
||||||
|
|
||||||
|
| Tipo | Descripcion | Uso Comun |
|
||||||
|
|------|-------------|-----------|
|
||||||
|
| periapical | Rx de 1-2 piezas | Diagnostico de caries, endodoncia |
|
||||||
|
| bitewing | Interproximal | Caries interproximales |
|
||||||
|
| oclusal | Vista oclusal | Piso de boca, paladar |
|
||||||
|
| panoramica | Ortopantomografia | Vision general, ortodoncia |
|
||||||
|
| cefalometrica | Lateral de craneo | Ortodoncia |
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tabla: dental.radiografias
|
||||||
|
|
||||||
|
| Campo | Tipo | Descripcion |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| id | UUID | PK |
|
||||||
|
| tenant_id | UUID | FK tenants |
|
||||||
|
| patient_id | UUID | FK patients |
|
||||||
|
| consultation_id | UUID | FK consultations (opcional) |
|
||||||
|
| tipo | VARCHAR(50) | periapical, panoramica, etc. |
|
||||||
|
| pieza_id | UUID | FK piezas_dentales (opcional) |
|
||||||
|
| fecha | DATE | Fecha de la toma |
|
||||||
|
| url_imagen | VARCHAR(255) | URL en storage |
|
||||||
|
| interpretacion | TEXT | Hallazgos |
|
||||||
|
| created_at | TIMESTAMPTZ | Timestamp creacion |
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /patients/:id/radiografias | Radiografias del paciente |
|
||||||
|
| GET | /radiografias/:id | Detalle de radiografia |
|
||||||
|
| POST | /radiografias | Registrar radiografia |
|
||||||
|
| PUT | /radiografias/:id | Actualizar (interpretacion) |
|
||||||
|
| DELETE | /radiografias/:id | Eliminar |
|
||||||
|
| POST | /radiografias/:id/upload | Subir imagen |
|
||||||
|
| GET | /radiografias/:id/imagen | Obtener URL imagen |
|
||||||
|
| GET | /radiografias/pieza/:piezaId | Rx de una pieza |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface RadiografiasService {
|
||||||
|
getByPatient(patientId: string): Promise<Radiografia[]>;
|
||||||
|
getById(id: string): Promise<Radiografia>;
|
||||||
|
create(data: CreateRadiografia): Promise<Radiografia>;
|
||||||
|
updateInterpretacion(id: string, interpretacion: string): Promise<Radiografia>;
|
||||||
|
uploadImage(id: string, file: File): Promise<string>;
|
||||||
|
getByPieza(piezaId: string): Promise<Radiografia[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateRadiografia {
|
||||||
|
patientId: string;
|
||||||
|
consultationId?: string;
|
||||||
|
tipo: TipoRadiografia;
|
||||||
|
piezaId?: string;
|
||||||
|
fecha: Date;
|
||||||
|
interpretacion?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Radiografia {
|
||||||
|
id: string;
|
||||||
|
patientId: string;
|
||||||
|
tipo: TipoRadiografia;
|
||||||
|
pieza?: PiezaDental;
|
||||||
|
fecha: Date;
|
||||||
|
urlImagen?: string;
|
||||||
|
interpretacion?: string;
|
||||||
|
createdAt: Date;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Registrar Radiografia
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Durante consulta, odontologo solicita Rx
|
||||||
|
2. Tecnico toma la radiografia
|
||||||
|
3. Exporta imagen del sensor/equipo
|
||||||
|
4. En sistema, crear registro de radiografia
|
||||||
|
5. Subir imagen al storage
|
||||||
|
6. Asociar a pieza (si periapical)
|
||||||
|
7. Odontologo escribe interpretacion
|
||||||
|
8. Guardar registro
|
||||||
|
```
|
||||||
|
|
||||||
|
### Consultar Historial
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo abre expediente del paciente
|
||||||
|
2. Navega a seccion "Radiografias"
|
||||||
|
3. Ve listado cronologico
|
||||||
|
4. Filtra por tipo o pieza
|
||||||
|
5. Click en miniatura abre visor
|
||||||
|
6. Puede comparar con Rx anteriores
|
||||||
|
```
|
||||||
|
|
||||||
|
## Interpretacion Estructurada
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface InterpretacionRadiografia {
|
||||||
|
hallazgos: string[]; // Lista de hallazgos
|
||||||
|
diagnostico?: string; // Diagnostico principal
|
||||||
|
recomendaciones?: string; // Tratamiento sugerido
|
||||||
|
comparativaAnterior?: string; // Cambios vs Rx previa
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ejemplo:
|
||||||
|
{
|
||||||
|
hallazgos: [
|
||||||
|
"Lesion radiolucida apical en pieza 36",
|
||||||
|
"Obturacion deficiente en conducto distal",
|
||||||
|
"Ensanchamiento del ligamento periodontal"
|
||||||
|
],
|
||||||
|
diagnostico: "Periodontitis apical cronica",
|
||||||
|
recomendaciones: "Retratamiento de conductos + corona"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Almacenamiento de Imagenes
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Estructura de paths
|
||||||
|
// storage/
|
||||||
|
// └── {tenant_id}/
|
||||||
|
// └── radiografias/
|
||||||
|
// └── {patient_id}/
|
||||||
|
// └── {radiografia_id}.jpg
|
||||||
|
|
||||||
|
// Integracion con modulo Storage
|
||||||
|
async uploadImage(radiografiaId: string, file: File): Promise<string> {
|
||||||
|
const radiografia = await this.getById(radiografiaId);
|
||||||
|
|
||||||
|
const path = `radiografias/${radiografia.patientId}/${radiografiaId}`;
|
||||||
|
const url = await this.storageService.upload(file, path);
|
||||||
|
|
||||||
|
await this.update(radiografiaId, { urlImagen: url });
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Visor de Radiografias
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface RadiogViewer {
|
||||||
|
// Funcionalidades basicas
|
||||||
|
zoom: (factor: number) => void;
|
||||||
|
pan: (x: number, y: number) => void;
|
||||||
|
rotate: (degrees: number) => void;
|
||||||
|
|
||||||
|
// Ajustes de imagen
|
||||||
|
brightness: (value: number) => void;
|
||||||
|
contrast: (value: number) => void;
|
||||||
|
invert: () => void;
|
||||||
|
|
||||||
|
// Herramientas
|
||||||
|
ruler: () => void; // Medir distancias
|
||||||
|
annotate: () => void; // Agregar notas
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL radiografias | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| radiografias.module.ts | Pendiente | `backend/modules/radiografias/` |
|
||||||
|
| radiografias.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| RadiografiasGrid.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| RadiogViewer.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- clinica.consultations (erp-clinicas)
|
||||||
|
- DENTAL-001 (Odontograma - piezas)
|
||||||
|
- Storage service (para imagenes)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- Exportacion a PACS
|
||||||
|
- Analisis con IA
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] Registro de Rx por tipo
|
||||||
|
- [ ] Asociacion a pieza funciona
|
||||||
|
- [ ] Upload de imagen funciona
|
||||||
|
- [ ] Visor basico (zoom, pan)
|
||||||
|
- [ ] Interpretacion se guarda
|
||||||
|
- [ ] Historial por paciente
|
||||||
|
- [ ] Filtros funcionan
|
||||||
|
|
||||||
|
## Consideraciones
|
||||||
|
|
||||||
|
### Formatos Soportados
|
||||||
|
- JPEG (comprimido)
|
||||||
|
- PNG (sin perdida)
|
||||||
|
- DICOM (futuro)
|
||||||
|
|
||||||
|
### Tamano Maximo
|
||||||
|
- 10 MB por imagen
|
||||||
|
- Resolucion recomendada: 1024x768 min
|
||||||
|
|
||||||
|
### Retencion
|
||||||
|
- Minimo 5 anos (regulatorio)
|
||||||
|
- Backup automatico
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
261
docs/01-epicas/DENTAL-006-presupuestos.md
Normal file
261
docs/01-epicas/DENTAL-006-presupuestos.md
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
# DENTAL-006: Presupuestos
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
- **Codigo:** DENTAL-006
|
||||||
|
- **Modulo:** Presupuestos
|
||||||
|
- **Prioridad:** P0
|
||||||
|
- **Estado:** DDL Completado
|
||||||
|
- **Fase:** 2 - Tratamientos
|
||||||
|
|
||||||
|
## Descripcion
|
||||||
|
|
||||||
|
Sistema de presupuestos dentales: creacion de planes de tratamiento con costos, lineas de presupuesto por procedimiento y pieza, descuentos, planes de pago, y seguimiento de aceptacion.
|
||||||
|
|
||||||
|
## Objetivos
|
||||||
|
|
||||||
|
1. Presupuestos detallados por paciente
|
||||||
|
2. Lineas por procedimiento y pieza
|
||||||
|
3. Descuentos globales y por linea
|
||||||
|
4. Opciones de financiamiento
|
||||||
|
5. Seguimiento de estado
|
||||||
|
|
||||||
|
## Alcance
|
||||||
|
|
||||||
|
### Incluido
|
||||||
|
- Presupuestos con numero correlativo
|
||||||
|
- Lineas con tratamiento, pieza, cantidad, precio
|
||||||
|
- Descuentos porcentuales y en monto
|
||||||
|
- Fecha de vencimiento
|
||||||
|
- Estados: pendiente, aprobado, rechazado, vencido
|
||||||
|
- Plan de pago (enganche + mensualidades)
|
||||||
|
- Impresion/PDF del presupuesto
|
||||||
|
|
||||||
|
### Excluido
|
||||||
|
- Firma electronica
|
||||||
|
- Consentimiento informado integrado
|
||||||
|
- Generacion automatica desde odontograma
|
||||||
|
|
||||||
|
## Modelo de Datos
|
||||||
|
|
||||||
|
### Tablas
|
||||||
|
|
||||||
|
**dental.presupuestos**
|
||||||
|
- id, tenant_id, patient_id, odontologo_id
|
||||||
|
- numero (correlativo)
|
||||||
|
- fecha, fecha_vencimiento
|
||||||
|
- estado (pendiente, aprobado, rechazado, vencido)
|
||||||
|
- subtotal, descuento_porcentaje, descuento_monto, total
|
||||||
|
- requiere_financiamiento, enganche, numero_pagos, monto_pago
|
||||||
|
- notas
|
||||||
|
|
||||||
|
**dental.presupuesto_lineas**
|
||||||
|
- id, tenant_id, presupuesto_id
|
||||||
|
- tratamiento_id, pieza_id
|
||||||
|
- descripcion
|
||||||
|
- cantidad, precio_unitario, descuento, subtotal
|
||||||
|
- sequence
|
||||||
|
|
||||||
|
## Estados del Presupuesto
|
||||||
|
|
||||||
|
```
|
||||||
|
pendiente ──► aprobado ──► en_tratamiento ──► completado
|
||||||
|
│
|
||||||
|
├──► rechazado
|
||||||
|
│
|
||||||
|
└──► vencido (automatico por fecha)
|
||||||
|
```
|
||||||
|
|
||||||
|
| Estado | Descripcion |
|
||||||
|
|--------|-------------|
|
||||||
|
| pendiente | Presentado, esperando decision |
|
||||||
|
| aprobado | Aceptado por el paciente |
|
||||||
|
| rechazado | Rechazado por el paciente |
|
||||||
|
| vencido | Expiro la vigencia |
|
||||||
|
| en_tratamiento | Tratamientos en curso |
|
||||||
|
| completado | Todos los tratamientos finalizados |
|
||||||
|
|
||||||
|
## Endpoints API
|
||||||
|
|
||||||
|
| Metodo | Endpoint | Descripcion |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | /presupuestos | Listar presupuestos |
|
||||||
|
| GET | /presupuestos/:id | Detalle |
|
||||||
|
| POST | /presupuestos | Crear presupuesto |
|
||||||
|
| PUT | /presupuestos/:id | Actualizar |
|
||||||
|
| DELETE | /presupuestos/:id | Eliminar (solo pendientes) |
|
||||||
|
| PUT | /presupuestos/:id/aprobar | Aprobar |
|
||||||
|
| PUT | /presupuestos/:id/rechazar | Rechazar |
|
||||||
|
| GET | /patients/:id/presupuestos | Presupuestos del paciente |
|
||||||
|
| GET | /presupuestos/:id/pdf | Generar PDF |
|
||||||
|
| POST | /presupuestos/:id/lineas | Agregar linea |
|
||||||
|
| PUT | /presupuestos/:id/lineas/:lineaId | Actualizar linea |
|
||||||
|
| DELETE | /presupuestos/:id/lineas/:lineaId | Eliminar linea |
|
||||||
|
|
||||||
|
## Interfaz del Servicio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface PresupuestosService {
|
||||||
|
getAll(filters?: PresupuestoFilters): Promise<Presupuesto[]>;
|
||||||
|
getById(id: string): Promise<Presupuesto>;
|
||||||
|
create(data: CreatePresupuesto): Promise<Presupuesto>;
|
||||||
|
addLinea(presupuestoId: string, linea: CreateLinea): Promise<PresupuestoLinea>;
|
||||||
|
removeLinea(presupuestoId: string, lineaId: string): Promise<void>;
|
||||||
|
aprobar(id: string): Promise<Presupuesto>;
|
||||||
|
rechazar(id: string, motivo?: string): Promise<Presupuesto>;
|
||||||
|
generarPDF(id: string): Promise<Buffer>;
|
||||||
|
calcularTotales(id: string): Promise<PresupuestoTotales>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreatePresupuesto {
|
||||||
|
patientId: string;
|
||||||
|
odontologoId: string;
|
||||||
|
fechaVencimiento?: Date;
|
||||||
|
descuentoPorcentaje?: number;
|
||||||
|
requiereFinanciamiento?: boolean;
|
||||||
|
enganche?: number;
|
||||||
|
numeroPagos?: number;
|
||||||
|
notas?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateLinea {
|
||||||
|
tratamientoId: string;
|
||||||
|
piezaId?: string;
|
||||||
|
descripcion?: string;
|
||||||
|
cantidad: number;
|
||||||
|
precioUnitario: number;
|
||||||
|
descuento?: number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flujos
|
||||||
|
|
||||||
|
### Crear Presupuesto
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo realiza exploracion
|
||||||
|
2. Identifica tratamientos necesarios
|
||||||
|
3. Crear nuevo presupuesto
|
||||||
|
4. Agregar lineas:
|
||||||
|
- Seleccionar tratamiento del catalogo
|
||||||
|
- Asociar pieza dental (si aplica)
|
||||||
|
- Ajustar precio si es diferente al base
|
||||||
|
- Aplicar descuento por linea
|
||||||
|
5. Aplicar descuento global (si aplica)
|
||||||
|
6. Configurar plan de pago (si requiere)
|
||||||
|
7. Guardar presupuesto
|
||||||
|
8. Presentar al paciente (imprimir o enviar)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Aprobar Presupuesto
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente acepta presupuesto
|
||||||
|
2. Marcar como "aprobado"
|
||||||
|
3. Si requiere financiamiento:
|
||||||
|
- Registrar enganche recibido
|
||||||
|
- Generar calendario de pagos
|
||||||
|
4. Crear tratamientos a partir de lineas
|
||||||
|
5. Agendar primera cita
|
||||||
|
```
|
||||||
|
|
||||||
|
## Calculo de Totales
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function calcularTotales(presupuesto: Presupuesto): PresupuestoTotales {
|
||||||
|
// Sumar lineas
|
||||||
|
const subtotal = presupuesto.lineas.reduce((sum, linea) => {
|
||||||
|
const lineaTotal = linea.cantidad * linea.precioUnitario;
|
||||||
|
const lineaDescuento = lineaTotal * (linea.descuento / 100);
|
||||||
|
return sum + (lineaTotal - lineaDescuento);
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
// Descuento global
|
||||||
|
let descuentoMonto = 0;
|
||||||
|
if (presupuesto.descuentoPorcentaje > 0) {
|
||||||
|
descuentoMonto = subtotal * (presupuesto.descuentoPorcentaje / 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
const total = subtotal - descuentoMonto;
|
||||||
|
|
||||||
|
// Plan de pago
|
||||||
|
let montoPago = 0;
|
||||||
|
if (presupuesto.requiereFinanciamiento && presupuesto.numeroPagos > 0) {
|
||||||
|
const saldo = total - (presupuesto.enganche || 0);
|
||||||
|
montoPago = saldo / presupuesto.numeroPagos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { subtotal, descuentoMonto, total, montoPago };
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Formato PDF
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────┐
|
||||||
|
│ [LOGO] CLINICA DENTAL XYZ │
|
||||||
|
│ RFC: ABC123456789 │
|
||||||
|
│ Direccion: Calle 123, Ciudad │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ PRESUPUESTO No. PRE-2026-0001 │
|
||||||
|
│ Fecha: 07/01/2026 Vigencia: 07/02/2026 │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ PACIENTE: Juan Perez Garcia │
|
||||||
|
│ ODONTOLOGO: Dr. Maria Lopez │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ # │ Tratamiento │ Pieza │ Cant │ P.U. │Total │
|
||||||
|
│────┼──────────────────────┼───────┼──────┼───────┼──────│
|
||||||
|
│ 1 │ Limpieza dental │ - │ 1 │ $500 │ $500 │
|
||||||
|
│ 2 │ Resina simple │ 36 │ 1 │ $600 │ $600 │
|
||||||
|
│ 3 │ Endodoncia unirrad. │ 16 │ 1 │$2,500 │$2,500│
|
||||||
|
│ 4 │ Corona zirconia │ 16 │ 1 │$6,000 │$6,000│
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ Subtotal: $9,600 │
|
||||||
|
│ Descuento (10%): -$960 │
|
||||||
|
│ TOTAL: $8,640 │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ PLAN DE PAGO: │
|
||||||
|
│ Enganche: $2,640 12 pagos de: $500 │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ Notas: │
|
||||||
|
│ - Vigencia de 30 dias │
|
||||||
|
│ - Precios incluyen materiales │
|
||||||
|
│ - No incluye radiografias adicionales │
|
||||||
|
└─────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
|
||||||
|
| Entregable | Estado | Archivo |
|
||||||
|
|------------|--------|---------|
|
||||||
|
| DDL presupuestos | Completado | `database/schemas/01-dental-schema-ddl.sql` |
|
||||||
|
| presupuestos.module.ts | Pendiente | `backend/modules/presupuestos/` |
|
||||||
|
| presupuestos.service.ts | Pendiente | `backend/services/` |
|
||||||
|
| pdf.generator.ts | Pendiente | `backend/services/` |
|
||||||
|
| PresupuestoForm.tsx | Pendiente | `frontend/components/` |
|
||||||
|
| PresupuestoViewer.tsx | Pendiente | `frontend/components/` |
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- clinica.patients (erp-clinicas)
|
||||||
|
- DENTAL-001 (Odontograma - piezas)
|
||||||
|
- DENTAL-002 (Tratamientos - catalogo)
|
||||||
|
|
||||||
|
### Bloquea a
|
||||||
|
- Facturacion
|
||||||
|
- Reportes financieros
|
||||||
|
|
||||||
|
## Criterios de Aceptacion
|
||||||
|
|
||||||
|
- [ ] CRUD de presupuestos
|
||||||
|
- [ ] Agregar/quitar lineas
|
||||||
|
- [ ] Calculos correctos
|
||||||
|
- [ ] Descuentos funcionan
|
||||||
|
- [ ] Estados se actualizan
|
||||||
|
- [ ] Plan de pago se configura
|
||||||
|
- [ ] PDF se genera correctamente
|
||||||
|
- [ ] Vencimiento automatico
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
153
docs/02-definicion-modulos/_MAP.md
Normal file
153
docs/02-definicion-modulos/_MAP.md
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
# Clinica Dental - Mapa de Modulos
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Seccion:** 02-definicion-modulos
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estructura de Modulos
|
||||||
|
|
||||||
|
```
|
||||||
|
02-definicion-modulos/
|
||||||
|
├── _MAP.md <- ESTE ARCHIVO
|
||||||
|
├── modulo-odontograma.md <- Registro grafico dental
|
||||||
|
├── modulo-tratamientos.md <- Gestion de procedimientos
|
||||||
|
├── modulo-prevencion.md <- Profilaxis y selladores
|
||||||
|
├── modulo-restauracion.md <- Resinas y amalgamas
|
||||||
|
├── modulo-ortodoncia.md <- Brackets y alineadores
|
||||||
|
├── modulo-endodoncia.md <- Tratamientos de conductos
|
||||||
|
├── modulo-periodoncia.md <- Enfermedad periodontal
|
||||||
|
├── modulo-protesis.md <- Coronas, puentes, implantes
|
||||||
|
├── modulo-cirugia.md <- Extracciones y cirugia
|
||||||
|
└── modulo-estetica.md <- Blanqueamiento, carillas
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modulos Especializados (Odontologia)
|
||||||
|
|
||||||
|
### Core - Prioridad P1
|
||||||
|
|
||||||
|
| Modulo | Archivo | Estado | Descripcion |
|
||||||
|
|--------|---------|--------|-------------|
|
||||||
|
| Odontograma | modulo-odontograma.md | EN_PROGRESO | Registro grafico del estado dental |
|
||||||
|
| Tratamientos | modulo-tratamientos.md | PENDIENTE | Gestion de procedimientos y planes |
|
||||||
|
| Prevencion | modulo-prevencion.md | PENDIENTE | Limpiezas, fluor, selladores |
|
||||||
|
| Restauracion | modulo-restauracion.md | PENDIENTE | Resinas, amalgamas, incrustaciones |
|
||||||
|
|
||||||
|
### Especializados - Prioridad P2
|
||||||
|
|
||||||
|
| Modulo | Archivo | Estado | Descripcion |
|
||||||
|
|--------|---------|--------|-------------|
|
||||||
|
| Ortodoncia | modulo-ortodoncia.md | PENDIENTE | Brackets, alineadores, retenedores |
|
||||||
|
| Endodoncia | modulo-endodoncia.md | PENDIENTE | Tratamientos de conductos |
|
||||||
|
| Periodoncia | modulo-periodoncia.md | PENDIENTE | Raspados, cirugia periodontal |
|
||||||
|
| Protesis | modulo-protesis.md | PENDIENTE | Coronas, puentes, dentaduras |
|
||||||
|
| Cirugia | modulo-cirugia.md | PENDIENTE | Extracciones, implantes |
|
||||||
|
| Estetica | modulo-estetica.md | PENDIENTE | Blanqueamiento, carillas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modulos Heredados (de erp-clinicas)
|
||||||
|
|
||||||
|
| Modulo | Fuente | Adaptacion |
|
||||||
|
|--------|--------|------------|
|
||||||
|
| Pacientes | erp-clinicas | Sin cambios |
|
||||||
|
| Expedientes | erp-clinicas | Agregar seccion odontograma |
|
||||||
|
| Citas | erp-clinicas | Sin cambios |
|
||||||
|
| Consultas | erp-clinicas | Agregar exploracion dental |
|
||||||
|
| Recetas | erp-clinicas | Sin cambios |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modulos Heredados (de erp-core)
|
||||||
|
|
||||||
|
| Modulo | Fuente | Adaptacion |
|
||||||
|
|--------|--------|------------|
|
||||||
|
| Autenticacion | erp-core | Sin cambios |
|
||||||
|
| Usuarios | erp-core | Sin cambios |
|
||||||
|
| Roles/Permisos | erp-core | Agregar roles odontologicos |
|
||||||
|
| Facturacion | erp-core | Sin cambios |
|
||||||
|
| Inventario | erp-core | Materiales dentales |
|
||||||
|
| Catalogos | erp-core | Agregar catalogos dentales |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Entidades por Modulo
|
||||||
|
|
||||||
|
### Odontograma
|
||||||
|
- `odontograma` - Registro principal
|
||||||
|
- `pieza_dental` - Estado por pieza
|
||||||
|
- `historial_pieza` - Cambios historicos
|
||||||
|
|
||||||
|
### Tratamientos
|
||||||
|
- `tratamiento` - Plan de tratamiento
|
||||||
|
- `procedimiento` - Catalogo de procedimientos
|
||||||
|
- `tratamiento_procedimiento` - Detalle
|
||||||
|
- `presupuesto` - Costos estimados
|
||||||
|
|
||||||
|
### Ortodoncia
|
||||||
|
- `caso_ortodoncia` - Caso clinico
|
||||||
|
- `ajuste_ortodoncia` - Registro de ajustes
|
||||||
|
- `estudio_ortodoncia` - Rx, fotos, modelos
|
||||||
|
|
||||||
|
### Protesis
|
||||||
|
- `trabajo_protesico` - Orden de trabajo
|
||||||
|
- `laboratorio_dental` - Laboratorios externos
|
||||||
|
- `prueba_protesis` - Registro de pruebas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Relaciones entre Modulos
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ Paciente │
|
||||||
|
│(erp-clinicas)│
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌────────────┼────────────┐
|
||||||
|
│ │ │
|
||||||
|
┌──────▼──────┐ ┌───▼───┐ ┌──────▼──────┐
|
||||||
|
│ Odontograma │ │ Citas │ │ Expediente │
|
||||||
|
└──────┬──────┘ └───┬───┘ └──────┬──────┘
|
||||||
|
│ │ │
|
||||||
|
└─────┬──────┴──────┬─────┘
|
||||||
|
│ │
|
||||||
|
┌──────▼──────┐ ┌────▼────┐
|
||||||
|
│ Tratamientos│ │Consultas│
|
||||||
|
└──────┬──────┘ └────┬────┘
|
||||||
|
│ │
|
||||||
|
┌───────────────┼─────────────┤
|
||||||
|
│ │ │
|
||||||
|
┌───▼───┐ ┌──────▼──────┐ ┌────▼────┐
|
||||||
|
│Ortodo-│ │ Protesis │ │ Recetas │
|
||||||
|
│ncia │ └─────────────┘ └─────────┘
|
||||||
|
└───────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estado de Documentacion
|
||||||
|
|
||||||
|
| Modulo | README | ESPECIFICACION | FLUJOS | TESTS |
|
||||||
|
|--------|--------|----------------|--------|-------|
|
||||||
|
| Odontograma | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
|
||||||
|
| Tratamientos | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
|
||||||
|
| Ortodoncia | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
|
||||||
|
| Protesis | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Proximos Pasos
|
||||||
|
|
||||||
|
1. **Completar modulo-odontograma.md** - Especificacion completa
|
||||||
|
2. **Documentar modulo-tratamientos.md** - Planes y presupuestos
|
||||||
|
3. **Definir entidades** en DATABASE_INVENTORY.yml
|
||||||
|
4. **Crear User Stories** para Sprint 1
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
|
**Version:** 1.0.0
|
||||||
560
docs/02-definicion-modulos/modulo-odontograma.md
Normal file
560
docs/02-definicion-modulos/modulo-odontograma.md
Normal file
@ -0,0 +1,560 @@
|
|||||||
|
# Modulo Odontograma
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Modulo:** ODT-001
|
||||||
|
**Prioridad:** P1 - Core
|
||||||
|
**Estado:** Especificacion
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. DESCRIPCION GENERAL
|
||||||
|
|
||||||
|
El odontograma es el registro grafico del estado dental del paciente. Representa visualmente cada pieza dental con su condicion actual, tratamientos realizados e historial de cambios.
|
||||||
|
|
||||||
|
### Proposito
|
||||||
|
- Visualizar estado completo de la dentadura
|
||||||
|
- Registrar condicion de cada pieza dental
|
||||||
|
- Documentar caras afectadas
|
||||||
|
- Mantener historial de cambios
|
||||||
|
- Facilitar diagnostico y plan de tratamiento
|
||||||
|
|
||||||
|
### Alcance
|
||||||
|
- Adultos (32 piezas permanentes)
|
||||||
|
- Ninos (20 piezas deciduas)
|
||||||
|
- Estados por pieza
|
||||||
|
- Historial temporal
|
||||||
|
- Anotaciones por pieza
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. ENTIDADES
|
||||||
|
|
||||||
|
### 2.1 odontograma
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
tabla: dental.odontogramas
|
||||||
|
descripcion: "Registro principal del estado dental"
|
||||||
|
|
||||||
|
campos:
|
||||||
|
- nombre: id
|
||||||
|
tipo: UUID
|
||||||
|
pk: true
|
||||||
|
descripcion: "Identificador unico"
|
||||||
|
|
||||||
|
- nombre: paciente_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: clinicas.pacientes(id)
|
||||||
|
not_null: true
|
||||||
|
descripcion: "Paciente al que pertenece"
|
||||||
|
|
||||||
|
- nombre: tipo
|
||||||
|
tipo: ENUM
|
||||||
|
valores: ['adulto', 'deciduo', 'mixto']
|
||||||
|
default: 'adulto'
|
||||||
|
descripcion: "Tipo de denticion"
|
||||||
|
|
||||||
|
- nombre: fecha_registro
|
||||||
|
tipo: TIMESTAMP
|
||||||
|
default: NOW()
|
||||||
|
descripcion: "Fecha de creacion"
|
||||||
|
|
||||||
|
- nombre: fecha_actualizacion
|
||||||
|
tipo: TIMESTAMP
|
||||||
|
descripcion: "Ultima modificacion"
|
||||||
|
|
||||||
|
- nombre: odontologo_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: core.usuarios(id)
|
||||||
|
descripcion: "Odontologo que registro"
|
||||||
|
|
||||||
|
- nombre: notas_generales
|
||||||
|
tipo: TEXT
|
||||||
|
descripcion: "Observaciones generales"
|
||||||
|
|
||||||
|
- nombre: activo
|
||||||
|
tipo: BOOLEAN
|
||||||
|
default: true
|
||||||
|
descripcion: "Odontograma vigente"
|
||||||
|
|
||||||
|
indices:
|
||||||
|
- nombre: idx_odontograma_paciente
|
||||||
|
campos: [paciente_id]
|
||||||
|
- nombre: idx_odontograma_fecha
|
||||||
|
campos: [fecha_registro DESC]
|
||||||
|
|
||||||
|
rls:
|
||||||
|
- policy: "tenant_isolation"
|
||||||
|
using: "tenant_id = current_tenant_id()"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 pieza_dental
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
tabla: dental.piezas_dentales
|
||||||
|
descripcion: "Estado individual de cada pieza"
|
||||||
|
|
||||||
|
campos:
|
||||||
|
- nombre: id
|
||||||
|
tipo: UUID
|
||||||
|
pk: true
|
||||||
|
|
||||||
|
- nombre: odontograma_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: dental.odontogramas(id)
|
||||||
|
not_null: true
|
||||||
|
on_delete: CASCADE
|
||||||
|
|
||||||
|
- nombre: numero_pieza
|
||||||
|
tipo: INTEGER
|
||||||
|
not_null: true
|
||||||
|
check: "(numero_pieza BETWEEN 11 AND 48) OR (numero_pieza BETWEEN 51 AND 85)"
|
||||||
|
descripcion: "Numero FDI de la pieza"
|
||||||
|
|
||||||
|
- nombre: estado
|
||||||
|
tipo: ENUM
|
||||||
|
valores: ['sano', 'caries', 'obturacion_resina', 'obturacion_amalgama',
|
||||||
|
'endodoncia', 'corona', 'puente_pilar', 'puente_ponico',
|
||||||
|
'implante', 'ausente', 'extraccion_indicada', 'supernumerario',
|
||||||
|
'retenido', 'fracturado']
|
||||||
|
default: 'sano'
|
||||||
|
descripcion: "Estado actual de la pieza"
|
||||||
|
|
||||||
|
- nombre: caras_afectadas
|
||||||
|
tipo: TEXT[]
|
||||||
|
descripcion: "Array de caras: M, D, O, V, L, I, P"
|
||||||
|
|
||||||
|
- nombre: movilidad
|
||||||
|
tipo: INTEGER
|
||||||
|
check: "movilidad BETWEEN 0 AND 3"
|
||||||
|
descripcion: "Grado de movilidad (0=normal, 3=severa)"
|
||||||
|
|
||||||
|
- nombre: sensibilidad
|
||||||
|
tipo: BOOLEAN
|
||||||
|
default: false
|
||||||
|
descripcion: "Sensibilidad al frio/calor"
|
||||||
|
|
||||||
|
- nombre: notas
|
||||||
|
tipo: TEXT
|
||||||
|
descripcion: "Observaciones especificas"
|
||||||
|
|
||||||
|
- nombre: fecha_actualizacion
|
||||||
|
tipo: TIMESTAMP
|
||||||
|
default: NOW()
|
||||||
|
|
||||||
|
indices:
|
||||||
|
- nombre: idx_pieza_odontograma
|
||||||
|
campos: [odontograma_id]
|
||||||
|
- nombre: idx_pieza_numero
|
||||||
|
campos: [odontograma_id, numero_pieza]
|
||||||
|
unique: true
|
||||||
|
|
||||||
|
constraints:
|
||||||
|
- nombre: uk_pieza_odontograma
|
||||||
|
tipo: UNIQUE
|
||||||
|
campos: [odontograma_id, numero_pieza]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 historial_pieza
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
tabla: dental.historial_piezas
|
||||||
|
descripcion: "Cambios historicos en cada pieza"
|
||||||
|
|
||||||
|
campos:
|
||||||
|
- nombre: id
|
||||||
|
tipo: UUID
|
||||||
|
pk: true
|
||||||
|
|
||||||
|
- nombre: pieza_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: dental.piezas_dentales(id)
|
||||||
|
not_null: true
|
||||||
|
on_delete: CASCADE
|
||||||
|
|
||||||
|
- nombre: estado_anterior
|
||||||
|
tipo: VARCHAR(50)
|
||||||
|
|
||||||
|
- nombre: estado_nuevo
|
||||||
|
tipo: VARCHAR(50)
|
||||||
|
not_null: true
|
||||||
|
|
||||||
|
- nombre: caras_anterior
|
||||||
|
tipo: TEXT[]
|
||||||
|
|
||||||
|
- nombre: caras_nuevo
|
||||||
|
tipo: TEXT[]
|
||||||
|
|
||||||
|
- nombre: tratamiento_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: dental.tratamientos(id)
|
||||||
|
descripcion: "Tratamiento que causo el cambio"
|
||||||
|
|
||||||
|
- nombre: fecha_cambio
|
||||||
|
tipo: TIMESTAMP
|
||||||
|
default: NOW()
|
||||||
|
|
||||||
|
- nombre: odontologo_id
|
||||||
|
tipo: UUID
|
||||||
|
fk: core.usuarios(id)
|
||||||
|
|
||||||
|
- nombre: motivo
|
||||||
|
tipo: TEXT
|
||||||
|
descripcion: "Razon del cambio"
|
||||||
|
|
||||||
|
indices:
|
||||||
|
- nombre: idx_historial_pieza
|
||||||
|
campos: [pieza_id]
|
||||||
|
- nombre: idx_historial_fecha
|
||||||
|
campos: [fecha_cambio DESC]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. NOMENCLATURA FDI
|
||||||
|
|
||||||
|
### Sistema de Numeracion
|
||||||
|
|
||||||
|
```
|
||||||
|
SUPERIOR
|
||||||
|
┌───────────┬───────────┐
|
||||||
|
│ Derecho │ Izquierdo │
|
||||||
|
│ 18-11 │ 21-28 │
|
||||||
|
├───────────┼───────────┤
|
||||||
|
│ 48-41 │ 31-38 │
|
||||||
|
│ Derecho │ Izquierdo │
|
||||||
|
└───────────┴───────────┘
|
||||||
|
INFERIOR
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dientes Permanentes (32 piezas)
|
||||||
|
|
||||||
|
| Cuadrante | Posicion | Piezas | Descripcion |
|
||||||
|
|-----------|----------|--------|-------------|
|
||||||
|
| 1 | Superior Derecho | 11-18 | Incisivo central a 3er molar |
|
||||||
|
| 2 | Superior Izquierdo | 21-28 | Incisivo central a 3er molar |
|
||||||
|
| 3 | Inferior Izquierdo | 31-38 | Incisivo central a 3er molar |
|
||||||
|
| 4 | Inferior Derecho | 41-48 | Incisivo central a 3er molar |
|
||||||
|
|
||||||
|
### Dientes Deciduos (20 piezas)
|
||||||
|
|
||||||
|
| Cuadrante | Posicion | Piezas | Descripcion |
|
||||||
|
|-----------|----------|--------|-------------|
|
||||||
|
| 5 | Superior Derecho | 51-55 | Incisivo a 2do molar |
|
||||||
|
| 6 | Superior Izquierdo | 61-65 | Incisivo a 2do molar |
|
||||||
|
| 7 | Inferior Izquierdo | 71-75 | Incisivo a 2do molar |
|
||||||
|
| 8 | Inferior Derecho | 81-85 | Incisivo a 2do molar |
|
||||||
|
|
||||||
|
### Caras Dentales
|
||||||
|
|
||||||
|
| Sigla | Nombre | Aplicable a |
|
||||||
|
|-------|--------|-------------|
|
||||||
|
| M | Mesial | Todas |
|
||||||
|
| D | Distal | Todas |
|
||||||
|
| O | Oclusal | Premolares, Molares |
|
||||||
|
| I | Incisal | Incisivos, Caninos |
|
||||||
|
| V | Vestibular | Todas |
|
||||||
|
| B | Bucal | Sinonimo de V |
|
||||||
|
| L | Lingual | Inferiores |
|
||||||
|
| P | Palatino | Superiores |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. ESTADOS DE PIEZAS
|
||||||
|
|
||||||
|
### Catalogo de Estados
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
estados:
|
||||||
|
- codigo: SANO
|
||||||
|
nombre: "Sano"
|
||||||
|
color: "#4CAF50"
|
||||||
|
descripcion: "Pieza sin patologia"
|
||||||
|
|
||||||
|
- codigo: CARIES
|
||||||
|
nombre: "Caries"
|
||||||
|
color: "#F44336"
|
||||||
|
descripcion: "Lesion cariosa activa"
|
||||||
|
|
||||||
|
- codigo: OBT_RES
|
||||||
|
nombre: "Obturacion Resina"
|
||||||
|
color: "#2196F3"
|
||||||
|
descripcion: "Restauracion con resina"
|
||||||
|
|
||||||
|
- codigo: OBT_AMG
|
||||||
|
nombre: "Obturacion Amalgama"
|
||||||
|
color: "#9E9E9E"
|
||||||
|
descripcion: "Restauracion con amalgama"
|
||||||
|
|
||||||
|
- codigo: ENDO
|
||||||
|
nombre: "Endodoncia"
|
||||||
|
color: "#9C27B0"
|
||||||
|
descripcion: "Tratamiento de conductos"
|
||||||
|
|
||||||
|
- codigo: CORONA
|
||||||
|
nombre: "Corona"
|
||||||
|
color: "#FFC107"
|
||||||
|
descripcion: "Corona protesica"
|
||||||
|
|
||||||
|
- codigo: PUENTE_P
|
||||||
|
nombre: "Puente Pilar"
|
||||||
|
color: "#FF9800"
|
||||||
|
descripcion: "Pieza pilar de puente"
|
||||||
|
|
||||||
|
- codigo: PUENTE_O
|
||||||
|
nombre: "Puente Ponico"
|
||||||
|
color: "#FF5722"
|
||||||
|
descripcion: "Pieza artificial de puente"
|
||||||
|
|
||||||
|
- codigo: IMPLANTE
|
||||||
|
nombre: "Implante"
|
||||||
|
color: "#00BCD4"
|
||||||
|
descripcion: "Implante dental"
|
||||||
|
|
||||||
|
- codigo: AUSENTE
|
||||||
|
nombre: "Ausente"
|
||||||
|
color: "#BDBDBD"
|
||||||
|
descripcion: "Pieza extraida"
|
||||||
|
|
||||||
|
- codigo: EXT_IND
|
||||||
|
nombre: "Extraccion Indicada"
|
||||||
|
color: "#E91E63"
|
||||||
|
descripcion: "Requiere extraccion"
|
||||||
|
|
||||||
|
- codigo: FRACTURADO
|
||||||
|
nombre: "Fracturado"
|
||||||
|
color: "#795548"
|
||||||
|
descripcion: "Pieza fracturada"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. API ENDPOINTS
|
||||||
|
|
||||||
|
### Odontograma
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
endpoints:
|
||||||
|
- method: GET
|
||||||
|
path: /api/v1/pacientes/{pacienteId}/odontograma
|
||||||
|
descripcion: "Obtener odontograma actual"
|
||||||
|
response: Odontograma con todas las piezas
|
||||||
|
|
||||||
|
- method: POST
|
||||||
|
path: /api/v1/pacientes/{pacienteId}/odontograma
|
||||||
|
descripcion: "Crear nuevo odontograma"
|
||||||
|
body:
|
||||||
|
tipo: string (adulto|deciduo|mixto)
|
||||||
|
notas_generales: string (opcional)
|
||||||
|
response: Odontograma creado
|
||||||
|
|
||||||
|
- method: PUT
|
||||||
|
path: /api/v1/odontogramas/{odontogramaId}
|
||||||
|
descripcion: "Actualizar odontograma"
|
||||||
|
body:
|
||||||
|
notas_generales: string
|
||||||
|
response: Odontograma actualizado
|
||||||
|
```
|
||||||
|
|
||||||
|
### Piezas Dentales
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
endpoints:
|
||||||
|
- method: GET
|
||||||
|
path: /api/v1/odontogramas/{odontogramaId}/piezas
|
||||||
|
descripcion: "Obtener todas las piezas"
|
||||||
|
response: Array de piezas
|
||||||
|
|
||||||
|
- method: GET
|
||||||
|
path: /api/v1/odontogramas/{odontogramaId}/piezas/{numeroPieza}
|
||||||
|
descripcion: "Obtener pieza especifica"
|
||||||
|
response: Pieza con historial
|
||||||
|
|
||||||
|
- method: PUT
|
||||||
|
path: /api/v1/odontogramas/{odontogramaId}/piezas/{numeroPieza}
|
||||||
|
descripcion: "Actualizar estado de pieza"
|
||||||
|
body:
|
||||||
|
estado: string
|
||||||
|
caras_afectadas: string[]
|
||||||
|
movilidad: number (0-3)
|
||||||
|
sensibilidad: boolean
|
||||||
|
notas: string
|
||||||
|
motivo: string
|
||||||
|
response: Pieza actualizada + entrada en historial
|
||||||
|
|
||||||
|
- method: GET
|
||||||
|
path: /api/v1/piezas/{piezaId}/historial
|
||||||
|
descripcion: "Historial de cambios de pieza"
|
||||||
|
query:
|
||||||
|
desde: date
|
||||||
|
hasta: date
|
||||||
|
response: Array de cambios
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. FLUJOS DE USUARIO
|
||||||
|
|
||||||
|
### 6.1 Crear Odontograma Inicial
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente nuevo o sin odontograma
|
||||||
|
2. Odontologo abre pantalla de odontograma
|
||||||
|
3. Sistema detecta que no existe → muestra dialogo
|
||||||
|
4. Selecciona tipo: Adulto / Deciduo / Mixto
|
||||||
|
5. Sistema crea odontograma con 32/20 piezas en estado SANO
|
||||||
|
6. Odontologo realiza exploracion
|
||||||
|
7. Marca cada pieza segun estado actual
|
||||||
|
8. Guarda odontograma
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 Actualizar Estado de Pieza
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo abre odontograma existente
|
||||||
|
2. Click en pieza a modificar
|
||||||
|
3. Panel lateral muestra estado actual + historial
|
||||||
|
4. Selecciona nuevo estado del dropdown
|
||||||
|
5. Marca caras afectadas (checkboxes)
|
||||||
|
6. Agrega notas (opcional)
|
||||||
|
7. Indica motivo del cambio
|
||||||
|
8. Guarda cambios
|
||||||
|
9. Sistema registra en historial
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 Comparar Odontogramas
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Odontologo solicita comparacion
|
||||||
|
2. Selecciona dos fechas
|
||||||
|
3. Sistema muestra lado a lado
|
||||||
|
4. Resalta piezas con cambios
|
||||||
|
5. Permite ver detalle de cada cambio
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. COMPONENTES UI
|
||||||
|
|
||||||
|
### 7.1 OdontogramaView
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface OdontogramaViewProps {
|
||||||
|
pacienteId: string;
|
||||||
|
readOnly?: boolean;
|
||||||
|
onPiezaClick?: (pieza: PiezaDental) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Estados visuales
|
||||||
|
const COLORES_ESTADO: Record<EstadoPieza, string> = {
|
||||||
|
sano: '#4CAF50',
|
||||||
|
caries: '#F44336',
|
||||||
|
obturacion_resina: '#2196F3',
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 PiezaDentalComponent
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface PiezaDentalProps {
|
||||||
|
numero: number;
|
||||||
|
estado: EstadoPieza;
|
||||||
|
carasAfectadas: string[];
|
||||||
|
selected: boolean;
|
||||||
|
onClick: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Renderiza SVG de pieza con colores por estado
|
||||||
|
// Marca visual de caras afectadas
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 HistorialPiezaPanel
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface HistorialPiezaPanelProps {
|
||||||
|
piezaId: string;
|
||||||
|
onClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Muestra timeline de cambios
|
||||||
|
// Permite filtrar por fecha
|
||||||
|
// Link a tratamientos relacionados
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. VALIDACIONES
|
||||||
|
|
||||||
|
### Reglas de Negocio
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
validaciones:
|
||||||
|
- regla: "Pieza ausente no puede tener caras afectadas"
|
||||||
|
condicion: estado == 'ausente' AND caras_afectadas.length > 0
|
||||||
|
error: "Una pieza ausente no puede tener caras afectadas"
|
||||||
|
|
||||||
|
- regla: "Corona cubre todas las caras"
|
||||||
|
condicion: estado == 'corona' AND caras_afectadas != ['M','D','O','V','L']
|
||||||
|
accion: "Auto-completar todas las caras"
|
||||||
|
|
||||||
|
- regla: "Numero de pieza valido"
|
||||||
|
condicion: NOT (numero IN rango_valido)
|
||||||
|
error: "Numero de pieza dental invalido"
|
||||||
|
|
||||||
|
- regla: "Implante requiere pieza ausente previa"
|
||||||
|
condicion: estado == 'implante' AND estado_anterior != 'ausente'
|
||||||
|
warning: "Normalmente se coloca implante en espacio de pieza ausente"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. CASOS DE USO
|
||||||
|
|
||||||
|
### CU-ODT-001: Exploración Inicial
|
||||||
|
|
||||||
|
**Actor:** Odontólogo
|
||||||
|
**Precondición:** Paciente registrado sin odontograma
|
||||||
|
**Flujo:**
|
||||||
|
1. Abrir expediente del paciente
|
||||||
|
2. Ir a sección Odontograma
|
||||||
|
3. Crear nuevo odontograma (tipo adulto)
|
||||||
|
4. Realizar exploración pieza por pieza
|
||||||
|
5. Marcar estados encontrados
|
||||||
|
6. Guardar odontograma
|
||||||
|
|
||||||
|
**Postcondición:** Odontograma creado con estado inicial
|
||||||
|
|
||||||
|
### CU-ODT-002: Registrar Tratamiento
|
||||||
|
|
||||||
|
**Actor:** Odontólogo
|
||||||
|
**Precondición:** Odontograma existente, tratamiento a realizar
|
||||||
|
**Flujo:**
|
||||||
|
1. Abrir odontograma del paciente
|
||||||
|
2. Seleccionar pieza tratada
|
||||||
|
3. Cambiar estado (ej: caries → obturación_resina)
|
||||||
|
4. Marcar caras tratadas
|
||||||
|
5. Vincular con tratamiento
|
||||||
|
6. Guardar cambios
|
||||||
|
|
||||||
|
**Postcondición:** Estado actualizado, historial registrado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. DEPENDENCIAS
|
||||||
|
|
||||||
|
### Depende de
|
||||||
|
- `clinicas.pacientes` - Paciente al que pertenece
|
||||||
|
- `core.usuarios` - Odontólogo que registra
|
||||||
|
- `dental.tratamientos` - Vinculación de cambios
|
||||||
|
|
||||||
|
### Dependientes
|
||||||
|
- `dental.tratamientos` - Referencia piezas afectadas
|
||||||
|
- `dental.presupuestos` - Calcula costos por pieza
|
||||||
|
- `reportes` - Estadísticas de salud dental
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Documento creado:** 2026-01-07
|
||||||
|
**Autor:** Agente Orquestador Workspace
|
||||||
|
**Version:** 1.0.0
|
||||||
34
docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml
Normal file
34
docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# TRACEABILITY-MASTER.yml v2.0
|
||||||
|
# Proyecto: Clinica Dental
|
||||||
|
# Prefijo v2: CDN
|
||||||
|
|
||||||
|
traceability_version: "2.0"
|
||||||
|
|
||||||
|
project:
|
||||||
|
code: "CDN"
|
||||||
|
name: "Clinica Dental - Sistema de Gestion para Clinicas Dentales"
|
||||||
|
updated: "2026-01-10"
|
||||||
|
|
||||||
|
epics_summary:
|
||||||
|
total: 0
|
||||||
|
completed: 0
|
||||||
|
in_progress: 0
|
||||||
|
planned: 0
|
||||||
|
|
||||||
|
nomenclature_mapping:
|
||||||
|
legacy: "CDN-EP"
|
||||||
|
|
||||||
|
epics: []
|
||||||
|
|
||||||
|
dependency_graph: {}
|
||||||
|
|
||||||
|
inventories:
|
||||||
|
master: "docs/90-transversal/inventarios/"
|
||||||
|
|
||||||
|
health:
|
||||||
|
last_validated: "2026-01-10"
|
||||||
|
score: 0.50
|
||||||
|
issues:
|
||||||
|
- severity: "low"
|
||||||
|
type: "initialization"
|
||||||
|
description: "Proyecto en migracion inicial v2"
|
||||||
137
docs/_MAP.md
Normal file
137
docs/_MAP.md
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
# Clinica Dental - Mapa de Documentacion
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Tipo:** ERP Especializado (hereda de erp-clinicas)
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
**Estado:** Fase 0 - Preparacion
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estructura de Documentacion
|
||||||
|
|
||||||
|
```
|
||||||
|
docs/
|
||||||
|
├── _MAP.md <- ESTE ARCHIVO
|
||||||
|
├── 00-vision-general/
|
||||||
|
│ ├── README.md <- Indice de vision
|
||||||
|
│ └── VISION.md <- Vision estrategica [PENDIENTE]
|
||||||
|
│
|
||||||
|
├── 02-definicion-modulos/
|
||||||
|
│ ├── _MAP.md <- Indice de modulos [PENDIENTE]
|
||||||
|
│ ├── modulo-odontograma.md <- Odontograma digital [PENDIENTE]
|
||||||
|
│ ├── modulo-tratamientos.md <- Tratamientos dentales [PENDIENTE]
|
||||||
|
│ ├── modulo-ortodoncia.md <- Control ortodoncia [PENDIENTE]
|
||||||
|
│ ├── modulo-protesis.md <- Trabajos protesicos [PENDIENTE]
|
||||||
|
│ ├── modulo-endodoncia.md <- Tratamientos conductos [PENDIENTE]
|
||||||
|
│ ├── modulo-periodoncia.md <- Enfermedad periodontal [PENDIENTE]
|
||||||
|
│ ├── modulo-prevencion.md <- Profilaxis, selladores [PENDIENTE]
|
||||||
|
│ └── modulo-estetica.md <- Blanqueamiento, carillas [PENDIENTE]
|
||||||
|
│
|
||||||
|
├── 03-especificaciones/
|
||||||
|
│ └── ... (futuras especificaciones tecnicas)
|
||||||
|
│
|
||||||
|
└── 90-transversal/
|
||||||
|
└── ... (documentacion transversal)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modulos Especializados (Odontologia)
|
||||||
|
|
||||||
|
### Modulos Core
|
||||||
|
|
||||||
|
| Modulo | Prioridad | Estado | Descripcion |
|
||||||
|
|--------|-----------|--------|-------------|
|
||||||
|
| Odontograma | P1 | Pendiente | Registro grafico del estado dental |
|
||||||
|
| Tratamientos | P1 | Pendiente | Gestion de procedimientos dentales |
|
||||||
|
| Prevencion | P1 | Pendiente | Limpiezas, selladores, fluor |
|
||||||
|
| Restauracion | P1 | Pendiente | Resinas, amalgamas, incrustaciones |
|
||||||
|
|
||||||
|
### Modulos Especializados
|
||||||
|
|
||||||
|
| Modulo | Prioridad | Estado | Descripcion |
|
||||||
|
|--------|-----------|--------|-------------|
|
||||||
|
| Ortodoncia | P2 | Pendiente | Brackets, alineadores, retenedores |
|
||||||
|
| Protesis | P2 | Pendiente | Coronas, puentes, dentaduras |
|
||||||
|
| Endodoncia | P2 | Pendiente | Tratamientos de conductos |
|
||||||
|
| Periodoncia | P2 | Pendiente | Raspados, cirugia periodontal |
|
||||||
|
| Estetica | P2 | Pendiente | Blanqueamiento, carillas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modulos Heredados (de erp-clinicas)
|
||||||
|
|
||||||
|
| Modulo | Fuente | Adaptacion Requerida |
|
||||||
|
|--------|--------|----------------------|
|
||||||
|
| Pacientes | erp-clinicas | Ninguna |
|
||||||
|
| Expedientes | erp-clinicas | Agregar odontograma |
|
||||||
|
| Citas | erp-clinicas | Ninguna |
|
||||||
|
| Consultas | erp-clinicas | Agregar exploracion dental |
|
||||||
|
| Recetas | erp-clinicas | Ninguna |
|
||||||
|
| Facturacion | erp-core | Ninguna |
|
||||||
|
| Inventario | erp-core | Materiales dentales |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Entidades Especificas
|
||||||
|
|
||||||
|
### Odontograma
|
||||||
|
Registro grafico del estado dental del paciente.
|
||||||
|
|
||||||
|
```
|
||||||
|
Nomenclatura FDI:
|
||||||
|
- Cuadrante 1: Superior derecho (11-18)
|
||||||
|
- Cuadrante 2: Superior izquierdo (21-28)
|
||||||
|
- Cuadrante 3: Inferior izquierdo (31-38)
|
||||||
|
- Cuadrante 4: Inferior derecho (41-48)
|
||||||
|
- Deciduos: 51-55, 61-65, 71-75, 81-85
|
||||||
|
```
|
||||||
|
|
||||||
|
### Estados de Piezas
|
||||||
|
- Sano
|
||||||
|
- Caries
|
||||||
|
- Obturacion (resina/amalgama)
|
||||||
|
- Endodoncia
|
||||||
|
- Corona
|
||||||
|
- Puente
|
||||||
|
- Implante
|
||||||
|
- Ausente
|
||||||
|
- Extraccion indicada
|
||||||
|
|
||||||
|
### Caras Dentales
|
||||||
|
- Mesial (M)
|
||||||
|
- Distal (D)
|
||||||
|
- Oclusal/Incisal (O/I)
|
||||||
|
- Vestibular/Bucal (V/B)
|
||||||
|
- Lingual/Palatino (L/P)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Navegacion Rapida
|
||||||
|
|
||||||
|
### Por Rol de Usuario
|
||||||
|
- **Odontologo:** Consultas, diagnosticos, tratamientos
|
||||||
|
- **Auxiliar dental:** Apoyo en procedimientos
|
||||||
|
- **Recepcionista:** Citas, cobros
|
||||||
|
- **Higienista:** Limpiezas, profilaxis
|
||||||
|
- **Tecnico dental:** Elaboracion de protesis
|
||||||
|
- **Administrador:** Gestion general
|
||||||
|
|
||||||
|
### Por Componente Tecnico
|
||||||
|
- **Database:** Ver orchestration/inventarios/DATABASE_INVENTORY.yml
|
||||||
|
- **Backend:** Ver orchestration/inventarios/BACKEND_INVENTORY.yml
|
||||||
|
- **Frontend:** Ver orchestration/inventarios/FRONTEND_INVENTORY.yml
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referencias
|
||||||
|
|
||||||
|
- [CONTEXTO-PROYECTO.md](../orchestration/00-guidelines/CONTEXTO-PROYECTO.md)
|
||||||
|
- [HERENCIA-ERP-CLINICAS.md](../orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md)
|
||||||
|
- [PROXIMA-ACCION.md](../orchestration/PROXIMA-ACCION.md)
|
||||||
|
- [CONTEXT-MAP.yml](../orchestration/CONTEXT-MAP.yml)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
|
**Version:** 1.0.0
|
||||||
162
orchestration/00-guidelines/CONTEXTO-PROYECTO.md
Normal file
162
orchestration/00-guidelines/CONTEXTO-PROYECTO.md
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
# Contexto del Proyecto - Clínica Dental
|
||||||
|
|
||||||
|
## 1. Información General
|
||||||
|
|
||||||
|
| Campo | Valor |
|
||||||
|
|-------|-------|
|
||||||
|
| **Nombre:** | Clínica Dental |
|
||||||
|
| **Tipo:** | ERP Especializado |
|
||||||
|
| **Giro:** | Servicios Odontológicos |
|
||||||
|
| **Base:** | erp-clinicas |
|
||||||
|
| **Fecha creación:** | 2026-01-04 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Descripción del Negocio
|
||||||
|
|
||||||
|
Sistema de gestión integral para clínicas dentales que incluye:
|
||||||
|
|
||||||
|
- **Gestión de pacientes:** Expedientes con odontograma
|
||||||
|
- **Consultas dentales:** Diagnóstico, tratamientos
|
||||||
|
- **Odontograma digital:** Estado de cada pieza dental
|
||||||
|
- **Tratamientos:** Seguimiento de procedimientos
|
||||||
|
- **Ortodoncia:** Control de tratamientos ortodónticos
|
||||||
|
- **Prótesis:** Registro de trabajos protésicos
|
||||||
|
- **Presupuestos:** Planes de tratamiento con costos
|
||||||
|
- **Inventario:** Materiales dentales
|
||||||
|
- **Facturación:** Cobro de servicios
|
||||||
|
|
||||||
|
## 3. Usuarios del Sistema
|
||||||
|
|
||||||
|
| Rol | Funciones |
|
||||||
|
|-----|-----------|
|
||||||
|
| Odontólogo | Consultas, diagnósticos, tratamientos |
|
||||||
|
| Auxiliar dental | Apoyo en procedimientos |
|
||||||
|
| Recepcionista | Citas, cobros |
|
||||||
|
| Higienista | Limpiezas, profilaxis |
|
||||||
|
| Técnico dental | Elaboración de prótesis |
|
||||||
|
| Administrador | Gestión general |
|
||||||
|
|
||||||
|
## 4. Procesos Principales
|
||||||
|
|
||||||
|
### 4.1 Flujo de Consulta Dental
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Paciente llega / se verifica cita
|
||||||
|
2. Recepción registra llegada
|
||||||
|
3. Revisión de odontograma previo
|
||||||
|
4. Odontólogo realiza exploración
|
||||||
|
5. Actualización de odontograma
|
||||||
|
6. Diagnóstico y plan de tratamiento
|
||||||
|
7. Presupuesto (si es necesario)
|
||||||
|
8. Procedimiento (si aplica)
|
||||||
|
9. Próxima cita
|
||||||
|
10. Cobro en recepción
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Flujo de Ortodoncia
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Consulta de valoración
|
||||||
|
2. Estudios (Rx, fotos, modelos)
|
||||||
|
3. Plan de tratamiento
|
||||||
|
4. Presupuesto y financiamiento
|
||||||
|
5. Colocación de aparatología
|
||||||
|
6. Citas de control (mensual)
|
||||||
|
7. Retiro de aparatología
|
||||||
|
8. Colocación de retenedores
|
||||||
|
9. Citas de revisión
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Entidades Principales
|
||||||
|
|
||||||
|
### 5.1 Odontograma
|
||||||
|
|
||||||
|
El odontograma es el registro gráfico del estado dental:
|
||||||
|
|
||||||
|
| Campo | Descripción |
|
||||||
|
|-------|-------------|
|
||||||
|
| Pieza | Número de diente (1-32 o deciduos) |
|
||||||
|
| Estado | Sano, caries, extracción, etc. |
|
||||||
|
| Caras afectadas | Mesial, Distal, Oclusal, etc. |
|
||||||
|
| Tratamientos | Historial de procedimientos |
|
||||||
|
|
||||||
|
### 5.2 Nomenclatura Dental
|
||||||
|
|
||||||
|
**Sistema FDI (dos dígitos):**
|
||||||
|
- Cuadrante 1: Superior derecho (11-18)
|
||||||
|
- Cuadrante 2: Superior izquierdo (21-28)
|
||||||
|
- Cuadrante 3: Inferior izquierdo (31-38)
|
||||||
|
- Cuadrante 4: Inferior derecho (41-48)
|
||||||
|
|
||||||
|
**Dientes deciduos:**
|
||||||
|
- Cuadrantes 5-8 (51-55, 61-65, 71-75, 81-85)
|
||||||
|
|
||||||
|
### 5.3 Tratamientos Comunes
|
||||||
|
|
||||||
|
| Categoría | Tratamientos |
|
||||||
|
|-----------|-------------|
|
||||||
|
| Prevención | Limpieza, selladores, fluoruro |
|
||||||
|
| Restauración | Resinas, amalgamas, incrustaciones |
|
||||||
|
| Endodoncia | Tratamiento de conductos |
|
||||||
|
| Periodoncia | Raspados, cirugía periodontal |
|
||||||
|
| Cirugía | Extracciones, implantes |
|
||||||
|
| Prótesis | Coronas, puentes, dentaduras |
|
||||||
|
| Ortodoncia | Brackets, alineadores |
|
||||||
|
| Estética | Blanqueamiento, carillas |
|
||||||
|
|
||||||
|
## 6. Catálogos Específicos
|
||||||
|
|
||||||
|
### 6.1 Especialidades Odontológicas
|
||||||
|
|
||||||
|
- Odontología General
|
||||||
|
- Ortodoncia
|
||||||
|
- Endodoncia
|
||||||
|
- Periodoncia
|
||||||
|
- Cirugía Maxilofacial
|
||||||
|
- Odontopediatría
|
||||||
|
- Prostodoncia
|
||||||
|
- Estética Dental
|
||||||
|
- Implantología
|
||||||
|
|
||||||
|
### 6.2 Estados de Piezas Dentales
|
||||||
|
|
||||||
|
- Sano
|
||||||
|
- Caries
|
||||||
|
- Obturación (resina/amalgama)
|
||||||
|
- Endodoncia
|
||||||
|
- Corona
|
||||||
|
- Puente
|
||||||
|
- Implante
|
||||||
|
- Ausente
|
||||||
|
- Extracción indicada
|
||||||
|
|
||||||
|
### 6.3 Caras Dentales
|
||||||
|
|
||||||
|
- Mesial (M)
|
||||||
|
- Distal (D)
|
||||||
|
- Oclusal/Incisal (O/I)
|
||||||
|
- Vestibular/Bucal (V/B)
|
||||||
|
- Lingual/Palatino (L/P)
|
||||||
|
|
||||||
|
## 7. Integraciones
|
||||||
|
|
||||||
|
| Sistema | Propósito |
|
||||||
|
|---------|-----------|
|
||||||
|
| Radiografías digitales | Captura de Rx periapicales, panorámicas |
|
||||||
|
| Laboratorio dental | Pedidos de prótesis |
|
||||||
|
| Proveedores | Materiales dentales |
|
||||||
|
|
||||||
|
## 8. Métricas Clave
|
||||||
|
|
||||||
|
| Métrica | Descripción |
|
||||||
|
|---------|-------------|
|
||||||
|
| Consultas/día | Número de pacientes atendidos |
|
||||||
|
| Tratamientos completados | Planes terminados |
|
||||||
|
| Tasa retención ortodoncia | Pacientes que completan tratamiento |
|
||||||
|
| Ticket promedio | Ingreso por paciente |
|
||||||
|
| Ocupación unidades | Uso de sillones dentales |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Última actualización:** 2026-01-04
|
||||||
116
orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md
Normal file
116
orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# Herencia ERP-Clínicas - Clínica Dental
|
||||||
|
|
||||||
|
## Información del Proyecto
|
||||||
|
|
||||||
|
| Campo | Valor |
|
||||||
|
|-------|-------|
|
||||||
|
| **Proyecto:** | clinica-dental |
|
||||||
|
| **Hereda de:** | erp-clinicas |
|
||||||
|
| **Fecha creación:** | 2026-01-04 |
|
||||||
|
| **Versión ERP-Clínicas:** | 1.0 FASE-8 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Relación de Herencia
|
||||||
|
|
||||||
|
```
|
||||||
|
erp-core (FASE-8)
|
||||||
|
└── erp-clinicas (Base Genérica)
|
||||||
|
└── clinica-dental (Especialización)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Qué Se Hereda de ERP-Clínicas
|
||||||
|
|
||||||
|
### 2.1 Schemas y Tablas
|
||||||
|
|
||||||
|
| Schema | Tablas | Heredadas |
|
||||||
|
|--------|--------|-----------|
|
||||||
|
| clinica | 13 tablas base | ✅ |
|
||||||
|
| financial | 4 tablas FASE-8 | ✅ |
|
||||||
|
| hr | 11 tablas FASE-8 | ✅ |
|
||||||
|
| inventory | 5 tablas FASE-8 | ✅ |
|
||||||
|
| purchase | 1 tabla FASE-8 | ✅ |
|
||||||
|
|
||||||
|
### 2.2 Funcionalidades Heredadas
|
||||||
|
|
||||||
|
- Sistema de citas y consultas
|
||||||
|
- Expedientes clínicos
|
||||||
|
- Gestión de pacientes
|
||||||
|
- Sistema de prescripciones
|
||||||
|
- Gestión de personal (odontólogos)
|
||||||
|
- Inventario de materiales
|
||||||
|
- Pagos y facturación
|
||||||
|
|
||||||
|
## 3. Especializaciones Dentales
|
||||||
|
|
||||||
|
### 3.1 Adaptaciones de Terminología
|
||||||
|
|
||||||
|
| ERP-Clínicas | Dental |
|
||||||
|
|--------------|--------|
|
||||||
|
| Médico | Odontólogo |
|
||||||
|
| Especialidad Médica | Especialidad Odontológica |
|
||||||
|
| Consulta | Consulta Dental |
|
||||||
|
| Receta | Receta Dental |
|
||||||
|
| Consultorio | Consultorio Dental/Unidad |
|
||||||
|
|
||||||
|
### 3.2 Tablas Adicionales
|
||||||
|
|
||||||
|
| Tabla | Propósito |
|
||||||
|
|-------|-----------|
|
||||||
|
| dental.odontograma | Estado dental del paciente |
|
||||||
|
| dental.piezas_dentales | Catálogo de piezas dentales |
|
||||||
|
| dental.tratamientos | Catálogo de tratamientos dentales |
|
||||||
|
| dental.tratamientos_paciente | Tratamientos realizados |
|
||||||
|
| dental.ortodoncia | Seguimiento de ortodoncia |
|
||||||
|
| dental.protesis | Registro de prótesis |
|
||||||
|
| dental.radiografias | Registro de radiografías |
|
||||||
|
| dental.presupuestos | Presupuestos de tratamiento |
|
||||||
|
|
||||||
|
### 3.3 Campos Adicionales
|
||||||
|
|
||||||
|
| Tabla Base | Campos Dental |
|
||||||
|
|------------|---------------|
|
||||||
|
| patients | odontograma_id, tiene_ortodoncia, tiene_protesis |
|
||||||
|
| consultations | tratamiento_id, pieza_dental, procedimiento |
|
||||||
|
| prescriptions | uso_dental, indicaciones_especiales |
|
||||||
|
|
||||||
|
## 4. Normativa Aplicable
|
||||||
|
|
||||||
|
| Normativa | Descripción |
|
||||||
|
|-----------|-------------|
|
||||||
|
| NOM-013-SSA2-2015 | Prevención y control enfermedades bucales |
|
||||||
|
| NOM-004-SSA3-2012 | Expediente clínico |
|
||||||
|
| COFEPRIS | Registro de establecimientos |
|
||||||
|
|
||||||
|
## 5. Instalación
|
||||||
|
|
||||||
|
### 5.1 Orden de Ejecución
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Base ERP-Clínicas (heredado)
|
||||||
|
psql -f erp-clinicas/database/init/01-extensions.sql
|
||||||
|
psql -f erp-clinicas/database/init/02-core-schema.sql
|
||||||
|
psql -f erp-clinicas/database/init/03-clinical-tables.sql
|
||||||
|
psql -f erp-clinicas/database/schemas/04-financial-ext-schema-ddl.sql
|
||||||
|
psql -f erp-clinicas/database/schemas/05-hr-ext-fase8-schema-ddl.sql
|
||||||
|
psql -f erp-clinicas/database/schemas/06-inventory-ext-fase8-schema-ddl.sql
|
||||||
|
psql -f erp-clinicas/database/schemas/07-purchase-ext-fase8-schema-ddl.sql
|
||||||
|
psql -f erp-clinicas/database/schemas/08-clinica-ext-fase8-schema-ddl.sql
|
||||||
|
|
||||||
|
# 2. Especialización Dental
|
||||||
|
psql -f clinica-dental/database/schemas/01-dental-schema-ddl.sql
|
||||||
|
|
||||||
|
# 3. Seeds
|
||||||
|
psql -f erp-clinicas/database/seeds/fase8/*.sql
|
||||||
|
psql -f clinica-dental/database/seeds/fase8/*.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Versionado
|
||||||
|
|
||||||
|
| Versión | Fecha | Cambios |
|
||||||
|
|---------|-------|---------|
|
||||||
|
| 1.0 | 2026-01-04 | Creación inicial, herencia de erp-clinicas FASE-8 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Última actualización:** 2026-01-04
|
||||||
301
orchestration/CONTEXT-MAP.yml
Normal file
301
orchestration/CONTEXT-MAP.yml
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
# CONTEXT-MAP: CLINICA-DENTAL
|
||||||
|
# Sistema: SIMCO - NEXUS v4.0
|
||||||
|
# Proposito: Mapear contexto automatico por nivel y tarea
|
||||||
|
# Version: 1.0.0
|
||||||
|
# Fecha: 2026-01-07
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
proyecto: "clinica-dental"
|
||||||
|
nivel: "VERTICAL"
|
||||||
|
version: "1.0.0"
|
||||||
|
ultima_actualizacion: "2026-01-07"
|
||||||
|
workspace_root: "/home/isem/workspace-v1"
|
||||||
|
project_root: "/home/isem/workspace-v1/projects/clinica-dental"
|
||||||
|
hereda_de: "/home/isem/workspace-v1/projects/erp-clinicas"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# VARIABLES DEL PROYECTO (PRE-RESUELTAS)
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
variables:
|
||||||
|
# Identificacion
|
||||||
|
PROJECT: "clinica-dental"
|
||||||
|
PROJECT_NAME: "CLINICA-DENTAL"
|
||||||
|
PROJECT_LEVEL: "VERTICAL"
|
||||||
|
PARENT_PROJECT: "erp-clinicas"
|
||||||
|
|
||||||
|
# Base de datos
|
||||||
|
DB_NAME: "clinica_dental"
|
||||||
|
DB_DDL_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database/schemas"
|
||||||
|
DB_SCRIPTS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database"
|
||||||
|
DB_SEEDS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/database/seeds"
|
||||||
|
RECREATE_CMD: "drop-and-recreate-database.sh"
|
||||||
|
|
||||||
|
# Backend
|
||||||
|
BACKEND_ROOT: "/home/isem/workspace-v1/projects/clinica-dental/backend"
|
||||||
|
BACKEND_SRC: "/home/isem/workspace-v1/projects/clinica-dental/backend/src"
|
||||||
|
BACKEND_TESTS: "/home/isem/workspace-v1/projects/clinica-dental/backend/tests"
|
||||||
|
|
||||||
|
# Frontend
|
||||||
|
FRONTEND_ROOT: "/home/isem/workspace-v1/projects/clinica-dental/frontend"
|
||||||
|
FRONTEND_SRC: "/home/isem/workspace-v1/projects/clinica-dental/frontend/src"
|
||||||
|
|
||||||
|
# Documentacion
|
||||||
|
DOCS_PATH: "/home/isem/workspace-v1/projects/clinica-dental/docs"
|
||||||
|
ORCHESTRATION_PATH: "/home/isem/workspace-v1/projects/clinica-dental/orchestration"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# ALIASES RESUELTOS
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
aliases:
|
||||||
|
# Directivas globales
|
||||||
|
"@SIMCO": "/home/isem/workspace-v1/orchestration/directivas/simco"
|
||||||
|
"@PRINCIPIOS": "/home/isem/workspace-v1/orchestration/directivas/principios"
|
||||||
|
"@PERFILES": "/home/isem/workspace-v1/orchestration/agents/perfiles"
|
||||||
|
"@CATALOG": "/home/isem/workspace-v1/shared/catalog"
|
||||||
|
|
||||||
|
# Proyecto padre (erp-clinicas)
|
||||||
|
"@PARENT": "/home/isem/workspace-v1/projects/erp-clinicas"
|
||||||
|
"@PARENT_CORE": "/home/isem/workspace-v1/projects/erp-core"
|
||||||
|
|
||||||
|
# Proyecto especifico
|
||||||
|
"@DDL": "/home/isem/workspace-v1/projects/clinica-dental/database/schemas"
|
||||||
|
"@SEEDS": "/home/isem/workspace-v1/projects/clinica-dental/database/seeds"
|
||||||
|
"@BACKEND": "/home/isem/workspace-v1/projects/clinica-dental/backend/src"
|
||||||
|
"@FRONTEND": "/home/isem/workspace-v1/projects/clinica-dental/frontend/src"
|
||||||
|
"@DOCS": "/home/isem/workspace-v1/projects/clinica-dental/docs"
|
||||||
|
|
||||||
|
# Inventarios
|
||||||
|
"@INVENTORY": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios"
|
||||||
|
"@INV_DB": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/DATABASE_INVENTORY.yml"
|
||||||
|
"@INV_BE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/BACKEND_INVENTORY.yml"
|
||||||
|
"@INV_FE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/FRONTEND_INVENTORY.yml"
|
||||||
|
|
||||||
|
# Trazas
|
||||||
|
"@TRAZA_DB": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-DATABASE.md"
|
||||||
|
"@TRAZA_BE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-BACKEND.md"
|
||||||
|
"@TRAZA_FE": "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/TRAZA-TAREAS-FRONTEND.md"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# CONTEXTO POR NIVEL
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
contexto_por_nivel:
|
||||||
|
L0_sistema:
|
||||||
|
descripcion: "Principios fundamentales y perfil de agente"
|
||||||
|
tokens_estimados: 4500
|
||||||
|
obligatorio: true
|
||||||
|
archivos:
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-CAPVED.md"
|
||||||
|
proposito: "Ciclo de vida de tareas"
|
||||||
|
tokens: 800
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-DOC-PRIMERO.md"
|
||||||
|
proposito: "Documentacion antes de codigo"
|
||||||
|
tokens: 500
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ANTI-DUPLICACION.md"
|
||||||
|
proposito: "Verificar catalogo antes de crear"
|
||||||
|
tokens: 600
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-VALIDACION-OBLIGATORIA.md"
|
||||||
|
proposito: "Build/lint deben pasar"
|
||||||
|
tokens: 600
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ECONOMIA-TOKENS.md"
|
||||||
|
proposito: "Limites de contexto"
|
||||||
|
tokens: 500
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-NO-ASUMIR.md"
|
||||||
|
proposito: "Preguntar si falta informacion"
|
||||||
|
tokens: 500
|
||||||
|
- path: "/home/isem/workspace-v1/orchestration/referencias/ALIASES.yml"
|
||||||
|
proposito: "Resolucion de @ALIAS"
|
||||||
|
tokens: 400
|
||||||
|
|
||||||
|
L1_proyecto:
|
||||||
|
descripcion: "Contexto especifico de CLINICA-DENTAL"
|
||||||
|
tokens_estimados: 3000
|
||||||
|
obligatorio: true
|
||||||
|
archivos:
|
||||||
|
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/00-guidelines/CONTEXTO-PROYECTO.md"
|
||||||
|
proposito: "Variables y configuracion del proyecto"
|
||||||
|
tokens: 1500
|
||||||
|
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/PROXIMA-ACCION.md"
|
||||||
|
proposito: "Estado actual y siguiente paso"
|
||||||
|
tokens: 500
|
||||||
|
- path: "/home/isem/workspace-v1/projects/clinica-dental/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md"
|
||||||
|
proposito: "Herencia de modulos del padre"
|
||||||
|
tokens: 800
|
||||||
|
|
||||||
|
L2_operacion:
|
||||||
|
descripcion: "SIMCO especificos segun operacion y dominio"
|
||||||
|
tokens_estimados: 2500
|
||||||
|
archivos_por_operacion:
|
||||||
|
CREAR:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-CREAR.md"
|
||||||
|
MODIFICAR:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-MODIFICAR.md"
|
||||||
|
VALIDAR:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-VALIDAR.md"
|
||||||
|
DELEGAR:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DELEGACION.md"
|
||||||
|
archivos_por_dominio:
|
||||||
|
DDL:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DDL.md"
|
||||||
|
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/DATABASE_INVENTORY.yml"
|
||||||
|
BACKEND:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-BACKEND.md"
|
||||||
|
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/BACKEND_INVENTORY.yml"
|
||||||
|
FRONTEND:
|
||||||
|
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-FRONTEND.md"
|
||||||
|
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/inventarios/FRONTEND_INVENTORY.yml"
|
||||||
|
|
||||||
|
L3_tarea:
|
||||||
|
descripcion: "Contexto especifico de la tarea"
|
||||||
|
tokens_max: 8000
|
||||||
|
dinamico: true
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# INTEGRACION CON DOCUMENTACION (docs/)
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
integracion_docs:
|
||||||
|
mapa_docs: "@DOCS/_MAP.md"
|
||||||
|
|
||||||
|
estructura:
|
||||||
|
vision: "@DOCS/00-vision-general/"
|
||||||
|
modulos: "@DOCS/02-definicion-modulos/"
|
||||||
|
|
||||||
|
modulos_especializados:
|
||||||
|
- modulo_odontograma:
|
||||||
|
descripcion: "Registro grafico del estado dental"
|
||||||
|
ruta: "@DOCS/02-definicion-modulos/modulo-odontograma.md"
|
||||||
|
- modulo_tratamientos:
|
||||||
|
descripcion: "Gestion de tratamientos dentales"
|
||||||
|
ruta: "@DOCS/02-definicion-modulos/modulo-tratamientos.md"
|
||||||
|
- modulo_ortodoncia:
|
||||||
|
descripcion: "Control de tratamientos ortodonticos"
|
||||||
|
ruta: "@DOCS/02-definicion-modulos/modulo-ortodoncia.md"
|
||||||
|
- modulo_protesis:
|
||||||
|
descripcion: "Registro de trabajos protesicos"
|
||||||
|
ruta: "@DOCS/02-definicion-modulos/modulo-protesis.md"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# MAPA TAREA -> ARCHIVOS (Especifico CLINICA-DENTAL)
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
mapa_tarea_contexto:
|
||||||
|
database:
|
||||||
|
crear_tabla:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
|
||||||
|
inventario: "@INV_DB"
|
||||||
|
referencia: "@DDL/*.sql"
|
||||||
|
docs: "@DOCS/02-definicion-modulos/"
|
||||||
|
|
||||||
|
crear_odontograma:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
|
||||||
|
inventario: "@INV_DB"
|
||||||
|
referencia: "@DDL/01-dental-schema-ddl.sql"
|
||||||
|
|
||||||
|
backend:
|
||||||
|
crear_entity:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||||
|
inventario: "@INV_BE"
|
||||||
|
referencia: "@BACKEND/modules/*/entities/*.entity.ts"
|
||||||
|
|
||||||
|
crear_service:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||||
|
inventario: "@INV_BE"
|
||||||
|
referencia: "@BACKEND/modules/*/services/*.service.ts"
|
||||||
|
|
||||||
|
crear_controller:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||||
|
inventario: "@INV_BE"
|
||||||
|
referencia: "@BACKEND/modules/*/controllers/*.controller.ts"
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
crear_componente:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
|
||||||
|
inventario: "@INV_FE"
|
||||||
|
referencia: "@FRONTEND/components/**/*.tsx"
|
||||||
|
|
||||||
|
crear_pagina:
|
||||||
|
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
|
||||||
|
inventario: "@INV_FE"
|
||||||
|
referencia: "@FRONTEND/pages/**/*.tsx"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# INFORMACION ESPECIFICA DEL PROYECTO
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
info_proyecto:
|
||||||
|
tipo: "ERP Especializado - Clinica Odontologica"
|
||||||
|
estado: "Fase 0 - Preparacion"
|
||||||
|
version: "0.1.0"
|
||||||
|
|
||||||
|
stack:
|
||||||
|
backend: "NestJS (hereda de erp-clinicas)"
|
||||||
|
frontend: "React + TailwindCSS"
|
||||||
|
database: "PostgreSQL 16+ con RLS"
|
||||||
|
|
||||||
|
entidades_especializadas:
|
||||||
|
- odontograma
|
||||||
|
- tratamientos_dentales
|
||||||
|
- piezas_dentales
|
||||||
|
- ortodoncias
|
||||||
|
- protesis
|
||||||
|
|
||||||
|
modulos_heredados:
|
||||||
|
- pacientes (de erp-clinicas)
|
||||||
|
- expedientes (de erp-clinicas)
|
||||||
|
- citas (de erp-clinicas)
|
||||||
|
- consultas (de erp-clinicas)
|
||||||
|
- recetas (de erp-clinicas)
|
||||||
|
- facturacion (de erp-core)
|
||||||
|
- inventario (de erp-core)
|
||||||
|
|
||||||
|
nomenclatura_dental:
|
||||||
|
sistema: "FDI (dos digitos)"
|
||||||
|
cuadrantes:
|
||||||
|
superior_derecho: "11-18"
|
||||||
|
superior_izquierdo: "21-28"
|
||||||
|
inferior_izquierdo: "31-38"
|
||||||
|
inferior_derecho: "41-48"
|
||||||
|
deciduos: "51-55, 61-65, 71-75, 81-85"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# VALIDACION DE TOKENS
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
validacion_tokens:
|
||||||
|
limite_absoluto: 25000
|
||||||
|
limite_seguro: 18000
|
||||||
|
limite_alerta: 20000
|
||||||
|
|
||||||
|
presupuesto:
|
||||||
|
L0_sistema: 4500
|
||||||
|
L1_proyecto: 3000
|
||||||
|
L2_operacion: 2500
|
||||||
|
L3_tarea_max: 8000
|
||||||
|
total_base: 10000
|
||||||
|
disponible_tarea: 8000
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# HERENCIA
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
herencia:
|
||||||
|
tipo: "VERTICAL"
|
||||||
|
hereda_de:
|
||||||
|
- "/home/isem/workspace-v1/projects/erp-clinicas/"
|
||||||
|
- "/home/isem/workspace-v1/projects/erp-core/"
|
||||||
|
- "/home/isem/workspace-v1/orchestration/"
|
||||||
|
|
||||||
|
# ===============================================================================
|
||||||
|
# BUSQUEDA DE HISTORICO
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
busqueda_historico:
|
||||||
|
habilitado: true
|
||||||
|
ubicaciones:
|
||||||
|
- "/home/isem/workspace-v1/projects/clinica-dental/orchestration/trazas/"
|
||||||
|
- "/home/isem/workspace-v1/projects/erp-clinicas/orchestration/trazas/"
|
||||||
|
- "/home/isem/workspace-v1/orchestration/errores/REGISTRO-ERRORES.yml"
|
||||||
|
- "/home/isem/workspace-v1/shared/knowledge-base/lessons-learned/"
|
||||||
56
orchestration/PROJECT-STATUS.md
Normal file
56
orchestration/PROJECT-STATUS.md
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# PROJECT STATUS - Clinica Dental
|
||||||
|
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
**Estado:** En Desarrollo
|
||||||
|
**Fase:** Database
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resumen
|
||||||
|
|
||||||
|
| Aspecto | Estado | Notas |
|
||||||
|
|---------|--------|-------|
|
||||||
|
| Database | Completado | DDL y seeds listos |
|
||||||
|
| Backend | Pendiente | - |
|
||||||
|
| Frontend | Pendiente | - |
|
||||||
|
| Tests | Pendiente | - |
|
||||||
|
| Documentacion | Parcial | Contexto completo, falta epicas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Progreso por Modulo
|
||||||
|
|
||||||
|
| Modulo | DDL | Backend | Frontend | Tests |
|
||||||
|
|--------|-----|---------|----------|-------|
|
||||||
|
| Odontograma | OK | - | - | - |
|
||||||
|
| Tratamientos | OK | - | - | - |
|
||||||
|
| Ortodoncia | OK | - | - | - |
|
||||||
|
| Protesis | OK | - | - | - |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependencias
|
||||||
|
|
||||||
|
- **erp-clinicas:** Modulos base de gestion clinica
|
||||||
|
- **erp-core:** Auth, users, tenants, billing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Proximas Acciones
|
||||||
|
|
||||||
|
1. Implementar backend para modulo odontograma
|
||||||
|
2. Crear componente visual de odontograma
|
||||||
|
3. Integrar con sistema de citas de erp-clinicas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Riesgos
|
||||||
|
|
||||||
|
| Riesgo | Probabilidad | Impacto | Mitigacion |
|
||||||
|
|--------|--------------|---------|------------|
|
||||||
|
| Complejidad odontograma UI | Media | Alto | Usar librerias SVG |
|
||||||
|
| Integracion con erp-clinicas | Baja | Medio | Seguir patrones existentes |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
197
orchestration/PROXIMA-ACCION.md
Normal file
197
orchestration/PROXIMA-ACCION.md
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
# PROXIMA ACCION - Clinica Dental
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Estado:** Fase 0 - Preparacion
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
**Hereda de:** erp-clinicas > erp-core
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RESUMEN DEL ESTADO ACTUAL
|
||||||
|
|
||||||
|
### Estructura Base: CREADA
|
||||||
|
|
||||||
|
| Artefacto | Estado | Ubicacion |
|
||||||
|
|-----------|--------|-----------|
|
||||||
|
| README.md | EXISTE | raiz |
|
||||||
|
| CONTEXTO-PROYECTO.md | EXISTE | orchestration/00-guidelines/ |
|
||||||
|
| HERENCIA-ERP-CLINICAS.md | EXISTE | orchestration/00-guidelines/ |
|
||||||
|
| ENVIRONMENT-INVENTORY.yml | EXISTE | orchestration/environment/ |
|
||||||
|
| MASTER_INVENTORY.yml | EXISTE | orchestration/inventarios/ |
|
||||||
|
| PROJECT-STATUS.md | EXISTE | orchestration/ |
|
||||||
|
| CONTEXT-MAP.yml | CREADO | orchestration/ |
|
||||||
|
| PROXIMA-ACCION.md | CREADO | orchestration/ |
|
||||||
|
| DDL Dental | EXISTE | database/schemas/ |
|
||||||
|
|
||||||
|
### Documentacion: MINIMA
|
||||||
|
|
||||||
|
| Artefacto | Estado | Prioridad |
|
||||||
|
|-----------|--------|-----------|
|
||||||
|
| docs/00-vision-general/VISION.md | FALTA | P0 |
|
||||||
|
| docs/00-vision-general/_MAP.md | FALTA | P1 |
|
||||||
|
| docs/02-definicion-modulos/_MAP.md | FALTA | P0 |
|
||||||
|
| modulo-odontograma.md | FALTA | P1 |
|
||||||
|
| modulo-tratamientos.md | FALTA | P1 |
|
||||||
|
| modulo-ortodoncia.md | FALTA | P2 |
|
||||||
|
| modulo-protesis.md | FALTA | P2 |
|
||||||
|
| orchestration/_MAP.md | FALTA | P1 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PROXIMA ACCION INMEDIATA
|
||||||
|
|
||||||
|
### Tarea: Crear docs/00-vision-general/VISION.md
|
||||||
|
|
||||||
|
**Prioridad:** P0
|
||||||
|
**Estimacion:** 2-3 horas
|
||||||
|
**Responsable:** Agente Requirements Analyst
|
||||||
|
|
||||||
|
**Descripcion:**
|
||||||
|
Documentar la vision estrategica del proyecto de clinica dental, incluyendo:
|
||||||
|
- Propuesta de valor
|
||||||
|
- Target market
|
||||||
|
- Diferenciadores vs erp-clinicas base
|
||||||
|
- Roadmap de funcionalidades dentales especificas
|
||||||
|
|
||||||
|
**Contenido esperado:**
|
||||||
|
```markdown
|
||||||
|
# Vision - Clinica Dental
|
||||||
|
|
||||||
|
## 1. Proposito
|
||||||
|
Sistema de gestion integral para clinicas odontologicas...
|
||||||
|
|
||||||
|
## 2. Propuesta de Valor
|
||||||
|
- Odontograma digital interactivo
|
||||||
|
- Seguimiento de tratamientos dentales
|
||||||
|
- Gestion de ortodoncia
|
||||||
|
- Control de protesis
|
||||||
|
|
||||||
|
## 3. Usuarios Objetivo
|
||||||
|
- Odontologos
|
||||||
|
- Auxiliares dentales
|
||||||
|
- Recepcionistas
|
||||||
|
- Higienistas
|
||||||
|
- Tecnicos dentales
|
||||||
|
- Administradores
|
||||||
|
|
||||||
|
## 4. Diferenciadores
|
||||||
|
- Sistema FDI de nomenclatura dental
|
||||||
|
- Odontograma por paciente
|
||||||
|
- Historial por pieza dental
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## BACKLOG DE TAREAS
|
||||||
|
|
||||||
|
### Sprint 1: Vision y Navegacion (6h)
|
||||||
|
|
||||||
|
| # | Tarea | Prioridad | Horas |
|
||||||
|
|---|-------|-----------|-------|
|
||||||
|
| 1 | Crear VISION.md | P0 | 2-3 |
|
||||||
|
| 2 | Crear docs/00-vision-general/_MAP.md | P1 | 1 |
|
||||||
|
| 3 | Crear docs/02-definicion-modulos/_MAP.md | P0 | 1-2 |
|
||||||
|
| 4 | Crear orchestration/_MAP.md | P1 | 1 |
|
||||||
|
|
||||||
|
### Sprint 2: Modulos Core (8h)
|
||||||
|
|
||||||
|
| # | Tarea | Prioridad | Horas |
|
||||||
|
|---|-------|-----------|-------|
|
||||||
|
| 1 | modulo-odontograma.md | P1 | 2-3 |
|
||||||
|
| 2 | modulo-tratamientos.md | P1 | 1.5-2 |
|
||||||
|
| 3 | modulo-prevencion.md | P1 | 1-1.5 |
|
||||||
|
| 4 | modulo-restauracion.md | P1 | 1-1.5 |
|
||||||
|
|
||||||
|
### Sprint 3: Modulos Especializados (6h)
|
||||||
|
|
||||||
|
| # | Tarea | Prioridad | Horas |
|
||||||
|
|---|-------|-----------|-------|
|
||||||
|
| 1 | modulo-ortodoncia.md | P2 | 1.5-2 |
|
||||||
|
| 2 | modulo-protesis.md | P2 | 1.5-2 |
|
||||||
|
| 3 | modulo-endodoncia.md | P2 | 1-1.5 |
|
||||||
|
| 4 | modulo-periodoncia.md | P2 | 1-1.5 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## DEPENDENCIAS
|
||||||
|
|
||||||
|
### De erp-clinicas (heredados):
|
||||||
|
- Modulo Pacientes
|
||||||
|
- Modulo Expedientes
|
||||||
|
- Modulo Citas
|
||||||
|
- Modulo Consultas
|
||||||
|
- Modulo Recetas
|
||||||
|
|
||||||
|
### De erp-core (heredados):
|
||||||
|
- Modulo Autenticacion
|
||||||
|
- Modulo Usuarios
|
||||||
|
- Modulo Facturacion
|
||||||
|
- Modulo Inventario
|
||||||
|
- Modulo Catalogs
|
||||||
|
|
||||||
|
### Especificos Dental:
|
||||||
|
- Odontograma (nuevo)
|
||||||
|
- Tratamientos dentales (nuevo)
|
||||||
|
- Ortodoncia (nuevo)
|
||||||
|
- Protesis (nuevo)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ENTIDADES ESPECIALIZADAS
|
||||||
|
|
||||||
|
### Odontograma
|
||||||
|
```yaml
|
||||||
|
campos:
|
||||||
|
- id: UUID
|
||||||
|
- paciente_id: UUID (FK)
|
||||||
|
- fecha_registro: TIMESTAMP
|
||||||
|
- tipo: ENUM (adulto, deciduo)
|
||||||
|
- piezas: JSONB[]
|
||||||
|
|
||||||
|
pieza_dental:
|
||||||
|
- numero: INT (1-32 adulto, 51-85 deciduo)
|
||||||
|
- estado: ENUM (sano, caries, obturacion, etc)
|
||||||
|
- caras_afectadas: TEXT[] (M, D, O, V, L)
|
||||||
|
- tratamientos: FK[]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nomenclatura FDI
|
||||||
|
```yaml
|
||||||
|
cuadrantes:
|
||||||
|
1: "Superior derecho (11-18)"
|
||||||
|
2: "Superior izquierdo (21-28)"
|
||||||
|
3: "Inferior izquierdo (31-38)"
|
||||||
|
4: "Inferior derecho (41-48)"
|
||||||
|
deciduos:
|
||||||
|
5: "51-55"
|
||||||
|
6: "61-65"
|
||||||
|
7: "71-75"
|
||||||
|
8: "81-85"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## METRICAS DE PROGRESO
|
||||||
|
|
||||||
|
| Metrica | Valor Actual | Objetivo |
|
||||||
|
|---------|--------------|----------|
|
||||||
|
| Archivos SIMCO | 9 | 20+ |
|
||||||
|
| Modulos documentados | 0 | 8 |
|
||||||
|
| User Stories | 0 | 25+ |
|
||||||
|
| Cobertura docs | ~30% | 100% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NOTAS
|
||||||
|
|
||||||
|
- Hereda base completa de erp-clinicas
|
||||||
|
- Especializar en odontologia
|
||||||
|
- Odontograma es el diferenciador principal
|
||||||
|
- Nomenclatura FDI es estandar internacional
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
|
**Autor:** Agente Orquestador Workspace
|
||||||
|
**Version:** 1.0.0
|
||||||
804
orchestration/environment/ENVIRONMENT-INVENTORY.yml
Normal file
804
orchestration/environment/ENVIRONMENT-INVENTORY.yml
Normal file
@ -0,0 +1,804 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# ENVIRONMENT-INVENTORY.yml - CLINICA-DENTAL
|
||||||
|
# =============================================================================
|
||||||
|
# Inventario Completo de Entorno de Desarrollo y Produccion
|
||||||
|
# Generado por: @PERFIL_DEVENV
|
||||||
|
# Basado en: orchestration/templates/TEMPLATE-ENVIRONMENT-INVENTORY.yml
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
version: "1.1.0"
|
||||||
|
fecha_creacion: "2026-01-04"
|
||||||
|
fecha_actualizacion: "2026-01-04"
|
||||||
|
responsable: "@PERFIL_DEVENV"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# IDENTIFICACION DEL PROYECTO
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
proyecto:
|
||||||
|
nombre: "Clinica Dental"
|
||||||
|
alias: "clinica-dental"
|
||||||
|
codigo: "CD"
|
||||||
|
nivel: "NIVEL_2B.3"
|
||||||
|
tipo: "vertical-especializada"
|
||||||
|
estado: "desarrollo"
|
||||||
|
descripcion: "Sistema de gestion para clinicas dentales y odontologicas"
|
||||||
|
parent: "erp-clinicas"
|
||||||
|
herencia:
|
||||||
|
- erp-core
|
||||||
|
- erp-clinicas
|
||||||
|
normativas:
|
||||||
|
- "NOM-024-SSA3-2012 (Expediente clinico electronico)"
|
||||||
|
- "NOM-013-SSA2-2015 (Prevencion y control enfermedades bucales)"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# HERRAMIENTAS Y RUNTIME
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
herramientas:
|
||||||
|
runtime:
|
||||||
|
node:
|
||||||
|
version: "20.x"
|
||||||
|
version_minima: "18.x"
|
||||||
|
requerido: true
|
||||||
|
notas: "LTS recomendado para NestJS y React"
|
||||||
|
python:
|
||||||
|
version: ""
|
||||||
|
requerido: false
|
||||||
|
notas: "No requerido para este proyecto"
|
||||||
|
|
||||||
|
package_managers:
|
||||||
|
npm:
|
||||||
|
version: "10.x"
|
||||||
|
requerido: true
|
||||||
|
pnpm:
|
||||||
|
version: "8.x"
|
||||||
|
requerido: false
|
||||||
|
notas: "Alternativa opcional"
|
||||||
|
|
||||||
|
build_tools:
|
||||||
|
- nombre: "Vite"
|
||||||
|
version: "5.x"
|
||||||
|
uso: "Frontend build y dev server"
|
||||||
|
- nombre: "TypeScript"
|
||||||
|
version: "5.x"
|
||||||
|
uso: "Compilacion de codigo"
|
||||||
|
- nombre: "NestJS CLI"
|
||||||
|
version: "10.x"
|
||||||
|
uso: "Backend scaffolding y build"
|
||||||
|
|
||||||
|
linters:
|
||||||
|
- nombre: "ESLint"
|
||||||
|
version: "8.x"
|
||||||
|
config: ".eslintrc.js"
|
||||||
|
- nombre: "Prettier"
|
||||||
|
version: "3.x"
|
||||||
|
config: ".prettierrc"
|
||||||
|
|
||||||
|
testing:
|
||||||
|
- nombre: "Jest"
|
||||||
|
version: "29.x"
|
||||||
|
tipo: "unit backend"
|
||||||
|
config: "jest.config.js"
|
||||||
|
- nombre: "Vitest"
|
||||||
|
version: "1.x"
|
||||||
|
tipo: "unit frontend"
|
||||||
|
config: "vitest.config.ts"
|
||||||
|
- nombre: "Supertest"
|
||||||
|
version: "6.x"
|
||||||
|
tipo: "e2e"
|
||||||
|
config: "jest-e2e.config.js"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# SERVICIOS Y PUERTOS
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
servicios:
|
||||||
|
frontend:
|
||||||
|
nombre: "clinica-dental-frontend"
|
||||||
|
framework: "React"
|
||||||
|
version: "18.x"
|
||||||
|
puerto: 3130
|
||||||
|
comando_dev: "npm run dev"
|
||||||
|
comando_build: "npm run build"
|
||||||
|
comando_preview: "npm run preview"
|
||||||
|
ubicacion: "apps/frontend/"
|
||||||
|
url_local: "http://localhost:3130"
|
||||||
|
build_output: "dist/"
|
||||||
|
|
||||||
|
backend:
|
||||||
|
nombre: "clinica-dental-backend"
|
||||||
|
framework: "NestJS"
|
||||||
|
version: "10.x"
|
||||||
|
puerto: 3131
|
||||||
|
comando_dev: "npm run start:dev"
|
||||||
|
comando_build: "npm run build"
|
||||||
|
comando_prod: "npm run start:prod"
|
||||||
|
ubicacion: "apps/backend/"
|
||||||
|
url_local: "http://localhost:3131"
|
||||||
|
api_prefix: "/api/v1"
|
||||||
|
swagger_url: "http://localhost:3131/api/docs"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# BASE DE DATOS - CONFIGURACION COMPLETA
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
base_de_datos:
|
||||||
|
principal:
|
||||||
|
engine: "PostgreSQL"
|
||||||
|
version: "15"
|
||||||
|
host_variable: "DB_HOST"
|
||||||
|
puerto_variable: "DB_PORT"
|
||||||
|
|
||||||
|
ambientes:
|
||||||
|
development:
|
||||||
|
host: "localhost"
|
||||||
|
puerto: 5441
|
||||||
|
nombre: "clinica_dental_dev"
|
||||||
|
usuario: "dental_dev"
|
||||||
|
password_ref: "DB_PASSWORD en .env"
|
||||||
|
ssl: false
|
||||||
|
pool_size: 10
|
||||||
|
conexion: "postgresql://dental_dev:{password}@localhost:5441/clinica_dental_dev"
|
||||||
|
|
||||||
|
test:
|
||||||
|
host: "localhost"
|
||||||
|
puerto: 5441
|
||||||
|
nombre: "clinica_dental_test"
|
||||||
|
usuario: "dental_dev"
|
||||||
|
password_ref: "DB_PASSWORD en .env"
|
||||||
|
ssl: false
|
||||||
|
pool_size: 5
|
||||||
|
conexion: "postgresql://dental_dev:{password}@localhost:5441/clinica_dental_test"
|
||||||
|
|
||||||
|
staging:
|
||||||
|
host: "${DB_HOST}"
|
||||||
|
puerto: 5432
|
||||||
|
nombre: "clinica_dental_staging"
|
||||||
|
usuario: "dental_staging"
|
||||||
|
password_ref: "DB_PASSWORD en variables de CI/CD"
|
||||||
|
ssl: true
|
||||||
|
pool_size: 20
|
||||||
|
conexion: "postgresql://dental_staging:{password}@${DB_HOST}:5432/clinica_dental_staging?sslmode=require"
|
||||||
|
|
||||||
|
production:
|
||||||
|
host: "${DB_HOST}"
|
||||||
|
puerto: 5432
|
||||||
|
nombre: "clinica_dental_prod"
|
||||||
|
usuario: "dental_prod"
|
||||||
|
password_ref: "DB_PASSWORD en secrets manager"
|
||||||
|
ssl: true
|
||||||
|
pool_size: 50
|
||||||
|
conexion: "postgresql://dental_prod:{password}@${DB_HOST}:5432/clinica_dental_prod?sslmode=require"
|
||||||
|
|
||||||
|
schemas:
|
||||||
|
- nombre: "public"
|
||||||
|
descripcion: "Schema principal PostgreSQL"
|
||||||
|
- nombre: "dental"
|
||||||
|
descripcion: "Entidades odontologicas (odontograma, piezas, tratamientos, ortodoncia)"
|
||||||
|
- nombre: "clinical"
|
||||||
|
descripcion: "Heredado de erp-clinicas (consultorios, citas, historiales)"
|
||||||
|
- nombre: "financial"
|
||||||
|
descripcion: "Heredado de erp-core (pagos, facturacion, presupuestos)"
|
||||||
|
- nombre: "hr"
|
||||||
|
descripcion: "Heredado de erp-core (empleados, especialidades)"
|
||||||
|
- nombre: "inventory"
|
||||||
|
descripcion: "Heredado de erp-core (materiales, insumos dentales)"
|
||||||
|
|
||||||
|
scripts_inicializacion:
|
||||||
|
orden:
|
||||||
|
- "database/init/00-extensions.sql"
|
||||||
|
- "database/init/01-schemas.sql"
|
||||||
|
- "database/schemas/01-dental-schema-ddl.sql"
|
||||||
|
- "database/seeds/fase8/01-dental-catalogos.sql"
|
||||||
|
- "database/seeds/fase8/02-piezas-dentales-fdi.sql"
|
||||||
|
|
||||||
|
datos_iniciales:
|
||||||
|
piezas_dentales:
|
||||||
|
total: 52
|
||||||
|
nomenclatura: "FDI (Federation Dentaire Internationale)"
|
||||||
|
cuadrantes:
|
||||||
|
- id: 1
|
||||||
|
nombre: "Superior derecho"
|
||||||
|
piezas: "18-11"
|
||||||
|
tipo: "permanente"
|
||||||
|
- id: 2
|
||||||
|
nombre: "Superior izquierdo"
|
||||||
|
piezas: "21-28"
|
||||||
|
tipo: "permanente"
|
||||||
|
- id: 3
|
||||||
|
nombre: "Inferior izquierdo"
|
||||||
|
piezas: "31-38"
|
||||||
|
tipo: "permanente"
|
||||||
|
- id: 4
|
||||||
|
nombre: "Inferior derecho"
|
||||||
|
piezas: "41-48"
|
||||||
|
tipo: "permanente"
|
||||||
|
- id: 5
|
||||||
|
nombre: "Superior derecho temporal"
|
||||||
|
piezas: "55-51"
|
||||||
|
tipo: "temporal"
|
||||||
|
- id: 6
|
||||||
|
nombre: "Superior izquierdo temporal"
|
||||||
|
piezas: "61-65"
|
||||||
|
tipo: "temporal"
|
||||||
|
- id: 7
|
||||||
|
nombre: "Inferior izquierdo temporal"
|
||||||
|
piezas: "71-75"
|
||||||
|
tipo: "temporal"
|
||||||
|
- id: 8
|
||||||
|
nombre: "Inferior derecho temporal"
|
||||||
|
piezas: "81-85"
|
||||||
|
tipo: "temporal"
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host_variable: "REDIS_HOST"
|
||||||
|
puerto_variable: "REDIS_PORT"
|
||||||
|
|
||||||
|
ambientes:
|
||||||
|
development:
|
||||||
|
host: "localhost"
|
||||||
|
puerto: 6388
|
||||||
|
database: 0
|
||||||
|
password: ""
|
||||||
|
conexion: "redis://localhost:6388/0"
|
||||||
|
|
||||||
|
production:
|
||||||
|
host: "${REDIS_HOST}"
|
||||||
|
puerto: 6379
|
||||||
|
database: 0
|
||||||
|
password_ref: "REDIS_PASSWORD en secrets"
|
||||||
|
conexion: "redis://:${REDIS_PASSWORD}@${REDIS_HOST}:6379/0"
|
||||||
|
|
||||||
|
uso:
|
||||||
|
- "Cache de sesiones"
|
||||||
|
- "Cache de odontogramas"
|
||||||
|
- "Rate limiting"
|
||||||
|
- "Queue de tareas (Bull)"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# VARIABLES DE ENTORNO - DESARROLLO
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
variables_entorno:
|
||||||
|
archivos:
|
||||||
|
ejemplo: ".env.example"
|
||||||
|
desarrollo: ".env"
|
||||||
|
test: ".env.test"
|
||||||
|
produccion: ".env.production"
|
||||||
|
|
||||||
|
development:
|
||||||
|
- nombre: "NODE_ENV"
|
||||||
|
valor: "development"
|
||||||
|
descripcion: "Ambiente de ejecucion"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "APP_NAME"
|
||||||
|
valor: "clinica-dental"
|
||||||
|
descripcion: "Nombre de la aplicacion"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "APP_VERSION"
|
||||||
|
valor: "1.0.0"
|
||||||
|
descripcion: "Version de la aplicacion"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Puertos
|
||||||
|
- nombre: "FRONTEND_PORT"
|
||||||
|
valor: "3130"
|
||||||
|
descripcion: "Puerto del frontend React"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "BACKEND_PORT"
|
||||||
|
valor: "3131"
|
||||||
|
descripcion: "Puerto del backend NestJS"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Base de datos
|
||||||
|
- nombre: "DB_HOST"
|
||||||
|
valor: "localhost"
|
||||||
|
descripcion: "Host de PostgreSQL"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "DB_PORT"
|
||||||
|
valor: "5441"
|
||||||
|
descripcion: "Puerto de PostgreSQL"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "DB_NAME"
|
||||||
|
valor: "clinica_dental_dev"
|
||||||
|
descripcion: "Nombre de la base de datos"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "DB_USER"
|
||||||
|
valor: "dental_dev"
|
||||||
|
descripcion: "Usuario de PostgreSQL"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "DB_PASSWORD"
|
||||||
|
valor: ""
|
||||||
|
descripcion: "Password de PostgreSQL"
|
||||||
|
requerido: true
|
||||||
|
sensible: true
|
||||||
|
generacion: "openssl rand -base64 32"
|
||||||
|
|
||||||
|
- nombre: "DATABASE_URL"
|
||||||
|
valor: "postgresql://dental_dev:${DB_PASSWORD}@localhost:5441/clinica_dental_dev"
|
||||||
|
descripcion: "Connection string completo"
|
||||||
|
requerido: true
|
||||||
|
sensible: true
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
- nombre: "REDIS_HOST"
|
||||||
|
valor: "localhost"
|
||||||
|
descripcion: "Host de Redis"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "REDIS_PORT"
|
||||||
|
valor: "6388"
|
||||||
|
descripcion: "Puerto de Redis"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "REDIS_URL"
|
||||||
|
valor: "redis://localhost:6388/0"
|
||||||
|
descripcion: "Connection string de Redis"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Autenticacion
|
||||||
|
- nombre: "JWT_SECRET"
|
||||||
|
valor: ""
|
||||||
|
descripcion: "Secreto para firmar JWT (min 32 caracteres)"
|
||||||
|
requerido: true
|
||||||
|
sensible: true
|
||||||
|
generacion: "openssl rand -base64 64"
|
||||||
|
|
||||||
|
- nombre: "JWT_EXPIRES_IN"
|
||||||
|
valor: "24h"
|
||||||
|
descripcion: "Tiempo de expiracion del access token"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "JWT_REFRESH_EXPIRES_IN"
|
||||||
|
valor: "7d"
|
||||||
|
descripcion: "Tiempo de expiracion del refresh token"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# CORS
|
||||||
|
- nombre: "FRONTEND_URL"
|
||||||
|
valor: "http://localhost:3130"
|
||||||
|
descripcion: "URL del frontend para CORS"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "ALLOWED_ORIGINS"
|
||||||
|
valor: "http://localhost:3130,http://localhost:3131"
|
||||||
|
descripcion: "Origenes permitidos (comma separated)"
|
||||||
|
requerido: true
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
- nombre: "LOG_LEVEL"
|
||||||
|
valor: "debug"
|
||||||
|
descripcion: "Nivel de logging (debug, info, warn, error)"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "LOG_FORMAT"
|
||||||
|
valor: "pretty"
|
||||||
|
descripcion: "Formato de logs (pretty, json)"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# File Storage (radiografias, documentos)
|
||||||
|
- nombre: "STORAGE_TYPE"
|
||||||
|
valor: "local"
|
||||||
|
descripcion: "Tipo de storage (local, s3, minio)"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "STORAGE_PATH"
|
||||||
|
valor: "./uploads"
|
||||||
|
descripcion: "Path para almacenamiento local"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "MAX_FILE_SIZE"
|
||||||
|
valor: "20971520"
|
||||||
|
descripcion: "Tamano maximo de archivo en bytes (20MB para radiografias)"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "ALLOWED_FILE_TYPES"
|
||||||
|
valor: "image/jpeg,image/png,image/dicom,application/pdf"
|
||||||
|
descripcion: "Tipos de archivo permitidos"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Email (opcional)
|
||||||
|
- nombre: "SMTP_HOST"
|
||||||
|
valor: "localhost"
|
||||||
|
descripcion: "Host SMTP para emails"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "SMTP_PORT"
|
||||||
|
valor: "1025"
|
||||||
|
descripcion: "Puerto SMTP (1025 para MailHog)"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
# Configuracion Dental Especifica
|
||||||
|
- nombre: "DENTAL_FDI_NOTATION"
|
||||||
|
valor: "true"
|
||||||
|
descripcion: "Usar notacion FDI para piezas dentales"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
- nombre: "ODONTOGRAM_VERSION"
|
||||||
|
valor: "2.0"
|
||||||
|
descripcion: "Version del formato de odontograma"
|
||||||
|
requerido: false
|
||||||
|
sensible: false
|
||||||
|
|
||||||
|
production:
|
||||||
|
notas: |
|
||||||
|
En produccion, las siguientes variables deben configurarse
|
||||||
|
via secrets manager o variables de CI/CD:
|
||||||
|
- DB_PASSWORD (secreto)
|
||||||
|
- JWT_SECRET (secreto)
|
||||||
|
- REDIS_PASSWORD (secreto)
|
||||||
|
- AWS_ACCESS_KEY_ID (si usa S3)
|
||||||
|
- AWS_SECRET_ACCESS_KEY (si usa S3)
|
||||||
|
|
||||||
|
IMPORTANTE - Cumplimiento Normativo:
|
||||||
|
- NOM-024-SSA3-2012: Logs de auditoria obligatorios
|
||||||
|
- Encriptacion de datos sensibles (historiales)
|
||||||
|
- Backups diarios con retencion minima 5 anos
|
||||||
|
|
||||||
|
diferencias:
|
||||||
|
- nombre: "NODE_ENV"
|
||||||
|
valor: "production"
|
||||||
|
- nombre: "LOG_LEVEL"
|
||||||
|
valor: "info"
|
||||||
|
- nombre: "LOG_FORMAT"
|
||||||
|
valor: "json"
|
||||||
|
- nombre: "DB_PORT"
|
||||||
|
valor: "5432"
|
||||||
|
- nombre: "REDIS_PORT"
|
||||||
|
valor: "6379"
|
||||||
|
- nombre: "STORAGE_TYPE"
|
||||||
|
valor: "s3"
|
||||||
|
- nombre: "AUDIT_ENABLED"
|
||||||
|
valor: "true"
|
||||||
|
- nombre: "DATA_ENCRYPTION"
|
||||||
|
valor: "true"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# CONTENEDORES DOCKER
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
docker:
|
||||||
|
compose_file: "docker-compose.yml"
|
||||||
|
compose_dev: "docker-compose.dev.yml"
|
||||||
|
compose_prod: "docker-compose.prod.yml"
|
||||||
|
|
||||||
|
services:
|
||||||
|
- nombre: "db"
|
||||||
|
imagen: "postgres:15-alpine"
|
||||||
|
puerto_host: 5441
|
||||||
|
puerto_container: 5432
|
||||||
|
variables:
|
||||||
|
POSTGRES_DB: "clinica_dental_dev"
|
||||||
|
POSTGRES_USER: "dental_dev"
|
||||||
|
POSTGRES_PASSWORD: "${DB_PASSWORD}"
|
||||||
|
volumes:
|
||||||
|
- "postgres_data:/var/lib/postgresql/data"
|
||||||
|
healthcheck: "pg_isready -U dental_dev"
|
||||||
|
|
||||||
|
- nombre: "redis"
|
||||||
|
imagen: "redis:7-alpine"
|
||||||
|
puerto_host: 6388
|
||||||
|
puerto_container: 6379
|
||||||
|
volumes:
|
||||||
|
- "redis_data:/data"
|
||||||
|
healthcheck: "redis-cli ping"
|
||||||
|
|
||||||
|
- nombre: "mailhog"
|
||||||
|
imagen: "mailhog/mailhog"
|
||||||
|
puerto_smtp: 1025
|
||||||
|
puerto_web: 8025
|
||||||
|
uso: "Testing de emails en desarrollo"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- nombre: "postgres_data"
|
||||||
|
descripcion: "Datos persistentes de PostgreSQL"
|
||||||
|
- nombre: "redis_data"
|
||||||
|
descripcion: "Datos persistentes de Redis"
|
||||||
|
- nombre: "uploads_data"
|
||||||
|
descripcion: "Radiografias y documentos"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- nombre: "clinica_dental_network"
|
||||||
|
driver: "bridge"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# MIGRACIONES Y SEEDS
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
migraciones:
|
||||||
|
herramienta: "TypeORM"
|
||||||
|
directorio: "apps/backend/src/database/migrations"
|
||||||
|
|
||||||
|
comandos:
|
||||||
|
generar: "npm run migration:generate -- -n NombreMigracion"
|
||||||
|
ejecutar: "npm run migration:run"
|
||||||
|
revertir: "npm run migration:revert"
|
||||||
|
mostrar: "npm run migration:show"
|
||||||
|
|
||||||
|
seeds:
|
||||||
|
directorio: "database/seeds"
|
||||||
|
orden:
|
||||||
|
- "fase8/01-dental-catalogos.sql"
|
||||||
|
- "fase8/02-piezas-dentales-fdi.sql"
|
||||||
|
|
||||||
|
comandos:
|
||||||
|
ejecutar: "npm run seed"
|
||||||
|
desarrollo: "npm run seed:dev"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# SCRIPTS DE DESARROLLO
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
scripts:
|
||||||
|
setup:
|
||||||
|
descripcion: "Configurar entorno desde cero"
|
||||||
|
pasos:
|
||||||
|
- comando: "npm install"
|
||||||
|
descripcion: "Instalar dependencias"
|
||||||
|
- comando: "cp .env.example .env"
|
||||||
|
descripcion: "Crear archivo de configuracion"
|
||||||
|
- comando: "docker-compose up -d db redis"
|
||||||
|
descripcion: "Levantar servicios de infraestructura"
|
||||||
|
- comando: "npm run db:create"
|
||||||
|
descripcion: "Crear base de datos"
|
||||||
|
- comando: "npm run migration:run"
|
||||||
|
descripcion: "Ejecutar migraciones"
|
||||||
|
- comando: "npm run seed"
|
||||||
|
descripcion: "Cargar datos iniciales (incluye 52 piezas FDI)"
|
||||||
|
|
||||||
|
desarrollo:
|
||||||
|
frontend: "cd apps/frontend && npm run dev"
|
||||||
|
backend: "cd apps/backend && npm run start:dev"
|
||||||
|
ambos: "npm run dev:all"
|
||||||
|
docker: "docker-compose up -d"
|
||||||
|
|
||||||
|
testing:
|
||||||
|
unit: "npm run test"
|
||||||
|
unit_watch: "npm run test:watch"
|
||||||
|
e2e: "npm run test:e2e"
|
||||||
|
coverage: "npm run test:cov"
|
||||||
|
|
||||||
|
build:
|
||||||
|
frontend: "cd apps/frontend && npm run build"
|
||||||
|
backend: "cd apps/backend && npm run build"
|
||||||
|
docker: "docker-compose -f docker-compose.prod.yml build"
|
||||||
|
|
||||||
|
database:
|
||||||
|
create: "npm run db:create"
|
||||||
|
drop: "npm run db:drop"
|
||||||
|
reset: "npm run db:reset"
|
||||||
|
migrations_run: "npm run migration:run"
|
||||||
|
migrations_revert: "npm run migration:revert"
|
||||||
|
seed: "npm run seed"
|
||||||
|
|
||||||
|
linting:
|
||||||
|
lint: "npm run lint"
|
||||||
|
lint_fix: "npm run lint:fix"
|
||||||
|
format: "npm run format"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# INSTRUCCIONES DE SETUP
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
setup_instrucciones: |
|
||||||
|
## Setup del Entorno de Desarrollo - Clinica Dental
|
||||||
|
|
||||||
|
### Prerequisitos
|
||||||
|
- Node.js 20.x (LTS)
|
||||||
|
- PostgreSQL 15 (o Docker)
|
||||||
|
- Redis 7 (o Docker)
|
||||||
|
- npm 10.x
|
||||||
|
- Git
|
||||||
|
|
||||||
|
### Opcion 1: Setup con Docker (Recomendado)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Clonar repositorio
|
||||||
|
git clone <url_repo>
|
||||||
|
cd clinica-dental
|
||||||
|
|
||||||
|
# 2. Instalar dependencias
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 3. Configurar variables de entorno
|
||||||
|
cp .env.example .env
|
||||||
|
# Editar .env - generar passwords seguros:
|
||||||
|
# openssl rand -base64 32 # para DB_PASSWORD
|
||||||
|
# openssl rand -base64 64 # para JWT_SECRET
|
||||||
|
|
||||||
|
# 4. Levantar infraestructura
|
||||||
|
docker-compose up -d db redis
|
||||||
|
|
||||||
|
# 5. Crear base de datos y ejecutar migraciones
|
||||||
|
npm run db:create
|
||||||
|
npm run migration:run
|
||||||
|
npm run seed # Carga 52 piezas dentales FDI
|
||||||
|
|
||||||
|
# 6. Iniciar desarrollo
|
||||||
|
npm run dev:all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opcion 2: Setup con PostgreSQL Local
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1-3. Igual que arriba
|
||||||
|
|
||||||
|
# 4. Crear usuario y base de datos en PostgreSQL
|
||||||
|
sudo -u postgres psql
|
||||||
|
CREATE USER dental_dev WITH PASSWORD 'tu_password';
|
||||||
|
CREATE DATABASE clinica_dental_dev OWNER dental_dev;
|
||||||
|
GRANT ALL PRIVILEGES ON DATABASE clinica_dental_dev TO dental_dev;
|
||||||
|
\q
|
||||||
|
|
||||||
|
# 5. Configurar Redis local o Docker
|
||||||
|
docker run -d --name redis-dental -p 6388:6379 redis:7-alpine
|
||||||
|
|
||||||
|
# 6-7. Continuar con migraciones y seeds
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verificar Instalacion
|
||||||
|
- Frontend: http://localhost:3130
|
||||||
|
- Backend API: http://localhost:3131/api/v1
|
||||||
|
- Swagger Docs: http://localhost:3131/api/docs
|
||||||
|
- Health Check: http://localhost:3131/health
|
||||||
|
|
||||||
|
### Usuarios de Prueba (despues de seed)
|
||||||
|
- Admin: admin@clinica-dental.local / Admin123!
|
||||||
|
- Odontologo: doctor@clinica-dental.local / Doctor123!
|
||||||
|
- Recepcion: recepcion@clinica-dental.local / Recep123!
|
||||||
|
|
||||||
|
### Nomenclatura Dental FDI
|
||||||
|
El sistema usa la nomenclatura FDI (Federation Dentaire Internationale):
|
||||||
|
- Cuadrante 1: Superior derecho (18-11)
|
||||||
|
- Cuadrante 2: Superior izquierdo (21-28)
|
||||||
|
- Cuadrante 3: Inferior izquierdo (31-38)
|
||||||
|
- Cuadrante 4: Inferior derecho (41-48)
|
||||||
|
- Cuadrantes 5-8: Denticion temporal
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# TROUBLESHOOTING
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
troubleshooting:
|
||||||
|
- problema: "Puerto 3130 o 3131 en uso"
|
||||||
|
solucion: |
|
||||||
|
Verificar con: lsof -i :3130
|
||||||
|
Terminar proceso: kill -9 <PID>
|
||||||
|
O cambiar puertos en .env
|
||||||
|
|
||||||
|
- problema: "Error de conexion a PostgreSQL"
|
||||||
|
solucion: |
|
||||||
|
1. Verificar que PostgreSQL esta corriendo:
|
||||||
|
docker-compose ps
|
||||||
|
# o: systemctl status postgresql
|
||||||
|
2. Verificar credenciales en .env
|
||||||
|
3. Verificar que la BD existe:
|
||||||
|
psql -h localhost -p 5441 -U dental_dev -l
|
||||||
|
|
||||||
|
- problema: "Error de conexion a Redis"
|
||||||
|
solucion: |
|
||||||
|
1. Verificar que Redis esta corriendo:
|
||||||
|
docker-compose ps
|
||||||
|
# o: redis-cli -p 6388 ping
|
||||||
|
2. Verificar puerto en .env
|
||||||
|
|
||||||
|
- problema: "Migraciones fallan"
|
||||||
|
solucion: |
|
||||||
|
1. Verificar que la BD existe
|
||||||
|
2. Verificar permisos del usuario
|
||||||
|
3. Revisar logs: npm run migration:run --verbose
|
||||||
|
4. Si es necesario, resetear: npm run db:reset
|
||||||
|
|
||||||
|
- problema: "Piezas dentales no cargadas"
|
||||||
|
solucion: |
|
||||||
|
Ejecutar seeds manualmente:
|
||||||
|
npm run seed
|
||||||
|
Verificar: SELECT COUNT(*) FROM dental.piezas_dentales;
|
||||||
|
Debe retornar 52 (32 permanentes + 20 temporales)
|
||||||
|
|
||||||
|
- problema: "Radiografias no se suben"
|
||||||
|
solucion: |
|
||||||
|
1. Verificar STORAGE_PATH existe y tiene permisos
|
||||||
|
2. Verificar MAX_FILE_SIZE en .env (default 20MB)
|
||||||
|
3. Verificar ALLOWED_FILE_TYPES incluye el tipo de archivo
|
||||||
|
|
||||||
|
- problema: "JWT errors"
|
||||||
|
solucion: |
|
||||||
|
Verificar que JWT_SECRET esta configurado (min 32 caracteres)
|
||||||
|
Generar nuevo: openssl rand -base64 64
|
||||||
|
|
||||||
|
- problema: "CORS errors en frontend"
|
||||||
|
solucion: |
|
||||||
|
Verificar FRONTEND_URL y ALLOWED_ORIGINS en .env
|
||||||
|
Deben coincidir con la URL del frontend
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# CONFIGURACION DE PRODUCCION
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
produccion:
|
||||||
|
checklist:
|
||||||
|
- item: "Variables de entorno configuradas via secrets manager"
|
||||||
|
- item: "SSL/TLS habilitado para BD y Redis"
|
||||||
|
- item: "Backups automaticos configurados (retencion 5 anos)"
|
||||||
|
- item: "Monitoreo y alertas activas"
|
||||||
|
- item: "Rate limiting configurado"
|
||||||
|
- item: "CORS restringido a dominios autorizados"
|
||||||
|
- item: "Logs en formato JSON para agregacion"
|
||||||
|
- item: "Audit logging habilitado (NOM-024-SSA3-2012)"
|
||||||
|
- item: "Encriptacion de datos sensibles"
|
||||||
|
|
||||||
|
infraestructura_recomendada:
|
||||||
|
base_de_datos: "AWS RDS PostgreSQL 15 o equivalente"
|
||||||
|
cache: "AWS ElastiCache Redis o equivalente"
|
||||||
|
storage: "AWS S3 o equivalente (para radiografias)"
|
||||||
|
cdn: "CloudFront o equivalente"
|
||||||
|
ci_cd: "GitHub Actions / GitLab CI"
|
||||||
|
|
||||||
|
escalado:
|
||||||
|
backend_replicas: 2
|
||||||
|
pool_db_size: 50
|
||||||
|
redis_maxmemory: "512mb"
|
||||||
|
storage_bucket_region: "us-east-1"
|
||||||
|
|
||||||
|
cumplimiento:
|
||||||
|
nom_024_ssa3:
|
||||||
|
descripcion: "Expediente clinico electronico"
|
||||||
|
requisitos:
|
||||||
|
- "Logs de auditoria inmutables"
|
||||||
|
- "Firma electronica de expedientes"
|
||||||
|
- "Control de versiones de historiales"
|
||||||
|
retencion_datos:
|
||||||
|
expedientes: "5 anos minimo"
|
||||||
|
radiografias: "5 anos minimo"
|
||||||
|
logs_auditoria: "5 anos"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# REFERENCIAS
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
referencias:
|
||||||
|
perfil_devenv: "orchestration/agents/perfiles/PERFIL-DEVENV.md"
|
||||||
|
inventario_master: "orchestration/inventarios/DEVENV-MASTER-INVENTORY.yml"
|
||||||
|
inventario_puertos: "orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml"
|
||||||
|
contexto_proyecto: "orchestration/00-guidelines/CONTEXTO-PROYECTO.md"
|
||||||
|
parent_clinicas: "../erp-clinicas/orchestration/environment/ENVIRONMENT-INVENTORY.yml"
|
||||||
|
schema_dental: "database/schemas/01-dental-schema-ddl.sql"
|
||||||
|
nomenclatura_fdi: "https://www.fdiworlddental.org/tooth-numbering-system"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# FIN DE INVENTARIO
|
||||||
|
# =============================================================================
|
||||||
284
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
284
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
---
|
||||||
|
# DATABASE INVENTORY - Clinica Dental
|
||||||
|
# Version: 1.0.0
|
||||||
|
# Ultima actualizacion: 2026-01-07
|
||||||
|
|
||||||
|
proyecto: "clinica-dental"
|
||||||
|
schema_principal: "dental"
|
||||||
|
version_ddl: "1.0"
|
||||||
|
estado: "completado"
|
||||||
|
|
||||||
|
herencia:
|
||||||
|
vertical_padre: "erp-clinicas"
|
||||||
|
suite_core: "erp-core"
|
||||||
|
schemas_heredados:
|
||||||
|
- name: "auth"
|
||||||
|
desde: "erp-core"
|
||||||
|
- name: "tenants"
|
||||||
|
desde: "erp-core"
|
||||||
|
- name: "users"
|
||||||
|
desde: "erp-core"
|
||||||
|
- name: "clinica"
|
||||||
|
desde: "erp-clinicas"
|
||||||
|
tablas: ["patients", "doctors", "appointments", "consultations"]
|
||||||
|
|
||||||
|
enums:
|
||||||
|
- name: "estado_pieza"
|
||||||
|
values:
|
||||||
|
- "sano"
|
||||||
|
- "caries"
|
||||||
|
- "obturacion"
|
||||||
|
- "endodoncia"
|
||||||
|
- "corona"
|
||||||
|
- "puente"
|
||||||
|
- "implante"
|
||||||
|
- "ausente"
|
||||||
|
- "extraccion_indicada"
|
||||||
|
- "diente_temporal"
|
||||||
|
- "fractura"
|
||||||
|
- "movilidad"
|
||||||
|
|
||||||
|
- name: "cara_dental"
|
||||||
|
values:
|
||||||
|
- "mesial"
|
||||||
|
- "distal"
|
||||||
|
- "oclusal"
|
||||||
|
- "incisal"
|
||||||
|
- "vestibular"
|
||||||
|
- "bucal"
|
||||||
|
- "lingual"
|
||||||
|
- "palatino"
|
||||||
|
|
||||||
|
- name: "estado_tratamiento"
|
||||||
|
values:
|
||||||
|
- "pendiente"
|
||||||
|
- "en_proceso"
|
||||||
|
- "completado"
|
||||||
|
- "cancelado"
|
||||||
|
|
||||||
|
- name: "tipo_ortodoncia"
|
||||||
|
values:
|
||||||
|
- "brackets_metalicos"
|
||||||
|
- "brackets_esteticos"
|
||||||
|
- "brackets_linguales"
|
||||||
|
- "alineadores"
|
||||||
|
- "removible"
|
||||||
|
- "retenedor"
|
||||||
|
|
||||||
|
catalogos:
|
||||||
|
- name: "piezas_dentales"
|
||||||
|
descripcion: "Catalogo de piezas dentales (nomenclatura FDI)"
|
||||||
|
registros: 52
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "numero: VARCHAR(10) UNIQUE"
|
||||||
|
- "nombre: VARCHAR(50)"
|
||||||
|
- "cuadrante: INTEGER (1-8)"
|
||||||
|
- "es_temporal: BOOLEAN"
|
||||||
|
- "descripcion: TEXT"
|
||||||
|
|
||||||
|
- name: "tratamientos_catalogo"
|
||||||
|
descripcion: "Catalogo de tratamientos por tenant"
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "codigo: VARCHAR(20)"
|
||||||
|
- "nombre: VARCHAR(100)"
|
||||||
|
- "categoria: VARCHAR(50)"
|
||||||
|
- "duracion_minutos: INTEGER"
|
||||||
|
- "precio_base: NUMERIC(10,2)"
|
||||||
|
- "requiere_rx: BOOLEAN"
|
||||||
|
- "requiere_anestesia: BOOLEAN"
|
||||||
|
|
||||||
|
tablas:
|
||||||
|
- name: "odontogramas"
|
||||||
|
descripcion: "Odontogramas de pacientes"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK (clinica.patients)"
|
||||||
|
- "fecha_creacion: DATE"
|
||||||
|
- "fecha_actualizacion: DATE"
|
||||||
|
- "notas: TEXT"
|
||||||
|
indices:
|
||||||
|
- "idx_odontogramas_tenant"
|
||||||
|
- "idx_odontogramas_patient"
|
||||||
|
|
||||||
|
- name: "odontograma_piezas"
|
||||||
|
descripcion: "Estado de cada pieza en el odontograma"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "odontograma_id: UUID FK"
|
||||||
|
- "pieza_id: UUID FK (piezas_dentales)"
|
||||||
|
- "estado: dental.estado_pieza"
|
||||||
|
- "caras_afectadas: JSONB"
|
||||||
|
- "observaciones: TEXT"
|
||||||
|
indices:
|
||||||
|
- "idx_odontograma_piezas_odontograma"
|
||||||
|
- "idx_odontograma_piezas_pieza"
|
||||||
|
|
||||||
|
- name: "tratamientos_paciente"
|
||||||
|
descripcion: "Tratamientos realizados a pacientes"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK"
|
||||||
|
- "odontograma_id: UUID FK"
|
||||||
|
- "tratamiento_id: UUID FK (tratamientos_catalogo)"
|
||||||
|
- "odontologo_id: UUID FK"
|
||||||
|
- "consultation_id: UUID FK"
|
||||||
|
- "pieza_id: UUID FK"
|
||||||
|
- "caras_tratadas: dental.cara_dental[]"
|
||||||
|
- "fecha_inicio: DATE"
|
||||||
|
- "fecha_fin: DATE"
|
||||||
|
- "estado: dental.estado_tratamiento"
|
||||||
|
- "precio: NUMERIC(10,2)"
|
||||||
|
- "descuento: NUMERIC(5,2)"
|
||||||
|
- "precio_final: NUMERIC(10,2)"
|
||||||
|
indices:
|
||||||
|
- "idx_tratamientos_paciente_tenant"
|
||||||
|
- "idx_tratamientos_paciente_patient"
|
||||||
|
- "idx_tratamientos_paciente_estado"
|
||||||
|
|
||||||
|
- name: "ortodoncia"
|
||||||
|
descripcion: "Casos de ortodoncia"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK"
|
||||||
|
- "odontologo_id: UUID FK"
|
||||||
|
- "tipo: dental.tipo_ortodoncia"
|
||||||
|
- "marca: VARCHAR(100)"
|
||||||
|
- "fecha_inicio: DATE"
|
||||||
|
- "fecha_estimada_fin: DATE"
|
||||||
|
- "fecha_real_fin: DATE"
|
||||||
|
- "estado: dental.estado_tratamiento"
|
||||||
|
- "meses_estimados: INTEGER"
|
||||||
|
- "costo_total: NUMERIC(10,2)"
|
||||||
|
- "enganche: NUMERIC(10,2)"
|
||||||
|
- "mensualidad: NUMERIC(10,2)"
|
||||||
|
indices:
|
||||||
|
- "idx_ortodoncia_tenant"
|
||||||
|
- "idx_ortodoncia_patient"
|
||||||
|
- "idx_ortodoncia_estado"
|
||||||
|
|
||||||
|
- name: "ortodoncia_citas"
|
||||||
|
descripcion: "Citas de seguimiento de ortodoncia"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "ortodoncia_id: UUID FK"
|
||||||
|
- "appointment_id: UUID FK"
|
||||||
|
- "fecha: DATE"
|
||||||
|
- "numero_cita: INTEGER"
|
||||||
|
- "procedimiento: TEXT"
|
||||||
|
- "arco_superior: VARCHAR(50)"
|
||||||
|
- "arco_inferior: VARCHAR(50)"
|
||||||
|
- "ligas: VARCHAR(50)"
|
||||||
|
- "proxima_cita: DATE"
|
||||||
|
indices:
|
||||||
|
- "idx_ortodoncia_citas_ortodoncia"
|
||||||
|
|
||||||
|
- name: "protesis"
|
||||||
|
descripcion: "Trabajos protesicos"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK"
|
||||||
|
- "odontologo_id: UUID FK"
|
||||||
|
- "tipo: VARCHAR(50)"
|
||||||
|
- "piezas_involucradas: TEXT[]"
|
||||||
|
- "laboratorio_id: UUID FK"
|
||||||
|
- "fecha_envio_lab: DATE"
|
||||||
|
- "fecha_recepcion_lab: DATE"
|
||||||
|
- "material: VARCHAR(100)"
|
||||||
|
- "color: VARCHAR(50)"
|
||||||
|
- "estado: dental.estado_tratamiento"
|
||||||
|
- "fecha_colocacion: DATE"
|
||||||
|
- "tiene_garantia: BOOLEAN"
|
||||||
|
- "meses_garantia: INTEGER"
|
||||||
|
- "costo_laboratorio: NUMERIC(10,2)"
|
||||||
|
- "precio_paciente: NUMERIC(10,2)"
|
||||||
|
indices:
|
||||||
|
- "idx_protesis_tenant"
|
||||||
|
- "idx_protesis_patient"
|
||||||
|
|
||||||
|
- name: "radiografias"
|
||||||
|
descripcion: "Radiografias dentales"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK"
|
||||||
|
- "consultation_id: UUID FK"
|
||||||
|
- "tipo: VARCHAR(50)"
|
||||||
|
- "pieza_id: UUID FK"
|
||||||
|
- "fecha: DATE"
|
||||||
|
- "url_imagen: VARCHAR(255)"
|
||||||
|
- "interpretacion: TEXT"
|
||||||
|
indices:
|
||||||
|
- "idx_radiografias_tenant"
|
||||||
|
- "idx_radiografias_patient"
|
||||||
|
|
||||||
|
- name: "presupuestos"
|
||||||
|
descripcion: "Presupuestos de tratamiento"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "patient_id: UUID FK"
|
||||||
|
- "odontologo_id: UUID FK"
|
||||||
|
- "numero: VARCHAR(20)"
|
||||||
|
- "fecha: DATE"
|
||||||
|
- "fecha_vencimiento: DATE"
|
||||||
|
- "estado: VARCHAR(20)"
|
||||||
|
- "subtotal: NUMERIC(12,2)"
|
||||||
|
- "descuento_porcentaje: NUMERIC(5,2)"
|
||||||
|
- "descuento_monto: NUMERIC(12,2)"
|
||||||
|
- "total: NUMERIC(12,2)"
|
||||||
|
- "requiere_financiamiento: BOOLEAN"
|
||||||
|
- "enganche: NUMERIC(12,2)"
|
||||||
|
- "numero_pagos: INTEGER"
|
||||||
|
- "monto_pago: NUMERIC(12,2)"
|
||||||
|
indices:
|
||||||
|
- "idx_presupuestos_tenant"
|
||||||
|
- "idx_presupuestos_patient"
|
||||||
|
- "idx_presupuestos_estado"
|
||||||
|
|
||||||
|
- name: "presupuesto_lineas"
|
||||||
|
descripcion: "Lineas de presupuesto"
|
||||||
|
rls: true
|
||||||
|
columnas:
|
||||||
|
- "id: UUID PK"
|
||||||
|
- "tenant_id: UUID FK"
|
||||||
|
- "presupuesto_id: UUID FK"
|
||||||
|
- "tratamiento_id: UUID FK"
|
||||||
|
- "pieza_id: UUID FK"
|
||||||
|
- "descripcion: TEXT"
|
||||||
|
- "cantidad: INTEGER"
|
||||||
|
- "precio_unitario: NUMERIC(10,2)"
|
||||||
|
- "descuento: NUMERIC(5,2)"
|
||||||
|
- "subtotal: NUMERIC(10,2)"
|
||||||
|
- "sequence: INTEGER"
|
||||||
|
indices:
|
||||||
|
- "idx_presupuesto_lineas_presupuesto"
|
||||||
|
|
||||||
|
resumen:
|
||||||
|
total_enums: 4
|
||||||
|
total_catalogos: 2
|
||||||
|
total_tablas: 10
|
||||||
|
total_con_rls: 10
|
||||||
|
archivos_ddl:
|
||||||
|
- "database/schemas/01-dental-schema-ddl.sql"
|
||||||
|
archivos_seeds:
|
||||||
|
- "database/seeds/fase8/01-dental-catalogos.sql"
|
||||||
|
|
||||||
|
ultima_actualizacion: "2026-01-07"
|
||||||
|
actualizado_por: "Orquestador Workspace"
|
||||||
76
orchestration/inventarios/MASTER_INVENTORY.yml
Normal file
76
orchestration/inventarios/MASTER_INVENTORY.yml
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
# MASTER INVENTORY - Clinica Dental
|
||||||
|
# Version: 1.0.0
|
||||||
|
# Ultima actualizacion: 2026-01-07
|
||||||
|
|
||||||
|
proyecto: "clinica-dental"
|
||||||
|
descripcion: "ERP especializado para clinicas dentales"
|
||||||
|
version: "0.1.0"
|
||||||
|
estado: "desarrollo"
|
||||||
|
tipo: "vertical"
|
||||||
|
base: "erp-clinicas"
|
||||||
|
|
||||||
|
progreso:
|
||||||
|
fase_actual: "Database"
|
||||||
|
porcentaje: 15
|
||||||
|
database_completado: true
|
||||||
|
backend_completado: false
|
||||||
|
frontend_completado: false
|
||||||
|
|
||||||
|
herencia:
|
||||||
|
vertical_padre: "erp-clinicas"
|
||||||
|
suite_core: "erp-core"
|
||||||
|
modulos_heredados:
|
||||||
|
- "auth"
|
||||||
|
- "users"
|
||||||
|
- "tenants"
|
||||||
|
- "roles"
|
||||||
|
- "patients"
|
||||||
|
- "appointments"
|
||||||
|
- "billing"
|
||||||
|
|
||||||
|
modulos_especificos:
|
||||||
|
- id: "DENTAL-001"
|
||||||
|
nombre: "odontograma"
|
||||||
|
descripcion: "Registro grafico del estado dental"
|
||||||
|
estado: "ddl_completado"
|
||||||
|
|
||||||
|
- id: "DENTAL-002"
|
||||||
|
nombre: "tratamientos-dentales"
|
||||||
|
descripcion: "Procedimientos odontologicos"
|
||||||
|
estado: "ddl_completado"
|
||||||
|
|
||||||
|
- id: "DENTAL-003"
|
||||||
|
nombre: "ortodoncia"
|
||||||
|
descripcion: "Control de tratamientos ortodonticos"
|
||||||
|
estado: "ddl_completado"
|
||||||
|
|
||||||
|
- id: "DENTAL-004"
|
||||||
|
nombre: "protesis"
|
||||||
|
descripcion: "Registro de trabajos protesicos"
|
||||||
|
estado: "ddl_completado"
|
||||||
|
|
||||||
|
database:
|
||||||
|
schema: "dental"
|
||||||
|
archivo_ddl: "database/schemas/01-dental-schema-ddl.sql"
|
||||||
|
archivo_seeds: "database/seeds/fase8/01-dental-catalogos.sql"
|
||||||
|
tablas_especificas:
|
||||||
|
- "dental_pieces"
|
||||||
|
- "dental_charts"
|
||||||
|
- "dental_treatments"
|
||||||
|
- "orthodontic_cases"
|
||||||
|
- "prosthetics"
|
||||||
|
|
||||||
|
catalogos:
|
||||||
|
- "especialidades_odontologicas"
|
||||||
|
- "estados_piezas_dentales"
|
||||||
|
- "caras_dentales"
|
||||||
|
- "tipos_tratamiento_dental"
|
||||||
|
|
||||||
|
proximas_tareas:
|
||||||
|
- "Implementar backend modulo odontograma"
|
||||||
|
- "Crear frontend para odontograma digital"
|
||||||
|
- "Integracion con erp-clinicas"
|
||||||
|
|
||||||
|
ultima_actualizacion: "2026-01-07"
|
||||||
|
actualizado_por: "Orquestador"
|
||||||
209
orchestration/trazas/REPORTE-EJECUCION-SPRINT6-2026-01-07.md
Normal file
209
orchestration/trazas/REPORTE-EJECUCION-SPRINT6-2026-01-07.md
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
# Reporte de Ejecucion - Sprint 6
|
||||||
|
## Clinica Dental Documentation
|
||||||
|
|
||||||
|
**Fecha:** 2026-01-07
|
||||||
|
**Ejecutor:** Claude Opus 4.5 (Orquestador Workspace)
|
||||||
|
**Framework:** NEXUS v4.0 + SIMCO v2.5
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resumen Ejecutivo
|
||||||
|
|
||||||
|
Sprint 6 completado exitosamente. Se documentaron los 6 modulos especializados del sistema de clinica dental con especificaciones tecnicas completas, modelo de datos, endpoints API, flujos, y criterios de aceptacion.
|
||||||
|
|
||||||
|
## Tareas Ejecutadas
|
||||||
|
|
||||||
|
| ID | Tarea | Estado | Resultado |
|
||||||
|
|----|-------|--------|-----------|
|
||||||
|
| S6.1 | Explorar estructura | ✅ Completado | Proyecto analizado |
|
||||||
|
| S6.2 | Crear inventarios | ✅ Completado | DATABASE_INVENTORY.yml |
|
||||||
|
| S6.3 | Crear epicas modulos | ✅ Completado | 6 epicas |
|
||||||
|
| S6.4 | Validar Sprint 6 | ✅ Completado | Este reporte |
|
||||||
|
|
||||||
|
## Proyecto Analizado
|
||||||
|
|
||||||
|
### Informacion General
|
||||||
|
|
||||||
|
| Campo | Valor |
|
||||||
|
|-------|-------|
|
||||||
|
| Proyecto | clinica-dental |
|
||||||
|
| Tipo | ERP Especializado (Vertical) |
|
||||||
|
| Base | erp-clinicas |
|
||||||
|
| Suite Core | erp-core |
|
||||||
|
| Estado | Database completado, Backend pendiente |
|
||||||
|
|
||||||
|
### Herencia
|
||||||
|
|
||||||
|
```
|
||||||
|
erp-core
|
||||||
|
└── erp-clinicas
|
||||||
|
└── clinica-dental (DENTAL-001 a DENTAL-006)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Modulos heredados:**
|
||||||
|
- auth, users, tenants, roles (erp-core)
|
||||||
|
- patients, doctors, appointments, consultations (erp-clinicas)
|
||||||
|
|
||||||
|
## Archivos Creados
|
||||||
|
|
||||||
|
### Inventarios (1 archivo)
|
||||||
|
|
||||||
|
| Archivo | Ubicacion | Contenido |
|
||||||
|
|---------|-----------|-----------|
|
||||||
|
| DATABASE_INVENTORY.yml | orchestration/inventarios/ | 4 ENUMs, 2 catalogos, 10 tablas |
|
||||||
|
|
||||||
|
### Epicas (6 archivos)
|
||||||
|
|
||||||
|
| Archivo | Modulo | Estado DDL | Fase |
|
||||||
|
|---------|--------|------------|------|
|
||||||
|
| DENTAL-001-odontograma.md | Odontograma Digital | Completado | 1 - Core |
|
||||||
|
| DENTAL-002-tratamientos.md | Tratamientos Dentales | Completado | 2 - Tratamientos |
|
||||||
|
| DENTAL-003-ortodoncia.md | Ortodoncia | Completado | 3 - Especialidades |
|
||||||
|
| DENTAL-004-protesis.md | Protesis Dentales | Completado | 3 - Especialidades |
|
||||||
|
| DENTAL-005-radiografias.md | Radiografias | Completado | 4 - Optimizacion |
|
||||||
|
| DENTAL-006-presupuestos.md | Presupuestos | Completado | 2 - Tratamientos |
|
||||||
|
|
||||||
|
## Modelo de Datos Documentado
|
||||||
|
|
||||||
|
### Schema: dental
|
||||||
|
|
||||||
|
**ENUMs:**
|
||||||
|
| Nombre | Valores |
|
||||||
|
|--------|---------|
|
||||||
|
| estado_pieza | sano, caries, obturacion, endodoncia, corona, puente, implante, ausente, etc. |
|
||||||
|
| cara_dental | mesial, distal, oclusal, incisal, vestibular, bucal, lingual, palatino |
|
||||||
|
| estado_tratamiento | pendiente, en_proceso, completado, cancelado |
|
||||||
|
| tipo_ortodoncia | brackets_metalicos, brackets_esteticos, brackets_linguales, alineadores, removible, retenedor |
|
||||||
|
|
||||||
|
**Tablas:**
|
||||||
|
| Tabla | Descripcion | RLS |
|
||||||
|
|-------|-------------|-----|
|
||||||
|
| piezas_dentales | Catalogo 52 piezas FDI | No (catalogo) |
|
||||||
|
| tratamientos_catalogo | Procedimientos por tenant | Si |
|
||||||
|
| odontogramas | Odontogramas de pacientes | Si |
|
||||||
|
| odontograma_piezas | Estado por pieza | Si |
|
||||||
|
| tratamientos_paciente | Tratamientos realizados | Si |
|
||||||
|
| ortodoncia | Casos de ortodoncia | Si |
|
||||||
|
| ortodoncia_citas | Citas de seguimiento | Si |
|
||||||
|
| protesis | Trabajos protesicos | Si |
|
||||||
|
| radiografias | Radiografias dentales | Si |
|
||||||
|
| presupuestos | Presupuestos de tratamiento | Si |
|
||||||
|
| presupuesto_lineas | Lineas de presupuesto | Si |
|
||||||
|
|
||||||
|
## Nomenclatura FDI Documentada
|
||||||
|
|
||||||
|
```
|
||||||
|
SUPERIOR
|
||||||
|
Derecho | Izquierdo
|
||||||
|
18-11 | 21-28
|
||||||
|
---------|----------
|
||||||
|
48-41 | 31-38
|
||||||
|
Derecho | Izquierdo
|
||||||
|
INFERIOR
|
||||||
|
|
||||||
|
Dientes permanentes: 32 (cuadrantes 1-4)
|
||||||
|
Dientes deciduos: 20 (cuadrantes 5-8)
|
||||||
|
Total piezas catalogadas: 52
|
||||||
|
```
|
||||||
|
|
||||||
|
## Endpoints Documentados
|
||||||
|
|
||||||
|
| Modulo | Endpoints |
|
||||||
|
|--------|-----------|
|
||||||
|
| Odontograma | 8 endpoints |
|
||||||
|
| Tratamientos | 10 endpoints |
|
||||||
|
| Ortodoncia | 9 endpoints |
|
||||||
|
| Protesis | 9 endpoints |
|
||||||
|
| Radiografias | 8 endpoints |
|
||||||
|
| Presupuestos | 12 endpoints |
|
||||||
|
| **Total** | **56 endpoints** |
|
||||||
|
|
||||||
|
## Cobertura por Fase
|
||||||
|
|
||||||
|
```
|
||||||
|
Fase 1 - Core: 1 modulo (DENTAL-001)
|
||||||
|
Fase 2 - Tratamientos: 2 modulos (DENTAL-002, DENTAL-006)
|
||||||
|
Fase 3 - Especialidades: 2 modulos (DENTAL-003, DENTAL-004)
|
||||||
|
Fase 4 - Optimizacion: 1 modulo (DENTAL-005)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dependencias Entre Modulos
|
||||||
|
|
||||||
|
```
|
||||||
|
clinica.patients (erp-clinicas)
|
||||||
|
│
|
||||||
|
├── DENTAL-001 (Odontograma)
|
||||||
|
│ │
|
||||||
|
│ ├── DENTAL-002 (Tratamientos)
|
||||||
|
│ │ │
|
||||||
|
│ │ └── DENTAL-006 (Presupuestos)
|
||||||
|
│ │
|
||||||
|
│ ├── DENTAL-003 (Ortodoncia)
|
||||||
|
│ │
|
||||||
|
│ ├── DENTAL-004 (Protesis)
|
||||||
|
│ │
|
||||||
|
│ └── DENTAL-005 (Radiografias)
|
||||||
|
│
|
||||||
|
└── clinica.consultations
|
||||||
|
└── (vinculo a tratamientos y radiografias)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validacion de Calidad
|
||||||
|
|
||||||
|
### Checklist SIMCO
|
||||||
|
|
||||||
|
| Criterio | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| Metadata completa | ✅ |
|
||||||
|
| Objetivos definidos | ✅ |
|
||||||
|
| Alcance claro | ✅ |
|
||||||
|
| Modelo de datos | ✅ |
|
||||||
|
| Endpoints documentados | ✅ |
|
||||||
|
| Interfaz de servicio | ✅ |
|
||||||
|
| Flujos principales | ✅ |
|
||||||
|
| Dependencias mapeadas | ✅ |
|
||||||
|
| Criterios de aceptacion | ✅ |
|
||||||
|
|
||||||
|
### Consistencia
|
||||||
|
- Formato uniforme en todas las epicas
|
||||||
|
- Nomenclatura DENTAL-XXX consistente
|
||||||
|
- Estados de tratamiento uniformes
|
||||||
|
- Nomenclatura FDI correcta (52 piezas)
|
||||||
|
|
||||||
|
## Archivos DDL Existentes
|
||||||
|
|
||||||
|
| Archivo | Lineas | Estado |
|
||||||
|
|---------|--------|--------|
|
||||||
|
| database/schemas/01-dental-schema-ddl.sql | 503 | Completado |
|
||||||
|
| database/seeds/fase8/01-dental-catalogos.sql | (pendiente) | Referenciado |
|
||||||
|
|
||||||
|
## Metricas del Sprint
|
||||||
|
|
||||||
|
| Metrica | Valor |
|
||||||
|
|---------|-------|
|
||||||
|
| Archivos creados | 7 (1 inventario + 6 epicas) |
|
||||||
|
| Lineas documentadas | ~2,800 |
|
||||||
|
| Endpoints especificados | 56 |
|
||||||
|
| Tablas documentadas | 11 |
|
||||||
|
| ENUMs documentados | 4 |
|
||||||
|
| Piezas dentales FDI | 52 |
|
||||||
|
|
||||||
|
## Proximos Pasos
|
||||||
|
|
||||||
|
1. **Sprint 7:** Documentar clinica-veterinaria
|
||||||
|
2. **Sprint 8:** Consolidacion y validacion final
|
||||||
|
3. **Implementacion:** Backend modulos DENTAL-001 a DENTAL-006
|
||||||
|
4. **Frontend:** Componente OdontogramaViewer como prioridad
|
||||||
|
|
||||||
|
## Observaciones
|
||||||
|
|
||||||
|
- Proyecto hereda correctamente de erp-clinicas
|
||||||
|
- DDL ya implementado y funcional
|
||||||
|
- Documentacion alineada con VISION.md existente
|
||||||
|
- Nomenclatura FDI completamente catalogada
|
||||||
|
- 10 de 11 tablas con RLS habilitado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Sprint 6 Completado:** 2026-01-07
|
||||||
|
**Validado por:** Orquestador Workspace (NEXUS v4.0)
|
||||||
52
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
52
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# TRAZA DE TAREAS - DATABASE
|
||||||
|
|
||||||
|
**Proyecto:** clinica-dental
|
||||||
|
**Capa:** Database
|
||||||
|
**Version:** 1.0.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HISTORIAL
|
||||||
|
|
||||||
|
### [2026-01-04] DENTAL-DDL-001
|
||||||
|
**Estado:** completado
|
||||||
|
**Agente:** Database-Agent
|
||||||
|
**Duracion:** ~2h
|
||||||
|
|
||||||
|
#### Descripcion
|
||||||
|
Creacion del schema dental con tablas especificas para odontologia.
|
||||||
|
|
||||||
|
#### Archivos Creados
|
||||||
|
- `database/schemas/01-dental-schema-ddl.sql`
|
||||||
|
|
||||||
|
#### Resultado
|
||||||
|
Schema dental creado con tablas para odontograma, tratamientos, ortodoncia y protesis.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### [2026-01-04] DENTAL-SEEDS-001
|
||||||
|
**Estado:** completado
|
||||||
|
**Agente:** Database-Agent
|
||||||
|
**Duracion:** ~1h
|
||||||
|
|
||||||
|
#### Descripcion
|
||||||
|
Seeds iniciales con catalogos odontologicos.
|
||||||
|
|
||||||
|
#### Archivos Creados
|
||||||
|
- `database/seeds/fase8/01-dental-catalogos.sql`
|
||||||
|
|
||||||
|
#### Resultado
|
||||||
|
Catalogos cargados: especialidades, estados de piezas, caras dentales.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## TAREAS PENDIENTES
|
||||||
|
|
||||||
|
| ID | Tarea | Prioridad | Dependencias |
|
||||||
|
|----|-------|-----------|--------------|
|
||||||
|
| DENTAL-DDL-002 | RLS policies para tablas dental | P1 | - |
|
||||||
|
| DENTAL-DDL-003 | Funciones de validacion odontograma | P2 | - |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ultima actualizacion:** 2026-01-07
|
||||||
Loading…
Reference in New Issue
Block a user