예제 #1
0
        public ResumoPedidoDto MontarPedido(MontagemPedidoDto montagemPedido)
        {
            var tamanhoPizza = _tamanhosPizzaRepository.GetAll()
                               .FirstOrDefault(x => x.Tamanho.ToUpper() == montagemPedido.TamanhoPizza.ToUpper());

            if (tamanhoPizza == null)
            {
                throw new Exception($"O tamanho de pizza { montagemPedido.TamanhoPizza } informado não esta cadastrado!");
            }

            var saborPizza = _saboresPizzaRepository.GetAll()
                             .FirstOrDefault(x => x.Sabor.ToUpper() == montagemPedido.SaborPizza.ToUpper());

            if (saborPizza == null)
            {
                throw new Exception($"O sabor de pizza { montagemPedido.SaborPizza } informado não esta cadastrado!");
            }

            var pedido = new Pedidos
            {
                TamanhosPizza = tamanhoPizza,
                SaboresPizza  = saborPizza,
                Total         = tamanhoPizza.Valor,
                Tempo         = tamanhoPizza.Tempo + saborPizza.TempoAdicional ?? 0,
                Finalizado    = false
            };

            _pedidoRepository.Add(pedido);

            var resumoPedido = _mapper.Map <ResumoPedidoDto>(pedido);

            return(resumoPedido);
        }
예제 #2
0
        async Task <int> IPedidoService.Incluir(Pedido pedido)
        {
            bool pedidoValido = pedido.PedidoValido();

            if (!pedidoValido)
            {
                return(-1);
            }

            IEnumerable <int>          IdsPizzas = pedido.Pizzas.Select(x => x.IdPizzaSabor1).Union(pedido.Pizzas.Where(x => x.IdPizzaSabor2 != null).Select(x => x.IdPizzaSabor2.Value));
            ICollection <PizzaSabores> pizzas    = await GetPizzas(IdsPizzas);

            if (pizzas.Count != IdsPizzas.Count())
            {
                return(-2); // Id de pizza inexistente
            }
            bool clienteExiste = await _clienteRepository.ClienteExiste(pedido.IdCliente);

            if (!clienteExiste)
            {
                Cliente newCliente = new Cliente(pedido.Endereco_Entrega);
                Cliente cliente    = await _clienteRepository.Add(newCliente);

                pedido.SetCliente(cliente.Id);
            }

            pedido.CalcularValorTotal(pizzas);
            pedido.Criar();

            Pedido result = await _pedidoRepository.Add(pedido);

            return(result.Id);
        }
예제 #3
0
        public void Post([FromBody] PedidoCreateRequestModel value) // RequestModel
        {
            Pedido pedido = new Pedido();

            pedido.Sabor     = _saborRepository.Find(value.Sabor);
            pedido.SaborId   = pedido.Sabor.Id;
            pedido.Tamanho   = _tamanhoRepository.Find(value.Tamanho);
            pedido.TamanhoId = pedido.Tamanho.Id;

            List <Personalizacao> personalizacoes = _personalizacaoRepository.GetPersonalizacoesPelosIds(value.Personalizacoes).ToList();

            if (personalizacoes != null && personalizacoes.Count > 0)
            {
                foreach (Personalizacao item in personalizacoes)
                {
                    PedidoPersonalizacao pedidoPersonalizacao = new PedidoPersonalizacao();
                    pedidoPersonalizacao.Personalizacao = new Personalizacao()
                    {
                        Id             = item.Id,
                        Description    = item.Description,
                        TempoAdicional = item.TempoAdicional,
                        ValorAdicional = item.ValorAdicional
                    };
                    pedidoPersonalizacao.Pedido = pedido;
                    pedidoPersonalizacao.Personalizacao.Pedidos.Add(pedidoPersonalizacao);
                    pedidoPersonalizacao.Pedido.Personalizacoes.Add(pedidoPersonalizacao);
                    _pedidoPersonalizacaoRepository.Add(pedidoPersonalizacao);
                    pedido.Personalizacoes.Add(pedidoPersonalizacao);
                }
            }
            pedido.TempoPreparo = GetTempoPreparo(pedido, personalizacoes);
            pedido.ValorTotal   = GetValorTotal(pedido, personalizacoes);
            _pedidoRepository.Add(pedido); // Insertion
        }
