Esempio n. 1
0
        public List <string> Importar(System.IO.Stream arquivo)
        {
            var retorno = new List <string>();

            try
            {
                ValidarImportar(arquivo);

                var produtosDao = LerXLSX(arquivo);

                if (produtosDao == null || produtosDao.Count() <= 0)
                {
                    retorno.Add("Planilha XLSX não possui produtos / Os produtos não estão na formatação correta / A loja não foi encontrada");
                    retorno.Add("Coluna A = Número do Produto, B = Descrição do Produto, C = Categoria do Produto, D = Medida do Produto, E = Quantidade do Produto na Loja, F = Preço de Compra do Produto");
                    return(retorno);
                }

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
                {
                    Timeout = TimeSpan.FromMinutes(10)
                }))
                {
                    // busca todos os produtos da planilha na base de dados
                    // caso exista, atualiza somente a quantidade
                    // caso não exista, cadastra na base de dados
                    foreach (var produtoDao in produtosDao)
                    {
                        if (produtoDao.Numero.GetValueOrDefault() == 52528)
                        {
                        }

                        var produto = produtoRepository.Listar(0, produtoDao.Numero.GetValueOrDefault());

                        // caso o produto não exista na base de dados
                        if (produto == null)
                        {
                            // busca se a medida da planilha já existe na base de dados
                            // caso não exista, cadastra-a na base de dados
                            // caso exista, substitui a medida da planilha pela da base de dados por conta do MedidaID
                            if (produtoDao.MedidaDao == null || (string.IsNullOrEmpty(produtoDao.MedidaDao.Descricao)))
                            {
                                retorno.Add(string.Format("Produto {0} não possui Medida associada", produtoDao.Numero));
                                continue;
                            }

                            var medidaDao = medidaRepository.Listar(produtoDao.MedidaDao.ToBd()).FirstOrDefault();
                            if (medidaDao == null)
                            {
                                int medidaId = medidaBusiness.Incluir(produtoDao.MedidaDao);

                                produtoDao.MedidaDao.MedidaID = medidaId;
                                produtoDao.MedidaDao.Ativo    = true;
                            }
                            else
                            {
                                produtoDao.MedidaDao = medidaDao.ToApp();
                            }

                            // busca se a categoria da planilha já existe na base de dados
                            // caso não exista, cadastra-a na base de dados
                            // caso exista, substitui a linha da planilha pela da base de dados por conta do MedidaID
                            var categoria = produtoDao.CategoriaDao.FirstOrDefault();
                            if (categoria == null || (string.IsNullOrEmpty(produtoDao.CategoriaDao.FirstOrDefault().Descricao)))
                            {
                                retorno.Add(string.Format("Produto {0} não possui Categoria associada", produtoDao.Numero));
                                continue;
                            }

                            var categoriaDao = categoriaRepository.Listar(categoria.ToBd()).FirstOrDefault();
                            if (categoriaDao == null)
                            {
                                var categoriaId = categoriaBusiness.Incluir(produtoDao.CategoriaDao.FirstOrDefault());

                                produtoDao.CategoriaDao.FirstOrDefault().CategoriaID = categoriaId;
                                produtoDao.CategoriaDao.FirstOrDefault().Ativo       = true;
                            }
                            else
                            {
                                produtoDao.CategoriaDao.Clear();
                                produtoDao.CategoriaDao.Add(categoriaDao.ToApp());
                            }

                            // cadastra o produto
                            produtoRepository.Incluir(produtoDao.ToBd());
                        }
                        else
                        {
                            var lojaProdutoDao = produtoDao.LojaProdutoDao.FirstOrDefault();

                            if (lojaProdutoDao != null)
                            {
                                var lojaProduto = lojaProdutoBusiness.Listar(new LojaProdutoDao()
                                {
                                    LojaID = lojaProdutoDao.LojaID, ProdutoID = produto.ProdutoID
                                }).FirstOrDefault();

                                // inclui/atualiza a quantidade do produto na loja
                                if (lojaProduto == null)
                                {
                                    lojaProdutoBusiness.Incluir(new LojaProdutoDao()
                                    {
                                        LojaID = lojaProdutoDao.LojaID, ProdutoID = produto.ProdutoID, Quantidade = lojaProdutoDao.Quantidade, Ativo = true
                                    });
                                }
                                else
                                {
                                    lojaProdutoBusiness.Atualizar(new LojaProdutoDao()
                                    {
                                        LojaProdutoID = lojaProduto.LojaProdutoID, Quantidade = lojaProdutoDao.Quantidade, Ativo = true
                                    });
                                }

                                // atualiza o preço do produto
                                produtoRepository.Atualizar(new Produto()
                                {
                                    Numero = produtoDao.Numero.GetValueOrDefault(), Preco = produtoDao.Preco
                                });

                                // ativa o produto
                                if (!produto.Ativo)
                                {
                                    produtoRepository.Ativar(0, produtoDao.Numero.GetValueOrDefault());
                                }
                            }
                        }
                    }

                    // se não houveram erros, commit no banco de dados
                    if (retorno == null || retorno.Count() <= 0)
                    {
                        scope.Complete();
                    }
                }
            }
            catch (BusinessException ex)
            {
                retorno.Add(ex.Message);
            }
            catch (Exception ex)
            {
                logRepository.Incluir(new Log()
                {
                    Descricao = ex.ToString(), DataHora = DateTime.Now
                });
                throw ex;
            }

            return(retorno);
        }