[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
This commit is contained in:
commit
53da75ddc7
271
.env.example
Normal file
271
.env.example
Normal file
@ -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
|
||||||
|
# =============================================================================
|
||||||
20
.env.ports
Normal file
20
.env.ports
Normal file
@ -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
|
||||||
|
# =============================================================================
|
||||||
82
README.md
Normal file
82
README.md
Normal file
@ -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
|
||||||
387
database/schemas/01-veterinaria-schema-ddl.sql
Normal file
387
database/schemas/01-veterinaria-schema-ddl.sql
Normal file
@ -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
|
||||||
|
-- ============================================================================
|
||||||
464
database/schemas/02-veterinaria-farmacia-ddl.sql
Normal file
464
database/schemas/02-veterinaria-farmacia-ddl.sql
Normal file
@ -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
|
||||||
|
-- ============================================================================
|
||||||
146
database/seeds/fase8/01-veterinaria-catalogos.sql
Normal file
146
database/seeds/fase8/01-veterinaria-catalogos.sql
Normal file
@ -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;
|
||||||
53
docs/00-vision-general/README.md
Normal file
53
docs/00-vision-general/README.md
Normal file
@ -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.
|
||||||
392
docs/00-vision-general/VISION.md
Normal file
392
docs/00-vision-general/VISION.md
Normal file
@ -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
|
||||||
258
docs/01-epicas/VET-001-mascotas-propietarios.md
Normal file
258
docs/01-epicas/VET-001-mascotas-propietarios.md
Normal file
@ -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<Mascota[]>;
|
||||||
|
getById(id: string): Promise<Mascota>;
|
||||||
|
create(data: CreateMascota): Promise<Mascota>;
|
||||||
|
update(id: string, data: UpdateMascota): Promise<Mascota>;
|
||||||
|
findByChip(numeroChip: string): Promise<Mascota | null>;
|
||||||
|
registrarPeso(mascotaId: string, pesoKg: number): Promise<void>;
|
||||||
|
getHistorialPeso(mascotaId: string): Promise<PesoHistorial[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PropietariosService {
|
||||||
|
getAll(filters?: PropietarioFilters): Promise<Propietario[]>;
|
||||||
|
getById(id: string): Promise<Propietario>;
|
||||||
|
create(data: CreatePropietario): Promise<Propietario>;
|
||||||
|
getMascotas(propietarioId: string): Promise<Mascota[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
268
docs/01-epicas/VET-002-vacunacion.md
Normal file
268
docs/01-epicas/VET-002-vacunacion.md
Normal file
@ -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<Vacuna[]>;
|
||||||
|
getCartilla(mascotaId: string): Promise<VacunacionRecord[]>;
|
||||||
|
aplicar(data: AplicarVacuna): Promise<VacunacionRecord>;
|
||||||
|
getProximosRefuerzos(dias: number): Promise<RefuerzoPendiente[]>;
|
||||||
|
getVencidos(): Promise<RefuerzoPendiente[]>;
|
||||||
|
generarCertificado(mascotaId: string): Promise<Buffer>;
|
||||||
|
getReporteSenasica(mes: number, anio: number): Promise<ReporteSenasica>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
222
docs/01-epicas/VET-003-desparasitaciones.md
Normal file
222
docs/01-epicas/VET-003-desparasitaciones.md
Normal file
@ -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<Desparasitacion[]>;
|
||||||
|
registrar(data: RegistrarDesparasitacion): Promise<Desparasitacion>;
|
||||||
|
getProximas(dias: number): Promise<DesparasitacionPendiente[]>;
|
||||||
|
getVencidas(): Promise<DesparasitacionPendiente[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
274
docs/01-epicas/VET-004-hospitalizacion.md
Normal file
274
docs/01-epicas/VET-004-hospitalizacion.md
Normal file
@ -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<Hospitalizacion[]>;
|
||||||
|
getById(id: string): Promise<Hospitalizacion>;
|
||||||
|
ingresar(data: IngresoHospitalizacion): Promise<Hospitalizacion>;
|
||||||
|
darAlta(id: string, data: AltaHospitalizacion): Promise<Hospitalizacion>;
|
||||||
|
registrarMonitoreo(hospId: string, data: Monitoreo): Promise<Monitoreo>;
|
||||||
|
getMonitoreos(hospId: string): Promise<Monitoreo[]>;
|
||||||
|
getEspaciosDisponibles(): Promise<Espacio[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
250
docs/01-epicas/VET-005-estetica.md
Normal file
250
docs/01-epicas/VET-005-estetica.md
Normal file
@ -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<Estetica[]>;
|
||||||
|
getById(id: string): Promise<Estetica>;
|
||||||
|
agendar(data: AgendarEstetica): Promise<Estetica>;
|
||||||
|
iniciar(id: string): Promise<Estetica>;
|
||||||
|
terminar(id: string, data: TerminarEstetica): Promise<Estetica>;
|
||||||
|
getHistorial(mascotaId: string): Promise<Estetica[]>;
|
||||||
|
getAgenda(fecha: Date): Promise<Estetica[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
288
docs/01-epicas/VET-006-farmacia.md
Normal file
288
docs/01-epicas/VET-006-farmacia.md
Normal file
@ -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<Medicamento[]>;
|
||||||
|
getMedicamentoById(id: string): Promise<MedicamentoConStock>;
|
||||||
|
getLotes(medicamentoId: string): Promise<Lote[]>;
|
||||||
|
registrarLote(data: RegistrarLote): Promise<Lote>;
|
||||||
|
dispensar(data: Dispensar): Promise<Dispensacion>;
|
||||||
|
getAlertasCaducidad(dias: number): Promise<LoteAlerta[]>;
|
||||||
|
getAlertasStock(): Promise<MedicamentoAlerta[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
193
docs/02-definicion-modulos/_MAP.md
Normal file
193
docs/02-definicion-modulos/_MAP.md
Normal file
@ -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
|
||||||
697
docs/02-definicion-modulos/modulo-mascotas.md
Normal file
697
docs/02-definicion-modulos/modulo-mascotas.md
Normal file
@ -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<Mascota>
|
||||||
|
|
||||||
|
- 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
|
||||||
744
docs/02-definicion-modulos/modulo-vacunacion.md
Normal file
744
docs/02-definicion-modulos/modulo-vacunacion.md
Normal file
@ -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
|
||||||
34
docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml
Normal file
34
docs/04-modelado/trazabilidad/TRACEABILITY-MASTER.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# TRACEABILITY-MASTER.yml v2.0
|
||||||
|
# Proyecto: Clinica 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"
|
||||||
172
docs/_MAP.md
Normal file
172
docs/_MAP.md
Normal file
@ -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
|
||||||
164
orchestration/00-guidelines/CONTEXTO-PROYECTO.md
Normal file
164
orchestration/00-guidelines/CONTEXTO-PROYECTO.md
Normal file
@ -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
|
||||||
116
orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md
Normal file
116
orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# Herencia ERP-Clínicas - Clínica 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
|
||||||
322
orchestration/CONTEXT-MAP.yml
Normal file
322
orchestration/CONTEXT-MAP.yml
Normal file
@ -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/"
|
||||||
57
orchestration/PROJECT-STATUS.md
Normal file
57
orchestration/PROJECT-STATUS.md
Normal file
@ -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
|
||||||
244
orchestration/PROXIMA-ACCION.md
Normal file
244
orchestration/PROXIMA-ACCION.md
Normal file
@ -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
|
||||||
694
orchestration/environment/ENVIRONMENT-INVENTORY.yml
Normal file
694
orchestration/environment/ENVIRONMENT-INVENTORY.yml
Normal file
@ -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 <url_repo>
|
||||||
|
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 <PID>
|
||||||
|
O cambiar puertos en .env
|
||||||
|
|
||||||
|
- problema: "Error de conexion a PostgreSQL"
|
||||||
|
solucion: |
|
||||||
|
1. Verificar que PostgreSQL esta corriendo:
|
||||||
|
docker-compose ps
|
||||||
|
# o: systemctl status postgresql
|
||||||
|
2. Verificar credenciales en .env
|
||||||
|
3. Verificar que la BD existe:
|
||||||
|
psql -h localhost -p 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
|
||||||
|
# =============================================================================
|
||||||
443
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
443
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
@ -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)"
|
||||||
82
orchestration/inventarios/MASTER_INVENTORY.yml
Normal file
82
orchestration/inventarios/MASTER_INVENTORY.yml
Normal file
@ -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"
|
||||||
224
orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md
Normal file
224
orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md
Normal file
@ -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)
|
||||||
53
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
53
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
@ -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
|
||||||
Loading…
Reference in New Issue
Block a user