commit 6e195553d27bfb37103dce14e5ce3aace7b28156 Author: rckrdmrd Date: Wed Jan 7 04:42:03 2026 -0600 feat: Initial commit - clinica-veterinaria ERP especializado para clínicas veterinarias. Estructura inicial: - database/ (PostgreSQL DDL) - docs/ (Documentación) - orchestration/ (Sistema NEXUS) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f37529b --- /dev/null +++ b/.env.example @@ -0,0 +1,271 @@ +# ============================================================================= +# .env.example - CLINICA VETERINARIA +# ============================================================================= +# Copia este archivo a .env y configura los valores +# Generado por: @PERFIL_DEVENV +# Referencia: orchestration/environment/ENVIRONMENT-INVENTORY.yml +# ============================================================================= + +# ============================================================================= +# APLICACION +# ============================================================================= +NODE_ENV=development +APP_NAME=clinica-veterinaria +APP_VERSION=1.0.0 + +# ============================================================================= +# PUERTOS - Asignados por DEVENV-PORTS-INVENTORY.yml +# ============================================================================= +FRONTEND_PORT=3120 +BACKEND_PORT=3121 + +# Alias para compatibilidad +PORT=3121 + +# ============================================================================= +# BASE DE DATOS - PostgreSQL +# ============================================================================= +# Desarrollo: Puerto 5440 (asignado en DEVENV-PORTS-INVENTORY.yml) +# Produccion: Puerto 5432 (estandar) +# ============================================================================= + +DB_HOST=localhost +DB_PORT=5440 +DB_NAME=clinica_veterinaria_dev +DB_USER=veterinaria_dev + +# IMPORTANTE: Generar password seguro con: openssl rand -base64 32 +DB_PASSWORD=CAMBIAR_POR_PASSWORD_SEGURO + +# Connection string completo (calculado de las variables anteriores) +DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} + +# Pool de conexiones +DB_POOL_SIZE=10 +DB_CONNECTION_TIMEOUT=5000 + +# SSL (false para desarrollo, true para produccion) +DB_SSL=false + +# ============================================================================= +# BASE DE DATOS - Ambientes adicionales +# ============================================================================= +# Test (mismo servidor, diferente BD) +# DB_NAME_TEST=clinica_veterinaria_test + +# Staging (servidor externo) +# DB_HOST_STAGING=staging-db.example.com +# DB_NAME_STAGING=clinica_veterinaria_staging +# DB_USER_STAGING=veterinaria_staging + +# Produccion (servidor externo) +# DB_HOST_PROD=prod-db.example.com +# DB_NAME_PROD=clinica_veterinaria_prod +# DB_USER_PROD=veterinaria_prod + +# ============================================================================= +# REDIS - Cache y Sesiones +# ============================================================================= +# Desarrollo: Puerto 6387 (asignado en DEVENV-PORTS-INVENTORY.yml) +# Produccion: Puerto 6379 (estandar) +# ============================================================================= + +REDIS_HOST=localhost +REDIS_PORT=6387 +REDIS_DB=0 + +# Password (vacio para desarrollo, requerido en produccion) +REDIS_PASSWORD= + +# Connection string +REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB} + +# Configuracion de cache +REDIS_CACHE_TTL=3600 +REDIS_MAX_MEMORY=128mb + +# ============================================================================= +# AUTENTICACION - JWT +# ============================================================================= +# IMPORTANTE: Generar secreto seguro con: openssl rand -base64 64 +# Minimo 32 caracteres requeridos +# ============================================================================= + +JWT_SECRET=CAMBIAR_POR_SECRETO_SEGURO_DE_AL_MENOS_32_CARACTERES + +# Tiempos de expiracion +JWT_EXPIRES_IN=24h +JWT_REFRESH_EXPIRES_IN=7d + +# Algoritmo (default: HS256) +JWT_ALGORITHM=HS256 + +# ============================================================================= +# CORS - Cross-Origin Resource Sharing +# ============================================================================= + +FRONTEND_URL=http://localhost:3120 + +# Multiples origenes separados por coma +ALLOWED_ORIGINS=http://localhost:3120,http://localhost:3121 + +# Metodos permitidos +CORS_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS + +# Headers permitidos +CORS_HEADERS=Content-Type,Authorization,X-Requested-With + +# ============================================================================= +# LOGGING +# ============================================================================= + +# Niveles: debug, info, warn, error +LOG_LEVEL=debug + +# Formatos: pretty (desarrollo), json (produccion) +LOG_FORMAT=pretty + +# Archivo de logs (opcional) +# LOG_FILE=./logs/app.log + +# Rotacion de logs +# LOG_MAX_SIZE=10m +# LOG_MAX_FILES=5 + +# ============================================================================= +# ALMACENAMIENTO DE ARCHIVOS +# ============================================================================= + +# Tipo: local, s3, minio +STORAGE_TYPE=local + +# Path local (para desarrollo) +STORAGE_PATH=./uploads + +# Tamano maximo de archivo (10MB en bytes) +MAX_FILE_SIZE=10485760 + +# Tipos permitidos +ALLOWED_FILE_TYPES=image/jpeg,image/png,application/pdf + +# ============================================================================= +# AWS S3 (para produccion) +# ============================================================================= + +# AWS_ACCESS_KEY_ID= +# AWS_SECRET_ACCESS_KEY= +# AWS_REGION=us-east-1 +# AWS_S3_BUCKET=clinica-veterinaria-uploads + +# ============================================================================= +# EMAIL - SMTP +# ============================================================================= +# MailHog para desarrollo: puerto 1025 +# Servidor real para produccion +# ============================================================================= + +SMTP_HOST=localhost +SMTP_PORT=1025 +SMTP_SECURE=false + +# Credenciales (para produccion) +# SMTP_USER= +# SMTP_PASSWORD= + +# Remitente por defecto +SMTP_FROM_NAME=Clinica Veterinaria +SMTP_FROM_EMAIL=noreply@clinica-vet.local + +# ============================================================================= +# SEGURIDAD ADICIONAL +# ============================================================================= + +# Rate limiting +RATE_LIMIT_WINDOW=900000 +RATE_LIMIT_MAX=100 + +# Helmet (headers de seguridad) +HELMET_ENABLED=true + +# CSRF Protection +CSRF_ENABLED=false + +# Throttle por IP +THROTTLE_TTL=60 +THROTTLE_LIMIT=10 + +# ============================================================================= +# MONITOREO Y METRICAS +# ============================================================================= + +# Health check endpoint +HEALTH_CHECK_ENABLED=true + +# Metricas Prometheus (opcional) +# METRICS_ENABLED=false +# METRICS_PORT=9090 + +# Sentry (opcional) +# SENTRY_DSN= + +# ============================================================================= +# CONFIGURACION ESPECIFICA VETERINARIA +# ============================================================================= + +# Recordatorios de vacunacion (dias antes) +VACCINATION_REMINDER_DAYS=7 + +# Intervalo de monitoreo hospitalizacion (minutos) +HOSPITALIZATION_MONITOR_INTERVAL=30 + +# Formatos de chip aceptados +CHIP_FORMATS=ISO11784,ISO11785,FDXA,FDXB + +# ============================================================================= +# DESARROLLO Y DEBUG +# ============================================================================= + +# Habilitar debug de TypeORM +# TYPEORM_LOGGING=true + +# Swagger UI +SWAGGER_ENABLED=true +SWAGGER_TITLE=Clinica Veterinaria API +SWAGGER_VERSION=1.0.0 + +# Hot reload +HOT_RELOAD=true + +# ============================================================================= +# PRODUCCION +# ============================================================================= +# Estas variables deben configurarse via secrets manager en produccion: +# +# - DB_PASSWORD (secreto) +# - JWT_SECRET (secreto) +# - REDIS_PASSWORD (secreto) +# - AWS_ACCESS_KEY_ID (si usa S3) +# - AWS_SECRET_ACCESS_KEY (si usa S3) +# - SMTP_USER (si usa email) +# - SMTP_PASSWORD (si usa email) +# - SENTRY_DSN (si usa Sentry) +# +# Diferencias de configuracion en produccion: +# - NODE_ENV=production +# - LOG_LEVEL=info +# - LOG_FORMAT=json +# - DB_PORT=5432 (estandar) +# - DB_SSL=true +# - REDIS_PORT=6379 (estandar) +# - STORAGE_TYPE=s3 +# - SWAGGER_ENABLED=false +# - HOT_RELOAD=false +# ============================================================================= + +# ============================================================================= +# REFERENCIAS +# ============================================================================= +# Inventario de entorno: orchestration/environment/ENVIRONMENT-INVENTORY.yml +# Inventario de puertos: orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml +# Perfil DevEnv: orchestration/agents/perfiles/PERFIL-DEVENV.md +# ============================================================================= diff --git a/.env.ports b/.env.ports new file mode 100644 index 0000000..a68af9d --- /dev/null +++ b/.env.ports @@ -0,0 +1,20 @@ +# ============================================================================= +# .env.ports - CLINICA VETERINARIA +# ============================================================================= +# Archivo de referencia de puertos asignados +# Generado por: @PERFIL_DEVENV +# ============================================================================= + +# Servicios principales +FRONTEND_PORT=3120 +BACKEND_PORT=3121 + +# Base de datos +DB_PORT=5440 + +# Redis +REDIS_PORT=6387 + +# ============================================================================= +# Referencia: DEVENV-PORTS-INVENTORY.yml +# ============================================================================= diff --git a/README.md b/README.md new file mode 100644 index 0000000..01e166e --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Clinica Veterinaria - ERP Especializado + +**Version:** 0.1.0 +**Estado:** Desarrollo +**Tipo:** VERTICAL (erp-clinicas) +**Sistema:** SIMCO + NEXUS v3.4 + +--- + +## Descripcion + +Sistema de gestion integral para clinicas veterinarias. Vertical especializada basada en erp-clinicas. + +### Funcionalidades Principales + +- Gestion de mascotas (pacientes) con datos completos +- Consultas veterinarias: diagnosticos y tratamientos +- Cartilla de vacunacion y desparasitacion +- Control de hospitalizacion +- Servicios de estetica canina/felina +- Farmacia veterinaria e inventario +- Facturacion de servicios y productos + +--- + +## Stack Tecnologico + +| Capa | Tecnologia | +|------|------------| +| Database | PostgreSQL 16+ con RLS | +| Backend | (pendiente) Express.js / NestJS | +| Frontend | (pendiente) React + Vite | + +--- + +## Estructura del Proyecto + +``` +clinica-veterinaria/ +├── database/ +│ ├── schemas/ # DDL especifico veterinaria +│ └── seeds/ # Datos iniciales +├── docs/ +│ └── 00-vision-general/ +├── orchestration/ +│ ├── 00-guidelines/ +│ ├── environment/ +│ ├── inventarios/ +│ └── trazas/ +└── README.md +``` + +--- + +## Herencia + +Este proyecto hereda de: +- **erp-clinicas** (modulos base de clinicas) +- **erp-core** (modulos genericos ERP) + +--- + +## Inicio Rapido + +```bash +# Database (requiere PostgreSQL y erp-clinicas cargado) +psql -d erp_clinicas -f database/schemas/01-veterinaria-schema-ddl.sql +psql -d erp_clinicas -f database/seeds/fase8/01-veterinaria-catalogos.sql +``` + +--- + +## Referencias + +- Contexto: `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` +- Herencia: `orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md` +- Inventario: `orchestration/inventarios/MASTER_INVENTORY.yml` + +--- + +**Creado:** 2026-01-04 +**Actualizado:** 2026-01-07 diff --git a/database/schemas/01-veterinaria-schema-ddl.sql b/database/schemas/01-veterinaria-schema-ddl.sql new file mode 100644 index 0000000..5959b93 --- /dev/null +++ b/database/schemas/01-veterinaria-schema-ddl.sql @@ -0,0 +1,387 @@ +-- ============================================================================ +-- VETERINARIA SCHEMA - Especialización de ERP-Clínicas +-- Clínica Veterinaria +-- ============================================================================ +-- Fecha: 2026-01-04 +-- Versión: 1.0 +-- Hereda de: erp-clinicas FASE-8 +-- ============================================================================ + +-- Schema +CREATE SCHEMA IF NOT EXISTS veterinaria; + +-- ============================================================================ +-- ENUMS +-- ============================================================================ + +DO $$ BEGIN + CREATE TYPE veterinaria.sexo_animal AS ENUM ('macho', 'hembra', 'desconocido'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE veterinaria.estado_hospitalizacion AS ENUM ( + 'ingresado', 'en_tratamiento', 'estable', 'critico', 'alta', 'fallecido' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +-- ============================================================================ +-- CATÁLOGOS +-- ============================================================================ + +-- Especies +CREATE TABLE IF NOT EXISTS veterinaria.especies ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + nombre VARCHAR(50) NOT NULL, + nombre_cientifico VARCHAR(100), + descripcion TEXT, + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.especies IS 'Catálogo de especies animales'; + +-- Razas +CREATE TABLE IF NOT EXISTS veterinaria.razas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + especie_id UUID NOT NULL REFERENCES veterinaria.especies(id) ON DELETE CASCADE, + nombre VARCHAR(100) NOT NULL, + descripcion TEXT, + tamanio_promedio VARCHAR(20), -- 'pequeño', 'mediano', 'grande', 'gigante' + peso_promedio_kg NUMERIC(5,2), + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.razas IS 'Catálogo de razas por especie'; + +-- Vacunas +CREATE TABLE IF NOT EXISTS veterinaria.vacunas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + nombre VARCHAR(100) NOT NULL, + descripcion TEXT, + especie_id UUID REFERENCES veterinaria.especies(id), + laboratorio VARCHAR(100), + dosis_ml NUMERIC(5,2), + intervalo_refuerzo_dias INTEGER, + es_obligatoria BOOLEAN DEFAULT false, + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.vacunas IS 'Catálogo de vacunas veterinarias'; + +-- ============================================================================ +-- TABLAS PRINCIPALES +-- ============================================================================ + +-- Propietarios (dueños de mascotas) +CREATE TABLE IF NOT EXISTS veterinaria.propietarios ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + partner_id UUID, -- Referencia opcional a core.partners + nombre VARCHAR(100) NOT NULL, + apellidos VARCHAR(100), + telefono VARCHAR(20), + telefono_emergencia VARCHAR(20), + email VARCHAR(100), + direccion TEXT, + rfc VARCHAR(13), + -- Control + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.propietarios IS 'Propietarios/dueños de mascotas'; + +-- Mascotas (pacientes) +CREATE TABLE IF NOT EXISTS veterinaria.mascotas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + propietario_id UUID NOT NULL REFERENCES veterinaria.propietarios(id), + especie_id UUID NOT NULL REFERENCES veterinaria.especies(id), + raza_id UUID REFERENCES veterinaria.razas(id), + -- Datos básicos + nombre VARCHAR(100) NOT NULL, + sexo veterinaria.sexo_animal DEFAULT 'desconocido', + fecha_nacimiento DATE, + edad_aproximada VARCHAR(50), -- "3 años", "6 meses" + color VARCHAR(50), + peso_kg NUMERIC(6,2), + -- Identificación + numero_chip VARCHAR(50), + tiene_chip BOOLEAN DEFAULT false, + -- Estado + esterilizado BOOLEAN DEFAULT false, + fecha_esterilizacion DATE, + -- Notas + alergias TEXT, + condiciones_especiales TEXT, + notas TEXT, + -- Foto + foto_url VARCHAR(255), + -- Control + active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.mascotas IS 'Mascotas/pacientes de la clínica veterinaria'; + +-- Cartilla de vacunación +CREATE TABLE IF NOT EXISTS veterinaria.cartilla_vacunacion ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id) ON DELETE CASCADE, + vacuna_id UUID NOT NULL REFERENCES veterinaria.vacunas(id), + veterinario_id UUID, -- Referencia a clinica.doctors + -- Datos de aplicación + fecha_aplicacion DATE NOT NULL, + fecha_proximo_refuerzo DATE, + lote VARCHAR(50), + laboratorio VARCHAR(100), + -- Notas + observaciones TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.cartilla_vacunacion IS 'Historial de vacunación de mascotas'; + +-- Desparasitaciones +CREATE TABLE IF NOT EXISTS veterinaria.desparasitaciones ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id) ON DELETE CASCADE, + veterinario_id UUID, + -- Datos + tipo VARCHAR(50) NOT NULL, -- 'interna', 'externa', 'ambas' + producto VARCHAR(100) NOT NULL, + dosis VARCHAR(50), + via_administracion VARCHAR(50), + fecha_aplicacion DATE NOT NULL, + fecha_proxima DATE, + -- Notas + observaciones TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.desparasitaciones IS 'Historial de desparasitaciones'; + +-- Hospitalización +CREATE TABLE IF NOT EXISTS veterinaria.hospitalizacion ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id), + veterinario_id UUID, + consultation_id UUID, -- Referencia a clinica.consultations + -- Datos de ingreso + fecha_ingreso TIMESTAMPTZ NOT NULL DEFAULT NOW(), + motivo_ingreso TEXT NOT NULL, + diagnostico_ingreso TEXT, + -- Ubicación + area VARCHAR(50), -- 'jaula_pequena', 'jaula_grande', 'quirofano', 'uci' + numero_jaula VARCHAR(20), + -- Estado + estado veterinaria.estado_hospitalizacion DEFAULT 'ingresado', + -- Alta + fecha_alta TIMESTAMPTZ, + diagnostico_alta TEXT, + instrucciones_alta TEXT, + -- Control + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.hospitalizacion IS 'Registro de hospitalizaciones'; + +-- Monitoreo de hospitalización +CREATE TABLE IF NOT EXISTS veterinaria.hospitalizacion_monitoreo ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + hospitalizacion_id UUID NOT NULL REFERENCES veterinaria.hospitalizacion(id) ON DELETE CASCADE, + -- Signos vitales + fecha_hora TIMESTAMPTZ NOT NULL DEFAULT NOW(), + peso_kg NUMERIC(6,2), + temperatura NUMERIC(4,1), + frecuencia_cardiaca INTEGER, + frecuencia_respiratoria INTEGER, + -- Alimentación + comio BOOLEAN, + bebio_agua BOOLEAN, + -- Eliminación + orino BOOLEAN, + defeco BOOLEAN, + consistencia_heces VARCHAR(50), + -- Estado + estado_animo VARCHAR(50), + nivel_dolor INTEGER CHECK (nivel_dolor BETWEEN 0 AND 10), + -- Notas + observaciones TEXT, + registrado_por UUID, -- employee_id + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.hospitalizacion_monitoreo IS 'Monitoreo durante hospitalización'; + +-- Servicios de estética +CREATE TABLE IF NOT EXISTS veterinaria.estetica ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + mascota_id UUID NOT NULL REFERENCES veterinaria.mascotas(id), + estilista_id UUID, -- employee_id + -- Servicios + fecha_servicio TIMESTAMPTZ NOT NULL DEFAULT NOW(), + servicios TEXT[], -- ['baño', 'corte', 'limpieza_oidos', 'corte_unas'] + tipo_corte VARCHAR(50), + shampoo_usado VARCHAR(100), + -- Estado + estado VARCHAR(20) DEFAULT 'pendiente', -- 'pendiente', 'en_proceso', 'terminado' + hora_inicio TIME, + hora_fin TIME, + -- Notas + observaciones TEXT, + observaciones_piel TEXT, + -- Precio + precio NUMERIC(10,2), + -- Control + created_at TIMESTAMPTZ DEFAULT NOW() +); + +COMMENT ON TABLE veterinaria.estetica IS 'Servicios de estética/grooming'; + +-- ============================================================================ +-- EXTENSIONES A TABLAS DE ERP-CLINICAS +-- ============================================================================ + +-- Extensión a clinica.consultations (si existe) +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables + WHERE table_schema = 'clinica' AND table_name = 'consultations') THEN + + -- mascota_id + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'mascota_id') THEN + ALTER TABLE clinica.consultations ADD COLUMN mascota_id UUID + REFERENCES veterinaria.mascotas(id); + END IF; + + -- peso_actual + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'peso_actual') THEN + ALTER TABLE clinica.consultations ADD COLUMN peso_actual NUMERIC(6,2); + END IF; + + -- temperatura + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema = 'clinica' AND table_name = 'consultations' + AND column_name = 'temperatura') THEN + ALTER TABLE clinica.consultations ADD COLUMN temperatura NUMERIC(4,1); + END IF; + + END IF; +END $$; + +-- ============================================================================ +-- ÍNDICES +-- ============================================================================ + +CREATE INDEX IF NOT EXISTS idx_especies_tenant ON veterinaria.especies(tenant_id); +CREATE INDEX IF NOT EXISTS idx_razas_tenant ON veterinaria.razas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_razas_especie ON veterinaria.razas(especie_id); +CREATE INDEX IF NOT EXISTS idx_vacunas_tenant ON veterinaria.vacunas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_vacunas_especie ON veterinaria.vacunas(especie_id); + +CREATE INDEX IF NOT EXISTS idx_propietarios_tenant ON veterinaria.propietarios(tenant_id); +CREATE INDEX IF NOT EXISTS idx_propietarios_telefono ON veterinaria.propietarios(telefono); + +CREATE INDEX IF NOT EXISTS idx_mascotas_tenant ON veterinaria.mascotas(tenant_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_propietario ON veterinaria.mascotas(propietario_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_especie ON veterinaria.mascotas(especie_id); +CREATE INDEX IF NOT EXISTS idx_mascotas_chip ON veterinaria.mascotas(numero_chip) WHERE numero_chip IS NOT NULL; + +CREATE INDEX IF NOT EXISTS idx_cartilla_tenant ON veterinaria.cartilla_vacunacion(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cartilla_mascota ON veterinaria.cartilla_vacunacion(mascota_id); +CREATE INDEX IF NOT EXISTS idx_cartilla_fecha ON veterinaria.cartilla_vacunacion(fecha_proximo_refuerzo); + +CREATE INDEX IF NOT EXISTS idx_desparasitaciones_tenant ON veterinaria.desparasitaciones(tenant_id); +CREATE INDEX IF NOT EXISTS idx_desparasitaciones_mascota ON veterinaria.desparasitaciones(mascota_id); + +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_tenant ON veterinaria.hospitalizacion(tenant_id); +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_mascota ON veterinaria.hospitalizacion(mascota_id); +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_estado ON veterinaria.hospitalizacion(tenant_id, estado); + +CREATE INDEX IF NOT EXISTS idx_hospitalizacion_monitoreo_hosp ON veterinaria.hospitalizacion_monitoreo(hospitalizacion_id); + +CREATE INDEX IF NOT EXISTS idx_estetica_tenant ON veterinaria.estetica(tenant_id); +CREATE INDEX IF NOT EXISTS idx_estetica_mascota ON veterinaria.estetica(mascota_id); +CREATE INDEX IF NOT EXISTS idx_estetica_fecha ON veterinaria.estetica(fecha_servicio); + +-- ============================================================================ +-- RLS +-- ============================================================================ + +ALTER TABLE veterinaria.especies ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.razas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.vacunas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.propietarios ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.mascotas ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.cartilla_vacunacion ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.desparasitaciones ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.hospitalizacion ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.hospitalizacion_monitoreo ENABLE ROW LEVEL SECURITY; +ALTER TABLE veterinaria.estetica ENABLE ROW LEVEL SECURITY; + +DROP POLICY IF EXISTS tenant_isolation_especies ON veterinaria.especies; +CREATE POLICY tenant_isolation_especies ON veterinaria.especies + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_razas ON veterinaria.razas; +CREATE POLICY tenant_isolation_razas ON veterinaria.razas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_vacunas ON veterinaria.vacunas; +CREATE POLICY tenant_isolation_vacunas ON veterinaria.vacunas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_propietarios ON veterinaria.propietarios; +CREATE POLICY tenant_isolation_propietarios ON veterinaria.propietarios + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_mascotas ON veterinaria.mascotas; +CREATE POLICY tenant_isolation_mascotas ON veterinaria.mascotas + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_cartilla ON veterinaria.cartilla_vacunacion; +CREATE POLICY tenant_isolation_cartilla ON veterinaria.cartilla_vacunacion + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_desparasitaciones ON veterinaria.desparasitaciones; +CREATE POLICY tenant_isolation_desparasitaciones ON veterinaria.desparasitaciones + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_hospitalizacion ON veterinaria.hospitalizacion; +CREATE POLICY tenant_isolation_hospitalizacion ON veterinaria.hospitalizacion + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_hosp_monitoreo ON veterinaria.hospitalizacion_monitoreo; +CREATE POLICY tenant_isolation_hosp_monitoreo ON veterinaria.hospitalizacion_monitoreo + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +DROP POLICY IF EXISTS tenant_isolation_estetica ON veterinaria.estetica; +CREATE POLICY tenant_isolation_estetica ON veterinaria.estetica + USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID); + +-- ============================================================================ +-- FIN VETERINARIA SCHEMA +-- ============================================================================ diff --git a/database/seeds/fase8/01-veterinaria-catalogos.sql b/database/seeds/fase8/01-veterinaria-catalogos.sql new file mode 100644 index 0000000..d0fff84 --- /dev/null +++ b/database/seeds/fase8/01-veterinaria-catalogos.sql @@ -0,0 +1,146 @@ +-- ============================================================================ +-- SEED DATA: Catálogos de Veterinaria +-- Especialización de ERP-Clínicas +-- ============================================================================ +-- NOTA: Ejecutar después de SET app.current_tenant_id = 'UUID-DEL-TENANT'; +-- ============================================================================ + +-- Especies +INSERT INTO veterinaria.especies (tenant_id, nombre, nombre_cientifico) +SELECT current_setting('app.current_tenant_id', true)::UUID, nombre, nombre_cientifico +FROM (VALUES + ('Perro', 'Canis lupus familiaris'), + ('Gato', 'Felis silvestris catus'), + ('Ave', NULL), + ('Reptil', NULL), + ('Roedor', NULL), + ('Conejo', 'Oryctolagus cuniculus'), + ('Pez', NULL), + ('Hurón', 'Mustela putorius furo'), + ('Otro', NULL) +) AS t(nombre, nombre_cientifico) +WHERE current_setting('app.current_tenant_id', true) IS NOT NULL + AND current_setting('app.current_tenant_id', true) != '' +ON CONFLICT DO NOTHING; + +-- Razas de perro +INSERT INTO veterinaria.razas (tenant_id, especie_id, nombre, tamanio_promedio, peso_promedio_kg) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + r.nombre, + r.tamanio, + r.peso +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Mestizo', 'mediano', 15.0), + ('Chihuahua', 'pequeño', 2.5), + ('Poodle', 'pequeño', 5.0), + ('Bulldog Francés', 'pequeño', 12.0), + ('Beagle', 'mediano', 12.0), + ('Labrador Retriever', 'grande', 30.0), + ('Golden Retriever', 'grande', 32.0), + ('Pastor Alemán', 'grande', 35.0), + ('Rottweiler', 'grande', 45.0), + ('Husky Siberiano', 'grande', 25.0), + ('Pug', 'pequeño', 8.0), + ('Yorkshire Terrier', 'pequeño', 3.0), + ('Schnauzer', 'mediano', 7.0), + ('Boxer', 'grande', 30.0), + ('Pitbull', 'mediano', 25.0) +) AS r(nombre, tamanio, peso) +WHERE e.nombre = 'Perro' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Razas de gato +INSERT INTO veterinaria.razas (tenant_id, especie_id, nombre, tamanio_promedio, peso_promedio_kg) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + r.nombre, + r.tamanio, + r.peso +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Mestizo', 'mediano', 4.0), + ('Siamés', 'mediano', 4.5), + ('Persa', 'mediano', 5.0), + ('Maine Coon', 'grande', 8.0), + ('Bengalí', 'mediano', 5.5), + ('Ragdoll', 'grande', 7.0), + ('British Shorthair', 'mediano', 6.0), + ('Angora', 'mediano', 4.5), + ('Sphynx', 'mediano', 4.0), + ('Abisinio', 'mediano', 4.0) +) AS r(nombre, tamanio, peso) +WHERE e.nombre = 'Gato' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Vacunas para perros +INSERT INTO veterinaria.vacunas (tenant_id, especie_id, nombre, descripcion, intervalo_refuerzo_dias, es_obligatoria) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + v.nombre, + v.descripcion, + v.intervalo, + v.obligatoria +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Parvovirus', 'Protege contra parvovirus canino', 365, false), + ('Moquillo', 'Protege contra distemper canino', 365, false), + ('Hepatitis', 'Protege contra hepatitis infecciosa canina', 365, false), + ('Rabia', 'Vacuna antirrábica - OBLIGATORIA', 365, true), + ('Leptospirosis', 'Protege contra leptospirosis', 365, false), + ('Bordetella', 'Protege contra tos de las perreras', 180, false), + ('Cuádruple', 'Moquillo, Hepatitis, Parvo, Parainfluenza', 365, false), + ('Séxtuple', 'Cuádruple + Coronavirus + Leptospira', 365, false) +) AS v(nombre, descripcion, intervalo, obligatoria) +WHERE e.nombre = 'Perro' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Vacunas para gatos +INSERT INTO veterinaria.vacunas (tenant_id, especie_id, nombre, descripcion, intervalo_refuerzo_dias, es_obligatoria) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + e.id, + v.nombre, + v.descripcion, + v.intervalo, + v.obligatoria +FROM veterinaria.especies e +CROSS JOIN (VALUES + ('Triple Felina', 'Rinotraqueitis, Calicivirus, Panleucopenia', 365, false), + ('Leucemia Felina', 'Protege contra FeLV', 365, false), + ('Rabia', 'Vacuna antirrábica', 365, true), + ('PIF', 'Peritonitis Infecciosa Felina', 365, false) +) AS v(nombre, descripcion, intervalo, obligatoria) +WHERE e.nombre = 'Gato' + AND e.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; + +-- Skills específicos veterinarios +INSERT INTO hr.skills (tenant_id, skill_type_id, name, requiere_cedula) +SELECT + current_setting('app.current_tenant_id', true)::UUID, + st.id, + unnest(ARRAY[ + 'Medicina Veterinaria General', + 'Cirugía Veterinaria', + 'Dermatología Veterinaria', + 'Cardiología Veterinaria', + 'Oftalmología Veterinaria', + 'Ortopedia Veterinaria', + 'Oncología Veterinaria', + 'Medicina de Exóticos', + 'Anestesiología Veterinaria', + 'Imagenología Veterinaria' + ]), + true +FROM hr.skill_types st +WHERE st.name = 'Especialidad Médica' + AND st.tenant_id = current_setting('app.current_tenant_id', true)::UUID +ON CONFLICT DO NOTHING; diff --git a/docs/00-vision-general/README.md b/docs/00-vision-general/README.md new file mode 100644 index 0000000..f50ed97 --- /dev/null +++ b/docs/00-vision-general/README.md @@ -0,0 +1,53 @@ +# Vision General - Clinica Veterinaria + +## Proposito + +Sistema de gestion integral para clinicas veterinarias que permite: + +1. **Gestion de Pacientes (Mascotas)** + - Registro completo de animales + - Vinculacion con propietarios + - Historial medico completo + +2. **Consultas Veterinarias** + - Registro de signos vitales + - Diagnosticos y tratamientos + - Prescripcion de medicamentos + +3. **Control Sanitario** + - Cartilla de vacunacion + - Calendario de desparasitacion + - Recordatorios automaticos + +4. **Servicios Adicionales** + - Hospitalizacion + - Estetica canina/felina + - Farmacia veterinaria + +## Usuarios + +| Rol | Acceso | +|-----|--------| +| Veterinario | Consultas, diagnosticos, prescripciones | +| Auxiliar | Apoyo en consultas, hospitalizacion | +| Recepcionista | Citas, cobros | +| Estilista | Servicios de grooming | +| Administrador | Gestion completa | + +## Alcance + +- **Incluido:** Gestion clinica, mascotas, vacunas, hospitalizacion, facturacion +- **Excluido:** Contabilidad avanzada (usa erp-core), nomina + +## Especies Soportadas + +- Caninos (perros) +- Felinos (gatos) +- Aves +- Roedores +- Reptiles +- Exoticos + +## Referencias + +Ver `orchestration/00-guidelines/CONTEXTO-PROYECTO.md` para detalles completos del negocio. diff --git a/orchestration/00-guidelines/CONTEXTO-PROYECTO.md b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md new file mode 100644 index 0000000..7c90b06 --- /dev/null +++ b/orchestration/00-guidelines/CONTEXTO-PROYECTO.md @@ -0,0 +1,164 @@ +# Contexto del Proyecto - Clínica Veterinaria + +## 1. Información General + +| Campo | Valor | +|-------|-------| +| **Nombre:** | Clínica Veterinaria | +| **Tipo:** | ERP Especializado | +| **Giro:** | Servicios Veterinarios | +| **Base:** | erp-clinicas | +| **Fecha creación:** | 2026-01-04 | + +--- + +## 2. Descripción del Negocio + +Sistema de gestión integral para clínicas veterinarias que incluye: + +- **Gestión de pacientes (mascotas):** Registro de animales con datos de especie, raza, propietario +- **Consultas veterinarias:** Atención médica, diagnósticos, tratamientos +- **Cartilla de vacunación:** Control de vacunas y desparasitaciones +- **Hospitalización:** Internamiento y seguimiento de animales +- **Estética canina/felina:** Servicios de grooming +- **Farmacia veterinaria:** Inventario de medicamentos y alimentos +- **Facturación:** Cobro de servicios y productos + +## 3. Usuarios del Sistema + +| Rol | Funciones | +|-----|-----------| +| Veterinario | Consultas, diagnósticos, prescripciones | +| Auxiliar veterinario | Apoyo en consultas, hospitalización | +| Recepcionista | Citas, cobros, atención al propietario | +| Estilista | Servicios de estética | +| Administrador | Gestión general, reportes | + +## 4. Procesos Principales + +### 4.1 Flujo de Consulta + +``` +1. Propietario llega con mascota +2. Recepción registra llegada / verifica cita +3. Veterinario atiende consulta +4. Registro de signos vitales (peso, temperatura) +5. Diagnóstico y tratamiento +6. Prescripción de medicamentos +7. Actualización de cartilla (si aplica vacuna) +8. Cobro en recepción +9. Entrega de receta/medicamentos +``` + +### 4.2 Flujo de Hospitalización + +``` +1. Ingreso del animal +2. Asignación de jaula/espacio +3. Registro de tratamientos +4. Monitoreo de signos vitales +5. Administración de medicamentos +6. Alta médica +7. Instrucciones al propietario +8. Cobro de servicios +``` + +## 5. Entidades Principales + +### 5.1 Mascotas (Pacientes) + +| Campo | Descripción | +|-------|-------------| +| Nombre | Nombre de la mascota | +| Especie | Perro, gato, ave, reptil, etc. | +| Raza | Raza específica | +| Sexo | Macho/Hembra | +| Fecha nacimiento | Edad aproximada | +| Peso | Peso actual | +| Color | Color del pelaje/plumaje | +| Chip | Número de microchip | +| Esterilizado | Si está esterilizado | +| Propietario | Dueño del animal | + +### 5.2 Propietarios + +| Campo | Descripción | +|-------|-------------| +| Nombre | Nombre completo | +| Teléfono | Contacto principal | +| Email | Correo electrónico | +| Dirección | Domicilio | +| RFC | Para facturación | +| Mascotas | Lista de mascotas | + +### 5.3 Consultas + +| Campo | Descripción | +|-------|-------------| +| Mascota | Animal atendido | +| Veterinario | Médico que atiende | +| Fecha | Fecha de consulta | +| Peso actual | Peso al momento | +| Temperatura | Temperatura corporal | +| Motivo | Razón de la consulta | +| Diagnóstico | Diagnóstico veterinario | +| Tratamiento | Plan de tratamiento | + +## 6. Catálogos Específicos + +### 6.1 Especies + +- Perro (Canino) +- Gato (Felino) +- Ave +- Reptil +- Roedor +- Pez +- Otro + +### 6.2 Especialidades Veterinarias + +- Medicina General +- Cirugía +- Dermatología +- Cardiología +- Oftalmología +- Ortopedia +- Oncología +- Exóticos + +### 6.3 Vacunas Comunes + +**Perros:** +- Parvovirus +- Moquillo +- Hepatitis +- Rabia +- Leptospirosis +- Bordetella + +**Gatos:** +- Triple felina +- Leucemia felina +- Rabia + +## 7. Integraciones + +| Sistema | Propósito | +|---------|-----------| +| SENASICA | Reporte de vacunación | +| Laboratorios | Resultados de análisis | +| Proveedores | Pedidos de medicamentos | + +## 8. Métricas Clave + +| Métrica | Descripción | +|---------|-------------| +| Consultas/día | Número de consultas diarias | +| Tasa de vacunación | Cumplimiento de esquemas | +| Días hospitalización | Promedio de estancia | +| Satisfacción | Evaluación propietarios | + +--- + +**Última actualización:** 2026-01-04 diff --git a/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md new file mode 100644 index 0000000..9ef6c77 --- /dev/null +++ b/orchestration/00-guidelines/HERENCIA-ERP-CLINICAS.md @@ -0,0 +1,116 @@ +# Herencia ERP-Clínicas - Clínica Veterinaria + +## Información del Proyecto + +| Campo | Valor | +|-------|-------| +| **Proyecto:** | clinica-veterinaria | +| **Hereda de:** | erp-clinicas | +| **Fecha creación:** | 2026-01-04 | +| **Versión ERP-Clínicas:** | 1.0 FASE-8 | + +--- + +## 1. Relación de Herencia + +``` +erp-core (FASE-8) + └── erp-clinicas (Base Genérica) + └── clinica-veterinaria (Especialización) +``` + +## 2. Qué Se Hereda de ERP-Clínicas + +### 2.1 Schemas y Tablas + +| Schema | Tablas | Heredadas | +|--------|--------|-----------| +| clinica | 13 tablas base | ✅ | +| financial | 4 tablas FASE-8 | ✅ | +| hr | 11 tablas FASE-8 | ✅ | +| inventory | 5 tablas FASE-8 | ✅ | +| purchase | 1 tabla FASE-8 | ✅ | + +### 2.2 Funcionalidades Heredadas + +- Sistema de citas y consultas +- Expedientes clínicos +- Gestión de pacientes (mascotas) +- Sistema de prescripciones +- Gestión de personal (veterinarios) +- Inventario de medicamentos +- Pagos y facturación + +## 3. Especializaciones Veterinarias + +### 3.1 Adaptaciones de Terminología + +| ERP-Clínicas | Veterinaria | +|--------------|-------------| +| Paciente | Mascota/Animal | +| Médico | Veterinario | +| Especialidad Médica | Especialidad Veterinaria | +| Consulta | Consulta Veterinaria | +| Receta | Receta Veterinaria | + +### 3.2 Tablas Adicionales + +| Tabla | Propósito | +|-------|-----------| +| veterinaria.especies | Catálogo de especies (perro, gato, ave, etc.) | +| veterinaria.razas | Catálogo de razas por especie | +| veterinaria.propietarios | Dueños de mascotas | +| veterinaria.mascotas | Pacientes animales | +| veterinaria.vacunas | Catálogo de vacunas veterinarias | +| veterinaria.cartilla_vacunacion | Historial de vacunación | +| veterinaria.hospitalizacion | Internamiento de animales | +| veterinaria.estetica | Servicios de estética | + +### 3.3 Campos Adicionales + +| Tabla Base | Campos Veterinaria | +|------------|-------------------| +| patients → mascotas | especie_id, raza_id, propietario_id, peso, chip, esterilizado | +| consultations | peso_actual, temperatura, motivo_consulta | +| prescriptions | dosis_por_kg, via_administracion | + +## 4. Normativa Aplicable + +| Normativa | Descripción | +|-----------|-------------| +| NOM-064-ZOO-2000 | Requisitos sanitarios clínicas veterinarias | +| NOM-051-ZOO-1995 | Trato humanitario animales | +| SENASICA | Requerimientos de registro | + +## 5. Instalación + +### 5.1 Orden de Ejecución + +```bash +# 1. Base ERP-Clínicas (heredado) +psql -f erp-clinicas/database/init/01-extensions.sql +psql -f erp-clinicas/database/init/02-core-schema.sql +psql -f erp-clinicas/database/init/03-clinical-tables.sql +psql -f erp-clinicas/database/schemas/04-financial-ext-schema-ddl.sql +psql -f erp-clinicas/database/schemas/05-hr-ext-fase8-schema-ddl.sql +psql -f erp-clinicas/database/schemas/06-inventory-ext-fase8-schema-ddl.sql +psql -f erp-clinicas/database/schemas/07-purchase-ext-fase8-schema-ddl.sql +psql -f erp-clinicas/database/schemas/08-clinica-ext-fase8-schema-ddl.sql + +# 2. Especialización Veterinaria +psql -f clinica-veterinaria/database/schemas/01-veterinaria-schema-ddl.sql + +# 3. Seeds +psql -f erp-clinicas/database/seeds/fase8/*.sql +psql -f clinica-veterinaria/database/seeds/fase8/*.sql +``` + +## 6. Versionado + +| Versión | Fecha | Cambios | +|---------|-------|---------| +| 1.0 | 2026-01-04 | Creación inicial, herencia de erp-clinicas FASE-8 | + +--- + +**Última actualización:** 2026-01-04 diff --git a/orchestration/PROJECT-STATUS.md b/orchestration/PROJECT-STATUS.md new file mode 100644 index 0000000..3e8f479 --- /dev/null +++ b/orchestration/PROJECT-STATUS.md @@ -0,0 +1,57 @@ +# PROJECT STATUS - Clinica Veterinaria + +**Fecha:** 2026-01-07 +**Estado:** En Desarrollo +**Fase:** Database + +--- + +## Resumen + +| Aspecto | Estado | Notas | +|---------|--------|-------| +| Database | Completado | DDL y seeds listos | +| Backend | Pendiente | - | +| Frontend | Pendiente | - | +| Tests | Pendiente | - | +| Documentacion | Parcial | Contexto completo, falta epicas | + +--- + +## Progreso por Modulo + +| Modulo | DDL | Backend | Frontend | Tests | +|--------|-----|---------|----------|-------| +| Mascotas | OK | - | - | - | +| Propietarios | OK | - | - | - | +| Vacunacion | OK | - | - | - | +| Hospitalizacion | OK | - | - | - | +| Farmacia | - | - | - | - | + +--- + +## Dependencias + +- **erp-clinicas:** Modulos base de gestion clinica +- **erp-core:** Auth, users, tenants, billing + +--- + +## Proximas Acciones + +1. Implementar backend para modulo mascotas +2. Crear interfaz de cartilla de vacunacion +3. Integrar con sistema de citas de erp-clinicas + +--- + +## Riesgos + +| Riesgo | Probabilidad | Impacto | Mitigacion | +|--------|--------------|---------|------------| +| Variedad de especies | Media | Medio | Catalogos extensibles | +| Integracion con erp-clinicas | Baja | Medio | Seguir patrones existentes | + +--- + +**Ultima actualizacion:** 2026-01-07 diff --git a/orchestration/environment/ENVIRONMENT-INVENTORY.yml b/orchestration/environment/ENVIRONMENT-INVENTORY.yml new file mode 100644 index 0000000..d294de2 --- /dev/null +++ b/orchestration/environment/ENVIRONMENT-INVENTORY.yml @@ -0,0 +1,694 @@ +# ============================================================================= +# ENVIRONMENT-INVENTORY.yml - CLINICA-VETERINARIA +# ============================================================================= +# Inventario Completo de Entorno de Desarrollo y Produccion +# Generado por: @PERFIL_DEVENV +# Basado en: orchestration/templates/TEMPLATE-ENVIRONMENT-INVENTORY.yml +# ============================================================================= + +version: "1.1.0" +fecha_creacion: "2026-01-04" +fecha_actualizacion: "2026-01-04" +responsable: "@PERFIL_DEVENV" + +# ----------------------------------------------------------------------------- +# IDENTIFICACION DEL PROYECTO +# ----------------------------------------------------------------------------- + +proyecto: + nombre: "Clinica Veterinaria" + alias: "clinica-veterinaria" + codigo: "CV" + nivel: "NIVEL_2B.3" + tipo: "vertical-especializada" + estado: "desarrollo" + descripcion: "Sistema de gestion para clinicas veterinarias" + parent: "erp-clinicas" + herencia: + - erp-core + - erp-clinicas + +# ----------------------------------------------------------------------------- +# HERRAMIENTAS Y RUNTIME +# ----------------------------------------------------------------------------- + +herramientas: + runtime: + node: + version: "20.x" + version_minima: "18.x" + requerido: true + notas: "LTS recomendado para NestJS y React" + python: + version: "" + requerido: false + notas: "No requerido para este proyecto" + + package_managers: + npm: + version: "10.x" + requerido: true + pnpm: + version: "8.x" + requerido: false + notas: "Alternativa opcional" + + build_tools: + - nombre: "Vite" + version: "5.x" + uso: "Frontend build y dev server" + - nombre: "TypeScript" + version: "5.x" + uso: "Compilacion de codigo" + - nombre: "NestJS CLI" + version: "10.x" + uso: "Backend scaffolding y build" + + linters: + - nombre: "ESLint" + version: "8.x" + config: ".eslintrc.js" + - nombre: "Prettier" + version: "3.x" + config: ".prettierrc" + + testing: + - nombre: "Jest" + version: "29.x" + tipo: "unit backend" + config: "jest.config.js" + - nombre: "Vitest" + version: "1.x" + tipo: "unit frontend" + config: "vitest.config.ts" + - nombre: "Supertest" + version: "6.x" + tipo: "e2e" + config: "jest-e2e.config.js" + +# ----------------------------------------------------------------------------- +# SERVICIOS Y PUERTOS +# ----------------------------------------------------------------------------- + +servicios: + frontend: + nombre: "clinica-veterinaria-frontend" + framework: "React" + version: "18.x" + puerto: 3120 + comando_dev: "npm run dev" + comando_build: "npm run build" + comando_preview: "npm run preview" + ubicacion: "apps/frontend/" + url_local: "http://localhost:3120" + build_output: "dist/" + + backend: + nombre: "clinica-veterinaria-backend" + framework: "NestJS" + version: "10.x" + puerto: 3121 + comando_dev: "npm run start:dev" + comando_build: "npm run build" + comando_prod: "npm run start:prod" + ubicacion: "apps/backend/" + url_local: "http://localhost:3121" + api_prefix: "/api/v1" + swagger_url: "http://localhost:3121/api/docs" + +# ----------------------------------------------------------------------------- +# BASE DE DATOS - CONFIGURACION COMPLETA +# ----------------------------------------------------------------------------- + +base_de_datos: + principal: + engine: "PostgreSQL" + version: "15" + host_variable: "DB_HOST" + puerto_variable: "DB_PORT" + + ambientes: + development: + host: "localhost" + puerto: 5440 + nombre: "clinica_veterinaria_dev" + usuario: "veterinaria_dev" + password_ref: "DB_PASSWORD en .env" + ssl: false + pool_size: 10 + conexion: "postgresql://veterinaria_dev:{password}@localhost:5440/clinica_veterinaria_dev" + + test: + host: "localhost" + puerto: 5440 + nombre: "clinica_veterinaria_test" + usuario: "veterinaria_dev" + password_ref: "DB_PASSWORD en .env" + ssl: false + pool_size: 5 + conexion: "postgresql://veterinaria_dev:{password}@localhost:5440/clinica_veterinaria_test" + + staging: + host: "${DB_HOST}" + puerto: 5432 + nombre: "clinica_veterinaria_staging" + usuario: "veterinaria_staging" + password_ref: "DB_PASSWORD en variables de CI/CD" + ssl: true + pool_size: 20 + conexion: "postgresql://veterinaria_staging:{password}@${DB_HOST}:5432/clinica_veterinaria_staging?sslmode=require" + + production: + host: "${DB_HOST}" + puerto: 5432 + nombre: "clinica_veterinaria_prod" + usuario: "veterinaria_prod" + password_ref: "DB_PASSWORD en secrets manager" + ssl: true + pool_size: 50 + conexion: "postgresql://veterinaria_prod:{password}@${DB_HOST}:5432/clinica_veterinaria_prod?sslmode=require" + + schemas: + - nombre: "public" + descripcion: "Schema principal PostgreSQL" + - nombre: "veterinaria" + descripcion: "Entidades especificas veterinarias (especies, razas, mascotas, vacunas)" + - nombre: "clinical" + descripcion: "Heredado de erp-clinicas (consultorios, citas, historiales)" + - nombre: "financial" + descripcion: "Heredado de erp-core (pagos, facturacion)" + - nombre: "hr" + descripcion: "Heredado de erp-core (empleados, nomina)" + - nombre: "inventory" + descripcion: "Heredado de erp-core (medicamentos, insumos)" + + scripts_inicializacion: + orden: + - "database/init/00-extensions.sql" + - "database/init/01-schemas.sql" + - "database/schemas/01-veterinaria-schema-ddl.sql" + - "database/seeds/fase8/01-veterinaria-catalogos.sql" + + redis: + host_variable: "REDIS_HOST" + puerto_variable: "REDIS_PORT" + + ambientes: + development: + host: "localhost" + puerto: 6387 + database: 0 + password: "" + conexion: "redis://localhost:6387/0" + + production: + host: "${REDIS_HOST}" + puerto: 6379 + database: 0 + password_ref: "REDIS_PASSWORD en secrets" + conexion: "redis://:${REDIS_PASSWORD}@${REDIS_HOST}:6379/0" + + uso: + - "Cache de sesiones" + - "Cache de consultas frecuentes" + - "Rate limiting" + - "Queue de tareas (Bull)" + +# ----------------------------------------------------------------------------- +# VARIABLES DE ENTORNO - DESARROLLO +# ----------------------------------------------------------------------------- + +variables_entorno: + archivos: + ejemplo: ".env.example" + desarrollo: ".env" + test: ".env.test" + produccion: ".env.production" + + development: + - nombre: "NODE_ENV" + valor: "development" + descripcion: "Ambiente de ejecucion" + requerido: true + sensible: false + + - nombre: "APP_NAME" + valor: "clinica-veterinaria" + descripcion: "Nombre de la aplicacion" + requerido: true + sensible: false + + - nombre: "APP_VERSION" + valor: "1.0.0" + descripcion: "Version de la aplicacion" + requerido: false + sensible: false + + # Puertos + - nombre: "FRONTEND_PORT" + valor: "3120" + descripcion: "Puerto del frontend React" + requerido: true + sensible: false + + - nombre: "BACKEND_PORT" + valor: "3121" + descripcion: "Puerto del backend NestJS" + requerido: true + sensible: false + + # Base de datos + - nombre: "DB_HOST" + valor: "localhost" + descripcion: "Host de PostgreSQL" + requerido: true + sensible: false + + - nombre: "DB_PORT" + valor: "5440" + descripcion: "Puerto de PostgreSQL" + requerido: true + sensible: false + + - nombre: "DB_NAME" + valor: "clinica_veterinaria_dev" + descripcion: "Nombre de la base de datos" + requerido: true + sensible: false + + - nombre: "DB_USER" + valor: "veterinaria_dev" + descripcion: "Usuario de PostgreSQL" + requerido: true + sensible: false + + - nombre: "DB_PASSWORD" + valor: "" + descripcion: "Password de PostgreSQL" + requerido: true + sensible: true + generacion: "openssl rand -base64 32" + + - nombre: "DATABASE_URL" + valor: "postgresql://veterinaria_dev:${DB_PASSWORD}@localhost:5440/clinica_veterinaria_dev" + descripcion: "Connection string completo" + requerido: true + sensible: true + + # Redis + - nombre: "REDIS_HOST" + valor: "localhost" + descripcion: "Host de Redis" + requerido: true + sensible: false + + - nombre: "REDIS_PORT" + valor: "6387" + descripcion: "Puerto de Redis" + requerido: true + sensible: false + + - nombre: "REDIS_URL" + valor: "redis://localhost:6387/0" + descripcion: "Connection string de Redis" + requerido: true + sensible: false + + # Autenticacion + - nombre: "JWT_SECRET" + valor: "" + descripcion: "Secreto para firmar JWT (min 32 caracteres)" + requerido: true + sensible: true + generacion: "openssl rand -base64 64" + + - nombre: "JWT_EXPIRES_IN" + valor: "24h" + descripcion: "Tiempo de expiracion del access token" + requerido: true + sensible: false + + - nombre: "JWT_REFRESH_EXPIRES_IN" + valor: "7d" + descripcion: "Tiempo de expiracion del refresh token" + requerido: true + sensible: false + + # CORS + - nombre: "FRONTEND_URL" + valor: "http://localhost:3120" + descripcion: "URL del frontend para CORS" + requerido: true + sensible: false + + - nombre: "ALLOWED_ORIGINS" + valor: "http://localhost:3120,http://localhost:3121" + descripcion: "Origenes permitidos (comma separated)" + requerido: true + sensible: false + + # Logging + - nombre: "LOG_LEVEL" + valor: "debug" + descripcion: "Nivel de logging (debug, info, warn, error)" + requerido: false + sensible: false + + - nombre: "LOG_FORMAT" + valor: "pretty" + descripcion: "Formato de logs (pretty, json)" + requerido: false + sensible: false + + # File Storage + - nombre: "STORAGE_TYPE" + valor: "local" + descripcion: "Tipo de storage (local, s3, minio)" + requerido: false + sensible: false + + - nombre: "STORAGE_PATH" + valor: "./uploads" + descripcion: "Path para almacenamiento local" + requerido: false + sensible: false + + - nombre: "MAX_FILE_SIZE" + valor: "10485760" + descripcion: "Tamano maximo de archivo en bytes (10MB)" + requerido: false + sensible: false + + # Email (opcional) + - nombre: "SMTP_HOST" + valor: "localhost" + descripcion: "Host SMTP para emails" + requerido: false + sensible: false + + - nombre: "SMTP_PORT" + valor: "1025" + descripcion: "Puerto SMTP (1025 para MailHog)" + requerido: false + sensible: false + + production: + notas: | + En produccion, las siguientes variables deben configurarse + via secrets manager o variables de CI/CD: + - DB_PASSWORD (secreto) + - JWT_SECRET (secreto) + - REDIS_PASSWORD (secreto) + - AWS_ACCESS_KEY_ID (si usa S3) + - AWS_SECRET_ACCESS_KEY (si usa S3) + + diferencias: + - nombre: "NODE_ENV" + valor: "production" + - nombre: "LOG_LEVEL" + valor: "info" + - nombre: "LOG_FORMAT" + valor: "json" + - nombre: "DB_PORT" + valor: "5432" + - nombre: "REDIS_PORT" + valor: "6379" + - nombre: "STORAGE_TYPE" + valor: "s3" + +# ----------------------------------------------------------------------------- +# CONTENEDORES DOCKER +# ----------------------------------------------------------------------------- + +docker: + compose_file: "docker-compose.yml" + compose_dev: "docker-compose.dev.yml" + compose_prod: "docker-compose.prod.yml" + + services: + - nombre: "db" + imagen: "postgres:15-alpine" + puerto_host: 5440 + puerto_container: 5432 + variables: + POSTGRES_DB: "clinica_veterinaria_dev" + POSTGRES_USER: "veterinaria_dev" + POSTGRES_PASSWORD: "${DB_PASSWORD}" + volumes: + - "postgres_data:/var/lib/postgresql/data" + healthcheck: "pg_isready -U veterinaria_dev" + + - nombre: "redis" + imagen: "redis:7-alpine" + puerto_host: 6387 + puerto_container: 6379 + volumes: + - "redis_data:/data" + healthcheck: "redis-cli ping" + + - nombre: "mailhog" + imagen: "mailhog/mailhog" + puerto_smtp: 1025 + puerto_web: 8025 + uso: "Testing de emails en desarrollo" + + volumes: + - nombre: "postgres_data" + descripcion: "Datos persistentes de PostgreSQL" + - nombre: "redis_data" + descripcion: "Datos persistentes de Redis" + + networks: + - nombre: "clinica_veterinaria_network" + driver: "bridge" + +# ----------------------------------------------------------------------------- +# MIGRACIONES Y SEEDS +# ----------------------------------------------------------------------------- + +migraciones: + herramienta: "TypeORM" + directorio: "apps/backend/src/database/migrations" + + comandos: + generar: "npm run migration:generate -- -n NombreMigracion" + ejecutar: "npm run migration:run" + revertir: "npm run migration:revert" + mostrar: "npm run migration:show" + +seeds: + directorio: "database/seeds" + orden: + - "fase8/01-veterinaria-catalogos.sql" + + comandos: + ejecutar: "npm run seed" + desarrollo: "npm run seed:dev" + +# ----------------------------------------------------------------------------- +# SCRIPTS DE DESARROLLO +# ----------------------------------------------------------------------------- + +scripts: + setup: + descripcion: "Configurar entorno desde cero" + pasos: + - comando: "npm install" + descripcion: "Instalar dependencias" + - comando: "cp .env.example .env" + descripcion: "Crear archivo de configuracion" + - comando: "docker-compose up -d db redis" + descripcion: "Levantar servicios de infraestructura" + - comando: "npm run db:create" + descripcion: "Crear base de datos" + - comando: "npm run migration:run" + descripcion: "Ejecutar migraciones" + - comando: "npm run seed" + descripcion: "Cargar datos iniciales" + + desarrollo: + frontend: "cd apps/frontend && npm run dev" + backend: "cd apps/backend && npm run start:dev" + ambos: "npm run dev:all" + docker: "docker-compose up -d" + + testing: + unit: "npm run test" + unit_watch: "npm run test:watch" + e2e: "npm run test:e2e" + coverage: "npm run test:cov" + + build: + frontend: "cd apps/frontend && npm run build" + backend: "cd apps/backend && npm run build" + docker: "docker-compose -f docker-compose.prod.yml build" + + database: + create: "npm run db:create" + drop: "npm run db:drop" + reset: "npm run db:reset" + migrations_run: "npm run migration:run" + migrations_revert: "npm run migration:revert" + seed: "npm run seed" + + linting: + lint: "npm run lint" + lint_fix: "npm run lint:fix" + format: "npm run format" + +# ----------------------------------------------------------------------------- +# INSTRUCCIONES DE SETUP +# ----------------------------------------------------------------------------- + +setup_instrucciones: | + ## Setup del Entorno de Desarrollo - Clinica Veterinaria + + ### Prerequisitos + - Node.js 20.x (LTS) + - PostgreSQL 15 (o Docker) + - Redis 7 (o Docker) + - npm 10.x + - Git + + ### Opcion 1: Setup con Docker (Recomendado) + + ```bash + # 1. Clonar repositorio + git clone + cd clinica-veterinaria + + # 2. Instalar dependencias + npm install + + # 3. Configurar variables de entorno + cp .env.example .env + # Editar .env - generar passwords seguros: + # openssl rand -base64 32 # para DB_PASSWORD + # openssl rand -base64 64 # para JWT_SECRET + + # 4. Levantar infraestructura + docker-compose up -d db redis + + # 5. Crear base de datos y ejecutar migraciones + npm run db:create + npm run migration:run + npm run seed + + # 6. Iniciar desarrollo + npm run dev:all + ``` + + ### Opcion 2: Setup con PostgreSQL Local + + ```bash + # 1-3. Igual que arriba + + # 4. Crear usuario y base de datos en PostgreSQL + sudo -u postgres psql + CREATE USER veterinaria_dev WITH PASSWORD 'tu_password'; + CREATE DATABASE clinica_veterinaria_dev OWNER veterinaria_dev; + GRANT ALL PRIVILEGES ON DATABASE clinica_veterinaria_dev TO veterinaria_dev; + \q + + # 5. Configurar Redis local o Docker + docker run -d --name redis-veterinaria -p 6387:6379 redis:7-alpine + + # 6-7. Continuar con migraciones y seeds + ``` + + ### Verificar Instalacion + - Frontend: http://localhost:3120 + - Backend API: http://localhost:3121/api/v1 + - Swagger Docs: http://localhost:3121/api/docs + - Health Check: http://localhost:3121/health + + ### Usuarios de Prueba (despues de seed) + - Admin: admin@clinica-vet.local / Admin123! + - Veterinario: vet@clinica-vet.local / Vet123! + - Recepcion: recepcion@clinica-vet.local / Recep123! + +# ----------------------------------------------------------------------------- +# TROUBLESHOOTING +# ----------------------------------------------------------------------------- + +troubleshooting: + - problema: "Puerto 3120 o 3121 en uso" + solucion: | + Verificar con: lsof -i :3120 + Terminar proceso: kill -9 + O cambiar puertos en .env + + - problema: "Error de conexion a PostgreSQL" + solucion: | + 1. Verificar que PostgreSQL esta corriendo: + docker-compose ps + # o: systemctl status postgresql + 2. Verificar credenciales en .env + 3. Verificar que la BD existe: + psql -h localhost -p 5440 -U veterinaria_dev -l + + - problema: "Error de conexion a Redis" + solucion: | + 1. Verificar que Redis esta corriendo: + docker-compose ps + # o: redis-cli -p 6387 ping + 2. Verificar puerto en .env + + - problema: "Migraciones fallan" + solucion: | + 1. Verificar que la BD existe + 2. Verificar permisos del usuario + 3. Revisar logs: npm run migration:run --verbose + 4. Si es necesario, resetear: npm run db:reset + + - problema: "JWT errors" + solucion: | + Verificar que JWT_SECRET esta configurado (min 32 caracteres) + Generar nuevo: openssl rand -base64 64 + + - problema: "CORS errors en frontend" + solucion: | + Verificar FRONTEND_URL y ALLOWED_ORIGINS en .env + Deben coincidir con la URL del frontend + +# ----------------------------------------------------------------------------- +# CONFIGURACION DE PRODUCCION +# ----------------------------------------------------------------------------- + +produccion: + checklist: + - item: "Variables de entorno configuradas via secrets manager" + - item: "SSL/TLS habilitado para BD y Redis" + - item: "Backups automaticos configurados" + - item: "Monitoreo y alertas activas" + - item: "Rate limiting configurado" + - item: "CORS restringido a dominios autorizados" + - item: "Logs en formato JSON para agregacion" + + infraestructura_recomendada: + base_de_datos: "AWS RDS PostgreSQL 15 o equivalente" + cache: "AWS ElastiCache Redis o equivalente" + storage: "AWS S3 o equivalente" + cdn: "CloudFront o equivalente" + ci_cd: "GitHub Actions / GitLab CI" + + escalado: + backend_replicas: 2 + pool_db_size: 50 + redis_maxmemory: "256mb" + +# ----------------------------------------------------------------------------- +# REFERENCIAS +# ----------------------------------------------------------------------------- + +referencias: + perfil_devenv: "orchestration/agents/perfiles/PERFIL-DEVENV.md" + inventario_master: "orchestration/inventarios/DEVENV-MASTER-INVENTORY.yml" + inventario_puertos: "orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml" + contexto_proyecto: "orchestration/00-guidelines/CONTEXTO-PROYECTO.md" + parent_clinicas: "../erp-clinicas/orchestration/environment/ENVIRONMENT-INVENTORY.yml" + schema_veterinaria: "database/schemas/01-veterinaria-schema-ddl.sql" + +# ============================================================================= +# FIN DE INVENTARIO +# ============================================================================= diff --git a/orchestration/inventarios/MASTER_INVENTORY.yml b/orchestration/inventarios/MASTER_INVENTORY.yml new file mode 100644 index 0000000..117f172 --- /dev/null +++ b/orchestration/inventarios/MASTER_INVENTORY.yml @@ -0,0 +1,82 @@ +--- +# MASTER INVENTORY - Clinica Veterinaria +# Version: 1.0.0 +# Ultima actualizacion: 2026-01-07 + +proyecto: "clinica-veterinaria" +descripcion: "ERP especializado para clinicas veterinarias" +version: "0.1.0" +estado: "desarrollo" +tipo: "vertical" +base: "erp-clinicas" + +progreso: + fase_actual: "Database" + porcentaje: 15 + database_completado: true + backend_completado: false + frontend_completado: false + +herencia: + vertical_padre: "erp-clinicas" + suite_core: "erp-core" + modulos_heredados: + - "auth" + - "users" + - "tenants" + - "roles" + - "patients" + - "appointments" + - "billing" + +modulos_especificos: + - id: "VET-001" + nombre: "mascotas" + descripcion: "Registro de animales/pacientes" + estado: "ddl_completado" + + - id: "VET-002" + nombre: "propietarios" + descripcion: "Duenos de mascotas" + estado: "ddl_completado" + + - id: "VET-003" + nombre: "vacunacion" + descripcion: "Cartilla y control de vacunas" + estado: "ddl_completado" + + - id: "VET-004" + nombre: "hospitalizacion" + descripcion: "Control de internamiento" + estado: "ddl_completado" + + - id: "VET-005" + nombre: "farmacia" + descripcion: "Inventario veterinario" + estado: "pendiente" + +database: + schema: "veterinaria" + archivo_ddl: "database/schemas/01-veterinaria-schema-ddl.sql" + archivo_seeds: "database/seeds/fase8/01-veterinaria-catalogos.sql" + tablas_especificas: + - "pets" + - "pet_owners" + - "vaccinations" + - "vaccination_records" + - "hospitalizations" + - "vet_consultations" + +catalogos: + - "especies" + - "razas_por_especie" + - "vacunas_por_especie" + - "especialidades_veterinarias" + +proximas_tareas: + - "Implementar backend modulo mascotas" + - "Crear frontend para cartilla de vacunacion" + - "Integracion con erp-clinicas" + +ultima_actualizacion: "2026-01-07" +actualizado_por: "Orquestador" diff --git a/orchestration/trazas/TRAZA-TAREAS-DATABASE.md b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md new file mode 100644 index 0000000..bd34847 --- /dev/null +++ b/orchestration/trazas/TRAZA-TAREAS-DATABASE.md @@ -0,0 +1,53 @@ +# TRAZA DE TAREAS - DATABASE + +**Proyecto:** clinica-veterinaria +**Capa:** Database +**Version:** 1.0.0 + +--- + +## HISTORIAL + +### [2026-01-04] VET-DDL-001 +**Estado:** completado +**Agente:** Database-Agent +**Duracion:** ~2h + +#### Descripcion +Creacion del schema veterinaria con tablas especificas. + +#### Archivos Creados +- `database/schemas/01-veterinaria-schema-ddl.sql` + +#### Resultado +Schema veterinaria creado con tablas para mascotas, propietarios, vacunacion, hospitalizacion. + +--- + +### [2026-01-04] VET-SEEDS-001 +**Estado:** completado +**Agente:** Database-Agent +**Duracion:** ~1h + +#### Descripcion +Seeds iniciales con catalogos veterinarios. + +#### Archivos Creados +- `database/seeds/fase8/01-veterinaria-catalogos.sql` + +#### Resultado +Catalogos cargados: especies, razas, vacunas, especialidades. + +--- + +## TAREAS PENDIENTES + +| ID | Tarea | Prioridad | Dependencias | +|----|-------|-----------|--------------| +| VET-DDL-002 | RLS policies para tablas veterinaria | P1 | - | +| VET-DDL-003 | Tablas para farmacia veterinaria | P1 | - | +| VET-DDL-004 | Funciones de alertas de vacunacion | P2 | - | + +--- + +**Ultima actualizacion:** 2026-01-07