public PoolOrder CreatePoolOrderForSettlement(long OMemberID, long DMemberID, long UserID, long PoolID, long TrnNo, decimal Amount, long CreditWalletID, string CreditAccountID)
 {
     try
     {
         PoolOrderObj = new PoolOrder()
         {
             CreatedDate     = Helpers.UTC_To_IST(),
             CreatedBy       = UserID,
             UserID          = UserID,
             DMemberID       = DMemberID, //Pool gives Amount to Member/User
             OMemberID       = OMemberID, //Member/User Take Amount from Pool
             TrnNo           = TrnNo,
             TrnMode         = 0,
             PayMode         = Convert.ToInt16(enWebAPIRouteType.TradeServiceLocal),
             ORemarks        = "Order Created",
             OrderAmt        = Amount,
             DeliveryAmt     = Amount,
             DiscPer         = 0,
             DiscRs          = 0,
             Status          = Convert.ToInt16(enTransactionStatus.Initialize),//txn type status
             UserWalletID    = CreditWalletID,
             UserWalletAccID = CreditAccountID,
         };
         PoolOrderObj = _PoolOrder.Add(PoolOrderObj);
         return(PoolOrderObj);
         //return (new BizResponse { ReturnMsg = EnResponseMessage.CommSuccessMsgInternal, ReturnCode = enResponseCodeService.Success });
     }
     catch (Exception ex)
     {
         HelperForLog.WriteErrorLog("CreatePoolOrder:##TrnNo " + TrnNo, ControllerName, ex);
         //return (new BizResponse { ReturnMsg = EnResponseMessage.CommFailMsgInternal, ReturnCode = enResponseCodeService.InternalError });
         throw ex;
     }
 }
        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));
        }
