Пример #1
0
        private OrdemFIXResponse <OrdemCancelamentoInfo> ParsearOrdemCancelamentoCliente(ClienteCancelamentoInfo pParametro)
        {
            OrdemFIXResponse <OrdemCancelamentoInfo> Response =
                new OrdemFIXResponse <OrdemCancelamentoInfo>();


            try
            {
                OrdemInfo OrdemInfo = new PersistenciaOrdens().SelecionarOrdemCliente(pParametro.OrderID);

                OrdemCancelamentoInfo CancelamentoInfo =
                    new OrdemCancelamentoInfo();

                CancelamentoInfo.ClOrdID     = CtrlNumber;
                CancelamentoInfo.OrigClOrdID = OrdemInfo.ClOrdID;
                CancelamentoInfo.ChannelID   = OrdemInfo.ChannelID;
                CancelamentoInfo.Account     = OrdemInfo.Account;
                CancelamentoInfo.OrderID     = OrdemInfo.ExchangeNumberID;
                CancelamentoInfo.OrderQty    = OrdemInfo.OrderQty;
                CancelamentoInfo.Side        = OrdemInfo.Side;
                CancelamentoInfo.Symbol      = OrdemInfo.Symbol;

                if ((OrdemInfo.OrdStatus != OrdemStatusEnum.NOVA) || (OrdemInfo.OrdStatus == OrdemStatusEnum.SUBSTITUIDA) ||
                    (OrdemInfo.OrdStatus == OrdemStatusEnum.PARCIALMENTEEXECUTADA))
                {
                    Lib.Info.PipeLineCriticaInfo info = new Lib.Info.PipeLineCriticaInfo();

                    info.Critica         = "Não é possível cancelar uma oferta em processamento. Esta oferta pode estar cancelada ou cancelando / executada ou executando. ";
                    info.CriticaTipo     = CriticaRiscoEnum.ErroNegocio;
                    info.DataHoraCritica = DateTime.Now;

                    Response.CriticaInfo = new List <Lib.Info.PipeLineCriticaInfo>();

                    Response.CriticaInfo.Add(info);
                    Response.StatusResposta    = CriticaRiscoEnum.ErroNegocio;
                    Response.DataResposta      = DateTime.Now;
                    Response.DescricaoResposta = "O Sistema de risco encontrou <" + Response.CriticaInfo.Count.ToString() + "> item(s) a serem verificados";

                    return(Response);
                }



                if (OrdemInfo.Symbol.Substring(OrdemInfo.Symbol.Length - 1, 1) == "F")
                {
                    OrdemInfo.Symbol = OrdemInfo.Symbol.Remove(OrdemInfo.Symbol.Length - 1);
                }

                // Defini o Exchange pelo cadastro de papeis
                CadastroPapeisResponse <CadastroPapelInfo> CadastroPapeis = new ServicoCadastroPapeis().ObterInformacoesIntrumento(
                    new CadastroPapeisRequest()
                {
                    Instrumento = OrdemInfo.Symbol
                });

                if (CadastroPapeis.Objeto == null)
                {
                    Lib.Info.PipeLineCriticaInfo info = new Lib.Info.PipeLineCriticaInfo();

                    info.Critica         = "Instrumento não encontrado";
                    info.CriticaTipo     = CriticaRiscoEnum.ErroNegocio;
                    info.DataHoraCritica = DateTime.Now;

                    Response.CriticaInfo = new List <Lib.Info.PipeLineCriticaInfo>();

                    Response.CriticaInfo.Add(info);
                    Response.StatusResposta    = CriticaRiscoEnum.ErroNegocio;
                    Response.DataResposta      = DateTime.Now;
                    Response.DescricaoResposta = "O Sistema de risco encontrou <" + Response.CriticaInfo.Count.ToString() + "> item(s) a serem verificados";

                    return(Response);
                }

                if (CadastroPapeis.Objeto.TipoMercado == OMS.CadastroPapeis.Lib.Enum.TipoMercadoEnum.FUTURO)
                {
                    CancelamentoInfo.Exchange   = "BMF";
                    CancelamentoInfo.SecurityID = new PersistenciaCadastroAtivos().ObterSecurityList(OrdemInfo.Symbol);
                }
                else
                {
                    CancelamentoInfo.Exchange = "BOVESPA";
                }


                Response.Objeto = CancelamentoInfo;

                Response.StatusResposta    = CriticaRiscoEnum.Sucesso;
                Response.DataResposta      = DateTime.Now;
                Response.DescricaoResposta = "Ordem parseado com sucesso";
            }
            catch (Exception ex)
            {
                Lib.Info.PipeLineCriticaInfo info = new Lib.Info.PipeLineCriticaInfo();

                info.Critica         = ex.Message;
                info.CriticaTipo     = CriticaRiscoEnum.ErroNegocio;
                info.DataHoraCritica = DateTime.Now;

                Response.CriticaInfo = new List <Lib.Info.PipeLineCriticaInfo>();

                Response.CriticaInfo.Add(info);

                Response.StatusResposta    = CriticaRiscoEnum.Exception;
                Response.DataResposta      = DateTime.Now;
                Response.DescricaoResposta = "Ocorreu um erro ao parsear a mensagem";
            }

            return(Response);
        }
