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() }); } }