clinica-veterinaria/docs/01-epicas/VET-006-farmacia.md
rckrdmrd c461208a51 [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>
2026-01-10 08:53:42 -06:00

8.5 KiB

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

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

// 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

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)