Пример #2
0
        private OrdemFIXResponse <OrdemInfo> ParsearOrdemCliente(ClienteOrdemInfo pParametro)
        {
            OrdemFIXResponse <OrdemInfo> Response =
                new OrdemFIXResponse <OrdemInfo>();

            OrdemInfo OrdemInfo =
                new OrdemInfo();

            try
            {
                DateTime DataAux = DateTime.Now;

                #region [Vencimento da ordens]

                // VALIDA O VENCIMENTO DA ORDEM

                if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidaParaODia)
                {
                    // ORDEM VALIDA PARA O DIA
                    OrdemInfo.ExpireDate = new DateTime(DataAux.Year, DataAux.Month, DataAux.Day, 23, 59, 59);
                }
                else if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidaAteSerCancelada)
                {
                    //ORDEM VAC ( VALIDA ATE O CANCELAMENTO)
                    OrdemInfo.ExpireDate = null;
                }
                else if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidoAteDeterminadaData)
                {
                    logger.Info("Data Enviada: " + pParametro.DataValidade.Value.ToString());
                    OrdemInfo.ExpireDate = pParametro.DataValidade.Value;
                }

                #endregion

                OrdemInfo.StopStartID = pParametro.CodigoStopStart;
                OrdemInfo.MinQty      = pParametro.QuantidadeMinima;

                if (string.IsNullOrEmpty(pParametro.NumeroControleOrdem))
                {
                    OrdemInfo.ClOrdID = CtrlNumber;
                }
                else
                {
                    OrdemInfo.ClOrdID     = CtrlNumber;
                    OrdemInfo.OrigClOrdID = pParametro.NumeroControleOrdem;
                }

                OrdemInfo.MaxFloor     = pParametro.QuantidadeAparente;
                OrdemInfo.Account      = pParametro.CodigoCliente;
                OrdemInfo.ChannelID    = int.Parse(pParametro.PortaControleOrdem);
                OrdemInfo.ExecBroker   = "227";
                OrdemInfo.ExpireDate   = pParametro.DataValidade;
                OrdemInfo.OrderQty     = pParametro.Quantidade;
                OrdemInfo.OrdStatus    = OrdemStatusEnum.ENVIADAPARAOROTEADORDEORDENS;
                OrdemInfo.Price        = pParametro.Preco;
                OrdemInfo.Side         = pParametro.DirecaoOrdem;
                OrdemInfo.Symbol       = pParametro.Instrumento;
                OrdemInfo.RegisterTime = DateTime.Now;
                OrdemInfo.OrdType      = pParametro.TipoDeOrdem;
                OrdemInfo.Exchange     = "BOVESPA";
                OrdemInfo.TimeInForce  = pParametro.ValidadeOrdem;

                if (OrdemInfo.Symbol.Substring(OrdemInfo.Symbol.Length - 1, 1) == "F")
                {
                    OrdemInfo.Symbol = OrdemInfo.Symbol.Remove(OrdemInfo.Symbol.Length - 1);
                }

                // Defini o Exchange pelo cadastro de papeis
                CadastroPapeisResponse <CadastroPapelInfo> CadastroPapeis = new ServicoCadastroPapeis().ObterInformacoesIntrumento(
                    new CadastroPapeisRequest()
                {
                    Instrumento = OrdemInfo.Symbol
                });


                if (CadastroPapeis.Objeto == null)
                {
                    Lib.Info.PipeLineCriticaInfo info = new Lib.Info.PipeLineCriticaInfo();

                    info.Critica         = "Instrumento não encontrado";
                    info.CriticaTipo     = CriticaRiscoEnum.ErroNegocio;
                    info.DataHoraCritica = DateTime.Now;

                    Response.CriticaInfo = new List <Lib.Info.PipeLineCriticaInfo>();

                    Response.CriticaInfo.Add(info);
                    Response.StatusResposta    = CriticaRiscoEnum.ErroNegocio;
                    Response.DataResposta      = DateTime.Now;
                    Response.DescricaoResposta = "O Sistema de risco encontrou <" + Response.CriticaInfo.Count.ToString() + "> item(s) a serem verificados";

                    return(Response);
                }

                if (CadastroPapeis.Objeto.TipoMercado == OMS.CadastroPapeis.Lib.Enum.TipoMercadoEnum.FUTURO)
                {
                    OrdemInfo.Exchange   = "BMF";
                    OrdemInfo.SecurityID = new PersistenciaCadastroAtivos().ObterSecurityList(OrdemInfo.Symbol);
                }
                else
                {
                    OrdemInfo.Exchange = "BOVESPA";
                }

                Response.Objeto = OrdemInfo;

                Response.StatusResposta    = CriticaRiscoEnum.Sucesso;
                Response.DataResposta      = DateTime.Now;
                Response.DescricaoResposta = "Ordem parseado com sucesso";
            }
            catch (Exception ex)
            {
                Lib.Info.PipeLineCriticaInfo info = new Lib.Info.PipeLineCriticaInfo();
                logger.Error("ERRO : " + ex.Message, ex);

                info.Critica         = ex.Message;
                info.CriticaTipo     = CriticaRiscoEnum.ErroNegocio;
                info.DataHoraCritica = DateTime.Now;

                Response.CriticaInfo = new List <Lib.Info.PipeLineCriticaInfo>();
                Response.CriticaInfo.Add(info);

                Response.StatusResposta    = CriticaRiscoEnum.Exception;
                Response.DataResposta      = DateTime.Now;
                Response.DescricaoResposta = "Ocorreu um erro ao parsear a mensagem";
            }

            return(Response);
        }
