Skip to content

Use Cases

Este documento detalla los casos de uso implementados en el microservicio de Gestión de Ubicaciones. Los casos de uso representan las operaciones principales que el sistema puede realizar y están organizados por entidad de dominio: Contenedores, Ubicaciones y Almacenes.

Descripción: Crea un nuevo contenedor en el sistema.

Interfaz de Entrada:

interface CreateContainerInput {
name: string
warehouseCode: string
locationName?: string
country: string
}

Interfaz de Salida:

interface CreateContainerOutput {
id: string
name: string
warehouseCode: string
locationName?: string
country: string
createdAt: string
}

Flujo Principal:

  1. Validar el formato del nombre del contenedor
  2. Verificar que el almacén existe
  3. Si se proporciona una ubicación, verificar que existe
  4. Crear el contenedor en la base de datos
  5. Si se proporciona una ubicación, asociar el contenedor a la ubicación
  6. Notificar a los observadores sobre la creación del contenedor (para soporte legacy)
  7. Retornar los datos del contenedor creado

Reglas de Negocio:

  • El nombre del contenedor debe seguir el formato ^[A-Z]{2,3}-LPN-[0-9]{8}(_[0-9]+)?$
  • El almacén debe existir
  • Si se proporciona una ubicación, debe existir en el almacén especificado

Adaptadores Implicados:

  • ContainerRepository: Para persistir el contenedor
  • WarehouseRepository: Para verificar la existencia del almacén
  • LocationRepository: Para verificar la existencia de la ubicación
  • GenericSubject<Container>: Para notificar a los observadores

Excepciones:

  • InvalidContainerNameError: Si el nombre del contenedor no tiene el formato correcto
  • WarehouseNotFoundError: Si el almacén no existe
  • LocationNotFoundError: Si la ubicación no existe
  • ContainerAlreadyExistsError: Si ya existe un contenedor con el mismo nombre

Descripción: Elimina un contenedor existente del sistema.

Interfaz de Entrada:

interface DeleteContainerInput {
id: string
}

Interfaz de Salida:

interface DeleteContainerOutput {
success: boolean
}

Flujo Principal:

  1. Verificar que el contenedor existe
  2. Eliminar el contenedor de la base de datos
  3. Notificar a los observadores sobre la eliminación del contenedor (para soporte legacy)
  4. Retornar éxito

Reglas de Negocio:

  • El contenedor debe existir
  • No se puede eliminar un contenedor que contiene productos (verificado por el servicio de inventario)

Adaptadores Implicados:

  • ContainerRepository: Para eliminar el contenedor
  • InventoryService: Para verificar si el contenedor contiene productos
  • GenericSubject<Container>: Para notificar a los observadores

Excepciones:

  • ContainerNotFoundError: Si el contenedor no existe
  • ContainerBusyError: Si el contenedor contiene productos

Descripción: Actualiza la información de un contenedor existente, principalmente su ubicación.

Interfaz de Entrada:

interface UpdateContainerInput {
id: string
locationName?: string
}

Interfaz de Salida:

interface UpdateContainerOutput {
id: string
name: string
warehouseCode: string
locationName?: string
country: string
updatedAt: string
}

Flujo Principal:

  1. Verificar que el contenedor existe
  2. Si se proporciona una ubicación, verificar que existe
  3. Actualizar el contenedor en la base de datos
  4. Notificar a los observadores sobre la actualización del contenedor (para soporte legacy)
  5. Retornar los datos del contenedor actualizado

Reglas de Negocio:

  • El contenedor debe existir
  • Si se proporciona una ubicación, debe existir en el mismo almacén que el contenedor

Adaptadores Implicados:

  • ContainerRepository: Para actualizar el contenedor
  • LocationRepository: Para verificar la existencia de la ubicación
  • GenericSubject<Container>: Para notificar a los observadores

Excepciones:

  • ContainerNotFoundError: Si el contenedor no existe
  • LocationNotFoundError: Si la ubicación no existe

