Use Cases
Este documento detalla los principales casos de uso implementados en el Gestor de Inventario de Operaciones, organizados por categorías funcionales.
Casos de Uso
Section titled “Casos de Uso”Registrar Entrada de Inventario
Section titled “Registrar Entrada de Inventario”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:
- Validar los datos de entrada
- Verificar que el almacén, ubicación y producto existan
- Verificar que la ubicación pertenezca al almacén
- Buscar una entrada existente con los mismos criterios o crear una nueva
- Registrar la transacción de entrada
- Actualizar el stock de la entrada
- Notificar el evento de entrada mediante el despachador de eventos
- 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 existeLocationNotFoundError: Si la ubicación no existeWarehouseNotFoundError: Si el almacén no existeContainerNotFoundError: Si el contenedor no existeUserNotFoundError: Si el usuario no existeInvalidQuantityError: Si la cantidad no es válidaInvalidLotError: Si el lote no es válidoInvalidExpirationDateError: Si la fecha de expiración no es válida
Registrar Salida de Inventario
Section titled “Registrar Salida de Inventario”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:
- Validar los datos de entrada
- Verificar que el almacén, ubicación y producto existan
- Verificar que la ubicación pertenezca al almacén
- Buscar la entrada existente con los criterios especificados
- Verificar que haya suficiente stock para la salida
- Registrar la transacción de salida
- Actualizar el stock de la entrada
- Notificar el evento de salida mediante el despachador de eventos
- 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 existeLocationNotFoundError: Si la ubicación no existeWarehouseNotFoundError: Si el almacén no existeContainerNotFoundError: Si el contenedor no existeUserNotFoundError: Si el usuario no existeEntryNotFoundError: Si no se encuentra la entradaInsufficientStockError: Si no hay suficiente stockInvalidQuantityError: Si la cantidad no es válidaInvalidReasonError: Si no se especifica un motivo válido
Transferir Inventario
Section titled “Transferir Inventario”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:
- Validar los datos de entrada
- Verificar que los almacenes, ubicaciones y producto existan
- Verificar que las ubicaciones pertenezcan a sus respectivos almacenes
- Buscar la entrada existente en la ubicación de origen
- Verificar que haya suficiente stock para la transferencia
- Registrar la transacción de salida en la ubicación de origen
- Buscar o crear una entrada en la ubicación de destino
- Registrar la transacción de entrada en la ubicación de destino
- Actualizar el stock de ambas entradas
- Notificar los eventos de salida y entrada mediante el despachador de eventos
- 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 existeLocationNotFoundError: Si alguna ubicación no existeWarehouseNotFoundError: Si algún almacén no existeContainerNotFoundError: Si algún contenedor no existeUserNotFoundError: Si el usuario no existeEntryNotFoundError: Si no se encuentra la entrada en la ubicación de origenInsufficientStockError: Si no hay suficiente stockInvalidQuantityError: Si la cantidad no es válida
Consultar Stock por Producto
Section titled “Consultar Stock por Producto”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:
- Validar los datos de entrada
- Verificar que el producto exista
- Buscar todas las entradas del producto
- Filtrar por almacén si se especifica
- Calcular el stock total y por ubicación
- 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 existeWarehouseNotFoundError: Si el almacén especificado no existe
Verificar Inventario
Section titled “Verificar Inventario”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:
- Validar los datos de entrada
- Verificar que el almacén, ubicación y producto existan
- Verificar que la ubicación pertenezca al almacén
- Buscar la entrada existente o crear una nueva si no existe
- Calcular la diferencia entre el stock actual y el conteo físico
- Registrar la transacción de ajuste
- Actualizar el stock de la entrada
- Notificar el evento de ajuste mediante el despachador de eventos
- 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 existeLocationNotFoundError: Si la ubicación no existeWarehouseNotFoundError: Si el almacén no existeContainerNotFoundError: Si el contenedor no existeUserNotFoundError: Si el usuario no existeInvalidQuantityError: Si la cantidad no es válida