Пример #3
0
        private OrdemFIXResponse <OrdemInfo> ParsearOrdemCliente(ClienteOrdemInfo pParametro, string CodigoCarteiraRecomendada)
        {
            OrdemFIXResponse <OrdemInfo> Response = new OrdemFIXResponse <OrdemInfo>();

            OrdemInfo OrdemInfo = new OrdemInfo();

            try
            {
                DateTime DataAux = DateTime.Now;

                #region [Vencimento da ordens]

                // VALIDA O VENCIMENTO DA ORDEM

                if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidaParaODia)
                {
                    // ORDEM VALIDA PARA O DIA
                    OrdemInfo.ExpireDate = new DateTime(DataAux.Year, DataAux.Month, DataAux.Day, 23, 59, 59);
                }
                else if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidaAteSerCancelada)
                {
                    //ORDEM VAC ( VALIDA ATE O CANCELAMENTO)
                    OrdemInfo.ExpireDate = null;
                }
                else if (pParametro.ValidadeOrdem == RoteadorOrdens.Lib.Dados.OrdemValidadeEnum.ValidoAteDeterminadaData)
                {
                    OrdemInfo.ExpireDate = pParametro.DataValidade.Value;
                }

                #endregion

                OrdemInfo.StopStartID = pParametro.CodigoStopStart;
                OrdemInfo.MinQty      = pParametro.QuantidadeMinima;

                if (string.IsNullOrEmpty(pParametro.NumeroControleOrdem))
                {
                    OrdemInfo.ClOrdID = CtrlNumber(CodigoCarteiraRecomendada);
                }
                else
                {
                    OrdemInfo.ClOrdID     = CtrlNumber(CodigoCarteiraRecomendada);
                    OrdemInfo.OrigClOrdID = pParametro.NumeroControleOrdem;
                }

                OrdemInfo.MaxFloor     = pParametro.QuantidadeAparente;
                OrdemInfo.Account      = pParametro.CodigoCliente;
                OrdemInfo.ChannelID    = int.Parse(pParametro.PortaControleOrdem);
                OrdemInfo.ExecBroker   = "227";
                OrdemInfo.ExpireDate   = pParametro.DataValidade;
                OrdemInfo.OrderQty     = pParametro.Quantidade;
                OrdemInfo.OrdStatus    = OrdemStatusEnum.ENVIADAPARAOROTEADORDEORDENS;
                OrdemInfo.Price        = pParametro.Preco;
                OrdemInfo.Side         = pParametro.DirecaoOrdem;
                OrdemInfo.Symbol       = pParametro.Instrumento;
                OrdemInfo.RegisterTime = DateTime.Now;
                OrdemInfo.OrdType      = pParametro.TipoDeOrdem;
                OrdemInfo.Exchange     = "BOVESPA";
                OrdemInfo.TimeInForce  = pParametro.ValidadeOrdem;

                if (OrdemInfo.Symbol.Substring(OrdemInfo.Symbol.Length - 1, 1) == "F")
                {
                    OrdemInfo.Symbol = OrdemInfo.Symbol.Remove(OrdemInfo.Symbol.Length - 1);
                }

                OrdemInfo.Exchange = "BOVESPA";
                Response.Objeto    = OrdemInfo;

                Response.StatusResposta = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.Sucesso;
                Response.DataResposta   = DateTime.Now;

                Response.DescricaoResposta = "Ordem parseado com sucesso";
            }
            catch (Exception ex)
            {
                PipeLineCriticaInfo info = new PipeLineCriticaInfo();

                info.Critica         = ex.Message;
                info.CriticaTipo     = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.ErroNegocio;
                info.DataHoraCritica = DateTime.Now;

                Response.CriticaInfo = new List <PipeLineCriticaInfo>();
                Response.CriticaInfo.Add(info);

                Response.StatusResposta    = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.Exception;
                Response.DataResposta      = DateTime.Now;
                Response.DescricaoResposta = "Ocorreu um erro ao parsear a mensagem";
            }

            return(Response);
        }
