示例#1
0
        public async Task <long> CreateAsync(ProductModifyRequest request)
        {
            var modifiedDate = DateTimeOffset.UtcNow;

            request.CreatedDate = modifiedDate;
            request.UpdatedDate = modifiedDate;
            var id = await _productRepository.CreateAsync(request);

            if (id <= 0)
            {
                return(-1);
            }

            if (request.Pictures.Any())
            {
                await _productPictureRepository.CreateAsync(new ProductPicturesModifyRequest
                {
                    CreatedById = request.CreatedById,
                    CreatedDate = request.CreatedDate,
                    ProductId   = id,
                    Pictures    = request.Pictures,
                    UpdatedById = request.UpdatedById,
                    UpdatedDate = request.UpdatedDate
                });
            }

            if (request.ProductAttributes == null || !request.ProductAttributes.Any())
            {
                return(id);
            }

            var groupOfAttributes = new List <ProductAttributeRelationRequest>();

            foreach (var attributeRelation in request.ProductAttributes)
            {
                var existAttribute = groupOfAttributes.FirstOrDefault(x => x.ProductAttributeId == attributeRelation.ProductAttributeId);
                if (existAttribute != null)
                {
                    var attributeValues = existAttribute.AttributeRelationValues.ToList();
                    attributeValues.AddRange(attributeRelation.AttributeRelationValues);
                    existAttribute.AttributeRelationValues = attributeValues;
                }
                else
                {
                    groupOfAttributes.Add(attributeRelation);
                }
            }

            foreach (var attributeRelation in groupOfAttributes)
            {
                attributeRelation.ProductId = id;
                await _productAttributeRepository.CreateAttributeRelationAsync(attributeRelation);
            }

            return(id);
        }
示例#2
0
        public async Task <bool> ActiveAsync(ProductModifyRequest request)
        {
            await _productRepository.Get(x => x.Id == request.Id)
            .Set(x => x.StatusId, (int)ProductStatus.Actived)
            .Set(x => x.UpdatedById, request.UpdatedById)
            .Set(x => x.UpdatedDate, DateTimeOffset.UtcNow)
            .UpdateAsync();

            return(true);
        }
示例#3
0
        public async Task <bool> ActiveAsync(ProductModifyRequest request)
        {
            await _productPictureRepository.UpdateStatusByProductIdAsync(new ProductPicturesModifyRequest
            {
                UpdatedById = request.UpdatedById,
                ProductId   = request.Id
            }, PictureStatus.Actived);

            return(await _productRepository.ActiveAsync(request));
        }
示例#4
0
        public async Task <long> CreateAsync(ProductModifyRequest request)
        {
            var modifiedDate = DateTimeOffset.UtcNow;
            var newProduct   = new Product()
            {
                CreatedById = request.CreatedById,
                UpdatedById = request.UpdatedById,
                CreatedDate = modifiedDate,
                UpdatedDate = modifiedDate,
                Description = request.Description,
                Name        = request.Name,
                StatusId    = ProductStatus.Pending.GetCode()
            };

            var id = await _productRepository.AddWithInt64EntityAsync(newProduct);

            if (id > 0)
            {
                foreach (var category in request.Categories)
                {
                    _productCategoryRelationRepository.Add(new ProductCategoryRelation()
                    {
                        ProductCategoryId = category.Id,
                        ProductId         = id
                    });
                }

                foreach (var farm in request.Farms)
                {
                    _farmProductRepository.Add(new FarmProduct()
                    {
                        FarmId     = farm.FarmId,
                        ProductId  = id,
                        IsLinked   = true,
                        LinkedById = request.CreatedById,
                        LinkedDate = modifiedDate
                    });
                }

                _productPriceRepository.Add(new ProductPrice()
                {
                    PricedDate = modifiedDate,
                    ProductId  = id,
                    Price      = request.Price,
                    IsCurrent  = true
                });
            }

            return(id);
        }
示例#5
0
        public async Task <ProductModel> CreateProductAsync(ClaimsPrincipal claimsPrincipal, ProductModel criterias)
        {
            var currentUserId = GetCurrentUserId(claimsPrincipal);
            var product       = new ProductModifyRequest()
            {
                CreatedById = currentUserId,
                UpdatedById = currentUserId,
                Name        = criterias.Name,
                Description = criterias.Description,
                Price       = criterias.Price,
                Pictures    = criterias.Pictures.Select(x => new PictureRequest
                {
                    Base64Data  = x.Base64Data,
                    FileName    = x.FileName,
                    ContentType = x.ContentType,
                }),
                Categories = criterias.Categories.Select(x => new ProductCategoryRequest
                {
                    Id = x.Id
                }),
                Farms = criterias.Farms.Select(x => new ProductFarmRequest
                {
                    FarmId = x.Id
                }),
                ProductAttributes = criterias.ProductAttributes.Select(x => new ProductAttributeRelationRequest
                {
                    ControlTypeId           = x.ControlTypeId,
                    DisplayOrder            = x.DisplayOrder,
                    ProductAttributeId      = x.AttributeId,
                    AttributeRelationValues = x.AttributeRelationValues.Select(c => new ProductAttributeRelationValueRequest
                    {
                        DisplayOrder              = c.DisplayOrder,
                        Name                      = c.Name,
                        PriceAdjustment           = c.PriceAdjustment,
                        PricePercentageAdjustment = c.PricePercentageAdjustment,
                        Quantity                  = c.Quantity
                    })
                })
            };

            criterias.Id = await _productService.CreateAsync(product);

            return(criterias);
        }
