public async Task HandleAsync(AbrirComandaCommand command)
        {
            var comanda = await _comandaRepository.GetByAsync(command.Id);

            if (comanda.IsNull())
            {
                throw new ComandaNaoEncontradaException();
            }

            if (comanda.SituacaoId == (int)EComandaSituacao.Aberta)
            {
                throw new ComandaJaAbertaException();
            }

            var posssuiMovimentoAberto = comanda.Movimentos.Any(x => x.DataAbertura.IsNotNull() && x.DataFechamento.IsNull());

            if (posssuiMovimentoAberto)
            {
                throw new ComandaMovimentoAbertEncontradoException();
            }

            comanda.SituacaoId = (int)EComandaSituacao.Aberta;

            comanda.Movimentos.Add(new ComandaMovimento {
                DataAbertura = DateTime.Now
            });
        }
コード例 #2
0
        public async Task HandleAsync(FecharComandaCommand command)
        {
            var comanda = await _comandaRepository.GetByAsync(command.Id);

            if (comanda.IsNull())
            {
                throw new ComandaNaoEncontradaException();
            }

            if (comanda.SituacaoId != (int)EComandaSituacao.Aberta)
            {
                throw new ComandaSituacaoInvalicaAoFecharException();
            }

            var movimento = comanda.Movimentos.SingleOrDefault(x => x.DataAbertura.IsNotNull() && x.DataFechamento.IsNull());

            if (movimento.IsNull())
            {
                throw new ComandaMovimentoAbertoNaoEncontradoException();
            }

            var pedidos = await _pedidoRepository.ObterPedidosPorAsync(movimento.Id);

            var possuiPedidoNaoEntregues = pedidos.Any(x => x.SituacaoId != (int)EPedidoSituacao.Entregue && x.SituacaoId != (int)EPedidoSituacao.Cancelado);

            if (possuiPedidoNaoEntregues)
            {
                throw new ComandaPossuiPedidosNaoEntreguesException();
            }


            comanda.SituacaoId       = (int)EComandaSituacao.Fechada;
            movimento.DataFechamento = DateTime.Now;

            await _comandaRepository.UpdateAsync(comanda);
        }
コード例 #3
0
        public async Task HandleAsync(CriarPedidoCommand command)
        {
            var comanda = await _comandaRepository.GetByAsync(command.ComandaId);

            if (comanda.IsNull())
            {
                throw new ComandaNaoEncontradaException();
            }

            if (comanda.SituacaoId != (int)EComandaSituacao.Aberta)
            {
                throw new ComandaMovimentoAbertoNaoEncontradoException();
            }

            var comandaMovimento = comanda.Movimentos.SingleOrDefault(x => x.DataAbertura.IsNotNull() && x.DataFechamento.IsNull());

            if (comandaMovimento.IsNull())
            {
                throw new ArgumentNullException();
            }

            var itensPedido = new List <PedidoItem>();

            foreach (var item in command.Itens)
            {
                var produto = await _produtoRepository.GetByAsync(item.ProdutoId);

                if (produto.IsNull())
                {
                    throw new ProdutoNaoEncontradoException();
                }

                var itemPedido = new PedidoItem
                {
                    ProdutoId  = item.ProdutoId,
                    Observacao = item.Observacao
                };

                if (produto.TempoPreparo.HasValue)
                {
                    itemPedido.Producao = new PedidoItemProducao
                    {
                        PrioridadeId = (int)EPedidoItemProducaoPrioridade.Normal
                    };

                    itemPedido.SituacaoId = (int)EPedidoItemSituacao.AgardandoProducao;
                }
                else
                {
                    itemPedido.SituacaoId = (int)EPedidoItemSituacao.Finalizado;
                }

                itensPedido.Add(itemPedido);
            }

            var pedido = new Domain.Models.Pedido
            {
                SituacaoId         = (int)EPedidoSituacao.Criado,
                Observacao         = command.Observacao,
                Data               = DateTime.Now,
                ComandaMovimentoId = comandaMovimento.Id,
                Itens              = itensPedido
            };

            await _pedidoRepository.AddAsync(pedido);
        }