예제 #4
0
        public async Task <IActionResult> CriarPedido([FromBody] CriarPedidoCommand comand)
        {
            _pedidoRepository.Add(comand.Map());
            var result = await _pedidoRepository.UnitOfWork.Commit();

            return(Ok());
        }
        public Task <CustomResponse> Handle(AdicionarPedidoCommand command, CancellationToken cancellationToken)
        {
            var respostaCustomizada = new CustomResponse();

            if (!command.EhValido())
            {
                var errosDeValidacao = new List <string>();

                foreach (var erro in command.ValidationResult.Errors)
                {
                    errosDeValidacao.Add(erro.ErrorMessage);
                }

                respostaCustomizada.AdicionarErro(errosDeValidacao);

                return(Task.FromResult(respostaCustomizada));
            }

            var pedido = new Models.Movimento.Pedido(command.Numero, command.ClienteId);

            pedidoRepository.Add(pedido);

            if (!unitOfWork.Commit())
            {
                respostaCustomizada = new CustomResponse(mensagem: "Erro ao adicionar.");
                respostaCustomizada.AdicionarErro(new List <string> {
                    "Erro ao adicionar o pedido."
                });

                return(Task.FromResult(respostaCustomizada));
            }

            respostaCustomizada = new CustomResponse(ResponseStatus.Sucesso, "Pedido cadastrado com sucesso.");
            return(Task.FromResult(respostaCustomizada));
        }
예제 #6
0
        public async Task <IActionResult> Post(Pedido pedido)
        {
            try
            {
                foreach (var item in pedido.PedidoItem)
                {
                    item.Produto.Estoque -= item.Quantidade;

                    _produtoRepository.Update(item.Produto);

                    item.Produto = null;
                }

                await _pedidoRepository.Add(pedido);

                await _uow.Commit();

                return(CreatedAtAction("Post", await Get(pedido.Id)));
            }
            catch (Exception ex)
            {
                await _uow.Rollback();

                return(BadRequest(ex));
            }
        }
        public void GerarPedido(CarrinhoEntity carrinho)
        {
            var pedido = new PedidoEntity();

            pedido.IdUsuario = carrinho.IdUsuario;
            pedido.Livros    = carrinho.Livros;

            _pedidoRepository.Add(pedido);
            _carrinhoRepository.Delete(carrinho);
        }
예제 #8
0
 public void Save(Pedido Pedido)
 {
     try
     {
         dbPedido.Add(Pedido);
     }
     catch (Exception ex)
     {
         throw new Exception($"Erro ao salvar Pedido: {ex.Message}.");
     }
 }
        private async Task SalvarPedido(Pedido pedido, IEnumerable <ItemPedido> itens)
        {
            await _pedidoRepository.BeginTransactionAsync();

            _pedidoRepository.Add(pedido);
            await _pedidoRepository.UnitOfWork.SaveChangesAsync();

            _pedidoRepository.AddItensPedido(pedido.Id, itens);
            await _pedidoRepository.UnitOfWork.SaveChangesAsync();

            await _pedidoRepository.CommitTransactionAsync();
        }
