public HttpResponseMessage aceitar([FromBody] AceitarEdicaoViewModel model)
        {
            try
            {
                if (model == null)
                {
                    return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
                }
                if (ModelState.IsValid)
                {
                    var userId         = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var chamadaEditada = _ChamadaEditadaRepo.GetById(model.EdicaoId);
                    var user           = _UserRepo.GetById(userId);
                    var ordem          = _OrdemRepo.GetOcoOrder(userId, model.ChamadaId);
                    ordem.MotivoCancelamento_ID = 3;
                    _OrdemRepo.Update(ordem);

                    //caso tenha cancelado e dado erro pra criar outra oco
                    if (ordem.OrdemStatus_Id == 4 && ordem.BinanceStatus_Id == 4 && ordem.MotivoCancelamento_ID == 3)
                    {
                        string LimitOrderID, StopOrderID;
                        do
                        {
                            LimitOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(LimitOrderID));
                        do
                        {
                            StopOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(StopOrderID));
                        var limitLoss = Helper.OcoStopLimitWithPercent(ordem.Chamada.Symbol_id, chamadaEditada.NewLoss, 0.5m);
                        //cria uma nova ordem
                        var ocoReturn = BinanceRestApi.SendSaidaOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.Quantidade, chamadaEditada.NewGain, chamadaEditada.NewLoss, limitLoss, LimitOrderID, StopOrderID);
                        if (ocoReturn.IsSuccessStatusCode)
                        {
                            var edicaoAceita = new EdicaoAceita
                            {
                                Usuario_Id        = userId,
                                TipoEdicao_ID     = 1,
                                DataCadastro      = DateTime.UtcNow,
                                ChamadaEditada_ID = model.EdicaoId,
                                Chamada_ID        = model.ChamadaId
                            };
                            _EdicaoAceitaRepo.Add(edicaoAceita);

                            var ocoRes   = ocoReturn.Content.ReadAsStringAsync().Result;
                            var ocoObj   = JsonConvert.DeserializeObject <dynamic>(ocoRes);
                            var OcoOrder = new Ordem
                            {
                                DataCadastro     = DateTime.UtcNow,
                                DataExecucao     = null,
                                Quantidade       = ordem.Quantidade,
                                Chamada_Id       = ordem.Chamada_Id,
                                Usuario_Id       = user.Id,
                                OrdemStatus_Id   = 3,
                                TipoOrdem_Id     = 2,
                                BinanceStatus_Id = 1,
                                StopOrder_ID     = StopOrderID,
                                LimitOrder_ID    = LimitOrderID,
                                OcoOrderListId   = (string)ocoObj.listClientOrderId,
                                MainOrderID      = ordem.MainOrderID
                            };
                            _OrdemRepo.Add(OcoOrder);

                            var retunrobj = new { PrecoEntrada = ordem.Chamada.PrecoEntrada, NewGain = chamadaEditada.NewGain, NewLoss = chamadaEditada.NewLoss, chamadaId = chamadaEditada.Chamada_Id };
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Criar Ordem Editada Sucesso) MainOrderID => " + OcoOrder.MainOrderID);
                            return(Request.CreateResponse(HttpStatusCode.OK, retunrobj));
                        }
                        else
                        {
                            var BinanceErrorObj = Helper.GetBinanceErrorObj(ocoReturn);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Criar Ordem Editada) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                        }
                    }

                    var res = BinanceRestApi.CancelarOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.OcoOrderListId);
                    if (res.IsSuccessStatusCode)
                    {
                        ordem.OrdemStatus_Id   = 4;
                        ordem.BinanceStatus_Id = 4;
                        ordem.DataCancelamento = DateTime.UtcNow;
                        _OrdemRepo.Update(ordem);
                        string LimitOrderID, StopOrderID;
                        do
                        {
                            LimitOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(LimitOrderID));
                        do
                        {
                            StopOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(StopOrderID));
                        var limitLoss = Helper.OcoStopLimitWithPercent(ordem.Chamada.Symbol_id, chamadaEditada.NewLoss, 0.5m);
                        //cria uma nova ordem
                        var ocoReturn = BinanceRestApi.SendSaidaOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.Quantidade, chamadaEditada.NewGain, chamadaEditada.NewLoss, limitLoss, LimitOrderID, StopOrderID);
                        if (ocoReturn.IsSuccessStatusCode)
                        {
                            var edicaoAceita = new EdicaoAceita
                            {
                                Usuario_Id        = userId,
                                TipoEdicao_ID     = 1,
                                DataCadastro      = DateTime.UtcNow,
                                ChamadaEditada_ID = model.EdicaoId,
                                Chamada_ID        = model.ChamadaId
                            };
                            _EdicaoAceitaRepo.Add(edicaoAceita);

                            var ocoRes   = ocoReturn.Content.ReadAsStringAsync().Result;
                            var ocoObj   = JsonConvert.DeserializeObject <dynamic>(ocoRes);
                            var OcoOrder = new Ordem
                            {
                                DataCadastro     = DateTime.UtcNow,
                                DataExecucao     = null,
                                Quantidade       = ordem.Quantidade,
                                Chamada_Id       = ordem.Chamada_Id,
                                Usuario_Id       = user.Id,
                                OrdemStatus_Id   = 3,
                                TipoOrdem_Id     = 2,
                                BinanceStatus_Id = 1,
                                StopOrder_ID     = StopOrderID,
                                LimitOrder_ID    = LimitOrderID,
                                OcoOrderListId   = (string)ocoObj.listClientOrderId,
                                MainOrderID      = ordem.MainOrderID
                            };
                            _OrdemRepo.Add(OcoOrder);

                            var retunrobj = new { PrecoEntrada = ordem.Chamada.PrecoEntrada, NewGain = chamadaEditada.NewGain, NewLoss = chamadaEditada.NewLoss, chamadaId = chamadaEditada.Chamada_Id };
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Criar Ordem Editada Sucesso) => OrderId => " + OcoOrder.Id + " =>  MainOrderID => " + OcoOrder.MainOrderID);
                            return(Request.CreateResponse(HttpStatusCode.OK, retunrobj));
                        }
                        else
                        {
                            var BinanceErrorObj = Helper.GetBinanceErrorObj(ocoReturn);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Criar Ordem Editada) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                        }
                    }
                    else
                    {
                        var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Cancelar Ordem Para Aceitar Edição) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
