예제 #1
0
        public IActionResult AddProductToCart(WebAPIModelOfInsertMemberBasket productToAddedToBasket)
        {
            var resultFromAddProductToCart = this.ManagerOfMemberBaskets
                                             .AddProductToCart(productToBeAddedToCart: productToAddedToBasket);

            return(StatusCode(statusCode: StatusCodes.Status200OK,
                              value: resultFromAddProductToCart));
        }
        ResultModel IManagerOfMemberBaskets.AddProductToCart(WebAPIModelOfInsertMemberBasket productToBeAddedToCart)
        {
            ResultModel resultModel = default(ResultModel);

            if (productToBeAddedToCart == null)
            {
                resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.ProductInformationToBeAddedToTheCartCannotBeEmpty);
            }
            else
            {
                var isThereAnyMember = this.ManagerOfMembers.FetchMemberById(idOfMember: productToBeAddedToCart.BasketOwnerMemberId);
                if (!isThereAnyMember.SuccessInformation.IsResultSuccessful && isThereAnyMember.MemberInformation == null)
                {
                    return(isThereAnyMember.SuccessInformation);
                }

                var isThereAnyProduct = this.ManagerOfProducts.FetchProductById(idOfProduct: productToBeAddedToCart.ProductId);
                if (!isThereAnyProduct.InformationOfSuccess.IsResultSuccessful && isThereAnyProduct.InformationOfProduct == null)
                {
                    return(isThereAnyProduct.InformationOfSuccess);
                }

                var isThereAnyProductStock = this.ManagerOfProductStocks.FetchProductStockInformationByProductId(productId: productToBeAddedToCart.ProductId);
                if (!isThereAnyProductStock.InformationOfSuccess.IsResultSuccessful && isThereAnyProductStock.InformationOfProductStock == null)
                {
                    return(isThereAnyProductStock.InformationOfSuccess);
                }

                if (isThereAnyMember.MemberInformation != null &&
                    isThereAnyProduct.InformationOfProduct != null &&
                    isThereAnyProductStock.InformationOfProductStock != null)
                {
                    if (productToBeAddedToCart.ProductQuantity <= 0)
                    {
                        return(ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.QuantityValueCannotBeNegativeOrEqualToZero));
                    }
                    if (productToBeAddedToCart.ProductQuantity > isThereAnyProductStock.InformationOfProductStock.ProductStockQuantity)
                    {
                        resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.WarningOfInsufficientStock);
                    }
                    else
                    {
                        /*
                         * Ilgili kullanici icin Sepete eklenmek istenilen Urun, daha onceden sepetten silinmemis veya
                         * sepete eklenip satin alinmamis halinin varligi kontrol edilir.
                         */
                        DTOOfMemberBaskets isThereThisProductInTheBasket =
                            this.MapperOfMemberBaskets
                            .MapToDTO(entityObject: this.UnitOfWorkForBasketApplication
                                      .RepositoryOfMemberBaskets
                                      .FetchAnyRecord(whereConditions: x => x.Status == true &&
                                                      x.ReleaseDate == null &&
                                                      x.ProductId == productToBeAddedToCart.ProductId &&
                                                      x.MemberId == productToBeAddedToCart.BasketOwnerMemberId &&
                                                      x.ClosingReasonId == (byte)BasketClosingReasonTypes.Added));

                        /*
                         * Eger Urun, daha onceden Sepetten silinmemis veya satin alinmamis
                         * ise ya da hic eklenmemis ise ilk defa URUN, Sepete eklenir
                         */
                        if (isThereThisProductInTheBasket == null)
                        {
                            int numberOfRowsAffected = default(int);
                            try
                            {
                                DTOOfMemberBaskets addedProductToCart =
                                    this.MapperOfMemberBaskets
                                    .MapToDTO(entityObject: this.UnitOfWorkForBasketApplication
                                              .RepositoryOfMemberBaskets
                                              .InsertRecord(recordToInsert: this.MapperOfMemberBaskets
                                                            .MapToEntity(dtoObject: new DTOOfMemberBaskets
                                {
                                    Status          = true,
                                    ReleaseDate     = null,
                                    Id              = Guid.NewGuid(),
                                    CreationDate    = DateTime.Now,
                                    ProductId       = productToBeAddedToCart.ProductId,
                                    Quantity        = productToBeAddedToCart.ProductQuantity,
                                    MemberId        = productToBeAddedToCart.BasketOwnerMemberId,
                                    ClosingReasonId = (byte)BasketClosingReasonTypes.Added,
                                })));
                                numberOfRowsAffected = this.UnitOfWorkForBasketApplication.SaveChanges();
                                if (numberOfRowsAffected <= 0)
                                {
                                    resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.AddProductToCartUnsuccessful);
                                }
                                else
                                {
                                    resultModel = ResultModel.SuccessfulResult(messageOfResultSuccessful: ConstantsOfResults.AddProductToCartSuccessful);
                                }
                            }
                            catch (Exception exception)
                            {
                                resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful:
                                                                             $"{ConstantsOfErrors.TransactionErrorMessageOfAddProductToCart} HATA : {exception.Message}");
                            }
                            finally
                            {
                                this.UnitOfWorkForBasketApplication.Dispose();
                            }
                        }

                        /*
                         *  Urun daha onceden Sepet'e eklenmis ise ve yeterli Stok varsa URUN'e ait adet artirimi yapilir.
                         */
                        else
                        {
                            /* Alinmak istenilen URUN adeti, Stok'ta bulunan adetten buyuk mu diye kontrol edilir */
                            if ((productToBeAddedToCart.ProductQuantity + isThereThisProductInTheBasket.Quantity) >
                                isThereAnyProductStock.InformationOfProductStock.ProductStockQuantity)
                            {
                                resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.WarningOfInsufficientStock);
                            }
                            else
                            {
                                /* Alinmak istenilen URUN adeti, Stok degeriyle ayni ise veya daha kucuk ise
                                 * Urun'e ait adet sayisi eski sayi ile toplanarak Sepette ki deger guncellenir
                                 */
                                isThereThisProductInTheBasket.Quantity += productToBeAddedToCart.ProductQuantity;

                                resultModel = this.UpdateSelectedProductInCart(newlyInformationForProductInTheBasket: isThereThisProductInTheBasket);
                            }
                        }
                    }
                }
                else
                {
                    resultModel = ResultModel.UnsuccessfulResult(messageOfResultUnsuccessful: ConstantsOfResults.GeneralWarningForAddProductToCart);
                }
            }

            return(resultModel);
        }