Files
CMS/src/CMSMicroservice.Application/InventoryItemCQ/Commands/ReleaseReservedInventory/ReleaseReservedInventoryCommandHandler.cs
T
masoodafar-web dde4c68b2f
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 2m33s
feat: Implement inventory and warehouse management features
- Add GetLowStockItemsResponseDto and LowStockItemDto for low stock item queries.
- Create CreateStockMovementCommand and its handler for managing stock movements.
- Implement CreateStockMovementCommandValidator for validating stock movement commands.
- Add GetStockMovementsQuery and its handler to retrieve stock movement records.
- Create GetStockMovementsResponseDto and StockMovementListDto for stock movement responses.
- Implement GetStockMovementsByInventoryItemQuery and its handler for fetching movements by inventory item.
- Add CreateWarehouseCommand and its handler for creating new warehouses.
- Implement CreateWarehouseCommandValidator for warehouse creation validation.
- Add DeleteWarehouseCommand and its handler for removing warehouses.
- Implement SetDefaultWarehouseCommand and its handler for setting a default warehouse.
- Create UpdateWarehouseCommand and its handler for updating warehouse details.
- Implement GetAllWarehousesQuery and its handler to retrieve all warehouses.
- Add GetWarehouseQuery and its handler for fetching a specific warehouse by ID.
- Implement SearchWarehousesQuery and its handler for searching warehouses based on criteria.
2026-01-03 11:59:08 +03:30

54 lines
2.0 KiB
C#

using CMSMicroservice.Application.Common.Exceptions;
using CMSMicroservice.Domain.Entities;
using CMSMicroservice.Domain.Enums;
namespace CMSMicroservice.Application.InventoryItemCQ.Commands.ReleaseReservedInventory;
public class ReleaseReservedInventoryCommandHandler : IRequestHandler<ReleaseReservedInventoryCommand, ReleaseReservedInventoryResponseDto>
{
private readonly IApplicationDbContext _context;
public ReleaseReservedInventoryCommandHandler(IApplicationDbContext context)
{
_context = context;
}
public async Task<ReleaseReservedInventoryResponseDto> Handle(ReleaseReservedInventoryCommand request, CancellationToken cancellationToken)
{
var item = await _context.InventoryItems
.FirstOrDefaultAsync(i => i.Id == request.Id, cancellationToken);
if (item == null)
{
throw new NotFoundException(nameof(Domain.Entities.InventoryItem), request.Id);
}
if (item.ReservedQuantity < request.Quantity)
{
throw new InvalidOperationException($"Cannot release more than reserved. Reserved: {item.ReservedQuantity}, Requested: {request.Quantity}");
}
item.ReservedQuantity -= request.Quantity;
// ثبت حرکت موجودی
var stockMovement = new StockMovement
{
InventoryItemId = item.Id,
MovementType = StockMovementType.Released,
Quantity = request.Quantity,
QuantityBefore = item.Quantity,
QuantityAfter = item.Quantity,
Note = "Reservation released",
ReferenceNumber = request.ReferenceNumber ?? $"REL-{DateTime.UtcNow:yyyyMMddHHmmss}",
OrderId = request.OrderId,
DiscountOrderId = request.DiscountOrderId,
PerformedByUserId = request.PerformedByUserId
};
await _context.StockMovements.AddAsync(stockMovement, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
return new ReleaseReservedInventoryResponseDto { Success = true };
}
}