# 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; getMedicamentoById(id: string): Promise; getLotes(medicamentoId: string): Promise; registrarLote(data: RegistrarLote): Promise; dispensar(data: Dispensar): Promise; getAlertasCaducidad(dias: number): Promise; getAlertasStock(): Promise; } 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)