- 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>
289 lines
8.5 KiB
Markdown
289 lines
8.5 KiB
Markdown
# 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)
|