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