Use Cases
Este documento detalla los casos de uso implementados en el microservicio de asignación de ubicaciones. Cada caso de uso representa una operación específica que puede realizar el sistema.
Casos de Uso
Section titled “Casos de Uso”CreateAssignment
Section titled “CreateAssignment”Descripción: Crea una nueva asignación de ubicaciones para un producto identificado por su EAN en un almacén específico.
Interfaz de Entrada:
interface CreateAssignmentParams { ean: Ean; locations?: LocationName[]; country: Country; warehouse: Warehouse;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Verifica que el producto exista utilizando el
ProductService - Si se proporcionan ubicaciones, verifica que todas existan utilizando el
LocationService - Verifica si ya existe una asignación para el EAN y almacén especificados
- Si ya existe, devuelve un error
AlreadyExistsAssignmentError - Si no existe, crea una nueva instancia de
Assignmentcon un ID generado - Guarda la asignación en el repositorio
- Notifica a los observadores sobre la nueva asignación
- Devuelve la asignación creada
Reglas de Negocio:
- Un producto solo puede tener una asignación por almacén
- Las ubicaciones deben existir en el almacén especificado
- El producto debe existir en el sistema
Puertos y Adaptadores:
- Puertos de Entrada:
CreateAssignment.invoke - Puertos de Salida:
AssignmentRepository.exists,AssignmentRepository.saveProductService.findLocationService.findIdGenerator.genAssignmentIdCalendar.nowInUtc
Excepciones:
AlreadyExistsAssignmentError: Cuando ya existe una asignación para el EAN y almacénProductNotFoundError: Cuando el producto no existeLocationNotFoundError: Cuando una ubicación no existe
AutoAssign
Section titled “AutoAssign”Descripción: Asigna automáticamente ubicaciones a un producto basándose en reglas predefinidas.
Interfaz de Entrada:
interface AutoAssignParams { ean: Ean; country: Country; warehouse: Warehouse;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Verifica que el producto exista utilizando el
ProductService - Obtiene ubicaciones recomendadas basadas en reglas de negocio
- Crea o actualiza la asignación con las ubicaciones recomendadas
- Notifica a los observadores sobre la asignación
- Devuelve la asignación actualizada
Reglas de Negocio:
- Las ubicaciones se asignan según reglas predefinidas
- Si ya existe una asignación, se actualiza en lugar de crear una nueva
Puertos y Adaptadores:
- Puertos de Entrada:
AutoAssign.invoke - Puertos de Salida:
AssignmentRepository.findByEan,AssignmentRepository.saveProductService.findCalendar.nowInUtc
Excepciones:
ProductNotFoundError: Cuando el producto no existe
FindAssignment
Section titled “FindAssignment”Descripción: Busca asignaciones según criterios específicos.
Interfaz de Entrada:
interface FindAssignmentParams { id?: string; ean?: Ean; warehouse?: Warehouse; country?: Country;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Valida los parámetros de búsqueda
- Busca la asignación en el repositorio según los criterios
- Si no se encuentra, devuelve un error
AssignmentNotFoundError - Si se encuentra, devuelve la asignación
Reglas de Negocio:
- Al menos uno de los criterios de búsqueda debe ser proporcionado
Puertos y Adaptadores:
- Puertos de Entrada:
FindAssignment.invoke - Puertos de Salida:
AssignmentRepository.find
Excepciones:
AssignmentNotFoundError: Cuando no se encuentra una asignación que cumpla con los criteriosInvalidParamsError: Cuando no se proporciona ningún criterio de búsqueda
FilterAssignments
Section titled “FilterAssignments”Descripción: Filtra y pagina asignaciones según criterios específicos.
Interfaz de Entrada:
interface FilterAssignmentsParams { ean?: Ean; warehouse?: Warehouse; country?: Country; page?: number; limit?: number;}Interfaz de Salida:
Either<BusinessError, PaginatedResult<Assignment>>Flujo Principal:
- Aplica los filtros proporcionados
- Pagina los resultados según los parámetros
pageylimit - Devuelve los resultados paginados
Reglas de Negocio:
- Los parámetros de paginación tienen valores predeterminados si no se proporcionan
Puertos y Adaptadores:
- Puertos de Entrada:
FilterAssignments.invoke - Puertos de Salida:
AssignmentRepository.filter
Excepciones:
- Errores generales de negocio
UpdateAssignmentState
Section titled “UpdateAssignmentState”Descripción: Actualiza el estado de una asignación existente.
Interfaz de Entrada:
interface UpdateAssignmentStateParams { id: string; state: AssignmentState;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Busca la asignación por ID
- Actualiza su estado
- Guarda la asignación actualizada
- Notifica a los observadores
- Devuelve la asignación actualizada
Reglas de Negocio:
- La asignación debe existir
- Las transiciones de estado deben ser válidas
Puertos y Adaptadores:
- Puertos de Entrada:
UpdateAssignmentState.invoke - Puertos de Salida:
AssignmentRepository.findById,AssignmentRepository.saveCalendar.nowInUtc
Excepciones:
AssignmentNotFoundError: Cuando la asignación no existeInvalidStateTransitionError: Cuando la transición de estado no es válida
AddLocation
Section titled “AddLocation”Descripción: Añade una ubicación a una asignación existente.
Interfaz de Entrada:
interface AddLocationParams { assignmentId: string; location: LocationName;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Busca la asignación por ID
- Verifica que la ubicación exista
- Añade la ubicación a la asignación si no está ya presente
- Guarda la asignación actualizada
- Notifica a los observadores
- Devuelve la asignación actualizada
Reglas de Negocio:
- La asignación debe existir
- La ubicación debe existir
- La ubicación no debe estar ya presente en la asignación
Puertos y Adaptadores:
- Puertos de Entrada:
AddLocation.invoke - Puertos de Salida:
AssignmentRepository.findById,AssignmentRepository.saveLocationService.findCalendar.nowInUtc
Excepciones:
AssignmentNotFoundError: Cuando la asignación no existeLocationNotFoundError: Cuando la ubicación no existeLocationAlreadyExistsError: Cuando la ubicación ya está presente en la asignación
RemoveLocation
Section titled “RemoveLocation”Descripción: Elimina una ubicación de una asignación existente.
Interfaz de Entrada:
interface RemoveLocationParams { assignmentId: string; location: LocationName;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Busca la asignación por ID
- Elimina la ubicación de la asignación si está presente
- Guarda la asignación actualizada
- Notifica a los observadores
- Devuelve la asignación actualizada
Reglas de Negocio:
- La asignación debe existir
- La ubicación debe estar presente en la asignación
Puertos y Adaptadores:
- Puertos de Entrada:
RemoveLocation.invoke - Puertos de Salida:
AssignmentRepository.findById,AssignmentRepository.saveCalendar.nowInUtc
Excepciones:
AssignmentNotFoundError: Cuando la asignación no existeLocationNotFoundInAssignmentError: Cuando la ubicación no está presente en la asignación
UpdateLocation
Section titled “UpdateLocation”Descripción: Actualiza una ubicación en una asignación existente.
Interfaz de Entrada:
interface UpdateLocationParams { assignmentId: string; oldLocation: LocationName; newLocation: LocationName;}Interfaz de Salida:
Either<BusinessError, Assignment>Flujo Principal:
- Busca la asignación por ID
- Verifica que la ubicación antigua exista en la asignación
- Verifica que la nueva ubicación exista en el sistema
- Reemplaza la ubicación antigua por la nueva
- Guarda la asignación actualizada
- Notifica a los observadores
- Devuelve la asignación actualizada
Reglas de Negocio:
- La asignación debe existir
- La ubicación antigua debe estar presente en la asignación
- La nueva ubicación debe existir en el sistema
- La nueva ubicación no debe estar ya presente en la asignación
Puertos y Adaptadores:
- Puertos de Entrada:
UpdateLocation.invoke - Puertos de Salida:
AssignmentRepository.findById,AssignmentRepository.saveLocationService.findCalendar.nowInUtc
Excepciones:
AssignmentNotFoundError: Cuando la asignación no existeLocationNotFoundInAssignmentError: Cuando la ubicación antigua no está presente en la asignaciónLocationNotFoundError: Cuando la nueva ubicación no existe en el sistemaLocationAlreadyExistsError: Cuando la nueva ubicación ya está presente en la asignación