Skip to content

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.

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:

  1. Verifica que el producto exista utilizando el ProductService
  2. Si se proporcionan ubicaciones, verifica que todas existan utilizando el LocationService
  3. Verifica si ya existe una asignación para el EAN y almacén especificados
  4. Si ya existe, devuelve un error AlreadyExistsAssignmentError
  5. Si no existe, crea una nueva instancia de Assignment con un ID generado
  6. Guarda la asignación en el repositorio
  7. Notifica a los observadores sobre la nueva asignación
  8. 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.save
    • ProductService.find
    • LocationService.find
    • IdGenerator.genAssignmentId
    • Calendar.nowInUtc

Excepciones:

  • AlreadyExistsAssignmentError: Cuando ya existe una asignación para el EAN y almacén
  • ProductNotFoundError: Cuando el producto no existe
  • LocationNotFoundError: Cuando una ubicación no existe

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:

  1. Verifica que el producto exista utilizando el ProductService
  2. Obtiene ubicaciones recomendadas basadas en reglas de negocio
  3. Crea o actualiza la asignación con las ubicaciones recomendadas
  4. Notifica a los observadores sobre la asignación
  5. 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.save
    • ProductService.find
    • Calendar.nowInUtc

Excepciones:

  • ProductNotFoundError: Cuando el producto no existe

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:

  1. Valida los parámetros de búsqueda
  2. Busca la asignación en el repositorio según los criterios
  3. Si no se encuentra, devuelve un error AssignmentNotFoundError
  4. 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 criterios
  • InvalidParamsError: Cuando no se proporciona ningún criterio de búsqueda

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:

  1. Aplica los filtros proporcionados
  2. Pagina los resultados según los parámetros page y limit
  3. 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

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:

  1. Busca la asignación por ID
  2. Actualiza su estado
  3. Guarda la asignación actualizada
  4. Notifica a los observadores
  5. 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.save
    • Calendar.nowInUtc

Excepciones:

  • AssignmentNotFoundError: Cuando la asignación no existe
  • InvalidStateTransitionError: Cuando la transición de estado no es válida

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:

  1. Busca la asignación por ID
  2. Verifica que la ubicación exista
  3. Añade la ubicación a la asignación si no está ya presente
  4. Guarda la asignación actualizada
  5. Notifica a los observadores
  6. 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.save
    • LocationService.find
    • Calendar.nowInUtc

Excepciones:

  • AssignmentNotFoundError: Cuando la asignación no existe
  • LocationNotFoundError: Cuando la ubicación no existe
  • LocationAlreadyExistsError: Cuando la ubicación ya está presente en la asignación

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:

  1. Busca la asignación por ID
  2. Elimina la ubicación de la asignación si está presente
  3. Guarda la asignación actualizada
  4. Notifica a los observadores
  5. 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.save
    • Calendar.nowInUtc

Excepciones:

  • AssignmentNotFoundError: Cuando la asignación no existe
  • LocationNotFoundInAssignmentError: Cuando la ubicación no está presente en la asignación

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:

  1. Busca la asignación por ID
  2. Verifica que la ubicación antigua exista en la asignación
  3. Verifica que la nueva ubicación exista en el sistema
  4. Reemplaza la ubicación antigua por la nueva
  5. Guarda la asignación actualizada
  6. Notifica a los observadores
  7. 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.save
    • LocationService.find
    • Calendar.nowInUtc

Excepciones:

  • AssignmentNotFoundError: Cuando la asignación no existe
  • LocationNotFoundInAssignmentError: Cuando la ubicación antigua no está presente en la asignación
  • LocationNotFoundError: Cuando la nueva ubicación no existe en el sistema
  • LocationAlreadyExistsError: Cuando la nueva ubicación ya está presente en la asignación