Esempio n. 1
0
        public async Task <TransactionResponse> Execute(TransactionModel transactionModel)
        {
            BuyerData buy = new BuyerData(transactionModel.Price, transactionModel.Quantity);

            try
            {
                await _buyerRepository.AddBuyerData(buy);

                List <SellerData> SellerList = await _sellerRepository.GetGreaterSellerPriceListFromBuyerPrice(buy.BuyPrice);

                foreach (var sell in SellerList)
                {
                    decimal Quantities = 0.0m;
                    if (buy.RemainingQuantity >= sell.RemainingQuantity)
                    {
                        Quantities = sell.RemainingQuantity;
                    }
                    else
                    {
                        Quantities = buy.RemainingQuantity;
                    }

                    sell.RemainingQuantity -= Quantities;
                    sell.SettledQuantity   += Quantities;
                    buy.RemainingQuantity  -= Quantities;
                    buy.SettledQuantity    += Quantities;

                    if (sell.RemainingQuantity == 0)
                    {
                        sell.StatusChangeToSettleStatus();
                    }
                    else
                    {
                        sell.StatusChangeToOnHoldStatus();
                    }
                    if (buy.RemainingQuantity == 0)
                    {
                        buy.StatusChangeToSettleStatus();
                    }
                    else
                    {
                        buy.StatusChangeToOnHoldStatus();
                    }

                    await _sellerRepository.UpdateSellerData(sell);

                    await _buyerRepository.UpdateBuyerData(buy);

                    await _ledgerRepository.AddLedgerData(sell, buy, Quantities);

                    if (buy.RemainingQuantity == 0)
                    {
                        break;
                    }
                }
                TransactionResponse transactionResponse = new TransactionResponse();
                transactionResponse.UniqId        = buy.BuyId.ToString();
                transactionResponse.StatusCode    = (int)buy.TransactionStatus;
                transactionResponse.StatusMessage = buy.TransactionStatus.ToString();

                return(transactionResponse);
            }
            catch (Exception)
            {
                return(new TransactionResponse {
                    ErrorCode = enErrorCode.InternalError, StatusCode = (int)TransactionStatus.Validationfail, StatusMessage = TransactionStatus.Validationfail.ToString()
                });
            }
        }