예제 #10
0
        /// <summary>
        /// Adiciona pedidos aleatorio para teste
        /// </summary>
        public void AddPedidos()
        {
            var ultimoPedidos = _pedidoRepository.GetListAll().OrderByDescending(x => x.Id).ToList()[0];

            var pedidos = new List <Pedido>();

            var rng = new Random();

            var idDoPedido = ultimoPedidos.Id;

            for (int i = 0; i < 80; i++)
            {
                var data = DateTime.Now.AddDays(rng.Next(-20, 1));

                var produtos = new List <Produto>();

                for (int i2 = 0; i2 < rng.Next(2, 4); i2++)
                {
                    var produtoAdd = new Produto
                    {
                        PedidoId  = idDoPedido + 1,
                        Nome      = $"Tv LED Cod - {rng.Next(40, 50)}",
                        Descricao = $"Tv LED Cod - {rng.Next(2000, 9000)} Samsung",
                        Valor     = Convert.ToDecimal(rng.Next(1220, 2245))
                    };

                    produtos.Add(produtoAdd);
                }


                var equipeAdd = new Equipe
                {
                    PedidoId       = idDoPedido + 1,
                    Nome           = $"Equipe Setor - {rng.Next(40, 50)}",
                    Descricao      = $"Equipe {rng.Next(2000, 9000)} atendimento especial",
                    PlacaDoVeiculo = $"ABC-{rng.Next(2000, 9000)}"
                };

                var pedidoAdd = new Pedido
                {
                    DataDeCriacao            = data,
                    DataDaEntregaRealizada   = data.AddDays(2),
                    EnderecoEntregaRealizada = $"Rua {rng.Next(1, 20)}, + Numero {rng.Next(50, 200)} Sao Paulo",
                    Equipe   = equipeAdd,
                    Produtos = produtos
                };
                _pedidoRepository.Add(pedidoAdd);



                idDoPedido++;
            }
        }
예제 #11
0
        public async Task <Guid> Handle(CriarPedidoCommand request, CancellationToken cancellationToken)
        {
            try
            {
                if (!request.IsValid())
                {
                    ValidationErrors(request);
                    return(await Task.FromResult(Guid.Empty));
                }

                var comanda = _comandaRepository.GetById(request.IDComanda);
                var garcom  = _garcomRepository.GetById(request.IDGarcom);

                var pedido = new Pedido
                {
                    Id             = GeradorGuidService.GetNexGuid(),
                    DataPedido     = DateTime.Now,
                    IDComanda      = comanda.Id,
                    Comanda        = comanda,
                    IDGarcom       = garcom.Id,
                    Garcom         = garcom,
                    Situacao       = SituacaoPedido.Aberto,
                    PedidoProdutos = new List <PedidoProduto>()
                };

                request.Produtos.ForEach(c =>
                {
                    var pedidoProduto = new PedidoProduto
                    {
                        Id         = GeradorGuidService.GetNexGuid(),
                        Produto    = _produtoRepository.GetById(c.IDProduto),
                        IDProduto  = c.IDProduto,
                        Quantidade = c.Quantidade,
                        IDPedido   = c.IDPedido,
                    };

                    pedidoProduto.CalcularValorTotal();

                    pedido.PedidoProdutos.Add(pedidoProduto);
                });

                _pedidoRepository.Add(pedido);

                return(await Task.FromResult(pedido.Id));
            }
            catch (Exception ex)
            {
                await Mediator.Publish(new DomainNotification(request.MessageType, $"Erro: {ex.Message}"), cancellationToken);

                return(await Task.FromResult(Guid.Empty));
            }
        }
예제 #12
0
        public async Task <Response.Pedido> Add(Request.Pedido entity)
        {
            if (!IsParameterValid(entity))
            {
                throw new InvalidParametersException <IPedidoAppService>();
            }

            var pedido = await pedidoRepository.Add(entity.ConvertToData());

            await Salvar();

            return(new Response.Pedido());
        }
예제 #13
0
        public void Confirmar(PedidoDTO pedidoDto, out int numeroPedido)
        {
            var pedido = _pedidoMapper.Map(pedidoDto);

            pedido.Guid          = Guid.NewGuid();
            pedido.CodigoCliente = ObterCodigoCliente(pedidoDto);
            pedido.PedidoItemSet = ObterPedidoItemSet(pedidoDto);
            _pedidoRepository.Add(pedido);
            _pedidoRepository.Save();

            NotificarFornecedor(pedido);
            numeroPedido = pedido.Codigo;
        }