Esempio n. 2
0
        public HttpResponseMessage VenderMercado(int id)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var userId = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var user   = _UserRepo.GetById(userId);
                    //alterar pra receber como parametro chamada id
                    var OriginalOrder = _OrdemRepo.GetById(id);
                    var ordem         = _OrdemRepo.GetOcoOrder(userId, OriginalOrder.Chamada_Id);
                    ordem.MotivoCancelamento_ID = 2;
                    _OrdemRepo.Update(ordem);


                    //caso tenha cancelado e tenha dado erro pra criar venda a mercado
                    if (ordem.OrdemStatus_Id == 4 && ordem.BinanceStatus_Id == 4 && ordem.MotivoCancelamento_ID == 2)
                    {
                        string BinanceOrderID;
                        do
                        {
                            BinanceOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(BinanceOrderID));
                        var     listAssets      = _OrdemComissionRepo.GetOrderComissions(id);
                        decimal SaldoQuantidade = Helper.ArredondarQuantidadeVenda(listAssets, OriginalOrder);
                        var     resMarket       = BinanceRestApi.VenderMercado(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, SaldoQuantidade, BinanceOrderID);
                        if (resMarket.IsSuccessStatusCode)
                        {
                            var BinanceContent = resMarket.Content.ReadAsStringAsync().Result;
                            var BinanceResult  = JsonConvert.DeserializeObject <NewOrder>(BinanceContent);
                            var newOrder       = new Ordem
                            {
                                BinanceStatus_Id  = 3,
                                OrdemStatus_Id    = 2,
                                OrderID           = BinanceOrderID,
                                Chamada_Id        = OriginalOrder.Chamada_Id,
                                DataCadastro      = DateTime.UtcNow,
                                TipoOrdem_Id      = 3,
                                Quantidade        = ordem.Quantidade,
                                Usuario_Id        = userId,
                                MainOrderID       = OriginalOrder.Id,
                                PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price
                            };
                            _OrdemRepo.Add(newOrder);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Sucesso) MainOrderId =>  " + OriginalOrder.Id);
                            OriginalOrder.OrdemStatus_Id    = 2;
                            OriginalOrder.BinanceStatus_Id  = 3;
                            OriginalOrder.PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price;
                            _OrdemRepo.Update(OriginalOrder);
                            return(Request.CreateResponse(HttpStatusCode.OK, OriginalOrder));
                        }
                        else
                        {
                            var BinanceerrorObj = Helper.GetBinanceErrorObj(resMarket);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Erro) MainOrderId => " + OriginalOrder.Id + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
                        }
                    }

                    var res = BinanceRestApi.CancelarOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.OcoOrderListId);
                    if (res.IsSuccessStatusCode)
                    {
                        ordem.BinanceStatus_Id = 4;
                        ordem.OrdemStatus_Id   = 4;
                        ordem.DataCancelamento = DateTime.UtcNow;
                        _OrdemRepo.Update(ordem);

                        string BinanceOrderID;
                        do
                        {
                            BinanceOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(BinanceOrderID));
                        var     listAssets      = _OrdemComissionRepo.GetOrderComissions(id);
                        decimal SaldoQuantidade = Helper.ArredondarQuantidadeVenda(listAssets, OriginalOrder);
                        var     resMarket       = BinanceRestApi.VenderMercado(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, SaldoQuantidade, BinanceOrderID);
                        if (resMarket.IsSuccessStatusCode)
                        {
                            var BinanceContent = resMarket.Content.ReadAsStringAsync().Result;
                            var BinanceResult  = JsonConvert.DeserializeObject <NewOrder>(BinanceContent);
                            var newOrder       = new Ordem
                            {
                                BinanceStatus_Id  = 3,
                                OrdemStatus_Id    = 2,
                                OrderID           = BinanceOrderID,
                                Chamada_Id        = OriginalOrder.Chamada_Id,
                                DataCadastro      = DateTime.UtcNow,
                                TipoOrdem_Id      = 3,
                                Quantidade        = ordem.Quantidade,
                                Usuario_Id        = userId,
                                MainOrderID       = OriginalOrder.Id,
                                PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price
                            };
                            _OrdemRepo.Add(newOrder);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Sucesso) MainOrderId =>  " + OriginalOrder.Id);
                            OriginalOrder.OrdemStatus_Id    = 2;
                            OriginalOrder.BinanceStatus_Id  = 3;
                            OriginalOrder.PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price;
                            _OrdemRepo.Update(OriginalOrder);
                            return(Request.CreateResponse(HttpStatusCode.OK, OriginalOrder));
                        }
                        else
                        {
                            var BinanceerrorObj = Helper.GetBinanceErrorObj(resMarket);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Erro) MainOrderId => " + OriginalOrder.Id + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
                        }
                    }
                    else
                    {
                        var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Erro ao Cancelar Ordem Oco Para Venda a Mercado) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }