public async Task <IActionResult> SaveProductInventories(SaveInventoriesBySkusRequestModel request) { var sellerClaim = this.User.Claims.FirstOrDefault(x => x.Type == AccountConstants.Claims.OrganisationIdClaim); var serviceModel = new UpdateProductsInventoryServiceModel { InventoryItems = request.InventoryItems.OrEmptyIfNull().Select(x => new UpdateProductInventoryServiceModel { AvailableQuantity = x.AvailableQuantity, Quantity = x.Quantity, ExpectedDelivery = x.ExpectedDelivery, ProductId = x.ProductId, ProductName = x.ProductName, ProductSku = x.ProductSku, RestockableInDays = x.RestockableInDays, WarehouseName = x.WarehouseName }), OrganisationId = GuidHelper.ParseNullable(sellerClaim?.Value) }; var validator = new SaveInventoryItemsByProductSkusModelValidator(); var validationResult = await validator.ValidateAsync(serviceModel); if (validationResult.IsValid) { await this.inventoriesService.SyncInventoryProducts(serviceModel); return(this.StatusCode((int)HttpStatusCode.OK)); } throw new CustomException(string.Join(ErrorConstants.ErrorMessagesSeparator, validationResult.Errors.Select(x => x.ErrorMessage)), (int)HttpStatusCode.UnprocessableEntity); }
public async Task SyncInventoryProducts(UpdateProductsInventoryServiceModel model) { var inventoryProducts = this.context.Inventory .Join(this.context.Warehouses, inventory => inventory.WarehouseId, warehouse => warehouse.Id, (inventory, warehouse) => new { Id = inventory.Id, ProductSku = inventory.ProductSku, WarehouseName = warehouse.Name, }); foreach (var item in model.InventoryItems.OrEmptyIfNull()) { var inventory = await inventoryProducts.FirstOrDefaultAsync(x => x.ProductSku == item.ProductSku && x.WarehouseName == item.WarehouseName); if (inventory is not null) { var inventoryItem = await this.context.Inventory.FirstOrDefaultAsync(x => x.Id == inventory.Id); inventoryItem.ExpectedDelivery = item.ExpectedDelivery; inventoryItem.RestockableInDays = item.RestockableInDays; inventoryItem.AvailableQuantity = item.AvailableQuantity; inventoryItem.Quantity = item.Quantity; inventoryItem.LastModifiedDate = DateTime.UtcNow; } else { var warehouse = await this.context.Warehouses.FirstOrDefaultAsync(x => x.Name == item.WarehouseName); if (warehouse is not null) { var inventoryProduct = new InventoryItem { WarehouseId = warehouse.Id, ProductId = item.ProductId.Value, ProductName = item.ProductName, ProductSku = item.ProductSku, Quantity = item.Quantity, AvailableQuantity = item.AvailableQuantity, ExpectedDelivery = item.ExpectedDelivery, SellerId = model.OrganisationId.Value }; this.context.Inventory.Add(inventoryProduct.FillCommonProperties()); } } } await this.context.SaveChangesAsync(); }