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 <noreply@anthropic.com>
This commit is contained in:
rckrdmrd 2026-01-07 04:42:03 -06:00
commit 6e195553d2
12 changed files with 2125 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,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,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,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,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,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,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