public async Task <List <PedidoViewModel> > GetUltimosPedidos(string loginUsuario)
        {
            var impressoraComanda = ParametroRepository.GetEnderecoImpressoraComanda();

            var pedidos = await _contexto.Pedidos.Where(p => p.Usuario == loginUsuario && !p.PedidoExterno)
                          .Include(s => s.Situacao)
                          .Include(s => s.Itens)
                          .Include(s => s.Itens.Select(i => i.ItemCardapio))
                          .Include(c => c.Itens.Select(i => i.Observacoes))
                          .Include(c => c.Itens.Select(i => i.Observacoes.Select(o => o.Observacao)))
                          .Include(c => c.Itens.Select(i => i.Extras))
                          .Include(c => c.Itens.Select(i => i.Extras.Select(e => e.OpcaoExtra)))
                          .Select(p => new PedidoViewModel
            {
                FormaPagamento               = p.FormaPagamento,
                DataPedido                   = p.DataHora,
                CodPedido                    = p.CodPedido,
                Situacao                     = p.CodSituacao,
                DescricaoSituacao            = p.Situacao.Descricao,
                ValorTotal                   = p.ValorTotal,
                TaxaEntrega                  = p.TaxaEntrega,
                MotivoCancelamento           = p.MotivoCancelamento,
                FeedbackCliente              = p.FeedbackCliente,
                ValorDesconto                = p.ValorDesconto,
                PercentualDesconto           = p.PercentualDesconto,
                MotivoDesconto               = p.MotivoDesconto,
                PortaImpressaoComandaEntrega = impressoraComanda,
                Itens = p.Itens.Select(i => new ItemPedidoViewModel
                {
                    CodItem         = i.CodItemCardapio,
                    SeqItem         = i.SeqItem,
                    DescricaoItem   = i.ItemCardapio.Nome,
                    Quantidade      = i.Quantidade,
                    PrecoUnitario   = i.PrecoUnitario,
                    ValorExtras     = i.ValorExtras,
                    ValorTotalItem  = i.ValorTotal,
                    ObservacaoLivre = i.ObservacaoLivre,
                    Obs             = i.Observacoes.Select(o => new ObservacaoItemPedidoViewModel
                    {
                        CodObservacao       = o.CodObservacao,
                        DescricaoObservacao = o.Observacao.DescricaoObservacao
                    }).ToList().Union(new List <ObservacaoItemPedidoViewModel> {
                        new ObservacaoItemPedidoViewModel {
                            CodObservacao = (i.ObservacaoLivre != "" && i.ObservacaoLivre != null ? -1 : -2), DescricaoObservacao = i.ObservacaoLivre
                        }
                    }).ToList().Where(o => o.CodObservacao >= -1).ToList(),
                    extras = i.Extras.Select(e => new ExtraItemPedidoViewModel
                    {
                        CodOpcaoExtra       = e.CodOpcaoExtra,
                        DescricaoOpcaoExtra = e.OpcaoExtra.DescricaoOpcaoExtra,
                        Preco = e.Preco
                    }).ToList()
                }).ToList().OrderBy(i => i.SeqItem).ToList()
            })
                          .OrderByDescending(p => p.DataPedido)
                          .ToListAsync();

            return(pedidos);
        }
        public async Task <PedidoViewModel> GetPedidoAberto(string loginUsuario, string telefone)
        {
            var impressoraComanda = ParametroRepository.GetEnderecoImpressoraComanda();
            var tempoMedioEspera  = ParametroRepository.GetTempoMedioEspera();

            return(await _contexto.Pedidos.Where(p => new List <int> {
                (int)SituacaoPedidoEnum.AguardandoConfirmacao, (int)SituacaoPedidoEnum.Confirmado, (int)SituacaoPedidoEnum.EmPreparacao, (int)SituacaoPedidoEnum.EmProcessoEntrega
            }.Contains(p.CodSituacao) && p.Usuario == (loginUsuario != "" ? loginUsuario : p.Usuario) && p.TelefoneCliente == (telefone != "" ? telefone : p.TelefoneCliente) && (!p.PedidoExterno || telefone != ""))
                   .Include(c => c.Itens)
                   .Include(c => c.Itens.Select(i => i.Observacoes))
                   .Include(c => c.Itens.Select(i => i.Observacoes.Select(o => o.Observacao)))
                   .Include(c => c.Itens.Select(i => i.Extras))
                   .Include(c => c.Itens.Select(i => i.Extras.Select(e => e.OpcaoExtra)))
                   .Select(p => new PedidoViewModel
            {
                DataPedido = p.DataHora,
                BandeiraCartao = p.BandeiraCartao,
                FormaPagamento = p.FormaPagamento,
                CodPedido = p.CodPedido,
                Situacao = p.CodSituacao,
                TaxaEntrega = p.TaxaEntrega,
                Troco = p.Troco,
                TrocoPara = p.TrocoPara,
                ValorTotal = p.ValorTotal,
                FeedbackCliente = p.FeedbackCliente,
                MotivoCancelamento = p.MotivoCancelamento,
                ValorDesconto = p.ValorDesconto,
                PercentualDesconto = p.PercentualDesconto,
                MotivoDesconto = p.MotivoDesconto,
                PortaImpressaoComandaEntrega = impressoraComanda,
                TempoMedioEspera = tempoMedioEspera,
                DadosCliente = new DadosClientePedidoViewModel
                {
                    Bairro = p.BairroEntrega,
                    Cidade = p.CidadeEntrega,
                    Complemento = p.ComplementoEntrega,
                    Estado = p.UFEntrega,
                    Logradouro = p.LogradouroEntrega,
                    Nome = p.NomeCliente,
                    Numero = p.NumeroEntrega,
                    Referencia = p.ReferenciaEntrega,
                    Telefone = p.TelefoneCliente
                }
            })
                   .FirstOrDefaultAsync());
        }
        public async Task <List <PedidoViewModel> > GetPedidosAbertos(int?codPedido)
        {
            var dataHora          = DateTime.Now.AddDays(-2);
            var impressoraComanda = ParametroRepository.GetEnderecoImpressoraComanda();

            var pedidos = await _contexto.Pedidos.Where(p => !(new List <int> {
                5, 9
            }).Contains(p.CodSituacao) && (p.DataHora > dataHora || p.CodSituacao < 4) && p.CodPedido == (codPedido != null ? codPedido.Value : p.CodPedido))
                          .Include(s => s.Situacao)
                          .Include(s => s.Itens)
                          .Include(s => s.Itens.Select(i => i.ItemCardapio))
                          .Include(s => s.Itens.Select(i => i.ItemCardapio.ImpressorasAssociadas))
                          .Include(s => s.Itens.Select(i => i.ItemCardapio.ImpressorasAssociadas.Select(a => a.ImpressoraProducao)))
                          .Include(c => c.Itens.Select(i => i.Observacoes))
                          .Include(c => c.Itens.Select(i => i.Observacoes.Select(o => o.Observacao)))
                          .Include(c => c.Itens.Select(i => i.Extras))
                          .Include(c => c.Itens.Select(i => i.Extras.Select(e => e.OpcaoExtra)))
                          .Select(p => new PedidoViewModel
            {
                FormaPagamento               = p.FormaPagamento,
                DataPedido                   = p.DataHora,
                CodPedido                    = p.CodPedido,
                Situacao                     = p.CodSituacao,
                DescricaoSituacao            = p.Situacao.Descricao,
                ValorTotal                   = p.ValorTotal,
                TaxaEntrega                  = p.TaxaEntrega,
                BandeiraCartao               = p.BandeiraCartao,
                Troco                        = p.Troco,
                TrocoPara                    = p.TrocoPara,
                Usuario                      = p.Usuario,
                PedidoExterno                = p.PedidoExterno,
                MotivoCancelamento           = p.MotivoCancelamento,
                FeedbackCliente              = p.FeedbackCliente,
                ValorDesconto                = p.ValorDesconto,
                PercentualDesconto           = p.PercentualDesconto,
                MotivoDesconto               = p.MotivoDesconto,
                PortaImpressaoComandaEntrega = impressoraComanda,
                DadosCliente                 = new DadosClientePedidoViewModel
                {
                    Bairro      = p.BairroEntrega,
                    Cidade      = p.CidadeEntrega,
                    Complemento = p.ComplementoEntrega,
                    Estado      = p.UFEntrega,
                    Logradouro  = p.LogradouroEntrega,
                    Nome        = p.NomeCliente,
                    Numero      = p.NumeroEntrega,
                    Referencia  = p.ReferenciaEntrega,
                    Telefone    = p.TelefoneCliente
                },
                Itens = p.Itens.Where(i => !i.Cancelado).Select(i => new ItemPedidoViewModel
                {
                    CodItem                 = i.CodItemCardapio,
                    SeqItem                 = i.SeqItem,
                    DescricaoItem           = i.ItemCardapio.Nome,
                    Quantidade              = i.Quantidade,
                    PrecoUnitario           = i.PrecoUnitario,
                    ValorExtras             = i.ValorExtras,
                    ValorTotalItem          = i.ValorTotal,
                    ObservacaoLivre         = i.ObservacaoLivre,
                    AcaoRegistro            = (int)Comum.AcaoRegistro.Nenhuma,
                    PortasImpressaoProducao = i.ItemCardapio.ImpressorasAssociadas.Select(a => a.ImpressoraProducao.Porta).ToList(),
                    Obs = i.Observacoes.Select(o => new ObservacaoItemPedidoViewModel
                    {
                        CodObservacao       = o.CodObservacao,
                        DescricaoObservacao = o.Observacao.DescricaoObservacao
                    }).ToList().Union(new List <ObservacaoItemPedidoViewModel> {
                        new ObservacaoItemPedidoViewModel {
                            CodObservacao = (i.ObservacaoLivre != "" && i.ObservacaoLivre != null ? -1 : -2), DescricaoObservacao = i.ObservacaoLivre
                        }
                    }).ToList().Where(o => o.CodObservacao >= -1).ToList(),
                    extras = i.Extras.Select(e => new ExtraItemPedidoViewModel
                    {
                        CodOpcaoExtra       = e.CodOpcaoExtra,
                        DescricaoOpcaoExtra = e.OpcaoExtra.DescricaoOpcaoExtra,
                        Preco = e.Preco
                    }).ToList()
                }).ToList().OrderBy(i => i.SeqItem).ToList()
            })
                          .OrderBy(p => p.DataPedido)
                          .ToListAsync();

            return(pedidos);
        }