Пример #4
0
        public EnviarOrdemResponse EnviarOrdem(EnviarOrdemRequest pParametros, string CodigoCarteiraRecomendada)
        {
            EnviarOrdemResponse OrdemResposta = new EnviarOrdemResponse();

            OrdemFIXResponse <OrdemInfo> OrdemFixResponse = this.ParsearOrdemCliente(pParametros.ClienteOrdemInfo, CodigoCarteiraRecomendada);

            if (OrdemFixResponse.StatusResposta == OMS.Ordens.Lib.Enum.CriticaRiscoEnum.Sucesso)
            {
                EnviarOrdemRoteadorRequest OrdemRoteadorRequest = new EnviarOrdemRoteadorRequest();
                OrdemRoteadorRequest.OrdemInfo = OrdemFixResponse.Objeto;

                ValidacaoRiscoRequest RiscoRequisicao = new ValidacaoRiscoRequest();
                RiscoRequisicao.EnviarOrdemRequest = OrdemRoteadorRequest;

                ValidacaoRiscoResponse RiscoResposta = this.ValidarPipeLineOrdem(RiscoRequisicao, CodigoCarteiraRecomendada);

                if (RiscoResposta.CriticaInfo.Count >= 0)
                {
                    OrdemResposta.CriticaInfo = new List <PipeLineCriticaInfo>();

                    foreach (var RiscoItem in RiscoResposta.CriticaInfo)
                    {
                        PipeLineCriticaInfo _PipeLineCriticaInfo = new PipeLineCriticaInfo();

                        OrdemResposta.CriticaInfo.Add(
                            new PipeLineCriticaInfo()
                        {
                            Critica         = RiscoItem.Critica,
                            CriticaTipo     = (OMS.Ordens.Lib.Enum.CriticaRiscoEnum)RiscoItem.CriticaTipo,
                            DataHoraCritica = RiscoItem.DataHoraCritica
                        });
                    }

                    OrdemResposta.DataResposta      = RiscoResposta.DataResposta;
                    OrdemResposta.DescricaoResposta = RiscoResposta.DescricaoResposta;
                    OrdemResposta.StackTrace        = RiscoResposta.StackTrace;
                    OrdemResposta.StatusResposta    = (OMS.Ordens.Lib.Enum.CriticaRiscoEnum)RiscoResposta.StatusResposta;
                }
                else
                {
                    OrdemResposta.CriticaInfo = new List <PipeLineCriticaInfo>();

                    foreach (var RiscoItem in OrdemFixResponse.CriticaInfo)
                    {
                        PipeLineCriticaInfo _PipeLineCriticaInfo = new PipeLineCriticaInfo();

                        OrdemResposta.CriticaInfo.Add(
                            new PipeLineCriticaInfo()
                        {
                            Critica         = RiscoItem.Critica,
                            CriticaTipo     = (OMS.Ordens.Lib.Enum.CriticaRiscoEnum)RiscoItem.CriticaTipo,
                            DataHoraCritica = RiscoItem.DataHoraCritica
                        });
                    }

                    OrdemResposta.DataResposta      = OrdemResposta.DataResposta;
                    OrdemResposta.DescricaoResposta = OrdemResposta.DescricaoResposta;
                    OrdemResposta.StackTrace        = OrdemResposta.StackTrace;
                    OrdemResposta.StatusResposta    = (OMS.Ordens.Lib.Enum.CriticaRiscoEnum)OrdemResposta.StatusResposta;
                }
            }

            return(OrdemResposta);
        }
