Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }