/// <summary> /// Método criado para a importação da ferragem. Insere as ferragens do arquivo, no WebGlass. /// </summary> private static ResultadoImportacao SalvarItens(List <ExportarFerragem.Item> itens, bool substituirFerragemExistente) { #region Declaração de variáveis var ferragemFluxo = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <IFerragemFluxo>(); var ferragemId = new List <Tuple <int, Entidades.Ferragem> >(); var fabricanteFerragemId = new List <Tuple <int, Entidades.FabricanteFerragem> >(); var fabricantesFerragemInseridos = new List <Entidades.FabricanteFerragem>(); var repositorioImagemFerragem = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioImagens>(); var repositorioCalcPackageFerragem = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioCalcPackage>(); var resultadoImportacao = new ResultadoImportacao(); #endregion #region Recuperação dos objetos que devem ser atualizados ao invés de serem inseridos // Caso as ferragens devam ser substituídas, busca todas as ferragens, do arquivo de exportação, que existem no sistema de importação. if (substituirFerragemExistente) { // Recupera todas as ferragens, do sistema atual, com base no nome delas e no nome do fabricante associado. ferragemId = SourceContext.Instance.CreateQuery() .Select("f.IdFerragem, f.Nome, f.IdFabricanteFerragem") .From <Ferragem>("f") .Where(string.Join(" OR ", itens?.Select(f => string.Format("f.Nome='{0}'", f.Ferragem.Nome)))) // Seleciona os IDs de ferragem do arquivo de exportação, junto com as entidades de ferragens (correspondentes) no sistema de importação. .Execute()?.Select(f => new Tuple <int, Entidades.Ferragem>((itens.FirstOrDefault(g => g.Ferragem.Nome == f.GetString(1))?.Ferragem.IdFerragem).GetValueOrDefault(), ferragemFluxo.ObterFerragem(f.GetInt32(0)))).Distinct().ToList(); } // O fabricante deve ser sempre atualizado, caso exista no sistema de importação. Independentemente da existência da ferragem. if (itens.Any(f => f.FabricanteFerragem?.IdFabricanteFerragem > 0)) { // No sistema onde o arquivo está sendo importado, recupera os fabricantes que possuem o mesmo nome dos fabricantes inseridos no arquivo de exportação. fabricanteFerragemId = SourceContext.Instance.CreateQuery() .Select("ff.IdFabricanteFerragem, ff.Nome") .From <FabricanteFerragem>("ff") .Where(string.Join(" OR ", itens?.Select(f => string.Format("ff.Nome='{0}'", f.FabricanteFerragem.Nome)))) // Seleciona os IDs de fabricante de ferragem do arquivo de exportação, junto com as entidades de fabricantes de ferragens (correspondentes) no sistema de importação. .Execute()?.Select(f => new Tuple <int, Entidades.FabricanteFerragem>((itens.FirstOrDefault(g => g.FabricanteFerragem.Nome == f.GetString(1))?.FabricanteFerragem.IdFabricanteFerragem).GetValueOrDefault(), ferragemFluxo.ObterFabricanteFerragem(f.GetInt32(0)))).Distinct().ToList(); } #endregion // Percorre cada item, do arquivo de exportação, e os insere no sistema. for (var i = 0; i < itens.Count(); i++) { try { #region Declaração de variáveis // Entidade de ferragem. Entidades.Ferragem ferragem = null; // Entidade de fabricante de ferragem. Entidades.FabricanteFerragem fabricanteFerragem = null; #endregion #region Recuperação/criação da ferragem // Verifica se a ferragem existe no sistema atual. if (ferragemId != null && ferragemId.Any(f => f.Item1 == itens[i].Ferragem.IdFerragem)) { ferragem = ferragemId.FirstOrDefault(f => f.Item1 == itens[i].Ferragem.IdFerragem).Item2; } // Cria uma nova ferragem. else { ferragem = ferragemFluxo.CriarFerragem(); } #region Propriedades ferragem // Define/atualiza os dados da ferragem, com base no arquivo de importação. ferragem.Altura = itens[i].Ferragem.Altura; ferragem.EstiloAncoragem = itens[i].Ferragem.EstiloAncoragem; ferragem.Largura = itens[i].Ferragem.Largura; ferragem.MedidasEstaticas = itens[i].Ferragem.MedidasEstaticas; ferragem.Nome = itens[i].Ferragem.Nome; ferragem.PodeEspelhar = itens[i].Ferragem.PodeEspelhar; ferragem.PodeRotacionar = itens[i].Ferragem.PodeRotacionar; ferragem.Situacao = itens[i].Ferragem.Situacao; ferragem.UUID = itens[i].Ferragem.UUID; #endregion #region Fabricante ferragem // Verifica se o fabricante existe no sistema atual. if (fabricanteFerragemId?.Any(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem) ?? false) { // Recupera o fabricante. Os dados não devem ser atualizados. fabricanteFerragem = fabricanteFerragemId.FirstOrDefault(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem).Item2; } else if (fabricantesFerragemInseridos.Any(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant())) { fabricanteFerragem = fabricantesFerragemInseridos.FirstOrDefault(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant()); } else { // Cria um novo fabricante. fabricanteFerragem = new Entidades.FabricanteFerragem(); fabricanteFerragem.Nome = itens[i].FabricanteFerragem.Nome; fabricanteFerragem.Sitio = itens[i].FabricanteFerragem.Sitio; // Insere/atualiza o fabricante. var retornoFabricanteFerragem = ferragemFluxo.SalvarFabricanteFerragem(fabricanteFerragem); // Caso ocorra algum erro na atualização do fabricante, a ferragem não deve ser inserida. if (!retornoFabricanteFerragem) { throw new Exception(retornoFabricanteFerragem.Message.ToString()); } else { fabricantesFerragemInseridos.Add(fabricanteFerragem); } } // Atualiza a referência do fabricante na ferragem. ferragem.IdFabricanteFerragem = fabricanteFerragem.IdFabricanteFerragem; #endregion #region Código ferragem // Caso a ferragem exista e esteja sendo atualizada, os códigos devem ser removidos e adicionados novamente. ferragem.Codigos.Clear(); // Seta os códigos da ferragem. for (var j = 0; j < itens[i].CodigosFerragem.Count(); j++) { var codigoFerragem = new Entidades.CodigoFerragem(); codigoFerragem.IdFerragem = ferragem.IdFerragem; codigoFerragem.Codigo = itens[i].CodigosFerragem[j].Codigo; ferragem.Codigos.Add(codigoFerragem); } #endregion #region Constante ferragem // Caso a ferragem exista e esteja sendo atualizada, as constantes devem ser removidas e adicionadas novamente. ferragem.Constantes.Clear(); // Seta as constantes da ferragem. for (var j = 0; j < itens[i].ConstantesFerragem.Count(); j++) { var constanteFerragem = new Entidades.ConstanteFerragem(); constanteFerragem.IdFerragem = ferragem.IdFerragem; constanteFerragem.Nome = itens[i].ConstantesFerragem[j].Nome; constanteFerragem.Valor = itens[i].ConstantesFerragem[j].Valor; ferragem.Constantes.Add(constanteFerragem); } #endregion #endregion #region Inserção da imagem // Verifica se a ferragem exportada possui imagem. if (itens[i].ImagemFerragem != null) { EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null; var imagemStream = new MemoryStream(itens[i].ImagemFerragem, 0, itens[i].ImagemFerragem.Length); ferragemSalva = (sender, args) => { try { // Salva a imagem da ferragem. repositorioImagemFerragem.SalvarImagem(ferragem.IdFerragem, imagemStream); } finally { ferragem.Saved -= ferragemSalva; } }; ferragem.Saved += ferragemSalva; } #endregion #region Inserção do arquivo CalcPackage if (itens[i].ArquivoCalcPackage != null) { CalcEngine.Dxf.DxfProject projeto = null; CalcEngine.ProjectFilesPackage pacote = null; using (Stream pacoteStream = new MemoryStream(itens[i].ArquivoCalcPackage, 0, itens[i].ArquivoCalcPackage.Length)) { pacote = CalcEngine.ProjectFilesPackage.LoadPackage(pacoteStream); } try { projeto = CalcEngine.Dxf.DxfProject.LoadFromPackage(pacote); } catch (Exception ex) { throw new Exception(string.Format("Não foi possível carregar os dados do arquivo da ferragem de ID {0}.", itens[i].Ferragem.IdFerragem), ex); } EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null; // Configura o método anonimo para ser acionado quando os dados da ferragem forem salvos ferragemSalva = (sender, args) => { try { using (var stream = new MemoryStream()) { // Cria o pacote para onde serão salvo os dados do CalcPackage var package = CalcEngine.ProjectFilesPackage.CreatePackage(stream, false); projeto.Save(package); package.Close(); stream.Position = 0; // Salva os dados no repositório das ferragens repositorioCalcPackageFerragem.SalvarCalcPackage(ferragem.IdFerragem, stream); } } finally { ferragem.Saved -= ferragemSalva; } }; ferragem.Saved += ferragemSalva; } #endregion #region Inserção da ferragem // Insere/atualiza a ferragem. var retornoSalvarFerragem = ferragemFluxo.SalvarFerragem(ferragem); if (!retornoSalvarFerragem) { throw new Exception(retornoSalvarFerragem.Message.ToString()); } #endregion // Salva, na variável de retorno, o nome da ferragem importada. resultadoImportacao.FerragensImportadas.Add(itens[i].Ferragem.Nome); } catch (Exception ex) { // Salva, na variável de retorno, o nome da ferragem não importada e a mensagem de erro. resultadoImportacao.FerragensNaoImportadas.Add(itens[i].Ferragem.Nome); resultadoImportacao.MensagensErro.Add(ex.Message); ErroDAO.Instance.InserirFromException(HttpContext.Current != null ? HttpContext.Current.Request.Url.ToString() : null, ex); } } return(resultadoImportacao); }
/// <summary> /// Carrega o arquivo CalcEngine para a ferragem. /// </summary> /// <param name="ferragem"></param> public void CarregarCalcEngineFile(Glass.Projeto.Negocios.Entidades.Ferragem ferragem) { // Recupera o control de upload var fileUpload = (FileUpload)dtvFerragem.FindControl("filCalcPkg"); if (fileUpload != null && fileUpload.HasFile) { if (!StringComparer.InvariantCultureIgnoreCase.Equals(System.IO.Path.GetExtension(fileUpload.FileName), ".calcpackage")) { throw new Exception(string.Format("O arquivo ({0}) não pode ser inserido. Verifique se a extensão da imagem é CALCPACKAGE e tente novamente. ", fileUpload.FileName)); } CalcEngine.Dxf.DxfProject project = null; try { // Tenta abrir o projeto do arquivo project = CalcEngine.Dxf.DxfProject.Open(fileUpload.PostedFile.InputStream); } catch (Exception ex) { throw new Exception(string.Format("Não foi possível carregar os dados do arquivo '{0}' informado.", fileUpload.FileName), ex); } var constantesProcessadas = new List <Glass.Projeto.Negocios.Entidades.ConstanteFerragem>(); foreach (var variable in project.Variables.Where(f => f.GetType() == typeof(CalcEngine.Variable))) { var constante = ferragem.Constantes.FirstOrDefault(f => f.Nome == variable.Name); if (constante == null) { constante = new Glass.Projeto.Negocios.Entidades.ConstanteFerragem { Nome = variable.Name, Valor = variable.Value }; } else { constante.Valor = variable.Value; } // Adiciona somente as constantes que não existirem no cadastro da ferragem no WebGlass. if (!ferragem.Constantes.Contains(constante)) { ferragem.Constantes.Add(constante); } constantesProcessadas.Add(constante); } // No WebGlass, remove todas as constantes que não existem no novo arquivo CalcPackage. foreach (var constante in ferragem.Constantes.Where(f => !constantesProcessadas.Contains(f))) { ferragem.Constantes.Remove(constante); } EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null; // Configura o método anonimo para ser acionado quando os dados da ferragem forem salvos ferragemSalva = (sender, args) => { try { var repositorio = Microsoft.Practices.ServiceLocation.ServiceLocator .Current.GetInstance <Glass.Projeto.Negocios.Entidades.IFerragemRepositorioCalcPackage>(); using (var stream = new System.IO.MemoryStream()) { // Cria o pacote para onde serão salvo os dados do CalcPackage var package = CalcEngine.ProjectFilesPackage.CreatePackage(stream, false); project.Save(package); package.Close(); stream.Position = 0; // Salva os dados no repositório das ferragens repositorio.SalvarCalcPackage(ferragem.IdFerragem, stream); } } finally { ferragem.Saved -= ferragemSalva; } }; ferragem.Saved += ferragemSalva; } }