Пример #5
0
        /// <summary>
        /// Metodo responsável por invocar o pipeline de risco a verificar todos os parametros e permissões
        /// da ordem a ser enviada para o roteador de ordem. [ Efetua todo o controle pré-trading da ordem ]
        /// </summary>
        /// <param name="pParametros">Objeto de entidade da ordem do cliente</param>
        /// <returns> Resposta da requisição </returns>
        public EnviarOrdemResponse EnviarOrdem(EnviarOrdemRequest pParametros)
        {
            try
            {
                logger.Info("Solicitacao en envio de ordem acatada. Cliente: " + pParametros.ClienteOrdemInfo.CodigoCliente.ToString());

                logger.Info("Cliente.....             " + pParametros.ClienteOrdemInfo.CodigoCliente.ToString());
                logger.Info("CodigoStopStart.....     " + pParametros.ClienteOrdemInfo.CodigoStopStart.ToString());
                logger.Info("DataHoraSolicitacao..... " + pParametros.ClienteOrdemInfo.DataHoraSolicitacao.ToString());
                logger.Info("DataValidade.....        " + pParametros.ClienteOrdemInfo.DataValidade.ToString());
                logger.Info("DirecaoOrdem.....        " + pParametros.ClienteOrdemInfo.DirecaoOrdem.ToString());
                logger.Info("Instrumento.....         " + pParametros.ClienteOrdemInfo.Instrumento.ToString());
                logger.Info("Preco.....               " + pParametros.ClienteOrdemInfo.Preco.ToString());
                logger.Info("Quantidade.....          " + pParametros.ClienteOrdemInfo.Quantidade.ToString());
                logger.Info("TipoDeOrdem.....         " + pParametros.ClienteOrdemInfo.TipoDeOrdem.ToString());
                logger.Info("ValidadeOrdem.....       " + pParametros.ClienteOrdemInfo.ValidadeOrdem.ToString());
                logger.Info("QuantidadeMinima...      " + pParametros.ClienteOrdemInfo.QuantidadeMinima.ToString());
                logger.Info("QuantidadeAparente...    " + pParametros.ClienteOrdemInfo.QuantidadeAparente.ToString());

                EnviarOrdemResponse OrdemResposta = new EnviarOrdemResponse();

                #region  [ Validação do formato da mensagem enviada ]

                logger.Info("Verifica se todos os campos da solicitação foram preenchidos corretamente");

                // VALIDA SE OS ATRIBUTOS INFORMADOS PELO CLIENTE SÃO VALIDOS
                ValidarFormatoOrdemResponse ValidarFormatoOrdemResponse =
                    this.ValidarFormatoOrdemCliente(pParametros.ClienteOrdemInfo);

                //Obtem o numero da porta de controle a ser roteada pelo OMS

                #region Obter a porta de roteamento pelo perfil do cliente

                //logger.Info("Verifica a porta que a ordem sera roteada");
                //if (pParametros.ClienteOrdemInfo.PortaControleOrdem != CodigoPortaRepassadorOrdem.ToString())
                //{
                //    int GrupoAlavancagemCliente = new PersistenciaOrdens().ObterCodigoGrupoAlavancagem(pParametros.ClienteOrdemInfo.CodigoCliente);
                //    logger.Info("Codigo do grupo de alavancagem do cliente : " + GrupoAlavancagemCliente.ToString());

                //    if(GrupoAlavancagemCliente == CodigoGrupoAlavancagemHomeBroker)
                //    {
                //        logger.Info("Cliente HomeBroker");
                //        pParametros.ClienteOrdemInfo.PortaControleOrdem = CodigoPortaClienteHomeBroker.ToString();
                //    }

                //    if (GrupoAlavancagemCliente == CodigoGrupoAlavancagemDesktop)
                //    {
                //        logger.Info("Cliente Assessor");
                //        pParametros.ClienteOrdemInfo.PortaControleOrdem = CodigoPortaClienteAssessor.ToString();
                //    }

                //    if ((GrupoAlavancagemCliente != CodigoGrupoAlavancagemDesktop) && (GrupoAlavancagemCliente != CodigoGrupoAlavancagemHomeBroker))
                //    {
                //        // caso não encontre cobrar tabela mesa.
                //        pParametros.ClienteOrdemInfo.PortaControleOrdem = CodigoPortaClienteAssessor.ToString();
                //    }

                //    logger.Info("Numero da porta a ser roteado : " + pParametros.ClienteOrdemInfo.PortaControleOrdem);
                //}
                //else
                //{
                //    pParametros.ClienteOrdemInfo.PortaControleOrdem = CodigoPortaRepassadorOrdem.ToString();
                //    logger.Info("Numero da porta a ser roteado : " + pParametros.ClienteOrdemInfo.PortaControleOrdem);
                //}

                #endregion

                // VERIFICA SE A MENSAGEM ENVIADA PELO CLIENTE É VALIDA.
                if (ValidarFormatoOrdemResponse.StatusResposta == CriticaRiscoEnum.Sucesso)
                {
                    #region  [ Parseador de Mensagem FIX ]

                    logger.Info("Inicia composição da mensagem FIX");

                    // INICIA PARSEADOR DE MENSAGEM PARA O FORMATO FIX.
                    OrdemFIXResponse <OrdemInfo> OrdemFixResponse = this.ParsearOrdemCliente(pParametros.ClienteOrdemInfo);

                    if (OrdemFixResponse.StatusResposta == CriticaRiscoEnum.ErroNegocio)
                    {
                        logger.Info("Mensagem FIX contem com sucesso");
                        logger.Info("Descrição da critica    : Instrumento não encontrado");

                        //VERIFICA SE EXISTEM CRITICAS A SEREM OBSERVADAS
                        if (OrdemFixResponse.CriticaInfo.Count >= 0)
                        {
                            OrdemResposta.CriticaInfo =
                                new List <PipeLineCriticaInfo>();

                            // EFETUA O DE / PARA DOS OBJETOS PARA NÃO CRIAR VINCULO ALGUM ENTRE
                            // AS BIBLIOTECAS DE RISCO E ORDEM
                            foreach (var RiscoItem in OrdemFixResponse.CriticaInfo)
                            {
                                PipeLineCriticaInfo _PipeLineCriticaInfo
                                    = new PipeLineCriticaInfo();

                                OrdemResposta.CriticaInfo.Add(
                                    new PipeLineCriticaInfo()
                                {
                                    Critica         = RiscoItem.Critica,
                                    CriticaTipo     = (CriticaRiscoEnum)RiscoItem.CriticaTipo,
                                    DataHoraCritica = RiscoItem.DataHoraCritica
                                });
                            }

                            // FORMATA A MENSAGEM DE SAIDA
                            OrdemResposta.DataResposta      = OrdemFixResponse.DataResposta;
                            OrdemResposta.DescricaoResposta = OrdemFixResponse.DescricaoResposta;
                            OrdemResposta.StackTrace        = OrdemFixResponse.StackTrace;
                            OrdemResposta.StatusResposta    = (CriticaRiscoEnum)OrdemFixResponse.StatusResposta;

                            return(OrdemResposta);
                        }
                    }

                    #endregion

                    logger.Info("Mensagem FIX composta com sucesso");

                    // OBTEM A ORDEM JÁ PARSEADA NO FORMATO FIX.
                    EnviarOrdemRoteadorRequest OrdemRoteadorRequest = new EnviarOrdemRoteadorRequest()
                    {
                        OrdemInfo = OrdemFixResponse.Objeto
                    };

                    #endregion

                    #region [ Efetua chamada para as validações do sistema de risco ]

                    ValidacaoRiscoRequest RiscoRequisicao = new ValidacaoRiscoRequest()
                    {
                        EnviarOrdemRequest = OrdemRoteadorRequest
                    };

                    logger.Info("Inicia rotina de validação de risco: PipeLine Risco");

                    DateTime DataInicioExecucao = DateTime.Now;
                    logger.Info("Data inicial da solicitação:     " + DataInicioExecucao.ToString());

                    // EFETUA CHAMADA DO METODO VALIDAPIPEPINE RISCO PARA VALIDAR A ORDEM ENVIADA PELO CLIENTE.
                    ValidacaoRiscoResponse RiscoResposta =
                        new ServicoRisco().ValidarPipeLineRisco(RiscoRequisicao);

                    TimeSpan datafinal = (DateTime.Now - DataInicioExecucao);

                    #endregion

                    #region [ Tratamento da resposta da validação de risco ]

                    logger.Info("Prepara a resposta da solicitação");

                    //VERIFICA SE EXISTEM CRITICAS A SEREM OBSERVADAS
                    if (RiscoResposta.CriticaInfo.Count >= 0)
                    {
                        OrdemResposta.CriticaInfo =
                            new List <PipeLineCriticaInfo>();

                        // EFETUA O DE / PARA DOS OBJETOS PARA NÃO CRIAR VINCULO ALGUM ENTRE
                        // AS BIBLIOTECAS DE RISCO E ORDEM
                        foreach (var RiscoItem in RiscoResposta.CriticaInfo)
                        {
                            PipeLineCriticaInfo _PipeLineCriticaInfo
                                = new PipeLineCriticaInfo();

                            OrdemResposta.CriticaInfo.Add(
                                new PipeLineCriticaInfo()
                            {
                                Critica         = RiscoItem.Critica,
                                CriticaTipo     = (CriticaRiscoEnum)RiscoItem.CriticaTipo,
                                DataHoraCritica = RiscoItem.DataHoraCritica
                            });
                        }

                        // FORMATA A MENSAGEM DE SAIDA
                        OrdemResposta.DataResposta      = RiscoResposta.DataResposta;
                        OrdemResposta.DescricaoResposta = RiscoResposta.DescricaoResposta;
                        OrdemResposta.StackTrace        = RiscoResposta.StackTrace;
                        OrdemResposta.StatusResposta    = (CriticaRiscoEnum)RiscoResposta.StatusResposta;

                        logger.Info("Solicitação de resposta enviado ao solicitante com sucesso.");
                        logger.Info("Tempo Total de execução   :" + datafinal.ToString());
                    }

                    #endregion
                }
                else
                // ERRO NA FORMATACAO DA MENSAGEM
                if (ValidarFormatoOrdemResponse.StatusResposta == CriticaRiscoEnum.ErroFormatoMensagem)
                {
                    logger.Info("Ocorreu um erro ao formatar a mensagem de retorno.");

                    #region [ Efetua tratamento da resposta da validação da mensamgem ]

                    OrdemResposta.CriticaInfo =
                        new List <PipeLineCriticaInfo>();

                    // EFETUA O DE / PARA DOS OBJETOS PARA NÃO CRIAR VINCULO ALGUM ENTRE
                    // AS BIBLIOTECAS DE RISCO E ORDEM
                    foreach (var RiscoItem in ValidarFormatoOrdemResponse.CriticaInfo)
                    {
                        PipeLineCriticaInfo _PipeLineCriticaInfo
                            = new PipeLineCriticaInfo();

                        OrdemResposta.CriticaInfo.Add(
                            new PipeLineCriticaInfo()
                        {
                            Critica         = RiscoItem.Critica,
                            CriticaTipo     = (CriticaRiscoEnum)RiscoItem.CriticaTipo,
                            DataHoraCritica = RiscoItem.DataHoraCritica
                        });
                    }

                    // FORMATA A MENSAGEM DE SAIDA
                    OrdemResposta.DataResposta      = ValidarFormatoOrdemResponse.DataResposta;
                    OrdemResposta.DescricaoResposta = ValidarFormatoOrdemResponse.DescricaoResposta;
                    OrdemResposta.StackTrace        = ValidarFormatoOrdemResponse.StackTrace;
                    OrdemResposta.StatusResposta    = (CriticaRiscoEnum)ValidarFormatoOrdemResponse.StatusResposta;

                    logger.Info("Envia mensagem de retorno com o erro.");

                    #endregion
                }

                return(OrdemResposta);
            }
            catch (Exception ex)
            {
                logger.Error("Erro :" + ex.Message, ex);
                return(null);
            }
        }
