Esempio n. 1
0
        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;
            }

        }