[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:
parent
2b5c1d7e3f
commit
c461208a51
464
database/schemas/02-veterinaria-farmacia-ddl.sql
Normal file
464
database/schemas/02-veterinaria-farmacia-ddl.sql
Normal 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
|
||||||
|
-- ============================================================================
|
||||||
258
docs/01-epicas/VET-001-mascotas-propietarios.md
Normal file
258
docs/01-epicas/VET-001-mascotas-propietarios.md
Normal 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
|
||||||
268
docs/01-epicas/VET-002-vacunacion.md
Normal file
268
docs/01-epicas/VET-002-vacunacion.md
Normal 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
|
||||||
222
docs/01-epicas/VET-003-desparasitaciones.md
Normal file
222
docs/01-epicas/VET-003-desparasitaciones.md
Normal 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
|
||||||
274
docs/01-epicas/VET-004-hospitalizacion.md
Normal file
274
docs/01-epicas/VET-004-hospitalizacion.md
Normal 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
|
||||||
250
docs/01-epicas/VET-005-estetica.md
Normal file
250
docs/01-epicas/VET-005-estetica.md
Normal 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
|
||||||
288
docs/01-epicas/VET-006-farmacia.md
Normal file
288
docs/01-epicas/VET-006-farmacia.md
Normal 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)
|
||||||
443
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
443
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal 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)"
|
||||||
224
orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md
Normal file
224
orchestration/trazas/REPORTE-EJECUCION-SPRINT7-2026-01-07.md
Normal 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)
|
||||||
Loading…
Reference in New Issue
Block a user