Пример #6
0
        /// <summary>
        /// Método responsável por enviar um cancelamento de ordens para o roteador cancelar.
        /// </summary>
        /// <param name="pParametroCancelamentoRequest"></param>
        /// <returns></returns>
        public EnviarCancelamentoOrdemResponse CancelarOrdem(EnviarCancelamentoOrdemRequest pParametroCancelamentoRequest)
        {
            logger.Info("Iniciar rotina de cancelamento de ordens");


            DateTime DataInicioExecucao = DateTime.Now;

            logger.Info("Data de inicio de execução:    " + DataInicioExecucao.ToString());

            EnviarCancelamentoOrdemResponse CancelamentoOrderResponse = new EnviarCancelamentoOrdemResponse();

            OrdemFIXResponse <OrdemCancelamentoInfo> OrdemCancelamentoInfo = this.ParsearOrdemCancelamentoCliente(pParametroCancelamentoRequest.ClienteCancelamentoInfo);

            if (OrdemCancelamentoInfo.StatusResposta == CriticaRiscoEnum.Sucesso)
            {
                logger.Info("Solicitação de cancelamento de ordem enviado ");
                logger.Info("Bovespa       : " + OrdemCancelamentoInfo.Objeto.Account.ToString());
                logger.Info("ChannelID     : " + OrdemCancelamentoInfo.Objeto.ChannelID.ToString());
                logger.Info("ClOrdID       : " + OrdemCancelamentoInfo.Objeto.ClOrdID.ToString());
                logger.Info("Exchange      : " + OrdemCancelamentoInfo.Objeto.Exchange.ToString());
                logger.Info("OrderID       : " + OrdemCancelamentoInfo.Objeto.OrderID.ToString());
                logger.Info("OrigClOrdID   : " + OrdemCancelamentoInfo.Objeto.OrigClOrdID.ToString());
                logger.Info("Side          : " + OrdemCancelamentoInfo.Objeto.Side.ToString());
                logger.Info("Symbol        : " + OrdemCancelamentoInfo.Objeto.Symbol.ToString());


                logger.Info("Mensagem parseado com sucesso!");

                logger.Info("Inicializa serviço de roteamento de ordem");
                //Invoca o serviço de roteamento de ordem
                IRoteadorOrdens ServicoRoteador = Ativador.Get <IRoteadorOrdens>();
                logger.Info("Serviço do ativador inicializado com sucesso");

                logger.Info("Calculando digito do cliente");
                OrdemCancelamentoInfo.Objeto.Account = RetornaCodigoCliente(CodigoCorretora, OrdemCancelamentoInfo.Objeto.Account);


                logger.Info("Envia ordem para o roteador");
                // Enviar a ordem para o roteador de ordens e aguarda o retorno.

                ExecutarCancelamentoOrdemResponse RespostaOrdem = ServicoRoteador.CancelarOrdem(
                    new ExecutarCancelamentoOrdemRequest()
                {
                    info = OrdemCancelamentoInfo.Objeto
                });

                if (RespostaOrdem.DadosRetorno.StatusResposta == StatusRoteamentoEnum.Sucesso)
                {
                    logger.Info("Cancelamento enviado com sucesso.");

                    CancelamentoOrderResponse.DescricaoResposta = RespostaOrdem.DadosRetorno.Ocorrencias[0].Ocorrencia;
                    CancelamentoOrderResponse.DataResposta      = DateTime.Now;
                    CancelamentoOrderResponse.StatusResposta    = CriticaRiscoEnum.Sucesso;
                }
                else
                {
                    logger.Info("Erro ao enviar o cancelamento para o Roteador.");

                    CancelamentoOrderResponse.DescricaoResposta = RespostaOrdem.DadosRetorno.Ocorrencias[0].Ocorrencia;
                    CancelamentoOrderResponse.DataResposta      = DateTime.Now;
                    CancelamentoOrderResponse.StatusResposta    = CriticaRiscoEnum.ErroNegocio;
                }
            }
            else
            {
                CancelamentoOrderResponse.DescricaoResposta = OrdemCancelamentoInfo.CriticaInfo[0].Critica.ToString();
                CancelamentoOrderResponse.CriticaInfo       = OrdemCancelamentoInfo.CriticaInfo;
                CancelamentoOrderResponse.DataResposta      = DateTime.Now;
                CancelamentoOrderResponse.StatusResposta    = CriticaRiscoEnum.Sucesso;
            }

            TimeSpan datafinal = (DateTime.Now - DataInicioExecucao);

            logger.Info("Tempo total de execução     :" + datafinal.ToString());

            return(CancelamentoOrderResponse);
        }