[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