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;
            }

        }
        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);
                
            }


        }
Exemplo n.º 3
0
 public virtual void AdicionarItem(PedidoVendaLinha item)
 {
     Itens.Add(item);
 }