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); } } }
public void Atualizar(PedidoVenda pedidoVenda, PedidoVendaSalvarVm pedidoAlterado) { IEnumerable<int> idDosItensParaRemover = pedidoVenda.Itens .Where(itemAtual => pedidoAlterado.Itens.All(itemAlterado => itemAlterado.IdDoItem != itemAtual.Id)) .Select(itemAtual => itemAtual.Id).ToList(); foreach (var id in idDosItensParaRemover) { PedidoVendaLinha itemParaRemover = pedidoVenda.Itens.Single(item => item.Id == id); pedidoVenda.Itens.Remove(itemParaRemover); } int[] idDosMateriais = pedidoAlterado.Itens.Select(x => x.IdMaterial).Distinct().ToArray(); IList<Material> materiaisDosItens = _materiais.BuscarLista(idDosMateriais).List(); string[] codigoDasListasDePreco = pedidoAlterado.Itens.Select(item => item.CodigoDaListaDePreco).Distinct().ToArray(); IList<ListaPreco> listasDePreco = _listasPreco.FiltraPorListaDeCodigos(codigoDasListasDePreco).List(); string[] codigoDosMotivosDeRecusa = pedidoAlterado.Itens.Where(i => !string.IsNullOrEmpty(i.CodigoDoMotivoDeRecusa)) .Select(i => i.CodigoDoMotivoDeRecusa).Distinct().ToArray(); IList<MotivoDeRecusa> motivosDeRecusa = _motivosDeRecusa.BuscarLista(codigoDosMotivosDeRecusa).List(); var itensParaAlterar = (from itemAtual in pedidoVenda.Itens join itemAlterado in pedidoAlterado.Itens on itemAtual.Id equals itemAlterado.IdDoItem select new { ItemAtual = itemAtual, ItemAlterado = itemAlterado }).ToList(); for (int i = 0; i < itensParaAlterar.Count; i++) { var itemParaAlterar = itensParaAlterar[i]; PedidoVendaSalvarItemVm itemAlterado = itemParaAlterar.ItemAlterado; Material material = materiaisDosItens.Single(m => m.pro_id_material == itemAlterado.IdMaterial); ListaPreco listaPreco = listasDePreco.Single(l => l.Codigo == itemAlterado.CodigoDaListaDePreco); MotivoDeRecusa motivoDeRecusa = string.IsNullOrEmpty(itemAlterado.CodigoDoMotivoDeRecusa) ? null : motivosDeRecusa.Single(m => m.Codigo == itemAlterado.CodigoDoMotivoDeRecusa); var itemDeVenda = new ItemDeVenda { Material = material, Quantidade = itemAlterado.Quantidade, ListaPreco = listaPreco, DescontoManual = itemAlterado.Desconto, MotivoDeRecusa = motivoDeRecusa }; itemParaAlterar.ItemAtual.Alterar(itemDeVenda); } IEnumerable<PedidoVendaSalvarItemVm> itensParaAdicionar = pedidoAlterado.Itens.Where( itemAlterado => itemAlterado.IdDoItem == 0); foreach (var itemParaAdicionar in itensParaAdicionar) { Material material = materiaisDosItens.Single(m => m.pro_id_material == itemParaAdicionar.IdMaterial); ListaPreco listaDePreco = listasDePreco.Single(l => l.Codigo == itemParaAdicionar.CodigoDaListaDePreco); MotivoDeRecusa motivoDeRecusa = string.IsNullOrEmpty(itemParaAdicionar.CodigoDoMotivoDeRecusa) ? null : motivosDeRecusa.Single(m => m.Codigo == itemParaAdicionar.CodigoDoMotivoDeRecusa); var linhasPedido = new PedidoVendaLinha(itemParaAdicionar.Numero, material,itemParaAdicionar.Quantidade,listaDePreco,itemParaAdicionar.Desconto, motivoDeRecusa); pedidoVenda.AdicionarItem(linhasPedido); } }
public PedidoSapRetornoDTO Salvar(PedidoVendaSalvarVm pedido) { try { var usuarioConectado = _usuarios.UsuarioConectado(); ClienteVenda clienteVenda = _clienteVendas.ObterPorId(pedido.IdDaAreaDeVenda); TransportadorasDoPedido transportadorasDoPedido = ConsultarTransportadoras(pedido); IncotermCab incoterm1 = _incotermsCabs.FiltraPorId(pedido.IdDoIncoterm1).Single(); IncotermLinha incoterm2 = _incotermsLinhas.FiltraPorId(pedido.IdDoIncoterm2).Single(); Cliente cliente = _clientes.BuscaPeloCodigo(pedido.CodigoDoCliente).Single(); CondicaoDePagamento condicaoDePagamento = _condicoesDePagamento.BuscaPeloCodigo(pedido.CodigoDaCondicaoDePagamento); PedidoVenda pedidoVenda; if (!string.IsNullOrEmpty(pedido.IdDaCotacao)) { pedidoVenda = _pedidosVenda.FiltraPorId(pedido.IdDaCotacao).Single(); pedidoVenda .AlterarTipo(pedido.Tipo) .AlterarCliente(clienteVenda, cliente) .AlterarIncoterm(incoterm1, incoterm2) .AlterarTransportadora(transportadorasDoPedido.Transportadora, transportadorasDoPedido.TransportadoraDeRedespacho, transportadorasDoPedido.TransportadoraDeRedespachoCif) .AlterarDados(pedido.NumeroPedidoDoRepresentante, pedido.NumeroPedidoDoCliente, pedido.DataDoPedido, condicaoDePagamento, pedido.Observacao); } else { pedidoVenda = new PedidoVenda(pedido.Tipo, pedido.CodigoTipoPedido, clienteVenda.Org_vendas, cliente, clienteVenda, DateTime.Now, pedido.NumeroPedidoDoRepresentante, pedido.NumeroPedidoDoCliente, pedido.DataDoPedido, condicaoDePagamento, incoterm1, incoterm2, transportadorasDoPedido.Transportadora, transportadorasDoPedido.TransportadoraDeRedespacho, transportadorasDoPedido.TransportadoraDeRedespachoCif, usuarioConectado.Fornecedor, pedido.Observacao ); } int[] idDosMateriais = pedido.Itens.Select(x => x.IdMaterial).Distinct().ToArray(); IList<Material> materiaisDosItens = _materiais.BuscarLista(idDosMateriais).List(); string[] codigoDasListasDePreco = pedido.Itens.Select(item => item.CodigoDaListaDePreco).Distinct().ToArray(); IList<ListaPreco> listasDePreco = _listasPreco.FiltraPorListaDeCodigos(codigoDasListasDePreco).List(); string[] codigoDosMotivosDeRecusa = pedido.Itens .Where(item => !string.IsNullOrEmpty(item.CodigoDoMotivoDeRecusa)) .Select(item => item.CodigoDoMotivoDeRecusa) .ToArray(); IList<MotivoDeRecusa> motivosDeRecusaDosItens = _motivosDeRecusa.BuscarLista(codigoDosMotivosDeRecusa).List(); if (!string.IsNullOrEmpty(pedido.IdDaCotacao)) { _atualizadorDeItens.Atualizar(pedidoVenda, pedido); } else { for (int i = 0; i < pedido.Itens.Count; i++) { PedidoVendaSalvarItemVm item = pedido.Itens[i]; Material material = materiaisDosItens.Single(x => x.pro_id_material == item.IdMaterial); ListaPreco listaDePreco = listasDePreco.Single(lista => lista.Codigo == item.CodigoDaListaDePreco); MotivoDeRecusa motivoDeRecusa = string.IsNullOrEmpty(item.CodigoDoMotivoDeRecusa) ? null : motivosDeRecusaDosItens.Single(m => m.Codigo == item.CodigoDoMotivoDeRecusa); var linhasPedido = new PedidoVendaLinha(item.Numero, material, item.Quantidade, listaDePreco, item.Desconto, motivoDeRecusa); pedidoVenda.AdicionarItem(linhasPedido); } } _comunicacaoSap.EnviarPedido(pedidoVenda); if (pedido.Tipo == "G") { using (_unitOfWork) { _unitOfWork.BeginTransaction(); _pedidosVenda.Save(pedidoVenda); _unitOfWork.Commit(); } } var dtoDeRetorno = new PedidoSapRetornoDTO { IdDoPedido = pedidoVenda.Id_cotacao, Status = pedidoVenda.Status.Descricao, ValorTotal = pedidoVenda.ValorTotal, Itens = pedidoVenda.Itens.Select(item => new PedidoSapItemRetornoDTO { Id = item.Id, NumeroDoItem = item.Numero, ValorDeTabela = item.ValorTabela, ValorPolitica = item.ValorPolitica, CodigoDoMotivoDeRecusa = item.MotivoDeRecusa != null ? item.MotivoDeRecusa.Codigo : null, DescricaoDoMotivoDeRecusa = item.MotivoDeRecusa != null ? item.MotivoDeRecusa.Descricao: null, CondicoesDePreco = item.CondicoesDePreco.Select(condicaoDePreco => new CondicaoDePrecoDTO { Nivel = condicaoDePreco.Nivel, Descricao = condicaoDePreco.Descricao, Tipo = condicaoDePreco.Tipo, Valor = condicaoDePreco.Valor }).ToList() }).ToList() }; return dtoDeRetorno; } catch { _unitOfWork.RollBack(); throw; } }