예제 #14
0
        public async Task <IActionResult> PostPedido([FromBody] SavePedidoResource pedidoResource)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var pedido = mapper.Map <SavePedidoResource, Pedido>(pedidoResource);

            pedido.DataPedido = DateTime.Now;

            repository.Add(pedido);
            await unitOfWork.CompleteAsync();

            pedido = await repository.GetPedido(pedido.PedidoId);

            var result = mapper.Map <Pedido, PedidoResource>(pedido);

            return(Ok(result));
        }
예제 #15
0
        public async Task <ResultEntity <Pedido> > Create(Pedido pedido)
        {
            try
            {
                var _pedido = await _repository.GetByCodigo(pedido.CodPedido);

                if (_pedido != null)
                {
                    return(ResultEntity <Pedido> .Fail(pedido, $"Já existe um pedido com esse código - {pedido.CodPedido}"));
                }

                if (!pedido.ItensPedido.Any())
                {
                    throw new ArgumentNullException(nameof(pedido), "Necessário pelo menos 1 item de pedido.");
                }

                if (pedido.ItensPedido.Count() > 10)
                {
                    throw new ArgumentNullException(nameof(pedido.ItensPedido), "Máximo de items por pedido é 10");
                }

                var pizzas = await _pizzaRepository.GetAll();

                if (!pizzas.Any())
                {
                    throw new ArgumentNullException(nameof(pedido.ItensPedido), "Nenhuma pizza cadastrada!");
                }

                pedido.ItensPedido = (from item in pedido.ItensPedido
                                      select new ItemPedido().AtualizarValorUnitario(item, pizzas.ToList())).ToList();

                pedido = await _repository.Add(pedido);

                return(ResultEntity <Pedido> .Success(pedido));
            }
            catch (Exception e)
            {
                return(ResultEntity <Pedido> .Fail(pedido, $"Ocorreu algum erro na criação do pedido - {e.Message}"));
            }
        }
예제 #16
0
        public async Task <bool> Handle(AdicionarItemPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidateCommand(message))
            {
                return(false);
            }

            var pedido = await _pedidoRepository.GetPedidoRascunhoByClienteId(message.ClienteId);

            var pedidoItem = new PedidoItem(message.ProdutoId, message.Nome, message.Quantidade, message.ValorUnitario);

            if (pedido == null)
            {
                pedido = Pedido.PedidoFactory.NewPedidoRascunho(message.ClienteId);
                pedido.AddItem(pedidoItem);

                _pedidoRepository.Add(pedido);
                pedido.AddEvent(new PedidoRascunhoIniciadoEvent(message.ClienteId, message.ProdutoId));
            }
            else
            {
                var pedidoItemExistente = pedido.PedidoItemExistente(pedidoItem);
                pedido.AddItem(pedidoItem);

                if (pedidoItemExistente)
                {
                    _pedidoRepository.UpdateItem(pedido.PedidoItems.FirstOrDefault(p => p.ProdutoId == pedidoItem.ProdutoId));
                }
                else
                {
                    _pedidoRepository.AddItem(pedidoItem);
                }

                pedido.AddEvent(new PedidoAtualizadoEvent(pedido.ClienteId, pedido.Id, pedido.ValorTotal));
            }

            pedido.AddEvent(new PedidoItemAdicionadoEvent(pedido.ClienteId, pedido.Id, message.ProdutoId, message.Nome, message.ValorUnitario, message.Quantidade));
            return(await _pedidoRepository.UnitOfWork.Commit());
        }
