Esempio n. 1
0
        public IGenericCommandResult Handle(RegistrarVendaCommand command)
        {
            command.Validate();

            if (!command.Valid)
            {
                return(new GenericCommandResult(false, "Ops...", command.Notifications));
            }

            decimal valorFrete = ObterValorFrete(command.CEPEntrega);

            if (valorFrete < 10)
            {
                return(new GenericCommandResult(false, "Cep Inválido", "CEP"));
            }


            decimal valorProdutos = 0m;
            Dictionary <long, decimal> produtoPreco = new Dictionary <long, decimal>();

            command.Produtos.ToList().ForEach(id =>
            {
                var produto = _produtosRepo.ObterProdutoPorId(id);

                if (produto != null)
                {
                    valorProdutos += produto.Valor;
                    produtoPreco.Add(produto.Id, produto.Valor);
                }
            });

            if (valorProdutos < 1)
            {
                return(new GenericCommandResult(false, "Produtos Inválidos", "Produtos"));
            }

            GenericCommandResult result = new GenericCommandResult(true, "Venda inserida com sucesso", command);

            try
            {
                _vendasRepo.AbrirTransacao();

                var venda = new Venda(command.ClienteId, Entities.Enum.StatusVenda.EmAnalise,
                                      valorProdutos + valorFrete,
                                      valorFrete, valorProdutos);

                var vendaId = _vendasRepo.RegistrarVenda(venda);

                if (vendaId == 0)
                {
                    return(new GenericCommandResult(false, "Ocorreu um erro ao tentar registar a venda", command));
                }

                List <VendaSumario> sumarioList = new List <VendaSumario>();

                foreach (var item in produtoPreco.ToList())
                {
                    var sumario = new VendaSumario
                    {
                        ProdutoId    = item.Key,
                        ValorProduto = item.Value,
                        VendaId      = vendaId
                    };

                    var sumarioId = _vendasRepo.RegistrarVendaSumario(sumario);

                    if (sumarioId < 1)
                    {
                        result = new GenericCommandResult(false, "Ocorreu um erro ao processar um item da lista", new { produtoId = item.Key });
                        break;
                    }

                    sumarioList.Add(sumario);
                }
                ;

                if (result.Success)
                {
                    _vendasRepo.Commit();
                    venda.VendaSumario = sumarioList;
                    result.Data        = venda;
                }
                else
                {
                    _vendasRepo.RollBack();
                }
            }
            catch (System.Exception ex)
            {
                _vendasRepo.RollBack();
                return(new GenericCommandResult(false, "Ocorreu um erro ao processar esta venda ", new { erro = ex.Message }));
            }

            return(result);
        }