public void OnStatusSuccess(short Status, TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType) { try { GetTradeHistoryInfo historyInfo = new GetTradeHistoryInfo(); GetBuySellBook BuySellmodel = new GetBuySellBook(); //update Recent Order //pop OpenOrder //add tradehistory //add orderhistory //pop buyer/seller book; //HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, "Call ---- TransactionQueue :" + JsonConvert.SerializeObject(Newtransaction) + " TradeTransactionQueue :" + JsonConvert.SerializeObject(NewTradeTransaction)); if (string.IsNullOrEmpty(Token)) { Token = GetTokenByUserID(NewTradeTransaction.MemberID.ToString()); } if (!string.IsNullOrEmpty(Token)) { BuySellmodel.Amount = 0; BuySellmodel.OrderId = new Guid(); BuySellmodel.RecordCount = 0; if (NewTradeTransaction.TrnType == 4)//Buy { BuySellmodel.Price = NewTradeTransaction.BidPrice; BuyerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, "BuyerBook call TRNNO:" + Newtransaction.Id); } else//Sell { BuySellmodel.Price = NewTradeTransaction.AskPrice; SellerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, "SellerBook call TRNNO:" + Newtransaction.Id); } GetAndSendRecentOrderData(Newtransaction, NewTradeTransaction, Token, OrderType); //Update Recent HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, " Aftre Recent Order Socket call TRNNO:" + Newtransaction.Id); GetAndSendOpenOrderData(Newtransaction, NewTradeTransaction, Token, OrderType, 1); //update OpenOrder HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, " Aftre Open Order Socket call TRNNO:" + Newtransaction.Id); historyInfo = GetAndSendTradeHistoryInfoData(Newtransaction, NewTradeTransaction, OrderType); OrderHistory(historyInfo, historyInfo.PairName); //Order HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, " Aftre Order History Socket call : TRNNO:" + Newtransaction.Id); TradeHistory(historyInfo, Token); //TradeHistory HelperForLog.WriteLogIntoFile("OnStatusSuccess", ControllerName, " Aftre Trade History Socket call : TRNNO:" + Newtransaction.Id); var msg = EnResponseMessage.SignalRTrnSuccessfullySettled; msg = msg.Replace("#Price#", historyInfo.Price.ToString()); msg = msg.Replace("#Qty#", historyInfo.Amount.ToString()); msg = msg.Replace("#Total#", historyInfo.Total.ToString()); ActivityNotification(msg, Token); } } catch (Exception ex) { HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); //throw ex; } }
public void OnStatusCancel(short Status, TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType) { try { GetTradeHistoryInfo historyInfo = new GetTradeHistoryInfo(); //pop from OpenOrder //update Recent order //add Trade history //HelperForLog.WriteLogIntoFile("OnStatusCancel", ControllerName, " TransactionQueue :" + JsonConvert.SerializeObject(Newtransaction) + " TradeTransactionQueue :" + JsonConvert.SerializeObject(NewTradeTransaction)); if (string.IsNullOrEmpty(Token)) { Token = GetTokenByUserID(NewTradeTransaction.MemberID.ToString()); } if (!string.IsNullOrEmpty(Token)) { GetAndSendOpenOrderData(Newtransaction, NewTradeTransaction, Token, OrderType, 1); //with amount 0, remove from OpenOrder HelperForLog.WriteLogIntoFile("OnStatusCancel", ControllerName, " Aftre Open Order Socket call : TRNNO:" + Newtransaction.Id); GetAndSendRecentOrderData(Newtransaction, NewTradeTransaction, Token, OrderType); //Update Recent HelperForLog.WriteLogIntoFile("OnStatusCancel", ControllerName, " Aftre Recent Order Socket call : TRNNO:" + Newtransaction.Id); historyInfo = GetAndSendTradeHistoryInfoData(Newtransaction, NewTradeTransaction, OrderType); TradeHistory(historyInfo, Token);//TradeHistory HelperForLog.WriteLogIntoFile("OnStatusCancel", ControllerName, " Aftre Trade History Socket call : TRNNO:" + Newtransaction.Id); } } catch (Exception ex) { _logger.LogError(ex, "An unexpected exception occured,\nMethodName:" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\nClassname=" + this.GetType().Name, LogLevel.Error); //throw ex; } //public void OnWalletBalChangeByUserID(WalletMasterResponse Data, string WalletTypeName, long UserID) //{ // try // { // //string str = "clientId=cleanarchitecture&grant_type=password&[email protected]&password=P@ssw0rd!&scope=openid profile email offline_access client_id roles phone"; // //str = str.Replace("=","\":\""); // //str = str.Replace("&", "\",\""); // //str = "{\"" + str + "\"}"; // //var obj = JsonConvert.DeserializeObject(str); // //var jsonData= JsonConvert.SerializeObject(obj); // var Redis = new RadisServices<ConnetedClientToken>(this._fact); // string AccessToken = Redis.GetHashData("Tokens:" + UserID.ToString(), "Token"); // Token = AccessToken; // BuyerSideWalletBal(Data, WalletTypeName, Token); // SellerSideWalletBal(Data, WalletTypeName, Token); // } // catch (Exception ex) // { // HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); // //throw ex; // } }
public void GetAndSendOpenOrderData(TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType, short IsPop = 0) { try { ActiveOrderInfo OpenOrderModel = new ActiveOrderInfo(); OpenOrderModel.Id = Newtransaction.Id; OpenOrderModel.TrnDate = Newtransaction.TrnDate; OpenOrderModel.Type = (NewTradeTransaction.TrnType == 4) ? "BUY" : "SELL"; OpenOrderModel.Order_Currency = NewTradeTransaction.Order_Currency; OpenOrderModel.Delivery_Currency = NewTradeTransaction.Delivery_Currency; if (IsPop == 1) { OpenOrderModel.Amount = 0; } else { OpenOrderModel.Amount = (NewTradeTransaction.BuyQty == 0) ? NewTradeTransaction.SellQty : (NewTradeTransaction.SellQty == 0) ? NewTradeTransaction.BuyQty : NewTradeTransaction.BuyQty; } OpenOrderModel.Price = (NewTradeTransaction.BidPrice == 0) ? NewTradeTransaction.AskPrice : (NewTradeTransaction.AskPrice == 0) ? NewTradeTransaction.BidPrice : NewTradeTransaction.BidPrice; OpenOrderModel.IsCancelled = NewTradeTransaction.IsCancelled; OpenOrderModel.OrderType = Enum.GetName(typeof(enTransactionMarketType), OrderType); OpenOrderModel.PairId = NewTradeTransaction.PairID; OpenOrderModel.PairName = NewTradeTransaction.PairName; OpenOrder(OpenOrderModel, Token); HelperForLog.WriteLogIntoFile("GetAndSendOpenOrderData", ControllerName, " After OpenOrder call TRNNO:" + Newtransaction.Id); if (IsPop != 1)//send notification { var msg = EnResponseMessage.SignalRTrnSuccessfullyCreated; msg = msg.Replace("#Price#", OpenOrderModel.Price.ToString()); msg = msg.Replace("#Qty#", OpenOrderModel.Amount.ToString()); ActivityNotification(msg, Token); } } catch (Exception ex) { HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); //throw ex; } }
public void GetAndSendRecentOrderData(TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType, short IsPop = 0) { try { RecentOrderInfo model = new RecentOrderInfo(); model.TrnNo = NewTradeTransaction.TrnNo; model.Type = (NewTradeTransaction.TrnType == 4) ? "BUY" : "SELL"; model.Price = (NewTradeTransaction.BidPrice == 0) ? NewTradeTransaction.AskPrice : (NewTradeTransaction.AskPrice == 0) ? NewTradeTransaction.BidPrice : NewTradeTransaction.BidPrice; model.Qty = (NewTradeTransaction.BuyQty == 0) ? NewTradeTransaction.SellQty : (NewTradeTransaction.SellQty == 0) ? NewTradeTransaction.BuyQty : NewTradeTransaction.BuyQty; model.DateTime = Newtransaction.TrnDate; model.Status = NewTradeTransaction.StatusMsg; model.PairId = NewTradeTransaction.PairID; model.PairName = NewTradeTransaction.PairName; model.OrderType = Enum.GetName(typeof(enTransactionMarketType), OrderType); RecentOrder(model, Token); HelperForLog.WriteLogIntoFile("GetAndSendRecentOrderData", ControllerName, "After Socket call RecentOrder TRNNO:" + Newtransaction.Id); } catch (Exception ex) { HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); //throw ex; } }
public void OnStatusHold(short Status, TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType) { try { GetTradeHistoryInfo historyInfo = new GetTradeHistoryInfo(); GetBuySellBook BuySellmodel = new GetBuySellBook(); //add buyer/seller book //add OpenOrder //add recent order // HelperForLog.WriteLogIntoFile("OnStatusHold", ControllerName, " TransactionQueue :" ); if (string.IsNullOrEmpty(Token)) { Token = GetTokenByUserID(NewTradeTransaction.MemberID.ToString()); } List <GetBuySellBook> list = new List <GetBuySellBook>(); if (!string.IsNullOrEmpty(Token)) { if (NewTradeTransaction.TrnType == 4)//Buy { list = _frontTrnRepository.GetBuyerBook(NewTradeTransaction.PairID, NewTradeTransaction.BidPrice); foreach (var model in list) { BuySellmodel = model; break; } if (BuySellmodel.OrderId.ToString() != "00000000-0000-0000-0000-000000000000") { BuyerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusHold", ControllerName, "BuyerBook call TRNNO:" + Newtransaction.Id + " Pair :" + NewTradeTransaction.PairName); } } else//Sell { list = _frontTrnRepository.GetSellerBook(NewTradeTransaction.PairID, NewTradeTransaction.AskPrice); foreach (var model in list) { BuySellmodel = model; break; } if (BuySellmodel.OrderId.ToString() != "00000000-0000-0000-0000-000000000000") { SellerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusHold", ControllerName, "SellerBook call TRNNO:" + Newtransaction.Id + " Pair :" + NewTradeTransaction.PairName); } } //var msg = EnResponseMessage.SignalRTrnSuccessfullyCreated; //msg = msg.Replace("#Price#", historyInfo.Price.ToString()); //msg = msg.Replace("#Qty#", historyInfo.Amount.ToString()); //ActivityNotification(msg, Token); GetAndSendOpenOrderData(Newtransaction, NewTradeTransaction, Token, OrderType); HelperForLog.WriteLogIntoFile("OnStatusHold", ControllerName, " Aftre Open Order Socket call TRNNO:" + Newtransaction.Id); GetAndSendRecentOrderData(Newtransaction, NewTradeTransaction, Token, OrderType); HelperForLog.WriteLogIntoFile("OnStatusHold", ControllerName, " Aftre Recent Order Socket call TRNNO:" + Newtransaction.Id); } } catch (Exception ex) { HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); ////throw ex; } }
public void OnStatusPartialSuccess(short Status, TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType) { try { GetBuySellBook BuySellmodel = new GetBuySellBook(); //update Buyer/seller book //HelperForLog.WriteLogIntoFile("OnStatusPartialSuccess", ControllerName, " TransactionQueue :" + JsonConvert.SerializeObject(Newtransaction) + " TradeTransactionQueue :" + JsonConvert.SerializeObject(NewTradeTransaction)); if (string.IsNullOrEmpty(Token)) { Token = GetTokenByUserID(NewTradeTransaction.MemberID.ToString()); } if (!string.IsNullOrEmpty(Token)) { List <GetBuySellBook> list = new List <GetBuySellBook>(); if (NewTradeTransaction.TrnType == 4)//Buy { list = _frontTrnRepository.GetBuyerBook(NewTradeTransaction.PairID, NewTradeTransaction.BidPrice); foreach (var model in list) { BuySellmodel = model; break; } if (BuySellmodel.OrderId.ToString() != "00000000-0000-0000-0000-000000000000") { BuyerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusPartialSuccess", ControllerName, "BuyerBook call TRNNO:" + Newtransaction.Id); } } else//Sell { list = _frontTrnRepository.GetSellerBook(NewTradeTransaction.PairID, NewTradeTransaction.AskPrice); foreach (var model in list) { BuySellmodel = model; break; } if (BuySellmodel.OrderId.ToString() != "00000000-0000-0000-0000-000000000000") { SellerBook(BuySellmodel, NewTradeTransaction.PairName); HelperForLog.WriteLogIntoFile("OnStatusPartialSuccess", ControllerName, "SellerBook call TRNNO:" + Newtransaction.Id); } } } } catch (Exception ex) { _logger.LogError(ex, "An unexpected exception occured,\nMethodName:" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\nClassname=" + this.GetType().Name, LogLevel.Error); //throw ex; } }
public GetTradeHistoryInfo GetAndSendTradeHistoryInfoData(TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, short OrderType, short IsPop = 0) { try { //var OrderHistoryList = _frontTrnRepository.GetTradeHistory(0, "", "", "", 0, 0, Newtransaction.Id); GetTradeHistoryInfo model = new GetTradeHistoryInfo(); model.TrnNo = NewTradeTransaction.TrnNo; model.Type = (NewTradeTransaction.TrnType == 4) ? "BUY" : "SELL"; model.Price = (NewTradeTransaction.BidPrice == 0) ? NewTradeTransaction.AskPrice : (NewTradeTransaction.AskPrice == 0) ? NewTradeTransaction.BidPrice : NewTradeTransaction.BidPrice; model.Amount = (NewTradeTransaction.TrnType == 4) ? NewTradeTransaction.SettledBuyQty : NewTradeTransaction.SettledSellQty; model.Total = model.Type == "BUY" ? ((model.Price * model.Amount) - model.ChargeRs) : ((model.Price * model.Amount)); model.DateTime = Convert.ToDateTime(NewTradeTransaction.SettledDate); model.Status = NewTradeTransaction.Status; model.StatusText = Enum.GetName(typeof(enTransactionStatus), model.Status); model.PairName = NewTradeTransaction.PairName; model.ChargeRs = Convert.ToDecimal(Newtransaction.ChargeRs); model.IsCancel = NewTradeTransaction.IsCancelled; model.OrderType = Enum.GetName(typeof(enTransactionMarketType), OrderType); return(model); } catch (Exception ex) { HelperForLog.WriteErrorLog(System.Reflection.MethodBase.GetCurrentMethod().Name, this.GetType().Name, ex); //throw ex; return(null); } }
public BizResponse CancellationProcess(BizResponse _Resp, TradeBuyRequest TradeBuyRequestObj, TransactionQueue TransactionQueueObj, TradeTransactionQueue TradeTransactionQueueObj) { decimal DeliverQty = 0; try { //finding the return sell quantity of cancallation order depending on pendingqty of tradebuyquantity //ALSO DIND THE SELL BID PRICE DeliverQty = Helpers.DoRoundForTrading(TransactionQueueObj.Amount * TradeBuyRequestObj.PendingQty / TradeBuyRequestObj.Qty, 8);//@TotalSellQty if (DeliverQty == 0 || DeliverQty < 0 || DeliverQty > TransactionQueueObj.Amount) { _Resp.ErrorCode = enErrorCode.CancelOrder_InvalidDeliveryamount; _Resp.ReturnCode = enResponseCodeService.Fail; _Resp.ReturnMsg = "Invalid Delivery amount"; return(_Resp); } var PoolMst = _TradePoolMaster.GetSingle(e => e.Status == 1 && e.OnProcessing > 0 && e.TotalQty > DeliverQty && e.Id == TradeBuyRequestObj.SellStockID); if (PoolMst == null) { _Resp.ErrorCode = enErrorCode.CancelOrder_StockNotAvilable; _Resp.ReturnCode = enResponseCodeService.Fail; _Resp.ReturnMsg = "Stock Not Avilable"; return(_Resp); } CancellQueueEntry(tradeCancelQueue, TradeBuyRequestObj.TrnNo, TransactionQueueObj.ServiceID, TradeBuyRequestObj.PendingQty, DeliverQty, 0, 0, TradeBuyRequestObj.UserID); PoolOrderObj = CreatePoolOrderForSettlement(TradeBuyRequestObj.UserID, TradeBuyRequestObj.SellStockID, TradeBuyRequestObj.UserID, TradeBuyRequestObj.SellStockID, TradeBuyRequestObj.TrnNo, DeliverQty, CreditWalletID, CreditAccountID); tradeCancelQueue.OrderID = PoolOrderObj.Id; tradeCancelQueue.Status = 1; TradeBuyRequestObj.IsCancel = 1; TradeTransactionQueueObj.SetTransactionStatusMsg("Cancellation Initiated"); TradeTransactionQueueObj.IsCancelled = 1; _TradeTransactionRepository.Update(TradeTransactionQueueObj); _dbContext.Database.BeginTransaction(); _dbContext.Set <TradeCancelQueue>().Add(tradeCancelQueue); _dbContext.Set <PoolOrder>().Add(PoolOrderObj); _dbContext.Entry(PoolOrderObj).State = EntityState.Modified; _dbContext.Entry(TradeBuyRequestObj).State = EntityState.Modified; _dbContext.Entry(TradeTransactionQueueObj).State = EntityState.Modified; _dbContext.SaveChanges(); _dbContext.Database.CommitTransaction(); if (PoolMst.TotalQty >= DeliverQty) { PoolOrderObj.DeliveryAmt = DeliverQty; PoolOrderObj.Status = 1; PoolOrderObj.DRemarks = "Cancel order Delivery Success"; //PoolOrderObj.DMemberID = TradeBuyRequestObj.UserID; DeliveryGivenBy=@MemberID _PoolOrder.Update(PoolOrderObj); PoolMst.TotalQty = PoolMst.TotalQty - DeliverQty; PoolMst.UpdatedDate = DateTime.UtcNow; PoolMst.UpdatedBy = TradeBuyRequestObj.UserID; _TradePoolMaster.Update(PoolMst); TradeBuyRequestObj.Status = 1; _TradeBuyRequest.Update(TradeBuyRequestObj); if (TradeBuyRequestObj.DeliveredQty > 0) { TradeTransactionQueueObj.Status = 1; TradeTransactionQueueObj.StatusMsg = "Success with partial cancellation"; TradeTransactionQueueObj.SettledDate = DateTime.UtcNow; _TradeTransactionRepository.Update(TradeTransactionQueueObj); TransactionQueueObj.Status = 1; TransactionQueueObj.StatusMsg = "Success with partial cancellation"; _TransactionRepository.Update(TransactionQueueObj); TradeBuyRequestObj.Status = 1; TradeBuyRequestObj.UpdatedDate = DateTime.UtcNow; _TradeBuyRequest.Update(TradeBuyRequestObj); } else { TradeTransactionQueueObj.Status = 2; TradeTransactionQueueObj.StatusMsg = "Full Order Cancellation"; TradeTransactionQueueObj.SettledDate = DateTime.UtcNow; _TradeTransactionRepository.Update(TradeTransactionQueueObj); TransactionQueueObj.Status = 2; _TransactionRepository.Update(TransactionQueueObj); TradeBuyRequestObj.Status = 2; TradeBuyRequestObj.UpdatedDate = DateTime.UtcNow; _TradeBuyRequest.Update(TradeBuyRequestObj); } tradeCancelQueue.Status = 1; tradeCancelQueue.SettledDate = DateTime.UtcNow; tradeCancelQueue.UpdatedDate = DateTime.UtcNow; tradeCancelQueue.StatusMsg = "Cancellation Successful."; //TCQ object update pending //Update Wallet //EXEC sp_InsertTransactionAccount //EXEC sp_InsertLedger } _Resp.ErrorCode = enErrorCode.CancelOrder_InsertSuccess; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "Cancel Order Insert Success"; return(_Resp); } catch (Exception ex) { HelperForLog.WriteErrorLog("CancellationProcess:##TrnNo " + TradeBuyRequestObj.TrnNo, ControllerName, ex); _dbContext.Database.RollbackTransaction(); } return(_Resp); }
public Task <BizResponse> PROCESSSETLLEMENT(BizResponse _Resp, TradeBuyRequest TradeBuyRequestObj, ref List <long> HoldTrnNos, string accessToken = "", short IsCancel = 0) { short TrackBit = 0; try { TransactionQueueObj = _TransactionRepository.GetById(TradeBuyRequestObj.TrnNo); TradeTransactionQueueObj = _TradeTransactionRepository.GetSingle(item => item.TrnNo == TradeBuyRequestObj.TrnNo); TradeBuyerListObj = _TradeBuyerList.GetSingle(item => item.TrnNo == TradeBuyRequestObj.TrnNo); _TradeStopLossObj = _TradeStopLoss.GetSingle(item => item.TrnNo == TradeBuyRequestObj.TrnNo); DebitWalletID = TradeTransactionQueueObj.OrderWalletID; DebitAccountID = _WalletService.GetAccWalletID(DebitWalletID); CreditWalletID = TradeTransactionQueueObj.DeliveryWalletID; CreditAccountID = _WalletService.GetAccWalletID(CreditWalletID); if (TradeTransactionQueueObj.IsCancelled == 1 || IsCancel == 1) { //Code for settlement CancellationProcess(_Resp, TradeBuyRequestObj, TransactionQueueObj, TradeTransactionQueueObj); return(Task.FromResult(_Resp)); } if (TradeBuyRequestObj.PendingQty == 0) { _Resp.ErrorCode = enErrorCode.Settlement_AlreadySettled; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "ALready Settled"; return(Task.FromResult(_Resp)); } TradeBuyRequestObj.MakeTransactionHold(); TradeBuyRequestObj.UpdatedDate = Helpers.UTC_To_IST(); TradeBuyRequestObj.IsProcessing = 1; _TradeBuyRequest.Update(TradeBuyRequestObj); TradeBuyerListObj.MakeTransactionHold(); TradeBuyerListObj.UpdatedDate = Helpers.UTC_To_IST(); TradeBuyerListObj.IsProcessing = 1; _TradeBuyerList.Update(TradeBuyerListObj); IEnumerable <TradeSellerList> MatchSellerListBase; //SortedList<TradeSellerList, TradeSellerList> //if (TradeTransactionQueueObj.TrnType == Convert.ToInt16(enTrnType.Buy_Trade))//Take price as Highest and find lower //{ // MatchSellerListBase = _TradeSellerList.FindBy(item => item.Price <= TradeBuyRequestObj.BidPrice && item.IsProcessing == 0 // && item.BuyServiceID == TradeBuyRequestObj.PaidServiceID && // item.SellServiceID == TradeBuyRequestObj.ServiceID // && (item.Status == Convert.ToInt16(enTransactionStatus.Initialize) || item.Status == Convert.ToInt16(enTransactionStatus.Hold)) // && item.RemainQty > 0);//Pending after partial Qty remain //} //else //Take price as Highest and find larger //{ // MatchSellerListBase = _TradeSellerList.FindBy(item => item.Price >= TradeBuyRequestObj.BidPrice && item.IsProcessing == 0 // && item.BuyServiceID == TradeBuyRequestObj.PaidServiceID && // item.SellServiceID == TradeBuyRequestObj.ServiceID // && (item.Status == Convert.ToInt16(enTransactionStatus.Initialize) || item.Status == Convert.ToInt16(enTransactionStatus.Hold)) // && item.RemainQty > 0);//Pending after partial Qty remain //} MatchSellerListBase = _TradeSellerList.FindBy(item => item.Price >= TradeBuyRequestObj.BidPrice && item.IsProcessing == 0 && item.BuyServiceID == TradeBuyRequestObj.PaidServiceID && item.SellServiceID == TradeBuyRequestObj.ServiceID && (item.Status == Convert.ToInt16(enTransactionStatus.Initialize) || item.Status == Convert.ToInt16(enTransactionStatus.Hold)) && item.RemainQty > 0);//Pending after partial Qty remain //var MatchSellerList = MatchSellerListBase.OrderBy(x => x.Price).OrderBy(x => x.TrnNo); var MatchSellerList = MatchSellerListBase.OrderByDescending(x => x.Price).OrderBy(x => x.TrnNo); foreach (TradeSellerList SellerList in MatchSellerList) { if (SellerList.IsProcessing == 1) { continue; } TrackBit = 1; decimal SettlementQty = 0; List <CreditWalletDrArryTrnID> CreditWalletDrArryTrnIDList = new List <CreditWalletDrArryTrnID>(); SellerList.IsProcessing = 1; _TradeSellerList.Update(SellerList); var PoolMst = _TradePoolMaster.GetById(SellerList.PoolID); //====================================Partial SETTLEMENT TO MEMBER if (SellerList.RemainQty < TradeBuyRequestObj.PendingQty) { SettlementQty = SellerList.RemainQty;//Take all Seller's Qty //Topup Order create PoolOrderObj = CreatePoolOrderForSettlement(TradeBuyRequestObj.UserID, SellerList.PoolID, TradeBuyRequestObj.UserID, SellerList.PoolID, TradeBuyRequestObj.TrnNo, SettlementQty, CreditWalletID, CreditAccountID); TradeBuyRequestObj.PendingQty = TradeBuyRequestObj.PendingQty - SettlementQty; TradeBuyRequestObj.DeliveredQty = TradeBuyRequestObj.DeliveredQty + SettlementQty; TradeBuyerListObj.DeliveredQty = TradeBuyerListObj.DeliveredQty + SettlementQty; //Here Bid Price of pool always low then user given in Order , base on above Query decimal TakeDisc = 0; if (SellerList.Price < TradeBuyRequestObj.BidPrice) { TakeDisc = (TradeBuyRequestObj.BidPrice - SellerList.Price) * SettlementQty; } InsertTradePoolQueue(TradeBuyRequestObj.UserID, SellerList.TrnNo, SellerList.PoolID, SellerList.RemainQty, SellerList.Price, TradeBuyRequestObj.TrnNo, SettlementQty, TradeBuyRequestObj.BidPrice, TakeDisc, 0, SellerList.Id); SellerList.RemainQty = SellerList.RemainQty - SettlementQty;//this will give result 0 SellerList.MakeTransactionSuccess(); PoolMst.TotalQty = PoolMst.TotalQty - SettlementQty; PoolOrderObj.MakeTransactionSuccess(); PoolOrderObj.DRemarks = "Delivery Success with " + SellerList.Price; TransactionQueueObj.SetTransactionCode(Convert.ToInt64(enErrorCode.Settlement_PartialSettlementDone)); TransactionQueueObj.SetTransactionStatusMsg("Partial Settlement Done"); decimal SellRelQty = Helpers.DoRoundForTrading(SettlementQty * TradeBuyRequestObj.PaidQty / TradeBuyRequestObj.Qty, 8); TradeTransactionQueueObj.SetTransactionCode(Convert.ToInt64(enErrorCode.Settlement_PartialSettlementDone)); TradeTransactionQueueObj.SetTransactionStatusMsg("Partial Settlement Done"); TradeTransactionQueueObj.SettledBuyQty = TradeTransactionQueueObj.SettledBuyQty + SettlementQty; TradeTransactionQueueObj.SettledSellQty = TradeTransactionQueueObj.SettledSellQty + SellRelQty; CreditWalletDrArryTrnIDList.Add(new CreditWalletDrArryTrnID { DrTrnRefNo = SellerList.TrnNo, Amount = SettlementQty }); _dbContext.Database.BeginTransaction(); _dbContext.Set <TradePoolQueue>().Add(TradePoolQueueObj); _dbContext.Entry(PoolOrderObj).State = EntityState.Modified; _dbContext.Entry(TradeBuyRequestObj).State = EntityState.Modified; _dbContext.Entry(SellerList).State = EntityState.Modified; _dbContext.Entry(PoolMst).State = EntityState.Modified; _dbContext.Entry(TradeBuyerListObj).State = EntityState.Modified; _dbContext.Entry(TransactionQueueObj).State = EntityState.Modified; _dbContext.Entry(TradeTransactionQueueObj).State = EntityState.Modified; var CreditWalletResult = _WalletService.GetWalletCreditNew(TradeTransactionQueueObj.Delivery_Currency, Helpers.GetTimeStamp(), enWalletTrnType.Cr_Buy_Trade, SettlementQty, TradeBuyRequestObj.UserID, CreditAccountID, CreditWalletDrArryTrnIDList.ToArray(), TradeBuyRequestObj.TrnNo, 0, enWalletTranxOrderType.Credit, enServiceType.Trading, (enTrnType)TransactionQueueObj.TrnType); if (CreditWalletResult.ReturnCode != enResponseCode.Success) { HelperForLog.WriteLogIntoFile("PROCESSSETLLEMENT RollbackTransaction", ControllerName, "Balance credit fail" + CreditWalletResult.ReturnMsg + "##TrnNo:" + TradeBuyRequestObj.TrnNo); _dbContext.Database.RollbackTransaction(); _Resp.ErrorCode = enErrorCode.Settlement_PartialSettlementRollback; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "Partial Settlement RollBack TrnNo " + TradeBuyRequestObj.TrnNo + " With: TrnNo " + SellerList.TrnNo + " Reason: " + CreditWalletResult.ReturnMsg; } else { _dbContext.SaveChanges(); _dbContext.Database.CommitTransaction(); HelperForLog.WriteLogIntoFile("PROCESSSETLLEMENT", ControllerName, "Partial Settlement Done with " + SellerList.TrnNo + "##TrnNo:" + TradeBuyRequestObj.TrnNo); _Resp.ErrorCode = enErrorCode.Settlement_PartialSettlementDone; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "Partial Settlement Done of TrnNo " + TradeBuyRequestObj.TrnNo + " Settled: " + TradeBuyRequestObj.DeliveredQty + " Remain:" + TradeBuyRequestObj.PendingQty; //Continuew as record Partially settled try { _ISignalRService.OnStatusPartialSuccess(Convert.ToInt16(enTransactionStatus.Success), TransactionQueueObj, TradeTransactionQueueObj, accessToken, _TradeStopLossObj.ordertype);//komal //(short Status, TransactionQueue Newtransaction, TradeTransactionQueue NewTradeTransaction, string Token, short OrderType, short IsPartial=0) } catch (Exception ex) { HelperForLog.WriteLogIntoFile("ISignalRService", ControllerName, "Partial Settlement Error " + ex.Message + "##TrnNo:" + TradeBuyRequestObj.TrnNo); } } HoldTrnNos.Add(SellerList.TrnNo); } //====================================FULL SETTLEMENT TO MEMBER else if (SellerList.RemainQty >= TradeBuyRequestObj.PendingQty && TradeBuyRequestObj.PendingQty != 0) { SettlementQty = TradeBuyRequestObj.PendingQty; //Topup Order create PoolOrderObj = CreatePoolOrderForSettlement(TradeBuyRequestObj.UserID, SellerList.PoolID, TradeBuyRequestObj.UserID, SellerList.PoolID, TradeBuyRequestObj.TrnNo, SettlementQty, CreditWalletID, CreditAccountID); //Here Bid Price of pool always low then user given in Order , base on above Query decimal TakeDisc = 0; if (SellerList.Price < TradeBuyRequestObj.BidPrice) { TakeDisc = (TradeBuyRequestObj.BidPrice - SellerList.Price) * SettlementQty; } InsertTradePoolQueue(TradeBuyRequestObj.UserID, SellerList.TrnNo, SellerList.PoolID, SellerList.RemainQty, SellerList.Price, TradeBuyRequestObj.TrnNo, SettlementQty, TradeBuyRequestObj.BidPrice, TakeDisc, 0, SellerList.Id); SellerList.RemainQty = SellerList.RemainQty - SettlementQty;//Update first as updated value in below line SellerList.MakeTransactionHold(); PoolMst.TotalQty = PoolMst.TotalQty - SettlementQty; TradeBuyRequestObj.DeliveredQty = TradeBuyRequestObj.DeliveredQty + SettlementQty; //Fully settled Here TradeBuyRequestObj.PendingQty = TradeBuyRequestObj.PendingQty - SettlementQty; //this will 0 TradeBuyRequestObj.MakeTransactionSuccess(); TradeBuyerListObj.MakeTransactionSuccess(); TransactionQueueObj.MakeTransactionSuccess(); TransactionQueueObj.SetTransactionCode(Convert.ToInt64(enErrorCode.Settlement_FullSettlementDone)); TransactionQueueObj.SetTransactionStatusMsg("Full Settlement Done"); TradeTransactionQueueObj.MakeTransactionSuccess(); TradeTransactionQueueObj.SetTransactionCode(Convert.ToInt64(enErrorCode.Settlement_FullSettlementDone)); TradeTransactionQueueObj.SetTransactionStatusMsg("Full Settlement Done"); decimal SellRelQty = Helpers.DoRoundForTrading(SettlementQty * TradeBuyRequestObj.PaidQty / TradeBuyRequestObj.Qty, 8); TradeTransactionQueueObj.SettledBuyQty = TradeTransactionQueueObj.SettledBuyQty + SettlementQty; TradeTransactionQueueObj.SettledSellQty = TradeTransactionQueueObj.SettledSellQty + SellRelQty; TradeBuyerListObj.DeliveredQty = TradeBuyerListObj.DeliveredQty + SettlementQty; PoolOrderObj.MakeTransactionSuccess(); PoolOrderObj.DRemarks = "Delivery Success with " + SellerList.Price; CreditWalletDrArryTrnIDList.Add(new CreditWalletDrArryTrnID { DrTrnRefNo = SellerList.TrnNo, Amount = SettlementQty }); _dbContext.Database.BeginTransaction(); _dbContext.Set <TradePoolQueue>().Add(TradePoolQueueObj); _dbContext.Entry(PoolOrderObj).State = EntityState.Modified; _dbContext.Entry(TradeBuyRequestObj).State = EntityState.Modified; _dbContext.Entry(SellerList).State = EntityState.Modified; _dbContext.Entry(PoolMst).State = EntityState.Modified; _dbContext.Entry(TradeBuyerListObj).State = EntityState.Modified; _dbContext.Entry(TransactionQueueObj).State = EntityState.Modified; _dbContext.Entry(TradeTransactionQueueObj).State = EntityState.Modified; var CreditWalletResult = _WalletService.GetWalletCreditNew(TradeTransactionQueueObj.Delivery_Currency, Helpers.GetTimeStamp(), enWalletTrnType.Cr_Buy_Trade, SettlementQty, TradeBuyRequestObj.UserID, CreditAccountID, CreditWalletDrArryTrnIDList.ToArray(), TradeBuyRequestObj.TrnNo, 1, enWalletTranxOrderType.Credit, enServiceType.Trading, (enTrnType)TransactionQueueObj.TrnType); if (CreditWalletResult.ReturnCode != enResponseCode.Success) { HelperForLog.WriteLogIntoFile("PROCESSSETLLEMENT RollbackTransaction", ControllerName, "Balance credit fail" + CreditWalletResult.ReturnMsg + "##TrnNo:" + TradeBuyRequestObj.TrnNo); _dbContext.Database.RollbackTransaction(); _Resp.ErrorCode = enErrorCode.Settlement_FullSettlementRollback; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "Full Settlement Rollback TrnNo:" + TradeBuyRequestObj.TrnNo + " With: TrnNo " + SellerList.TrnNo + " Reason:" + CreditWalletResult.ReturnMsg; } else { _dbContext.SaveChanges(); _dbContext.Database.CommitTransaction(); HelperForLog.WriteLogIntoFile("PROCESSSETLLEMENT", ControllerName, "Full Settlement Done with " + SellerList.TrnNo + "##TrnNo:" + TradeBuyRequestObj.TrnNo); _Resp.ErrorCode = enErrorCode.Settlement_FullSettlementDone; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "Full Settlement Done of TrnNo " + TradeBuyRequestObj.TrnNo + " Settled: " + TradeBuyRequestObj.DeliveredQty + " Remain:" + TradeBuyRequestObj.PendingQty; try { _ISignalRService.OnStatusSuccess(Convert.ToInt16(enTransactionStatus.Success), TransactionQueueObj, TradeTransactionQueueObj, accessToken, _TradeStopLossObj.ordertype); //komal //==============Volume update only after success if (TradeTransactionQueueObj.TrnType == Convert.ToInt16(enTrnType.Buy_Trade)) { _IFrontTrnService.GetPairAdditionalVal(TradeTransactionQueueObj.PairID, TradeTransactionQueueObj.BidPrice, TradeTransactionQueueObj.TrnNo, TradeTransactionQueueObj.BuyQty, TradeTransactionQueueObj.TrnDate); } else { _IFrontTrnService.GetPairAdditionalVal(TradeTransactionQueueObj.PairID, TradeTransactionQueueObj.AskPrice, TradeTransactionQueueObj.TrnNo, TradeTransactionQueueObj.SellQty, TradeTransactionQueueObj.TrnDate); } EmailSendAsync(TradeBuyRequestObj.UserID.ToString(), Convert.ToInt16(enTransactionStatus.Success), TradeTransactionQueueObj.PairName, TradeTransactionQueueObj.PairName.Split("_")[1], TradeTransactionQueueObj.TrnDate.ToString(), TradeTransactionQueueObj.DeliveryTotalQty, TradeTransactionQueueObj.OrderTotalQty, 0); } catch (Exception ex) { HelperForLog.WriteLogIntoFile("ISignalRService", ControllerName, "Full Settlement Error " + ex.Message + "##TrnNo:" + TradeBuyRequestObj.TrnNo); } } HoldTrnNos.Add(SellerList.TrnNo); _dbContext.Entry(SellerList).Reload(); SellerList.IsProcessing = 0; //Release Seller List _TradeSellerList.Update(SellerList); break; //record settled } //====================take always latest object from DB //==========as if txn not commit so dbnot change and object value changes , so take object value from DB _dbContext.Entry(TradeBuyRequestObj).Reload(); _dbContext.Entry(TransactionQueueObj).Reload(); _dbContext.Entry(TradeTransactionQueueObj).Reload(); _dbContext.Entry(TradeBuyerListObj).Reload(); _dbContext.Entry(SellerList).Reload(); SellerList.IsProcessing = 0;//Release Seller List _TradeSellerList.Update(SellerList); } TradeBuyRequestObj.IsProcessing = 0;//Release Buy Order _TradeBuyRequest.Update(TradeBuyRequestObj); TradeBuyerListObj.IsProcessing = 0; _TradeBuyerList.Update(TradeBuyerListObj); if (TrackBit == 0)//No any record Process { _Resp.ErrorCode = enErrorCode.Settlement_NoSettlementRecordFound; _Resp.ReturnCode = enResponseCodeService.Success; _Resp.ReturnMsg = "No Any Match Record Found"; } } catch (Exception ex) { HelperForLog.WriteErrorLog("PROCESSSETLLEMENT:##TrnNo " + TradeBuyRequestObj.TrnNo, ControllerName, ex); _Resp.ReturnCode = enResponseCodeService.Fail; _Resp.ReturnMsg = ex.Message; _Resp.ErrorCode = enErrorCode.Settlement_SettlementInternalError; } return(Task.FromResult(_Resp)); }