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