Descripción: Crea una nueva ubicación en el sistema.

Interfaz de Entrada:

interface CreateLocationInput {
name: string
warehouseCode: string
country: string
}

Interfaz de Salida:

interface CreateLocationOutput {
id: string
name: string
warehouseCode: string
country: string
createdAt: string
}

Flujo Principal:

  1. Validar el formato del nombre de la ubicación
  2. Verificar que el almacén existe
  3. Crear la ubicación en la base de datos
  4. Notificar a los observadores sobre la creación de la ubicación (para soporte legacy)
  5. Retornar los datos de la ubicación creada

Reglas de Negocio:

  • El nombre de la ubicación debe seguir el formato ^[A-Z]{2,3}-[A-Z]{2,4}(-[A-Z][0-9]{1,2})+(_[0-9]+)?$
  • El almacén debe existir

Adaptadores Implicados:

  • LocationRepository: Para persistir la ubicación
  • WarehouseRepository: Para verificar la existencia del almacén
  • GenericSubject<Location>: Para notificar a los observadores

Excepciones:

  • InvalidLocationNameError: Si el nombre de la ubicación no tiene el formato correcto
  • WarehouseNotFoundError: Si el almacén no existe
  • LocationAlreadyExistsError: Si ya existe una ubicación con el mismo nombre

Descripción: Elimina una ubicación existente del sistema.

Interfaz de Entrada:

interface DeleteLocationInput {
id: string
}

Interfaz de Salida:

interface DeleteLocationOutput {
success: boolean
}

Flujo Principal:

  1. Verificar que la ubicación existe
  2. Verificar que la ubicación no está ocupada (no contiene productos ni contenedores)
  3. Eliminar la ubicación de la base de datos
  4. Retornar éxito

Reglas de Negocio:

  • La ubicación debe existir
  • No se puede eliminar una ubicación que contiene productos o contenedores

Adaptadores Implicados:

  • LocationRepository: Para eliminar la ubicación
  • ContainerRepository: Para verificar si hay contenedores en la ubicación
  • InventoryService: Para verificar si la ubicación contiene productos

Excepciones:

  • LocationNotFoundError: Si la ubicación no existe
  • LocationBusyError: Si la ubicación contiene productos o contenedores

Descripción: Crea un nuevo almacén en el sistema.

Interfaz de Entrada:

interface CreateWarehouseInput {
code: string
name: string
country: string
}

Interfaz de Salida:

interface CreateWarehouseOutput {
id: string
code: string
name: string
country: string
createdAt: string
}

Flujo Principal:

  1. Validar el código del almacén
  2. Crear el almacén en la base de datos
  3. Retornar los datos del almacén creado

Reglas de Negocio:

  • El código del almacén debe ser único
  • El país debe ser válido (MX, BR, etc.)

Adaptadores Implicados:

  • WarehouseRepository: Para persistir el almacén

Excepciones:

  • InvalidWarehouseCodeError: Si el código del almacén no es válido
  • WarehouseAlreadyExistsError: Si ya existe un almacén con el mismo código

Descripción: Elimina un almacén existente del sistema.

Interfaz de Entrada:

interface DeleteWarehouseInput {
id: string
}

Interfaz de Salida:

interface DeleteWarehouseOutput {
success: boolean
}

Flujo Principal:

  1. Verificar que el almacén existe
  2. Verificar que el almacén no tiene ubicaciones asociadas
  3. Eliminar el almacén de la base de datos
  4. Retornar éxito

Reglas de Negocio:

  • El almacén debe existir
  • No se puede eliminar un almacén que tiene ubicaciones asociadas

Adaptadores Implicados:

  • WarehouseRepository: Para eliminar el almacén
  • LocationRepository: Para verificar si hay ubicaciones en el almacén

Excepciones:

  • WarehouseNotFoundError: Si el almacén no existe
  • WarehouseHasLocationsError: Si el almacén tiene ubicaciones asociadas