示例#6
0
        public async Task <ProductModel> UpdateProductAsync(ClaimsPrincipal claimsPrincipal, ProductModel criterias)
        {
            var exist = await _productService.FindAsync(new IdRequestFilter <long>
            {
                Id = criterias.Id,
                CanGetInactived = true
            });

            if (exist == null)
            {
                throw new CaminoApplicationException("No article found");
            }

            var currentUserId = GetCurrentUserId(claimsPrincipal);

            if (currentUserId != exist.CreatedById)
            {
                throw new UnauthorizedAccessException();
            }

            var product = new ProductModifyRequest()
            {
                Id          = criterias.Id,
                CreatedById = currentUserId,
                UpdatedById = currentUserId,
                Name        = criterias.Name,
                Description = criterias.Description,
                Price       = criterias.Price,
                Pictures    = criterias.Pictures.Select(x => new PictureRequest()
                {
                    Base64Data  = x.Base64Data,
                    FileName    = x.FileName,
                    ContentType = x.ContentType,
                    Id          = x.PictureId
                }),
                Categories = criterias.Categories.Select(x => new ProductCategoryRequest()
                {
                    Id = x.Id
                }),
                Farms = criterias.Farms.Select(x => new ProductFarmRequest()
                {
                    FarmId = x.Id
                }),
                ProductAttributes = criterias.ProductAttributes?.Select(x => new ProductAttributeRelationRequest
                {
                    Id                      = x.Id,
                    ControlTypeId           = x.ControlTypeId,
                    DisplayOrder            = x.DisplayOrder,
                    ProductAttributeId      = x.AttributeId,
                    AttributeRelationValues = x.AttributeRelationValues?.Select(c => new ProductAttributeRelationValueRequest
                    {
                        Id                        = c.Id,
                        DisplayOrder              = c.DisplayOrder,
                        Name                      = c.Name,
                        PriceAdjustment           = c.PriceAdjustment,
                        PricePercentageAdjustment = c.PricePercentageAdjustment,
                        Quantity                  = c.Quantity
                    })
                })
            };

            await _productService.UpdateAsync(product);

            return(criterias);
        }
