public void EnviarPedido(PedidoVenda pedidoVenda)
        {
            var conexaoSap = new SapConnect();
            try
            {

                RfcDestination rfcDestination = conexaoSap.Conectar();
                RfcRepository rfcRepository = rfcDestination.Repository;

                IRfcFunction fReadTable = rfcRepository.CreateFunction("ZFXI_SD06");
                RfcStructureMetadata t_item = rfcRepository.GetStructureMetadata("ZSTSD007");
                IRfcTable envio_item = fReadTable.GetTable("TI_ITEM");
                RfcStructureMetadata t_condicoes = rfcRepository.GetStructureMetadata("ZSTSD008");
                IRfcTable envio_condicao = fReadTable.GetTable("TI_CONDICOES");

                IRfcStructure i_cabecalho = fReadTable.GetStructure("I_CABECALHO");

                fReadTable.SetValue("I_TIPO_ENVIO", pedidoVenda.Tipo);
                i_cabecalho.SetValue("COTACAO", pedidoVenda.Id_cotacao);
                i_cabecalho.SetValue("BSTKD", pedidoVenda.NumeroDoPedidoDoRepresentante);
                i_cabecalho.SetValue("BSTKD_OC", pedidoVenda.NumeroDoPedidoDoCliente);
                
                i_cabecalho.SetValue("AUART", pedidoVenda.TipoPedido);
                i_cabecalho.SetValue("WERKS", pedidoVenda.Id_centro);
                i_cabecalho.SetValue("VKORG", pedidoVenda.Id_centro);
                i_cabecalho.SetValue("VTWEG", pedidoVenda.AreaDeVenda.Can_dist);
                i_cabecalho.SetValue("SPART", pedidoVenda.AreaDeVenda.Set_ativ);
                i_cabecalho.SetValue("KUNNR", pedidoVenda.Cliente.Id_cliente);
                i_cabecalho.SetValue("ZTERM", pedidoVenda.CondicaoDePagamento.Codigo);
                i_cabecalho.SetValue("INCO1", pedidoVenda.ModeloDeFrete.CodigoIncotermCab);
                i_cabecalho.SetValue("INCO2", pedidoVenda.TipoDeFrete.Descricao);
                i_cabecalho.SetValue("TRANS",
                    pedidoVenda.Transportadora != null ? pedidoVenda.Transportadora.Codigo : null);
                i_cabecalho.SetValue("TRANSRED",
                    pedidoVenda.TransportadoraDeRedespachoFob != null
                        ? pedidoVenda.TransportadoraDeRedespachoFob.Codigo
                        : null);
                i_cabecalho.SetValue("TRANSREDCIF",
                    pedidoVenda.TransportadoraDeRedespachoCif != null
                        ? pedidoVenda.TransportadoraDeRedespachoCif.Codigo
                        : null);
                i_cabecalho.SetValue("REPRE", pedidoVenda.Representante.Codigo);
                i_cabecalho.SetValue("OBSERVACAO", pedidoVenda.Observacao);


                for (int i = pedidoVenda.Itens.Count - 1; i >= 0; i--)
                {

                    var item = pedidoVenda.Itens[i];
                    IRfcStructure linha_envio_item = t_item.CreateStructure();

                    linha_envio_item.SetValue("POSNR", item.Numero);
                    linha_envio_item.SetValue("MATNR", item.Material.Id_material);
                    linha_envio_item.SetValue("MENGE", item.Quantidade);
                    linha_envio_item.SetValue("MEINS", item.Material.UnidadeDeMedida.Id_unidademedida);
                    linha_envio_item.SetValue("PLTYP", item.ListaDePreco.Codigo);

                    if (item.MotivoDeRecusa != null)
                    {
                        linha_envio_item.SetValue("ABGRU", item.MotivoDeRecusa.Codigo);
                    }


                    envio_item.Insert(linha_envio_item);

                    IRfcStructure linha_envio_cond = t_condicoes.CreateStructure();

                    linha_envio_cond.SetValue("POSNR", item.Numero);
                    linha_envio_cond.SetValue("KBETR", item.DescontoManual);
                    linha_envio_cond.SetValue("KSCHL", "ZDEM");
                    envio_condicao.Insert(linha_envio_cond);
                }

                fReadTable.Invoke(rfcDestination);

                string statusDaComunicacao = fReadTable.GetString("E_STATUS");

                IRfcTable mensagensDeRetorno = fReadTable.GetTable("TE_MENSAGENS");

                if (statusDaComunicacao == "E")
                {
                    throw new Exception(string.Join(". ", mensagensDeRetorno.Select(m => m.GetString("MESSAGE"))));
                }

                string statusDaCotacao = fReadTable.GetString("E_STATUS_COTACAO");

                IRfcTable retornoItens = fReadTable.GetTable("TE_ITEM");

                IRfcStructure primeiroItem = retornoItens.First();

                StatusDoPedidoDeVenda statusDoPedidoDeVenda = _statusDoPedidoDeVenda.BuscaPorCodigo(statusDaCotacao).Single();

                if (statusDoPedidoDeVenda == null)
                {
                    throw new Exception("SAP retornou um status de Pedido inválido: " + statusDaComunicacao);
                }

                pedidoVenda.Alterar(primeiroItem.GetString("COTACAO"), statusDoPedidoDeVenda);

                IRfcTable retornoCondicoes = fReadTable.GetTable("TE_CONDICOES");

                string[] codigoDosMotivosDeRecusa = retornoItens
                    .Where(x => !string.IsNullOrEmpty(x.GetString("ABGRU")))
                    .Select(x => x.GetString("ABGRU")).Distinct().ToArray();

                IList<MotivoDeRecusa> motivosDeRecusa = _motivosDeRecusa.BuscarLista(codigoDosMotivosDeRecusa).List();


                for (int i = 0; i < retornoItens.Count; i++)
                {
                    IRfcStructure retornoItem = retornoItens[i];
                    PedidoVendaLinha itemDoPedido = pedidoVenda.Itens[i];

                    string codigoDoMotivoDeRecusa = retornoItem.GetString("ABGRU");
                    MotivoDeRecusa motivoDeRecusa = string.IsNullOrEmpty(codigoDoMotivoDeRecusa)
                        ? null
                        : motivosDeRecusa.Single(x => x.Codigo == codigoDoMotivoDeRecusa);

                    itemDoPedido.Alterar(retornoItem.GetString("POSNR"),
                        Convert.ToDecimal(retornoItem.GetString("VLRPOL")),
                        Convert.ToDecimal(retornoItem.GetString("VLRTAB")), motivoDeRecusa);

                    itemDoPedido.CondicoesDePreco.Clear();

                    foreach (var condicaoRetornada in
                        retornoCondicoes.Where(
                            condicao => condicao.GetString("POSNR") == retornoItem.GetString("POSNR")))
                    {
                        var condicaoDePreco = new CondicaoDePreco(condicaoRetornada.GetString("STUNR"),
                            condicaoRetornada.GetString("VTEXT"), condicaoRetornada.GetString("KSCHL"),
                            condicaoRetornada.GetDecimal("KAWRT"), condicaoRetornada.GetDecimal("KBETR"),
                            condicaoRetornada.GetDecimal("KWERT"));

                        itemDoPedido.AdicionarCondicao(condicaoDePreco);

                    }
                }

                // retornar apenas a lista de itens
                pedidoVenda.CalcularTotal();

            }
            finally
            {
                if (conexaoSap != null)
                {
                    RfcDestinationManager.UnregisterDestinationConfiguration(conexaoSap);
                }

            }

        }