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