commit 53da75ddc7c14e1be1d583d99273b0f5a1add8e4 Author: rckrdmrd Date: Sat Jan 10 11:29:18 2026 -0600 [MIGRATION-V2] feat: Migrar clinica-veterinaria a estructura v2 - Prefijo v2: CVT - TRACEABILITY-MASTER.yml creado - Listo para integracion como submodulo Workspace: v2.0.0 | SIMCO: v4.0.0 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f37529b --- /dev/null +++ b/.env.example @@ -0,0 +1,271 @@ +# ============================================================================= +# .env.example - CLINICA VETERINARIA +# ============================================================================= +# 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-veterinaria +APP_VERSION=1.0.0 + +# ============================================================================= +# PUERTOS - Asignados por DEVENV-PORTS-INVENTORY.yml +# ============================================================================= +FRONTEND_PORT=3120 +BACKEND_PORT=3121 + +# Alias para compatibilidad +PORT=3121 + +# ============================================================================= +# BASE DE DATOS - PostgreSQL +# ============================================================================= +# Desarrollo: Puerto 5440 (asignado en DEVENV-PORTS-INVENTORY.yml) +# Produccion: Puerto 5432 (estandar) +# ============================================================================= + +DB_HOST=localhost +DB_PORT=5440 +DB_NAME=clinica_veterinaria_dev +DB_USER=veterinaria_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_veterinaria_test + +# Staging (servidor externo) +# DB_HOST_STAGING=staging-db.example.com +# DB_NAME_STAGING=clinica_veterinaria_staging +# DB_USER_STAGING=veterinaria_staging + +# Produccion (servidor externo) +# DB_HOST_PROD=prod-db.example.com +# DB_NAME_PROD=clinica_veterinaria_prod +# DB_USER_PROD=veterinaria_prod + +# ============================================================================= +# REDIS - Cache y Sesiones +# ============================================================================= +# Desarrollo: Puerto 6387 (asignado en DEVENV-PORTS-INVENTORY.yml) +# Produccion: Puerto 6379 (estandar) +# ============================================================================= + +REDIS_HOST=localhost +REDIS_PORT=6387 +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=128mb + +# ============================================================================= +# 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:3120 + +# Multiples origenes separados por coma +ALLOWED_ORIGINS=http://localhost:3120,http://localhost:3121 + +# 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 +# ============================================================================= + +# Tipo: local, s3, minio +STORAGE_TYPE=local + +# Path local (para desarrollo) +STORAGE_PATH=./uploads + +# Tamano maximo de archivo (10MB en bytes) +MAX_FILE_SIZE=10485760 + +# Tipos permitidos +ALLOWED_FILE_TYPES=image/jpeg,image/png,application/pdf + +# ============================================================================= +# AWS S3 (para produccion) +# ============================================================================= + +# AWS_ACCESS_KEY_ID= +# AWS_SECRET_ACCESS_KEY= +# AWS_REGION=us-east-1 +# AWS_S3_BUCKET=clinica-veterinaria-uploads + +# ============================================================================= +# 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 Veterinaria +SMTP_FROM_EMAIL=noreply@clinica-vet.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 VETERINARIA +# ============================================================================= + +# Recordatorios de vacunacion (dias antes) +VACCINATION_REMINDER_DAYS=7 + +# Intervalo de monitoreo hospitalizacion (minutos) +HOSPITALIZATION_MONITOR_INTERVAL=30 + +# Formatos de chip aceptados +CHIP_FORMATS=ISO11784,ISO11785,FDXA,FDXB + +# ============================================================================= +# DESARROLLO Y DEBUG +# ============================================================================= + +# Habilitar debug de TypeORM +# TYPEORM_LOGGING=true + +# Swagger UI +SWAGGER_ENABLED=true +SWAGGER_TITLE=Clinica Veterinaria 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) +# +# 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 +# ============================================================================= + +# ============================================================================= +# 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 +# ============================================================================= diff --git a/.env.ports b/.env.ports new file mode 100644 index 0000000..a68af9d --- /dev/null +++ b/.env.ports @@ -0,0 +1,20 @@ +# ============================================================================= +# .env.ports - CLINICA VETERINARIA +# ============================================================================= +# Archivo de referencia de puertos asignados +# Generado por: @PERFIL_DEVENV +# ============================================================================= + +# Servicios principales +FRONTEND_PORT=3120 +BACKEND_PORT=3121 + +# Base de datos +DB_PORT=5440 + +# Redis +REDIS_PORT=6387 + +# ============================================================================= +# Referencia: DEVENV-PORTS-INVENTORY.yml +# ============================================================================= diff --git a/README.md b/README.md new file mode 100644 index 0000000..01e166e --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Clinica Veterinaria - ERP Especializado + +**Version:** 0.1.0 +**Estado:** Desarrollo +**Tipo:** VERTICAL (erp-clinicas) +**Sistema:** SIMCO + NEXUS v3.4 + +--- + +## Descripcion + +Sistema de gestion integral para clinicas veterinarias. Vertical especializada basada en erp-clinicas. + +### Funcionalidades Principales + +- Gestion de mascotas (pacientes) con datos completos +- Consultas veterinarias: diagnosticos y tratamientos +- Cartilla de vacunacion y desparasitacion +- Control de hospitalizacion +- Servicios de estetica canina/felina +- Farmacia veterinaria e inventario +- Facturacion de servicios y productos + +--- + +## Stack Tecnologico + +| Capa | Tecnologia | +|------|------------| +| Database | PostgreSQL 16+ con RLS | +| Backend | (pendiente) Express.js / NestJS | +| Frontend | (pendiente) React + Vite | + +--- + +## Estructura del Proyecto + +``` +clinica-veterinaria/ +├── database/ +│ ├── schemas/ # DDL especifico veterinaria +│ └── 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-veterinaria-schema-ddl.sql +psql -d erp_clinicas -f database/seeds/fase8/01-veterinaria-catalogos.sql +``` + +--- + +## Referencias + +- Contexto: `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` +- Herencia: `orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md` +- Inventario: `orchestration/inventarios/MASTER_INVENTORY.yml` + +--- + +**Creado:** 2026-01-04 +**Actualizado:** 2026-01-07 diff --git a/database/schemas/01-veterinaria-schema-ddl.sql b/database/schemas/01-veterinaria-schema-ddl.sql new file mode 100644 index 0000000..5959b93 --- /dev/null +++ b/database/schemas/01-veterinaria-schema-ddl.sql @@ -0,0 +1,387 @@ +-- ============================================================================ +-- VETERINARIA SCHEMA - Especialización de ERP-Clínicas +-- Clínica Veterinaria +-- ============================================================================ +-- Fecha: 2026-01-04 +-- Versión: 1.0 +-- Hereda de: erp-clinicas FASE-8 +-- ============================================================================ + +-- Schema +CREATE SCHEMA IF NOT EXISTS veterinaria; + +-- ============================================================================ +-- ENUMS +-- ============================================================================ + +DO $$ BEGIN + CREATE TYPE veterinaria.sexo_animal AS ENUM ('macho', 'hembra', 'desconocido'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE veterinaria.estado_hospitalizacion AS ENUM ( + 'ingresado', 'en_tratamiento', 'estable', 'critico', 'alta', 'fallecido' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +-- ============================================================================ +-- CATÁLOGOS +-- ============================================================================ + +-- Especies +CREATE TABLE IF NOT EXISTS veterinaria.especies ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + nombre VARCHAR(50) NOT NULL, + nombre_cientifico VARCHAR(100), + descripcion TEXT, + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.especies IS 'Catálogo de especies animales'; + +-- Razas +CREATE TABLE IF NOT EXISTS veterinaria.razas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + especie_id UUID NOT NULL REFERENCES veterinaria.especies(id) ON DELETE CASCADE, + nombre VARCHAR(100) NOT NULL, + descripcion TEXT, + tamanio_promedio VARCHAR(20), -- 'pequeño', 'mediano', 'grande', 'gigante' + peso_promedio_kg NUMERIC(5,2), + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.razas IS 'Catálogo de razas por especie'; + +-- Vacunas +CREATE TABLE IF NOT EXISTS veterinaria.vacunas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + nombre VARCHAR(100) NOT NULL, + descripcion TEXT, + especie_id UUID REFERENCES veterinaria.especies(id), + laboratorio VARCHAR(100), + dosis_ml NUMERIC(5,2), + intervalo_refuerzo_dias INTEGER, + es_obligatoria BOOLEAN DEFAULT false, + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.vacunas IS 'Catálogo de vacunas veterinarias'; + +-- ============================================================================ +-- TABLAS PRINCIPALES +-- ============================================================================ + +-- Propietarios (dueños de mascotas) +CREATE TABLE IF NOT EXISTS veterinaria.propietarios ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + partner_id UUID, -- Referencia opcional a core.partners + nombre VARCHAR(100) NOT NULL, + apellidos VARCHAR(100), + telefono VARCHAR(20), + telefono_emergencia VARCHAR(20), + email VARCHAR(100), + direccion TEXT, + rfc VARCHAR(13), + -- Control + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.propietarios IS 'Propietarios/dueños de mascotas'; + +-- Mascotas (pacientes) +CREATE TABLE IF NOT EXISTS veterinaria.mascotas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + propietario_id UUID NOT NULL REFERENCES veterinaria.propietarios(id), + especie_id UUID NOT NULL REFERENCES veterinaria.especies(id), + raza_id UUID REFERENCES veterinaria.razas(id), + -- Datos básicos + nombre VARCHAR(100) NOT NULL, + sexo veterinaria.sexo_animal DEFAULT 'desconocido', + fecha_nacimiento DATE, + edad_aproximada VARCHAR(50), -- "3 años", "6 meses" + color VARCHAR(50), + peso_kg NUMERIC(6,2), + -- Identificación + numero_chip VARCHAR(50), + tiene_chip BOOLEAN DEFAULT false, + -- Estado + esterilizado BOOLEAN DEFAULT false, + fecha_esterilizacion DATE, + -- Notas + alergias TEXT, + condiciones_especiales TEXT, + notas TEXT, + -- Foto + foto_url VARCHAR(255), + -- Control + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.mascotas IS 'Mascotas/pacientes de la clínica veterinaria'; + +-- Cartilla de vacunación +CREATE TABLE IF NOT EXISTS veterinaria.cartilla_vacunacion ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id) ON DELETE CASCADE, + vacuna_id UUID NOT NULL REFERENCES veterinaria.vacunas(id), + veterinario_id UUID, -- Referencia a clinica.doctors + -- Datos de aplicación + fecha_aplicacion DATE NOT NULL, + fecha_proximo_refuerzo DATE, + lote VARCHAR(50), + laboratorio VARCHAR(100), + -- Notas + observaciones TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.cartilla_vacunacion IS 'Historial de vacunación de mascotas'; + +-- Desparasitaciones +CREATE TABLE IF NOT EXISTS veterinaria.desparasitaciones ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id) ON DELETE CASCADE, + veterinario_id UUID, + -- Datos + tipo VARCHAR(50) NOT NULL, -- 'interna', 'externa', 'ambas' + producto VARCHAR(100) NOT NULL, + dosis VARCHAR(50), + via_administracion VARCHAR(50), + fecha_aplicacion DATE NOT NULL, + fecha_proxima DATE, + -- Notas + observaciones TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.desparasitaciones IS 'Historial de desparasitaciones'; + +-- Hospitalización +CREATE TABLE IF NOT EXISTS veterinaria.hospitalizacion ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id), + veterinario_id UUID, + consultation_id UUID, -- Referencia a clinica.consultations + -- Datos de ingreso + fecha_ingreso TIMESTAMPTZ NOT NULL DEFAULT NOW(), + motivo_ingreso TEXT NOT NULL, + diagnostico_ingreso TEXT, + -- Ubicación + area VARCHAR(50), -- 'jaula_pequena', 'jaula_grande', 'quirofano', 'uci' + numero_jaula VARCHAR(20), + -- Estado + estado veterinaria.estado_hospitalizacion DEFAULT 'ingresado', + -- Alta + fecha_alta TIMESTAMPTZ, + diagnostico_alta TEXT, + instrucciones_alta TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.hospitalizacion IS 'Registro de hospitalizaciones'; + +-- Monitoreo de hospitalización +CREATE TABLE IF NOT EXISTS veterinaria.hospitalizacion_monitoreo ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + hospitalizacion_id UUID NOT NULL REFERENCES veterinaria.hospitalizacion(id) ON DELETE CASCADE, + -- Signos vitales + fecha_hora TIMESTAMPTZ NOT NULL DEFAULT NOW(), + peso_kg NUMERIC(6,2), + temperatura NUMERIC(4,1), + frecuencia_cardiaca INTEGER, + frecuencia_respiratoria INTEGER, + -- Alimentación + comio BOOLEAN, + bebio_agua BOOLEAN, + -- Eliminación + orino BOOLEAN, + defeco BOOLEAN, + consistencia_heces VARCHAR(50), + -- Estado + estado_animo VARCHAR(50), + nivel_dolor INTEGER CHECK (nivel_dolor BETWEEN 0 AND 10), + -- Notas + observaciones TEXT, + registrado_por UUID, -- employee_id + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.hospitalizacion_monitoreo IS 'Monitoreo durante hospitalización'; + +-- Servicios de estética +CREATE TABLE IF NOT EXISTS veterinaria.estetica ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id), + estilista_id UUID, -- employee_id + -- Servicios + fecha_servicio TIMESTAMPTZ NOT NULL DEFAULT NOW(), + servicios TEXT[], -- ['baño', 'corte', 'limpieza_oidos', 'corte_unas'] + tipo_corte VARCHAR(50), + shampoo_usado VARCHAR(100), + -- Estado + estado VARCHAR(20) DEFAULT 'pendiente', -- 'pendiente', 'en_proceso', 'terminado' + hora_inicio TIME, + hora_fin TIME, + -- Notas + observaciones TEXT, + observaciones_piel TEXT, + -- Precio + precio NUMERIC(10,2), + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.estetica IS 'Servicios de estética/grooming'; + +-- ============================================================================ +-- EXTENSIONES A TABLAS DE ERP-CLINICAS +-- ============================================================================ + +-- Extensión a clinica.consultations (si existe) +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables + WHERE table_schema = 'clinica' AND table_name = 'consultations') THEN + + -- mascota_id + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'mascota_id') THEN + ALTER TABLE clinica.consultations ADD COLUMN mascota_id UUID + REFERENCES veterinaria.mascotas(id); + END IF; + + -- peso_actual + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'peso_actual') THEN + ALTER TABLE clinica.consultations ADD COLUMN peso_actual NUMERIC(6,2); + END IF; + + -- temperatura + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'temperatura') THEN + ALTER TABLE clinica.consultations ADD COLUMN temperatura NUMERIC(4,1); + END IF; + + END IF; +END $$; + +-- ============================================================================ +-- ÍNDICES +-- ============================================================================ + +CREATE INDEX IF NOT EXISTS idx_especies_tenant ON veterinaria.especies(tenant_id); +CREATE INDEX IF NOT EXISTS idx_razas_tenant ON veterinaria.razas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_razas_especie ON veterinaria.razas(especie_id); +CREATE INDEX IF NOT EXISTS idx_vacunas_tenant ON veterinaria.vacunas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_vacunas_especie ON veterinaria.vacunas(especie_id); + +CREATE INDEX IF NOT EXISTS idx_propietarios_tenant ON veterinaria.propietarios(tenant_id); +CREATE INDEX IF NOT EXISTS idx_propietarios_telefono ON veterinaria.propietarios(telefono); + +CREATE INDEX IF NOT EXISTS idx_mascotas_tenant ON veterinaria.mascotas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_propietario ON veterinaria.mascotas(propietario_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_especie ON veterinaria.mascotas(especie_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_chip ON veterinaria.mascotas(numero_chip) WHERE numero_chip IS NOT NULL; + +CREATE INDEX IF NOT EXISTS idx_cartilla_tenant ON veterinaria.cartilla_vacunacion(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cartilla_mascota ON veterinaria.cartilla_vacunacion(mascota_id); +CREATE INDEX IF NOT EXISTS idx_cartilla_fecha ON veterinaria.cartilla_vacunacion(fecha_proximo_refuerzo); + +CREATE INDEX IF NOT EXISTS idx_desparasitaciones_tenant ON veterinaria.desparasitaciones(tenant_id); +CREATE INDEX IF NOT EXISTS idx_desparasitaciones_mascota ON veterinaria.desparasitaciones(mascota_id); + +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_tenant ON veterinaria.hospitalizacion(tenant_id); +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_mascota ON veterinaria.hospitalizacion(mascota_id); +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_estado ON veterinaria.hospitalizacion(tenant_id, estado); + +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_monitoreo_hosp ON veterinaria.hospitalizacion_monitoreo(hospitalizacion_id); + +CREATE INDEX IF NOT EXISTS idx_estetica_tenant ON veterinaria.estetica(tenant_id); +CREATE INDEX IF NOT EXISTS idx_estetica_mascota ON veterinaria.estetica(mascota_id); +CREATE INDEX IF NOT EXISTS idx_estetica_fecha ON veterinaria.estetica(fecha_servicio); + +-- ============================================================================ +-- RLS +-- ============================================================================ + +ALTER TABLE veterinaria.especies ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.razas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.vacunas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.propietarios ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.mascotas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.cartilla_vacunacion ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.desparasitaciones ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.hospitalizacion ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.hospitalizacion_monitoreo ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.estetica ENABLE ROW LEVEL SECURITY; + +DROP POLICY IF EXISTS tenant_isolation_especies ON veterinaria.especies; +CREATE POLICY tenant_isolation_especies ON veterinaria.especies + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_razas ON veterinaria.razas; +CREATE POLICY tenant_isolation_razas ON veterinaria.razas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_vacunas ON veterinaria.vacunas; +CREATE POLICY tenant_isolation_vacunas ON veterinaria.vacunas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_propietarios ON veterinaria.propietarios; +CREATE POLICY tenant_isolation_propietarios ON veterinaria.propietarios + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_mascotas ON veterinaria.mascotas; +CREATE POLICY tenant_isolation_mascotas ON veterinaria.mascotas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_cartilla ON veterinaria.cartilla_vacunacion; +CREATE POLICY tenant_isolation_cartilla ON veterinaria.cartilla_vacunacion + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_desparasitaciones ON veterinaria.desparasitaciones; +CREATE POLICY tenant_isolation_desparasitaciones ON veterinaria.desparasitaciones + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_hospitalizacion ON veterinaria.hospitalizacion; +CREATE POLICY tenant_isolation_hospitalizacion ON veterinaria.hospitalizacion + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_hosp_monitoreo ON veterinaria.hospitalizacion_monitoreo; +CREATE POLICY tenant_isolation_hosp_monitoreo ON veterinaria.hospitalizacion_monitoreo + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_estetica ON veterinaria.estetica; +CREATE POLICY tenant_isolation_estetica ON veterinaria.estetica + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +-- ============================================================================ +-- FIN VETERINARIA SCHEMA +-- ============================================================================ diff --git a/database/schemas/02-veterinaria-farmacia-ddl.sql b/database/schemas/02-veterinaria-farmacia-ddl.sql new file mode 100644 index 0000000..2287e32 --- /dev/null +++ b/database/schemas/02-veterinaria-farmacia-ddl.sql @@ -0,0 +1,464 @@ +-- ============================================================================ +-- VETERINARIA SCHEMA - Farmacia (VET-006) +-- Sistema de gestion de farmacia veterinaria +-- ============================================================================ +-- Fecha: 2026-01-07 +-- Version: 1.0 +-- Basado en: VET-006-farmacia.md +-- ============================================================================ + +-- ============================================================================ +-- ENUMS +-- ============================================================================ + +DO $$ BEGIN + CREATE TYPE veterinaria.categoria_medicamento AS ENUM ( + 'antibiotico', + 'antiparasitario', + 'analgesico', + 'antiinflamatorio', + 'vacuna', + 'vitamina', + 'dermatologico', + 'oftalmico', + 'cardiaco', + 'digestivo', + 'otro' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE veterinaria.tipo_movimiento_farmacia AS ENUM ( + 'entrada', + 'salida', + 'ajuste_positivo', + 'ajuste_negativo', + 'devolucion', + 'merma' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE veterinaria.fraccion_controlada AS ENUM ( + 'no_controlado', + 'fraccion_i', + 'fraccion_ii', + 'fraccion_iii', + 'fraccion_iv' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +-- ============================================================================ +-- TABLAS PRINCIPALES +-- ============================================================================ + +-- Catalogo de medicamentos +CREATE TABLE IF NOT EXISTS veterinaria.medicamentos ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + -- Identificacion + codigo VARCHAR(50), + nombre VARCHAR(150) NOT NULL, + nombre_comercial VARCHAR(150), + principio_activo VARCHAR(200), + -- Clasificacion + categoria veterinaria.categoria_medicamento DEFAULT 'otro', + -- Presentacion + presentacion VARCHAR(100), -- 'tabletas', 'inyectable', 'suspension', etc. + concentracion VARCHAR(50), -- '500mg', '100mg/ml' + contenido VARCHAR(50), -- '30 tabletas', '100ml' + -- Fabricante + laboratorio VARCHAR(100), + -- Control + requiere_receta BOOLEAN DEFAULT false, + controlado BOOLEAN DEFAULT false, + fraccion_controlada veterinaria.fraccion_controlada DEFAULT 'no_controlado', + -- Stock + stock_minimo INTEGER DEFAULT 10, + stock_actual INTEGER DEFAULT 0, + -- Precios + precio_compra NUMERIC(10,2), + precio_venta NUMERIC(10,2), + -- Especies aplicables (NULL = todas) + especies_aplicables UUID[], -- Array de especie_id + -- Estado + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.medicamentos IS 'Catalogo de medicamentos veterinarios'; + +-- Lotes de medicamentos (control de caducidad) +CREATE TABLE IF NOT EXISTS veterinaria.medicamentos_lotes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id) ON DELETE CASCADE, + -- Lote + numero_lote VARCHAR(50) NOT NULL, + fecha_caducidad DATE NOT NULL, + -- Cantidades + cantidad_inicial INTEGER NOT NULL, + cantidad_actual INTEGER NOT NULL, + -- Compra + precio_compra NUMERIC(10,2), + factura_compra VARCHAR(50), + proveedor VARCHAR(100), + fecha_recepcion DATE DEFAULT CURRENT_DATE, + -- Estado + bloqueado BOOLEAN DEFAULT false, -- Bloquear si esta vencido + motivo_bloqueo TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.medicamentos_lotes IS 'Lotes de medicamentos con control de caducidad'; + +-- Dispensaciones de medicamentos +CREATE TABLE IF NOT EXISTS veterinaria.dispensaciones ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + -- Referencias + medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id), + lote_id UUID NOT NULL REFERENCES veterinaria.medicamentos_lotes(id), + mascota_id UUID REFERENCES veterinaria.mascotas(id), + veterinario_id UUID, -- Referencia a clinica.doctors + receta_id UUID, -- Referencia a clinica.prescriptions si existe + consultation_id UUID, -- Referencia a clinica.consultations + -- Dispensacion + cantidad INTEGER NOT NULL, + fecha_dispensacion TIMESTAMPTZ DEFAULT NOW(), + -- Instrucciones + dosis VARCHAR(100), -- '1 tableta cada 8 horas' + duracion_tratamiento VARCHAR(50), -- '7 dias' + instrucciones TEXT, + -- Control + dispensado_por UUID, -- employee_id + notas TEXT, + -- Auditoria + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.dispensaciones IS 'Registro de dispensacion de medicamentos'; + +-- Movimientos de inventario (kardex) +CREATE TABLE IF NOT EXISTS veterinaria.movimientos_farmacia ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id), + lote_id UUID REFERENCES veterinaria.medicamentos_lotes(id), + -- Movimiento + tipo veterinaria.tipo_movimiento_farmacia NOT NULL, + cantidad INTEGER NOT NULL, + stock_anterior INTEGER NOT NULL, + stock_posterior INTEGER NOT NULL, + -- Referencia + referencia_tipo VARCHAR(50), -- 'dispensacion', 'compra', 'ajuste' + referencia_id UUID, + -- Detalles + motivo TEXT, + documento VARCHAR(100), -- Factura, nota, etc. + -- Auditoria + usuario_id UUID, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.movimientos_farmacia IS 'Kardex de movimientos de inventario de farmacia'; + +-- Bitacora de medicamentos controlados +CREATE TABLE IF NOT EXISTS veterinaria.bitacora_controlados ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id), + lote_id UUID REFERENCES veterinaria.medicamentos_lotes(id), + dispensacion_id UUID REFERENCES veterinaria.dispensaciones(id), + -- Movimiento + tipo_movimiento veterinaria.tipo_movimiento_farmacia NOT NULL, + cantidad INTEGER NOT NULL, + -- Paciente + mascota_id UUID REFERENCES veterinaria.mascotas(id), + propietario_nombre VARCHAR(200), -- Snapshot del nombre + -- Prescripcion + receta_id UUID, + veterinario_id UUID, + veterinario_cedula VARCHAR(50), + -- Justificacion + justificacion TEXT NOT NULL, + diagnostico TEXT, + -- Auditoria + fecha_registro TIMESTAMPTZ DEFAULT NOW(), + registrado_por UUID NOT NULL, + ip_address VARCHAR(45), + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.bitacora_controlados IS 'Bitacora de movimientos de medicamentos controlados (requerido por COFEPRIS)'; + +-- ============================================================================ +-- INDICES +-- ============================================================================ + +CREATE INDEX IF NOT EXISTS idx_medicamentos_tenant ON veterinaria.medicamentos(tenant_id); +CREATE INDEX IF NOT EXISTS idx_medicamentos_codigo ON veterinaria.medicamentos(tenant_id, codigo); +CREATE INDEX IF NOT EXISTS idx_medicamentos_nombre ON veterinaria.medicamentos(tenant_id, nombre); +CREATE INDEX IF NOT EXISTS idx_medicamentos_categoria ON veterinaria.medicamentos(tenant_id, categoria); +CREATE INDEX IF NOT EXISTS idx_medicamentos_controlado ON veterinaria.medicamentos(tenant_id, controlado) WHERE controlado = true; +CREATE INDEX IF NOT EXISTS idx_medicamentos_stock_bajo ON veterinaria.medicamentos(tenant_id) + WHERE stock_actual <= stock_minimo; + +CREATE INDEX IF NOT EXISTS idx_lotes_tenant ON veterinaria.medicamentos_lotes(tenant_id); +CREATE INDEX IF NOT EXISTS idx_lotes_medicamento ON veterinaria.medicamentos_lotes(medicamento_id); +CREATE INDEX IF NOT EXISTS idx_lotes_caducidad ON veterinaria.medicamentos_lotes(fecha_caducidad); +CREATE INDEX IF NOT EXISTS idx_lotes_numero ON veterinaria.medicamentos_lotes(tenant_id, numero_lote); +CREATE INDEX IF NOT EXISTS idx_lotes_proximos_caducar ON veterinaria.medicamentos_lotes(tenant_id, fecha_caducidad) + WHERE cantidad_actual > 0 AND bloqueado = false; + +CREATE INDEX IF NOT EXISTS idx_dispensaciones_tenant ON veterinaria.dispensaciones(tenant_id); +CREATE INDEX IF NOT EXISTS idx_dispensaciones_medicamento ON veterinaria.dispensaciones(medicamento_id); +CREATE INDEX IF NOT EXISTS idx_dispensaciones_mascota ON veterinaria.dispensaciones(mascota_id); +CREATE INDEX IF NOT EXISTS idx_dispensaciones_fecha ON veterinaria.dispensaciones(fecha_dispensacion); +CREATE INDEX IF NOT EXISTS idx_dispensaciones_veterinario ON veterinaria.dispensaciones(veterinario_id); + +CREATE INDEX IF NOT EXISTS idx_movimientos_tenant ON veterinaria.movimientos_farmacia(tenant_id); +CREATE INDEX IF NOT EXISTS idx_movimientos_medicamento ON veterinaria.movimientos_farmacia(medicamento_id); +CREATE INDEX IF NOT EXISTS idx_movimientos_fecha ON veterinaria.movimientos_farmacia(created_at); + +CREATE INDEX IF NOT EXISTS idx_bitacora_tenant ON veterinaria.bitacora_controlados(tenant_id); +CREATE INDEX IF NOT EXISTS idx_bitacora_medicamento ON veterinaria.bitacora_controlados(medicamento_id); +CREATE INDEX IF NOT EXISTS idx_bitacora_fecha ON veterinaria.bitacora_controlados(fecha_registro); + +-- ============================================================================ +-- RLS +-- ============================================================================ + +ALTER TABLE veterinaria.medicamentos ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.medicamentos_lotes ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.dispensaciones ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.movimientos_farmacia ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.bitacora_controlados ENABLE ROW LEVEL SECURITY; + +DROP POLICY IF EXISTS tenant_isolation_medicamentos ON veterinaria.medicamentos; +CREATE POLICY tenant_isolation_medicamentos ON veterinaria.medicamentos + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_lotes ON veterinaria.medicamentos_lotes; +CREATE POLICY tenant_isolation_lotes ON veterinaria.medicamentos_lotes + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_dispensaciones ON veterinaria.dispensaciones; +CREATE POLICY tenant_isolation_dispensaciones ON veterinaria.dispensaciones + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_movimientos ON veterinaria.movimientos_farmacia; +CREATE POLICY tenant_isolation_movimientos ON veterinaria.movimientos_farmacia + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_bitacora ON veterinaria.bitacora_controlados; +CREATE POLICY tenant_isolation_bitacora ON veterinaria.bitacora_controlados + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +-- ============================================================================ +-- TRIGGERS +-- ============================================================================ + +-- Trigger para actualizar stock_actual en medicamentos +CREATE OR REPLACE FUNCTION veterinaria.actualizar_stock_medicamento() +RETURNS TRIGGER AS $$ +BEGIN + IF TG_OP = 'INSERT' THEN + -- Actualizar stock del medicamento + UPDATE veterinaria.medicamentos + SET stock_actual = stock_actual + NEW.cantidad_inicial, + updated_at = NOW() + WHERE id = NEW.medicamento_id; + ELSIF TG_OP = 'UPDATE' THEN + -- Si cambia cantidad_actual + UPDATE veterinaria.medicamentos + SET stock_actual = ( + SELECT COALESCE(SUM(cantidad_actual), 0) + FROM veterinaria.medicamentos_lotes + WHERE medicamento_id = NEW.medicamento_id + AND bloqueado = false + ), + updated_at = NOW() + WHERE id = NEW.medicamento_id; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trg_actualizar_stock ON veterinaria.medicamentos_lotes; +CREATE TRIGGER trg_actualizar_stock + AFTER INSERT OR UPDATE OF cantidad_actual ON veterinaria.medicamentos_lotes + FOR EACH ROW + EXECUTE FUNCTION veterinaria.actualizar_stock_medicamento(); + +COMMENT ON FUNCTION veterinaria.actualizar_stock_medicamento() IS 'Actualiza stock_actual en medicamentos cuando cambian los lotes'; + +-- Trigger para registrar movimiento en dispensacion +CREATE OR REPLACE FUNCTION veterinaria.registrar_movimiento_dispensacion() +RETURNS TRIGGER AS $$ +DECLARE + v_stock_anterior INTEGER; +BEGIN + -- Obtener stock anterior + SELECT stock_actual INTO v_stock_anterior + FROM veterinaria.medicamentos + WHERE id = NEW.medicamento_id; + + -- Descontar del lote + UPDATE veterinaria.medicamentos_lotes + SET cantidad_actual = cantidad_actual - NEW.cantidad, + updated_at = NOW() + WHERE id = NEW.lote_id; + + -- Registrar movimiento + INSERT INTO veterinaria.movimientos_farmacia ( + tenant_id, medicamento_id, lote_id, + tipo, cantidad, stock_anterior, stock_posterior, + referencia_tipo, referencia_id, usuario_id + ) VALUES ( + NEW.tenant_id, NEW.medicamento_id, NEW.lote_id, + 'salida', NEW.cantidad, v_stock_anterior, v_stock_anterior - NEW.cantidad, + 'dispensacion', NEW.id, NEW.dispensado_por + ); + + -- Si es controlado, registrar en bitacora + IF EXISTS ( + SELECT 1 FROM veterinaria.medicamentos + WHERE id = NEW.medicamento_id AND controlado = true + ) THEN + INSERT INTO veterinaria.bitacora_controlados ( + tenant_id, medicamento_id, lote_id, dispensacion_id, + tipo_movimiento, cantidad, mascota_id, + propietario_nombre, receta_id, veterinario_id, + justificacion, registrado_por + ) + SELECT + NEW.tenant_id, NEW.medicamento_id, NEW.lote_id, NEW.id, + 'salida', NEW.cantidad, NEW.mascota_id, + CONCAT(p.nombre, ' ', COALESCE(p.apellidos, '')), + NEW.receta_id, NEW.veterinario_id, + COALESCE(NEW.notas, 'Dispensacion de medicamento'), + NEW.dispensado_por + FROM veterinaria.mascotas m + JOIN veterinaria.propietarios p ON m.propietario_id = p.id + WHERE m.id = NEW.mascota_id; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trg_registrar_dispensacion ON veterinaria.dispensaciones; +CREATE TRIGGER trg_registrar_dispensacion + AFTER INSERT ON veterinaria.dispensaciones + FOR EACH ROW + EXECUTE FUNCTION veterinaria.registrar_movimiento_dispensacion(); + +COMMENT ON FUNCTION veterinaria.registrar_movimiento_dispensacion() IS 'Registra movimiento y bitacora al dispensar medicamentos'; + +-- ============================================================================ +-- FUNCIONES DE CONSULTA +-- ============================================================================ + +-- Funcion para obtener lotes proximos a caducar +CREATE OR REPLACE FUNCTION veterinaria.get_lotes_proximos_caducar( + p_tenant_id UUID, + p_dias INTEGER DEFAULT 30 +) +RETURNS TABLE ( + lote_id UUID, + medicamento_id UUID, + medicamento_nombre VARCHAR, + numero_lote VARCHAR, + fecha_caducidad DATE, + dias_restantes INTEGER, + cantidad_actual INTEGER +) AS $$ +BEGIN + RETURN QUERY + SELECT + l.id AS lote_id, + m.id AS medicamento_id, + m.nombre AS medicamento_nombre, + l.numero_lote, + l.fecha_caducidad, + (l.fecha_caducidad - CURRENT_DATE)::INTEGER AS dias_restantes, + l.cantidad_actual + FROM veterinaria.medicamentos_lotes l + JOIN veterinaria.medicamentos m ON l.medicamento_id = m.id + WHERE l.tenant_id = p_tenant_id + AND l.cantidad_actual > 0 + AND l.bloqueado = false + AND l.fecha_caducidad <= CURRENT_DATE + p_dias + ORDER BY l.fecha_caducidad ASC; +END; +$$ LANGUAGE plpgsql; + +COMMENT ON FUNCTION veterinaria.get_lotes_proximos_caducar(UUID, INTEGER) IS 'Obtiene lotes que caducaran en los proximos N dias'; + +-- Funcion para obtener medicamentos con stock bajo +CREATE OR REPLACE FUNCTION veterinaria.get_medicamentos_stock_bajo(p_tenant_id UUID) +RETURNS TABLE ( + medicamento_id UUID, + codigo VARCHAR, + nombre VARCHAR, + stock_actual INTEGER, + stock_minimo INTEGER, + diferencia INTEGER +) AS $$ +BEGIN + RETURN QUERY + SELECT + m.id AS medicamento_id, + m.codigo, + m.nombre, + m.stock_actual, + m.stock_minimo, + (m.stock_minimo - m.stock_actual) AS diferencia + FROM veterinaria.medicamentos m + WHERE m.tenant_id = p_tenant_id + AND m.active = true + AND m.stock_actual <= m.stock_minimo + ORDER BY diferencia DESC; +END; +$$ LANGUAGE plpgsql; + +COMMENT ON FUNCTION veterinaria.get_medicamentos_stock_bajo(UUID) IS 'Obtiene medicamentos con stock igual o menor al minimo'; + +-- Funcion para seleccionar lote FEFO (First Expired, First Out) +CREATE OR REPLACE FUNCTION veterinaria.seleccionar_lote_fefo( + p_medicamento_id UUID, + p_cantidad INTEGER +) +RETURNS UUID AS $$ +DECLARE + v_lote_id UUID; +BEGIN + SELECT id INTO v_lote_id + FROM veterinaria.medicamentos_lotes + WHERE medicamento_id = p_medicamento_id + AND cantidad_actual >= p_cantidad + AND bloqueado = false + AND fecha_caducidad > CURRENT_DATE + ORDER BY fecha_caducidad ASC + LIMIT 1; + + IF v_lote_id IS NULL THEN + RAISE EXCEPTION 'No hay lotes disponibles con stock suficiente para el medicamento %', p_medicamento_id; + END IF; + + RETURN v_lote_id; +END; +$$ LANGUAGE plpgsql; + +COMMENT ON FUNCTION veterinaria.seleccionar_lote_fefo(UUID, INTEGER) IS 'Selecciona el lote con fecha de caducidad mas proxima (FEFO)'; + +-- ============================================================================ +-- FIN VETERINARIA FARMACIA SCHEMA +-- ============================================================================ diff --git a/database/seeds/fase8/01-veterinaria-catalogos.sql b/database/seeds/fase8/01-veterinaria-catalogos.sql new file mode 100644 index 0000000..d0fff84 --- /dev/null +++ b/database/seeds/fase8/01-veterinaria-catalogos.sql @@ -0,0 +1,146 @@ +-- ============================================================================ +-- SEED DATA: Catálogos de Veterinaria +-- Especialización de ERP-Clínicas +-- ============================================================================ +-- NOTA: Ejecutar después de SET app.current_tenant_id = 'UUID-DEL-TENANT'; +-- ============================================================================ + +-- Especies +INSERT INTO veterinaria.especies (tenant_id, nombre, nombre_cientifico) +SELECT current_setting('app.current_tenant_id', true)::UUID, nombre, nombre_cientifico +FROM (VALUES + ('Perro', 'Canis lupus familiaris'), + ('Gato', 'Felis silvestris catus'), + ('Ave', NULL), + ('Reptil', NULL), + ('Roedor', NULL), + ('Conejo', 'Oryctolagus cuniculus'), + ('Pez', NULL), + ('Hurón', 'Mustela putorius furo'), + ('Otro', NULL) +) AS t(nombre, nombre_cientifico) +WHERE current_setting('app.current_tenant_id', true) IS NOT NULL + AND current_setting('app.current_tenant_id', true) != '' +ON CONFLICT DO NOTHING; + +-- Razas de perro +INSERT INTO veterinaria.razas (tenant_id, especie_id, nombre, tamanio_promedio, peso_promedio_kg) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + r.nombre, + r.tamanio, + r.peso +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Mestizo', 'mediano', 15.0), + ('Chihuahua', 'pequeño', 2.5), + ('Poodle', 'pequeño', 5.0), + ('Bulldog Francés', 'pequeño', 12.0), + ('Beagle', 'mediano', 12.0), + ('Labrador Retriever', 'grande', 30.0), + ('Golden Retriever', 'grande', 32.0), + ('Pastor Alemán', 'grande', 35.0), + ('Rottweiler', 'grande', 45.0), + ('Husky Siberiano', 'grande', 25.0), + ('Pug', 'pequeño', 8.0), + ('Yorkshire Terrier', 'pequeño', 3.0), + ('Schnauzer', 'mediano', 7.0), + ('Boxer', 'grande', 30.0), + ('Pitbull', 'mediano', 25.0) +) AS r(nombre, tamanio, peso) +WHERE e.nombre = 'Perro' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Razas de gato +INSERT INTO veterinaria.razas (tenant_id, especie_id, nombre, tamanio_promedio, peso_promedio_kg) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + r.nombre, + r.tamanio, + r.peso +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Mestizo', 'mediano', 4.0), + ('Siamés', 'mediano', 4.5), + ('Persa', 'mediano', 5.0), + ('Maine Coon', 'grande', 8.0), + ('Bengalí', 'mediano', 5.5), + ('Ragdoll', 'grande', 7.0), + ('British Shorthair', 'mediano', 6.0), + ('Angora', 'mediano', 4.5), + ('Sphynx', 'mediano', 4.0), + ('Abisinio', 'mediano', 4.0) +) AS r(nombre, tamanio, peso) +WHERE e.nombre = 'Gato' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Vacunas para perros +INSERT INTO veterinaria.vacunas (tenant_id, especie_id, nombre, descripcion, intervalo_refuerzo_dias, es_obligatoria) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + v.nombre, + v.descripcion, + v.intervalo, + v.obligatoria +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Parvovirus', 'Protege contra parvovirus canino', 365, false), + ('Moquillo', 'Protege contra distemper canino', 365, false), + ('Hepatitis', 'Protege contra hepatitis infecciosa canina', 365, false), + ('Rabia', 'Vacuna antirrábica - OBLIGATORIA', 365, true), + ('Leptospirosis', 'Protege contra leptospirosis', 365, false), + ('Bordetella', 'Protege contra tos de las perreras', 180, false), + ('Cuádruple', 'Moquillo, Hepatitis, Parvo, Parainfluenza', 365, false), + ('Séxtuple', 'Cuádruple + Coronavirus + Leptospira', 365, false) +) AS v(nombre, descripcion, intervalo, obligatoria) +WHERE e.nombre = 'Perro' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Vacunas para gatos +INSERT INTO veterinaria.vacunas (tenant_id, especie_id, nombre, descripcion, intervalo_refuerzo_dias, es_obligatoria) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + v.nombre, + v.descripcion, + v.intervalo, + v.obligatoria +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Triple Felina', 'Rinotraqueitis, Calicivirus, Panleucopenia', 365, false), + ('Leucemia Felina', 'Protege contra FeLV', 365, false), + ('Rabia', 'Vacuna antirrábica', 365, true), + ('PIF', 'Peritonitis Infecciosa Felina', 365, false) +) AS v(nombre, descripcion, intervalo, obligatoria) +WHERE e.nombre = 'Gato' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Skills específicos veterinarios +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[ + 'Medicina Veterinaria General', + 'Cirugía Veterinaria', + 'Dermatología Veterinaria', + 'Cardiología Veterinaria', + 'Oftalmología Veterinaria', + 'Ortopedia Veterinaria', + 'Oncología Veterinaria', + 'Medicina de Exóticos', + 'Anestesiología Veterinaria', + 'Imagenología Veterinaria' + ]), + 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; diff --git a/docs/00-vision-general/README.md b/docs/00-vision-general/README.md new file mode 100644 index 0000000..f50ed97 --- /dev/null +++ b/docs/00-vision-general/README.md @@ -0,0 +1,53 @@ +# Vision General - Clinica Veterinaria + +## Proposito + +Sistema de gestion integral para clinicas veterinarias que permite: + +1. **Gestion de Pacientes (Mascotas)** + - Registro completo de animales + - Vinculacion con propietarios + - Historial medico completo + +2. **Consultas Veterinarias** + - Registro de signos vitales + - Diagnosticos y tratamientos + - Prescripcion de medicamentos + +3. **Control Sanitario** + - Cartilla de vacunacion + - Calendario de desparasitacion + - Recordatorios automaticos + +4. **Servicios Adicionales** + - Hospitalizacion + - Estetica canina/felina + - Farmacia veterinaria + +## Usuarios + +| Rol | Acceso | +|-----|--------| +| Veterinario | Consultas, diagnosticos, prescripciones | +| Auxiliar | Apoyo en consultas, hospitalizacion | +| Recepcionista | Citas, cobros | +| Estilista | Servicios de grooming | +| Administrador | Gestion completa | + +## Alcance + +- **Incluido:** Gestion clinica, mascotas, vacunas, hospitalizacion, facturacion +- **Excluido:** Contabilidad avanzada (usa erp-core), nomina + +## Especies Soportadas + +- Caninos (perros) +- Felinos (gatos) +- Aves +- Roedores +- Reptiles +- Exoticos + +## Referencias + +Ver `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` para detalles completos del negocio. diff --git a/docs/00-vision-general/VISION.md b/docs/00-vision-general/VISION.md new file mode 100644 index 0000000..bf9cf76 --- /dev/null +++ b/docs/00-vision-general/VISION.md @@ -0,0 +1,392 @@ +# VISION - Sistema de Gestion Clinica Veterinaria + +**Proyecto:** clinica-veterinaria +**Version:** 1.0.0 +**Fecha:** 2026-01-07 +**Estado:** Fase 0 - Documentacion + +--- + +## 1. PROPOSITO + +Sistema de gestion integral para clinicas veterinarias que permite administrar mascotas (pacientes), propietarios, expedientes clinicos, cartilla de vacunacion, hospitalizacion, farmacia veterinaria y servicios de estetica. + +### Problema que Resuelve + +- Falta de registro digitalizado de mascotas y sus propietarios +- Control manual de esquemas de vacunacion por especie +- Seguimiento deficiente de pacientes hospitalizados +- Gestion inadecuada de inventario de medicamentos veterinarios +- Dificultad para cumplir reportes a SENASICA + +### Propuesta de Valor + +- **Registro multi-especie** con catalogos especializados por tipo de animal +- **Cartilla de vacunacion digital** con recordatorios automaticos +- **Control de hospitalizacion** con monitoreo de signos vitales +- **Farmacia integrada** con control de lotes y caducidades +- **Reportes SENASICA** para cumplimiento normativo + +--- + +## 2. OBJETIVOS PRINCIPALES + +### O1: Gestion de Mascotas y Propietarios +- Registro completo de datos de la mascota +- Vinculacion con propietario(s) +- Historial clinico por mascota +- Microchip y documentacion + +### O2: Cartilla de Vacunacion +- Esquemas de vacunacion por especie +- Control de aplicaciones con lote y fecha +- Alertas de proximas vacunas +- Certificados digitales + +### O3: Consultas Veterinarias +- Registro de signos vitales (peso, temperatura) +- Diagnosticos y tratamientos +- Recetas veterinarias +- Estudios de laboratorio + +### O4: Hospitalizacion +- Ingreso y asignacion de espacios +- Monitoreo continuo +- Administracion de medicamentos +- Alta y seguimiento + +### O5: Farmacia y Estetica +- Inventario de medicamentos veterinarios +- Control de lotes y caducidades +- Servicios de grooming +- Ventas de productos + +--- + +## 3. USUARIOS Y ROLES + +| Rol | Descripcion | Permisos Principales | +|-----|-------------|---------------------| +| **Veterinario** | Medico tratante | Consultas, diagnosticos, prescripciones, cirugias | +| **Auxiliar Veterinario** | Apoyo clinico | Ver expedientes, hospitalización, administrar medicamentos | +| **Recepcionista** | Atencion al cliente | Agendar citas, cobros, registro de mascotas | +| **Estilista** | Servicios grooming | Banos, cortes, tratamientos esteticos | +| **Farmaceutico** | Control de medicamentos | Inventario, dispensacion, control de lotes | +| **Administrador** | Gestion general | Configuracion, reportes, usuarios | + +--- + +## 4. FUNCIONALIDADES CORE + +### 4.1 Modulo Mascotas (Pacientes) + +```yaml +entidad_principal: mascota +campos: + - id: UUID + - nombre: VARCHAR(100) + - especie_id: UUID (FK) + - raza_id: UUID (FK) + - sexo: ENUM (macho, hembra) + - fecha_nacimiento: DATE + - peso_actual: DECIMAL(6,2) + - color: VARCHAR(100) + - microchip: VARCHAR(50) UNIQUE + - esterilizado: BOOLEAN + - fecha_esterilizacion: DATE + - propietario_id: UUID (FK) + - foto_url: VARCHAR(500) + - notas: TEXT + - estado: ENUM (activo, fallecido, perdido, dado_de_baja) + +funcionalidades: + - Registro con foto + - Busqueda por microchip + - Historial de pesos + - Vinculacion de multiples propietarios + - QR para acceso rapido a expediente +``` + +### 4.2 Modulo Propietarios + +```yaml +entidad_principal: propietario +campos: + - id: UUID + - nombre: VARCHAR(200) + - telefono: VARCHAR(20) + - telefono_emergencia: VARCHAR(20) + - email: VARCHAR(255) + - direccion: TEXT + - codigo_postal: VARCHAR(10) + - rfc: VARCHAR(13) + - notas: TEXT + +funcionalidades: + - Multiples mascotas por propietario + - Historial de visitas + - Preferencias de comunicacion + - Saldo a favor / adeudos +``` + +### 4.3 Modulo Vacunacion + +```yaml +entidad_principal: vacunacion +campos: + - id: UUID + - mascota_id: UUID (FK) + - vacuna_id: UUID (FK catalogo) + - fecha_aplicacion: DATE + - fecha_proxima: DATE + - lote: VARCHAR(50) + - fabricante: VARCHAR(100) + - veterinario_id: UUID (FK) + - certificado_url: VARCHAR(500) + - notas: TEXT + +funcionalidades: + - Esquemas automaticos por especie/edad + - Alertas de proximas vacunas (email, SMS, push) + - Generacion de certificados + - Reporte para SENASICA +``` + +### 4.4 Modulo Hospitalizacion + +```yaml +entidad_principal: hospitalizacion +campos: + - id: UUID + - mascota_id: UUID (FK) + - fecha_ingreso: TIMESTAMP + - fecha_alta: TIMESTAMP + - motivo: TEXT + - espacio_id: UUID (FK jaulas/kennels) + - estado: ENUM (activo, alta, fallecido, referido) + - dieta: TEXT + - indicaciones: TEXT + - veterinario_responsable_id: UUID (FK) + +funcionalidades: + - Asignacion de espacios (jaulas, kennels) + - Monitoreo de signos vitales cada X horas + - Administracion de medicamentos + - Notas de evolucion + - Comunicacion con propietario + - Costos acumulados +``` + +### 4.5 Modulo Farmacia + +```yaml +entidad_principal: medicamento +campos: + - id: UUID + - nombre: VARCHAR(200) + - principio_activo: VARCHAR(200) + - presentacion: VARCHAR(100) + - laboratorio: VARCHAR(100) + - requiere_receta: BOOLEAN + - controlado: BOOLEAN + - stock_actual: INTEGER + - stock_minimo: INTEGER + - precio_compra: DECIMAL + - precio_venta: DECIMAL + +lote: + - id: UUID + - medicamento_id: UUID (FK) + - numero_lote: VARCHAR(50) + - fecha_caducidad: DATE + - cantidad_inicial: INTEGER + - cantidad_actual: INTEGER + +funcionalidades: + - Control de existencias por lote + - Alertas de caducidad proxima + - Alertas de stock minimo + - Trazabilidad de dispensacion + - Medicamentos controlados +``` + +--- + +## 5. ESPECIES SOPORTADAS + +### Principales + +| Especie | Codigo | Vacunas Requeridas | +|---------|--------|-------------------| +| Canino (Perro) | CAN | Parvovirus, Moquillo, Hepatitis, Rabia, Leptospirosis, Bordetella | +| Felino (Gato) | FEL | Triple Felina, Leucemia Felina, Rabia | + +### Otras Especies + +| Especie | Codigo | Notas | +|---------|--------|-------| +| Ave | AVE | Paramixovirus, Viruela aviar (segun tipo) | +| Reptil | REP | Sin vacunas estandar, control de parasitos | +| Roedor | ROE | Sin vacunas estandar | +| Pez | PEZ | Sin vacunas, tratamientos de agua | +| Exotico | EXO | Segun especie especifica | + +### Esquemas de Vacunacion por Especie + +#### Caninos +```yaml +cachorro: + - 6_semanas: Parvovirus + - 8_semanas: Quintuple (Parvovirus, Moquillo, Hepatitis, Parainfluenza, Leptospirosis) + - 12_semanas: Refuerzo Quintuple + - 16_semanas: Rabia + - anual: Refuerzos + Rabia + +adulto: + - anual: Quintuple + Rabia + - cada_6_meses: Bordetella (opcional, perros sociales) +``` + +#### Felinos +```yaml +gatito: + - 8_semanas: Triple Felina (Rinotraqueitis, Calicivirus, Panleucopenia) + - 12_semanas: Refuerzo Triple + Leucemia Felina + - 16_semanas: Rabia + - anual: Refuerzos + +adulto: + - anual: Triple Felina + Rabia + - leucemia: Segun riesgo (gatos de exterior) +``` + +--- + +## 6. CONSULTA VETERINARIA + +### Flujo de Atencion + +``` +1. Propietario llega con mascota +2. Recepcion verifica/registra cita +3. Pesaje y registro de temperatura +4. Veterinario realiza exploracion fisica +5. Diagnostico y tratamiento +6. Prescripcion de medicamentos +7. Actualizacion de cartilla (si aplica vacuna) +8. Agenda proxima cita +9. Cobro en recepcion +``` + +### Signos Vitales por Especie + +| Especie | Temp Normal | FC Normal | FR Normal | +|---------|-------------|-----------|-----------| +| Canino | 38-39°C | 60-120 lpm | 10-30 rpm | +| Felino | 38-39°C | 120-180 lpm | 20-40 rpm | +| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm | +| Ave | 40-42°C | Variable | Variable | + +--- + +## 7. INTEGRACIONES + +| Sistema | Proposito | Prioridad | +|---------|-----------|-----------| +| SENASICA | Reportes de vacunacion antirabica | P1 | +| Laboratorios | Resultados de analisis clinicos | P1 | +| Proveedores | Pedidos de medicamentos | P2 | +| Facturacion electronica | CFDI 4.0 | P1 | +| WhatsApp/SMS | Recordatorios de citas y vacunas | P2 | + +### SENASICA + +```yaml +reporte_rabico: + frecuencia: Mensual + datos_requeridos: + - Numero de vacunas aplicadas + - Especie (canino/felino) + - Municipio + - Veterinario responsable + - Lote de vacuna +``` + +--- + +## 8. METRICAS DE EXITO + +| Metrica | Descripcion | Objetivo | +|---------|-------------|----------| +| Consultas/dia | Mascotas atendidas | 15-25 | +| Tasa vacunacion | Esquemas completos | 85% | +| Ocupacion hospital | Uso de espacios | 70% | +| Dias hospitalizacion | Promedio estancia | 2-3 dias | +| Mortalidad | Fallecimientos en hospital | <5% | +| Satisfaccion cliente | NPS | 8.5+ | + +--- + +## 9. FASES DE DESARROLLO + +### Fase 1: Core (MVP) +- Registro de mascotas y propietarios +- Consultas basicas +- Agenda de citas +- Facturacion simple + +### Fase 2: Vacunacion y Farmacia +- Cartilla de vacunacion completa +- Inventario de medicamentos +- Alertas automaticas +- Control de lotes + +### Fase 3: Hospitalizacion +- Ingreso y espacios +- Monitoreo de pacientes +- Evolucion clinica +- Costos por estancia + +### Fase 4: Servicios Adicionales +- Estetica (grooming) +- Laboratorio interno +- Tienda de productos +- App para propietarios + +### Fase 5: Integraciones +- SENASICA automatizado +- Laboratorios externos +- Proveedores +- Recordatorios multicanal + +--- + +## 10. HERENCIA Y DEPENDENCIAS + +### Hereda de erp-clinicas +- Modulo Expedientes (adaptado a mascotas) +- Modulo Citas +- Modulo Consultas +- Modulo Recetas + +### Hereda de erp-core +- Autenticacion y usuarios +- Roles y permisos +- Facturacion +- Inventario +- Catalogos base + +### Especifico Veterinaria (Nuevo) +- Mascotas (pacientes) +- Propietarios +- Cartilla de vacunacion +- Hospitalizacion +- Farmacia veterinaria +- Estetica (grooming) +- Integracion SENASICA + +--- + +**Documento creado:** 2026-01-07 +**Autor:** Agente Orquestador Workspace +**Basado en:** SIMCO v2.5, CONTEXTO-PROYECTO.md diff --git a/docs/01-epicas/VET-001-mascotas-propietarios.md b/docs/01-epicas/VET-001-mascotas-propietarios.md new file mode 100644 index 0000000..2dc7a26 --- /dev/null +++ b/docs/01-epicas/VET-001-mascotas-propietarios.md @@ -0,0 +1,258 @@ +# VET-001: Mascotas y Propietarios + +## Metadata +- **Codigo:** VET-001 +- **Modulo:** Mascotas + Propietarios +- **Prioridad:** P0 +- **Estado:** DDL Completado +- **Fase:** 1 - Core + +## Descripcion + +Sistema de gestion de mascotas (pacientes) y sus propietarios: registro completo de datos del animal, vinculacion con duenos, historial de pesos, identificacion por microchip, y estado del paciente. + +## Objetivos + +1. Registro completo de mascotas +2. Vinculacion mascota-propietario +3. Gestion multi-especie y razas +4. Identificacion por microchip +5. Historial de pesos + +## Alcance + +### Incluido +- CRUD de propietarios +- CRUD de mascotas con foto +- Catalogos de especies y razas +- Busqueda por microchip +- Historial de pesos +- Vinculacion de multiples propietarios +- Estados: activo, fallecido, perdido, dado_de_baja + +### Excluido +- QR para expediente (fase posterior) +- App para propietarios (fase posterior) +- Portal de autoservicio + +## Especies Soportadas + +| Especie | Codigo | Vacunas Tipicas | +|---------|--------|-----------------| +| Canino (Perro) | CAN | Parvovirus, Moquillo, Rabia | +| Felino (Gato) | FEL | Triple Felina, Leucemia, Rabia | +| Ave | AVE | Variable segun tipo | +| Reptil | REP | Sin vacunas estandar | +| Roedor | ROE | Sin vacunas estandar | +| Pez | PEZ | Tratamientos de agua | +| Exotico | EXO | Segun especie | + +## Modelo de Datos + +### Tablas + +**veterinaria.propietarios** +- id, tenant_id, partner_id (opcional) +- nombre, apellidos, telefono, telefono_emergencia +- email, direccion, rfc +- active + +**veterinaria.mascotas** +- id, tenant_id, propietario_id +- especie_id, raza_id +- nombre, sexo, fecha_nacimiento, edad_aproximada +- color, peso_kg +- numero_chip, tiene_chip +- esterilizado, fecha_esterilizacion +- alergias, condiciones_especiales, notas +- foto_url, active + +**veterinaria.especies** (Catalogo) +- id, tenant_id, nombre, nombre_cientifico + +**veterinaria.razas** (Catalogo) +- id, tenant_id, especie_id, nombre +- tamanio_promedio, peso_promedio_kg + +## Endpoints API + +### Propietarios +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /propietarios | Listar propietarios | +| GET | /propietarios/:id | Detalle propietario | +| POST | /propietarios | Crear propietario | +| PUT | /propietarios/:id | Actualizar | +| DELETE | /propietarios/:id | Desactivar | +| GET | /propietarios/:id/mascotas | Mascotas del propietario | + +### Mascotas +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /mascotas | Listar mascotas | +| GET | /mascotas/:id | Detalle mascota | +| POST | /mascotas | Registrar mascota | +| PUT | /mascotas/:id | Actualizar | +| DELETE | /mascotas/:id | Desactivar | +| GET | /mascotas/chip/:numero | Buscar por microchip | +| POST | /mascotas/:id/foto | Subir foto | +| GET | /mascotas/:id/historial-peso | Historial de pesos | +| POST | /mascotas/:id/peso | Registrar peso | + +### Catalogos +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /especies | Listar especies | +| GET | /especies/:id/razas | Razas de especie | +| POST | /razas | Crear raza | + +## Interfaz del Servicio + +```typescript +interface MascotasService { + getAll(filters?: MascotaFilters): Promise; + getById(id: string): Promise; + create(data: CreateMascota): Promise; + update(id: string, data: UpdateMascota): Promise; + findByChip(numeroChip: string): Promise; + registrarPeso(mascotaId: string, pesoKg: number): Promise; + getHistorialPeso(mascotaId: string): Promise; +} + +interface PropietariosService { + getAll(filters?: PropietarioFilters): Promise; + getById(id: string): Promise; + create(data: CreatePropietario): Promise; + getMascotas(propietarioId: string): Promise; +} + +interface CreateMascota { + propietarioId: string; + especieId: string; + razaId?: string; + nombre: string; + sexo: SexoAnimal; + fechaNacimiento?: Date; + edadAproximada?: string; + color?: string; + pesoKg?: number; + numeroChip?: string; + esterilizado?: boolean; + alergias?: string; +} +``` + +## Flujos + +### Registrar Nueva Mascota + +``` +1. Propietario llega a registrar mascota +2. Buscar si propietario existe (por telefono) +3. Si no existe, crear propietario +4. Crear registro de mascota: + - Seleccionar especie + - Seleccionar raza (opcional) + - Datos basicos (nombre, sexo, edad) + - Identificacion (chip si tiene) + - Tomar foto +5. Guardar y abrir expediente +``` + +### Buscar por Microchip + +``` +1. Escanear microchip +2. Buscar en base de datos +3. Si existe: mostrar expediente +4. Si no existe: opcion de registrar +5. Validar propietario actual +``` + +## Signos Vitales por Especie + +| Especie | Temp Normal | FC Normal | FR Normal | +|---------|-------------|-----------|-----------| +| Canino | 38-39°C | 60-120 lpm | 10-30 rpm | +| Felino | 38-39°C | 120-180 lpm | 20-40 rpm | +| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm | +| Ave | 40-42°C | Variable | Variable | + +## Componentes Frontend + +### MascotaCard + +```typescript +interface MascotaCardProps { + mascota: Mascota; + onClick: () => void; + showOwner?: boolean; +} + +// Muestra: +// - Foto de la mascota +// - Nombre y especie +// - Raza +// - Edad +// - Chip (si tiene) +// - Estado (activo/fallecido) +``` + +### MascotaForm + +```typescript +interface MascotaFormProps { + propietarioId: string; + onSave: (mascota: Mascota) => void; +} + +// Campos: +// - Nombre +// - Especie (dropdown) +// - Raza (dropdown filtrado por especie) +// - Sexo +// - Fecha nacimiento / Edad aproximada +// - Color +// - Peso +// - Microchip +// - Esterilizado +// - Alergias +// - Foto +``` + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL mascotas | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| DDL propietarios | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| mascotas.module.ts | Pendiente | `backend/modules/mascotas/` | +| propietarios.module.ts | Pendiente | `backend/modules/propietarios/` | +| MascotaCard.tsx | Pendiente | `frontend/components/` | +| MascotaForm.tsx | Pendiente | `frontend/components/` | + +## Dependencias + +### Depende de +- Auth/Tenants (erp-core) + +### Bloquea a +- VET-002 (Vacunacion - requiere mascota) +- VET-003 (Desparasitaciones) +- VET-004 (Hospitalizacion) +- VET-005 (Estetica) +- Consultas veterinarias + +## Criterios de Aceptacion + +- [ ] CRUD propietarios funciona +- [ ] CRUD mascotas funciona +- [ ] Catalogos de especies/razas +- [ ] Busqueda por microchip +- [ ] Foto se sube correctamente +- [ ] Historial de peso funciona +- [ ] Vinculacion propietario-mascota + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/docs/01-epicas/VET-002-vacunacion.md b/docs/01-epicas/VET-002-vacunacion.md new file mode 100644 index 0000000..b279e55 --- /dev/null +++ b/docs/01-epicas/VET-002-vacunacion.md @@ -0,0 +1,268 @@ +# VET-002: Cartilla de Vacunacion + +## Metadata +- **Codigo:** VET-002 +- **Modulo:** Vacunacion +- **Prioridad:** P0 +- **Estado:** DDL Completado +- **Fase:** 2 - Vacunacion + +## Descripcion + +Sistema de cartilla de vacunacion digital: registro de aplicaciones, esquemas por especie, control de lotes, alertas de refuerzos, generacion de certificados, y reportes para SENASICA. + +## Objetivos + +1. Registro de vacunas aplicadas +2. Esquemas por especie y edad +3. Control de lotes y fabricantes +4. Alertas de proximos refuerzos +5. Reportes SENASICA + +## Alcance + +### Incluido +- Catalogo de vacunas por especie +- Registro de aplicaciones con lote +- Calculo automatico de proxima dosis +- Alertas por email/SMS/push +- Historial de vacunacion por mascota +- Certificado de vacunacion (PDF) +- Reporte mensual SENASICA + +### Excluido +- Integracion directa con API SENASICA +- Compra de vacunas desde sistema +- Cadena de frio/temperatura + +## Esquemas de Vacunacion + +### Caninos (Perros) + +```yaml +cachorro: + 6_semanas: + - Parvovirus + 8_semanas: + - Quintuple (DHPPI+L) + 12_semanas: + - Refuerzo Quintuple + 16_semanas: + - Rabia + anual: + - Quintuple + Rabia + +opcional: + - Bordetella (cada 6 meses, perros sociales) + - Giardia + - Lyme (zonas endemicas) +``` + +### Felinos (Gatos) + +```yaml +gatito: + 8_semanas: + - Triple Felina (PRC) + 12_semanas: + - Refuerzo Triple + Leucemia Felina + 16_semanas: + - Rabia + anual: + - Triple Felina + Rabia + +opcional: + - Leucemia Felina (gatos de exterior) + - PIF (peritonitis infecciosa) +``` + +## Modelo de Datos + +### Tablas + +**veterinaria.vacunas** (Catalogo) +- id, tenant_id, nombre, descripcion +- especie_id, laboratorio +- dosis_ml, intervalo_refuerzo_dias +- es_obligatoria, active + +**veterinaria.cartilla_vacunacion** +- id, tenant_id, mascota_id, vacuna_id +- veterinario_id +- fecha_aplicacion, fecha_proximo_refuerzo +- lote, laboratorio +- observaciones + +## Endpoints API + +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /vacunas | Catalogo de vacunas | +| GET | /vacunas/especie/:id | Vacunas por especie | +| POST | /vacunas | Crear vacuna en catalogo | +| GET | /mascotas/:id/vacunacion | Cartilla de mascota | +| POST | /mascotas/:id/vacunacion | Registrar vacuna aplicada | +| DELETE | /vacunacion/:id | Eliminar registro | +| GET | /vacunacion/proximas | Refuerzos proximos (7 dias) | +| GET | /vacunacion/vencidas | Refuerzos vencidos | +| GET | /mascotas/:id/certificado | Generar certificado PDF | +| GET | /reportes/senasica | Reporte mensual | + +## Interfaz del Servicio + +```typescript +interface VacunacionService { + getCatalogo(especieId?: string): Promise; + getCartilla(mascotaId: string): Promise; + aplicar(data: AplicarVacuna): Promise; + getProximosRefuerzos(dias: number): Promise; + getVencidos(): Promise; + generarCertificado(mascotaId: string): Promise; + getReporteSenasica(mes: number, anio: number): Promise; +} + +interface AplicarVacuna { + mascotaId: string; + vacunaId: string; + veterinarioId: string; + fechaAplicacion: Date; + lote: string; + laboratorio?: string; + observaciones?: string; +} + +interface RefuerzoPendiente { + mascota: Mascota; + propietario: Propietario; + vacuna: Vacuna; + fechaRefuerzo: Date; + diasRestantes: number; +} +``` + +## Flujos + +### Aplicar Vacuna + +``` +1. Consulta veterinaria +2. Veterinario decide vacunar +3. Seleccionar vacuna del catalogo +4. Registrar lote (obligatorio) +5. Sistema calcula fecha proxima +6. Guardar en cartilla +7. Imprimir certificado (opcional) +8. Agregar a factura +``` + +### Alertas de Refuerzos + +``` +Diario (cron job): +1. Buscar refuerzos que vencen en 7 dias +2. Filtrar por preferencias de propietario +3. Enviar notificaciones: + - Email: 7 dias antes + - SMS: 3 dias antes + - Push: 1 dia antes +4. Marcar como notificado +``` + +### Reporte SENASICA + +``` +Mensual: +1. Filtrar vacunas de rabia aplicadas +2. Agrupar por especie y municipio +3. Incluir datos del veterinario +4. Generar formato oficial +5. Exportar para envio +``` + +## Certificado de Vacunacion + +``` +┌─────────────────────────────────────────────────────────┐ +│ CERTIFICADO DE VACUNACION │ +│ Clinica Veterinaria XYZ │ +├─────────────────────────────────────────────────────────┤ +│ DATOS DE LA MASCOTA │ +│ Nombre: Firulais │ +│ Especie: Canino Raza: Labrador │ +│ Sexo: Macho Edad: 2 años │ +│ Color: Amarillo Chip: 123456789012345 │ +├─────────────────────────────────────────────────────────┤ +│ DATOS DEL PROPIETARIO │ +│ Nombre: Juan Perez Garcia │ +│ Telefono: 555-123-4567 │ +├─────────────────────────────────────────────────────────┤ +│ HISTORIAL DE VACUNACION │ +│ Fecha │ Vacuna │ Lote │ Prox.Ref │ +│ 07/01/2026 │ Rabia │ R12345 │ 07/01/2027 │ +│ 07/01/2026 │ Quintuple │ Q98765 │ 07/01/2027 │ +│ 15/06/2025 │ Quintuple │ Q54321 │ - │ +├─────────────────────────────────────────────────────────┤ +│ Veterinario: Dr. Maria Lopez │ +│ Cedula Profesional: 12345678 │ +│ Firma: _________________________ │ +└─────────────────────────────────────────────────────────┘ +``` + +## Alertas Configurables + +```typescript +interface ConfiguracionAlertas { + email: { + enabled: boolean; + diasAntes: number; // default: 7 + }; + sms: { + enabled: boolean; + diasAntes: number; // default: 3 + }; + push: { + enabled: boolean; + diasAntes: number; // default: 1 + }; + whatsapp: { + enabled: boolean; + diasAntes: number; + }; +} +``` + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL cartilla | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| DDL vacunas | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| vacunacion.module.ts | Pendiente | `backend/modules/vacunacion/` | +| CartillaVacunacion.tsx | Pendiente | `frontend/components/` | +| CertificadoPDF.ts | Pendiente | `backend/services/` | +| Seeds vacunas | Pendiente | `database/seeds/` | + +## Dependencias + +### Depende de +- VET-001 (Mascotas) +- clinica.doctors (erp-clinicas) +- Notifications service + +### Bloquea a +- Reportes SENASICA +- App para propietarios + +## Criterios de Aceptacion + +- [ ] Catalogo de vacunas por especie +- [ ] Registro de aplicacion con lote +- [ ] Fecha proxima se calcula +- [ ] Alertas se envian +- [ ] Certificado PDF se genera +- [ ] Historial completo visible +- [ ] Reporte SENASICA correcto + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/docs/01-epicas/VET-003-desparasitaciones.md b/docs/01-epicas/VET-003-desparasitaciones.md new file mode 100644 index 0000000..3374c1b --- /dev/null +++ b/docs/01-epicas/VET-003-desparasitaciones.md @@ -0,0 +1,222 @@ +# VET-003: Desparasitaciones + +## Metadata +- **Codigo:** VET-003 +- **Modulo:** Desparasitaciones +- **Prioridad:** P1 +- **Estado:** DDL Completado +- **Fase:** 2 - Vacunacion + +## Descripcion + +Sistema de control de desparasitaciones internas y externas: registro de aplicaciones, productos utilizados, dosis por peso, alertas de proximas desparasitaciones, y historial por mascota. + +## Objetivos + +1. Registro de desparasitaciones +2. Control de productos y dosis +3. Alertas de proximas aplicaciones +4. Historial por mascota +5. Recomendaciones por especie + +## Alcance + +### Incluido +- Tipos: interna, externa, ambas +- Registro de producto y dosis +- Via de administracion +- Calculo de proxima aplicacion +- Historial cronologico +- Alertas automaticas + +### Excluido +- Inventario de productos +- Calculo automatico de dosis por peso +- Integracion con laboratorios + +## Tipos de Desparasitacion + +| Tipo | Descripcion | Frecuencia Tipica | +|------|-------------|-------------------| +| Interna | Parasitos intestinales | Cada 3-6 meses | +| Externa | Pulgas, garrapatas | Cada 1-3 meses | +| Ambas | Combinada | Segun producto | + +## Productos Comunes + +### Desparasitantes Internos +| Producto | Principio Activo | Presentacion | +|----------|------------------|--------------| +| Drontal | Praziquantel + Pirantel | Tableta | +| Panacur | Fenbendazol | Suspension | +| Milbemax | Milbemicina + Praziquantel | Tableta | + +### Desparasitantes Externos +| Producto | Principio Activo | Presentacion | +|----------|------------------|--------------| +| Frontline | Fipronil | Pipeta | +| Nexgard | Afoxolaner | Tableta masticable | +| Seresto | Imidacloprid + Flumetrina | Collar | +| Bravecto | Fluralaner | Tableta/Pipeta | + +## Modelo de Datos + +### Tabla: veterinaria.desparasitaciones + +| Campo | Tipo | Descripcion | +|-------|------|-------------| +| id | UUID | PK | +| tenant_id | UUID | FK | +| mascota_id | UUID | FK | +| veterinario_id | UUID | FK | +| tipo | VARCHAR(50) | interna, externa, ambas | +| producto | VARCHAR(100) | Nombre del producto | +| dosis | VARCHAR(50) | Cantidad administrada | +| via_administracion | VARCHAR(50) | oral, topica, inyectable | +| fecha_aplicacion | DATE | Fecha de aplicacion | +| fecha_proxima | DATE | Proxima aplicacion | +| observaciones | TEXT | Notas | + +## Endpoints API + +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /mascotas/:id/desparasitaciones | Historial | +| POST | /mascotas/:id/desparasitaciones | Registrar | +| PUT | /desparasitaciones/:id | Actualizar | +| DELETE | /desparasitaciones/:id | Eliminar | +| GET | /desparasitaciones/proximas | Proximas 30 dias | +| GET | /desparasitaciones/vencidas | Vencidas | + +## Interfaz del Servicio + +```typescript +interface DesparasitacionesService { + getByMascota(mascotaId: string): Promise; + registrar(data: RegistrarDesparasitacion): Promise; + getProximas(dias: number): Promise; + getVencidas(): Promise; +} + +interface RegistrarDesparasitacion { + mascotaId: string; + veterinarioId?: string; + tipo: 'interna' | 'externa' | 'ambas'; + producto: string; + dosis?: string; + viaAdministracion: string; + fechaAplicacion: Date; + fechaProxima?: Date; + observaciones?: string; +} +``` + +## Flujos + +### Registrar Desparasitacion + +``` +1. Durante consulta o en recepcion +2. Seleccionar mascota +3. Indicar tipo (interna/externa/ambas) +4. Seleccionar/escribir producto +5. Indicar dosis y via +6. Registrar fecha aplicacion +7. Sistema sugiere fecha proxima (configurable) +8. Guardar registro +9. Agregar a cuenta del cliente +``` + +### Recordatorios + +``` +Semanal (cron job): +1. Buscar desparasitaciones proximas (30 dias) +2. Agrupar por propietario +3. Enviar recordatorio consolidado +4. Email con lista de mascotas +``` + +## Frecuencias Recomendadas + +### Por Especie y Situacion + +```typescript +const FRECUENCIAS = { + canino: { + cachorro: { interna: 15, externa: 30 }, // dias + adulto: { interna: 90, externa: 30 }, + gestante: { interna: 45, externa: 30 } + }, + felino: { + cachorro: { interna: 15, externa: 30 }, + adulto: { interna: 90, externa: 30 }, + interior: { interna: 180, externa: 60 } // gatos de interior + } +}; +``` + +## Componentes Frontend + +### DesparasitacionForm + +```typescript +interface DesparasitacionFormProps { + mascota: Mascota; + onSave: (data: Desparasitacion) => void; +} + +// Campos: +// - Tipo (radio: interna/externa/ambas) +// - Producto (autocomplete o texto) +// - Dosis +// - Via (dropdown: oral, topica, inyectable) +// - Fecha aplicacion +// - Fecha proxima (calculada, editable) +// - Observaciones +``` + +### DesparasitacionTimeline + +```typescript +// Muestra historial visual: +// ┌────────────────────────────────────────┐ +// │ ● 07/01/2026 - Interna - Drontal │ +// │ Proxima: 07/04/2026 (en 90 dias) │ +// ├────────────────────────────────────────┤ +// │ ● 15/12/2025 - Externa - Frontline │ +// │ Proxima: 15/01/2026 (VENCIDA) │ +// └────────────────────────────────────────┘ +``` + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL desparasitaciones | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| desparasitaciones.module.ts | Pendiente | `backend/modules/desparasitaciones/` | +| DesparasitacionForm.tsx | Pendiente | `frontend/components/` | +| DesparasitacionTimeline.tsx | Pendiente | `frontend/components/` | + +## Dependencias + +### Depende de +- VET-001 (Mascotas) +- Notifications service + +### Bloquea a +- Dashboard de salud de mascota +- App para propietarios + +## Criterios de Aceptacion + +- [ ] Registro de desparasitacion funciona +- [ ] Tipos interna/externa/ambas +- [ ] Fecha proxima se calcula +- [ ] Historial cronologico visible +- [ ] Alertas de vencidas +- [ ] Proximas desparasitaciones se listan + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/docs/01-epicas/VET-004-hospitalizacion.md b/docs/01-epicas/VET-004-hospitalizacion.md new file mode 100644 index 0000000..0aa83d8 --- /dev/null +++ b/docs/01-epicas/VET-004-hospitalizacion.md @@ -0,0 +1,274 @@ +# VET-004: Hospitalizacion + +## Metadata +- **Codigo:** VET-004 +- **Modulo:** Hospitalizacion +- **Prioridad:** P1 +- **Estado:** DDL Completado +- **Fase:** 3 - Hospitalizacion + +## Descripcion + +Sistema de gestion de hospitalizacion veterinaria: ingreso de pacientes, asignacion de espacios (jaulas/kennels), monitoreo de signos vitales, administracion de medicamentos, y proceso de alta. + +## Objetivos + +1. Registro de ingresos +2. Asignacion de espacios +3. Monitoreo periodico +4. Control de medicamentos +5. Proceso de alta + +## Alcance + +### Incluido +- Ingreso con diagnostico inicial +- Asignacion de jaula/kennel/UCI +- Monitoreo cada X horas (configurable) +- Registro de signos vitales +- Estado de alimentacion/eliminacion +- Notas de evolucion +- Alta con instrucciones +- Costos acumulados + +### Excluido +- Sensores automaticos +- Camaras de vigilancia +- Sistema de ventiladores/temperatura + +## Estados de Hospitalizacion + +``` +ingresado ──► en_tratamiento ──► estable ──► alta + │ + ├──► critico + │ + └──► fallecido +``` + +| Estado | Descripcion | Acciones | +|--------|-------------|----------| +| ingresado | Recien llegado | Evaluacion inicial | +| en_tratamiento | Recibiendo cuidados | Monitoreo activo | +| estable | Mejorando | Reducir monitoreo | +| critico | Grave | Monitoreo intensivo | +| alta | Dado de alta | Cerrar expediente | +| fallecido | Fallecio | Registro de deceso | + +## Modelo de Datos + +### Tablas + +**veterinaria.hospitalizacion** +- id, tenant_id, mascota_id, veterinario_id +- consultation_id +- fecha_ingreso, motivo_ingreso, diagnostico_ingreso +- area, numero_jaula +- estado +- fecha_alta, diagnostico_alta, instrucciones_alta + +**veterinaria.hospitalizacion_monitoreo** +- id, tenant_id, hospitalizacion_id +- fecha_hora +- peso_kg, temperatura +- frecuencia_cardiaca, frecuencia_respiratoria +- comio, bebio_agua, orino, defeco +- consistencia_heces, estado_animo +- nivel_dolor (0-10) +- observaciones, registrado_por + +## Signos Vitales Normales + +| Especie | Temperatura | FC | FR | +|---------|-------------|-----|-----| +| Canino | 38-39°C | 60-120 lpm | 10-30 rpm | +| Felino | 38-39°C | 120-180 lpm | 20-40 rpm | +| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm | + +## Endpoints API + +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /hospitalizacion | Pacientes hospitalizados | +| GET | /hospitalizacion/:id | Detalle | +| POST | /hospitalizacion | Ingresar paciente | +| PUT | /hospitalizacion/:id | Actualizar | +| PUT | /hospitalizacion/:id/alta | Dar de alta | +| GET | /hospitalizacion/:id/monitoreos | Historial monitoreos | +| POST | /hospitalizacion/:id/monitoreos | Registrar monitoreo | +| GET | /hospitalizacion/espacios | Disponibilidad jaulas | +| PUT | /hospitalizacion/:id/espacio | Cambiar espacio | + +## Interfaz del Servicio + +```typescript +interface HospitalizacionService { + getActivos(): Promise; + getById(id: string): Promise; + ingresar(data: IngresoHospitalizacion): Promise; + darAlta(id: string, data: AltaHospitalizacion): Promise; + registrarMonitoreo(hospId: string, data: Monitoreo): Promise; + getMonitoreos(hospId: string): Promise; + getEspaciosDisponibles(): Promise; +} + +interface IngresoHospitalizacion { + mascotaId: string; + veterinarioId: string; + consultationId?: string; + motivoIngreso: string; + diagnosticoIngreso?: string; + area: string; + numeroJaula?: string; +} + +interface Monitoreo { + fechaHora: Date; + pesoKg?: number; + temperatura?: number; + frecuenciaCardiaca?: number; + frecuenciaRespiratoria?: number; + comio: boolean; + bebioAgua: boolean; + orino: boolean; + defeco: boolean; + consistenciaHeces?: string; + estadoAnimo?: string; + nivelDolor?: number; + observaciones?: string; +} +``` + +## Flujos + +### Ingresar Paciente + +``` +1. Veterinario decide hospitalizar +2. Crear registro de hospitalizacion: + - Motivo de ingreso + - Diagnostico inicial + - Indicaciones +3. Verificar disponibilidad de espacios +4. Asignar jaula/kennel +5. Registrar monitoreo inicial +6. Notificar a propietario +7. Configurar frecuencia de monitoreo +``` + +### Monitoreo Periodico + +``` +Cada X horas (configurable por estado): +1. Auxiliar va a jaula +2. Pesar mascota (si aplica) +3. Tomar temperatura +4. Registrar signos vitales +5. Verificar alimentacion/eliminacion +6. Evaluar estado de animo y dolor +7. Notas de observacion +8. Guardar en sistema +9. Alertar si valores anormales +``` + +### Dar de Alta + +``` +1. Veterinario evalua condicion +2. Decide dar de alta +3. Registrar diagnostico final +4. Escribir instrucciones para propietario +5. Cambiar estado a "alta" +6. Generar resumen de hospitalizacion +7. Calcular costos totales +8. Notificar a propietario +9. Liberar espacio +``` + +## Panel de Control + +``` +┌─────────────────────────────────────────────────────────┐ +│ HOSPITALIZACION - Panel de Control │ +├─────────────────────────────────────────────────────────┤ +│ Jaulas Pequenas (8) │ ■ ■ ■ ■ ■ □ □ □ │ +│ Jaulas Grandes (4) │ ■ ■ □ □ │ +│ UCI (2) │ ■ □ │ +│ Kennels (6) │ ■ ■ ■ □ □ □ │ +├─────────────────────────────────────────────────────────┤ +│ ■ = Ocupado □ = Disponible │ +├─────────────────────────────────────────────────────────┤ +│ PACIENTES ACTIVOS │ +│ ┌─────────────────────────────────────────────────────┐ +│ │ 🐕 Firulais (J-03) | Ingreso: 05/01 | ESTABLE │ +│ │ Ultimo monitoreo: hace 2 horas │ +│ ├─────────────────────────────────────────────────────┤ +│ │ 🐈 Michi (J-07) | Ingreso: 06/01 | EN_TRATAMIENTO │ +│ │ Ultimo monitoreo: hace 4 horas ⚠️ │ +│ ├─────────────────────────────────────────────────────┤ +│ │ 🐕 Rocky (UCI-01) | Ingreso: 07/01 | CRITICO │ +│ │ Ultimo monitoreo: hace 30 min │ +│ └─────────────────────────────────────────────────────┘ +└─────────────────────────────────────────────────────────┘ +``` + +## Frecuencia de Monitoreo + +| Estado | Frecuencia | +|--------|------------| +| critico | Cada 1-2 horas | +| en_tratamiento | Cada 4 horas | +| estable | Cada 8 horas | +| ingresado | Evaluacion inicial | + +## Costos de Hospitalizacion + +```typescript +interface CostosHospitalizacion { + diasInternado: number; + costoPorDia: number; + medicamentos: CostoMedicamento[]; + procedimientos: CostoProcedimiento[]; + estudios: CostoEstudio[]; + subtotal: number; + descuento?: number; + total: number; +} +``` + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL hospitalizacion | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| DDL monitoreo | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| hospitalizacion.module.ts | Pendiente | `backend/modules/hospitalizacion/` | +| HospitalizacionPanel.tsx | Pendiente | `frontend/components/` | +| MonitoreoForm.tsx | Pendiente | `frontend/components/` | +| EspaciosGrid.tsx | Pendiente | `frontend/components/` | + +## Dependencias + +### Depende de +- VET-001 (Mascotas) +- clinica.consultations (erp-clinicas) +- clinica.doctors (erp-clinicas) + +### Bloquea a +- Reportes de ocupacion +- Dashboard gerencial + +## Criterios de Aceptacion + +- [ ] Ingreso de pacientes funciona +- [ ] Asignacion de espacios +- [ ] Monitoreo se registra +- [ ] Estados se actualizan +- [ ] Alta genera resumen +- [ ] Panel muestra ocupacion +- [ ] Alertas de monitoreo vencido +- [ ] Costos se calculan + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/docs/01-epicas/VET-005-estetica.md b/docs/01-epicas/VET-005-estetica.md new file mode 100644 index 0000000..7a71d88 --- /dev/null +++ b/docs/01-epicas/VET-005-estetica.md @@ -0,0 +1,250 @@ +# VET-005: Estetica (Grooming) + +## Metadata +- **Codigo:** VET-005 +- **Modulo:** Estetica +- **Prioridad:** P2 +- **Estado:** DDL Completado +- **Fase:** 4 - Servicios Adicionales + +## Descripcion + +Sistema de gestion de servicios de estetica canina y felina (grooming): agenda de servicios, tipos de corte, productos utilizados, observaciones de piel/pelaje, y registro de tiempos. + +## Objetivos + +1. Agenda de servicios de estetica +2. Registro de servicios realizados +3. Control de productos (shampoos) +4. Observaciones de piel/pelaje +5. Historial por mascota + +## Alcance + +### Incluido +- Tipos de servicio: bano, corte, limpieza oidos, corte unas +- Tipos de corte por raza +- Productos/shampoos utilizados +- Estado del servicio +- Hora inicio/fin +- Observaciones de piel +- Precio por servicio + +### Excluido +- Reservas online +- Fotos antes/despues +- Calificacion del cliente + +## Servicios de Estetica + +| Servicio | Descripcion | Duracion Aprox | +|----------|-------------|----------------| +| Bano | Bano con shampoo | 30-45 min | +| Corte | Corte de pelo | 45-90 min | +| Bano + Corte | Servicio completo | 60-120 min | +| Limpieza oidos | Limpieza auditiva | 10 min | +| Corte unas | Corte de unas | 10 min | +| Deslanado | Remocion de pelo muerto | 30-60 min | +| Tratamiento piel | Tratamiento dermatologico | 30 min | + +## Tipos de Corte por Raza + +### Caninos +| Raza | Cortes Tipicos | +|------|----------------| +| Poodle | Continental, Puppy, Teddy Bear | +| Schnauzer | Schnauzer estandar, Puppy | +| Cocker | Cocker estandar, Puppy | +| Yorkshire | Show, Puppy | +| Bichon | Bichon estandar, Teddy Bear | + +### Felinos +| Tipo | Cortes | +|------|--------| +| Pelo largo | Leon, Higienico | +| Pelo corto | Solo bano (sin corte) | + +## Modelo de Datos + +### Tabla: veterinaria.estetica + +| Campo | Tipo | Descripcion | +|-------|------|-------------| +| id | UUID | PK | +| tenant_id | UUID | FK | +| mascota_id | UUID | FK | +| estilista_id | UUID | FK empleado | +| fecha_servicio | TIMESTAMPTZ | Fecha/hora | +| servicios | TEXT[] | Lista de servicios | +| tipo_corte | VARCHAR(50) | Tipo de corte | +| shampoo_usado | VARCHAR(100) | Producto | +| estado | VARCHAR(20) | pendiente, en_proceso, terminado | +| hora_inicio | TIME | Inicio | +| hora_fin | TIME | Fin | +| observaciones | TEXT | Notas generales | +| observaciones_piel | TEXT | Estado de piel/pelaje | +| precio | NUMERIC(10,2) | Total | + +## Endpoints API + +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /estetica | Servicios del dia | +| GET | /estetica/:id | Detalle servicio | +| POST | /estetica | Agendar servicio | +| PUT | /estetica/:id | Actualizar | +| PUT | /estetica/:id/iniciar | Iniciar servicio | +| PUT | /estetica/:id/terminar | Terminar servicio | +| GET | /mascotas/:id/estetica | Historial mascota | +| GET | /estetica/agenda | Agenda por fecha | + +## Interfaz del Servicio + +```typescript +interface EsteticaService { + getDelDia(): Promise; + getById(id: string): Promise; + agendar(data: AgendarEstetica): Promise; + iniciar(id: string): Promise; + terminar(id: string, data: TerminarEstetica): Promise; + getHistorial(mascotaId: string): Promise; + getAgenda(fecha: Date): Promise; +} + +interface AgendarEstetica { + mascotaId: string; + estilistaId?: string; + fechaServicio: Date; + servicios: string[]; + tipoCorte?: string; + precio?: number; +} + +interface TerminarEstetica { + shampooUsado?: string; + observaciones?: string; + observacionesPiel?: string; + precioFinal?: number; +} +``` + +## Flujos + +### Agendar Servicio + +``` +1. Propietario solicita servicio +2. Verificar disponibilidad de estilista +3. Crear registro de estetica: + - Mascota + - Servicios solicitados + - Tipo de corte (si aplica) + - Fecha/hora +4. Confirmar con propietario +5. Estado: pendiente +``` + +### Ejecutar Servicio + +``` +1. Mascota llega a la clinica +2. Estilista marca inicio +3. Realiza servicios: + - Bano + - Secado + - Corte (si aplica) + - Extras (orejas, unas) +4. Revisar piel/pelaje +5. Registrar observaciones +6. Marcar como terminado +7. Notificar a propietario +8. Agregar a cuenta +``` + +## Productos/Shampoos + +```typescript +const SHAMPOOS = [ + { nombre: 'Shampoo Regular', tipo: 'normal' }, + { nombre: 'Shampoo Antipulgas', tipo: 'antiparasitario' }, + { nombre: 'Shampoo Dermatologico', tipo: 'medicado' }, + { nombre: 'Shampoo Pelo Blanco', tipo: 'especial' }, + { nombre: 'Shampoo Cachorro', tipo: 'suave' }, + { nombre: 'Acondicionador', tipo: 'complemento' } +]; +``` + +## Observaciones de Piel + +```typescript +interface ObservacionesPiel { + estado: 'normal' | 'irritada' | 'seca' | 'grasa' | 'con_lesiones'; + parasitos: boolean; + pulgas: boolean; + garrapatas: boolean; + hotspots: boolean; + perdidaPelo: boolean; + nudos: 'ninguno' | 'pocos' | 'muchos'; + notas: string; +} +``` + +## Panel de Estetica + +``` +┌─────────────────────────────────────────────────────────┐ +│ ESTETICA - Agenda del Dia (07/01/2026) │ +├─────────────────────────────────────────────────────────┤ +│ 09:00 │ 🐕 Firulais │ Bano + Corte │ ✓ Terminado │ +│ 10:30 │ 🐈 Michi │ Bano │ ⏳ En proceso │ +│ 11:30 │ 🐕 Rocky │ Deslanado │ ⏸ Pendiente │ +│ 14:00 │ 🐕 Luna │ Bano + Corte │ ⏸ Pendiente │ +│ 15:30 │ 🐕 Max │ Corte unas │ ⏸ Pendiente │ +├─────────────────────────────────────────────────────────┤ +│ Estilistas: Ana (4 servicios), Carlos (1 servicio) │ +└─────────────────────────────────────────────────────────┘ +``` + +## Precios Sugeridos + +| Servicio | Pequeno | Mediano | Grande | +|----------|---------|---------|--------| +| Bano | $150 | $200 | $300 | +| Corte | $200 | $300 | $450 | +| Bano + Corte | $300 | $450 | $650 | +| Deslanado | $200 | $300 | $400 | +| Limpieza oidos | $50 | $50 | $50 | +| Corte unas | $50 | $50 | $50 | + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL estetica | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` | +| estetica.module.ts | Pendiente | `backend/modules/estetica/` | +| EsteticaAgenda.tsx | Pendiente | `frontend/components/` | +| EsteticaForm.tsx | Pendiente | `frontend/components/` | + +## Dependencias + +### Depende de +- VET-001 (Mascotas) +- Employees (erp-core) + +### Bloquea a +- Reportes de productividad +- App para propietarios + +## Criterios de Aceptacion + +- [ ] Agendar servicio funciona +- [ ] Lista de servicios configurable +- [ ] Estados se actualizan +- [ ] Hora inicio/fin se registra +- [ ] Observaciones de piel +- [ ] Historial por mascota +- [ ] Precio se calcula + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/docs/01-epicas/VET-006-farmacia.md b/docs/01-epicas/VET-006-farmacia.md new file mode 100644 index 0000000..41f9a62 --- /dev/null +++ b/docs/01-epicas/VET-006-farmacia.md @@ -0,0 +1,288 @@ +# VET-006: Farmacia Veterinaria + +## Metadata +- **Codigo:** VET-006 +- **Modulo:** Farmacia +- **Prioridad:** P1 +- **Estado:** DDL Completado +- **Fase:** 2 - Vacunacion +- **DDL:** `database/schemas/02-veterinaria-farmacia-ddl.sql` + +## Descripcion + +Sistema de gestion de farmacia veterinaria: inventario de medicamentos, control de lotes y caducidades, dispensacion, medicamentos controlados, alertas de stock minimo, y trazabilidad. + +## Objetivos + +1. Inventario de medicamentos +2. Control de lotes y caducidades +3. Dispensacion con receta +4. Medicamentos controlados +5. Alertas de stock + +## Alcance + +### Incluido +- Catalogo de medicamentos +- Stock por lote +- Alertas de caducidad (30, 15, 7 dias) +- Alertas de stock minimo +- Dispensacion desde receta +- Registro de medicamentos controlados +- Historial de movimientos + +### Excluido +- Compras a proveedores (usar inventario base) +- Produccion/formulacion +- Trazabilidad COFEPRIS completa + +## Categorias de Medicamentos + +| Categoria | Descripcion | Ejemplo | +|-----------|-------------|---------| +| Antibioticos | Contra infecciones | Amoxicilina, Enrofloxacina | +| Antiparasitarios | Contra parasitos | Ivermectina, Fenbendazol | +| Analgesicos | Contra dolor | Meloxicam, Tramadol | +| Antiinflamatorios | Reducir inflamacion | Dexametasona, Prednisolona | +| Vacunas | Inmunizacion | Rabia, Quintuple | +| Vitaminas | Suplementos | Complejo B, Hierro | +| Dermatologicos | Piel | Shampoos medicados | +| Oftalmicos | Ojos | Gotas, unguentos | + +## Modelo de Datos (Propuesto) + +### Tablas + +**veterinaria.medicamentos** +- id, tenant_id +- nombre, principio_activo +- presentacion, laboratorio +- requiere_receta, controlado +- stock_minimo, precio_venta +- active + +**veterinaria.medicamentos_lotes** +- id, tenant_id, medicamento_id +- numero_lote, fecha_caducidad +- cantidad_inicial, cantidad_actual +- precio_compra +- created_at + +**veterinaria.dispensaciones** +- id, tenant_id +- receta_id, medicamento_id, lote_id +- mascota_id, veterinario_id +- cantidad, fecha +- notas + +## Endpoints API + +| Metodo | Endpoint | Descripcion | +|--------|----------|-------------| +| GET | /farmacia/medicamentos | Catalogo | +| GET | /farmacia/medicamentos/:id | Detalle con stock | +| POST | /farmacia/medicamentos | Crear medicamento | +| PUT | /farmacia/medicamentos/:id | Actualizar | +| GET | /farmacia/lotes | Lotes activos | +| POST | /farmacia/lotes | Registrar lote | +| PUT | /farmacia/lotes/:id | Actualizar lote | +| POST | /farmacia/dispensar | Dispensar medicamento | +| GET | /farmacia/alertas/caducidad | Proximos a caducar | +| GET | /farmacia/alertas/stock | Stock bajo | +| GET | /farmacia/movimientos | Historial | + +## Interfaz del Servicio + +```typescript +interface FarmaciaService { + getMedicamentos(filters?: MedicamentoFilters): Promise; + getMedicamentoById(id: string): Promise; + getLotes(medicamentoId: string): Promise; + registrarLote(data: RegistrarLote): Promise; + dispensar(data: Dispensar): Promise; + getAlertasCaducidad(dias: number): Promise; + getAlertasStock(): Promise; +} + +interface MedicamentoConStock { + id: string; + nombre: string; + principioActivo: string; + presentacion: string; + stockTotal: number; + stockMinimo: number; + lotes: Lote[]; + requiereReceta: boolean; + controlado: boolean; +} + +interface Dispensar { + medicamentoId: string; + loteId: string; + mascotaId: string; + recetaId?: string; + veterinarioId: string; + cantidad: number; + notas?: string; +} +``` + +## Flujos + +### Recepcion de Medicamentos + +``` +1. Llega pedido de proveedor +2. Verificar factura vs productos +3. Para cada producto: + - Buscar medicamento en catalogo + - Si no existe: crear + - Registrar lote: + * Numero de lote + * Fecha de caducidad + * Cantidad + * Precio de compra +4. Actualizar stock total +5. Guardar referencia a factura +``` + +### Dispensacion + +``` +1. Veterinario genera receta +2. Farmacia recibe receta +3. Verificar stock disponible +4. Seleccionar lote (FEFO: primero en caducar) +5. Descontar cantidad del lote +6. Registrar dispensacion +7. Si es controlado: registrar en bitacora +8. Agregar a cuenta del cliente +9. Entregar medicamento +``` + +### Alertas Automaticas + +``` +Diario (cron job): + +1. Caducidad proxima: + - 30 dias: alerta amarilla + - 15 dias: alerta naranja + - 7 dias: alerta roja + - Vencido: bloquear dispensacion + +2. Stock bajo: + - stock_actual <= stock_minimo + - Notificar a encargado +``` + +## Regla FEFO + +```typescript +// First Expired, First Out +function seleccionarLote(medicamentoId: string, cantidad: number): Lote { + const lotes = await this.getLotes(medicamentoId) + .filter(l => l.cantidadActual >= cantidad) + .filter(l => l.fechaCaducidad > new Date()) + .sort((a, b) => a.fechaCaducidad - b.fechaCaducidad); + + if (lotes.length === 0) { + throw new Error('Stock insuficiente'); + } + + return lotes[0]; // Primero en caducar +} +``` + +## Medicamentos Controlados + +```typescript +interface MedicamentoControlado { + medicamentoId: string; + requiereBitacora: true; + categoriaControlada: 'Fraccion II' | 'Fraccion III' | 'Fraccion IV'; + registros: RegistroControlado[]; +} + +interface RegistroControlado { + fecha: Date; + tipoMovimiento: 'entrada' | 'salida'; + cantidad: number; + lote: string; + recetaId?: string; + veterinarioId: string; + paciente: string; // nombre mascota + propietario + justificacion: string; +} +``` + +## Panel de Farmacia + +``` +┌─────────────────────────────────────────────────────────┐ +│ FARMACIA - Dashboard │ +├─────────────────────────────────────────────────────────┤ +│ ⚠️ ALERTAS │ +│ ├── 3 productos con stock bajo │ +│ ├── 5 lotes caducan en 30 dias │ +│ └── 2 lotes caducan en 7 dias │ +├─────────────────────────────────────────────────────────┤ +│ STOCK CRITICO │ +│ │ Amoxicilina 500mg │ 5 unidades │ Min: 20 │ +│ │ Meloxicam 1.5mg │ 10 unidades │ Min: 15 │ +│ │ Complejo B inyectable │ 3 frascos │ Min: 10 │ +├─────────────────────────────────────────────────────────┤ +│ PROXIMOS A CADUCAR │ +│ │ Dexametasona (Lote X123) │ Caduca: 15/01/2026 │ +│ │ Enrofloxacina (Lote Y456)│ Caduca: 20/01/2026 │ +└─────────────────────────────────────────────────────────┘ +``` + +## Entregables + +| Entregable | Estado | Archivo | +|------------|--------|---------| +| DDL medicamentos | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| DDL lotes | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| DDL dispensaciones | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| DDL movimientos | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| DDL bitacora | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| Funciones FEFO | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` | +| farmacia.module.ts | Pendiente | `backend/modules/farmacia/` | +| FarmaciaPanel.tsx | Pendiente | `frontend/components/` | +| DispensarForm.tsx | Pendiente | `frontend/components/` | + +## Dependencias + +### Depende de +- VET-001 (Mascotas) +- clinica.prescriptions (erp-clinicas) +- Inventario base (erp-core) + +### Bloquea a +- Dispensacion automatica +- Reportes de consumo +- Integracion proveedores + +## Criterios de Aceptacion + +- [ ] Catalogo de medicamentos +- [ ] Control de lotes +- [ ] Alertas de caducidad +- [ ] Alertas de stock bajo +- [ ] Dispensacion funciona +- [ ] FEFO se aplica +- [ ] Medicamentos controlados registran bitacora + +## Notas + +- DDL completado en Sprint 9 (2026-01-07) +- Incluye 5 tablas, 3 ENUMs, 3 funciones y 2 triggers +- Implementa regla FEFO (First Expired, First Out) +- Incluye bitacora para medicamentos controlados (COFEPRIS) +- Puede heredar de inventario base de erp-core +- Considerar integracion con modulo de compras + +--- + +**Ultima actualizacion:** 2026-01-07 (Sprint 9) diff --git a/docs/02-definicion-modulos/_MAP.md b/docs/02-definicion-modulos/_MAP.md new file mode 100644 index 0000000..7d0d459 --- /dev/null +++ b/docs/02-definicion-modulos/_MAP.md @@ -0,0 +1,193 @@ +# Clinica Veterinaria - Mapa de Modulos + +**Proyecto:** clinica-veterinaria +**Seccion:** 02-definicion-modulos +**Fecha:** 2026-01-07 + +--- + +## Estructura de Modulos + +``` +02-definicion-modulos/ +├── _MAP.md <- ESTE ARCHIVO +├── modulo-mascotas.md <- Registro de pacientes +├── modulo-propietarios.md <- Duenos de mascotas +├── modulo-vacunacion.md <- Cartilla de vacunas +├── modulo-consultas.md <- Atencion veterinaria +├── modulo-hospitalizacion.md <- Internamiento +├── modulo-farmacia.md <- Medicamentos veterinarios +├── modulo-estetica.md <- Grooming +├── modulo-laboratorio.md <- Analisis clinicos +└── modulo-cirugia.md <- Procedimientos quirurgicos +``` + +--- + +## Modulos Especializados (Veterinaria) + +### Core - Prioridad P1 + +| Modulo | Archivo | Estado | Descripcion | +|--------|---------|--------|-------------| +| Mascotas | modulo-mascotas.md | EN_PROGRESO | Registro de pacientes animales | +| Propietarios | modulo-propietarios.md | PENDIENTE | Gestion de duenos | +| Vacunacion | modulo-vacunacion.md | EN_PROGRESO | Cartilla de vacunas por especie | +| Consultas | modulo-consultas.md | PENDIENTE | Atencion veterinaria | + +### Especializados - Prioridad P2 + +| Modulo | Archivo | Estado | Descripcion | +|--------|---------|--------|-------------| +| Hospitalizacion | modulo-hospitalizacion.md | PENDIENTE | Internamiento y seguimiento | +| Farmacia | modulo-farmacia.md | PENDIENTE | Medicamentos con control de lotes | +| Estetica | modulo-estetica.md | PENDIENTE | Bano, corte, grooming | +| Laboratorio | modulo-laboratorio.md | PENDIENTE | Analisis clinicos | +| Cirugia | modulo-cirugia.md | PENDIENTE | Procedimientos quirurgicos | + +--- + +## Modulos Heredados (de erp-clinicas) + +| Modulo | Fuente | Adaptacion | +|--------|--------|------------| +| Expedientes | erp-clinicas | Adaptar a mascotas (no humanos) | +| Citas | erp-clinicas | Sin cambios | +| Consultas | erp-clinicas | Signos vitales animales | +| Recetas | erp-clinicas | Medicamentos veterinarios | + +--- + +## Modulos Heredados (de erp-core) + +| Modulo | Fuente | Adaptacion | +|--------|--------|------------| +| Autenticacion | erp-core | Sin cambios | +| Usuarios | erp-core | Sin cambios | +| Roles/Permisos | erp-core | Agregar roles veterinarios | +| Facturacion | erp-core | Sin cambios | +| Inventario | erp-core | Productos veterinarios | +| Catalogos | erp-core | Especies, razas, vacunas | + +--- + +## Entidades por Modulo + +### Mascotas +- `mascota` - Paciente animal +- `especie` - Catalogo de especies +- `raza` - Catalogo de razas por especie +- `historial_peso` - Registro de pesos + +### Propietarios +- `propietario` - Dueno de mascota(s) +- `mascota_propietario` - Relacion N:M +- `contacto_emergencia` - Contactos adicionales + +### Vacunacion +- `vacunacion` - Aplicacion de vacuna +- `vacuna` - Catalogo de vacunas +- `esquema_vacunacion` - Esquema por especie/edad +- `certificado_vacunacion` - Documentos generados + +### Hospitalizacion +- `hospitalizacion` - Ingreso +- `espacio` - Jaulas, kennels, peceras +- `monitoreo` - Signos vitales periodicos +- `evolucion` - Notas clinicas + +### Farmacia +- `medicamento` - Producto +- `lote` - Control de lotes +- `movimiento_inventario` - Entradas/salidas +- `dispensacion` - Entrega a paciente + +--- + +## Relaciones entre Modulos + +``` + ┌─────────────┐ + │ Propietario │ + └──────┬──────┘ + │ + ┌──────▼──────┐ + │ Mascota │ + └──────┬──────┘ + │ + ┌──────────────┬───────┼───────┬──────────────┐ + │ │ │ │ │ +┌───▼───┐ ┌──────▼──────┐│ ┌─────▼─────┐ ┌──────▼──────┐ +│Vacuna-│ │ Citas ││ │Hospitaliza│ │ Estetica │ +│cion │ └──────┬──────┘│ │cion │ └─────────────┘ +└───────┘ │ │ └─────┬─────┘ + │ │ │ + ┌──────▼──────┐│ ┌─────▼─────┐ + │ Consulta ││ │ Monitoreo │ + └──────┬──────┘│ └───────────┘ + │ │ + ┌──────▼──────┐│ + │ Receta │◄─────────────────┐ + └──────┬──────┘ │ + │ │ + ┌──────▼──────┐ ┌──────┴──────┐ + │ Dispensacion│◄──────────│ Farmacia │ + └─────────────┘ └─────────────┘ +``` + +--- + +## Especies y Vacunas + +### Caninos (Perros) + +| Vacuna | Edad Inicial | Refuerzo | Frecuencia | +|--------|--------------|----------|------------| +| Parvovirus | 6 semanas | 8, 12 semanas | Anual | +| Quintuple | 8 semanas | 12 semanas | Anual | +| Rabia | 16 semanas | - | Anual | +| Bordetella | 12 semanas | - | 6 meses | + +### Felinos (Gatos) + +| Vacuna | Edad Inicial | Refuerzo | Frecuencia | +|--------|--------------|----------|------------| +| Triple Felina | 8 semanas | 12 semanas | Anual | +| Leucemia Felina | 12 semanas | 16 semanas | Anual | +| Rabia | 16 semanas | - | Anual | + +--- + +## Integraciones Externas + +| Sistema | Modulo Relacionado | Prioridad | +|---------|-------------------|-----------| +| SENASICA | Vacunacion (Rabia) | P1 | +| Laboratorios | Laboratorio | P1 | +| Proveedores | Farmacia | P2 | + +--- + +## Estado de Documentacion + +| Modulo | README | ESPECIFICACION | FLUJOS | TESTS | +|--------|--------|----------------|--------|-------| +| Mascotas | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE | +| Propietarios | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE | +| Vacunacion | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE | +| Hospitalizacion | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE | +| Farmacia | PENDIENTE | PENDIENTE | PENDIENTE | PENDIENTE | + +--- + +## Proximos Pasos + +1. **Completar modulo-mascotas.md** - Especificacion completa +2. **Documentar modulo-vacunacion.md** - Esquemas por especie +3. **Definir entidades** en DATABASE_INVENTORY.yml +4. **Crear User Stories** para Sprint 1 + +--- + +**Ultima actualizacion:** 2026-01-07 +**Version:** 1.0.0 diff --git a/docs/02-definicion-modulos/modulo-mascotas.md b/docs/02-definicion-modulos/modulo-mascotas.md new file mode 100644 index 0000000..6c362b3 --- /dev/null +++ b/docs/02-definicion-modulos/modulo-mascotas.md @@ -0,0 +1,697 @@ +# Modulo Mascotas + +**Proyecto:** clinica-veterinaria +**Modulo:** VET-001 +**Prioridad:** P1 - Core +**Estado:** Especificacion +**Fecha:** 2026-01-07 + +--- + +## 1. DESCRIPCION GENERAL + +El modulo de Mascotas es el nucleo del sistema veterinario. Gestiona el registro de pacientes animales, su vinculacion con propietarios, datos clinicos basicos y seguimiento de peso/estado. + +### Proposito +- Registro completo de datos de cada mascota +- Vinculacion con propietarios (1 o multiples) +- Historial de pesos y mediciones +- Identificacion por microchip +- Base para expediente clinico + +### Alcance +- Multiples especies (canino, felino, aves, exoticos) +- Razas por especie +- Datos de identificacion (microchip) +- Estado reproductivo (esterilizado/entero) +- Fotos de identificacion +- Estados (activo, fallecido, perdido) + +--- + +## 2. ENTIDADES + +### 2.1 especie + +```yaml +tabla: veterinaria.especies +descripcion: "Catalogo de especies soportadas" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: codigo + tipo: VARCHAR(10) + unique: true + not_null: true + descripcion: "CAN, FEL, AVE, REP, ROE, PEZ, EXO" + + - nombre: nombre + tipo: VARCHAR(100) + not_null: true + descripcion: "Canino, Felino, Ave, etc" + + - nombre: nombre_cientifico + tipo: VARCHAR(200) + descripcion: "Nombre cientifico" + + - nombre: tiene_vacunas + tipo: BOOLEAN + default: true + descripcion: "Si tiene esquema de vacunacion" + + - nombre: activo + tipo: BOOLEAN + default: true + +seeds: + - {codigo: 'CAN', nombre: 'Canino (Perro)', tiene_vacunas: true} + - {codigo: 'FEL', nombre: 'Felino (Gato)', tiene_vacunas: true} + - {codigo: 'AVE', nombre: 'Ave', tiene_vacunas: true} + - {codigo: 'REP', nombre: 'Reptil', tiene_vacunas: false} + - {codigo: 'ROE', nombre: 'Roedor', tiene_vacunas: false} + - {codigo: 'PEZ', nombre: 'Pez', tiene_vacunas: false} + - {codigo: 'EXO', nombre: 'Exotico', tiene_vacunas: true} +``` + +### 2.2 raza + +```yaml +tabla: veterinaria.razas +descripcion: "Catalogo de razas por especie" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: especie_id + tipo: UUID + fk: veterinaria.especies(id) + not_null: true + + - nombre: nombre + tipo: VARCHAR(100) + not_null: true + descripcion: "Nombre de la raza" + + - nombre: tamano + tipo: ENUM + valores: ['miniatura', 'pequeno', 'mediano', 'grande', 'gigante'] + descripcion: "Tamano tipico de la raza" + + - nombre: peso_promedio_kg + tipo: DECIMAL(5,2) + descripcion: "Peso promedio adulto" + + - nombre: esperanza_vida_anos + tipo: INTEGER + descripcion: "Anos de vida promedio" + + - nombre: activo + tipo: BOOLEAN + default: true + +indices: + - nombre: idx_raza_especie + campos: [especie_id] + - nombre: uk_raza_especie_nombre + campos: [especie_id, nombre] + unique: true + +seeds_caninos: + - {nombre: 'Labrador Retriever', tamano: 'grande', peso_promedio: 30} + - {nombre: 'Pastor Aleman', tamano: 'grande', peso_promedio: 35} + - {nombre: 'Golden Retriever', tamano: 'grande', peso_promedio: 32} + - {nombre: 'Chihuahua', tamano: 'miniatura', peso_promedio: 2} + - {nombre: 'Bulldog Frances', tamano: 'pequeno', peso_promedio: 12} + - {nombre: 'Poodle', tamano: 'mediano', peso_promedio: 20} + - {nombre: 'Mestizo', tamano: 'mediano', peso_promedio: 15} + +seeds_felinos: + - {nombre: 'Persa', tamano: 'mediano', peso_promedio: 5} + - {nombre: 'Siames', tamano: 'mediano', peso_promedio: 4} + - {nombre: 'Maine Coon', tamano: 'grande', peso_promedio: 8} + - {nombre: 'Comun Europeo', tamano: 'mediano', peso_promedio: 4} + - {nombre: 'Mestizo', tamano: 'mediano', peso_promedio: 4} +``` + +### 2.3 mascota + +```yaml +tabla: veterinaria.mascotas +descripcion: "Registro de pacientes animales" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: tenant_id + tipo: UUID + not_null: true + descripcion: "Multi-tenant" + + - nombre: nombre + tipo: VARCHAR(100) + not_null: true + descripcion: "Nombre de la mascota" + + - nombre: especie_id + tipo: UUID + fk: veterinaria.especies(id) + not_null: true + + - nombre: raza_id + tipo: UUID + fk: veterinaria.razas(id) + descripcion: "Raza (opcional si es mestizo)" + + - nombre: sexo + tipo: ENUM + valores: ['macho', 'hembra'] + not_null: true + + - nombre: fecha_nacimiento + tipo: DATE + descripcion: "Fecha exacta o aproximada" + + - nombre: fecha_nacimiento_aproximada + tipo: BOOLEAN + default: false + descripcion: "Si la fecha es aproximada" + + - nombre: color + tipo: VARCHAR(100) + descripcion: "Color de pelaje/plumaje" + + - nombre: peso_actual_kg + tipo: DECIMAL(6,2) + descripcion: "Ultimo peso registrado" + + - nombre: peso_fecha + tipo: DATE + descripcion: "Fecha del ultimo peso" + + - nombre: microchip + tipo: VARCHAR(50) + unique: true + descripcion: "Numero de microchip" + + - nombre: microchip_fecha + tipo: DATE + descripcion: "Fecha de colocacion" + + - nombre: esterilizado + tipo: BOOLEAN + default: false + + - nombre: fecha_esterilizacion + tipo: DATE + + - nombre: foto_url + tipo: VARCHAR(500) + descripcion: "URL de foto principal" + + - nombre: caracteristicas_especiales + tipo: TEXT + descripcion: "Marcas, cicatrices, etc" + + - nombre: alergias + tipo: TEXT[] + descripcion: "Lista de alergias conocidas" + + - nombre: condiciones_cronicas + tipo: TEXT[] + descripcion: "Enfermedades cronicas" + + - nombre: estado + tipo: ENUM + valores: ['activo', 'fallecido', 'perdido', 'dado_de_baja', 'referido'] + default: 'activo' + + - nombre: fecha_fallecimiento + tipo: DATE + + - nombre: causa_fallecimiento + tipo: TEXT + + - nombre: notas + tipo: TEXT + descripcion: "Observaciones generales" + + - nombre: created_at + tipo: TIMESTAMP + default: NOW() + + - nombre: updated_at + tipo: TIMESTAMP + +indices: + - nombre: idx_mascota_tenant + campos: [tenant_id] + - nombre: idx_mascota_especie + campos: [especie_id] + - nombre: idx_mascota_microchip + campos: [microchip] + where: "microchip IS NOT NULL" + - nombre: idx_mascota_nombre + campos: [tenant_id, nombre] + +rls: + - policy: "tenant_isolation" + using: "tenant_id = current_tenant_id()" +``` + +### 2.4 mascota_propietario + +```yaml +tabla: veterinaria.mascotas_propietarios +descripcion: "Relacion N:M entre mascotas y propietarios" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: mascota_id + tipo: UUID + fk: veterinaria.mascotas(id) + not_null: true + on_delete: CASCADE + + - nombre: propietario_id + tipo: UUID + fk: veterinaria.propietarios(id) + not_null: true + on_delete: CASCADE + + - nombre: es_principal + tipo: BOOLEAN + default: false + descripcion: "Si es el propietario principal" + + - nombre: parentesco + tipo: VARCHAR(50) + descripcion: "Relacion: dueno, familiar, cuidador" + + - nombre: fecha_desde + tipo: DATE + default: CURRENT_DATE + + - nombre: fecha_hasta + tipo: DATE + descripcion: "Si dejo de ser propietario" + + - nombre: activo + tipo: BOOLEAN + default: true + +indices: + - nombre: uk_mascota_propietario + campos: [mascota_id, propietario_id] + unique: true + - nombre: idx_mp_propietario + campos: [propietario_id] +``` + +### 2.5 historial_peso + +```yaml +tabla: veterinaria.historial_pesos +descripcion: "Registro historico de pesos" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: mascota_id + tipo: UUID + fk: veterinaria.mascotas(id) + not_null: true + on_delete: CASCADE + + - nombre: peso_kg + tipo: DECIMAL(6,2) + not_null: true + + - nombre: fecha_registro + tipo: TIMESTAMP + default: NOW() + + - nombre: registrado_por + tipo: UUID + fk: core.usuarios(id) + + - nombre: notas + tipo: TEXT + descripcion: "Observaciones (dieta, enfermedad, etc)" + +indices: + - nombre: idx_historial_peso_mascota + campos: [mascota_id] + - nombre: idx_historial_peso_fecha + campos: [mascota_id, fecha_registro DESC] +``` + +--- + +## 3. API ENDPOINTS + +### Mascotas + +```yaml +endpoints: + - method: GET + path: /api/v1/mascotas + descripcion: "Listar mascotas del tenant" + query: + especie: string (filtro) + estado: string (filtro) + propietario_id: string (filtro) + search: string (nombre, microchip) + page: number + limit: number + response: PaginatedResponse + + - method: GET + path: /api/v1/mascotas/{id} + descripcion: "Obtener mascota por ID" + response: Mascota con propietarios y ultimo peso + + - method: POST + path: /api/v1/mascotas + descripcion: "Registrar nueva mascota" + body: + nombre: string (requerido) + especie_id: string (requerido) + raza_id: string (opcional) + sexo: string (requerido) + fecha_nacimiento: date (opcional) + color: string + peso_kg: number + microchip: string + esterilizado: boolean + propietario_id: string (requerido, al menos uno) + foto_url: string + notas: string + response: Mascota creada + + - method: PUT + path: /api/v1/mascotas/{id} + descripcion: "Actualizar datos de mascota" + body: Campos actualizables + response: Mascota actualizada + + - method: PATCH + path: /api/v1/mascotas/{id}/estado + descripcion: "Cambiar estado (fallecido, perdido, etc)" + body: + estado: string + fecha: date + motivo: string + response: Mascota actualizada + + - method: DELETE + path: /api/v1/mascotas/{id} + descripcion: "Dar de baja mascota (soft delete)" + response: 204 No Content +``` + +### Busqueda por Microchip + +```yaml + - method: GET + path: /api/v1/mascotas/microchip/{numero} + descripcion: "Buscar por numero de microchip" + response: Mascota o 404 +``` + +### Historial de Peso + +```yaml + - method: GET + path: /api/v1/mascotas/{id}/pesos + descripcion: "Historial de pesos" + query: + desde: date + hasta: date + response: Array de registros de peso + + - method: POST + path: /api/v1/mascotas/{id}/pesos + descripcion: "Registrar nuevo peso" + body: + peso_kg: number (requerido) + notas: string + response: Registro de peso + mascota actualizada +``` + +### Propietarios de Mascota + +```yaml + - method: GET + path: /api/v1/mascotas/{id}/propietarios + descripcion: "Propietarios vinculados" + response: Array de propietarios + + - method: POST + path: /api/v1/mascotas/{id}/propietarios + descripcion: "Vincular propietario adicional" + body: + propietario_id: string + es_principal: boolean + parentesco: string + response: Relacion creada + + - method: DELETE + path: /api/v1/mascotas/{id}/propietarios/{propietarioId} + descripcion: "Desvincular propietario" + response: 204 No Content +``` + +--- + +## 4. FLUJOS DE USUARIO + +### 4.1 Registro de Nueva Mascota + +``` +1. Recepcionista busca propietario existente o lo crea +2. Click en "Nueva Mascota" +3. Formulario de datos basicos: + - Nombre + - Especie (dropdown) + - Raza (dropdown filtrado por especie) + - Sexo + - Fecha nacimiento (con checkbox "aproximada") + - Color + - Peso actual +4. Datos de identificacion: + - Microchip (si tiene) + - Esterilizado (si/no + fecha) +5. Foto (opcional) +6. Notas adicionales +7. Guardar +8. Sistema vincula con propietario automaticamente +``` + +### 4.2 Busqueda de Mascota + +``` +1. Campo de busqueda en header +2. Escribir nombre, microchip o nombre de propietario +3. Resultados en tiempo real +4. Click en resultado para abrir expediente +5. Alternativa: Escanear codigo de microchip +``` + +### 4.3 Registro de Peso en Consulta + +``` +1. Al iniciar consulta, sistema pide peso +2. Auxiliar pesa a la mascota +3. Ingresa peso en sistema +4. Sistema muestra grafica de historico +5. Alerta si hay variacion significativa (>10%) +6. Peso se asocia a la consulta +``` + +### 4.4 Fallecimiento de Mascota + +``` +1. Abrir expediente de mascota +2. Menu: "Cambiar estado" > "Fallecido" +3. Formulario: + - Fecha de fallecimiento + - Causa (libre o catalogo) + - Lugar (clinica, domicilio, otro) + - Notas +4. Confirmacion con mensaje de condolencias +5. Sistema actualiza estado +6. Mascota aparece en seccion "Inactivos" +``` + +--- + +## 5. COMPONENTES UI + +### 5.1 MascotaCard + +```typescript +interface MascotaCardProps { + mascota: Mascota; + showPropietario?: boolean; + onClick?: () => void; +} + +// Muestra foto, nombre, especie, raza, edad +// Badge de estado (activo, fallecido, etc) +// Iconos de vacunas, alergias si aplica +``` + +### 5.2 MascotaForm + +```typescript +interface MascotaFormProps { + mascota?: Mascota; // Para edicion + propietarioId?: string; // Precarga propietario + onSave: (mascota: Mascota) => void; + onCancel: () => void; +} + +// Wizard de pasos o formulario largo +// Validaciones en tiempo real +// Preview de foto +``` + +### 5.3 PesoChart + +```typescript +interface PesoChartProps { + mascotaId: string; + periodoMeses?: number; +} + +// Grafica de linea con historico de peso +// Linea de peso ideal segun raza +// Tooltips con fechas y valores +``` + +### 5.4 MascotaExpediente + +```typescript +interface MascotaExpedienteProps { + mascotaId: string; +} + +// Vista completa del expediente +// Tabs: Datos, Vacunas, Consultas, Hospitalizaciones +// Timeline de eventos +``` + +--- + +## 6. VALIDACIONES + +### Reglas de Negocio + +```yaml +validaciones: + - regla: "Microchip unico en el tenant" + condicion: microchip duplicado + error: "Este numero de microchip ya esta registrado" + + - regla: "Raza debe corresponder a especie" + condicion: raza.especie_id != mascota.especie_id + error: "La raza seleccionada no corresponde a la especie" + + - regla: "Fecha nacimiento no puede ser futura" + condicion: fecha_nacimiento > today() + error: "La fecha de nacimiento no puede ser en el futuro" + + - regla: "Peso debe ser positivo" + condicion: peso_kg <= 0 + error: "El peso debe ser mayor a 0" + + - regla: "Al menos un propietario" + condicion: propietarios.length == 0 + error: "La mascota debe tener al menos un propietario" + + - regla: "Solo un propietario principal" + condicion: propietarios.filter(p => p.es_principal).length > 1 + error: "Solo puede haber un propietario principal" +``` + +--- + +## 7. CASOS DE USO + +### CU-VET-001: Registro de Mascota Nueva + +**Actor:** Recepcionista / Veterinario +**Precondición:** Propietario registrado en sistema +**Flujo:** +1. Seleccionar propietario +2. Click "Nueva Mascota" +3. Completar datos obligatorios +4. Agregar foto (opcional) +5. Guardar +**Postcondición:** Mascota registrada, vinculada a propietario + +### CU-VET-002: Busqueda por Microchip + +**Actor:** Cualquier usuario +**Precondición:** Mascota con microchip registrado +**Flujo:** +1. Escanear o ingresar numero de microchip +2. Sistema busca en base de datos +3. Mostrar mascota encontrada +**Postcondición:** Acceso rapido al expediente + +### CU-VET-003: Actualizacion de Peso + +**Actor:** Auxiliar / Veterinario +**Precondición:** Mascota en consulta +**Flujo:** +1. Pesar mascota +2. Ingresar peso en sistema +3. Sistema calcula diferencia vs anterior +4. Mostrar alerta si variacion > 10% +5. Guardar con notas si aplica +**Postcondición:** Peso registrado, historial actualizado + +--- + +## 8. DEPENDENCIAS + +### Depende de +- `veterinaria.propietarios` - Duenos de mascotas +- `core.usuarios` - Quien registra +- `core.tenants` - Multi-tenant + +### Dependientes +- `veterinaria.vacunaciones` - Cartilla de vacunas +- `veterinaria.consultas` - Historia clinica +- `veterinaria.hospitalizaciones` - Ingresos +- `veterinaria.facturas` - Facturacion + +--- + +## 9. METRICAS + +| Metrica | Descripcion | Query | +|---------|-------------|-------| +| Total mascotas | Mascotas activas | `WHERE estado = 'activo'` | +| Por especie | Distribucion | `GROUP BY especie_id` | +| Nuevas/mes | Registros mensuales | `WHERE created_at >= ?` | +| Tasa mortalidad | Fallecidos / total | Calculo | + +--- + +**Documento creado:** 2026-01-07 +**Autor:** Agente Orquestador Workspace +**Version:** 1.0.0 diff --git a/docs/02-definicion-modulos/modulo-vacunacion.md b/docs/02-definicion-modulos/modulo-vacunacion.md new file mode 100644 index 0000000..6cfc670 --- /dev/null +++ b/docs/02-definicion-modulos/modulo-vacunacion.md @@ -0,0 +1,744 @@ +# Modulo Vacunacion + +**Proyecto:** clinica-veterinaria +**Modulo:** VET-002 +**Prioridad:** P1 - Core +**Estado:** Especificacion +**Fecha:** 2026-01-07 + +--- + +## 1. DESCRIPCION GENERAL + +El modulo de Vacunacion gestiona la cartilla digital de vacunas de cada mascota, incluyendo esquemas por especie/edad, recordatorios automaticos, control de lotes y generacion de certificados para SENASICA. + +### Proposito +- Registro de vacunas aplicadas +- Esquemas automaticos por especie +- Alertas de proximas vacunas +- Control de lotes y caducidad +- Certificados oficiales +- Reporte a SENASICA (rabia) + +### Alcance +- Todas las especies con vacunas +- Esquemas personalizables +- Recordatorios multicanal (email, SMS, push) +- Integracion con SENASICA +- Historial completo de inmunizaciones + +--- + +## 2. ENTIDADES + +### 2.1 vacuna (catalogo) + +```yaml +tabla: veterinaria.vacunas +descripcion: "Catalogo de vacunas disponibles" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: tenant_id + tipo: UUID + not_null: true + descripcion: "Null para vacunas globales" + + - nombre: codigo + tipo: VARCHAR(20) + unique: true + descripcion: "Codigo interno" + + - nombre: nombre + tipo: VARCHAR(200) + not_null: true + descripcion: "Nombre comercial" + + - nombre: nombre_generico + tipo: VARCHAR(200) + descripcion: "Nombre generico/principio activo" + + - nombre: fabricante + tipo: VARCHAR(100) + + - nombre: especies_aplicables + tipo: UUID[] + descripcion: "Array de IDs de especies" + + - nombre: enfermedades_previene + tipo: TEXT[] + descripcion: "Enfermedades que previene" + + - nombre: via_administracion + tipo: ENUM + valores: ['subcutanea', 'intramuscular', 'intranasal', 'oral'] + + - nombre: dosis_ml + tipo: DECIMAL(4,2) + descripcion: "Dosis estandar en ml" + + - nombre: requiere_refuerzo + tipo: BOOLEAN + default: true + + - nombre: intervalo_refuerzo_dias + tipo: INTEGER + descripcion: "Dias entre aplicaciones" + + - nombre: intervalo_anual_dias + tipo: INTEGER + default: 365 + descripcion: "Frecuencia de refuerzo anual" + + - nombre: edad_minima_semanas + tipo: INTEGER + descripcion: "Edad minima para aplicar" + + - nombre: obligatoria + tipo: BOOLEAN + default: false + descripcion: "Si es obligatoria por ley" + + - nombre: reportar_senasica + tipo: BOOLEAN + default: false + descripcion: "Si debe reportarse a SENASICA" + + - nombre: precio_sugerido + tipo: DECIMAL(10,2) + + - nombre: activo + tipo: BOOLEAN + default: true + +indices: + - nombre: idx_vacuna_especies + tipo: GIN + campos: [especies_aplicables] + - nombre: idx_vacuna_senasica + campos: [reportar_senasica] + where: "reportar_senasica = true" + +seeds: + # Caninos + - {codigo: 'PARVO', nombre: 'Parvovirus Canino', especies: ['CAN'], obligatoria: false} + - {codigo: 'MOQUILLO', nombre: 'Moquillo Canino', especies: ['CAN'], obligatoria: false} + - {codigo: 'QUINTUPLE', nombre: 'Quintuple Canina', especies: ['CAN'], obligatoria: false} + - {codigo: 'RABIA_CAN', nombre: 'Rabia Canina', especies: ['CAN'], obligatoria: true, reportar_senasica: true} + - {codigo: 'BORDETELLA', nombre: 'Bordetella (Tos de Perrera)', especies: ['CAN'], obligatoria: false} + + # Felinos + - {codigo: 'TRIPLE_FEL', nombre: 'Triple Felina', especies: ['FEL'], obligatoria: false} + - {codigo: 'LEUCEMIA', nombre: 'Leucemia Felina', especies: ['FEL'], obligatoria: false} + - {codigo: 'RABIA_FEL', nombre: 'Rabia Felina', especies: ['FEL'], obligatoria: true, reportar_senasica: true} +``` + +### 2.2 esquema_vacunacion + +```yaml +tabla: veterinaria.esquemas_vacunacion +descripcion: "Esquemas de vacunacion por especie/edad" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: especie_id + tipo: UUID + fk: veterinaria.especies(id) + not_null: true + + - nombre: nombre + tipo: VARCHAR(100) + not_null: true + descripcion: "Ej: Cachorro, Adulto, Senior" + + - nombre: edad_inicio_semanas + tipo: INTEGER + descripcion: "Edad minima en semanas" + + - nombre: edad_fin_semanas + tipo: INTEGER + descripcion: "Edad maxima en semanas (null = sin limite)" + + - nombre: descripcion + tipo: TEXT + + - nombre: activo + tipo: BOOLEAN + default: true + +seeds: + - {especie: 'CAN', nombre: 'Cachorro (0-16 sem)', edad_inicio: 0, edad_fin: 16} + - {especie: 'CAN', nombre: 'Adulto (16+ sem)', edad_inicio: 16, edad_fin: null} + - {especie: 'FEL', nombre: 'Gatito (0-16 sem)', edad_inicio: 0, edad_fin: 16} + - {especie: 'FEL', nombre: 'Adulto (16+ sem)', edad_inicio: 16, edad_fin: null} +``` + +### 2.3 esquema_vacuna_detalle + +```yaml +tabla: veterinaria.esquema_vacuna_detalle +descripcion: "Vacunas incluidas en cada esquema" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: esquema_id + tipo: UUID + fk: veterinaria.esquemas_vacunacion(id) + not_null: true + on_delete: CASCADE + + - nombre: vacuna_id + tipo: UUID + fk: veterinaria.vacunas(id) + not_null: true + + - nombre: semana_aplicacion + tipo: INTEGER + descripcion: "Semana de edad para aplicar" + + - nombre: orden + tipo: INTEGER + descripcion: "Orden de prioridad" + + - nombre: es_refuerzo + tipo: BOOLEAN + default: false + descripcion: "Si es refuerzo de aplicacion anterior" + +indices: + - nombre: uk_esquema_vacuna + campos: [esquema_id, vacuna_id, semana_aplicacion] + unique: true + +seeds_cachorro: + # Esquema cachorro canino + - {esquema: 'Cachorro', vacuna: 'PARVO', semana: 6, orden: 1} + - {esquema: 'Cachorro', vacuna: 'QUINTUPLE', semana: 8, orden: 2} + - {esquema: 'Cachorro', vacuna: 'QUINTUPLE', semana: 12, orden: 3, es_refuerzo: true} + - {esquema: 'Cachorro', vacuna: 'RABIA_CAN', semana: 16, orden: 4} +``` + +### 2.4 vacunacion (aplicacion) + +```yaml +tabla: veterinaria.vacunaciones +descripcion: "Registro de vacunas aplicadas" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: tenant_id + tipo: UUID + not_null: true + + - nombre: mascota_id + tipo: UUID + fk: veterinaria.mascotas(id) + not_null: true + + - nombre: vacuna_id + tipo: UUID + fk: veterinaria.vacunas(id) + not_null: true + + - nombre: fecha_aplicacion + tipo: DATE + not_null: true + + - nombre: fecha_proxima + tipo: DATE + descripcion: "Fecha sugerida de proxima aplicacion" + + - nombre: lote + tipo: VARCHAR(50) + descripcion: "Numero de lote" + + - nombre: fecha_caducidad_lote + tipo: DATE + descripcion: "Caducidad del lote usado" + + - nombre: fabricante + tipo: VARCHAR(100) + + - nombre: veterinario_id + tipo: UUID + fk: core.usuarios(id) + not_null: true + descripcion: "Quien aplico" + + - nombre: cedula_veterinario + tipo: VARCHAR(20) + descripcion: "Cedula profesional (para certificados)" + + - nombre: consulta_id + tipo: UUID + fk: veterinaria.consultas(id) + descripcion: "Consulta donde se aplico (si aplica)" + + - nombre: dosis_aplicada_ml + tipo: DECIMAL(4,2) + + - nombre: via_administracion + tipo: ENUM + valores: ['subcutanea', 'intramuscular', 'intranasal', 'oral'] + + - nombre: sitio_aplicacion + tipo: VARCHAR(50) + descripcion: "Ej: muslo derecho, escapula" + + - nombre: reaccion_adversa + tipo: BOOLEAN + default: false + + - nombre: descripcion_reaccion + tipo: TEXT + + - nombre: costo + tipo: DECIMAL(10,2) + + - nombre: certificado_generado + tipo: BOOLEAN + default: false + + - nombre: certificado_url + tipo: VARCHAR(500) + + - nombre: reportado_senasica + tipo: BOOLEAN + default: false + + - nombre: fecha_reporte_senasica + tipo: TIMESTAMP + + - nombre: notas + tipo: TEXT + + - nombre: created_at + tipo: TIMESTAMP + default: NOW() + +indices: + - nombre: idx_vacunacion_mascota + campos: [mascota_id] + - nombre: idx_vacunacion_fecha + campos: [fecha_aplicacion DESC] + - nombre: idx_vacunacion_proxima + campos: [fecha_proxima] + where: "fecha_proxima IS NOT NULL" + - nombre: idx_vacunacion_senasica + campos: [reportado_senasica, fecha_aplicacion] + where: "reportado_senasica = false" + +rls: + - policy: "tenant_isolation" + using: "tenant_id = current_tenant_id()" +``` + +### 2.5 recordatorio_vacuna + +```yaml +tabla: veterinaria.recordatorios_vacunas +descripcion: "Recordatorios programados" + +campos: + - nombre: id + tipo: UUID + pk: true + + - nombre: vacunacion_id + tipo: UUID + fk: veterinaria.vacunaciones(id) + not_null: true + on_delete: CASCADE + descripcion: "Vacunacion de referencia" + + - nombre: fecha_recordatorio + tipo: DATE + not_null: true + descripcion: "Fecha para enviar recordatorio" + + - nombre: tipo + tipo: ENUM + valores: ['7_dias_antes', '3_dias_antes', '1_dia_antes', 'dia_programado', 'vencido'] + + - nombre: canal + tipo: ENUM + valores: ['email', 'sms', 'push', 'whatsapp'] + + - nombre: enviado + tipo: BOOLEAN + default: false + + - nombre: fecha_envio + tipo: TIMESTAMP + + - nombre: error_envio + tipo: TEXT + +indices: + - nombre: idx_recordatorio_fecha + campos: [fecha_recordatorio] + where: "enviado = false" +``` + +--- + +## 3. ESQUEMAS DE VACUNACION + +### 3.1 Caninos (Perros) + +```yaml +cachorro_canino: + - semana_6: + vacuna: "Parvovirus" + nota: "Primera vacuna" + - semana_8: + vacuna: "Quintuple (Parvovirus, Moquillo, Hepatitis, Parainfluenza, Leptospirosis)" + nota: "Inicio de esquema completo" + - semana_12: + vacuna: "Quintuple (Refuerzo)" + nota: "Refuerzo obligatorio" + - semana_16: + vacuna: "Rabia" + nota: "Obligatoria por ley" + reportar_senasica: true + - semana_16: + vacuna: "Bordetella (opcional)" + nota: "Recomendada para perros en contacto con otros" + +adulto_canino: + - anual: + vacunas: ["Quintuple", "Rabia"] + nota: "Refuerzos anuales" + - cada_6_meses: + vacuna: "Bordetella (opcional)" + nota: "Para perros sociales" +``` + +### 3.2 Felinos (Gatos) + +```yaml +gatito_felino: + - semana_8: + vacuna: "Triple Felina (Rinotraqueitis, Calicivirus, Panleucopenia)" + nota: "Primera vacuna" + - semana_12: + vacuna: "Triple Felina (Refuerzo)" + nota: "Refuerzo" + - semana_12: + vacuna: "Leucemia Felina" + nota: "Segun riesgo" + - semana_16: + vacuna: "Rabia" + nota: "Obligatoria" + reportar_senasica: true + +adulto_felino: + - anual: + vacunas: ["Triple Felina", "Rabia"] + - anual_riesgo: + vacuna: "Leucemia Felina" + nota: "Solo gatos de exterior o conviviendo con positivos" +``` + +--- + +## 4. API ENDPOINTS + +### Vacunaciones + +```yaml +endpoints: + - method: GET + path: /api/v1/mascotas/{mascotaId}/vacunaciones + descripcion: "Historial de vacunas de una mascota" + query: + desde: date + hasta: date + response: Array de vacunaciones con detalles + + - method: GET + path: /api/v1/mascotas/{mascotaId}/vacunaciones/pendientes + descripcion: "Vacunas pendientes segun esquema" + response: Array de vacunas sugeridas con fecha + + - method: POST + path: /api/v1/mascotas/{mascotaId}/vacunaciones + descripcion: "Registrar aplicacion de vacuna" + body: + vacuna_id: string (requerido) + fecha_aplicacion: date (requerido) + lote: string + fabricante: string + via_administracion: string + sitio_aplicacion: string + dosis_ml: number + costo: number + notas: string + response: Vacunacion registrada + proxima fecha + + - method: GET + path: /api/v1/vacunaciones/{id} + descripcion: "Detalle de una vacunacion" + response: Vacunacion completa + + - method: PATCH + path: /api/v1/vacunaciones/{id}/reaccion + descripcion: "Registrar reaccion adversa" + body: + reaccion_adversa: boolean + descripcion_reaccion: string + response: Vacunacion actualizada +``` + +### Certificados + +```yaml + - method: GET + path: /api/v1/vacunaciones/{id}/certificado + descripcion: "Generar certificado PDF" + response: PDF file + + - method: POST + path: /api/v1/mascotas/{mascotaId}/cartilla + descripcion: "Generar cartilla completa PDF" + body: + incluir_proximas: boolean + response: PDF file +``` + +### Recordatorios + +```yaml + - method: GET + path: /api/v1/recordatorios/pendientes + descripcion: "Recordatorios pendientes de envio" + query: + fecha: date (default: hoy) + response: Array de recordatorios + + - method: POST + path: /api/v1/recordatorios/enviar + descripcion: "Procesar y enviar recordatorios" + body: + fecha: date + response: Resumen de envios +``` + +### SENASICA + +```yaml + - method: GET + path: /api/v1/senasica/pendientes + descripcion: "Vacunas de rabia pendientes de reportar" + query: + desde: date + hasta: date + response: Array de vacunaciones + + - method: POST + path: /api/v1/senasica/reportar + descripcion: "Generar reporte mensual SENASICA" + body: + mes: number + anio: number + response: Archivo de reporte + resumen +``` + +--- + +## 5. FLUJOS DE USUARIO + +### 5.1 Aplicar Vacuna + +``` +1. Veterinario abre expediente de mascota +2. Ir a seccion "Vacunas" +3. Click "Nueva Vacunacion" +4. Sistema muestra: + - Vacunas sugeridas segun edad/especie + - Vacunas vencidas (alertas) +5. Seleccionar vacuna del catalogo +6. Completar datos: + - Lote + - Fabricante + - Via de administracion + - Sitio de aplicacion +7. Guardar +8. Sistema: + - Calcula proxima fecha + - Programa recordatorios + - Si es rabia, marca para SENASICA +9. Ofrecer generar certificado +``` + +### 5.2 Verificar Esquema + +``` +1. Abrir expediente de mascota +2. Ir a seccion "Vacunas" +3. Vista de timeline muestra: + - Vacunas aplicadas (verde) + - Vacunas pendientes segun esquema (amarillo) + - Vacunas vencidas (rojo) +4. Click en pendiente para aplicar +5. Click en aplicada para ver detalle/certificado +``` + +### 5.3 Procesar Recordatorios Diarios + +``` +1. Cron job diario (8am) +2. Sistema busca recordatorios con fecha = hoy +3. Por cada recordatorio: + - Obtener datos de mascota y propietario + - Preparar mensaje personalizado + - Enviar por canal configurado + - Marcar como enviado +4. Generar log de envios +5. Alertar errores a administrador +``` + +### 5.4 Generar Reporte SENASICA + +``` +1. Admin accede a seccion SENASICA +2. Selecciona mes/ano +3. Sistema genera reporte con: + - Total vacunas de rabia aplicadas + - Por especie (canino/felino) + - Por municipio + - Datos de veterinarios +4. Descargar en formato requerido +5. Marcar vacunaciones como reportadas +``` + +--- + +## 6. CERTIFICADO DE VACUNACION + +### Contenido del Certificado + +```yaml +certificado_vacunacion: + encabezado: + - Logo de clinica + - Nombre de clinica + - Direccion + - Telefono + - RFC + + datos_mascota: + - Nombre + - Especie y raza + - Sexo + - Edad + - Color + - Microchip (si tiene) + - Foto + + datos_propietario: + - Nombre completo + - Direccion + - Telefono + + datos_vacunacion: + - Vacuna aplicada + - Fecha de aplicacion + - Lote + - Fabricante + - Fecha de proxima aplicacion + - Via y sitio de administracion + + datos_veterinario: + - Nombre completo + - Cedula profesional + - Firma digital + + pie: + - Numero de folio + - Fecha de emision + - QR de verificacion +``` + +--- + +## 7. INTEGRACION SENASICA + +### Requerimientos del Reporte + +```yaml +reporte_senasica: + frecuencia: "Mensual" + plazo: "Primeros 5 dias del mes siguiente" + + datos_requeridos: + - Numero de vacunas de rabia aplicadas + - Desglose por especie (canino/felino) + - Municipio de aplicacion + - Clave de establecimiento + - Datos del MVZ responsable + + formato: + - Excel con plantilla oficial + - O captura en sistema web SENASICA +``` + +--- + +## 8. VALIDACIONES + +```yaml +validaciones: + - regla: "Vacuna debe ser aplicable a la especie" + condicion: vacuna.especies_aplicables NOT CONTAINS mascota.especie_id + error: "Esta vacuna no aplica para esta especie" + + - regla: "Edad minima para aplicar" + condicion: mascota.edad_semanas < vacuna.edad_minima_semanas + error: "La mascota no tiene la edad minima para esta vacuna" + + - regla: "Lote no caducado" + condicion: fecha_aplicacion > fecha_caducidad_lote + error: "El lote de vacuna esta caducado" + + - regla: "Veterinario con cedula para rabia" + condicion: vacuna.reportar_senasica AND NOT veterinario.cedula + error: "Se requiere cedula profesional para vacunas de rabia" + + - regla: "No duplicar vacuna en mismo dia" + condicion: EXISTS vacunacion con misma vacuna y fecha + warning: "Ya existe una aplicacion de esta vacuna en la misma fecha" +``` + +--- + +## 9. DEPENDENCIAS + +### Depende de +- `veterinaria.mascotas` - Paciente a vacunar +- `veterinaria.propietarios` - Para recordatorios +- `core.usuarios` - Veterinario que aplica +- `notificaciones` - Envio de recordatorios + +### Dependientes +- `veterinaria.consultas` - Vinculo con consulta +- `reportes` - Estadisticas de vacunacion +- `facturacion` - Cobro de vacunas + +--- + +**Documento creado:** 2026-01-07 +**Autor:** Agente Orquestador Workspace +**Version:** 1.0.0 diff --git a/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml b/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml new file mode 100644 index 0000000..59fae37 --- /dev/null +++ b/docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml @@ -0,0 +1,34 @@ +# TRACEABILITY-MASTER.yml v2.0 +# Proyecto: Clinica Veterinaria +# Prefijo v2: CVT + +traceability_version: "2.0" + +project: + code: "CVT" + name: "Clinica Veterinaria - Sistema de Gestion para Clinicas Veterinarias" + updated: "2026-01-10" + +epics_summary: + total: 0 + completed: 0 + in_progress: 0 + planned: 0 + +nomenclature_mapping: + legacy: "CVT-EP" + +epics: [] + +dependency_graph: {} + +inventories: + master: "docs/90-transversal/inventarios/" + +health: + last_validated: "2026-01-10" + score: 0.50 + issues: + - severity: "low" + type: "initialization" + description: "Proyecto en migracion inicial v2" diff --git a/docs/_MAP.md b/docs/_MAP.md new file mode 100644 index 0000000..73e3f8a --- /dev/null +++ b/docs/_MAP.md @@ -0,0 +1,172 @@ +# Clinica Veterinaria - Mapa de Documentacion + +**Proyecto:** clinica-veterinaria +**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-mascotas.md <- Registro de pacientes [PENDIENTE] +│ ├── modulo-propietarios.md <- Duenos de mascotas [PENDIENTE] +│ ├── modulo-vacunacion.md <- Cartilla de vacunas [PENDIENTE] +│ ├── modulo-hospitalizacion.md <- Internamiento [PENDIENTE] +│ ├── modulo-farmacia.md <- Medicamentos [PENDIENTE] +│ ├── modulo-estetica.md <- Grooming [PENDIENTE] +│ ├── modulo-laboratorio.md <- Analisis clinicos [PENDIENTE] +│ └── modulo-cirugia.md <- Procedimientos [PENDIENTE] +│ +├── 03-especificaciones/ +│ └── ... (futuras especificaciones tecnicas) +│ +└── 90-transversal/ + └── ... (documentacion transversal) +``` + +--- + +## Modulos Especializados (Veterinaria) + +### Modulos Core + +| Modulo | Prioridad | Estado | Descripcion | +|--------|-----------|--------|-------------| +| Mascotas | P1 | Pendiente | Registro de pacientes animales | +| Propietarios | P1 | Pendiente | Gestion de duenos | +| Vacunacion | P1 | Pendiente | Cartilla de vacunas por especie | +| Consultas | P1 | Pendiente | Atencion veterinaria | + +### Modulos Especializados + +| Modulo | Prioridad | Estado | Descripcion | +|--------|-----------|--------|-------------| +| Hospitalizacion | P2 | Pendiente | Internamiento y seguimiento | +| Farmacia | P2 | Pendiente | Medicamentos veterinarios | +| Estetica | P2 | Pendiente | Grooming, bano, corte | +| Laboratorio | P2 | Pendiente | Analisis clinicos | +| Cirugia | P2 | Pendiente | Procedimientos quirurgicos | + +--- + +## Modulos Heredados (de erp-clinicas) + +| Modulo | Fuente | Adaptacion Requerida | +|--------|--------|----------------------| +| Expedientes | erp-clinicas | Adaptar a mascotas | +| Citas | erp-clinicas | Ninguna | +| Consultas | erp-clinicas | Agregar signos vitales animales | +| Recetas | erp-clinicas | Medicamentos veterinarios | +| Facturacion | erp-core | Ninguna | +| Inventario | erp-core | Productos veterinarios | + +--- + +## Especies Soportadas + +### Principales + +| Especie | Vacunas Requeridas | +|---------|-------------------| +| Canino (Perro) | Parvovirus, Moquillo, Hepatitis, Rabia, Leptospirosis, Bordetella | +| Felino (Gato) | Triple felina, Leucemia felina, Rabia | + +### Otras Especies + +| Especie | Notas | +|---------|-------| +| Ave | Vacunas segun tipo | +| Reptil | Sin vacunas estandar | +| Roedor | Sin vacunas estandar | +| Pez | Sin vacunas | +| Exotico | Segun especie especifica | + +--- + +## Entidades Especificas + +### Mascota (Paciente) +```yaml +campos_principales: + - nombre: VARCHAR(100) + - especie: ENUM (canino, felino, ave, reptil, roedor, pez, exotico) + - raza: VARCHAR(100) + - sexo: ENUM (macho, hembra) + - fecha_nacimiento: DATE + - peso_actual: DECIMAL(6,2) + - color: VARCHAR(100) + - microchip: VARCHAR(50) UNIQUE + - esterilizado: BOOLEAN + - propietario_id: UUID (FK) +``` + +### Propietario +```yaml +campos_principales: + - nombre: VARCHAR(200) + - telefono: VARCHAR(20) + - email: VARCHAR(255) + - direccion: TEXT + - rfc: VARCHAR(13) +``` + +### Cartilla Vacunacion +```yaml +campos_principales: + - mascota_id: UUID (FK) + - vacuna_id: UUID (FK catalogo) + - fecha_aplicacion: DATE + - fecha_proxima: DATE + - lote: VARCHAR(50) + - veterinario_id: UUID (FK) +``` + +--- + +## Integraciones Externas + +| Sistema | Proposito | Estado | +|---------|-----------|--------| +| SENASICA | Reportes de vacunacion | Pendiente | +| Laboratorios | Resultados de analisis | Pendiente | +| Proveedores | Pedidos de medicamentos | Pendiente | + +--- + +## Navegacion Rapida + +### Por Rol de Usuario +- **Veterinario:** Consultas, diagnosticos, prescripciones +- **Auxiliar veterinario:** Apoyo en consultas, hospitalizacion +- **Recepcionista:** Citas, cobros, atencion al propietario +- **Estilista:** Servicios de estetica (grooming) +- **Administrador:** Gestion general, reportes + +### Por Componente Tecnico +- **Database:** Ver orchestration/inventarios/DATABASE_INVENTORY.yml +- **Backend:** Ver orchestration/inventarios/BACKEND_INVENTORY.yml +- **Frontend:** Ver orchestration/inventarios/FRONTEND_INVENTORY.yml + +--- + +## Referencias + +- [CONTEXTO-PROYECTO.md](../orchestration/00-guidelines/CONTEXTO-PROYECTO.md) +- [HERENCIA-ERP-CLINICAS.md](../orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md) +- [PROXIMA-ACCION.md](../orchestration/PROXIMA-ACCION.md) +- [CONTEXT-MAP.yml](../orchestration/CONTEXT-MAP.yml) + +--- + +**Ultima actualizacion:** 2026-01-07 +**Version:** 1.0.0 diff --git a/orchestration/00-guidelines/CONTEXTO-PROYECTO.md b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md new file mode 100644 index 0000000..7c90b06 --- /dev/null +++ b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md @@ -0,0 +1,164 @@ +# Contexto del Proyecto - Clínica Veterinaria + +## 1. Información General + +| Campo | Valor | +|-------|-------| +| **Nombre:** | Clínica Veterinaria | +| **Tipo:** | ERP Especializado | +| **Giro:** | Servicios Veterinarios | +| **Base:** | erp-clinicas | +| **Fecha creación:** | 2026-01-04 | + +--- + +## 2. Descripción del Negocio + +Sistema de gestión integral para clínicas veterinarias que incluye: + +- **Gestión de pacientes (mascotas):** Registro de animales con datos de especie, raza, propietario +- **Consultas veterinarias:** Atención médica, diagnósticos, tratamientos +- **Cartilla de vacunación:** Control de vacunas y desparasitaciones +- **Hospitalización:** Internamiento y seguimiento de animales +- **Estética canina/felina:** Servicios de grooming +- **Farmacia veterinaria:** Inventario de medicamentos y alimentos +- **Facturación:** Cobro de servicios y productos + +## 3. Usuarios del Sistema + +| Rol | Funciones | +|-----|-----------| +| Veterinario | Consultas, diagnósticos, prescripciones | +| Auxiliar veterinario | Apoyo en consultas, hospitalización | +| Recepcionista | Citas, cobros, atención al propietario | +| Estilista | Servicios de estética | +| Administrador | Gestión general, reportes | + +## 4. Procesos Principales + +### 4.1 Flujo de Consulta + +``` +1. Propietario llega con mascota +2. Recepción registra llegada / verifica cita +3. Veterinario atiende consulta +4. Registro de signos vitales (peso, temperatura) +5. Diagnóstico y tratamiento +6. Prescripción de medicamentos +7. Actualización de cartilla (si aplica vacuna) +8. Cobro en recepción +9. Entrega de receta/medicamentos +``` + +### 4.2 Flujo de Hospitalización + +``` +1. Ingreso del animal +2. Asignación de jaula/espacio +3. Registro de tratamientos +4. Monitoreo de signos vitales +5. Administración de medicamentos +6. Alta médica +7. Instrucciones al propietario +8. Cobro de servicios +``` + +## 5. Entidades Principales + +### 5.1 Mascotas (Pacientes) + +| Campo | Descripción | +|-------|-------------| +| Nombre | Nombre de la mascota | +| Especie | Perro, gato, ave, reptil, etc. | +| Raza | Raza específica | +| Sexo | Macho/Hembra | +| Fecha nacimiento | Edad aproximada | +| Peso | Peso actual | +| Color | Color del pelaje/plumaje | +| Chip | Número de microchip | +| Esterilizado | Si está esterilizado | +| Propietario | Dueño del animal | + +### 5.2 Propietarios + +| Campo | Descripción | +|-------|-------------| +| Nombre | Nombre completo | +| Teléfono | Contacto principal | +| Email | Correo electrónico | +| Dirección | Domicilio | +| RFC | Para facturación | +| Mascotas | Lista de mascotas | + +### 5.3 Consultas + +| Campo | Descripción | +|-------|-------------| +| Mascota | Animal atendido | +| Veterinario | Médico que atiende | +| Fecha | Fecha de consulta | +| Peso actual | Peso al momento | +| Temperatura | Temperatura corporal | +| Motivo | Razón de la consulta | +| Diagnóstico | Diagnóstico veterinario | +| Tratamiento | Plan de tratamiento | + +## 6. Catálogos Específicos + +### 6.1 Especies + +- Perro (Canino) +- Gato (Felino) +- Ave +- Reptil +- Roedor +- Pez +- Otro + +### 6.2 Especialidades Veterinarias + +- Medicina General +- Cirugía +- Dermatología +- Cardiología +- Oftalmología +- Ortopedia +- Oncología +- Exóticos + +### 6.3 Vacunas Comunes + +**Perros:** +- Parvovirus +- Moquillo +- Hepatitis +- Rabia +- Leptospirosis +- Bordetella + +**Gatos:** +- Triple felina +- Leucemia felina +- Rabia + +## 7. Integraciones + +| Sistema | Propósito | +|---------|-----------| +| SENASICA | Reporte de vacunación | +| Laboratorios | Resultados de análisis | +| Proveedores | Pedidos de medicamentos | + +## 8. Métricas Clave + +| Métrica | Descripción | +|---------|-------------| +| Consultas/día | Número de consultas diarias | +| Tasa de vacunación | Cumplimiento de esquemas | +| Días hospitalización | Promedio de estancia | +| Satisfacción | Evaluación propietarios | + +--- + +**Última actualización:** 2026-01-04 diff --git a/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md new file mode 100644 index 0000000..9ef6c77 --- /dev/null +++ b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md @@ -0,0 +1,116 @@ +# Herencia ERP-Clínicas - Clínica Veterinaria + +## Información del Proyecto + +| Campo | Valor | +|-------|-------| +| **Proyecto:** | clinica-veterinaria | +| **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-veterinaria (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 (mascotas) +- Sistema de prescripciones +- Gestión de personal (veterinarios) +- Inventario de medicamentos +- Pagos y facturación + +## 3. Especializaciones Veterinarias + +### 3.1 Adaptaciones de Terminología + +| ERP-Clínicas | Veterinaria | +|--------------|-------------| +| Paciente | Mascota/Animal | +| Médico | Veterinario | +| Especialidad Médica | Especialidad Veterinaria | +| Consulta | Consulta Veterinaria | +| Receta | Receta Veterinaria | + +### 3.2 Tablas Adicionales + +| Tabla | Propósito | +|-------|-----------| +| veterinaria.especies | Catálogo de especies (perro, gato, ave, etc.) | +| veterinaria.razas | Catálogo de razas por especie | +| veterinaria.propietarios | Dueños de mascotas | +| veterinaria.mascotas | Pacientes animales | +| veterinaria.vacunas | Catálogo de vacunas veterinarias | +| veterinaria.cartilla_vacunacion | Historial de vacunación | +| veterinaria.hospitalizacion | Internamiento de animales | +| veterinaria.estetica | Servicios de estética | + +### 3.3 Campos Adicionales + +| Tabla Base | Campos Veterinaria | +|------------|-------------------| +| patients → mascotas | especie_id, raza_id, propietario_id, peso, chip, esterilizado | +| consultations | peso_actual, temperatura, motivo_consulta | +| prescriptions | dosis_por_kg, via_administracion | + +## 4. Normativa Aplicable + +| Normativa | Descripción | +|-----------|-------------| +| NOM-064-ZOO-2000 | Requisitos sanitarios clínicas veterinarias | +| NOM-051-ZOO-1995 | Trato humanitario animales | +| SENASICA | Requerimientos de registro | + +## 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 Veterinaria +psql -f clinica-veterinaria/database/schemas/01-veterinaria-schema-ddl.sql + +# 3. Seeds +psql -f erp-clinicas/database/seeds/fase8/*.sql +psql -f clinica-veterinaria/database/seeds/fase8/*.sql +``` + +## 6. Versionado + +| Versión | Fecha | Cambios | +|---------|-------|---------| +| 1.0 | 2026-01-04 | Creación inicial, herencia de erp-clinicas FASE-8 | + +--- + +**Última actualización:** 2026-01-04 diff --git a/orchestration/CONTEXT-MAP.yml b/orchestration/CONTEXT-MAP.yml new file mode 100644 index 0000000..1f8c535 --- /dev/null +++ b/orchestration/CONTEXT-MAP.yml @@ -0,0 +1,322 @@ +# CONTEXT-MAP: CLINICA-VETERINARIA +# Sistema: SIMCO - NEXUS v4.0 +# Proposito: Mapear contexto automatico por nivel y tarea +# Version: 1.0.0 +# Fecha: 2026-01-07 + +metadata: + proyecto: "clinica-veterinaria" + 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-veterinaria" + hereda_de: "/home/isem/workspace-v1/projects/erp-clinicas" + +# =============================================================================== +# VARIABLES DEL PROYECTO (PRE-RESUELTAS) +# =============================================================================== + +variables: + # Identificacion + PROJECT: "clinica-veterinaria" + PROJECT_NAME: "CLINICA-VETERINARIA" + PROJECT_LEVEL: "VERTICAL" + PARENT_PROJECT: "erp-clinicas" + + # Base de datos + DB_NAME: "clinica_veterinaria" + DB_DDL_PATH: "/home/isem/workspace-v1/projects/clinica-veterinaria/database/schemas" + DB_SCRIPTS_PATH: "/home/isem/workspace-v1/projects/clinica-veterinaria/database" + DB_SEEDS_PATH: "/home/isem/workspace-v1/projects/clinica-veterinaria/database/seeds" + RECREATE_CMD: "drop-and-recreate-database.sh" + + # Backend + BACKEND_ROOT: "/home/isem/workspace-v1/projects/clinica-veterinaria/backend" + BACKEND_SRC: "/home/isem/workspace-v1/projects/clinica-veterinaria/backend/src" + BACKEND_TESTS: "/home/isem/workspace-v1/projects/clinica-veterinaria/backend/tests" + + # Frontend + FRONTEND_ROOT: "/home/isem/workspace-v1/projects/clinica-veterinaria/frontend" + FRONTEND_SRC: "/home/isem/workspace-v1/projects/clinica-veterinaria/frontend/src" + + # Documentacion + DOCS_PATH: "/home/isem/workspace-v1/projects/clinica-veterinaria/docs" + ORCHESTRATION_PATH: "/home/isem/workspace-v1/projects/clinica-veterinaria/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-veterinaria/database/schemas" + "@SEEDS": "/home/isem/workspace-v1/projects/clinica-veterinaria/database/seeds" + "@BACKEND": "/home/isem/workspace-v1/projects/clinica-veterinaria/backend/src" + "@FRONTEND": "/home/isem/workspace-v1/projects/clinica-veterinaria/frontend/src" + "@DOCS": "/home/isem/workspace-v1/projects/clinica-veterinaria/docs" + + # Inventarios + "@INVENTORY": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/inventarios" + "@INV_DB": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/inventarios/DATABASE_INVENTORY.yml" + "@INV_BE": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/inventarios/BACKEND_INVENTORY.yml" + "@INV_FE": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/inventarios/FRONTEND_INVENTORY.yml" + + # Trazas + "@TRAZA_DB": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/trazas/TRAZA-TAREAS-DATABASE.md" + "@TRAZA_BE": "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/trazas/TRAZA-TAREAS-BACKEND.md" + "@TRAZA_FE": "/home/isem/workspace-v1/projects/clinica-veterinaria/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-VETERINARIA" + tokens_estimados: 3000 + obligatorio: true + archivos: + - path: "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/00-guidelines/CONTEXTO-PROYECTO.md" + proposito: "Variables y configuracion del proyecto" + tokens: 1500 + - path: "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/PROXIMA-ACCION.md" + proposito: "Estado actual y siguiente paso" + tokens: 500 + - path: "/home/isem/workspace-v1/projects/clinica-veterinaria/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-veterinaria/orchestration/inventarios/DATABASE_INVENTORY.yml" + BACKEND: + - "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-BACKEND.md" + - "/home/isem/workspace-v1/projects/clinica-veterinaria/orchestration/inventarios/BACKEND_INVENTORY.yml" + FRONTEND: + - "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-FRONTEND.md" + - "/home/isem/workspace-v1/projects/clinica-veterinaria/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_mascotas: + descripcion: "Registro de pacientes animales" + ruta: "@DOCS/02-definicion-modulos/modulo-mascotas.md" + - modulo_propietarios: + descripcion: "Gestion de duenos de mascotas" + ruta: "@DOCS/02-definicion-modulos/modulo-propietarios.md" + - modulo_vacunacion: + descripcion: "Cartilla de vacunas y desparasitacion" + ruta: "@DOCS/02-definicion-modulos/modulo-vacunacion.md" + - modulo_hospitalizacion: + descripcion: "Internamiento y seguimiento" + ruta: "@DOCS/02-definicion-modulos/modulo-hospitalizacion.md" + - modulo_farmacia: + descripcion: "Inventario de medicamentos veterinarios" + ruta: "@DOCS/02-definicion-modulos/modulo-farmacia.md" + +# =============================================================================== +# MAPA TAREA -> ARCHIVOS (Especifico CLINICA-VETERINARIA) +# =============================================================================== + +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_mascota: + simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"] + inventario: "@INV_DB" + referencia: "@DDL/01-veterinaria-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 Veterinaria" + 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: + - mascotas + - propietarios + - cartilla_vacunacion + - hospitalizaciones + - estetica_canina + - farmacia_veterinaria + + modulos_heredados: + - expedientes (de erp-clinicas, adaptado a mascotas) + - citas (de erp-clinicas) + - consultas (de erp-clinicas) + - recetas (de erp-clinicas) + - facturacion (de erp-core) + - inventario (de erp-core) + + especies_soportadas: + - canino (perro) + - felino (gato) + - ave + - reptil + - roedor + - pez + - exotico + + vacunas_por_especie: + canino: + - parvovirus + - moquillo + - hepatitis + - rabia + - leptospirosis + - bordetella + felino: + - triple_felina + - leucemia_felina + - rabia + + integraciones: + - SENASICA (reportes de vacunacion) + - laboratorios (resultados) + - proveedores (medicamentos) + +# =============================================================================== +# 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-veterinaria/orchestration/trazas/" + - "/home/isem/workspace-v1/projects/erp-clinicas/orchestration/trazas/" + - "/home/isem/workspace-v1/orchestration/errores/REGISTRO-ERRORES.yml" + - "/home/isem/workspace-v1/shared/knowledge-base/lessons-learned/" diff --git a/orchestration/PROJECT-STATUS.md b/orchestration/PROJECT-STATUS.md new file mode 100644 index 0000000..3e8f479 --- /dev/null +++ b/orchestration/PROJECT-STATUS.md @@ -0,0 +1,57 @@ +# PROJECT STATUS - Clinica Veterinaria + +**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 | +|--------|-----|---------|----------|-------| +| Mascotas | OK | - | - | - | +| Propietarios | OK | - | - | - | +| Vacunacion | OK | - | - | - | +| Hospitalizacion | OK | - | - | - | +| Farmacia | - | - | - | - | + +--- + +## Dependencias + +- **erp-clinicas:** Modulos base de gestion clinica +- **erp-core:** Auth, users, tenants, billing + +--- + +## Proximas Acciones + +1. Implementar backend para modulo mascotas +2. Crear interfaz de cartilla de vacunacion +3. Integrar con sistema de citas de erp-clinicas + +--- + +## Riesgos + +| Riesgo | Probabilidad | Impacto | Mitigacion | +|--------|--------------|---------|------------| +| Variedad de especies | Media | Medio | Catalogos extensibles | +| Integracion con erp-clinicas | Baja | Medio | Seguir patrones existentes | + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/orchestration/PROXIMA-ACCION.md b/orchestration/PROXIMA-ACCION.md new file mode 100644 index 0000000..60ae3c3 --- /dev/null +++ b/orchestration/PROXIMA-ACCION.md @@ -0,0 +1,244 @@ +# PROXIMA ACCION - Clinica Veterinaria + +**Proyecto:** clinica-veterinaria +**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 | FALTA | orchestration/ | +| CONTEXT-MAP.yml | CREADO | orchestration/ | +| PROXIMA-ACCION.md | CREADO | orchestration/ | + +### 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-mascotas.md | FALTA | P1 | +| modulo-propietarios.md | FALTA | P1 | +| modulo-vacunacion.md | FALTA | P1 | +| modulo-hospitalizacion.md | FALTA | P2 | +| modulo-farmacia.md | FALTA | P2 | +| orchestration/_MAP.md | FALTA | P1 | +| PROJECT-STATUS.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 veterinaria, incluyendo: +- Propuesta de valor +- Target market +- Diferenciadores vs erp-clinicas base +- Roadmap de funcionalidades veterinarias especificas + +**Contenido esperado:** +```markdown +# Vision - Clinica Veterinaria + +## 1. Proposito +Sistema de gestion integral para clinicas veterinarias... + +## 2. Propuesta de Valor +- Gestion de mascotas por especie +- Cartilla de vacunacion digital +- Control de hospitalizacion +- Farmacia veterinaria +- Estetica canina/felina + +## 3. Usuarios Objetivo +- Veterinarios +- Auxiliares veterinarios +- Recepcionistas +- Estilistas (grooming) +- Administradores + +## 4. Diferenciadores +- Soporte multi-especie +- Integracion SENASICA +- Control de vacunacion por especie +... +``` + +--- + +## BACKLOG DE TAREAS + +### Sprint 1: Vision y Navegacion (7h) + +| # | Tarea | Prioridad | Horas | +|---|-------|-----------|-------| +| 1 | Crear VISION.md | P0 | 2-3 | +| 2 | Crear PROJECT-STATUS.md | P1 | 1 | +| 3 | Crear docs/00-vision-general/_MAP.md | P1 | 1 | +| 4 | Crear docs/02-definicion-modulos/_MAP.md | P0 | 1-2 | +| 5 | Crear orchestration/_MAP.md | P1 | 1 | + +### Sprint 2: Modulos Core (9h) + +| # | Tarea | Prioridad | Horas | +|---|-------|-----------|-------| +| 1 | modulo-mascotas.md | P1 | 2-3 | +| 2 | modulo-propietarios.md | P1 | 1.5-2 | +| 3 | modulo-vacunacion.md | P1 | 2-2.5 | +| 4 | modulo-consultas.md | P1 | 1.5-2 | + +### Sprint 3: Modulos Especializados (8h) + +| # | Tarea | Prioridad | Horas | +|---|-------|-----------|-------| +| 1 | modulo-hospitalizacion.md | P2 | 1.5-2 | +| 2 | modulo-farmacia.md | P2 | 2.5-3 | +| 3 | modulo-estetica.md | P2 | 1-1.5 | +| 4 | modulo-laboratorio.md | P2 | 1.5-2 | + +--- + +## DEPENDENCIAS + +### De erp-clinicas (heredados): +- Modulo Expedientes (adaptado a mascotas) +- Modulo Citas +- Modulo Consultas +- Modulo Recetas + +### De erp-core (heredados): +- Modulo Autenticacion +- Modulo Usuarios +- Modulo Facturacion +- Modulo Inventario +- Modulo Catalogs + +### Especificos Veterinaria: +- Mascotas (nuevo) +- Propietarios (nuevo) +- Cartilla Vacunacion (nuevo) +- Hospitalizacion (nuevo) +- Farmacia Veterinaria (nuevo) +- Estetica (nuevo) + +--- + +## ENTIDADES ESPECIALIZADAS + +### Mascota (Paciente) +```yaml +campos: + - id: UUID + - nombre: VARCHAR(100) + - especie_id: UUID (FK especies) + - raza_id: UUID (FK razas) + - sexo: ENUM (macho, hembra) + - fecha_nacimiento: DATE + - peso_actual: DECIMAL(6,2) + - color: VARCHAR(100) + - microchip: VARCHAR(50) UNIQUE + - esterilizado: BOOLEAN + - propietario_id: UUID (FK propietarios) +``` + +### Propietario +```yaml +campos: + - id: UUID + - nombre: VARCHAR(200) + - telefono: VARCHAR(20) + - email: VARCHAR(255) + - direccion: TEXT + - rfc: VARCHAR(13) + - mascotas: FK[] +``` + +### Cartilla Vacunacion +```yaml +campos: + - id: UUID + - mascota_id: UUID (FK) + - vacuna_id: UUID (FK catalogo) + - fecha_aplicacion: DATE + - fecha_proxima: DATE + - lote: VARCHAR(50) + - veterinario_id: UUID (FK) +``` + +--- + +## ESPECIES SOPORTADAS + +```yaml +especies: + - canino: + vacunas: [parvovirus, moquillo, hepatitis, rabia, leptospirosis, bordetella] + - felino: + vacunas: [triple_felina, leucemia_felina, rabia] + - ave: + vacunas: [paramixovirus, viruela_aviar] + - reptil: + vacunas: [] + - roedor: + vacunas: [] + - pez: + vacunas: [] + - exotico: + vacunas: [segun_especie] +``` + +--- + +## INTEGRACIONES + +| Sistema | Proposito | Estado | +|---------|-----------|--------| +| SENASICA | Reportes de vacunacion | Pendiente | +| Laboratorios | Resultados de analisis | Pendiente | +| Proveedores | Pedidos de medicamentos | Pendiente | + +--- + +## METRICAS DE PROGRESO + +| Metrica | Valor Actual | Objetivo | +|---------|--------------|----------| +| Archivos SIMCO | 8 | 22+ | +| Modulos documentados | 0 | 9 | +| User Stories | 0 | 30+ | +| Cobertura docs | ~25% | 100% | + +--- + +## NOTAS + +- Hereda base completa de erp-clinicas +- Especializar en medicina veterinaria +- Mascotas reemplazan a Pacientes humanos +- Propietarios son los responsables +- Vacunacion varia segun especie +- Considerar integracion SENASICA + +--- + +**Ultima actualizacion:** 2026-01-07 +**Autor:** Agente Orquestador Workspace +**Version:** 1.0.0 diff --git a/orchestration/environment/ENVIRONMENT-INVENTORY.yml b/orchestration/environment/ENVIRONMENT-INVENTORY.yml new file mode 100644 index 0000000..d294de2 --- /dev/null +++ b/orchestration/environment/ENVIRONMENT-INVENTORY.yml @@ -0,0 +1,694 @@ +# ============================================================================= +# ENVIRONMENT-INVENTORY.yml - CLINICA-VETERINARIA +# ============================================================================= +# 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 Veterinaria" + alias: "clinica-veterinaria" + codigo: "CV" + nivel: "NIVEL_2B.3" + tipo: "vertical-especializada" + estado: "desarrollo" + descripcion: "Sistema de gestion para clinicas veterinarias" + parent: "erp-clinicas" + herencia: + - erp-core + - erp-clinicas + +# ----------------------------------------------------------------------------- +# 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-veterinaria-frontend" + framework: "React" + version: "18.x" + puerto: 3120 + comando_dev: "npm run dev" + comando_build: "npm run build" + comando_preview: "npm run preview" + ubicacion: "apps/frontend/" + url_local: "http://localhost:3120" + build_output: "dist/" + + backend: + nombre: "clinica-veterinaria-backend" + framework: "NestJS" + version: "10.x" + puerto: 3121 + comando_dev: "npm run start:dev" + comando_build: "npm run build" + comando_prod: "npm run start:prod" + ubicacion: "apps/backend/" + url_local: "http://localhost:3121" + api_prefix: "/api/v1" + swagger_url: "http://localhost:3121/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: 5440 + nombre: "clinica_veterinaria_dev" + usuario: "veterinaria_dev" + password_ref: "DB_PASSWORD en .env" + ssl: false + pool_size: 10 + conexion: "postgresql://veterinaria_dev:{password}@localhost:5440/clinica_veterinaria_dev" + + test: + host: "localhost" + puerto: 5440 + nombre: "clinica_veterinaria_test" + usuario: "veterinaria_dev" + password_ref: "DB_PASSWORD en .env" + ssl: false + pool_size: 5 + conexion: "postgresql://veterinaria_dev:{password}@localhost:5440/clinica_veterinaria_test" + + staging: + host: "${DB_HOST}" + puerto: 5432 + nombre: "clinica_veterinaria_staging" + usuario: "veterinaria_staging" + password_ref: "DB_PASSWORD en variables de CI/CD" + ssl: true + pool_size: 20 + conexion: "postgresql://veterinaria_staging:{password}@${DB_HOST}:5432/clinica_veterinaria_staging?sslmode=require" + + production: + host: "${DB_HOST}" + puerto: 5432 + nombre: "clinica_veterinaria_prod" + usuario: "veterinaria_prod" + password_ref: "DB_PASSWORD en secrets manager" + ssl: true + pool_size: 50 + conexion: "postgresql://veterinaria_prod:{password}@${DB_HOST}:5432/clinica_veterinaria_prod?sslmode=require" + + schemas: + - nombre: "public" + descripcion: "Schema principal PostgreSQL" + - nombre: "veterinaria" + descripcion: "Entidades especificas veterinarias (especies, razas, mascotas, vacunas)" + - nombre: "clinical" + descripcion: "Heredado de erp-clinicas (consultorios, citas, historiales)" + - nombre: "financial" + descripcion: "Heredado de erp-core (pagos, facturacion)" + - nombre: "hr" + descripcion: "Heredado de erp-core (empleados, nomina)" + - nombre: "inventory" + descripcion: "Heredado de erp-core (medicamentos, insumos)" + + scripts_inicializacion: + orden: + - "database/init/00-extensions.sql" + - "database/init/01-schemas.sql" + - "database/schemas/01-veterinaria-schema-ddl.sql" + - "database/seeds/fase8/01-veterinaria-catalogos.sql" + + redis: + host_variable: "REDIS_HOST" + puerto_variable: "REDIS_PORT" + + ambientes: + development: + host: "localhost" + puerto: 6387 + database: 0 + password: "" + conexion: "redis://localhost:6387/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 consultas frecuentes" + - "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-veterinaria" + 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: "3120" + descripcion: "Puerto del frontend React" + requerido: true + sensible: false + + - nombre: "BACKEND_PORT" + valor: "3121" + 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: "5440" + descripcion: "Puerto de PostgreSQL" + requerido: true + sensible: false + + - nombre: "DB_NAME" + valor: "clinica_veterinaria_dev" + descripcion: "Nombre de la base de datos" + requerido: true + sensible: false + + - nombre: "DB_USER" + valor: "veterinaria_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://veterinaria_dev:${DB_PASSWORD}@localhost:5440/clinica_veterinaria_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: "6387" + descripcion: "Puerto de Redis" + requerido: true + sensible: false + + - nombre: "REDIS_URL" + valor: "redis://localhost:6387/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:3120" + descripcion: "URL del frontend para CORS" + requerido: true + sensible: false + + - nombre: "ALLOWED_ORIGINS" + valor: "http://localhost:3120,http://localhost:3121" + 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 + - 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: "10485760" + descripcion: "Tamano maximo de archivo en bytes (10MB)" + 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 + + 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) + + 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" + +# ----------------------------------------------------------------------------- +# 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: 5440 + puerto_container: 5432 + variables: + POSTGRES_DB: "clinica_veterinaria_dev" + POSTGRES_USER: "veterinaria_dev" + POSTGRES_PASSWORD: "${DB_PASSWORD}" + volumes: + - "postgres_data:/var/lib/postgresql/data" + healthcheck: "pg_isready -U veterinaria_dev" + + - nombre: "redis" + imagen: "redis:7-alpine" + puerto_host: 6387 + 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" + + networks: + - nombre: "clinica_veterinaria_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-veterinaria-catalogos.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" + + 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 Veterinaria + + ### Prerequisitos + - Node.js 20.x (LTS) + - PostgreSQL 15 (o Docker) + - Redis 7 (o Docker) + - npm 10.x + - Git + + ### Opcion 1: Setup con Docker (Recomendado) + + ```bash + # 1. Clonar repositorio + git clone + cd clinica-veterinaria + + # 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 + + # 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 veterinaria_dev WITH PASSWORD 'tu_password'; + CREATE DATABASE clinica_veterinaria_dev OWNER veterinaria_dev; + GRANT ALL PRIVILEGES ON DATABASE clinica_veterinaria_dev TO veterinaria_dev; + \q + + # 5. Configurar Redis local o Docker + docker run -d --name redis-veterinaria -p 6387:6379 redis:7-alpine + + # 6-7. Continuar con migraciones y seeds + ``` + + ### Verificar Instalacion + - Frontend: http://localhost:3120 + - Backend API: http://localhost:3121/api/v1 + - Swagger Docs: http://localhost:3121/api/docs + - Health Check: http://localhost:3121/health + + ### Usuarios de Prueba (despues de seed) + - Admin: admin@clinica-vet.local / Admin123! + - Veterinario: vet@clinica-vet.local / Vet123! + - Recepcion: recepcion@clinica-vet.local / Recep123! + +# ----------------------------------------------------------------------------- +# TROUBLESHOOTING +# ----------------------------------------------------------------------------- + +troubleshooting: + - problema: "Puerto 3120 o 3121 en uso" + solucion: | + Verificar con: lsof -i :3120 + Terminar proceso: kill -9 + O cambiar puertos en .env + + - problema: "Error de conexion a PostgreSQL" + solucion: | + 1. Verificar que PostgreSQL esta corriendo: + docker-compose ps + # o: systemctl status postgresql + 2. Verificar credenciales en .env + 3. Verificar que la BD existe: + psql -h localhost -p 5440 -U veterinaria_dev -l + + - problema: "Error de conexion a Redis" + solucion: | + 1. Verificar que Redis esta corriendo: + docker-compose ps + # o: redis-cli -p 6387 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: "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" + - item: "Monitoreo y alertas activas" + - item: "Rate limiting configurado" + - item: "CORS restringido a dominios autorizados" + - item: "Logs en formato JSON para agregacion" + + infraestructura_recomendada: + base_de_datos: "AWS RDS PostgreSQL 15 o equivalente" + cache: "AWS ElastiCache Redis o equivalente" + storage: "AWS S3 o equivalente" + cdn: "CloudFront o equivalente" + ci_cd: "GitHub Actions / GitLab CI" + + escalado: + backend_replicas: 2 + pool_db_size: 50 + redis_maxmemory: "256mb" + +# ----------------------------------------------------------------------------- +# 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_veterinaria: "database/schemas/01-veterinaria-schema-ddl.sql" + +# ============================================================================= +# FIN DE INVENTARIO +# ============================================================================= diff --git a/orchestration/inventarios/DATABASE_INVENTORY.yml b/orchestration/inventarios/DATABASE_INVENTORY.yml new file mode 100644 index 0000000..9029fbf --- /dev/null +++ b/orchestration/inventarios/DATABASE_INVENTORY.yml @@ -0,0 +1,443 @@ +--- +# DATABASE INVENTORY - Clinica Veterinaria +# Version: 1.0.0 +# Ultima actualizacion: 2026-01-07 + +proyecto: "clinica-veterinaria" +schema_principal: "veterinaria" +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: ["doctors", "appointments", "consultations"] + +enums: + - name: "sexo_animal" + values: + - "macho" + - "hembra" + - "desconocido" + + - name: "estado_hospitalizacion" + values: + - "ingresado" + - "en_tratamiento" + - "estable" + - "critico" + - "alta" + - "fallecido" + +catalogos: + - name: "especies" + descripcion: "Catalogo de especies animales" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "nombre: VARCHAR(50)" + - "nombre_cientifico: VARCHAR(100)" + - "descripcion: TEXT" + - "active: BOOLEAN" + + - name: "razas" + descripcion: "Catalogo de razas por especie" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "especie_id: UUID FK" + - "nombre: VARCHAR(100)" + - "descripcion: TEXT" + - "tamanio_promedio: VARCHAR(20)" + - "peso_promedio_kg: NUMERIC(5,2)" + - "active: BOOLEAN" + + - name: "vacunas" + descripcion: "Catalogo de vacunas veterinarias" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "nombre: VARCHAR(100)" + - "descripcion: TEXT" + - "especie_id: UUID FK" + - "laboratorio: VARCHAR(100)" + - "dosis_ml: NUMERIC(5,2)" + - "intervalo_refuerzo_dias: INTEGER" + - "es_obligatoria: BOOLEAN" + - "active: BOOLEAN" + +tablas: + - name: "propietarios" + descripcion: "Propietarios/duenos de mascotas" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "partner_id: UUID FK (opcional)" + - "nombre: VARCHAR(100)" + - "apellidos: VARCHAR(100)" + - "telefono: VARCHAR(20)" + - "telefono_emergencia: VARCHAR(20)" + - "email: VARCHAR(100)" + - "direccion: TEXT" + - "rfc: VARCHAR(13)" + - "active: BOOLEAN" + indices: + - "idx_propietarios_tenant" + - "idx_propietarios_telefono" + + - name: "mascotas" + descripcion: "Mascotas/pacientes de la clinica" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "propietario_id: UUID FK" + - "especie_id: UUID FK" + - "raza_id: UUID FK" + - "nombre: VARCHAR(100)" + - "sexo: veterinaria.sexo_animal" + - "fecha_nacimiento: DATE" + - "edad_aproximada: VARCHAR(50)" + - "color: VARCHAR(50)" + - "peso_kg: NUMERIC(6,2)" + - "numero_chip: VARCHAR(50)" + - "tiene_chip: BOOLEAN" + - "esterilizado: BOOLEAN" + - "fecha_esterilizacion: DATE" + - "alergias: TEXT" + - "condiciones_especiales: TEXT" + - "notas: TEXT" + - "foto_url: VARCHAR(255)" + - "active: BOOLEAN" + indices: + - "idx_mascotas_tenant" + - "idx_mascotas_propietario" + - "idx_mascotas_especie" + - "idx_mascotas_chip" + + - name: "cartilla_vacunacion" + descripcion: "Historial de vacunacion de mascotas" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "mascota_id: UUID FK" + - "vacuna_id: UUID FK" + - "veterinario_id: UUID FK" + - "fecha_aplicacion: DATE" + - "fecha_proximo_refuerzo: DATE" + - "lote: VARCHAR(50)" + - "laboratorio: VARCHAR(100)" + - "observaciones: TEXT" + indices: + - "idx_cartilla_tenant" + - "idx_cartilla_mascota" + - "idx_cartilla_fecha" + + - name: "desparasitaciones" + descripcion: "Historial de desparasitaciones" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "mascota_id: UUID FK" + - "veterinario_id: UUID FK" + - "tipo: VARCHAR(50)" + - "producto: VARCHAR(100)" + - "dosis: VARCHAR(50)" + - "via_administracion: VARCHAR(50)" + - "fecha_aplicacion: DATE" + - "fecha_proxima: DATE" + - "observaciones: TEXT" + indices: + - "idx_desparasitaciones_tenant" + - "idx_desparasitaciones_mascota" + + - name: "hospitalizacion" + descripcion: "Registro de hospitalizaciones" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "mascota_id: UUID FK" + - "veterinario_id: UUID FK" + - "consultation_id: UUID FK" + - "fecha_ingreso: TIMESTAMPTZ" + - "motivo_ingreso: TEXT" + - "diagnostico_ingreso: TEXT" + - "area: VARCHAR(50)" + - "numero_jaula: VARCHAR(20)" + - "estado: veterinaria.estado_hospitalizacion" + - "fecha_alta: TIMESTAMPTZ" + - "diagnostico_alta: TEXT" + - "instrucciones_alta: TEXT" + indices: + - "idx_hospitalizacion_tenant" + - "idx_hospitalizacion_mascota" + - "idx_hospitalizacion_estado" + + - name: "hospitalizacion_monitoreo" + descripcion: "Monitoreo durante hospitalizacion" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "hospitalizacion_id: UUID FK" + - "fecha_hora: TIMESTAMPTZ" + - "peso_kg: NUMERIC(6,2)" + - "temperatura: NUMERIC(4,1)" + - "frecuencia_cardiaca: INTEGER" + - "frecuencia_respiratoria: INTEGER" + - "comio: BOOLEAN" + - "bebio_agua: BOOLEAN" + - "orino: BOOLEAN" + - "defeco: BOOLEAN" + - "consistencia_heces: VARCHAR(50)" + - "estado_animo: VARCHAR(50)" + - "nivel_dolor: INTEGER (0-10)" + - "observaciones: TEXT" + - "registrado_por: UUID FK" + indices: + - "idx_hospitalizacion_monitoreo_hosp" + + - name: "estetica" + descripcion: "Servicios de estetica/grooming" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "mascota_id: UUID FK" + - "estilista_id: UUID FK" + - "fecha_servicio: TIMESTAMPTZ" + - "servicios: TEXT[]" + - "tipo_corte: VARCHAR(50)" + - "shampoo_usado: VARCHAR(100)" + - "estado: VARCHAR(20)" + - "hora_inicio: TIME" + - "hora_fin: TIME" + - "observaciones: TEXT" + - "observaciones_piel: TEXT" + - "precio: NUMERIC(10,2)" + indices: + - "idx_estetica_tenant" + - "idx_estetica_mascota" + - "idx_estetica_fecha" + +extensiones_clinica: + tabla: "clinica.consultations" + columnas_agregadas: + - "mascota_id: UUID FK" + - "peso_actual: NUMERIC(6,2)" + - "temperatura: NUMERIC(4,1)" + +# ============================================================================ +# FARMACIA (VET-006) - Agregado 2026-01-07 +# ============================================================================ + +enums_farmacia: + - name: "categoria_medicamento" + values: + - "antibiotico" + - "antiparasitario" + - "analgesico" + - "antiinflamatorio" + - "vacuna" + - "vitamina" + - "dermatologico" + - "oftalmico" + - "cardiaco" + - "digestivo" + - "otro" + + - name: "tipo_movimiento_farmacia" + values: + - "entrada" + - "salida" + - "ajuste_positivo" + - "ajuste_negativo" + - "devolucion" + - "merma" + + - name: "fraccion_controlada" + values: + - "no_controlado" + - "fraccion_i" + - "fraccion_ii" + - "fraccion_iii" + - "fraccion_iv" + +tablas_farmacia: + - name: "medicamentos" + descripcion: "Catalogo de medicamentos veterinarios" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "codigo: VARCHAR(50)" + - "nombre: VARCHAR(150)" + - "nombre_comercial: VARCHAR(150)" + - "principio_activo: VARCHAR(200)" + - "categoria: veterinaria.categoria_medicamento" + - "presentacion: VARCHAR(100)" + - "concentracion: VARCHAR(50)" + - "contenido: VARCHAR(50)" + - "laboratorio: VARCHAR(100)" + - "requiere_receta: BOOLEAN" + - "controlado: BOOLEAN" + - "fraccion_controlada: veterinaria.fraccion_controlada" + - "stock_minimo: INTEGER" + - "stock_actual: INTEGER" + - "precio_compra: NUMERIC(10,2)" + - "precio_venta: NUMERIC(10,2)" + - "especies_aplicables: UUID[]" + - "active: BOOLEAN" + indices: + - "idx_medicamentos_tenant" + - "idx_medicamentos_codigo" + - "idx_medicamentos_nombre" + - "idx_medicamentos_categoria" + - "idx_medicamentos_controlado" + - "idx_medicamentos_stock_bajo" + + - name: "medicamentos_lotes" + descripcion: "Lotes de medicamentos con control de caducidad" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "medicamento_id: UUID FK" + - "numero_lote: VARCHAR(50)" + - "fecha_caducidad: DATE" + - "cantidad_inicial: INTEGER" + - "cantidad_actual: INTEGER" + - "precio_compra: NUMERIC(10,2)" + - "factura_compra: VARCHAR(50)" + - "proveedor: VARCHAR(100)" + - "fecha_recepcion: DATE" + - "bloqueado: BOOLEAN" + - "motivo_bloqueo: TEXT" + indices: + - "idx_lotes_tenant" + - "idx_lotes_medicamento" + - "idx_lotes_caducidad" + - "idx_lotes_numero" + - "idx_lotes_proximos_caducar" + + - name: "dispensaciones" + descripcion: "Registro de dispensacion de medicamentos" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "medicamento_id: UUID FK" + - "lote_id: UUID FK" + - "mascota_id: UUID FK" + - "veterinario_id: UUID FK" + - "receta_id: UUID FK" + - "consultation_id: UUID FK" + - "cantidad: INTEGER" + - "fecha_dispensacion: TIMESTAMPTZ" + - "dosis: VARCHAR(100)" + - "duracion_tratamiento: VARCHAR(50)" + - "instrucciones: TEXT" + - "dispensado_por: UUID FK" + - "notas: TEXT" + indices: + - "idx_dispensaciones_tenant" + - "idx_dispensaciones_medicamento" + - "idx_dispensaciones_mascota" + - "idx_dispensaciones_fecha" + - "idx_dispensaciones_veterinario" + + - name: "movimientos_farmacia" + descripcion: "Kardex de movimientos de inventario de farmacia" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "medicamento_id: UUID FK" + - "lote_id: UUID FK" + - "tipo: veterinaria.tipo_movimiento_farmacia" + - "cantidad: INTEGER" + - "stock_anterior: INTEGER" + - "stock_posterior: INTEGER" + - "referencia_tipo: VARCHAR(50)" + - "referencia_id: UUID" + - "motivo: TEXT" + - "documento: VARCHAR(100)" + - "usuario_id: UUID FK" + indices: + - "idx_movimientos_tenant" + - "idx_movimientos_medicamento" + - "idx_movimientos_fecha" + + - name: "bitacora_controlados" + descripcion: "Bitacora de medicamentos controlados (COFEPRIS)" + rls: true + columnas: + - "id: UUID PK" + - "tenant_id: UUID FK" + - "medicamento_id: UUID FK" + - "lote_id: UUID FK" + - "dispensacion_id: UUID FK" + - "tipo_movimiento: veterinaria.tipo_movimiento_farmacia" + - "cantidad: INTEGER" + - "mascota_id: UUID FK" + - "propietario_nombre: VARCHAR(200)" + - "receta_id: UUID FK" + - "veterinario_id: UUID FK" + - "veterinario_cedula: VARCHAR(50)" + - "justificacion: TEXT" + - "diagnostico: TEXT" + - "fecha_registro: TIMESTAMPTZ" + - "registrado_por: UUID FK" + - "ip_address: VARCHAR(45)" + indices: + - "idx_bitacora_tenant" + - "idx_bitacora_medicamento" + - "idx_bitacora_fecha" + +funciones_farmacia: + - name: "get_lotes_proximos_caducar(tenant_id, dias)" + descripcion: "Obtiene lotes que caducaran en los proximos N dias" + - name: "get_medicamentos_stock_bajo(tenant_id)" + descripcion: "Obtiene medicamentos con stock igual o menor al minimo" + - name: "seleccionar_lote_fefo(medicamento_id, cantidad)" + descripcion: "Selecciona el lote con fecha de caducidad mas proxima (FEFO)" + +triggers_farmacia: + - name: "trg_actualizar_stock" + tabla: "medicamentos_lotes" + descripcion: "Actualiza stock_actual en medicamentos cuando cambian los lotes" + - name: "trg_registrar_dispensacion" + tabla: "dispensaciones" + descripcion: "Registra movimiento y bitacora al dispensar medicamentos" + +resumen: + total_enums: 5 + total_catalogos: 3 + total_tablas: 12 + total_con_rls: 15 + total_funciones: 3 + total_triggers: 2 + archivos_ddl: + - "database/schemas/01-veterinaria-schema-ddl.sql" + - "database/schemas/02-veterinaria-farmacia-ddl.sql" + archivos_seeds: + - "database/seeds/fase8/01-veterinaria-catalogos.sql" + +ultima_actualizacion: "2026-01-07" +actualizado_por: "Orquestador Workspace (Sprint 9)" diff --git a/orchestration/inventarios/MASTER_INVENTORY.yml b/orchestration/inventarios/MASTER_INVENTORY.yml new file mode 100644 index 0000000..117f172 --- /dev/null +++ b/orchestration/inventarios/MASTER_INVENTORY.yml @@ -0,0 +1,82 @@ +--- +# MASTER INVENTORY - Clinica Veterinaria +# Version: 1.0.0 +# Ultima actualizacion: 2026-01-07 + +proyecto: "clinica-veterinaria" +descripcion: "ERP especializado para clinicas veterinarias" +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: "VET-001" + nombre: "mascotas" + descripcion: "Registro de animales/pacientes" + estado: "ddl_completado" + + - id: "VET-002" + nombre: "propietarios" + descripcion: "Duenos de mascotas" + estado: "ddl_completado" + + - id: "VET-003" + nombre: "vacunacion" + descripcion: "Cartilla y control de vacunas" + estado: "ddl_completado" + + - id: "VET-004" + nombre: "hospitalizacion" + descripcion: "Control de internamiento" + estado: "ddl_completado" + + - id: "VET-005" + nombre: "farmacia" + descripcion: "Inventario veterinario" + estado: "pendiente" + +database: + schema: "veterinaria" + archivo_ddl: "database/schemas/01-veterinaria-schema-ddl.sql" + archivo_seeds: "database/seeds/fase8/01-veterinaria-catalogos.sql" + tablas_especificas: + - "pets" + - "pet_owners" + - "vaccinations" + - "vaccination_records" + - "hospitalizations" + - "vet_consultations" + +catalogos: + - "especies" + - "razas_por_especie" + - "vacunas_por_especie" + - "especialidades_veterinarias" + +proximas_tareas: + - "Implementar backend modulo mascotas" + - "Crear frontend para cartilla de vacunacion" + - "Integracion con erp-clinicas" + +ultima_actualizacion: "2026-01-07" +actualizado_por: "Orquestador" diff --git a/orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md b/orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md new file mode 100644 index 0000000..d2b3697 --- /dev/null +++ b/orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md @@ -0,0 +1,224 @@ +# Reporte de Ejecucion - Sprint 7 +## Clinica Veterinaria Documentation + +**Fecha:** 2026-01-07 +**Ejecutor:** Claude Opus 4.5 (Orquestador Workspace) +**Framework:** NEXUS v4.0 + SIMCO v2.5 + +--- + +## Resumen Ejecutivo + +Sprint 7 completado exitosamente. Se documentaron los 6 modulos especializados del sistema de clinica veterinaria con especificaciones tecnicas completas, modelo de datos, endpoints API, flujos, y criterios de aceptacion. + +## Tareas Ejecutadas + +| ID | Tarea | Estado | Resultado | +|----|-------|--------|-----------| +| S7.1 | Explorar estructura | ✅ Completado | Proyecto analizado | +| S7.2 | Crear inventarios | ✅ Completado | DATABASE_INVENTORY.yml | +| S7.3 | Crear epicas modulos | ✅ Completado | 6 epicas | +| S7.4 | Validar Sprint 7 | ✅ Completado | Este reporte | + +## Proyecto Analizado + +### Informacion General + +| Campo | Valor | +|-------|-------| +| Proyecto | clinica-veterinaria | +| Tipo | ERP Especializado (Vertical) | +| Base | erp-clinicas | +| Suite Core | erp-core | +| Estado | Database completado, Backend pendiente | + +### Herencia + +``` +erp-core + └── erp-clinicas + └── clinica-veterinaria (VET-001 a VET-006) +``` + +**Modulos heredados:** +- auth, users, tenants, roles (erp-core) +- doctors, appointments, consultations (erp-clinicas) + +## Archivos Creados + +### Inventarios (1 archivo) + +| Archivo | Ubicacion | Contenido | +|---------|-----------|-----------| +| DATABASE_INVENTORY.yml | orchestration/inventarios/ | 2 ENUMs, 3 catalogos, 7 tablas | + +### Epicas (6 archivos) + +| Archivo | Modulo | Estado DDL | Fase | +|---------|--------|------------|------| +| VET-001-mascotas-propietarios.md | Mascotas + Propietarios | Completado | 1 - Core | +| VET-002-vacunacion.md | Cartilla Vacunacion | Completado | 2 - Vacunacion | +| VET-003-desparasitaciones.md | Desparasitaciones | Completado | 2 - Vacunacion | +| VET-004-hospitalizacion.md | Hospitalizacion | Completado | 3 - Hospitalizacion | +| VET-005-estetica.md | Estetica/Grooming | Completado | 4 - Servicios | +| VET-006-farmacia.md | Farmacia Veterinaria | Pendiente | 2 - Vacunacion | + +## Modelo de Datos Documentado + +### Schema: veterinaria + +**ENUMs:** +| Nombre | Valores | +|--------|---------| +| sexo_animal | macho, hembra, desconocido | +| estado_hospitalizacion | ingresado, en_tratamiento, estable, critico, alta, fallecido | + +**Catalogos:** +| Tabla | Descripcion | +|-------|-------------| +| especies | Catalogo de especies animales | +| razas | Razas por especie | +| vacunas | Vacunas veterinarias | + +**Tablas Principales:** +| Tabla | Descripcion | RLS | +|-------|-------------|-----| +| propietarios | Duenos de mascotas | Si | +| mascotas | Pacientes veterinarios | Si | +| cartilla_vacunacion | Historial de vacunas | Si | +| desparasitaciones | Historial desparasitaciones | Si | +| hospitalizacion | Registro de internados | Si | +| hospitalizacion_monitoreo | Signos vitales | Si | +| estetica | Servicios grooming | Si | + +## Especies Documentadas + +| Especie | Codigo | Vacunas Tipicas | +|---------|--------|-----------------| +| Canino | CAN | Quintuple, Rabia, Bordetella | +| Felino | FEL | Triple Felina, Leucemia, Rabia | +| Ave | AVE | Variable | +| Reptil | REP | Sin estandar | +| Roedor | ROE | Sin estandar | +| Exotico | EXO | Segun especie | + +## Signos Vitales por Especie + +| Especie | Temperatura | FC | FR | +|---------|-------------|-----|-----| +| Canino | 38-39°C | 60-120 lpm | 10-30 rpm | +| Felino | 38-39°C | 120-180 lpm | 20-40 rpm | +| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm | + +## Endpoints Documentados + +| Modulo | Endpoints | +|--------|-----------| +| Mascotas | 12 endpoints | +| Propietarios | 6 endpoints | +| Vacunacion | 10 endpoints | +| Desparasitaciones | 6 endpoints | +| Hospitalizacion | 9 endpoints | +| Estetica | 8 endpoints | +| Farmacia | 11 endpoints | +| **Total** | **62 endpoints** | + +## Cobertura por Fase + +``` +Fase 1 - Core: 1 modulo (VET-001) +Fase 2 - Vacunacion: 3 modulos (VET-002, VET-003, VET-006) +Fase 3 - Hospitalizacion:1 modulo (VET-004) +Fase 4 - Servicios: 1 modulo (VET-005) +``` + +## Dependencias Entre Modulos + +``` +VET-001 (Mascotas + Propietarios) + │ + ├── VET-002 (Vacunacion) + │ └── Reportes SENASICA + │ + ├── VET-003 (Desparasitaciones) + │ + ├── VET-004 (Hospitalizacion) + │ └── hospitalizacion_monitoreo + │ + ├── VET-005 (Estetica) + │ + └── VET-006 (Farmacia) + └── Dispensacion +``` + +## Integraciones Documentadas + +| Sistema | Proposito | Prioridad | +|---------|-----------|-----------| +| SENASICA | Reportes vacunacion | P1 | +| Laboratorios | Resultados analisis | P1 | +| Proveedores | Pedidos medicamentos | P2 | +| CFDI 4.0 | Facturacion electronica | P1 | +| WhatsApp/SMS | Recordatorios | P2 | + +## 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 | ✅ | + +### Observaciones +- VET-006 (Farmacia) no tiene DDL aun - se propuso estructura +- Esquemas de vacunacion documentados por especie +- Signos vitales normales por especie incluidos + +## Archivos DDL Existentes + +| Archivo | Lineas | Estado | +|---------|--------|--------| +| database/schemas/01-veterinaria-schema-ddl.sql | 388 | Completado | +| database/seeds/fase8/01-veterinaria-catalogos.sql | - | Referenciado | + +## Metricas del Sprint + +| Metrica | Valor | +|---------|-------| +| Archivos creados | 7 (1 inventario + 6 epicas) | +| Lineas documentadas | ~3,200 | +| Endpoints especificados | 62 | +| Tablas documentadas | 10 | +| ENUMs documentados | 2 | +| Especies soportadas | 7 | + +## Proximos Pasos + +1. **Sprint 8:** Consolidacion y validacion final +2. **Implementacion DDL:** VET-006 Farmacia +3. **Backend:** Modulos VET-001 a VET-006 +4. **Integracion:** SENASICA automatizado + +## Comparativa con clinica-dental + +| Aspecto | clinica-dental | clinica-veterinaria | +|---------|----------------|---------------------| +| Pacientes | Humanos (odontogramas) | Animales (multi-especie) | +| Catalogos | Piezas dentales FDI | Especies, razas, vacunas | +| Especialidades | Ortodoncia, Protesis | Hospitalizacion, Estetica | +| Integraciones | Laboratorio dental | SENASICA, Laboratorios | +| Tablas DDL | 11 | 10 | +| Endpoints | 56 | 62 | + +--- + +**Sprint 7 Completado:** 2026-01-07 +**Validado por:** Orquestador Workspace (NEXUS v4.0) diff --git a/orchestration/trazas/TRAZA-TAREAS-DATABASE.md b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md new file mode 100644 index 0000000..bd34847 --- /dev/null +++ b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md @@ -0,0 +1,53 @@ +# TRAZA DE TAREAS - DATABASE + +**Proyecto:** clinica-veterinaria +**Capa:** Database +**Version:** 1.0.0 + +--- + +## HISTORIAL + +### [2026-01-04] VET-DDL-001 +**Estado:** completado +**Agente:** Database-Agent +**Duracion:** ~2h + +#### Descripcion +Creacion del schema veterinaria con tablas especificas. + +#### Archivos Creados +- `database/schemas/01-veterinaria-schema-ddl.sql` + +#### Resultado +Schema veterinaria creado con tablas para mascotas, propietarios, vacunacion, hospitalizacion. + +--- + +### [2026-01-04] VET-SEEDS-001 +**Estado:** completado +**Agente:** Database-Agent +**Duracion:** ~1h + +#### Descripcion +Seeds iniciales con catalogos veterinarios. + +#### Archivos Creados +- `database/seeds/fase8/01-veterinaria-catalogos.sql` + +#### Resultado +Catalogos cargados: especies, razas, vacunas, especialidades. + +--- + +## TAREAS PENDIENTES + +| ID | Tarea | Prioridad | Dependencias | +|----|-------|-----------|--------------| +| VET-DDL-002 | RLS policies para tablas veterinaria | P1 | - | +| VET-DDL-003 | Tablas para farmacia veterinaria | P1 | - | +| VET-DDL-004 | Funciones de alertas de vacunacion | P2 | - | + +--- + +**Ultima actualizacion:** 2026-01-07