Exemple #4
0
        public BizResponseClass TradeRecon(long TranNo, string ActionMessage, long UserId)
        {
            BizResponseClass Response = new BizResponseClass();

            try
            {
                var transactionQueue = _transactionQueueRepository.GetById(TranNo);
                var tradeTranQueue   = _tradeTransactionRepository.GetSingle(x => x.TrnNo == TranNo);
                var tradeBuyRequest  = _tradeBuyRepository.GetSingle(x => x.TrnNo == TranNo);

                if (transactionQueue != null && transactionQueue != null && tradeBuyRequest != null)
                {
                    var datediff = _basePage.UTC_To_IST() - transactionQueue.TrnDate;
                    if (UserId != 1 && datediff.Days > 7)
                    {
                        //After 7 days of transaction you can not take action, Please contact admin
                        Response.ReturnCode = enResponseCode.Fail;
                        Response.ReturnMsg  = EnResponseMessage.TradeRecon_After7DaysTranDontTakeAction;
                        Response.ErrorCode  = enErrorCode.TradeRecon_After7DaysTranDontTakeAction;
                    }
                    else if (transactionQueue.Status != 4)
                    {
                        //Invalid Transaction Status For Trade Recon
                        Response.ReturnCode = enResponseCode.Fail;
                        Response.ReturnMsg  = EnResponseMessage.TradeRecon_InvalidTransactionStatus;
                        Response.ErrorCode  = enErrorCode.TradeRecon_InvalidTransactionStatus;
                    }
                    else if (tradeTranQueue.IsCancelled == 1)
                    {
                        //Transaction Cancellation request is already in processing.
                        Response.ReturnCode = enResponseCode.Fail;
                        Response.ReturnMsg  = EnResponseMessage.TradeRecon_CancelRequestAlreayInProcess;
                        Response.ErrorCode  = enErrorCode.TradeRecon_CancelRequestAlreayInProcess;
                    }
                    else if (tradeBuyRequest.IsProcessing == 1)
                    {
                        //Transaction Already in Process, Please try After Sometime
                        Response.ReturnCode = enResponseCode.Fail;
                        Response.ReturnMsg  = EnResponseMessage.TradeRecon_TransactionAlreadyInProcess;
                        Response.ErrorCode  = enErrorCode.TradeRecon_TransactionAlreadyInProcess;
                    }
                    else if (tradeBuyRequest.PendingQty == 0)
                    {
                        //Can not initiate Cancellation Request.Your order is fully executed
                        Response.ReturnCode = enResponseCode.Fail;
                        Response.ReturnMsg  = EnResponseMessage.TradeRecon_OrderIsFullyExecuted;
                        Response.ErrorCode  = enErrorCode.TradeRecon_OrderIsFullyExecuted;
                    }
                    else
                    {
                        var DeliveryQty = Math.Round((transactionQueue.Amount * tradeBuyRequest.PendingQty) / tradeBuyRequest.Qty, 8);

                        if (DeliveryQty == 0 || DeliveryQty < 0)
                        {
                            //Invalid Delivery Amount
                            Response.ReturnCode = enResponseCode.Fail;
                            Response.ReturnMsg  = EnResponseMessage.TradeRecon_InvalidDeliveryAmount;
                            Response.ErrorCode  = enErrorCode.TradeRecon_InvalidDeliveryAmount;
                        }
                        if (DeliveryQty > transactionQueue.Amount)
                        {
                            //Invalid Delivery Amount
                            Response.ReturnCode = enResponseCode.Fail;
                            Response.ReturnMsg  = EnResponseMessage.TradeRecon_InvalidDeliveryAmount;
                            Response.ErrorCode  = enErrorCode.TradeRecon_InvalidDeliveryAmount;
                        }
                        else
                        {
                            //Add record in Transaction Cancel Queue
                            var tradeCancelQueue = new TradeCancelQueue()
                            {
                                TrnNo            = TranNo,
                                DeliverServiceID = transactionQueue.ServiceID,
                                TrnDate          = _basePage.UTC_To_IST(),
                                PendingBuyQty    = tradeBuyRequest.PendingQty,
                                DeliverQty       = DeliveryQty,
                                Status           = 0,
                                StatusMsg        = "Cancel Order",
                                CreatedBy        = UserId,
                                CreatedDate      = _basePage.UTC_To_IST()
                            };

                            tradeCancelQueue = _tradeCancelQueueRepository.Add(tradeCancelQueue);

                            //Add record in PoolOrder
                            var poolOrder = new PoolOrder()
                            {
                                CreatedDate  = _basePage.UTC_To_IST(),
                                CreatedBy    = UserId,
                                TrnMode      = Convert.ToByte(transactionQueue.TrnMode),
                                PayMode      = Convert.ToInt16(enWebAPIRouteType.TradeServiceLocal),
                                ORemarks     = "Cancellation Initiated",
                                OrderAmt     = DeliveryQty,
                                OMemberID    = transactionQueue.MemberID,
                                DMemberID    = tradeBuyRequest.SellStockID,
                                DiscPer      = 0,
                                DiscRs       = 0,
                                Status       = Convert.ToInt16(enTransactionStatus.Initialize),//txn type status
                                UserWalletID = tradeTranQueue.OrderWalletID,
                                //UserWalletAccID = tradeTranQueue.OrderWalletID,
                                TrnNo       = TranNo,
                                CancelID    = tradeCancelQueue.Id,
                                DeliveryAmt = DeliveryQty,
                                DRemarks    = "Cancel Order",

                                //OrderDate = _basePage.UTC_To_IST(),
                                //TrnMode = Convert.ToByte(transactionQueue.TrnMode),
                                //OMemberID = transactionQueue.MemberID,
                                //PayMode = 2,
                                //OrderAmt = DeliveryQty,
                                //DiscPer = 0,
                                //DiscRs = 0,
                                //OBankID = 0,
                                //OBranchName = "",
                                //OAccountNo = "",
                                //OChequeNo = "",
                                //DMemberID = tradeBuyRequest.SellStockID,
                                //DBankID = 0,
                                //DAccountNo = "",
                                //Status = 0,
                                //ORemarks = "",
                                //AlertRec = 0,
                                //CashChargePer = 0,
                                //CashChargeRs = 0,
                                //WalletAmt = 0,
                                //PGId = 0,
                                //CouponNo = 0,
                                //IsChargeAccepted = false,
                                //WalletID = tradeTranQueue.OrderWalletID,
                                //CreatedBy = UserId,
                                //CreatedDate = _basePage.UTC_To_IST()
                            };

                            poolOrder = _poolOrderRepository.Add(poolOrder);

                            //Update TradeBuyRequest
                            tradeBuyRequest.UpdatedDate = _basePage.UTC_To_IST();
                            tradeBuyRequest.UpdatedBy   = UserId;
                            tradeBuyRequest.IsCancel    = 1;
                            _tradeBuyRepository.Update(tradeBuyRequest);

                            //Update TradeTransaction Queue
                            tradeTranQueue.UpdatedDate = _basePage.UTC_To_IST();
                            tradeTranQueue.UpdatedBy   = UserId;
                            tradeTranQueue.IsCancelled = 1;
                            tradeTranQueue.StatusMsg   = "Cancellation Initiated";
                            _tradeTransactionRepository.Update(tradeTranQueue);

                            //Update OrderID in TransactionCancel Queue
                            tradeCancelQueue.OrderID = poolOrder.Id;
                            _tradeCancelQueueRepository.Update(tradeCancelQueue);

                            var tradePoolMaster = _tradePoolMasterRepository.GetSingle(x => x.Id == tradeBuyRequest.SellStockID && x.IsSleepMode == 1);
                            if (tradePoolMaster != null)
                            {
                                tradePoolMaster.IsSleepMode = 0;
                                _tradePoolMasterRepository.Update(tradePoolMaster);
                            }

                            Response.ReturnCode = enResponseCode.Success;
                            Response.ReturnMsg  = EnResponseMessage.TradeRecon_CencelRequestSuccess;
                            Response.ErrorCode  = enErrorCode.TradeRecon_CencelRequestSuccess;
                        }
                    }
                }
                else
                {
                    Response.ReturnCode = enResponseCode.Fail;
                    Response.ReturnMsg  = EnResponseMessage.TradeRecon_InvalidTransactionNo;
                    Response.ErrorCode  = enErrorCode.TradeRecon_InvalidTransactionNo;
                }

                return(Response);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "An unexpected exception occured,\nMethodName:" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\nClassname=" + this.GetType().Name, LogLevel.Error);
                throw ex;
            }
        }