Ejemplo n.º 1
0
        public async Task <IActionResult> CreateSales([FromBody] CreateSaleDto createSaleDto)
        {
            if (ModelState.IsValid)
            {
                var res = await _saleService.Create(createSaleDto);

                switch (res)
                {
                case SalesResult.CanNotUpdateSoldExDecInDataBase:
                    return(JsonResponseStatus.Error(new
                                                    { Info = "هنوز اظهارنامه به لیست فروش رفته ها وارد نشده است " }));

                case SalesResult.CanNotUpdateSoldPiDetailInDataBase:
                    return(JsonResponseStatus.Error(new { Info = "هنوز PI به لیست فروش رفته ها وارد نشده است " }));

                case SalesResult.SumBrokerAccountBalanceIsLowerThanPrice:
                    return(JsonResponseStatus.Error(new
                                                    { Info = " مقدار انتخاب شده برای فروش از مقدار موجودی کارگزار بیشتر است" }));

                case SalesResult.ExDecAccountBalanceIsLowerThanPrice:
                    return(JsonResponseStatus.Error(new
                                                    { Info = "مقدارانتخاب شده برای فروش از مقدار  موجودی اظهارنامه بیشتر است" }));
                }
            }

            return(JsonResponseStatus.Success());
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> CreateSale(CreateSaleDto createSaleDto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            createSaleDto.VehicleCodes = createSaleDto.VehicleCodes.Distinct().ToList();

            var seller = await _bhsDbContext.Sellers.FindAsync(createSaleDto.SellerCode);

            var vehicles = await _bhsDbContext.Vehicles
                           .Where(vehicles => createSaleDto.VehicleCodes.Contains(vehicles.Code))
                           .ToListAsync();


            if (seller == null || createSaleDto.VehicleCodes.Count != vehicles.Count)
            {
                return(UnprocessableEntity());
            }

            var sale = new Sale
            {
                Seller   = seller,
                Status   = SaleStatus.WaitingPayment,
                Vehicles = vehicles
            };

            await _bhsDbContext.Sales.AddAsync(sale);

            await _bhsDbContext.SaveChangesAsync();

            return(CreatedAtAction("GetById", new { id = sale.Id }, sale));
        }
        private async Task <SalesResult> ValidationBeforCreateCurrencySales(CreateSaleDto createPiDto)
        {
            //var sumExDec = await _declarationRepository.GetSumExDecAccountBalance();
            //if (createPiDto.SalePrice > sumExDec)
            //{
            //    return SalesResult.ExDecAccountBalanceIsLowerThanPrice;
            //}

            var sumPiDetail = await _piDetailRepository.GetSumBrokerAccountBalance(createPiDto.BrokerId);

            if (createPiDto.SalePrice > sumPiDetail)
            {
                return(SalesResult.SumBrokerAccountBalanceIsLowerThanPrice);
            }

            return(SalesResult.Success);
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> CreateSale([FromBody] CreateSaleDto saleDto)
        {
            var sale = new Sale
            {
                Store_id   = saleDto.Store_id,
                Bouquet_id = saleDto.Bouquet_id,
                Amount     = saleDto.Amount,
                FirstName  = saleDto.FirstName,
                LastName   = saleDto.LastName
            };
            await _salesRepository.InsertSaleAsync(sale);

            _memoryCache.Remove(CacheKeys.AllSales);
            // Debatable if you want to do a fetch from the cache or a fetch directly from the db. This all depends on your configuration
            var returningSale = (await GetAllSalesFromCacheAsync()).FirstOrDefault(x => x.Id == sale.Id);

            return(base.CreatedAtRoute(nameof(GetSale), new { Id = sale.Id }, returningSale));
        }
        public async Task <SalesResult> Create(CreateSaleDto createPiDto)
        {
            //var result = await ValidationBeforCreateCurrencySales(createPiDto);
            //if (result == SalesResult.Success)
            //{

            #region Create Currency Sale

            var currencySale = new CurrencySale()
            {
                SaleDate         = createPiDto.SaleDate,
                SalePrice        = createPiDto.SalePrice,
                SalePricePerUnit = createPiDto.SalePricePerUnit,
                BrokerId         = createPiDto.BrokerId,
                CustomerId       = createPiDto.CustomerId,
                TransferType     = (CurrencyTransferType)createPiDto.TransferType,
                TransferPrice    = createPiDto.TransferPrice,
                Description      = createPiDto.Description,
                CurrencyType     = (CurrencyType)createPiDto.CurrencyType
            };
            await _saleRepository.AddEntity(currencySale);

            #endregion

            #region Insert Data To CurrencySalesDetail By System

            var result = await FillAutomaticCurrencySaleDetailExDecsAndCurrencySaleDetailPis(createPiDto, currencySale);

            if (result != SalesResult.Success)
            {
                return(result);
            }



            #endregion
            //}


            await _saleRepository.SaveChanges();

            return(result);
        }
        private async Task <SalesResult> InserSaleCurrPiDetail(List <PeroformaInvoiceDetail> peroformaInvoiceDetails, CreateSaleDto saleDto, CurrencySale currencySales)
        {
            long totalInserted = 0;

            foreach (var piDetailDto in peroformaInvoiceDetails)
            {
                #region Validation - PiDetail Price Is Ok

                var usedPriceOfPiCode = await _salePiDetailRepository.GetSumPiCodeUsedById(piDetailDto.Id);

                var remaindPriceOfPiCode = piDetailDto.DepositPrice - usedPriceOfPiCode;
                var priceOfSales         = saleDto.SalePrice + saleDto.TransferPrice;
                //if (piDetailDto.DepositPrice < remaindPriceOfExdecCode)
                //{
                //    return SalesResult.PiAccountBalanceIsLowerThanPrice;
                //}

                long price;
                long profit;
                var  piBasePrice = piDetailDto.PeroformaInvoice.BasePrice;
                if (priceOfSales >= remaindPriceOfPiCode)
                {
                    price = remaindPriceOfPiCode;
                }
                else
                {
                    price = piDetailDto.DepositPrice;
                }

                if (price + totalInserted > priceOfSales)
                {
                    price  = priceOfSales - totalInserted;
                    profit = (saleDto.SalePricePerUnit - piBasePrice) * (price - saleDto.TransferPrice);
                }
                else
                {
                    profit = (saleDto.SalePricePerUnit - piBasePrice) * price;
                }



                #endregion

                #region Insert Data To CurrencySaleDetailPi

                var currencySaleDetailPi = new CurrencySaleDetailPi()
                {
                    CurrencySale             = currencySales,
                    Price                    = price,
                    ProfitLossAmount         = saleDto.CurrencyType == CurrencyType.CarrencySales ? profit : 0,
                    PeroformaInvoiceDetailId = piDetailDto.Id
                };
                await _salePiDetailRepository.AddEntity(currencySaleDetailPi);

                //await _salePiDetailRepository.SaveChanges();

                #endregion

                #region Update Sold In PiDetail

                if (price + usedPriceOfPiCode == piDetailDto.DepositPrice)
                {
                    var updateSold = await _piDetailRepository.SoldedPiDetail(piDetailDto.Id);

                    if (!updateSold)
                    {
                        return(SalesResult.CanNotUpdateSoldPiDetailInDataBase);
                    }
                }



                #endregion

                totalInserted += price;
                if (totalInserted == priceOfSales)
                {
                    return(SalesResult.Success);
                }
            }

            return(SalesResult.Success);
        }
        private async Task <SalesResult> InserSaleCurrExDecManual(List <ExDecExport> exDecList, CreateSaleDto saleDto, CurrencySale currencySales)
        {
            long totalInserted = 0;

            foreach (var exdecItem in exDecList)
            {
                #region Validation - ExDec Price Is Ok

                var exdecEntity = await _declarationRepository.GetEntityById(exdecItem.Id);

                var usedPriceOfExdecCode = await _saleExDecRepository.GetSumExCodeUsedById(exdecItem.Id);

                var remaindPriceOfExdecCode = exdecEntity.Price - usedPriceOfExdecCode;
                //if (exdecEntity.Price < exdec.Price)
                //{
                //    return SalesResult.ExDecAccountBalanceIsLowerThanPrice;
                //}

                //if (exdec.Price < remaindPriceOfExdecCode)
                //{
                //    return SalesResult.ExDecAccountBalanceIsLowerThanPrice;
                //}

                long price;

                if (exdecItem.Price >= remaindPriceOfExdecCode)
                {
                    price = remaindPriceOfExdecCode + (exdecItem.Price - remaindPriceOfExdecCode);
                }
                else
                {
                    price = exdecItem.Price;
                }

                //if (exdecItem.Price + totalInserted > saleDto.SalePrice)
                //{
                //    price = saleDto.SalePrice - totalInserted;
                //}
                #endregion

                #region Insert Into CurrencySaleDetailExDec

                var currencySaleDetailEx = new CurrencySaleDetailExDec
                {
                    CurrencySale    = currencySales,
                    Price           = price,
                    ExDeclarationId = exdecItem.Id
                };
                await _saleExDecRepository.AddEntity(currencySaleDetailEx);

                //await _saleExDecRepository.SaveChanges();

                #endregion



                #region Update Sold In ExDeclaration
                if (exdecItem.Price + usedPriceOfExdecCode >= exdecEntity.Price)
                {
                    var updateSoldExdec = await _declarationRepository.SoldedDeclaration(exdecEntity.Id);

                    if (!updateSoldExdec)
                    {
                        return(SalesResult.CanNotUpdateSoldExDecInDataBase);
                    }
                }

                #endregion

                totalInserted += exdecItem.Price;
                if (totalInserted == saleDto.SalePrice)
                {
                    return(SalesResult.Success);
                }
            }

            return(SalesResult.Success);
        }
        private async Task <SalesResult> FillAutomaticCurrencySaleDetailExDecsAndCurrencySaleDetailPis(CreateSaleDto saleDto, CurrencySale currencySales)
        {
            #region Get List Of ExDeclaration (Is Not Sold Yet)

            if (saleDto.CurrencyType == CurrencyType.CarrencySales)
            {
                Boolean isExDecAutomatic;
                var     exDecList = new List <ExDecExport>();
                if (saleDto.ExDecExport.Count > 0)
                {
                    isExDecAutomatic = false;
                    exDecList        = saleDto.ExDecExport;
                }
                else
                {
                    isExDecAutomatic = true;
                    var lisexDecList = await _declarationRepository.GetExDecAccountBalanceByExDecId();

                    foreach (var item in lisexDecList)
                    {
                        exDecList.Add(new ExDecExport {
                            Id = item.Id, Price = item.Price, ExCode = item.ExchangeDeclarationCode
                        });
                    }
                }

                #region Insert Into CurrencySaleDetailExDec

                if (isExDecAutomatic)
                {
                    var saleexDecResult = await InserSaleCurrExDecAutomatic(exDecList, saleDto, currencySales);

                    if (saleexDecResult != SalesResult.Success)
                    {
                        return(saleexDecResult);
                    }
                }
                else
                {
                    var saleexDecResult = await InserSaleCurrExDecManual(exDecList, saleDto, currencySales);

                    if (saleexDecResult != SalesResult.Success)
                    {
                        return(saleexDecResult);
                    }
                }
                #endregion
            }

            #endregion

            #region Get List Of PiDetails (Is Not Sold Yet)

            var brokerId = saleDto.CurrencyType == CurrencyType.CurrencyTransferFromTheBroker ? saleDto.CustomerId : saleDto.BrokerId;

            var piDetails = await _piDetailRepository.GetAccountBalanceByDetailsByBrokerId(brokerId);

            #region Insert Into  CurrencySalePi

            var salePiDetailResult = await InserSaleCurrPiDetail(piDetails, saleDto, currencySales);

            if (salePiDetailResult != SalesResult.Success)
            {
                return(salePiDetailResult);
            }
            if (saleDto.CurrencyType == CurrencyType.CurrencyTransferFromTheBroker)
            {
                var updateStartBrokerAmount = await _brokerRepository.UpdateBrokerAmount(saleDto.CustomerId, saleDto.SalePrice + saleDto.TransferPrice, false);

                if (!updateStartBrokerAmount)
                {
                    return(SalesResult.CannotUpdateBrokerAmountBalance);
                }

                var updateBrokerAmount = await _brokerRepository.UpdateBrokerAmount(saleDto.BrokerId, saleDto.SalePrice, true);

                if (!updateBrokerAmount)
                {
                    return(SalesResult.CannotUpdateBrokerAmountBalance);
                }
            }
            else
            {
                var updateBrokerAmount = await _brokerRepository.UpdateBrokerAmount(saleDto.BrokerId, saleDto.SalePrice + saleDto.TransferPrice, false);

                if (!updateBrokerAmount)
                {
                    return(SalesResult.CannotUpdateBrokerAmountBalance);
                }
            }

            #endregion

            #endregion

            return(SalesResult.Success);
        }