public async Task CreateShipment()

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();
        }