Skip to content

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.

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:

  1. Valida los datos de entrada
  2. Obtiene información del producto a través del servicio de productos
  3. Crea una nueva entidad de reabastecimiento con estado “pendiente”
  4. Persiste la entidad en el repositorio
  5. Notifica a los observadores sobre la creación
  6. 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 existe
  • DuplicateRestockingError: Si ya existe una solicitud activa para el mismo producto y tipo
  • ValidationError: Si los datos de entrada no son válidos

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:

  1. Valida los datos de entrada
  2. Busca la solicitud de reabastecimiento por ID
  3. Actualiza los campos especificados
  4. Persiste los cambios en el repositorio
  5. Notifica a los observadores sobre la actualización
  6. 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 existe
  • RestockingCompletedError: Si la solicitud ya está completada
  • ValidationError: Si los datos de entrada no son válidos

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:

  1. Busca la solicitud de reabastecimiento por ID
  2. Verifica que la solicitud no esté ya completada
  3. Actualiza el estado a “completado”
  4. Persiste los cambios en el repositorio
  5. Notifica a los observadores sobre la finalización
  6. 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 existe
  • RestockingCompletedError: Si la solicitud ya está completada

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:

  1. Valida los datos de entrada
  2. Busca la solicitud de reabastecimiento por ID
  3. Registra el reabastecimiento parcial
  4. Verifica si la solicitud debe marcarse como completada
  5. Persiste los cambios en el repositorio
  6. Notifica a los observadores sobre el reabastecimiento
  7. 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 existe
  • RestockingCompletedError: Si la solicitud ya está completada
  • ValidationError: Si los datos de entrada no son válidos

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:

  1. Valida los datos de entrada
  2. Busca la solicitud de reabastecimiento por ID
  3. Actualiza la zona
  4. Persiste los cambios en el repositorio
  5. Notifica a los observadores sobre la actualización
  6. 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 existe
  • RestockingCompletedError: Si la solicitud ya está completada
  • ValidationError: Si los datos de entrada no son válidos

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:

  1. Valida los datos de entrada
  2. Identifica el nivel de alerta si existe un alertId
  3. Identifica la zona basada en la ubicación
  4. Crea un nuevo registro de reabastecimiento
  5. Notifica el evento de reabastecimiento
  6. 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 existe
  • LocationNotFoundError: Si alguna ubicación no existe
  • ValidationError: Si los datos de entrada no son válidos

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:

  1. Busca la alerta por ID
  2. Determina el nivel de alerta
  3. 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

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:

  1. Busca la ubicación
  2. Determina la zona asociada
  3. 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

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:

  1. Valida los parámetros de búsqueda
  2. Construye la consulta basada en los criterios
  3. Ejecuta la búsqueda en el repositorio
  4. 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