[SPRINT-7] docs: Agregar documentacion, schemas y reportes

- Epicas documentadas
- Schema de farmacia veterinaria
- Inventario de base de datos
- Reporte de ejecucion Sprint 7

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
rckrdmrd 2026-01-10 08:53:42 -06:00
parent 2b5c1d7e3f
commit c461208a51
9 changed files with 2691 additions and 0 deletions

View File

@ -0,0 +1,464 @@
-- ============================================================================
-- VETERINARIA SCHEMA - Farmacia (VET-006)
-- Sistema de gestion de farmacia veterinaria
-- ============================================================================
-- Fecha: 2026-01-07
-- Version: 1.0
-- Basado en: VET-006-farmacia.md
-- ============================================================================
-- ============================================================================
-- ENUMS
-- ============================================================================
DO $$ BEGIN
CREATE TYPE veterinaria.categoria_medicamento AS ENUM (
'antibiotico',
'antiparasitario',
'analgesico',
'antiinflamatorio',
'vacuna',
'vitamina',
'dermatologico',
'oftalmico',
'cardiaco',
'digestivo',
'otro'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
DO $$ BEGIN
CREATE TYPE veterinaria.tipo_movimiento_farmacia AS ENUM (
'entrada',
'salida',
'ajuste_positivo',
'ajuste_negativo',
'devolucion',
'merma'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
DO $$ BEGIN
CREATE TYPE veterinaria.fraccion_controlada AS ENUM (
'no_controlado',
'fraccion_i',
'fraccion_ii',
'fraccion_iii',
'fraccion_iv'
);
EXCEPTION WHEN duplicate_object THEN NULL;
END $$;
-- ============================================================================
-- TABLAS PRINCIPALES
-- ============================================================================
-- Catalogo de medicamentos
CREATE TABLE IF NOT EXISTS veterinaria.medicamentos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
-- Identificacion
codigo VARCHAR(50),
nombre VARCHAR(150) NOT NULL,
nombre_comercial VARCHAR(150),
principio_activo VARCHAR(200),
-- Clasificacion
categoria veterinaria.categoria_medicamento DEFAULT 'otro',
-- Presentacion
presentacion VARCHAR(100), -- 'tabletas', 'inyectable', 'suspension', etc.
concentracion VARCHAR(50), -- '500mg', '100mg/ml'
contenido VARCHAR(50), -- '30 tabletas', '100ml'
-- Fabricante
laboratorio VARCHAR(100),
-- Control
requiere_receta BOOLEAN DEFAULT false,
controlado BOOLEAN DEFAULT false,
fraccion_controlada veterinaria.fraccion_controlada DEFAULT 'no_controlado',
-- Stock
stock_minimo INTEGER DEFAULT 10,
stock_actual INTEGER DEFAULT 0,
-- Precios
precio_compra NUMERIC(10,2),
precio_venta NUMERIC(10,2),
-- Especies aplicables (NULL = todas)
especies_aplicables UUID[], -- Array de especie_id
-- Estado
active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE veterinaria.medicamentos IS 'Catalogo de medicamentos veterinarios';
-- Lotes de medicamentos (control de caducidad)
CREATE TABLE IF NOT EXISTS veterinaria.medicamentos_lotes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id) ON DELETE CASCADE,
-- Lote
numero_lote VARCHAR(50) NOT NULL,
fecha_caducidad DATE NOT NULL,
-- Cantidades
cantidad_inicial INTEGER NOT NULL,
cantidad_actual INTEGER NOT NULL,
-- Compra
precio_compra NUMERIC(10,2),
factura_compra VARCHAR(50),
proveedor VARCHAR(100),
fecha_recepcion DATE DEFAULT CURRENT_DATE,
-- Estado
bloqueado BOOLEAN DEFAULT false, -- Bloquear si esta vencido
motivo_bloqueo TEXT,
-- Control
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE veterinaria.medicamentos_lotes IS 'Lotes de medicamentos con control de caducidad';
-- Dispensaciones de medicamentos
CREATE TABLE IF NOT EXISTS veterinaria.dispensaciones (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
-- Referencias
medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id),
lote_id UUID NOT NULL REFERENCES veterinaria.medicamentos_lotes(id),
mascota_id UUID REFERENCES veterinaria.mascotas(id),
veterinario_id UUID, -- Referencia a clinica.doctors
receta_id UUID, -- Referencia a clinica.prescriptions si existe
consultation_id UUID, -- Referencia a clinica.consultations
-- Dispensacion
cantidad INTEGER NOT NULL,
fecha_dispensacion TIMESTAMPTZ DEFAULT NOW(),
-- Instrucciones
dosis VARCHAR(100), -- '1 tableta cada 8 horas'
duracion_tratamiento VARCHAR(50), -- '7 dias'
instrucciones TEXT,
-- Control
dispensado_por UUID, -- employee_id
notas TEXT,
-- Auditoria
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE veterinaria.dispensaciones IS 'Registro de dispensacion de medicamentos';
-- Movimientos de inventario (kardex)
CREATE TABLE IF NOT EXISTS veterinaria.movimientos_farmacia (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id),
lote_id UUID REFERENCES veterinaria.medicamentos_lotes(id),
-- Movimiento
tipo veterinaria.tipo_movimiento_farmacia NOT NULL,
cantidad INTEGER NOT NULL,
stock_anterior INTEGER NOT NULL,
stock_posterior INTEGER NOT NULL,
-- Referencia
referencia_tipo VARCHAR(50), -- 'dispensacion', 'compra', 'ajuste'
referencia_id UUID,
-- Detalles
motivo TEXT,
documento VARCHAR(100), -- Factura, nota, etc.
-- Auditoria
usuario_id UUID,
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE veterinaria.movimientos_farmacia IS 'Kardex de movimientos de inventario de farmacia';
-- Bitacora de medicamentos controlados
CREATE TABLE IF NOT EXISTS veterinaria.bitacora_controlados (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
medicamento_id UUID NOT NULL REFERENCES veterinaria.medicamentos(id),
lote_id UUID REFERENCES veterinaria.medicamentos_lotes(id),
dispensacion_id UUID REFERENCES veterinaria.dispensaciones(id),
-- Movimiento
tipo_movimiento veterinaria.tipo_movimiento_farmacia NOT NULL,
cantidad INTEGER NOT NULL,
-- Paciente
mascota_id UUID REFERENCES veterinaria.mascotas(id),
propietario_nombre VARCHAR(200), -- Snapshot del nombre
-- Prescripcion
receta_id UUID,
veterinario_id UUID,
veterinario_cedula VARCHAR(50),
-- Justificacion
justificacion TEXT NOT NULL,
diagnostico TEXT,
-- Auditoria
fecha_registro TIMESTAMPTZ DEFAULT NOW(),
registrado_por UUID NOT NULL,
ip_address VARCHAR(45),
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE veterinaria.bitacora_controlados IS 'Bitacora de movimientos de medicamentos controlados (requerido por COFEPRIS)';
-- ============================================================================
-- INDICES
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_medicamentos_tenant ON veterinaria.medicamentos(tenant_id);
CREATE INDEX IF NOT EXISTS idx_medicamentos_codigo ON veterinaria.medicamentos(tenant_id, codigo);
CREATE INDEX IF NOT EXISTS idx_medicamentos_nombre ON veterinaria.medicamentos(tenant_id, nombre);
CREATE INDEX IF NOT EXISTS idx_medicamentos_categoria ON veterinaria.medicamentos(tenant_id, categoria);
CREATE INDEX IF NOT EXISTS idx_medicamentos_controlado ON veterinaria.medicamentos(tenant_id, controlado) WHERE controlado = true;
CREATE INDEX IF NOT EXISTS idx_medicamentos_stock_bajo ON veterinaria.medicamentos(tenant_id)
WHERE stock_actual <= stock_minimo;
CREATE INDEX IF NOT EXISTS idx_lotes_tenant ON veterinaria.medicamentos_lotes(tenant_id);
CREATE INDEX IF NOT EXISTS idx_lotes_medicamento ON veterinaria.medicamentos_lotes(medicamento_id);
CREATE INDEX IF NOT EXISTS idx_lotes_caducidad ON veterinaria.medicamentos_lotes(fecha_caducidad);
CREATE INDEX IF NOT EXISTS idx_lotes_numero ON veterinaria.medicamentos_lotes(tenant_id, numero_lote);
CREATE INDEX IF NOT EXISTS idx_lotes_proximos_caducar ON veterinaria.medicamentos_lotes(tenant_id, fecha_caducidad)
WHERE cantidad_actual > 0 AND bloqueado = false;
CREATE INDEX IF NOT EXISTS idx_dispensaciones_tenant ON veterinaria.dispensaciones(tenant_id);
CREATE INDEX IF NOT EXISTS idx_dispensaciones_medicamento ON veterinaria.dispensaciones(medicamento_id);
CREATE INDEX IF NOT EXISTS idx_dispensaciones_mascota ON veterinaria.dispensaciones(mascota_id);
CREATE INDEX IF NOT EXISTS idx_dispensaciones_fecha ON veterinaria.dispensaciones(fecha_dispensacion);
CREATE INDEX IF NOT EXISTS idx_dispensaciones_veterinario ON veterinaria.dispensaciones(veterinario_id);
CREATE INDEX IF NOT EXISTS idx_movimientos_tenant ON veterinaria.movimientos_farmacia(tenant_id);
CREATE INDEX IF NOT EXISTS idx_movimientos_medicamento ON veterinaria.movimientos_farmacia(medicamento_id);
CREATE INDEX IF NOT EXISTS idx_movimientos_fecha ON veterinaria.movimientos_farmacia(created_at);
CREATE INDEX IF NOT EXISTS idx_bitacora_tenant ON veterinaria.bitacora_controlados(tenant_id);
CREATE INDEX IF NOT EXISTS idx_bitacora_medicamento ON veterinaria.bitacora_controlados(medicamento_id);
CREATE INDEX IF NOT EXISTS idx_bitacora_fecha ON veterinaria.bitacora_controlados(fecha_registro);
-- ============================================================================
-- RLS
-- ============================================================================
ALTER TABLE veterinaria.medicamentos ENABLE ROW LEVEL SECURITY;
ALTER TABLE veterinaria.medicamentos_lotes ENABLE ROW LEVEL SECURITY;
ALTER TABLE veterinaria.dispensaciones ENABLE ROW LEVEL SECURITY;
ALTER TABLE veterinaria.movimientos_farmacia ENABLE ROW LEVEL SECURITY;
ALTER TABLE veterinaria.bitacora_controlados ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation_medicamentos ON veterinaria.medicamentos;
CREATE POLICY tenant_isolation_medicamentos ON veterinaria.medicamentos
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_lotes ON veterinaria.medicamentos_lotes;
CREATE POLICY tenant_isolation_lotes ON veterinaria.medicamentos_lotes
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_dispensaciones ON veterinaria.dispensaciones;
CREATE POLICY tenant_isolation_dispensaciones ON veterinaria.dispensaciones
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_movimientos ON veterinaria.movimientos_farmacia;
CREATE POLICY tenant_isolation_movimientos ON veterinaria.movimientos_farmacia
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
DROP POLICY IF EXISTS tenant_isolation_bitacora ON veterinaria.bitacora_controlados;
CREATE POLICY tenant_isolation_bitacora ON veterinaria.bitacora_controlados
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- ============================================================================
-- TRIGGERS
-- ============================================================================
-- Trigger para actualizar stock_actual en medicamentos
CREATE OR REPLACE FUNCTION veterinaria.actualizar_stock_medicamento()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
-- Actualizar stock del medicamento
UPDATE veterinaria.medicamentos
SET stock_actual = stock_actual + NEW.cantidad_inicial,
updated_at = NOW()
WHERE id = NEW.medicamento_id;
ELSIF TG_OP = 'UPDATE' THEN
-- Si cambia cantidad_actual
UPDATE veterinaria.medicamentos
SET stock_actual = (
SELECT COALESCE(SUM(cantidad_actual), 0)
FROM veterinaria.medicamentos_lotes
WHERE medicamento_id = NEW.medicamento_id
AND bloqueado = false
),
updated_at = NOW()
WHERE id = NEW.medicamento_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_actualizar_stock ON veterinaria.medicamentos_lotes;
CREATE TRIGGER trg_actualizar_stock
AFTER INSERT OR UPDATE OF cantidad_actual ON veterinaria.medicamentos_lotes
FOR EACH ROW
EXECUTE FUNCTION veterinaria.actualizar_stock_medicamento();
COMMENT ON FUNCTION veterinaria.actualizar_stock_medicamento() IS 'Actualiza stock_actual en medicamentos cuando cambian los lotes';
-- Trigger para registrar movimiento en dispensacion
CREATE OR REPLACE FUNCTION veterinaria.registrar_movimiento_dispensacion()
RETURNS TRIGGER AS $$
DECLARE
v_stock_anterior INTEGER;
BEGIN
-- Obtener stock anterior
SELECT stock_actual INTO v_stock_anterior
FROM veterinaria.medicamentos
WHERE id = NEW.medicamento_id;
-- Descontar del lote
UPDATE veterinaria.medicamentos_lotes
SET cantidad_actual = cantidad_actual - NEW.cantidad,
updated_at = NOW()
WHERE id = NEW.lote_id;
-- Registrar movimiento
INSERT INTO veterinaria.movimientos_farmacia (
tenant_id, medicamento_id, lote_id,
tipo, cantidad, stock_anterior, stock_posterior,
referencia_tipo, referencia_id, usuario_id
) VALUES (
NEW.tenant_id, NEW.medicamento_id, NEW.lote_id,
'salida', NEW.cantidad, v_stock_anterior, v_stock_anterior - NEW.cantidad,
'dispensacion', NEW.id, NEW.dispensado_por
);
-- Si es controlado, registrar en bitacora
IF EXISTS (
SELECT 1 FROM veterinaria.medicamentos
WHERE id = NEW.medicamento_id AND controlado = true
) THEN
INSERT INTO veterinaria.bitacora_controlados (
tenant_id, medicamento_id, lote_id, dispensacion_id,
tipo_movimiento, cantidad, mascota_id,
propietario_nombre, receta_id, veterinario_id,
justificacion, registrado_por
)
SELECT
NEW.tenant_id, NEW.medicamento_id, NEW.lote_id, NEW.id,
'salida', NEW.cantidad, NEW.mascota_id,
CONCAT(p.nombre, ' ', COALESCE(p.apellidos, '')),
NEW.receta_id, NEW.veterinario_id,
COALESCE(NEW.notas, 'Dispensacion de medicamento'),
NEW.dispensado_por
FROM veterinaria.mascotas m
JOIN veterinaria.propietarios p ON m.propietario_id = p.id
WHERE m.id = NEW.mascota_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_registrar_dispensacion ON veterinaria.dispensaciones;
CREATE TRIGGER trg_registrar_dispensacion
AFTER INSERT ON veterinaria.dispensaciones
FOR EACH ROW
EXECUTE FUNCTION veterinaria.registrar_movimiento_dispensacion();
COMMENT ON FUNCTION veterinaria.registrar_movimiento_dispensacion() IS 'Registra movimiento y bitacora al dispensar medicamentos';
-- ============================================================================
-- FUNCIONES DE CONSULTA
-- ============================================================================
-- Funcion para obtener lotes proximos a caducar
CREATE OR REPLACE FUNCTION veterinaria.get_lotes_proximos_caducar(
p_tenant_id UUID,
p_dias INTEGER DEFAULT 30
)
RETURNS TABLE (
lote_id UUID,
medicamento_id UUID,
medicamento_nombre VARCHAR,
numero_lote VARCHAR,
fecha_caducidad DATE,
dias_restantes INTEGER,
cantidad_actual INTEGER
) AS $$
BEGIN
RETURN QUERY
SELECT
l.id AS lote_id,
m.id AS medicamento_id,
m.nombre AS medicamento_nombre,
l.numero_lote,
l.fecha_caducidad,
(l.fecha_caducidad - CURRENT_DATE)::INTEGER AS dias_restantes,
l.cantidad_actual
FROM veterinaria.medicamentos_lotes l
JOIN veterinaria.medicamentos m ON l.medicamento_id = m.id
WHERE l.tenant_id = p_tenant_id
AND l.cantidad_actual > 0
AND l.bloqueado = false
AND l.fecha_caducidad <= CURRENT_DATE + p_dias
ORDER BY l.fecha_caducidad ASC;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION veterinaria.get_lotes_proximos_caducar(UUID, INTEGER) IS 'Obtiene lotes que caducaran en los proximos N dias';
-- Funcion para obtener medicamentos con stock bajo
CREATE OR REPLACE FUNCTION veterinaria.get_medicamentos_stock_bajo(p_tenant_id UUID)
RETURNS TABLE (
medicamento_id UUID,
codigo VARCHAR,
nombre VARCHAR,
stock_actual INTEGER,
stock_minimo INTEGER,
diferencia INTEGER
) AS $$
BEGIN
RETURN QUERY
SELECT
m.id AS medicamento_id,
m.codigo,
m.nombre,
m.stock_actual,
m.stock_minimo,
(m.stock_minimo - m.stock_actual) AS diferencia
FROM veterinaria.medicamentos m
WHERE m.tenant_id = p_tenant_id
AND m.active = true
AND m.stock_actual <= m.stock_minimo
ORDER BY diferencia DESC;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION veterinaria.get_medicamentos_stock_bajo(UUID) IS 'Obtiene medicamentos con stock igual o menor al minimo';
-- Funcion para seleccionar lote FEFO (First Expired, First Out)
CREATE OR REPLACE FUNCTION veterinaria.seleccionar_lote_fefo(
p_medicamento_id UUID,
p_cantidad INTEGER
)
RETURNS UUID AS $$
DECLARE
v_lote_id UUID;
BEGIN
SELECT id INTO v_lote_id
FROM veterinaria.medicamentos_lotes
WHERE medicamento_id = p_medicamento_id
AND cantidad_actual >= p_cantidad
AND bloqueado = false
AND fecha_caducidad > CURRENT_DATE
ORDER BY fecha_caducidad ASC
LIMIT 1;
IF v_lote_id IS NULL THEN
RAISE EXCEPTION 'No hay lotes disponibles con stock suficiente para el medicamento %', p_medicamento_id;
END IF;
RETURN v_lote_id;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION veterinaria.seleccionar_lote_fefo(UUID, INTEGER) IS 'Selecciona el lote con fecha de caducidad mas proxima (FEFO)';
-- ============================================================================
-- FIN VETERINARIA FARMACIA SCHEMA
-- ============================================================================

View File

@ -0,0 +1,258 @@
# VET-001: Mascotas y Propietarios
## Metadata
- **Codigo:** VET-001
- **Modulo:** Mascotas + Propietarios
- **Prioridad:** P0
- **Estado:** DDL Completado
- **Fase:** 1 - Core
## Descripcion
Sistema de gestion de mascotas (pacientes) y sus propietarios: registro completo de datos del animal, vinculacion con duenos, historial de pesos, identificacion por microchip, y estado del paciente.
## Objetivos
1. Registro completo de mascotas
2. Vinculacion mascota-propietario
3. Gestion multi-especie y razas
4. Identificacion por microchip
5. Historial de pesos
## Alcance
### Incluido
- CRUD de propietarios
- CRUD de mascotas con foto
- Catalogos de especies y razas
- Busqueda por microchip
- Historial de pesos
- Vinculacion de multiples propietarios
- Estados: activo, fallecido, perdido, dado_de_baja
### Excluido
- QR para expediente (fase posterior)
- App para propietarios (fase posterior)
- Portal de autoservicio
## Especies Soportadas
| Especie | Codigo | Vacunas Tipicas |
|---------|--------|-----------------|
| Canino (Perro) | CAN | Parvovirus, Moquillo, Rabia |
| Felino (Gato) | FEL | Triple Felina, Leucemia, Rabia |
| Ave | AVE | Variable segun tipo |
| Reptil | REP | Sin vacunas estandar |
| Roedor | ROE | Sin vacunas estandar |
| Pez | PEZ | Tratamientos de agua |
| Exotico | EXO | Segun especie |
## Modelo de Datos
### Tablas
**veterinaria.propietarios**
- id, tenant_id, partner_id (opcional)
- nombre, apellidos, telefono, telefono_emergencia
- email, direccion, rfc
- active
**veterinaria.mascotas**
- id, tenant_id, propietario_id
- especie_id, raza_id
- nombre, sexo, fecha_nacimiento, edad_aproximada
- color, peso_kg
- numero_chip, tiene_chip
- esterilizado, fecha_esterilizacion
- alergias, condiciones_especiales, notas
- foto_url, active
**veterinaria.especies** (Catalogo)
- id, tenant_id, nombre, nombre_cientifico
**veterinaria.razas** (Catalogo)
- id, tenant_id, especie_id, nombre
- tamanio_promedio, peso_promedio_kg
## Endpoints API
### Propietarios
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /propietarios | Listar propietarios |
| GET | /propietarios/:id | Detalle propietario |
| POST | /propietarios | Crear propietario |
| PUT | /propietarios/:id | Actualizar |
| DELETE | /propietarios/:id | Desactivar |
| GET | /propietarios/:id/mascotas | Mascotas del propietario |
### Mascotas
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /mascotas | Listar mascotas |
| GET | /mascotas/:id | Detalle mascota |
| POST | /mascotas | Registrar mascota |
| PUT | /mascotas/:id | Actualizar |
| DELETE | /mascotas/:id | Desactivar |
| GET | /mascotas/chip/:numero | Buscar por microchip |
| POST | /mascotas/:id/foto | Subir foto |
| GET | /mascotas/:id/historial-peso | Historial de pesos |
| POST | /mascotas/:id/peso | Registrar peso |
### Catalogos
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /especies | Listar especies |
| GET | /especies/:id/razas | Razas de especie |
| POST | /razas | Crear raza |
## Interfaz del Servicio
```typescript
interface MascotasService {
getAll(filters?: MascotaFilters): Promise<Mascota[]>;
getById(id: string): Promise<Mascota>;
create(data: CreateMascota): Promise<Mascota>;
update(id: string, data: UpdateMascota): Promise<Mascota>;
findByChip(numeroChip: string): Promise<Mascota | null>;
registrarPeso(mascotaId: string, pesoKg: number): Promise<void>;
getHistorialPeso(mascotaId: string): Promise<PesoHistorial[]>;
}
interface PropietariosService {
getAll(filters?: PropietarioFilters): Promise<Propietario[]>;
getById(id: string): Promise<Propietario>;
create(data: CreatePropietario): Promise<Propietario>;
getMascotas(propietarioId: string): Promise<Mascota[]>;
}
interface CreateMascota {
propietarioId: string;
especieId: string;
razaId?: string;
nombre: string;
sexo: SexoAnimal;
fechaNacimiento?: Date;
edadAproximada?: string;
color?: string;
pesoKg?: number;
numeroChip?: string;
esterilizado?: boolean;
alergias?: string;
}
```
## Flujos
### Registrar Nueva Mascota
```
1. Propietario llega a registrar mascota
2. Buscar si propietario existe (por telefono)
3. Si no existe, crear propietario
4. Crear registro de mascota:
- Seleccionar especie
- Seleccionar raza (opcional)
- Datos basicos (nombre, sexo, edad)
- Identificacion (chip si tiene)
- Tomar foto
5. Guardar y abrir expediente
```
### Buscar por Microchip
```
1. Escanear microchip
2. Buscar en base de datos
3. Si existe: mostrar expediente
4. Si no existe: opcion de registrar
5. Validar propietario actual
```
## Signos Vitales por Especie
| Especie | Temp Normal | FC Normal | FR Normal |
|---------|-------------|-----------|-----------|
| Canino | 38-39°C | 60-120 lpm | 10-30 rpm |
| Felino | 38-39°C | 120-180 lpm | 20-40 rpm |
| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm |
| Ave | 40-42°C | Variable | Variable |
## Componentes Frontend
### MascotaCard
```typescript
interface MascotaCardProps {
mascota: Mascota;
onClick: () => void;
showOwner?: boolean;
}
// Muestra:
// - Foto de la mascota
// - Nombre y especie
// - Raza
// - Edad
// - Chip (si tiene)
// - Estado (activo/fallecido)
```
### MascotaForm
```typescript
interface MascotaFormProps {
propietarioId: string;
onSave: (mascota: Mascota) => void;
}
// Campos:
// - Nombre
// - Especie (dropdown)
// - Raza (dropdown filtrado por especie)
// - Sexo
// - Fecha nacimiento / Edad aproximada
// - Color
// - Peso
// - Microchip
// - Esterilizado
// - Alergias
// - Foto
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL mascotas | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| DDL propietarios | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| mascotas.module.ts | Pendiente | `backend/modules/mascotas/` |
| propietarios.module.ts | Pendiente | `backend/modules/propietarios/` |
| MascotaCard.tsx | Pendiente | `frontend/components/` |
| MascotaForm.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- Auth/Tenants (erp-core)
### Bloquea a
- VET-002 (Vacunacion - requiere mascota)
- VET-003 (Desparasitaciones)
- VET-004 (Hospitalizacion)
- VET-005 (Estetica)
- Consultas veterinarias
## Criterios de Aceptacion
- [ ] CRUD propietarios funciona
- [ ] CRUD mascotas funciona
- [ ] Catalogos de especies/razas
- [ ] Busqueda por microchip
- [ ] Foto se sube correctamente
- [ ] Historial de peso funciona
- [ ] Vinculacion propietario-mascota
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,268 @@
# VET-002: Cartilla de Vacunacion
## Metadata
- **Codigo:** VET-002
- **Modulo:** Vacunacion
- **Prioridad:** P0
- **Estado:** DDL Completado
- **Fase:** 2 - Vacunacion
## Descripcion
Sistema de cartilla de vacunacion digital: registro de aplicaciones, esquemas por especie, control de lotes, alertas de refuerzos, generacion de certificados, y reportes para SENASICA.
## Objetivos
1. Registro de vacunas aplicadas
2. Esquemas por especie y edad
3. Control de lotes y fabricantes
4. Alertas de proximos refuerzos
5. Reportes SENASICA
## Alcance
### Incluido
- Catalogo de vacunas por especie
- Registro de aplicaciones con lote
- Calculo automatico de proxima dosis
- Alertas por email/SMS/push
- Historial de vacunacion por mascota
- Certificado de vacunacion (PDF)
- Reporte mensual SENASICA
### Excluido
- Integracion directa con API SENASICA
- Compra de vacunas desde sistema
- Cadena de frio/temperatura
## Esquemas de Vacunacion
### Caninos (Perros)
```yaml
cachorro:
6_semanas:
- Parvovirus
8_semanas:
- Quintuple (DHPPI+L)
12_semanas:
- Refuerzo Quintuple
16_semanas:
- Rabia
anual:
- Quintuple + Rabia
opcional:
- Bordetella (cada 6 meses, perros sociales)
- Giardia
- Lyme (zonas endemicas)
```
### Felinos (Gatos)
```yaml
gatito:
8_semanas:
- Triple Felina (PRC)
12_semanas:
- Refuerzo Triple + Leucemia Felina
16_semanas:
- Rabia
anual:
- Triple Felina + Rabia
opcional:
- Leucemia Felina (gatos de exterior)
- PIF (peritonitis infecciosa)
```
## Modelo de Datos
### Tablas
**veterinaria.vacunas** (Catalogo)
- id, tenant_id, nombre, descripcion
- especie_id, laboratorio
- dosis_ml, intervalo_refuerzo_dias
- es_obligatoria, active
**veterinaria.cartilla_vacunacion**
- id, tenant_id, mascota_id, vacuna_id
- veterinario_id
- fecha_aplicacion, fecha_proximo_refuerzo
- lote, laboratorio
- observaciones
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /vacunas | Catalogo de vacunas |
| GET | /vacunas/especie/:id | Vacunas por especie |
| POST | /vacunas | Crear vacuna en catalogo |
| GET | /mascotas/:id/vacunacion | Cartilla de mascota |
| POST | /mascotas/:id/vacunacion | Registrar vacuna aplicada |
| DELETE | /vacunacion/:id | Eliminar registro |
| GET | /vacunacion/proximas | Refuerzos proximos (7 dias) |
| GET | /vacunacion/vencidas | Refuerzos vencidos |
| GET | /mascotas/:id/certificado | Generar certificado PDF |
| GET | /reportes/senasica | Reporte mensual |
## Interfaz del Servicio
```typescript
interface VacunacionService {
getCatalogo(especieId?: string): Promise<Vacuna[]>;
getCartilla(mascotaId: string): Promise<VacunacionRecord[]>;
aplicar(data: AplicarVacuna): Promise<VacunacionRecord>;
getProximosRefuerzos(dias: number): Promise<RefuerzoPendiente[]>;
getVencidos(): Promise<RefuerzoPendiente[]>;
generarCertificado(mascotaId: string): Promise<Buffer>;
getReporteSenasica(mes: number, anio: number): Promise<ReporteSenasica>;
}
interface AplicarVacuna {
mascotaId: string;
vacunaId: string;
veterinarioId: string;
fechaAplicacion: Date;
lote: string;
laboratorio?: string;
observaciones?: string;
}
interface RefuerzoPendiente {
mascota: Mascota;
propietario: Propietario;
vacuna: Vacuna;
fechaRefuerzo: Date;
diasRestantes: number;
}
```
## Flujos
### Aplicar Vacuna
```
1. Consulta veterinaria
2. Veterinario decide vacunar
3. Seleccionar vacuna del catalogo
4. Registrar lote (obligatorio)
5. Sistema calcula fecha proxima
6. Guardar en cartilla
7. Imprimir certificado (opcional)
8. Agregar a factura
```
### Alertas de Refuerzos
```
Diario (cron job):
1. Buscar refuerzos que vencen en 7 dias
2. Filtrar por preferencias de propietario
3. Enviar notificaciones:
- Email: 7 dias antes
- SMS: 3 dias antes
- Push: 1 dia antes
4. Marcar como notificado
```
### Reporte SENASICA
```
Mensual:
1. Filtrar vacunas de rabia aplicadas
2. Agrupar por especie y municipio
3. Incluir datos del veterinario
4. Generar formato oficial
5. Exportar para envio
```
## Certificado de Vacunacion
```
┌─────────────────────────────────────────────────────────┐
│ CERTIFICADO DE VACUNACION │
│ Clinica Veterinaria XYZ │
├─────────────────────────────────────────────────────────┤
│ DATOS DE LA MASCOTA │
│ Nombre: Firulais │
│ Especie: Canino Raza: Labrador │
│ Sexo: Macho Edad: 2 años │
│ Color: Amarillo Chip: 123456789012345 │
├─────────────────────────────────────────────────────────┤
│ DATOS DEL PROPIETARIO │
│ Nombre: Juan Perez Garcia │
│ Telefono: 555-123-4567 │
├─────────────────────────────────────────────────────────┤
│ HISTORIAL DE VACUNACION │
│ Fecha │ Vacuna │ Lote │ Prox.Ref │
│ 07/01/2026 │ Rabia │ R12345 │ 07/01/2027 │
│ 07/01/2026 │ Quintuple │ Q98765 │ 07/01/2027 │
│ 15/06/2025 │ Quintuple │ Q54321 │ - │
├─────────────────────────────────────────────────────────┤
│ Veterinario: Dr. Maria Lopez │
│ Cedula Profesional: 12345678 │
│ Firma: _________________________
└─────────────────────────────────────────────────────────┘
```
## Alertas Configurables
```typescript
interface ConfiguracionAlertas {
email: {
enabled: boolean;
diasAntes: number; // default: 7
};
sms: {
enabled: boolean;
diasAntes: number; // default: 3
};
push: {
enabled: boolean;
diasAntes: number; // default: 1
};
whatsapp: {
enabled: boolean;
diasAntes: number;
};
}
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL cartilla | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| DDL vacunas | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| vacunacion.module.ts | Pendiente | `backend/modules/vacunacion/` |
| CartillaVacunacion.tsx | Pendiente | `frontend/components/` |
| CertificadoPDF.ts | Pendiente | `backend/services/` |
| Seeds vacunas | Pendiente | `database/seeds/` |
## Dependencias
### Depende de
- VET-001 (Mascotas)
- clinica.doctors (erp-clinicas)
- Notifications service
### Bloquea a
- Reportes SENASICA
- App para propietarios
## Criterios de Aceptacion
- [ ] Catalogo de vacunas por especie
- [ ] Registro de aplicacion con lote
- [ ] Fecha proxima se calcula
- [ ] Alertas se envian
- [ ] Certificado PDF se genera
- [ ] Historial completo visible
- [ ] Reporte SENASICA correcto
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,222 @@
# VET-003: Desparasitaciones
## Metadata
- **Codigo:** VET-003
- **Modulo:** Desparasitaciones
- **Prioridad:** P1
- **Estado:** DDL Completado
- **Fase:** 2 - Vacunacion
## Descripcion
Sistema de control de desparasitaciones internas y externas: registro de aplicaciones, productos utilizados, dosis por peso, alertas de proximas desparasitaciones, y historial por mascota.
## Objetivos
1. Registro de desparasitaciones
2. Control de productos y dosis
3. Alertas de proximas aplicaciones
4. Historial por mascota
5. Recomendaciones por especie
## Alcance
### Incluido
- Tipos: interna, externa, ambas
- Registro de producto y dosis
- Via de administracion
- Calculo de proxima aplicacion
- Historial cronologico
- Alertas automaticas
### Excluido
- Inventario de productos
- Calculo automatico de dosis por peso
- Integracion con laboratorios
## Tipos de Desparasitacion
| Tipo | Descripcion | Frecuencia Tipica |
|------|-------------|-------------------|
| Interna | Parasitos intestinales | Cada 3-6 meses |
| Externa | Pulgas, garrapatas | Cada 1-3 meses |
| Ambas | Combinada | Segun producto |
## Productos Comunes
### Desparasitantes Internos
| Producto | Principio Activo | Presentacion |
|----------|------------------|--------------|
| Drontal | Praziquantel + Pirantel | Tableta |
| Panacur | Fenbendazol | Suspension |
| Milbemax | Milbemicina + Praziquantel | Tableta |
### Desparasitantes Externos
| Producto | Principio Activo | Presentacion |
|----------|------------------|--------------|
| Frontline | Fipronil | Pipeta |
| Nexgard | Afoxolaner | Tableta masticable |
| Seresto | Imidacloprid + Flumetrina | Collar |
| Bravecto | Fluralaner | Tableta/Pipeta |
## Modelo de Datos
### Tabla: veterinaria.desparasitaciones
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK |
| mascota_id | UUID | FK |
| veterinario_id | UUID | FK |
| tipo | VARCHAR(50) | interna, externa, ambas |
| producto | VARCHAR(100) | Nombre del producto |
| dosis | VARCHAR(50) | Cantidad administrada |
| via_administracion | VARCHAR(50) | oral, topica, inyectable |
| fecha_aplicacion | DATE | Fecha de aplicacion |
| fecha_proxima | DATE | Proxima aplicacion |
| observaciones | TEXT | Notas |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /mascotas/:id/desparasitaciones | Historial |
| POST | /mascotas/:id/desparasitaciones | Registrar |
| PUT | /desparasitaciones/:id | Actualizar |
| DELETE | /desparasitaciones/:id | Eliminar |
| GET | /desparasitaciones/proximas | Proximas 30 dias |
| GET | /desparasitaciones/vencidas | Vencidas |
## Interfaz del Servicio
```typescript
interface DesparasitacionesService {
getByMascota(mascotaId: string): Promise<Desparasitacion[]>;
registrar(data: RegistrarDesparasitacion): Promise<Desparasitacion>;
getProximas(dias: number): Promise<DesparasitacionPendiente[]>;
getVencidas(): Promise<DesparasitacionPendiente[]>;
}
interface RegistrarDesparasitacion {
mascotaId: string;
veterinarioId?: string;
tipo: 'interna' | 'externa' | 'ambas';
producto: string;
dosis?: string;
viaAdministracion: string;
fechaAplicacion: Date;
fechaProxima?: Date;
observaciones?: string;
}
```
## Flujos
### Registrar Desparasitacion
```
1. Durante consulta o en recepcion
2. Seleccionar mascota
3. Indicar tipo (interna/externa/ambas)
4. Seleccionar/escribir producto
5. Indicar dosis y via
6. Registrar fecha aplicacion
7. Sistema sugiere fecha proxima (configurable)
8. Guardar registro
9. Agregar a cuenta del cliente
```
### Recordatorios
```
Semanal (cron job):
1. Buscar desparasitaciones proximas (30 dias)
2. Agrupar por propietario
3. Enviar recordatorio consolidado
4. Email con lista de mascotas
```
## Frecuencias Recomendadas
### Por Especie y Situacion
```typescript
const FRECUENCIAS = {
canino: {
cachorro: { interna: 15, externa: 30 }, // dias
adulto: { interna: 90, externa: 30 },
gestante: { interna: 45, externa: 30 }
},
felino: {
cachorro: { interna: 15, externa: 30 },
adulto: { interna: 90, externa: 30 },
interior: { interna: 180, externa: 60 } // gatos de interior
}
};
```
## Componentes Frontend
### DesparasitacionForm
```typescript
interface DesparasitacionFormProps {
mascota: Mascota;
onSave: (data: Desparasitacion) => void;
}
// Campos:
// - Tipo (radio: interna/externa/ambas)
// - Producto (autocomplete o texto)
// - Dosis
// - Via (dropdown: oral, topica, inyectable)
// - Fecha aplicacion
// - Fecha proxima (calculada, editable)
// - Observaciones
```
### DesparasitacionTimeline
```typescript
// Muestra historial visual:
// ┌────────────────────────────────────────┐
// │ ● 07/01/2026 - Interna - Drontal │
// │ Proxima: 07/04/2026 (en 90 dias) │
// ├────────────────────────────────────────┤
// │ ● 15/12/2025 - Externa - Frontline │
// │ Proxima: 15/01/2026 (VENCIDA) │
// └────────────────────────────────────────┘
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL desparasitaciones | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| desparasitaciones.module.ts | Pendiente | `backend/modules/desparasitaciones/` |
| DesparasitacionForm.tsx | Pendiente | `frontend/components/` |
| DesparasitacionTimeline.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- VET-001 (Mascotas)
- Notifications service
### Bloquea a
- Dashboard de salud de mascota
- App para propietarios
## Criterios de Aceptacion
- [ ] Registro de desparasitacion funciona
- [ ] Tipos interna/externa/ambas
- [ ] Fecha proxima se calcula
- [ ] Historial cronologico visible
- [ ] Alertas de vencidas
- [ ] Proximas desparasitaciones se listan
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,274 @@
# VET-004: Hospitalizacion
## Metadata
- **Codigo:** VET-004
- **Modulo:** Hospitalizacion
- **Prioridad:** P1
- **Estado:** DDL Completado
- **Fase:** 3 - Hospitalizacion
## Descripcion
Sistema de gestion de hospitalizacion veterinaria: ingreso de pacientes, asignacion de espacios (jaulas/kennels), monitoreo de signos vitales, administracion de medicamentos, y proceso de alta.
## Objetivos
1. Registro de ingresos
2. Asignacion de espacios
3. Monitoreo periodico
4. Control de medicamentos
5. Proceso de alta
## Alcance
### Incluido
- Ingreso con diagnostico inicial
- Asignacion de jaula/kennel/UCI
- Monitoreo cada X horas (configurable)
- Registro de signos vitales
- Estado de alimentacion/eliminacion
- Notas de evolucion
- Alta con instrucciones
- Costos acumulados
### Excluido
- Sensores automaticos
- Camaras de vigilancia
- Sistema de ventiladores/temperatura
## Estados de Hospitalizacion
```
ingresado ──► en_tratamiento ──► estable ──► alta
├──► critico
└──► fallecido
```
| Estado | Descripcion | Acciones |
|--------|-------------|----------|
| ingresado | Recien llegado | Evaluacion inicial |
| en_tratamiento | Recibiendo cuidados | Monitoreo activo |
| estable | Mejorando | Reducir monitoreo |
| critico | Grave | Monitoreo intensivo |
| alta | Dado de alta | Cerrar expediente |
| fallecido | Fallecio | Registro de deceso |
## Modelo de Datos
### Tablas
**veterinaria.hospitalizacion**
- id, tenant_id, mascota_id, veterinario_id
- consultation_id
- fecha_ingreso, motivo_ingreso, diagnostico_ingreso
- area, numero_jaula
- estado
- fecha_alta, diagnostico_alta, instrucciones_alta
**veterinaria.hospitalizacion_monitoreo**
- id, tenant_id, hospitalizacion_id
- fecha_hora
- peso_kg, temperatura
- frecuencia_cardiaca, frecuencia_respiratoria
- comio, bebio_agua, orino, defeco
- consistencia_heces, estado_animo
- nivel_dolor (0-10)
- observaciones, registrado_por
## Signos Vitales Normales
| Especie | Temperatura | FC | FR |
|---------|-------------|-----|-----|
| Canino | 38-39°C | 60-120 lpm | 10-30 rpm |
| Felino | 38-39°C | 120-180 lpm | 20-40 rpm |
| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /hospitalizacion | Pacientes hospitalizados |
| GET | /hospitalizacion/:id | Detalle |
| POST | /hospitalizacion | Ingresar paciente |
| PUT | /hospitalizacion/:id | Actualizar |
| PUT | /hospitalizacion/:id/alta | Dar de alta |
| GET | /hospitalizacion/:id/monitoreos | Historial monitoreos |
| POST | /hospitalizacion/:id/monitoreos | Registrar monitoreo |
| GET | /hospitalizacion/espacios | Disponibilidad jaulas |
| PUT | /hospitalizacion/:id/espacio | Cambiar espacio |
## Interfaz del Servicio
```typescript
interface HospitalizacionService {
getActivos(): Promise<Hospitalizacion[]>;
getById(id: string): Promise<Hospitalizacion>;
ingresar(data: IngresoHospitalizacion): Promise<Hospitalizacion>;
darAlta(id: string, data: AltaHospitalizacion): Promise<Hospitalizacion>;
registrarMonitoreo(hospId: string, data: Monitoreo): Promise<Monitoreo>;
getMonitoreos(hospId: string): Promise<Monitoreo[]>;
getEspaciosDisponibles(): Promise<Espacio[]>;
}
interface IngresoHospitalizacion {
mascotaId: string;
veterinarioId: string;
consultationId?: string;
motivoIngreso: string;
diagnosticoIngreso?: string;
area: string;
numeroJaula?: string;
}
interface Monitoreo {
fechaHora: Date;
pesoKg?: number;
temperatura?: number;
frecuenciaCardiaca?: number;
frecuenciaRespiratoria?: number;
comio: boolean;
bebioAgua: boolean;
orino: boolean;
defeco: boolean;
consistenciaHeces?: string;
estadoAnimo?: string;
nivelDolor?: number;
observaciones?: string;
}
```
## Flujos
### Ingresar Paciente
```
1. Veterinario decide hospitalizar
2. Crear registro de hospitalizacion:
- Motivo de ingreso
- Diagnostico inicial
- Indicaciones
3. Verificar disponibilidad de espacios
4. Asignar jaula/kennel
5. Registrar monitoreo inicial
6. Notificar a propietario
7. Configurar frecuencia de monitoreo
```
### Monitoreo Periodico
```
Cada X horas (configurable por estado):
1. Auxiliar va a jaula
2. Pesar mascota (si aplica)
3. Tomar temperatura
4. Registrar signos vitales
5. Verificar alimentacion/eliminacion
6. Evaluar estado de animo y dolor
7. Notas de observacion
8. Guardar en sistema
9. Alertar si valores anormales
```
### Dar de Alta
```
1. Veterinario evalua condicion
2. Decide dar de alta
3. Registrar diagnostico final
4. Escribir instrucciones para propietario
5. Cambiar estado a "alta"
6. Generar resumen de hospitalizacion
7. Calcular costos totales
8. Notificar a propietario
9. Liberar espacio
```
## Panel de Control
```
┌─────────────────────────────────────────────────────────┐
│ HOSPITALIZACION - Panel de Control │
├─────────────────────────────────────────────────────────┤
│ Jaulas Pequenas (8) │ ■ ■ ■ ■ ■ □ □ □ │
│ Jaulas Grandes (4) │ ■ ■ □ □ │
│ UCI (2) │ ■ □ │
│ Kennels (6) │ ■ ■ ■ □ □ □ │
├─────────────────────────────────────────────────────────┤
│ ■ = Ocupado □ = Disponible │
├─────────────────────────────────────────────────────────┤
│ PACIENTES ACTIVOS │
│ ┌─────────────────────────────────────────────────────┐
│ │ 🐕 Firulais (J-03) | Ingreso: 05/01 | ESTABLE │
│ │ Ultimo monitoreo: hace 2 horas │
│ ├─────────────────────────────────────────────────────┤
│ │ 🐈 Michi (J-07) | Ingreso: 06/01 | EN_TRATAMIENTO │
│ │ Ultimo monitoreo: hace 4 horas ⚠️ │
│ ├─────────────────────────────────────────────────────┤
│ │ 🐕 Rocky (UCI-01) | Ingreso: 07/01 | CRITICO │
│ │ Ultimo monitoreo: hace 30 min │
│ └─────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────┘
```
## Frecuencia de Monitoreo
| Estado | Frecuencia |
|--------|------------|
| critico | Cada 1-2 horas |
| en_tratamiento | Cada 4 horas |
| estable | Cada 8 horas |
| ingresado | Evaluacion inicial |
## Costos de Hospitalizacion
```typescript
interface CostosHospitalizacion {
diasInternado: number;
costoPorDia: number;
medicamentos: CostoMedicamento[];
procedimientos: CostoProcedimiento[];
estudios: CostoEstudio[];
subtotal: number;
descuento?: number;
total: number;
}
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL hospitalizacion | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| DDL monitoreo | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| hospitalizacion.module.ts | Pendiente | `backend/modules/hospitalizacion/` |
| HospitalizacionPanel.tsx | Pendiente | `frontend/components/` |
| MonitoreoForm.tsx | Pendiente | `frontend/components/` |
| EspaciosGrid.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- VET-001 (Mascotas)
- clinica.consultations (erp-clinicas)
- clinica.doctors (erp-clinicas)
### Bloquea a
- Reportes de ocupacion
- Dashboard gerencial
## Criterios de Aceptacion
- [ ] Ingreso de pacientes funciona
- [ ] Asignacion de espacios
- [ ] Monitoreo se registra
- [ ] Estados se actualizan
- [ ] Alta genera resumen
- [ ] Panel muestra ocupacion
- [ ] Alertas de monitoreo vencido
- [ ] Costos se calculan
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,250 @@
# VET-005: Estetica (Grooming)
## Metadata
- **Codigo:** VET-005
- **Modulo:** Estetica
- **Prioridad:** P2
- **Estado:** DDL Completado
- **Fase:** 4 - Servicios Adicionales
## Descripcion
Sistema de gestion de servicios de estetica canina y felina (grooming): agenda de servicios, tipos de corte, productos utilizados, observaciones de piel/pelaje, y registro de tiempos.
## Objetivos
1. Agenda de servicios de estetica
2. Registro de servicios realizados
3. Control de productos (shampoos)
4. Observaciones de piel/pelaje
5. Historial por mascota
## Alcance
### Incluido
- Tipos de servicio: bano, corte, limpieza oidos, corte unas
- Tipos de corte por raza
- Productos/shampoos utilizados
- Estado del servicio
- Hora inicio/fin
- Observaciones de piel
- Precio por servicio
### Excluido
- Reservas online
- Fotos antes/despues
- Calificacion del cliente
## Servicios de Estetica
| Servicio | Descripcion | Duracion Aprox |
|----------|-------------|----------------|
| Bano | Bano con shampoo | 30-45 min |
| Corte | Corte de pelo | 45-90 min |
| Bano + Corte | Servicio completo | 60-120 min |
| Limpieza oidos | Limpieza auditiva | 10 min |
| Corte unas | Corte de unas | 10 min |
| Deslanado | Remocion de pelo muerto | 30-60 min |
| Tratamiento piel | Tratamiento dermatologico | 30 min |
## Tipos de Corte por Raza
### Caninos
| Raza | Cortes Tipicos |
|------|----------------|
| Poodle | Continental, Puppy, Teddy Bear |
| Schnauzer | Schnauzer estandar, Puppy |
| Cocker | Cocker estandar, Puppy |
| Yorkshire | Show, Puppy |
| Bichon | Bichon estandar, Teddy Bear |
### Felinos
| Tipo | Cortes |
|------|--------|
| Pelo largo | Leon, Higienico |
| Pelo corto | Solo bano (sin corte) |
## Modelo de Datos
### Tabla: veterinaria.estetica
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK |
| mascota_id | UUID | FK |
| estilista_id | UUID | FK empleado |
| fecha_servicio | TIMESTAMPTZ | Fecha/hora |
| servicios | TEXT[] | Lista de servicios |
| tipo_corte | VARCHAR(50) | Tipo de corte |
| shampoo_usado | VARCHAR(100) | Producto |
| estado | VARCHAR(20) | pendiente, en_proceso, terminado |
| hora_inicio | TIME | Inicio |
| hora_fin | TIME | Fin |
| observaciones | TEXT | Notas generales |
| observaciones_piel | TEXT | Estado de piel/pelaje |
| precio | NUMERIC(10,2) | Total |
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /estetica | Servicios del dia |
| GET | /estetica/:id | Detalle servicio |
| POST | /estetica | Agendar servicio |
| PUT | /estetica/:id | Actualizar |
| PUT | /estetica/:id/iniciar | Iniciar servicio |
| PUT | /estetica/:id/terminar | Terminar servicio |
| GET | /mascotas/:id/estetica | Historial mascota |
| GET | /estetica/agenda | Agenda por fecha |
## Interfaz del Servicio
```typescript
interface EsteticaService {
getDelDia(): Promise<Estetica[]>;
getById(id: string): Promise<Estetica>;
agendar(data: AgendarEstetica): Promise<Estetica>;
iniciar(id: string): Promise<Estetica>;
terminar(id: string, data: TerminarEstetica): Promise<Estetica>;
getHistorial(mascotaId: string): Promise<Estetica[]>;
getAgenda(fecha: Date): Promise<Estetica[]>;
}
interface AgendarEstetica {
mascotaId: string;
estilistaId?: string;
fechaServicio: Date;
servicios: string[];
tipoCorte?: string;
precio?: number;
}
interface TerminarEstetica {
shampooUsado?: string;
observaciones?: string;
observacionesPiel?: string;
precioFinal?: number;
}
```
## Flujos
### Agendar Servicio
```
1. Propietario solicita servicio
2. Verificar disponibilidad de estilista
3. Crear registro de estetica:
- Mascota
- Servicios solicitados
- Tipo de corte (si aplica)
- Fecha/hora
4. Confirmar con propietario
5. Estado: pendiente
```
### Ejecutar Servicio
```
1. Mascota llega a la clinica
2. Estilista marca inicio
3. Realiza servicios:
- Bano
- Secado
- Corte (si aplica)
- Extras (orejas, unas)
4. Revisar piel/pelaje
5. Registrar observaciones
6. Marcar como terminado
7. Notificar a propietario
8. Agregar a cuenta
```
## Productos/Shampoos
```typescript
const SHAMPOOS = [
{ nombre: 'Shampoo Regular', tipo: 'normal' },
{ nombre: 'Shampoo Antipulgas', tipo: 'antiparasitario' },
{ nombre: 'Shampoo Dermatologico', tipo: 'medicado' },
{ nombre: 'Shampoo Pelo Blanco', tipo: 'especial' },
{ nombre: 'Shampoo Cachorro', tipo: 'suave' },
{ nombre: 'Acondicionador', tipo: 'complemento' }
];
```
## Observaciones de Piel
```typescript
interface ObservacionesPiel {
estado: 'normal' | 'irritada' | 'seca' | 'grasa' | 'con_lesiones';
parasitos: boolean;
pulgas: boolean;
garrapatas: boolean;
hotspots: boolean;
perdidaPelo: boolean;
nudos: 'ninguno' | 'pocos' | 'muchos';
notas: string;
}
```
## Panel de Estetica
```
┌─────────────────────────────────────────────────────────┐
│ ESTETICA - Agenda del Dia (07/01/2026) │
├─────────────────────────────────────────────────────────┤
│ 09:00 │ 🐕 Firulais │ Bano + Corte │ ✓ Terminado │
│ 10:30 │ 🐈 Michi │ Bano │ ⏳ En proceso │
│ 11:30 │ 🐕 Rocky │ Deslanado │ ⏸ Pendiente │
│ 14:00 │ 🐕 Luna │ Bano + Corte │ ⏸ Pendiente │
│ 15:30 │ 🐕 Max │ Corte unas │ ⏸ Pendiente │
├─────────────────────────────────────────────────────────┤
│ Estilistas: Ana (4 servicios), Carlos (1 servicio) │
└─────────────────────────────────────────────────────────┘
```
## Precios Sugeridos
| Servicio | Pequeno | Mediano | Grande |
|----------|---------|---------|--------|
| Bano | $150 | $200 | $300 |
| Corte | $200 | $300 | $450 |
| Bano + Corte | $300 | $450 | $650 |
| Deslanado | $200 | $300 | $400 |
| Limpieza oidos | $50 | $50 | $50 |
| Corte unas | $50 | $50 | $50 |
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL estetica | Completado | `database/schemas/01-veterinaria-schema-ddl.sql` |
| estetica.module.ts | Pendiente | `backend/modules/estetica/` |
| EsteticaAgenda.tsx | Pendiente | `frontend/components/` |
| EsteticaForm.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- VET-001 (Mascotas)
- Employees (erp-core)
### Bloquea a
- Reportes de productividad
- App para propietarios
## Criterios de Aceptacion
- [ ] Agendar servicio funciona
- [ ] Lista de servicios configurable
- [ ] Estados se actualizan
- [ ] Hora inicio/fin se registra
- [ ] Observaciones de piel
- [ ] Historial por mascota
- [ ] Precio se calcula
---
**Ultima actualizacion:** 2026-01-07

View File

@ -0,0 +1,288 @@
# VET-006: Farmacia Veterinaria
## Metadata
- **Codigo:** VET-006
- **Modulo:** Farmacia
- **Prioridad:** P1
- **Estado:** DDL Completado
- **Fase:** 2 - Vacunacion
- **DDL:** `database/schemas/02-veterinaria-farmacia-ddl.sql`
## Descripcion
Sistema de gestion de farmacia veterinaria: inventario de medicamentos, control de lotes y caducidades, dispensacion, medicamentos controlados, alertas de stock minimo, y trazabilidad.
## Objetivos
1. Inventario de medicamentos
2. Control de lotes y caducidades
3. Dispensacion con receta
4. Medicamentos controlados
5. Alertas de stock
## Alcance
### Incluido
- Catalogo de medicamentos
- Stock por lote
- Alertas de caducidad (30, 15, 7 dias)
- Alertas de stock minimo
- Dispensacion desde receta
- Registro de medicamentos controlados
- Historial de movimientos
### Excluido
- Compras a proveedores (usar inventario base)
- Produccion/formulacion
- Trazabilidad COFEPRIS completa
## Categorias de Medicamentos
| Categoria | Descripcion | Ejemplo |
|-----------|-------------|---------|
| Antibioticos | Contra infecciones | Amoxicilina, Enrofloxacina |
| Antiparasitarios | Contra parasitos | Ivermectina, Fenbendazol |
| Analgesicos | Contra dolor | Meloxicam, Tramadol |
| Antiinflamatorios | Reducir inflamacion | Dexametasona, Prednisolona |
| Vacunas | Inmunizacion | Rabia, Quintuple |
| Vitaminas | Suplementos | Complejo B, Hierro |
| Dermatologicos | Piel | Shampoos medicados |
| Oftalmicos | Ojos | Gotas, unguentos |
## Modelo de Datos (Propuesto)
### Tablas
**veterinaria.medicamentos**
- id, tenant_id
- nombre, principio_activo
- presentacion, laboratorio
- requiere_receta, controlado
- stock_minimo, precio_venta
- active
**veterinaria.medicamentos_lotes**
- id, tenant_id, medicamento_id
- numero_lote, fecha_caducidad
- cantidad_inicial, cantidad_actual
- precio_compra
- created_at
**veterinaria.dispensaciones**
- id, tenant_id
- receta_id, medicamento_id, lote_id
- mascota_id, veterinario_id
- cantidad, fecha
- notas
## Endpoints API
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /farmacia/medicamentos | Catalogo |
| GET | /farmacia/medicamentos/:id | Detalle con stock |
| POST | /farmacia/medicamentos | Crear medicamento |
| PUT | /farmacia/medicamentos/:id | Actualizar |
| GET | /farmacia/lotes | Lotes activos |
| POST | /farmacia/lotes | Registrar lote |
| PUT | /farmacia/lotes/:id | Actualizar lote |
| POST | /farmacia/dispensar | Dispensar medicamento |
| GET | /farmacia/alertas/caducidad | Proximos a caducar |
| GET | /farmacia/alertas/stock | Stock bajo |
| GET | /farmacia/movimientos | Historial |
## Interfaz del Servicio
```typescript
interface FarmaciaService {
getMedicamentos(filters?: MedicamentoFilters): Promise<Medicamento[]>;
getMedicamentoById(id: string): Promise<MedicamentoConStock>;
getLotes(medicamentoId: string): Promise<Lote[]>;
registrarLote(data: RegistrarLote): Promise<Lote>;
dispensar(data: Dispensar): Promise<Dispensacion>;
getAlertasCaducidad(dias: number): Promise<LoteAlerta[]>;
getAlertasStock(): Promise<MedicamentoAlerta[]>;
}
interface MedicamentoConStock {
id: string;
nombre: string;
principioActivo: string;
presentacion: string;
stockTotal: number;
stockMinimo: number;
lotes: Lote[];
requiereReceta: boolean;
controlado: boolean;
}
interface Dispensar {
medicamentoId: string;
loteId: string;
mascotaId: string;
recetaId?: string;
veterinarioId: string;
cantidad: number;
notas?: string;
}
```
## Flujos
### Recepcion de Medicamentos
```
1. Llega pedido de proveedor
2. Verificar factura vs productos
3. Para cada producto:
- Buscar medicamento en catalogo
- Si no existe: crear
- Registrar lote:
* Numero de lote
* Fecha de caducidad
* Cantidad
* Precio de compra
4. Actualizar stock total
5. Guardar referencia a factura
```
### Dispensacion
```
1. Veterinario genera receta
2. Farmacia recibe receta
3. Verificar stock disponible
4. Seleccionar lote (FEFO: primero en caducar)
5. Descontar cantidad del lote
6. Registrar dispensacion
7. Si es controlado: registrar en bitacora
8. Agregar a cuenta del cliente
9. Entregar medicamento
```
### Alertas Automaticas
```
Diario (cron job):
1. Caducidad proxima:
- 30 dias: alerta amarilla
- 15 dias: alerta naranja
- 7 dias: alerta roja
- Vencido: bloquear dispensacion
2. Stock bajo:
- stock_actual <= stock_minimo
- Notificar a encargado
```
## Regla FEFO
```typescript
// First Expired, First Out
function seleccionarLote(medicamentoId: string, cantidad: number): Lote {
const lotes = await this.getLotes(medicamentoId)
.filter(l => l.cantidadActual >= cantidad)
.filter(l => l.fechaCaducidad > new Date())
.sort((a, b) => a.fechaCaducidad - b.fechaCaducidad);
if (lotes.length === 0) {
throw new Error('Stock insuficiente');
}
return lotes[0]; // Primero en caducar
}
```
## Medicamentos Controlados
```typescript
interface MedicamentoControlado {
medicamentoId: string;
requiereBitacora: true;
categoriaControlada: 'Fraccion II' | 'Fraccion III' | 'Fraccion IV';
registros: RegistroControlado[];
}
interface RegistroControlado {
fecha: Date;
tipoMovimiento: 'entrada' | 'salida';
cantidad: number;
lote: string;
recetaId?: string;
veterinarioId: string;
paciente: string; // nombre mascota + propietario
justificacion: string;
}
```
## Panel de Farmacia
```
┌─────────────────────────────────────────────────────────┐
│ FARMACIA - Dashboard │
├─────────────────────────────────────────────────────────┤
│ ⚠️ ALERTAS │
│ ├── 3 productos con stock bajo │
│ ├── 5 lotes caducan en 30 dias │
│ └── 2 lotes caducan en 7 dias │
├─────────────────────────────────────────────────────────┤
│ STOCK CRITICO │
│ │ Amoxicilina 500mg │ 5 unidades │ Min: 20 │
│ │ Meloxicam 1.5mg │ 10 unidades │ Min: 15 │
│ │ Complejo B inyectable │ 3 frascos │ Min: 10 │
├─────────────────────────────────────────────────────────┤
│ PROXIMOS A CADUCAR │
│ │ Dexametasona (Lote X123) │ Caduca: 15/01/2026 │
│ │ Enrofloxacina (Lote Y456)│ Caduca: 20/01/2026 │
└─────────────────────────────────────────────────────────┘
```
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| DDL medicamentos | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| DDL lotes | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| DDL dispensaciones | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| DDL movimientos | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| DDL bitacora | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| Funciones FEFO | Completado | `database/schemas/02-veterinaria-farmacia-ddl.sql` |
| farmacia.module.ts | Pendiente | `backend/modules/farmacia/` |
| FarmaciaPanel.tsx | Pendiente | `frontend/components/` |
| DispensarForm.tsx | Pendiente | `frontend/components/` |
## Dependencias
### Depende de
- VET-001 (Mascotas)
- clinica.prescriptions (erp-clinicas)
- Inventario base (erp-core)
### Bloquea a
- Dispensacion automatica
- Reportes de consumo
- Integracion proveedores
## Criterios de Aceptacion
- [ ] Catalogo de medicamentos
- [ ] Control de lotes
- [ ] Alertas de caducidad
- [ ] Alertas de stock bajo
- [ ] Dispensacion funciona
- [ ] FEFO se aplica
- [ ] Medicamentos controlados registran bitacora
## Notas
- DDL completado en Sprint 9 (2026-01-07)
- Incluye 5 tablas, 3 ENUMs, 3 funciones y 2 triggers
- Implementa regla FEFO (First Expired, First Out)
- Incluye bitacora para medicamentos controlados (COFEPRIS)
- Puede heredar de inventario base de erp-core
- Considerar integracion con modulo de compras
---
**Ultima actualizacion:** 2026-01-07 (Sprint 9)

View File

@ -0,0 +1,443 @@
---
# DATABASE INVENTORY - Clinica Veterinaria
# Version: 1.0.0
# Ultima actualizacion: 2026-01-07
proyecto: "clinica-veterinaria"
schema_principal: "veterinaria"
version_ddl: "1.0"
estado: "completado"
herencia:
vertical_padre: "erp-clinicas"
suite_core: "erp-core"
schemas_heredados:
- name: "auth"
desde: "erp-core"
- name: "tenants"
desde: "erp-core"
- name: "users"
desde: "erp-core"
- name: "clinica"
desde: "erp-clinicas"
tablas: ["doctors", "appointments", "consultations"]
enums:
- name: "sexo_animal"
values:
- "macho"
- "hembra"
- "desconocido"
- name: "estado_hospitalizacion"
values:
- "ingresado"
- "en_tratamiento"
- "estable"
- "critico"
- "alta"
- "fallecido"
catalogos:
- name: "especies"
descripcion: "Catalogo de especies animales"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "nombre: VARCHAR(50)"
- "nombre_cientifico: VARCHAR(100)"
- "descripcion: TEXT"
- "active: BOOLEAN"
- name: "razas"
descripcion: "Catalogo de razas por especie"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "especie_id: UUID FK"
- "nombre: VARCHAR(100)"
- "descripcion: TEXT"
- "tamanio_promedio: VARCHAR(20)"
- "peso_promedio_kg: NUMERIC(5,2)"
- "active: BOOLEAN"
- name: "vacunas"
descripcion: "Catalogo de vacunas veterinarias"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "nombre: VARCHAR(100)"
- "descripcion: TEXT"
- "especie_id: UUID FK"
- "laboratorio: VARCHAR(100)"
- "dosis_ml: NUMERIC(5,2)"
- "intervalo_refuerzo_dias: INTEGER"
- "es_obligatoria: BOOLEAN"
- "active: BOOLEAN"
tablas:
- name: "propietarios"
descripcion: "Propietarios/duenos de mascotas"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "partner_id: UUID FK (opcional)"
- "nombre: VARCHAR(100)"
- "apellidos: VARCHAR(100)"
- "telefono: VARCHAR(20)"
- "telefono_emergencia: VARCHAR(20)"
- "email: VARCHAR(100)"
- "direccion: TEXT"
- "rfc: VARCHAR(13)"
- "active: BOOLEAN"
indices:
- "idx_propietarios_tenant"
- "idx_propietarios_telefono"
- name: "mascotas"
descripcion: "Mascotas/pacientes de la clinica"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "propietario_id: UUID FK"
- "especie_id: UUID FK"
- "raza_id: UUID FK"
- "nombre: VARCHAR(100)"
- "sexo: veterinaria.sexo_animal"
- "fecha_nacimiento: DATE"
- "edad_aproximada: VARCHAR(50)"
- "color: VARCHAR(50)"
- "peso_kg: NUMERIC(6,2)"
- "numero_chip: VARCHAR(50)"
- "tiene_chip: BOOLEAN"
- "esterilizado: BOOLEAN"
- "fecha_esterilizacion: DATE"
- "alergias: TEXT"
- "condiciones_especiales: TEXT"
- "notas: TEXT"
- "foto_url: VARCHAR(255)"
- "active: BOOLEAN"
indices:
- "idx_mascotas_tenant"
- "idx_mascotas_propietario"
- "idx_mascotas_especie"
- "idx_mascotas_chip"
- name: "cartilla_vacunacion"
descripcion: "Historial de vacunacion de mascotas"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "mascota_id: UUID FK"
- "vacuna_id: UUID FK"
- "veterinario_id: UUID FK"
- "fecha_aplicacion: DATE"
- "fecha_proximo_refuerzo: DATE"
- "lote: VARCHAR(50)"
- "laboratorio: VARCHAR(100)"
- "observaciones: TEXT"
indices:
- "idx_cartilla_tenant"
- "idx_cartilla_mascota"
- "idx_cartilla_fecha"
- name: "desparasitaciones"
descripcion: "Historial de desparasitaciones"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "mascota_id: UUID FK"
- "veterinario_id: UUID FK"
- "tipo: VARCHAR(50)"
- "producto: VARCHAR(100)"
- "dosis: VARCHAR(50)"
- "via_administracion: VARCHAR(50)"
- "fecha_aplicacion: DATE"
- "fecha_proxima: DATE"
- "observaciones: TEXT"
indices:
- "idx_desparasitaciones_tenant"
- "idx_desparasitaciones_mascota"
- name: "hospitalizacion"
descripcion: "Registro de hospitalizaciones"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "mascota_id: UUID FK"
- "veterinario_id: UUID FK"
- "consultation_id: UUID FK"
- "fecha_ingreso: TIMESTAMPTZ"
- "motivo_ingreso: TEXT"
- "diagnostico_ingreso: TEXT"
- "area: VARCHAR(50)"
- "numero_jaula: VARCHAR(20)"
- "estado: veterinaria.estado_hospitalizacion"
- "fecha_alta: TIMESTAMPTZ"
- "diagnostico_alta: TEXT"
- "instrucciones_alta: TEXT"
indices:
- "idx_hospitalizacion_tenant"
- "idx_hospitalizacion_mascota"
- "idx_hospitalizacion_estado"
- name: "hospitalizacion_monitoreo"
descripcion: "Monitoreo durante hospitalizacion"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "hospitalizacion_id: UUID FK"
- "fecha_hora: TIMESTAMPTZ"
- "peso_kg: NUMERIC(6,2)"
- "temperatura: NUMERIC(4,1)"
- "frecuencia_cardiaca: INTEGER"
- "frecuencia_respiratoria: INTEGER"
- "comio: BOOLEAN"
- "bebio_agua: BOOLEAN"
- "orino: BOOLEAN"
- "defeco: BOOLEAN"
- "consistencia_heces: VARCHAR(50)"
- "estado_animo: VARCHAR(50)"
- "nivel_dolor: INTEGER (0-10)"
- "observaciones: TEXT"
- "registrado_por: UUID FK"
indices:
- "idx_hospitalizacion_monitoreo_hosp"
- name: "estetica"
descripcion: "Servicios de estetica/grooming"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "mascota_id: UUID FK"
- "estilista_id: UUID FK"
- "fecha_servicio: TIMESTAMPTZ"
- "servicios: TEXT[]"
- "tipo_corte: VARCHAR(50)"
- "shampoo_usado: VARCHAR(100)"
- "estado: VARCHAR(20)"
- "hora_inicio: TIME"
- "hora_fin: TIME"
- "observaciones: TEXT"
- "observaciones_piel: TEXT"
- "precio: NUMERIC(10,2)"
indices:
- "idx_estetica_tenant"
- "idx_estetica_mascota"
- "idx_estetica_fecha"
extensiones_clinica:
tabla: "clinica.consultations"
columnas_agregadas:
- "mascota_id: UUID FK"
- "peso_actual: NUMERIC(6,2)"
- "temperatura: NUMERIC(4,1)"
# ============================================================================
# FARMACIA (VET-006) - Agregado 2026-01-07
# ============================================================================
enums_farmacia:
- name: "categoria_medicamento"
values:
- "antibiotico"
- "antiparasitario"
- "analgesico"
- "antiinflamatorio"
- "vacuna"
- "vitamina"
- "dermatologico"
- "oftalmico"
- "cardiaco"
- "digestivo"
- "otro"
- name: "tipo_movimiento_farmacia"
values:
- "entrada"
- "salida"
- "ajuste_positivo"
- "ajuste_negativo"
- "devolucion"
- "merma"
- name: "fraccion_controlada"
values:
- "no_controlado"
- "fraccion_i"
- "fraccion_ii"
- "fraccion_iii"
- "fraccion_iv"
tablas_farmacia:
- name: "medicamentos"
descripcion: "Catalogo de medicamentos veterinarios"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "codigo: VARCHAR(50)"
- "nombre: VARCHAR(150)"
- "nombre_comercial: VARCHAR(150)"
- "principio_activo: VARCHAR(200)"
- "categoria: veterinaria.categoria_medicamento"
- "presentacion: VARCHAR(100)"
- "concentracion: VARCHAR(50)"
- "contenido: VARCHAR(50)"
- "laboratorio: VARCHAR(100)"
- "requiere_receta: BOOLEAN"
- "controlado: BOOLEAN"
- "fraccion_controlada: veterinaria.fraccion_controlada"
- "stock_minimo: INTEGER"
- "stock_actual: INTEGER"
- "precio_compra: NUMERIC(10,2)"
- "precio_venta: NUMERIC(10,2)"
- "especies_aplicables: UUID[]"
- "active: BOOLEAN"
indices:
- "idx_medicamentos_tenant"
- "idx_medicamentos_codigo"
- "idx_medicamentos_nombre"
- "idx_medicamentos_categoria"
- "idx_medicamentos_controlado"
- "idx_medicamentos_stock_bajo"
- name: "medicamentos_lotes"
descripcion: "Lotes de medicamentos con control de caducidad"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "medicamento_id: UUID FK"
- "numero_lote: VARCHAR(50)"
- "fecha_caducidad: DATE"
- "cantidad_inicial: INTEGER"
- "cantidad_actual: INTEGER"
- "precio_compra: NUMERIC(10,2)"
- "factura_compra: VARCHAR(50)"
- "proveedor: VARCHAR(100)"
- "fecha_recepcion: DATE"
- "bloqueado: BOOLEAN"
- "motivo_bloqueo: TEXT"
indices:
- "idx_lotes_tenant"
- "idx_lotes_medicamento"
- "idx_lotes_caducidad"
- "idx_lotes_numero"
- "idx_lotes_proximos_caducar"
- name: "dispensaciones"
descripcion: "Registro de dispensacion de medicamentos"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "medicamento_id: UUID FK"
- "lote_id: UUID FK"
- "mascota_id: UUID FK"
- "veterinario_id: UUID FK"
- "receta_id: UUID FK"
- "consultation_id: UUID FK"
- "cantidad: INTEGER"
- "fecha_dispensacion: TIMESTAMPTZ"
- "dosis: VARCHAR(100)"
- "duracion_tratamiento: VARCHAR(50)"
- "instrucciones: TEXT"
- "dispensado_por: UUID FK"
- "notas: TEXT"
indices:
- "idx_dispensaciones_tenant"
- "idx_dispensaciones_medicamento"
- "idx_dispensaciones_mascota"
- "idx_dispensaciones_fecha"
- "idx_dispensaciones_veterinario"
- name: "movimientos_farmacia"
descripcion: "Kardex de movimientos de inventario de farmacia"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "medicamento_id: UUID FK"
- "lote_id: UUID FK"
- "tipo: veterinaria.tipo_movimiento_farmacia"
- "cantidad: INTEGER"
- "stock_anterior: INTEGER"
- "stock_posterior: INTEGER"
- "referencia_tipo: VARCHAR(50)"
- "referencia_id: UUID"
- "motivo: TEXT"
- "documento: VARCHAR(100)"
- "usuario_id: UUID FK"
indices:
- "idx_movimientos_tenant"
- "idx_movimientos_medicamento"
- "idx_movimientos_fecha"
- name: "bitacora_controlados"
descripcion: "Bitacora de medicamentos controlados (COFEPRIS)"
rls: true
columnas:
- "id: UUID PK"
- "tenant_id: UUID FK"
- "medicamento_id: UUID FK"
- "lote_id: UUID FK"
- "dispensacion_id: UUID FK"
- "tipo_movimiento: veterinaria.tipo_movimiento_farmacia"
- "cantidad: INTEGER"
- "mascota_id: UUID FK"
- "propietario_nombre: VARCHAR(200)"
- "receta_id: UUID FK"
- "veterinario_id: UUID FK"
- "veterinario_cedula: VARCHAR(50)"
- "justificacion: TEXT"
- "diagnostico: TEXT"
- "fecha_registro: TIMESTAMPTZ"
- "registrado_por: UUID FK"
- "ip_address: VARCHAR(45)"
indices:
- "idx_bitacora_tenant"
- "idx_bitacora_medicamento"
- "idx_bitacora_fecha"
funciones_farmacia:
- name: "get_lotes_proximos_caducar(tenant_id, dias)"
descripcion: "Obtiene lotes que caducaran en los proximos N dias"
- name: "get_medicamentos_stock_bajo(tenant_id)"
descripcion: "Obtiene medicamentos con stock igual o menor al minimo"
- name: "seleccionar_lote_fefo(medicamento_id, cantidad)"
descripcion: "Selecciona el lote con fecha de caducidad mas proxima (FEFO)"
triggers_farmacia:
- name: "trg_actualizar_stock"
tabla: "medicamentos_lotes"
descripcion: "Actualiza stock_actual en medicamentos cuando cambian los lotes"
- name: "trg_registrar_dispensacion"
tabla: "dispensaciones"
descripcion: "Registra movimiento y bitacora al dispensar medicamentos"
resumen:
total_enums: 5
total_catalogos: 3
total_tablas: 12
total_con_rls: 15
total_funciones: 3
total_triggers: 2
archivos_ddl:
- "database/schemas/01-veterinaria-schema-ddl.sql"
- "database/schemas/02-veterinaria-farmacia-ddl.sql"
archivos_seeds:
- "database/seeds/fase8/01-veterinaria-catalogos.sql"
ultima_actualizacion: "2026-01-07"
actualizado_por: "Orquestador Workspace (Sprint 9)"

View File

@ -0,0 +1,224 @@
# Reporte de Ejecucion - Sprint 7
## Clinica Veterinaria Documentation
**Fecha:** 2026-01-07
**Ejecutor:** Claude Opus 4.5 (Orquestador Workspace)
**Framework:** NEXUS v4.0 + SIMCO v2.5
---
## Resumen Ejecutivo
Sprint 7 completado exitosamente. Se documentaron los 6 modulos especializados del sistema de clinica veterinaria con especificaciones tecnicas completas, modelo de datos, endpoints API, flujos, y criterios de aceptacion.
## Tareas Ejecutadas
| ID | Tarea | Estado | Resultado |
|----|-------|--------|-----------|
| S7.1 | Explorar estructura | ✅ Completado | Proyecto analizado |
| S7.2 | Crear inventarios | ✅ Completado | DATABASE_INVENTORY.yml |
| S7.3 | Crear epicas modulos | ✅ Completado | 6 epicas |
| S7.4 | Validar Sprint 7 | ✅ Completado | Este reporte |
## Proyecto Analizado
### Informacion General
| Campo | Valor |
|-------|-------|
| Proyecto | clinica-veterinaria |
| Tipo | ERP Especializado (Vertical) |
| Base | erp-clinicas |
| Suite Core | erp-core |
| Estado | Database completado, Backend pendiente |
### Herencia
```
erp-core
└── erp-clinicas
└── clinica-veterinaria (VET-001 a VET-006)
```
**Modulos heredados:**
- auth, users, tenants, roles (erp-core)
- doctors, appointments, consultations (erp-clinicas)
## Archivos Creados
### Inventarios (1 archivo)
| Archivo | Ubicacion | Contenido |
|---------|-----------|-----------|
| DATABASE_INVENTORY.yml | orchestration/inventarios/ | 2 ENUMs, 3 catalogos, 7 tablas |
### Epicas (6 archivos)
| Archivo | Modulo | Estado DDL | Fase |
|---------|--------|------------|------|
| VET-001-mascotas-propietarios.md | Mascotas + Propietarios | Completado | 1 - Core |
| VET-002-vacunacion.md | Cartilla Vacunacion | Completado | 2 - Vacunacion |
| VET-003-desparasitaciones.md | Desparasitaciones | Completado | 2 - Vacunacion |
| VET-004-hospitalizacion.md | Hospitalizacion | Completado | 3 - Hospitalizacion |
| VET-005-estetica.md | Estetica/Grooming | Completado | 4 - Servicios |
| VET-006-farmacia.md | Farmacia Veterinaria | Pendiente | 2 - Vacunacion |
## Modelo de Datos Documentado
### Schema: veterinaria
**ENUMs:**
| Nombre | Valores |
|--------|---------|
| sexo_animal | macho, hembra, desconocido |
| estado_hospitalizacion | ingresado, en_tratamiento, estable, critico, alta, fallecido |
**Catalogos:**
| Tabla | Descripcion |
|-------|-------------|
| especies | Catalogo de especies animales |
| razas | Razas por especie |
| vacunas | Vacunas veterinarias |
**Tablas Principales:**
| Tabla | Descripcion | RLS |
|-------|-------------|-----|
| propietarios | Duenos de mascotas | Si |
| mascotas | Pacientes veterinarios | Si |
| cartilla_vacunacion | Historial de vacunas | Si |
| desparasitaciones | Historial desparasitaciones | Si |
| hospitalizacion | Registro de internados | Si |
| hospitalizacion_monitoreo | Signos vitales | Si |
| estetica | Servicios grooming | Si |
## Especies Documentadas
| Especie | Codigo | Vacunas Tipicas |
|---------|--------|-----------------|
| Canino | CAN | Quintuple, Rabia, Bordetella |
| Felino | FEL | Triple Felina, Leucemia, Rabia |
| Ave | AVE | Variable |
| Reptil | REP | Sin estandar |
| Roedor | ROE | Sin estandar |
| Exotico | EXO | Segun especie |
## Signos Vitales por Especie
| Especie | Temperatura | FC | FR |
|---------|-------------|-----|-----|
| Canino | 38-39°C | 60-120 lpm | 10-30 rpm |
| Felino | 38-39°C | 120-180 lpm | 20-40 rpm |
| Conejo | 38.5-40°C | 130-325 lpm | 30-60 rpm |
## Endpoints Documentados
| Modulo | Endpoints |
|--------|-----------|
| Mascotas | 12 endpoints |
| Propietarios | 6 endpoints |
| Vacunacion | 10 endpoints |
| Desparasitaciones | 6 endpoints |
| Hospitalizacion | 9 endpoints |
| Estetica | 8 endpoints |
| Farmacia | 11 endpoints |
| **Total** | **62 endpoints** |
## Cobertura por Fase
```
Fase 1 - Core: 1 modulo (VET-001)
Fase 2 - Vacunacion: 3 modulos (VET-002, VET-003, VET-006)
Fase 3 - Hospitalizacion:1 modulo (VET-004)
Fase 4 - Servicios: 1 modulo (VET-005)
```
## Dependencias Entre Modulos
```
VET-001 (Mascotas + Propietarios)
├── VET-002 (Vacunacion)
│ └── Reportes SENASICA
├── VET-003 (Desparasitaciones)
├── VET-004 (Hospitalizacion)
│ └── hospitalizacion_monitoreo
├── VET-005 (Estetica)
└── VET-006 (Farmacia)
└── Dispensacion
```
## Integraciones Documentadas
| Sistema | Proposito | Prioridad |
|---------|-----------|-----------|
| SENASICA | Reportes vacunacion | P1 |
| Laboratorios | Resultados analisis | P1 |
| Proveedores | Pedidos medicamentos | P2 |
| CFDI 4.0 | Facturacion electronica | P1 |
| WhatsApp/SMS | Recordatorios | P2 |
## Validacion de Calidad
### Checklist SIMCO
| Criterio | Status |
|----------|--------|
| Metadata completa | ✅ |
| Objetivos definidos | ✅ |
| Alcance claro | ✅ |
| Modelo de datos | ✅ |
| Endpoints documentados | ✅ |
| Interfaz de servicio | ✅ |
| Flujos principales | ✅ |
| Dependencias mapeadas | ✅ |
| Criterios de aceptacion | ✅ |
### Observaciones
- VET-006 (Farmacia) no tiene DDL aun - se propuso estructura
- Esquemas de vacunacion documentados por especie
- Signos vitales normales por especie incluidos
## Archivos DDL Existentes
| Archivo | Lineas | Estado |
|---------|--------|--------|
| database/schemas/01-veterinaria-schema-ddl.sql | 388 | Completado |
| database/seeds/fase8/01-veterinaria-catalogos.sql | - | Referenciado |
## Metricas del Sprint
| Metrica | Valor |
|---------|-------|
| Archivos creados | 7 (1 inventario + 6 epicas) |
| Lineas documentadas | ~3,200 |
| Endpoints especificados | 62 |
| Tablas documentadas | 10 |
| ENUMs documentados | 2 |
| Especies soportadas | 7 |
## Proximos Pasos
1. **Sprint 8:** Consolidacion y validacion final
2. **Implementacion DDL:** VET-006 Farmacia
3. **Backend:** Modulos VET-001 a VET-006
4. **Integracion:** SENASICA automatizado
## Comparativa con clinica-dental
| Aspecto | clinica-dental | clinica-veterinaria |
|---------|----------------|---------------------|
| Pacientes | Humanos (odontogramas) | Animales (multi-especie) |
| Catalogos | Piezas dentales FDI | Especies, razas, vacunas |
| Especialidades | Ortodoncia, Protesis | Hospitalizacion, Estetica |
| Integraciones | Laboratorio dental | SENASICA, Laboratorios |
| Tablas DDL | 11 | 10 |
| Endpoints | 56 | 62 |
---
**Sprint 7 Completado:** 2026-01-07
**Validado por:** Orquestador Workspace (NEXUS v4.0)