예제 #17
0
        public PedidoViewModel Add(PedidoViewModel pedidoViewModel)
        {
            //string pedidoViewModel = "Manhã, 1, 2, 3, 3, 3";
            if (string.IsNullOrEmpty(pedidoViewModel.Entrada))
            {
                pedidoViewModel.Saida = "erro";
                pedidoViewModel.Errors.Add(new PedidoErrorViewModel()
                {
                    Message = "Pedido não pode ser vazio ", Name = "Entrada"
                });
                pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();
                return(pedidoViewModel);
            }
            var order = pedidoViewModel.Entrada.Split(",");

            //verificar se período existe;
            var entradaPeriodoDescricao = order[0].ToLower();
            //buscando o periodo igual ao informado
            var periodo = _periodoRepository.GetAll().FirstOrDefault(x => x.Descricao.ToLower() == entradaPeriodoDescricao);

            if (periodo == null)
            {
                pedidoViewModel.Saida = "erro";
                pedidoViewModel.Errors.Add(new PedidoErrorViewModel()
                {
                    Message = "Perido Invalido", Name = "Entrada"
                });
                pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();
                return(pedidoViewModel);
            }

            //var digitos = string.Join("", order.Skip(1)).ToCharArray();
            //if (!digitos.All(x=> char.IsDigit(x)))
            //{
            //    pedidoViewModel.Saida = "erro";
            //    pedidoViewModel.Errors.Add(new PedidoErrorViewModel() { Message = "Perido Invalido", Name = "Entrada" });
            //    pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();
            //    return pedidoViewModel;
            //}
            var itens = order.Skip(1).Select(x => Convert.ToInt32(x));

            if (!itens.Any())
            {
                pedidoViewModel.Saida = "erro";
                pedidoViewModel.Errors.Add(new PedidoErrorViewModel()
                {
                    Message = "Adicione ao menos um item", Name = "Entrada"
                });
                pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();
                return(pedidoViewModel);
            }

            var itensCadastrados = _itemPratoRepository.GetAll();

            int itemNaoEncontrado = itens.FirstOrDefault(x => !itensCadastrados.Any(y => y.Id == x));

            if (itemNaoEncontrado > 0)
            {
                pedidoViewModel.Saida = "erro";
                pedidoViewModel.Errors.Add(new PedidoErrorViewModel()
                {
                    Message = $"Item {itemNaoEncontrado} não encontrado.", Name = "Entrada"
                });
                pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();
                return(pedidoViewModel);
            }

            var(success, saida) = GetSaidaPedido(periodo, itens);

            pedidoViewModel.Saida = saida;

            if (success)
            {
                _pedidoRepository.Add(new Pedido
                {
                    DataPedido = DateTime.Now,
                    Entrada    = pedidoViewModel.Entrada,
                    Saida      = pedidoViewModel.Saida
                });
            }
            else
            {
                pedidoViewModel.Errors.Add(new PedidoErrorViewModel()
                {
                    Name    = "Entrada",
                    Message = "Itens não atende os requisitos"
                });
            }

            pedidoViewModel.HistoricoPedidos = _pedidoRepository.GetAll();

            return(pedidoViewModel);
        }
