[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:
rckrdmrd 2026-01-10 11:29:18 -06:00
commit 53da75ddc7
29 changed files with 7614 additions and 0 deletions

271
.env.example Normal file
View 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
View 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
View 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

View 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
-- ============================================================================

View 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
-- ============================================================================

View 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;

View 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.

View 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

View 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

View 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

View 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

View 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

View 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

View 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)

View 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

View 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

View 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

View 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
View 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

View 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

View 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

View 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/"

View 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

View 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

View 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
# =============================================================================

View 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)"

View 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"

View 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)

View 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