Skip to content

Use Cases

Este documento detalla los principales casos de uso implementados en el Gestor de Inventario de Operaciones, organizados por categorías funcionales.

Descripción: Registra la entrada de productos al inventario.

Interfaz de entrada:

interface RegisterInputRequest {
warehouse: string;
location: string;
container?: string;
product: {
ean: string;
};
lot?: string;
expirationDate?: string;
quantity: number;
user: {
id: string;
};
}

Interfaz de salida:

interface RegisterInputResponse {
id: string;
transactionId: string;
warehouse: string;
location: string;
container: string | null;
product: {
ean: string;
name: string;
sku: string | null;
};
lot: string | null;
expirationDate: string | null;
quantity: number;
stock: number;
user: {
id: string;
name: string;
};
createdAt: string;
}

Flujo principal:

  1. Validar los datos de entrada
  2. Verificar que el almacén, ubicación y producto existan
  3. Verificar que la ubicación pertenezca al almacén
  4. Buscar una entrada existente con los mismos criterios o crear una nueva
  5. Registrar la transacción de entrada
  6. Actualizar el stock de la entrada
  7. Notificar el evento de entrada mediante el despachador de eventos
  8. Retornar la respuesta con los datos de la entrada y la transacción

Reglas de negocio:

  • La cantidad debe ser un número positivo
  • Si se especifica un lote, debe ser válido
  • Si se especifica una fecha de expiración, debe ser válida y futura

Adaptadores implicados:

  • Repositorio de entradas
  • Servicio de productos
  • Servicio de ubicaciones
  • Servicio de contenedores
  • Servicio de usuarios
  • Despachador de eventos

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • LocationNotFoundError: Si la ubicación no existe
  • WarehouseNotFoundError: Si el almacén no existe
  • ContainerNotFoundError: Si el contenedor no existe
  • UserNotFoundError: Si el usuario no existe
  • InvalidQuantityError: Si la cantidad no es válida
  • InvalidLotError: Si el lote no es válido
  • InvalidExpirationDateError: Si la fecha de expiración no es válida

Descripción: Registra la salida de productos del inventario.

Interfaz de entrada:

interface RegisterOutputRequest {
warehouse: string;
location: string;
container?: string;
product: {
ean: string;
};
lot?: string;
expirationDate?: string;
quantity: number;
reason: string;
user: {
id: string;
};
}

Interfaz de salida:

interface RegisterOutputResponse {
id: string;
transactionId: string;
warehouse: string;
location: string;
container: string | null;
product: {
ean: string;
name: string;
sku: string | null;
};
lot: string | null;
expirationDate: string | null;
quantity: number;
stock: number;
reason: string;
user: {
id: string;
name: string;
};
createdAt: string;
}

Flujo principal:

  1. Validar los datos de entrada
  2. Verificar que el almacén, ubicación y producto existan
  3. Verificar que la ubicación pertenezca al almacén
  4. Buscar la entrada existente con los criterios especificados
  5. Verificar que haya suficiente stock para la salida
  6. Registrar la transacción de salida
  7. Actualizar el stock de la entrada
  8. Notificar el evento de salida mediante el despachador de eventos
  9. Retornar la respuesta con los datos de la entrada y la transacción

Reglas de negocio:

  • La cantidad debe ser un número positivo
  • Debe haber suficiente stock para realizar la salida
  • Se debe especificar un motivo para la salida

Adaptadores implicados:

  • Repositorio de entradas
  • Servicio de productos
  • Servicio de ubicaciones
  • Servicio de contenedores
  • Servicio de usuarios
  • Despachador de eventos

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • LocationNotFoundError: Si la ubicación no existe
  • WarehouseNotFoundError: Si el almacén no existe
  • ContainerNotFoundError: Si el contenedor no existe
  • UserNotFoundError: Si el usuario no existe
  • EntryNotFoundError: Si no se encuentra la entrada
  • InsufficientStockError: Si no hay suficiente stock
  • InvalidQuantityError: Si la cantidad no es válida
  • InvalidReasonError: Si no se especifica un motivo válido

Descripción: Transfiere productos entre ubicaciones dentro del mismo almacén o entre almacenes diferentes.

Interfaz de entrada:

interface TransferInventoryRequest {
sourceWarehouse: string;
sourceLocation: string;
sourceContainer?: string;
targetWarehouse: string;
targetLocation: string;
targetContainer?: string;
product: {
ean: string;
};
lot?: string;
expirationDate?: string;
quantity: number;
user: {
id: string;
};
}

Interfaz de salida:

interface TransferInventoryResponse {
sourceTransaction: {
id: string;
transactionId: string;
warehouse: string;
location: string;
container: string | null;
product: {
ean: string;
name: string;
sku: string | null;
};
lot: string | null;
expirationDate: string | null;
quantity: number;
stock: number;
reason: string;
user: {
id: string;
name: string;
};
createdAt: string;
};
targetTransaction: {
id: string;
transactionId: string;
warehouse: string;
location: string;
container: string | null;
product: {
ean: string;
name: string;
sku: string | null;
};
lot: string | null;
expirationDate: string | null;
quantity: number;
stock: number;
user: {
id: string;
name: string;
};
createdAt: string;
};
}