예제 #18
0
 public void Add(Pedido model)
 {
     _pedidoRepository.Add(model);
     _unitOfWork.Commit();
 }
        public void Add(PedidoCreateDTO pedidoDTO)
        {
            var pedido = _mapper.Map <PedidoCreateDTO, Pedido>(pedidoDTO);

            _pedidoRepository.Add(pedido);
        }
        public async Task <Guid> Handle(CriarPedidoCommand request, CancellationToken cancellationToken)
        {
            var pedido = new Pedido();

            var garcom = _garcomRepository.GetEntityById(request.IDGarcom);

            if (garcom == null)
            {
                request.AddNotification("Garcom", "Garcom não encontrado no banco de dados.");
            }

            var cliente = _clienteRepository.GetEntityById(request.IDCliente);

            if (cliente == null)
            {
                request.AddNotification("Cliente", "Cliente não encontrado no banco de dados.");
            }

            var comanda = _comandaRepository.GetEntityById(request.IDComanda);

            if (comanda == null)
            {
                request.AddNotification("Comanda", "Comanda não encontrado no banco de dados.");
            }
            else
            {
                var ultimoHistoricoPedidoComanda = await _mediator.Send(new ObterUltimoHistoricoPedidoComandaQuery(comanda.Id));

                if (ultimoHistoricoPedidoComanda != null)
                {
                    if (!SituacaoPedido.SituacoesPermiteAberturaComanda.Any(situacao => situacao == ultimoHistoricoPedidoComanda.Situacao))
                    {
                        request.AddNotification("Comanda", $"Comanda não pode ser aberta devido ao ultimo pedido estar com a situação({ultimoHistoricoPedidoComanda.Situacao}).");
                    }
                }
            }

            pedido = new Pedido(garcom, comanda, cliente);

            request.Produtos.ToList().ForEach(produtoPedido => pedido.AdicionarProduto(produtoPedido));

            if (pedido.Invalid || request.Invalid)
            {
                pedido.AddNotifications(request.Notifications);

                await _mediator.Publish(new DomainNotification
                {
                    Erros = pedido.Notifications
                }, cancellationToken);

                return(await Task.FromResult(Guid.Empty));
            }

            var historicoPedido = new HistoricoPedido(Enums.EnumSituacaoPedido.Aberto, pedido.Id);

            pedido.AdicionarHistorico(historicoPedido);

            _pedidoRepository.Add(pedido);

            return(await Task.FromResult(pedido.Id));
        }
예제 #21
0
 public Pedido Add(Pedido cliente)
 {
     cliente.Validar();
     return(_PedidoRepository.Add(cliente));
 }
예제 #22
0
 public void Add(string discos)
 {
     _repository.Add(discos);
 }
예제 #23
0
        public ActionResult <Pedido> Cadastrar(Pedido model)
        {
            try
            {
                if (model.Itens == null || model.Itens.Count == 0 || model.Itens.Count > 10)
                {
                    return(BadRequest("Um pedido pode ter no mínimo uma pizza e no máximo 10."));
                }

                if (model.CodCliente != 0)
                {
                    var endereco = _clienteRepository.Get(model.CodCliente);
                    if (endereco != null)
                    {
                        model.Bairro_Entrega      = endereco.Bairro;
                        model.Cidade_Entrega      = endereco.Cidade;
                        model.Complemento_Entrega = endereco.Complemento;
                        model.Estado_Entrega      = endereco.Estado;
                        model.Logradouro_Entrega  = endereco.Logradouro;
                        model.Numero_Entrega      = endereco.Numero;
                        model.NomeCliente         = endereco.Nome;
                        model.Email    = endereco.Email;
                        model.Telefone = endereco.Telefone;
                    }
                    else
                    {
                        return(BadRequest("O cliente informado, não foi encontrado;"));
                    }
                }

                #region calcula Preço
                decimal valorTotal = 0;
                foreach (var item in model.Itens)
                {
                    if (item.Pizza == null || item.Pizza.Count == 0)
                    {
                        return(BadRequest("Nenhuma pizza foi adicionada!"));
                    }
                    if (item.Pizza.Count > 2)
                    {
                        return(BadRequest("Cada pizza deve ter no mínimo dois sabores!"));
                    }
                    foreach (var subItem in item.Pizza)
                    {
                        var pizza = _pizzaRepository.Get(subItem.CodPizza);
                        subItem.Nome = pizza.Nome;
                        if (item.Pizza.Count == 1)
                        {
                            valorTotal   += pizza.Preco;
                            subItem.Preco = pizza.Preco;
                        }
                        else
                        {
                            var valorItem = (pizza.Preco / 2);
                            valorTotal   += valorItem;
                            subItem.Preco = valorItem;
                        }
                    }
                }
                model.PrecoTotal = valorTotal;

                #endregion
                model.CodPedido = _pedidoRepository.Add(model).CodPedido;
                foreach (var item in model.Itens)
                {
                    item.CodPedido     = model.CodPedido;
                    item.CodPedidoItem = _pedidoItemRepository.Add(item).CodPedidoItem;

                    foreach (var subItem in item.Pizza)
                    {
                        subItem.CodPedidoItem = item.CodPedidoItem;

                        subItem.CodSubItem = _subItemRepository.Add(subItem).CodSubItem;
                    }
                }

                return(Ok(model));
            }
            catch (Exception e)
            {
                return(BadRequest());
            }
        }
