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.
Contenedores
Section titled “Contenedores”CreateContainer
Section titled “CreateContainer”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:
- Validar el formato del nombre del contenedor
- Verificar que el almacén existe
- Si se proporciona una ubicación, verificar que existe
- Crear el contenedor en la base de datos
- Si se proporciona una ubicación, asociar el contenedor a la ubicación
- Notificar a los observadores sobre la creación del contenedor (para soporte legacy)
- 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 contenedorWarehouseRepository: Para verificar la existencia del almacénLocationRepository: Para verificar la existencia de la ubicaciónGenericSubject<Container>: Para notificar a los observadores
Excepciones:
InvalidContainerNameError: Si el nombre del contenedor no tiene el formato correctoWarehouseNotFoundError: Si el almacén no existeLocationNotFoundError: Si la ubicación no existeContainerAlreadyExistsError: Si ya existe un contenedor con el mismo nombre
DeleteContainer
Section titled “DeleteContainer”Descripción: Elimina un contenedor existente del sistema.
Interfaz de Entrada:
interface DeleteContainerInput { id: string}Interfaz de Salida:
interface DeleteContainerOutput { success: boolean}Flujo Principal:
- Verificar que el contenedor existe
- Eliminar el contenedor de la base de datos
- Notificar a los observadores sobre la eliminación del contenedor (para soporte legacy)
- 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 contenedorInventoryService: Para verificar si el contenedor contiene productosGenericSubject<Container>: Para notificar a los observadores
Excepciones:
ContainerNotFoundError: Si el contenedor no existeContainerBusyError: Si el contenedor contiene productos
UpdateContainer
Section titled “UpdateContainer”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:
- Verificar que el contenedor existe
- Si se proporciona una ubicación, verificar que existe
- Actualizar el contenedor en la base de datos
- Notificar a los observadores sobre la actualización del contenedor (para soporte legacy)
- 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 contenedorLocationRepository: Para verificar la existencia de la ubicaciónGenericSubject<Container>: Para notificar a los observadores
Excepciones:
ContainerNotFoundError: Si el contenedor no existeLocationNotFoundError: Si la ubicación no existe
Ubicaciones
Section titled “Ubicaciones”CreateLocation
Section titled “CreateLocation”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:
- Validar el formato del nombre de la ubicación
- Verificar que el almacén existe
- Crear la ubicación en la base de datos
- Notificar a los observadores sobre la creación de la ubicación (para soporte legacy)
- 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ónWarehouseRepository: Para verificar la existencia del almacénGenericSubject<Location>: Para notificar a los observadores
Excepciones:
InvalidLocationNameError: Si el nombre de la ubicación no tiene el formato correctoWarehouseNotFoundError: Si el almacén no existeLocationAlreadyExistsError: Si ya existe una ubicación con el mismo nombre
DeleteLocation
Section titled “DeleteLocation”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:
- Verificar que la ubicación existe
- Verificar que la ubicación no está ocupada (no contiene productos ni contenedores)
- Eliminar la ubicación de la base de datos
- 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ónContainerRepository: Para verificar si hay contenedores en la ubicaciónInventoryService: Para verificar si la ubicación contiene productos
Excepciones:
LocationNotFoundError: Si la ubicación no existeLocationBusyError: Si la ubicación contiene productos o contenedores
Almacenes
Section titled “Almacenes”CreateWarehouse
Section titled “CreateWarehouse”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:
- Validar el código del almacén
- Crear el almacén en la base de datos
- 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álidoWarehouseAlreadyExistsError: Si ya existe un almacén con el mismo código
DeleteWarehouse
Section titled “DeleteWarehouse”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:
- Verificar que el almacén existe
- Verificar que el almacén no tiene ubicaciones asociadas
- Eliminar el almacén de la base de datos
- 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énLocationRepository: Para verificar si hay ubicaciones en el almacén
Excepciones:
WarehouseNotFoundError: Si el almacén no existeWarehouseHasLocationsError: Si el almacén tiene ubicaciones asociadas