Use Cases
Este documento detalla los casos de uso implementados en el microservicio de Gestión de Reabastecimiento. Cada caso de uso representa una funcionalidad específica del sistema y está implementado siguiendo los principios de la arquitectura hexagonal.
Casos de Uso
Section titled “Casos de Uso”CreateRestocking
Section titled “CreateRestocking”Descripción: Crea una nueva solicitud de reabastecimiento para un producto.
Interfaz de Entrada:
interface InputCreateRestocking { productEan: string type: RestockingType level: RestockingLevel zone?: string}Interfaz de Salida:
interface OutputCreateRestocking { id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone?: string createdAt: Date updatedAt: Date}Flujo Principal:
- Valida los datos de entrada
- Obtiene información del producto a través del servicio de productos
- Crea una nueva entidad de reabastecimiento con estado “pendiente”
- Persiste la entidad en el repositorio
- Notifica a los observadores sobre la creación
- Retorna los datos de la solicitud creada
Reglas de Negocio:
- El producto debe existir en el catálogo
- No debe existir otra solicitud activa para el mismo producto y tipo
- El nivel de reabastecimiento debe ser válido
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento, Servicio de productos, Despachador de eventos
Excepciones:
ProductNotFoundError: Si el producto no existeDuplicateRestockingError: Si ya existe una solicitud activa para el mismo producto y tipoValidationError: Si los datos de entrada no son válidos
UpdateRestocking
Section titled “UpdateRestocking”Descripción: Actualiza una solicitud de reabastecimiento existente.
Interfaz de Entrada:
interface InputUpdateRestocking { id: string level?: RestockingLevel status?: RestockingStatus}Interfaz de Salida:
interface OutputUpdateRestocking { id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone?: string createdAt: Date updatedAt: Date}Flujo Principal:
- Valida los datos de entrada
- Busca la solicitud de reabastecimiento por ID
- Actualiza los campos especificados
- Persiste los cambios en el repositorio
- Notifica a los observadores sobre la actualización
- Retorna los datos actualizados
Reglas de Negocio:
- La solicitud debe existir
- Solo se pueden actualizar solicitudes que no estén completadas
- El nivel y estado deben ser válidos
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento, Despachador de eventos
Excepciones:
RestockingNotFoundError: Si la solicitud no existeRestockingCompletedError: Si la solicitud ya está completadaValidationError: Si los datos de entrada no son válidos
CompleteRestocking
Section titled “CompleteRestocking”Descripción: Marca una solicitud de reabastecimiento como completada.
Interfaz de Entrada:
interface InputCompleteRestocking { id: string}Interfaz de Salida:
interface OutputCompleteRestocking { id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone?: string createdAt: Date updatedAt: Date}Flujo Principal:
- Busca la solicitud de reabastecimiento por ID
- Verifica que la solicitud no esté ya completada
- Actualiza el estado a “completado”
- Persiste los cambios en el repositorio
- Notifica a los observadores sobre la finalización
- Retorna los datos actualizados
Reglas de Negocio:
- La solicitud debe existir
- No se puede completar una solicitud ya completada
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento, Despachador de eventos
Excepciones:
RestockingNotFoundError: Si la solicitud no existeRestockingCompletedError: Si la solicitud ya está completada
RestockRestocking
Section titled “RestockRestocking”Descripción: Registra un reabastecimiento parcial para una solicitud.
Interfaz de Entrada:
interface InputRestockRestocking { id: string entryId: string transactionId: string quantity: number restockedAt: Date}Interfaz de Salida:
interface OutputRestockRestocking { id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone?: string createdAt: Date updatedAt: Date}Flujo Principal:
- Valida los datos de entrada
- Busca la solicitud de reabastecimiento por ID
- Registra el reabastecimiento parcial
- Verifica si la solicitud debe marcarse como completada
- Persiste los cambios en el repositorio
- Notifica a los observadores sobre el reabastecimiento
- Retorna los datos actualizados
Reglas de Negocio:
- La solicitud debe existir
- No se puede reabastecer una solicitud ya completada
- La cantidad debe ser positiva
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento, Despachador de eventos
Excepciones:
RestockingNotFoundError: Si la solicitud no existeRestockingCompletedError: Si la solicitud ya está completadaValidationError: Si los datos de entrada no son válidos
UpdateZone
Section titled “UpdateZone”Descripción: Actualiza la zona de una solicitud de reabastecimiento.
Interfaz de Entrada:
interface InputUpdateZone { id: string zone: string}Interfaz de Salida:
interface OutputUpdateZone { id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone: string createdAt: Date updatedAt: Date}Flujo Principal:
- Valida los datos de entrada
- Busca la solicitud de reabastecimiento por ID
- Actualiza la zona
- Persiste los cambios en el repositorio
- Notifica a los observadores sobre la actualización
- Retorna los datos actualizados
Reglas de Negocio:
- La solicitud debe existir
- No se puede actualizar la zona de una solicitud completada
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento, Despachador de eventos
Excepciones:
RestockingNotFoundError: Si la solicitud no existeRestockingCompletedError: Si la solicitud ya está completadaValidationError: Si los datos de entrada no son válidos
CreateRestock
Section titled “CreateRestock”Descripción: Crea un nuevo registro de reabastecimiento.
Interfaz de Entrada:
interface InputCreateRestock { ean: string target: string source: string quantity: number user: string timestamp: Date alertId?: string}Interfaz de Salida:
interface OutputCreateRestock { id: string ean: string target: string source: string quantity: number user: string timestamp: Date alertId?: string level?: string zone?: string}Flujo Principal:
- Valida los datos de entrada
- Identifica el nivel de alerta si existe un alertId
- Identifica la zona basada en la ubicación
- Crea un nuevo registro de reabastecimiento
- Notifica el evento de reabastecimiento
- Retorna los datos del reabastecimiento creado
Reglas de Negocio:
- El producto debe existir
- La cantidad debe ser positiva
- Las ubicaciones deben ser válidas
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Servicio de eventos, Servicio de identificación de alertas, Servicio de identificación de zonas
Excepciones:
ProductNotFoundError: Si el producto no existeLocationNotFoundError: Si alguna ubicación no existeValidationError: Si los datos de entrada no son válidos
IdentifyAlert
Section titled “IdentifyAlert”Descripción: Identifica el nivel de alerta asociado a un ID de alerta.
Interfaz de Entrada:
interface InputIdentifyAlert { alertId: string}Interfaz de Salida:
interface OutputIdentifyAlert { level: string | null}Flujo Principal:
- Busca la alerta por ID
- Determina el nivel de alerta
- Retorna el nivel identificado
Reglas de Negocio:
- Si la alerta no existe, retorna null
Puertos y Adaptadores:
- Entrada: Caso de uso CreateRestock
- Salida: Repositorio de alertas
Excepciones: Ninguna específica
IdentifyZone
Section titled “IdentifyZone”Descripción: Identifica la zona basada en una ubicación.
Interfaz de Entrada:
interface InputIdentifyZone { location: string}Interfaz de Salida:
interface OutputIdentifyZone { zone: string | null}Flujo Principal:
- Busca la ubicación
- Determina la zona asociada
- Retorna la zona identificada
Reglas de Negocio:
- Si la ubicación no existe o no tiene zona asociada, retorna null
Puertos y Adaptadores:
- Entrada: Caso de uso CreateRestock
- Salida: Servicio de ubicaciones
Excepciones: Ninguna específica
FindRestockings
Section titled “FindRestockings”Descripción: Busca solicitudes de reabastecimiento según criterios específicos.
Interfaz de Entrada:
interface InputFindRestockings { productEan?: string type?: RestockingType level?: RestockingLevel status?: RestockingStatus zone?: string page?: number limit?: number}Interfaz de Salida:
interface OutputFindRestockings { items: Array<{ id: string productEan: string productSku: string productName: string | null type: RestockingType level: RestockingLevel status: RestockingStatus zone?: string createdAt: Date updatedAt: Date }> pagination: { page: number limit: number total: number pages: number }}Flujo Principal:
- Valida los parámetros de búsqueda
- Construye la consulta basada en los criterios
- Ejecuta la búsqueda en el repositorio
- Retorna los resultados paginados
Reglas de Negocio:
- Los parámetros de paginación deben ser válidos
- Los criterios de filtrado deben ser válidos
Puertos y Adaptadores:
- Entrada: Controlador HTTP
- Salida: Repositorio de reabastecimiento
Excepciones:
ValidationError: Si los parámetros de búsqueda no son válidos