예제 #24
0
        public async Task PostAsync(PedidoRequestDto dto, int usuarioId)
        {
            if (await Task.Run(() => !_usuarioBusiness.Exists(x => x.UsuarioId == usuarioId)))
            {
                throw new ArgumentException("Usuário não encontrado");
            }

            if (await Task.Run(() => !_formaPagamentoBusiness.Exists(x => x.FormaPagamentoId == dto.FormaPagamentoId)))
            {
                throw new ArgumentException("Forma de Pagamento não encontrada");
            }

            if (await Task.Run(() => !_usuarioEnderecoBusiness.Exists(x => x.UsuarioEnderecoId == dto.UsuarioEnderecoId)))
            {
                throw new ArgumentException("Endereço de entrega não encontrado");
            }

            foreach (var produto in dto.Itens)
            {
                var model = _produtoBusiness.Get(x => x.ProdutoId == produto.ProdutoId);
                if (model == null)
                {
                    throw new ArgumentException("Produto não encontrado");
                }
                else
                {
                    if (model.Ativo == false || model.EmEstoque == false)
                    {
                        throw new ArgumentException("Produto {0} indisponível", model.Nome);
                    }
                }
            }

            using (var transaction = DbContext.Database.BeginTransaction())
            {
                try
                {
                    var obj = new Pedido()
                    {
                        UsuarioId        = usuarioId,
                        ValorTotal       = dto.ValorTotal,
                        FormaPagamentoId = dto.FormaPagamentoId,
                        Data             = DateTime.Now
                    };

                    _pedidoRepository.Add(obj);

                    var endereco = _usuarioEnderecoBusiness.Get(dto.UsuarioEnderecoId);

                    _pedidoEntregaRepository.Add(new PedidoEntrega()
                    {
                        PedidoId    = obj.PedidoId,
                        Logradouro  = endereco.Logradouro,
                        Numero      = endereco.Numero,
                        Complemento = endereco.Complemento,
                        Cidade      = endereco.Cidade,
                        Bairro      = endereco.Bairro,
                        Estado      = endereco.Estado,
                        CEP         = endereco.CEP
                    });

                    foreach (var produto in dto.Itens)
                    {
                        var model = _produtoBusiness.Get(produto.ProdutoId);

                        var item = new PedidoItem()
                        {
                            PedidoId      = obj.PedidoId,
                            ProdutoId     = produto.ProdutoId,
                            Quantidade    = produto.Quantidade,
                            PrecoUnitario = produto.PrecoUnitario,
                            ValorTotal    = produto.Quantidade * produto.PrecoUnitario
                        };
                        _pedidoItemBusiness.Add(item);

                        var itemFornecedor = new PedidoItemFornecedor()
                        {
                            PedidoItemId        = item.PedidoItemId,
                            CodPedidoItemFornec = GerarPedidoFornecedor(model.FornecedorId, obj.PedidoId),
                            FornecedorId        = model.FornecedorId,
                            UltimaAtualizacao   = DateTime.Now,
                            StatusId            = 1
                        };
                        _pedidoItemFornecedorBusiness.Add(itemFornecedor);
                    }

                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw ex;
                }
            }
        }