public void ProcessOrderCancelReject(QuickFix.Message msg, string bolsa) { try { OrderCancelReject ocr = (OrderCancelReject)msg; // Buscar a ordem original a partir do OrigClOrdID string clordid = ocr.ClOrdID.getValue(); int account; if (bolsa.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase)) { string acc = ocr.IsSetAccount()? ocr.Account.getValue(): string.Empty; if (!string.IsNullOrEmpty(acc)) { acc = (acc.Remove(acc.Length - 1)); account = 0; } else { account = 0; } } else { account = ocr.IsSetAccount()? Convert.ToInt32(ocr.Account.getValue()): 0; } OrderDbInfo orderOrig = null; if (account != 0) { orderOrig = _db.BuscarOrdem(clordid, account, ocr.Symbol.getValue()); } else { orderOrig = _db.BuscarOrdemPorClOrdEOrigClOrd(clordid, ocr.OrigClOrdID.getValue(), ocr.Symbol.getValue()); } if (orderOrig.ClOrdID.Equals(string.Empty)) { logger.Info("Problema ao consultar informacoes da ordem original"); return; } // Preencher informacoes de tb_fix_order_detail (rejection) OrderDbDetalheInfo detail = new OrderDbDetalheInfo(); detail.OrderID = orderOrig.OrderID; //detail.OrderQty = orderOrig.OrderQty; //detail.OrderQtyRemaining = orderOrig.OrderQtyRemaining; //detail.Price = orderOrig.Price; detail.OrderStatusID = (int)FixOrderStatus.REJEITADA; detail.TransactTime = ocr.IsSetField(Tags.TransactTime)? ocr.TransactTime.getValue(): DateTime.MinValue; detail.Description = ocr.IsSetField(Tags.Text) ? ocr.Text.getValue() : string.Empty; detail.CxlRejResponseTo = ocr.IsSetField(Tags.CxlRejResponseTo) ? ocr.CxlRejResponseTo.getValue().ToString() : string.Empty; detail.CxlRejReason = ocr.IsSetField(Tags.CxlRejReason)? ocr.CxlRejReason.getValue(): 0; detail.FixMsgSeqNum = Convert.ToInt32(ocr.Header.GetField(Tags.MsgSeqNum)); if (!_db.InserirOrdemDetalhe(detail, clordid)) { logger.Info("Problemas na inserção da ordem detalhe"); return; } // Buscar as informacoes da tabela update, utilizando o OrigClOrdID da ordem original OrderDbUpdateInfo orderUpdate = _db.BuscarOrdemUpdate(orderOrig.OrigClOrdID); // Atribuir as informacoes do update no order original orderOrig.ClOrdID = orderUpdate.ClOrdID; orderOrig.OrdStatus = orderUpdate.OrdStatusID; orderOrig.Price = orderUpdate.Price; orderOrig.OrderQty = orderUpdate.Quantidade; orderOrig.OrderQtyApar = orderUpdate.Quantidade_Aparente; orderOrig.OrderQtyMin = orderUpdate.Quantidade_Minima; //orderOrig.OrderQtyRemaining = orderUpdate.Quantidade_Exec; orderOrig.ExpireDate = orderUpdate.Dt_Validade; orderOrig.OrigClOrdID = string.Empty; orderOrig.MsgFix = ocr.ToString().Replace('\x01', '|'); // Atualizar as informacoes do update na tabela da ordem original if (!_db.AtualizarOrdem(orderOrig)) { logger.Info("Problemas na atualizacao da ordem (mensagem ordercancelreject). ClOrdID: " + orderOrig.ClOrdID); return; } DropCopyCallbackManager.Instance.EnqueueCallback(orderOrig); } catch (Exception ex) { logger.Error("Problemas no processamento da mensagem OrderCancelReject: " + ex.Message, ex); } }