Flujo principal:

  1. Validar los datos de entrada
  2. Verificar que los almacenes, ubicaciones y producto existan
  3. Verificar que las ubicaciones pertenezcan a sus respectivos almacenes
  4. Buscar la entrada existente en la ubicación de origen
  5. Verificar que haya suficiente stock para la transferencia
  6. Registrar la transacción de salida en la ubicación de origen
  7. Buscar o crear una entrada en la ubicación de destino
  8. Registrar la transacción de entrada en la ubicación de destino
  9. Actualizar el stock de ambas entradas
  10. Notificar los eventos de salida y entrada mediante el despachador de eventos
  11. Retornar la respuesta con los datos de ambas transacciones

Reglas de negocio:

  • La cantidad debe ser un número positivo
  • Debe haber suficiente stock en la ubicación de origen
  • Si se transfiere con lote o fecha de expiración, estos deben mantenerse

Adaptadores implicados:

  • Repositorio de entradas
  • Servicio de productos
  • Servicio de ubicaciones
  • Servicio de contenedores
  • Servicio de usuarios
  • Despachador de eventos

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • LocationNotFoundError: Si alguna ubicación no existe
  • WarehouseNotFoundError: Si algún almacén no existe
  • ContainerNotFoundError: Si algún contenedor no existe
  • UserNotFoundError: Si el usuario no existe
  • EntryNotFoundError: Si no se encuentra la entrada en la ubicación de origen
  • InsufficientStockError: Si no hay suficiente stock
  • InvalidQuantityError: Si la cantidad no es válida

Descripción: Obtiene el stock disponible de un producto en todas las ubicaciones.

Interfaz de entrada:

interface GetStockByProductRequest {
ean: string;
warehouse?: string;
}

Interfaz de salida:

interface GetStockByProductResponse {
product: {
ean: string;
name: string;
sku: string | null;
};
totalStock: number;
locations: Array<{
warehouse: string;
location: string;
container: string | null;
lot: string | null;
expirationDate: string | null;
stock: number;
}>;
}

Flujo principal:

  1. Validar los datos de entrada
  2. Verificar que el producto exista
  3. Buscar todas las entradas del producto
  4. Filtrar por almacén si se especifica
  5. Calcular el stock total y por ubicación
  6. Retornar la respuesta con los datos de stock

Reglas de negocio:

  • Se deben incluir todas las ubicaciones con stock positivo
  • Si se especifica un almacén, solo se incluyen las ubicaciones de ese almacén

Adaptadores implicados:

  • Repositorio de entradas
  • Servicio de productos

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • WarehouseNotFoundError: Si el almacén especificado no existe

Descripción: Verifica y ajusta el inventario según un conteo físico.

Interfaz de entrada:

interface VerifyInventoryRequest {
warehouse: string;
location: string;
container?: string;
product: {
ean: string;
};
lot?: string;
expirationDate?: string;
actualQuantity: number;
user: {
id: string;
};
}

Interfaz de salida:

interface VerifyInventoryResponse {
id: string;
transactionId: string;
warehouse: string;
location: string;
container: string | null;
product: {
ean: string;
name: string;
sku: string | null;
};
lot: string | null;
expirationDate: string | null;
previousStock: number;
actualStock: number;
adjustment: number;
user: {
id: string;
name: string;
};
createdAt: string;
}

Flujo principal:

  1. Validar los datos de entrada
  2. Verificar que el almacén, ubicación y producto existan
  3. Verificar que la ubicación pertenezca al almacén
  4. Buscar la entrada existente o crear una nueva si no existe
  5. Calcular la diferencia entre el stock actual y el conteo físico
  6. Registrar la transacción de ajuste
  7. Actualizar el stock de la entrada
  8. Notificar el evento de ajuste mediante el despachador de eventos
  9. Retornar la respuesta con los datos del ajuste

Reglas de negocio:

  • La cantidad actual debe ser un número no negativo
  • Se debe registrar tanto el stock anterior como el nuevo
  • El ajuste puede ser positivo o negativo

Adaptadores implicados:

  • Repositorio de entradas
  • Servicio de productos
  • Servicio de ubicaciones
  • Servicio de contenedores
  • Servicio de usuarios
  • Despachador de eventos

Excepciones:

  • ProductNotFoundError: Si el producto no existe
  • LocationNotFoundError: Si la ubicación no existe
  • WarehouseNotFoundError: Si el almacén no existe
  • ContainerNotFoundError: Si el contenedor no existe
  • UserNotFoundError: Si el usuario no existe
  • InvalidQuantityError: Si la cantidad no es válida