Skip to content

Use Cases

Este documento detalla los casos de uso implementados en el microservicio de gestión de mermas. Cada caso de uso representa una operación específica que puede realizar el sistema.

Nombre: CreateWasteReport

Descripción: Permite a un usuario reportar una merma de producto en un almacén. Crea un nuevo reporte de merma en el sistema y notifica a los observadores sobre el evento.

Interfaz de Entrada:

interface CreateReportParams {
productEan: string;
productName: string;
productSku: string;
productImage?: string;
quantity: number;
location: string;
container?: string;
reason: string;
username: string;
warehouse: string;
country: string;
}

Interfaz de Salida:

Either<BusinessError, WasteReport>

Flujo Principal:

  1. Validar los datos de entrada
  2. Convertir los datos primitivos a objetos de valor (Ean, Location, Container, etc.)
  3. Verificar que el producto existe consultando al servicio de productos
  4. Verificar que la ubicación existe consultando al servicio de ubicaciones
  5. Si se proporciona un contenedor, verificar que existe consultando al servicio de contenedores
  6. Realizar una salida de inventario utilizando la estrategia FEFO
  7. Crear una nueva entidad WasteReport con un ID generado
  8. Guardar el reporte en el repositorio
  9. Notificar a los observadores sobre el nuevo reporte
  10. Devolver el reporte creado

Reglas de Negocio:

  • El producto debe existir en el sistema
  • La ubicación debe existir en el sistema
  • Si se proporciona un contenedor, debe existir en el sistema
  • La cantidad debe ser mayor que cero
  • El usuario debe tener permisos para reportar mermas

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)
  • Servicio de productos (salida)
  • Servicio de ubicaciones (salida)
  • Servicio de contenedores (salida)
  • Servicio de inventario (salida)
  • Generador de IDs (salida)
  • Calendario (salida)
  • Despachador de eventos (salida)

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • LocationNotFoundError: Si la ubicación no existe
  • ContainerNotFoundError: Si el contenedor no existe
  • ValidationError: Si los datos de entrada no son válidos
  • UnexpectedError: Para errores inesperados

Nombre: ValidateWasteReport

Descripción: Permite a un supervisor validar un reporte de merma previamente creado. Actualiza el estado del reporte y notifica a los observadores sobre el evento.

Interfaz de Entrada:

interface ValidateReportParams {
id: string;
username: string;
}

Interfaz de Salida:

Either<BusinessError, WasteReport>

Flujo Principal:

  1. Buscar el reporte por ID en el repositorio
  2. Verificar que el reporte existe y está en estado REPORTED
  3. Actualizar el reporte con la información de validación
  4. Guardar el reporte actualizado en el repositorio
  5. Notificar a los observadores sobre la validación
  6. Devolver el reporte actualizado

Reglas de Negocio:

  • El reporte debe existir
  • El reporte debe estar en estado REPORTED
  • El usuario debe tener permisos para validar mermas

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)
  • Calendario (salida)
  • Despachador de eventos (salida)

Excepciones:

  • ReportNotFoundError: Si el reporte no existe
  • InvalidStateError: Si el reporte no está en el estado correcto
  • UnexpectedError: Para errores inesperados

Nombre: ConfirmWasteReport

Descripción: Permite a un gerente confirmar un reporte de merma previamente validado. Actualiza el estado del reporte y notifica a los observadores sobre el evento.

Interfaz de Entrada:

interface ConfirmReportParams {
id: string;
username: string;
}

Interfaz de Salida:

Either<BusinessError, WasteReport>

Flujo Principal:

  1. Buscar el reporte por ID en el repositorio
  2. Verificar que el reporte existe y está en estado VALIDATED
  3. Actualizar el reporte con la información de confirmación
  4. Guardar el reporte actualizado en el repositorio
  5. Notificar a los observadores sobre la confirmación
  6. Devolver el reporte actualizado

Reglas de Negocio:

  • El reporte debe existir
  • El reporte debe estar en estado VALIDATED
  • El usuario debe tener permisos para confirmar mermas

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)
  • Calendario (salida)
  • Despachador de eventos (salida)

Excepciones:

  • ReportNotFoundError: Si el reporte no existe
  • InvalidStateError: Si el reporte no está en el estado correcto
  • UnexpectedError: Para errores inesperados

Nombre: RejectWasteReport

Descripción: Permite a un supervisor o gerente rechazar un reporte de merma. Actualiza el estado del reporte, registra la razón del rechazo y notifica a los observadores sobre el evento.

Interfaz de Entrada:

interface RejectReportParams {
id: string;
username: string;
reason: string;
}

Interfaz de Salida:

Either<BusinessError, WasteReport>

Flujo Principal:

  1. Buscar el reporte por ID en el repositorio
  2. Verificar que el reporte existe y está en un estado que permite rechazo (REPORTED o VALIDATED)
  3. Actualizar el reporte con la información de rechazo
  4. Guardar el reporte actualizado en el repositorio
  5. Notificar a los observadores sobre el rechazo
  6. Devolver el reporte actualizado

Reglas de Negocio:

  • El reporte debe existir
  • El reporte debe estar en un estado que permite rechazo
  • Se debe proporcionar una razón para el rechazo
  • El usuario debe tener permisos para rechazar mermas

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)
  • Calendario (salida)
  • Despachador de eventos (salida)

Excepciones:

  • ReportNotFoundError: Si el reporte no existe
  • InvalidStateError: Si el reporte no está en un estado que permite rechazo
  • ValidationError: Si no se proporciona una razón para el rechazo
  • UnexpectedError: Para errores inesperados

Nombre: FindWasteReportById

Descripción: Permite buscar un reporte de merma por su ID.

Interfaz de Entrada:

interface FindReportByIdParams {
id: string;
}

Interfaz de Salida:

Either<BusinessError, WasteReport>

Flujo Principal:

  1. Buscar el reporte por ID en el repositorio
  2. Verificar que el reporte existe
  3. Devolver el reporte encontrado

Reglas de Negocio:

  • El reporte debe existir

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)

Excepciones:

  • ReportNotFoundError: Si el reporte no existe
  • UnexpectedError: Para errores inesperados

Nombre: FilterWasteReports

Descripción: Permite filtrar reportes de merma según varios criterios.

Interfaz de Entrada:

interface FilterReportsParams {
warehouse?: string;
country?: string;
status?: string;
startDate?: string;
endDate?: string;
productEan?: string;
location?: string;
page?: number;
limit?: number;
}

Interfaz de Salida:

Either<BusinessError, { reports: WasteReport[]; total: number }>

Flujo Principal:

  1. Convertir los parámetros de filtro a objetos de valor si es necesario
  2. Aplicar los filtros en el repositorio
  3. Devolver los reportes que coinciden con los criterios y el total

Reglas de Negocio:

  • Los parámetros de filtro deben ser válidos
  • La paginación debe ser válida

Adaptadores/Puertos Implicados:

  • Repositorio de mermas (salida)

Excepciones:

  • ValidationError: Si los parámetros de filtro no son válidos
  • UnexpectedError: Para errores inesperados