- 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>
444 lines
12 KiB
YAML
444 lines
12 KiB
YAML
---
|
|
# 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)"
|