in src/Modules/SimplCommerce.Module.Shipments/Services/ShipmentService.cs [80:113]
public async Task<Result> CreateShipment(Shipment shipment)
{
if (!shipment.Items.Any())
{
return Result.Fail($"No item to ship");
}
var orderedItems = await GetShipmentItem(shipment.OrderId);
foreach (var item in shipment.Items)
{
var orderedItem = orderedItems.FirstOrDefault(x => x.OrderItemId == item.OrderItemId);
if(orderedItem == null)
{
return Result.Fail($"Order item {item.OrderItemId} is not found");
}
if(item.Quantity > orderedItem.OrderedQuantity - orderedItem.ShippedQuantity)
{
return Result.Fail($"Quantity to ship cannot be larger than ordered quantity + shipped quantity");
}
var stock = await _stockRepository.Query().Where(x => x.ProductId == item.ProductId && x.WarehouseId == shipment.WarehouseId).FirstOrDefaultAsync();
if(stock == null || stock.Quantity < item.Quantity)
{
return Result.Fail($"The product {item.ProductId} is out of stock in warehouse {shipment.WarehouseId}");
}
stock.Quantity = stock.Quantity - item.Quantity;
}
_shipmentRepository.Add(shipment);
await _shipmentRepository.SaveChangesAsync();
return Result.Ok();
}