clinica-veterinaria/docs/02-definicion-modulos/modulo-mascotas.md
rckrdmrd 2b5c1d7e3f feat: Add orchestration configuration and project documentation
- Add CONTEXT-MAP.yml and PROJECT-STATUS.md
- Add _MAP.md for documentation index
- Update orchestration structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:40:58 -06:00

698 lines
15 KiB
Markdown

# Modulo Mascotas
**Proyecto:** clinica-veterinaria
**Modulo:** VET-001
**Prioridad:** P1 - Core
**Estado:** Especificacion
**Fecha:** 2026-01-07
---
## 1. DESCRIPCION GENERAL
El modulo de Mascotas es el nucleo del sistema veterinario. Gestiona el registro de pacientes animales, su vinculacion con propietarios, datos clinicos basicos y seguimiento de peso/estado.
### Proposito
- Registro completo de datos de cada mascota
- Vinculacion con propietarios (1 o multiples)
- Historial de pesos y mediciones
- Identificacion por microchip
- Base para expediente clinico
### Alcance
- Multiples especies (canino, felino, aves, exoticos)
- Razas por especie
- Datos de identificacion (microchip)
- Estado reproductivo (esterilizado/entero)
- Fotos de identificacion
- Estados (activo, fallecido, perdido)
---
## 2. ENTIDADES
### 2.1 especie
```yaml
tabla: veterinaria.especies
descripcion: "Catalogo de especies soportadas"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: codigo
tipo: VARCHAR(10)
unique: true
not_null: true
descripcion: "CAN, FEL, AVE, REP, ROE, PEZ, EXO"
- nombre: nombre
tipo: VARCHAR(100)
not_null: true
descripcion: "Canino, Felino, Ave, etc"
- nombre: nombre_cientifico
tipo: VARCHAR(200)
descripcion: "Nombre cientifico"
- nombre: tiene_vacunas
tipo: BOOLEAN
default: true
descripcion: "Si tiene esquema de vacunacion"
- nombre: activo
tipo: BOOLEAN
default: true
seeds:
- {codigo: 'CAN', nombre: 'Canino (Perro)', tiene_vacunas: true}
- {codigo: 'FEL', nombre: 'Felino (Gato)', tiene_vacunas: true}
- {codigo: 'AVE', nombre: 'Ave', tiene_vacunas: true}
- {codigo: 'REP', nombre: 'Reptil', tiene_vacunas: false}
- {codigo: 'ROE', nombre: 'Roedor', tiene_vacunas: false}
- {codigo: 'PEZ', nombre: 'Pez', tiene_vacunas: false}
- {codigo: 'EXO', nombre: 'Exotico', tiene_vacunas: true}
```
### 2.2 raza
```yaml
tabla: veterinaria.razas
descripcion: "Catalogo de razas por especie"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: especie_id
tipo: UUID
fk: veterinaria.especies(id)
not_null: true
- nombre: nombre
tipo: VARCHAR(100)
not_null: true
descripcion: "Nombre de la raza"
- nombre: tamano
tipo: ENUM
valores: ['miniatura', 'pequeno', 'mediano', 'grande', 'gigante']
descripcion: "Tamano tipico de la raza"
- nombre: peso_promedio_kg
tipo: DECIMAL(5,2)
descripcion: "Peso promedio adulto"
- nombre: esperanza_vida_anos
tipo: INTEGER
descripcion: "Anos de vida promedio"
- nombre: activo
tipo: BOOLEAN
default: true
indices:
- nombre: idx_raza_especie
campos: [especie_id]
- nombre: uk_raza_especie_nombre
campos: [especie_id, nombre]
unique: true
seeds_caninos:
- {nombre: 'Labrador Retriever', tamano: 'grande', peso_promedio: 30}
- {nombre: 'Pastor Aleman', tamano: 'grande', peso_promedio: 35}
- {nombre: 'Golden Retriever', tamano: 'grande', peso_promedio: 32}
- {nombre: 'Chihuahua', tamano: 'miniatura', peso_promedio: 2}
- {nombre: 'Bulldog Frances', tamano: 'pequeno', peso_promedio: 12}
- {nombre: 'Poodle', tamano: 'mediano', peso_promedio: 20}
- {nombre: 'Mestizo', tamano: 'mediano', peso_promedio: 15}
seeds_felinos:
- {nombre: 'Persa', tamano: 'mediano', peso_promedio: 5}
- {nombre: 'Siames', tamano: 'mediano', peso_promedio: 4}
- {nombre: 'Maine Coon', tamano: 'grande', peso_promedio: 8}
- {nombre: 'Comun Europeo', tamano: 'mediano', peso_promedio: 4}
- {nombre: 'Mestizo', tamano: 'mediano', peso_promedio: 4}
```
### 2.3 mascota
```yaml
tabla: veterinaria.mascotas
descripcion: "Registro de pacientes animales"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: tenant_id
tipo: UUID
not_null: true
descripcion: "Multi-tenant"
- nombre: nombre
tipo: VARCHAR(100)
not_null: true
descripcion: "Nombre de la mascota"
- nombre: especie_id
tipo: UUID
fk: veterinaria.especies(id)
not_null: true
- nombre: raza_id
tipo: UUID
fk: veterinaria.razas(id)
descripcion: "Raza (opcional si es mestizo)"
- nombre: sexo
tipo: ENUM
valores: ['macho', 'hembra']
not_null: true
- nombre: fecha_nacimiento
tipo: DATE
descripcion: "Fecha exacta o aproximada"
- nombre: fecha_nacimiento_aproximada
tipo: BOOLEAN
default: false
descripcion: "Si la fecha es aproximada"
- nombre: color
tipo: VARCHAR(100)
descripcion: "Color de pelaje/plumaje"
- nombre: peso_actual_kg
tipo: DECIMAL(6,2)
descripcion: "Ultimo peso registrado"
- nombre: peso_fecha
tipo: DATE
descripcion: "Fecha del ultimo peso"
- nombre: microchip
tipo: VARCHAR(50)
unique: true
descripcion: "Numero de microchip"
- nombre: microchip_fecha
tipo: DATE
descripcion: "Fecha de colocacion"
- nombre: esterilizado
tipo: BOOLEAN
default: false
- nombre: fecha_esterilizacion
tipo: DATE
- nombre: foto_url
tipo: VARCHAR(500)
descripcion: "URL de foto principal"
- nombre: caracteristicas_especiales
tipo: TEXT
descripcion: "Marcas, cicatrices, etc"
- nombre: alergias
tipo: TEXT[]
descripcion: "Lista de alergias conocidas"
- nombre: condiciones_cronicas
tipo: TEXT[]
descripcion: "Enfermedades cronicas"
- nombre: estado
tipo: ENUM
valores: ['activo', 'fallecido', 'perdido', 'dado_de_baja', 'referido']
default: 'activo'
- nombre: fecha_fallecimiento
tipo: DATE
- nombre: causa_fallecimiento
tipo: TEXT
- nombre: notas
tipo: TEXT
descripcion: "Observaciones generales"
- nombre: created_at
tipo: TIMESTAMP
default: NOW()
- nombre: updated_at
tipo: TIMESTAMP
indices:
- nombre: idx_mascota_tenant
campos: [tenant_id]
- nombre: idx_mascota_especie
campos: [especie_id]
- nombre: idx_mascota_microchip
campos: [microchip]
where: "microchip IS NOT NULL"
- nombre: idx_mascota_nombre
campos: [tenant_id, nombre]
rls:
- policy: "tenant_isolation"
using: "tenant_id = current_tenant_id()"
```
### 2.4 mascota_propietario
```yaml
tabla: veterinaria.mascotas_propietarios
descripcion: "Relacion N:M entre mascotas y propietarios"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: mascota_id
tipo: UUID
fk: veterinaria.mascotas(id)
not_null: true
on_delete: CASCADE
- nombre: propietario_id
tipo: UUID
fk: veterinaria.propietarios(id)
not_null: true
on_delete: CASCADE
- nombre: es_principal
tipo: BOOLEAN
default: false
descripcion: "Si es el propietario principal"
- nombre: parentesco
tipo: VARCHAR(50)
descripcion: "Relacion: dueno, familiar, cuidador"
- nombre: fecha_desde
tipo: DATE
default: CURRENT_DATE
- nombre: fecha_hasta
tipo: DATE
descripcion: "Si dejo de ser propietario"
- nombre: activo
tipo: BOOLEAN
default: true
indices:
- nombre: uk_mascota_propietario
campos: [mascota_id, propietario_id]
unique: true
- nombre: idx_mp_propietario
campos: [propietario_id]
```
### 2.5 historial_peso
```yaml
tabla: veterinaria.historial_pesos
descripcion: "Registro historico de pesos"
campos:
- nombre: id
tipo: UUID
pk: true
- nombre: mascota_id
tipo: UUID
fk: veterinaria.mascotas(id)
not_null: true
on_delete: CASCADE
- nombre: peso_kg
tipo: DECIMAL(6,2)
not_null: true
- nombre: fecha_registro
tipo: TIMESTAMP
default: NOW()
- nombre: registrado_por
tipo: UUID
fk: core.usuarios(id)
- nombre: notas
tipo: TEXT
descripcion: "Observaciones (dieta, enfermedad, etc)"
indices:
- nombre: idx_historial_peso_mascota
campos: [mascota_id]
- nombre: idx_historial_peso_fecha
campos: [mascota_id, fecha_registro DESC]
```
---
## 3. API ENDPOINTS
### Mascotas
```yaml
endpoints:
- method: GET
path: /api/v1/mascotas
descripcion: "Listar mascotas del tenant"
query:
especie: string (filtro)
estado: string (filtro)
propietario_id: string (filtro)
search: string (nombre, microchip)
page: number
limit: number
response: PaginatedResponse<Mascota>
- method: GET
path: /api/v1/mascotas/{id}
descripcion: "Obtener mascota por ID"
response: Mascota con propietarios y ultimo peso
- method: POST
path: /api/v1/mascotas
descripcion: "Registrar nueva mascota"
body:
nombre: string (requerido)
especie_id: string (requerido)
raza_id: string (opcional)
sexo: string (requerido)
fecha_nacimiento: date (opcional)
color: string
peso_kg: number
microchip: string
esterilizado: boolean
propietario_id: string (requerido, al menos uno)
foto_url: string
notas: string
response: Mascota creada
- method: PUT
path: /api/v1/mascotas/{id}
descripcion: "Actualizar datos de mascota"
body: Campos actualizables
response: Mascota actualizada
- method: PATCH
path: /api/v1/mascotas/{id}/estado
descripcion: "Cambiar estado (fallecido, perdido, etc)"
body:
estado: string
fecha: date
motivo: string
response: Mascota actualizada
- method: DELETE
path: /api/v1/mascotas/{id}
descripcion: "Dar de baja mascota (soft delete)"
response: 204 No Content
```
### Busqueda por Microchip
```yaml
- method: GET
path: /api/v1/mascotas/microchip/{numero}
descripcion: "Buscar por numero de microchip"
response: Mascota o 404
```
### Historial de Peso
```yaml
- method: GET
path: /api/v1/mascotas/{id}/pesos
descripcion: "Historial de pesos"
query:
desde: date
hasta: date
response: Array de registros de peso
- method: POST
path: /api/v1/mascotas/{id}/pesos
descripcion: "Registrar nuevo peso"
body:
peso_kg: number (requerido)
notas: string
response: Registro de peso + mascota actualizada
```
### Propietarios de Mascota
```yaml
- method: GET
path: /api/v1/mascotas/{id}/propietarios
descripcion: "Propietarios vinculados"
response: Array de propietarios
- method: POST
path: /api/v1/mascotas/{id}/propietarios
descripcion: "Vincular propietario adicional"
body:
propietario_id: string
es_principal: boolean
parentesco: string
response: Relacion creada
- method: DELETE
path: /api/v1/mascotas/{id}/propietarios/{propietarioId}
descripcion: "Desvincular propietario"
response: 204 No Content
```
---
## 4. FLUJOS DE USUARIO
### 4.1 Registro de Nueva Mascota
```
1. Recepcionista busca propietario existente o lo crea
2. Click en "Nueva Mascota"
3. Formulario de datos basicos:
- Nombre
- Especie (dropdown)
- Raza (dropdown filtrado por especie)
- Sexo
- Fecha nacimiento (con checkbox "aproximada")
- Color
- Peso actual
4. Datos de identificacion:
- Microchip (si tiene)
- Esterilizado (si/no + fecha)
5. Foto (opcional)
6. Notas adicionales
7. Guardar
8. Sistema vincula con propietario automaticamente
```
### 4.2 Busqueda de Mascota
```
1. Campo de busqueda en header
2. Escribir nombre, microchip o nombre de propietario
3. Resultados en tiempo real
4. Click en resultado para abrir expediente
5. Alternativa: Escanear codigo de microchip
```
### 4.3 Registro de Peso en Consulta
```
1. Al iniciar consulta, sistema pide peso
2. Auxiliar pesa a la mascota
3. Ingresa peso en sistema
4. Sistema muestra grafica de historico
5. Alerta si hay variacion significativa (>10%)
6. Peso se asocia a la consulta
```
### 4.4 Fallecimiento de Mascota
```
1. Abrir expediente de mascota
2. Menu: "Cambiar estado" > "Fallecido"
3. Formulario:
- Fecha de fallecimiento
- Causa (libre o catalogo)
- Lugar (clinica, domicilio, otro)
- Notas
4. Confirmacion con mensaje de condolencias
5. Sistema actualiza estado
6. Mascota aparece en seccion "Inactivos"
```
---
## 5. COMPONENTES UI
### 5.1 MascotaCard
```typescript
interface MascotaCardProps {
mascota: Mascota;
showPropietario?: boolean;
onClick?: () => void;
}
// Muestra foto, nombre, especie, raza, edad
// Badge de estado (activo, fallecido, etc)
// Iconos de vacunas, alergias si aplica
```
### 5.2 MascotaForm
```typescript
interface MascotaFormProps {
mascota?: Mascota; // Para edicion
propietarioId?: string; // Precarga propietario
onSave: (mascota: Mascota) => void;
onCancel: () => void;
}
// Wizard de pasos o formulario largo
// Validaciones en tiempo real
// Preview de foto
```
### 5.3 PesoChart
```typescript
interface PesoChartProps {
mascotaId: string;
periodoMeses?: number;
}
// Grafica de linea con historico de peso
// Linea de peso ideal segun raza
// Tooltips con fechas y valores
```
### 5.4 MascotaExpediente
```typescript
interface MascotaExpedienteProps {
mascotaId: string;
}
// Vista completa del expediente
// Tabs: Datos, Vacunas, Consultas, Hospitalizaciones
// Timeline de eventos
```
---
## 6. VALIDACIONES
### Reglas de Negocio
```yaml
validaciones:
- regla: "Microchip unico en el tenant"
condicion: microchip duplicado
error: "Este numero de microchip ya esta registrado"
- regla: "Raza debe corresponder a especie"
condicion: raza.especie_id != mascota.especie_id
error: "La raza seleccionada no corresponde a la especie"
- regla: "Fecha nacimiento no puede ser futura"
condicion: fecha_nacimiento > today()
error: "La fecha de nacimiento no puede ser en el futuro"
- regla: "Peso debe ser positivo"
condicion: peso_kg <= 0
error: "El peso debe ser mayor a 0"
- regla: "Al menos un propietario"
condicion: propietarios.length == 0
error: "La mascota debe tener al menos un propietario"
- regla: "Solo un propietario principal"
condicion: propietarios.filter(p => p.es_principal).length > 1
error: "Solo puede haber un propietario principal"
```
---
## 7. CASOS DE USO
### CU-VET-001: Registro de Mascota Nueva
**Actor:** Recepcionista / Veterinario
**Precondición:** Propietario registrado en sistema
**Flujo:**
1. Seleccionar propietario
2. Click "Nueva Mascota"
3. Completar datos obligatorios
4. Agregar foto (opcional)
5. Guardar
**Postcondición:** Mascota registrada, vinculada a propietario
### CU-VET-002: Busqueda por Microchip
**Actor:** Cualquier usuario
**Precondición:** Mascota con microchip registrado
**Flujo:**
1. Escanear o ingresar numero de microchip
2. Sistema busca en base de datos
3. Mostrar mascota encontrada
**Postcondición:** Acceso rapido al expediente
### CU-VET-003: Actualizacion de Peso
**Actor:** Auxiliar / Veterinario
**Precondición:** Mascota en consulta
**Flujo:**
1. Pesar mascota
2. Ingresar peso en sistema
3. Sistema calcula diferencia vs anterior
4. Mostrar alerta si variacion > 10%
5. Guardar con notas si aplica
**Postcondición:** Peso registrado, historial actualizado
---
## 8. DEPENDENCIAS
### Depende de
- `veterinaria.propietarios` - Duenos de mascotas
- `core.usuarios` - Quien registra
- `core.tenants` - Multi-tenant
### Dependientes
- `veterinaria.vacunaciones` - Cartilla de vacunas
- `veterinaria.consultas` - Historia clinica
- `veterinaria.hospitalizaciones` - Ingresos
- `veterinaria.facturas` - Facturacion
---
## 9. METRICAS
| Metrica | Descripcion | Query |
|---------|-------------|-------|
| Total mascotas | Mascotas activas | `WHERE estado = 'activo'` |
| Por especie | Distribucion | `GROUP BY especie_id` |
| Nuevas/mes | Registros mensuales | `WHERE created_at >= ?` |
| Tasa mortalidad | Fallecidos / total | Calculo |
---
**Documento creado:** 2026-01-07
**Autor:** Agente Orquestador Workspace
**Version:** 1.0.0