示例#7
0
        public async Task <bool> UpdateAsync(ProductModifyRequest request)
        {
            var modifiedDate = DateTimeOffset.UtcNow;
            var product      = _productRepository.FirstOrDefault(x => x.Id == request.Id);

            product.Description = request.Description;
            product.Name        = request.Name;
            product.UpdatedById = request.UpdatedById;
            product.UpdatedDate = modifiedDate;

            // Update Category
            var categoryIds = request.Categories.Select(x => x.Id);
            await _productCategoryRelationRepository
            .Get(x => x.ProductId == request.Id && x.ProductCategoryId.NotIn(categoryIds))
            .DeleteAsync();

            var linkedCategoryIds = _productCategoryRelationRepository
                                    .Get(x => x.ProductId == request.Id && x.ProductCategoryId.In(categoryIds))
                                    .Select(x => x.ProductCategoryId)
                                    .ToList();

            var unlinkedCategories = request.Categories.Where(x => x.Id.NotIn(linkedCategoryIds));

            if (unlinkedCategories != null && unlinkedCategories.Any())
            {
                foreach (var category in unlinkedCategories)
                {
                    _productCategoryRelationRepository.Add(new ProductCategoryRelation()
                    {
                        ProductCategoryId = category.Id,
                        ProductId         = request.Id
                    });
                }
            }

            // Update Farm
            var farmIds = request.Farms.Select(x => x.FarmId);
            await _farmProductRepository
            .Get(x => x.ProductId == request.Id && x.FarmId.NotIn(farmIds))
            .DeleteAsync();

            var linkedFarmIds = _farmProductRepository
                                .Get(x => x.ProductId == request.Id && x.FarmId.In(farmIds))
                                .Select(x => x.FarmId)
                                .ToList();

            var unlinkedFarms = request.Farms.Where(x => x.FarmId.NotIn(linkedFarmIds));

            if (unlinkedFarms != null && unlinkedFarms.Any())
            {
                foreach (var farm in unlinkedFarms)
                {
                    _farmProductRepository.Add(new FarmProduct()
                    {
                        FarmId     = farm.FarmId,
                        ProductId  = request.Id,
                        IsLinked   = true,
                        LinkedById = product.CreatedById,
                        LinkedDate = modifiedDate
                    });
                }
            }

            // Unlink all price
            var totalPriceUpdated = await _productPriceRepository.Get(x => x.ProductId == request.Id && x.IsCurrent && x.Price != request.Price)
                                    .Set(x => x.IsCurrent, false)
                                    .UpdateAsync();

            if (totalPriceUpdated > 0)
            {
                await _productPriceRepository.AddAsync(new ProductPrice()
                {
                    PricedDate = modifiedDate,
                    ProductId  = request.Id,
                    Price      = request.Price,
                    IsCurrent  = true
                });
            }

            _productRepository.Update(product);

            return(true);
        }
        public async Task <IActionResult> Update(ProductModel model)
        {
            if (!ModelState.IsValid)
            {
                return(RedirectToErrorPage());
            }

            var attributeValues = model.ProductAttributes?.SelectMany(x => x.AttributeRelationValues);
            var product         = new ProductModifyRequest()
            {
                Id          = model.Id,
                UpdatedById = LoggedUserId,
                CreatedById = LoggedUserId,
                Name        = model.Name,
                Description = model.Description,
                Price       = model.Price,
                Categories  = model.ProductCategoryIds.Select(id => new ProductCategoryRequest()
                {
                    Id = id
                }),
                Farms = model.ProductFarmIds.Select(id => new ProductFarmRequest()
                {
                    FarmId = id
                }),
                ProductAttributes = model.ProductAttributes?.Select(x => new ProductAttributeRelationRequest
                {
                    Id                      = x.Id,
                    ControlTypeId           = x.ControlTypeId,
                    DisplayOrder            = x.DisplayOrder,
                    ProductAttributeId      = x.AttributeId,
                    AttributeRelationValues = attributeValues
                                              .Where(v => v.AttributeRelationId == x.Id && v.AttributeId == x.AttributeId)?.Select(c => new ProductAttributeRelationValueRequest
                    {
                        Id                        = c.Id,
                        DisplayOrder              = c.DisplayOrder,
                        Name                      = c.Name,
                        PriceAdjustment           = c.PriceAdjustment,
                        PricePercentageAdjustment = c.PricePercentageAdjustment,
                        Quantity                  = c.Quantity
                    })
                })
            };

            if (product.Id <= 0)
            {
                return(RedirectToErrorPage());
            }

            var exist = await _productService.FindAsync(new IdRequestFilter <long>
            {
                Id              = model.Id,
                CanGetDeleted   = true,
                CanGetInactived = true
            });

            if (exist == null)
            {
                return(RedirectToErrorPage());
            }

            if (model.Pictures != null && model.Pictures.Any())
            {
                product.Pictures = model.Pictures.Select(x => new PictureRequest()
                {
                    Base64Data  = x.Base64Data,
                    ContentType = x.ContentType,
                    FileName    = x.FileName,
                    Id          = x.PictureId
                });
            }

            product.UpdatedById = LoggedUserId;
            await _productService.UpdateAsync(product);

            return(RedirectToAction(nameof(Detail), new { id = product.Id }));
        }
示例#9
0
        public async Task <bool> UpdateAsync(ProductModifyRequest request)
        {
            var modifiedDate = DateTimeOffset.UtcNow;

            request.UpdatedDate = modifiedDate;
            var isUpdated = await _productRepository.UpdateAsync(request);

            if (!isUpdated)
            {
                return(false);
            }

            await _productPictureRepository.UpdateAsync(new ProductPicturesModifyRequest
            {
                ProductId   = request.Id,
                CreatedById = request.CreatedById,
                UpdatedById = request.UpdatedById,
                CreatedDate = modifiedDate,
                UpdatedDate = modifiedDate,
                Pictures    = request.Pictures
            });

            // Delete all product attributes in cases no product attributes from the request
            if (request.ProductAttributes == null || !request.ProductAttributes.Any())
            {
                await _productAttributeRepository.DeleteAttributeRelationByProductIdAsync(request.Id);

                return(isUpdated);
            }

            var groupOfAttributes = new List <ProductAttributeRelationRequest>();

            foreach (var attributeRelation in request.ProductAttributes)
            {
                var existAttribute = groupOfAttributes.FirstOrDefault(x => x.ProductAttributeId == attributeRelation.ProductAttributeId);
                if (existAttribute != null)
                {
                    var attributeValues = existAttribute.AttributeRelationValues.ToList();
                    attributeValues.AddRange(attributeRelation.AttributeRelationValues);

                    existAttribute.AttributeRelationValues = attributeValues;
                }
                else
                {
                    groupOfAttributes.Add(attributeRelation);
                }
            }

            var productAttributeIds = request.ProductAttributes.Where(x => x.Id != 0).Select(x => x.Id);
            await _productAttributeRepository.DeleteAttributeRelationNotInIdsAsync(request.Id, productAttributeIds);

            foreach (var attributeRelation in request.ProductAttributes)
            {
                attributeRelation.ProductId = request.Id;
                var isAttributeRelationExist = attributeRelation.Id != 0 && await _productAttributeRepository.IsAttributeRelationExistAsync(attributeRelation.Id);

                if (!isAttributeRelationExist)
                {
                    await _productAttributeRepository.CreateAttributeRelationAsync(attributeRelation);
                }
                else
                {
                    await _productAttributeRepository.UpdateAttributeRelationAsync(attributeRelation);
                }
            }

            return(isUpdated);
        }